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.
Files changed (201) hide show
  1. package/README.md +18 -5
  2. package/dist/cli/browser.js +1 -1
  3. package/dist/cli/browser.js.map +1 -1
  4. package/dist/cli/client.js +3 -3
  5. package/dist/cli/client.js.map +1 -1
  6. package/dist/cli/commands/answer.js +1 -1
  7. package/dist/cli/commands/answer.js.map +1 -1
  8. package/dist/cli/commands/ask.js +3 -3
  9. package/dist/cli/commands/ask.js.map +1 -1
  10. package/dist/cli/commands/clean.js +14 -16
  11. package/dist/cli/commands/clean.js.map +1 -1
  12. package/dist/cli/commands/config.js +1 -1
  13. package/dist/cli/commands/config.js.map +1 -1
  14. package/dist/cli/commands/doctor.js +4 -4
  15. package/dist/cli/commands/doctor.js.map +1 -1
  16. package/dist/cli/commands/expose.js +7 -7
  17. package/dist/cli/commands/expose.js.map +1 -1
  18. package/dist/cli/commands/implement-done.js +1 -1
  19. package/dist/cli/commands/implement-done.js.map +1 -1
  20. package/dist/cli/commands/install.js +16 -10
  21. package/dist/cli/commands/install.js.map +1 -1
  22. package/dist/cli/commands/open.js +31 -7
  23. package/dist/cli/commands/open.js.map +1 -1
  24. package/dist/cli/commands/progress.js +1 -1
  25. package/dist/cli/commands/progress.js.map +1 -1
  26. package/dist/cli/commands/resume.js +67 -0
  27. package/dist/cli/commands/resume.js.map +1 -0
  28. package/dist/cli/commands/start.js +18 -4
  29. package/dist/cli/commands/start.js.map +1 -1
  30. package/dist/cli/commands/status.js +15 -4
  31. package/dist/cli/commands/status.js.map +1 -1
  32. package/dist/cli/commands/submit.js +5 -5
  33. package/dist/cli/commands/submit.js.map +1 -1
  34. package/dist/cli/commands/update.js +24 -17
  35. package/dist/cli/commands/update.js.map +1 -1
  36. package/dist/cli/commands/wait.js +1 -1
  37. package/dist/cli/commands/wait.js.map +1 -1
  38. package/dist/cli/install/assets.js +123 -48
  39. package/dist/cli/install/assets.js.map +1 -1
  40. package/dist/cli/install/locations.js +1 -1
  41. package/dist/cli/install/locations.js.map +1 -1
  42. package/dist/cli/install/tailscale.js +2 -2
  43. package/dist/cli/install/tailscale.js.map +1 -1
  44. package/dist/cli/install/wrapper.js +202 -0
  45. package/dist/cli/install/wrapper.js.map +1 -0
  46. package/dist/cli/main.js +5 -2
  47. package/dist/cli/main.js.map +1 -1
  48. package/dist/cli/output.js +2 -2
  49. package/dist/cli/output.js.map +1 -1
  50. package/dist/cli/session.js +18 -7
  51. package/dist/cli/session.js.map +1 -1
  52. package/dist/cli/update.js +79 -38
  53. package/dist/cli/update.js.map +1 -1
  54. package/dist/daemon/activity.js +1 -1
  55. package/dist/daemon/activity.js.map +1 -1
  56. package/dist/daemon/anchor.js +1 -1
  57. package/dist/daemon/anchor.js.map +1 -1
  58. package/dist/daemon/app.js +370 -82
  59. package/dist/daemon/app.js.map +1 -1
  60. package/dist/daemon/approve.js +3 -3
  61. package/dist/daemon/approve.js.map +1 -1
  62. package/dist/daemon/capture/adapter.js +23 -0
  63. package/dist/daemon/capture/adapter.js.map +1 -0
  64. package/dist/daemon/capture/claude.js +274 -0
  65. package/dist/daemon/capture/claude.js.map +1 -0
  66. package/dist/daemon/capture/codex.js +413 -0
  67. package/dist/daemon/capture/codex.js.map +1 -0
  68. package/dist/daemon/capture/normalize.js +89 -0
  69. package/dist/daemon/capture/normalize.js.map +1 -0
  70. package/dist/daemon/capture/opencode.js +330 -0
  71. package/dist/daemon/capture/opencode.js.map +1 -0
  72. package/dist/daemon/capture/registry.js +33 -0
  73. package/dist/daemon/capture/registry.js.map +1 -0
  74. package/dist/daemon/capture/stream-store.js +121 -0
  75. package/dist/daemon/capture/stream-store.js.map +1 -0
  76. package/dist/daemon/capture/tailer.js +108 -0
  77. package/dist/daemon/capture/tailer.js.map +1 -0
  78. package/dist/daemon/desktop-notify.js +11 -5
  79. package/dist/daemon/desktop-notify.js.map +1 -1
  80. package/dist/daemon/diagrams.js +90 -0
  81. package/dist/daemon/diagrams.js.map +1 -0
  82. package/dist/daemon/diff.js +1 -2
  83. package/dist/daemon/diff.js.map +1 -1
  84. package/dist/daemon/linter/parse.js +45 -12
  85. package/dist/daemon/linter/parse.js.map +1 -1
  86. package/dist/daemon/linter/rules.js +20 -17
  87. package/dist/daemon/linter/rules.js.map +1 -1
  88. package/dist/daemon/main.js +1 -1
  89. package/dist/daemon/main.js.map +1 -1
  90. package/dist/daemon/notify.js +1 -1
  91. package/dist/daemon/notify.js.map +1 -1
  92. package/dist/daemon/presence.js +1 -1
  93. package/dist/daemon/presence.js.map +1 -1
  94. package/dist/daemon/queue.js +7 -7
  95. package/dist/daemon/queue.js.map +1 -1
  96. package/dist/daemon/store.js +66 -79
  97. package/dist/daemon/store.js.map +1 -1
  98. package/dist/daemon/threads.js +111 -25
  99. package/dist/daemon/threads.js.map +1 -1
  100. package/dist/daemon/transcript.js +1 -1
  101. package/dist/daemon/transcript.js.map +1 -1
  102. package/dist/daemon/ui.js +8 -6
  103. package/dist/daemon/ui.js.map +1 -1
  104. package/dist/daemon/viewers.js +37 -0
  105. package/dist/daemon/viewers.js.map +1 -0
  106. package/dist/shared/config.js +42 -8
  107. package/dist/shared/config.js.map +1 -1
  108. package/dist/shared/gwt.js +1 -1
  109. package/dist/shared/gwt.js.map +1 -1
  110. package/dist/shared/paths.js +63 -36
  111. package/dist/shared/paths.js.map +1 -1
  112. package/dist/shared/question-spec.js +1 -1
  113. package/dist/shared/question-spec.js.map +1 -1
  114. package/dist/shared/types.js +7 -3
  115. package/dist/shared/types.js.map +1 -1
  116. package/dist/shared/version.js +1 -1
  117. package/dist/skills/otacon/SKILL.md +250 -0
  118. package/dist/ui/assets/{arc-Cp3sPd_U.js → arc-BUR2DxNA.js} +1 -1
  119. package/dist/ui/assets/architecture-7EHR7CIX-TTokq2IO.js +1 -0
  120. package/dist/ui/assets/{architectureDiagram-3BPJPVTR-C4F3heWP.js → architectureDiagram-3BPJPVTR-unLnkDyM.js} +1 -1
  121. package/dist/ui/assets/{blockDiagram-GPEHLZMM-DmJoG8ky.js → blockDiagram-GPEHLZMM-DHx8lNeL.js} +1 -1
  122. package/dist/ui/assets/{c4Diagram-AAUBKEIU-BDEf52Jp.js → c4Diagram-AAUBKEIU-BU9T562l.js} +1 -1
  123. package/dist/ui/assets/channel-BA6ChrT3.js +1 -0
  124. package/dist/ui/assets/{chunk-2J33WTMH-Dh_UFriv.js → chunk-2J33WTMH-BEb0myVl.js} +1 -1
  125. package/dist/ui/assets/{chunk-3OPIFGDE-c66RlAN8.js → chunk-3OPIFGDE-DESBG_RB.js} +1 -1
  126. package/dist/ui/assets/{chunk-4BX2VUAB-CrGJaCCg.js → chunk-4BX2VUAB-dt3F_E_5.js} +1 -1
  127. package/dist/ui/assets/{chunk-55IACEB6-BvwqEeyq.js → chunk-55IACEB6-BcyuZM7U.js} +1 -1
  128. package/dist/ui/assets/{chunk-5ZQYHXKU-BfF2IfQe.js → chunk-5ZQYHXKU-DqdwSJlO.js} +1 -1
  129. package/dist/ui/assets/{chunk-727SXJPM-DOEUwc9I.js → chunk-727SXJPM-B04SqNWj.js} +1 -1
  130. package/dist/ui/assets/{chunk-AQP2D5EJ-CVf2xV2Z.js → chunk-AQP2D5EJ-DpjCPBWN.js} +1 -1
  131. package/dist/ui/assets/{chunk-BSJP7CBP-D_EbTWTC.js → chunk-BSJP7CBP-BNOU3k5G.js} +1 -1
  132. package/dist/ui/assets/{chunk-CSCIHK7Q-CkxTSMAM.js → chunk-CSCIHK7Q-iWOtNZm_.js} +1 -1
  133. package/dist/ui/assets/{chunk-FMBD7UC4-DVShhFc7.js → chunk-FMBD7UC4-BHH_etky.js} +1 -1
  134. package/dist/ui/assets/{chunk-KSCS5N6A-DnHEEYpq.js → chunk-KSCS5N6A-DbRuazP3.js} +1 -1
  135. package/dist/ui/assets/{chunk-L5ZTLDWV-B_gjyajS.js → chunk-L5ZTLDWV-B2ZZFONi.js} +1 -1
  136. package/dist/ui/assets/{chunk-LZXEDZCA-Bsf7basG.js → chunk-LZXEDZCA-DryVpwAh.js} +2 -2
  137. package/dist/ui/assets/{chunk-ND2GUHAM-DGepGb8_.js → chunk-ND2GUHAM-2Bb1izqg.js} +1 -1
  138. package/dist/ui/assets/{chunk-NZK2D7GU-BJIlh-gB.js → chunk-NZK2D7GU-2DhvLbqL.js} +1 -1
  139. package/dist/ui/assets/{chunk-O5CBEL6O-cdVbOOCs.js → chunk-O5CBEL6O-B5oigO7D.js} +1 -1
  140. package/dist/ui/assets/chunk-QZHKN3VN-BDHgdxoT.js +1 -0
  141. package/dist/ui/assets/chunk-WU5MYG2G-FDJTP_wT.js +1 -0
  142. package/dist/ui/assets/{chunk-XPW4576I-DPW39hNO.js → chunk-XPW4576I-Dmq-O7bc.js} +1 -1
  143. package/dist/ui/assets/classDiagram-4FO5ZUOK-B5kZsiIt.js +1 -0
  144. package/dist/ui/assets/classDiagram-v2-Q7XG4LA2-B5kZsiIt.js +1 -0
  145. package/dist/ui/assets/{cose-bilkent-S5V4N54A-DmMsC6om.js → cose-bilkent-S5V4N54A-oTsqU1DY.js} +1 -1
  146. package/dist/ui/assets/{dagre-BM42HDAG-BmVr7T7Z.js → dagre-BM42HDAG-CZykCU6B.js} +1 -1
  147. package/dist/ui/assets/{diagram-2AECGRRQ-e0VnXEyj.js → diagram-2AECGRRQ-BY7clIlO.js} +1 -1
  148. package/dist/ui/assets/{diagram-5GNKFQAL-SCJGYE6m.js → diagram-5GNKFQAL-BWdq4hV0.js} +1 -1
  149. package/dist/ui/assets/{diagram-KO2AKTUF-DDUZO1Mj.js → diagram-KO2AKTUF-CCGEaiZg.js} +1 -1
  150. package/dist/ui/assets/{diagram-LMA3HP47-5x1ypf6a.js → diagram-LMA3HP47-CVkepFYU.js} +1 -1
  151. package/dist/ui/assets/{diagram-OG6HWLK6-3nDhrQ20.js → diagram-OG6HWLK6-f-NjsfLG.js} +1 -1
  152. package/dist/ui/assets/{dist-NEinnePC.js → dist-ZqsueX9_.js} +1 -1
  153. package/dist/ui/assets/{erDiagram-TEJ5UH35-BNvwSDNZ.js → erDiagram-TEJ5UH35-D8Wn6QP3.js} +1 -1
  154. package/dist/ui/assets/eventmodeling-FCH6USID-BODDoY6e.js +1 -0
  155. package/dist/ui/assets/{flowDiagram-I6XJVG4X-Bt_wDUhb.js → flowDiagram-I6XJVG4X-BYnhla9k.js} +1 -1
  156. package/dist/ui/assets/{ganttDiagram-6RSMTGT7-DVcJ0rNX.js → ganttDiagram-6RSMTGT7-Dpu52ZRF.js} +1 -1
  157. package/dist/ui/assets/{gitGraph-WXDBUCRP-CO_SyAgP.js → gitGraph-WXDBUCRP-ou8xzQe1.js} +1 -1
  158. package/dist/ui/assets/{gitGraphDiagram-PVQCEYII-oDyO3lWI.js → gitGraphDiagram-PVQCEYII-BnTuFH7F.js} +1 -1
  159. package/dist/ui/assets/index-B2mL0c61.js +11 -0
  160. package/dist/ui/assets/index-sZ1TgAvb.css +1 -0
  161. package/dist/ui/assets/{info-J43DQDTF-Bn17NS7h.js → info-J43DQDTF-xgUHa7k0.js} +1 -1
  162. package/dist/ui/assets/{infoDiagram-5YYISTIA-HG1opLLT.js → infoDiagram-5YYISTIA-DJBudrwD.js} +1 -1
  163. package/dist/ui/assets/{ishikawaDiagram-YF4QCWOH-Di_yQwi8.js → ishikawaDiagram-YF4QCWOH-DpFHgERI.js} +1 -1
  164. package/dist/ui/assets/{journeyDiagram-JHISSGLW-DZtHvLeE.js → journeyDiagram-JHISSGLW-Cd32hdpY.js} +1 -1
  165. package/dist/ui/assets/{kanban-definition-UN3LZRKU-B_RCx3Km.js → kanban-definition-UN3LZRKU-Dm1V8lr0.js} +1 -1
  166. package/dist/ui/assets/{line-DenX-zXQ.js → line-CZu6_PMX.js} +1 -1
  167. package/dist/ui/assets/{linear-dly_ngoq.js → linear-2tkTX_U2.js} +1 -1
  168. package/dist/ui/assets/{mermaid-parser.core-CRmtm0s9.js → mermaid-parser.core-C4m04cRe.js} +2 -2
  169. package/dist/ui/assets/{mermaid.core-C_3KVfpx.js → mermaid.core-BPeg1ewg.js} +3 -3
  170. package/dist/ui/assets/{mindmap-definition-RKZ34NQL-wdzSyYO6.js → mindmap-definition-RKZ34NQL-BENqEkIK.js} +1 -1
  171. package/dist/ui/assets/{packet-YPE3B663-tUyFmR11.js → packet-YPE3B663-DNO0oBLH.js} +1 -1
  172. package/dist/ui/assets/{pie-LRSECV5Y-Cel48VVp.js → pie-LRSECV5Y-CWoz31oB.js} +1 -1
  173. package/dist/ui/assets/{pieDiagram-4H26LBE5-B55ypWtu.js → pieDiagram-4H26LBE5-CtmxhUGI.js} +1 -1
  174. package/dist/ui/assets/{plan-view-CMoo3_gE.js → plan-view-bZtdFbit.js} +4 -4
  175. package/dist/ui/assets/{quadrantDiagram-W4KKPZXB-9WcKQV0a.js → quadrantDiagram-W4KKPZXB-BO3IZNbx.js} +1 -1
  176. package/dist/ui/assets/{radar-GUYGQ44K-w5pk53Vr.js → radar-GUYGQ44K-AEfROz99.js} +1 -1
  177. package/dist/ui/assets/{requirementDiagram-4Y6WPE33-CzE82fXz.js → requirementDiagram-4Y6WPE33-D-wQ1szT.js} +1 -1
  178. package/dist/ui/assets/{sankeyDiagram-5OEKKPKP-DSGO39je.js → sankeyDiagram-5OEKKPKP-Bj4kD_AJ.js} +1 -1
  179. package/dist/ui/assets/{sequenceDiagram-3UESZ5HK-BKSDDr0S.js → sequenceDiagram-3UESZ5HK-M8QVVH74.js} +1 -1
  180. package/dist/ui/assets/{src-JXBGgRt-.js → src-DvptJAGq.js} +1 -1
  181. package/dist/ui/assets/{stateDiagram-AJRCARHV-DZHYA9aj.js → stateDiagram-AJRCARHV-BiPRs9rN.js} +1 -1
  182. package/dist/ui/assets/stateDiagram-v2-BHNVJYJU-BYjicZlC.js +1 -0
  183. package/dist/ui/assets/{timeline-definition-PNZ67QCA-WqJFw7aE.js → timeline-definition-PNZ67QCA-DS0AGRKw.js} +1 -1
  184. package/dist/ui/assets/{treeView-BLDUP644-DoIQYMiz.js → treeView-BLDUP644-DJakvUbF.js} +1 -1
  185. package/dist/ui/assets/{treemap-LRROVOQU-BA9si_Mo.js → treemap-LRROVOQU-QXfc2Vwr.js} +1 -1
  186. package/dist/ui/assets/{vennDiagram-CIIHVFJN-BvWRUfFr.js → vennDiagram-CIIHVFJN-CBdJA0hv.js} +1 -1
  187. package/dist/ui/assets/{wardley-L42UT6IY-Cf9PU44t.js → wardley-L42UT6IY-DI9SdW45.js} +1 -1
  188. package/dist/ui/assets/{wardleyDiagram-YWT4CUSO-CGuxl7AU.js → wardleyDiagram-YWT4CUSO-RMmsKLRe.js} +1 -1
  189. package/dist/ui/assets/{xychartDiagram-2RQKCTM6-CNteNXpe.js → xychartDiagram-2RQKCTM6-DFXccP8B.js} +1 -1
  190. package/dist/ui/index.html +2 -2
  191. package/package.json +7 -5
  192. package/dist/ui/assets/architecture-7EHR7CIX-BbwstElO.js +0 -1
  193. package/dist/ui/assets/channel-BMK3JFRf.js +0 -1
  194. package/dist/ui/assets/chunk-QZHKN3VN-DLNUTn7U.js +0 -1
  195. package/dist/ui/assets/chunk-WU5MYG2G-ipH3YPcA.js +0 -1
  196. package/dist/ui/assets/classDiagram-4FO5ZUOK-CvIMLlSD.js +0 -1
  197. package/dist/ui/assets/classDiagram-v2-Q7XG4LA2-CvIMLlSD.js +0 -1
  198. package/dist/ui/assets/eventmodeling-FCH6USID-BeFWDbla.js +0 -1
  199. package/dist/ui/assets/index-CJJIQ0dr.css +0 -1
  200. package/dist/ui/assets/index-Dh5CsH24.js +0 -11
  201. package/dist/ui/assets/stateDiagram-v2-BHNVJYJU-DnAfDlvZ.js +0 -1
