cueline 0.2.0 → 0.2.2
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/.claude-plugin/plugin.json +1 -1
- package/.codex-plugin/plugin.json +1 -1
- package/CHANGELOG.md +56 -0
- package/README.ja.md +18 -9
- package/README.ko.md +18 -9
- package/README.md +16 -9
- package/README.zh-CN.md +18 -9
- package/README.zh-TW.md +18 -9
- package/dist/src/api-contracts.d.ts +2 -0
- package/dist/src/api-controller-handoff.js +1 -1
- package/dist/src/api-controller-handoff.js.map +1 -1
- package/dist/src/api-runtime-lifecycle.js +4 -4
- package/dist/src/api-runtime-lifecycle.js.map +1 -1
- package/dist/src/api.js +9 -0
- package/dist/src/api.js.map +1 -1
- package/dist/src/browser/codex-iab/chatgpt-client.js +6 -2
- package/dist/src/browser/codex-iab/chatgpt-client.js.map +1 -1
- package/dist/src/core/controller-command-execution.d.ts +1 -1
- package/dist/src/core/controller-command-execution.js +7 -7
- package/dist/src/core/controller-command-execution.js.map +1 -1
- package/dist/src/core/controller-evidence.d.ts +10 -0
- package/dist/src/core/controller-evidence.js +41 -0
- package/dist/src/core/controller-evidence.js.map +1 -0
- package/dist/src/core/controller-loop.d.ts +2 -1
- package/dist/src/core/controller-loop.js +65 -10
- package/dist/src/core/controller-loop.js.map +1 -1
- package/dist/src/core/controller-turn.d.ts +3 -1
- package/dist/src/core/controller-turn.js +34 -4
- package/dist/src/core/controller-turn.js.map +1 -1
- package/dist/src/core/controller-types.d.ts +2 -0
- package/dist/src/core/state-machine.d.ts +4 -1
- package/dist/src/core/state-machine.js +28 -1
- package/dist/src/core/state-machine.js.map +1 -1
- package/dist/src/protocol/types.d.ts +4 -0
- package/dist/src/version.d.ts +1 -1
- package/dist/src/version.js +1 -1
- package/docs/runner-contract.md +3 -0
- package/package.json +1 -1
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "cueline",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.2",
|
|
4
4
|
"description": "Use a ChatGPT web conversation as the text controller for durable local advice or explicitly claimed work executed by the current Codex.",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "CueLine contributors"
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "cueline",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.2",
|
|
4
4
|
"description": "Use a ChatGPT web conversation as the text controller for durable local advice or explicitly claimed work executed by the current Codex.",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "CueLine contributors"
|
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,61 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 0.2.2 - 2026-07-17
|
|
4
|
+
|
|
5
|
+
### Fixed
|
|
6
|
+
|
|
7
|
+
- Apply each run's persisted `maxJobEvidenceChars` to terminal evidence written
|
|
8
|
+
by process execution, caller result submission, and runtime reconciliation,
|
|
9
|
+
keeping event-log and served evidence on the same durable cap.
|
|
10
|
+
- Preserve a validated canonical evidence-cap marker when replay falls back to
|
|
11
|
+
run events, so the served bytes and `content_hash` remain stable without
|
|
12
|
+
nesting markers. Legacy `...[truncated N chars]` events remain replayable and
|
|
13
|
+
may be deterministically re-capped.
|
|
14
|
+
- Base controller capacity warnings on servable capped-representation lengths.
|
|
15
|
+
Report true source totals beyond durable per-job caps in a separate notice,
|
|
16
|
+
since those discarded characters cannot be retrieved by evidence cursors.
|
|
17
|
+
|
|
18
|
+
### Verification
|
|
19
|
+
|
|
20
|
+
- Verified TypeScript typecheck, build, 490/490 unit/integration/smoke tests,
|
|
21
|
+
and diff whitespace checks.
|
|
22
|
+
- Verified the built public API with a real process runner: a 7,000-character
|
|
23
|
+
result wrote one 4,000-cap event marker with the true total and completed in
|
|
24
|
+
two controller turns.
|
|
25
|
+
|
|
26
|
+
## 0.2.1 - 2026-07-17
|
|
27
|
+
|
|
28
|
+
### Fixed
|
|
29
|
+
|
|
30
|
+
- Treat a manually confirmed retry request as authoritative for its newly
|
|
31
|
+
observed user message. The abandoned-message late-arrival guard still freezes
|
|
32
|
+
unconfirmed retries, but no longer misclassifies the operator-confirmed retry
|
|
33
|
+
itself as the abandoned request appearing late.
|
|
34
|
+
- Accept an already-completed manually confirmed Pro response when its exact
|
|
35
|
+
protocol, run, round, and request envelope matches even if the recorded
|
|
36
|
+
assistant-message baseline already includes that fast response. Non-exact
|
|
37
|
+
responses remain behind the assistant-count freshness gate.
|
|
38
|
+
- Add a durable, configurable per-job controller-evidence cap. Full runner
|
|
39
|
+
status remains local, while controller observations receive a deterministic
|
|
40
|
+
capped representation with an explicit marker and the true source length;
|
|
41
|
+
hashes and inspect offsets remain fenced to that representation.
|
|
42
|
+
- Warn when total unserved evidence exceeds the remaining-round delivery
|
|
43
|
+
capacity, and tell the controller it may decide from sufficient evidence or
|
|
44
|
+
request focused summarization instead of paging every omitted tail.
|
|
45
|
+
|
|
46
|
+
### Verification
|
|
47
|
+
|
|
48
|
+
- Verified 488/488 tests, TypeScript typecheck, plugin validation, and diff
|
|
49
|
+
whitespace checks.
|
|
50
|
+
- Verified the public API with the real process runner: two 75,762-character
|
|
51
|
+
advise outputs were each projected through a 4,000-character cap, retained
|
|
52
|
+
their true totals, emitted the remaining-capacity warning, completed, and
|
|
53
|
+
produced a verified run.
|
|
54
|
+
- Verified the real built-in Browser recovery path on the original CueLine run:
|
|
55
|
+
round 3 request `msg_f40d51990236834c1add1c5b6e7c5580` and round 4 request
|
|
56
|
+
`msg_d859cbe692ae7c70b5b9dc402ca6de49` were each accepted exactly once,
|
|
57
|
+
with no duplicate resend, job, or event.
|
|
58
|
+
|
|
3
59
|
## 0.2.0 - 2026-07-16
|
|
4
60
|
|
|
5
61
|
### Added
|
package/README.ja.md
CHANGED
|
@@ -20,17 +20,17 @@
|
|
|
20
20
|
|
|
21
21
|
<img alt="CueLine のアーキテクチャ:ChatGPT ウェブ会話が 1 ラウンドに 1 つのテキストコマンドを出し、CueLine が検証・記録し、現在の Codex が許可されたローカル作業を実行する。" src="docs/assets/cueline-architecture-ja.svg" width="100%">
|
|
22
22
|
|
|
23
|
-
CueLine は独立した実装で、**ランタイムの npm 依存はゼロ**です。Omnilane
|
|
23
|
+
CueLine は独立した実装で、**ランタイムの npm 依存はゼロ**です。Omnilane のラッパーではありません。
|
|
24
24
|
|
|
25
|
-
## 最新リリース:0.2.
|
|
25
|
+
## 最新リリース:0.2.2
|
|
26
26
|
|
|
27
|
-
-
|
|
28
|
-
-
|
|
29
|
-
-
|
|
30
|
-
-
|
|
31
|
-
-
|
|
27
|
+
- 設定可能で永続的な job 単位のコントローラー証拠上限を追加し(0.2.1)、記録されるすべての job イベントにも適用しました。イベントログとコントローラーへ提供される証拠は常に同じ上限を共有します。
|
|
28
|
+
- 実 run で観測された証拠枯渇デッドロックを修正しました。過大なワーカー出力がコントローラーをラウンド上限内に終わらない inspect ページングループへ追い込むことはもうありません。
|
|
29
|
+
- 容量警告はコントローラーが実際にページングできる証拠だけを数えます。永続上限を超える真の総量は独立した決定的な通知で開示され、証拠が十分ならコントローラーは早期に判断できます。
|
|
30
|
+
- リプレイされた証拠はバイト単位で安定します。検証済みの正規上限マーカーはそのまま保持され、旧形式の切り詰めマーカーは整合性エラーなしに決定的へ再適用されます。
|
|
31
|
+
- 490/490 テストに加え、実 process runner で検証しました。真の総量を持つ上限イベントマーカーを 1 つ書き込み、コントローラー 2 ターンで完了しました。
|
|
32
32
|
|
|
33
|
-
詳細は [changelog](CHANGELOG.md#
|
|
33
|
+
詳細は [changelog](CHANGELOG.md#022---2026-07-17) またはバージョン指定の [v0.2.2 release](https://github.com/Seraphim0916/cueline/releases/tag/v0.2.2) を参照してください。
|
|
34
34
|
|
|
35
35
|
## 1 回の実行は実際にどう進むか
|
|
36
36
|
|
|
@@ -168,6 +168,8 @@ if (result.status === "complete") {
|
|
|
168
168
|
|
|
169
169
|
`verifyCueLineRun(runId)` は作成 marker、イベント replay と authority fence、任意の snapshot、runtime lease、job status 証拠を対象とする読み取り専用の整合性検査です。永続 run の内容は返さず、安定した finding だけを返します。
|
|
170
170
|
|
|
171
|
+
`confirmManualControllerSubmission(runId, …)` と `confirmControllerTurnNotSent(runId, …)` は、2 種類の reconcile 確認のプログラム用インターフェースです。どちらも追記のみで冪等であり、ブラウザーを駆動することも、何かを再送することもありません。
|
|
172
|
+
|
|
171
173
|
Codex のランタイムでは、`cueline api path` が出力する絶対パスのモジュールを import します。それがインストールしたパッケージのビルド済み API です。
|
|
172
174
|
|
|
173
175
|
`startCueLineRun` は永続 run を作成して `ready` を返すだけです。`runCueLine` は作成後、永続 controller 観測待ち、caller 引き渡し、または終端まで進めます。owner 不在の `controller_response_pending` で通常送信済みターンが一つだけあり、`safeNextAction: observe` が示される場合、同じ Pro 応答を読み取り専用で観測する待機です。少し待って続行し、再送しません。`safeNextAction: reconcile` は曖昧、手動送信、または複数の保留ターンに使います。owner 不在の `caller_jobs_pending` は正常なローカル引き渡しであり、orphan や ChatGPT 待ちではありません。CLI の `run status` は引き渡しに必要な metadata だけを出力し、task 本文、caller identity、task hash、workdir、runtime owner ID を含めません。正式な claim 後にだけ、API が正確な task と workdir を認可された caller に返します。
|
|
@@ -178,7 +180,7 @@ CLI はブラウザーを駆動しません。状態を書き込むコマンド
|
|
|
178
180
|
|
|
179
181
|
| グループ | コマンド | 効果 |
|
|
180
182
|
| --- | --- | --- |
|
|
181
|
-
| 参照 | `doctor` · `routing` · `jobs` · `runs` · `run status` · `run doctor` · `run watch` · `run timeline` · `run verify` · `run handoff` · `protocol lint` · `api path` · `config path` | 読み取り専用 |
|
|
183
|
+
| 参照 | `doctor` · `routing` · `routing explain` · `jobs` · `runs` · `run status` · `run status-at` · `run diff` · `run doctor` · `run watch` · `run timeline` · `run graph` · `run verify` · `run handoff` · `protocol lint` · `api path` · `config path` | 読み取り専用 |
|
|
182
184
|
| インストール | `install` · `uninstall` | パッケージ所有のスキルリンクだけを作成・削除 |
|
|
183
185
|
| 復旧 | `run reconcile` · `run takeover` · `run reconcile-runtime` · `run cancel` / `run stop` · `job cancel` | 監査証拠の追記、または永続 run/job 状態の変更 |
|
|
184
186
|
|
|
@@ -211,6 +213,8 @@ run_... requested affected_jobs=0
|
|
|
211
213
|
|
|
212
214
|
Node が古すぎる場合、または有効な caller レーンが一つもない場合、`cueline doctor` は非ゼロで終了します。`process_available_lanes` が 0 でも caller モードは劣化しません。process executor を明示的に選ぶ前だけ `cueline routing` で process の可用性を確認してください。`cueline api path` が出すのはスキルが import するモジュールなので、パッケージ導入ならリポジトリの取得は不要です。`cueline help` は `--json` と手動 reconcile の必須確認フラグを含む各コマンドの正確な構文を一覧します。
|
|
213
215
|
|
|
216
|
+
0.2.0 で追加された 4 つの可観測性コマンドは、すべて厳密に読み取り専用です。`run status-at` は単一の正確なイベント連番の時点にサニタイズ済み run 状態を再構築します——「その瞬間に CueLine が知っていたこと」です。`run diff` は 2 つのサニタイズ済み run サマリーをフィールド単位で比較し、生のプロンプトや出力は決して含めません。`run graph` はサニタイズ済み timeline エントリから有界の Mermaid 制御フロー図を描画します。`routing explain` はプロセス起動前に、レーン選択・可用性・却下理由を runner の引数を漏らさずに説明します([multi-model routing](docs/multi-model-routing.md) を参照)。
|
|
217
|
+
|
|
214
218
|
実験的な診断コマンドには、それぞれ専用のドキュメントがあります:
|
|
215
219
|
|
|
216
220
|
| コマンド | 役割 | ドキュメント |
|
|
@@ -229,6 +233,8 @@ Node が古すぎる場合、または有効な caller レーンが一つもな
|
|
|
229
233
|
|
|
230
234
|
Caller はプロセスを起動しません。`executor: "process"` と `allowProcessExecution: true` を同時に指定した場合だけ、`default` レーンの `codex-default` が隔離された `codex exec --ignore-user-config` を実行します。独立した `advise` の既定同時実行数は全体/レーンごとに 2、`work` を含むバッチは直列です。別の process worker を登録するには、[`config/routing.default.json`](config/routing.default.json) をコピーして候補を追加し、`CUELINE_CONFIG` をそこへ向けます。
|
|
231
235
|
|
|
236
|
+
モデル別の複数候補の登録方法と advise 専用ラッパーの例は、[multi-model routing](docs/multi-model-routing.md) を参照してください。
|
|
237
|
+
|
|
232
238
|
状態は `CUELINE_HOME` の下に置かれます:
|
|
233
239
|
|
|
234
240
|
```text
|
|
@@ -245,6 +251,8 @@ jobs/<job-id>.json ジョブごとの実行証拠
|
|
|
245
251
|
|
|
246
252
|
復帰は完全に同じ会話 URL にだけ接続します。ChatGPT が長文を添付に自動変換した場合は `attachment_ready` として認識し、送信クリックは最大 1 回です。曖昧なクリックは `possibly_sent` となり再送しません。実際に見えて有効かつ操作可能な Stop コントロールがあるあいだだけ、応答は進行中とみなされます。隠れた残存ボタンが完了済みの Pro 応答を抑え込むことはありません。手動送信後は `cueline run reconcile RUN_ID --request-id REQUEST_ID --manual-send-confirmed` で正式に確認し、同一 conversation、Pro 証拠、protocol/run/round/request identity をすべて検証します。
|
|
247
253
|
|
|
254
|
+
逆方向の確認は「クリックが確実に届かなかった」場合のためのものです。操作者がその正確な会話を直接確認し、メッセージが存在しないことを確かめたうえで、`cueline run reconcile ... --not-sent-confirmed --conversation-url URL` を実行すると、旧 request identity を追記のみで放棄し、新しい決定的 request ID によるちょうど 1 回の同一プロンプト再試行を承認します。2 つのフラグは相互排他です。放棄したメッセージまたはその応答が後から現れた場合、CueLine は run を凍結して人手のレビューに回し、受理も再送も決して行いません。
|
|
255
|
+
|
|
248
256
|
Pro が回答しているあいだは、決して中断せず、`Answer now`、`Respond now`、`Stop` などの加速コントロールも使わないでください。Pro にはローカルツールがなく、リポジトリ構成やローカルパスの既定知識もありません。Caller の証拠には正確なコード/エラー識別子、関連コードの抜粋、絶対ローカルパスを含め、さらにローカル証拠が必要か Pro に明示的に尋ねてください。
|
|
249
257
|
|
|
250
258
|
コントローラー証拠は成功時の非空 stdout を優先し、全体 12,000 文字に制限します。完全な stdout/stderr はローカルに保持します。Pro が `inspect(job_ids)` を受理した場合、次のターンでは指定 job の証拠予算を先に確保してから無関係な証拠を扱います。
|
|
@@ -276,6 +284,7 @@ npm pack --dry-run
|
|
|
276
284
|
| [controller protocol](docs/controller-protocol.md) | `<CueLineControl>` エンベロープ、5 つの動作、修正ルール |
|
|
277
285
|
| [runner contract](docs/runner-contract.md) | 登録済み process worker がすべきこと・してはならないこと |
|
|
278
286
|
| [state and recovery](docs/state-and-recovery.md) | 永続状態のレイアウト、ownership、すべての復旧経路 |
|
|
287
|
+
| [multi-model routing](docs/multi-model-routing.md) | 追加の process worker の登録方法と、コントローラーが実際に見えるもの |
|
|
279
288
|
| [compatibility](docs/compatibility.md) | 対応プラットフォーム、ランタイム、UI 前提 |
|
|
280
289
|
| [provenance](docs/provenance.md) | 設計の由来と、CueLine が何でないか |
|
|
281
290
|
|
package/README.ko.md
CHANGED
|
@@ -20,17 +20,17 @@
|
|
|
20
20
|
|
|
21
21
|
<img alt="CueLine 아키텍처: ChatGPT 웹 대화가 라운드마다 텍스트 명령 하나를 내리고, CueLine이 검증·기록하며, 현재 Codex가 허용된 로컬 작업을 수행합니다." src="docs/assets/cueline-architecture-ko.svg" width="100%">
|
|
22
22
|
|
|
23
|
-
CueLine은 독립적인 구현이며 **런타임 npm 의존성이 전혀 없습니다**. Omnilane
|
|
23
|
+
CueLine은 독립적인 구현이며 **런타임 npm 의존성이 전혀 없습니다**. Omnilane을 감싼 래퍼가 아닙니다.
|
|
24
24
|
|
|
25
|
-
## 최신 릴리스: 0.2.
|
|
25
|
+
## 최신 릴리스: 0.2.2
|
|
26
26
|
|
|
27
|
-
-
|
|
28
|
-
-
|
|
29
|
-
-
|
|
30
|
-
-
|
|
31
|
-
-
|
|
27
|
+
- 설정 가능한 영속적 job별 컨트롤러 증거 상한을 추가하고(0.2.1), 기록되는 모든 job 이벤트에도 적용했습니다. 이벤트 로그와 컨트롤러에 제공되는 증거는 항상 같은 상한을 공유합니다.
|
|
28
|
+
- 실제 run에서 관측된 증거 고갈 교착을 수정했습니다. 과대한 워커 출력이 컨트롤러를 라운드 한도 안에 끝나지 않는 inspect 페이징 루프로 몰아넣는 일은 더 이상 없습니다.
|
|
29
|
+
- 용량 경고는 컨트롤러가 실제로 페이징할 수 있는 증거만 계산합니다. 영속 상한을 넘는 실제 총량은 별도의 결정적 알림으로 공개되며, 증거가 충분하면 컨트롤러는 조기에 결정할 수 있습니다.
|
|
30
|
+
- 재생된 증거는 바이트 단위로 안정적입니다. 검증된 정규 상한 마커는 그대로 유지되고, 구형 절단 마커는 무결성 오류 없이 결정적으로 다시 상한이 적용됩니다.
|
|
31
|
+
- 490/490 테스트와 함께 실제 process runner로 검증했습니다. 실제 총량을 담은 상한 이벤트 마커 하나를 기록하고 컨트롤러 2턴 안에 완료했습니다.
|
|
32
32
|
|
|
33
|
-
전체 내용은 [changelog](CHANGELOG.md#
|
|
33
|
+
전체 내용은 [changelog](CHANGELOG.md#022---2026-07-17) 또는 버전이 지정된 [v0.2.2 release](https://github.com/Seraphim0916/cueline/releases/tag/v0.2.2)에서 확인할 수 있습니다.
|
|
34
34
|
|
|
35
35
|
## 실행 한 번은 실제로 이렇게 흘러갑니다
|
|
36
36
|
|
|
@@ -168,6 +168,8 @@ if (result.status === "complete") {
|
|
|
168
168
|
|
|
169
169
|
`verifyCueLineRun(runId)`는 생성 marker, 이벤트 replay와 authority fence, 선택적 snapshot, runtime lease, job status 증거를 검사하는 읽기 전용 무결성 검사입니다. 지속 run 내용은 반환하지 않고 안정적인 finding만 반환합니다.
|
|
170
170
|
|
|
171
|
+
`confirmManualControllerSubmission(runId, …)`과 `confirmControllerTurnNotSent(runId, …)`은 두 가지 reconcile 확인의 프로그래밍 인터페이스입니다. 둘 다 추가 전용이고 멱등이며, 브라우저를 구동하지도, 무언가를 재전송하지도 않습니다.
|
|
172
|
+
|
|
171
173
|
Codex 런타임에서는 `cueline api path`가 출력하는 절대 경로 모듈을 import하세요. 그것이 설치한 패키지의 빌드된 API입니다.
|
|
172
174
|
|
|
173
175
|
`startCueLineRun`은 지속 run을 만들고 `ready`만 반환합니다. `runCueLine`은 생성 후 지속 controller 관측 대기, caller 인계 또는 종료 상태까지 진행합니다. owner가 없는 `controller_response_pending`에 정상 전송된 턴이 정확히 하나이고 `safeNextAction: observe`가 표시되면 같은 Pro 응답을 읽기 전용으로 관측하기 위한 대기입니다. 잠시 뒤 계속하고 재전송하지 마세요. `safeNextAction: reconcile`은 모호하거나 수동 전송되었거나 보류 턴이 여러 개인 경우에 사용합니다. owner가 없는 `caller_jobs_pending`은 정상적인 로컬 인계이며 orphan이나 ChatGPT 대기가 아닙니다. CLI의 `run status`는 인계에 필요한 metadata만 출력하며 task 본문, caller identity, task hash, workdir, runtime owner ID를 포함하지 않습니다. 정식 claim 뒤에만 API가 정확한 task와 workdir를 승인된 caller에게 반환합니다.
|
|
@@ -178,7 +180,7 @@ CLI는 브라우저를 구동하지 않습니다. 상태를 쓰는 명령 전에
|
|
|
178
180
|
|
|
179
181
|
| 그룹 | 명령 | 효과 |
|
|
180
182
|
| --- | --- | --- |
|
|
181
|
-
| 조회 | `doctor` · `routing` · `jobs` · `runs` · `run status` · `run doctor` · `run watch` · `run timeline` · `run verify` · `run handoff` · `protocol lint` · `api path` · `config path` | 읽기 전용 |
|
|
183
|
+
| 조회 | `doctor` · `routing` · `routing explain` · `jobs` · `runs` · `run status` · `run status-at` · `run diff` · `run doctor` · `run watch` · `run timeline` · `run graph` · `run verify` · `run handoff` · `protocol lint` · `api path` · `config path` | 읽기 전용 |
|
|
182
184
|
| 설치 | `install` · `uninstall` | 패키지가 소유한 스킬 링크만 생성·제거 |
|
|
183
185
|
| 복구 | `run reconcile` · `run takeover` · `run reconcile-runtime` · `run cancel` / `run stop` · `job cancel` | 감사 증거 추가 또는 지속 run/job 상태 변경 |
|
|
184
186
|
|
|
@@ -211,6 +213,8 @@ run_... requested affected_jobs=0
|
|
|
211
213
|
|
|
212
214
|
Node 버전이 너무 낮거나 활성화된 caller 레인이 하나도 없으면 `cueline doctor`는 0이 아닌 코드로 종료합니다. `process_available_lanes`가 0이어도 caller 모드는 저하되지 않습니다. process executor를 명시적으로 선택하기 전에만 `cueline routing`으로 process 가용성을 확인하세요. `cueline api path`가 출력하는 것이 곧 스킬이 import하는 모듈이므로, 패키지로 설치했다면 저장소를 받을 필요가 없습니다. `cueline help`는 `--json`과 수동 reconcile 필수 확인 플래그를 포함한 각 명령의 정확한 구문을 나열합니다.
|
|
213
215
|
|
|
216
|
+
0.2.0에서 추가된 네 가지 관측 명령은 모두 엄격히 읽기 전용입니다. `run status-at`은 하나의 정확한 이벤트 순번 시점으로 비식별화된 run 상태를 재구성합니다 — “그 순간 CueLine이 알고 있던 것”입니다. `run diff`는 두 개의 비식별화된 run 요약을 필드 단위로 비교하며 원본 프롬프트나 출력은 절대 포함하지 않습니다. `run graph`는 비식별화된 timeline 항목으로 제한된 Mermaid 제어 흐름 그래프를 그립니다. `routing explain`은 프로세스 시작 전에 레인 선택, 가용성, 탈락 사유를 runner 인수를 노출하지 않고 설명합니다([multi-model routing](docs/multi-model-routing.md) 참고).
|
|
217
|
+
|
|
214
218
|
실험적 진단 명령에는 각각 전용 문서가 있습니다:
|
|
215
219
|
|
|
216
220
|
| 명령 | 역할 | 문서 |
|
|
@@ -229,6 +233,8 @@ Node 버전이 너무 낮거나 활성화된 caller 레인이 하나도 없으
|
|
|
229
233
|
|
|
230
234
|
Caller는 프로세스를 띄우지 않습니다. `executor: "process"`와 `allowProcessExecution: true`를 함께 지정한 경우에만 `default` 레인의 `codex-default`가 격리된 `codex exec --ignore-user-config`를 실행합니다. 독립 `advise`의 기본 동시 실행 상한은 전체/레인당 2이고, `work`가 포함된 배치는 직렬입니다. 다른 process worker를 등록하려면 [`config/routing.default.json`](config/routing.default.json)을 복사해 후보를 추가하고 `CUELINE_CONFIG`를 그쪽으로 지정하세요.
|
|
231
235
|
|
|
236
|
+
모델별 여러 후보를 등록하는 방법과 advise 전용 래퍼 예시는 [multi-model routing](docs/multi-model-routing.md)을 참고하세요.
|
|
237
|
+
|
|
232
238
|
상태는 `CUELINE_HOME` 아래에 놓입니다:
|
|
233
239
|
|
|
234
240
|
```text
|
|
@@ -245,6 +251,8 @@ jobs/<job-id>.json 작업별 실행 증거
|
|
|
245
251
|
|
|
246
252
|
복구는 완전히 같은 대화 URL에만 연결합니다. ChatGPT가 긴 텍스트를 첨부로 자동 변환하면 `attachment_ready`로 인식하며 전송 클릭은 최대 한 번입니다. 모호한 클릭은 `possibly_sent`가 되고 재전송하지 않습니다. 실제로 보이고 활성화되어 조작 가능한 Stop 컨트롤이 있는 동안에만 응답이 진행 중으로 간주됩니다. 숨은 잔여 버튼이 완료된 Pro 응답을 가리는 일은 없습니다. 수동 전송 뒤에는 `cueline run reconcile RUN_ID --request-id REQUEST_ID --manual-send-confirmed`로 정식 확인하고 동일 conversation, Pro 증거, protocol/run/round/request identity를 모두 검증합니다.
|
|
247
253
|
|
|
254
|
+
반대 방향의 확인은 “클릭이 확실히 도달하지 않은” 경우를 다룹니다. 운영자가 그 정확한 대화를 직접 확인해 메시지가 없다는 것을 확인한 뒤 `cueline run reconcile ... --not-sent-confirmed --conversation-url URL`을 실행하면, 이전 request identity를 추가 전용으로 폐기하고 새 결정적 request ID로 정확히 한 번의 동일 프롬프트 재시도를 승인합니다. 두 플래그는 상호 배타적이며, 폐기한 메시지나 그 응답이 나중에라도 나타나면 CueLine은 run을 동결해 수동 검토로 넘기고 절대 수락하거나 재전송하지 않습니다.
|
|
255
|
+
|
|
248
256
|
Pro가 답하는 동안에는 절대 중단하지 말고, `Answer now`, `Respond now`, `Stop` 또는 그에 준하는 가속 컨트롤도 쓰지 마세요. Pro에는 로컬 도구가 없고 저장소 구조나 로컬 경로에 대한 기본 지식도 없습니다. Caller 증거에는 정확한 코드/오류 식별자, 관련 코드 발췌, 절대 로컬 경로를 담고, Pro에게 로컬 증거가 더 필요한지 명시적으로 물어보세요.
|
|
249
257
|
|
|
250
258
|
컨트롤러 증거는 성공한 비어 있지 않은 stdout을 우선하며 전체 12,000자로 제한하고, 전체 stdout/stderr는 로컬에 보존합니다. Pro가 `inspect(job_ids)`를 수락하면 다음 턴은 지정된 job의 증거 예산을 먼저 확보한 뒤 무관한 증거를 다룹니다.
|
|
@@ -276,6 +284,7 @@ npm pack --dry-run
|
|
|
276
284
|
| [controller protocol](docs/controller-protocol.md) | `<CueLineControl>` 엔벨로프, 다섯 동작, 수정 규칙 |
|
|
277
285
|
| [runner contract](docs/runner-contract.md) | 등록된 process worker가 해야 할 일과 해서는 안 될 일 |
|
|
278
286
|
| [state and recovery](docs/state-and-recovery.md) | 지속 상태 레이아웃, ownership, 모든 복구 경로 |
|
|
287
|
+
| [multi-model routing](docs/multi-model-routing.md) | 추가 process worker 등록 방법과 컨트롤러가 실제로 볼 수 있는 것 |
|
|
279
288
|
| [compatibility](docs/compatibility.md) | 지원 플랫폼, 런타임, UI 전제 |
|
|
280
289
|
| [provenance](docs/provenance.md) | 설계의 유래와 CueLine이 아닌 것 |
|
|
281
290
|
|
package/README.md
CHANGED
|
@@ -20,17 +20,17 @@ The web page never touches your machine and has no local tools. It only emits on
|
|
|
20
20
|
|
|
21
21
|
<img alt="CueLine architecture: a ChatGPT web conversation issues one text command per round, CueLine validates and records it, and the current Codex performs the permitted local work." src="docs/assets/cueline-architecture-en.svg" width="100%">
|
|
22
22
|
|
|
23
|
-
CueLine is a standalone implementation with **no runtime npm dependencies**. It is not a wrapper around Omnilane
|
|
23
|
+
CueLine is a standalone implementation with **no runtime npm dependencies**. It is not a wrapper around Omnilane.
|
|
24
24
|
|
|
25
|
-
## Latest release: 0.2.
|
|
25
|
+
## Latest release: 0.2.2
|
|
26
26
|
|
|
27
|
-
-
|
|
28
|
-
-
|
|
29
|
-
-
|
|
30
|
-
-
|
|
31
|
-
- Verified
|
|
27
|
+
- Added a durable, configurable per-job controller-evidence cap (0.2.1), now applied to every recorded job event so event-log and controller-served evidence always share one cap.
|
|
28
|
+
- Fixed the evidence-starvation deadlock observed in a real run: oversized worker output can no longer force the controller into an inspect-pagination treadmill that cannot finish within the round limit.
|
|
29
|
+
- Capacity warnings count only evidence the controller can actually page through; true totals beyond the durable cap are reported in a separate deterministic notice, and the controller may decide as soon as evidence is sufficient.
|
|
30
|
+
- Replayed evidence stays byte-stable: a validated canonical cap marker is preserved as-is, and legacy truncation markers re-cap deterministically without integrity errors.
|
|
31
|
+
- Verified 490/490 tests, plus a real process-runner run that wrote one capped event marker carrying the true total and completed in two controller turns.
|
|
32
32
|
|
|
33
|
-
Read the complete [changelog](CHANGELOG.md#
|
|
33
|
+
Read the complete [changelog](CHANGELOG.md#022---2026-07-17) or the versioned [v0.2.2 release](https://github.com/Seraphim0916/cueline/releases/tag/v0.2.2).
|
|
34
34
|
|
|
35
35
|
## How a run actually goes
|
|
36
36
|
|
|
@@ -181,6 +181,8 @@ if (result.status === "complete") {
|
|
|
181
181
|
|
|
182
182
|
`verifyCueLineRun(runId)` is a read-only integrity check for the creation marker, event replay and authority fences, optional snapshot, runtime lease, and job status evidence. It returns stable findings without returning durable run content.
|
|
183
183
|
|
|
184
|
+
`confirmManualControllerSubmission(runId, …)` and `confirmControllerTurnNotSent(runId, …)` are the programmatic forms of the two reconcile confirmations. Both are append-only and idempotent, and neither drives the browser or resends anything.
|
|
185
|
+
|
|
184
186
|
Inside Codex's runtime, import the absolute module that `cueline api path` prints — that is the built API of the package you installed.
|
|
185
187
|
|
|
186
188
|
## The CLI
|
|
@@ -189,7 +191,7 @@ The CLI does not drive the browser. Run `cueline help` for every positional argu
|
|
|
189
191
|
|
|
190
192
|
| Group | Commands | Effect |
|
|
191
193
|
| --- | --- | --- |
|
|
192
|
-
| Inspect | `doctor` · `routing` · `jobs` · `runs` · `run status` · `run doctor` · `run watch` · `run timeline` · `run verify` · `run handoff` · `protocol lint` · `api path` · `config path` | Read-only |
|
|
194
|
+
| Inspect | `doctor` · `routing` · `routing explain` · `jobs` · `runs` · `run status` · `run status-at` · `run diff` · `run doctor` · `run watch` · `run timeline` · `run graph` · `run verify` · `run handoff` · `protocol lint` · `api path` · `config path` | Read-only |
|
|
193
195
|
| Install | `install` · `uninstall` | Create or remove only the package-owned skill link |
|
|
194
196
|
| Recover | `run reconcile` · `run takeover` · `run reconcile-runtime` · `run cancel` / `run stop` · `job cancel` | Append evidence or change durable local run/job state |
|
|
195
197
|
|
|
@@ -222,6 +224,8 @@ run_... requested affected_jobs=0
|
|
|
222
224
|
|
|
223
225
|
`cueline doctor` exits non-zero when Node is too old or no enabled caller lane exists. `process_available_lanes` may be zero without degrading caller mode; use `cueline routing` to inspect process availability before explicitly selecting that executor. `cueline api path` is what the skill imports, so a packaged install needs no repository checkout. Every command supports `--json` where shown by `cueline help`.
|
|
224
226
|
|
|
227
|
+
Four observability commands added in 0.2.0 are strictly read-only: `run status-at` reconstructs the sanitized run state at one exact durable event sequence — what CueLine knew at that moment; `run diff` compares two sanitized run summaries field by field, never raw prompts or output; `run graph` renders a bounded Mermaid control-flow graph from sanitized timeline entries; and `routing explain` reports pre-spawn lane selection, availability, and rejection reasons without exposing runner arguments (see [multi-model routing](docs/multi-model-routing.md)).
|
|
228
|
+
|
|
225
229
|
The experimental diagnosis commands each have a focused doc:
|
|
226
230
|
|
|
227
231
|
| Command | What it does | Doc |
|
|
@@ -258,6 +262,8 @@ The event log is the record: the controller turn is written before it is sent, a
|
|
|
258
262
|
|
|
259
263
|
Recovery reattaches only to the exact recorded conversation URL. CueLine recognizes long prompts that ChatGPT automatically converts into attachment chips and makes at most one send attempt. Contenteditable block newlines are normalized before readiness comparison. An ambiguous click is `possibly_sent` and is never clicked again. A response is considered in progress only while a visible, enabled, actionable Stop control exists; hidden residual buttons do not suppress a completed Pro response. If an operator manually sends an attachment after ChatGPT creates the first `/c/...` URL, `cueline run reconcile ... --manual-send-confirmed --conversation-url URL` atomically binds the exact URL and records an append-only confirmation; CueLine then requires exact conversation, Pro model, and protocol/run/round/request identity before importing the response without resend or duplicate dispatch.
|
|
260
264
|
|
|
265
|
+
The opposite confirmation exists for a click that provably never landed. After directly inspecting the exact conversation and finding the message absent, `cueline run reconcile ... --not-sent-confirmed --conversation-url URL` abandons the old request identity append-only and authorizes exactly one same-prompt retry under a new deterministic request ID. The two flags are mutually exclusive, and if the abandoned message or its response later appears anyway, CueLine freezes the run for manual review instead of accepting or resending.
|
|
266
|
+
|
|
261
267
|
Never interrupt Pro or use `Answer now`, `Respond now`, `Stop`, or an equivalent acceleration control while it is answering. Pro has no local tools and no default knowledge of repository layout or local paths. Caller evidence must include exact code/error identifiers, relevant code excerpts, and absolute local paths, then explicitly ask whether Pro needs more local evidence.
|
|
262
268
|
|
|
263
269
|
Controller observations prefer successful non-empty stdout, retain full stdout/stderr in local job status, and share one 12,000-character evidence budget with an explicit truncation marker. Every preferred output/error field includes a raw-character `evidence_window` and SHA-256 `content_hash`. When `next_offset` is non-null, Pro can inspect exactly one job by copying it as `evidence_offset` and the hash as `evidence_hash`; CueLine returns the next bounded window without rerunning the job. Changed evidence invalidates the cursor instead of mixing versions. An accepted `inspect(job_ids)` reserves that budget for the named jobs before unrelated evidence, so the next Pro turn receives the requested output instead of only its terminal status. `wait` and `inspect` targets must be exact job IDs from the current observation; one unknown target rejects the entire command for repair before any partial wait or inspection. Controller commands are exact per action: unknown top-level fields, fields belonging to another action, empty/duplicate/malformed `job_ids`, `prompt` in place of `task`, and `runner_id` in place of `runner` are rejected with a repair error instead of silently ignored.
|
|
@@ -289,6 +295,7 @@ See [compatibility](docs/compatibility.md) for the full matrix.
|
|
|
289
295
|
| [controller protocol](docs/controller-protocol.md) | The `<CueLineControl>` envelope, the five actions, and repair rules |
|
|
290
296
|
| [runner contract](docs/runner-contract.md) | What a registered process worker must and must not do |
|
|
291
297
|
| [state and recovery](docs/state-and-recovery.md) | Durable state layout, ownership, and every recovery path |
|
|
298
|
+
| [multi-model routing](docs/multi-model-routing.md) | Registering additional process workers and what the controller can actually see |
|
|
292
299
|
| [compatibility](docs/compatibility.md) | Supported platforms, runtimes, and UI assumptions |
|
|
293
300
|
| [provenance](docs/provenance.md) | Where the design comes from and what it is not |
|
|
294
301
|
|
package/README.zh-CN.md
CHANGED
|
@@ -20,17 +20,17 @@
|
|
|
20
20
|
|
|
21
21
|
<img alt="CueLine 架构:ChatGPT 网页会话每轮发出一条文本指令,CueLine 校验并记录,当前 Codex 执行获准的本地工作。" src="docs/assets/cueline-architecture-zh-CN.svg" width="100%">
|
|
22
22
|
|
|
23
|
-
CueLine 是独立实现,**没有任何运行时 npm 依赖**,也不是 Omnilane
|
|
23
|
+
CueLine 是独立实现,**没有任何运行时 npm 依赖**,也不是 Omnilane 的包装层。
|
|
24
24
|
|
|
25
|
-
## 最新版本:0.2.
|
|
25
|
+
## 最新版本:0.2.2
|
|
26
26
|
|
|
27
|
-
-
|
|
28
|
-
-
|
|
29
|
-
-
|
|
30
|
-
-
|
|
31
|
-
- 完成
|
|
27
|
+
- 新增可配置的持久单 job 控制器证据上限(0.2.1),并应用到每一条写入的 job 事件,事件日志与提供给控制器的证据始终共用同一个上限。
|
|
28
|
+
- 修复真实 run 中观察到的证据饥饿死锁:过大的 worker 输出不再能把控制器拖进轮次上限内走不完的 inspect 翻页循环。
|
|
29
|
+
- 容量警告只统计控制器实际能翻到的证据;超过持久上限的真实总量改由独立的确定性通知披露,控制器在证据充分时即可提前决策。
|
|
30
|
+
- 重放证据字节稳定:通过校验的规范上限标记原样保留,旧版截断标记则确定性地重新套用上限,不产生完整性错误。
|
|
31
|
+
- 完成 490/490 测试,并用真实 process runner 验证:单个上限事件标记携带真实总量写入,两个控制器轮次内完成。
|
|
32
32
|
|
|
33
|
-
完整内容请查看 [changelog](CHANGELOG.md#
|
|
33
|
+
完整内容请查看 [changelog](CHANGELOG.md#022---2026-07-17) 或版本化的 [v0.2.2 release](https://github.com/Seraphim0916/cueline/releases/tag/v0.2.2)。
|
|
34
34
|
|
|
35
35
|
## 一次运行实际是怎么走的
|
|
36
36
|
|
|
@@ -170,6 +170,8 @@ if (result.status === "complete") {
|
|
|
170
170
|
|
|
171
171
|
`verifyCueLineRun(runId)` 是只读完整性检查,会核对创建 marker、event replay 与 authority fence、可选 snapshot、runtime lease 和 job status 证据;只返回稳定 finding,不返回持久 run 内容。
|
|
172
172
|
|
|
173
|
+
`confirmManualControllerSubmission(runId, …)` 与 `confirmControllerTurnNotSent(runId, …)` 是两种 reconcile 确认的编程接口。二者都只追加事件、幂等可重复执行,也都不驱动浏览器、不重发任何内容。
|
|
174
|
+
|
|
173
175
|
在 Codex 的 runtime 里,import `cueline api path` 打印出的那个绝对路径模块——那就是你安装的那份包构建出来的 API。
|
|
174
176
|
|
|
175
177
|
`startCueLineRun` 只创建持久 run 并返回 `ready`;`runCueLine` 创建并推进到持久 controller 观测暂停、caller 交接或终态。缺少 owner 的 `controller_response_pending` 若只有一个正常发送的回合且显示 `safeNextAction: observe`,表示同一个 Pro 回复仍待只读观测;稍后继续即可且不得重发。`safeNextAction: reconcile` 只用于模糊、人工发送或多个待对账回合。缺少 owner 的 `caller_jobs_pending` 是正常本地交接,并非 orphan,也不是仍在等 ChatGPT。CLI 的 `run status` 只输出交接所需元数据,不包含 task 正文、caller 身份、task hash、workdir 或 runtime owner ID;正式 claim 后,API 才把精确 task 与 workdir 交给获授权的 caller。
|
|
@@ -180,7 +182,7 @@ CLI 不驱动浏览器。执行写入状态的命令前,先用 `cueline help`
|
|
|
180
182
|
|
|
181
183
|
| 分组 | 命令 | 效果 |
|
|
182
184
|
| --- | --- | --- |
|
|
183
|
-
| 查看 | `doctor` · `routing` · `jobs` · `runs` · `run status` · `run doctor` · `run watch` · `run timeline` · `run verify` · `run handoff` · `protocol lint` · `api path` · `config path` | 只读 |
|
|
185
|
+
| 查看 | `doctor` · `routing` · `routing explain` · `jobs` · `runs` · `run status` · `run status-at` · `run diff` · `run doctor` · `run watch` · `run timeline` · `run graph` · `run verify` · `run handoff` · `protocol lint` · `api path` · `config path` | 只读 |
|
|
184
186
|
| 安装 | `install` · `uninstall` | 只创建或移除包所拥有的 skill 链接 |
|
|
185
187
|
| 恢复 | `run reconcile` · `run takeover` · `run reconcile-runtime` · `run cancel` / `run stop` · `job cancel` | 追加审计证据或修改持久 run/job 状态 |
|
|
186
188
|
|
|
@@ -213,6 +215,8 @@ run_... requested affected_jobs=0
|
|
|
213
215
|
|
|
214
216
|
当 Node 版本过旧、或没有任何已启用的 caller 通道时,`cueline doctor` 会以非零状态退出。`process_available_lanes` 可以为 0 而不影响 caller 模式;只有显式选择 process executor 前才需要用 `cueline routing` 检查 process 可用性。`cueline api path` 打印的就是 skill 会 import 的模块,所以使用打包安装时完全不需要 clone 源码。`cueline help` 会列出每个命令的精确语法,包括 `--json` 和人工 reconcile 的必需确认参数。
|
|
215
217
|
|
|
218
|
+
0.2.0 新增的四个可观测性命令全部严格只读:`run status-at` 按单个精确事件序号重建脱敏的 run 状态——“那个时刻 CueLine 知道什么”;`run diff` 逐字段比较两份脱敏的 run 摘要,绝不含原始 prompt 或输出;`run graph` 把脱敏的 timeline 条目渲染成有界的 Mermaid 控制流图;`routing explain` 则在任何进程启动前解释通道选择、可用性与淘汰原因,不泄露 runner 参数(见 [multi-model routing](docs/multi-model-routing.md))。
|
|
219
|
+
|
|
216
220
|
实验性的诊断命令各有专属文档:
|
|
217
221
|
|
|
218
222
|
| 命令 | 用途 | 文档 |
|
|
@@ -231,6 +235,8 @@ run_... requested affected_jobs=0
|
|
|
231
235
|
|
|
232
236
|
Caller 模式不会启动路由进程。只有同时选择 `executor: "process"` 与 `allowProcessExecution: true` 时,内置 `default` 通道才以 `codex-default` 运行隔离的 `codex exec --ignore-user-config`;独立 `advise` 默认全局/每 lane 并发上限均为 2,包含 `work` 的批次保持串行。要注册不同的 process worker,复制 [`config/routing.default.json`](config/routing.default.json)、加入你的候选项,再把 `CUELINE_CONFIG` 指过去。
|
|
233
237
|
|
|
238
|
+
要注册多个对应不同模型的候选项,以及 advise 专用 wrapper 的示例,见 [multi-model routing](docs/multi-model-routing.md)。
|
|
239
|
+
|
|
234
240
|
状态位于 `CUELINE_HOME` 之下:
|
|
235
241
|
|
|
236
242
|
```text
|
|
@@ -247,6 +253,8 @@ jobs/<job-id>.json 每个作业的执行证据
|
|
|
247
253
|
|
|
248
254
|
续跑只接回完全相同的会话 URL。ChatGPT 自动把长文本转换成附件时,CueLine 识别 `attachment_ready` 且最多点击一次;模糊点击记为 `possibly_sent`,绝不补点或重发。只有实际可见、启用且可操作的 Stop 按钮才表示 Pro 仍在回答;隐藏残留按钮不会挡住已完成的回复。人工发送附件后,使用 `cueline run reconcile RUN_ID --request-id REQUEST_ID --manual-send-confirmed` 写入正式确认;仍须通过完全一致的 conversation、Pro 证据与 protocol/run/round/request identity。
|
|
249
255
|
|
|
256
|
+
相反方向的确认处理“点击确定没有送达”的情形:操作者亲自检查那个精确会话、确认消息不存在后,用 `cueline run reconcile ... --not-sent-confirmed --conversation-url URL` 以仅追加的方式放弃旧的 request 身份,并授权恰好一次同 prompt 重试(使用新的确定性 request ID)。两个标志互斥;若被放弃的消息或其回复事后仍然出现,CueLine 会冻结该 run 交由人工裁决,绝不接受或重发。
|
|
257
|
+
|
|
250
258
|
Pro 回答时绝不要打断它,也不要用 `Answer now`、`Respond now`、`Stop` 或任何等效的加速控制。Pro 没有本地工具,也不默认了解 repository 布局或本地路径。Caller 证据必须包含精确的代码/错误标识、相关代码摘录与绝对本地路径,并明确询问 Pro 是否还需要更多本地证据。
|
|
251
259
|
|
|
252
260
|
控制器证据优先使用成功且非空的 stdout,全局上限 12,000 字符;完整 stdout/stderr 保留在本地。若 Pro 接受 `inspect(job_ids)`,下一轮会先为指定 job 保留证据预算,再处理无关作业。
|
|
@@ -278,6 +286,7 @@ npm pack --dry-run
|
|
|
278
286
|
| [controller protocol](docs/controller-protocol.md) | `<CueLineControl>` 信封、五个动作与修复规则 |
|
|
279
287
|
| [runner contract](docs/runner-contract.md) | 已注册的 process worker 必须做与不得做的事 |
|
|
280
288
|
| [state and recovery](docs/state-and-recovery.md) | 持久状态布局、ownership 与每一条恢复路径 |
|
|
289
|
+
| [multi-model routing](docs/multi-model-routing.md) | 如何注册额外的 process worker,以及控制器实际能看到什么 |
|
|
281
290
|
| [compatibility](docs/compatibility.md) | 支持的平台、runtime 与 UI 假设 |
|
|
282
291
|
| [provenance](docs/provenance.md) | 设计从哪里来、它不是什么 |
|
|
283
292
|
|
package/README.zh-TW.md
CHANGED
|
@@ -20,17 +20,17 @@
|
|
|
20
20
|
|
|
21
21
|
<img alt="CueLine 架構:ChatGPT 網頁對話每輪發出一道文字指令,CueLine 驗證並記錄,目前的 Codex 執行獲准的本機工作。" src="docs/assets/cueline-architecture-zh-TW.svg" width="100%">
|
|
22
22
|
|
|
23
|
-
CueLine 是獨立實作,**沒有任何 runtime npm 相依套件**,也不是 Omnilane
|
|
23
|
+
CueLine 是獨立實作,**沒有任何 runtime npm 相依套件**,也不是 Omnilane 的包裝層。
|
|
24
24
|
|
|
25
|
-
## 最新版本:0.2.
|
|
25
|
+
## 最新版本:0.2.2
|
|
26
26
|
|
|
27
|
-
-
|
|
28
|
-
-
|
|
29
|
-
-
|
|
30
|
-
-
|
|
31
|
-
- 完成
|
|
27
|
+
- 新增可設定的持久單一 job 主控證據上限(0.2.1),並套用到每一筆寫入的 job 事件,事件紀錄與提供給主控的證據永遠共用同一個上限。
|
|
28
|
+
- 修復真實 run 觀察到的證據餓死卡死:過大的工人輸出不再能把主控拖進回合上限內走不完的 inspect 翻頁迴圈。
|
|
29
|
+
- 容量警告只計算主控實際翻得到的證據;超過持久上限的真實總量改以獨立的決定性通知揭露,主控在證據足夠時即可提前決策。
|
|
30
|
+
- 重播證據位元組穩定:通過驗證的正規上限標記原樣保留,舊版截斷標記則決定性地重新套用上限,不產生完整性錯誤。
|
|
31
|
+
- 完成 490/490 測試,並以真實 process runner 驗證:單一上限事件標記帶真實總量寫入,兩個主控回合內完成。
|
|
32
32
|
|
|
33
|
-
完整內容請看 [changelog](CHANGELOG.md#
|
|
33
|
+
完整內容請看 [changelog](CHANGELOG.md#022---2026-07-17) 或版本化的 [v0.2.2 release](https://github.com/Seraphim0916/cueline/releases/tag/v0.2.2)。
|
|
34
34
|
|
|
35
35
|
## 一次執行實際上怎麼跑
|
|
36
36
|
|
|
@@ -179,6 +179,8 @@ if (result.status === "complete") {
|
|
|
179
179
|
|
|
180
180
|
`verifyCueLineRun(runId)` 是唯讀完整性檢查,會核對建立 marker、event replay 與 authority fence、選用 snapshot、runtime lease 和 job status 證據;只回傳穩定 finding,不回傳持久 run 內容。
|
|
181
181
|
|
|
182
|
+
`confirmManualControllerSubmission(runId, …)` 與 `confirmControllerTurnNotSent(runId, …)` 是兩種 reconcile 確認的程式介面。兩者都只追加事件、可重複執行(冪等),也都不驅動瀏覽器、不重送任何東西。
|
|
183
|
+
|
|
182
184
|
在 Codex 的 runtime 裡,import `cueline api path` 印出的那個絕對路徑模組——那就是你安裝的那份套件建置出來的 API。
|
|
183
185
|
|
|
184
186
|
`startCueLineRun` 只建立持久 run 並回傳 `ready`;`runCueLine` 會建立並推進到持久 controller 觀測暫停、caller 交接或終態。續跑前先執行 `cueline run status <run-id> --json`。單一正常送出、非人工、具精確 URL、無 job/pending command/取消的 stale caller observer 可被 fencing 後唯讀恢復;其他 stale 狀態仍須正式接管。`caller_work_pending`、`caller_work_claimed`、`caller_work_running` 分別只允許 `claim_caller_work`、`start_caller_work`、`continue_caller_work`,主控的 `dispatch` 本身不代表本機工作已開始。CLI 的 `run status` 只輸出交接所需 metadata,不包含 task 內文、caller 身分、task hash、workdir 或 runtime owner ID;完成正式 claim 後,API 才會把精確 task 與 workdir 交給獲授權的 caller。
|
|
@@ -189,7 +191,7 @@ CLI 不驅動瀏覽器。執行寫入狀態的命令前,先用 `cueline help`
|
|
|
189
191
|
|
|
190
192
|
| 分組 | 命令 | 效果 |
|
|
191
193
|
| --- | --- | --- |
|
|
192
|
-
| 檢視 | `doctor` · `routing` · `jobs` · `runs` · `run status` · `run doctor` · `run watch` · `run timeline` · `run verify` · `run handoff` · `protocol lint` · `api path` · `config path` | 唯讀 |
|
|
194
|
+
| 檢視 | `doctor` · `routing` · `routing explain` · `jobs` · `runs` · `run status` · `run status-at` · `run diff` · `run doctor` · `run watch` · `run timeline` · `run graph` · `run verify` · `run handoff` · `protocol lint` · `api path` · `config path` | 唯讀 |
|
|
193
195
|
| 安裝 | `install` · `uninstall` | 只建立或移除套件擁有的 skill 連結 |
|
|
194
196
|
| 恢復 | `run reconcile` · `run takeover` · `run reconcile-runtime` · `run cancel` / `run stop` · `job cancel` | 追加稽核證據或修改持久 run/job 狀態 |
|
|
195
197
|
|
|
@@ -222,6 +224,8 @@ run_... requested affected_jobs=0
|
|
|
222
224
|
|
|
223
225
|
Node 版本太舊、或沒有任何已啟用的 caller 通道時,`cueline doctor` 會以非零狀態結束。`process_available_lanes` 可以是 0 而不影響 caller 模式;只有明確選用 process executor 前才需要用 `cueline routing` 檢查 process 可用性。`cueline api path` 印出的就是 skill 會 import 的模組,所以用打包安裝時完全不需要 clone 原始碼。`cueline help` 會列出每個命令的精確語法,包括 `--json` 與人工 reconcile 的必要確認參數。
|
|
224
226
|
|
|
227
|
+
0.2.0 新增的四個可觀測性命令全部嚴格唯讀:`run status-at` 依單一精確事件序號重建去敏感的 run 狀態——「那個當下 CueLine 知道什麼」;`run diff` 逐欄比較兩份去敏感的 run 摘要,絕不含原始 prompt 或輸出;`run graph` 把去敏感的 timeline 條目畫成有界的 Mermaid 控制流程圖;`routing explain` 則在任何行程啟動前解釋通道選擇、可用性與淘汰原因,不洩漏 runner 參數(見 [multi-model routing](docs/multi-model-routing.md))。
|
|
228
|
+
|
|
225
229
|
實驗性的診斷命令各有專屬文件:
|
|
226
230
|
|
|
227
231
|
| 命令 | 用途 | 文件 |
|
|
@@ -240,6 +244,8 @@ Node 版本太舊、或沒有任何已啟用的 caller 通道時,`cueline doct
|
|
|
240
244
|
|
|
241
245
|
Caller 模式不會啟動路由行程。只有同時選擇 `executor: "process"` 與 `allowProcessExecution: true` 時,內建的 `default` 通道才會以 `codex-default` 執行隔離的 `codex exec --ignore-user-config`;`advise` 用 `read-only`、`work` 用 `workspace-write`。要註冊不同的 process worker,複製 [`config/routing.default.json`](config/routing.default.json)、加入你的候選項,再把 `CUELINE_CONFIG` 指過去。
|
|
242
246
|
|
|
247
|
+
要註冊多個對應不同模型的候選項,以及 advise 專用 wrapper 的範例,見 [multi-model routing](docs/multi-model-routing.md)。
|
|
248
|
+
|
|
243
249
|
狀態放在 `CUELINE_HOME` 底下:
|
|
244
250
|
|
|
245
251
|
```text
|
|
@@ -256,6 +262,8 @@ jobs/<job-id>.json 每個工作的執行證據
|
|
|
256
262
|
|
|
257
263
|
續跑只會接回完全相同的對話網址。ChatGPT 把長文字自動轉成附件時,CueLine 會辨識 `attachment_ready`,且最多只點一次;模糊點擊一律記為 `possibly_sent`,絕不補點或重送。只有實際可見、啟用且可操作的 Stop 按鈕才表示 Pro 仍在回答;隱藏殘留按鈕不會擋住完成回覆。若操作者手動送出附件,用 `cueline run reconcile RUN_ID --request-id REQUEST_ID --manual-send-confirmed` 寫入正式確認;之後仍須通過完全相同的 conversation、Pro 證據與 protocol/run/round/request identity 才能唯讀接回。
|
|
258
264
|
|
|
265
|
+
相反方向的確認則處理「點擊確定沒送達」的情境:操作者親自檢視那個精確對話、確認訊息不存在後,用 `cueline run reconcile ... --not-sent-confirmed --conversation-url URL` 以只追加的方式放棄舊的 request 身分,並授權恰好一次同 prompt 重試(使用新的確定性 request ID)。兩個旗標互斥;若被放棄的訊息或其回應事後仍然出現,CueLine 會凍結該 run 交人工裁決,絕不接受或重送。
|
|
266
|
+
|
|
259
267
|
Pro 回答時絕不要打斷它,也不要用 `Answer now`、`Respond now`、`Stop` 或任何等效的加速控制。Pro 沒有本機工具,也不預設知道 repository 佈局或本機路徑。Caller 證據必須包含精確的代碼/錯誤識別字、相關程式碼摘錄與絕對本機路徑,並明確詢問 Pro 是否還需要更多本機證據。
|
|
260
268
|
|
|
261
269
|
送給主控的工作證據優先採用成功且非空的 stdout,全體共用 12,000 字元上限;完整 stdout/stderr 仍保留在本機 job status。若 Pro 接受 `inspect(job_ids)`,下一輪會先替指定 job 保留證據預算,再處理無關工作。
|
|
@@ -287,6 +295,7 @@ npm pack --dry-run
|
|
|
287
295
|
| [controller protocol](docs/controller-protocol.md) | `<CueLineControl>` 封包、五個動作與修正規則 |
|
|
288
296
|
| [runner contract](docs/runner-contract.md) | 已註冊的 process worker 必須做與不得做的事 |
|
|
289
297
|
| [state and recovery](docs/state-and-recovery.md) | 持久狀態佈局、ownership 與每一條恢復路徑 |
|
|
298
|
+
| [multi-model routing](docs/multi-model-routing.md) | 如何註冊額外的 process worker,以及主控端實際看得到什麼 |
|
|
290
299
|
| [compatibility](docs/compatibility.md) | 支援的平台、runtime 與 UI 假設 |
|
|
291
300
|
| [provenance](docs/provenance.md) | 設計從哪裡來、它不是什麼 |
|
|
292
301
|
|
|
@@ -14,6 +14,8 @@ export interface CueLineRuntimeOptions {
|
|
|
14
14
|
environment?: NodeJS.ProcessEnv;
|
|
15
15
|
defaultTimeoutMs?: number;
|
|
16
16
|
maxRounds?: number;
|
|
17
|
+
/** Maximum raw characters from one job evidence field exposed to the controller. */
|
|
18
|
+
maxJobEvidenceChars?: number;
|
|
17
19
|
maxRepairAttempts?: number;
|
|
18
20
|
now?: () => Date;
|
|
19
21
|
signal?: AbortSignal;
|
|
@@ -475,7 +475,7 @@ export async function submitCueLineCallerJobResult(runId, jobId, input, options
|
|
|
475
475
|
await store.append("job_status", {
|
|
476
476
|
job_id: jobId,
|
|
477
477
|
status: terminal.status,
|
|
478
|
-
...boundedControllerEventEvidence(terminal),
|
|
478
|
+
...boundedControllerEventEvidence(terminal, store.state.maxJobEvidenceChars),
|
|
479
479
|
});
|
|
480
480
|
await store.snapshot();
|
|
481
481
|
return { runId, jobId, outcome: "submitted" };
|