dsh-cait 1.1.3 → 1.1.7

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.
package/CHANGELOG.md CHANGED
@@ -4,6 +4,188 @@ All notable changes to CAIT are documented here. The project follows
4
4
  [Semantic Versioning](https://semver.org/) and the format is based on
5
5
  [Keep a Changelog](https://keepachangelog.com/).
6
6
 
7
+ ## [1.1.7] - 2026-11-10
8
+
9
+ Format-depth release: DOCX tables, headers, footers, and notes; Apple/Android
10
+ string catalogs and other localization formats; PowerPoint speaker notes,
11
+ multi-sheet XLSX, and subtitle timing controls.
12
+
13
+ ### Added
14
+
15
+ - **DOCX content outside the body.** Import and export paragraphs in tables,
16
+ headers, footers, footnotes, and endnotes, keyed by `docxPart` and
17
+ `docxParagraph`; body-only documents keep the old path.
18
+ - **Localization string formats.** Apple `.strings` and `.stringsdict`, Android
19
+ `strings.xml`/plurals, `.resx`, `.arb`, nested YAML, and Java `.properties`.
20
+ Keys, comments, plural variants, block scalars, inline XML tags, and ARB
21
+ metadata are preserved for round trips. Nested YAML supports mappings,
22
+ sequences, scalars, block scalars, and comments; anchors, aliases, merge keys,
23
+ and flow collections are rejected explicitly.
24
+ - **PowerPoint speaker notes.** Notes pages are imported as separate units and
25
+ written back by part; slide text and notes stay in document order.
26
+ - **Multi-sheet XLSX with source-preserving export.** Every worksheet is
27
+ imported with `sheet`/`sheetName` metadata and cell references. When the
28
+ source workbook is retained, export patches the original cells instead of
29
+ rebuilding the workbook, so styles, merged ranges, and other sheets survive;
30
+ formula cells are skipped.
31
+ - **Subtitle timeline controls.** Merge adjacent cues, split a cue at a time
32
+ point, and shift all cues by milliseconds. Overlapping cues are reported as a
33
+ high-risk QA finding rather than being changed automatically.
34
+
35
+ ### Changed
36
+
37
+ - Segment views include their metadata (`start`/`end`, `docxPart`, `sheetName`,
38
+ key paths, and similar) so timeline and format context reaches the UI.
39
+
40
+ ### Known limits
41
+
42
+ - Segment merge/split still only cover text formats; Office merge/split needs a
43
+ paragraph-mapping contract.
44
+ - XLSX export needs a target column; formula cells are skipped, and workbooks
45
+ imported before 1.1.7 have no retained source package to patch.
46
+ - Nested YAML rejects anchors, aliases, merge keys, and flow collections.
47
+ - Subtitle editing has no waveform/playhead; split uses a time point, merge uses
48
+ the outer cue range.
49
+
50
+ ## [1.1.6] - 2026-11-09
51
+
52
+ Review-workbench release: find and replace, a command palette, segment notes,
53
+ draft undo/redo, segment merge/split/lock, proper-name term discovery, and an
54
+ optional AI review pass that suggests fixes without writing to the document.
55
+
56
+ ### Added
57
+
58
+ - **Find and replace.** Preview every match in source/target, apply in one step,
59
+ and undo the last replacement. Confirmed segments are downgraded to review when
60
+ their target changes; TM entries are left untouched.
61
+ - **Command palette and shortcuts.** `Ctrl/Cmd+K` opens a command palette;
62
+ `Ctrl/Cmd+F` opens find and replace.
63
+ - **Segment notes.** Per-segment review comments with add, edit, and delete,
64
+ persisted in the document JSON.
65
+ - **Draft undo/redo.** Per-segment editing history with `Ctrl/Cmd+Z`,
66
+ `Ctrl/Cmd+Shift+Z`, and `Ctrl/Cmd+Y`.
67
+ - **Merge, split, and lock.** Merge adjacent text segments, split a segment at a
68
+ source offset, and lock segments against edits, confirmation, replacement,
69
+ pre-translation, propagation, and clearing.
70
+ - **Term discovery for one-off names.** Candidates now include quoted terms,
71
+ capitalized names, and Chinese proper names that occur once, in addition to
72
+ repeated n-grams. Candidates carry a type, confidence, and evidence; they are
73
+ never added to the glossary automatically.
74
+ - **AI review.** `reviewDocument` asks the configured DSH route for structured
75
+ issues (`severity`, `code`, `message`, `suggestion`) and the QA tab can jump to
76
+ a segment or fill a suggestion into the draft. `cat_review` exposes the same
77
+ pass to agents; it never writes the document.
78
+ - **Separate review route.** Settings can give AI review its own provider and
79
+ model instead of following the pre-translation route. The default still
80
+ inherits the MT route, so existing configurations keep working.
81
+
82
+ ### Changed
83
+
84
+ - Store schema v7 adds `segment.notes` and `segment.locked`; v6 data migrates in
85
+ place.
86
+ - The QA tab now separates mechanical checks (placeholders, numbers, terms,
87
+ length, residue) from model review suggestions.
88
+
89
+ ### Fixed
90
+
91
+ - Batch MT maps responses by stable segment id and rejects partial or renumbered
92
+ output instead of shifting later translations by one segment.
93
+
94
+ ## [1.1.5] - 2026-11-08
95
+
96
+ Project resources, delivery output, and TM upkeep: each document can bind its own
97
+ TM and glossary libraries, the workbench can price a job and hand off a bilingual
98
+ or XLIFF review package, and TM libraries can be merged, deduplicated, or pruned.
99
+
100
+ ### Added
101
+
102
+ - **Per-document resources.** A document can inherit the global mounts or bind its
103
+ own TM/glossary libraries and default write TM. Writes are checked against the
104
+ document scope (`NO_TM_BOUND`, `TM_NOT_MOUNTED`, `TM_NOT_BOUND`), and deleting a
105
+ library removes dangling document references.
106
+ - **Word count and leverage analysis.** `analyzeDocument` reports segments, words,
107
+ characters, translated/confirmed counts, duplicates, ICE/exact/fuzzy/new buckets,
108
+ match rate, and leverage. The workbench shows the breakdown and downloads it as
109
+ CSV or JSON.
110
+ - **Bilingual review DOCX.** Export a three-column Source/Target/Status table for
111
+ reviewers who do not use CAIT.
112
+ - **XLIFF 1.2 review packages.** Export carries the segment uid, target state, and
113
+ a note; re-import applies only segments matched by uid, XLIFF id, or a unique
114
+ source, refuses source mismatches, and reports unmatched entries.
115
+ - **TM maintenance.** Preview and confirm merge, deduplicate, and prune operations;
116
+ merges preserve the target library and optionally delete the source.
117
+
118
+ ### Changed
119
+
120
+ - Confirmations write to the document's default write TM when one is bound.
121
+ - TM lookup, glossary hits, QA term checks, and pre-translation all honor the
122
+ document's effective resource scope.
123
+
124
+ ## [1.1.4] - 2026-11-08
125
+
126
+ Brief and context: CAIT now carries a per-document translation brief and the
127
+ neighbouring source sentences into pre-translation and agent work, and lets a
128
+ reviewer undo a confirmation without losing the translation-memory record.
129
+
130
+ ### Added
131
+
132
+ - **Document brief.** Six optional fields — domain, audience, tone, notes,
133
+ do-not-translate terms, and a style sample — are stored with the document,
134
+ editable from the workbench, and injected into single and batch MT prompts.
135
+ Agents read and write it with `cat_get_brief` and `cat_set_brief`.
136
+ - **Context for agents.** `cat_get_context` returns the brief, the current
137
+ segment, its previous/next source segments, and paragraph information, so an
138
+ agent can resolve pronouns and omitted subjects before translating.
139
+ - **Context-aware batch pre-translation.** Pre-translation now sends up to eight
140
+ segments per request with the brief and neighbouring source sentences, then
141
+ falls back to one-segment calls for anything the model omits. A partial batch
142
+ no longer aborts the document.
143
+ - **Terminology status.** Glossary entries can be marked `forbidden` (never use
144
+ this rendering) or `preferred` (must use it when the source term appears).
145
+ The flags survive CSV/JSON/TBX export, CSV import, the glossary UI, and
146
+ `cat_add_terms`.
147
+ - **Risk-graded QA.** Findings are graded high / medium / low; forbidden terms
148
+ and length drift are new checks. The report returns `risks` and `riskCounts`,
149
+ and the rail can filter to segments that need attention.
150
+ - **QA panel and fixes.** A QA tab lists risk counts and findings with jump,
151
+ copy-source, clear-target, and insert-term actions. A concordance tab and
152
+ `cat_concordance` search every mounted TM for a word or phrase.
153
+ - **Undo confirmation.** `cat_unconfirm_segment` and the editor button revoke a
154
+ confirmation, keep the text as a draft, and leave TM untouched. Editing a
155
+ confirmed segment now revokes its confirmation automatically; confirming it
156
+ again updates the same TM entry.
157
+ - **Stable segment identity.** Every segment gets a `uid`; the store schema moves
158
+ to version 5 and migrates version 4 snapshots in place.
159
+ - **Bulk pre-translation cleanup.** The rail can clear every unconfirmed
160
+ pre-translated or auto-propagated target in the document after a confirmation
161
+ dialog that states the count and the MT/TM/auto breakdown. Confirmed segments,
162
+ manual drafts, and saved TM entries are left untouched.
163
+
164
+ ### Changed
165
+
166
+ - Pre-translation uses batched MT requests with per-segment fallback instead of
167
+ one request per segment.
168
+ - `getQaReport` also reports `risks` and `riskCounts`; `counts` includes
169
+ `TERM_FORBIDDEN` and `LENGTH_DRIFT`.
170
+ - `segmentView` includes `uid`; document summaries include `brief`; glossary CSV
171
+ exports use seven columns including `forbidden` and `preferred`.
172
+
173
+ ### Fixed
174
+
175
+ - Batch pre-translation now asks for stable segment ids and rejects ambiguous
176
+ positional output; a dropped, merged, or renumbered entry falls back to
177
+ one-segment calls instead of shifting later translations onto the wrong
178
+ segment.
179
+ - `cat_concordance` renders the previous/next context of a match instead of
180
+ assuming an array.
181
+ - TM and glossary toolbars now use the import/export icon in the direction the
182
+ button actually moves data; the document toolbar follows the same convention.
183
+ - The library toolbar has an explicit **default write** selector again, and the
184
+ scope checkboxes no longer silently choose which library receives new entries,
185
+ imports, exports, or clears.
186
+ - Unconfirming a segment that was just auto-unconfirmed by saving an edit is
187
+ treated as idempotent instead of showing a `NOT_CONFIRMED` error.
188
+
7
189
  ## [1.1.3] - 2026-11-07
8
190
 
9
191
  Alignment, repetition and terminology: CAIT can now build a translation memory
@@ -41,6 +223,10 @@ terminology with evidence instead of guessing.
41
223
  and never block confirming or exporting.
42
224
  - `proposeTranslation` writes only a `suggestion` plus its reason, never the
43
225
  target: an agent can propose, the user keeps the last word.
226
+ - The fuzzy-match threshold now defaults to **70%** instead of 55%: below that a
227
+ match usually shares only function words, so showing it costs review time and
228
+ saves none. Settings explains this and offers a **Reset** button that appears
229
+ only while the slider sits away from the default.
44
230
 
45
231
  ### Fixed
46
232
 
package/README.ja.md CHANGED
@@ -17,12 +17,12 @@
17
17
  <p align="center">
18
18
  <a href="https://www.npmjs.com/package/dsh-cait"><img alt="npm バージョン" src="https://img.shields.io/npm/v/dsh-cait.svg" /></a>
19
19
  <img alt="DSH 0.2.x" src="https://img.shields.io/badge/DSH-0.2.x-4d6bfe.svg" />
20
- <img alt="テスト 29 スイート" src="https://img.shields.io/badge/tests-29%20suites-brightgreen.svg" />
20
+ <img alt="テスト 45 スイート" src="https://img.shields.io/badge/tests-45%20suites-brightgreen.svg" />
21
21
  <img alt="API キー不要" src="https://img.shields.io/badge/API%20key-not%20required-6b7280.svg" />
22
22
  </p>
23
23
 
24
24
  CAIT は DSH Web UI と DSH デスクトップに CAT ワークベンチを追加します。左サイドバーの
25
- エントリから開き、ワークベンチと 15 のエージェントツールが 1 つのストアを共有するため、
25
+ エントリから開き、ワークベンチと 21 のエージェントツールが 1 つのストアを共有するため、
26
26
  ソースファイルのインポートから訳文のエクスポートまでを一通りこなせます。
27
27
 
28
28
  > **DSH `0.2.2-rc.1` で動作確認済み。** CAIT は DSH 自身のモデルルートと認証情報を
@@ -38,7 +38,7 @@ CAIT は DSH Web UI と DSH デスクトップに CAT ワークベンチを追
38
38
  | **用語を意識した編集** | 複数の用語集、ソース言語による絞り込み、インライン強調、用語のクリック挿入、用語ごとの大文字小文字の区別。 |
39
39
  | **文書ワークフロー** | タブ、閉じる / 開き直し、最近の文書の整理、同一内容の再インポート再利用、文書ごとの進捗。 |
40
40
  | **実用的な形式対応** | TXT、Markdown、DOCX、EPUB、TMX、CSV、SRT/VTT、PO、XLIFF 1.2/2.0/SDLXLIFF、HTML、JSON、XLSX、PPTX、RTF。 |
41
- | **エージェント対応** | 10 のツールが開いている文書とストアを共有するので、エージェントと並行して翻訳できます。 |
41
+ | **エージェント対応** | 21 のツールが開いている文書とストアを共有するので、エージェントと並行して翻訳できます。 |
42
42
 
43
43
  ## クイックスタート
44
44
 
@@ -56,6 +56,39 @@ Host のリビジョンをポーリングするため、エージェントによ
56
56
 
57
57
  ## 機能
58
58
 
59
+ ### 1.1.7 の新機能
60
+
61
+ - **DOCX の深い構造**:表、ヘッダー、フッター、脚注、文末脚注の段落を通常のセグメントとして取り込み、元の part に書き戻します。
62
+ - **ローカライズ文字列**:Apple `.strings`/`.stringsdict`、Android `strings.xml`/複数形、`.resx`、`.arb`、ネストした YAML、Java `.properties` を往復でき、キー、コメント、複数形、ブロックスカラー、インラインタグを保持します。
63
+ - **スピーカーノートと複数シート**:PPTX のノートページを独立したセグメントにし、XLSX はシート名、順序、セル参照を保ったまま全シートを扱います。元ファイルを保持している場合は元のセルへ書き戻すため、スタイルと結合範囲も残ります。
64
+ - **字幕タイムライン**:隣接 cue の結合、時刻指定の分割、全 cue のシフトに対応。重なりは高リスクの QA として報告し、時間は自動変更しません。
65
+
66
+ ### 1.1.6 の新機能
67
+
68
+ - **検索と置換**:原文/訳文のプレビュー、一括適用、直前の置換の取り消し。確定済みセグメントの訳文を変更すると校閲待ちに戻ります。
69
+ - **コマンドパレット**(`Ctrl/Cmd+K`)と `Ctrl/Cmd+F` の検索置換。
70
+ - **セグメントメモ**と、セグメント内の**ドラフト undo/redo**(`Ctrl/Cmd+Z`、`Ctrl/Cmd+Shift+Z`、`Ctrl/Cmd+Y`)。
71
+ - テキストセグメントの**マージ・分割・ロック**。マージ/分割は当面 TXT と Markdown のみで、Office の段落マッピングは安全に書き戻せません。
72
+ - **一度しか出ない固有名詞の用語発見**:引用符内の用語、文中の大文字名、中国語の人名/地名/造物名を候補に含め、種類・信頼度・原文の根拠を付けます。用語集への自動追加はしません。
73
+ - **AI 校閲**:QA タブから現在の DSH モデルに構造化された提案を求め、該当セグメントへ移動したり訳文へ反映したりできます。Agent は `cat_review` を呼べますが、どちらも文書を直接書き換えません。校閲は既定で翻訳モデルに従い、設定で専用のプロバイダーとモデルを指定できます。
74
+
75
+ ### 1.1.5 の新機能
76
+
77
+ - 文書ごとに**グローバルな TM/用語集のマウントを継承するか、独自のライブラリをバインド**でき、既定の書き込み TM も指定できます。検索、用語ヒット、QA、事前翻訳、確定はすべてそのスコープに従います。
78
+ - **語数とレバレッジ分析**:セグメント、語数、文字数、重複、ICE/完全/ファジー/新規の内訳、マッチ率、レバレッジを表示し、CSV/JSON でダウンロードできます。
79
+ - CAIT を使わない校閲者向けに**バイリンガル校閲 DOCX**(原文/訳文/状態)を出力します。
80
+ - **XLIFF 1.2 校閲パッケージ**を出力・再取り込みできます。uid、XLIFF id、一意な原文で照合し、原文不一致は拒否、未一致件数を報告します。
81
+ - **TM メンテナンス**:マージ、重複排除、整理をプレビューしてから確定します。
82
+
83
+ ### 1.1.4 の新機能
84
+
85
+ - 文書ごとに**翻訳ブリーフ**(領域、読者、トーン、メモ、訳禁用語、スタイル例)を持て、MT プロンプトに注入されます。Agent は `cat_get_brief` で読み取れます。
86
+ - 事前翻訳は**1 リクエスト最大 8 セグメント**のバッチになり、ブリーフと隣接原文を送ります。モデルが返さなかったセグメントは 1 件ずつフォールバックします。
87
+ - 用語集エントリに **forbidden**(使用禁止の訳)と **preferred**(必ず使う訳)を設定でき、CSV/JSON/TBX 出力と CSV 入力で保持されます。
88
+ - QA は **high / medium / low** に分類され、禁止用語と長さドリフトの検査が加わりました。QA タブからジャンプ、原文コピー、訳文クリア、必須用語の挿入ができます。Concordance はマウント中の全 TM を検索します。
89
+ - 確定済みセグメントを**確定解除**でき、訳文と TM エントリは残ります。確定済みセグメントを編集すると自動的に `translated` に戻り、再確定で同じ TM エントリを更新します。
90
+ - セグメントレールから**未確定の事前翻訳を一括クリア**できます。実行前に件数と MT/TM/自動伝播の内訳を示し、確定済み・手動下書き・保存済み TM は対象外であることを明示します。
91
+
59
92
  ### 翻訳メモリ
60
93
 
61
94
  - id、名前、マウント状態、既定の書き込みライブラリを持つ複数の TM ライブラリ。
@@ -67,7 +100,7 @@ Host のリビジョンをポーリングするため、エージェントによ
67
100
  - `near_exact` は数字・句読点・空白を無視したキーで比較し、スコアのしきい値には
68
101
  依存しません。
69
102
  - `high_fuzzy` は `>= 0.85`、`medium_fuzzy` は `0.75–0.85`、`low_fuzzy` は
70
- `0.75` 未満(設定可能な下限、既定値 `0.55` より上)です。
103
+ `0.75` 未満(設定可能な下限、既定値 `0.70` より上)です。
71
104
  - ファジースコアは字句ベースです。文字バイグラムの Dice 72% + トークンの Jaccard 28%。
72
105
  ラテン文字は単語単位、CJK は文字単位で扱います。ステミング、同義語、意味的マッチングは
73
106
  行いません。
@@ -202,7 +235,7 @@ CAIT はエンドポイントもキーも持ちません。セレクタは DSH
202
235
  | SDLXLIFF | ✅ | ✅ | XLIFF 1.2 の基本パス。SDL 固有の拡張はラウンドトリップしない |
203
236
  | HTML | ✅ | ✅ | テキストブロックとインラインタグを保持。文書全体の CSS / レイアウトは再構築しない |
204
237
  | JSON | ✅ | ✅ | 文字列パスのサブセット。オブジェクト / 配列構造はテンプレートで保持。キーと数値は翻訳しない |
205
- | XLSX | ✅ | ✅ | 最初のワークシート。`Source`/`Target` ヘッダーまたは A/B 列。エクスポートは 2 列の新しいワークブック |
238
+ | XLSX | ✅ | ✅ | 全ワークシート。ソース / ターゲット列またはヘッダーを認識。元ファイルを保持している場合はセルへ書き戻し、スタイル、結合範囲、他のシートも保持。数式セルはスキップ |
206
239
  | PPTX | ✅ | ✅* | ソース保持エクスポート。インポートした `.pptx` パッケージが必要。本文テキストのみで、ノート / グラフ / SmartArt はインポートしない |
207
240
  | RTF | ✅ | ✅ | 基本的な段落、`\uN`、`\'hh`、制御語。元のスタイルはラウンドトリップしない |
208
241
 
@@ -247,7 +280,7 @@ DSH デスクトップ(または `plugin_manager` ツールがある任意の
247
280
  plugin_manager install_bundle target: dsh-cait
248
281
  ```
249
282
 
250
- バージョンを固定するときは `dsh-cait@1.1.3`、最新版は `dsh-cait@latest` を指定します。
283
+ バージョンを固定するときは `dsh-cait@1.1.7`、最新版は `dsh-cait@latest` を指定します。
251
284
  マネージャが registry のパッケージを解決し、bundle patch を適用してプラグインを有効化します。
252
285
 
253
286
  CLI 管理のプロファイル:
@@ -349,6 +382,7 @@ dsh web --patch C:\absolute\path\to\dsh-CAIT\_dev\cait.patch.yml
349
382
  | `cat_consistency_report` | 訳文が揺れている同一原文をグループ化して一覧 |
350
383
  | `cat_term_candidates` | 用語候補の短いリスト: 頻度、例文、メモリにある既存の訳語 |
351
384
  | `cat_add_terms` | 選んだ用語を用語集へまとめて登録 |
385
+ | `cat_review` | モデルに構造化された校閲提案を求める。文書は書き換えない |
352
386
 
353
387
  そのためエージェントは UI を操作せずに文書全体を下書きできます: `cat_pre_translate` を
354
388
  `from: next` で `next` が `null` になるまで繰り返し、`cat_get_segments` で確認し、
@@ -364,7 +398,7 @@ dsh web --patch C:\absolute\path\to\dsh-CAIT\_dev\cait.patch.yml
364
398
  flowchart LR
365
399
  UI["DSH Web UI<br/>(sidebar + workbench)"] --> Client["client.js<br/>generated Web bundle"]
366
400
  Client --> API["/cait/api/rpc<br/>same-origin JSON"]
367
- Tools["15 agent tools"] --> Store["CatStore"]
401
+ Tools["21 agent tools"] --> Store["CatStore"]
368
402
  API --> Store
369
403
  Store --> Snapshot[("store.json<br/>+ sources/")]
370
404
  ```
@@ -451,7 +485,7 @@ node _dev/test-mt.mjs
451
485
 
452
486
  インポート / エクスポートのフィクスチャは `_dev/sample.docx`、`_dev/sample-table.docx`、
453
487
  `_dev/sample-format.docx` です。対応する `python _dev/make-*.py` スクリプトで再生成
454
- できます。29 スイートすべてが通るはずです。
488
+ できます。45 スイートすべてが通るはずです。
455
489
 
456
490
  ### リリース
457
491
 
@@ -497,12 +531,15 @@ npm publish
497
531
  画像 OCR も未対応です。
498
532
  - EPUB インポートは spine 内の本文 XHTML テキストブロックのみを対象とします。
499
533
  DRM、固定レイアウト、スクリプト化、MathML を多用する書籍は非対応です。
500
- - DOCX インポートは表、ヘッダー、脚注、フィールド、代替テキスト、変更履歴の削除を
501
- スキップします。DOCX エクスポートではそれらの領域はソース言語のまま残ります。
534
+ - DOCX インポートは本文、表、ヘッダー、フッター、脚注、文末脚注を対象にします。
535
+ フィールド、代替テキスト、変更履歴の削除はソース言語のまま残ります。
502
536
  - 複数の run が混在する DOCX/PPTX の段落は、先頭 run の書式を継承します。
503
- - PPTX インポートは本文テキストのみで、ノート、グラフ、SmartArt は対象外です。
504
- - XLSX のインポート / エクスポートは 2 列の表です。セルのスタイル、数式、結合セル、画像、
505
- 追加シートは保持されません。
537
+ - PPTX インポートは本文とスピーカーノートを対象にし、グラフと SmartArt は対象外です。
538
+ - XLSX エクスポートはターゲット列がある場合に書き戻します。数式セルはスキップされ、
539
+ 1.1.7 より前にインポートした文書は元ワークブックを保持していないため再構築になります。
540
+ - ネストした YAML は mapping、sequence、scalar、ブロックスカラー、コメントに対応します。
541
+ アンカー、エイリアス、merge key、flow コレクションは
542
+ `LOCALIZATION_YAML_UNSUPPORTED` で拒否します。
506
543
  - HTML/RTF のエクスポートは元のスタイルをラウンドトリップしません。JSON は文字列値だけを
507
544
  翻訳します。
508
545
  - TM のマッチングは意味ではなく字句に基づきます。ステミング、同義語、埋め込みはありません。
@@ -515,7 +552,7 @@ npm publish
515
552
  README も英語・簡体字中国語・日本語の 3 版があり、英語版が正本です。
516
553
 
517
554
  次に予定しているのは、マルチモーダルな DSH ルート経由の画像 / ビジョン入力、
518
- スタイルを保つ XLSX 出力、XLIFF の `<alt-trans>` / ノート対応です。
555
+ Office 段落マッピング後の結合 / 分割、字幕の波形 / 再生ヘッドです。
519
556
 
520
557
  ## 変更履歴とバージョン
521
558
 
package/README.md CHANGED
@@ -16,12 +16,12 @@
16
16
  <p align="center">
17
17
  <a href="https://www.npmjs.com/package/dsh-cait"><img alt="npm version" src="https://img.shields.io/npm/v/dsh-cait.svg" /></a>
18
18
  <img alt="DSH 0.2.x" src="https://img.shields.io/badge/DSH-0.2.x-4d6bfe.svg" />
19
- <img alt="Tests: 29 suites" src="https://img.shields.io/badge/tests-29%20suites-brightgreen.svg" />
19
+ <img alt="Tests: 45 suites" src="https://img.shields.io/badge/tests-45%20suites-brightgreen.svg" />
20
20
  <img alt="No API key required" src="https://img.shields.io/badge/API%20key-not%20required-6b7280.svg" />
21
21
  </p>
22
22
 
23
23
  CAIT adds a CAT workbench to the DSH Web UI and Desktop. It opens from a
24
- left-sidebar entry, keeps one shared store behind the workbench and seven agent
24
+ left-sidebar entry, keeps one shared store behind the workbench and twenty agent
25
25
  tools, and covers the practical path from importing a source file to exporting a
26
26
  translated document.
27
27
 
@@ -38,7 +38,7 @@ translated document.
38
38
  | **Glossary-aware editing** | Multiple term bases, source-language filtering, inline highlighting, click-to-insert terms, and per-term case sensitivity. |
39
39
  | **A document workflow** | Tabs, close/reopen, recent-document cleanup, duplicate-import reuse, and progress per document. |
40
40
  | **Real format coverage** | TXT, Markdown, DOCX, EPUB, TMX, CSV, SRT/VTT, PO, XLIFF 1.2/2.0/SDLXLIFF, HTML, JSON, XLSX, PPTX, and RTF. |
41
- | **Agent-ready** | Seven tools share the open document and store, so an agent can translate alongside you. |
41
+ | **Agent-ready** | Twenty-one tools share the open document and store, so an agent can translate alongside you. |
42
42
 
43
43
  ## Quick start
44
44
 
@@ -57,6 +57,74 @@ manual reload.
57
57
 
58
58
  ## Features
59
59
 
60
+ ### New in 1.1.7
61
+
62
+ - **DOCX depth.** Table cells, headers, footers, footnotes, and endnotes are
63
+ imported as normal segments and written back to their original parts.
64
+ - **Localization catalogs.** Apple `.strings`/`.stringsdict`, Android
65
+ `strings.xml`/plurals, `.resx`, `.arb`, nested YAML, and Java `.properties`
66
+ round-trip with keys, comments, plural variants, block scalars, and inline
67
+ tags intact.
68
+ - **Speaker notes and multi-sheet workbooks.** PowerPoint notes pages become
69
+ separate units; every XLSX worksheet keeps its own name, order, and cell
70
+ references. When the source workbook is retained, export patches the original
71
+ cells so styles and merged ranges survive.
72
+ - **Subtitle timeline.** Merge adjacent cues, split at a time point, and shift
73
+ all cues; overlapping cues show up as a high-risk QA finding.
74
+
75
+ ### New in 1.1.6
76
+
77
+ - **Find and replace** across source/target with a preview, one-step apply, and
78
+ undo; confirmed segments return to review when their target changes.
79
+ - **Command palette** (`Ctrl/Cmd+K`) and `Ctrl/Cmd+F` for find and replace.
80
+ - **Segment notes** for review comments, plus per-segment **draft undo/redo**.
81
+ - **Merge, split, and lock** text segments. Merge/split are limited to TXT and
82
+ Markdown until Office paragraph mapping can be written back safely.
83
+ - **Term discovery for one-off names.** Quoted terms, capitalized names, and
84
+ Chinese proper names that occur once are offered as candidates with evidence,
85
+ type, and confidence; nothing is added to the glossary automatically.
86
+ - **AI review.** The QA tab can ask the configured DSH route for structured
87
+ suggestions, jump to a segment, and fill a suggestion into the draft. Agents can
88
+ call `cat_review`; neither path writes the document. Review follows the
89
+ translation model by default, and Settings can give it a separate provider and
90
+ model.
91
+
92
+ ### New in 1.1.5
93
+
94
+ - Each document can **inherit the global TM/glossary mounts or bind its own
95
+ libraries**, with a default write TM per document. Lookup, glossary hits, QA,
96
+ pre-translation, and confirmations all honor that scope.
97
+ - **Word count and leverage analysis** reports segments, words, characters,
98
+ duplicates, ICE/exact/fuzzy/new buckets, match rate, and leverage, with CSV and
99
+ JSON download.
100
+ - Export a **bilingual review DOCX** (Source/Target/Status) for reviewers who do
101
+ not use CAIT.
102
+ - Export and re-import an **XLIFF 1.2 review package**. Re-import matches by uid,
103
+ XLIFF id, or a unique source, refuses source mismatches, and reports unmatched
104
+ segments.
105
+ - **TM maintenance** previews and confirms merge, deduplicate, and prune actions.
106
+
107
+ ### New in 1.1.4
108
+
109
+ - Each document can carry a **translation brief** — domain, audience, tone,
110
+ notes, do-not-translate terms, and a style sample — which is injected into MT
111
+ prompts and readable by agents through `cat_get_brief`.
112
+ - Pre-translation now sends **up to eight segments per request** with the brief
113
+ and neighbouring source sentences, then falls back to one segment at a time
114
+ for anything the model leaves out.
115
+ - Glossary entries can be **forbidden** (never use this rendering) or
116
+ **preferred** (must use it when the source term appears), and the flags survive
117
+ CSV/JSON/TBX export and CSV import.
118
+ - QA findings are graded **high / medium / low**, and the QA tab can jump to a
119
+ finding, copy the source, clear the target, or insert the required term. A
120
+ concordance tab searches every mounted TM for a word or phrase.
121
+ - A confirmed segment can be **unconfirmed** without deleting its text or its TM
122
+ entry; editing a confirmed segment revokes the confirmation automatically.
123
+ - The segment rail can **clear all unconfirmed pre-translated targets** in one
124
+ action. A confirmation dialog states the count and the MT/TM/auto breakdown,
125
+ and confirms that confirmed segments, manual drafts, and saved TM entries are
126
+ left untouched.
127
+
60
128
  ### Translation memory
61
129
 
62
130
  - Multiple TM libraries with id, name, mount state, and a default write library.
@@ -68,7 +136,7 @@ manual reload.
68
136
  - `near_exact` compares a key that ignores digits, punctuation, and whitespace;
69
137
  it does not depend on a score cutoff.
70
138
  - `high_fuzzy` is `>= 0.85`, `medium_fuzzy` is `0.75–0.85`, `low_fuzzy` is
71
- below `0.75` (above the configurable floor, default `0.55`).
139
+ below `0.75` (above the configurable floor, default `0.70`).
72
140
  - Fuzzy scoring is lexical: 72% character-bigram Dice + 28% token Jaccard.
73
141
  Latin text uses words; CJK text uses individual characters. There is no
74
142
  stemming, synonym, or semantic matching.
@@ -92,9 +160,10 @@ manual reload.
92
160
  only decides what the workbench searches and writes.
93
161
  - **Terminology mining**: *Mine terms from the document* in the glossary toolbar
94
162
  lists candidates with occurrence counts, sample wording from memory, and a
95
- marker when the term is already known. Counting finds the candidates and ranks
96
- them (Latin n-grams, repeated CJK substrings filtered by boundary entropy);
97
- a model only judges a shortlist, which is the part models are good at.
163
+ marker when the term is already known. Counting finds and ranks the candidates
164
+ (Latin n-grams, repeated CJK substrings filtered by boundary entropy); you
165
+ confirm the wording and add them. A model-assisted shortlist that can include
166
+ single-occurrence proper nouns is included since 1.1.6.
98
167
 
99
168
  ### Library workspace
100
169
 
@@ -136,8 +205,13 @@ separate files in any supported format and any pair of languages.
136
205
  size of 20/50/100/200 and a box to jump straight to a segment number. Jumping
137
206
  clears the filter when the target segment would otherwise be hidden.
138
207
  - **Pre-translate** fills the whole document from exact TM matches and machine
139
- translation in small blocks, shows `done/total`, and can be stopped between
140
- blocks. Confirmed and already-translated segments are never overwritten.
208
+ translation in batches of up to eight segments, carrying the document brief
209
+ and neighbouring source sentences, and falls back to one segment at a time
210
+ when a batch response is partial. It shows `done/total` and can be stopped
211
+ between blocks. Confirmed and already-translated segments are never overwritten.
212
+ - **Translation brief** lives beside the document: domain, audience, tone, notes,
213
+ do-not-translate terms, and a style sample. It is editable from the segment
214
+ header and used by both pre-translation and agent translation.
141
215
  - **Stacked review**: source, the machine/agent baseline, and the editable target
142
216
  are laid out top to bottom, so each block gets the full pane width.
143
217
  **Confirm all** accepts every segment awaiting review after one confirmation
@@ -149,10 +223,16 @@ separate files in any supported format and any pair of languages.
149
223
  unconfirmed copy with the same source (`origin: auto`), editing a draft keeps
150
224
  them in sync, and *Fill repeated segments* does the whole document at once.
151
225
  Confirmed segments are never touched.
152
- - Advisory QA markers in the rail and an export-time summary: missing
153
- placeholders/tags, mismatched numbers, unused glossary terms, empty targets,
154
- an untouched copy of the source, and one source with several translations.
226
+ - Advisory QA markers in the rail and an export-time summary, graded **high /
227
+ medium / low**: missing placeholders/tags, mismatched numbers, unused or
228
+ forbidden glossary terms, empty targets, an untouched copy of the source,
229
+ length drift, and one source with several translations. The QA tab lists
230
+ findings and offers jump, copy-source, clear-target, and insert-term actions.
155
231
  Nothing is blocked and nothing is stored.
232
+ - **Undo confirmation.** A confirmed segment can be unconfirmed back to
233
+ `translated`; its text and TM entry stay in place. Editing a confirmed segment
234
+ revokes the confirmation automatically, and confirming it again updates the
235
+ same TM entry.
156
236
  - Document tabs; closing a tab does not delete the document.
157
237
  - **Open existing document** reopens a closed document.
158
238
  - Interface language switch in **Settings → Interface**: *Follow DSH language*
@@ -194,7 +274,10 @@ CAIT does not own an endpoint or key. The selector is built from DSH:
194
274
  - `ctx.llm.listModels(provider)` supplies model ids; CAIT selects the first model
195
275
  by default.
196
276
  - `ctx.llm.stream({ provider, model, messages, temperature, purpose: 'cait-mt' })`
197
- performs the call; CAIT concatenates `text-delta` chunks.
277
+ performs the call; CAIT concatenates `text-delta` chunks. Batch pre-translation
278
+ uses `purpose: 'cait-mt-batch'` and asks for a JSON array keyed by position;
279
+ both paths include the document brief, the neighbouring source sentences, and
280
+ the usable/forbidden glossary rules in the prompt.
198
281
 
199
282
  If no usable route exists, the selected route disappears, or it has no models,
200
283
  CAIT falls back to offline glossary substitution and says so in the UI and in the
@@ -217,8 +300,8 @@ provider/model/code/status; the client receives only `MT_PROVIDER_FAILED`.
217
300
  | SDLXLIFF | ✅ | ✅ | Basic XLIFF 1.2 path; SDL-specific extensions are not round-tripped |
218
301
  | HTML | ✅ | ✅ | Text blocks and inline tags preserved; document CSS/layout is not rebuilt |
219
302
  | JSON | ✅ | ✅ | String-path subset; object/array structure preserved via a template; keys and numbers are not translated |
220
- | XLSX | ✅ | ✅ | First worksheet; `Source`/`Target` headers or columns A/B; export is a new two-column workbook |
221
- | PPTX | ✅ | ✅* | Source-preserving export; requires the imported `.pptx` package. Body text only; notes/charts/SmartArt not imported. |
303
+ | XLSX | ✅ | ✅ | All worksheets; source/target columns (or headers); source-preserving patch keeps styles, merges, and other sheets; formulas are skipped |
304
+ | PPTX | ✅ | ✅ | Source-preserving export; requires the imported `.pptx` package. Body text and speaker notes; charts/SmartArt not imported. |
222
305
  | RTF | ✅ | ✅ | Basic paragraphs, `\uN`, `\'hh`, control words; original styling not round-tripped |
223
306
 
224
307
  \* PPTX export fails with `PPTX_SOURCE_REQUIRED` when the retained source package
@@ -263,7 +346,7 @@ In DSH Desktop (or any profile with the `plugin_manager` tool):
263
346
  plugin_manager install_bundle target: dsh-cait
264
347
  ```
265
348
 
266
- Pin a release with `dsh-cait@1.1.3`, or ask for the newest one with
349
+ Pin a release with `dsh-cait@1.1.7`, or ask for the newest one with
267
350
  `dsh-cait@latest`. The manager resolves the registry package, applies the bundle
268
351
  patch, and activates the plugin — no hand-written profile rows.
269
352
 
@@ -365,8 +448,14 @@ confirmed becomes `translated` with `origin: manual`.
365
448
  | `cat_propose_translation` | Leave a suggestion plus a reason without touching the confirmed target |
366
449
  | `cat_align` | Align two texts and report high / to-review / doubtful pairs |
367
450
  | `cat_consistency_report` | Group repeated sources that carry different translations |
368
- | `cat_term_candidates` | Mining shortlist: frequency, sample sentences, existing memory wording |
451
+ | `cat_term_candidates` | Mining shortlist, including one-off proper names, with type/confidence and evidence |
452
+ | `cat_get_brief` | Read the document brief before translating |
453
+ | `cat_set_brief` | Update brief fields, or clear the whole brief |
454
+ | `cat_get_context` | Brief, current segment, previous/next sources, and paragraph around a segment |
455
+ | `cat_unconfirm_segment` | Revoke a confirmation without deleting the text or TM entry |
456
+ | `cat_concordance` | Search every mounted TM for a word or phrase in source or target |
369
457
  | `cat_add_terms` | Add accepted terminology to a library in one batch |
458
+ | `cat_review` | Ask the model for structured review suggestions; never writes the document |
370
459
 
371
460
  An agent can therefore draft a whole document without clicking in the UI:
372
461
  `cat_pre_translate` with `from: next` until `next` is `null`, then
@@ -383,7 +472,7 @@ document the user has open.
383
472
  flowchart LR
384
473
  UI["DSH Web UI<br/>(sidebar + workbench)"] --> Client["client.js<br/>generated Web bundle"]
385
474
  Client --> API["/cait/api/rpc<br/>same-origin JSON"]
386
- Tools["15 agent tools"] --> Store["CatStore"]
475
+ Tools["21 agent tools"] --> Store["CatStore"]
387
476
  API --> Store
388
477
  Store --> Snapshot[("store.json<br/>+ sources/")]
389
478
  ```
@@ -477,13 +566,18 @@ node _dev/test-qa.mjs
477
566
  node _dev/test-library-crud.mjs
478
567
  node _dev/test-library-view.mjs
479
568
  node _dev/test-pagination.mjs
569
+ node _dev/test-replace.mjs
570
+ node _dev/test-notes.mjs
571
+ node _dev/test-lock.mjs
572
+ node _dev/test-segment-edit.mjs
573
+ node _dev/test-review.mjs
480
574
  node _dev/test-theme-tokens.mjs
481
575
  node _dev/test-e2e-1.1.mjs
482
576
  ```
483
577
 
484
578
  The import/export fixtures are `_dev/sample.docx`, `_dev/sample-table.docx`, and
485
579
  `_dev/sample-format.docx`; regenerate them with the matching
486
- `python _dev/make-*.py` scripts. All 29 suites should pass.
580
+ `python _dev/make-*.py` scripts. All 36 suites should pass.
487
581
 
488
582
  ### Releasing
489
583
 
@@ -531,27 +625,35 @@ GitHub with a release.
531
625
  [PDF is not supported](#pdf-is-not-supported)). No image OCR yet.
532
626
  - EPUB import follows the spine and body XHTML text blocks; DRM-protected,
533
627
  fixed-layout, scripted, and MathML-heavy books are not supported.
534
- - DOCX import skips tables, headers, footnotes, fields, alt text, and tracked
535
- deletions. DOCX export leaves those regions in the source language.
628
+ - DOCX import covers body, tables, headers, footers, footnotes, and endnotes;
629
+ fields, alt text, and tracked deletions still stay in the source language.
536
630
  - Mixed-run DOCX/PPTX paragraphs inherit the first run's formatting.
537
- - PPTX import covers body text, not notes, charts, or SmartArt.
538
- - XLSX import/export is a two-column table; cell styles, formulas, merged cells,
539
- images, and extra sheets are not preserved.
631
+ - PPTX import covers body text and speaker notes, not charts or SmartArt.
632
+ - XLSX export needs a target column to patch; formula cells are skipped, and a
633
+ workbook imported before 1.1.7 has no retained source to patch.
634
+ - Nested YAML supports mappings, sequences, scalars, block scalars, and
635
+ comments; anchors, aliases, merge keys, and flow collections are rejected
636
+ with `LOCALIZATION_YAML_UNSUPPORTED`.
540
637
  - HTML/RTF export does not round-trip original styling; JSON translates string
541
638
  values only.
542
639
  - TM matching is lexical, not semantic; no stemming, synonyms, or embeddings.
543
640
  - One translation per source text per context: a repeated sentence keeps a
544
641
  separate variant for each surrounding pair, capped at 8 variants per key, and
545
642
  reuses the generic entry when the neighbours differ.
546
- - Context is the two neighbouring source sentences only; document, customer, or
547
- project metadata is not part of the match.
643
+ - TM context is the two neighbouring source sentences only; the document brief
644
+ and project metadata are used by MT prompts but are not part of TM scoring.
548
645
  - TBX and JSON glossary exports are one-way; only TMX and CSV import back.
549
646
  - The workbench UI ships in Chinese, English, and Japanese, switchable in
550
647
  Settings; this README ships in English, Simplified Chinese, and Japanese, and
551
648
  the English version is the source of truth.
552
649
 
553
- Planned next: image/vision input through a multimodal DSH route,
554
- style-preserving XLSX output, and XLIFF `<alt-trans>` / notes support.
650
+ Shipped since 1.1.5: per-document TM/glossary binding, word-count and leverage
651
+ analysis, bilingual DOCX review output, and an XLIFF review package. 1.1.6 added
652
+ find/replace, segment merge/split/lock, comments, local undo, and an optional LLM
653
+ review pass. 1.1.7 added DOCX tables/headers/footnotes, nested localization
654
+ catalogs, source-preserving multi-sheet XLSX, speaker notes, and subtitle
655
+ timeline controls. Next candidates: Office paragraph mapping for merge/split
656
+ and a subtitle waveform.
555
657
 
556
658
  ## Changelog and versioning
557
659
 
@@ -564,8 +666,13 @@ and the PDF policy, `v1.1.0` adds agent-driven pre-translation, the
564
666
  three-state segment model, stacked review, and advisory QA, `v1.1.1` adds
565
667
  the library workspace with TMX/TBX/CSV/JSON export, segment paging, and the
566
668
  panel-to-library jump, `v1.1.2` adds context-aware memory with 101% (ICE)
567
- matches, and `v1.1.3` adds two-file alignment, automatic propagation of
568
- repeated segments, terminology mining, and the proposal primitive agents use.
669
+ matches, `v1.1.3` adds two-file alignment, automatic propagation of repeated
670
+ segments, terminology mining, and the proposal primitive agents use, and
671
+ `v1.1.4` adds the document brief, context-aware batch pre-translation,
672
+ forbidden/preferred terminology, risk-graded QA with one-click fixes,
673
+ concordance, and undo confirmation, and `v1.1.5` adds per-document TM/glossary
674
+ scopes, word-count and leverage analysis, bilingual DOCX and XLIFF review
675
+ packages, and TM maintenance.
569
676
  The project
570
677
  was developed as `0.1.0` and renumbered for the GitHub release.
571
678