otacon 0.1.3 → 0.1.4
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/README.md +18 -5
- package/dist/cli/browser.js +1 -1
- package/dist/cli/browser.js.map +1 -1
- package/dist/cli/client.js +3 -3
- package/dist/cli/client.js.map +1 -1
- package/dist/cli/commands/answer.js +1 -1
- package/dist/cli/commands/answer.js.map +1 -1
- package/dist/cli/commands/ask.js +3 -3
- package/dist/cli/commands/ask.js.map +1 -1
- package/dist/cli/commands/clean.js +14 -16
- package/dist/cli/commands/clean.js.map +1 -1
- package/dist/cli/commands/config.js +1 -1
- package/dist/cli/commands/config.js.map +1 -1
- package/dist/cli/commands/doctor.js +4 -4
- package/dist/cli/commands/doctor.js.map +1 -1
- package/dist/cli/commands/expose.js +7 -7
- package/dist/cli/commands/expose.js.map +1 -1
- package/dist/cli/commands/implement-done.js +1 -1
- package/dist/cli/commands/implement-done.js.map +1 -1
- package/dist/cli/commands/install.js +16 -10
- package/dist/cli/commands/install.js.map +1 -1
- package/dist/cli/commands/open.js +31 -7
- package/dist/cli/commands/open.js.map +1 -1
- package/dist/cli/commands/progress.js +1 -1
- package/dist/cli/commands/progress.js.map +1 -1
- package/dist/cli/commands/resume.js +67 -0
- package/dist/cli/commands/resume.js.map +1 -0
- package/dist/cli/commands/start.js +18 -4
- package/dist/cli/commands/start.js.map +1 -1
- package/dist/cli/commands/status.js +15 -4
- package/dist/cli/commands/status.js.map +1 -1
- package/dist/cli/commands/submit.js +5 -5
- package/dist/cli/commands/submit.js.map +1 -1
- package/dist/cli/commands/update.js +24 -17
- package/dist/cli/commands/update.js.map +1 -1
- package/dist/cli/commands/wait.js +1 -1
- package/dist/cli/commands/wait.js.map +1 -1
- package/dist/cli/install/assets.js +123 -48
- package/dist/cli/install/assets.js.map +1 -1
- package/dist/cli/install/locations.js +1 -1
- package/dist/cli/install/locations.js.map +1 -1
- package/dist/cli/install/tailscale.js +2 -2
- package/dist/cli/install/tailscale.js.map +1 -1
- package/dist/cli/install/wrapper.js +202 -0
- package/dist/cli/install/wrapper.js.map +1 -0
- package/dist/cli/main.js +5 -2
- package/dist/cli/main.js.map +1 -1
- package/dist/cli/output.js +2 -2
- package/dist/cli/output.js.map +1 -1
- package/dist/cli/session.js +18 -7
- package/dist/cli/session.js.map +1 -1
- package/dist/cli/update.js +79 -38
- package/dist/cli/update.js.map +1 -1
- package/dist/daemon/activity.js +1 -1
- package/dist/daemon/activity.js.map +1 -1
- package/dist/daemon/anchor.js +1 -1
- package/dist/daemon/anchor.js.map +1 -1
- package/dist/daemon/app.js +370 -82
- package/dist/daemon/app.js.map +1 -1
- package/dist/daemon/approve.js +3 -3
- package/dist/daemon/approve.js.map +1 -1
- package/dist/daemon/capture/adapter.js +23 -0
- package/dist/daemon/capture/adapter.js.map +1 -0
- package/dist/daemon/capture/claude.js +274 -0
- package/dist/daemon/capture/claude.js.map +1 -0
- package/dist/daemon/capture/codex.js +413 -0
- package/dist/daemon/capture/codex.js.map +1 -0
- package/dist/daemon/capture/normalize.js +89 -0
- package/dist/daemon/capture/normalize.js.map +1 -0
- package/dist/daemon/capture/opencode.js +330 -0
- package/dist/daemon/capture/opencode.js.map +1 -0
- package/dist/daemon/capture/registry.js +33 -0
- package/dist/daemon/capture/registry.js.map +1 -0
- package/dist/daemon/capture/stream-store.js +121 -0
- package/dist/daemon/capture/stream-store.js.map +1 -0
- package/dist/daemon/capture/tailer.js +108 -0
- package/dist/daemon/capture/tailer.js.map +1 -0
- package/dist/daemon/desktop-notify.js +11 -5
- package/dist/daemon/desktop-notify.js.map +1 -1
- package/dist/daemon/diagrams.js +90 -0
- package/dist/daemon/diagrams.js.map +1 -0
- package/dist/daemon/diff.js +1 -2
- package/dist/daemon/diff.js.map +1 -1
- package/dist/daemon/linter/parse.js +45 -12
- package/dist/daemon/linter/parse.js.map +1 -1
- package/dist/daemon/linter/rules.js +20 -17
- package/dist/daemon/linter/rules.js.map +1 -1
- package/dist/daemon/main.js +1 -1
- package/dist/daemon/main.js.map +1 -1
- package/dist/daemon/notify.js +1 -1
- package/dist/daemon/notify.js.map +1 -1
- package/dist/daemon/presence.js +1 -1
- package/dist/daemon/presence.js.map +1 -1
- package/dist/daemon/queue.js +7 -7
- package/dist/daemon/queue.js.map +1 -1
- package/dist/daemon/store.js +66 -79
- package/dist/daemon/store.js.map +1 -1
- package/dist/daemon/threads.js +111 -25
- package/dist/daemon/threads.js.map +1 -1
- package/dist/daemon/transcript.js +1 -1
- package/dist/daemon/transcript.js.map +1 -1
- package/dist/daemon/ui.js +8 -6
- package/dist/daemon/ui.js.map +1 -1
- package/dist/daemon/viewers.js +37 -0
- package/dist/daemon/viewers.js.map +1 -0
- package/dist/shared/config.js +42 -8
- package/dist/shared/config.js.map +1 -1
- package/dist/shared/gwt.js +1 -1
- package/dist/shared/gwt.js.map +1 -1
- package/dist/shared/paths.js +63 -36
- package/dist/shared/paths.js.map +1 -1
- package/dist/shared/question-spec.js +1 -1
- package/dist/shared/question-spec.js.map +1 -1
- package/dist/shared/types.js +7 -3
- package/dist/shared/types.js.map +1 -1
- package/dist/shared/version.js +1 -1
- package/dist/skills/otacon/SKILL.md +250 -0
- package/dist/ui/assets/{arc-Cp3sPd_U.js → arc-BUR2DxNA.js} +1 -1
- package/dist/ui/assets/architecture-7EHR7CIX-TTokq2IO.js +1 -0
- package/dist/ui/assets/{architectureDiagram-3BPJPVTR-C4F3heWP.js → architectureDiagram-3BPJPVTR-unLnkDyM.js} +1 -1
- package/dist/ui/assets/{blockDiagram-GPEHLZMM-DmJoG8ky.js → blockDiagram-GPEHLZMM-DHx8lNeL.js} +1 -1
- package/dist/ui/assets/{c4Diagram-AAUBKEIU-BDEf52Jp.js → c4Diagram-AAUBKEIU-BU9T562l.js} +1 -1
- package/dist/ui/assets/channel-BA6ChrT3.js +1 -0
- package/dist/ui/assets/{chunk-2J33WTMH-Dh_UFriv.js → chunk-2J33WTMH-BEb0myVl.js} +1 -1
- package/dist/ui/assets/{chunk-3OPIFGDE-c66RlAN8.js → chunk-3OPIFGDE-DESBG_RB.js} +1 -1
- package/dist/ui/assets/{chunk-4BX2VUAB-CrGJaCCg.js → chunk-4BX2VUAB-dt3F_E_5.js} +1 -1
- package/dist/ui/assets/{chunk-55IACEB6-BvwqEeyq.js → chunk-55IACEB6-BcyuZM7U.js} +1 -1
- package/dist/ui/assets/{chunk-5ZQYHXKU-BfF2IfQe.js → chunk-5ZQYHXKU-DqdwSJlO.js} +1 -1
- package/dist/ui/assets/{chunk-727SXJPM-DOEUwc9I.js → chunk-727SXJPM-B04SqNWj.js} +1 -1
- package/dist/ui/assets/{chunk-AQP2D5EJ-CVf2xV2Z.js → chunk-AQP2D5EJ-DpjCPBWN.js} +1 -1
- package/dist/ui/assets/{chunk-BSJP7CBP-D_EbTWTC.js → chunk-BSJP7CBP-BNOU3k5G.js} +1 -1
- package/dist/ui/assets/{chunk-CSCIHK7Q-CkxTSMAM.js → chunk-CSCIHK7Q-iWOtNZm_.js} +1 -1
- package/dist/ui/assets/{chunk-FMBD7UC4-DVShhFc7.js → chunk-FMBD7UC4-BHH_etky.js} +1 -1
- package/dist/ui/assets/{chunk-KSCS5N6A-DnHEEYpq.js → chunk-KSCS5N6A-DbRuazP3.js} +1 -1
- package/dist/ui/assets/{chunk-L5ZTLDWV-B_gjyajS.js → chunk-L5ZTLDWV-B2ZZFONi.js} +1 -1
- package/dist/ui/assets/{chunk-LZXEDZCA-Bsf7basG.js → chunk-LZXEDZCA-DryVpwAh.js} +2 -2
- package/dist/ui/assets/{chunk-ND2GUHAM-DGepGb8_.js → chunk-ND2GUHAM-2Bb1izqg.js} +1 -1
- package/dist/ui/assets/{chunk-NZK2D7GU-BJIlh-gB.js → chunk-NZK2D7GU-2DhvLbqL.js} +1 -1
- package/dist/ui/assets/{chunk-O5CBEL6O-cdVbOOCs.js → chunk-O5CBEL6O-B5oigO7D.js} +1 -1
- package/dist/ui/assets/chunk-QZHKN3VN-BDHgdxoT.js +1 -0
- package/dist/ui/assets/chunk-WU5MYG2G-FDJTP_wT.js +1 -0
- package/dist/ui/assets/{chunk-XPW4576I-DPW39hNO.js → chunk-XPW4576I-Dmq-O7bc.js} +1 -1
- package/dist/ui/assets/classDiagram-4FO5ZUOK-B5kZsiIt.js +1 -0
- package/dist/ui/assets/classDiagram-v2-Q7XG4LA2-B5kZsiIt.js +1 -0
- package/dist/ui/assets/{cose-bilkent-S5V4N54A-DmMsC6om.js → cose-bilkent-S5V4N54A-oTsqU1DY.js} +1 -1
- package/dist/ui/assets/{dagre-BM42HDAG-BmVr7T7Z.js → dagre-BM42HDAG-CZykCU6B.js} +1 -1
- package/dist/ui/assets/{diagram-2AECGRRQ-e0VnXEyj.js → diagram-2AECGRRQ-BY7clIlO.js} +1 -1
- package/dist/ui/assets/{diagram-5GNKFQAL-SCJGYE6m.js → diagram-5GNKFQAL-BWdq4hV0.js} +1 -1
- package/dist/ui/assets/{diagram-KO2AKTUF-DDUZO1Mj.js → diagram-KO2AKTUF-CCGEaiZg.js} +1 -1
- package/dist/ui/assets/{diagram-LMA3HP47-5x1ypf6a.js → diagram-LMA3HP47-CVkepFYU.js} +1 -1
- package/dist/ui/assets/{diagram-OG6HWLK6-3nDhrQ20.js → diagram-OG6HWLK6-f-NjsfLG.js} +1 -1
- package/dist/ui/assets/{dist-NEinnePC.js → dist-ZqsueX9_.js} +1 -1
- package/dist/ui/assets/{erDiagram-TEJ5UH35-BNvwSDNZ.js → erDiagram-TEJ5UH35-D8Wn6QP3.js} +1 -1
- package/dist/ui/assets/eventmodeling-FCH6USID-BODDoY6e.js +1 -0
- package/dist/ui/assets/{flowDiagram-I6XJVG4X-Bt_wDUhb.js → flowDiagram-I6XJVG4X-BYnhla9k.js} +1 -1
- package/dist/ui/assets/{ganttDiagram-6RSMTGT7-DVcJ0rNX.js → ganttDiagram-6RSMTGT7-Dpu52ZRF.js} +1 -1
- package/dist/ui/assets/{gitGraph-WXDBUCRP-CO_SyAgP.js → gitGraph-WXDBUCRP-ou8xzQe1.js} +1 -1
- package/dist/ui/assets/{gitGraphDiagram-PVQCEYII-oDyO3lWI.js → gitGraphDiagram-PVQCEYII-BnTuFH7F.js} +1 -1
- package/dist/ui/assets/index-B2mL0c61.js +11 -0
- package/dist/ui/assets/index-sZ1TgAvb.css +1 -0
- package/dist/ui/assets/{info-J43DQDTF-Bn17NS7h.js → info-J43DQDTF-xgUHa7k0.js} +1 -1
- package/dist/ui/assets/{infoDiagram-5YYISTIA-HG1opLLT.js → infoDiagram-5YYISTIA-DJBudrwD.js} +1 -1
- package/dist/ui/assets/{ishikawaDiagram-YF4QCWOH-Di_yQwi8.js → ishikawaDiagram-YF4QCWOH-DpFHgERI.js} +1 -1
- package/dist/ui/assets/{journeyDiagram-JHISSGLW-DZtHvLeE.js → journeyDiagram-JHISSGLW-Cd32hdpY.js} +1 -1
- package/dist/ui/assets/{kanban-definition-UN3LZRKU-B_RCx3Km.js → kanban-definition-UN3LZRKU-Dm1V8lr0.js} +1 -1
- package/dist/ui/assets/{line-DenX-zXQ.js → line-CZu6_PMX.js} +1 -1
- package/dist/ui/assets/{linear-dly_ngoq.js → linear-2tkTX_U2.js} +1 -1
- package/dist/ui/assets/{mermaid-parser.core-CRmtm0s9.js → mermaid-parser.core-C4m04cRe.js} +2 -2
- package/dist/ui/assets/{mermaid.core-C_3KVfpx.js → mermaid.core-BPeg1ewg.js} +3 -3
- package/dist/ui/assets/{mindmap-definition-RKZ34NQL-wdzSyYO6.js → mindmap-definition-RKZ34NQL-BENqEkIK.js} +1 -1
- package/dist/ui/assets/{packet-YPE3B663-tUyFmR11.js → packet-YPE3B663-DNO0oBLH.js} +1 -1
- package/dist/ui/assets/{pie-LRSECV5Y-Cel48VVp.js → pie-LRSECV5Y-CWoz31oB.js} +1 -1
- package/dist/ui/assets/{pieDiagram-4H26LBE5-B55ypWtu.js → pieDiagram-4H26LBE5-CtmxhUGI.js} +1 -1
- package/dist/ui/assets/{plan-view-CMoo3_gE.js → plan-view-bZtdFbit.js} +4 -4
- package/dist/ui/assets/{quadrantDiagram-W4KKPZXB-9WcKQV0a.js → quadrantDiagram-W4KKPZXB-BO3IZNbx.js} +1 -1
- package/dist/ui/assets/{radar-GUYGQ44K-w5pk53Vr.js → radar-GUYGQ44K-AEfROz99.js} +1 -1
- package/dist/ui/assets/{requirementDiagram-4Y6WPE33-CzE82fXz.js → requirementDiagram-4Y6WPE33-D-wQ1szT.js} +1 -1
- package/dist/ui/assets/{sankeyDiagram-5OEKKPKP-DSGO39je.js → sankeyDiagram-5OEKKPKP-Bj4kD_AJ.js} +1 -1
- package/dist/ui/assets/{sequenceDiagram-3UESZ5HK-BKSDDr0S.js → sequenceDiagram-3UESZ5HK-M8QVVH74.js} +1 -1
- package/dist/ui/assets/{src-JXBGgRt-.js → src-DvptJAGq.js} +1 -1
- package/dist/ui/assets/{stateDiagram-AJRCARHV-DZHYA9aj.js → stateDiagram-AJRCARHV-BiPRs9rN.js} +1 -1
- package/dist/ui/assets/stateDiagram-v2-BHNVJYJU-BYjicZlC.js +1 -0
- package/dist/ui/assets/{timeline-definition-PNZ67QCA-WqJFw7aE.js → timeline-definition-PNZ67QCA-DS0AGRKw.js} +1 -1
- package/dist/ui/assets/{treeView-BLDUP644-DoIQYMiz.js → treeView-BLDUP644-DJakvUbF.js} +1 -1
- package/dist/ui/assets/{treemap-LRROVOQU-BA9si_Mo.js → treemap-LRROVOQU-QXfc2Vwr.js} +1 -1
- package/dist/ui/assets/{vennDiagram-CIIHVFJN-BvWRUfFr.js → vennDiagram-CIIHVFJN-CBdJA0hv.js} +1 -1
- package/dist/ui/assets/{wardley-L42UT6IY-Cf9PU44t.js → wardley-L42UT6IY-DI9SdW45.js} +1 -1
- package/dist/ui/assets/{wardleyDiagram-YWT4CUSO-CGuxl7AU.js → wardleyDiagram-YWT4CUSO-RMmsKLRe.js} +1 -1
- package/dist/ui/assets/{xychartDiagram-2RQKCTM6-CNteNXpe.js → xychartDiagram-2RQKCTM6-DFXccP8B.js} +1 -1
- package/dist/ui/index.html +2 -2
- package/package.json +7 -5
- package/dist/ui/assets/architecture-7EHR7CIX-BbwstElO.js +0 -1
- package/dist/ui/assets/channel-BMK3JFRf.js +0 -1
- package/dist/ui/assets/chunk-QZHKN3VN-DLNUTn7U.js +0 -1
- package/dist/ui/assets/chunk-WU5MYG2G-ipH3YPcA.js +0 -1
- package/dist/ui/assets/classDiagram-4FO5ZUOK-CvIMLlSD.js +0 -1
- package/dist/ui/assets/classDiagram-v2-Q7XG4LA2-CvIMLlSD.js +0 -1
- package/dist/ui/assets/eventmodeling-FCH6USID-BeFWDbla.js +0 -1
- package/dist/ui/assets/index-CJJIQ0dr.css +0 -1
- package/dist/ui/assets/index-Dh5CsH24.js +0 -11
- package/dist/ui/assets/stateDiagram-v2-BHNVJYJU-DnAfDlvZ.js +0 -1
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
// otacon resume [--session id]: reopen a finished otacon session to amend its
|
|
2
|
+
// approved plan. Run from inside an Implement build worktree, it auto-detects
|
|
3
|
+
// the session that worktree belongs to (the recorded `impl.worktree`) and flips
|
|
4
|
+
// it back to `revising`, so a later `/otacon <request>` amends the same plan in
|
|
5
|
+
// place instead of spawning a second worktree. `--session` names one explicitly.
|
|
6
|
+
//
|
|
7
|
+
// The session must be terminal (a finished build, or approved): a non-terminal
|
|
8
|
+
// session surfaces the daemon's E_NOT_REOPENABLE as a clear CLI failure, not a
|
|
9
|
+
// crash (symmetrical with how the other mutating verbs translate a 409).
|
|
10
|
+
import { parseArgs } from "node:util";
|
|
11
|
+
import { planPath } from "../../shared/paths.js";
|
|
12
|
+
import { api, ensureDaemon } from "../client.js";
|
|
13
|
+
import { fail, printJson } from "../output.js";
|
|
14
|
+
import { listSessions, realpathOr, worktreeOwners } from "../session.js";
|
|
15
|
+
/**
|
|
16
|
+
* The session to reopen: the explicit `--session` id when given, else the lone
|
|
17
|
+
* session whose recorded build worktree is this cwd. Refuses (never returns) on
|
|
18
|
+
* an unknown id, no worktree owner, or two or more owners of one worktree.
|
|
19
|
+
*/
|
|
20
|
+
function resolveTarget(sessions, explicit) {
|
|
21
|
+
if (explicit !== undefined) {
|
|
22
|
+
const target = sessions.find((s) => s.id === explicit);
|
|
23
|
+
if (target === undefined) {
|
|
24
|
+
fail("E_UNKNOWN_SESSION", `--session ${explicit}: not in the daemon registry`);
|
|
25
|
+
}
|
|
26
|
+
return target;
|
|
27
|
+
}
|
|
28
|
+
const owners = worktreeOwners(sessions, realpathOr(process.cwd()));
|
|
29
|
+
if (owners.length === 0) {
|
|
30
|
+
fail("E_NO_RESUME_CANDIDATE", "not inside a known otacon build worktree; run otacon start to plan fresh");
|
|
31
|
+
}
|
|
32
|
+
if (owners.length > 1) {
|
|
33
|
+
fail("E_AMBIGUOUS_RESUME", `${owners.length} sessions claim this worktree; pass --session <id>`, {
|
|
34
|
+
sessions: owners.map((s) => ({ id: s.id, title: s.title, status: s.status })),
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
return owners[0];
|
|
38
|
+
}
|
|
39
|
+
export async function resumeCommand(argv) {
|
|
40
|
+
const { values } = parseArgs({
|
|
41
|
+
args: argv,
|
|
42
|
+
options: { session: { type: "string" } },
|
|
43
|
+
});
|
|
44
|
+
await ensureDaemon();
|
|
45
|
+
const sessions = await listSessions();
|
|
46
|
+
// Target by explicit id, else the single session whose recorded build
|
|
47
|
+
// worktree is this cwd. Zero candidates → plan fresh; two or more refuse with
|
|
48
|
+
// the candidate list rather than guess which plan to reopen.
|
|
49
|
+
const target = resolveTarget(sessions, values.session);
|
|
50
|
+
const response = await api("POST", `/api/sessions/${target.id}/reopen`, {});
|
|
51
|
+
if (response.status === 200) {
|
|
52
|
+
// Enrich with where to edit: the plan lives in the home store
|
|
53
|
+
// (~/.otacon/sessions/<id>/), so the agent knows the exact file to amend.
|
|
54
|
+
printJson({ ...response.body, title: target.title, repo: target.repo, plan: planPath(target.id) });
|
|
55
|
+
return 0;
|
|
56
|
+
}
|
|
57
|
+
const code = response.body.error?.code;
|
|
58
|
+
const message = response.body.error?.message;
|
|
59
|
+
if (response.status === 409) {
|
|
60
|
+
fail(code ?? "E_NOT_REOPENABLE", message ?? `session ${target.id} is not reopenable`);
|
|
61
|
+
}
|
|
62
|
+
if (response.status === 404) {
|
|
63
|
+
fail("E_UNKNOWN_SESSION", `daemon no longer knows session ${target.id}`);
|
|
64
|
+
}
|
|
65
|
+
fail("E_INTERNAL", `resume failed: ${JSON.stringify(response.body)}`, undefined, 2);
|
|
66
|
+
}
|
|
67
|
+
//# sourceMappingURL=resume.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resume.js","sourceRoot":"","sources":["../../../src/cli/commands/resume.ts"],"names":[],"mappings":"AAAA,8EAA8E;AAC9E,8EAA8E;AAC9E,gFAAgF;AAChF,gFAAgF;AAChF,iFAAiF;AACjF,EAAE;AACF,+EAA+E;AAC/E,+EAA+E;AAC/E,yEAAyE;AAEzE,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAEjD,OAAO,EAAE,GAAG,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAEzE;;;;GAIG;AACH,SAAS,aAAa,CAAC,QAA2B,EAAE,QAA4B;IAC9E,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;QAC3B,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,QAAQ,CAAC,CAAC;QACvD,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;YACzB,IAAI,CAAC,mBAAmB,EAAE,aAAa,QAAQ,8BAA8B,CAAC,CAAC;QACjF,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IACD,MAAM,MAAM,GAAG,cAAc,CAAC,QAAQ,EAAE,UAAU,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;IACnE,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxB,IAAI,CACF,uBAAuB,EACvB,0EAA0E,CAC3E,CAAC;IACJ,CAAC;IACD,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACtB,IAAI,CAAC,oBAAoB,EAAE,GAAG,MAAM,CAAC,MAAM,oDAAoD,EAAE;YAC/F,QAAQ,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;SAC9E,CAAC,CAAC;IACL,CAAC;IACD,OAAO,MAAM,CAAC,CAAC,CAAoB,CAAC;AACtC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,IAAc;IAChD,MAAM,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC;QAC3B,IAAI,EAAE,IAAI;QACV,OAAO,EAAE,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE;KACzC,CAAC,CAAC;IAEH,MAAM,YAAY,EAAE,CAAC;IACrB,MAAM,QAAQ,GAAG,MAAM,YAAY,EAAE,CAAC;IAEtC,sEAAsE;IACtE,8EAA8E;IAC9E,6DAA6D;IAC7D,MAAM,MAAM,GAAG,aAAa,CAAC,QAAQ,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;IAEvD,MAAM,QAAQ,GAAG,MAAM,GAAG,CAAC,MAAM,EAAE,iBAAiB,MAAM,CAAC,EAAE,SAAS,EAAE,EAAE,CAAC,CAAC;IAC5E,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;QAC5B,8DAA8D;QAC9D,0EAA0E;QAC1E,SAAS,CAAC,EAAE,GAAG,QAAQ,CAAC,IAAI,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;QACnG,OAAO,CAAC,CAAC;IACX,CAAC;IACD,MAAM,IAAI,GAAI,QAAQ,CAAC,IAAI,CAAC,KAAuC,EAAE,IAAI,CAAC;IAC1E,MAAM,OAAO,GAAI,QAAQ,CAAC,IAAI,CAAC,KAA0C,EAAE,OAAO,CAAC;IACnF,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;QAC5B,IAAI,CAAC,IAAI,IAAI,kBAAkB,EAAE,OAAO,IAAI,WAAW,MAAM,CAAC,EAAE,oBAAoB,CAAC,CAAC;IACxF,CAAC;IACD,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;QAC5B,IAAI,CAAC,mBAAmB,EAAE,kCAAkC,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC;IAC3E,CAAC;IACD,IAAI,CAAC,YAAY,EAAE,kBAAkB,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC;AACtF,CAAC"}
|
|
@@ -1,18 +1,31 @@
|
|
|
1
|
-
// otacon start --title <t> [--quick] — mint and register a session
|
|
2
|
-
//
|
|
3
|
-
//
|
|
1
|
+
// otacon start --title <t> [--quick] — mint and register a session:
|
|
2
|
+
// POST /api/sessions, print the session id, review URL, and the plan draft path
|
|
3
|
+
// (~/.otacon/sessions/<id>/plan.md, where the agent writes the plan). No local
|
|
4
|
+
// session pointer — the daemon registry is the single source of truth.
|
|
4
5
|
import { parseArgs } from "node:util";
|
|
6
|
+
import { planPath } from "../../shared/paths.js";
|
|
5
7
|
import { api, baseUrl, ensureDaemon } from "../client.js";
|
|
6
8
|
import { fail, notice, printJson, usageError } from "../output.js";
|
|
9
|
+
import { refreshInstalledWrappers } from "../install/wrapper.js";
|
|
7
10
|
import { currentBranch, findRepoRoot, realpathOr } from "../session.js";
|
|
8
11
|
import { maybeAutoUpdate } from "../update.js";
|
|
9
12
|
export async function startCommand(argv) {
|
|
10
|
-
// Pre-session auto-update gate (
|
|
13
|
+
// Pre-session auto-update gate (install/update): on a newer published version
|
|
11
14
|
// this self-updates and re-execs `start` with the original argv, so the flags
|
|
12
15
|
// below are reconstructed exactly; in every other case it returns and we
|
|
13
16
|
// proceed on the installed version. Must run before ensureDaemon so the
|
|
14
17
|
// re-exec's version handshake restarts the stale daemon.
|
|
15
18
|
await maybeAutoUpdate(argv);
|
|
19
|
+
// Fallback/migration: re-assert already-installed managed wrappers to their
|
|
20
|
+
// desired state (promote a copy to a symlink, repair a drifted project copy).
|
|
21
|
+
// Inert for a correct symlink, skipped on source runs, notices go to stderr,
|
|
22
|
+
// so the single-JSON-line stdout contract below is untouched.
|
|
23
|
+
try {
|
|
24
|
+
refreshInstalledWrappers();
|
|
25
|
+
}
|
|
26
|
+
catch {
|
|
27
|
+
/* fail-open: never block start on a wrapper refresh */
|
|
28
|
+
}
|
|
16
29
|
const { values } = parseArgs({
|
|
17
30
|
args: argv,
|
|
18
31
|
options: { title: { type: "string" }, quick: { type: "boolean", default: false } },
|
|
@@ -46,6 +59,7 @@ export async function startCommand(argv) {
|
|
|
46
59
|
branch: session.branch,
|
|
47
60
|
quick: session.quick,
|
|
48
61
|
url: `${baseUrl()}/s/${session.id}`,
|
|
62
|
+
plan: planPath(session.id),
|
|
49
63
|
});
|
|
50
64
|
return 0;
|
|
51
65
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"start.js","sourceRoot":"","sources":["../../../src/cli/commands/start.ts"],"names":[],"mappings":"AAAA,
|
|
1
|
+
{"version":3,"file":"start.js","sourceRoot":"","sources":["../../../src/cli/commands/start.ts"],"names":[],"mappings":"AAAA,oEAAoE;AACpE,gFAAgF;AAChF,+EAA+E;AAC/E,uEAAuE;AAEvE,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAEtC,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AACjD,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC1D,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AACnE,OAAO,EAAE,wBAAwB,EAAE,MAAM,uBAAuB,CAAC;AACjE,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AACxE,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAE/C,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,IAAc;IAC/C,8EAA8E;IAC9E,8EAA8E;IAC9E,yEAAyE;IACzE,wEAAwE;IACxE,yDAAyD;IACzD,MAAM,eAAe,CAAC,IAAI,CAAC,CAAC;IAE5B,4EAA4E;IAC5E,8EAA8E;IAC9E,6EAA6E;IAC7E,8DAA8D;IAC9D,IAAI,CAAC;QACH,wBAAwB,EAAE,CAAC;IAC7B,CAAC;IAAC,MAAM,CAAC;QACP,uDAAuD;IACzD,CAAC;IAED,MAAM,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC;QAC3B,IAAI,EAAE,IAAI;QACV,OAAO,EAAE,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE;KACnF,CAAC,CAAC;IACH,IAAI,MAAM,CAAC,KAAK,KAAK,SAAS,IAAI,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;QAC7D,UAAU,CAAC,mCAAmC,CAAC,CAAC;IAClD,CAAC;IAED,MAAM,GAAG,GAAG,UAAU,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IACtC,MAAM,OAAO,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC;IAClC,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;QAC1B,0EAA0E;QAC1E,MAAM,CAAC,GAAG,GAAG,4DAA4D,CAAC,CAAC;IAC7E,CAAC;IACD,MAAM,IAAI,GAAG,OAAO,IAAI,GAAG,CAAC;IAE5B,MAAM,YAAY,EAAE,CAAC;IACrB,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,MAAM,EAAE,eAAe,EAAE;QACjD,KAAK,EAAE,MAAM,CAAC,KAAK;QACnB,IAAI;QACJ,MAAM,EAAE,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,aAAa,CAAC,GAAG,CAAC;QACvD,KAAK,EAAE,MAAM,CAAC,KAAK,KAAK,IAAI;KAC7B,CAAC,CAAC;IACH,IAAI,OAAO,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;QAC3B,IAAI,CAAC,YAAY,EAAE,0BAA0B,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC;IAC7F,CAAC;IACD,MAAM,OAAO,GAAG,OAAO,CAAC,IAAkC,CAAC;IAE3D,SAAS,CAAC;QACR,EAAE,EAAE,IAAI;QACR,OAAO,EAAE,OAAO,CAAC,EAAE;QACnB,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,IAAI;QACJ,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,GAAG,EAAE,GAAG,OAAO,EAAE,MAAM,OAAO,CAAC,EAAE,EAAE;QACnC,IAAI,EAAE,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;KAC3B,CAAC,CAAC;IACH,OAAO,CAAC,CAAC;AACX,CAAC"}
|
|
@@ -1,16 +1,16 @@
|
|
|
1
|
-
// otacon status [--all] — the crash/resume entry point (
|
|
1
|
+
// otacon status [--all] — the crash/resume entry point (review loop and daemon API): a
|
|
2
2
|
// brand-new agent session runs this to find its open session, current
|
|
3
3
|
// revision, and undelivered event count, then resumes the loop.
|
|
4
4
|
//
|
|
5
|
-
// Routing is registry-first (
|
|
5
|
+
// Routing is registry-first (session registry and switcher): the daemon's registry says where
|
|
6
6
|
// every session's repo lives, so the default view is "sessions whose repo
|
|
7
7
|
// contains my cwd" — no local state needed, the registry is the source of truth.
|
|
8
8
|
import { sep } from "node:path";
|
|
9
9
|
import { parseArgs } from "node:util";
|
|
10
|
-
import { otaconPort } from "../../shared/paths.js";
|
|
10
|
+
import { otaconPort, planPath } from "../../shared/paths.js";
|
|
11
11
|
import { api, ensureDaemon } from "../client.js";
|
|
12
12
|
import { printJson } from "../output.js";
|
|
13
|
-
import { realpathOr } from "../session.js";
|
|
13
|
+
import { realpathOr, worktreeOwners } from "../session.js";
|
|
14
14
|
function repoContains(repo, cwd) {
|
|
15
15
|
const root = realpathOr(repo);
|
|
16
16
|
return cwd === root || cwd.startsWith(root + sep);
|
|
@@ -34,10 +34,21 @@ export async function statusCommand(argv) {
|
|
|
34
34
|
return [];
|
|
35
35
|
return [detail.body];
|
|
36
36
|
});
|
|
37
|
+
// The worktree owner is found over ALL sessions, not `relevant`: the owner's
|
|
38
|
+
// `.repo` is the MAIN repo (where planning happened), which does not contain
|
|
39
|
+
// this build-worktree cwd, so it would never appear in the repo-scoped list. A
|
|
40
|
+
// single owner surfaces as the resume candidate; ambiguity stays silent (let
|
|
41
|
+
// `otacon resume` refuse with the candidate list).
|
|
42
|
+
const owners = worktreeOwners(all, cwd);
|
|
43
|
+
const owner = owners.length === 1 ? owners[0] : undefined;
|
|
44
|
+
const resumeCandidate = owner
|
|
45
|
+
? { id: owner.id, title: owner.title, status: owner.status, plan: planPath(owner.id) }
|
|
46
|
+
: undefined;
|
|
37
47
|
printJson({
|
|
38
48
|
ok: true,
|
|
39
49
|
daemon: { version: daemon.version, pid: daemon.pid, port: otaconPort() },
|
|
40
50
|
sessions,
|
|
51
|
+
...(resumeCandidate ? { resumeCandidate } : {}),
|
|
41
52
|
});
|
|
42
53
|
return 0;
|
|
43
54
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"status.js","sourceRoot":"","sources":["../../../src/cli/commands/status.ts"],"names":[],"mappings":"AAAA,
|
|
1
|
+
{"version":3,"file":"status.js","sourceRoot":"","sources":["../../../src/cli/commands/status.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
// otacon submit [plan.md] [--resolutions res.json] [--session id] — read the
|
|
2
|
-
// plan (default:
|
|
3
|
-
//
|
|
4
|
-
//
|
|
5
|
-
//
|
|
2
|
+
// plan (default: ~/.otacon/sessions/<session>/plan.md in the home store) and
|
|
3
|
+
// POST it for linting. A 422 prints the daemon's lint issues JSON and exits 1 so the
|
|
4
|
+
// agent fixes and resubmits. The resolutions file is the
|
|
5
|
+
// revision-accompaniment document:
|
|
6
6
|
// {"changelog": "...", "threads": {"t1": "reply", ...}} — required by L5 on
|
|
7
7
|
// resubmits after comment batches and on every revision ≥ 2.
|
|
8
8
|
import { readFileSync } from "node:fs";
|
|
@@ -22,7 +22,7 @@ export async function submitCommand(argv) {
|
|
|
22
22
|
usageError("otacon submit takes at most one plan path");
|
|
23
23
|
await ensureDaemon();
|
|
24
24
|
const session = resolveSession(await listSessions(), values.session, realpathOr(process.cwd()));
|
|
25
|
-
const path = positionals[0] !== undefined ? resolve(positionals[0]) : planPath(session.
|
|
25
|
+
const path = positionals[0] !== undefined ? resolve(positionals[0]) : planPath(session.id);
|
|
26
26
|
let plan;
|
|
27
27
|
try {
|
|
28
28
|
plan = readFileSync(path, "utf8");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"submit.js","sourceRoot":"","sources":["../../../src/cli/commands/submit.ts"],"names":[],"mappings":"AAAA,6EAA6E;AAC7E,
|
|
1
|
+
{"version":3,"file":"submit.js","sourceRoot":"","sources":["../../../src/cli/commands/submit.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,10 +1,13 @@
|
|
|
1
|
-
// otacon update [--check] — the manual/forced upgrade command (
|
|
2
|
-
//
|
|
1
|
+
// otacon update [--check] — the manual/forced upgrade command (review loop and daemon API,
|
|
2
|
+
// install/update). It deliberately bypasses the auto-update gate's two suppressors: it
|
|
3
3
|
// ignores the 1h throttle (the user asked NOW) and `update.auto:false` (an
|
|
4
4
|
// explicit command overrides a config that only governs the implicit start-time
|
|
5
5
|
// check). It still fails open on a registry blip and never escalates to sudo —
|
|
6
6
|
// it shares `runNpmUpdate` with the start-time gate, so the install behavior is
|
|
7
|
-
// identical (D12, plan docs/plans/2026-06-19-auto-update-outdated-version.md).
|
|
7
|
+
// identical (D12, plan docs/plans/2026-06-19-auto-update-outdated-version.md). The
|
|
8
|
+
// channel (latest vs staging) is derived from the installed version the same way
|
|
9
|
+
// the start-time gate derives it (`channelOf`), so a staging install upgrades on
|
|
10
|
+
// staging and a clean install resolves `otacon@latest` exactly as before.
|
|
8
11
|
//
|
|
9
12
|
// --check report current/latest/outdated and exit; never installs (a dry run
|
|
10
13
|
// for "am I behind?", and the only safe mode in CI / pinned shops).
|
|
@@ -17,11 +20,12 @@ import { parseArgs } from "node:util";
|
|
|
17
20
|
import { VERSION } from "../../shared/version.js";
|
|
18
21
|
import { isSourceRun } from "../client.js";
|
|
19
22
|
import { notice, printJson } from "../output.js";
|
|
20
|
-
import {
|
|
23
|
+
import { channelOf, fetchDistTag, isNewer, runNpmUpdate } from "../update.js";
|
|
21
24
|
const REAL_DEPS = {
|
|
22
|
-
fetch:
|
|
25
|
+
fetch: fetchDistTag,
|
|
23
26
|
runNpmUpdate,
|
|
24
27
|
sourceRun: isSourceRun,
|
|
28
|
+
installedVersion: VERSION,
|
|
25
29
|
};
|
|
26
30
|
export async function updateCommand(argv, deps = REAL_DEPS) {
|
|
27
31
|
const { values } = parseArgs({
|
|
@@ -31,34 +35,37 @@ export async function updateCommand(argv, deps = REAL_DEPS) {
|
|
|
31
35
|
// Dev-run refusal (D6): a source checkout has no global package to update.
|
|
32
36
|
if (deps.sourceRun()) {
|
|
33
37
|
notice("running otacon from a source checkout; nothing to update");
|
|
34
|
-
printJson({ ok: true, source: true, version:
|
|
38
|
+
printJson({ ok: true, source: true, version: deps.installedVersion });
|
|
35
39
|
return 0;
|
|
36
40
|
}
|
|
41
|
+
// Channel (derived from the installed version): a `-staging.` build tracks the
|
|
42
|
+
// `staging` dist-tag, anything else `latest`, the same derivation as the start-time gate.
|
|
43
|
+
const channel = channelOf(deps.installedVersion);
|
|
37
44
|
// Fail-open (D5): a transient registry blip is not a hard error — report that
|
|
38
45
|
// we couldn't check and exit 0, exactly as the start-time gate proceeds.
|
|
39
|
-
const latest = await deps.fetch();
|
|
46
|
+
const latest = await deps.fetch(channel);
|
|
40
47
|
if (latest === undefined) {
|
|
41
48
|
notice("could not reach the npm registry to check for updates; try again later");
|
|
42
|
-
printJson({ ok: true, current:
|
|
49
|
+
printJson({ ok: true, current: deps.installedVersion, latest: null, outdated: false });
|
|
43
50
|
return 0;
|
|
44
51
|
}
|
|
45
|
-
const outdated = isNewer(latest,
|
|
52
|
+
const outdated = isNewer(latest, deps.installedVersion);
|
|
46
53
|
// --check never installs: it's the dry run.
|
|
47
54
|
if (values.check === true) {
|
|
48
|
-
printJson({ ok: true, current:
|
|
55
|
+
printJson({ ok: true, current: deps.installedVersion, latest, outdated });
|
|
49
56
|
return 0;
|
|
50
57
|
}
|
|
51
58
|
// Already current: nothing to do.
|
|
52
59
|
if (!outdated) {
|
|
53
|
-
printJson({ ok: true, current:
|
|
60
|
+
printJson({ ok: true, current: deps.installedVersion, latest, outdated: false, updated: false });
|
|
54
61
|
return 0;
|
|
55
62
|
}
|
|
56
|
-
// Outdated: install. On failure this is the one expected exit-1 path.
|
|
57
|
-
if (!deps.runNpmUpdate(
|
|
58
|
-
notice(
|
|
63
|
+
// Outdated: install the channel dist-tag. On failure this is the one expected exit-1 path.
|
|
64
|
+
if (!deps.runNpmUpdate(channel).ok) {
|
|
65
|
+
notice(`auto-update failed; run: npm install -g otacon@${channel}`);
|
|
59
66
|
printJson({
|
|
60
67
|
ok: false,
|
|
61
|
-
error: { code: "E_UPDATE_FAILED", message:
|
|
68
|
+
error: { code: "E_UPDATE_FAILED", message: `npm install -g otacon@${channel} failed` },
|
|
62
69
|
});
|
|
63
70
|
return 1;
|
|
64
71
|
}
|
|
@@ -69,8 +76,8 @@ export async function updateCommand(argv, deps = REAL_DEPS) {
|
|
|
69
76
|
// the open tabs' self-heal) come up on the NEXT `otacon` invocation, which
|
|
70
77
|
// runs the freshly-installed binary and trips the version handshake. We report
|
|
71
78
|
// that accurately rather than claim a restart that didn't happen (D12).
|
|
72
|
-
notice(`updated otacon ${
|
|
73
|
-
printJson({ ok: true, updated: true, from:
|
|
79
|
+
notice(`updated otacon ${deps.installedVersion} → ${latest}; the daemon and any open tabs update on your next otacon command`);
|
|
80
|
+
printJson({ ok: true, updated: true, from: deps.installedVersion, to: latest });
|
|
74
81
|
return 0;
|
|
75
82
|
}
|
|
76
83
|
//# sourceMappingURL=update.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"update.js","sourceRoot":"","sources":["../../../src/cli/commands/update.ts"],"names":[],"mappings":"AAAA,
|
|
1
|
+
{"version":3,"file":"update.js","sourceRoot":"","sources":["../../../src/cli/commands/update.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
// otacon wait [--timeout 540] [--session id] — the parked wait (
|
|
1
|
+
// otacon wait [--timeout 540] [--session id] — the parked wait (review loop and daemon API):
|
|
2
2
|
// long-poll the session's queue and print exactly one event as JSON, exit 0
|
|
3
3
|
// ({"event":"timeout"} included — re-parking is the agent's normal loop).
|
|
4
4
|
//
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wait.js","sourceRoot":"","sources":["../../../src/cli/commands/wait.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"wait.js","sourceRoot":"","sources":["../../../src/cli/commands/wait.ts"],"names":[],"mappings":"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"}
|