@modular-prompt/extract 0.2.0 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (70) hide show
  1. package/README.md +101 -25
  2. package/dist/cache-lifecycle.d.ts +5 -2
  3. package/dist/cache-lifecycle.d.ts.map +1 -1
  4. package/dist/cache-lifecycle.js +11 -7
  5. package/dist/cache-lifecycle.js.map +1 -1
  6. package/dist/cli/add-command.d.ts +11 -0
  7. package/dist/cli/add-command.d.ts.map +1 -0
  8. package/dist/cli/add-command.js +29 -0
  9. package/dist/cli/add-command.js.map +1 -0
  10. package/dist/cli/args.d.ts +14 -0
  11. package/dist/cli/args.d.ts.map +1 -0
  12. package/dist/cli/args.js +125 -0
  13. package/dist/cli/args.js.map +1 -0
  14. package/dist/cli/clean-command.d.ts +10 -0
  15. package/dist/cli/clean-command.d.ts.map +1 -0
  16. package/dist/cli/clean-command.js +26 -0
  17. package/dist/cli/clean-command.js.map +1 -0
  18. package/dist/cli/constants.d.ts +4 -4
  19. package/dist/cli/constants.d.ts.map +1 -1
  20. package/dist/cli/constants.js +8 -4
  21. package/dist/cli/constants.js.map +1 -1
  22. package/dist/cli/create-command.d.ts +3 -1
  23. package/dist/cli/create-command.d.ts.map +1 -1
  24. package/dist/cli/create-command.js +29 -28
  25. package/dist/cli/create-command.js.map +1 -1
  26. package/dist/cli/extract-command.d.ts +2 -0
  27. package/dist/cli/extract-command.d.ts.map +1 -1
  28. package/dist/cli/extract-command.js +5 -3
  29. package/dist/cli/extract-command.js.map +1 -1
  30. package/dist/cli/list-command.d.ts +15 -0
  31. package/dist/cli/list-command.d.ts.map +1 -0
  32. package/dist/cli/list-command.js +69 -0
  33. package/dist/cli/list-command.js.map +1 -0
  34. package/dist/cli/manifest.d.ts +3 -0
  35. package/dist/cli/manifest.d.ts.map +1 -1
  36. package/dist/cli/manifest.js +4 -1
  37. package/dist/cli/manifest.js.map +1 -1
  38. package/dist/cli/store.d.ts +9 -0
  39. package/dist/cli/store.d.ts.map +1 -0
  40. package/dist/cli/store.js +36 -0
  41. package/dist/cli/store.js.map +1 -0
  42. package/dist/cli.js +63 -74
  43. package/dist/cli.js.map +1 -1
  44. package/dist/create-extract-session.d.ts.map +1 -1
  45. package/dist/create-extract-session.js +3 -3
  46. package/dist/create-extract-session.js.map +1 -1
  47. package/dist/create-mlx-extract-runtime.d.ts +2 -1
  48. package/dist/create-mlx-extract-runtime.d.ts.map +1 -1
  49. package/dist/create-mlx-extract-runtime.js +47 -17
  50. package/dist/create-mlx-extract-runtime.js.map +1 -1
  51. package/dist/default-models.d.ts +14 -0
  52. package/dist/default-models.d.ts.map +1 -0
  53. package/dist/default-models.js +20 -0
  54. package/dist/default-models.js.map +1 -0
  55. package/dist/extract-store.d.ts +53 -0
  56. package/dist/extract-store.d.ts.map +1 -0
  57. package/dist/extract-store.js +174 -0
  58. package/dist/extract-store.js.map +1 -0
  59. package/dist/index.d.ts +4 -0
  60. package/dist/index.d.ts.map +1 -1
  61. package/dist/index.js +3 -0
  62. package/dist/index.js.map +1 -1
  63. package/dist/model-resolution.d.ts +25 -0
  64. package/dist/model-resolution.d.ts.map +1 -0
  65. package/dist/model-resolution.js +57 -0
  66. package/dist/model-resolution.js.map +1 -0
  67. package/dist/types.d.ts +5 -0
  68. package/dist/types.d.ts.map +1 -1
  69. package/package.json +3 -3
  70. /package/bin/{modular-extract.js → modular-prompt-extract.js} +0 -0
package/README.md CHANGED
@@ -48,32 +48,68 @@ base (+ domain) + corpus (materials / messages) + request (inputs) ← cue
48
48
  ```bash
49
49
  pnpm --filter @modular-prompt/extract build
50
50
 
51
- # 1. 入力ファイルからキャッシュ作成(デフォルト: ./.extract-cache)
52
- node packages/extract/bin/modular-extract.js create -m 'your-mlx-model' docs/*.txt
51
+ # 1. 入力ファイルから meeting store を作成(デフォルト: ~/.modular-prompt/extract-cache)
52
+ node packages/extract/bin/modular-prompt-extract.js create meeting -m 'your-mlx-model' docs/*.txt
53
53
 
54
- # 2. 抽出クエリ(cue)を実行 — 結果は stdout
55
- node packages/extract/bin/modular-extract.js extract -d .extract-cache '登場人物を列挙'
54
+ # 2. 既存 store にファイルを追加(incremental prefill)
55
+ node packages/extract/bin/modular-prompt-extract.js add meeting docs/day2.txt
56
56
 
57
- # キャッシュ削除
58
- rm -rf .extract-cache
57
+ # 3. 抽出クエリ(cue)を実行 — 結果は stdout
58
+ node packages/extract/bin/modular-prompt-extract.js extract meeting '登場人物を列挙'
59
+
60
+ # 4. コンテナ内の store を一覧表示
61
+ node packages/extract/bin/modular-prompt-extract.js list
62
+
63
+ # 5. store 単位のキャッシュ削除
64
+ node packages/extract/bin/modular-prompt-extract.js clean meeting
59
65
  ```
60
66
 
61
67
  | コマンド | 説明 |
62
68
  |---------|------|
