cueline 0.1.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.
- package/.claude-plugin/plugin.json +8 -0
- package/.codex-plugin/plugin.json +18 -0
- package/LICENSE +21 -0
- package/README.ja.md +144 -0
- package/README.ko.md +144 -0
- package/README.md +144 -0
- package/README.zh-CN.md +144 -0
- package/README.zh-TW.md +144 -0
- package/THIRD_PARTY_NOTICES.md +11 -0
- package/bin/cueline +14 -0
- package/config/routing.default.json +28 -0
- package/config/routing.schema.json +58 -0
- package/dist/src/api.d.ts +34 -0
- package/dist/src/api.js +153 -0
- package/dist/src/api.js.map +1 -0
- package/dist/src/browser/browser-adapter.d.ts +15 -0
- package/dist/src/browser/browser-adapter.js +2 -0
- package/dist/src/browser/browser-adapter.js.map +1 -0
- package/dist/src/browser/codex-iab/bootstrap.d.ts +66 -0
- package/dist/src/browser/codex-iab/bootstrap.js +41 -0
- package/dist/src/browser/codex-iab/bootstrap.js.map +1 -0
- package/dist/src/browser/codex-iab/chatgpt-client.d.ts +10 -0
- package/dist/src/browser/codex-iab/chatgpt-client.js +180 -0
- package/dist/src/browser/codex-iab/chatgpt-client.js.map +1 -0
- package/dist/src/browser/codex-iab/selectors.d.ts +3 -0
- package/dist/src/browser/codex-iab/selectors.js +17 -0
- package/dist/src/browser/codex-iab/selectors.js.map +1 -0
- package/dist/src/cli/main.d.ts +7 -0
- package/dist/src/cli/main.js +196 -0
- package/dist/src/cli/main.js.map +1 -0
- package/dist/src/cli/skill-links.d.ts +2 -0
- package/dist/src/cli/skill-links.js +64 -0
- package/dist/src/cli/skill-links.js.map +1 -0
- package/dist/src/core/controller-loop.d.ts +36 -0
- package/dist/src/core/controller-loop.js +292 -0
- package/dist/src/core/controller-loop.js.map +1 -0
- package/dist/src/core/errors.d.ts +10 -0
- package/dist/src/core/errors.js +18 -0
- package/dist/src/core/errors.js.map +1 -0
- package/dist/src/core/ids.d.ts +5 -0
- package/dist/src/core/ids.js +51 -0
- package/dist/src/core/ids.js.map +1 -0
- package/dist/src/core/runtime.d.ts +12 -0
- package/dist/src/core/runtime.js +35 -0
- package/dist/src/core/runtime.js.map +1 -0
- package/dist/src/core/state-machine.d.ts +28 -0
- package/dist/src/core/state-machine.js +99 -0
- package/dist/src/core/state-machine.js.map +1 -0
- package/dist/src/jobs/locks.d.ts +8 -0
- package/dist/src/jobs/locks.js +24 -0
- package/dist/src/jobs/locks.js.map +1 -0
- package/dist/src/jobs/status.d.ts +22 -0
- package/dist/src/jobs/status.js +53 -0
- package/dist/src/jobs/status.js.map +1 -0
- package/dist/src/jobs/supervisor.d.ts +22 -0
- package/dist/src/jobs/supervisor.js +96 -0
- package/dist/src/jobs/supervisor.js.map +1 -0
- package/dist/src/protocol/parse-command.d.ts +2 -0
- package/dist/src/protocol/parse-command.js +23 -0
- package/dist/src/protocol/parse-command.js.map +1 -0
- package/dist/src/protocol/types.d.ts +67 -0
- package/dist/src/protocol/types.js +2 -0
- package/dist/src/protocol/types.js.map +1 -0
- package/dist/src/protocol/validate-command.d.ts +2 -0
- package/dist/src/protocol/validate-command.js +181 -0
- package/dist/src/protocol/validate-command.js.map +1 -0
- package/dist/src/router/availability.d.ts +3 -0
- package/dist/src/router/availability.js +55 -0
- package/dist/src/router/availability.js.map +1 -0
- package/dist/src/router/config-loader.d.ts +3 -0
- package/dist/src/router/config-loader.js +92 -0
- package/dist/src/router/config-loader.js.map +1 -0
- package/dist/src/router/materialize.d.ts +8 -0
- package/dist/src/router/materialize.js +39 -0
- package/dist/src/router/materialize.js.map +1 -0
- package/dist/src/router/resolver.d.ts +6 -0
- package/dist/src/router/resolver.js +55 -0
- package/dist/src/router/resolver.js.map +1 -0
- package/dist/src/router/types.d.ts +24 -0
- package/dist/src/router/types.js +2 -0
- package/dist/src/router/types.js.map +1 -0
- package/dist/src/runners/process-runner.d.ts +15 -0
- package/dist/src/runners/process-runner.js +124 -0
- package/dist/src/runners/process-runner.js.map +1 -0
- package/dist/src/runners/registry.d.ts +17 -0
- package/dist/src/runners/registry.js +57 -0
- package/dist/src/runners/registry.js.map +1 -0
- package/dist/src/runners/runner-adapter.d.ts +32 -0
- package/dist/src/runners/runner-adapter.js +4 -0
- package/dist/src/runners/runner-adapter.js.map +1 -0
- package/dist/src/state/atomic-write.d.ts +1 -0
- package/dist/src/state/atomic-write.js +27 -0
- package/dist/src/state/atomic-write.js.map +1 -0
- package/dist/src/state/event-log.d.ts +8 -0
- package/dist/src/state/event-log.js +56 -0
- package/dist/src/state/event-log.js.map +1 -0
- package/dist/src/state/paths.d.ts +9 -0
- package/dist/src/state/paths.js +37 -0
- package/dist/src/state/paths.js.map +1 -0
- package/dist/src/state/store.d.ts +23 -0
- package/dist/src/state/store.js +108 -0
- package/dist/src/state/store.js.map +1 -0
- package/dist/src/version.d.ts +1 -0
- package/dist/src/version.js +2 -0
- package/dist/src/version.js.map +1 -0
- package/docs/architecture.md +83 -0
- package/docs/assets/README.md +51 -0
- package/docs/assets/cueline-banner-dark.svg +41 -0
- package/docs/assets/cueline-banner-light.svg +41 -0
- package/docs/assets/cueline-loop-en.svg +77 -0
- package/docs/assets/cueline-loop-ja.svg +77 -0
- package/docs/assets/cueline-loop-ko.svg +77 -0
- package/docs/assets/cueline-loop-zh-CN.svg +77 -0
- package/docs/assets/cueline-loop-zh-TW.svg +77 -0
- package/docs/assets/cueline-mark-dark.svg +10 -0
- package/docs/assets/cueline-mark-light.svg +10 -0
- package/docs/assets/cueline-wordmark-dark.svg +19 -0
- package/docs/assets/cueline-wordmark-light.svg +19 -0
- package/docs/compatibility.md +60 -0
- package/docs/controller-protocol.md +106 -0
- package/docs/provenance.md +10 -0
- package/docs/runner-contract.md +61 -0
- package/docs/state-and-recovery.md +67 -0
- package/evals/evals.json +41 -0
- package/install.sh +70 -0
- package/package.json +73 -0
- package/schemas/controller-command.schema.json +53 -0
- package/schemas/controller-observation.schema.json +32 -0
- package/skills/cueline/SKILL.md +80 -0
- package/skills/cueline/agents/openai.yaml +4 -0
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1000 590" width="1000" height="590" role="img" aria-label="CueLine 실행 한 번을 프롬프트북처럼 읽기: 머신이 관측을 보내고, 컨트롤러가 명령 하나를 내리고, 등록된 runner가 실행하며, complete가 나올 때까지 이어집니다.">
|
|
2
|
+
<title>CueLine 실행을 프롬프트북처럼 읽기</title>
|
|
3
|
+
<style>
|
|
4
|
+
text { font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, "Apple SD Gothic Neo", "Noto Sans CJK KR", "Malgun Gothic", monospace }
|
|
5
|
+
.hd { fill: #0F1720; font-size: 17px; letter-spacing: .02em }
|
|
6
|
+
.sub { fill: #8B949E; font-size: 13.5px }
|
|
7
|
+
.rule { stroke: #E4E8EC; stroke-width: 1 }
|
|
8
|
+
.spine{ stroke: #0F1720; stroke-width: 2 }
|
|
9
|
+
.tick { stroke: #C3CAD2; stroke-width: 1 }
|
|
10
|
+
.say { fill: #C8553D; font-size: 15px }
|
|
11
|
+
.obs { fill: #4A5561; font-size: 15px }
|
|
12
|
+
.note { fill: #8B949E; font-size: 13.5px }
|
|
13
|
+
.rnd { fill: #B6BEC7; font-size: 12px; letter-spacing: .14em }
|
|
14
|
+
.foot { fill: #8B949E; font-size: 13.5px }
|
|
15
|
+
.cue { fill: #C8553D }
|
|
16
|
+
@media (prefers-color-scheme: dark) {
|
|
17
|
+
.hd { fill: #E6EDF3 }
|
|
18
|
+
.sub, .note, .foot { fill: #7D8590 }
|
|
19
|
+
.rule { stroke: #21262D }
|
|
20
|
+
.spine { stroke: #C9D1D9 }
|
|
21
|
+
.tick { stroke: #30363D }
|
|
22
|
+
.say { fill: #E0674C }
|
|
23
|
+
.obs { fill: #ADBAC7 }
|
|
24
|
+
.rnd { fill: #484F58 }
|
|
25
|
+
.cue { fill: #E0674C }
|
|
26
|
+
}
|
|
27
|
+
</style>
|
|
28
|
+
|
|
29
|
+
<text x="505" y="44" class="hd" text-anchor="end">ChatGPT 웹 대화</text>
|
|
30
|
+
<text x="505" y="64" class="sub" text-anchor="end">컨트롤러 — 계획하고, 지시하고, 판단합니다</text>
|
|
31
|
+
<text x="555" y="44" class="hd">당신의 머신</text>
|
|
32
|
+
<text x="555" y="64" class="sub">CueLine — 검증 · 라우팅 · 실행 · 기록</text>
|
|
33
|
+
|
|
34
|
+
<path d="M40 84H505" class="rule"/>
|
|
35
|
+
<path d="M555 84H960" class="rule"/>
|
|
36
|
+
<path d="M530 84V520" class="spine"/>
|
|
37
|
+
|
|
38
|
+
<text x="40" y="126" class="rnd">라운드 1</text>
|
|
39
|
+
<path d="M505 122H524" class="tick"/>
|
|
40
|
+
<text x="555" y="126" class="obs">observation · 당신의 요청, 아직 작업 없음</text>
|
|
41
|
+
<path d="M524 118 517 122 524 126z" class="cue"/>
|
|
42
|
+
|
|
43
|
+
<path d="M536 158 545 162 536 166z" class="cue"/>
|
|
44
|
+
<text x="505" y="166" class="say" text-anchor="end">dispatch · review · lane default · advise</text>
|
|
45
|
+
<path d="M545 162H565" class="tick"/>
|
|
46
|
+
<text x="575" y="166" class="note">프로세스가 뜨기 전에 경로가 정해집니다</text>
|
|
47
|
+
|
|
48
|
+
<text x="555" y="200" class="note">codex exec (읽기 전용) → 성공 · 출력 저장</text>
|
|
49
|
+
|
|
50
|
+
<text x="40" y="264" class="rnd">라운드 2</text>
|
|
51
|
+
<path d="M505 260H524" class="tick"/>
|
|
52
|
+
<text x="555" y="264" class="obs">observation · 증거를 그대로</text>
|
|
53
|
+
<path d="M524 256 517 260 524 264z" class="cue"/>
|
|
54
|
+
|
|
55
|
+
<path d="M536 296 545 300 536 304z" class="cue"/>
|
|
56
|
+
<text x="505" y="304" class="say" text-anchor="end">dispatch · patch · mode work</text>
|
|
57
|
+
<path d="M545 300H565" class="tick"/>
|
|
58
|
+
<text x="575" y="304" class="note">argv[0]은 미리 허용되어 있어야 합니다</text>
|
|
59
|
+
|
|
60
|
+
<text x="555" y="338" class="note">codex exec (workspace-write) → 성공</text>
|
|
61
|
+
|
|
62
|
+
<text x="40" y="402" class="rnd">라운드 3</text>
|
|
63
|
+
<path d="M505 398H524" class="tick"/>
|
|
64
|
+
<text x="555" y="402" class="obs">observation · 갱신된 증거</text>
|
|
65
|
+
<path d="M524 394 517 398 524 402z" class="cue"/>
|
|
66
|
+
|
|
67
|
+
<path d="M536 434 545 438 536 442z" class="cue"/>
|
|
68
|
+
<text x="505" y="442" class="say" text-anchor="end">complete · final_delivery_text</text>
|
|
69
|
+
<path d="M545 438H565" class="tick"/>
|
|
70
|
+
<text x="575" y="442" class="note">그대로 당신에게 반환</text>
|
|
71
|
+
|
|
72
|
+
<text x="555" y="476" class="note">실행 봉인 · events.jsonl이 곧 기록</text>
|
|
73
|
+
|
|
74
|
+
<path d="M40 520H960" class="rule"/>
|
|
75
|
+
<text x="40" y="546" class="foot">동작은 다섯 개뿐 — dispatch · wait · inspect · complete · blocked.</text>
|
|
76
|
+
<text x="40" y="568" class="foot">엔벨로프 밖은 실행되지 않고, 시작된 워커는 재시도되지 않습니다.</text>
|
|
77
|
+
</svg>
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1000 590" width="1000" height="590" role="img" aria-label="一次 CueLine 运行像一本提示本:机器发出观测,控制器发出一条指令,已注册的 runner 执行它,直到控制器发出 complete。">
|
|
2
|
+
<title>一次 CueLine 运行,像读一本提示本</title>
|
|
3
|
+
<style>
|
|
4
|
+
text { font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, "Noto Sans CJK SC", "PingFang SC", "Microsoft YaHei", monospace }
|
|
5
|
+
.hd { fill: #0F1720; font-size: 17px; letter-spacing: .02em }
|
|
6
|
+
.sub { fill: #8B949E; font-size: 13.5px }
|
|
7
|
+
.rule { stroke: #E4E8EC; stroke-width: 1 }
|
|
8
|
+
.spine{ stroke: #0F1720; stroke-width: 2 }
|
|
9
|
+
.tick { stroke: #C3CAD2; stroke-width: 1 }
|
|
10
|
+
.say { fill: #C8553D; font-size: 15px }
|
|
11
|
+
.obs { fill: #4A5561; font-size: 15px }
|
|
12
|
+
.note { fill: #8B949E; font-size: 13.5px }
|
|
13
|
+
.rnd { fill: #B6BEC7; font-size: 12px; letter-spacing: .14em }
|
|
14
|
+
.foot { fill: #8B949E; font-size: 13.5px }
|
|
15
|
+
.cue { fill: #C8553D }
|
|
16
|
+
@media (prefers-color-scheme: dark) {
|
|
17
|
+
.hd { fill: #E6EDF3 }
|
|
18
|
+
.sub, .note, .foot { fill: #7D8590 }
|
|
19
|
+
.rule { stroke: #21262D }
|
|
20
|
+
.spine { stroke: #C9D1D9 }
|
|
21
|
+
.tick { stroke: #30363D }
|
|
22
|
+
.say { fill: #E0674C }
|
|
23
|
+
.obs { fill: #ADBAC7 }
|
|
24
|
+
.rnd { fill: #484F58 }
|
|
25
|
+
.cue { fill: #E0674C }
|
|
26
|
+
}
|
|
27
|
+
</style>
|
|
28
|
+
|
|
29
|
+
<text x="505" y="44" class="hd" text-anchor="end">ChatGPT 网页会话</text>
|
|
30
|
+
<text x="505" y="64" class="sub" text-anchor="end">控制器 — 规划、发令、审阅证据</text>
|
|
31
|
+
<text x="555" y="44" class="hd">你的机器</text>
|
|
32
|
+
<text x="555" y="64" class="sub">CueLine — 校验、路由、执行、记录</text>
|
|
33
|
+
|
|
34
|
+
<path d="M40 84H505" class="rule"/>
|
|
35
|
+
<path d="M555 84H960" class="rule"/>
|
|
36
|
+
<path d="M530 84V520" class="spine"/>
|
|
37
|
+
|
|
38
|
+
<text x="40" y="126" class="rnd">第 1 轮</text>
|
|
39
|
+
<path d="M505 122H524" class="tick"/>
|
|
40
|
+
<text x="555" y="126" class="obs">observation · 你的需求,尚无任何作业</text>
|
|
41
|
+
<path d="M524 118 517 122 524 126z" class="cue"/>
|
|
42
|
+
|
|
43
|
+
<path d="M536 158 545 162 536 166z" class="cue"/>
|
|
44
|
+
<text x="505" y="166" class="say" text-anchor="end">dispatch · review · lane default · advise</text>
|
|
45
|
+
<path d="M545 162H565" class="tick"/>
|
|
46
|
+
<text x="575" y="166" class="note">任何进程启动之前就先确定路由</text>
|
|
47
|
+
|
|
48
|
+
<text x="555" y="200" class="note">codex exec(只读)→ 成功 · 输出已保存</text>
|
|
49
|
+
|
|
50
|
+
<text x="40" y="264" class="rnd">第 2 轮</text>
|
|
51
|
+
<path d="M505 260H524" class="tick"/>
|
|
52
|
+
<text x="555" y="264" class="obs">observation · 证据原样回传</text>
|
|
53
|
+
<path d="M524 256 517 260 524 264z" class="cue"/>
|
|
54
|
+
|
|
55
|
+
<path d="M536 296 545 300 536 304z" class="cue"/>
|
|
56
|
+
<text x="505" y="304" class="say" text-anchor="end">dispatch · patch · mode work</text>
|
|
57
|
+
<path d="M545 300H565" class="tick"/>
|
|
58
|
+
<text x="575" y="304" class="note">argv[0] 必须事先被允许</text>
|
|
59
|
+
|
|
60
|
+
<text x="555" y="338" class="note">codex exec(workspace-write)→ 成功</text>
|
|
61
|
+
|
|
62
|
+
<text x="40" y="402" class="rnd">第 3 轮</text>
|
|
63
|
+
<path d="M505 398H524" class="tick"/>
|
|
64
|
+
<text x="555" y="402" class="obs">observation · 更新后的证据</text>
|
|
65
|
+
<path d="M524 394 517 398 524 402z" class="cue"/>
|
|
66
|
+
|
|
67
|
+
<path d="M536 434 545 438 536 442z" class="cue"/>
|
|
68
|
+
<text x="505" y="442" class="say" text-anchor="end">complete · final_delivery_text</text>
|
|
69
|
+
<path d="M545 438H565" class="tick"/>
|
|
70
|
+
<text x="575" y="442" class="note">原样返回给你</text>
|
|
71
|
+
|
|
72
|
+
<text x="555" y="476" class="note">本次运行封存 · events.jsonl 就是记录</text>
|
|
73
|
+
|
|
74
|
+
<path d="M40 520H960" class="rule"/>
|
|
75
|
+
<text x="40" y="546" class="foot">只有五个动作 — dispatch · wait · inspect · complete · blocked。</text>
|
|
76
|
+
<text x="40" y="568" class="foot">信封之外的文本一律不执行;worker 一旦启动就不会自动重试。</text>
|
|
77
|
+
</svg>
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1000 590" width="1000" height="590" role="img" aria-label="一次 CueLine 執行像一本提示本:機器送出觀測,主控端喊出一道指令,已註冊的 runner 執行它,直到主控端喊 complete。">
|
|
2
|
+
<title>一次 CueLine 執行,像讀一本提示本</title>
|
|
3
|
+
<style>
|
|
4
|
+
text { font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, "Noto Sans CJK TC", "PingFang TC", "Microsoft JhengHei", monospace }
|
|
5
|
+
.hd { fill: #0F1720; font-size: 17px; letter-spacing: .02em }
|
|
6
|
+
.sub { fill: #8B949E; font-size: 13.5px }
|
|
7
|
+
.rule { stroke: #E4E8EC; stroke-width: 1 }
|
|
8
|
+
.spine{ stroke: #0F1720; stroke-width: 2 }
|
|
9
|
+
.tick { stroke: #C3CAD2; stroke-width: 1 }
|
|
10
|
+
.say { fill: #C8553D; font-size: 15px }
|
|
11
|
+
.obs { fill: #4A5561; font-size: 15px }
|
|
12
|
+
.note { fill: #8B949E; font-size: 13.5px }
|
|
13
|
+
.rnd { fill: #B6BEC7; font-size: 12px; letter-spacing: .14em }
|
|
14
|
+
.foot { fill: #8B949E; font-size: 13.5px }
|
|
15
|
+
.cue { fill: #C8553D }
|
|
16
|
+
@media (prefers-color-scheme: dark) {
|
|
17
|
+
.hd { fill: #E6EDF3 }
|
|
18
|
+
.sub, .note, .foot { fill: #7D8590 }
|
|
19
|
+
.rule { stroke: #21262D }
|
|
20
|
+
.spine { stroke: #C9D1D9 }
|
|
21
|
+
.tick { stroke: #30363D }
|
|
22
|
+
.say { fill: #E0674C }
|
|
23
|
+
.obs { fill: #ADBAC7 }
|
|
24
|
+
.rnd { fill: #484F58 }
|
|
25
|
+
.cue { fill: #E0674C }
|
|
26
|
+
}
|
|
27
|
+
</style>
|
|
28
|
+
|
|
29
|
+
<text x="505" y="44" class="hd" text-anchor="end">ChatGPT 網頁對話</text>
|
|
30
|
+
<text x="505" y="64" class="sub" text-anchor="end">主控端 — 規劃、喊 cue、審查證據</text>
|
|
31
|
+
<text x="555" y="44" class="hd">你的機器</text>
|
|
32
|
+
<text x="555" y="64" class="sub">CueLine — 驗證、路由、執行、記錄</text>
|
|
33
|
+
|
|
34
|
+
<path d="M40 84H505" class="rule"/>
|
|
35
|
+
<path d="M555 84H960" class="rule"/>
|
|
36
|
+
<path d="M530 84V520" class="spine"/>
|
|
37
|
+
|
|
38
|
+
<text x="40" y="126" class="rnd">第 1 輪</text>
|
|
39
|
+
<path d="M505 122H524" class="tick"/>
|
|
40
|
+
<text x="555" y="126" class="obs">observation · 你的需求,還沒有任何工作</text>
|
|
41
|
+
<path d="M524 118 517 122 524 126z" class="cue"/>
|
|
42
|
+
|
|
43
|
+
<path d="M536 158 545 162 536 166z" class="cue"/>
|
|
44
|
+
<text x="505" y="166" class="say" text-anchor="end">dispatch · review · lane default · advise</text>
|
|
45
|
+
<path d="M545 162H565" class="tick"/>
|
|
46
|
+
<text x="575" y="166" class="note">任何程序啟動之前就先決定路由</text>
|
|
47
|
+
|
|
48
|
+
<text x="555" y="200" class="note">codex exec(唯讀)→ 成功 · 輸出已保存</text>
|
|
49
|
+
|
|
50
|
+
<text x="40" y="264" class="rnd">第 2 輪</text>
|
|
51
|
+
<path d="M505 260H524" class="tick"/>
|
|
52
|
+
<text x="555" y="264" class="obs">observation · 證據原樣送回</text>
|
|
53
|
+
<path d="M524 256 517 260 524 264z" class="cue"/>
|
|
54
|
+
|
|
55
|
+
<path d="M536 296 545 300 536 304z" class="cue"/>
|
|
56
|
+
<text x="505" y="304" class="say" text-anchor="end">dispatch · patch · mode work</text>
|
|
57
|
+
<path d="M545 300H565" class="tick"/>
|
|
58
|
+
<text x="575" y="304" class="note">argv[0] 必須事先被允許</text>
|
|
59
|
+
|
|
60
|
+
<text x="555" y="338" class="note">codex exec(workspace-write)→ 成功</text>
|
|
61
|
+
|
|
62
|
+
<text x="40" y="402" class="rnd">第 3 輪</text>
|
|
63
|
+
<path d="M505 398H524" class="tick"/>
|
|
64
|
+
<text x="555" y="402" class="obs">observation · 更新後的證據</text>
|
|
65
|
+
<path d="M524 394 517 398 524 402z" class="cue"/>
|
|
66
|
+
|
|
67
|
+
<path d="M536 434 545 438 536 442z" class="cue"/>
|
|
68
|
+
<text x="505" y="442" class="say" text-anchor="end">complete · final_delivery_text</text>
|
|
69
|
+
<path d="M545 438H565" class="tick"/>
|
|
70
|
+
<text x="575" y="442" class="note">原樣回傳給你</text>
|
|
71
|
+
|
|
72
|
+
<text x="555" y="476" class="note">本次執行封存 · events.jsonl 就是紀錄</text>
|
|
73
|
+
|
|
74
|
+
<path d="M40 520H960" class="rule"/>
|
|
75
|
+
<text x="40" y="546" class="foot">只有五個動作 — dispatch · wait · inspect · complete · blocked。</text>
|
|
76
|
+
<text x="40" y="568" class="foot">封包以外的文字一律不執行;工作行程一旦啟動就不會自動重試。</text>
|
|
77
|
+
</svg>
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 48 48" width="48" height="48" role="img" aria-label="CueLine">
|
|
2
|
+
<title>CueLine</title>
|
|
3
|
+
<g fill="none" stroke-linecap="butt">
|
|
4
|
+
<path d="M12 8V40" stroke="#E6EDF3" stroke-width="3"/>
|
|
5
|
+
<path d="M26 15H40" stroke="#8B949E" stroke-width="3"/>
|
|
6
|
+
<path d="M26 24H40" stroke="#E6EDF3" stroke-width="3"/>
|
|
7
|
+
<path d="M26 33H40" stroke="#8B949E" stroke-width="3"/>
|
|
8
|
+
</g>
|
|
9
|
+
<path d="M14 18.5 23 24l-9 5.5z" fill="#E0674C"/>
|
|
10
|
+
</svg>
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 48 48" width="48" height="48" role="img" aria-label="CueLine">
|
|
2
|
+
<title>CueLine</title>
|
|
3
|
+
<g fill="none" stroke-linecap="butt">
|
|
4
|
+
<path d="M12 8V40" stroke="#0F1720" stroke-width="3"/>
|
|
5
|
+
<path d="M26 15H40" stroke="#5B6672" stroke-width="3"/>
|
|
6
|
+
<path d="M26 24H40" stroke="#0F1720" stroke-width="3"/>
|
|
7
|
+
<path d="M26 33H40" stroke="#5B6672" stroke-width="3"/>
|
|
8
|
+
</g>
|
|
9
|
+
<path d="M14 18.5 23 24l-9 5.5z" fill="#C8553D"/>
|
|
10
|
+
</svg>
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 186 48" width="186" height="48" role="img" aria-label="CueLine">
|
|
2
|
+
<title>CueLine</title>
|
|
3
|
+
<g fill="none" stroke="#E6EDF3" stroke-width="3" stroke-linecap="butt" stroke-linejoin="miter">
|
|
4
|
+
<path d="M21.81 14.68A11.5 14.5 0 1 0 21.81 33.32"/>
|
|
5
|
+
<path d="M31.5 8V24A11.5 14.5 0 0 0 54.5 24V8"/>
|
|
6
|
+
<path d="M64.5 8V40"/>
|
|
7
|
+
<path d="M63 9.5H83"/>
|
|
8
|
+
<path d="M63 24H79"/>
|
|
9
|
+
<path d="M63 38.5H83"/>
|
|
10
|
+
<path d="M93.5 8V38.5"/>
|
|
11
|
+
<path d="M92 38.5H112"/>
|
|
12
|
+
<path d="M120.5 8V40"/>
|
|
13
|
+
<path d="M132.5 40V8L155.5 40V8"/>
|
|
14
|
+
<path d="M167.5 8V40"/>
|
|
15
|
+
<path d="M166 9.5H186"/>
|
|
16
|
+
<path d="M166 24H182"/>
|
|
17
|
+
<path d="M166 38.5H186"/>
|
|
18
|
+
</g>
|
|
19
|
+
</svg>
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 186 48" width="186" height="48" role="img" aria-label="CueLine">
|
|
2
|
+
<title>CueLine</title>
|
|
3
|
+
<g fill="none" stroke="#0F1720" stroke-width="3" stroke-linecap="butt" stroke-linejoin="miter">
|
|
4
|
+
<path d="M21.81 14.68A11.5 14.5 0 1 0 21.81 33.32"/>
|
|
5
|
+
<path d="M31.5 8V24A11.5 14.5 0 0 0 54.5 24V8"/>
|
|
6
|
+
<path d="M64.5 8V40"/>
|
|
7
|
+
<path d="M63 9.5H83"/>
|
|
8
|
+
<path d="M63 24H79"/>
|
|
9
|
+
<path d="M63 38.5H83"/>
|
|
10
|
+
<path d="M93.5 8V38.5"/>
|
|
11
|
+
<path d="M92 38.5H112"/>
|
|
12
|
+
<path d="M120.5 8V40"/>
|
|
13
|
+
<path d="M132.5 40V8L155.5 40V8"/>
|
|
14
|
+
<path d="M167.5 8V40"/>
|
|
15
|
+
<path d="M166 9.5H186"/>
|
|
16
|
+
<path d="M166 24H182"/>
|
|
17
|
+
<path d="M166 38.5H186"/>
|
|
18
|
+
</g>
|
|
19
|
+
</svg>
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
# Compatibility
|
|
2
|
+
|
|
3
|
+
## Runtime matrix
|
|
4
|
+
|
|
5
|
+
| Surface | v0.1 status | Notes |
|
|
6
|
+
|---|---|---|
|
|
7
|
+
| Node.js 22+ ESM | Supported | Core protocol, state, router, runners, fake browser tests |
|
|
8
|
+
| Codex Node REPL + built-in Browser (IAB) | Required for live control | Provides the imported API with the authenticated ChatGPT tab/browser client |
|
|
9
|
+
| `codex` CLI | Required by default route | Custom routing may register a different executable |
|
|
10
|
+
| ChatGPT web conversation | Supported, text only | Uses the model currently selected in the page |
|
|
11
|
+
| macOS | Primary supported desktop | Codex desktop + symlink installer target |
|
|
12
|
+
| Linux | Core/CI target | Live Codex IAB availability depends on the host product |
|
|
13
|
+
| Windows | Not verified | `install.sh` and symlink layout are not a Windows installer |
|
|
14
|
+
|
|
15
|
+
The npm package has no runtime dependencies. Development requires TypeScript and Node type definitions from `devDependencies`.
|
|
16
|
+
|
|
17
|
+
## ChatGPT requirements
|
|
18
|
+
|
|
19
|
+
CueLine is designed for a conversation already authenticated by the user at `chatgpt.com`, including a ChatGPT Pro account when Pro is the intended controller. CueLine neither handles credentials nor verifies plan entitlement. It does not switch models; the page's current selection is authoritative.
|
|
20
|
+
|
|
21
|
+
The v0.1 adapter relies on accessible textbox/button roles and assistant-message markup in the current ChatGPT web UI. UI changes can cause explicit `COMPOSER_MISSING`, `SEND_BUTTON_MISSING`, or response-timeout errors. A fake adapter test cannot prove that the current live page still matches.
|
|
22
|
+
|
|
23
|
+
## Supported in v0.1
|
|
24
|
+
|
|
25
|
+
- one ChatGPT conversation per run
|
|
26
|
+
- text controller observations and commands
|
|
27
|
+
- `dispatch`, `wait`, `inspect`, `complete`, and `blocked`
|
|
28
|
+
- foreground and background local jobs
|
|
29
|
+
- deterministic routing before spawn
|
|
30
|
+
- append-only run recovery and atomic snapshots
|
|
31
|
+
- continuation by run ID and stored conversation URL
|
|
32
|
+
- read-only persisted-state loading through `loadCueLineRunState`
|
|
33
|
+
- injected fake browser/runner for offline tests
|
|
34
|
+
|
|
35
|
+
## Not supported in v0.1
|
|
36
|
+
|
|
37
|
+
- automatic model selection or switching in ChatGPT
|
|
38
|
+
- images, screenshots as controller input, audio, or binary payloads
|
|
39
|
+
- file upload/download through the ChatGPT page
|
|
40
|
+
- Deep Research, Projects, Apps, or custom GPT UI flows
|
|
41
|
+
- multiple simultaneous controller conversations for one run
|
|
42
|
+
- direct browser-to-local tool calls
|
|
43
|
+
- automatic retry/fallback after a worker starts
|
|
44
|
+
- cross-host transfer of browser sessions, credentials, child processes, or local runtime state
|
|
45
|
+
- unattended guarantee across ChatGPT UI or authentication changes
|
|
46
|
+
|
|
47
|
+
## CLI boundary
|
|
48
|
+
|
|
49
|
+
`cueline doctor`, `routing`, `jobs`, and `config path` diagnose the local installation and state. They do not drive the ChatGPT page. Live orchestration is an imported API run inside Codex so that the IAB browser object can be injected or resolved.
|
|
50
|
+
|
|
51
|
+
## Live readiness checklist
|
|
52
|
+
|
|
53
|
+
1. `node --version` reports 22 or newer.
|
|
54
|
+
2. `npm run build` succeeds for a checkout, or the installed package contains `dist/`.
|
|
55
|
+
3. Codex exposes its built-in Browser runtime.
|
|
56
|
+
4. A logged-in `https://chatgpt.com/` tab is open and the intended model/conversation is selected.
|
|
57
|
+
5. `cueline doctor` reports a readable routing config and `codex-default` (or a configured alternative) as available.
|
|
58
|
+
6. A text-only live smoke completes one harmless controller round before using `work` mode.
|
|
59
|
+
|
|
60
|
+
Readiness does not prove a worker will succeed. Preserve the run evidence and report the exact missing prerequisite when a step fails.
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
# Controller protocol
|
|
2
|
+
|
|
3
|
+
CueLine `0.1` exchanges text messages with one ChatGPT web conversation. Each outbound prompt contains a `<CueLineObservation>` JSON document. The controller must answer with exactly one usable command in a complete `<CueLineControl>` envelope.
|
|
4
|
+
|
|
5
|
+
## Identity
|
|
6
|
+
|
|
7
|
+
Every command must echo these values from the pending observation:
|
|
8
|
+
|
|
9
|
+
- `protocol`: `cueline/0.1`
|
|
10
|
+
- `run_id`: the current persisted run
|
|
11
|
+
- `round`: the current controller round
|
|
12
|
+
- `request_id`: the deterministic identity of this observation
|
|
13
|
+
|
|
14
|
+
A stale or mismatched value is rejected. CueLine parses only the **last complete** control envelope, which prevents an older example earlier in the assistant response from winning.
|
|
15
|
+
|
|
16
|
+
## Observation
|
|
17
|
+
|
|
18
|
+
```json
|
|
19
|
+
{
|
|
20
|
+
"protocol": "cueline/0.1",
|
|
21
|
+
"run_id": "run-example",
|
|
22
|
+
"round": 2,
|
|
23
|
+
"request_id": "msg-example",
|
|
24
|
+
"user_request": "Review the repository and recommend the next change.",
|
|
25
|
+
"jobs": [
|
|
26
|
+
{
|
|
27
|
+
"job_id": "job-example",
|
|
28
|
+
"job_key": "review",
|
|
29
|
+
"required": true,
|
|
30
|
+
"status": "succeeded",
|
|
31
|
+
"output": "Review evidence"
|
|
32
|
+
}
|
|
33
|
+
],
|
|
34
|
+
"notices": []
|
|
35
|
+
}
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
Job states are `pending`, `running`, `succeeded`, `failed`, `timed_out`, or `ambiguous`. Before browser submission, a single output/error field is bounded to 40,000 characters and only the most recent 20 notices are sent. The local event log remains the recovery record.
|
|
39
|
+
|
|
40
|
+
## Command envelope
|
|
41
|
+
|
|
42
|
+
```text
|
|
43
|
+
<CueLineControl>
|
|
44
|
+
{
|
|
45
|
+
"protocol": "cueline/0.1",
|
|
46
|
+
"run_id": "run-example",
|
|
47
|
+
"round": 2,
|
|
48
|
+
"request_id": "msg-example",
|
|
49
|
+
"action": "complete",
|
|
50
|
+
"final_delivery_text": "The review is complete."
|
|
51
|
+
}
|
|
52
|
+
</CueLineControl>
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
Text outside the envelope is not executed. CueLine does not request or consume private chain-of-thought; concise user-facing rationale may stay outside the envelope.
|
|
56
|
+
|
|
57
|
+
## Actions
|
|
58
|
+
|
|
59
|
+
### `dispatch`
|
|
60
|
+
|
|
61
|
+
Schedules one or more local jobs.
|
|
62
|
+
|
|
63
|
+
```json
|
|
64
|
+
{
|
|
65
|
+
"protocol": "cueline/0.1",
|
|
66
|
+
"run_id": "run-example",
|
|
67
|
+
"round": 1,
|
|
68
|
+
"request_id": "msg-example",
|
|
69
|
+
"action": "dispatch",
|
|
70
|
+
"jobs": [
|
|
71
|
+
{
|
|
72
|
+
"job_key": "architecture-review",
|
|
73
|
+
"lane": "default",
|
|
74
|
+
"mode": "advise",
|
|
75
|
+
"task": "Read the supplied repository evidence and propose a plan.",
|
|
76
|
+
"required": true,
|
|
77
|
+
"timeout_ms": 120000,
|
|
78
|
+
"background": false
|
|
79
|
+
}
|
|
80
|
+
]
|
|
81
|
+
}
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
`job_key` must be unique inside the command and match the supported identifier form. `mode` is `advise` or `work`. Optional fields are `required`, `timeout_ms`, `runner`, `workdir`, and `background`. The local runtime—not ChatGPT—resolves the configured executable. When `runner` is supplied, it must name an enabled, available candidate in the selected lane. Repeating an already persisted deterministic job is ignored rather than spawned again.
|
|
85
|
+
|
|
86
|
+
### `wait`
|
|
87
|
+
|
|
88
|
+
Waits for selected running jobs (`job_ids`) or all current running jobs when omitted. `wait_ms` is part of the v0.1 schema but does not override the supervisor's job timeout.
|
|
89
|
+
|
|
90
|
+
### `inspect`
|
|
91
|
+
|
|
92
|
+
Asks CueLine to present the currently persisted job state on the next round. It does not grant the web controller a new local inspection tool.
|
|
93
|
+
|
|
94
|
+
### `complete`
|
|
95
|
+
|
|
96
|
+
Ends the run with non-empty `final_delivery_text`. Completion is rejected while any required job remains `pending` or `running`; the controller receives a notice and must decide again. Completed required jobs may have failed—the controller is responsible for judging that evidence.
|
|
97
|
+
|
|
98
|
+
### `blocked`
|
|
99
|
+
|
|
100
|
+
Ends the run with a non-empty `reason` and optional `final_delivery_text`. This is a terminal, explicit statement that the controller cannot responsibly proceed with the available evidence or authority.
|
|
101
|
+
|
|
102
|
+
## Validation and repair
|
|
103
|
+
|
|
104
|
+
CueLine rejects missing markers, malformed JSON, invalid actions, stale identity, invalid supported-field values, and duplicate `job_key` values with stable error codes. Only the supported fields retained by runtime validation can affect execution. CueLine then sends a validation error back to the same conversation with the same pending identity. By default, two repair attempts are allowed; exhaustion fails the local run rather than guessing a command.
|
|
105
|
+
|
|
106
|
+
The JSON Schema files under `schemas/` are publication references. Runtime structural validation is implemented locally and does not require a schema package.
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
# Provenance
|
|
2
|
+
|
|
3
|
+
CueLine is a new implementation combining two ideas behind one public API:
|
|
4
|
+
|
|
5
|
+
- A deterministic lane router inspired by Omnilane's candidate chains and pre-spawn availability checks.
|
|
6
|
+
- A text-only ChatGPT web controller adapter informed by GPT Relay's observed browser behavior.
|
|
7
|
+
|
|
8
|
+
No CueLine runtime module imports either project. No browser cookies, local credentials, provider sessions, or machine-specific state are included in this repository.
|
|
9
|
+
|
|
10
|
+
The initial architecture was reviewed through a ChatGPT Pro conversation. That review recommended a TypeScript state-machine core, append-only events, deterministic identifiers, explicit controller envelopes, and no automatic worker fallback after execution starts.
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
# Runner contract
|
|
2
|
+
|
|
3
|
+
## Routing happens before spawn
|
|
4
|
+
|
|
5
|
+
A controller job names a lane, not arbitrary shell text. CueLine loads an enabled lane and examines candidates in configured order. Disabled or unavailable candidates are skipped before execution. The first available candidate becomes the resolved route.
|
|
6
|
+
|
|
7
|
+
Once its process starts, the selection is final. A failure, timeout, empty result, or ambiguous side effect is returned to the controller; CueLine does not silently try the next candidate.
|
|
8
|
+
|
|
9
|
+
## Registered executable boundary
|
|
10
|
+
|
|
11
|
+
Every process uses a `RunnerSpec`:
|
|
12
|
+
|
|
13
|
+
```ts
|
|
14
|
+
interface RunnerSpec {
|
|
15
|
+
jobId: string;
|
|
16
|
+
argv: readonly string[];
|
|
17
|
+
stdin?: string;
|
|
18
|
+
mode: "advise" | "work";
|
|
19
|
+
timeoutMs: number;
|
|
20
|
+
background?: boolean;
|
|
21
|
+
lane?: string;
|
|
22
|
+
task?: string;
|
|
23
|
+
cwd?: string;
|
|
24
|
+
env?: NodeJS.ProcessEnv;
|
|
25
|
+
}
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
`argv[0]` must exactly match an executable registered from the loaded routing config. A route explicitly chooses task input through a `{task}` argv placeholder or stdin; materialization rejects a missing or duplicate placement. Other supported placeholders are expanded as individual argv elements before spawn. CueLine invokes Node's process API with `shell: false`; it does not concatenate controller text into a shell command. Registration is an allow-list, not a sandbox: the registered program still has the OS permissions of the local CueLine process.
|
|
29
|
+
|
|
30
|
+
## Execution semantics
|
|
31
|
+
|
|
32
|
+
- `CUELINE_DEPTH=1` is injected into the child.
|
|
33
|
+
- A pre-existing `CUELINE_DEPTH` in the process or job environment rejects nested routing.
|
|
34
|
+
- Standard input is closed unless the route explicitly selects stdin task input; stdout and stderr are captured as UTF-8 text.
|
|
35
|
+
- The effective output is stdout, stderr, or both in that order.
|
|
36
|
+
- Exit code 0 is `succeeded`; a non-zero exit or spawn error is `failed`.
|
|
37
|
+
- At timeout CueLine sends `SIGTERM`, then schedules `SIGKILL` after 250 ms if needed; the result is `timed_out`.
|
|
38
|
+
- Empty output is explicitly recorded instead of being replaced with invented content.
|
|
39
|
+
- Results are never marked retryable by the process runner.
|
|
40
|
+
|
|
41
|
+
For an unsuccessful `work` job, `ambiguousSideEffects` is true because CueLine cannot prove how much mutation occurred before failure. That flag is preserved in the job result. Such work must be inspected and explicitly decided by the web controller; it must not be auto-retried.
|
|
42
|
+
|
|
43
|
+
## Foreground and background
|
|
44
|
+
|
|
45
|
+
A foreground `start` waits for the single execution and persists its terminal status. A background `start` persists and returns `running` immediately while the same completion promise continues. `waitForCompletion(jobId)` returns that completion or the last persisted status.
|
|
46
|
+
|
|
47
|
+
The controller loop derives deterministic job IDs from the run, `job_key`, and job specification. A duplicate dispatch already present in run state is recorded as a notice and skipped. This is the run-level at-most-once gate; it is not a distributed transaction across hosts.
|
|
48
|
+
|
|
49
|
+
## Availability
|
|
50
|
+
|
|
51
|
+
Candidate availability is evaluated locally through an injected function/checker or candidate-ID map. Availability means only that the runtime has accepted the candidate before spawn. It does not guarantee that credentials, network services, model quotas, or the target worker will remain healthy after start.
|
|
52
|
+
|
|
53
|
+
## Side-effect policy
|
|
54
|
+
|
|
55
|
+
Use `advise` for analysis that should not mutate the target. Use `work` only when the user request authorizes local changes and the selected worker has a suitable work directory. CueLine does not broaden permissions from `advise` to `work`, publish externally, or grant browser ChatGPT direct machine access.
|
|
56
|
+
|
|
57
|
+
The controller chooses the intent; Codex and local runtime policy remain responsible for whether that intent is authorized and executable.
|
|
58
|
+
|
|
59
|
+
## Bundled default
|
|
60
|
+
|
|
61
|
+
The `default` lane contains one candidate, `codex-default`. It runs `codex exec` without a shell, sends the task over stdin, uses the requested work directory, and maps `advise` to `read-only` and `work` to `workspace-write`. The default route is unavailable when the `codex` executable is not on `PATH`; CueLine reports that fact instead of selecting an unrelated worker.
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
# State and recovery
|
|
2
|
+
|
|
3
|
+
## Default layout
|
|
4
|
+
|
|
5
|
+
CueLine state defaults to:
|
|
6
|
+
|
|
7
|
+
```text
|
|
8
|
+
${CUELINE_HOME:-$HOME/.cueline}/
|
|
9
|
+
├── runs/
|
|
10
|
+
│ └── <run-id>/
|
|
11
|
+
│ ├── events.jsonl
|
|
12
|
+
│ └── snapshot.json
|
|
13
|
+
└── jobs/
|
|
14
|
+
└── <job-id>.json
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
`CUELINE_HOME` accepts an absolute or relative path. `~` and `~/...` are expanded against `HOME`. Run and job IDs are validated before they are used in filesystem paths.
|
|
18
|
+
|
|
19
|
+
## Event log
|
|
20
|
+
|
|
21
|
+
`events.jsonl` is append-only and authoritative. Each line contains a monotonically increasing sequence number, timestamp, event type, and payload. The writer opens the file with owner-only mode when creating it and calls `sync` after every append.
|
|
22
|
+
|
|
23
|
+
Important transitions include:
|
|
24
|
+
|
|
25
|
+
- run creation and resumption
|
|
26
|
+
- controller turn intent, response, rejection, and accepted command
|
|
27
|
+
- job registration and status changes
|
|
28
|
+
- notices
|
|
29
|
+
- complete, blocked, and failed terminal records
|
|
30
|
+
|
|
31
|
+
The controller turn is recorded before sending it through the browser, and a job is registered before its process starts. This ordering leaves evidence when an interruption occurs between intent and side effect.
|
|
32
|
+
|
|
33
|
+
## Snapshot
|
|
34
|
+
|
|
35
|
+
`snapshot.json` is a materialized view of the event stream. CueLine writes a temporary file in the same directory and renames it over the destination. A snapshot records its state protocol, run ID, and last applied sequence.
|
|
36
|
+
|
|
37
|
+
On load, CueLine uses a snapshot only when its identity and sequence are valid. A missing, malformed, or out-of-range snapshot is ignored and the state is replayed from event 1. Events newer than a valid snapshot are applied afterward.
|
|
38
|
+
|
|
39
|
+
The snapshot is therefore disposable. Do not edit the event log by hand; invalid JSON or a broken sequence makes the run unreplayable and is reported rather than silently skipped.
|
|
40
|
+
|
|
41
|
+
## Job status
|
|
42
|
+
|
|
43
|
+
The supervisor atomically replaces one JSON file per job. Foreground work returns its terminal status directly. Background work first persists `running`; later `wait` reads the same in-process completion or the last persisted status.
|
|
44
|
+
|
|
45
|
+
The run event log still records the controller-visible job transitions. A status file is execution evidence, not a substitute for the run history.
|
|
46
|
+
|
|
47
|
+
## Continue behavior
|
|
48
|
+
|
|
49
|
+
`continueCueLineRun` loads the exact `runId`, replays state as needed, and resumes the next controller round in the same persisted run. The public runtime also reuses the stored ChatGPT conversation URL unless an explicit compatible adapter is supplied.
|
|
50
|
+
|
|
51
|
+
- `complete` and `blocked` runs are returned as-is; they are not dispatched again.
|
|
52
|
+
- a non-terminal or locally `failed` run can be marked resumed and driven for additional rounds
|
|
53
|
+
- deterministic job IDs suppress a repeated dispatch already present in state
|
|
54
|
+
- running jobs can be observed or waited through their persisted status
|
|
55
|
+
|
|
56
|
+
Continuation cannot reconstruct an expired ChatGPT login, a deleted conversation, an unavailable registered executable, or an in-memory child process that disappeared with the host process. In those cases CueLine reports the concrete failure; it does not fabricate completion.
|
|
57
|
+
|
|
58
|
+
## Recovery procedure
|
|
59
|
+
|
|
60
|
+
1. Preserve `CUELINE_HOME`; do not delete the run directory.
|
|
61
|
+
2. Record the `runId` from the earlier result or directory name.
|
|
62
|
+
3. Restore access to the same ChatGPT conversation in Codex's built-in Browser.
|
|
63
|
+
4. Restore any locally required executable/configuration without copying browser credentials.
|
|
64
|
+
5. Call `continueCueLineRun({ runId, ... })`.
|
|
65
|
+
6. Treat the new terminal result as valid only after its event and job evidence is present.
|
|
66
|
+
|
|
67
|
+
For manual diagnosis, use `cueline jobs` and inspect the run's JSONL as read-only evidence. Do not copy `CUELINE_HOME` between machines as a replacement for local process or browser session state.
|