sensorium-mcp 3.1.3-board.2 → 3.1.3-board.20

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 (751) hide show
  1. package/Install-Sensorium.ps1 +206 -53
  2. package/README.md +4 -1
  3. package/dist/board/api/api.js +37 -14
  4. package/dist/board/api/api.test.ts +24 -0
  5. package/dist/board/api/client.js +33 -16
  6. package/dist/board/components/Card.js +41 -7
  7. package/dist/board/components/Combobox.js +79 -0
  8. package/dist/board/components/CommentComposer.js +4 -1
  9. package/dist/board/components/CommentList.js +4 -1
  10. package/dist/board/components/DirTreePicker.js +128 -0
  11. package/dist/board/components/Dropdown.js +2 -1
  12. package/dist/board/components/Lane.js +10 -3
  13. package/dist/board/components/PriorityChip.js +5 -2
  14. package/dist/board/components/ProfileSummary.js +72 -22
  15. package/dist/board/components/StateBanner.js +5 -3
  16. package/dist/board/components/StatusChip.js +7 -2
  17. package/dist/board/components/rateLimit.js +32 -0
  18. package/dist/board/components/rateLimit.test.ts +17 -0
  19. package/dist/board/components/time.js +14 -0
  20. package/dist/board/config.js +3 -3
  21. package/dist/board/mock/api.mock.js +455 -158
  22. package/dist/board/mock/api.mock.test.ts +460 -0
  23. package/dist/board/mock/fixtures.js +392 -45
  24. package/dist/board/schema/policy.js +155 -86
  25. package/dist/board/state/recur.js +24 -0
  26. package/dist/board/state/recur.test.ts +25 -0
  27. package/dist/board/state/useBoard.js +39 -27
  28. package/dist/board/state/useBuilder.js +284 -25
  29. package/dist/board/state/useBuilder.test.ts +469 -0
  30. package/dist/board/state/useCard.js +157 -31
  31. package/dist/board/state/useCard.test.ts +435 -0
  32. package/dist/board/state/useDirBrowser.js +23 -0
  33. package/dist/board/styles/board.css +1148 -23
  34. package/dist/board/styles/tokens.css +2 -1
  35. package/dist/board/views/App.js +17 -21
  36. package/dist/board/views/BoardView.js +78 -9
  37. package/dist/board/views/BuilderView.js +356 -77
  38. package/dist/board/views/CardView.js +247 -110
  39. package/dist/board/views/SettingsView.js +84 -77
  40. package/dist/cli/board/bin.d.ts +4 -0
  41. package/dist/cli/board/bin.d.ts.map +1 -0
  42. package/dist/cli/board/bin.js +12 -0
  43. package/dist/cli/board/bin.js.map +1 -0
  44. package/dist/cli/board/client.d.ts +46 -0
  45. package/dist/cli/board/client.d.ts.map +1 -0
  46. package/dist/cli/board/client.js +72 -0
  47. package/dist/cli/board/client.js.map +1 -0
  48. package/dist/cli/board/format.d.ts +16 -0
  49. package/dist/cli/board/format.d.ts.map +1 -0
  50. package/dist/cli/board/format.js +92 -0
  51. package/dist/cli/board/format.js.map +1 -0
  52. package/dist/cli/board/locate.d.ts +10 -0
  53. package/dist/cli/board/locate.d.ts.map +1 -0
  54. package/dist/cli/board/locate.js +16 -0
  55. package/dist/cli/board/locate.js.map +1 -0
  56. package/dist/cli/board/run.d.ts +25 -0
  57. package/dist/cli/board/run.d.ts.map +1 -0
  58. package/dist/cli/board/run.js +187 -0
  59. package/dist/cli/board/run.js.map +1 -0
  60. package/dist/config/agent-settings.d.ts +97 -60
  61. package/dist/config/agent-settings.d.ts.map +1 -1
  62. package/dist/config/agent-settings.js +316 -205
  63. package/dist/config/agent-settings.js.map +1 -1
  64. package/dist/config/agent-templates.d.ts +23 -18
  65. package/dist/config/agent-templates.d.ts.map +1 -1
  66. package/dist/config/agent-templates.js +74 -73
  67. package/dist/config/agent-templates.js.map +1 -1
  68. package/dist/config/agent-types.d.ts +8 -0
  69. package/dist/config/agent-types.d.ts.map +1 -0
  70. package/dist/config/agent-types.js +9 -0
  71. package/dist/config/agent-types.js.map +1 -0
  72. package/dist/config/detail-grant.d.ts +7 -16
  73. package/dist/config/detail-grant.d.ts.map +1 -1
  74. package/dist/config/detail-grant.js +12 -35
  75. package/dist/config/detail-grant.js.map +1 -1
  76. package/dist/config/index.d.ts +1 -1
  77. package/dist/config/index.d.ts.map +1 -1
  78. package/dist/config/index.js +5 -1
  79. package/dist/config/index.js.map +1 -1
  80. package/dist/config/mcp-settings.d.ts +14 -15
  81. package/dist/config/mcp-settings.d.ts.map +1 -1
  82. package/dist/config/mcp-settings.js +96 -73
  83. package/dist/config/mcp-settings.js.map +1 -1
  84. package/dist/config/misc-settings.d.ts +33 -41
  85. package/dist/config/misc-settings.d.ts.map +1 -1
  86. package/dist/config/misc-settings.js +214 -145
  87. package/dist/config/misc-settings.js.map +1 -1
  88. package/dist/config/operator-grant.d.ts +9 -0
  89. package/dist/config/operator-grant.d.ts.map +1 -0
  90. package/dist/config/operator-grant.js +24 -0
  91. package/dist/config/operator-grant.js.map +1 -0
  92. package/dist/config/settings-store.d.ts +49 -39
  93. package/dist/config/settings-store.d.ts.map +1 -1
  94. package/dist/config/settings-store.js +80 -120
  95. package/dist/config/settings-store.js.map +1 -1
  96. package/dist/config/voice-grant.d.ts +10 -0
  97. package/dist/config/voice-grant.d.ts.map +1 -0
  98. package/dist/config/voice-grant.js +18 -0
  99. package/dist/config/voice-grant.js.map +1 -0
  100. package/dist/dashboard/board-static.d.ts +2 -3
  101. package/dist/dashboard/board-static.d.ts.map +1 -1
  102. package/dist/dashboard/board-static.js +2 -3
  103. package/dist/dashboard/board-static.js.map +1 -1
  104. package/dist/dashboard/presets.d.ts +1 -1
  105. package/dist/dashboard/presets.d.ts.map +1 -1
  106. package/dist/dashboard/presets.js +5 -4
  107. package/dist/dashboard/presets.js.map +1 -1
  108. package/dist/dashboard/routes/agent-templates.d.ts.map +1 -1
  109. package/dist/dashboard/routes/agent-templates.js +15 -16
  110. package/dist/dashboard/routes/agent-templates.js.map +1 -1
  111. package/dist/dashboard/routes/board-body.d.ts +8 -0
  112. package/dist/dashboard/routes/board-body.d.ts.map +1 -0
  113. package/dist/dashboard/routes/board-body.js +20 -0
  114. package/dist/dashboard/routes/board-body.js.map +1 -0
  115. package/dist/dashboard/routes/board-dir-listing.d.ts +70 -0
  116. package/dist/dashboard/routes/board-dir-listing.d.ts.map +1 -0
  117. package/dist/dashboard/routes/board-dir-listing.js +192 -0
  118. package/dist/dashboard/routes/board-dir-listing.js.map +1 -0
  119. package/dist/dashboard/routes/board-lane-groups.d.ts +6 -0
  120. package/dist/dashboard/routes/board-lane-groups.d.ts.map +1 -0
  121. package/dist/dashboard/routes/board-lane-groups.js +52 -0
  122. package/dist/dashboard/routes/board-lane-groups.js.map +1 -0
  123. package/dist/dashboard/routes/board-policy.d.ts +224 -0
  124. package/dist/dashboard/routes/board-policy.d.ts.map +1 -0
  125. package/dist/dashboard/routes/board-policy.js +214 -0
  126. package/dist/dashboard/routes/board-policy.js.map +1 -0
  127. package/dist/dashboard/routes/board-profile-parse.d.ts +32 -0
  128. package/dist/dashboard/routes/board-profile-parse.d.ts.map +1 -0
  129. package/dist/dashboard/routes/board-profile-parse.js +349 -0
  130. package/dist/dashboard/routes/board-profile-parse.js.map +1 -0
  131. package/dist/dashboard/routes/board.d.ts +51 -26
  132. package/dist/dashboard/routes/board.d.ts.map +1 -1
  133. package/dist/dashboard/routes/board.js +454 -339
  134. package/dist/dashboard/routes/board.js.map +1 -1
  135. package/dist/dashboard/routes/claude.d.ts +6 -2
  136. package/dist/dashboard/routes/claude.d.ts.map +1 -1
  137. package/dist/dashboard/routes/claude.js +111 -87
  138. package/dist/dashboard/routes/claude.js.map +1 -1
  139. package/dist/dashboard/routes/cli-path-validation.d.ts +25 -0
  140. package/dist/dashboard/routes/cli-path-validation.d.ts.map +1 -0
  141. package/dist/dashboard/routes/cli-path-validation.js +55 -0
  142. package/dist/dashboard/routes/cli-path-validation.js.map +1 -0
  143. package/dist/dashboard/routes/codex.d.ts +18 -0
  144. package/dist/dashboard/routes/codex.d.ts.map +1 -0
  145. package/dist/dashboard/routes/codex.js +119 -0
  146. package/dist/dashboard/routes/codex.js.map +1 -0
  147. package/dist/dashboard/routes/prompts.d.ts +2 -2
  148. package/dist/dashboard/routes/prompts.d.ts.map +1 -1
  149. package/dist/dashboard/routes/prompts.js +9 -3
  150. package/dist/dashboard/routes/prompts.js.map +1 -1
  151. package/dist/dashboard/routes/settings.d.ts +3 -6
  152. package/dist/dashboard/routes/settings.d.ts.map +1 -1
  153. package/dist/dashboard/routes/settings.js +35 -132
  154. package/dist/dashboard/routes/settings.js.map +1 -1
  155. package/dist/dashboard/routes/skills.d.ts +7 -1
  156. package/dist/dashboard/routes/skills.d.ts.map +1 -1
  157. package/dist/dashboard/routes/skills.js +6 -6
  158. package/dist/dashboard/routes/skills.js.map +1 -1
  159. package/dist/dashboard/routes/snapshots.d.ts +2 -1
  160. package/dist/dashboard/routes/snapshots.d.ts.map +1 -1
  161. package/dist/dashboard/routes/snapshots.js +24 -18
  162. package/dist/dashboard/routes/snapshots.js.map +1 -1
  163. package/dist/dashboard/routes/templates.d.ts.map +1 -1
  164. package/dist/dashboard/routes/templates.js +6 -7
  165. package/dist/dashboard/routes/templates.js.map +1 -1
  166. package/dist/dashboard/routes/threads-create.d.ts +17 -0
  167. package/dist/dashboard/routes/threads-create.d.ts.map +1 -1
  168. package/dist/dashboard/routes/threads-create.js +37 -25
  169. package/dist/dashboard/routes/threads-create.js.map +1 -1
  170. package/dist/dashboard/routes/threads-helpers.d.ts +11 -3
  171. package/dist/dashboard/routes/threads-helpers.d.ts.map +1 -1
  172. package/dist/dashboard/routes/threads-helpers.js +23 -7
  173. package/dist/dashboard/routes/threads-helpers.js.map +1 -1
  174. package/dist/dashboard/routes/threads-read.d.ts +16 -8
  175. package/dist/dashboard/routes/threads-read.d.ts.map +1 -1
  176. package/dist/dashboard/routes/threads-read.js +66 -76
  177. package/dist/dashboard/routes/threads-read.js.map +1 -1
  178. package/dist/dashboard/routes/threads.d.ts +8 -4
  179. package/dist/dashboard/routes/threads.d.ts.map +1 -1
  180. package/dist/dashboard/routes/threads.js +153 -75
  181. package/dist/dashboard/routes/threads.js.map +1 -1
  182. package/dist/dashboard/routes/types.d.ts +0 -6
  183. package/dist/dashboard/routes/types.d.ts.map +1 -1
  184. package/dist/dashboard/routes/types.js.map +1 -1
  185. package/dist/dashboard/routes.d.ts +2 -2
  186. package/dist/dashboard/routes.d.ts.map +1 -1
  187. package/dist/dashboard/routes.js +67 -26
  188. package/dist/dashboard/routes.js.map +1 -1
  189. package/dist/dashboard/spa.html +14 -11
  190. package/dist/data/board/board-schema.d.ts +8 -1
  191. package/dist/data/board/board-schema.d.ts.map +1 -1
  192. package/dist/data/board/board-schema.js +204 -49
  193. package/dist/data/board/board-schema.js.map +1 -1
  194. package/dist/data/board/board-types.d.ts +75 -15
  195. package/dist/data/board/board-types.d.ts.map +1 -1
  196. package/dist/data/board/board-types.js +9 -1
  197. package/dist/data/board/board-types.js.map +1 -1
  198. package/dist/data/board/card.repository.d.ts +54 -17
  199. package/dist/data/board/card.repository.d.ts.map +1 -1
  200. package/dist/data/board/card.repository.js +193 -57
  201. package/dist/data/board/card.repository.js.map +1 -1
  202. package/dist/data/board/journal.repository.d.ts +38 -0
  203. package/dist/data/board/journal.repository.d.ts.map +1 -0
  204. package/dist/data/board/journal.repository.js +38 -0
  205. package/dist/data/board/journal.repository.js.map +1 -0
  206. package/dist/data/board/lane-group.repository.d.ts +19 -0
  207. package/dist/data/board/lane-group.repository.d.ts.map +1 -0
  208. package/dist/data/board/lane-group.repository.js +66 -0
  209. package/dist/data/board/lane-group.repository.js.map +1 -0
  210. package/dist/data/board/profile-defaults.d.ts +16 -18
  211. package/dist/data/board/profile-defaults.d.ts.map +1 -1
  212. package/dist/data/board/profile-defaults.js +94 -105
  213. package/dist/data/board/profile-defaults.js.map +1 -1
  214. package/dist/data/file-storage.d.ts +12 -13
  215. package/dist/data/file-storage.d.ts.map +1 -1
  216. package/dist/data/file-storage.js +43 -133
  217. package/dist/data/file-storage.js.map +1 -1
  218. package/dist/data/interfaces.d.ts +1 -0
  219. package/dist/data/interfaces.d.ts.map +1 -1
  220. package/dist/data/json.d.ts +6 -0
  221. package/dist/data/json.d.ts.map +1 -0
  222. package/dist/data/json.js +14 -0
  223. package/dist/data/json.js.map +1 -0
  224. package/dist/data/memory/bootstrap.d.ts +1 -8
  225. package/dist/data/memory/bootstrap.d.ts.map +1 -1
  226. package/dist/data/memory/bootstrap.js +27 -37
  227. package/dist/data/memory/bootstrap.js.map +1 -1
  228. package/dist/data/memory/consolidation.d.ts +9 -31
  229. package/dist/data/memory/consolidation.d.ts.map +1 -1
  230. package/dist/data/memory/consolidation.js +22 -32
  231. package/dist/data/memory/consolidation.js.map +1 -1
  232. package/dist/data/memory/db-maintenance.d.ts +54 -0
  233. package/dist/data/memory/db-maintenance.d.ts.map +1 -0
  234. package/dist/data/memory/db-maintenance.js +81 -0
  235. package/dist/data/memory/db-maintenance.js.map +1 -0
  236. package/dist/data/memory/episodes.d.ts +2 -1
  237. package/dist/data/memory/episodes.d.ts.map +1 -1
  238. package/dist/data/memory/episodes.js +5 -1
  239. package/dist/data/memory/episodes.js.map +1 -1
  240. package/dist/data/memory/index.d.ts +0 -4
  241. package/dist/data/memory/index.d.ts.map +1 -1
  242. package/dist/data/memory/index.js +0 -4
  243. package/dist/data/memory/index.js.map +1 -1
  244. package/dist/data/memory/key-knowledge.d.ts +51 -0
  245. package/dist/data/memory/key-knowledge.d.ts.map +1 -0
  246. package/dist/data/memory/key-knowledge.js +128 -0
  247. package/dist/data/memory/key-knowledge.js.map +1 -0
  248. package/dist/data/memory/migration-runner.d.ts +1 -1
  249. package/dist/data/memory/migration-runner.d.ts.map +1 -1
  250. package/dist/data/memory/migration-runner.js +419 -1
  251. package/dist/data/memory/migration-runner.js.map +1 -1
  252. package/dist/data/memory/narrative-lint.d.ts +2 -2
  253. package/dist/data/memory/narrative-lint.d.ts.map +1 -1
  254. package/dist/data/memory/narrative-lint.js +23 -13
  255. package/dist/data/memory/narrative-lint.js.map +1 -1
  256. package/dist/data/memory/narrative-resolutions.d.ts +9 -2
  257. package/dist/data/memory/narrative-resolutions.d.ts.map +1 -1
  258. package/dist/data/memory/narrative-resolutions.js +9 -8
  259. package/dist/data/memory/narrative-resolutions.js.map +1 -1
  260. package/dist/data/memory/narrative-sources.d.ts +1 -1
  261. package/dist/data/memory/narrative-sources.d.ts.map +1 -1
  262. package/dist/data/memory/narrative-sources.js +8 -3
  263. package/dist/data/memory/narrative-sources.js.map +1 -1
  264. package/dist/data/memory/narrative-store.d.ts +10 -0
  265. package/dist/data/memory/narrative-store.d.ts.map +1 -1
  266. package/dist/data/memory/narrative-store.js +37 -35
  267. package/dist/data/memory/narrative-store.js.map +1 -1
  268. package/dist/data/memory/narrative.d.ts.map +1 -1
  269. package/dist/data/memory/narrative.js +34 -28
  270. package/dist/data/memory/narrative.js.map +1 -1
  271. package/dist/data/memory/note-archival.d.ts +1 -1
  272. package/dist/data/memory/note-archival.d.ts.map +1 -1
  273. package/dist/data/memory/note-archival.js +7 -3
  274. package/dist/data/memory/note-archival.js.map +1 -1
  275. package/dist/data/memory/note-embeddings.d.ts +7 -0
  276. package/dist/data/memory/note-embeddings.d.ts.map +1 -1
  277. package/dist/data/memory/note-embeddings.js +6 -2
  278. package/dist/data/memory/note-embeddings.js.map +1 -1
  279. package/dist/data/memory/passive-notice.repository.d.ts +70 -0
  280. package/dist/data/memory/passive-notice.repository.d.ts.map +1 -0
  281. package/dist/data/memory/passive-notice.repository.js +85 -0
  282. package/dist/data/memory/passive-notice.repository.js.map +1 -0
  283. package/dist/data/memory/schema-ddl.d.ts +117 -1
  284. package/dist/data/memory/schema-ddl.d.ts.map +1 -1
  285. package/dist/data/memory/schema-ddl.js +171 -5
  286. package/dist/data/memory/schema-ddl.js.map +1 -1
  287. package/dist/data/memory/schema-guard.d.ts.map +1 -1
  288. package/dist/data/memory/schema-guard.js +5 -46
  289. package/dist/data/memory/schema-guard.js.map +1 -1
  290. package/dist/data/memory/schema.d.ts +5 -1
  291. package/dist/data/memory/schema.d.ts.map +1 -1
  292. package/dist/data/memory/schema.js +15 -38
  293. package/dist/data/memory/schema.js.map +1 -1
  294. package/dist/data/memory/semantic-notes.d.ts +13 -8
  295. package/dist/data/memory/semantic-notes.d.ts.map +1 -1
  296. package/dist/data/memory/semantic-notes.js +12 -17
  297. package/dist/data/memory/semantic-notes.js.map +1 -1
  298. package/dist/data/memory/thread-registry.d.ts +304 -25
  299. package/dist/data/memory/thread-registry.d.ts.map +1 -1
  300. package/dist/data/memory/thread-registry.js +471 -88
  301. package/dist/data/memory/thread-registry.js.map +1 -1
  302. package/dist/data/memory/utils.d.ts +6 -0
  303. package/dist/data/memory/utils.d.ts.map +1 -1
  304. package/dist/data/memory/utils.js +13 -0
  305. package/dist/data/memory/utils.js.map +1 -1
  306. package/dist/data/memory/worker-lifecycle.repository.d.ts +242 -0
  307. package/dist/data/memory/worker-lifecycle.repository.d.ts.map +1 -0
  308. package/dist/data/memory/worker-lifecycle.repository.js +322 -0
  309. package/dist/data/memory/worker-lifecycle.repository.js.map +1 -0
  310. package/dist/data/optional.d.ts +3 -0
  311. package/dist/data/optional.d.ts.map +1 -0
  312. package/dist/data/optional.js +3 -0
  313. package/dist/data/optional.js.map +1 -0
  314. package/dist/index.js +107 -92
  315. package/dist/index.js.map +1 -1
  316. package/dist/integrations/openai/video.d.ts +1 -1
  317. package/dist/integrations/openai/video.d.ts.map +1 -1
  318. package/dist/integrations/openai/video.js +13 -8
  319. package/dist/integrations/openai/video.js.map +1 -1
  320. package/dist/integrations/telegram/types.d.ts +11 -0
  321. package/dist/integrations/telegram/types.d.ts.map +1 -1
  322. package/dist/lib/json.d.ts +7 -0
  323. package/dist/lib/json.d.ts.map +1 -0
  324. package/dist/lib/json.js +2 -0
  325. package/dist/lib/json.js.map +1 -0
  326. package/dist/lib/mcp-http-port.d.ts +12 -0
  327. package/dist/lib/mcp-http-port.d.ts.map +1 -0
  328. package/dist/lib/mcp-http-port.js +19 -0
  329. package/dist/lib/mcp-http-port.js.map +1 -0
  330. package/dist/lib/optional.d.ts +16 -0
  331. package/dist/lib/optional.d.ts.map +1 -0
  332. package/dist/lib/optional.js +47 -0
  333. package/dist/lib/optional.js.map +1 -0
  334. package/dist/lib/paths.d.ts +29 -4
  335. package/dist/lib/paths.d.ts.map +1 -1
  336. package/dist/lib/paths.js +31 -4
  337. package/dist/lib/paths.js.map +1 -1
  338. package/dist/lib/resume-fact.d.ts +15 -0
  339. package/dist/lib/resume-fact.d.ts.map +1 -0
  340. package/dist/lib/resume-fact.js +30 -0
  341. package/dist/lib/resume-fact.js.map +1 -0
  342. package/dist/lib/types.d.ts +2 -0
  343. package/dist/lib/types.d.ts.map +1 -1
  344. package/dist/lib/usage-metering/sink.d.ts +4 -0
  345. package/dist/lib/usage-metering/sink.d.ts.map +1 -1
  346. package/dist/lib/usage-metering/sink.js +6 -4
  347. package/dist/lib/usage-metering/sink.js.map +1 -1
  348. package/dist/lib/utils.d.ts +26 -0
  349. package/dist/lib/utils.d.ts.map +1 -1
  350. package/dist/lib/utils.js +38 -0
  351. package/dist/lib/utils.js.map +1 -1
  352. package/dist/llm/prompts/narrative.d.ts.map +1 -1
  353. package/dist/llm/prompts/narrative.js +27 -86
  354. package/dist/llm/prompts/narrative.js.map +1 -1
  355. package/dist/log-parsing/log-events.d.ts +38 -0
  356. package/dist/log-parsing/log-events.d.ts.map +1 -0
  357. package/dist/log-parsing/log-events.js +2 -0
  358. package/dist/log-parsing/log-events.js.map +1 -0
  359. package/dist/log-parsing/parser-registry.d.ts +4 -0
  360. package/dist/log-parsing/parser-registry.d.ts.map +1 -0
  361. package/dist/log-parsing/parser-registry.js +18 -0
  362. package/dist/log-parsing/parser-registry.js.map +1 -0
  363. package/dist/log-parsing/parsers/claude.d.ts +6 -0
  364. package/dist/log-parsing/parsers/claude.d.ts.map +1 -0
  365. package/dist/log-parsing/parsers/claude.js +100 -0
  366. package/dist/log-parsing/parsers/claude.js.map +1 -0
  367. package/dist/log-parsing/parsers/codex.d.ts +6 -0
  368. package/dist/log-parsing/parsers/codex.d.ts.map +1 -0
  369. package/dist/log-parsing/parsers/codex.js +116 -0
  370. package/dist/log-parsing/parsers/codex.js.map +1 -0
  371. package/dist/log-parsing/parsers/copilot.d.ts +6 -0
  372. package/dist/log-parsing/parsers/copilot.d.ts.map +1 -0
  373. package/dist/log-parsing/parsers/copilot.js +65 -0
  374. package/dist/log-parsing/parsers/copilot.js.map +1 -0
  375. package/dist/log-parsing/parsers/json-lines.d.ts +9 -0
  376. package/dist/log-parsing/parsers/json-lines.d.ts.map +1 -0
  377. package/dist/log-parsing/parsers/json-lines.js +25 -0
  378. package/dist/log-parsing/parsers/json-lines.js.map +1 -0
  379. package/dist/log-parsing/render.d.ts +33 -0
  380. package/dist/log-parsing/render.d.ts.map +1 -0
  381. package/dist/log-parsing/render.js +113 -0
  382. package/dist/log-parsing/render.js.map +1 -0
  383. package/dist/log-parsing/text.d.ts +8 -0
  384. package/dist/log-parsing/text.d.ts.map +1 -0
  385. package/dist/log-parsing/text.js +20 -0
  386. package/dist/log-parsing/text.js.map +1 -0
  387. package/dist/server/factory.d.ts.map +1 -1
  388. package/dist/server/factory.js +23 -4
  389. package/dist/server/factory.js.map +1 -1
  390. package/dist/server/http-server.d.ts +3 -4
  391. package/dist/server/http-server.d.ts.map +1 -1
  392. package/dist/server/http-server.js +25 -90
  393. package/dist/server/http-server.js.map +1 -1
  394. package/dist/services/admission/admission.d.ts +95 -0
  395. package/dist/services/admission/admission.d.ts.map +1 -0
  396. package/dist/services/admission/admission.js +122 -0
  397. package/dist/services/admission/admission.js.map +1 -0
  398. package/dist/services/admission/backoff.d.ts +4 -0
  399. package/dist/services/admission/backoff.d.ts.map +1 -0
  400. package/dist/services/admission/backoff.js +9 -0
  401. package/dist/services/admission/backoff.js.map +1 -0
  402. package/dist/services/admission/card-attempt.d.ts +18 -0
  403. package/dist/services/admission/card-attempt.d.ts.map +1 -0
  404. package/dist/services/admission/card-attempt.js +32 -0
  405. package/dist/services/admission/card-attempt.js.map +1 -0
  406. package/dist/services/admission/connectivity.d.ts +18 -0
  407. package/dist/services/admission/connectivity.d.ts.map +1 -0
  408. package/dist/services/admission/connectivity.js +21 -0
  409. package/dist/services/admission/connectivity.js.map +1 -0
  410. package/dist/services/admission/index.d.ts +24 -0
  411. package/dist/services/admission/index.d.ts.map +1 -0
  412. package/dist/services/admission/index.js +81 -0
  413. package/dist/services/admission/index.js.map +1 -0
  414. package/dist/services/admission/limits-settings.d.ts +17 -0
  415. package/dist/services/admission/limits-settings.d.ts.map +1 -0
  416. package/dist/services/admission/limits-settings.js +35 -0
  417. package/dist/services/admission/limits-settings.js.map +1 -0
  418. package/dist/services/admission/notifier.d.ts +32 -0
  419. package/dist/services/admission/notifier.d.ts.map +1 -0
  420. package/dist/services/admission/notifier.js +50 -0
  421. package/dist/services/admission/notifier.js.map +1 -0
  422. package/dist/services/admission/provider-level.d.ts +27 -0
  423. package/dist/services/admission/provider-level.d.ts.map +1 -0
  424. package/dist/services/admission/provider-level.js +53 -0
  425. package/dist/services/admission/provider-level.js.map +1 -0
  426. package/dist/services/admission/provider-of.d.ts +12 -0
  427. package/dist/services/admission/provider-of.d.ts.map +1 -0
  428. package/dist/services/admission/provider-of.js +20 -0
  429. package/dist/services/admission/provider-of.js.map +1 -0
  430. package/dist/services/agent-spawn.service.d.ts +88 -9
  431. package/dist/services/agent-spawn.service.d.ts.map +1 -1
  432. package/dist/services/agent-spawn.service.js +111 -99
  433. package/dist/services/agent-spawn.service.js.map +1 -1
  434. package/dist/services/background-runner.d.ts +9 -1
  435. package/dist/services/background-runner.d.ts.map +1 -1
  436. package/dist/services/background-runner.js +1 -59
  437. package/dist/services/background-runner.js.map +1 -1
  438. package/dist/services/board/board-signals.d.ts +30 -10
  439. package/dist/services/board/board-signals.d.ts.map +1 -1
  440. package/dist/services/board/board-signals.js +109 -25
  441. package/dist/services/board/board-signals.js.map +1 -1
  442. package/dist/services/board/card-briefing.d.ts +11 -4
  443. package/dist/services/board/card-briefing.d.ts.map +1 -1
  444. package/dist/services/board/card-briefing.js +57 -11
  445. package/dist/services/board/card-briefing.js.map +1 -1
  446. package/dist/services/board/card-diagnostics.d.ts +25 -0
  447. package/dist/services/board/card-diagnostics.d.ts.map +1 -0
  448. package/dist/services/board/card-diagnostics.js +50 -0
  449. package/dist/services/board/card-diagnostics.js.map +1 -0
  450. package/dist/services/board/card-journal.d.ts +36 -0
  451. package/dist/services/board/card-journal.d.ts.map +1 -0
  452. package/dist/services/board/card-journal.js +38 -0
  453. package/dist/services/board/card-journal.js.map +1 -0
  454. package/dist/services/board/live-root-thread.d.ts +8 -0
  455. package/dist/services/board/live-root-thread.d.ts.map +1 -0
  456. package/dist/services/board/live-root-thread.js +2 -0
  457. package/dist/services/board/live-root-thread.js.map +1 -0
  458. package/dist/services/board/orchestrator.service.d.ts +47 -6
  459. package/dist/services/board/orchestrator.service.d.ts.map +1 -1
  460. package/dist/services/board/orchestrator.service.js +191 -63
  461. package/dist/services/board/orchestrator.service.js.map +1 -1
  462. package/dist/services/board/release-worker.d.ts +10 -27
  463. package/dist/services/board/release-worker.d.ts.map +1 -1
  464. package/dist/services/board/release-worker.js +15 -42
  465. package/dist/services/board/release-worker.js.map +1 -1
  466. package/dist/services/board/report-capture.d.ts +52 -20
  467. package/dist/services/board/report-capture.d.ts.map +1 -1
  468. package/dist/services/board/report-capture.js +205 -96
  469. package/dist/services/board/report-capture.js.map +1 -1
  470. package/dist/services/board/worker-spawn.d.ts +66 -7
  471. package/dist/services/board/worker-spawn.d.ts.map +1 -1
  472. package/dist/services/board/worker-spawn.js +147 -73
  473. package/dist/services/board/worker-spawn.js.map +1 -1
  474. package/dist/services/board/worktree.d.ts +45 -0
  475. package/dist/services/board/worktree.d.ts.map +1 -0
  476. package/dist/services/board/worktree.js +183 -0
  477. package/dist/services/board/worktree.js.map +1 -0
  478. package/dist/services/broker-client.d.ts +71 -84
  479. package/dist/services/broker-client.d.ts.map +1 -1
  480. package/dist/services/broker-client.js +87 -101
  481. package/dist/services/broker-client.js.map +1 -1
  482. package/dist/services/claude-spawn.service.d.ts +16 -1
  483. package/dist/services/claude-spawn.service.d.ts.map +1 -1
  484. package/dist/services/claude-spawn.service.js +106 -97
  485. package/dist/services/claude-spawn.service.js.map +1 -1
  486. package/dist/services/codex-spawn.service.d.ts +18 -4
  487. package/dist/services/codex-spawn.service.d.ts.map +1 -1
  488. package/dist/services/codex-spawn.service.js +44 -78
  489. package/dist/services/codex-spawn.service.js.map +1 -1
  490. package/dist/services/consolidation.service.d.ts.map +1 -1
  491. package/dist/services/consolidation.service.js +5 -49
  492. package/dist/services/consolidation.service.js.map +1 -1
  493. package/dist/services/copilot-spawn.service.d.ts +4 -2
  494. package/dist/services/copilot-spawn.service.d.ts.map +1 -1
  495. package/dist/services/copilot-spawn.service.js +49 -37
  496. package/dist/services/copilot-spawn.service.js.map +1 -1
  497. package/dist/services/daily-session.d.ts +22 -11
  498. package/dist/services/daily-session.d.ts.map +1 -1
  499. package/dist/services/daily-session.js +101 -33
  500. package/dist/services/daily-session.js.map +1 -1
  501. package/dist/services/death-alert.service.d.ts +53 -0
  502. package/dist/services/death-alert.service.d.ts.map +1 -0
  503. package/dist/services/death-alert.service.js +62 -0
  504. package/dist/services/death-alert.service.js.map +1 -0
  505. package/dist/services/dispatcher/broker.d.ts +68 -1
  506. package/dist/services/dispatcher/broker.d.ts.map +1 -1
  507. package/dist/services/dispatcher/broker.js +60 -53
  508. package/dist/services/dispatcher/broker.js.map +1 -1
  509. package/dist/services/dispatcher/poller.d.ts +10 -1
  510. package/dist/services/dispatcher/poller.d.ts.map +1 -1
  511. package/dist/services/dispatcher/poller.js +66 -31
  512. package/dist/services/dispatcher/poller.js.map +1 -1
  513. package/dist/services/flight-recorder.service.d.ts +7 -2
  514. package/dist/services/flight-recorder.service.d.ts.map +1 -1
  515. package/dist/services/flight-recorder.service.js +27 -5
  516. package/dist/services/flight-recorder.service.js.map +1 -1
  517. package/dist/services/intent.d.ts +15 -1
  518. package/dist/services/intent.d.ts.map +1 -1
  519. package/dist/services/intent.js +39 -27
  520. package/dist/services/intent.js.map +1 -1
  521. package/dist/services/keeper.service.d.ts +38 -14
  522. package/dist/services/keeper.service.d.ts.map +1 -1
  523. package/dist/services/keeper.service.js +110 -251
  524. package/dist/services/keeper.service.js.map +1 -1
  525. package/dist/services/mcp-config.service.d.ts +4 -3
  526. package/dist/services/mcp-config.service.d.ts.map +1 -1
  527. package/dist/services/mcp-config.service.js +21 -19
  528. package/dist/services/mcp-config.service.js.map +1 -1
  529. package/dist/services/memory-briefing.service.d.ts +1 -1
  530. package/dist/services/memory-briefing.service.d.ts.map +1 -1
  531. package/dist/services/memory-briefing.service.js +28 -73
  532. package/dist/services/memory-briefing.service.js.map +1 -1
  533. package/dist/services/npx-prewarm.d.ts +54 -0
  534. package/dist/services/npx-prewarm.d.ts.map +1 -0
  535. package/dist/services/npx-prewarm.js +113 -0
  536. package/dist/services/npx-prewarm.js.map +1 -0
  537. package/dist/services/passive-notice.service.d.ts +37 -20
  538. package/dist/services/passive-notice.service.d.ts.map +1 -1
  539. package/dist/services/passive-notice.service.js +50 -232
  540. package/dist/services/passive-notice.service.js.map +1 -1
  541. package/dist/services/predefined-prompts.d.ts +11 -0
  542. package/dist/services/predefined-prompts.d.ts.map +1 -0
  543. package/dist/services/predefined-prompts.js +25 -0
  544. package/dist/services/predefined-prompts.js.map +1 -0
  545. package/dist/services/process.service.d.ts +127 -90
  546. package/dist/services/process.service.d.ts.map +1 -1
  547. package/dist/services/process.service.js +273 -372
  548. package/dist/services/process.service.js.map +1 -1
  549. package/dist/services/reconnect-snapshot.service.d.ts +16 -15
  550. package/dist/services/reconnect-snapshot.service.d.ts.map +1 -1
  551. package/dist/services/reconnect-snapshot.service.js +44 -63
  552. package/dist/services/reconnect-snapshot.service.js.map +1 -1
  553. package/dist/services/self-update.service.d.ts +57 -55
  554. package/dist/services/self-update.service.d.ts.map +1 -1
  555. package/dist/services/self-update.service.js +78 -231
  556. package/dist/services/self-update.service.js.map +1 -1
  557. package/dist/services/spawn-common.d.ts +296 -68
  558. package/dist/services/spawn-common.d.ts.map +1 -1
  559. package/dist/services/spawn-common.js +888 -445
  560. package/dist/services/spawn-common.js.map +1 -1
  561. package/dist/services/spawn-exit-watcher.d.ts +43 -35
  562. package/dist/services/spawn-exit-watcher.d.ts.map +1 -1
  563. package/dist/services/spawn-exit-watcher.js +107 -100
  564. package/dist/services/spawn-exit-watcher.js.map +1 -1
  565. package/dist/services/telegram.d.ts +24 -3
  566. package/dist/services/telegram.d.ts.map +1 -1
  567. package/dist/services/telegram.js +40 -13
  568. package/dist/services/telegram.js.map +1 -1
  569. package/dist/services/thread-health.service.d.ts +8 -0
  570. package/dist/services/thread-health.service.d.ts.map +1 -1
  571. package/dist/services/thread-health.service.js +16 -13
  572. package/dist/services/thread-health.service.js.map +1 -1
  573. package/dist/services/thread-lifecycle.service.d.ts +12 -3
  574. package/dist/services/thread-lifecycle.service.d.ts.map +1 -1
  575. package/dist/services/thread-lifecycle.service.js +41 -12
  576. package/dist/services/thread-lifecycle.service.js.map +1 -1
  577. package/dist/services/thread-log-reader.d.ts +81 -0
  578. package/dist/services/thread-log-reader.d.ts.map +1 -0
  579. package/dist/services/thread-log-reader.js +143 -0
  580. package/dist/services/thread-log-reader.js.map +1 -0
  581. package/dist/services/thread-purge.service.d.ts +198 -0
  582. package/dist/services/thread-purge.service.d.ts.map +1 -0
  583. package/dist/services/thread-purge.service.js +642 -0
  584. package/dist/services/thread-purge.service.js.map +1 -0
  585. package/dist/services/topic.service.d.ts +44 -2
  586. package/dist/services/topic.service.d.ts.map +1 -1
  587. package/dist/services/topic.service.js +72 -13
  588. package/dist/services/topic.service.js.map +1 -1
  589. package/dist/services/usage/usage-poller.service.d.ts +16 -4
  590. package/dist/services/usage/usage-poller.service.d.ts.map +1 -1
  591. package/dist/services/usage/usage-poller.service.js +18 -10
  592. package/dist/services/usage/usage-poller.service.js.map +1 -1
  593. package/dist/services/usage/usage-snapshot-provider.d.ts +5 -0
  594. package/dist/services/usage/usage-snapshot-provider.d.ts.map +1 -1
  595. package/dist/services/usage/usage-snapshot-provider.js +8 -0
  596. package/dist/services/usage/usage-snapshot-provider.js.map +1 -1
  597. package/dist/services/usage/usage-types.d.ts +6 -3
  598. package/dist/services/usage/usage-types.d.ts.map +1 -1
  599. package/dist/services/usage/usage-types.js +2 -2
  600. package/dist/services/worker-birth.d.ts +158 -0
  601. package/dist/services/worker-birth.d.ts.map +1 -0
  602. package/dist/services/worker-birth.js +249 -0
  603. package/dist/services/worker-birth.js.map +1 -0
  604. package/dist/services/worker-cleanup.service.d.ts +126 -25
  605. package/dist/services/worker-cleanup.service.d.ts.map +1 -1
  606. package/dist/services/worker-cleanup.service.js +561 -458
  607. package/dist/services/worker-cleanup.service.js.map +1 -1
  608. package/dist/services/worker-single-use.d.ts +91 -0
  609. package/dist/services/worker-single-use.d.ts.map +1 -0
  610. package/dist/services/worker-single-use.js +154 -0
  611. package/dist/services/worker-single-use.js.map +1 -0
  612. package/dist/sessions/mcp-registry.d.ts +34 -3
  613. package/dist/sessions/mcp-registry.d.ts.map +1 -1
  614. package/dist/sessions/mcp-registry.js +154 -31
  615. package/dist/sessions/mcp-registry.js.map +1 -1
  616. package/dist/test-bootstrap.d.ts +29 -19
  617. package/dist/test-bootstrap.d.ts.map +1 -1
  618. package/dist/test-bootstrap.js +89 -28
  619. package/dist/test-bootstrap.js.map +1 -1
  620. package/dist/test-tripwire.test-support.d.ts +69 -0
  621. package/dist/test-tripwire.test-support.d.ts.map +1 -0
  622. package/dist/test-tripwire.test-support.js +342 -0
  623. package/dist/test-tripwire.test-support.js.map +1 -0
  624. package/dist/tools/defs/memory-defs.d.ts.map +1 -1
  625. package/dist/tools/defs/memory-defs.js +12 -4
  626. package/dist/tools/defs/memory-defs.js.map +1 -1
  627. package/dist/tools/defs/session-defs.d.ts +1 -1
  628. package/dist/tools/defs/session-defs.d.ts.map +1 -1
  629. package/dist/tools/defs/session-defs.js +48 -15
  630. package/dist/tools/defs/session-defs.js.map +1 -1
  631. package/dist/tools/defs/skill-defs.js +1 -1
  632. package/dist/tools/defs/skill-defs.js.map +1 -1
  633. package/dist/tools/defs/types.d.ts +2 -1
  634. package/dist/tools/defs/types.d.ts.map +1 -1
  635. package/dist/tools/defs/utility-defs.d.ts.map +1 -1
  636. package/dist/tools/defs/utility-defs.js +4 -2
  637. package/dist/tools/defs/utility-defs.js.map +1 -1
  638. package/dist/tools/defs/wait-defs.d.ts.map +1 -1
  639. package/dist/tools/defs/wait-defs.js +4 -1
  640. package/dist/tools/defs/wait-defs.js.map +1 -1
  641. package/dist/tools/delegate-tool.d.ts +110 -2
  642. package/dist/tools/delegate-tool.d.ts.map +1 -1
  643. package/dist/tools/delegate-tool.js +848 -255
  644. package/dist/tools/delegate-tool.js.map +1 -1
  645. package/dist/tools/memory-tools.d.ts.map +1 -1
  646. package/dist/tools/memory-tools.js +66 -9
  647. package/dist/tools/memory-tools.js.map +1 -1
  648. package/dist/tools/response-builders.d.ts.map +1 -1
  649. package/dist/tools/response-builders.js +12 -8
  650. package/dist/tools/response-builders.js.map +1 -1
  651. package/dist/tools/session-tools.d.ts +3 -0
  652. package/dist/tools/session-tools.d.ts.map +1 -1
  653. package/dist/tools/session-tools.js +8 -34
  654. package/dist/tools/session-tools.js.map +1 -1
  655. package/dist/tools/skill-tools.js +1 -1
  656. package/dist/tools/skill-tools.js.map +1 -1
  657. package/dist/tools/start-session-tool.d.ts +3 -0
  658. package/dist/tools/start-session-tool.d.ts.map +1 -1
  659. package/dist/tools/start-session-tool.js +78 -23
  660. package/dist/tools/start-session-tool.js.map +1 -1
  661. package/dist/tools/utility-tools.d.ts.map +1 -1
  662. package/dist/tools/utility-tools.js +33 -2
  663. package/dist/tools/utility-tools.js.map +1 -1
  664. package/dist/tools/wait/auto-forward.d.ts.map +1 -1
  665. package/dist/tools/wait/auto-forward.js +8 -3
  666. package/dist/tools/wait/auto-forward.js.map +1 -1
  667. package/dist/tools/wait/context.d.ts +3 -0
  668. package/dist/tools/wait/context.d.ts.map +1 -1
  669. package/dist/tools/wait/drive-handler.d.ts.map +1 -1
  670. package/dist/tools/wait/drive-handler.js +18 -14
  671. package/dist/tools/wait/drive-handler.js.map +1 -1
  672. package/dist/tools/wait/media-processor.d.ts.map +1 -1
  673. package/dist/tools/wait/media-processor.js +8 -4
  674. package/dist/tools/wait/media-processor.js.map +1 -1
  675. package/dist/tools/wait/message-delivery.d.ts +9 -6
  676. package/dist/tools/wait/message-delivery.d.ts.map +1 -1
  677. package/dist/tools/wait/message-delivery.js +72 -66
  678. package/dist/tools/wait/message-delivery.js.map +1 -1
  679. package/dist/tools/wait/message-processing.d.ts.map +1 -1
  680. package/dist/tools/wait/message-processing.js +2 -1
  681. package/dist/tools/wait/message-processing.js.map +1 -1
  682. package/dist/tools/wait/poll-loop.d.ts.map +1 -1
  683. package/dist/tools/wait/poll-loop.js +363 -246
  684. package/dist/tools/wait/poll-loop.js.map +1 -1
  685. package/package.json +3 -2
  686. package/templates/azure-devops-securevault.default.md +20 -6
  687. package/templates/board-increment-flow.default.md +51 -0
  688. package/templates/board-quality-checklist.default.md +121 -0
  689. package/templates/board-smoke-test.default.md +81 -0
  690. package/templates/handoff.default.md +43 -18
  691. package/templates/reminders.default.md +1 -0
  692. package/templates/worker-autonomous.default.md +2 -1
  693. package/templates/worker-delegate.default.md +3 -1
  694. package/dist/board/components/TokenEntry.js +0 -42
  695. package/dist/board/state/auth.js +0 -55
  696. package/dist/config/keep-alive-settings.d.ts +0 -29
  697. package/dist/config/keep-alive-settings.d.ts.map +0 -1
  698. package/dist/config/keep-alive-settings.js +0 -100
  699. package/dist/config/keep-alive-settings.js.map +0 -1
  700. package/dist/dashboard/log-parser.d.ts +0 -65
  701. package/dist/dashboard/log-parser.d.ts.map +0 -1
  702. package/dist/dashboard/log-parser.js +0 -219
  703. package/dist/dashboard/log-parser.js.map +0 -1
  704. package/dist/data/board/lane.repository.d.ts +0 -18
  705. package/dist/data/board/lane.repository.d.ts.map +0 -1
  706. package/dist/data/board/lane.repository.js +0 -44
  707. package/dist/data/board/lane.repository.js.map +0 -1
  708. package/dist/data/memory/reflection-dedup.d.ts +0 -17
  709. package/dist/data/memory/reflection-dedup.d.ts.map +0 -1
  710. package/dist/data/memory/reflection-dedup.js +0 -55
  711. package/dist/data/memory/reflection-dedup.js.map +0 -1
  712. package/dist/data/memory/reflection-gates.d.ts +0 -40
  713. package/dist/data/memory/reflection-gates.d.ts.map +0 -1
  714. package/dist/data/memory/reflection-gates.js +0 -220
  715. package/dist/data/memory/reflection-gates.js.map +0 -1
  716. package/dist/data/memory/reflection-sources.d.ts +0 -13
  717. package/dist/data/memory/reflection-sources.d.ts.map +0 -1
  718. package/dist/data/memory/reflection-sources.js +0 -115
  719. package/dist/data/memory/reflection-sources.js.map +0 -1
  720. package/dist/data/memory/reflection.d.ts +0 -43
  721. package/dist/data/memory/reflection.d.ts.map +0 -1
  722. package/dist/data/memory/reflection.js +0 -329
  723. package/dist/data/memory/reflection.js.map +0 -1
  724. package/dist/llm/prompts/reflection.d.ts +0 -6
  725. package/dist/llm/prompts/reflection.d.ts.map +0 -1
  726. package/dist/llm/prompts/reflection.js +0 -77
  727. package/dist/llm/prompts/reflection.js.map +0 -1
  728. package/dist/services/keep-alive-sync.service.d.ts +0 -11
  729. package/dist/services/keep-alive-sync.service.d.ts.map +0 -1
  730. package/dist/services/keep-alive-sync.service.js +0 -47
  731. package/dist/services/keep-alive-sync.service.js.map +0 -1
  732. package/dist/services/memory-pruning.service.d.ts +0 -12
  733. package/dist/services/memory-pruning.service.d.ts.map +0 -1
  734. package/dist/services/memory-pruning.service.js +0 -179
  735. package/dist/services/memory-pruning.service.js.map +0 -1
  736. package/dist/services/usage/usage-inbox-notifier.d.ts +0 -50
  737. package/dist/services/usage/usage-inbox-notifier.d.ts.map +0 -1
  738. package/dist/services/usage/usage-inbox-notifier.js +0 -118
  739. package/dist/services/usage/usage-inbox-notifier.js.map +0 -1
  740. package/templates/atomic-build-spec.default.md +0 -57
  741. package/templates/buildless-vue-preview.default.md +0 -47
  742. package/templates/clean-code.default.md +0 -30
  743. package/templates/code-review.default.md +0 -70
  744. package/templates/daily-review.default.md +0 -26
  745. package/templates/fire-and-forget.default.md +0 -76
  746. package/templates/offload.default.md +0 -33
  747. package/templates/phased-build.default.md +0 -59
  748. package/templates/playwright.default.md +0 -114
  749. package/templates/sensorium-repair.default.md +0 -114
  750. package/templates/sleep.default.md +0 -14
  751. package/templates/swarm.default.md +0 -44
