@wrongstack/tools 0.296.4 → 0.298.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 (258) hide show
  1. package/dist/_spawn-stream.d.ts +2 -0
  2. package/dist/_util.d.ts +29 -1
  3. package/dist/audit.js +128 -65
  4. package/dist/bash.js +20 -4
  5. package/dist/batch-tool-use.js +70 -7
  6. package/dist/browser/index.js +31 -1
  7. package/dist/builtin.js +883 -351
  8. package/dist/codebase-index/index.js +95 -16
  9. package/dist/codebase-index/project-server-protocol.d.ts +26 -0
  10. package/dist/codebase-index/project-server.js +76 -16
  11. package/dist/codebase-index/worker.js +36 -13
  12. package/dist/codebase-index/writer-search-helpers.d.ts +16 -0
  13. package/dist/codebase-index/writer.d.ts +13 -1
  14. package/dist/design.d.ts +1 -1
  15. package/dist/design.js +4 -3
  16. package/dist/diff.js +11 -1
  17. package/dist/e2e.js +9 -6
  18. package/dist/edit.js +9 -6
  19. package/dist/exec.js +562 -516
  20. package/dist/format.js +131 -65
  21. package/dist/git.js +22 -2
  22. package/dist/glob.js +11 -5
  23. package/dist/grep.js +160 -104
  24. package/dist/index.js +834 -290
  25. package/dist/install.js +135 -68
  26. package/dist/json.js +64 -18
  27. package/dist/kanban-board-inputs.d.ts +21 -4
  28. package/dist/kanban.js +20 -5
  29. package/dist/languages/index.js +143 -71
  30. package/dist/lint.js +128 -65
  31. package/dist/next-steps.d.ts +23 -0
  32. package/dist/next-steps.js +4 -0
  33. package/dist/outdated.js +101 -26
  34. package/dist/pack.js +883 -351
  35. package/dist/patch.js +11 -1
  36. package/dist/plan.js +32 -10
  37. package/dist/process-registry.d.ts +9 -0
  38. package/dist/process-registry.js +15 -0
  39. package/dist/ps-slash.js +15 -0
  40. package/dist/read.js +104 -23
  41. package/dist/replace.js +11 -3
  42. package/dist/scaffold.js +9 -6
  43. package/dist/session-kanban.js +21 -5
  44. package/dist/task.js +3 -1
  45. package/dist/test.js +128 -65
  46. package/dist/todo.js +3 -1
  47. package/dist/tool-tier.js +883 -351
  48. package/dist/tool-use.d.ts +1 -1
  49. package/dist/tool-use.js +28 -4
  50. package/dist/tree.d.ts +1 -0
  51. package/dist/tree.js +44 -8
  52. package/dist/typecheck.js +128 -65
  53. package/dist/write.js +9 -6
  54. package/package.json +5 -4
  55. package/dist/_concurrency.d.ts.map +0 -1
  56. package/dist/_danger-detect.d.ts.map +0 -1
  57. package/dist/_edit-match.d.ts.map +0 -1
  58. package/dist/_env.d.ts.map +0 -1
  59. package/dist/_fetch-guard.d.ts.map +0 -1
  60. package/dist/_output-spool.d.ts.map +0 -1
  61. package/dist/_redact-command.d.ts.map +0 -1
  62. package/dist/_regex.d.ts.map +0 -1
  63. package/dist/_session-shell.d.ts.map +0 -1
  64. package/dist/_shell-pick.d.ts.map +0 -1
  65. package/dist/_spawn-stream.d.ts.map +0 -1
  66. package/dist/_syntax-check.d.ts.map +0 -1
  67. package/dist/_util.d.ts.map +0 -1
  68. package/dist/_win32-resolve.d.ts.map +0 -1
  69. package/dist/audit.d.ts.map +0 -1
  70. package/dist/audit.js.map +0 -7
  71. package/dist/auto-proceed-loop-guard.d.ts.map +0 -1
  72. package/dist/auto-proceed-loop-guard.js.map +0 -7
  73. package/dist/bash-kill-guard.d.ts.map +0 -1
  74. package/dist/bash.d.ts.map +0 -1
  75. package/dist/bash.js.map +0 -7
  76. package/dist/batch-tool-use.d.ts.map +0 -1
  77. package/dist/batch-tool-use.js.map +0 -7
  78. package/dist/browser/artifacts.d.ts.map +0 -1
  79. package/dist/browser/index.d.ts.map +0 -1
  80. package/dist/browser/index.js.map +0 -7
  81. package/dist/browser/manager.d.ts.map +0 -1
  82. package/dist/browser/network-guard-proxy.d.ts.map +0 -1
  83. package/dist/browser/security.d.ts.map +0 -1
  84. package/dist/browser/tools.d.ts.map +0 -1
  85. package/dist/browser/types.d.ts.map +0 -1
  86. package/dist/builtin.d.ts.map +0 -1
  87. package/dist/builtin.js.map +0 -7
  88. package/dist/circuit-breaker.d.ts.map +0 -1
  89. package/dist/circuit-breaker.js.map +0 -7
  90. package/dist/codebase-index/background-indexer.d.ts.map +0 -1
  91. package/dist/codebase-index/bm25.d.ts.map +0 -1
  92. package/dist/codebase-index/circuit-breaker.d.ts.map +0 -1
  93. package/dist/codebase-index/codebase-index-tool.d.ts.map +0 -1
  94. package/dist/codebase-index/codebase-search-tool.d.ts.map +0 -1
  95. package/dist/codebase-index/codebase-stats-tool.d.ts.map +0 -1
  96. package/dist/codebase-index/dead-code-scan.d.ts.map +0 -1
  97. package/dist/codebase-index/generic-parser.d.ts.map +0 -1
  98. package/dist/codebase-index/gitignore.d.ts.map +0 -1
  99. package/dist/codebase-index/go-parser.d.ts.map +0 -1
  100. package/dist/codebase-index/index-service.d.ts.map +0 -1
  101. package/dist/codebase-index/index.d.ts.map +0 -1
  102. package/dist/codebase-index/index.js.map +0 -7
  103. package/dist/codebase-index/indexer.d.ts.map +0 -1
  104. package/dist/codebase-index/json-parser.d.ts.map +0 -1
  105. package/dist/codebase-index/languages.d.ts.map +0 -1
  106. package/dist/codebase-index/lsp-kind.d.ts.map +0 -1
  107. package/dist/codebase-index/parser-dispatch.d.ts.map +0 -1
  108. package/dist/codebase-index/project-server-cache.d.ts.map +0 -1
  109. package/dist/codebase-index/project-server-client.d.ts.map +0 -1
  110. package/dist/codebase-index/project-server-endpoint.d.ts.map +0 -1
  111. package/dist/codebase-index/project-server-protocol.d.ts.map +0 -1
  112. package/dist/codebase-index/project-server.d.ts.map +0 -1
  113. package/dist/codebase-index/project-server.js.map +0 -7
  114. package/dist/codebase-index/py-parser.d.ts.map +0 -1
  115. package/dist/codebase-index/refs-extractor.d.ts.map +0 -1
  116. package/dist/codebase-index/rs-parser.d.ts.map +0 -1
  117. package/dist/codebase-index/schema.d.ts.map +0 -1
  118. package/dist/codebase-index/spawn-gate.d.ts.map +0 -1
  119. package/dist/codebase-index/sqlite-runtime.d.ts.map +0 -1
  120. package/dist/codebase-index/ts-parser.d.ts.map +0 -1
  121. package/dist/codebase-index/worker-protocol.d.ts.map +0 -1
  122. package/dist/codebase-index/worker.d.ts.map +0 -1
  123. package/dist/codebase-index/worker.js.map +0 -7
  124. package/dist/codebase-index/writer-admin.d.ts.map +0 -1
  125. package/dist/codebase-index/writer-bulk-insert.d.ts.map +0 -1
  126. package/dist/codebase-index/writer-graph-helpers.d.ts.map +0 -1
  127. package/dist/codebase-index/writer-graph-reader.d.ts.map +0 -1
  128. package/dist/codebase-index/writer-helpers.d.ts.map +0 -1
  129. package/dist/codebase-index/writer-pragmas.d.ts.map +0 -1
  130. package/dist/codebase-index/writer-ref-mapper.d.ts.map +0 -1
  131. package/dist/codebase-index/writer-schema.d.ts.map +0 -1
  132. package/dist/codebase-index/writer-search-helpers.d.ts.map +0 -1
  133. package/dist/codebase-index/writer-store-pool.d.ts.map +0 -1
  134. package/dist/codebase-index/writer.d.ts.map +0 -1
  135. package/dist/codebase-index/yaml-parser.d.ts.map +0 -1
  136. package/dist/design.d.ts.map +0 -1
  137. package/dist/design.js.map +0 -7
  138. package/dist/diff.d.ts.map +0 -1
  139. package/dist/diff.js.map +0 -7
  140. package/dist/document.d.ts.map +0 -1
  141. package/dist/document.js.map +0 -7
  142. package/dist/e2e.d.ts.map +0 -1
  143. package/dist/e2e.js.map +0 -7
  144. package/dist/edit.d.ts.map +0 -1
  145. package/dist/edit.js.map +0 -7
  146. package/dist/exec-kill-guard.d.ts.map +0 -1
  147. package/dist/exec.d.ts.map +0 -1
  148. package/dist/exec.js.map +0 -7
  149. package/dist/fetch.d.ts.map +0 -1
  150. package/dist/fetch.js.map +0 -7
  151. package/dist/format.d.ts.map +0 -1
  152. package/dist/format.js.map +0 -7
  153. package/dist/git.d.ts.map +0 -1
  154. package/dist/git.js.map +0 -7
  155. package/dist/glob.d.ts.map +0 -1
  156. package/dist/glob.js.map +0 -7
  157. package/dist/grep.d.ts.map +0 -1
  158. package/dist/grep.js.map +0 -7
  159. package/dist/index.d.ts.map +0 -1
  160. package/dist/index.js.map +0 -7
  161. package/dist/install.d.ts.map +0 -1
  162. package/dist/install.js.map +0 -7
  163. package/dist/json.d.ts.map +0 -1
  164. package/dist/json.js.map +0 -7
  165. package/dist/kanban-board-inputs.d.ts.map +0 -1
  166. package/dist/kanban-decomposition-actions.d.ts.map +0 -1
  167. package/dist/kanban-detail-actions.d.ts.map +0 -1
  168. package/dist/kanban-evidence-bridge.d.ts.map +0 -1
  169. package/dist/kanban-presence.d.ts.map +0 -1
  170. package/dist/kanban-split-task-handler.d.ts.map +0 -1
  171. package/dist/kanban-task-inputs.d.ts.map +0 -1
  172. package/dist/kanban-tool-results.d.ts.map +0 -1
  173. package/dist/kanban-tool-schema.d.ts.map +0 -1
  174. package/dist/kanban-tool-types.d.ts.map +0 -1
  175. package/dist/kanban.d.ts.map +0 -1
  176. package/dist/kanban.js.map +0 -7
  177. package/dist/languages/detect.d.ts.map +0 -1
  178. package/dist/languages/diagnostics.d.ts.map +0 -1
  179. package/dist/languages/execute-tool.d.ts.map +0 -1
  180. package/dist/languages/execute.d.ts.map +0 -1
  181. package/dist/languages/index.d.ts.map +0 -1
  182. package/dist/languages/index.js.map +0 -7
  183. package/dist/languages/legacy-bridge.d.ts.map +0 -1
  184. package/dist/languages/package-tool.d.ts.map +0 -1
  185. package/dist/languages/plan.d.ts.map +0 -1
  186. package/dist/languages/profile-helpers.d.ts.map +0 -1
  187. package/dist/languages/profiles/additional.d.ts.map +0 -1
  188. package/dist/languages/profiles/primary.d.ts.map +0 -1
  189. package/dist/languages/registry.d.ts.map +0 -1
  190. package/dist/languages/tool.d.ts.map +0 -1
  191. package/dist/languages/types.d.ts.map +0 -1
  192. package/dist/lint.d.ts.map +0 -1
  193. package/dist/lint.js.map +0 -7
  194. package/dist/logs.d.ts.map +0 -1
  195. package/dist/logs.js.map +0 -7
  196. package/dist/memory.d.ts.map +0 -1
  197. package/dist/memory.js.map +0 -7
  198. package/dist/mode.d.ts.map +0 -1
  199. package/dist/mode.js.map +0 -7
  200. package/dist/next-steps.d.ts.map +0 -1
  201. package/dist/next-steps.js.map +0 -7
  202. package/dist/outdated.d.ts.map +0 -1
  203. package/dist/outdated.js.map +0 -7
  204. package/dist/pack.d.ts.map +0 -1
  205. package/dist/pack.js.map +0 -7
  206. package/dist/patch.d.ts.map +0 -1
  207. package/dist/patch.js.map +0 -7
  208. package/dist/plan.d.ts.map +0 -1
  209. package/dist/plan.js.map +0 -7
  210. package/dist/process-guardian.d.ts.map +0 -1
  211. package/dist/process-registry-persistent.d.ts.map +0 -1
  212. package/dist/process-registry.d.ts.map +0 -1
  213. package/dist/process-registry.js.map +0 -7
  214. package/dist/ps-slash.d.ts.map +0 -1
  215. package/dist/ps-slash.js.map +0 -7
  216. package/dist/read.d.ts.map +0 -1
  217. package/dist/read.js.map +0 -7
  218. package/dist/replace.d.ts.map +0 -1
  219. package/dist/replace.js.map +0 -7
  220. package/dist/scaffold.d.ts.map +0 -1
  221. package/dist/scaffold.js.map +0 -7
  222. package/dist/search.d.ts.map +0 -1
  223. package/dist/search.js.map +0 -7
  224. package/dist/session-kanban.d.ts.map +0 -1
  225. package/dist/session-kanban.js.map +0 -7
  226. package/dist/set-working-dir.d.ts.map +0 -1
  227. package/dist/skill.d.ts.map +0 -1
  228. package/dist/skill.js.map +0 -7
  229. package/dist/spawn-background.d.ts.map +0 -1
  230. package/dist/task.d.ts.map +0 -1
  231. package/dist/task.js.map +0 -7
  232. package/dist/test.d.ts.map +0 -1
  233. package/dist/test.js.map +0 -7
  234. package/dist/todo.d.ts.map +0 -1
  235. package/dist/todo.js.map +0 -7
  236. package/dist/tool-diff.d.ts.map +0 -1
  237. package/dist/tool-diff.js.map +0 -7
  238. package/dist/tool-help.d.ts.map +0 -1
  239. package/dist/tool-help.js.map +0 -7
  240. package/dist/tool-icon-map.d.ts.map +0 -1
  241. package/dist/tool-icons.d.ts.map +0 -1
  242. package/dist/tool-icons.js.map +0 -7
  243. package/dist/tool-search.d.ts.map +0 -1
  244. package/dist/tool-search.js.map +0 -7
  245. package/dist/tool-summary.d.ts.map +0 -1
  246. package/dist/tool-summary.js.map +0 -7
  247. package/dist/tool-tier.d.ts.map +0 -1
  248. package/dist/tool-tier.js.map +0 -7
  249. package/dist/tool-use.d.ts.map +0 -1
  250. package/dist/tool-use.js.map +0 -7
  251. package/dist/tree.d.ts.map +0 -1
  252. package/dist/tree.js.map +0 -7
  253. package/dist/typecheck.d.ts.map +0 -1
  254. package/dist/typecheck.js.map +0 -7
  255. package/dist/win32.d.ts.map +0 -1
  256. package/dist/win32.js.map +0 -7
  257. package/dist/write.d.ts.map +0 -1
  258. package/dist/write.js.map +0 -7