63
- | `create [-d <dir>] [-m model] [files...]` | corpus を読み込み KV cache を準備。`manifest.json` を dir に保存 |
64
- | `extract -d <dir> [query...]` | キャッシュ済み corpus に対して抽出。query が cue になる |
65
- | `extract --max-tokens <n>` | 最大生成トークン数(デフォルト: 8000) |
69
+ | `create <storename> [-d <container>] [-m <alias-or-model-id>] [files...]` | corpus を読み込み KV cache を準備。`manifest.json` を `<container>/<storename>/` に保存 |
70
+ | `add <storename> [-d <container>] [files...]` | 既存 store の corpus にファイルを追記し、KV cache を incremental prefill で拡張 |
71
+ | `extract <storename> [-d <container>] [query...]` | 指定 store のキャッシュ済み corpus に対して抽出。query が cue になる |
72
+ | `list [-d <container>]` | コンテナ内の全 store と manifest/KV のサマリを表示 |
73
+ | `clean <storename> [-d <container>]` | 指定 store の manifest + KV キャッシュを再帰削除。存在しない store は no-op |
74
+ | `clean --all [-d <container>]` | コンテナ全体を再帰削除。存在しないコンテナは no-op |
75
+ | `extract <storename> --max-tokens <n>` | 最大生成トークン数(デフォルト: 8000) |
66
76
  | `--dry-run` | MLX を起動せず、compile 済みプロンプト全文を stdout に出力 |
67
77
 
78
+ `list` は各 store の model、materials 数・タイトル、作成日時、KV cache の有無を表示します。
79
+
80
+ ```text
81
+ Store: meeting
82
+ Model: mlx-community/SomeModel-4bit
83
+ Materials: 2 (notes.txt, meeting.md)
84
+ Created: 2026-09-07T03:00:00.000Z
85
+ Updated: 2026-09-07T04:00:00.000Z
86
+ KV cache: present
87
+ ```
88
+
68
89
  ```bash
69
90
  # プロンプト確認(create)
70
- modular-extract create --dry-run docs/notes.txt
91
+ modular-prompt-extract create meeting --dry-run docs/notes.txt
92
+
93
+ # プロンプト確認(extract — store の manifest が必要)
94
+ modular-prompt-extract extract meeting --dry-run '登場人物を列挙'
95
+ ```
96
+
97
+ `-d` 省略時のデフォルトは `~/.modular-prompt/extract-cache` で、create/add/extract/list/clean 共通の **store コンテナ**を指定します。`MODULAR_PROMPT_HOME` を設定している場合は、その値の下の `extract-cache` が使用されます。`-m` には models.yaml の alias(例: `default`)または生の HF model ID を指定できます。create/add/extract/clean では `<storename>` が必須(`clean --all` を除く)で、コンテナ配下の `<storename>/` が利用されます。
98
+ `-m` 省略時は、同梱 models 設定と `~/.modular-prompt/models.yaml`(`MODULAR_PROMPT_HOME` で変更可)をマージし、`models.default`、なければ先頭のモデルを使用します。user yaml の `default` は同梱 default を上書きします。
99
+ `MLX_MODEL` 環境変数も後方互換のためサポートしており、設定時は同梱 default のモデル ID として扱います。user yaml の `models.default` は `MLX_MODEL` より優先されます。
100
+
101
+ ローカルテスト用のモデルは `~/.modular-prompt/models.testing.yaml` に分けて置き、手元の extract 実行では `MODULAR_PROMPT_MODELS_PROFILE=testing` を指定できます。設定ファイルのサンプルと統合テストの convention alias は [ローカルモデルセットアップガイド](../../docs/LOCAL_MODEL_SETUP.md) を参照してください。
71
102
 
72
- # プロンプト確認(extract — manifest が必要)
73
- modular-extract extract --dry-run -d .extract-cache '登場人物を列挙'
103
+ たとえば `~/.modular-prompt/models.yaml` に次を置くと、`create meeting -m default` と `create meeting` の両方でこのモデルが選ばれます。
104
+
105
+ ```yaml
106
+ models:
107
+ default:
108
+ provider: mlx
109
+ model: mlx-community/YourModel-4bit
74
110
  ```
75
111
 
76
- `-d` 省略時のデフォルトは `./.extract-cache`。`-m` 省略時は `MLX_MODEL` 環境変数、未設定ならパッケージ既定モデル。
112
+ モデルが設定されていない構成では、`-m <model-id-or-alias>` を指定するか、user yaml に `models.default` を定義してください。
77
113
 
78
114
  **MLX バックエンドは mlx-lm(`backend: 'lm'`)に固定**している。`auto` で VLM が選ばれるとプロンプトキャッシュが無効になるため。
79
115
 
