@kynetic-ai/spec 0.9.1 → 0.11.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.
Files changed (310) hide show
  1. package/README.md +2 -1
  2. package/dist/acp/client.d.ts +6 -1
  3. package/dist/acp/client.d.ts.map +1 -1
  4. package/dist/acp/client.js +7 -2
  5. package/dist/acp/client.js.map +1 -1
  6. package/dist/acp/framing.d.ts +12 -1
  7. package/dist/acp/framing.d.ts.map +1 -1
  8. package/dist/acp/framing.js +27 -4
  9. package/dist/acp/framing.js.map +1 -1
  10. package/dist/agent-runtime/dispatch.d.ts +292 -0
  11. package/dist/agent-runtime/dispatch.d.ts.map +1 -0
  12. package/dist/agent-runtime/dispatch.js +860 -0
  13. package/dist/agent-runtime/dispatch.js.map +1 -0
  14. package/dist/agent-runtime/index.d.ts +11 -0
  15. package/dist/agent-runtime/index.d.ts.map +1 -0
  16. package/dist/agent-runtime/index.js +11 -0
  17. package/dist/agent-runtime/index.js.map +1 -0
  18. package/dist/agent-runtime/invocation.d.ts +86 -0
  19. package/dist/agent-runtime/invocation.d.ts.map +1 -0
  20. package/dist/agent-runtime/invocation.js +442 -0
  21. package/dist/agent-runtime/invocation.js.map +1 -0
  22. package/dist/agent-runtime/prompts.d.ts +50 -0
  23. package/dist/agent-runtime/prompts.d.ts.map +1 -0
  24. package/dist/agent-runtime/prompts.js +108 -0
  25. package/dist/agent-runtime/prompts.js.map +1 -0
  26. package/dist/agents/spawner.d.ts.map +1 -1
  27. package/dist/agents/spawner.js +60 -4
  28. package/dist/agents/spawner.js.map +1 -1
  29. package/dist/cli/batch-exec.d.ts.map +1 -1
  30. package/dist/cli/batch-exec.js +140 -62
  31. package/dist/cli/batch-exec.js.map +1 -1
  32. package/dist/cli/batch-write-buffer.d.ts +141 -0
  33. package/dist/cli/batch-write-buffer.d.ts.map +1 -0
  34. package/dist/cli/batch-write-buffer.js +400 -0
  35. package/dist/cli/batch-write-buffer.js.map +1 -0
  36. package/dist/cli/commands/agent.d.ts +20 -0
  37. package/dist/cli/commands/agent.d.ts.map +1 -0
  38. package/dist/cli/commands/agent.js +831 -0
  39. package/dist/cli/commands/agent.js.map +1 -0
  40. package/dist/cli/commands/inbox.d.ts.map +1 -1
  41. package/dist/cli/commands/inbox.js +46 -22
  42. package/dist/cli/commands/inbox.js.map +1 -1
  43. package/dist/cli/commands/index.d.ts +1 -0
  44. package/dist/cli/commands/index.d.ts.map +1 -1
  45. package/dist/cli/commands/index.js +1 -0
  46. package/dist/cli/commands/index.js.map +1 -1
  47. package/dist/cli/commands/item.d.ts.map +1 -1
  48. package/dist/cli/commands/item.js +22 -16
  49. package/dist/cli/commands/item.js.map +1 -1
  50. package/dist/cli/commands/log.js +1 -1
  51. package/dist/cli/commands/log.js.map +1 -1
  52. package/dist/cli/commands/meta.d.ts.map +1 -1
  53. package/dist/cli/commands/meta.js +168 -6
  54. package/dist/cli/commands/meta.js.map +1 -1
  55. package/dist/cli/commands/module.d.ts.map +1 -1
  56. package/dist/cli/commands/module.js +2 -1
  57. package/dist/cli/commands/module.js.map +1 -1
  58. package/dist/cli/commands/plan-import.js +19 -3
  59. package/dist/cli/commands/plan-import.js.map +1 -1
  60. package/dist/cli/commands/plan.d.ts.map +1 -1
  61. package/dist/cli/commands/plan.js +87 -43
  62. package/dist/cli/commands/plan.js.map +1 -1
  63. package/dist/cli/commands/ralph.d.ts +5 -56
  64. package/dist/cli/commands/ralph.d.ts.map +1 -1
  65. package/dist/cli/commands/ralph.js +52 -1502
  66. package/dist/cli/commands/ralph.js.map +1 -1
  67. package/dist/cli/commands/search.d.ts.map +1 -1
  68. package/dist/cli/commands/search.js +22 -13
  69. package/dist/cli/commands/search.js.map +1 -1
  70. package/dist/cli/commands/serve.d.ts.map +1 -1
  71. package/dist/cli/commands/serve.js +70 -11
  72. package/dist/cli/commands/serve.js.map +1 -1
  73. package/dist/cli/commands/session/checkpoint.d.ts.map +1 -1
  74. package/dist/cli/commands/session/checkpoint.js +7 -2
  75. package/dist/cli/commands/session/checkpoint.js.map +1 -1
  76. package/dist/cli/commands/session/commands.d.ts.map +1 -1
  77. package/dist/cli/commands/session/commands.js +15 -0
  78. package/dist/cli/commands/session/commands.js.map +1 -1
  79. package/dist/cli/commands/session/context.d.ts.map +1 -1
  80. package/dist/cli/commands/session/context.js +10 -5
  81. package/dist/cli/commands/session/context.js.map +1 -1
  82. package/dist/cli/commands/session/log.d.ts +1 -0
  83. package/dist/cli/commands/session/log.d.ts.map +1 -1
  84. package/dist/cli/commands/session/log.js +124 -8
  85. package/dist/cli/commands/session/log.js.map +1 -1
  86. package/dist/cli/commands/session/stale-close.d.ts +17 -0
  87. package/dist/cli/commands/session/stale-close.d.ts.map +1 -0
  88. package/dist/cli/commands/session/stale-close.js +378 -0
  89. package/dist/cli/commands/session/stale-close.js.map +1 -0
  90. package/dist/cli/commands/setup.d.ts.map +1 -1
  91. package/dist/cli/commands/setup.js +95 -0
  92. package/dist/cli/commands/setup.js.map +1 -1
  93. package/dist/cli/commands/skill-crud.d.ts.map +1 -1
  94. package/dist/cli/commands/skill-crud.js +4 -3
  95. package/dist/cli/commands/skill-crud.js.map +1 -1
  96. package/dist/cli/commands/skill-diff.d.ts.map +1 -1
  97. package/dist/cli/commands/skill-diff.js +15 -0
  98. package/dist/cli/commands/skill-diff.js.map +1 -1
  99. package/dist/cli/commands/skill-install.d.ts.map +1 -1
  100. package/dist/cli/commands/skill-install.js +50 -18
  101. package/dist/cli/commands/skill-install.js.map +1 -1
  102. package/dist/cli/commands/task.d.ts.map +1 -1
  103. package/dist/cli/commands/task.js +536 -310
  104. package/dist/cli/commands/task.js.map +1 -1
  105. package/dist/cli/commands/tasks.js +1 -1
  106. package/dist/cli/commands/tasks.js.map +1 -1
  107. package/dist/cli/commands/triage.d.ts.map +1 -1
  108. package/dist/cli/commands/triage.js +37 -13
  109. package/dist/cli/commands/triage.js.map +1 -1
  110. package/dist/cli/commands/validate.d.ts.map +1 -1
  111. package/dist/cli/commands/validate.js +65 -25
  112. package/dist/cli/commands/validate.js.map +1 -1
  113. package/dist/cli/help/content.d.ts.map +1 -1
  114. package/dist/cli/help/content.js +5 -0
  115. package/dist/cli/help/content.js.map +1 -1
  116. package/dist/cli/index.d.ts.map +1 -1
  117. package/dist/cli/index.js +2 -1
  118. package/dist/cli/index.js.map +1 -1
  119. package/dist/cli/output.d.ts.map +1 -1
  120. package/dist/cli/output.js +5 -1
  121. package/dist/cli/output.js.map +1 -1
  122. package/dist/daemon/project-context.ts +22 -0
  123. package/dist/daemon/routes/agent-dispatch.ts +279 -0
  124. package/dist/daemon/routes/items.ts +22 -0
  125. package/dist/daemon/routes/meta.ts +141 -1
  126. package/dist/daemon/routes/plans.ts +147 -0
  127. package/dist/daemon/routes/sessions.ts +180 -0
  128. package/dist/daemon/routes/tasks.ts +198 -0
  129. package/dist/daemon/routes/validation.ts +1 -1
  130. package/dist/daemon/server.ts +77 -21
  131. package/dist/daemon/websocket/handler.ts +67 -6
  132. package/dist/daemon/websocket/lifecycle.ts +19 -0
  133. package/dist/daemon/websocket/pubsub.ts +74 -3
  134. package/dist/export/html.d.ts.map +1 -1
  135. package/dist/export/html.js +5 -2
  136. package/dist/export/html.js.map +1 -1
  137. package/dist/export/triage.d.ts +1 -1
  138. package/dist/export/triage.d.ts.map +1 -1
  139. package/dist/export/triage.js +5 -3
  140. package/dist/export/triage.js.map +1 -1
  141. package/dist/parser/alignment.d.ts.map +1 -1
  142. package/dist/parser/alignment.js +10 -5
  143. package/dist/parser/alignment.js.map +1 -1
  144. package/dist/parser/assess.js +1 -1
  145. package/dist/parser/assess.js.map +1 -1
  146. package/dist/parser/config.d.ts +6 -6
  147. package/dist/parser/meta.d.ts.map +1 -1
  148. package/dist/parser/meta.js +9 -8
  149. package/dist/parser/meta.js.map +1 -1
  150. package/dist/parser/plan-document.d.ts +12 -12
  151. package/dist/parser/plans.d.ts +7 -0
  152. package/dist/parser/plans.d.ts.map +1 -1
  153. package/dist/parser/plans.js +100 -15
  154. package/dist/parser/plans.js.map +1 -1
  155. package/dist/parser/refs.d.ts +5 -0
  156. package/dist/parser/refs.d.ts.map +1 -1
  157. package/dist/parser/refs.js +17 -12
  158. package/dist/parser/refs.js.map +1 -1
  159. package/dist/parser/shadow.d.ts +1 -1
  160. package/dist/parser/shadow.d.ts.map +1 -1
  161. package/dist/parser/shadow.js +71 -4
  162. package/dist/parser/shadow.js.map +1 -1
  163. package/dist/parser/skill-render.d.ts.map +1 -1
  164. package/dist/parser/skill-render.js +6 -3
  165. package/dist/parser/skill-render.js.map +1 -1
  166. package/dist/parser/validate.d.ts.map +1 -1
  167. package/dist/parser/validate.js +35 -76
  168. package/dist/parser/validate.js.map +1 -1
  169. package/dist/parser/yaml.d.ts +24 -5
  170. package/dist/parser/yaml.d.ts.map +1 -1
  171. package/dist/parser/yaml.js +224 -64
  172. package/dist/parser/yaml.js.map +1 -1
  173. package/dist/schema/meta.d.ts +457 -119
  174. package/dist/schema/meta.d.ts.map +1 -1
  175. package/dist/schema/meta.js +56 -0
  176. package/dist/schema/meta.js.map +1 -1
  177. package/dist/schema/plan.d.ts +22 -22
  178. package/dist/schema/spec.d.ts +39 -39
  179. package/dist/schema/task.d.ts +43 -32
  180. package/dist/schema/task.d.ts.map +1 -1
  181. package/dist/schema/task.js +5 -0
  182. package/dist/schema/task.js.map +1 -1
  183. package/dist/sessions/store.d.ts +126 -0
  184. package/dist/sessions/store.d.ts.map +1 -1
  185. package/dist/sessions/store.js +440 -22
  186. package/dist/sessions/store.js.map +1 -1
  187. package/dist/sessions/types.d.ts +75 -17
  188. package/dist/sessions/types.d.ts.map +1 -1
  189. package/dist/sessions/types.js +51 -1
  190. package/dist/sessions/types.js.map +1 -1
  191. package/dist/triage/actions.d.ts +1 -0
  192. package/dist/triage/actions.d.ts.map +1 -1
  193. package/dist/triage/actions.js +34 -7
  194. package/dist/triage/actions.js.map +1 -1
  195. package/dist/utils/commit.js +1 -1
  196. package/dist/utils/commit.js.map +1 -1
  197. package/dist/web-ui/_app/env.js +1 -0
  198. package/dist/web-ui/_app/immutable/assets/0.BJaYkGW2.css +1 -0
  199. package/dist/web-ui/_app/immutable/assets/9.SzGLxi4x.css +1 -0
  200. package/dist/web-ui/_app/immutable/assets/select-trigger.CV-KWLNP.css +1 -0
  201. package/dist/web-ui/_app/immutable/chunks/-lc0BifF.js +1 -0
  202. package/dist/web-ui/_app/immutable/chunks/62JVKtnb.js +1 -0
  203. package/dist/web-ui/_app/immutable/chunks/8RBjHMN1.js +1 -0
  204. package/dist/web-ui/_app/immutable/chunks/B5LJFxqa.js +1 -0
  205. package/dist/web-ui/_app/immutable/chunks/B5wTVqxm.js +1 -0
  206. package/dist/web-ui/_app/immutable/chunks/B6VSmczZ.js +1 -0
  207. package/dist/web-ui/_app/immutable/chunks/B8a0xDxR.js +1 -0
  208. package/dist/web-ui/_app/immutable/chunks/BEOQc37C.js +1 -0
  209. package/dist/web-ui/_app/immutable/chunks/BHtYorjv.js +1 -0
  210. package/dist/web-ui/_app/immutable/chunks/BJ0JX3ea.js +1 -0
  211. package/dist/web-ui/_app/immutable/chunks/BMuCqDX8.js +1 -0
  212. package/dist/web-ui/_app/immutable/chunks/BP352uRn.js +1 -0
  213. package/dist/web-ui/_app/immutable/chunks/BUZujXJ2.js +1 -0
  214. package/dist/web-ui/_app/immutable/chunks/BVA9Exy-.js +1 -0
  215. package/dist/web-ui/_app/immutable/chunks/BWET-efb.js +1 -0
  216. package/dist/web-ui/_app/immutable/chunks/BXkNecpt.js +1 -0
  217. package/dist/web-ui/_app/immutable/chunks/BYzrIfX8.js +1 -0
  218. package/dist/web-ui/_app/immutable/chunks/BkOJ8DkV.js +1 -0
  219. package/dist/web-ui/_app/immutable/chunks/BpuwufMc.js +1 -0
  220. package/dist/web-ui/_app/immutable/chunks/BwMO4RrG.js +1 -0
  221. package/dist/web-ui/_app/immutable/chunks/BysXJlZb.js +1 -0
  222. package/dist/web-ui/_app/immutable/chunks/C076q4JN.js +1 -0
  223. package/dist/web-ui/_app/immutable/chunks/C33JaVbg.js +1 -0
  224. package/dist/web-ui/_app/immutable/chunks/CGtqifKp.js +1 -0
  225. package/dist/web-ui/_app/immutable/chunks/CHDZZ7OG.js +1 -0
  226. package/dist/web-ui/_app/immutable/chunks/CPPfDSei.js +5 -0
  227. package/dist/web-ui/_app/immutable/chunks/CUir3f4J.js +60 -0
  228. package/dist/web-ui/_app/immutable/chunks/Cncwi6fQ.js +1 -0
  229. package/dist/web-ui/_app/immutable/chunks/CrCIbn0C.js +1 -0
  230. package/dist/web-ui/_app/immutable/chunks/CwELQvbx.js +1 -0
  231. package/dist/web-ui/_app/immutable/chunks/D3vxvonu.js +1 -0
  232. package/dist/web-ui/_app/immutable/chunks/D6TVmR9T.js +1 -0
  233. package/dist/web-ui/_app/immutable/chunks/D7LTux4W.js +1 -0
  234. package/dist/web-ui/_app/immutable/chunks/D82RulSH.js +1 -0
  235. package/dist/web-ui/_app/immutable/chunks/D9QNBZM2.js +2 -0
  236. package/dist/web-ui/_app/immutable/chunks/DAMmvwn4.js +1 -0
  237. package/dist/web-ui/_app/immutable/chunks/DAh4Wfku.js +1 -0
  238. package/dist/web-ui/_app/immutable/chunks/DAx07bEQ.js +1 -0
  239. package/dist/web-ui/_app/immutable/chunks/DBYE9jOd.js +1 -0
  240. package/dist/web-ui/_app/immutable/chunks/DOno4cA2.js +1 -0
  241. package/dist/web-ui/_app/immutable/chunks/DQA8NZIH.js +2 -0
  242. package/dist/web-ui/_app/immutable/chunks/DRfPm2bo.js +1 -0
  243. package/dist/web-ui/_app/immutable/chunks/DhQhksaB.js +1 -0
  244. package/dist/web-ui/_app/immutable/chunks/DjG7s6hm.js +1 -0
  245. package/dist/web-ui/_app/immutable/chunks/DjcCz-PU.js +2 -0
  246. package/dist/web-ui/_app/immutable/chunks/DkltRNvh.js +1 -0
  247. package/dist/web-ui/_app/immutable/chunks/DlaTnPKL.js +1 -0
  248. package/dist/web-ui/_app/immutable/chunks/DvA-KON-.js +1 -0
  249. package/dist/web-ui/_app/immutable/chunks/DxCk-KHc.js +1 -0
  250. package/dist/web-ui/_app/immutable/chunks/DzO4hlg9.js +1 -0
  251. package/dist/web-ui/_app/immutable/chunks/Eo4gF7ih.js +1 -0
  252. package/dist/web-ui/_app/immutable/chunks/ExCq5swK.js +1 -0
  253. package/dist/web-ui/_app/immutable/chunks/T3zZGv51.js +1 -0
  254. package/dist/web-ui/_app/immutable/chunks/XZumBYeP.js +1 -0
  255. package/dist/web-ui/_app/immutable/chunks/_ySfNjkF.js +1 -0
  256. package/dist/web-ui/_app/immutable/chunks/iEtR5cV6.js +1 -0
  257. package/dist/web-ui/_app/immutable/chunks/k_Qegko0.js +1 -0
  258. package/dist/web-ui/_app/immutable/chunks/pE6cYWlS.js +1 -0
  259. package/dist/web-ui/_app/immutable/entry/app.Cgu6uKeS.js +2 -0
  260. package/dist/web-ui/_app/immutable/entry/start.9XifnLoB.js +1 -0
  261. package/dist/web-ui/_app/immutable/nodes/0.DISwcKSK.js +1 -0
  262. package/dist/web-ui/_app/immutable/nodes/1.Cx2Ufqp1.js +1 -0
  263. package/dist/web-ui/_app/immutable/nodes/10.C3z8ijXL.js +1 -0
  264. package/dist/web-ui/_app/immutable/nodes/11.DZdIjZmM.js +1 -0
  265. package/dist/web-ui/_app/immutable/nodes/12.FsIGfAOa.js +1 -0
  266. package/dist/web-ui/_app/immutable/nodes/13.DZoFwagf.js +1 -0
  267. package/dist/web-ui/_app/immutable/nodes/14.DaIzDKbQ.js +1 -0
  268. package/dist/web-ui/_app/immutable/nodes/15.BYyt4XWF.js +2 -0
  269. package/dist/web-ui/_app/immutable/nodes/16.CQkSqpOe.js +1 -0
  270. package/dist/web-ui/_app/immutable/nodes/2.Bkf_j2UJ.js +1 -0
  271. package/dist/web-ui/_app/immutable/nodes/3.kaMCurJG.js +1 -0
  272. package/dist/web-ui/_app/immutable/nodes/4.BSsFPTHG.js +2 -0
  273. package/dist/web-ui/_app/immutable/nodes/5.CpPlcCEZ.js +1 -0
  274. package/dist/web-ui/_app/immutable/nodes/6.BN4FqQmY.js +1 -0
  275. package/dist/web-ui/_app/immutable/nodes/7.9kBYIZik.js +1 -0
  276. package/dist/web-ui/_app/immutable/nodes/8.BuijtZ6B.js +1 -0
  277. package/dist/web-ui/_app/immutable/nodes/9.C-Weba8R.js +1 -0
  278. package/dist/web-ui/_app/version.json +1 -0
  279. package/dist/web-ui/index.html +39 -0
  280. package/dist/web-ui/robots.txt +3 -0
  281. package/package.json +4 -2
  282. package/plugin/.claude-plugin/marketplace.json +1 -1
  283. package/plugin/.claude-plugin/plugin.json +1 -1
  284. package/plugin/plugins/kspec/skills/task-work/SKILL.md +25 -2
  285. package/templates/agents-sections/06-ralph-loop.md +64 -11
  286. package/templates/skills/task-work/SKILL.md +25 -2
  287. package/dist/ralph/cli-renderer.d.ts +0 -27
  288. package/dist/ralph/cli-renderer.d.ts.map +0 -1
  289. package/dist/ralph/cli-renderer.js +0 -250
  290. package/dist/ralph/cli-renderer.js.map +0 -1
  291. package/dist/ralph/events.d.ts +0 -65
  292. package/dist/ralph/events.d.ts.map +0 -1
  293. package/dist/ralph/events.js +0 -600
  294. package/dist/ralph/events.js.map +0 -1
  295. package/dist/ralph/index.d.ts +0 -11
  296. package/dist/ralph/index.d.ts.map +0 -1
  297. package/dist/ralph/index.js +0 -16
  298. package/dist/ralph/index.js.map +0 -1
  299. package/dist/ralph/loop-errors.d.ts +0 -83
  300. package/dist/ralph/loop-errors.d.ts.map +0 -1
  301. package/dist/ralph/loop-errors.js +0 -150
  302. package/dist/ralph/loop-errors.js.map +0 -1
  303. package/dist/ralph/subagent.d.ts +0 -127
  304. package/dist/ralph/subagent.d.ts.map +0 -1
  305. package/dist/ralph/subagent.js +0 -268
  306. package/dist/ralph/subagent.js.map +0 -1
  307. package/dist/ralph/wrap-up.d.ts +0 -127
  308. package/dist/ralph/wrap-up.d.ts.map +0 -1
  309. package/dist/ralph/wrap-up.js +0 -271
  310. package/dist/ralph/wrap-up.js.map +0 -1