@@ -1,4 +1,4 @@
1
- // Per-session disk-backed FIFO event queue with waiter parking (DESIGN.md §6, §7).
1
+ // Per-session disk-backed FIFO event queue with waiter parking.
2
2
  //
3
3
  // Every method is synchronous: Node's single thread therefore cannot interleave
4
4
  // an enqueue between a queue-empty check and a waiter parking — the whole
@@ -85,19 +85,19 @@ export class SessionQueue {
85
85
  /**
86
86
  * Detach from disk forever (DELETE /api/sessions/:id evicted this instance):
87
87
  * flush and requeue become no-ops. A delivered-but-unacked event's
88
- * post-response ack callback can fire after `otacon clean` archives the
89
- * session dir writing then would recreate .otacon/<id>/ next to the
90
- * archive (writeFileAtomic mkdirs). The events file leaves with the dir.
88
+ * post-response ack callback can fire after the delete removes the home
89
+ * session dir: writing then would recreate ~/.otacon/sessions/<id>/
90
+ * (writeFileAtomic mkdirs). The events file leaves with the dir.
91
91
  */
92
92
  close() {
93
93
  this.closed = true;
94
94
  }
95
95
  /**
96
96
  * Detach from disk AND wake every parked waiter with one terminal event
97
- * (DELETE of a *pending* session, DESIGN.md §12): set `closed` first so
98
- * flush/requeue/dispatch all become no-ops the synthetic event is never
97
+ * (DELETE of a live session, approval and archive lifecycle): set `closed` first so
98
+ * flush/requeue/dispatch all become no-ops (the synthetic event is never
99
99
  * persisted or requeued, and a late post-response ack can't recreate the
100
- * `.otacon/<id>/` dir the caller is about to hard-remove then hand each
100
+ * `~/.otacon/sessions/<id>/` dir the caller is about to remove), then hand each
101
101
  * parked waiter the same payload so its long-poll resolves cleanly instead of
102
102
  * 404ing on the next call. No waiter parked = nobody to wake (an agent that
103
103
  * is not parked discovers the delete via its next call's 404). The synthetic
@@ -1 +1 @@
1
- {"version":3,"file":"queue.js","sourceRoot":"","sources":["../../src/daemon/queue.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"queue.js","sourceRoot":"","sources":["../../src/daemon/queue.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  // Global session registry, per-session daemon state, and revision snapshots
2
- // (DESIGN.md §7, §12). All state is plain JSON written atomically — temp file +
2
+ // (session registry and switcher, approval and archive lifecycle). All state is plain JSON written atomically — temp file +
3
3
  // rename — so a crash can never leave a half-written file (DECISIONS.md
4
4
  // "Storage: plain JSON files, not SQLite"). A file that is corrupt anyway
5
5
  // (manual edit, disk fault) is quarantined, never fatal: it is renamed aside
@@ -106,10 +106,10 @@ function parseState(raw) {
106
106
  return file;
107
107
  }
108
108
  /** Highest r<N>.md snapshot on disk — the revision counter's source of truth. */
109
- function recoverRevision(repo, id) {
109
+ function recoverRevision(id) {
110
110
  let max = 0;
111
111
  try {
112
- for (const name of readdirSync(paths.sessionDir(repo, id))) {
112
+ for (const name of readdirSync(paths.sessionDir(id))) {
113
113
  const match = /^r(\d+)\.md$/.exec(name);
114
114
  if (match)
115
115
  max = Math.max(max, Number(match[1]));
@@ -127,14 +127,14 @@ function recoverRevision(repo, id) {
127
127
  * loosely (no thread validation): a half-corrupt file should still surrender
128
128
  * every id it can.
129
129
  */
130
- function recoverCounters(repo, id) {
130
+ function recoverCounters(id) {
131
131
  const counters = { batch: 0, thread: 0, question: 0, eventSeq: 0 };
132
132
  const see = (key, raw, re) => {
133
133
  const match = typeof raw === "string" ? re.exec(raw) : null;
134
134
  if (match)
135
135
  counters[key] = Math.max(counters[key], Number(match[1]));
136
136
  };
137
- const threadsRaw = readJsonOr(paths.threadsPath(repo, id));
137
+ const threadsRaw = readJsonOr(paths.threadsPath(id));
138
138
  for (const t of Array.isArray(threadsRaw?.threads) ? threadsRaw.threads : []) {
139
139
  const thread = t;
140
140
  see("thread", thread?.id, /^t(\d+)$/);
@@ -142,11 +142,11 @@ function recoverCounters(repo, id) {
142
142
  see("batch", thread?.batch, /^b(\d+)$/);
143
143
  }
144
144
  // Agent grill questions share the q counter with user-question threads.
145
- const transcriptRaw = readJsonOr(paths.transcriptPath(repo, id));
145
+ const transcriptRaw = readJsonOr(paths.transcriptPath(id));
146
146
  for (const e of Array.isArray(transcriptRaw?.entries) ? transcriptRaw.entries : []) {
147
147
  see("question", e?.id, /^q(\d+)$/);
148
148
  }
149
- const eventsRaw = readJsonOr(paths.eventsPath(repo, id));
149
+ const eventsRaw = readJsonOr(paths.eventsPath(id));
150
150
  for (const e of Array.isArray(eventsRaw?.events) ? eventsRaw.events : []) {
151
151
  const event = e;
152
152
  if (typeof event?.seq === "number") {
@@ -162,9 +162,10 @@ function recoverCounters(repo, id) {
162
162
  }
163
163
  const BASE36 = "0123456789abcdefghijklmnopqrstuvwxyz";
164
164
  /**
165
- * Owns `$OTACON_HOME/registry.json` plus each session's `.otacon/<id>/` state in
166
- * its repo. Event seqs and the b/t/q stable ids are minted here (bumpCounter)
167
- * so they survive queue drains and daemon restarts.
165
+ * Owns `$OTACON_HOME/registry.json` plus each session's working state in the
166
+ * home store (`~/.otacon/sessions/<id>/`). Event seqs and the b/t/q stable ids
167
+ * are minted here (bumpCounter) so they survive queue drains and daemon
168
+ * restarts.
168
169
  */
169
170
  export class Store {
170
171
  registryFile;
@@ -180,8 +181,9 @@ export class Store {
180
181
  this.registry = parsed;
181
182
  return;
182
183
  }
183
- // Sessions registered there are forgotten (their .otacon/ dirs survive for
184
- // manual recovery); the alternative is a daemon that can never boot again.
184
+ // Sessions registered there are forgotten (their ~/.otacon/sessions/<id>/
185
+ // dirs survive for manual recovery); the alternative is a daemon that can
186
+ // never boot again.
185
187
  quarantineCorruptFile(this.registryFile, "session registry");
186
188
  this.registry = { version: 1, sessions: {} };
187
189
  this.flushRegistry();
@@ -207,16 +209,17 @@ export class Store {
207
209
  updatedAt: now,
208
210
  };
209
211
  // State files first, registry entry last: the registry is the commit point.
210
- // A crash in between leaves an orphan .otacon/<id>/ dir (harmless), never a
211
- // registered session whose state files are missing (wedged forever).
212
+ // A crash in between leaves an orphan ~/.otacon/sessions/<id>/ dir
213
+ // (harmless), never a registered session whose state files are missing
214
+ // (wedged forever).
212
215
  const state = {
213
216
  id,
214
217
  revision: 0,
215
218
  lastReviewedRevision: 0,
216
219
  counters: { batch: 0, thread: 0, question: 0, eventSeq: 0 },
217
220
  };
218
- writeFileAtomic(paths.sessionStatePath(input.repo, id), stringify(state));
219
- writeFileAtomic(paths.eventsPath(input.repo, id), stringify({ version: 1, events: [] }));
221
+ writeFileAtomic(paths.sessionStatePath(id), stringify(state));
222
+ writeFileAtomic(paths.eventsPath(id), stringify({ version: 1, events: [] }));
220
223
  this.registry.sessions[id] = session;
221
224
  this.flushRegistry();
222
225
  return { ...session };
@@ -229,8 +232,8 @@ export class Store {
229
232
  return { ...session };
230
233
  }
231
234
  /**
232
- * Remove a session from the registry (otacon clean, DESIGN.md §12); the
233
- * .otacon/<id>/ dir in its repo is the CLI's to archive afterwards.
235
+ * Remove a session from the registry (otacon clean, approval and archive lifecycle); its home
236
+ * dir `~/.otacon/sessions/<id>/` is the CLI's/daemon's to remove afterwards.
234
237
  */
235
238
  deleteSession(id) {
236
239
  const session = this.require(id);
@@ -239,39 +242,18 @@ export class Store {
239
242
  return { ...session };
240
243
  }
241
244
  /**
242
- * Hard-remove a session's working dir `.otacon/<id>/` (the UI deleting a
243
- * *pending* session, DESIGN.md §12): permanent, no archive for a session
244
- * with no committed artifact. `repo` is passed explicitly because the caller
245
- * deregisters first, so require() would already throw. Idempotent: a missing
246
- * dir is fine (force).
245
+ * Permanently remove a session's home dir `~/.otacon/sessions/<id>/` (UI delete
246
+ * and `otacon clean`, all statuses): no archive, nothing recoverable from
247
+ * otacon itself. The durable copies are the Save copy under `plans.dir` and
248
+ * (for Implement plans) the PR. Called after the caller deregisters, so it
249
+ * takes the id directly. Idempotent: a missing dir is fine (force).
247
250
  */
248
- removeSessionDir(repo, id) {
249
- rmSync(paths.sessionDir(repo, id), { recursive: true, force: true });
250
- }
251
- /**
252
- * Archive a session's working dir `.otacon/<id>/` → `.otacon/archive/<id>/`
253
- * in its repo (numeric suffix on name collision); returns the destination, or
254
- * null when there was no dir. The recoverable counterpart to removeSessionDir,
255
- * for a session whose plan is already preserved in the home archive (approved):
256
- * `otacon clean` and the UI's delete of an approved session both archive
257
- * through here. `repo` is
258
- * passed explicitly because the caller deregisters first (require() throws).
259
- */
260
- archiveSessionDir(repo, id) {
261
- const source = paths.sessionDir(repo, id);
262
- if (!existsSync(source))
263
- return null;
264
- const base = join(paths.otaconDir(repo), "archive");
265
- mkdirSync(base, { recursive: true });
266
- let dest = join(base, id);
267
- for (let n = 2; existsSync(dest); n++)
268
- dest = join(base, `${id}-${n}`);
269
- renameSync(source, dest);
270
- return dest;
251
+ removeSessionDir(id) {
252
+ rmSync(paths.sessionDir(id), { recursive: true, force: true });
271
253
  }
272
254
  readState(id) {
273
- const session = this.require(id);
274
- const path = paths.sessionStatePath(session.repo, id);
255
+ this.require(id);
256
+ const path = paths.sessionStatePath(id);
275
257
  if (existsSync(path)) {
276
258
  const parsed = parseState(readJsonOr(path));
277
259
  if (parsed && parsed.id === id)
@@ -286,9 +268,9 @@ export class Store {
286
268
  // degrades to "previous revision", which the user can re-select.
287
269
  const state = {
288
270
  id,
289
- revision: recoverRevision(session.repo, id),
271
+ revision: recoverRevision(id),
290
272
  lastReviewedRevision: 0,
291
- counters: recoverCounters(session.repo, id),
273
+ counters: recoverCounters(id),
292
274
  };
293
275
  writeFileAtomic(path, stringify(state));
294
276
  return state;
@@ -299,36 +281,33 @@ export class Store {
299
281
  * backwards — older baselines stay reachable via the diff endpoint's ?from=.
300
282
  */
301
283
  markReviewed(id, n) {
302
- const session = this.require(id);
303
- const state = this.readState(id);
284
+ const state = this.readState(id); // throws on unknown id
304
285
  if (n > state.lastReviewedRevision) {
305
286
  state.lastReviewedRevision = Math.min(n, state.revision);
306
- writeFileAtomic(paths.sessionStatePath(session.repo, id), stringify(state));
287
+ writeFileAtomic(paths.sessionStatePath(id), stringify(state));
307
288
  }
308
289
  return state.lastReviewedRevision;
309
290
  }
310
291
  /**
311
- * Arm a deferred approval (comment & approve, DESIGN.md §6, §12): the session
292
+ * Arm a deferred approval (comment & approve): the session
312
293
  * has flipped to `finalizing`, and the agent's next clean `submit` finalizes,
313
294
  * carrying the `implement` choice and the swept comment-thread ids. Persisted
314
295
  * on session.json (not the registry) — daemon-owned detail, like the counters.
315
296
  */
316
297
  setPendingApproval(id, pendingApproval) {
317
- const session = this.require(id);
318
- const state = this.readState(id);
298
+ const state = this.readState(id); // throws on unknown id
319
299
  state.pendingApproval = pendingApproval;
320
- writeFileAtomic(paths.sessionStatePath(session.repo, id), stringify(state));
300
+ writeFileAtomic(paths.sessionStatePath(id), stringify(state));
321
301
  }
322
302
  /** Disarm the deferred approval once it has finalized (or been force-escaped). */
323
303
  clearPendingApproval(id) {
324
- const session = this.require(id);
325
- const state = this.readState(id);
304
+ const state = this.readState(id); // throws on unknown id
326
305
  if (state.pendingApproval === undefined)
327
306
  return;
328
307
  delete state.pendingApproval;
329
- writeFileAtomic(paths.sessionStatePath(session.repo, id), stringify(state));
308
+ writeFileAtomic(paths.sessionStatePath(id), stringify(state));
330
309
  }
331
- /** Increment one daemon-owned counter (DESIGN.md §6 stable ids) and persist it. */
310
+ /** Increment one daemon-owned counter (review loop and daemon API stable ids) and persist it. */
332
311
  bumpCounter(id, key) {
333
312
  return this.bumpCounters(id, { [key]: 1 })[key];
334
313
  }
@@ -338,17 +317,16 @@ export class Store {
338
317
  * updated counter values.
339
318
  */
340
319
  bumpCounters(id, by) {
341
- const session = this.require(id);
342
- const state = this.readState(id);
320
+ const state = this.readState(id); // throws on unknown id
343
321
  for (const key of Object.keys(by)) {
344
322
  state.counters[key] += by[key] ?? 0;
345
323
  }
346
- writeFileAtomic(paths.sessionStatePath(session.repo, id), stringify(state));
324
+ writeFileAtomic(paths.sessionStatePath(id), stringify(state));
347
325
  return { ...state.counters };
348
326
  }
349
327
  /**
350
328
  * Store the next revision snapshot r<N>.md plus the lint warnings it was
351
- * accepted with (r<N>.warnings.json — the UI's L6 badges; DESIGN.md §12)
329
+ * accepted with (r<N>.warnings.json — the UI's L6 badges; approval and archive lifecycle)
352
330
  * and the agent's changelog when one accompanied it (r<N>.changelog.md);
353
331
  * returns N.
354
332
  */
@@ -356,25 +334,25 @@ export class Store {
356
334
  const session = this.require(id);
357
335
  const state = this.readState(id);
358
336
  state.revision += 1;
359
- writeFileAtomic(paths.revisionPath(session.repo, id, state.revision), content);
360
- writeFileAtomic(paths.revisionWarningsPath(session.repo, id, state.revision), stringify(warnings));
337
+ writeFileAtomic(paths.revisionPath(id, state.revision), content);
338
+ writeFileAtomic(paths.revisionWarningsPath(id, state.revision), stringify(warnings));
361
339
  if (changelog !== undefined && changelog.trim() !== "") {
362
- writeFileAtomic(paths.revisionChangelogPath(session.repo, id, state.revision), changelog);
340
+ writeFileAtomic(paths.revisionChangelogPath(id, state.revision), changelog);
363
341
  }
364
- writeFileAtomic(paths.sessionStatePath(session.repo, id), stringify(state));
342
+ writeFileAtomic(paths.sessionStatePath(id), stringify(state));
365
343
  session.updatedAt = new Date().toISOString();
366
344
  this.flushRegistry();
367
345
  return state.revision;
368
346
  }
369
347
  readRevision(id, n) {
370
- const session = this.require(id);
371
- return readFileSync(paths.revisionPath(session.repo, id, n), "utf8");
348
+ this.require(id); // throws on unknown id
349
+ return readFileSync(paths.revisionPath(id, n), "utf8");
372
350
  }
373
351
  /** The changelog submitted with r<n>.md; null when none was (r1, typically). */
374
352
  readRevisionChangelog(id, n) {
375
- const session = this.require(id);
353
+ this.require(id); // throws on unknown id
376
354
  try {
377
- return readFileSync(paths.revisionChangelogPath(session.repo, id, n), "utf8");
355
+ return readFileSync(paths.revisionChangelogPath(id, n), "utf8");
378
356
  }
379
357
  catch {
380
358
  return null;
@@ -385,25 +363,34 @@ export class Store {
385
363
  * badges are presentation metadata, never worth quarantine machinery.
386
364
  */
387
365
  readRevisionWarnings(id, n) {
388
- const session = this.require(id);
389
- const raw = readJsonOr(paths.revisionWarningsPath(session.repo, id, n));
366
+ this.require(id); // throws on unknown id
367
+ const raw = readJsonOr(paths.revisionWarningsPath(id, n));
390
368
  return Array.isArray(raw) ? raw : [];
391
369
  }
392
370
  /** Where this session's SessionQueue persists — for the daemon to wire queues. */
393
371
  eventsPath(id) {
394
- return paths.eventsPath(this.require(id).repo, id);
372
+ this.require(id); // throws on unknown id
373
+ return paths.eventsPath(id);
395
374
  }
396
375
  /** Where this session's review threads persist (src/daemon/threads.ts). */
397
376
  threadsPath(id) {
398
- return paths.threadsPath(this.require(id).repo, id);
377
+ this.require(id); // throws on unknown id
378
+ return paths.threadsPath(id);
399
379
  }
400
380
  /** Where this session's grill transcript persists (src/daemon/transcript.ts). */
401
381
  transcriptPath(id) {
402
- return paths.transcriptPath(this.require(id).repo, id);
382
+ this.require(id); // throws on unknown id
383
+ return paths.transcriptPath(id);
403
384
  }
404
385
  /** Where this session's live-activity feed persists (src/daemon/activity.ts). */
405
386
  activityPath(id) {
406
- return paths.activityPath(this.require(id).repo, id);
387
+ this.require(id); // throws on unknown id
388
+ return paths.activityPath(id);
389
+ }
390
+ /** Where this session's normalized live-activity stream persists (src/daemon/capture/stream-store.ts). */
391
+ streamPath(id) {
392
+ this.require(id); // throws on unknown id
393
+ return paths.streamPath(id);
407
394
  }
408
395
  require(id) {
409
396
  const session = this.registry.sessions[id];
@@ -1 +1 @@
1
- {"version":3,"file":"store.js","sourceRoot":"","sources":["../../src/daemon/store.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"store.js","sourceRoot":"","sources":["../../src/daemon/store.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  // Per-session thread persistence: .otacon/<id>/threads.json holds every
2
2
  // comment and question thread so the review UI's rail can render the whole
3
- // conversation on any load (DESIGN.md §9, §12) — the event queue drains, so
3
+ // conversation on any load (threaded review and revision, approval and archive lifecycle) — the event queue drains, so
4
4
  // it cannot be the rail's source. Same storage posture as the rest of the
5
5
  // daemon: atomic writes, corrupt files quarantined and rebuilt empty, never
6
6
  // fatal (DECISIONS.md "Threads: one threads.json per session").
@@ -14,6 +14,16 @@ function isAnchor(raw) {
14
14
  const anchor = raw;
15
15
  return typeof anchor === "object" && typeof anchor.section === "string";
16
16
  }
17
+ /** The reviewer-close stamp (`resolved`) on either thread variant; absent = open. */
18
+ function isResolved(raw) {
19
+ if (raw === undefined)
20
+ return true;
21
+ const resolved = raw;
22
+ return (typeof resolved === "object" &&
23
+ resolved !== null &&
24
+ typeof resolved.revision === "number" &&
25
+ typeof resolved.at === "string");
26
+ }
17
27
  function isThread(raw) {
18
28
  const thread = raw;
19
29
  if (typeof thread !== "object" || thread === null)
@@ -27,18 +37,28 @@ function isThread(raw) {
27
37
  if (thread.kind === "comment") {
28
38
  if (typeof thread.batch !== "string")
29
39
  return false;
30
- const { resolution } = thread;
31
- if (resolution === undefined)
40
+ if (thread.replyTo !== undefined && typeof thread.replyTo !== "string")
41
+ return false;
42
+ if (!isResolved(thread.resolved))
43
+ return false;
44
+ // A leftover legacy `resolution` (an old-code in-flight session, normalized
45
+ // to `reply` in normalizeThread) is tolerated with the new `reply` shape.
46
+ const reply = thread.reply ?? thread.resolution;
47
+ if (reply === undefined)
32
48
  return true;
33
- return (typeof resolution === "object" &&
34
- resolution !== null &&
35
- typeof resolution.body === "string" &&
36
- typeof resolution.revision === "number" &&
37
- typeof resolution.resolvedAt === "string");
49
+ return (typeof reply === "object" &&
50
+ reply !== null &&
51
+ typeof reply.body === "string" &&
52
+ typeof reply.revision === "number" &&
53
+ // accept either the new `repliedAt` or the legacy `resolvedAt`
54
+ (typeof reply.repliedAt === "string" ||
55
+ typeof reply.resolvedAt === "string"));
38
56
  }
39
57
  if (thread.kind === "question") {
40
58
  if (thread.replyTo !== undefined && typeof thread.replyTo !== "string")
41
59
  return false;
60
+ if (!isResolved(thread.resolved))
61
+ return false;
42
62
  const { answer } = thread;
43
63
  if (answer === undefined)
44
64
  return true;
@@ -49,6 +69,21 @@ function isThread(raw) {
49
69
  }
50
70
  return false;
51
71
  }
72
+ /**
73
+ * Read-path normalization: an in-flight session written by the pre-Phase-2 code
74
+ * stores the agent's response as `resolution: {body, revision, resolvedAt}`. Map
75
+ * it onto the current `reply: {body, revision, repliedAt}` so the old session is
76
+ * never quarantined (and the rest of the daemon only ever sees `reply`).
77
+ */
78
+ function normalizeThread(thread) {
79
+ const legacy = thread;
80
+ if (thread.kind === "comment" && thread.reply === undefined && legacy.resolution !== undefined) {
81
+ const { body, revision, resolvedAt } = legacy.resolution;
82
+ thread.reply = { body, revision, repliedAt: resolvedAt };
83
+ delete legacy.resolution;
84
+ }
85
+ return thread;
86
+ }
52
87
  // Every element is validated, not just the envelope: a JSON-valid file with a
53
88
  // corrupt element would otherwise flow a non-Thread into answerQuestion (500)
54
89
  // and the rail (render crash) — exactly the "never fatal" failures quarantine
@@ -60,7 +95,9 @@ function parseThreads(raw) {
60
95
  file.version === 1 &&
61
96
  Array.isArray(file.threads) &&
62
97
  file.threads.every(isThread);
63
- return valid ? file : undefined;
98
+ // Normalize the legacy `resolution` field to `reply` post-validation, so an
99
+ // in-flight old-code session reads (and re-writes) as the current shape.
100
+ return valid ? { ...file, threads: file.threads.map(normalizeThread) } : undefined;
64
101
  }
65
102
  /** All threads, oldest first. Missing file = no threads yet; corrupt = quarantined, []. */
66
103
  export function readThreads(path) {
@@ -97,9 +134,10 @@ export function answerQuestion(path, id, body) {
97
134
  }
98
135
  /**
99
136
  * Apply an accepted revision to the threads file, in one read + one atomic
100
- * write: record the resolution replies on their comment threads (lint L5 has
101
- * already vouched for them; re-resolving overwrites — at-least-once), then
102
- * re-locate every thread's anchor in the new plan (DESIGN.md §4) — lost or
137
+ * write: record the agent's replies on their comment threads (lint L5 has
138
+ * already vouched for them; re-replying overwrites — at-least-once) — a reply is
139
+ * a *response*, not a close (the reviewer closes via resolveThread) — then
140
+ * re-locate every thread's anchor in the new plan (plan structure, lint, and anchoring) — lost or
103
141
  * ambiguous quotes turn anchorState "orphaned", re-found ones recover.
104
142
  * Returns the threads that changed, for the daemon's SSE `thread` upserts.
105
143
  */
@@ -108,16 +146,16 @@ export function applyRevisionToThreads(path, opts) {
108
146
  if (threads.length === 0)
109
147
  return [];
110
148
  const changed = new Map();
111
- const resolvedAt = new Date().toISOString();
149
+ const repliedAt = new Date().toISOString();
112
150
  // Segment the new plan once for the whole pass (lazily — a rail of
113
151
  // whole-plan threads never needs it), not per anchored thread.
114
152
  let units;
115
153
  for (const thread of threads) {
116
154
  if (thread.kind === "comment" && opts.replies[thread.id] !== undefined) {
117
- thread.resolution = {
155
+ thread.reply = {
118
156
  body: opts.replies[thread.id],
119
157
  revision: opts.revision,
120
- resolvedAt,
158
+ repliedAt,
121
159
  };
122
160
  changed.set(thread.id, thread);
123
161
  }
@@ -144,21 +182,69 @@ export function applyRevisionToThreads(path, opts) {
144
182
  }
145
183
  return [...changed.values()];
146
184
  }
147
- /** Comment threads with their resolved state — the daemon's L5 context input. */
185
+ /**
186
+ * Set or clear the reviewer's close on a thread (the Resolve verb), in one read +
187
+ * one atomic write: `resolved:true` stamps `{revision, at}` (pass the session's
188
+ * current revision in), `false` clears it. Returns the updated thread, or
189
+ * undefined when no thread with that id exists. Mirrors answerQuestion — at-least-
190
+ * once delivery makes a duplicate resolve a shrug (re-stamps the same close).
191
+ */
192
+ export function resolveThread(path, id, resolved, revision) {
193
+ const threads = readThreads(path);
194
+ const thread = threads.find((t) => t.id === id);
195
+ if (!thread)
196
+ return undefined;
197
+ if (resolved)
198
+ thread.resolved = { revision, at: new Date().toISOString() };
199
+ else
200
+ delete thread.resolved;
201
+ writeFileAtomic(path, stringify({ version: 1, threads }));
202
+ return thread;
203
+ }
204
+ /**
205
+ * The reviewer-resolved comment conversation ROOTS — a comment thread carrying
206
+ * `resolved` is a root (the Resolve verb lands on the root), so its id is what a
207
+ * follow-up turn keys on. Resolving the root withdraws every turn of the
208
+ * conversation at once.
209
+ */
210
+ function resolvedCommentRoots(threads) {
211
+ return new Set(threads
212
+ .filter((t) => t.kind === "comment" && t.resolved !== undefined)
213
+ .map((t) => t.id));
214
+ }
215
+ /**
216
+ * Per-comment-turn states L5 needs to skip a turn — the daemon's L5 context
217
+ * input, one entry per comment thread (root or follow-up): `replied` (this turn
218
+ * has an agent response) and `resolved` (the turn's CONVERSATION ROOT is
219
+ * reviewer-closed). Resolving the root withdraws all its turns from L5 at once,
220
+ * because a follow-up keys its `resolved` on `replyTo ?? id`. L5 demands a reply
221
+ * only for a turn that is neither replied nor (root-)resolved.
222
+ */
148
223
  export function commentThreadStates(path) {
149
- return readThreads(path)
224
+ const threads = readThreads(path);
225
+ const resolvedRootIds = resolvedCommentRoots(threads);
226
+ return threads
150
227
  .filter((t) => t.kind === "comment")
151
- .map((t) => ({ id: t.id, resolved: t.resolution !== undefined }));
228
+ .map((t) => ({
229
+ id: t.id,
230
+ replied: t.reply !== undefined,
231
+ resolved: resolvedRootIds.has(t.replyTo ?? t.id),
232
+ }));
152
233
  }
153
234
  /**
154
- * The still-open comment threads (no resolution) what a **comment & approve**
155
- * fold-in sweeps (DESIGN.md §6, §12): each is re-delivered to the agent in the
156
- * `final:true` comments batch and replayed into the committed `## Review notes`.
157
- * Pure over an already-read thread list so the approve handler reads disk once.
158
- * Open *questions* are not swept they are answered via `otacon answer`, never
159
- * folded into the plan, and an open one at approve still drops as today.
235
+ * The comment turns still owed a response — no agent `reply` on this turn AND the
236
+ * turn's conversation root is not reviewer-`resolved` (a resolved/withdrawn
237
+ * conversation owes nothing). This is what a **comment & approve** fold-in
238
+ * sweeps: each is re-delivered to the agent in the `final:true` comments batch
239
+ * and replayed into the committed `## Review notes`. Pure over an already-read
240
+ * thread list so the approve handler reads disk once. Open *questions* are not
241
+ * swept — they are answered via `otacon answer`, never folded into the plan, and
242
+ * an open one at approve still drops as today.
160
243
  */
161
244
  export function openCommentThreads(threads) {
162
- return threads.filter((t) => t.kind === "comment" && t.resolution === undefined);
245
+ const resolvedRootIds = resolvedCommentRoots(threads);
246
+ return threads.filter((t) => t.kind === "comment" &&
247
+ t.reply === undefined &&
248
+ !resolvedRootIds.has(t.replyTo ?? t.id));
163
249
  }
164
250
  //# sourceMappingURL=threads.js.map