@@ -1 +0,0 @@
1
- {"version":3,"file":"json.d.ts","sourceRoot":"","sources":["../src/json.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,wBAAwB,CAAC;AAOnD,KAAK,UAAU,GAAG,OAAO,GAAG,OAAO,GAAG,UAAU,GAAG,WAAW,GAAG,OAAO,CAAC;AAEzE,UAAU,SAAS;IACjB,iDAAiD;IACjD,MAAM,CAAC,EAAE,UAAU,GAAG,SAAS,CAAC;IAGhC,4DAA4D;IAC5D,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1B,6DAA6D;IAC7D,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1B,uDAAuD;IACvD,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,GAAG,MAAM,GAAG,SAAS,CAAC;IAG/C,QAAQ,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAG/B,sCAAsC;IACtC,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,2DAA2D;IAC3D,UAAU,CAAC,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC;IAGlC,uCAAuC;IACvC,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,CAAC;IAG7C,6BAA6B;IAC7B,IAAI,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAC3B,8BAA8B;IAC9B,KAAK,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAC5B,4EAA4E;IAC5E,kBAAkB,CAAC,EAAE,aAAa,GAAG,cAAc,GAAG,SAAS,CAAC;CACjE;AAED,UAAU,UAAU;IAClB,IAAI,EAAE,OAAO,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC;IAC5B,YAAY,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IACnC,MAAM,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAC7B,KAAK,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAC5B,MAAM,CAAC,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC;IAC9B,KAAK,CAAC,EAAE,KAAK,CAAC;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,OAAO,CAAA;KAAE,CAAC,GAAG,SAAS,CAAC;IAClE,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAC5B;AAED,eAAO,MAAM,QAAQ,EAAE,IAAI,CAAC,SAAS,EAAE,UAAU,CA2EhD,CAAC"}
package/dist/json.js.map DELETED
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../src/json.ts", "../src/_util.ts"],
4
- "sourcesContent": ["import * as fs from 'node:fs/promises';\nimport { deepMerge as deepMergeCore } from '@wrongstack/core/utils';\nimport type { Context } from '@wrongstack/core/agent';\nimport type { Tool } from '@wrongstack/core/types';\nimport { safeResolveReal } from './_util.js';\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\ntype JsonAction = 'parse' | 'query' | 'validate' | 'transform' | 'merge';\n\ninterface JsonInput {\n /** Operation to perform. Defaults to 'parse'. */\n action?: JsonAction | undefined;\n\n // --- parse / query / validate (single data source) ---\n /** Path to JSON/JSON5/YAML file (alternative to `data`). */\n file?: string | undefined;\n /** Inline JSON/JSON5/YAML string (alternative to `file`). */\n data?: string | undefined;\n /** Output format for parse/query/transform results. */\n format?: 'json' | 'json5' | 'yaml' | undefined;\n\n // --- parse: validate syntax only ---\n validate?: boolean | undefined;\n\n // --- query / transform ---\n /** JMESPath-like query expression. */\n query?: string | undefined;\n /** Ordered JMESPath transforms (transform action only). */\n transforms?: string[] | undefined;\n\n // --- validate against schema ---\n /** JSON Schema to validate against. */\n schema?: Record<string, unknown> | undefined;\n\n // --- merge ---\n /** Base object for merge. */\n base?: unknown | undefined;\n /** Patch object for merge. */\n patch?: unknown | undefined;\n /** Merge conflict resolution: 'prefer-patch' (default) or 'prefer-base'. */\n conflictResolution?: 'prefer-base' | 'prefer-patch' | undefined;\n}\n\ninterface JsonOutput {\n data: unknown;\n formatted: string;\n type: string;\n action: string;\n keys?: string[] | undefined;\n query_result?: unknown | undefined;\n result?: unknown | undefined;\n valid?: boolean | undefined;\n errors?: string[] | undefined;\n steps?: Array<{ transform: string; result: unknown }> | undefined;\n error?: string | undefined;\n}\n\nexport const jsonTool: Tool<JsonInput, JsonOutput> = {\n name: 'json',\n category: 'Data',\n description:\n 'Parse, pretty-print, query, validate, transform, and merge JSON/JSON5/YAML. Use `action` to select the operation: parse (default), query, validate, transform, or merge.',\n usageHint:\n 'VERY USEFUL FOR DATA INSPECTION:\\n\\n' +\n '- `action: \"parse\"` (default): read/pretty-print/convert JSON, JSON5, or YAML from `file` or `data`.\\n' +\n '- `action: \"query\"`: JMESPath-like query (`a.b[0].c`, `items[*].name`, filters, functions).\\n' +\n '- `action: \"validate\"`: validate data against a JSON Schema (`schema` param).\\n' +\n '- `action: \"transform\"`: chain multiple JMESPath transforms (`transforms` param).\\n' +\n '- `action: \"merge\"`: deep merge `base` and `patch` objects (`conflictResolution` param).\\n' +\n 'Prefer this over raw `read` + manual parsing when dealing with configuration or data files.',\n permission: 'auto',\n mutating: false,\n timeoutMs: 5_000,\n capabilities: ['fs.read'],\n icon: 'json',\n inputSchema: {\n type: 'object',\n properties: {\n action: {\n type: 'string',\n enum: ['parse', 'query', 'validate', 'transform', 'merge'],\n description: 'Operation (default: parse). parse=read/pretty-print, query=JMESPath, validate=schema, transform=chained queries, merge=deep merge.',\n },\n file: { type: 'string', description: 'Path to JSON/JSON5/YAML file (parse/query/validate)' },\n data: { type: 'string', description: 'JSON/JSON5/YAML string (parse/query/validate, alternative to file)' },\n format: {\n type: 'string',\n enum: ['json', 'json5', 'yaml'],\n description: 'Output format for parse/query/transform (default: json)',\n },\n query: {\n type: 'string',\n description: 'JMESPath-like query expression (query action)',\n },\n transforms: {\n type: 'array',\n items: { type: 'string' },\n description: 'Ordered JMESPath query strings (transform action)',\n },\n schema: {\n type: 'object',\n description: 'JSON Schema to validate against (validate action)',\n },\n base: { description: 'Base JSON object (merge action)' },\n patch: { description: 'Patch JSON object to merge in (merge action)' },\n conflictResolution: {\n type: 'string',\n enum: ['prefer-base', 'prefer-patch'],\n description: 'Merge conflict resolution (default: prefer-patch)',\n },\n validate: {\n type: 'boolean',\n description: 'Validate syntax only, no output (parse action, default: false)',\n },\n },\n },\n async execute(input, ctx) {\n const action = input.action ?? 'parse';\n\n switch (action) {\n case 'query':\n return executeQuery(input, ctx);\n case 'validate':\n return executeValidate(input, ctx);\n case 'transform':\n return executeTransform(input, ctx);\n case 'merge':\n return executeMerge(input);\n default:\n return executeParse(input, ctx);\n }\n },\n};\n\n// ---------------------------------------------------------------------------\n// Action: parse (default \u2014 the original json tool behavior)\n// ---------------------------------------------------------------------------\n\nasync function executeParse(input: JsonInput, ctx: Context): Promise<JsonOutput> {\n const format = input.format ?? 'json';\n\n let parsed: unknown;\n let raw: string;\n\n if (input.file) {\n try {\n raw = await fs.readFile(await safeResolveReal(input.file, ctx), 'utf8');\n } catch {\n return { data: null, formatted: '', type: 'unknown', action: 'parse', error: 'Could not read file' };\n }\n } else if (input.data) {\n raw = input.data;\n } else {\n return { data: null, formatted: '', type: 'unknown', action: 'parse', error: 'Provide file or data' };\n }\n\n try {\n parsed = JSON.parse(raw);\n } catch (e) {\n return {\n data: null,\n formatted: '',\n type: 'unknown',\n action: 'parse',\n /* v8 ignore next -- JSON.parse only throws SyntaxError (an Error); the String(e) side is defensive. */\n error: `Parse failed: ${e instanceof Error ? e.message : String(e)}`,\n };\n }\n\n if (input.validate) {\n return {\n data: parsed,\n formatted: 'valid',\n type: Array.isArray(parsed) ? 'array' : typeof parsed,\n action: 'parse',\n keys:\n typeof parsed === 'object' && parsed !== null ? Object.keys(parsed as object) : undefined,\n };\n }\n\n // Backward compat: if `query` is provided without an explicit action,\n // use the original simple path-based query (supports `a.b[0].c` notation).\n if (input.query) {\n const queryResult = simpleQuery(parsed, input.query);\n const formatted = formatOutput(queryResult, format);\n return {\n data: parsed,\n formatted,\n type: Array.isArray(parsed) ? 'array' : typeof parsed,\n action: 'parse',\n keys:\n typeof parsed === 'object' && parsed !== null ? Object.keys(parsed as object) : undefined,\n query_result: queryResult,\n };\n }\n\n const formatted = formatOutput(parsed, format);\n\n return {\n data: parsed,\n formatted,\n type: Array.isArray(parsed) ? 'array' : typeof parsed,\n action: 'parse',\n keys:\n typeof parsed === 'object' && parsed !== null ? Object.keys(parsed as object) : undefined,\n };\n}\n\n// ---------------------------------------------------------------------------\n// Action: query (JMESPath-like \u2014 from json-path plugin)\n// ---------------------------------------------------------------------------\n\nasync function executeQuery(input: JsonInput, ctx: Context): Promise<JsonOutput> {\n if (!input.query) {\n return { data: null, formatted: '', type: 'unknown', action: 'query', error: 'query is required for action: query' };\n }\n\n let parsed: unknown;\n if (input.file) {\n try {\n const raw = await fs.readFile(await safeResolveReal(input.file, ctx), 'utf8');\n parsed = JSON.parse(raw);\n } catch {\n return { data: null, formatted: '', type: 'unknown', action: 'query', error: 'Could not read/parse file' };\n }\n } else if (input.data) {\n try {\n parsed = JSON.parse(input.data);\n } catch {\n return { data: null, formatted: '', type: 'unknown', action: 'query', error: 'Could not parse data string' };\n }\n } else {\n return { data: null, formatted: '', type: 'unknown', action: 'query', error: 'Provide file or data' };\n }\n\n try {\n const result = jmespathSearch(parsed, input.query);\n const format = input.format ?? 'json';\n return {\n data: parsed,\n formatted: formatOutput(result, format),\n type: result === null ? 'null' : Array.isArray(result) ? 'array' : typeof result,\n action: 'query',\n query_result: result,\n };\n } catch (e) {\n return {\n data: null,\n formatted: '',\n type: 'unknown',\n action: 'query',\n /* v8 ignore next -- defensive String(e) */\n error: `Query failed: ${e instanceof Error ? e.message : String(e)}`,\n };\n }\n}\n\n// ---------------------------------------------------------------------------\n// Action: validate (JSON Schema \u2014 from json-path plugin)\n// ---------------------------------------------------------------------------\n\nasync function executeValidate(input: JsonInput, ctx: Context): Promise<JsonOutput> {\n if (!input.schema) {\n return { data: null, formatted: '', type: 'unknown', action: 'validate', error: 'schema is required for action: validate' };\n }\n\n let parsed: unknown;\n if (input.file) {\n try {\n const raw = await fs.readFile(await safeResolveReal(input.file, ctx), 'utf8');\n parsed = JSON.parse(raw);\n } catch {\n return { data: null, formatted: '', type: 'unknown', action: 'validate', error: 'Could not read/parse file' };\n }\n } else if (input.data) {\n try {\n parsed = JSON.parse(input.data);\n } catch {\n return { data: null, formatted: '', type: 'unknown', action: 'validate', error: 'Could not parse data string' };\n }\n } else {\n return { data: null, formatted: '', type: 'unknown', action: 'validate', error: 'Provide file or data' };\n }\n\n try {\n const { valid, errors } = validateJsonSchema(parsed, input.schema as Record<string, unknown>);\n return {\n data: parsed,\n formatted: valid ? 'valid' : 'invalid',\n type: Array.isArray(parsed) ? 'array' : typeof parsed,\n action: 'validate',\n valid,\n errors,\n };\n } catch (e) {\n return {\n data: null,\n formatted: '',\n type: 'unknown',\n action: 'validate',\n /* v8 ignore next -- defensive String(e) */\n error: `Validation failed: ${e instanceof Error ? e.message : String(e)}`,\n };\n }\n}\n\n// ---------------------------------------------------------------------------\n// Action: transform (chained JMESPath \u2014 from json-path plugin)\n// ---------------------------------------------------------------------------\n\nasync function executeTransform(input: JsonInput, ctx: Context): Promise<JsonOutput> {\n if (!input.transforms || input.transforms.length === 0) {\n return { data: null, formatted: '', type: 'unknown', action: 'transform', error: 'transforms array is required for action: transform' };\n }\n\n let parsed: unknown;\n if (input.file) {\n try {\n const raw = await fs.readFile(await safeResolveReal(input.file, ctx), 'utf8');\n parsed = JSON.parse(raw);\n } catch {\n return { data: null, formatted: '', type: 'unknown', action: 'transform', error: 'Could not read/parse file' };\n }\n } else if (input.data) {\n try {\n parsed = JSON.parse(input.data);\n } catch {\n return { data: null, formatted: '', type: 'unknown', action: 'transform', error: 'Could not parse data string' };\n }\n } else {\n return { data: null, formatted: '', type: 'unknown', action: 'transform', error: 'Provide file or data' };\n }\n\n try {\n let current: unknown = parsed;\n const steps: Array<{ transform: string; result: unknown }> = [];\n\n for (const t of input.transforms) {\n current = jmespathSearch(current, t);\n steps.push({ transform: t, result: current });\n }\n\n const format = input.format ?? 'json';\n return {\n data: parsed,\n formatted: formatOutput(current, format),\n type: current === null ? 'null' : Array.isArray(current) ? 'array' : typeof current,\n action: 'transform',\n result: current,\n steps,\n };\n } catch (e) {\n return {\n data: null,\n formatted: '',\n type: 'unknown',\n action: 'transform',\n /* v8 ignore next -- defensive String(e) */\n error: `Transform failed: ${e instanceof Error ? e.message : String(e)}`,\n };\n }\n}\n\n// ---------------------------------------------------------------------------\n// Action: merge (deep merge \u2014 from json-path plugin)\n// ---------------------------------------------------------------------------\n\nasync function executeMerge(input: JsonInput): Promise<JsonOutput> {\n if (input.base === undefined || input.patch === undefined) {\n return { data: null, formatted: '', type: 'unknown', action: 'merge', error: 'base and patch are required for action: merge' };\n }\n\n const conflictResolution = input.conflictResolution ?? 'prefer-patch';\n\n try {\n const result = deepMergeCore(input.base, input.patch, { conflictResolution });\n const format = input.format ?? 'json';\n return {\n data: result,\n formatted: formatOutput(result, format),\n type: result === null ? 'null' : Array.isArray(result) ? 'array' : typeof result,\n action: 'merge',\n result,\n };\n } catch (e) {\n return {\n data: null,\n formatted: '',\n type: 'unknown',\n action: 'merge',\n /* v8 ignore next -- defensive String(e) */\n error: `Merge failed: ${e instanceof Error ? e.message : String(e)}`,\n };\n }\n}\n\n// ---------------------------------------------------------------------------\n// JMESPath implementation (from json-path plugin)\n// ---------------------------------------------------------------------------\n\nfunction jmespathSearch(data: unknown, query: string): unknown {\n // Handle basic JMESPath expressions\n if (!query || query === '@') return data;\n\n // Root access\n if (query === '$') return data;\n\n // Dot notation: foo.bar\n const dotMatch = query.match(/^([a-zA-Z_][a-zA-Z0-9_]*)(?:\\.(.+))?$/);\n if (dotMatch) {\n const key = dotMatch[1]!;\n const rest = dotMatch[2];\n const val = (data as Record<string, unknown> | undefined)?.[key];\n if (rest === undefined) return val;\n return jmespathSearch(val, rest);\n }\n\n // Array access: [0]\n const arrMatch = query.match(/^\\[(\\d+)\\](?:\\.(.+))?$/);\n if (arrMatch) {\n const idx = Number.parseInt(arrMatch[1]!, 10);\n const rest = arrMatch[2];\n const arr = data as unknown[];\n const val = arr?.[idx];\n if (rest === undefined) return val;\n return jmespathSearch(val, rest);\n }\n\n // Wildcard: [*]\n if (query === '[*]') {\n if (Array.isArray(data)) {\n return data;\n }\n return data;\n }\n\n // Multi-select: foo.bar[*].baz\n const multiMatch = query.match(/^([a-zA-Z_][a-zA-Z0-9_]*)\\[\\*\\](?:\\.(.+))?$/);\n if (multiMatch) {\n const key = multiMatch[1]!;\n const rest = multiMatch[2];\n const arr = (data as Record<string, unknown[]> | undefined)?.[key];\n if (!Array.isArray(arr)) return [];\n if (rest === undefined) return arr;\n return arr.map((item) => jmespathSearch(item, rest));\n }\n\n // Filter: [?foo==`bar`]\n const filterMatch = query.match(/^\\[\\\\?([a-zA-Z_][a-zA-Z0-9_]*)(==|!=|<|>|<=|>=)(`[^`]+`|'[^']*')\\](?:\\.(.+))?$/);\n if (filterMatch) {\n const field = filterMatch[1]!;\n const op = filterMatch[2]!;\n const rawVal = filterMatch[3]!;\n const rest = filterMatch[4];\n const cmpVal = JSON.parse(rawVal.slice(1, -1));\n const arr = data as Record<string, unknown>[];\n if (!Array.isArray(arr)) return [];\n const filtered = arr.filter((item) => {\n const itemVal = (item as Record<string, unknown>)[field];\n switch (op) {\n case '==': return itemVal === cmpVal;\n case '!=': return itemVal !== cmpVal;\n case '>': return Number(itemVal) > Number(cmpVal);\n case '<': return Number(itemVal) < Number(cmpVal);\n case '>=': return Number(itemVal) >= Number(cmpVal);\n case '<=': return Number(itemVal) <= Number(cmpVal);\n /* v8 ignore next -- op is constrained to the six operators by the filter regex; default is unreachable. */\n default: return true;\n }\n });\n if (rest === undefined) return filtered;\n return filtered.map((item) => jmespathSearch(item, rest));\n }\n\n // Function calls: length(@)\n const fnMatch = query.match(/^(length|keys|values|type)\\(@\\)$/);\n if (fnMatch) {\n const fn = fnMatch[1]!;\n switch (fn) {\n case 'length':\n if (Array.isArray(data)) return data.length;\n if (typeof data === 'string') return data.length;\n if (typeof data === 'object' && data !== null) return Object.keys(data as object).length;\n return 0;\n case 'keys':\n if (typeof data === 'object' && data !== null && !Array.isArray(data)) return Object.keys(data as object);\n return [];\n case 'values':\n if (typeof data === 'object' && data !== null && !Array.isArray(data)) return Object.values(data as object);\n return [];\n case 'type':\n if (data === null) return 'null';\n if (Array.isArray(data)) return 'array';\n return typeof data;\n /* v8 ignore next 2 -- fn is constrained to the four names by the function regex; default is unreachable. */\n default:\n return null;\n }\n }\n\n return null;\n}\n\n// ---------------------------------------------------------------------------\n// JSON Schema validator (from json-path plugin)\n// ---------------------------------------------------------------------------\n\nfunction validateJsonSchema(data: unknown, schema: Record<string, unknown>): { valid: boolean; errors: string[] } {\n const errors: string[] = [];\n\n function check(value: unknown, s: Record<string, unknown>, path: string): void {\n if (s['type']) {\n const expectedType = s['type'] as string;\n const actualType = Array.isArray(value) ? 'array' : value === null ? 'null' : typeof value;\n if (expectedType === 'integer') {\n if (!Number.isInteger(value)) errors.push(`${path}: expected integer, got ${actualType}`);\n } else if (expectedType !== actualType) {\n errors.push(`${path}: expected ${expectedType}, got ${actualType}`);\n }\n }\n\n if (typeof value === 'string' && s['format'] === 'uri' && value) {\n try { new URL(value); } catch { errors.push(`${path}: not a valid URI`); }\n }\n\n if (typeof value === 'string' && s['pattern']) {\n const re = new RegExp(s['pattern'] as string);\n if (!re.test(value)) errors.push(`${path}: does not match pattern ${s['pattern']}`);\n }\n\n if (typeof value === 'string' && s['minLength'] !== undefined && value.length < (s['minLength'] as number)) {\n errors.push(`${path}: string too short (min ${s['minLength']})`);\n }\n\n if (typeof value === 'string' && s['maxLength'] !== undefined && value.length > (s['maxLength'] as number)) {\n errors.push(`${path}: string too long (max ${s['maxLength']})`);\n }\n\n if (typeof value === 'number' && s['minimum'] !== undefined && value < (s['minimum'] as number)) {\n errors.push(`${path}: below minimum ${s['minimum']}`);\n }\n\n if (typeof value === 'number' && s['maximum'] !== undefined && value > (s['maximum'] as number)) {\n errors.push(`${path}: above maximum ${s['maximum']}`);\n }\n\n if (Array.isArray(value) && s['items'] && Array.isArray(s['items'])) {\n for (let i = 0; i < value.length; i++) {\n check(value[i], s['items'] as never as Record<string, unknown>, `${path}[${i}]`);\n }\n }\n\n if (typeof value === 'object' && value !== null && !Array.isArray(value) && s['properties']) {\n const props = s['properties'] as Record<string, Record<string, unknown>>;\n for (const [k, propSchema] of Object.entries(props)) {\n check((value as Record<string, unknown>)[k], propSchema, `${path}.${k}`);\n }\n }\n }\n\n check(data, schema, '$');\n return { valid: errors.length === 0, errors };\n}\n\n// ---------------------------------------------------------------------------\n// Simple path-based query (original json tool query, backward compat)\n// ---------------------------------------------------------------------------\n\nfunction simpleQuery(data: unknown, path: string): unknown {\n const parts = path\n .replace(/\\[(\\d+)\\]/g, '.$1')\n .split('.')\n .filter(Boolean);\n let current: unknown = data;\n\n for (const part of parts) {\n if (current === null || current === undefined) return undefined;\n\n const idx = Number(part);\n if (!Number.isNaN(idx) && Array.isArray(current)) {\n current = current[idx];\n } else if (typeof current === 'object' && current !== null) {\n current = (current as Record<string, unknown>)[part];\n } else {\n return undefined;\n }\n }\n\n return current;\n}\n\n// ---------------------------------------------------------------------------\n// Output formatting (original json tool helpers)\n// ---------------------------------------------------------------------------\n\nfunction formatOutput(data: unknown, format: string): string {\n if (format === 'json5') {\n return JSON.stringify(data, null, 2)\n .replace(/,\\s*}/g, '}')\n .replace(/,\\s*\\]/g, ']');\n }\n if (format === 'yaml') {\n return toYaml(data);\n }\n return JSON.stringify(data, null, 2);\n}\n\nfunction toYaml(data: unknown, indent = 0): string {\n if (data === null) return 'null\\n';\n /* v8 ignore next -- parsed JSON never contains `undefined`; defensive for recursive calls. */\n if (data === undefined) return '';\n if (typeof data === 'boolean') return String(data) + '\\n';\n if (typeof data === 'number') return String(data) + '\\n';\n if (typeof data === 'string') {\n if (data.includes('\\n') || data.includes(':') || data.includes('#')) {\n return `\"${data.replace(/\\\\/g, '\\\\\\\\').replace(/\"/g, '\\\\\"')}\"\\n`;\n }\n return data + '\\n';\n }\n if (Array.isArray(data)) {\n if (data.length === 0) return '[]\\n';\n const prefix = ' '.repeat(indent);\n return data.map((item) => `${prefix}- ${toYaml(item, indent + 1).trimStart()}`).join('');\n }\n if (typeof data === 'object') {\n const prefix = ' '.repeat(indent);\n const entries = Object.entries(data as Record<string, unknown>);\n return entries.map(([k, v]) => `${prefix}${k}: ${toYaml(v, indent + 1)}`).join('');\n }\n /* v8 ignore next -- JSON.parse only yields null/bool/number/string/array/object; this fallback is defensive. */\n return String(data) + '\\n';\n}\n", "import { createHash } from 'node:crypto';\nimport * as fsp from 'node:fs/promises';\nimport * as path from 'node:path';\nimport * as Core from '@wrongstack/core/utils';\nimport type { Context } from '@wrongstack/core/agent';\n\n/**\n * sha-256 hex of a UTF-8 string. Used by the file tools to record a content\n * hash alongside the mtime in `ctx.recordRead` \u2014 the hash is the authoritative\n * staleness arbiter for `edit` (mtime has a 2 s tolerance window on Windows).\n */\nexport function sha256hex(content: string): string {\n return createHash('sha256').update(content, 'utf8').digest('hex');\n}\n/** Detected package manager for a project directory. */\nexport type PackageManager = 'pnpm' | 'yarn' | 'npm';\n\n/**\n * Detect the project's package manager by inspecting lockfiles in `cwd`.\n * Order: pnpm \u2192 yarn \u2192 npm (default). Missing or unreadable directories fall\n * back to `npm` rather than throwing, so a `safeResolve`-checked cwd that\n * happens to be empty never aborts the tool.\n */\nexport async function detectPackageManager(cwd: string): Promise<PackageManager> {\n const { stat } = await import('node:fs/promises');\n try {\n await stat(`${cwd}/pnpm-lock.yaml`);\n return 'pnpm';\n } catch {\n /* not pnpm */\n }\n try {\n await stat(`${cwd}/yarn.lock`);\n return 'yarn';\n } catch {\n /* not yarn */\n }\n return 'npm';\n}\n\nexport function resolvePath(input: string, ctx: Context): string {\n return path.isAbsolute(input) ? path.normalize(input) : path.resolve(ctx.workingDir ?? ctx.cwd, input);\n}\n\n/**\n * Roots every file tool may always reach, even in restricted mode: the\n * project root and the user-global `~/.wrongstack` directory (config, memory,\n * sessions, skills). `~/.wrongstack` honors the `WRONGSTACK_HOME` override.\n */\nfunction allowedRoots(ctx: Context): string[] {\n return [path.resolve(ctx.projectRoot), path.resolve(Core.wstackGlobalRoot())];\n}\n\n/** True if `target` is `root` itself or nested inside any of `roots`. */\nfunction isInsideAny(target: string, roots: string[]): boolean {\n return roots.some((root) => {\n const rel = path.relative(root, target);\n return rel === '' || (!rel.startsWith('..') && !path.isAbsolute(rel));\n });\n}\n\nexport function ensureInsideRoot(absPath: string, ctx: Context): string {\n const target = path.resolve(absPath);\n // Unrestricted filesystem access: skip the project-root containment check.\n if (ctx.allowOutsideProjectRoot) return target;\n if (isInsideAny(target, allowedRoots(ctx))) return target;\n throw new Error(`Path \"${absPath}\" is outside project root \"${path.resolve(ctx.projectRoot)}\"`);\n}\n\nexport function safeResolve(input: string, ctx: Context): string {\n return ensureInsideRoot(resolvePath(input, ctx), ctx);\n}\n\n/**\n * Defense against in-root\u2192out-of-root symlink escape (CWE-59). `safeResolve`\n * only does a syntactic `../` check, so a symlink that lives *inside* the\n * project root but points outside still passes it. This resolves the path\n * through `fs.realpath` and re-verifies containment against the realpath of\n * the project root (comparing like-for-like, since the root itself may be a\n * symlink \u2014 macOS `/var`\u2192`/private/var`, Windows 8.3 short names). For a path\n * that does not exist yet (e.g. a `write` to a new file) the nearest existing\n * ancestor directory is checked instead. Throws if the real target escapes.\n *\n * Mirrors the per-file guard already used in `replace.ts`/`grep.ts`; applied\n * to single-file `read`/`edit`/`write` it throws (rather than skips) because\n * the caller named exactly one file.\n */\nexport async function assertRealInsideRoot(absPath: string, ctx: Context): Promise<void> {\n // Unrestricted filesystem access: no symlink-escape check to perform.\n if (ctx.allowOutsideProjectRoot) return;\n // Compare like-for-like against the realpath of each always-allowed root\n // (project root + ~/.wrongstack), since a root may itself be a symlink.\n const realRoots = await Promise.all(\n allowedRoots(ctx).map((r) => fsp.realpath(r).catch(() => path.resolve(r))),\n );\n let probe = absPath;\n for (;;) {\n let real: string;\n try {\n real = await fsp.realpath(probe);\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code === 'ENOENT') {\n const parent = path.dirname(probe);\n if (parent === probe) return; // reached fs root without escaping\n probe = parent;\n continue;\n }\n throw err;\n }\n if (isInsideAny(real, realRoots)) return;\n throw new Error(\n `Path \"${absPath}\" resolves through a symlink outside project root \"${realRoots[0]}\"`,\n );\n }\n}\n\n/** `safeResolve` + symlink realpath containment check. Async. */\nexport async function safeResolveReal(input: string, ctx: Context): Promise<string> {\n const abs = safeResolve(input, ctx);\n await assertRealInsideRoot(abs, ctx);\n return abs;\n}\n\nexport function truncateMiddle(s: string, max: number): string {\n if (Buffer.byteLength(s, 'utf8') <= max) return s;\n const half = Math.floor(max / 2);\n return (\n s.slice(0, half) +\n `\\n\u2026[truncated ${Buffer.byteLength(s, 'utf8') - max} bytes from middle]\u2026\\n` +\n s.slice(-half)\n );\n}\n\nexport function isBinaryBuffer(buf: Buffer): boolean {\n const len = Math.min(buf.length, 8192);\n for (let i = 0; i < len; i++) {\n if (buf[i] === 0) return true;\n }\n return false;\n}\n\n// \u2500\u2500\u2500 Command-output normalization (token-saving) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n//\n// Raw process output is full of tokens the model gains nothing from: ANSI\n// escapes, carriage-return progress spam, runs of identical warning lines, and\n// huge tails of build noise. These helpers strip that noise before the output\n// reaches the LLM. They are scoped to COMMAND tools (bash/git/exec and the\n// _spawn-stream consumers) \u2014 never applied to structured/code outputs.\n\n/** Unified byte cap for all command tool output fed to the model. */\nexport const COMMAND_OUTPUT_MAX_BYTES = 32_768;\n\n/** Runs of >= this many identical consecutive lines are collapsed. */\nconst REPEAT_RUN_THRESHOLD = 3;\n\n/**\n * Collapse carriage-return overwrites the way a terminal would: `\\r\\n` becomes\n * `\\n`, and a bare `\\r` (progress redraw) keeps only the text after the LAST\n * `\\r` on its physical line. Without this, a single progress bar that redraws\n * 200 times explodes into 200 lines.\n */\nexport function collapseCarriageReturns(text: string): string {\n const lf = text.replace(/\\r\\n/g, '\\n');\n if (!lf.includes('\\r')) return lf;\n return lf\n .split('\\n')\n .map((line) => (line.includes('\\r') ? line.slice(line.lastIndexOf('\\r') + 1) : line))\n .join('\\n');\n}\n\n/**\n * Collapse a run of `minRun`+ identical consecutive lines into the line once\n * plus a marker. Consecutive-only \u2014 it never reorders or dedups non-adjacent\n * lines, so diffs/source stay intact.\n */\nexport function collapseConsecutiveDuplicates(text: string, minRun = REPEAT_RUN_THRESHOLD): string {\n const lines = text.split('\\n');\n const out: string[] = [];\n let i = 0;\n while (i < lines.length) {\n let j = i + 1;\n while (j < lines.length && lines[j] === lines[i]) j++;\n const run = j - i;\n if (run >= minRun) {\n out.push(lines[i]!, `\u2026 \u27E8repeated ${run}\u00D7\u27E9`);\n } else {\n for (let k = i; k < j; k++) out.push(lines[k]!);\n }\n i = j;\n }\n return out.join('\\n');\n}\n\n/** Largest prefix of `s` whose UTF-8 byte length is <= `maxBytes`. */\nfunction takeHeadBytes(s: string, maxBytes: number): string {\n if (maxBytes <= 0) return '';\n /* v8 ignore next -- only caller (truncateHeadTail) passes a budget smaller than s; defensive. */\n if (Buffer.byteLength(s, 'utf8') <= maxBytes) return s;\n let lo = 0;\n let hi = s.length;\n while (lo < hi) {\n const mid = Math.ceil((lo + hi) / 2);\n if (Buffer.byteLength(s.slice(0, mid), 'utf8') <= maxBytes) lo = mid;\n else hi = mid - 1;\n }\n return s.slice(0, lo);\n}\n\n/** Largest suffix of `s` whose UTF-8 byte length is <= `maxBytes`. */\nfunction takeTailBytes(s: string, maxBytes: number): string {\n if (maxBytes <= 0) return '';\n /* v8 ignore next -- only caller (truncateHeadTail) passes a budget smaller than s; defensive. */\n if (Buffer.byteLength(s, 'utf8') <= maxBytes) return s;\n let lo = 0;\n let hi = s.length;\n while (lo < hi) {\n const mid = Math.ceil((lo + hi) / 2);\n if (Buffer.byteLength(s.slice(s.length - mid), 'utf8') <= maxBytes) lo = mid;\n else hi = mid - 1;\n }\n return s.slice(s.length - lo);\n}\n\n/**\n * Truncate to `maxBytes` keeping BOTH ends \u2014 the head (what ran / early context)\n * and the tail (errors and summaries usually land last), biased ~45/55 toward\n * the tail. The result never exceeds `maxBytes`.\n */\nexport function truncateHeadTail(s: string, maxBytes: number): string {\n const total = Buffer.byteLength(s, 'utf8');\n if (total <= maxBytes) return s;\n // Reserve a fixed allowance for the marker so the final string can't exceed\n // the cap even though the dropped-byte count's digit width varies.\n const MARKER_RESERVE = 64;\n const avail = Math.max(0, maxBytes - MARKER_RESERVE);\n const headBudget = Math.floor(avail * 0.45);\n const head = takeHeadBytes(s, headBudget);\n const tail = takeTailBytes(s, avail - Buffer.byteLength(head, 'utf8'));\n const kept = Buffer.byteLength(head, 'utf8') + Buffer.byteLength(tail, 'utf8');\n return `${head}\\n\u2026[truncated ${total - kept} bytes]\u2026\\n${tail}`;\n}\n\n/**\n * Full token-saving pipeline for command tool output: strip ANSI \u2192 collapse\n * carriage-return progress \u2192 trim trailing whitespace \u2192 collapse identical\n * consecutive lines \u2192 squeeze blank-line runs \u2192 head+tail truncate to the cap.\n */\nexport function normalizeCommandOutput(\n raw: string,\n opts: { maxBytes?: number | undefined } = {},\n): string {\n if (!raw) return raw;\n let text = Core.stripAnsi(raw);\n text = collapseCarriageReturns(text);\n text = text.replace(/[ \\t]+$/gm, ''); // trailing whitespace per line\n text = collapseConsecutiveDuplicates(text);\n text = text.replace(/\\n{3,}/g, '\\n\\n'); // >=2 blank lines \u2192 1\n return truncateHeadTail(text, opts.maxBytes ?? COMMAND_OUTPUT_MAX_BYTES);\n}\n"],
5
- "mappings": "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",
6
- "names": ["formatted", "path"]
7
- }
@@ -1 +0,0 @@
1
- {"version":3,"file":"kanban-board-inputs.d.ts","sourceRoot":"","sources":["../src/kanban-board-inputs.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAE9D,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,eAAe,EAAE,KAAK,EAAE,MAAM;;;;;;QAS1D,IAAI;QACJ,aAAa;;;QAKG,WAAW;;EAGtC;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,eAAe;;;;;QAQ3C,IAAI;QACJ,aAAa;;;QAKG,WAAW;;EAGtC;AAED,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,eAAe;;;;;;EAU3D"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"kanban-decomposition-actions.d.ts","sourceRoot":"","sources":["../src/kanban-decomposition-actions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AAUtD,OAAO,KAAK,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAEhF,wBAAsB,+BAA+B,CACnD,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,eAAe,EACtB,GAAG,EAAE,OAAO,GACX,OAAO,CAAC,gBAAgB,GAAG,SAAS,CAAC,CA0FvC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"kanban-detail-actions.d.ts","sourceRoot":"","sources":["../src/kanban-detail-actions.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAEhF,wBAAsB,wBAAwB,CAC5C,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,eAAe,GACrB,OAAO,CAAC,gBAAgB,GAAG,SAAS,CAAC,CAuGvC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"kanban-evidence-bridge.d.ts","sourceRoot":"","sources":["../src/kanban-evidence-bridge.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AAEtD,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,oBAAoB,CAAC;AAEnE,iFAAiF;AACjF,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAEzE;AAED,2DAA2D;AAC3D,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAE7E;AAED,wBAAgB,gCAAgC,CAC9C,GAAG,EAAE,OAAO,EACZ,MAAM,EAAE,wBAAwB,GAC/B,IAAI,CAcN"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"kanban-presence.d.ts","sourceRoot":"","sources":["../src/kanban-presence.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAEhF,MAAM,WAAW,qBAAqB;IACpC,OAAO,CAAC,EAAE;QAAE,EAAE,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;KAAE,GAAG,SAAS,CAAC;IAClD,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC7B,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAChC;AAED,wBAAgB,2BAA2B,CACzC,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,eAAe,EACtB,GAAG,EAAE,qBAAqB,YAEJ,gBAAgB,KAAG,OAAO,CAAC,gBAAgB,CAAC,CAgBnE"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"kanban-split-task-handler.d.ts","sourceRoot":"","sources":["../src/kanban-split-task-handler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAc,MAAM,oBAAoB,CAAC;AAGlE,OAAO,KAAK,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAEhF,qEAAqE;AACrE,wBAAsB,eAAe,CACnC,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,eAAe,EACtB,iBAAiB,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GACzC,OAAO,CAAC,gBAAgB,CAAC,CA8C3B;AAED,wBAAsB,YAAY,CAChC,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,MAAM,GAAG,SAAS,GAC1B,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CAE7B"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"kanban-task-inputs.d.ts","sourceRoot":"","sources":["../src/kanban-task-inputs.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,qBAAqB,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AACvF,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAE9D,wBAAgB,SAAS,CAAC,KAAK,EAAE,eAAe;;;;;;;;;;;;;;;;;;;;;;cA+B5B,QAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAuD3B;AAED,iFAAiF;AACjF,wBAAgB,eAAe,CAAC,KAAK,EAAE,eAAe,GAAG,MAAM,EAAE,GAAG,SAAS,CAM5E;AAED,wBAAgB,SAAS,CAAC,KAAK,EAAE,eAAe;;;;;;;;;;;;;;EAgB/C;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,eAAe,GAAG,qBAAqB,CAsB7E"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"kanban-tool-results.d.ts","sourceRoot":"","sources":["../src/kanban-tool-results.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,WAAW,EACX,+BAA+B,EAC/B,UAAU,EACX,MAAM,oBAAoB,CAAC;AAC5B,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAE/D,8EAA8E;AAC9E,wBAAgB,cAAc,CAAC,IAAI,EAAE,UAAU,GAAG,MAAM,CAOvD;AAED;;;;GAIG;AACH,wBAAgB,sBAAsB,IAAI,+BAA+B,GAAG,SAAS,CAGpF;AAED,wBAAgB,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,gBAAgB,CAEtD;AAED,wBAAgB,OAAO,CAAC,KAAK,EAAE,WAAW,EAAE,OAAO,SAAkB,GAAG,gBAAgB,CAEvF;AAED,wBAAgB,MAAM,CAAC,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,GAAG,gBAAgB,CAE9F"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"kanban-tool-schema.d.ts","sourceRoot":"","sources":["../src/kanban-tool-schema.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAEzD,eAAO,MAAM,uBAAuB,knBACyjB,CAAC;AAE9lB,eAAO,MAAM,sBAAsB,osBACgqB,CAAC;AAEpsB,eAAO,MAAM,mBAAmB,EAAE,UAoNjC,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"kanban-tool-types.d.ts","sourceRoot":"","sources":["../src/kanban-tool-types.ts"],"names":[],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"kanban.d.ts","sourceRoot":"","sources":["../src/kanban.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAyB,IAAI,EAAE,MAAM,wBAAwB,CAAC;AAkE1E,OAAO,KAAK,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAKhF,eAAO,MAAM,UAAU,EAAE,IAAI,CAAC,eAAe,EAAE,gBAAgB,CAm2B9D,CAAC"}
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../src/kanban.ts", "../src/kanban-evidence-bridge.ts", "../src/kanban-decomposition-actions.ts", "../src/kanban-tool-results.ts", "../src/kanban-detail-actions.ts", "../src/kanban-split-task-handler.ts", "../src/kanban-board-inputs.ts", "../src/kanban-task-inputs.ts", "../src/kanban-tool-schema.ts", "../src/kanban-presence.ts", "../src/session-kanban.ts"],
4
- "sourcesContent": ["// Kanban data model + manager moved from @wrongstack/core to the standalone\n// @wrongstack/kanban package; only the Tool contract and the task-graph\n// serialization types still come from core.\nimport { deserializeTaskGraph, serializeTaskGraph } from '@wrongstack/core/tasking';\nimport type { SerializableTaskGraph, Tool } from '@wrongstack/core/types';\nimport { loadTasks } from '@wrongstack/core/storage';\nimport {\n addColumn,\n addTask,\n adoptManagedLifecycle,\n assignTask,\n claimReadyTask,\n copyTaskToBoard,\n createBoard,\n createBoardFromTaskGraph,\n duplicateBoard,\n exportBoardAsMarkdown,\n exportBoardToTaskGraph,\n createBoardFromText,\n getBoard,\n getKanbanOrchestrationSnapshot,\n getKanbanQueueHealth,\n getTask,\n getTaskChain,\n heartbeatTaskAssignment,\n listBoards,\n listKanbanEvents,\n listReadyTasks,\n mergeTasks,\n moveTask,\n parseLinesIntoTasks,\n recoverStaleTaskAssignments,\n repairManagedTaskProjection,\n releaseTaskClaim,\n removeBoard,\n removeColumn,\n removeTask,\n searchKanban,\n setTaskChain,\n syncBoardFromTaskGraph,\n transitionTask,\n transferTaskToBoard,\n updateBoard,\n updateColumn,\n updateTask,\n updateTaskAssignment,\n verifyTaskCompletion,\n finalizeTaskCompletion,\n} from '@wrongstack/kanban';\nimport { recordKanbanVerificationEvidence } from './kanban-evidence-bridge.js';\nimport { handleKanbanDecompositionAction } from './kanban-decomposition-actions.js';\nimport { handleKanbanDetailAction } from './kanban-detail-actions.js';\nimport {\n boardCreateInput,\n boardUpdatePatch,\n duplicateBoardOptions,\n} from './kanban-board-inputs.js';\nimport {\n atomicityNudge,\n fail,\n okBoard,\n okTask,\n readEnvGateEnforcement,\n} from './kanban-tool-results.js';\nimport { assignmentInput, taskInput, taskPatch } from './kanban-task-inputs.js';\nimport {\n KANBAN_INPUT_SCHEMA,\n KANBAN_TOOL_DESCRIPTION,\n KANBAN_TOOL_USAGE_HINT,\n} from './kanban-tool-schema.js';\nimport type { KanbanToolInput, KanbanToolOutput } from './kanban-tool-types.js';\nimport { handleSplitTask, requireBoard } from './kanban-split-task-handler.js';\nimport { createKanbanPresenceWrapper } from './kanban-presence.js';\nimport { taskFileToSerializedGraph } from './session-kanban.js';\n\nexport const kanbanTool: Tool<KanbanToolInput, KanbanToolOutput> = {\n name: 'kanban',\n category: 'Project',\n description: KANBAN_TOOL_DESCRIPTION,\n usageHint: KANBAN_TOOL_USAGE_HINT,\n permission: 'confirm',\n mutating: true,\n capabilities: ['fs.write'],\n icon: 'task',\n timeoutMs: 30_000,\n inputSchema: KANBAN_INPUT_SCHEMA,\n async execute(input, ctx) {\n const projectRoot = ctx.projectRoot;\n if (!projectRoot) return fail('No project root is available.');\n\n const withPresence = createKanbanPresenceWrapper(projectRoot, input, ctx);\n\n try {\n const result = await (async (): Promise<KanbanToolOutput> => {\n const decompositionResult = await handleKanbanDecompositionAction(projectRoot, input, ctx);\n if (decompositionResult !== undefined) return decompositionResult;\n switch (input.action) {\n case 'list_boards': {\n const boards = await listBoards(projectRoot);\n return { ok: true, message: `${boards.length} board(s).`, boards };\n }\n case 'get_board': {\n const board = await requireBoard(projectRoot, input.boardId);\n return board ? okBoard(board) : fail('Board not found.');\n }\n case 'create_board': {\n if (!input.title) return fail('create_board requires title.');\n const board = await createBoard(projectRoot, boardCreateInput(input, input.title));\n return { ok: true, message: `Board created: ${board.title}`, board };\n }\n case 'update_board': {\n if (!input.boardId) return fail('update_board requires boardId.');\n const board = await updateBoard(projectRoot, input.boardId, boardUpdatePatch(input));\n return board ? okBoard(board, 'Board updated.') : fail('Board not found.');\n }\n case 'adopt_managed_lifecycle': {\n if (!input.boardId || !input.author || !input.transitionComment) {\n return fail(\n 'adopt_managed_lifecycle requires boardId, author, transitionComment, and five ordered columns.',\n );\n }\n if (input.columns?.length !== 5) {\n return fail(\n 'adopt_managed_lifecycle columns must be ordered as backlog, todo, running, review, done.',\n );\n }\n const [backlog, todo, running, review, done] = input.columns;\n if (!backlog || !todo || !running || !review || !done) {\n return fail('adopt_managed_lifecycle columns must contain five nonblank ids.');\n }\n const board = await adoptManagedLifecycle(projectRoot, input.boardId, {\n columns: { backlog, todo, running, review, done },\n actor: input.author,\n comment: input.transitionComment,\n });\n return board\n ? okBoard(board, 'Managed lifecycle adopted without moving existing cards.')\n : fail('Board not found.');\n }\n case 'duplicate_board': {\n if (!input.boardId) return fail('duplicate_board requires boardId.');\n const board = await duplicateBoard(projectRoot, input.boardId, duplicateBoardOptions(input));\n return board ? okBoard(board, 'Board duplicated.') : fail('Board not found.');\n }\n case 'delete_board': {\n if (!input.boardId) return fail('delete_board requires boardId.');\n const removed = await removeBoard(projectRoot, input.boardId);\n return { ok: removed, message: removed ? 'Board deleted.' : 'Board not found.' };\n }\n case 'generate_board': {\n if (!input.description) return fail('generate_board requires description.');\n const boardInput = createBoardFromText({\n description: input.description,\n ...(input.title !== undefined ? { title: input.title } : {}),\n ...(input.context !== undefined ? { context: input.context } : {}),\n ...(input.columns !== undefined ? { columns: input.columns } : {}),\n });\n const board = await createBoard(projectRoot, boardInput);\n for (const taskInput of parseLinesIntoTasks(\n input.description,\n board.columns[0]?.id ?? 'backlog',\n )) {\n await addTask(projectRoot, board.id, taskInput);\n }\n return okBoard((await getBoard(projectRoot, board.id)) ?? board, 'Board generated.');\n }\n case 'export_markdown': {\n const board = await requireBoard(projectRoot, input.boardId);\n if (!board) return fail('Board not found.');\n return {\n ok: true,\n message: 'Board exported.',\n board,\n markdown: exportBoardAsMarkdown(board),\n };\n }\n case 'export_task_graph': {\n if (!input.boardId) return fail('export_task_graph requires boardId.');\n const exported = await exportBoardToTaskGraph(projectRoot, input.boardId, {\n ...(input.graphId !== undefined ? { graphId: input.graphId } : {}),\n ...(input.specId !== undefined ? { specId: input.specId } : {}),\n ...(input.title !== undefined ? { title: input.title } : {}),\n ...(input.preserveOriginTaskIds !== undefined\n ? { preserveOriginTaskIds: input.preserveOriginTaskIds }\n : {}),\n ...(input.includeArchived !== undefined\n ? { includeArchived: input.includeArchived }\n : {}),\n });\n if (!exported) return fail('Board not found.');\n return {\n ok: true,\n message: `Task graph exported with ${exported.graph.nodes.size} node(s).`,\n board: exported.board,\n taskGraph: serializeTaskGraph(exported.graph),\n };\n }\n case 'sync_task_graph': {\n if (!input.boardId || !input.taskGraph) {\n return fail('sync_task_graph requires boardId and taskGraph.');\n }\n const graph = deserializeTaskGraph(input.taskGraph as SerializableTaskGraph);\n const result = await syncBoardFromTaskGraph(projectRoot, input.boardId, graph, {\n ...(input.title !== undefined ? { title: input.title } : {}),\n ...(input.description !== undefined ? { description: input.description } : {}),\n ...(input.tags !== undefined ? { tags: input.tags } : {}),\n ...(input.generatedBy !== undefined ? { generatedBy: input.generatedBy } : {}),\n ...(input.sourceSystem !== undefined ? { sourceSystem: input.sourceSystem } : {}),\n ...(input.phaseId !== undefined ? { phaseId: input.phaseId } : {}),\n ...(input.includeCompletedTasks !== undefined\n ? { includeCompletedTasks: input.includeCompletedTasks }\n : {}),\n ...(input.archiveMissingTasks !== undefined\n ? { archiveMissingTasks: input.archiveMissingTasks }\n : {}),\n ...(input.preserveManualDependencies !== undefined\n ? { preserveManualDependencies: input.preserveManualDependencies }\n : {}),\n });\n return result\n ? {\n ok: true,\n message: `Task graph synced: ${result.createdTaskIds.length} created, ${result.updatedTaskIds.length} updated, ${result.archivedTaskIds.length} archived.`,\n board: result.board,\n }\n : fail('Board not found.');\n }\n case 'create_from_graph': {\n if (!input.taskGraph) return fail('create_from_graph requires taskGraph.');\n const graph = deserializeTaskGraph(input.taskGraph as SerializableTaskGraph);\n const { board } = await createBoardFromTaskGraph(projectRoot, graph, {\n ...(input.title !== undefined ? { title: input.title } : {}),\n ...(input.description !== undefined ? { description: input.description } : {}),\n ...(input.tags !== undefined ? { tags: input.tags } : {}),\n ...(input.generatedBy !== undefined ? { generatedBy: input.generatedBy } : {}),\n ...(input.sourceSystem !== undefined ? { sourceSystem: input.sourceSystem } : {}),\n ...(input.phaseId !== undefined ? { phaseId: input.phaseId } : {}),\n ...(input.includeCompletedTasks !== undefined\n ? { includeCompletedTasks: input.includeCompletedTasks }\n : {}),\n });\n return {\n ok: true,\n message: `Created board \"${board.title}\" from task graph with ${board.tasks.length} tasks.`,\n board,\n };\n }\n case 'import_session_tasks': {\n // One-way projection: mirror this session's `.tasks.json` (the `task`\n // tool's list) into a kanban board so session work shows up on a board\n // without swapping the task tool's storage. Origin-keyed + re-runnable.\n const taskPath = (ctx.meta as Record<string, unknown>)?.['task.path'] as\n | string\n | undefined;\n if (!taskPath) return fail('No session task file for this session.');\n const file = await loadTasks(taskPath);\n if (!file || file.tasks.length === 0) return fail('No session tasks to import.');\n const sessionId = ctx.session?.id ?? file.sessionId ?? 'session';\n const graph = deserializeTaskGraph(taskFileToSerializedGraph(file.tasks, sessionId));\n const tags = ['session', `session:${sessionId}`];\n const existing = (await listBoards(projectRoot)).find((b) =>\n b.tags?.includes(`session:${sessionId}`),\n );\n if (existing) {\n const result = await syncBoardFromTaskGraph(projectRoot, existing.id, graph, {\n sourceSystem: 'session',\n tags,\n archiveMissingTasks: true,\n includeCompletedTasks: true,\n });\n return result\n ? {\n ok: true,\n message: `Synced ${file.tasks.length} session tasks into board \"${result.board.title}\".`,\n board: result.board,\n }\n : fail('Session board vanished mid-sync.');\n }\n const { board } = await createBoardFromTaskGraph(projectRoot, graph, {\n title: `Session tasks (${sessionId.slice(0, 8)})`,\n sourceSystem: 'session',\n tags,\n });\n return {\n ok: true,\n message: `Imported ${file.tasks.length} session tasks into new board \"${board.title}\".`,\n board,\n };\n }\n case 'search_tasks': {\n const tasks = await searchKanban(projectRoot, {\n query: input.query,\n boardId: input.boardId,\n assignedAgent: input.agentId,\n status: input.status,\n priority: input.priority,\n label: input.labels?.[0],\n chainId: input.chainId,\n });\n return { ok: true, message: `${tasks.length} task(s) matched.`, tasks };\n }\n case 'ready_tasks': {\n const tasks = await listReadyTasks(projectRoot, {\n query: input.query,\n boardId: input.boardId,\n assignedAgent: input.agentId,\n priority: input.priority,\n label: input.labels?.[0],\n chainId: input.chainId,\n limit: input.limit,\n });\n return { ok: true, message: `${tasks.length} ready task(s).`, tasks };\n }\n case 'snapshot': {\n const snapshot = await getKanbanOrchestrationSnapshot(projectRoot, {\n query: input.query,\n boardId: input.boardId,\n assignedAgent: input.agentId,\n status: input.status,\n priority: input.priority,\n label: input.labels?.[0],\n chainId: input.chainId,\n });\n return {\n ok: true,\n message: `${snapshot.ready.length} ready, ${snapshot.running.length} running, ${snapshot.blocked.length} blocked.`,\n snapshot,\n };\n }\n case 'add_column': {\n if (!input.boardId || !input.title) return fail('add_column requires boardId and title.');\n const result = await addColumn(projectRoot, input.boardId, {\n title: input.title,\n ...(input.description !== undefined ? { description: input.description } : {}),\n });\n return result ? okBoard(result.board, 'Column added.') : fail('Board not found.');\n }\n case 'update_column': {\n if (!input.boardId || !input.columnId)\n return fail('update_column requires boardId and columnId.');\n const board = await updateColumn(projectRoot, input.boardId, input.columnId, {\n ...(input.title !== undefined ? { title: input.title } : {}),\n ...(input.description !== undefined ? { description: input.description } : {}),\n ...(input.order !== undefined ? { order: input.order } : {}),\n });\n return board ? okBoard(board, 'Column updated.') : fail('Column not found.');\n }\n case 'delete_column': {\n if (!input.boardId || !input.columnId)\n return fail('delete_column requires boardId and columnId.');\n const board = await removeColumn(projectRoot, input.boardId, input.columnId, {\n moveTasksToColumnId: input.moveTasksToColumnId,\n });\n return board ? okBoard(board, 'Column deleted.') : fail('Column not found.');\n }\n case 'add_task': {\n if (!input.boardId || !input.title) return fail('add_task requires boardId and title.');\n const result = await addTask(projectRoot, input.boardId, taskInput(input));\n if (!result) return fail('Board not found.');\n return okTask(\n result.board,\n result.task,\n `Task added.${atomicityNudge(result.task)}`,\n );\n }\n case 'split_task': {\n if (!input.boardId || !input.taskId || !input.childTitles?.length) {\n return fail('split_task requires boardId, taskId, and childTitles.');\n }\n return handleSplitTask(projectRoot, input, {});\n }\n case 'merge_tasks': {\n if (!input.boardId || !input.taskIds?.length || !input.title) {\n return fail('merge_tasks requires boardId, taskIds, and title.');\n }\n const result = await mergeTasks(projectRoot, input.boardId, {\n taskIds: input.taskIds,\n title: input.title,\n ...(input.description !== undefined ? { description: input.description } : {}),\n ...(input.targetColumnId !== undefined ? { targetColumnId: input.targetColumnId } : {}),\n ...(input.preserveAssignment !== undefined\n ? { preserveAssignment: input.preserveAssignment }\n : {}),\n ...(input.closeSourceTasks !== undefined\n ? { closeSourceTasks: input.closeSourceTasks }\n : {}),\n });\n return result\n ? okTask(result.board, result.task, 'Tasks merged.')\n : fail('Board or task not found.');\n }\n case 'copy_task': {\n if (!input.boardId || !input.taskId || !input.targetBoardId) {\n return fail('copy_task requires boardId, taskId, and targetBoardId.');\n }\n const result = await copyTaskToBoard(\n projectRoot,\n input.boardId,\n input.taskId,\n input.targetBoardId,\n {\n ...(input.targetColumnId !== undefined\n ? { targetColumnId: input.targetColumnId }\n : {}),\n ...(input.order !== undefined ? { targetOrder: input.order } : {}),\n ...(input.preserveAssignment !== undefined\n ? { preserveAssignment: input.preserveAssignment }\n : {}),\n ...(input.preserveDependencies !== undefined\n ? { preserveDependencies: input.preserveDependencies }\n : {}),\n },\n );\n return result\n ? okTask(result.targetBoard, result.task, 'Task copied to target board.')\n : fail('Board or task not found.');\n }\n case 'transfer_task': {\n if (!input.boardId || !input.taskId || !input.targetBoardId) {\n return fail('transfer_task requires boardId, taskId, and targetBoardId.');\n }\n const result = await transferTaskToBoard(\n projectRoot,\n input.boardId,\n input.taskId,\n input.targetBoardId,\n {\n ...(input.targetColumnId !== undefined\n ? { targetColumnId: input.targetColumnId }\n : {}),\n ...(input.order !== undefined ? { targetOrder: input.order } : {}),\n ...(input.preserveAssignment !== undefined\n ? { preserveAssignment: input.preserveAssignment }\n : {}),\n ...(input.preserveDependencies !== undefined\n ? { preserveDependencies: input.preserveDependencies }\n : {}),\n },\n );\n return result\n ? okTask(result.targetBoard, result.task, 'Task transferred to target board.')\n : fail('Board or task not found.');\n }\n case 'get_task': {\n if (!input.boardId || !input.taskId) return fail('get_task requires boardId and taskId.');\n const task = await getTask(projectRoot, input.boardId, input.taskId);\n return task ? { ok: true, message: 'Task loaded.', task } : fail('Task not found.');\n }\n case 'update_task': {\n if (!input.boardId || !input.taskId)\n return fail('update_task requires boardId and taskId.');\n const board = await updateTask(\n projectRoot,\n input.boardId,\n input.taskId,\n taskPatch(input),\n );\n return board ? okBoard(board, 'Task updated.') : fail('Task not found.');\n }\n case 'transition_task': {\n if (\n !input.boardId ||\n !input.taskId ||\n !input.lifecycleStage ||\n !input.author ||\n !input.transitionComment\n ) {\n return fail(\n 'transition_task requires boardId, taskId, lifecycleStage, author, and transitionComment.',\n );\n }\n // Pre-gate for Done: transitionTask's validateDoneEvidence trusts a\n // persisted verificationReport but never runs the verifier itself.\n // When the target is done and the task lacks a report, run the\n // verifier and persist report + refreshed criteria first so the\n // transition is judged on fresh evidence.\n if (input.lifecycleStage === 'done') {\n const boardBefore = await getBoard(projectRoot, input.boardId);\n const taskBefore = boardBefore\n ? await getTask(projectRoot, input.boardId, input.taskId)\n : null;\n if (\n boardBefore &&\n taskBefore &&\n !taskBefore.verificationReport &&\n (taskBefore.atomic || Boolean(taskBefore.successCriteria?.length))\n ) {\n const preGate = await verifyTaskCompletion(projectRoot, input.boardId, taskBefore.id, {\n persist: false,\n });\n await updateTask(projectRoot, input.boardId, taskBefore.id, {\n verificationReport: preGate.report,\n successCriteria: preGate.task.successCriteria,\n });\n }\n }\n const result = await transitionTask(projectRoot, input.boardId, input.taskId, {\n to: input.lifecycleStage,\n actor: input.author,\n comment: input.transitionComment,\n ...(input.transitionAction !== undefined\n ? { action: input.transitionAction }\n : {}),\n ...(input.attachmentUrl !== undefined\n ? {\n attachment: {\n url: input.attachmentUrl,\n type: input.attachmentType ?? 'url',\n ...(input.attachmentTitle !== undefined\n ? { title: input.attachmentTitle }\n : {}),\n },\n }\n : {}),\n patch: taskPatch(input),\n });\n if (result && input.lifecycleStage === 'done' && result.task.verificationReport) {\n recordKanbanVerificationEvidence(ctx, result.task.verificationReport);\n }\n return result\n ? okTask(result.board, result.task, `Task advanced to ${result.transition.to}.`)\n : fail('Board or task not found.');\n }\n case 'repair_managed_projection': {\n if (!input.boardId || !input.taskId || !input.author || !input.transitionComment) {\n return fail(\n 'repair_managed_projection requires boardId, taskId, author, and transitionComment.',\n );\n }\n const result = await repairManagedTaskProjection(projectRoot, input.boardId, input.taskId, {\n actor: input.author,\n comment: input.transitionComment,\n });\n return result\n ? okTask(result.board, result.task, 'Managed card projection repaired from lifecycle history.')\n : fail('Board or task not found.');\n }\n case 'move_task': {\n if (!input.boardId || !input.taskId || !input.targetColumnId) {\n return fail('move_task requires boardId, taskId, and targetColumnId.');\n }\n const board = await moveTask(\n projectRoot,\n input.boardId,\n input.taskId,\n input.targetColumnId,\n input.order,\n );\n return board ? okBoard(board, 'Task moved.') : fail('Move failed.');\n }\n case 'delete_task': {\n if (!input.boardId || !input.taskId)\n return fail('delete_task requires boardId and taskId.');\n const board = await removeTask(projectRoot, input.boardId, input.taskId);\n return board ? okBoard(board, 'Task deleted.') : fail('Task not found.');\n }\n case 'set_chain': {\n if (!input.boardId || !input.taskIds?.length) {\n return fail('set_chain requires boardId and taskIds.');\n }\n const result = await setTaskChain(projectRoot, input.boardId, {\n taskIds: input.taskIds,\n ...(input.chainId !== undefined ? { chainId: input.chainId } : {}),\n ...(input.enforceDependencies !== undefined\n ? { enforceDependencies: input.enforceDependencies }\n : {}),\n });\n return result\n ? {\n ok: true,\n message: `Chain set: ${result.chainId}`,\n board: result.board,\n chain: result.tasks,\n }\n : fail('Board or task not found.');\n }\n case 'get_chain': {\n if (!input.boardId || !(input.taskId || input.chainId)) {\n return fail('get_chain requires boardId and taskId or chainId.');\n }\n const result = await getTaskChain(\n projectRoot,\n input.boardId,\n input.taskId ?? input.chainId ?? '',\n );\n return result\n ? {\n ok: true,\n message: `Chain loaded: ${result.chainId}`,\n board: result.board,\n chain: result.tasks,\n }\n : fail('Chain not found.');\n }\n case 'claim_task': {\n const result = await claimReadyTask(projectRoot, {\n ...(input.boardId !== undefined ? { boardId: input.boardId } : {}),\n ...(input.taskId !== undefined ? { taskId: input.taskId } : {}),\n ...assignmentInput(input),\n status: input.assignmentStatus ?? 'queued',\n });\n return result\n ? okTask(result.board, result.task, 'Task claimed.')\n : fail('No ready kanban task matched the claim.');\n }\n case 'release_task': {\n if (!input.boardId || !input.taskId) {\n return fail('release_task requires boardId and taskId.');\n }\n const board = await releaseTaskClaim(projectRoot, input.boardId, input.taskId, {\n ...(input.releaseStatus !== undefined ? { status: input.releaseStatus } : {}),\n ...(input.releaseReason !== undefined ? { reason: input.releaseReason } : {}),\n ...(input.clearAssignee !== undefined ? { clearAssignee: input.clearAssignee } : {}),\n });\n return board ? okBoard(board, 'Task claim released.') : fail('Task not found.');\n }\n case 'assign_task': {\n if (!input.boardId || !input.taskId)\n return fail('assign_task requires boardId and taskId.');\n const board = await assignTask(\n projectRoot,\n input.boardId,\n input.taskId,\n assignmentInput(input),\n );\n return board ? okBoard(board, 'Task assigned.') : fail('Task not found.');\n }\n case 'mark_assignment': {\n if (!input.boardId || !input.taskId)\n return fail('mark_assignment requires boardId and taskId.');\n const assignmentStatus =\n input.assignmentStatus ??\n (input.status === 'completed' ? 'completed' : input.error ? 'failed' : undefined);\n const board = await updateTaskAssignment(\n projectRoot,\n input.boardId,\n input.taskId,\n {\n ...(assignmentStatus !== undefined ? { status: assignmentStatus } : {}),\n ...(input.subagentId !== undefined ? { subagentId: input.subagentId } : {}),\n ...(input.runTaskId !== undefined ? { runTaskId: input.runTaskId } : {}),\n ...(input.lastResult !== undefined ? { lastResult: input.lastResult } : {}),\n ...(input.error !== undefined ? { error: input.error } : {}),\n ...(input.agentId !== undefined ? { agentId: input.agentId } : {}),\n ...(input.leaseId !== undefined ? { leaseId: input.leaseId } : {}),\n ...(input.claimedAt !== undefined ? { claimedAt: input.claimedAt } : {}),\n ...(input.heartbeatAt !== undefined ? { heartbeatAt: input.heartbeatAt } : {}),\n ...(input.leaseExpiresAt !== undefined ? { leaseExpiresAt: input.leaseExpiresAt } : {}),\n ...(input.attempt !== undefined ? { attempt: input.attempt } : {}),\n ...(input.maxAttempts !== undefined ? { maxAttempts: input.maxAttempts } : {}),\n },\n // Ownership fence: when expectedLeaseId is supplied, the write is\n // applied only if the current assignment still holds this lease.\n // This prevents a recovered+reassigned stale worker's terminal\n // mark_assignment from overwriting the successor's state. The check\n // is atomic inside updateTaskAssignment's mutateBoard lock.\n input.expectedLeaseId !== undefined\n ? { expectedLeaseId: input.expectedLeaseId }\n : {},\n );\n if (!board) return fail('Task not found.');\n // Universal completion gate: a completed assignment was parked in\n // review by updateTaskAssignment; finalize runs the verifier and\n // applies the final status (async \u2014 cannot happen inside the board\n // mutation). Env fallback applies only when the board carries no\n // explicit completionGate policy; the kanban package never reads env.\n if (assignmentStatus === 'completed' && board.lifecycle?.mode !== 'managed') {\n const envGate = readEnvGateEnforcement();\n const finalized = await finalizeTaskCompletion(projectRoot, board.id, input.taskId, {\n ...(board.completionGate === undefined && envGate !== undefined\n ? { enforcement: envGate }\n : {}),\n ...(ctx.agentId !== undefined ? { eventContext: { actor: ctx.agentId } } : {}),\n });\n if (finalized) {\n if (finalized.gate.report) {\n recordKanbanVerificationEvidence(ctx, finalized.gate.report);\n }\n const gateSummary = {\n enforcement: finalized.gate.enforcement,\n allowed: finalized.gate.allowed,\n verdict: finalized.gate.verdict,\n issues: finalized.gate.issues.map((issue) => issue.message),\n };\n const gateMessage = finalized.gate.allowed\n ? `Completion gate ${finalized.gate.verdict === 'skipped' ? 'skipped' : 'passed'}; task completed.`\n : finalized.gate.enforcement === 'strict'\n ? `Completion gate BLOCKED (verdict: ${finalized.gate.verdict}); task parked in review. Issues: ${gateSummary.issues.join(' | ')}`\n : `Completion gate failed softly (verdict: ${finalized.gate.verdict}); task completed with warnings. Issues: ${gateSummary.issues.join(' | ')}`;\n return {\n ...okTask(finalized.board, finalized.task, `Assignment updated. ${gateMessage}`),\n gate: gateSummary,\n };\n }\n } else if (board.lifecycle?.mode === 'managed') {\n // \u2500\u2500 Managed lifecycle auto-transition \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n // The worker's assignment status changes represent lifecycle\n // events. transitionTask atomically persists audit history,\n // evidence, and the correct column/status projection. The\n // assignment telemetry was already persisted by\n // updateTaskAssignment above; this separate domain call\n // advances the card without violating the invariant that\n // assignment writes never fabricate lifecycle stages.\n //\n // When completed transitions to Review, verification runs\n // automatically and \u2014 if the verdict is passed/skipped \u2014 the\n // card auto-advances to Done without human intervention.\n // ------------------------------------------------------------\n const managedTask = board.tasks.find(\n (candidate) => candidate.id === input.taskId,\n );\n const stage = managedTask?.lifecycle?.currentStage;\n const actor = ctx.agentId ?? 'kanban-agent';\n let transitionResult: Awaited<ReturnType<typeof transitionTask>> = null;\n const lifecycleWarnings: string[] = [];\n\n if (assignmentStatus === 'running' && stage === 'todo') {\n try {\n transitionResult = await transitionTask(\n projectRoot,\n board.id,\n input.taskId,\n { to: 'running', actor, comment: 'Work started.' },\n );\n } catch (err: unknown) {\n lifecycleWarnings.push(\n `Lifecycle transition to Running deferred: ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n }\n if (assignmentStatus === 'completed' && stage === 'running') {\n // \u2500\u2500 Running \u2192 Review \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n const comment =\n typeof input.lastResult === 'string' &&\n input.lastResult.trim().length > 0\n ? input.lastResult.trim().slice(0, 1000)\n : 'Work completed.';\n try {\n transitionResult = await transitionTask(\n projectRoot,\n board.id,\n input.taskId,\n {\n to: 'review',\n actor,\n comment,\n attachment: {\n url: `kanban://task/${input.taskId}/result`,\n title: 'Worker completion result',\n type: 'file',\n },\n patch: {\n // Only patch non-description fields so the\n // original card description is preserved.\n ...(input.agentId !== undefined\n ? { assignedAgent: input.agentId }\n : {}),\n },\n },\n );\n } catch (err: unknown) {\n lifecycleWarnings.push(\n `Lifecycle transition to Review failed: ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n\n // \u2500\u2500 Autonomous verify + accept \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n // Card is now in Review. When it has verifiable criteria\n // or is atomic, the system runs the verifier automatically\n // and \u2014 if the verdict allows \u2014 advances to Done.\n if (transitionResult) {\n const hasCriteria =\n (transitionResult.task.successCriteria?.length ?? 0) > 0 ||\n transitionResult.task.atomic === true;\n\n if (hasCriteria) {\n try {\n const verResult = await verifyTaskCompletion(\n projectRoot,\n board.id,\n input.taskId,\n );\n if (verResult.report) {\n recordKanbanVerificationEvidence(ctx, verResult.report);\n }\n\n const verdict = verResult.report.verdict;\n if (verdict === 'passed') {\n try {\n const doneResult = await transitionTask(\n projectRoot,\n board.id,\n input.taskId,\n {\n to: 'done',\n actor,\n comment: 'Auto-accepted: verification passed.',\n attachment: {\n url: `kanban://task/${input.taskId}/verification`,\n title: 'Auto-verification result',\n type: 'file',\n },\n },\n );\n transitionResult = doneResult;\n } catch (acceptErr: unknown) {\n lifecycleWarnings.push(\n `Auto-accept to Done deferred: ${acceptErr instanceof Error ? acceptErr.message : String(acceptErr)}`,\n );\n }\n } else {\n lifecycleWarnings.push(\n `Verification verdict: ${verdict} \u2014 card left in Review for manual acceptance.`,\n );\n }\n } catch (verifyErr: unknown) {\n lifecycleWarnings.push(\n `Auto-verification error: ${verifyErr instanceof Error ? verifyErr.message : String(verifyErr)}`,\n );\n }\n } else {\n lifecycleWarnings.push(\n 'No automatic success criteria \u2014 card left in Review for manual verification.',\n );\n }\n }\n }\n\n // \u2500\u2500 Build the freshest possible response \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n // transitionResult carries the post-transition board; use\n // it instead of the stale snapshot from updateTaskAssignment.\n const responseBoard = transitionResult?.board ?? board;\n const responseTask =\n transitionResult?.task ?? managedTask!;\n const msgParts = ['Assignment updated.'];\n if (transitionResult) {\n msgParts.push(`Card advanced to ${transitionResult.transition.to}.`);\n }\n for (const w of lifecycleWarnings) msgParts.push(`Warning: ${w}`);\n return okTask(responseBoard, responseTask, msgParts.join(' '));\n }\n return okBoard(board, 'Assignment updated.');\n }\n case 'heartbeat_assignment': {\n if (!input.boardId || !input.taskId) {\n return fail('heartbeat_assignment requires boardId and taskId.');\n }\n const board = await heartbeatTaskAssignment(projectRoot, input.boardId, input.taskId, {\n ...(input.heartbeatAt !== undefined ? { heartbeatAt: input.heartbeatAt } : {}),\n ...(input.leaseExpiresAt !== undefined ? { leaseExpiresAt: input.leaseExpiresAt } : {}),\n // Ownership fence: when expectedLeaseId is supplied, the renewal\n // is applied only if the current assignment still holds this lease.\n // This prevents a recovered+reassigned stale worker's heartbeat\n // from renewing the successor's lease. The check is atomic inside\n // heartbeatTaskAssignment's mutateBoard lock.\n ...(input.expectedLeaseId !== undefined\n ? { expectedLeaseId: input.expectedLeaseId }\n : {}),\n });\n return board\n ? okBoard(board, 'Assignment heartbeat updated.')\n : fail('Task assignment not found.');\n }\n case 'recover_stale': {\n if (!input.boardId) return fail('recover_stale requires boardId.');\n const policyFields = [\n input.recoveryPolicyFailOnCostCeiling !== undefined,\n input.recoveryPolicyReleaseOnFailureKinds !== undefined,\n input.recoveryPolicyReleaseOnHeartbeatDue !== undefined,\n input.recoveryPolicyRetryPolicyOverride !== undefined,\n ].some(Boolean);\n const result = await recoverStaleTaskAssignments(projectRoot, input.boardId, {\n ...(input.recoveryMode !== undefined ? { mode: input.recoveryMode } : {}),\n ...(input.recoveryNow !== undefined ? { now: input.recoveryNow } : {}),\n ...(input.releaseReason !== undefined ? { reason: input.releaseReason } : {}),\n ...(input.clearAssignee !== undefined ? { clearAssignee: input.clearAssignee } : {}),\n ...(policyFields\n ? {\n policy: {\n ...(input.recoveryPolicyFailOnCostCeiling !== undefined\n ? { failWhenCostCeilingSet: input.recoveryPolicyFailOnCostCeiling }\n : {}),\n ...(input.recoveryPolicyReleaseOnFailureKinds !== undefined\n ? {\n releaseOnFailureKinds: input.recoveryPolicyReleaseOnFailureKinds,\n }\n : {}),\n ...(input.recoveryPolicyReleaseOnHeartbeatDue !== undefined\n ? {\n releaseOnHeartbeatDue: input.recoveryPolicyReleaseOnHeartbeatDue,\n }\n : {}),\n ...(input.recoveryPolicyRetryPolicyOverride !== undefined\n ? {\n retryPolicyOverride: input.recoveryPolicyRetryPolicyOverride,\n }\n : {}),\n },\n }\n : {}),\n });\n return result\n ? {\n ok: true,\n message: `Recovered ${result.tasks.length} stale assignment(s).`,\n board: result.board,\n recoveredTasks: result.tasks,\n }\n : { ok: true, message: 'No stale assignment matched.', recoveredTasks: [] };\n }\n case 'events': {\n if (!input.boardId) return fail('events requires boardId.');\n const eventList = await listKanbanEvents(projectRoot, input.boardId);\n return {\n ok: true,\n message: `${eventList.length} event(s).`,\n events: eventList,\n };\n }\n case 'queue_health': {\n const health = await getKanbanQueueHealth(projectRoot, {\n ...(input.boardId !== undefined ? { boardId: input.boardId } : {}),\n });\n return {\n ok: true,\n message: `Counts: ready=${health.counts.ready}, running=${health.counts.running}, stale=${health.staleAssignments.count}.`,\n queueHealth: health,\n };\n }\n default:\n {\n const detailResult = await handleKanbanDetailAction(projectRoot, input);\n if (detailResult !== undefined) return detailResult;\n }\n return fail(`Unknown kanban action: ${(input as { action: string }).action}`);\n }\n })();\n return withPresence(result);\n } catch (err) {\n return fail(err instanceof Error ? err.message : String(err));\n }\n },\n};\n", "/**\n * Kanban \u2192 completed-work ledger bridge.\n *\n * Links the two evidence systems: when a task's verification report is\n * produced (verify_completion, the completion gate via mark_assignment, or a\n * managed Done transition), the session's completed-work ledger gets an entry\n * pointing back at the report. The kanban package cannot do this itself \u2014 it\n * has zero core dependency \u2014 so the bridge lives here in tools, which owns\n * both sides.\n *\n * Best-effort by contract: a ledger failure must never turn a successful\n * board mutation into an apparent task failure.\n */\n\nimport type { Context } from '@wrongstack/core/agent';\nimport { recordCompletedWorkEvidence } from '@wrongstack/core/utils';\nimport type { KanbanVerificationReport } from '@wrongstack/kanban';\n\n/** Stable dedupe key \u2014 re-verifying the same task updates the entry in place. */\nexport function kanbanEvidenceKey(boardId: string, taskId: string): string {\n return `kanban:${boardId}:${taskId}`;\n}\n\n/** Parseable deep-link pointer to the persisted report. */\nexport function kanbanEvidencePointer(boardId: string, taskId: string): string {\n return `kanban://${boardId}/${taskId}#verificationReport`;\n}\n\nexport function recordKanbanVerificationEvidence(\n ctx: Context,\n report: KanbanVerificationReport,\n): void {\n try {\n const passed = report.checks.filter((check) => check.status === 'passed').length;\n const completedAt = Date.parse(report.completedAt);\n recordCompletedWorkEvidence(ctx, {\n key: kanbanEvidenceKey(report.boardId, report.taskId),\n source: 'verification',\n summary: `${report.taskTitle} \u2014 verification ${report.verdict} (${passed}/${report.checks.length} checks)`,\n ...(Number.isFinite(completedAt) ? { completedAt } : {}),\n evidence: kanbanEvidencePointer(report.boardId, report.taskId),\n });\n } catch {\n // Evidence is observational; never fail the caller.\n }\n}\n", "import type { Context } from '@wrongstack/core/agent';\nimport type { KanbanTask } from '@wrongstack/kanban';\nimport {\n assessTaskAtomicity,\n proposeTaskDecomposition,\n updateTask,\n verifyTaskCompletion,\n} from '@wrongstack/kanban';\nimport { recordKanbanVerificationEvidence } from './kanban-evidence-bridge.js';\nimport { fail, okTask } from './kanban-tool-results.js';\nimport type { KanbanToolInput, KanbanToolOutput } from './kanban-tool-types.js';\n\nexport async function handleKanbanDecompositionAction(\n projectRoot: string,\n input: KanbanToolInput,\n ctx: Context,\n): Promise<KanbanToolOutput | undefined> {\n switch (input.action) {\n case 'assess_atomicity': {\n if (!input.boardId || !input.taskId) {\n return fail('assess_atomicity requires boardId and taskId.');\n }\n const result = await assessTaskAtomicity(projectRoot, input.boardId, input.taskId, {\n assessedBy: 'agent',\n ...(ctx.agentId !== undefined ? { eventContext: { actor: ctx.agentId } } : {}),\n });\n if (!result) return fail('Task not found.');\n const failing = result.assessment.criteria\n .filter((entry) => entry.score < 1)\n .map((entry) => entry.reason);\n const guidance =\n result.assessment.verdict === 'needs_decomposition'\n ? ` This task should be split before dispatch \u2014 call propose_decomposition with 2+ subtasks (each with one verifiable success criterion). Reasons: ${failing.join(' | ')}`\n : result.assessment.verdict === 'composite'\n ? ' Container task: work happens in its children; it is verified via subtask aggregation.'\n : '';\n return okTask(\n result.board,\n result.task,\n `Atomicity verdict: ${result.assessment.verdict} (score ${result.assessment.score}).${guidance}`,\n );\n }\n case 'propose_decomposition': {\n if (!input.boardId || !input.taskId || !input.subtasks?.length) {\n return fail('propose_decomposition requires boardId, taskId, and subtasks (2+).');\n }\n if (input.subtasks.length < 2) {\n return fail('propose_decomposition requires at least two subtasks.');\n }\n const invalid = input.subtasks.find(\n (subtask) => typeof subtask?.title !== 'string' || !subtask.title.trim(),\n );\n if (invalid) return fail('Every proposed subtask needs a non-blank title.');\n const result = await proposeTaskDecomposition(\n projectRoot,\n input.boardId,\n input.taskId,\n {\n subtasks: input.subtasks,\n ...(input.note !== undefined ? { rationale: input.note } : {}),\n ...(ctx.agentId !== undefined ? { proposedBy: ctx.agentId } : {}),\n },\n ctx.agentId !== undefined ? { actor: ctx.agentId } : {},\n );\n if (!result) return fail('Task not found.');\n const message =\n result.proposal.status === 'applied'\n ? `Decomposition applied: ${result.proposal.appliedChildTaskIds?.length ?? 0} child tasks created (parent marked atomic).`\n : 'Decomposition proposal recorded \u2014 awaiting approval (board policy is \"propose\"). It can be approved from the WebUI or via update_task.';\n return okTask(result.board, result.task, message);\n }\n case 'verify_completion': {\n if (!input.boardId || !input.taskId) {\n return fail('verify_completion requires boardId and taskId.');\n }\n const verResult = await verifyTaskCompletion(projectRoot, input.boardId, input.taskId);\n const persistedBoard = await updateTask(projectRoot, input.boardId, input.taskId, {\n verificationReport: verResult.report,\n successCriteria: verResult.task.successCriteria,\n });\n if (!persistedBoard) {\n return {\n ok: false,\n verdict: verResult.report.verdict,\n message:\n `Verification succeeded but persist failed: ${verResult.report.markdownSummary}. ` +\n `Board may be stale \u2014 re-run verify_completion.`,\n board: verResult.board,\n };\n }\n recordKanbanVerificationEvidence(ctx, verResult.report);\n const freshTask = persistedBoard.tasks?.find((t: KanbanTask) => t.id === input.taskId);\n const deterministicVerdicts = ['passed', 'failed', 'needs_human', 'incomplete'] as const;\n return {\n ok: deterministicVerdicts.includes(\n verResult.report.verdict as (typeof deterministicVerdicts)[number],\n ),\n verdict: verResult.report.verdict,\n message: verResult.report.markdownSummary,\n board: persistedBoard,\n task: freshTask ?? verResult.task,\n };\n }\n default:\n return undefined;\n }\n}\n", "import type {\n KanbanBoard,\n KanbanCompletionGateEnforcement,\n KanbanTask,\n} from '@wrongstack/kanban';\nimport type { KanbanToolOutput } from './kanban-tool-types.js';\n\n/** One-line guidance appended when a freshly created task should be split. */\nexport function atomicityNudge(task: KanbanTask): string {\n if (task.atomicityAssessment?.verdict !== 'needs_decomposition') return '';\n const reasons = task.atomicityAssessment.criteria\n .filter((entry) => entry.score < 1)\n .map((entry) => entry.reason)\n .join(' | ');\n return ` Atomicity: needs_decomposition (score ${task.atomicityAssessment.score}) \u2014 call propose_decomposition with 2+ subtasks before dispatch. Reasons: ${reasons}`;\n}\n\n/**\n * Host-level completion-gate fallback. The kanban package stays env-free;\n * only hosting surfaces (tools, webui-server) read WRONGSTACK_KANBAN_GATE,\n * and only when the board carries no explicit completionGate policy.\n */\nexport function readEnvGateEnforcement(): KanbanCompletionGateEnforcement | undefined {\n const raw = process.env['WRONGSTACK_KANBAN_GATE']?.trim().toLowerCase();\n return raw === 'strict' || raw === 'soft' || raw === 'off' ? raw : undefined;\n}\n\nexport function fail(message: string): KanbanToolOutput {\n return { ok: false, message };\n}\n\nexport function okBoard(board: KanbanBoard, message = 'Board loaded.'): KanbanToolOutput {\n return { ok: true, message, board };\n}\n\nexport function okTask(board: KanbanBoard, task: KanbanTask, message: string): KanbanToolOutput {\n return { ok: true, message, board, task };\n}\n", "import {\n addCheckToTask,\n addDependency,\n addGoalMetricToTask,\n addLinkToTask,\n addNoteToTask,\n updateCheckOnTask,\n updateGoalMetricOnTask,\n} from '@wrongstack/kanban';\nimport { fail, okBoard } from './kanban-tool-results.js';\nimport { handleSplitTask } from './kanban-split-task-handler.js';\nimport type { KanbanToolInput, KanbanToolOutput } from './kanban-tool-types.js';\n\nexport async function handleKanbanDetailAction(\n projectRoot: string,\n input: KanbanToolInput,\n): Promise<KanbanToolOutput | undefined> {\n switch (input.action) {\n case 'add_dependency': {\n if (!input.boardId || !input.taskId || !input.dependencyTaskId) {\n return fail('add_dependency requires boardId, taskId, and dependencyTaskId.');\n }\n const board = await addDependency(\n projectRoot,\n input.boardId,\n input.taskId,\n input.dependencyTaskId,\n );\n return board ? okBoard(board, 'Dependency added.') : fail('Task not found.');\n }\n case 'add_goal_metric': {\n if (!input.boardId || !input.taskId || !input.metricName) {\n return fail('add_goal_metric requires boardId, taskId, and metricName.');\n }\n const board = await addGoalMetricToTask(projectRoot, input.boardId, input.taskId, {\n name: input.metricName,\n ...(input.metricStatus !== undefined ? { status: input.metricStatus } : {}),\n ...(input.metricTarget !== undefined ? { target: input.metricTarget } : {}),\n ...(input.metricCurrent !== undefined ? { current: input.metricCurrent } : {}),\n ...(input.metricUnit !== undefined ? { unit: input.metricUnit } : {}),\n ...(input.metricNotes !== undefined ? { notes: input.metricNotes } : {}),\n });\n return board ? okBoard(board, 'Goal metric added.') : fail('Task not found.');\n }\n case 'update_goal_metric': {\n if (!input.boardId || !input.taskId || !input.metricId) {\n return fail('update_goal_metric requires boardId, taskId, and metricId.');\n }\n const board = await updateGoalMetricOnTask(\n projectRoot,\n input.boardId,\n input.taskId,\n input.metricId,\n {\n ...(input.metricName !== undefined ? { name: input.metricName } : {}),\n ...(input.metricStatus !== undefined ? { status: input.metricStatus } : {}),\n ...(input.metricTarget !== undefined ? { target: input.metricTarget } : {}),\n ...(input.metricCurrent !== undefined ? { current: input.metricCurrent } : {}),\n ...(input.metricUnit !== undefined ? { unit: input.metricUnit } : {}),\n ...(input.metricNotes !== undefined ? { notes: input.metricNotes } : {}),\n },\n );\n return board ? okBoard(board, 'Goal metric updated.') : fail('Metric not found.');\n }\n case 'add_check': {\n if (!input.boardId || !input.taskId || !input.checkDescription) {\n return fail('add_check requires boardId, taskId, and checkDescription.');\n }\n const board = await addCheckToTask(projectRoot, input.boardId, input.taskId, {\n description: input.checkDescription,\n type: 'manual',\n status: input.checkStatus,\n });\n return board ? okBoard(board, 'Check added.') : fail('Task not found.');\n }\n case 'update_check': {\n if (!input.boardId || !input.taskId || !input.checkId) {\n return fail('update_check requires boardId, taskId, and checkId.');\n }\n const board = await updateCheckOnTask(\n projectRoot,\n input.boardId,\n input.taskId,\n input.checkId,\n {\n ...(input.checkDescription !== undefined ? { description: input.checkDescription } : {}),\n ...(input.checkStatus !== undefined ? { status: input.checkStatus } : {}),\n },\n );\n return board ? okBoard(board, 'Check updated.') : fail('Check not found.');\n }\n case 'add_note': {\n if (!input.boardId || !input.taskId || !input.note)\n return fail('add_note requires boardId, taskId, and note.');\n const board = await addNoteToTask(projectRoot, input.boardId, input.taskId, {\n author: input.author ?? 'agent',\n content: input.note,\n });\n return board ? okBoard(board, 'Note added.') : fail('Task not found.');\n }\n case 'add_link': {\n if (!input.boardId || !input.taskId || !input.url)\n return fail('add_link requires boardId, taskId, and url.');\n const board = await addLinkToTask(projectRoot, input.boardId, input.taskId, {\n url: input.url,\n type: input.linkType ?? 'url',\n ...(input.linkTitle !== undefined ? { title: input.linkTitle } : {}),\n });\n return board ? okBoard(board, 'Link added.') : fail('Task not found.');\n }\n case 'split_atomic': {\n if (!input.boardId || !input.taskId || !input.childTitles?.length) {\n return fail('split_atomic requires boardId, taskId, and childTitles (at least one).');\n }\n return handleSplitTask(projectRoot, input, { atomic: true });\n }\n default:\n return undefined;\n }\n}\n", "import type { KanbanBoard, KanbanTask } from '@wrongstack/kanban';\nimport { getBoard, splitTask } from '@wrongstack/kanban';\nimport { fail } from './kanban-tool-results.js';\nimport type { KanbanToolInput, KanbanToolOutput } from './kanban-tool-types.js';\n\n/** Shared split handler used by both split_task and split_atomic. */\nexport async function handleSplitTask(\n projectRoot: string,\n input: KanbanToolInput,\n extraSplitOptions: Record<string, unknown>,\n): Promise<KanbanToolOutput> {\n const boardId = input.boardId;\n const taskId = input.taskId;\n const childTitles = input.childTitles;\n if (!boardId || !taskId || !childTitles?.length) {\n return fail('split requires boardId, taskId, and at least one childTitles.');\n }\n // Destructure the optional SplitKanbanTaskInput fields from the tool input.\n // childTitles\u2192titles and targetColumnId\u2192columnId are the only renames.\n const {\n targetColumnId,\n inheritAssignment,\n inheritLabels,\n inheritSuccessCriteria,\n inheritGoalMetrics,\n inheritDependencies,\n chainChildren,\n rewireDependents,\n } = input;\n const result = await splitTask(projectRoot, boardId, taskId, {\n titles: childTitles,\n ...extraSplitOptions,\n ...(targetColumnId !== undefined ? { columnId: targetColumnId } : {}),\n ...(inheritAssignment !== undefined ? { inheritAssignment } : {}),\n ...(inheritLabels !== undefined ? { inheritLabels } : {}),\n ...(inheritSuccessCriteria !== undefined ? { inheritSuccessCriteria } : {}),\n ...(inheritGoalMetrics !== undefined ? { inheritGoalMetrics } : {}),\n ...(inheritDependencies !== undefined ? { inheritDependencies } : {}),\n ...(chainChildren !== undefined ? { chainChildren } : {}),\n ...(rewireDependents !== undefined ? { rewireDependents } : {}),\n });\n if (!result) return fail('Task not found.');\n const freshParent = result.board.tasks?.find((t: KanbanTask) => t.id === taskId);\n if (!freshParent) {\n return fail(\n `Split succeeded but parent ${taskId} not found in returned board. ` +\n `Children: [${result.children.map((c) => c.id).join(', ')}].`,\n );\n }\n return {\n ok: true,\n message: `${result.children.length} child task(s) created.`,\n board: result.board,\n task: freshParent,\n children: result.children,\n };\n}\n\nexport async function requireBoard(\n projectRoot: string,\n boardId: string | undefined,\n): Promise<KanbanBoard | null> {\n return boardId ? getBoard(projectRoot, boardId) : null;\n}\n", "import type { KanbanToolInput } from './kanban-tool-types.js';\n\nexport function boardCreateInput(input: KanbanToolInput, title: string) {\n return {\n title,\n ...(input.description !== undefined ? { description: input.description } : {}),\n ...(input.tags !== undefined ? { tags: input.tags } : {}),\n ...(input.generatedBy !== undefined ? { generatedBy: input.generatedBy } : {}),\n ...(input.atomicityMode !== undefined\n ? {\n atomicity: {\n mode: input.atomicityMode,\n decomposition: input.atomicityDecomposition ?? 'propose',\n },\n }\n : {}),\n ...(input.gateEnforcement !== undefined\n ? { completionGate: { enforcement: input.gateEnforcement } }\n : {}),\n };\n}\n\nexport function boardUpdatePatch(input: KanbanToolInput) {\n return {\n ...(input.title !== undefined ? { title: input.title } : {}),\n ...(input.description !== undefined ? { description: input.description } : {}),\n ...(input.tags !== undefined ? { tags: input.tags } : {}),\n ...(input.atomicityMode !== undefined\n ? {\n atomicity: {\n mode: input.atomicityMode,\n decomposition: input.atomicityDecomposition ?? 'propose',\n },\n }\n : {}),\n ...(input.gateEnforcement !== undefined\n ? { completionGate: { enforcement: input.gateEnforcement } }\n : {}),\n };\n}\n\nexport function duplicateBoardOptions(input: KanbanToolInput) {\n return {\n ...(input.title !== undefined ? { title: input.title } : {}),\n ...(input.generatedBy !== undefined ? { generatedBy: input.generatedBy } : {}),\n ...(input.includeTasks !== undefined ? { includeTasks: input.includeTasks } : {}),\n ...(input.includeCompletedTasks !== undefined\n ? { includeCompletedTasks: input.includeCompletedTasks }\n : {}),\n ...(input.preserveAssignment !== undefined ? { preserveAssignment: input.preserveAssignment } : {}),\n };\n}\n", "import { randomUUID } from 'node:crypto';\nimport type { AssignKanbanTaskInput, KanbanAgentAssignment } from '@wrongstack/kanban';\nimport type { KanbanToolInput } from './kanban-tool-types.js';\n\nexport function taskInput(input: KanbanToolInput) {\n const assignment = hasAssignmentInput(input) ? assignmentForTaskCreate(input) : undefined;\n return {\n title: input.title ?? '',\n columnId: input.columnId,\n description: input.description,\n dueDate: input.dueDate,\n priority: input.priority,\n ...(input.taskType !== undefined ? { type: input.taskType } : {}),\n status: input.status,\n labels: input.labels,\n ...((assignment?.agentId ?? assignment?.role ?? assignment?.name)\n ? { assignedAgent: assignment.agentId ?? assignment.role ?? assignment.name }\n : {}),\n ...((input.assignee ?? assignment?.name ?? assignment?.agentId)\n ? { assignee: input.assignee ?? assignment?.name ?? assignment?.agentId }\n : {}),\n ...(mergedDependsOn(input) ? { dependsOn: mergedDependsOn(input) } : {}),\n ...(input.estimatedHours !== undefined ? { estimatedHours: input.estimatedHours } : {}),\n ...(input.actualHours !== undefined ? { actualHours: input.actualHours } : {}),\n ...(assignment ? { assignment } : {}),\n ...(input.order !== undefined ? { order: input.order } : {}),\n ...(input.retryPolicy !== undefined ? { retryPolicy: input.retryPolicy } : {}),\n ...(input.costCeilingUsd !== undefined ? { costCeilingUsd: input.costCeilingUsd } : {}),\n ...(input.childTitles !== undefined ? { childTaskIds: input.childTitles } : {}),\n ...(input.checkDescription !== undefined\n ? {\n successCriteria: [\n {\n id: randomUUID(),\n description: input.checkDescription,\n type: 'manual' as const,\n status: input.checkStatus ?? ('pending' as const),\n },\n ],\n }\n : {}),\n ...(input.metricName !== undefined\n ? {\n goalMetrics: [\n {\n id: randomUUID(),\n name: input.metricName,\n status: input.metricStatus ?? ('pending' as const),\n ...(input.metricTarget !== undefined ? { target: input.metricTarget } : {}),\n ...(input.metricCurrent !== undefined ? { current: input.metricCurrent } : {}),\n ...(input.metricUnit !== undefined ? { unit: input.metricUnit } : {}),\n ...(input.metricNotes !== undefined ? { notes: input.metricNotes } : {}),\n },\n ],\n }\n : {}),\n ...(input.url !== undefined\n ? {\n links: [\n {\n url: input.url,\n type: input.linkType ?? ('url' as const),\n ...(input.linkTitle !== undefined ? { title: input.linkTitle } : {}),\n },\n ],\n }\n : {}),\n ...(input.note !== undefined\n ? {\n notes: [\n {\n id: randomUUID(),\n author: input.author ?? 'agent',\n content: input.note,\n createdAt: new Date().toISOString(),\n },\n ],\n }\n : {}),\n ...(input.graphId !== undefined\n ? {\n origin: {\n system: input.sourceSystem ?? 'kanban-tool',\n ...(input.graphId !== undefined ? { graphId: input.graphId } : {}),\n ...(input.specId !== undefined ? { specId: input.specId } : {}),\n ...(input.phaseId !== undefined ? { phaseId: input.phaseId } : {}),\n },\n }\n : {}),\n };\n}\n\n/** Union of the single `dependencyTaskId` and the multi `dependsOn[]` inputs. */\nexport function mergedDependsOn(input: KanbanToolInput): string[] | undefined {\n const ids = [\n ...(input.dependsOn ?? []),\n ...(input.dependencyTaskId !== undefined ? [input.dependencyTaskId] : []),\n ].filter((id, i, arr) => id && arr.indexOf(id) === i);\n return ids.length > 0 ? ids : undefined;\n}\n\nexport function taskPatch(input: KanbanToolInput) {\n return {\n title: input.title,\n description: input.description,\n dueDate: input.dueDate,\n columnId: input.columnId,\n order: input.order,\n priority: input.priority,\n ...(input.taskType !== undefined ? { type: input.taskType } : {}),\n status: input.status,\n labels: input.labels,\n assignedAgent: input.agentId,\n ...(mergedDependsOn(input) ? { dependsOn: mergedDependsOn(input) } : {}),\n ...(input.estimatedHours !== undefined ? { estimatedHours: input.estimatedHours } : {}),\n ...(input.actualHours !== undefined ? { actualHours: input.actualHours } : {}),\n };\n}\n\nexport function assignmentInput(input: KanbanToolInput): AssignKanbanTaskInput {\n return {\n agentId: input.agentId,\n name: input.name,\n role: input.role,\n provider: input.provider,\n model: input.model,\n fallbackProfile: input.fallbackProfile,\n fallbackModels: input.fallbackModels,\n tools: input.tools,\n allowedCapabilities: input.allowedCapabilities,\n assignee: input.assignee,\n leaseId: input.leaseId,\n claimedAt: input.claimedAt,\n heartbeatAt: input.heartbeatAt,\n leaseExpiresAt: input.leaseExpiresAt,\n attempt: input.attempt,\n maxAttempts: input.maxAttempts,\n costCeilingUsd: input.costCeilingUsd,\n retryPolicy: input.retryPolicy,\n lastFailureKind: input.lastFailureKind,\n };\n}\n\nfunction hasAssignmentInput(input: KanbanToolInput): boolean {\n return (\n input.agentId !== undefined ||\n input.name !== undefined ||\n input.role !== undefined ||\n input.provider !== undefined ||\n input.model !== undefined ||\n input.fallbackProfile !== undefined ||\n input.fallbackModels !== undefined ||\n input.tools !== undefined ||\n input.allowedCapabilities !== undefined ||\n input.assignee !== undefined ||\n input.leaseId !== undefined ||\n input.claimedAt !== undefined ||\n input.heartbeatAt !== undefined ||\n input.leaseExpiresAt !== undefined ||\n input.attempt !== undefined ||\n input.maxAttempts !== undefined ||\n input.costCeilingUsd !== undefined ||\n input.retryPolicy !== undefined ||\n input.lastFailureKind !== undefined ||\n input.assignmentStatus !== undefined\n );\n}\n\nfunction assignmentForTaskCreate(input: KanbanToolInput): KanbanAgentAssignment {\n return {\n status: input.assignmentStatus ?? 'assigned',\n ...(input.agentId !== undefined ? { agentId: input.agentId } : {}),\n ...(input.name !== undefined ? { name: input.name } : {}),\n ...(input.role !== undefined ? { role: input.role } : {}),\n ...(input.provider !== undefined ? { provider: input.provider } : {}),\n ...(input.model !== undefined ? { model: input.model } : {}),\n ...(input.fallbackProfile !== undefined ? { fallbackProfile: input.fallbackProfile } : {}),\n ...(input.fallbackModels !== undefined ? { fallbackModels: input.fallbackModels } : {}),\n ...(input.tools !== undefined ? { tools: input.tools } : {}),\n ...(input.allowedCapabilities !== undefined\n ? { allowedCapabilities: input.allowedCapabilities }\n : {}),\n ...(input.leaseId !== undefined ? { leaseId: input.leaseId } : {}),\n ...(input.claimedAt !== undefined ? { claimedAt: input.claimedAt } : {}),\n ...(input.heartbeatAt !== undefined ? { heartbeatAt: input.heartbeatAt } : {}),\n ...(input.leaseExpiresAt !== undefined ? { leaseExpiresAt: input.leaseExpiresAt } : {}),\n ...(input.attempt !== undefined ? { attempt: input.attempt } : {}),\n ...(input.maxAttempts !== undefined ? { maxAttempts: input.maxAttempts } : {}),\n ...(input.costCeilingUsd !== undefined ? { costCeilingUsd: input.costCeilingUsd } : {}),\n ...(input.retryPolicy !== undefined ? { retryPolicy: input.retryPolicy } : {}),\n ...(input.lastFailureKind !== undefined ? { lastFailureKind: input.lastFailureKind } : {}),\n };\n}\n", "import type { JSONSchema } from '@wrongstack/core/types';\n\nexport const KANBAN_TOOL_DESCRIPTION =\n 'Manage and audit project-scoped multi-kanban boards through the shared IPC Kanban server and its SQLite store. Managed cards enforce fully specified details and adjacent Backlog \u2192 Todo \u2192 Running \u2192 Review \u2192 Done transitions with persistent comments and evidence. Successful board access records live agent/session presence. Use verify_completion to validate a task against its success criteria and persist the verification report. Use split_atomic to split a task into child tasks with parent.atomic=true in a single atomic board mutation, enforcing subtree verification before the parent can complete.';\n\nexport const KANBAN_TOOL_USAGE_HINT =\n 'Use this for durable project kanban state. Reassess with get_board whenever evidence changes; agents may add, update, split, merge, reprioritize, or remove tasks so the board remains a live plan. Presence includes active/last-seen session and agent metadata. For managed boards, fully fill card details, use transition_task after every material step, attach truthful evidence, and never use update_task/move_task to bypass lifecycle guards. Worker completion enters Review; only passed acceptance criteria plus review evidence allow Done. Use verify_completion to generate a verification report (persisted automatically) and split_atomic to atomically create child subtasks with the atomic flag pre-set.';\n\nexport const KANBAN_INPUT_SCHEMA: JSONSchema = {\n type: 'object',\n properties: {\n action: {\n type: 'string',\n enum: [\n 'list_boards',\n 'get_board',\n 'create_board',\n 'duplicate_board',\n 'update_board',\n 'adopt_managed_lifecycle',\n 'delete_board',\n 'generate_board',\n 'export_markdown',\n 'export_task_graph',\n 'sync_task_graph',\n 'create_from_graph',\n 'import_session_tasks',\n 'search_tasks',\n 'ready_tasks',\n 'snapshot',\n 'add_column',\n 'update_column',\n 'delete_column',\n 'add_task',\n 'split_task',\n 'merge_tasks',\n 'copy_task',\n 'transfer_task',\n 'get_task',\n 'update_task',\n 'transition_task',\n 'repair_managed_projection',\n 'move_task',\n 'delete_task',\n 'set_chain',\n 'get_chain',\n 'claim_task',\n 'release_task',\n 'assign_task',\n 'mark_assignment',\n 'heartbeat_assignment',\n 'recover_stale',\n 'events',\n 'queue_health',\n 'add_dependency',\n 'add_goal_metric',\n 'update_goal_metric',\n 'add_check',\n 'update_check',\n 'add_note',\n 'add_link',\n 'verify_completion',\n 'split_atomic',\n 'assess_atomicity',\n 'propose_decomposition',\n ],\n },\n boardId: { type: 'string' },\n taskId: { type: 'string' },\n taskIds: { type: 'array', items: { type: 'string' } },\n chainId: { type: 'string' },\n columnId: { type: 'string' },\n targetBoardId: { type: 'string' },\n targetColumnId: { type: 'string' },\n title: { type: 'string' },\n description: { type: 'string' },\n dueDate: { type: 'string' },\n tags: { type: 'array', items: { type: 'string' } },\n labels: { type: 'array', items: { type: 'string' } },\n priority: { type: 'string', enum: ['critical', 'high', 'medium', 'low'] },\n taskType: {\n type: 'string',\n enum: ['feature', 'bugfix', 'refactor', 'docs', 'test', 'chore'],\n },\n status: {\n type: 'string',\n enum: [\n 'pending',\n 'ready',\n 'in_progress',\n 'blocked',\n 'review',\n 'completed',\n 'failed',\n 'archived',\n ],\n },\n order: { type: 'number' },\n query: { type: 'string' },\n limit: { type: 'number' },\n agentId: { type: 'string' },\n name: { type: 'string' },\n role: { type: 'string' },\n provider: { type: 'string' },\n model: { type: 'string' },\n fallbackProfile: { type: 'string' },\n fallbackModels: { type: 'array', items: { type: 'string' } },\n tools: { type: 'array', items: { type: 'string' } },\n allowedCapabilities: { type: 'array', items: { type: 'string' } },\n leaseId: { type: 'string' },\n claimedAt: { type: 'string' },\n heartbeatAt: { type: 'string' },\n leaseExpiresAt: { type: 'string' },\n attempt: { type: 'number' },\n maxAttempts: { type: 'number' },\n subagentId: { type: 'string' },\n runTaskId: { type: 'string' },\n lastResult: { type: 'string' },\n error: { type: 'string' },\n expectedLeaseId: { type: 'string' },\n assignmentStatus: {\n type: 'string',\n enum: ['assigned', 'queued', 'running', 'completed', 'failed', 'cancelled'],\n },\n lifecycleStage: {\n type: 'string',\n enum: ['backlog', 'todo', 'running', 'review', 'done'],\n },\n transitionAction: { type: 'string' },\n transitionComment: { type: 'string' },\n attachmentUrl: { type: 'string' },\n attachmentTitle: { type: 'string' },\n attachmentType: {\n type: 'string',\n enum: ['issue', 'pr', 'doc', 'commit', 'design', 'file', 'url', 'other'],\n },\n releaseStatus: { type: 'string', enum: ['pending', 'ready', 'blocked'] },\n releaseReason: { type: 'string' },\n clearAssignee: { type: 'boolean' },\n recoveryMode: { type: 'string', enum: ['auto', 'release', 'retry', 'fail'] },\n recoveryNow: { type: 'string' },\n recoveryPolicyFailOnCostCeiling: { type: 'boolean' },\n recoveryPolicyReleaseOnFailureKinds: { type: 'array', items: { type: 'string' } },\n recoveryPolicyReleaseOnHeartbeatDue: { type: 'boolean' },\n recoveryPolicyRetryPolicyOverride: {\n type: 'string',\n enum: ['off', 'incremental', 'exponential'],\n },\n assignee: { type: 'string' },\n costCeilingUsd: { type: 'number' },\n retryPolicy: { type: 'string', enum: ['off', 'incremental', 'exponential'] },\n lastFailureKind: { type: 'string' },\n dependsOn: { type: 'array', items: { type: 'string' } },\n estimatedHours: { type: 'number' },\n actualHours: { type: 'number' },\n taskGraph: { type: 'object' },\n graphId: { type: 'string' },\n specId: { type: 'string' },\n sourceSystem: { type: 'string' },\n phaseId: { type: 'string' },\n preserveOriginTaskIds: { type: 'boolean' },\n includeArchived: { type: 'boolean' },\n archiveMissingTasks: { type: 'boolean' },\n preserveManualDependencies: { type: 'boolean' },\n dependencyTaskId: { type: 'string' },\n enforceDependencies: { type: 'boolean' },\n childTitles: { type: 'array', items: { type: 'string' } },\n inheritAssignment: { type: 'boolean' },\n inheritLabels: { type: 'boolean' },\n inheritSuccessCriteria: { type: 'boolean' },\n inheritGoalMetrics: { type: 'boolean' },\n inheritDependencies: { type: 'boolean' },\n chainChildren: { type: 'boolean' },\n rewireDependents: { type: 'boolean' },\n closeSourceTasks: { type: 'boolean' },\n metricId: { type: 'string' },\n metricName: { type: 'string' },\n metricTarget: { oneOf: [{ type: 'string' }, { type: 'number' }] },\n metricCurrent: { oneOf: [{ type: 'string' }, { type: 'number' }] },\n metricUnit: { type: 'string' },\n metricStatus: { type: 'string', enum: ['pending', 'met', 'missed', 'waived'] },\n metricNotes: { type: 'string' },\n checkId: { type: 'string' },\n checkDescription: { type: 'string' },\n checkStatus: { type: 'string', enum: ['pending', 'passed', 'failed', 'skipped'] },\n note: { type: 'string' },\n author: { type: 'string' },\n url: { type: 'string' },\n linkTitle: { type: 'string' },\n linkType: {\n type: 'string',\n enum: ['issue', 'pr', 'doc', 'commit', 'design', 'file', 'url', 'other'],\n },\n context: { type: 'string' },\n columns: { type: 'array', items: { type: 'string' } },\n generatedBy: { type: 'string' },\n includeTasks: { type: 'boolean' },\n includeCompletedTasks: { type: 'boolean' },\n preserveAssignment: { type: 'boolean' },\n preserveDependencies: { type: 'boolean' },\n moveTasksToColumnId: { type: 'string' },\n atomicityMode: { type: 'string', enum: ['off', 'assess', 'enforce'] },\n atomicityDecomposition: { type: 'string', enum: ['auto', 'propose'] },\n gateEnforcement: { type: 'string', enum: ['strict', 'soft', 'off'] },\n subtasks: {\n type: 'array',\n minItems: 2,\n items: {\n type: 'object',\n properties: {\n title: { type: 'string' },\n description: { type: 'string' },\n successCriteria: { type: 'array', items: { type: 'string' } },\n dependsOnIndex: { type: 'array', items: { type: 'number' } },\n },\n required: ['title'],\n },\n },\n },\n required: ['action'],\n};\n", "import { touchKanbanPresence } from '@wrongstack/kanban';\nimport type { KanbanToolInput, KanbanToolOutput } from './kanban-tool-types.js';\n\nexport interface KanbanPresenceContext {\n session?: { id?: string | undefined } | undefined;\n agentId?: string | undefined;\n agentName?: string | undefined;\n}\n\nexport function createKanbanPresenceWrapper(\n projectRoot: string,\n input: KanbanToolInput,\n ctx: KanbanPresenceContext,\n) {\n return async (result: KanbanToolOutput): Promise<KanbanToolOutput> => {\n const boardId = result.board?.id ?? input.boardId;\n if (!result.ok || !boardId || !ctx.session?.id || !ctx.agentId) return result;\n try {\n const board = await touchKanbanPresence(projectRoot, boardId, {\n sessionId: ctx.session.id,\n agentId: ctx.agentId,\n agentName: ctx.agentName,\n taskId: input.taskId ?? result.task?.id,\n runTaskId: input.runTaskId,\n });\n return board ? { ...result, board } : result;\n } catch {\n return result;\n }\n };\n}\n", "import { type FSWatcher, watch } from 'node:fs';\nimport { basename, dirname } from 'node:path';\nimport type { Context, TodoItem } from '@wrongstack/core/agent';\nimport { getSharedProjectMailbox } from '@wrongstack/core/coordination';\nimport {\n loadPlan,\n loadTasks,\n mutatePlan,\n mutateTasks,\n type PlanFile,\n type PlanItem,\n type TaskFile,\n} from '@wrongstack/core/storage';\nimport { deserializeTaskGraph } from '@wrongstack/core/tasking';\nimport type { SerializedTaskGraph, TaskStatus } from '@wrongstack/core/types';\nimport { resolveWstackPaths, type TaskItem } from '@wrongstack/core/utils';\nimport {\n bridgeKanbanSupervisor,\n createBoard,\n getBoard,\n type KanbanBoard,\n type KanbanColumn,\n type KanbanTask,\n listBoards,\n removeBoard,\n syncBoardFromTaskGraph,\n touchKanbanPresence,\n updateBoard,\n} from '@wrongstack/kanban';\n\nconst SESSION_BOARD_TAG = 'session-work';\nconst MIRROR_DISABLED_ENV = 'WRONGSTACK_KANBAN_TASK_MIRROR';\n\n/** The canonical workflow shared by WebUI and TUI session boards. */\nexport const SESSION_KANBAN_COLUMNS: KanbanColumn[] = [\n { id: 'todo', title: 'Todo', order: 0, wipLimit: 0, color: '#2563eb' },\n { id: 'in-progress', title: 'Running', order: 1, wipLimit: 1, color: '#d97706' },\n { id: 'review', title: 'Preview', order: 2, wipLimit: 0, color: '#7c3aed' },\n { id: 'done', title: 'Done', order: 3, wipLimit: 0, color: '#16a34a' },\n];\n\nconst boardQueue = new Map<string, Promise<void>>();\nconst boardEnsures = new Map<string, Promise<KanbanBoard>>();\ntype PendingMirror = {\n projectRoot: string;\n sessionId: string;\n graph: SerializedTaskGraph;\n sourceSystem: 'session-todo' | 'session-task' | 'session-plan';\n};\nconst pendingMirrors = new Map<string, PendingMirror>();\nconst activeMirrors = new Set<string>();\nconst bindings = new WeakMap<Context, () => void>();\nconst suppressedTodoMirrors = new WeakSet<Context>();\nconst activeSessionBoards = new Map<string, number>();\n\nfunction boardKey(projectRoot: string, sessionId: string): string {\n return `${projectRoot}\\0${sessionId}`;\n}\n\nfunction mirrorKey(\n projectRoot: string,\n sessionId: string,\n sourceSystem: PendingMirror['sourceSystem'],\n): string {\n return `${boardKey(projectRoot, sessionId)}\\0${sourceSystem}`;\n}\n\nfunction sessionTag(sessionId: string): string {\n return `session:${sessionId}`;\n}\n\nfunction sessionBoardTitle(sessionId: string): string {\n const leaf = sessionId.split(/[\\\\/]/).filter(Boolean).pop() ?? sessionId;\n return `Session ${leaf.slice(0, 12)}`;\n}\n\nfunction sessionBoardTags(sessionId: string): string[] {\n return ['session', SESSION_BOARD_TAG, sessionTag(sessionId)];\n}\n\nfunction sessionIdFromTags(tags: readonly string[] | undefined): string | null {\n const tag = tags?.find((candidate) => candidate.startsWith('session:'));\n return tag?.slice('session:'.length) || null;\n}\n\nfunction isOwnedSessionBoard(tags: readonly string[] | undefined): boolean {\n return Boolean(tags?.includes(SESSION_BOARD_TAG) && sessionIdFromTags(tags));\n}\n\nfunction retainActiveSessionBoard(projectRoot: string, sessionId: string): void {\n const key = boardKey(projectRoot, sessionId);\n activeSessionBoards.set(key, (activeSessionBoards.get(key) ?? 0) + 1);\n}\n\nfunction releaseActiveSessionBoard(projectRoot: string, sessionId: string): void {\n const key = boardKey(projectRoot, sessionId);\n const remaining = (activeSessionBoards.get(key) ?? 0) - 1;\n if (remaining > 0) activeSessionBoards.set(key, remaining);\n else activeSessionBoards.delete(key);\n}\n\nfunction isSessionBoardActive(projectRoot: string, sessionId: string): boolean {\n return (activeSessionBoards.get(boardKey(projectRoot, sessionId)) ?? 0) > 0;\n}\n\nfunction sameColumns(columns: readonly KanbanColumn[]): boolean {\n return (\n columns.length === SESSION_KANBAN_COLUMNS.length &&\n columns.every((column, index) => column.id === SESSION_KANBAN_COLUMNS[index]?.id)\n );\n}\n\n/** Create (or migrate) the single Kanban board owned by a session. */\nexport async function ensureSessionKanbanBoard(\n projectRoot: string | undefined,\n sessionId: string,\n): Promise<KanbanBoard | null> {\n if (!projectRoot || !sessionId || process.env[MIRROR_DISABLED_ENV] === '0') return null;\n const key = boardKey(projectRoot, sessionId);\n const inFlight = boardEnsures.get(key);\n if (inFlight) return inFlight;\n\n const promise = (async () => {\n const summary = (await listBoards(projectRoot)).find((board) =>\n board.tags?.includes(sessionTag(sessionId)),\n );\n let board = summary ? await getBoard(projectRoot, summary.id) : null;\n if (!board) {\n return createBoard(projectRoot, {\n title: sessionBoardTitle(sessionId),\n description: 'Live session work: todos, tasks, and plan items.',\n tags: sessionBoardTags(sessionId),\n columns: SESSION_KANBAN_COLUMNS,\n generatedBy: `session-kanban:${sessionId}`,\n });\n }\n\n // Boards produced by the older task/plan mirrors used the generic five\n // columns. Migrate only session-owned boards; updateBoard reconciles cards\n // from Backlog into Todo while preserving Running/Preview/Done cards.\n if (!sameColumns(board.columns) || !board.tags?.includes(SESSION_BOARD_TAG)) {\n board =\n (await updateBoard(projectRoot, board.id, {\n title: sessionBoardTitle(sessionId),\n description: 'Live session work: todos, tasks, and plan items.',\n tags: [...new Set([...(board.tags ?? []), ...sessionBoardTags(sessionId)])],\n columns: SESSION_KANBAN_COLUMNS,\n })) ?? board;\n }\n return board;\n })();\n\n boardEnsures.set(key, promise);\n try {\n return await promise;\n } finally {\n boardEnsures.delete(key);\n }\n}\n\nfunction enqueueBoardWork<T>(\n projectRoot: string,\n sessionId: string,\n work: () => Promise<T>,\n): Promise<T> {\n const key = boardKey(projectRoot, sessionId);\n const previous = boardQueue.get(key) ?? Promise.resolve();\n const result = previous.catch(() => undefined).then(work);\n const tail = result.then(\n () => undefined,\n () => undefined,\n );\n boardQueue.set(key, tail);\n void tail.then(() => {\n if (boardQueue.get(key) === tail) boardQueue.delete(key);\n });\n return result;\n}\n\nasync function removeEmptySessionBoard(\n projectRoot: string,\n boardId: string,\n sessionId: string,\n): Promise<string | null> {\n return enqueueBoardWork(projectRoot, sessionId, async () => {\n if (isSessionBoardActive(projectRoot, sessionId)) return null;\n const board = await getBoard(projectRoot, boardId);\n if (!board || board.tasks.length > 0 || !isOwnedSessionBoard(board.tags)) return null;\n if (sessionIdFromTags(board.tags) !== sessionId) return null;\n return (await removeBoard(projectRoot, board.id)) ? board.id : null;\n });\n}\n\n/** Remove a particular inactive session's system-owned board when it has no cards. */\nexport async function cleanupSessionKanbanBoardIfEmpty(\n projectRoot: string | undefined,\n sessionId: string,\n): Promise<string[]> {\n if (!projectRoot || !sessionId || process.env[MIRROR_DISABLED_ENV] === '0') return [];\n if (isSessionBoardActive(projectRoot, sessionId)) return [];\n const candidates = (await listBoards(projectRoot)).filter(\n (board) =>\n board.taskCount === 0 &&\n isOwnedSessionBoard(board.tags) &&\n sessionIdFromTags(board.tags) === sessionId,\n );\n const removed = await Promise.all(\n candidates.map((board) => removeEmptySessionBoard(projectRoot, board.id, sessionId)),\n );\n return removed.filter((boardId): boardId is string => Boolean(boardId));\n}\n\n/** Prune stale empty session boards while preserving manual and live boards. */\nexport async function cleanupEmptySessionKanbanBoards(\n projectRoot: string | undefined,\n activeSessionId = '',\n): Promise<string[]> {\n if (!projectRoot || process.env[MIRROR_DISABLED_ENV] === '0') return [];\n const candidates = (await listBoards(projectRoot)).flatMap((board) => {\n const ownerSessionId = sessionIdFromTags(board.tags);\n return board.taskCount === 0 &&\n isOwnedSessionBoard(board.tags) &&\n ownerSessionId &&\n ownerSessionId !== activeSessionId &&\n !isSessionBoardActive(projectRoot, ownerSessionId)\n ? [{ boardId: board.id, sessionId: ownerSessionId }]\n : [];\n });\n const removed = await Promise.all(\n candidates.map(({ boardId, sessionId }) =>\n removeEmptySessionBoard(projectRoot, boardId, sessionId),\n ),\n );\n return removed.filter((boardId): boardId is string => Boolean(boardId));\n}\n\nasync function projectGraph(\n projectRoot: string | undefined,\n sessionId: string,\n graph: SerializedTaskGraph,\n sourceSystem: 'session-todo' | 'session-task' | 'session-plan',\n): Promise<KanbanBoard | null> {\n if (!projectRoot || !sessionId || process.env[MIRROR_DISABLED_ENV] === '0') return null;\n return enqueueBoardWork(projectRoot, sessionId, async () => {\n const board = await ensureSessionKanbanBoard(projectRoot, sessionId);\n if (!board) return null;\n const result = await syncBoardFromTaskGraph(\n projectRoot,\n board.id,\n deserializeTaskGraph(graph),\n {\n sourceSystem,\n tags: [...new Set([...(board.tags ?? []), ...sessionBoardTags(sessionId)])],\n archiveMissingTasks: true,\n includeCompletedTasks: true,\n },\n );\n return result?.board ?? null;\n });\n}\n\n/**\n * Queue an observational mirror without retaining every intermediate state.\n * Todo/task/plan streams are independent, but within each stream only the\n * newest pending graph matters. This bounds a stalled file lock to one active\n * and one pending projection instead of an arbitrarily long Promise chain.\n */\nfunction queueLatestMirror(\n projectRoot: string | undefined,\n sessionId: string,\n graph: SerializedTaskGraph,\n sourceSystem: PendingMirror['sourceSystem'],\n): void {\n if (!projectRoot || !sessionId || process.env[MIRROR_DISABLED_ENV] === '0') return;\n const key = mirrorKey(projectRoot, sessionId, sourceSystem);\n pendingMirrors.set(key, { projectRoot, sessionId, graph, sourceSystem });\n if (activeMirrors.has(key)) return;\n activeMirrors.add(key);\n void (async () => {\n try {\n for (;;) {\n const pending = pendingMirrors.get(key);\n if (!pending) break;\n pendingMirrors.delete(key);\n try {\n await projectGraph(\n pending.projectRoot,\n pending.sessionId,\n pending.graph,\n pending.sourceSystem,\n );\n } catch {\n // Mirrors are observational. A newer pending snapshot, if present,\n // still gets a chance after a transient lock or filesystem failure.\n }\n }\n } finally {\n activeMirrors.delete(key);\n // A mirror can arrive between the last Map read and deleting the active\n // marker. Re-arm once so that snapshot cannot be stranded.\n const pending = pendingMirrors.get(key);\n if (pending) {\n pendingMirrors.delete(key);\n queueLatestMirror(\n pending.projectRoot,\n pending.sessionId,\n pending.graph,\n pending.sourceSystem,\n );\n }\n }\n })();\n}\n\nexport function todoListToSerializedGraph(\n todos: readonly TodoItem[],\n sessionId: string,\n): SerializedTaskGraph {\n const nodes = todos.map((todo, index) => ({\n id: todo.id,\n title: todo.content,\n description: todo.activeForm ?? '',\n type: 'chore' as const,\n priority: 'medium' as const,\n status: todo.status,\n createdAt: index,\n updatedAt: index,\n }));\n return {\n id: `todo:${sessionId}`,\n specId: `todo:${sessionId}`,\n title: 'Session todos',\n nodes,\n edges: [],\n rootNodes: nodes.map((node) => node.id),\n createdAt: 0,\n updatedAt: 0,\n };\n}\n\nexport function taskFileToSerializedGraph(\n tasks: readonly TaskItem[],\n sessionId: string,\n): SerializedTaskGraph {\n const ids = new Set(tasks.map((task) => task.id));\n const nodes = tasks.map((task, index) => ({\n id: task.id,\n title: task.title,\n description: task.description ?? '',\n type: task.type,\n priority: task.priority,\n status: task.status,\n ...(task.assignee ? { assignee: task.assignee } : {}),\n ...(task.estimateHours !== undefined ? { estimateHours: task.estimateHours } : {}),\n createdAt: index,\n updatedAt: index,\n }));\n const edges = tasks.flatMap((task) =>\n (task.dependsOn ?? [])\n .filter((dependency) => ids.has(dependency))\n .map((dependency) => ({\n id: `${dependency}->${task.id}`,\n from: dependency,\n to: task.id,\n type: 'depends_on' as const,\n })),\n );\n const hasIncoming = new Set(edges.map((edge) => edge.to));\n const rootNodes = nodes.filter((node) => !hasIncoming.has(node.id)).map((node) => node.id);\n return {\n // Keep the historical graph id so existing mirrored task cards are reused.\n id: `session:${sessionId}`,\n specId: `session:${sessionId}`,\n title: 'Session tasks',\n nodes,\n edges,\n rootNodes: rootNodes.length ? rootNodes : nodes[0] ? [nodes[0].id] : [],\n createdAt: 0,\n updatedAt: 0,\n };\n}\n\nconst PLAN_STATUS_TO_TASK: Record<PlanItem['status'], TaskStatus> = {\n open: 'pending',\n in_progress: 'in_progress',\n done: 'completed',\n};\n\nexport function planFileToSerializedGraph(\n items: readonly PlanItem[],\n sessionId: string,\n): SerializedTaskGraph {\n const nodes = items.map((item, index) => ({\n id: item.id,\n title: item.title,\n description: item.details ?? '',\n type: 'chore' as const,\n priority: 'medium' as const,\n status: PLAN_STATUS_TO_TASK[item.status],\n createdAt: index,\n updatedAt: index,\n }));\n return {\n id: `plan:${sessionId}`,\n specId: `plan:${sessionId}`,\n title: 'Session plan',\n nodes,\n edges: [],\n rootNodes: nodes.map((node) => node.id),\n createdAt: 0,\n updatedAt: 0,\n };\n}\n\nexport function projectSessionTodosToKanban(\n projectRoot: string | undefined,\n todos: readonly TodoItem[],\n sessionId: string,\n): Promise<KanbanBoard | null> {\n return projectGraph(\n projectRoot,\n sessionId,\n todoListToSerializedGraph(todos, sessionId),\n 'session-todo',\n );\n}\n\nexport function projectSessionTasksToKanban(\n projectRoot: string | undefined,\n tasks: readonly TaskItem[],\n sessionId: string,\n): Promise<KanbanBoard | null> {\n return projectGraph(\n projectRoot,\n sessionId,\n taskFileToSerializedGraph(tasks, sessionId),\n 'session-task',\n );\n}\n\nexport function projectSessionPlanToKanban(\n projectRoot: string | undefined,\n items: readonly PlanItem[],\n sessionId: string,\n): Promise<KanbanBoard | null> {\n return projectGraph(\n projectRoot,\n sessionId,\n planFileToSerializedGraph(items, sessionId),\n 'session-plan',\n );\n}\n\nfunction fireAndForget(context: string, work: Promise<unknown>): void {\n void work.catch((err: unknown) => {\n const message = err instanceof Error ? err.message : String(err);\n console.warn(JSON.stringify({ level: 'warn', event: 'session-kanban', context, message, timestamp: new Date().toISOString() }));\n });\n}\n\nfunction broadcastTodoUpdate(context: Context, todos: readonly TodoItem[]): void {\n const sessionId = context.session?.id ?? '';\n if (!context.agentId || !sessionId) return;\n const projectDir = resolveWstackPaths({ projectRoot: context.projectRoot }).projectDir;\n const mailbox = getSharedProjectMailbox(projectDir);\n void mailbox\n .send({\n from: context.agentId,\n to: '*',\n type: 'status',\n subject: `Kanban todo list updated (${todos.length} item${todos.length === 1 ? '' : 's'})`,\n body: JSON.stringify({\n kind: 'kanban.todos.updated',\n sessionId,\n revision: context.state.revision,\n todos,\n }),\n priority: 'normal',\n senderSessionId: sessionId,\n ttlMs: 6 * 60 * 60 * 1000,\n })\n .catch(() => {\n // Mailbox awareness is best-effort; canonical state is already updated.\n });\n}\n\nfunction notifyTodoUpdate(context: Context, todos: readonly TodoItem[]): void {\n const summary = todos.length\n ? todos.map((todo) => `- [${todo.status}] ${todo.content} (${todo.id})`).join('\\n')\n : '- No active todos remain.';\n const text = `[KANBAN TODO UPDATE]\\nAnother Kanban agent reassessed the shared board. The canonical todo list is now:\\n${summary}\\nReassess your current plan before continuing; do not rely on the initial todo snapshot.`;\n const state = context.state as Partial<Context['state']>;\n if (typeof state.appendBlockToLastUserMessage === 'function') {\n if (state.appendBlockToLastUserMessage({ type: 'text', text })) return;\n }\n if (typeof state.appendMessage === 'function') {\n state.appendMessage({ role: 'user', content: [{ type: 'text', text }] });\n }\n}\n\nexport function mirrorSessionTodosToKanban(\n projectRoot: string | undefined,\n todos: readonly TodoItem[],\n sessionId: string,\n): void {\n queueLatestMirror(\n projectRoot,\n sessionId,\n todoListToSerializedGraph(todos, sessionId),\n 'session-todo',\n );\n}\n\nexport function mirrorSessionTasksToKanban(\n projectRoot: string | undefined,\n tasks: readonly TaskItem[],\n sessionId: string,\n): void {\n queueLatestMirror(\n projectRoot,\n sessionId,\n taskFileToSerializedGraph(tasks, sessionId),\n 'session-task',\n );\n}\n\nexport function mirrorSessionPlanToKanban(\n projectRoot: string | undefined,\n items: readonly PlanItem[],\n sessionId: string,\n): void {\n queueLatestMirror(\n projectRoot,\n sessionId,\n planFileToSerializedGraph(items, sessionId),\n 'session-plan',\n );\n}\n\n/**\n * Bind all live session work paths to Kanban. Todo changes are observed from\n * ConversationState; plan/task sidecars are watched so slash commands, WebUI,\n * plugins, and tools all pass through the same board.\n */\nexport function attachSessionKanbanMirror(context: Context): () => void {\n const existing = bindings.get(context);\n if (existing) return existing;\n\n const attachedProjectRoot = context.projectRoot ?? '';\n let registeredSessionId = '';\n const syncActiveSessionRegistration = () => {\n if (!attachedProjectRoot) return;\n const currentSessionId = context.session?.id ?? '';\n if (currentSessionId === registeredSessionId) return;\n if (registeredSessionId) {\n releaseActiveSessionBoard(attachedProjectRoot, registeredSessionId);\n fireAndForget(\n 'cleanup-board',\n cleanupSessionKanbanBoardIfEmpty(attachedProjectRoot, registeredSessionId),\n );\n }\n registeredSessionId = currentSessionId;\n if (registeredSessionId) {\n retainActiveSessionBoard(attachedProjectRoot, registeredSessionId);\n }\n };\n syncActiveSessionRegistration();\n\n let watcher: FSWatcher | null = null;\n let watchedDir = '';\n let timer: NodeJS.Timeout | null = null;\n let unsubscribeBoardEvents: (() => void) | null = null;\n let watchedBoardId = '';\n let boardTimer: NodeJS.Timeout | null = null;\n let presenceTimer: NodeJS.Timeout | null = null;\n\n const sessionId = () => context.session?.id ?? '';\n const refreshFiles = async () => {\n const id = sessionId();\n if (!id) return;\n const planPath = context.meta['plan.path'];\n if (typeof planPath === 'string' && planPath) {\n const plan = await loadPlan(planPath);\n if (plan) await projectSessionPlanToKanban(context.projectRoot, plan.items, id);\n }\n const taskPath = context.meta['task.path'];\n if (typeof taskPath === 'string' && taskPath) {\n const tasks = await loadTasks(taskPath);\n if (tasks) await projectSessionTasksToKanban(context.projectRoot, tasks.tasks, id);\n }\n };\n\n const refreshBoard = async () => {\n if (!watchedBoardId) return;\n const board = await getBoard(context.projectRoot, watchedBoardId);\n if (board) applySessionKanbanBoardToTodos(context, board);\n };\n\n const configureBoardWatcher = async () => {\n const id = sessionId();\n const board = id ? await ensureSessionKanbanBoard(context.projectRoot, id) : null;\n if (!board || board.id === watchedBoardId) return;\n unsubscribeBoardEvents?.();\n unsubscribeBoardEvents = null;\n watchedBoardId = board.id;\n try {\n unsubscribeBoardEvents = bridgeKanbanSupervisor(\n context.projectRoot,\n (event) => {\n const data = event.data as { boardId?: string } | undefined;\n if (data?.boardId !== board.id) return;\n if (boardTimer) clearTimeout(boardTimer);\n boardTimer = setTimeout(() => fireAndForget('refresh-board', refreshBoard()), 60);\n },\n { autoReconnect: true, reconnectDelayMs: 1_000 },\n );\n const touchPresence = () =>\n touchKanbanPresence(context.projectRoot, board.id, {\n sessionId: id,\n agentId: context.agentId,\n agentName: context.agentName,\n });\n fireAndForget('touch-presence', touchPresence());\n if (presenceTimer) clearInterval(presenceTimer);\n presenceTimer = setInterval(() => fireAndForget('touch-presence', touchPresence()), 60_000);\n presenceTimer.unref?.();\n } catch {\n unsubscribeBoardEvents = null;\n watchedBoardId = '';\n }\n };\n\n const configureWatcher = () => {\n const planPath = context.meta['plan.path'];\n const taskPath = context.meta['task.path'];\n const candidate =\n typeof planPath === 'string' && planPath\n ? dirname(planPath)\n : typeof taskPath === 'string' && taskPath\n ? dirname(taskPath)\n : '';\n if (!candidate || candidate === watchedDir) return;\n watcher?.close();\n watcher = null;\n watchedDir = candidate;\n try {\n watcher = watch(candidate, { persistent: false }, (_event, filename) => {\n const name = filename?.toString();\n const currentPlanPath = context.meta['plan.path'];\n const currentTaskPath = context.meta['task.path'];\n const planName = typeof currentPlanPath === 'string' ? basename(currentPlanPath) : '';\n const taskName = typeof currentTaskPath === 'string' ? basename(currentTaskPath) : '';\n if (name && name !== planName && name !== taskName) return;\n if (timer) clearTimeout(timer);\n timer = setTimeout(() => fireAndForget('refresh-files', refreshFiles()), 60);\n });\n watcher.on('error', () => watcher?.close());\n } catch {\n // The session directory can briefly disappear during project/session\n // switches; the next meta update re-attempts the binding.\n watcher = null;\n watchedDir = '';\n }\n };\n\n const unsubscribe = context.state.onChange((change) => {\n if (change.kind === 'todos_replaced' && !suppressedTodoMirrors.has(context)) {\n // ConversationState auto-clears an all-done tactical list. Project the\n // pre-clear completion snapshot so every card reaches Done atomically.\n mirrorSessionTodosToKanban(\n context.projectRoot,\n change.completedSnapshot ?? change.todos,\n sessionId(),\n );\n return;\n }\n if (change.kind === 'meta_set' && (change.key === 'plan.path' || change.key === 'task.path')) {\n syncActiveSessionRegistration();\n configureWatcher();\n fireAndForget('ensure-board', ensureSessionKanbanBoard(context.projectRoot, sessionId()));\n fireAndForget('configure-watcher', configureBoardWatcher());\n fireAndForget('refresh-files', refreshFiles());\n }\n });\n\n configureWatcher();\n fireAndForget('configure-watcher', configureBoardWatcher());\n\n const detach = () => {\n unsubscribe();\n if (timer) clearTimeout(timer);\n if (boardTimer) clearTimeout(boardTimer);\n if (presenceTimer) clearInterval(presenceTimer);\n watcher?.close();\n unsubscribeBoardEvents?.();\n bindings.delete(context);\n if (attachedProjectRoot && registeredSessionId) {\n releaseActiveSessionBoard(attachedProjectRoot, registeredSessionId);\n fireAndForget(\n 'cleanup-board',\n cleanupSessionKanbanBoardIfEmpty(attachedProjectRoot, registeredSessionId),\n );\n registeredSessionId = '';\n }\n };\n bindings.set(context, detach);\n return detach;\n}\n\n/** Fully hydrate a session board before a host announces the session as ready. */\nexport async function hydrateSessionKanban(context: Context): Promise<KanbanBoard | null> {\n const id = context.session?.id ?? '';\n if (!id) return null;\n await cleanupEmptySessionKanbanBoards(context.projectRoot, id);\n let board = await ensureSessionKanbanBoard(context.projectRoot, id);\n if (context.todos.length) {\n board = await projectSessionTodosToKanban(context.projectRoot, context.todos, id);\n }\n const planPath = context.meta['plan.path'];\n if (typeof planPath === 'string' && planPath) {\n const plan = await loadPlan(planPath);\n if (plan) board = await projectSessionPlanToKanban(context.projectRoot, plan.items, id);\n }\n const taskPath = context.meta['task.path'];\n if (typeof taskPath === 'string' && taskPath) {\n const tasks = await loadTasks(taskPath);\n if (tasks) board = await projectSessionTasksToKanban(context.projectRoot, tasks.tasks, id);\n }\n return board;\n}\n\nexport interface SessionKanbanSourceUpdate {\n source: 'todo' | 'task' | 'plan' | null;\n todos?: TodoItem[] | undefined;\n tasks?: TaskFile | undefined;\n plan?: PlanFile | undefined;\n}\n\nfunction sourceStatus(task: KanbanTask): TaskStatus {\n if (task.status === 'completed') return 'completed';\n if (task.status === 'in_progress') return 'in_progress';\n if (task.status === 'review') return 'review';\n if (task.status === 'blocked') return 'blocked';\n if (task.status === 'failed') return 'failed';\n return 'pending';\n}\n\nfunction todoStatus(task: KanbanTask): TodoItem['status'] {\n const status = sourceStatus(task);\n if (status === 'completed') return 'completed';\n if (status === 'in_progress' || status === 'review') return 'in_progress';\n return 'pending';\n}\n\nfunction sessionTodoFromTask(task: KanbanTask): TodoItem {\n return {\n id: task.origin?.taskId ?? task.id,\n content: task.title,\n status: todoStatus(task),\n ...(task.description ? { activeForm: task.description } : {}),\n };\n}\n\nfunction sameTodos(left: readonly TodoItem[], right: readonly TodoItem[]): boolean {\n return (\n left.length === right.length &&\n left.every((todo, index) => {\n const candidate = right[index];\n return (\n candidate?.id === todo.id &&\n candidate.content === todo.content &&\n candidate.status === todo.status &&\n candidate.activeForm === todo.activeForm &&\n candidate.promotedFromPlan === todo.promotedFromPlan &&\n candidate.promotedFromTask === todo.promotedFromTask\n );\n })\n );\n}\n\n/**\n * Replace the tactical todo list from the current cards on a session-owned board.\n *\n * Existing mirrored todo cards retain their stable source ids. New cards created\n * by a Kanban worker become todos under their card ids, so reassessment can add,\n * split, merge, reprioritize, or remove work without being overwritten by the\n * todo list that happened to exist when the run started.\n */\nexport function applySessionKanbanBoardToTodos(context: Context, board: KanbanBoard): TodoItem[] {\n const sessionId = context.session?.id ?? '';\n if (\n !sessionId ||\n sessionIdFromTags(board.tags) !== sessionId ||\n !isOwnedSessionBoard(board.tags)\n ) {\n return [...context.todos];\n }\n\n const projectedTodos = board.tasks\n .filter(\n (task) =>\n task.status !== 'archived' &&\n (!task.origin ||\n task.origin.system === 'session-todo' ||\n (task.origin.graphId ?? '').startsWith('todo:')),\n )\n .sort((left, right) => {\n const leftColumn = board.columns.find((column) => column.id === left.columnId)?.order ?? 0;\n const rightColumn = board.columns.find((column) => column.id === right.columnId)?.order ?? 0;\n return (\n leftColumn - rightColumn ||\n left.order - right.order ||\n left.createdAt.localeCompare(right.createdAt)\n );\n })\n .map(sessionTodoFromTask);\n\n const allCompleted =\n projectedTodos.length > 0 && projectedTodos.every((todo) => todo.status === 'completed');\n const effectiveTodos = allCompleted ? [] : projectedTodos;\n if (sameTodos(context.todos, effectiveTodos)) return [...context.todos];\n suppressedTodoMirrors.add(context);\n try {\n context.state.replaceTodos(projectedTodos);\n } finally {\n suppressedTodoMirrors.delete(context);\n }\n notifyTodoUpdate(context, context.todos);\n broadcastTodoUpdate(context, context.todos);\n return [...context.todos];\n}\n\n/** Reflect a TUI/WebUI Kanban card edit back to its originating work list. */\nexport async function applySessionKanbanTaskToSource(\n context: Context,\n task: KanbanTask,\n options: { remove?: boolean | undefined } = {},\n): Promise<SessionKanbanSourceUpdate> {\n const originId = task.origin?.taskId;\n const graphId = task.origin?.graphId ?? '';\n if (!originId) return { source: null };\n\n if (task.origin?.system === 'session-todo' || graphId.startsWith('todo:')) {\n const next = options.remove\n ? context.todos.filter((todo) => todo.id !== originId)\n : context.todos.map((todo) =>\n todo.id === originId\n ? {\n ...todo,\n content: task.title,\n status:\n sourceStatus(task) === 'completed'\n ? ('completed' as const)\n : sourceStatus(task) === 'in_progress' || sourceStatus(task) === 'review'\n ? ('in_progress' as const)\n : ('pending' as const),\n }\n : todo,\n );\n suppressedTodoMirrors.add(context);\n try {\n context.state.replaceTodos(next);\n } finally {\n suppressedTodoMirrors.delete(context);\n }\n return { source: 'todo', todos: [...context.todos] };\n }\n\n const id = context.session?.id ?? '';\n if (task.origin?.system === 'session-plan' || graphId.startsWith('plan:')) {\n const planPath = context.meta['plan.path'];\n if (typeof planPath !== 'string' || !planPath) return { source: 'plan' };\n const plan = await mutatePlan(planPath, id, (file) => ({\n ...file,\n updatedAt: new Date().toISOString(),\n items: options.remove\n ? file.items.filter((item) => item.id !== originId)\n : file.items.map((item) =>\n item.id === originId\n ? {\n ...item,\n title: task.title,\n details: task.description,\n status:\n task.status === 'completed'\n ? ('done' as const)\n : task.status === 'in_progress' || task.status === 'review'\n ? ('in_progress' as const)\n : ('open' as const),\n updatedAt: new Date().toISOString(),\n }\n : item,\n ),\n }));\n return { source: 'plan', plan };\n }\n\n if (\n task.origin?.system === 'session-task' ||\n task.origin?.system === 'session' ||\n graphId.startsWith('session:')\n ) {\n const taskPath = context.meta['task.path'];\n if (typeof taskPath !== 'string' || !taskPath) return { source: 'task' };\n const tasks = await mutateTasks(taskPath, id, (file) => ({\n ...file,\n tasks: options.remove\n ? file.tasks.filter((item) => item.id !== originId)\n : file.tasks.map((item) =>\n item.id === originId\n ? {\n ...item,\n title: task.title,\n description: task.description,\n status: sourceStatus(task),\n updatedAt: new Date().toISOString(),\n }\n : item,\n ),\n }));\n return { source: 'task', tasks };\n }\n\n return { source: null };\n}\n"],
5
- "mappings": "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",
6
- "names": ["deserializeTaskGraph", "loadTasks", "createBoard", "getBoard", "listBoards", "removeBoard", "syncBoardFromTaskGraph", "updateBoard", "updateTask", "verifyTaskCompletion", "getBoard", "touchKanbanPresence", "listBoards", "createBoard", "updateBoard", "removeBoard", "taskInput", "getBoard", "deserializeTaskGraph", "result", "syncBoardFromTaskGraph", "loadTasks", "updateTask", "verifyTaskCompletion"]
7
- }
@@ -1 +0,0 @@
1
- {"version":3,"file":"detect.d.ts","sourceRoot":"","sources":["../../src/languages/detect.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAGV,eAAe,EACf,qBAAqB,EAGtB,MAAM,YAAY,CAAC;AAwCpB,wBAAsB,wBAAwB,CAC5C,OAAO,EAAE,qBAAqB,GAC7B,OAAO,CAAC,eAAe,CAAC,CAsC1B"}