@@ -10,9 +10,12 @@ import { cors } from '@elysiajs/cors';
10
10
  import { staticPlugin } from '@elysiajs/static';
11
11
  import { ulid } from 'ulidx';
12
12
  import { existsSync } from 'fs';
13
+ import { fileURLToPath } from 'url';
14
+ import { dirname } from 'path';
13
15
  import { PubSubManager } from './websocket/pubsub';
14
16
  import { HeartbeatManager } from './websocket/heartbeat';
15
17
  import { WebSocketHandler } from './websocket/handler';
18
+ import { handleWebSocketClose } from './websocket/lifecycle';
16
19
  import type { ConnectionData, ConnectedEvent } from './websocket/types';
17
20
  import { PidFileManager } from './pid';
18
21
  import { projectContextMiddleware } from './middleware/project-context';
@@ -23,6 +26,9 @@ import { createMetaRoutes } from './routes/meta';
23
26
  import { createValidationRoutes } from './routes/validation';
24
27
  import { createProjectsRoutes } from './routes/projects';
25
28
  import { createTriageRoutes } from './routes/triage';
29
+ import { createAgentDispatchRoutes, getDispatchEngine, stopAllEngines } from './routes/agent-dispatch';
30
+ import { createSessionRoutes } from './routes/sessions';
31
+ import { createPlansRoutes } from './routes/plans';
26
32
  import { join } from 'path';
