# File I/O Policy

UnifiedSpread は単一ファイル処理系ツールアプリとして、ファイル取得・保存先選択・書き込みを Host 側 callback へ委譲します。

## Runtime contract

```javascript
var control = UnifiedSpread.createWorkbenchControl({
  container: '#controlFrame',
  language: 'ja',
  OpenFile: hostOpenFile,
  SaveFile: hostSaveFile
});
control.mount();
```

## OpenFile

`spread.file.open` と `spread.file.import` は `OpenFile(request, context)` を呼びます。UnifiedSpread 本体は Local Disk / App Storage / Google Drive などの保存先 UI を直接持ちません。

## SaveFile

`spread.file.save`、`spread.file.saveAs`、`spread.file.export.*` は `SaveFile(request, context)` を呼びます。

Save As は二段階です。

1. `phase: 'choose'` で Host が保存先とファイル名を決める。
2. UnifiedSpread が選択された拡張子から `.uspdx` / `.xlsx` / `.csv` を判定し、Blob を生成する。
3. `phase: 'write'` で Host が実際に書き込む。

## Demo Local callback

`demo/assets/local-file-callbacks.js` は Demo 専用の Local callback 実装です。製品本体には混在させません。


## v1.3 Direction Separation

`OpenFile(request, context)` and `SaveFile(payload, context)` are Host callbacks. They are called by WorkbenchControl / package commands to ask the Host to choose, read, or write a file.

`EditorControl.openFile(payload, context)`, `saveFile(payload, context)`, `saveAsFile(payload, context)`, and `exportFile(payload, context)` are programmatic EditorControl methods. They parse already-acquired file payloads or generate save/export payloads.

Save/export methods return `HostSavePayload/v1` with `payload.data` containing a Blob / ArrayBuffer / text value. UnifiedSpread currently returns Blob data and also provides the compatibility alias `payload.blob` for Demo helper code.