@@ -9,7 +9,8 @@
9
9
 
10
10
  The release channel follows the SAME switch as the MCP server: the tag in
11
11
  MCPStartCommand ("npx -y sensorium-mcp@<tag>"). @latest -> supervisor-latest
12
- (stable, built from main); @refactor -> supervisor-refactor (built from the
12
+ (stable, built from main); @board -> supervisor-board (built from
13
+ feature/agent-task-board); @refactor -> supervisor-refactor (built from the
13
14
  refactor branch). One edit to install.config.json flips both node + supervisor.
14
15
 
15
16
  All configuration is read from ~/.remote-copilot-mcp/install.config.json.
@@ -95,12 +96,13 @@ $EffectiveMCPStartCommand = $Config["MCPStartCommand"]
95
96
  $IsolateMcpRuntime = $Config["IsolateMcpRuntime"] -eq "true"
96
97
 
97
98
  # Resolve the supervisor release channel from the same tag the node server
98
- # follows: the "@<tag>" in MCPStartCommand. Only @refactor uses the branch
99
- # build; everything else (incl. @latest, a bare version pin, or no tag) stays
99
+ # follows: the "@<tag>" in MCPStartCommand. Only @board (supervisor-board, built
100
+ # from feature/agent-task-board) and @refactor (supervisor-refactor) use branch
101
+ # builds; everything else (incl. @latest, a bare version pin, or no tag) stays
100
102
  # on the stable supervisor-latest release. This keeps the stable rollback path
101
103
  # intact — pointing the config back at @latest restores the main supervisor.
102
104
  $mcpTag = if ($EffectiveMCPStartCommand -match 'sensorium-mcp@([A-Za-z0-9._-]+)') { $Matches[1] } else { "latest" }
103
- $ReleaseTag = if ($mcpTag -eq "refactor") { "supervisor-refactor" } else { "supervisor-latest" }
105
+ $ReleaseTag = if ($mcpTag -eq "board") { "supervisor-board" } elseif ($mcpTag -eq "refactor") { "supervisor-refactor" } else { "supervisor-latest" }
104
106
  Write-Host "Supervisor channel: $ReleaseTag (from MCP tag '$mcpTag')" -ForegroundColor Cyan
105
107
 
106
108
  # Validate config values
@@ -117,8 +119,27 @@ Save-Config $Config
117
119
  function Stop-SupervisorProcess {
118
120
  $procs = Get-Process -Name "sensorium-supervisor" -ErrorAction SilentlyContinue
119
121
  if ($procs) {
122
+ # Keep the original PID set. A name-only lookup after stopping can confuse a
123
+ # newly launched process with the instance we were asked to stop.
124
+ $targetPids = @($procs | Select-Object -ExpandProperty Id)
120
125
  Write-Host "Stopping background sensorium-supervisor process(es)..."
121
- $procs | Stop-Process -Force
126
+ $procs | Stop-Process -Force -ErrorAction Stop
127
+
128
+ # Stop-Process returns once a signal has been sent, not once all image/file
129
+ # handles are released. Do not attempt an in-place replacement until every
130
+ # PID we targeted is gone; a continuing process makes the update unsafe.
131
+ $deadline = (Get-Date).AddSeconds(10)
132
+ do {
133
+ $remainingPids = @($targetPids | Where-Object {
134
+ Get-Process -Id $_ -ErrorAction SilentlyContinue
135
+ })
136
+ if ($remainingPids.Count -eq 0) { break }
137
+ Start-Sleep -Milliseconds 250
138
+ } while ((Get-Date) -lt $deadline)
139
+
140
+ if ($remainingPids.Count -gt 0) {
141
+ throw "Refusing to update: sensorium-supervisor PID(s) $($remainingPids -join ', ') did not stop within 10 seconds."
142
+ }
122
143
  Write-Host "Process(es) stopped." -ForegroundColor Yellow
123
144
  }
124
145
  }
@@ -227,7 +248,45 @@ function Save-BinaryMetadata {
227
248
  InstalledAt = (Get-Date).ToString("o")
228
249
  }
229
250
 
230
- $metadata | ConvertTo-Json | Set-Content -LiteralPath $MetadataPath -Encoding ASCII
251
+ # Do not write metadata in place: a failure halfway through a write would make a
252
+ # good binary look stale on the next run. The temp name is unique so concurrent
253
+ # or previously interrupted installs cannot collide with it.
254
+ $metadataTempPath = "$MetadataPath.tmp.$PID.$([guid]::NewGuid().ToString('N'))"
255
+ try {
256
+ $metadata | ConvertTo-Json | Set-Content -LiteralPath $metadataTempPath -Encoding ASCII
257
+ Move-FileWithRetry -Source $metadataTempPath -Destination $MetadataPath -Operation "update release metadata"
258
+ }
259
+ finally {
260
+ if (Test-Path -LiteralPath $metadataTempPath) {
261
+ Remove-Item -LiteralPath $metadataTempPath -Force -ErrorAction SilentlyContinue
262
+ }
263
+ }
264
+ }
265
+
266
+ function Move-FileWithRetry {
267
+ param(
268
+ [string]$Source,
269
+ [string]$Destination,
270
+ [string]$Operation = "replace file",
271
+ [int]$MaxAttempts = 20,
272
+ [int]$RetryDelayMs = 1500
273
+ )
274
+
275
+ for ($attempt = 1; $attempt -le $MaxAttempts; $attempt++) {
276
+ try {
277
+ Move-Item -LiteralPath $Source -Destination $Destination -Force -ErrorAction Stop
278
+ return
279
+ }
280
+ catch {
281
+ if ($attempt -eq $MaxAttempts) {
282
+ throw "Failed to $Operation at $Destination after $MaxAttempts attempts (~$([math]::Round($MaxAttempts * $RetryDelayMs / 1000))s). Original error: $_"
283
+ }
284
+ if ($attempt % 4 -eq 0) {
285
+ Write-Host " ... waiting to $Operation (attempt $attempt/$MaxAttempts)..." -ForegroundColor Yellow
286
+ }
287
+ Start-Sleep -Milliseconds $RetryDelayMs
288
+ }
289
+ }
231
290
  }