27
33
 
28
34
  export interface ServerOptions {
@@ -39,8 +45,11 @@ export interface ServerOptions {
39
45
  * 2. WEB_UI_DIR environment variable
40
46
  * 3. packages/web-ui/build in current working directory (monorepo dev)
41
47
  * 4. web-ui/build in current working directory
48
+ * 5. Bundled dist/web-ui/ relative to this module (npm package installs)
49
+ *
50
+ * Exported for testing only.
42
51
  */
43
- function resolveWebUiPath(webUiDir?: string): string | null {
52
+ export function resolveWebUiPath(webUiDir?: string): string | null {
44
53
  // 1. Explicit option
45
54
  if (webUiDir && existsSync(webUiDir)) {
46
55
  return webUiDir;
@@ -65,6 +74,15 @@ function resolveWebUiPath(webUiDir?: string): string | null {
65
74
  return altPath;
66
75
  }
67
76
 
77
+ // 5. Bundled assets: dist/web-ui/ relative to daemon module location
78
+ // Covers npm package installs where no local web UI build exists.
79
+ // import.meta.url resolves to dist/daemon/server.js → sibling is dist/web-ui/
80
+ const selfDir = dirname(fileURLToPath(import.meta.url));
81
+ const bundledPath = join(selfDir, '..', 'web-ui');
82
+ if (existsSync(bundledPath)) {
83
+ return bundledPath;
84
+ }
85
+
68
86
  return null;
69
87
  }
70
88
 
@@ -166,8 +184,10 @@ export async function createServer(options: ServerOptions) {
166
184
  heartbeatManager = new HeartbeatManager();
167
185
  wsHandler = new WebSocketHandler(pubsubManager);
168
186
 
169
- // WeakMap to store project path during WebSocket upgrade
170
- const wsProjectPaths = new Map<string, string>();
187
+ // WeakMap to store project path during WebSocket upgrade (keyed by Request object)
188
+ // Using WeakMap avoids needing to pass a requestId through beforeHandle return value,
189
+ // which breaks WebSocket upgrade in Elysia 1.4 when derive middleware is present.
190
+ const wsProjectPaths = new WeakMap<Request, string>();
171
191
 
172
192
  const app = new Elysia()
173
193
  // AC-15: Plugin pattern for middleware
@@ -222,6 +242,16 @@ export async function createServer(options: ServerOptions) {
222
242
  // AC: @multi-directory-daemon ac-28, ac-29, ac-30 - Projects management endpoints
223
243
  .use(createProjectsRoutes({ projectManager: projectContextManager }))
224
244
 
245
+ // AC: @ui-session-stream ac-1, ac-4 - Session data endpoints
246
+ .use(createSessionRoutes())
247
+
248
+ // AC: @ui-plans-view ac-1 - Plans data endpoints
249
+ .use(createPlansRoutes())
250
+
251
+ // AC: @agent-dispatch-engine ac-4 - Agent dispatch API endpoints
252
+ // AC: @daemon-agent-dispatch ac-3, ac-4 - Pass pubsub for WebSocket broadcast on invocation events
253
+ .use(createAgentDispatchRoutes({ pubsub: pubsubManager }))
254
+
225
255
  // AC-4: WebSocket endpoint for real-time updates
226
256
  .ws<ConnectionData>('/ws', {
227
257
  beforeHandle({ request, store }) {
@@ -232,14 +262,17 @@ export async function createServer(options: ServerOptions) {
232
262
  const projectPath = request.headers.get('X-Kspec-Dir')
233
263
  || url.searchParams.get('project')
234
264
  || undefined;
235
- const requestId = ulid(); // Temporary ID to correlate upgrade with open
236
265
 
266
+ // IMPORTANT: Do NOT return a value from ws beforeHandle.
267
+ // In Elysia 1.4 with derive middleware, returning a value short-circuits
268
+ // the WebSocket upgrade and sends the value as an HTTP 200 response.
269
+ // Use a WeakMap keyed by Request object to pass data to open().
237
270
  try {
238
271
  const manager = (store as Record<string, unknown>).projectManager as import('./project-context').ProjectContextManager | undefined;
239
272
  if (!manager) {
240
273
  // Fallback: project manager not initialized yet
241
- wsProjectPaths.set(requestId, startupProjectPath);
242
- return { wsRequestId: requestId };
274
+ wsProjectPaths.set(request, startupProjectPath);
275
+ return;
243
276
  }
244
277
 
245
278
  let projectContext;
@@ -264,9 +297,8 @@ export async function createServer(options: ServerOptions) {
264
297
  }
265
298
  }
266
299
 
267
- // Store resolved path for open() handler
268
- wsProjectPaths.set(requestId, projectContext.path);
269
- return { wsRequestId: requestId };
300
+ // Store resolved path for open() handler via WeakMap
301
+ wsProjectPaths.set(request, projectContext.path);
270
302
  } catch (err: unknown) {
271
303
  console.error(`[daemon] WebSocket connection rejected: ${err instanceof Error ? err.message : String(err)}`);
272
304
  throw err;
@@ -275,16 +307,13 @@ export async function createServer(options: ServerOptions) {
275
307
  open(ws) {
276
308
  // AC: @api-contract ac-25, @trait-websocket-protocol ac-1
277
309
  const sessionId = ulid();
310
+ const openContext = ws.data as { id?: unknown; request?: unknown } | undefined;
311
+ const contextId = typeof openContext?.id === 'string' ? openContext.id : undefined;
278
312
 
279
313
  // AC: @multi-directory-daemon ac-21 - Get bound project path
280
- // Fallback to startup project if not found (shouldn't happen)
281
- const requestId = (ws.data as ConnectionData & { wsRequestId?: string }).wsRequestId;
282
- const projectPath = requestId ? wsProjectPaths.get(requestId) || startupProjectPath : startupProjectPath;
283
-
284
- // Clean up temporary mapping
285
- if (requestId) {
286
- wsProjectPaths.delete(requestId);
287
- }
314
+ // Retrieve project path from WeakMap via the request object on ws.data
315
+ const request = openContext?.request as Request | undefined;
316
+ const projectPath = request ? wsProjectPaths.get(request) || startupProjectPath : startupProjectPath;
288
317
 
289
318
  ws.data = {
290
319
  sessionId,
@@ -295,7 +324,7 @@ export async function createServer(options: ServerOptions) {
295
324
  projectPath // AC: @multi-directory-daemon ac-21 - immutable binding
296
325
  };
297
326
 
298
- pubsubManager.addConnection(sessionId, ws);
327
+ pubsubManager.addConnection(sessionId, ws, contextId);
299
328
  console.log(`[daemon] WebSocket client connected: ${sessionId} bound to ${projectPath} (${pubsubManager.getConnectionCount()} total)`);
300
329
 
301
330
  // Send connected event with session_id
@@ -316,8 +345,7 @@ export async function createServer(options: ServerOptions) {
316
345
  heartbeatManager.recordPong(ws);
317
346
  },
318
347
  close(ws, code, reason) {
319
- pubsubManager.removeConnection(ws.data.sessionId);
320
- console.log(`[daemon] WebSocket client disconnected: ${ws.data.sessionId} (code: ${code}, reason: ${reason})`);
348
+ handleWebSocketClose(pubsubManager, ws, code, reason);
321
349
  }
322
350
  });
323
351
 
@@ -335,7 +363,20 @@ export async function createServer(options: ServerOptions) {
335
363
 
336
364
  // SPA fallback routes for client-side routing
337
365
  // These catch paths like /tasks, /items, /inbox that don't have static files
338
- const spaRoutes = ['/tasks', '/tasks/*', '/items', '/items/*', '/inbox', '/observations', '/triage'];
366
+ const spaRoutes = [
367
+ '/tasks', '/tasks/*',
368
+ '/items', '/items/*',
369
+ '/inbox',
370
+ '/observations',
371
+ '/triage',
372
+ '/validate',
373
+ '/sessions', '/sessions/*',
374
+ '/agents',
375
+ '/specs',
376
+ '/workflows',
377
+ '/plans',
378
+ '/settings',
379
+ ];
339
380
  for (const route of spaRoutes) {
340
381
  app.get(route, () => Bun.file(indexHtmlPath));
341
382
  }
@@ -353,6 +394,18 @@ export async function createServer(options: ServerOptions) {
353
394
  console.log(`[daemon] Server listening on http://localhost:${port} (IPv4: 127.0.0.1, IPv6: ::1)`);
354
395
  console.log(`[daemon] WebSocket available at ws://localhost:${port}/ws`);
355
396
 
397
+ // AC: @agent-dispatch-engine ac-5 - Wire file change callback to dispatch engine
398
+ projectContextManager.setFileChangeCallback((projectPath, file) => {
399
+ // Only forward changes to project.tasks.yaml
400
+ if (!file.endsWith('project.tasks.yaml')) return;
401
+ const engine = getDispatchEngine(projectPath);
402
+ if (engine) {
403
+ engine.handleFileChange(projectPath).catch((err) => {
404
+ console.error('[dispatch] Error handling file change:', err);
405
+ });
406
+ }
407
+ });
408
+
356
409
  // AC: @multi-directory-daemon ac-17 - Start file watcher for startup project
357
410
  if (startupProjectPath) {
358
411
  try {
@@ -374,6 +427,9 @@ export async function createServer(options: ServerOptions) {
374
427
  // Stop heartbeat monitoring
375
428
  heartbeatManager.stop();
376
429
 
430
+ // AC: @agent-dispatch-engine ac-11 - Stop all dispatch engines before shutting down
431
+ await stopAllEngines();
432
+
377
433
  // AC: @multi-directory-daemon ac-11b - Stop all file watchers
378
434
  await projectContextManager.stopAllWatchers();
379
435
  console.log('[daemon] All file watchers stopped');
@@ -12,6 +12,49 @@ import type { ServerWebSocket } from 'bun';
12
12
  import type { WebSocketCommand, CommandAck, ConnectionData } from './types';
13
13
  import type { PubSubManager } from './pubsub';
14
14
 
15
+ type WebSocketRawMessage =
16
+ | string
17
+ | Buffer
18
+ | ArrayBuffer
19
+ | ArrayBufferView
20
+ | Blob
21
+ | Record<string, unknown>;
22
+
23
+ /**
24
+ * Decode inbound WebSocket payloads into UTF-8 text.
25
+ *
26
+ * Node/WebSocket clients may deliver command frames as Uint8Array/ArrayBuffer
27
+ * or Blob instead of plain strings.
28
+ */
29
+ async function decodeWebSocketMessage(rawMessage: WebSocketRawMessage): Promise<string> {
30
+ if (typeof rawMessage === 'string') {
31
+ return rawMessage;
32
+ }
33
+
34
+ if (typeof rawMessage === 'object' && rawMessage !== null && !ArrayBuffer.isView(rawMessage)) {
35
+ if (rawMessage instanceof ArrayBuffer) {
36
+ return Buffer.from(rawMessage).toString('utf-8');
37
+ }
38
+
39
+ if (rawMessage instanceof Blob) {
40
+ return await rawMessage.text();
41
+ }
42
+
43
+ // Some runtimes already JSON-decode inbound websocket command payloads.
44
+ return JSON.stringify(rawMessage);
45
+ }
46
+
47
+ if (ArrayBuffer.isView(rawMessage)) {
48
+ return Buffer.from(
49
+ rawMessage.buffer,
50
+ rawMessage.byteOffset,
51
+ rawMessage.byteLength,
52
+ ).toString('utf-8');
53
+ }
54
+
55
+ return String(rawMessage);
56
+ }
57
+
15
58
  export class WebSocketHandler {
16
59
  constructor(private pubsub: PubSubManager) {}
17
60
 
@@ -19,12 +62,22 @@ export class WebSocketHandler {
19
62
  * Handle incoming WebSocket command
20
63
  * AC: @api-contract ac-26, ac-27, ac-28, ac-30
21
64
  */
22
- handleMessage(ws: ServerWebSocket<ConnectionData>, rawMessage: string | Buffer) {
65
+ handleMessage(
66
+ ws: ServerWebSocket<ConnectionData>,
67
+ rawMessage: WebSocketRawMessage,
68
+ ): Promise<void> {
69
+ return this.handleMessageInternal(ws, rawMessage);
70
+ }
71
+
72
+ private async handleMessageInternal(
73
+ ws: ServerWebSocket<ConnectionData>,
74
+ rawMessage: WebSocketRawMessage,
75
+ ): Promise<void> {
23
76
  let command: WebSocketCommand;
24
77
 
25
78
  try {
26
79
  // Parse command
27
- const messageStr = typeof rawMessage === 'string' ? rawMessage : rawMessage.toString();
80
+ const messageStr = await decodeWebSocketMessage(rawMessage);
28
81
  command = JSON.parse(messageStr);
29
82
 
30
83
  // Validate command structure
@@ -76,11 +129,12 @@ export class WebSocketHandler {
76
129
  return;
77
130
  }
78
131
 
79
- const success = this.pubsub.subscribe(ws.data.sessionId, topics);
132
+ const sessionId = this.resolveSessionId(ws);
133
+ const success = sessionId ? this.pubsub.subscribe(sessionId, topics) : false;
80
134
 
81
135
  if (success) {
82
136
  this.sendAck(ws, command.request_id, true);
83
- console.log(`[ws] ${ws.data.sessionId} subscribed to: ${topics.join(', ')}`);
137
+ console.log(`[ws] ${sessionId} subscribed to: ${topics.join(', ')}`);
84
138
  } else {
85
139
  this.sendAck(ws, command.request_id, false, 'not_found', 'Session not found');
86
140
  }
@@ -97,11 +151,12 @@ export class WebSocketHandler {
97
151
  return;
98
152
  }
99
153
 
100
- const success = this.pubsub.unsubscribe(ws.data.sessionId, topics);
154
+ const sessionId = this.resolveSessionId(ws);
155
+ const success = sessionId ? this.pubsub.unsubscribe(sessionId, topics) : false;
101
156
 
102
157
  if (success) {
103
158
  this.sendAck(ws, command.request_id, true);
104
- console.log(`[ws] ${ws.data.sessionId} unsubscribed from: ${topics.join(', ')}`);
159
+ console.log(`[ws] ${sessionId} unsubscribed from: ${topics.join(', ')}`);
105
160
  } else {
106
161
  this.sendAck(ws, command.request_id, false, 'not_found', 'Session not found');
107
162
  }
@@ -114,6 +169,12 @@ export class WebSocketHandler {
114
169
  this.sendAck(ws, command.request_id, true);
115
170
  }
116
171
 
172
+ private resolveSessionId(ws: ServerWebSocket<ConnectionData>): string | undefined {
173
+ const data = ws.data as { id?: unknown } | undefined;
174
+ const contextId = typeof data?.id === 'string' ? data.id : undefined;
175
+ return this.pubsub.getSessionIdBySocket(ws, contextId);
176
+ }
177
+
117
178
  /**
118
179
  * Send ack response
119
180
  * AC: @api-contract ac-27
@@ -0,0 +1,19 @@
1
+ import type { ServerWebSocket } from 'bun';
2
+ import type { ConnectionData } from './types';
3
+ import type { PubSubManager } from './pubsub';
4
+
5
+ /**
6
+ * Handle websocket close cleanup and logging with stable session identity.
7
+ */
8
+ export function handleWebSocketClose(
9
+ pubsub: PubSubManager,
10
+ ws: ServerWebSocket<ConnectionData>,
11
+ code: number,
12
+ reason: string
13
+ ): string {
14
+ const closeContext = ws.data as { id?: unknown } | undefined;
15
+ const contextId = typeof closeContext?.id === 'string' ? closeContext.id : undefined;
16
+ const sessionId = pubsub.removeConnectionBySocket(ws, contextId) ?? 'unknown';
17
+ console.log(`[daemon] WebSocket client disconnected: ${sessionId} (code: ${code}, reason: ${reason})`);
18
+ return sessionId;
19
+ }
@@ -14,22 +14,93 @@ import type { ServerWebSocket } from 'bun';
14
14
  import { ulid } from 'ulidx';
15
15
  import type { BroadcastEvent, ConnectionData } from './types';
16
16
 
17
+ const SESSION_TOPIC_PREFIX = '__kspec_session:';
18
+
19
+ function sessionTopic(sessionId: string): string {
20
+ return `${SESSION_TOPIC_PREFIX}${sessionId}`;
21
+ }
22
+
17
23
  export class PubSubManager {
18
24
  private connections = new Map<string, ServerWebSocket<ConnectionData>>();
25
+ private sessionIdsBySocket = new WeakMap<ServerWebSocket<ConnectionData>, string>();
26
+ private sessionIdsByContextId = new Map<string, string>();
27
+ private contextIdsBySessionId = new Map<string, string>();
19
28
 
20
29
  /**
21
30
  * Register a new WebSocket connection
22
31
  * AC: @trait-websocket-protocol ac-1
23
32
  */
24
- addConnection(sessionId: string, ws: ServerWebSocket<ConnectionData>) {
33
+ addConnection(sessionId: string, ws: ServerWebSocket<ConnectionData>, contextId?: string) {
25
34
  this.connections.set(sessionId, ws);
35
+ this.sessionIdsBySocket.set(ws, sessionId);
36
+ if (contextId) {
37
+ this.sessionIdsByContextId.set(contextId, sessionId);
38
+ this.contextIdsBySessionId.set(sessionId, contextId);
39
+ }
40
+ ws.subscribe?.(sessionTopic(sessionId));
26
41
  }
27
42
 
28
43
  /**
29
44
  * Remove a WebSocket connection
30
45
  */
31
- removeConnection(sessionId: string) {
32
- this.connections.delete(sessionId);
46
+ removeConnection(sessionId: string): boolean {
47
+ const ws = this.connections.get(sessionId);
48
+ if (ws) {
49
+ ws.unsubscribe?.(sessionTopic(sessionId));
50
+ this.sessionIdsBySocket.delete(ws);
51
+ }
52
+ const contextId = this.contextIdsBySessionId.get(sessionId);
53
+ if (contextId) {
54
+ this.contextIdsBySessionId.delete(sessionId);
55
+ this.sessionIdsByContextId.delete(contextId);
56
+ }
57
+ return this.connections.delete(sessionId);
58
+ }
59
+
60
+ /**
61
+ * Resolve a stable session ID for a socket and remove that connection.
62
+ * This is resilient when ws.data.sessionId is missing in close callbacks.
63
+ */
64
+ removeConnectionBySocket(ws: ServerWebSocket<ConnectionData>, contextId?: string): string | undefined {
65
+ const sessionId = this.getSessionIdBySocket(ws, contextId);
66
+ if (!sessionId) {
67
+ return undefined;
68
+ }
69
+
70
+ this.removeConnection(sessionId);
71
+ return sessionId;
72
+ }
73
+
74
+ /**
75
+ * Get stable session ID for socket from registration mapping.
76
+ */
77
+ getSessionIdBySocket(ws: ServerWebSocket<ConnectionData>, contextId?: string): string | undefined {
78
+ const mappedSessionId = this.sessionIdsBySocket.get(ws);
79
+ if (mappedSessionId) {
80
+ return mappedSessionId;
81
+ }
82
+
83
+ const data = ws.data as Partial<ConnectionData> | undefined;
84
+ if (data?.sessionId) {
85
+ return data.sessionId;
86
+ }
87
+
88
+ const subscriptions = (ws as Partial<ServerWebSocket<ConnectionData>>).subscriptions;
89
+ if (Array.isArray(subscriptions)) {
90
+ const sessionSubscription = subscriptions.find((topic) => topic.startsWith(SESSION_TOPIC_PREFIX));
91
+ if (sessionSubscription) {
92
+ return sessionSubscription.slice(SESSION_TOPIC_PREFIX.length);
93
+ }
94
+ }
95
+
96
+ if (contextId) {
97
+ const sessionFromContext = this.sessionIdsByContextId.get(contextId);
98
+ if (sessionFromContext) {
99
+ return sessionFromContext;
100
+ }
101
+ }
102
+
103
+ return undefined;
33
104
  }
34
105
 
35
106
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"html.d.ts","sourceRoot":"","sources":["../../src/export/html.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEhD;;;;;;;;;GASG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,aAAa,GAAG,MAAM,CAmNlE"}
1
+ {"version":3,"file":"html.d.ts","sourceRoot":"","sources":["../../src/export/html.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAGhD;;;;;;;;;GASG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,aAAa,GAAG,MAAM,CAqNlE"}
@@ -4,6 +4,7 @@
4
4
  * Generates self-contained HTML files with embedded JSON and SPA loader.
5
5
  * AC: @gh-pages-export ac-6
6
6
  */
7
+ import { shortestUniqueUlid } from "../parser/refs.js";
7
8
  /**
8
9
  * Generate a self-contained HTML file with embedded JSON snapshot.
9
10
  *
@@ -15,6 +16,8 @@
15
16
  * AC: @gh-pages-export ac-6
16
17
  */
17
18
  export function generateHtmlExport(snapshot) {
19
+ const taskUlids = snapshot.tasks.map((task) => task._ulid);
20
+ const itemUlids = snapshot.items.map((item) => item._ulid);
18
21
  const jsonData = JSON.stringify(snapshot, null, 2);
19
22
  const escapedJson = jsonData
20
23
  .replace(/</g, "\\u003c")
@@ -183,7 +186,7 @@ export function generateHtmlExport(snapshot) {
183
186
  ${escapeHtml(task.title)}
184
187
  </div>
185
188
  <div class="item-meta">
186
- @${task.slugs[0] || task._ulid.slice(0, 8)}
189
+ @${task.slugs[0] || shortestUniqueUlid(task._ulid, taskUlids)}
187
190
  ${task.spec_ref_title ? ` • ${escapeHtml(task.spec_ref_title)}` : ""}
188
191
  </div>
189
192
  </div>
@@ -199,7 +202,7 @@ export function generateHtmlExport(snapshot) {
199
202
  <div class="item">
200
203
  <div class="item-title">${escapeHtml(item.title)}</div>
201
204
  <div class="item-meta">
202
- ${item.type || "item"} • @${item.slugs[0] || item._ulid.slice(0, 8)}
205
+ ${item.type || "item"} • @${item.slugs[0] || shortestUniqueUlid(item._ulid, itemUlids)}
203
206
  ${item.acceptance_criteria?.length ? ` • ${item.acceptance_criteria.length} ACs` : ""}
204
207
  </div>
205
208
  </div>
@@ -1 +1 @@
1
- {"version":3,"file":"html.js","sourceRoot":"","sources":["../../src/export/html.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"html.js","sourceRoot":"","sources":["../../src/export/html.ts"],"names":[],"mappings":"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"}
@@ -16,7 +16,7 @@ export declare function truncateText(text: string, maxLen?: number): string;
16
16
  * AC: @triage-agent-export ac-1
17
17
  * AC: @triage-agent-export ac-3
18
18
  */
19
- export declare function formatTriageRecordContext(record: TriageRecord): string;
19
+ export declare function formatTriageRecordContext(record: TriageRecord, displayRef?: string): string;
20
20
  /**
21
21
  * Export triage records in context (markdown) format.
22
22
  * AC: @triage-agent-export ac-1 — markdown block per record
@@ -1 +1 @@
1
- {"version":3,"file":"triage.d.ts","sourceRoot":"","sources":["../../src/export/triage.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAExD;;GAEG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,GAAE,MAAW,GAAG,MAAM,CAItE;AAED;;;;GAIG;AACH,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,YAAY,GAAG,MAAM,CAsBtE;AAED;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,YAAY,EAAE,GAAG,MAAM,CASrE;AAED;;;;;GAKG;AACH,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,YAAY,EAAE,CAAC;IACtB,KAAK,EAAE,MAAM,CAAC;CACf;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,SAAS,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,MAAM,kBAAkB,GAAG,gBAAgB,GAAG,mBAAmB,CAAC;AAExE;;;GAGG;AACH,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,YAAY,EAAE,EACvB,MAAM,EAAE,MAAM,GAAG,SAAS,GACzB,kBAAkB,CAYpB"}
1
+ {"version":3,"file":"triage.d.ts","sourceRoot":"","sources":["../../src/export/triage.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAGxD;;GAEG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,GAAE,MAAW,GAAG,MAAM,CAItE;AAED;;;;GAIG;AACH,wBAAgB,yBAAyB,CACvC,MAAM,EAAE,YAAY,EACpB,UAAU,GAAE,MAAiC,GAC5C,MAAM,CAsBR;AAED;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,YAAY,EAAE,GAAG,MAAM,CAarE;AAED;;;;;GAKG;AACH,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,YAAY,EAAE,CAAC;IACtB,KAAK,EAAE,MAAM,CAAC;CACf;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,SAAS,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,MAAM,kBAAkB,GAAG,gBAAgB,GAAG,mBAAmB,CAAC;AAExE;;;GAGG;AACH,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,YAAY,EAAE,EACvB,MAAM,EAAE,MAAM,GAAG,SAAS,GACzB,kBAAkB,CAYpB"}
@@ -6,6 +6,7 @@
6
6
  *
7
7
  * AC: @triage-agent-export ac-1, ac-2, ac-3, ac-4
8
8
  */
9
+ import { shortestUniqueUlid } from "../parser/refs.js";
9
10
  /**
10
11
  * Truncate text to a maximum length, taking only the first line.
11
12
  */
@@ -20,9 +21,9 @@ export function truncateText(text, maxLen = 60) {
20
21
  * AC: @triage-agent-export ac-1
21
22
  * AC: @triage-agent-export ac-3
22
23
  */
23
- export function formatTriageRecordContext(record) {
24
+ export function formatTriageRecordContext(record, displayRef = record._ulid.slice(0, 8)) {
24
25
  const lines = [];
25
- lines.push(`### ${record._ulid.slice(0, 8)} — ${truncateText(record.item_snapshot, 80)}`);
26
+ lines.push(`### ${displayRef} — ${truncateText(record.item_snapshot, 80)}`);
26
27
  lines.push("");
27
28
  lines.push(`**Item:** ${record.item_snapshot}`);
28
29
  lines.push(`**Status:** ${record.status}`);
@@ -57,9 +58,10 @@ export function exportTriageAsContext(records) {
57
58
  if (records.length === 0) {
58
59
  return "No triage decisions recorded.";
59
60
  }
61
+ const recordUlids = records.map((record) => record._ulid);
60
62
  let content = "# Triage Decisions\n\n";
61
63
  for (const record of records) {
62
- content += formatTriageRecordContext(record);
64
+ content += formatTriageRecordContext(record, shortestUniqueUlid(record._ulid, recordUlids));
63
65
  }
64
66
  return content;
65
67
  }
@@ -1 +1 @@
1
- {"version":3,"file":"triage.js","sourceRoot":"","sources":["../../src/export/triage.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"triage.js","sourceRoot":"","sources":["../../src/export/triage.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"alignment.d.ts","sourceRoot":"","sources":["../../src/parser/alignment.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAC/D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAChD,OAAO,KAAK,EAAE,YAAY,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAO1E;;GAEG;AACH,MAAM,WAAW,yBAAyB;IACxC,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,oBAAoB,CAAC;IACpC,cAAc,EAAE,oBAAoB,CAAC;IACrC,WAAW,EAAE,iBAAiB,EAAE,CAAC;IACjC,SAAS,EAAE,OAAO,CAAC;CACpB;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,eAAe,GAAG,iBAAiB,GAAG,sBAAsB,CAAC;IACnE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;CACjB;AAMD;;;GAGG;AACH,qBAAa,cAAc;IACzB,+CAA+C;IAC/C,OAAO,CAAC,WAAW,CAA+B;IAElD,0CAA0C;IAC1C,OAAO,CAAC,UAAU,CAA6B;IAE/C,6BAA6B;IAC7B,OAAO,CAAC,SAAS,CAAqC;IAEtD,wBAAwB;IACxB,OAAO,CAAC,KAAK,CAAiC;IAE9C;;OAEG;gBACS,KAAK,EAAE,UAAU,EAAE,EAAE,KAAK,EAAE,cAAc,EAAE;IAkBxD;;;OAGG;IACH,UAAU,CAAC,QAAQ,EAAE,cAAc,GAAG,IAAI;IAa1C;;OAEG;IACH,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,UAAU,EAAE;IAO/C;;OAEG;IACH,cAAc,CACZ,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,cAAc,GACvB,cAAc,GAAG,SAAS;IAW7B;;OAEG;IACH,uBAAuB,CAAC,QAAQ,EAAE,MAAM,GAAG,oBAAoB;IA4B/D;;OAEG;IACH,wBAAwB,CACtB,QAAQ,EAAE,MAAM,GACf,yBAAyB,GAAG,SAAS;IA4BxC;;OAEG;IACH,qBAAqB,IAAI,gBAAgB,EAAE;IAmD3C;;OAEG;IACH,6BAA6B,IAAI,yBAAyB,EAAE;IAW5D;;OAEG;IACH,QAAQ,IAAI;QACV,UAAU,EAAE,MAAM,CAAC;QACnB,cAAc,EAAE,MAAM,CAAC;QACvB,YAAY,EAAE,MAAM,CAAC;QACrB,aAAa,EAAE,MAAM,CAAC;KACvB;CAyBF;AAMD;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,OAAO,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,oBAAoB,CAAC;IACrC,SAAS,EAAE,oBAAoB,CAAC;CACjC;AAED;;;;;GAKG;AACH,wBAAsB,4BAA4B,CAChD,GAAG,EAAE,YAAY,EACjB,IAAI,EAAE,UAAU,EAChB,QAAQ,EAAE,UAAU,EAAE,EACtB,QAAQ,EAAE,cAAc,EAAE,EAC1B,QAAQ,EAAE,cAAc,GACvB,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CA6C5B"}
1
+ {"version":3,"file":"alignment.d.ts","sourceRoot":"","sources":["../../src/parser/alignment.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAC/D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAChD,OAAO,KAAK,EAAE,YAAY,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAO1E;;GAEG;AACH,MAAM,WAAW,yBAAyB;IACxC,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,oBAAoB,CAAC;IACpC,cAAc,EAAE,oBAAoB,CAAC;IACrC,WAAW,EAAE,iBAAiB,EAAE,CAAC;IACjC,SAAS,EAAE,OAAO,CAAC;CACpB;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,eAAe,GAAG,iBAAiB,GAAG,sBAAsB,CAAC;IACnE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;CACjB;AAMD;;;GAGG;AACH,qBAAa,cAAc;IACzB,+CAA+C;IAC/C,OAAO,CAAC,WAAW,CAA+B;IAElD,0CAA0C;IAC1C,OAAO,CAAC,UAAU,CAA6B;IAE/C,6BAA6B;IAC7B,OAAO,CAAC,SAAS,CAAqC;IAEtD,wBAAwB;IACxB,OAAO,CAAC,KAAK,CAAiC;IAE9C;;OAEG;gBACS,KAAK,EAAE,UAAU,EAAE,EAAE,KAAK,EAAE,cAAc,EAAE;IAkBxD;;;OAGG;IACH,UAAU,CAAC,QAAQ,EAAE,cAAc,GAAG,IAAI;IAa1C;;OAEG;IACH,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,UAAU,EAAE;IAO/C;;OAEG;IACH,cAAc,CACZ,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,cAAc,GACvB,cAAc,GAAG,SAAS;IAW7B;;OAEG;IACH,uBAAuB,CAAC,QAAQ,EAAE,MAAM,GAAG,oBAAoB;IAiC/D;;OAEG;IACH,wBAAwB,CACtB,QAAQ,EAAE,MAAM,GACf,yBAAyB,GAAG,SAAS;IA4BxC;;OAEG;IACH,qBAAqB,IAAI,gBAAgB,EAAE;IAsD3C;;OAEG;IACH,6BAA6B,IAAI,yBAAyB,EAAE;IAW5D;;OAEG;IACH,QAAQ,IAAI;QACV,UAAU,EAAE,MAAM,CAAC;QACnB,cAAc,EAAE,MAAM,CAAC;QACvB,YAAY,EAAE,MAAM,CAAC;QACrB,aAAa,EAAE,MAAM,CAAC;KACvB;CAyBF;AAMD;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,OAAO,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,oBAAoB,CAAC;IACrC,SAAS,EAAE,oBAAoB,CAAC;CACjC;AAED;;;;;GAKG;AACH,wBAAsB,4BAA4B,CAChD,GAAG,EAAE,YAAY,EACjB,IAAI,EAAE,UAAU,EAChB,QAAQ,EAAE,UAAU,EAAE,EACtB,QAAQ,EAAE,cAAc,EAAE,EAC1B,QAAQ,EAAE,cAAc,GACvB,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CA6C5B"}
@@ -92,13 +92,15 @@ export class AlignmentIndex {
92
92
  return "not_started";
93
93
  }
94
94
  // Check task statuses
95
- const hasInProgress = tasks.some((t) => t.status === "in_progress");
95
+ const hasActiveWork = tasks.some((t) => t.status === "in_progress" ||
96
+ t.status === "pending_review" ||
97
+ t.status === "needs_work");
96
98
  const allCompleted = tasks.every((t) => t.status === "completed");
97
99
  const someCompleted = tasks.some((t) => t.status === "completed");
98
100
  if (allCompleted) {
99
101
  return "implemented";
100
102
  }
101
- if (hasInProgress || someCompleted) {
103
+ if (hasActiveWork || someCompleted) {
102
104
  return "in_progress";
103
105
  }
104
106
  return "not_started";
@@ -144,9 +146,11 @@ export class AlignmentIndex {
144
146
  // Orphaned spec (no tasks)
145
147
  // AC: @trait-retrospective ac-1
146
148
  // Skip retrospective specs from orphaned warnings
149
+ // Policy: warn for not_started and in_progress (suspicious), but trust
150
+ // implemented/verified as baseline history predating the task system.
147
151
  const isRetrospective = spec.traits?.includes("@trait-retrospective");
148
152
  if (taskUlids.length === 0 &&
149
- currentStatus === "not_started" &&
153
+ (currentStatus === "not_started" || currentStatus === "in_progress") &&
150
154
  !isRetrospective) {
151
155
  warnings.push({
152
156
  type: "orphaned_spec",
@@ -155,8 +159,9 @@ export class AlignmentIndex {
155
159
  message: `Spec item "${spec.title}" has no implementing tasks`,
156
160
  });
157
161
  }
158
- // Status mismatch
159
- if (currentStatus !== expectedStatus) {
162
+ // Status mismatch (only when tasks exist — no-task specs are handled above
163
+ // for not_started/in_progress; implemented/verified are trusted as baseline)
164
+ if (taskUlids.length > 0 && currentStatus !== expectedStatus) {
160
165
  warnings.push({
161
166
  type: "status_mismatch",
162
167
  specUlid,
@@ -1 +1 @@
1
- {"version":3,"file":"alignment.js","sourceRoot":"","sources":["../../src/parser/alignment.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"alignment.js","sourceRoot":"","sources":["../../src/parser/alignment.ts"],"names":[],"mappings":"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"}