@modular-prompt/extract 0.2.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 (92) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +300 -0
  3. package/bin/modular-extract.js +3 -0
  4. package/dist/build-modules.d.ts +5 -0
  5. package/dist/build-modules.d.ts.map +1 -0
  6. package/dist/build-modules.js +41 -0
  7. package/dist/build-modules.js.map +1 -0
  8. package/dist/cache-lifecycle.d.ts +12 -0
  9. package/dist/cache-lifecycle.d.ts.map +1 -0
  10. package/dist/cache-lifecycle.js +44 -0
  11. package/dist/cache-lifecycle.js.map +1 -0
  12. package/dist/cli/constants.d.ts +11 -0
  13. package/dist/cli/constants.d.ts.map +1 -0
  14. package/dist/cli/constants.js +11 -0
  15. package/dist/cli/constants.js.map +1 -0
  16. package/dist/cli/create-command.d.ts +8 -0
  17. package/dist/cli/create-command.d.ts.map +1 -0
  18. package/dist/cli/create-command.js +48 -0
  19. package/dist/cli/create-command.js.map +1 -0
  20. package/dist/cli/extract-command.d.ts +8 -0
  21. package/dist/cli/extract-command.d.ts.map +1 -0
  22. package/dist/cli/extract-command.js +42 -0
  23. package/dist/cli/extract-command.js.map +1 -0
  24. package/dist/cli/load-materials.d.ts +3 -0
  25. package/dist/cli/load-materials.d.ts.map +1 -0
  26. package/dist/cli/load-materials.js +20 -0
  27. package/dist/cli/load-materials.js.map +1 -0
  28. package/dist/cli/manifest.d.ts +12 -0
  29. package/dist/cli/manifest.d.ts.map +1 -0
  30. package/dist/cli/manifest.js +27 -0
  31. package/dist/cli/manifest.js.map +1 -0
  32. package/dist/cli/render-prompt.d.ts +6 -0
  33. package/dist/cli/render-prompt.d.ts.map +1 -0
  34. package/dist/cli/render-prompt.js +11 -0
  35. package/dist/cli/render-prompt.js.map +1 -0
  36. package/dist/cli.d.ts +3 -0
  37. package/dist/cli.d.ts.map +1 -0
  38. package/dist/cli.js +127 -0
  39. package/dist/cli.js.map +1 -0
  40. package/dist/compile-extract-prompt.d.ts +6 -0
  41. package/dist/compile-extract-prompt.d.ts.map +1 -0
  42. package/dist/compile-extract-prompt.js +18 -0
  43. package/dist/compile-extract-prompt.js.map +1 -0
  44. package/dist/create-extract-session.d.ts +4 -0
  45. package/dist/create-extract-session.d.ts.map +1 -0
  46. package/dist/create-extract-session.js +63 -0
  47. package/dist/create-extract-session.js.map +1 -0
  48. package/dist/create-mlx-extract-runtime.d.ts +20 -0
  49. package/dist/create-mlx-extract-runtime.d.ts.map +1 -0
  50. package/dist/create-mlx-extract-runtime.js +22 -0
  51. package/dist/create-mlx-extract-runtime.js.map +1 -0
  52. package/dist/extract-context.d.ts +15 -0
  53. package/dist/extract-context.d.ts.map +1 -0
  54. package/dist/extract-context.js +39 -0
  55. package/dist/extract-context.js.map +1 -0
  56. package/dist/extract-elements.d.ts +48 -0
  57. package/dist/extract-elements.d.ts.map +1 -0
  58. package/dist/extract-elements.js +87 -0
  59. package/dist/extract-elements.js.map +1 -0
  60. package/dist/index.d.ts +13 -0
  61. package/dist/index.d.ts.map +1 -0
  62. package/dist/index.js +9 -0
  63. package/dist/index.js.map +1 -0
  64. package/dist/modules/default-base-module.d.ts +15 -0
  65. package/dist/modules/default-base-module.d.ts.map +1 -0
  66. package/dist/modules/default-base-module.js +69 -0
  67. package/dist/modules/default-base-module.js.map +1 -0
  68. package/dist/modules/index.d.ts +2 -0
  69. package/dist/modules/index.d.ts.map +1 -0
  70. package/dist/modules/index.js +2 -0
  71. package/dist/modules/index.js.map +1 -0
  72. package/dist/previous-extractions.d.ts +12 -0
  73. package/dist/previous-extractions.d.ts.map +1 -0
  74. package/dist/previous-extractions.js +40 -0
  75. package/dist/previous-extractions.js.map +1 -0
  76. package/dist/resolve-session-modules.d.ts +9 -0
  77. package/dist/resolve-session-modules.d.ts.map +1 -0
  78. package/dist/resolve-session-modules.js +14 -0
  79. package/dist/resolve-session-modules.js.map +1 -0
  80. package/dist/section-templates.d.ts +9 -0
  81. package/dist/section-templates.d.ts.map +1 -0
  82. package/dist/section-templates.js +41 -0
  83. package/dist/section-templates.js.map +1 -0
  84. package/dist/test-helpers.d.ts +7 -0
  85. package/dist/test-helpers.d.ts.map +1 -0
  86. package/dist/test-helpers.js +28 -0
  87. package/dist/test-helpers.js.map +1 -0
  88. package/dist/types.d.ts +60 -0
  89. package/dist/types.d.ts.map +1 -0
  90. package/dist/types.js +2 -0
  91. package/dist/types.js.map +1 -0
  92. package/package.json +67 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2025 otolab
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,300 @@
1
+ # @modular-prompt/extract
2
+
3
+ 同一 corpus(文書・対話ログ)に対して、**複数の切り口(cue)で繰り返し情報抽出**するセッション API。
4
+
5
+ KV キャッシュを活用し、corpus を一度 prefill したあと `cue` と `inputs` だけを差し替えて抽出を繰り返す。RAG に近いが、検索インデックスではなくプロンプトキャッシュを伸ばしながら文書全体をコンテキストに保持するパターン向け。
6
+
7
+ ## インストール
8
+
9
+ ```bash
10
+ npm install @modular-prompt/extract @modular-prompt/driver
11
+ ```
12
+
13
+ ワークスペース内では `@modular-prompt/core` / `@modular-prompt/driver` が依存として解決される。
14
+
15
+ ## 概要
16
+
17
+ ```
18
+ base (+ domain) + corpus (materials / messages) + request (inputs) ← cue
19
+ ```
20
+
21
+ | レイヤ | 指定タイミング | 役割 |
22
+ |--------|--------------|------|
23
+ | **base** | セッション生成 | 抽出タスクの基本方針(省略時は `defaultExtractBaseModule`) |
24
+ | **domain** | セッション生成 | 用語定義・追加指示(`domainModule` で overlay) |
25
+ | **corpus** | セッション生成 | 固定の抽出対象(`materials` / `messages`) |
26
+ | **inputs** | 各 `extract()` | 補強情報(前回結果・フィルタ条件など) |
27
+ | **cue** | 各 `extract()` | 今回の出力切り口 |
28
+
29
+ ### 入力の考え方
30
+
31
+ 呼び出し側は Element を直接組み立てない。**スロットごとの最小入力**を渡すと、フレームワークが `MaterialElement` / `MessageElement` / `ChunkElement` に正規化する。
32
+
33
+ | スロット | 最小入力 | 例 |
34
+ |---------|---------|-----|
35
+ | `materials` | `{ title, content, id? }` | `{ title: '議事録', content: '...' }` |
36
+ | `messages` | `{ role, content, ... }` | `{ role: 'user', content: '要約して' }` |
37
+ | `inputs` | `string` または `{ content, ... }` | `'補助テキスト'` / `inputChunk(...)` |
38
+ | `cue` | `string` | `'登場人物を列挙'` |
39
+
40
+ `type`・`cacheHint`・`partOf` は正規化層が付与する。呼び出し側で指定する必要はない。
41
+
42
+ ## クイックスタート(MLX)
43
+
44
+ ### CLI
45
+
46
+ ビルド後、ワークスペース内では次のように実行できる。
47
+
48
+ ```bash
49
+ pnpm --filter @modular-prompt/extract build
50
+
51
+ # 1. 入力ファイルからキャッシュ作成(デフォルト: ./.extract-cache)
52
+ node packages/extract/bin/modular-extract.js create -m 'your-mlx-model' docs/*.txt
53
+
54
+ # 2. 抽出クエリ(cue)を実行 — 結果は stdout
55
+ node packages/extract/bin/modular-extract.js extract -d .extract-cache '登場人物を列挙'
56
+
57
+ # キャッシュ削除
58
+ rm -rf .extract-cache
59
+ ```
60
+
61
+ | コマンド | 説明 |
62
+ |---------|------|
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) |
66
+ | `--dry-run` | MLX を起動せず、compile 済みプロンプト全文を stdout に出力 |
67
+
68
+ ```bash
69
+ # プロンプト確認(create)
70
+ modular-extract create --dry-run docs/notes.txt
71
+
72
+ # プロンプト確認(extract — manifest が必要)
73
+ modular-extract extract --dry-run -d .extract-cache '登場人物を列挙'
74
+ ```
75
+
76
+ `-d` 省略時のデフォルトは `./.extract-cache`。`-m` 省略時は `MLX_MODEL` 環境変数、未設定ならパッケージ既定モデル。
77
+
78
+ **MLX バックエンドは mlx-lm(`backend: 'lm'`)に固定**している。`auto` で VLM が選ばれるとプロンプトキャッシュが無効になるため。
79
+
80
+ ### ライブラリ API
81
+
82
+ ```typescript
83
+ import {
84
+ createExtractSession,
85
+ createMlxExtractRuntime,
86
+ } from '@modular-prompt/extract';
87
+
88
+ const runtime = await createMlxExtractRuntime({
89
+ model: 'prism-ml/Ternary-Bonsai-1.7B-mlx-2bit',
90
+ });
91
+
92
+ try {
93
+ const session = createExtractSession({
94
+ driver: runtime.driver,
95
+ cacheController: runtime.cacheController,
96
+ model: runtime.model,
97
+ corpus: {
98
+ materials: [{
99
+ title: 'Meeting Notes',
100
+ content: 'Alice met Bob in Paris to discuss the modular-prompt project.',
101
+ }],
102
+ },
103
+ });
104
+
105
+ const people = await session.extract({ cue: 'List people mentioned' });
106
+ const places = await session.extract({ cue: 'List cities mentioned' });
107
+
108
+ console.log(people.text);
109
+ console.log(places.text);
110
+ // 2 回目以降: places.usage?.cacheReadTokens > 0 が期待できる
111
+
112
+ await session.close();
113
+ } finally {
114
+ await runtime.close();
115
+ }
116
+ ```
117
+
118
+ ## キャッシュの意図と制約
119
+
120
+ ### 削除タイミング
121
+
122
+ | タイミング | 何が起きるか |
123
+ |-----------|-------------|
124
+ | `session.close()`(デフォルト) | handle を `release` マーク → 次の `runtime.close()` で **KV ファイル削除** |
125
+ | `session.close({ releaseCache: false })` | release しない → **KV ファイルは disk に残る**(CLI はこちら) |
126
+ | `runtime.close()`(固定 cacheDir) | `release` 済みエントリの `.safetensors` を削除 |
127
+ | `runtime.close()`(一時 cacheDir) | **ディレクトリごと削除** |
128
+ | `rm -rf <cache-dir>` | manifest + KV キャッシュを手動削除(CLI のクリーン方法) |
129
+
130
+ `create` 直後に `manifest.json` だけ残って `.safetensors` が無い場合、以前のバージョンでは `session.close()` が release していたのが原因。CLI は `releaseCache: false` で修正済み。
131
+
132
+ ### 意図
133
+
134
+ - **corpus(materials / messages)** はセッション内で不変 → 1 回 prefill すれば再利用
135
+ - **inputs** は呼び出しごとに増える → incremental prefill でキャッシュを伸ばす
136
+ - **cue** は毎回変わる → output セクションのためキャッシュ対象外
137
+
138
+ ### 制約
139
+
140
+ | 変更内容 | 対応 |
141
+ |---------|------|
142
+ | `corpus` を変えたい | **新しいセッション**を作る |
143
+ | `baseModule` を変えたい | **新しいセッション**を作る |
144
+ | 前回の抽出結果を参照したい | 次の `extract()` の `inputs` に明示的に渡す(自動累積しない) |
145
+ | driver / cacheController の終了 | 呼び出し側の責務(`runtime.close()` 等) |
146
+ | セッション終了 | `session.close()` — デフォルトで handle `release()`。固定 cacheDir を残す場合は `{ releaseCache: false }` |
147
+
148
+ `cacheController` と `model` は **必須**。キャッシュ非対応モードは提供しない。
149
+
150
+ 詳細は [プロンプトキャッシュ設計](../../docs/CACHE_DESIGN.md) および [API 仕様](./API.md) を参照。
151
+
152
+ ## サンプル
153
+
154
+ `examples/` に実行可能なサンプルを同梱している。
155
+
156
+ | ファイル | 内容 |
157
+ |---------|------|
158
+ | [document-extraction.ts](./examples/document-extraction.ts) | 文書(materials)+ 複数 cue |
159
+ | [dialogue-extraction.ts](./examples/dialogue-extraction.ts) | 対話ログ(messages)+ 資料 |
160
+ | [progressive-deep-dive.ts](./examples/progressive-deep-dive.ts) | inputs 積み上げ + キャッシュ活用 |
161
+
162
+ ### 文書抽出(materials + 複数 cue)
163
+
164
+ ```typescript
165
+ import { createExtractSession, createMlxExtractRuntime } from '@modular-prompt/extract';
166
+
167
+ const runtime = await createMlxExtractRuntime({ model: 'your-mlx-model' });
168
+
169
+ const session = createExtractSession({
170
+ driver: runtime.driver,
171
+ cacheController: runtime.cacheController,
172
+ model: runtime.model,
173
+ corpus: {
174
+ materials: [
175
+ { title: '契約書 v3', content: '...' },
176
+ { title: '別紙 料金表', content: '...' },
177
+ ],
178
+ },
179
+ });
180
+
181
+ await session.extract({ cue: '契約期間と更新条件を抽出' });
182
+ await session.extract({ cue: '料金体系と支払条件を抽出' });
183
+ await session.close();
184
+ await runtime.close();
185
+ ```
186
+
187
+ ### 対話ログ抽出(messages + materials)
188
+
189
+ ```typescript
190
+ const session = createExtractSession({
191
+ driver: runtime.driver,
192
+ cacheController: runtime.cacheController,
193
+ model: runtime.model,
194
+ corpus: {
195
+ materials: [{ title: '製品仕様', content: '...' }],
196
+ messages: [
197
+ { role: 'user', content: 'この機能の制約を教えて' },
198
+ { role: 'assistant', content: '...' },
199
+ { role: 'user', content: 'では代替案は?' },
200
+ ],
201
+ },
202
+ });
203
+
204
+ await session.extract({ cue: '議論された制約と合意事項を抽出' });
205
+ ```
206
+
207
+ ### 段階的深掘り(inputs + キャッシュ)
208
+
209
+ ```typescript
210
+ import {
211
+ buildPreviousExtractionsInputs,
212
+ inputChunksFromJson,
213
+ } from '@modular-prompt/extract';
214
+
215
+ const overview = await session.extract({ cue: '会議の概要を1段落で' });
216
+
217
+ const details = await session.extract({
218
+ cue: '概要を踏まえ、決定事項と未決事項を整理',
219
+ inputs: buildPreviousExtractionsInputs([overview]),
220
+ });
221
+
222
+ // JSON 補助情報を渡す場合
223
+ await session.extract({
224
+ cue: '担当者と期限を表形式で',
225
+ inputs: inputChunksFromJson({ focus: 'action items' }),
226
+ });
227
+ ```
228
+
229
+ ## ドメイン調整と structured output
230
+
231
+ ```typescript
232
+ import { mergeExtractBaseModule } from '@modular-prompt/extract';
233
+
234
+ const session = createExtractSession({
235
+ driver: runtime.driver,
236
+ cacheController: runtime.cacheController,
237
+ model: runtime.model,
238
+ domainModule: {
239
+ terms: ['「PJ」は modular-prompt プロジェクトを指す。'],
240
+ },
241
+ corpus: { materials: [{ title: 'Notes', content: '...' }] },
242
+ schema: {
243
+ type: 'object',
244
+ properties: { name: { type: 'string' } },
245
+ required: ['name'],
246
+ },
247
+ });
248
+
249
+ const result = await session.extract({ cue: '人物名を抽出' });
250
+ console.log(result.structured); // schema に沿った JSON
251
+ ```
252
+
253
+ `baseModule` を丸ごと差し替えることも可能。汎用挙動を保ちつつ追記する場合は `mergeExtractBaseModule()` を使う。
254
+
255
+ ## 公開 API(主要)
256
+
257
+ | シンボル | 説明 |
258
+ |---------|------|
259
+ | `createExtractSession` | 抽出セッションを生成 |
260
+ | `createMlxExtractRuntime` | MLX 用 driver + cacheController バンドル |
261
+ | `defaultExtractBaseModule` | デフォルト base モジュール |
262
+ | `mergeExtractBaseModule` | デフォルト base に overlay を merge |
263
+ | `buildPreviousExtractionsInputs` | 過去抽出結果を inputs に変換 |
264
+ | `inputChunk` / `inputChunksFromJson` | chunk 入力ヘルパ |
265
+
266
+ 型: `ExtractCorpus`, `ExtractRequest`, `ExtractResult`, `ExtractSession`, `MaterialInput`, `MessageInput`, `ChunkInput` など。
267
+
268
+ 完全な API リファレンスは [API.md](./API.md) を参照。
269
+
270
+ ## CLI(`modular-extract`)
271
+
272
+ `bin/modular-extract.js` 経由で利用できる簡易 CLI。
273
+
274
+ ```bash
275
+ pnpm --filter @modular-prompt/extract build
276
+
277
+ modular-extract create [-d .extract-cache] [-m model] file1.txt file2.txt
278
+ modular-extract extract -d .extract-cache '抽出したい内容の指示'
279
+
280
+ # キャッシュ削除
281
+ rm -rf .extract-cache
282
+ ```
283
+
284
+ `create` は入力ファイルを corpus として KV cache を準備し、`manifest.json` を cache ディレクトリに保存する。`extract` は manifest から corpus を復元して cue を実行する。いずれも **mlx-lm バックエンド固定**(キャッシュ互換のため)。
285
+
286
+ ## テスト
287
+
288
+ ```bash
289
+ pnpm --filter @modular-prompt/extract test:run
290
+ ```
291
+
292
+ MLX 統合テストは macOS + MLX 設定がある環境でのみ実行される。
293
+
294
+ ## 関連ドキュメント
295
+
296
+ - [API 仕様](./API.md)
297
+ - [プロンプトモジュール仕様](../../docs/PROMPT_MODULE_SPEC.md)
298
+ - [プロンプトキャッシュ設計](../../docs/CACHE_DESIGN.md)
299
+ - [ローカルモデルセットアップ](../../docs/LOCAL_MODEL_SETUP.md)
300
+ - 親 Issue: [#330](https://github.com/otolab/modular-prompt/issues/330)
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+
3
+ import '../dist/cli.js';
@@ -0,0 +1,5 @@
1
+ import type { PromptModule } from '@modular-prompt/core';
2
+ import type { ExtractCorpus, ExtractRequest } from './types.js';
3
+ export declare function buildCorpusModule(corpus: ExtractCorpus): PromptModule;
4
+ export declare function buildRequestModule(request: ExtractRequest): PromptModule;
5
+ //# sourceMappingURL=build-modules.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"build-modules.d.ts","sourceRoot":"","sources":["../src/build-modules.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAA+B,MAAM,sBAAsB,CAAC;AACtF,OAAO,KAAK,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AA0BhE,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,aAAa,GAAG,YAAY,CAarE;AAED,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,cAAc,GAAG,YAAY,CAaxE"}
@@ -0,0 +1,41 @@
1
+ import { normalizeInputs, normalizeMaterials, normalizeMessages, } from './extract-elements.js';
2
+ function withContextualCacheHint(content) {
3
+ return content.map((item) => {
4
+ if (typeof item === 'string') {
5
+ return {
6
+ type: 'text',
7
+ content: item,
8
+ cacheHint: 'contextual',
9
+ };
10
+ }
11
+ if (item && typeof item === 'object' && 'type' in item) {
12
+ return {
13
+ ...item,
14
+ cacheHint: item.cacheHint ?? 'contextual',
15
+ };
16
+ }
17
+ return item;
18
+ });
19
+ }
20
+ export function buildCorpusModule(corpus) {
21
+ const module = {};
22
+ const materials = normalizeMaterials(corpus.materials);
23
+ const messages = normalizeMessages(corpus.messages);
24
+ if (materials) {
25
+ module.materials = [...materials];
26
+ }
27
+ if (messages) {
28
+ module.messages = [...messages];
29
+ }
30
+ return module;
31
+ }
32
+ export function buildRequestModule(request) {
33
+ const cue = withContextualCacheHint(typeof request.cue === 'string' ? [request.cue] : request.cue);
34
+ const module = { cue };
35
+ const inputs = normalizeInputs(request.inputs);
36
+ if (inputs) {
37
+ module.inputs = [...inputs];
38
+ }
39
+ return module;
40
+ }
41
+ //# sourceMappingURL=build-modules.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"build-modules.js","sourceRoot":"","sources":["../src/build-modules.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,eAAe,EACf,kBAAkB,EAClB,iBAAiB,GAClB,MAAM,uBAAuB,CAAC;AAE/B,SAAS,uBAAuB,CAAC,OAAuB;IACtD,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;QAC1B,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC7B,OAAO;gBACL,IAAI,EAAE,MAAM;gBACZ,OAAO,EAAE,IAAI;gBACb,SAAS,EAAE,YAAY;aACF,CAAC;QAC1B,CAAC;QACD,IAAI,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,MAAM,IAAI,IAAI,EAAE,CAAC;YACvD,OAAO;gBACL,GAAG,IAAI;gBACP,SAAS,EAAE,IAAI,CAAC,SAAS,IAAI,YAAY;aAC1C,CAAC;QACJ,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,MAAqB;IACrD,MAAM,MAAM,GAAiB,EAAE,CAAC;IAChC,MAAM,SAAS,GAAG,kBAAkB,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IACvD,MAAM,QAAQ,GAAG,iBAAiB,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IAEpD,IAAI,SAAS,EAAE,CAAC;QACd,MAAM,CAAC,SAAS,GAAG,CAAC,GAAG,SAAS,CAAC,CAAC;IACpC,CAAC;IACD,IAAI,QAAQ,EAAE,CAAC;QACb,MAAM,CAAC,QAAQ,GAAG,CAAC,GAAG,QAAQ,CAAC,CAAC;IAClC,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,OAAuB;IACxD,MAAM,GAAG,GAAG,uBAAuB,CACjC,OAAO,OAAO,CAAC,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAC9D,CAAC;IAEF,MAAM,MAAM,GAAiB,EAAE,GAAG,EAAE,CAAC;IACrC,MAAM,MAAM,GAAG,eAAe,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IAE/C,IAAI,MAAM,EAAE,CAAC;QACX,MAAM,CAAC,MAAM,GAAG,CAAC,GAAG,MAAM,CAAC,CAAC;IAC9B,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,12 @@
1
+ import type { PromptModule } from '@modular-prompt/core';
2
+ import type { AIDriver, CacheHandle, PromptCacheController } from '@modular-prompt/driver';
3
+ import type { ExtractCorpus, ExtractRequest } from './types.js';
4
+ export interface CacheLifecycleState {
5
+ handle: CacheHandle | null;
6
+ controllerReady: boolean;
7
+ }
8
+ export declare function resolveModelName(model: string): string;
9
+ 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>;
11
+ export declare function releaseSessionCache(cacheController: PromptCacheController, state: CacheLifecycleState): void;
12
+ //# sourceMappingURL=cache-lifecycle.d.ts.map
@@ -0,0 +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"}
@@ -0,0 +1,44 @@
1
+ import { partitionPrompt } from '@modular-prompt/driver';
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
+ export async function ensureCacheControllerReady(driver, state) {
10
+ if (state.controllerReady) {
11
+ return;
12
+ }
13
+ if ('getCapabilities' in driver && typeof driver.getCapabilities === 'function') {
14
+ await driver.getCapabilities();
15
+ }
16
+ state.controllerReady = true;
17
+ }
18
+ export async function prepareSessionCache(cacheController, model, sessionBaseModule, corpus, request, baseModule, state) {
19
+ const compiled = compileExtractPrompt(sessionBaseModule, corpus, request, baseModule);
20
+ const { cacheable } = partitionPrompt(compiled);
21
+ const hasCacheableContent = cacheable.instructions.length > 0 || cacheable.data.length > 0;
22
+ if (!hasCacheableContent) {
23
+ return state.handle;
24
+ }
25
+ const newHandle = await cacheController.prepare({
26
+ model,
27
+ instructions: cacheable.instructions,
28
+ data: cacheable.data,
29
+ tools: request.options?.tools,
30
+ reasoningEffort: request.options?.reasoningEffort,
31
+ });
32
+ if (state.handle?.ref && newHandle.supersedes === state.handle.ref) {
33
+ cacheController.release(state.handle.ref);
34
+ }
35
+ state.handle = newHandle.ref ? newHandle : null;
36
+ return state.handle;
37
+ }
38
+ export function releaseSessionCache(cacheController, state) {
39
+ if (state.handle?.ref) {
40
+ cacheController.release(state.handle.ref);
41
+ state.handle = null;
42
+ }
43
+ }
44
+ //# sourceMappingURL=cache-lifecycle.js.map
@@ -0,0 +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"}
@@ -0,0 +1,11 @@
1
+ /** キャッシュディレクトリ内のメタデータファイル名。 */
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;
7
+ /** create 時のキャッシュ prefill 用 cue(出力は最小限に抑える)。 */
8
+ export declare const CACHE_PREPARE_CUE = "\uFF08cache prepare\uFF09";
9
+ /** `extract --max-tokens` 省略時のデフォルト。 */
10
+ export declare const DEFAULT_MAX_TOKENS = 8000;
11
+ //# sourceMappingURL=constants.d.ts.map
@@ -0,0 +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"}
@@ -0,0 +1,11 @@
1
+ /** キャッシュディレクトリ内のメタデータファイル名。 */
2
+ 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';
7
+ /** create 時のキャッシュ prefill 用 cue(出力は最小限に抑える)。 */
8
+ export const CACHE_PREPARE_CUE = '(cache prepare)';
9
+ /** `extract --max-tokens` 省略時のデフォルト。 */
10
+ export const DEFAULT_MAX_TOKENS = 8000;
11
+ //# sourceMappingURL=constants.js.map
@@ -0,0 +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"}
@@ -0,0 +1,8 @@
1
+ export interface CreateCommandOptions {
2
+ cacheDir: string;
3
+ model: string;
4
+ files: string[];
5
+ dryRun?: boolean;
6
+ }
7
+ export declare function runCreateCommand(options: CreateCommandOptions): Promise<string | void>;
8
+ //# sourceMappingURL=create-command.d.ts.map
@@ -0,0 +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"}
@@ -0,0 +1,48 @@
1
+ import { mkdir } from 'node:fs/promises';
2
+ import { resolve } from 'node:path';
3
+ import { createExtractSession } from '../create-extract-session.js';
4
+ import { createMlxExtractRuntime } from '../create-mlx-extract-runtime.js';
5
+ import { CACHE_PREPARE_CUE, DEFAULT_MODEL } from './constants.js';
6
+ import { loadMaterialsFromFiles } from './load-materials.js';
7
+ import { manifestExists, writeManifest } from './manifest.js';
8
+ import { renderExtractPrompt } from './render-prompt.js';
9
+ export async function runCreateCommand(options) {
10
+ const cacheDir = resolve(options.cacheDir);
11
+ const model = options.model || DEFAULT_MODEL;
12
+ const materials = await loadMaterialsFromFiles(options.files);
13
+ const request = { cue: CACHE_PREPARE_CUE };
14
+ if (options.dryRun) {
15
+ return renderExtractPrompt({ materials }, request);
16
+ }
17
+ if (await manifestExists(cacheDir)) {
18
+ throw new Error(`Cache directory already exists: ${cacheDir}\n`
19
+ + 'Remove the directory to clean the cache, then run create again.');
20
+ }
21
+ await mkdir(cacheDir, { recursive: true });
22
+ const runtime = await createMlxExtractRuntime({ model, cacheDir });
23
+ try {
24
+ const session = createExtractSession({
25
+ driver: runtime.driver,
26
+ cacheController: runtime.cacheController,
27
+ model: runtime.model,
28
+ corpus: { materials },
29
+ });
30
+ await session.extract({
31
+ cue: CACHE_PREPARE_CUE,
32
+ options: { maxTokens: 1, temperature: 0 },
33
+ });
34
+ await session.close({ releaseCache: false });
35
+ await writeManifest(cacheDir, {
36
+ version: 1,
37
+ model,
38
+ materials,
39
+ createdAt: new Date().toISOString(),
40
+ });
41
+ }
42
+ finally {
43
+ await runtime.close();
44
+ }
45
+ console.error(`Cache prepared: ${cacheDir}`);
46
+ console.error(`Materials: ${materials.length} file(s), model: ${model}`);
47
+ }
48
+ //# sourceMappingURL=create-command.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-command.js","sourceRoot":"","sources":["../../src/cli/create-command.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AACpE,OAAO,EAAE,uBAAuB,EAAE,MAAM,kCAAkC,CAAC;AAC3E,OAAO,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAClE,OAAO,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AAC7D,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC9D,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AASzD,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,OAA6B;IAClE,MAAM,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IAC3C,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,aAAa,CAAC;IAC7C,MAAM,SAAS,GAAG,MAAM,sBAAsB,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IAC9D,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,IAAI,MAAM,cAAc,CAAC,QAAQ,CAAC,EAAE,CAAC;QACnC,MAAM,IAAI,KAAK,CACb,mCAAmC,QAAQ,IAAI;cAC7C,iEAAiE,CACpE,CAAC;IACJ,CAAC;IAED,MAAM,KAAK,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAE3C,MAAM,OAAO,GAAG,MAAM,uBAAuB,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;IACnE,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,oBAAoB,CAAC;YACnC,MAAM,EAAE,OAAO,CAAC,MAAM;YACtB,eAAe,EAAE,OAAO,CAAC,eAAe;YACxC,KAAK,EAAE,OAAO,CAAC,KAAK;YACpB,MAAM,EAAE,EAAE,SAAS,EAAE;SACtB,CAAC,CAAC;QAEH,MAAM,OAAO,CAAC,OAAO,CAAC;YACpB,GAAG,EAAE,iBAAiB;YACtB,OAAO,EAAE,EAAE,SAAS,EAAE,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE;SAC1C,CAAC,CAAC;QACH,MAAM,OAAO,CAAC,KAAK,CAAC,EAAE,YAAY,EAAE,KAAK,EAAE,CAAC,CAAC;QAE7C,MAAM,aAAa,CAAC,QAAQ,EAAE;YAC5B,OAAO,EAAE,CAAC;YACV,KAAK;YACL,SAAS;YACT,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SACpC,CAAC,CAAC;IACL,CAAC;YAAS,CAAC;QACT,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC;IACxB,CAAC;IAED,OAAO,CAAC,KAAK,CAAC,mBAAmB,QAAQ,EAAE,CAAC,CAAC;IAC7C,OAAO,CAAC,KAAK,CAAC,cAAc,SAAS,CAAC,MAAM,oBAAoB,KAAK,EAAE,CAAC,CAAC;AAC3E,CAAC"}
@@ -0,0 +1,8 @@
1
+ export interface ExtractCommandOptions {
2
+ cacheDir: string;
3
+ query: string;
4
+ maxTokens?: number;
5
+ dryRun?: boolean;
6
+ }
7
+ export declare function runExtractCommand(options: ExtractCommandOptions): Promise<string>;
8
+ //# sourceMappingURL=extract-command.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extract-command.d.ts","sourceRoot":"","sources":["../../src/cli/extract-command.ts"],"names":[],"mappings":"AAOA,MAAM,WAAW,qBAAqB;IACpC,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,wBAAsB,iBAAiB,CAAC,OAAO,EAAE,qBAAqB,GAAG,OAAO,CAAC,MAAM,CAAC,CAuCvF"}
@@ -0,0 +1,42 @@
1
+ import { resolve } from 'node:path';
2
+ import { createExtractSession } from '../create-extract-session.js';
3
+ import { createMlxExtractRuntime } from '../create-mlx-extract-runtime.js';
4
+ import { DEFAULT_MAX_TOKENS } from './constants.js';
5
+ import { readManifest } from './manifest.js';
6
+ import { renderExtractPrompt } from './render-prompt.js';
7
+ export async function runExtractCommand(options) {
8
+ const cacheDir = resolve(options.cacheDir);
9
+ const manifest = await readManifest(cacheDir);
10
+ if (!options.query.trim()) {
11
+ throw new Error('Query text is required');
12
+ }
13
+ const request = {
14
+ cue: options.query,
15
+ options: {
16
+ maxTokens: options.maxTokens ?? DEFAULT_MAX_TOKENS,
17
+ temperature: 0,
18
+ },
19
+ };
20
+ if (options.dryRun) {
21
+ return renderExtractPrompt({ materials: manifest.materials }, request);
22
+ }
23
+ const runtime = await createMlxExtractRuntime({
24
+ model: manifest.model,
25
+ cacheDir,
26
+ });
27
+ try {
28
+ const session = createExtractSession({
29
+ driver: runtime.driver,
30
+ cacheController: runtime.cacheController,
31
+ model: runtime.model,
32
+ corpus: { materials: manifest.materials },
33
+ });
34
+ const result = await session.extract(request);
35
+ await session.close({ releaseCache: false });
36
+ return result.text;
37
+ }
38
+ finally {
39
+ await runtime.close();
40
+ }
41
+ }
42
+ //# sourceMappingURL=extract-command.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extract-command.js","sourceRoot":"","sources":["../../src/cli/extract-command.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AACpE,OAAO,EAAE,uBAAuB,EAAE,MAAM,kCAAkC,CAAC;AAC3E,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AACpD,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AASzD,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,OAA8B;IACpE,MAAM,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IAC3C,MAAM,QAAQ,GAAG,MAAM,YAAY,CAAC,QAAQ,CAAC,CAAC;IAE9C,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC;QAC1B,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAC;IAC5C,CAAC;IAED,MAAM,OAAO,GAAG;QACd,GAAG,EAAE,OAAO,CAAC,KAAK;QAClB,OAAO,EAAE;YACP,SAAS,EAAE,OAAO,CAAC,SAAS,IAAI,kBAAkB;YAClD,WAAW,EAAE,CAAU;SACxB;KACF,CAAC;IAEF,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;QACnB,OAAO,mBAAmB,CAAC,EAAE,SAAS,EAAE,QAAQ,CAAC,SAAS,EAAE,EAAE,OAAO,CAAC,CAAC;IACzE,CAAC;IAED,MAAM,OAAO,GAAG,MAAM,uBAAuB,CAAC;QAC5C,KAAK,EAAE,QAAQ,CAAC,KAAK;QACrB,QAAQ;KACT,CAAC,CAAC;IAEH,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,oBAAoB,CAAC;YACnC,MAAM,EAAE,OAAO,CAAC,MAAM;YACtB,eAAe,EAAE,OAAO,CAAC,eAAe;YACxC,KAAK,EAAE,OAAO,CAAC,KAAK;YACpB,MAAM,EAAE,EAAE,SAAS,EAAE,QAAQ,CAAC,SAAS,EAAE;SAC1C,CAAC,CAAC;QAEH,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QAC9C,MAAM,OAAO,CAAC,KAAK,CAAC,EAAE,YAAY,EAAE,KAAK,EAAE,CAAC,CAAC;QAC7C,OAAO,MAAM,CAAC,IAAI,CAAC;IACrB,CAAC;YAAS,CAAC;QACT,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC;IACxB,CAAC;AACH,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { MaterialInput } from '../extract-elements.js';
2
+ export declare function loadMaterialsFromFiles(paths: string[]): Promise<MaterialInput[]>;
3
+ //# sourceMappingURL=load-materials.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"load-materials.d.ts","sourceRoot":"","sources":["../../src/cli/load-materials.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAE5D,wBAAsB,sBAAsB,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC,CAiBtF"}
@@ -0,0 +1,20 @@
1
+ import { readFile } from 'node:fs/promises';
2
+ import { basename, resolve } from 'node:path';
3
+ export async function loadMaterialsFromFiles(paths) {
4
+ if (paths.length === 0) {
5
+ throw new Error('At least one input file is required');
6
+ }
7
+ const materials = [];
8
+ for (const inputPath of paths) {
9
+ const absolutePath = resolve(inputPath);
10
+ const content = await readFile(absolutePath, 'utf-8');
11
+ const title = basename(absolutePath);
12
+ materials.push({
13
+ id: absolutePath,
14
+ title,
15
+ content,
16
+ });
17
+ }
18
+ return materials;
19
+ }
20
+ //# sourceMappingURL=load-materials.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"load-materials.js","sourceRoot":"","sources":["../../src/cli/load-materials.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAG9C,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAAC,KAAe;IAC1D,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,MAAM,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAC;IACzD,CAAC;IAED,MAAM,SAAS,GAAoB,EAAE,CAAC;IACtC,KAAK,MAAM,SAAS,IAAI,KAAK,EAAE,CAAC;QAC9B,MAAM,YAAY,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC;QACxC,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;QACtD,MAAM,KAAK,GAAG,QAAQ,CAAC,YAAY,CAAC,CAAC;QACrC,SAAS,CAAC,IAAI,CAAC;YACb,EAAE,EAAE,YAAY;YAChB,KAAK;YACL,OAAO;SACR,CAAC,CAAC;IACL,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC"}