@@ -123,11 +159,13 @@ try {
123
159
  |-----------|-------------|
124
160
  | `session.close()`(デフォルト) | handle を `release` マーク → 次の `runtime.close()` で **KV ファイル削除** |
125
161
  | `session.close({ releaseCache: false })` | release しない → **KV ファイルは disk に残る**(CLI はこちら) |
126
- | `runtime.close()`(固定 cacheDir) | `release` 済みエントリの `.safetensors` を削除 |
162
+ | `runtime.close()`(固定 cacheDir) | `release` 済みエントリの `.safetensors.zip` を削除 |
127
163
  | `runtime.close()`(一時 cacheDir) | **ディレクトリごと削除** |
128
- | `rm -rf <cache-dir>` | manifest + KV キャッシュを手動削除(CLI のクリーン方法) |
164
+ | `add <storename> files...` | 既存 store を staging にコピーし、必須 cache prepare(空 handle は失敗)と manifest 更新が成功した後に入れ替え |
165
+ | `clean <storename> [-d <container>]` | 1 store の manifest + KV キャッシュを再帰削除 |
166
+ | `clean --all [-d <container>]` | コンテナ内の全 store を再帰削除 |
129
167
 
130
- `create` 直後に `manifest.json` だけ残って `.safetensors` が無い場合、以前のバージョンでは `session.close()` が release していたのが原因。CLI は `releaseCache: false` で修正済み。
168
+ `create` 直後に store 内へ `manifest.json` だけ残って `.safetensors.zip` が無い場合、以前のバージョンでは `session.close()` が release していたのが原因。CLI は `releaseCache: false` で修正済み。
131
169
 
132
170
  ### 意図
133
171
 
@@ -139,13 +177,13 @@ try {
139
177
 
140
178
  | 変更内容 | 対応 |
141
179
  |---------|------|
142
- | `corpus` を変えたい | **新しいセッション**を作る |
180
+ | `corpus` を変えたい | ライブラリでは **新しいセッション**を作る。CLI store は `add` で incremental prefill する |
143
181
  | `baseModule` を変えたい | **新しいセッション**を作る |
144
182
  | 前回の抽出結果を参照したい | 次の `extract()` の `inputs` に明示的に渡す(自動累積しない) |
145
183
  | driver / cacheController の終了 | 呼び出し側の責務(`runtime.close()` 等) |
146
184
  | セッション終了 | `session.close()` — デフォルトで handle `release()`。固定 cacheDir を残す場合は `{ releaseCache: false }` |
147
185
 
148
- `cacheController` と `model` は **必須**。キャッシュ非対応モードは提供しない。
186
+ `cacheController` は **必須**。`createMlxExtractRuntime` の `model` は省略でき、CLI と同じ models.yaml 解決を行います。指定する場合は alias または生の HF model ID を使えます。キャッシュ非対応モードは提供しない。
149
187
 
150
188
  詳細は [プロンプトキャッシュ設計](../../docs/CACHE_DESIGN.md) および [API 仕様](./API.md) を参照。
151
189
 
@@ -258,6 +296,11 @@ console.log(result.structured); // schema に沿った JSON
258
296
  |---------|------|
259
297
  | `createExtractSession` | 抽出セッションを生成 |
260
298
  | `createMlxExtractRuntime` | MLX 用 driver + cacheController バンドル |
299
+ | `resolveModelSpec` | alias または生 model ID から extract 用 ModelSpec を解決 |
300
+ | `createDriver` | 解決済み ModelSpec から AIService 経由で MLX driver を生成 |
301
+ | `resolveDefaultContainerDir` | `MODULAR_PROMPT_HOME` に基づくデフォルト cache container を解決 |
302
+ | `resolveStoreDir` | cache コンテナと storename から store ディレクトリを解決 |
303
+ | `validateStorename` | storename の形式と予約語を検証 |
261
304
  | `defaultExtractBaseModule` | デフォルト base モジュール |
262
305
  | `mergeExtractBaseModule` | デフォルト base に overlay を merge |
263
306
  | `buildPreviousExtractionsInputs` | 過去抽出結果を inputs に変換 |
@@ -267,21 +310,54 @@ console.log(result.structured); // schema に沿った JSON
267
310
 
268
311
  完全な API リファレンスは [API.md](./API.md) を参照。
269
312
 
270
- ## CLI(`modular-extract`)
313
+ ## CLI(`modular-prompt-extract`)
271
314
 
272
- `bin/modular-extract.js` 経由で利用できる簡易 CLI。
315
+ `bin/modular-prompt-extract.js` 経由で利用できる簡易 CLI。
273
316
 
274
317
  ```bash
275
318
  pnpm --filter @modular-prompt/extract build
276
319
 
277
- modular-extract create [-d .extract-cache] [-m model] file1.txt file2.txt
278
- modular-extract extract -d .extract-cache '抽出したい内容の指示'
320
+ modular-prompt-extract create meeting [-d <cache-dir>] [-m <alias-or-model-id>] file1.txt file2.txt
321
+ modular-prompt-extract add meeting [-d <cache-dir>] file3.txt
322
+ modular-prompt-extract create contract [-d <cache-dir>] [-m <alias-or-model-id>] contract.pdf
323
+ modular-prompt-extract extract meeting [-d <cache-dir>] '抽出したい内容の指示'
324
+ modular-prompt-extract extract contract [-d <cache-dir>] '契約期間を抽出'
325
+ modular-prompt-extract list [-d <cache-dir>]
326
+ modular-prompt-extract clean meeting [-d <cache-dir>]
327
+ modular-prompt-extract clean --all [-d <cache-dir>]
328
+ ```
329
+
330
+ `<storename>` は create/add/extract/clean の positional 第1引数で必須です(`clean --all` を除く)。`[a-zA-Z0-9][a-zA-Z0-9_-]*` に一致し、`create`・`add`・`extract`・`list`・`clean` は使用できません。`-d` は store コンテナを指定し、create は `<container>/<storename>/` にキャッシュと `manifest.json` を保存します。既存 store に対する create は失敗するため、`modular-prompt-extract clean <storename>`(必要に応じて `-d <container>`)で削除してから再実行します。
279
331
 
280
- # キャッシュ削除
281
- rm -rf .extract-cache
332
+ `add <storename> files...` は manifest の model を使って既存 store に資料を追加します。新しいファイルは絶対パスを `id` として追記され、同じ `id`・同じ内容の再追加はスキップされます。同じ `id` の内容が変わっている場合は、キャッシュとの不整合を避けるためエラーになります。その場合は `clean` してから `create` し直してください。`add --dry-run` は MLX を起動せず、マージ後のプロンプトを表示します。
333
+
334
+ `add` は既存 store を直接上書きしません。staging store で必須 cache prepare と manifest 書き込みを完了してから store ディレクトリを入れ替えるため、空 handle を含む prefill の失敗、または manifest 更新の失敗時は既存の corpus と KV cache が保持されます。通常の `createExtractSession` / `extract` は引き続き cache prepare の失敗を best-effort で扱います。
335
+
336
+ `-m` は models.yaml の alias(`default` など)または生の HF model ID を受け付けます。省略時は同梱 models 設定に user の `~/.modular-prompt/models.yaml` を重ねて解決します。`create` は解決後の生 model ID を store 内の `manifest.json` に保存し、`extract` はその ID で再開します。いずれも **mlx-lm バックエンド固定**(キャッシュ互換のため)。
337
+
338
+ ### 旧 CLI / キャッシュレイアウトからの移行
339
+
340
+ デフォルト cache container の変更は破壊的変更です。旧 `./.extract-cache` は自動検出・自動移行しません。#353 以降の named store レイアウトを使用していた場合は、必要な store を新しいデフォルト配下へ手動で移動してください。`MODULAR_PROMPT_HOME` を設定している場合は、移行先の `~/.modular-prompt` を設定値に置き換えます。
341
+
342
+ ```bash
343
+ # 例: named store の meeting を旧 .extract-cache から移行
344
+ mkdir -p ~/.modular-prompt/extract-cache
345
+ mv ./.extract-cache/meeting ~/.modular-prompt/extract-cache/
346
+ ```
347
+
348
+ 移行後は新形式で `modular-prompt-extract extract meeting '...'` を実行します。複数の store がある場合は、それぞれ移動してください。
349
+
350
+ #353 より前の flat レイアウト(コンテナ直下の `manifest.json` と cache files)を使用していた場合は、storename を決めて次のように移行します。
351
+
352
+ ```bash
353
+ mkdir -p ~/.modular-prompt/extract-cache/meeting
354
+ mv ./.extract-cache/manifest.json \
355
+ ./.extract-cache/cache-index.json \
356
+ ./.extract-cache/*.safetensors* \
357
+ ~/.modular-prompt/extract-cache/meeting/
282
358
  ```
283
359
 
284
- `create` は入力ファイルを corpus として KV cache を準備し、`manifest.json` を cache ディレクトリに保存する。`extract` は manifest から corpus を復元して cue を実行する。いずれも **mlx-lm バックエンド固定**(キャッシュ互換のため)。
360
+ 旧 CLI の `create ...` / `extract -d ...` 形式と旧 flat レイアウトは、いずれも自動移行・互換読み取りしません。
285
361
 
286
362
  ## テスト
287
363
 
@@ -5,8 +5,11 @@ export interface CacheLifecycleState {
5
5
  handle: CacheHandle | null;
6
6
  controllerReady: boolean;
7
7
  }
8
- export declare function resolveModelName(model: string): string;
8
+ export interface PrepareSessionCacheOptions {
9
+ /** Reject an empty cache handle instead of falling back to an uncached query. */
10
+ required?: boolean;
11
+ }
9
12
  export declare function ensureCacheControllerReady(driver: AIDriver, state: CacheLifecycleState): Promise<void>;
10
- export declare function prepareSessionCache<TContext>(cacheController: PromptCacheController, model: string, sessionBaseModule: PromptModule<TContext>, corpus: ExtractCorpus, request: ExtractRequest, baseModule: PromptModule<TContext> | undefined, state: CacheLifecycleState): Promise<CacheHandle | null>;
13
+ export declare function prepareSessionCache<TContext>(cacheController: PromptCacheController, model: string, sessionBaseModule: PromptModule<TContext>, corpus: ExtractCorpus, request: ExtractRequest, baseModule: PromptModule<TContext> | undefined, state: CacheLifecycleState, options?: PrepareSessionCacheOptions): Promise<CacheHandle | null>;
11
14
  export declare function releaseSessionCache(cacheController: PromptCacheController, state: CacheLifecycleState): void;
12
15
  //# sourceMappingURL=cache-lifecycle.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"cache-lifecycle.d.ts","sourceRoot":"","sources":["../src/cache-lifecycle.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AAE3F,OAAO,KAAK,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAGhE,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,WAAW,GAAG,IAAI,CAAC;IAC3B,eAAe,EAAE,OAAO,CAAC;CAC1B;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAKtD;AAED,wBAAsB,0BAA0B,CAC9C,MAAM,EAAE,QAAQ,EAChB,KAAK,EAAE,mBAAmB,GACzB,OAAO,CAAC,IAAI,CAAC,CAUf;AAED,wBAAsB,mBAAmB,CAAC,QAAQ,EAChD,eAAe,EAAE,qBAAqB,EACtC,KAAK,EAAE,MAAM,EACb,iBAAiB,EAAE,YAAY,CAAC,QAAQ,CAAC,EACzC,MAAM,EAAE,aAAa,EACrB,OAAO,EAAE,cAAc,EACvB,UAAU,EAAE,YAAY,CAAC,QAAQ,CAAC,GAAG,SAAS,EAC9C,KAAK,EAAE,mBAAmB,GACzB,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CAwB7B;AAED,wBAAgB,mBAAmB,CACjC,eAAe,EAAE,qBAAqB,EACtC,KAAK,EAAE,mBAAmB,GACzB,IAAI,CAKN"}
1
+ {"version":3,"file":"cache-lifecycle.d.ts","sourceRoot":"","sources":["../src/cache-lifecycle.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AAE3F,OAAO,KAAK,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAGhE,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,WAAW,GAAG,IAAI,CAAC;IAC3B,eAAe,EAAE,OAAO,CAAC;CAC1B;AAED,MAAM,WAAW,0BAA0B;IACzC,iFAAiF;IACjF,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,wBAAsB,0BAA0B,CAC9C,MAAM,EAAE,QAAQ,EAChB,KAAK,EAAE,mBAAmB,GACzB,OAAO,CAAC,IAAI,CAAC,CAUf;AAED,wBAAsB,mBAAmB,CAAC,QAAQ,EAChD,eAAe,EAAE,qBAAqB,EACtC,KAAK,EAAE,MAAM,EACb,iBAAiB,EAAE,YAAY,CAAC,QAAQ,CAAC,EACzC,MAAM,EAAE,aAAa,EACrB,OAAO,EAAE,cAAc,EACvB,UAAU,EAAE,YAAY,CAAC,QAAQ,CAAC,GAAG,SAAS,EAC9C,KAAK,EAAE,mBAAmB,EAC1B,OAAO,GAAE,0BAA+B,GACvC,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CAqC7B;AAED,wBAAgB,mBAAmB,CACjC,eAAe,EAAE,qBAAqB,EACtC,KAAK,EAAE,mBAAmB,GACzB,IAAI,CAKN"}
@@ -1,11 +1,5 @@
1
1
  import { partitionPrompt } from '@modular-prompt/driver';
2
2
  import { compileExtractPrompt } from './compile-extract-prompt.js';
3
- export function resolveModelName(model) {
4
- if (!model) {
5
- throw new Error('ExtractSessionOptions.model is required');
6
- }
7
- return model;
8
- }
9
3
  export async function ensureCacheControllerReady(driver, state) {
10
4
  if (state.controllerReady) {
11
5
  return;
@@ -15,11 +9,14 @@ export async function ensureCacheControllerReady(driver, state) {
15
9
  }
16
10
  state.controllerReady = true;
17
11
  }
18
- export async function prepareSessionCache(cacheController, model, sessionBaseModule, corpus, request, baseModule, state) {
12
+ export async function prepareSessionCache(cacheController, model, sessionBaseModule, corpus, request, baseModule, state, options = {}) {
19
13
  const compiled = compileExtractPrompt(sessionBaseModule, corpus, request, baseModule);
20
14
  const { cacheable } = partitionPrompt(compiled);
21
15
  const hasCacheableContent = cacheable.instructions.length > 0 || cacheable.data.length > 0;
22
16
  if (!hasCacheableContent) {
17
+ if (options.required && !state.handle) {
18
+ throw new Error('Required cache preparation failed: prompt has no cacheable content');
19
+ }
23
20
  return state.handle;
24
21
  }
25
22
  const newHandle = await cacheController.prepare({
@@ -29,6 +26,13 @@ export async function prepareSessionCache(cacheController, model, sessionBaseMod
29
26
  tools: request.options?.tools,
30
27
  reasoningEffort: request.options?.reasoningEffort,
31
28
  });
29
+ if (!newHandle.ref) {
30
+ if (options.required) {
31
+ throw new Error('Required cache preparation failed: cache controller returned an empty handle');
32
+ }
33
+ state.handle = null;
34
+ return state.handle;
35
+ }
32
36
  if (state.handle?.ref && newHandle.supersedes === state.handle.ref) {
33
37
  cacheController.release(state.handle.ref);
34
38
  }
@@ -1 +1 @@
1
- {"version":3,"file":"cache-lifecycle.js","sourceRoot":"","sources":["../src/cache-lifecycle.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAEzD,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AAOnE,MAAM,UAAU,gBAAgB,CAAC,KAAa;IAC5C,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,MAAM,IAAI,KAAK,CAAC,yCAAyC,CAAC,CAAC;IAC7D,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,0BAA0B,CAC9C,MAAgB,EAChB,KAA0B;IAE1B,IAAI,KAAK,CAAC,eAAe,EAAE,CAAC;QAC1B,OAAO;IACT,CAAC;IAED,IAAI,iBAAiB,IAAI,MAAM,IAAI,OAAO,MAAM,CAAC,eAAe,KAAK,UAAU,EAAE,CAAC;QAChF,MAAM,MAAM,CAAC,eAAe,EAAE,CAAC;IACjC,CAAC;IAED,KAAK,CAAC,eAAe,GAAG,IAAI,CAAC;AAC/B,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,eAAsC,EACtC,KAAa,EACb,iBAAyC,EACzC,MAAqB,EACrB,OAAuB,EACvB,UAA8C,EAC9C,KAA0B;IAE1B,MAAM,QAAQ,GAAG,oBAAoB,CAAC,iBAAiB,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,CAAC,CAAC;IACtF,MAAM,EAAE,SAAS,EAAE,GAAG,eAAe,CAAC,QAAQ,CAAC,CAAC;IAChD,MAAM,mBAAmB,GACvB,SAAS,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,IAAI,SAAS,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;IAEjE,IAAI,CAAC,mBAAmB,EAAE,CAAC;QACzB,OAAO,KAAK,CAAC,MAAM,CAAC;IACtB,CAAC;IAED,MAAM,SAAS,GAAG,MAAM,eAAe,CAAC,OAAO,CAAC;QAC9C,KAAK;QACL,YAAY,EAAE,SAAS,CAAC,YAAY;QACpC,IAAI,EAAE,SAAS,CAAC,IAAI;QACpB,KAAK,EAAE,OAAO,CAAC,OAAO,EAAE,KAAK;QAC7B,eAAe,EAAE,OAAO,CAAC,OAAO,EAAE,eAAe;KAClD,CAAC,CAAC;IAEH,IAAI,KAAK,CAAC,MAAM,EAAE,GAAG,IAAI,SAAS,CAAC,UAAU,KAAK,KAAK,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC;QACnE,eAAe,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IAC5C,CAAC;IAED,KAAK,CAAC,MAAM,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC;IAChD,OAAO,KAAK,CAAC,MAAM,CAAC;AACtB,CAAC;AAED,MAAM,UAAU,mBAAmB,CACjC,eAAsC,EACtC,KAA0B;IAE1B,IAAI,KAAK,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC;QACtB,eAAe,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAC1C,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC;IACtB,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"cache-lifecycle.js","sourceRoot":"","sources":["../src/cache-lifecycle.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAEzD,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AAYnE,MAAM,CAAC,KAAK,UAAU,0BAA0B,CAC9C,MAAgB,EAChB,KAA0B;IAE1B,IAAI,KAAK,CAAC,eAAe,EAAE,CAAC;QAC1B,OAAO;IACT,CAAC;IAED,IAAI,iBAAiB,IAAI,MAAM,IAAI,OAAO,MAAM,CAAC,eAAe,KAAK,UAAU,EAAE,CAAC;QAChF,MAAM,MAAM,CAAC,eAAe,EAAE,CAAC;IACjC,CAAC;IAED,KAAK,CAAC,eAAe,GAAG,IAAI,CAAC;AAC/B,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,eAAsC,EACtC,KAAa,EACb,iBAAyC,EACzC,MAAqB,EACrB,OAAuB,EACvB,UAA8C,EAC9C,KAA0B,EAC1B,UAAsC,EAAE;IAExC,MAAM,QAAQ,GAAG,oBAAoB,CAAC,iBAAiB,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,CAAC,CAAC;IACtF,MAAM,EAAE,SAAS,EAAE,GAAG,eAAe,CAAC,QAAQ,CAAC,CAAC;IAChD,MAAM,mBAAmB,GACvB,SAAS,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,IAAI,SAAS,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;IAEjE,IAAI,CAAC,mBAAmB,EAAE,CAAC;QACzB,IAAI,OAAO,CAAC,QAAQ,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;YACtC,MAAM,IAAI,KAAK,CAAC,oEAAoE,CAAC,CAAC;QACxF,CAAC;QACD,OAAO,KAAK,CAAC,MAAM,CAAC;IACtB,CAAC;IAED,MAAM,SAAS,GAAG,MAAM,eAAe,CAAC,OAAO,CAAC;QAC9C,KAAK;QACL,YAAY,EAAE,SAAS,CAAC,YAAY;QACpC,IAAI,EAAE,SAAS,CAAC,IAAI;QACpB,KAAK,EAAE,OAAO,CAAC,OAAO,EAAE,KAAK;QAC7B,eAAe,EAAE,OAAO,CAAC,OAAO,EAAE,eAAe;KAClD,CAAC,CAAC;IAEH,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,CAAC;QACnB,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;YACrB,MAAM,IAAI,KAAK,CACb,8EAA8E,CAC/E,CAAC;QACJ,CAAC;QACD,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC;QACpB,OAAO,KAAK,CAAC,MAAM,CAAC;IACtB,CAAC;IAED,IAAI,KAAK,CAAC,MAAM,EAAE,GAAG,IAAI,SAAS,CAAC,UAAU,KAAK,KAAK,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC;QACnE,eAAe,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IAC5C,CAAC;IAED,KAAK,CAAC,MAAM,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC;IAChD,OAAO,KAAK,CAAC,MAAM,CAAC;AACtB,CAAC;AAED,MAAM,UAAU,mBAAmB,CACjC,eAAsC,EACtC,KAA0B;IAE1B,IAAI,KAAK,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC;QACtB,eAAe,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAC1C,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC;IACtB,CAAC;AACH,CAAC"}
@@ -0,0 +1,11 @@
1
+ import { mergeMaterials } from '../extract-store.js';
2
+ export interface AddCommandOptions {
3
+ /** Container directory containing one subdirectory per store. */
4
+ cacheDir: string;
5
+ storename: string;
6
+ files: string[];
7
+ dryRun?: boolean;
8
+ }
9
+ export declare function runAddCommand(options: AddCommandOptions): Promise<string | void>;
10
+ export { mergeMaterials };
11
+ //# sourceMappingURL=add-command.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"add-command.d.ts","sourceRoot":"","sources":["../../src/cli/add-command.ts"],"names":[],"mappings":"AACA,OAAO,EAEL,cAAc,EAEf,MAAM,qBAAqB,CAAC;AAM7B,MAAM,WAAW,iBAAiB;IAChC,iEAAiE;IACjE,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,wBAAsB,aAAa,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAqBtF;AAID,OAAO,EAAE,cAAc,EAAE,CAAC"}
@@ -0,0 +1,29 @@
1
+ import { resolve } from 'node:path';
2
+ import { appendToExtractStore, mergeMaterials, readExtractStoreManifest, } from '../extract-store.js';
3
+ import { CACHE_PREPARE_CUE } from './constants.js';
4
+ import { loadMaterialsFromFiles } from './load-materials.js';
5
+ import { renderExtractPrompt } from './render-prompt.js';
6
+ import { resolveStoreDir } from './store.js';
7
+ export async function runAddCommand(options) {
8
+ const containerDir = resolve(options.cacheDir);
9
+ const storeDir = resolveStoreDir(containerDir, options.storename);
10
+ const manifest = await readExtractStoreManifest(storeDir, options.storename);
11
+ const incomingMaterials = await loadMaterialsFromFiles(options.files);
12
+ const materials = mergeMaterials(manifest.materials, incomingMaterials);
13
+ const request = { cue: CACHE_PREPARE_CUE };
14
+ if (options.dryRun) {
15
+ return renderExtractPrompt({ materials }, request);
16
+ }
17
+ const result = await appendToExtractStore({
18
+ storeDir,
19
+ storename: options.storename,
20
+ incomingMaterials,
21
+ existingManifest: manifest,
22
+ });
23
+ console.error(`Cache extended: ${storeDir}`);
24
+ console.error(`Materials: ${result.manifest.materials.length} file(s), model: ${result.model}`);
25
+ }
26
+ // Keep the merge operation discoverable next to the CLI entry point while the
27
+ // implementation remains in the reusable extract-store layer.
28
+ export { mergeMaterials };
29
+ //# sourceMappingURL=add-command.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"add-command.js","sourceRoot":"","sources":["../../src/cli/add-command.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EACL,oBAAoB,EACpB,cAAc,EACd,wBAAwB,GACzB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACnD,OAAO,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AAC7D,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAU7C,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,OAA0B;IAC5D,MAAM,YAAY,GAAG,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IAC/C,MAAM,QAAQ,GAAG,eAAe,CAAC,YAAY,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC;IAClE,MAAM,QAAQ,GAAG,MAAM,wBAAwB,CAAC,QAAQ,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC;IAC7E,MAAM,iBAAiB,GAAG,MAAM,sBAAsB,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IACtE,MAAM,SAAS,GAAG,cAAc,CAAC,QAAQ,CAAC,SAAS,EAAE,iBAAiB,CAAC,CAAC;IACxE,MAAM,OAAO,GAAG,EAAE,GAAG,EAAE,iBAAiB,EAAE,CAAC;IAE3C,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;QACnB,OAAO,mBAAmB,CAAC,EAAE,SAAS,EAAE,EAAE,OAAO,CAAC,CAAC;IACrD,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,oBAAoB,CAAC;QACxC,QAAQ;QACR,SAAS,EAAE,OAAO,CAAC,SAAS;QAC5B,iBAAiB;QACjB,gBAAgB,EAAE,QAAQ;KAC3B,CAAC,CAAC;IAEH,OAAO,CAAC,KAAK,CAAC,mBAAmB,QAAQ,EAAE,CAAC,CAAC;IAC7C,OAAO,CAAC,KAAK,CAAC,cAAc,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,MAAM,oBAAoB,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;AAClG,CAAC;AAED,8EAA8E;AAC9E,8DAA8D;AAC9D,OAAO,EAAE,cAAc,EAAE,CAAC"}
@@ -0,0 +1,14 @@
1
+ export type CliCommand = 'create' | 'add' | 'extract' | 'list' | 'clean' | 'help';
2
+ export interface ParsedArgs {
3
+ command?: CliCommand;
4
+ cacheDir?: string;
5
+ model?: string;
6
+ maxTokens?: number;
7
+ dryRun?: boolean;
8
+ all?: boolean;
9
+ storename?: string;
10
+ positional: string[];
11
+ }
12
+ /** Parse modular-prompt-extract command-line arguments. */
13
+ export declare function parseArgs(argv: string[]): ParsedArgs;
14
+ //# sourceMappingURL=args.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"args.d.ts","sourceRoot":"","sources":["../../src/cli/args.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,UAAU,GAAG,QAAQ,GAAG,KAAK,GAAG,SAAS,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,CAAC;AAElF,MAAM,WAAW,UAAU;IACzB,OAAO,CAAC,EAAE,UAAU,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,EAAE,CAAC;CACtB;AAuDD,2DAA2D;AAC3D,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,UAAU,CAoFpD"}
@@ -0,0 +1,125 @@
1
+ import { validateStorename } from './store.js';
2
+ function requireOptionValue(argv, index, option, description) {
3
+ const value = argv[index + 1];
4
+ if (!value || value.startsWith('-')) {
5
+ throw new Error(`${option} requires ${description}`);
6
+ }
7
+ return value;
8
+ }
9
+ function parseMaxTokens(value) {
10
+ const parsed = Number(value);
11
+ if (!/^\d+$/.test(value) || !Number.isSafeInteger(parsed) || parsed < 1) {
12
+ throw new Error('--max-tokens must be a positive integer');
13
+ }
14
+ return parsed;
15
+ }
16
+ function validateCommandOptions(result) {
17
+ if (result.all && result.command !== 'clean') {
18
+ throw new Error('--all is only valid with clean');
19
+ }
20
+ if ((result.command === 'create' || result.command === 'add') && result.maxTokens !== undefined) {
21
+ throw new Error('--max-tokens is only valid with extract');
22
+ }
23
+ if ((result.command === 'extract' || result.command === 'add') && result.model !== undefined) {
24
+ throw new Error('--model is only valid with create');
25
+ }
26
+ if (result.command === 'list') {
27
+ if (result.model !== undefined || result.maxTokens !== undefined || result.dryRun) {
28
+ throw new Error('list does not accept create/extract options');
29
+ }
30
+ if (result.positional.length > 0) {
31
+ throw new Error('list does not accept positional arguments');
32
+ }
33
+ }
34
+ if (result.command === 'clean') {
35
+ if (result.model !== undefined || result.maxTokens !== undefined || result.dryRun) {
36
+ throw new Error('clean does not accept create/extract options');
37
+ }
38
+ if (result.all) {
39
+ if (result.positional.length > 0) {
40
+ throw new Error('clean --all does not accept positional arguments');
41
+ }
42
+ return;
43
+ }
44
+ if (result.storename !== undefined && result.positional.length > 0) {
45
+ throw new Error('clean accepts only one storename');
46
+ }
47
+ if (!result.storename) {
48
+ throw new Error('clean requires a storename or --all');
49
+ }
50
+ }
51
+ }
52
+ /** Parse modular-prompt-extract command-line arguments. */
53
+ export function parseArgs(argv) {
54
+ const result = { positional: [] };
55
+ let index = 0;
56
+ let optionsEnded = false;
57
+ while (index < argv.length) {
58
+ const arg = argv[index];
59
+ if (!optionsEnded && (arg === '-h' || arg === '--help')) {
60
+ result.command = 'help';
61
+ return result;
62
+ }
63
+ if (!optionsEnded && arg === '--') {
64
+ optionsEnded = true;
65
+ index += 1;
66
+ continue;
67
+ }
68
+ if (!result.command && !optionsEnded && !arg.startsWith('-')) {
69
+ if (arg === 'create' || arg === 'add' || arg === 'extract' || arg === 'list' || arg === 'clean') {
70
+ result.command = arg;
71
+ index += 1;
72
+ continue;
73
+ }
74
+ throw new Error(`Unknown command: ${arg}`);
75
+ }
76
+ if (!optionsEnded && (arg === '-d' || arg === '--cache-dir')) {
77
+ result.cacheDir = requireOptionValue(argv, index, arg, 'a path');
78
+ index += 2;
79
+ continue;
80
+ }
81
+ if (!optionsEnded && (arg === '-m' || arg === '--model')) {
82
+ result.model = requireOptionValue(argv, index, arg, 'a model id');
83
+ index += 2;
84
+ continue;
85
+ }
86
+ if (!optionsEnded && arg === '--dry-run') {
87
+ result.dryRun = true;
88
+ index += 1;
89
+ continue;
90
+ }
91
+ if (!optionsEnded && arg === '--all') {
92
+ result.all = true;
93
+ index += 1;
94
+ continue;
95
+ }
96
+ if (!optionsEnded && arg === '--max-tokens') {
97
+ const value = requireOptionValue(argv, index, arg, 'a positive integer');
98
+ result.maxTokens = parseMaxTokens(value);
99
+ index += 2;
100
+ continue;
101
+ }
102
+ if (!optionsEnded && arg.startsWith('-')) {
103
+ throw new Error(`Unknown option: ${arg}`);
104
+ }
105
+ result.positional.push(arg);
106
+ index += 1;
107
+ }
108
+ if (result.command === 'create' || result.command === 'add' || result.command === 'extract' || result.command === 'clean') {
109
+ const [storename, ...positional] = result.positional;
110
+ if (!(result.command === 'clean' && result.all)) {
111
+ if (!storename) {
112
+ if (result.command === 'clean') {
113
+ throw new Error('clean requires a storename or --all');
114
+ }
115
+ throw new Error(`${result.command} requires a storename as its first argument`);
116
+ }
117
+ validateStorename(storename);
118
+ result.storename = storename;
119
+ result.positional = positional;
120
+ }
121
+ }
122
+ validateCommandOptions(result);
123
+ return result;
124
+ }
125
+ //# sourceMappingURL=args.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"args.js","sourceRoot":"","sources":["../../src/cli/args.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ export interface CleanCommandOptions {
2
+ /** Container directory containing one subdirectory per store. */
3
+ cacheDir: string;
4
+ /** Store name to remove; omitted when removing the whole container. */
5
+ storename?: string;
6
+ /** Remove the whole container instead of one store. */
7
+ all?: boolean;
8
+ }
9
+ export declare function runCleanCommand(options: CleanCommandOptions): Promise<string>;
10
+ //# sourceMappingURL=clean-command.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"clean-command.d.ts","sourceRoot":"","sources":["../../src/cli/clean-command.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,mBAAmB;IAClC,iEAAiE;IACjE,QAAQ,EAAE,MAAM,CAAC;IACjB,uEAAuE;IACvE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,uDAAuD;IACvD,GAAG,CAAC,EAAE,OAAO,CAAC;CACf;AAED,wBAAsB,eAAe,CAAC,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC,MAAM,CAAC,CAwBnF"}
@@ -0,0 +1,26 @@
1
+ import { rm } from 'node:fs/promises';
2
+ import { resolve } from 'node:path';
3
+ import { resolveStoreDir, storeExists } from './store.js';
4
+ export async function runCleanCommand(options) {
5
+ const containerDir = resolve(options.cacheDir);
6
+ if (options.all) {
7
+ if (options.storename !== undefined) {
8
+ throw new Error('clean --all cannot be used with a storename');
9
+ }
10
+ const existed = await storeExists(containerDir);
11
+ await rm(containerDir, { recursive: true, force: true });
12
+ return existed
13
+ ? `Removed cache container: ${containerDir}`
14
+ : `No cache container found: ${containerDir}`;
15
+ }
16
+ if (!options.storename) {
17
+ throw new Error('clean requires a storename or --all');
18
+ }
19
+ const storeDir = resolveStoreDir(containerDir, options.storename);
20
+ const existed = await storeExists(storeDir);
21
+ await rm(storeDir, { recursive: true, force: true });
22
+ return existed
23
+ ? `Removed store: ${storeDir}`
24
+ : `No store found: ${storeDir}`;
25
+ }
26
+ //# sourceMappingURL=clean-command.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"clean-command.js","sourceRoot":"","sources":["../../src/cli/clean-command.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,MAAM,kBAAkB,CAAC;AACtC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAW1D,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,OAA4B;IAChE,MAAM,YAAY,GAAG,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IAE/C,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;QAChB,IAAI,OAAO,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;YACpC,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAC;QACjE,CAAC;QACD,MAAM,OAAO,GAAG,MAAM,WAAW,CAAC,YAAY,CAAC,CAAC;QAChD,MAAM,EAAE,CAAC,YAAY,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QACzD,OAAO,OAAO;YACZ,CAAC,CAAC,4BAA4B,YAAY,EAAE;YAC5C,CAAC,CAAC,6BAA6B,YAAY,EAAE,CAAC;IAClD,CAAC;IAED,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC;QACvB,MAAM,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAC;IACzD,CAAC;IAED,MAAM,QAAQ,GAAG,eAAe,CAAC,YAAY,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC;IAClE,MAAM,OAAO,GAAG,MAAM,WAAW,CAAC,QAAQ,CAAC,CAAC;IAC5C,MAAM,EAAE,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IACrD,OAAO,OAAO;QACZ,CAAC,CAAC,kBAAkB,QAAQ,EAAE;QAC9B,CAAC,CAAC,mBAAmB,QAAQ,EAAE,CAAC;AACpC,CAAC"}
@@ -1,9 +1,9 @@
1
1
  /** キャッシュディレクトリ内のメタデータファイル名。 */
2
2
  export declare const MANIFEST_FILENAME = "manifest.json";
3
- /** `create -d` 省略時のデフォルト(カレントディレクトリ直下)。 */
4
- export declare const DEFAULT_CACHE_DIR = ".extract-cache";
5
- /** `create -m` 省略時のデフォルト MLX モデル。 */
6
- export declare const DEFAULT_MODEL: string;
3
+ /** `-d` 省略時に使用する cache container のディレクトリ名。 */
4
+ export declare const DEFAULT_CACHE_SUBDIR = "extract-cache";
5
+ /** `-d` 省略時のデフォルト cache container を解決する。 */
6
+ export declare function resolveDefaultContainerDir(): string;
7
7
  /** create 時のキャッシュ prefill 用 cue(出力は最小限に抑える)。 */
8
8
  export declare const CACHE_PREPARE_CUE = "\uFF08cache prepare\uFF09";
9
9
  /** `extract --max-tokens` 省略時のデフォルト。 */
@@ -1 +1 @@
1
- {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../src/cli/constants.ts"],"names":[],"mappings":"AAAA,+BAA+B;AAC/B,eAAO,MAAM,iBAAiB,kBAAkB,CAAC;AAEjD,2CAA2C;AAC3C,eAAO,MAAM,iBAAiB,mBAAmB,CAAC;AAElD,qCAAqC;AACrC,eAAO,MAAM,aAAa,QACwC,CAAC;AAEnE,gDAAgD;AAChD,eAAO,MAAM,iBAAiB,8BAAoB,CAAC;AAEnD,wCAAwC;AACxC,eAAO,MAAM,kBAAkB,OAAO,CAAC"}
1
+ {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../src/cli/constants.ts"],"names":[],"mappings":"AAGA,+BAA+B;AAC/B,eAAO,MAAM,iBAAiB,kBAAkB,CAAC;AAEjD,8CAA8C;AAC9C,eAAO,MAAM,oBAAoB,kBAAkB,CAAC;AAEpD,4CAA4C;AAC5C,wBAAgB,0BAA0B,IAAI,MAAM,CAEnD;AAED,gDAAgD;AAChD,eAAO,MAAM,iBAAiB,8BAAoB,CAAC;AAEnD,wCAAwC;AACxC,eAAO,MAAM,kBAAkB,OAAO,CAAC"}
@@ -1,9 +1,13 @@
1
+ import { join } from 'node:path';
2
+ import { getModularPromptHome } from '@modular-prompt/driver';
1
3
  /** キャッシュディレクトリ内のメタデータファイル名。 */
2
4
  export const MANIFEST_FILENAME = 'manifest.json';
3
- /** `create -d` 省略時のデフォルト(カレントディレクトリ直下)。 */
4
- export const DEFAULT_CACHE_DIR = '.extract-cache';
5
- /** `create -m` 省略時のデフォルト MLX モデル。 */
6
- export const DEFAULT_MODEL = process.env.MLX_MODEL ?? 'prism-ml/Ternary-Bonsai-1.7B-mlx-2bit';
5
+ /** `-d` 省略時に使用する cache container のディレクトリ名。 */
6
+ export const DEFAULT_CACHE_SUBDIR = 'extract-cache';
7
+ /** `-d` 省略時のデフォルト cache container を解決する。 */
8
+ export function resolveDefaultContainerDir() {
9
+ return join(getModularPromptHome(), DEFAULT_CACHE_SUBDIR);
10
+ }
7
11
  /** create 時のキャッシュ prefill 用 cue(出力は最小限に抑える)。 */
8
12
  export const CACHE_PREPARE_CUE = '(cache prepare)';
9
13
  /** `extract --max-tokens` 省略時のデフォルト。 */
@@ -1 +1 @@
1
- {"version":3,"file":"constants.js","sourceRoot":"","sources":["../../src/cli/constants.ts"],"names":[],"mappings":"AAAA,+BAA+B;AAC/B,MAAM,CAAC,MAAM,iBAAiB,GAAG,eAAe,CAAC;AAEjD,2CAA2C;AAC3C,MAAM,CAAC,MAAM,iBAAiB,GAAG,gBAAgB,CAAC;AAElD,qCAAqC;AACrC,MAAM,CAAC,MAAM,aAAa,GACxB,OAAO,CAAC,GAAG,CAAC,SAAS,IAAI,uCAAuC,CAAC;AAEnE,gDAAgD;AAChD,MAAM,CAAC,MAAM,iBAAiB,GAAG,iBAAiB,CAAC;AAEnD,wCAAwC;AACxC,MAAM,CAAC,MAAM,kBAAkB,GAAG,IAAI,CAAC"}
1
+ {"version":3,"file":"constants.js","sourceRoot":"","sources":["../../src/cli/constants.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAE9D,+BAA+B;AAC/B,MAAM,CAAC,MAAM,iBAAiB,GAAG,eAAe,CAAC;AAEjD,8CAA8C;AAC9C,MAAM,CAAC,MAAM,oBAAoB,GAAG,eAAe,CAAC;AAEpD,4CAA4C;AAC5C,MAAM,UAAU,0BAA0B;IACxC,OAAO,IAAI,CAAC,oBAAoB,EAAE,EAAE,oBAAoB,CAAC,CAAC;AAC5D,CAAC;AAED,gDAAgD;AAChD,MAAM,CAAC,MAAM,iBAAiB,GAAG,iBAAiB,CAAC;AAEnD,wCAAwC;AACxC,MAAM,CAAC,MAAM,kBAAkB,GAAG,IAAI,CAAC"}
@@ -1,6 +1,8 @@
1
1
  export interface CreateCommandOptions {
2
+ /** Container directory containing one subdirectory per store. */
2
3
  cacheDir: string;
3
- model: string;
4
+ storename: string;
5
+ model?: string;
4
6
  files: string[];
5
7
  dryRun?: boolean;
6
8
  }
@@ -1 +1 @@
1
- {"version":3,"file":"create-command.d.ts","sourceRoot":"","sources":["../../src/cli/create-command.ts"],"names":[],"mappings":"AASA,MAAM,WAAW,oBAAoB;IACnC,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,wBAAsB,gBAAgB,CAAC,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CA8C5F"}
1
+ {"version":3,"file":"create-command.d.ts","sourceRoot":"","sources":["../../src/cli/create-command.ts"],"names":[],"mappings":"AASA,MAAM,WAAW,oBAAoB;IACnC,iEAAiE;IACjE,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,wBAAsB,gBAAgB,CAAC,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CA8C5F"}