232
291
 
233
292
  function Get-BinaryAsset {
@@ -244,7 +303,13 @@ function Get-BinaryAsset {
244
303
  $headers = Get-GithubAuthHeaders -Accept "application/octet-stream"
245
304
  Write-Host "Downloading $($AssetInfo.AssetName) ..."
246
305
 
247
- $tmpFile = "$Destination.tmp"
306
+ $operationId = "$PID.$([guid]::NewGuid().ToString('N'))"
307
+ $tmpFile = "$Destination.tmp.$operationId"
308
+ $backupPath = "$Destination.bak.$operationId"
309
+ $metadataBackupPath = "$MetadataPath.bak.$operationId"
310
+ $hadBinary = Test-Path -LiteralPath $Destination
311
+ $hadMetadata = Test-Path -LiteralPath $MetadataPath
312
+ $swapped = $false
248
313
  try {
249
314
  Invoke-WebRequest -Uri $downloadUrl -Headers $headers -OutFile $tmpFile -UseBasicParsing -ErrorAction Stop
250
315
  }
@@ -256,15 +321,74 @@ function Get-BinaryAsset {
256
321
  throw "Download failed: $_"
257
322
  }
258
323
 
259
- # Atomic replace
260
- if (Test-Path $Destination) {
261
- $backupPath = "$Destination.bak"
262
- Copy-Item $Destination $backupPath -Force
324
+ try {
325
+ # Preserve both halves of the installed state. If anything after the
326
+ # executable swap fails (notably metadata persistence), restore the pair.
327
+ if ($hadBinary) { Copy-Item -LiteralPath $Destination -Destination $backupPath -Force -ErrorAction Stop }
328
+ if ($hadMetadata) { Copy-Item -LiteralPath $MetadataPath -Destination $metadataBackupPath -Force -ErrorAction Stop }
329
+
330
+ # The old exe can still be locked for a while after Stop-Process — AV/EDR
331
+ # may retain its image-section handle during a post-exit scan.
332
+ Move-FileWithRetry -Source $tmpFile -Destination $Destination -Operation "replace supervisor binary"
333
+ $swapped = $true
334
+
335
+ try {
336
+ Unblock-File -Path $Destination -ErrorAction Stop
337
+ }
338
+ catch {
339
+ Write-Host "[WARN] Could not unblock ${Destination}: $($_.Exception.Message)" -ForegroundColor Yellow
340
+ }
341
+
342
+ Save-BinaryMetadata -MetadataPath $MetadataPath -AssetInfo $AssetInfo
343
+ Write-Host "Binary placed at: $Destination" -ForegroundColor Green
344
+ }
345
+ catch {
346
+ $updateError = $_
347
+ if ($swapped) {
348
+ Write-Host "[WARN] Update failed after binary replacement; restoring the previous binary and metadata..." -ForegroundColor Yellow
349
+ $restoreErrors = @()
350
+ try {
351
+ if ($hadBinary) {
352
+ $restoreFile = "$Destination.restore.$operationId"
353
+ Copy-Item -LiteralPath $backupPath -Destination $restoreFile -Force -ErrorAction Stop
354
+ Move-FileWithRetry -Source $restoreFile -Destination $Destination -Operation "restore previous supervisor binary"
355
+ }
356
+ elseif (Test-Path -LiteralPath $Destination) {
357
+ Remove-Item -LiteralPath $Destination -Force -ErrorAction Stop
358
+ }
359
+ }
360
+ catch { $restoreErrors += "binary: $($_.Exception.Message)" }
361
+
362
+ try {
363
+ if ($hadMetadata) {
364
+ # Stage the backup under a unique name, then use the same
365
+ # retrying replacement path as the binary. Copy-Item directly
366
+ # to $MetadataPath could leave metadata restoration vulnerable
367
+ # to a locked destination and bypass the retry policy.
368
+ $metadataRestoreFile = "$MetadataPath.restore.$operationId"
369
+ Copy-Item -LiteralPath $metadataBackupPath -Destination $metadataRestoreFile -Force -ErrorAction Stop
370
+ Move-FileWithRetry -Source $metadataRestoreFile -Destination $MetadataPath -Operation "restore previous release metadata"
371
+ }
372
+ elseif (Test-Path -LiteralPath $MetadataPath) {
373
+ Remove-Item -LiteralPath $MetadataPath -Force -ErrorAction Stop
374
+ }
375
+ }
376
+ catch { $restoreErrors += "metadata: $($_.Exception.Message)" }
377
+
378
+ if ($restoreErrors.Count -gt 0) {
379
+ throw "Update failed and recovery was incomplete ($($restoreErrors -join '; ')). Original error: $($updateError.Exception.Message)"
380
+ }
381
+ throw "Update failed after replacement; the previous binary and metadata were restored. Original error: $($updateError.Exception.Message)"
382
+ }
383
+ throw
384
+ }
385
+ finally {
386
+ foreach ($path in @($tmpFile, $backupPath, $metadataBackupPath, "$Destination.restore.$operationId", "$MetadataPath.restore.$operationId")) {
387
+ if (Test-Path -LiteralPath $path) {
388
+ Remove-Item -LiteralPath $path -Force -ErrorAction SilentlyContinue
389
+ }
390
+ }
263
391
  }
264
- Move-Item $tmpFile $Destination -Force
265
- Unblock-File -Path $Destination -ErrorAction SilentlyContinue
266
- Save-BinaryMetadata -MetadataPath $MetadataPath -AssetInfo $AssetInfo
267
- Write-Host "Binary placed at: $Destination" -ForegroundColor Green
268
392
  }
269
393
 
270
394
  function Install-StartupLauncher {
@@ -439,7 +563,7 @@ function Sync-ReleaseBinary {
439
563
  Write-Host "Fetching release via SecureVault (profile: $SecureVaultProfile)..."
440
564
  securevault run pwsh -NoProfile -File "`"$PSCommandPath`"" -SyncReleaseOnly --profile $SecureVaultProfile
441
565
  if ($LASTEXITCODE -ne 0) {
442
- throw "SecureVault-driven release sync failed (exit $LASTEXITCODE). Ensure profile '$SecureVaultProfile' maps a GitHub PAT to env var SENSORIUM_GH_TOKEN."
566
+ throw "SecureVault-driven release sync failed (exit $LASTEXITCODE). See the error above for the actual cause (e.g. a locked binary, network failure, or a missing GitHub PAT for profile '$SecureVaultProfile' -> `$env:SENSORIUM_GH_TOKEN)."
443
567
  }
444
568
  }
445
569
 
@@ -451,47 +575,76 @@ if ($SyncReleaseOnly) {
451
575
  }
452
576
 
453
577
  # ── Main ─────────────────────────────────────────────────────────────────────
454
- $alreadyExists = Test-Path $Binary
578
+ # Serialize only full installer invocations for this Windows user. The
579
+ # SecureVault child above deliberately returns before this point, so it can do
580
+ # the authenticated release sync without waiting on (and deadlocking with) its
581
+ # parent installer process.
582
+ $currentUserSid = [Security.Principal.WindowsIdentity]::GetCurrent().User.Value
583
+ $installMutexName = "Local\SensoriumSupervisor.Install.$($currentUserSid -replace '[^A-Za-z0-9_.-]', '_')"
584
+ $installMutex = [System.Threading.Mutex]::new($false, $installMutexName)
585
+ $mutexHeld = $false
586
+
587
+ try {
588
+ try {
589
+ $mutexHeld = $installMutex.WaitOne([TimeSpan]::FromMinutes(5))
590
+ }
591
+ catch [System.Threading.AbandonedMutexException] {
592
+ # The prior installer died without releasing the mutex; Windows has given
593
+ # us ownership, so continue while making that state visible to the user.
594
+ $mutexHeld = $true
595
+ Write-Host "[WARN] Recovered an abandoned installer mutex; continuing." -ForegroundColor Yellow
596
+ }
455
597
 
456
- Write-Host ""
457
- if ($alreadyExists) {
458
- Write-Host "=== Sensorium Supervisor UPDATE ===" -ForegroundColor Cyan
459
- }
460
- else {
461
- Write-Host "=== Sensorium Supervisor INSTALL ===" -ForegroundColor Cyan
462
- }
463
- Write-Host "SecureVault profile: $(if ([string]::IsNullOrWhiteSpace($SecureVaultProfile)) { '<disabled>' } else { $SecureVaultProfile })"
464
- Write-Host "Watcher mode: $UpdateMode"
465
- Write-Host "MCP start command: $EffectiveMCPStartCommand"
466
- Write-Host "MCP runtime isolation: $(if ($IsolateMcpRuntime) { 'ENABLED' } else { 'disabled (legacy npx)' })"
467
- Write-Host "Binary : $Binary"
468
- Write-Host ""
469
-
470
- # Step 1 — stop existing instance
471
- if ($alreadyExists) {
472
- Stop-SupervisorProcess
473
- }
598
+ if (-not $mutexHeld) {
599
+ throw "Another Sensorium install/update is still running for this user. Timed out waiting for it to finish."
600
+ }
474
601
 
475
- # Step 2 — ensure bin dir exists
476
- New-Item -ItemType Directory -Path $BinDir -Force | Out-Null
602
+ $alreadyExists = Test-Path $Binary
477
603
 
478
- # Step 3 — fetch release metadata and download only when needed
479
- Sync-ReleaseBinary
604
+ Write-Host ""
605
+ if ($alreadyExists) {
606
+ Write-Host "=== Sensorium Supervisor UPDATE ===" -ForegroundColor Cyan
607
+ }
608
+ else {
609
+ Write-Host "=== Sensorium Supervisor INSTALL ===" -ForegroundColor Cyan
610
+ }
611
+ Write-Host "SecureVault profile: $(if ([string]::IsNullOrWhiteSpace($SecureVaultProfile)) { '<disabled>' } else { $SecureVaultProfile })"
612
+ Write-Host "Watcher mode: $UpdateMode"
613
+ Write-Host "MCP start command: $EffectiveMCPStartCommand"
614
+ Write-Host "MCP runtime isolation: $(if ($IsolateMcpRuntime) { 'ENABLED' } else { 'disabled (legacy npx)' })"
615
+ Write-Host "Binary : $Binary"
616
+ Write-Host ""
480
617
 
481
- # Step 3b — prepare the isolated MCP runtime area (opt-in): a private npm cache +
482
- # repo-independent cwd. The `npx ...@latest` command is unchanged (auto-update
483
- # preserved). On any failure this disables the isolation env in Start-Supervisor,
484
- # so the install degrades safely to legacy behaviour.
485
- if ($IsolateMcpRuntime) {
486
- if (-not (Initialize-IsolatedMcpRuntime)) {
487
- $IsolateMcpRuntime = $false
488
- Write-Host "[WARN] Isolation disabled for this run — using the shared npm cache / inherited cwd." -ForegroundColor Yellow
618
+ # Step 1 — stop existing instance
619
+ if ($alreadyExists) {
620
+ Stop-SupervisorProcess
489
621
  }
490
- }
491
622
 
492
- # Step 4 — install launcher and start
493
- Install-StartupLauncher
494
- Start-Supervisor
623
+ # Step 2 — ensure bin dir exists
624
+ New-Item -ItemType Directory -Path $BinDir -Force | Out-Null
625
+
626
+ # Step 3 — fetch release metadata and download only when needed
627
+ Sync-ReleaseBinary
495
628
 
496
- # Step 5 — verify
497
- Show-Status
629
+ # Step 3b — prepare the isolated MCP runtime area (opt-in): a private npm cache +
630
+ # repo-independent cwd. The `npx ...@latest` command is unchanged (auto-update
631
+ # preserved). On any failure this disables the isolation env in Start-Supervisor,
632
+ # so the install degrades safely to legacy behaviour.
633
+ if ($IsolateMcpRuntime) {
634
+ if (-not (Initialize-IsolatedMcpRuntime)) {
635
+ $IsolateMcpRuntime = $false
636
+ Write-Host "[WARN] Isolation disabled for this run — using the shared npm cache / inherited cwd." -ForegroundColor Yellow
637
+ }
638
+ }
639
+
640
+ # Step 4 — install launcher and start
641
+ Install-StartupLauncher
642
+ Start-Supervisor
643
+
644
+ # Step 5 — verify
645
+ Show-Status
646
+ }
647
+ finally {
648
+ if ($mutexHeld) { $installMutex.ReleaseMutex() }
649
+ if ($installMutex) { $installMutex.Dispose() }
650
+ }
package/README.md CHANGED
@@ -5,6 +5,8 @@
5
5
 
6
6
  MCP server with multi-layer memory, voice analysis, multi-thread orchestration, and Telegram bridge for AI assistants.
7
7
 
8
+ Internal TypeScript conventions: [coding guidelines](docs/coding-guidelines.md).
9
+
8
10
  ## Why?
9
11
 
10
12
  AI assistants forget everything between sessions. Every restart is a blank slate — no memory of your preferences, past decisions, or ongoing projects. Voice messages arrive as opaque audio blobs. And there's no way to talk to your agent when it's running headless in CI or on a remote machine.
@@ -157,6 +159,7 @@ Customizable prompt templates that agents can discover and load on demand.
157
159
  | `send_sticker` | Send a Telegram sticker |
158
160
  | `send_message_to_thread` | Send a message to another thread's agent |
159
161
  | `start_thread` | Spawn a worker, branch, daily, or root thread |
162
+ | `stop_thread` | Stop a worker whose parent link is this thread |
160
163
  | `get_threads_health` | Show thread status, PIDs, last activity |
161
164
  | `schedule_wake_up` | Schedule a one-shot, cron, or idle-triggered task |
162
165
  | `memory_search` | Search episodic/semantic memory by query |
@@ -238,7 +241,7 @@ lib → config → integrations → data, llm → sessions → services → tool
238
241
  ```
239
242
  ~/.remote-copilot-mcp/
240
243
  memory.db <- SQLite: episodes, semantic notes, voice signatures, thread registry
241
- settings.json <- Per-thread agent types, keep-alive, conversation modes
244
+ settings.json <- Dashboard settings, MCP servers, conversation modes (read at start; hand edits apply at restart)
242
245
  install.config.json <- Installer configuration (SecureVault profile, update mode)
243
246
  poller.lock <- PID + timestamp; first instance becomes the poller
244
247
  offset <- Shared getUpdates offset
@@ -19,10 +19,11 @@ let implPromise = null;
19
19
  /** @returns {Promise<BoardApi>} */
20
20
  function load() {
21
21
  if (!implPromise) {
22
- implPromise =
22
+ implPromise = (
23
23
  MODE === "preview"
24
24
  ? import("../mock/api.mock.js").then((m) => m.mockApi)
25
- : import("./client.js").then((m) => m.client);
25
+ : import("./client.js").then((m) => m.client)
26
+ ).then(assertAdapterComplete);
26
27
  }
27
28
  return implPromise;
28
29
  }
@@ -31,31 +32,53 @@ const METHODS = [
31
32
  "listCards",
32
33
  "getCard",
33
34
  "createCard",
35
+ "previewBriefing",
34
36
  "updateCard",
35
37
  "deleteCard",
36
38
  "stopCard",
37
39
  "addComment",
38
- "listLanes",
40
+ "postDecision",
41
+ "listLaneGroups",
39
42
  "getProfiles",
43
+ "saveProfile",
40
44
  "threadRunning",
41
- // Card-builder "How" schema + presets. Preview is served by mock/api.mock.js
42
- // (from the editable schema/policy.js). TODO(P1): api/client.js must implement
43
- // getPolicySchema()/getPresets() against the real board API before production
44
- // uses the schema-driven builder; until then production calls reject and
45
- // useBuilder() degrades to a schema-less builder (no crash).
45
+ "threadLogs",
46
+ // Card-builder "How" schema + presets.
46
47
  "getPolicySchema",
47
48
  "getPresets",
48
- // Lane management (Settings). Preview served by the mock; TODO(P1): implement
49
- // in api/client.js before production exposes lane CRUD.
50
- "createLane",
51
- "updateLane",
52
- "deleteLane",
49
+ "createLaneGroup",
50
+ "updateLaneGroup",
51
+ "deleteLaneGroup",
52
+ // Working-directory picker: one filesystem level per call (lazy browse).
53
+ "listDir",
53
54
  ];
54
55
 
56
+ /**
57
+ * Fail LOUD if the resolved adapter is missing any METHODS entry. A method listed
58
+ * in the contract/registry but never implemented in the active adapter used to
59
+ * surface as a late "undefined is not a function" at call time — exactly how
60
+ * lane-group CRUD and previewBriefing broke in production
61
+ * while preview worked. Asserting completeness once, at load, turns that silent
62
+ * drift into an immediate, named error.
63
+ *
64
+ * @param {Partial<BoardApi>} impl
65
+ * @returns {BoardApi}
66
+ */
67
+ function assertAdapterComplete(impl) {
68
+ const missing = METHODS.filter((name) => typeof impl?.[name] !== "function");
69
+ if (missing.length) {
70
+ throw new Error(
71
+ `Board API adapter is missing method(s): ${missing.join(", ")}. ` +
72
+ `Every METHODS entry must be implemented by the active adapter (api/client.js or mock/api.mock.js).`,
73
+ );
74
+ }
75
+ return /** @type {BoardApi} */ (impl);
76
+ }
77
+
55
78
  /** @type {BoardApi} */
56
79
  const api = /** @type {any} */ ({});
57
80
  for (const name of METHODS) {
58
81
  api[name] = (...args) => load().then((impl) => impl[name](...args));
59
82
  }
60
83
 
61
- export { api };
84
+ export { api, assertAdapterComplete };
@@ -0,0 +1,24 @@
1
+ import "../../test-bootstrap.js";
2
+ import assert from "node:assert/strict";
3
+ import { test } from "node:test";
4
+ import { assertAdapterComplete } from "./api.js";
5
+ import { client } from "./client.js";
6
+ import type { BoardApi } from "./contract.js";
7
+
8
+ test("the adapter completeness guard passes for the production client", () => {
9
+ // Arrange
10
+ const impl = client;
11
+
12
+ // Act & Assert — every contract/registry method is now implemented in client.js.
13
+ assert.doesNotThrow(() => assertAdapterComplete(impl));
14
+ });
15
+
16
+ test("the adapter completeness guard throws naming a method missing from the adapter", () => {
17
+ // Arrange — a client with one contract method dropped (the exact drift that
18
+ // shipped lane CRUD as a late `undefined is not a function`).
19
+ const incomplete: Partial<BoardApi> = { ...client };
20
+ delete incomplete.createLaneGroup;
21
+
22
+ // Act & Assert
23
+ assert.throws(() => assertAdapterComplete(incomplete), /createLaneGroup/);
24
+ });
@@ -2,15 +2,14 @@
2
2
  * Production data adapter. ❌ FROZEN SEAM.
3
3
  *
4
4
  * Real `fetch` to the board API. Root-relative `/api/...` paths (never a host or
5
- * port) so the app works unchanged behind the Cloudflare Tunnel. Bearer token is
6
- * injected from state/auth.js. This is the ONLY module that talks to the network.
5
+ * port) so the app works unchanged behind the Dev Tunnel. This is the ONLY module
6
+ * that talks to the network.
7
7
  *
8
8
  * @typedef {import('./contract.js').BoardApi} BoardApi
9
9
  * @typedef {import('./contract.js').BoardCard} BoardCard
10
10
  */
11
11
 
12
12
  import { API_BASE } from "../config.js";
13
- import { getToken } from "../state/auth.js";
14
13
 
15
14
  /**
16
15
  * @param {string} method
@@ -19,8 +18,6 @@ import { getToken } from "../state/auth.js";
19
18
  */
20
19
  async function req(method, path, body) {
21
20
  const headers = {};
22
- const token = getToken();
23
- if (token) headers.Authorization = `Bearer ${token}`;
24
21
  if (body !== undefined) headers["Content-Type"] = "application/json";
25
22
 
26
23
  const res = await fetch(`${API_BASE}${path}`, {
@@ -49,12 +46,11 @@ async function req(method, path, body) {
49
46
 
50
47
  /** @type {BoardApi} */
51
48
  export const client = {
52
- listCards({ includeArchived = false, lane } = {}) {
49
+ listCards({ includeArchived = false } = {}) {
53
50
  const p = new URLSearchParams();
54
51
  if (includeArchived) p.set("includeArchived", "1");
55
- if (lane != null) p.set("lane", String(lane));
56
52
  const qs = p.toString();
57
- return req("GET", `/api/board/cards${qs ? `?${qs}` : ""}`).then((d) => d.cards);
53
+ return req("GET", `/api/board/cards${qs ? `?${qs}` : ""}`);
58
54
  },
59
55
  getCard(id) {
60
56
  return req("GET", `/api/board/cards/${id}`);
@@ -62,6 +58,9 @@ export const client = {
62
58
  createCard(card) {
63
59
  return req("POST", "/api/board/cards", card).then((d) => d.card);
64
60
  },
61
+ previewBriefing(draft) {
62
+ return req("POST", "/api/board/cards/preview", draft).then((d) => d.briefing);
63
+ },
65
64
  updateCard(id, patch) {
66
65
  return req("PATCH", `/api/board/cards/${id}`, patch).then((d) => d.card);
67
66
  },
@@ -74,23 +73,41 @@ export const client = {
74
73
  addComment(id, content) {
75
74
  return req("POST", `/api/board/cards/${id}/comments`, { content }).then((d) => d.comment);
76
75
  },
77
- listLanes() {
78
- return req("GET", "/api/board/lanes").then((d) => d.lanes);
76
+ postDecision(id, answer) {
77
+ return req("POST", `/api/board/cards/${id}/decision`, { answer }).then((d) => d.card);
78
+ },
79
+ listLaneGroups() {
80
+ return req("GET", "/api/board/lane-groups").then((d) => d.laneGroups);
81
+ },
82
+ createLaneGroup(name) {
83
+ return req("POST", "/api/board/lane-groups", { name }).then((d) => d.laneGroup);
84
+ },
85
+ updateLaneGroup(id, patch) {
86
+ return req("PATCH", `/api/board/lane-groups/${id}`, patch).then((d) => d.laneGroup);
87
+ },
88
+ deleteLaneGroup(id) {
89
+ return req("DELETE", `/api/board/lane-groups/${id}`).then(() => undefined);
79
90
  },
80
91
  getProfiles() {
81
92
  return req("GET", "/api/board/profiles").then((d) => d.profiles);
82
93
  },
94
+ saveProfile(input) {
95
+ return req("POST", "/api/board/profiles", input).then((d) => d.profile);
96
+ },
83
97
  threadRunning(threadId) {
84
98
  return req("GET", `/api/threads/${threadId}/running`).then((d) => !!d.running);
85
99
  },
86
- // TODO(P1): serve the card-builder "How" schema/presets from the real board
87
- // API (e.g. GET /api/board/policy). Until then these reject explicitly so the
88
- // production failure is legible; useBuilder() swallows the rejection and falls
89
- // back to a schema-less builder (no crash).
100
+ threadLogs(threadId, { view = "assistant", offset = 0, limit = 4000 } = {}) {
101
+ const params = new URLSearchParams({ view, offset: String(offset), limit: String(limit) });
102
+ return req("GET", `/api/threads/${threadId}/logs?${params}`);
103
+ },
90
104
  getPolicySchema() {
91
- return Promise.reject(new Error("getPolicySchema not implemented — P1"));
105
+ return req("GET", "/api/board/policy").then((d) => d.schema);
92
106
  },
93
107
  getPresets() {
94
- return Promise.reject(new Error("getPresets not implemented — P1"));
108
+ return req("GET", "/api/board/policy").then((d) => d.presets);
109
+ },
110
+ listDir(path) {
111
+ return req("GET", `/api/board/dir-listing?path=${encodeURIComponent(path || "")}`);
95
112
  },
96
113
  };
@@ -1,43 +1,77 @@
1
1
  /**
2
2
  * Card tile — ✅ EDITABLE. Pure: `card` + `laneName` in, `open` out.
3
3
  * Dispatch design: floating dark card — title, then chip row with priority,
4
- * type, live worker pulse / blocked / archived.
4
+ * live worker pulse / blocked / archived. A decision_needed card gets a distinct
5
+ * badge plus a waiting-age cue so a stalled decision is obvious at a glance.
5
6
  */
6
7
 
7
8
  import StatusChip from "./StatusChip.js";
8
9
  import PriorityChip from "./PriorityChip.js";
10
+ import { proactiveLimitKind, providerLabel, retryLabel } from "./rateLimit.js";
11
+ import { humanMins, minsSince } from "./time.js";
9
12
 
10
13
  export default {
11
14
  name: "Card",
12
15
  components: { StatusChip, PriorityChip },
13
16
  props: {
14
17
  card: { type: Object, required: true },
15
- laneName: { type: Function, default: (id) => `Thread ${id}` },
18
+ laneName: { type: Function, default: () => "Ungrouped" },
19
+ limitedProviders: { type: Array, default: () => [] },
16
20
  },
17
21
  emits: ["open"],
18
22
  setup(props, { emit }) {
19
23
  function elapsed() {
20
24
  if (!props.card.startedAt) return "";
21
- const mins = Math.max(0, Math.round((Date.now() - new Date(props.card.startedAt)) / 60000));
22
- return mins >= 60 ? Math.floor(mins / 60) + "h " + (mins % 60) + "m" : mins + "m";
25
+ return humanMins(minsSince(props.card.startedAt));
23
26
  }
24
- return { emit, elapsed };
27
+ function rlText() {
28
+ const p = providerLabel(props.card.rateLimitProvider);
29
+ return (p ? p + " · " : "") + retryLabel(props.card);
30
+ }
31
+ function proactiveProvider() {
32
+ return providerLabel(props.card.profile?.agentType);
33
+ }
34
+ function proactiveKind() {
35
+ return proactiveLimitKind(props.card, props.limitedProviders);
36
+ }
37
+ /** How long this card has been waiting on the operator. */
38
+ function waiting() {
39
+ const c = props.card;
40
+ if (c.status !== "decision_needed") return null;
41
+ const mins = minsSince(c.updatedAt || c.finishedAt || c.startedAt || c.createdAt);
42
+ return { text: humanMins(mins), stale: mins >= 480 };
43
+ }
44
+ return { emit, elapsed, proactiveKind, proactiveProvider, rlText, waiting };
25
45
  },
26
46
  template: `
27
47
  <article class="card" role="listitem" tabindex="0"
48
+ :class="{ 'card--decision': card.status === 'decision_needed' }"
28
49
  @click="emit('open', card)"
29
50
  @keydown.enter="emit('open', card)">
51
+ <div v-if="waiting()" class="card__decision" :class="{ 'is-stale': waiting().stale }">
52
+ <span class="card__decision-label">
53
+ <span class="dot dot--pulse"></span>NEEDS YOU
54
+ </span>
55
+ <span class="card__decision-age">waiting {{ waiting().text }}</span>
56
+ </div>
30
57
  <h3 class="card__title">{{ card.title }}</h3>
31
58
  <p v-if="card.description" class="card__desc">{{ card.description }}</p>
59
+ <div v-if="card.status === 'rate_limited'" class="card__rl">
60
+ <svg viewBox="0 0 12 12" width="11" height="11" fill="none" stroke="currentColor" stroke-width="1.3" stroke-linecap="round" aria-hidden="true"><circle cx="6" cy="6" r="4.6"></circle><path d="M6 3.6V6l1.8 1.2"></path></svg>
61
+ <span>rate limited · {{ rlText() }}</span>
62
+ </div>
63
+ <div v-if="proactiveKind()" class="card__rl">
64
+ <StatusChip status="rate_limited" :kind="proactiveKind()" />
65
+ <span v-if="proactiveProvider()">{{ proactiveProvider() }}</span>
66
+ </div>
32
67
  <div class="card__foot">
33
68
  <PriorityChip :priority="card.priority" />
34
- <span class="chip chip--muted">{{ card.type }}</span>
35
69
  <span v-if="card.status === 'in_progress'" class="chip chip--live">
36
70
  <span class="dot dot--pulse"></span>working<template v-if="card.startedAt"> · {{ elapsed() }}</template>
37
71
  </span>
38
72
  <span v-else-if="card.blockedReason" class="chip chip--warn">blocked</span>
39
73
  <span v-if="card.archivedAt" class="chip chip--muted">archived</span>
40
- <span class="card__lane">{{ laneName(card.laneThreadId) }}</span>
74
+ <span class="card__lane">{{ laneName(card.laneGroupId) }}</span>
41
75
  </div>
42
76
  </article>
43
77
  `,