@astralyn/pi 0.82.5 → 0.82.7

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 (223) hide show
  1. package/CHANGELOG.md +55 -0
  2. package/README.md +1 -1
  3. package/dist/cli/project-trust.d.ts.map +1 -1
  4. package/dist/cli/project-trust.js +4 -1
  5. package/dist/cli/project-trust.js.map +1 -1
  6. package/dist/cli/session-picker.d.ts.map +1 -1
  7. package/dist/cli/session-picker.js +11 -13
  8. package/dist/cli/session-picker.js.map +1 -1
  9. package/dist/core/bash-executor.d.ts.map +1 -1
  10. package/dist/core/bash-executor.js +4 -22
  11. package/dist/core/bash-executor.js.map +1 -1
  12. package/dist/core/extensions/index.d.ts +1 -1
  13. package/dist/core/extensions/index.d.ts.map +1 -1
  14. package/dist/core/extensions/index.js.map +1 -1
  15. package/dist/core/extensions/types.d.ts +32 -5
  16. package/dist/core/extensions/types.d.ts.map +1 -1
  17. package/dist/core/extensions/types.js.map +1 -1
  18. package/dist/core/session-manager.d.ts.map +1 -1
  19. package/dist/core/session-manager.js +2 -2
  20. package/dist/core/session-manager.js.map +1 -1
  21. package/dist/core/tools/bash.d.ts +1 -5
  22. package/dist/core/tools/bash.d.ts.map +1 -1
  23. package/dist/core/tools/bash.js +16 -41
  24. package/dist/core/tools/bash.js.map +1 -1
  25. package/dist/core/tools/edit.d.ts.map +1 -1
  26. package/dist/core/tools/edit.js +42 -11
  27. package/dist/core/tools/edit.js.map +1 -1
  28. package/dist/core/tools/find.d.ts.map +1 -1
  29. package/dist/core/tools/find.js +6 -7
  30. package/dist/core/tools/find.js.map +1 -1
  31. package/dist/core/tools/grep.d.ts.map +1 -1
  32. package/dist/core/tools/grep.js +17 -8
  33. package/dist/core/tools/grep.js.map +1 -1
  34. package/dist/core/tools/ls.d.ts.map +1 -1
  35. package/dist/core/tools/ls.js +3 -3
  36. package/dist/core/tools/ls.js.map +1 -1
  37. package/dist/core/tools/output-accumulator.d.ts +3 -13
  38. package/dist/core/tools/output-accumulator.d.ts.map +1 -1
  39. package/dist/core/tools/output-accumulator.js +6 -36
  40. package/dist/core/tools/output-accumulator.js.map +1 -1
  41. package/dist/core/tools/read.d.ts.map +1 -1
  42. package/dist/core/tools/read.js +4 -4
  43. package/dist/core/tools/read.js.map +1 -1
  44. package/dist/core/tools/render-utils.d.ts +7 -0
  45. package/dist/core/tools/render-utils.d.ts.map +1 -1
  46. package/dist/core/tools/render-utils.js +11 -0
  47. package/dist/core/tools/render-utils.js.map +1 -1
  48. package/dist/core/tools/write.d.ts.map +1 -1
  49. package/dist/core/tools/write.js +2 -3
  50. package/dist/core/tools/write.js.map +1 -1
  51. package/dist/extensions/deepwiki/render.d.ts.map +1 -1
  52. package/dist/extensions/deepwiki/render.js +34 -22
  53. package/dist/extensions/deepwiki/render.js.map +1 -1
  54. package/dist/extensions/plan/constants.d.ts +43 -6
  55. package/dist/extensions/plan/constants.d.ts.map +1 -1
  56. package/dist/extensions/plan/constants.js +51 -8
  57. package/dist/extensions/plan/constants.js.map +1 -1
  58. package/dist/extensions/plan/index.d.ts +12 -3
  59. package/dist/extensions/plan/index.d.ts.map +1 -1
  60. package/dist/extensions/plan/index.js +173 -35
  61. package/dist/extensions/plan/index.js.map +1 -1
  62. package/dist/extensions/plan/schema.d.ts +5 -0
  63. package/dist/extensions/plan/schema.d.ts.map +1 -1
  64. package/dist/extensions/plan/schema.js.map +1 -1
  65. package/dist/extensions/plan/state.d.ts +11 -2
  66. package/dist/extensions/plan/state.d.ts.map +1 -1
  67. package/dist/extensions/plan/state.js +31 -9
  68. package/dist/extensions/plan/state.js.map +1 -1
  69. package/dist/extensions/plan/storage.d.ts +11 -3
  70. package/dist/extensions/plan/storage.d.ts.map +1 -1
  71. package/dist/extensions/plan/storage.js +45 -20
  72. package/dist/extensions/plan/storage.js.map +1 -1
  73. package/dist/extensions/plan/view.d.ts +44 -0
  74. package/dist/extensions/plan/view.d.ts.map +1 -0
  75. package/dist/extensions/plan/view.js +149 -0
  76. package/dist/extensions/plan/view.js.map +1 -0
  77. package/dist/extensions/question/dialog.d.ts.map +1 -1
  78. package/dist/extensions/question/dialog.js +29 -10
  79. package/dist/extensions/question/dialog.js.map +1 -1
  80. package/dist/extensions/question/index.d.ts.map +1 -1
  81. package/dist/extensions/question/index.js +7 -2
  82. package/dist/extensions/question/index.js.map +1 -1
  83. package/dist/extensions/question/render.d.ts +4 -8
  84. package/dist/extensions/question/render.d.ts.map +1 -1
  85. package/dist/extensions/question/render.js +202 -29
  86. package/dist/extensions/question/render.js.map +1 -1
  87. package/dist/extensions/question/results.d.ts.map +1 -1
  88. package/dist/extensions/question/results.js +1 -0
  89. package/dist/extensions/question/results.js.map +1 -1
  90. package/dist/extensions/question/schema.d.ts.map +1 -1
  91. package/dist/extensions/question/schema.js +2 -2
  92. package/dist/extensions/question/schema.js.map +1 -1
  93. package/dist/extensions/question/types.d.ts +1 -0
  94. package/dist/extensions/question/types.d.ts.map +1 -1
  95. package/dist/extensions/question/types.js +1 -1
  96. package/dist/extensions/question/types.js.map +1 -1
  97. package/dist/extensions/router/stream.d.ts +1 -0
  98. package/dist/extensions/router/stream.d.ts.map +1 -1
  99. package/dist/extensions/router/stream.js +75 -0
  100. package/dist/extensions/router/stream.js.map +1 -1
  101. package/dist/extensions/subagent/activity.d.ts.map +1 -1
  102. package/dist/extensions/subagent/activity.js +25 -4
  103. package/dist/extensions/subagent/activity.js.map +1 -1
  104. package/dist/extensions/subagent/constants.d.ts +1 -0
  105. package/dist/extensions/subagent/constants.d.ts.map +1 -1
  106. package/dist/extensions/subagent/constants.js +1 -0
  107. package/dist/extensions/subagent/constants.js.map +1 -1
  108. package/dist/extensions/subagent/index.d.ts.map +1 -1
  109. package/dist/extensions/subagent/index.js +16 -0
  110. package/dist/extensions/subagent/index.js.map +1 -1
  111. package/dist/extensions/subagent/render.d.ts.map +1 -1
  112. package/dist/extensions/subagent/render.js +352 -152
  113. package/dist/extensions/subagent/render.js.map +1 -1
  114. package/dist/extensions/subagent/resolve.d.ts.map +1 -1
  115. package/dist/extensions/subagent/resolve.js +13 -9
  116. package/dist/extensions/subagent/resolve.js.map +1 -1
  117. package/dist/extensions/subagent/retry.d.ts +17 -0
  118. package/dist/extensions/subagent/retry.d.ts.map +1 -0
  119. package/dist/extensions/subagent/retry.js +41 -0
  120. package/dist/extensions/subagent/retry.js.map +1 -0
  121. package/dist/extensions/subagent/runner.d.ts.map +1 -1
  122. package/dist/extensions/subagent/runner.js +37 -7
  123. package/dist/extensions/subagent/runner.js.map +1 -1
  124. package/dist/extensions/subagent/schema.d.ts.map +1 -1
  125. package/dist/extensions/subagent/schema.js +2 -2
  126. package/dist/extensions/subagent/schema.js.map +1 -1
  127. package/dist/extensions/subagent/sdk-runner.d.ts +6 -0
  128. package/dist/extensions/subagent/sdk-runner.d.ts.map +1 -1
  129. package/dist/extensions/subagent/sdk-runner.js +46 -24
  130. package/dist/extensions/subagent/sdk-runner.js.map +1 -1
  131. package/dist/extensions/subagent/types.d.ts +7 -0
  132. package/dist/extensions/subagent/types.d.ts.map +1 -1
  133. package/dist/extensions/subagent/types.js.map +1 -1
  134. package/dist/extensions/todo/constants.d.ts +17 -6
  135. package/dist/extensions/todo/constants.d.ts.map +1 -1
  136. package/dist/extensions/todo/constants.js +22 -9
  137. package/dist/extensions/todo/constants.js.map +1 -1
  138. package/dist/extensions/todo/index.d.ts +0 -14
  139. package/dist/extensions/todo/index.d.ts.map +1 -1
  140. package/dist/extensions/todo/index.js +13 -1
  141. package/dist/extensions/todo/index.js.map +1 -1
  142. package/dist/extensions/todo/schema.d.ts +53 -2
  143. package/dist/extensions/todo/schema.d.ts.map +1 -1
  144. package/dist/extensions/todo/schema.js +57 -8
  145. package/dist/extensions/todo/schema.js.map +1 -1
  146. package/dist/extensions/todo/state.d.ts +16 -5
  147. package/dist/extensions/todo/state.d.ts.map +1 -1
  148. package/dist/extensions/todo/state.js +874 -130
  149. package/dist/extensions/todo/state.js.map +1 -1
  150. package/dist/extensions/todo/view.d.ts +16 -1
  151. package/dist/extensions/todo/view.d.ts.map +1 -1
  152. package/dist/extensions/todo/view.js +428 -1
  153. package/dist/extensions/todo/view.js.map +1 -1
  154. package/dist/migrations.d.ts.map +1 -1
  155. package/dist/migrations.js +2 -1
  156. package/dist/migrations.js.map +1 -1
  157. package/dist/modes/interactive/components/armin.d.ts.map +1 -1
  158. package/dist/modes/interactive/components/armin.js +5 -0
  159. package/dist/modes/interactive/components/armin.js.map +1 -1
  160. package/dist/modes/interactive/components/bash-execution.d.ts +1 -0
  161. package/dist/modes/interactive/components/bash-execution.d.ts.map +1 -1
  162. package/dist/modes/interactive/components/bash-execution.js +4 -2
  163. package/dist/modes/interactive/components/bash-execution.js.map +1 -1
  164. package/dist/modes/interactive/components/countdown-timer.d.ts +13 -6
  165. package/dist/modes/interactive/components/countdown-timer.d.ts.map +1 -1
  166. package/dist/modes/interactive/components/countdown-timer.js +54 -17
  167. package/dist/modes/interactive/components/countdown-timer.js.map +1 -1
  168. package/dist/modes/interactive/components/extension-selector.d.ts +6 -1
  169. package/dist/modes/interactive/components/extension-selector.d.ts.map +1 -1
  170. package/dist/modes/interactive/components/extension-selector.js +23 -11
  171. package/dist/modes/interactive/components/extension-selector.js.map +1 -1
  172. package/dist/modes/interactive/components/keybinding-hints.d.ts +11 -1
  173. package/dist/modes/interactive/components/keybinding-hints.d.ts.map +1 -1
  174. package/dist/modes/interactive/components/keybinding-hints.js +56 -0
  175. package/dist/modes/interactive/components/keybinding-hints.js.map +1 -1
  176. package/dist/modes/interactive/components/session-selector.d.ts +3 -0
  177. package/dist/modes/interactive/components/session-selector.d.ts.map +1 -1
  178. package/dist/modes/interactive/components/session-selector.js +52 -2
  179. package/dist/modes/interactive/components/session-selector.js.map +1 -1
  180. package/dist/modes/interactive/components/tool-execution.d.ts +10 -0
  181. package/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  182. package/dist/modes/interactive/components/tool-execution.js +139 -18
  183. package/dist/modes/interactive/components/tool-execution.js.map +1 -1
  184. package/dist/modes/interactive/components/tool-group.d.ts +1 -0
  185. package/dist/modes/interactive/components/tool-group.d.ts.map +1 -1
  186. package/dist/modes/interactive/components/tool-group.js +5 -0
  187. package/dist/modes/interactive/components/tool-group.js.map +1 -1
  188. package/dist/modes/interactive/components/tree-selector.d.ts +10 -1
  189. package/dist/modes/interactive/components/tree-selector.d.ts.map +1 -1
  190. package/dist/modes/interactive/components/tree-selector.js +55 -2
  191. package/dist/modes/interactive/components/tree-selector.js.map +1 -1
  192. package/dist/modes/interactive/interactive-mode.d.ts +5 -0
  193. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  194. package/dist/modes/interactive/interactive-mode.js +79 -19
  195. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  196. package/dist/modes/interactive/theme/theme.d.ts.map +1 -1
  197. package/dist/modes/interactive/theme/theme.js +3 -2
  198. package/dist/modes/interactive/theme/theme.js.map +1 -1
  199. package/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
  200. package/dist/modes/rpc/rpc-mode.js +8 -1
  201. package/dist/modes/rpc/rpc-mode.js.map +1 -1
  202. package/dist/utils/paths.d.ts +6 -0
  203. package/dist/utils/paths.d.ts.map +1 -1
  204. package/dist/utils/paths.js +8 -0
  205. package/dist/utils/paths.js.map +1 -1
  206. package/docs/bundled/README.md +1 -0
  207. package/docs/bundled/extensions/deepwiki.md +1 -1
  208. package/docs/bundled/extensions/plan.md +13 -10
  209. package/docs/bundled/extensions/question.md +7 -5
  210. package/docs/bundled/extensions/router.md +3 -4
  211. package/docs/bundled/extensions/statusline.md +0 -1
  212. package/docs/bundled/extensions/subagent.md +5 -4
  213. package/docs/bundled/extensions/todo.md +9 -7
  214. package/docs/bundled/tool-presentation.md +17 -16
  215. package/docs/extensions.md +34 -5
  216. package/docs/rpc.md +1 -1
  217. package/docs/usage.md +1 -1
  218. package/npm-shrinkwrap.json +6 -6
  219. package/package.json +1 -1
  220. package/dist/utils/output-decoder.d.ts +0 -52
  221. package/dist/utils/output-decoder.d.ts.map +0 -1
  222. package/dist/utils/output-decoder.js +0 -134
  223. package/dist/utils/output-decoder.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"state.js","sourceRoot":"","sources":["../../../src/extensions/todo/state.ts"],"names":[],"mappings":"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","sourcesContent":["import { LIST_DISPLAY_MAX_ITEMS, TODO_TOOL_NAME } from \"./constants.ts\";\nimport {\n\tEMPTY_TODO_STATE,\n\ttype TodoAction,\n\ttype TodoDetails,\n\ttype TodoItem,\n\ttype TodoParams,\n\ttype TodoState,\n\ttype TodoStatus,\n} from \"./schema.ts\";\n\ntype Operation =\n\t| { kind: \"create\"; id: number }\n\t| {\n\t\t\tkind: \"update\";\n\t\t\tid: number;\n\t\t\tfrom: TodoStatus;\n\t\t\tto: TodoStatus;\n\t\t\t/** Other tasks auto-demoted from in_progress → pending to keep exactly one active. */\n\t\t\tdemotedIds?: number[];\n\t\t\t/** Pending dependents left fully unblocked by an update to status deleted. */\n\t\t\treleasedIds?: number[];\n\t\t\t/** Soft note when the list is fully closed without a verification-style task. */\n\t\t\tverificationNudge?: boolean;\n\t }\n\t| { kind: \"delete\"; id: number; subject: string; releasedIds?: number[] }\n\t| { kind: \"list\"; status?: TodoStatus; includeDeleted: boolean }\n\t| { kind: \"get\"; item: TodoItem }\n\t| { kind: \"clear\"; count: number }\n\t| { kind: \"error\"; message: string };\n\n/** Subjects/descriptions that count as a verification step (CC-style soft nudge). */\nconst VERIFICATION_PATTERN = /verif|test|check|review/i;\n\nexport interface MutationResult {\n\tstate: TodoState;\n\toperation: Operation;\n}\n\n// ---- per-session state ------------------------------------------------------\n// Keyed by session id like rewind's engine state: one Pi process can host more\n// than one session over its lifetime (resume, /tree branch switches), and a\n// module-level singleton would leak one session's list into another. Tool\n// renderers get no ctx, so the active session is a module-level pointer kept\n// current by execute and the lifecycle handlers (which do have ctx).\nconst states = new Map<string, TodoState>();\nlet activeSid = \"\";\n\n/** Point the module at a session's state bucket. Call wherever ctx is in hand. */\nexport function setActiveTodoSession(sid: string): void {\n\tactiveSid = sid;\n}\n\n/** Snapshot of the active session's state; mutate via applyTodoMutation + commitTodoState. */\nexport function getTodoState(): TodoState {\n\treturn cloneState(states.get(activeSid) ?? EMPTY_TODO_STATE);\n}\n\nexport function replaceTodoState(next: TodoState): void {\n\tstates.set(activeSid, cloneState(next));\n}\n\nexport function commitTodoState(next: TodoState): void {\n\treplaceTodoState(next);\n}\n\n/** Drop in-memory state for a session (call from session_shutdown). */\nexport function disposeTodoSession(sid: string): void {\n\tif (!sid) return;\n\tstates.delete(sid);\n\tif (activeSid === sid) activeSid = \"\";\n}\n\nexport function cloneState(source: TodoState): TodoState {\n\treturn {\n\t\titems: source.items.map((item) => {\n\t\t\tconst clone: TodoItem = { ...item };\n\t\t\tif (item.blockedBy) clone.blockedBy = [...item.blockedBy];\n\t\t\telse delete clone.blockedBy;\n\t\t\tif (item.metadata) clone.metadata = { ...item.metadata };\n\t\t\telse delete clone.metadata;\n\t\t\treturn clone;\n\t\t}),\n\t\tnextId: source.nextId,\n\t};\n}\n\nfunction omitBlockedBy(item: TodoItem): TodoItem {\n\tconst next = { ...item };\n\tdelete next.blockedBy;\n\treturn next;\n}\n\n/**\n * Keep a tombstone while detaching its id from every dependent task. Also\n * reports which pending dependents ended up fully unblocked, so the tool\n * result can tell the model what became workable (mirrors the demote note).\n */\nfunction markDeleted(state: TodoState, id: number): { state: TodoState; releasedIds: number[] } {\n\tconst items = state.items.map((item) => {\n\t\tif (item.id === id) return { ...item, status: \"deleted\" as const };\n\t\tif (!item.blockedBy?.includes(id)) return item;\n\t\tconst blockedBy = item.blockedBy.filter((dependencyId) => dependencyId !== id);\n\t\treturn blockedBy.length ? { ...item, blockedBy } : omitBlockedBy(item);\n\t});\n\tconst nextState: TodoState = { items, nextId: state.nextId };\n\tconst releasedIds = state.items\n\t\t.filter((item) => item.id !== id && item.status === \"pending\" && item.blockedBy?.includes(id))\n\t\t.map((item) => item.id)\n\t\t.filter((dependentId) => {\n\t\t\tconst dependent = findItem(nextState, dependentId);\n\t\t\treturn dependent !== undefined && unresolvedDependencyIds(nextState, dependent).length === 0;\n\t\t});\n\treturn { state: nextState, releasedIds };\n}\n\nfunction error(state: TodoState, message: string): MutationResult {\n\treturn { state, operation: { kind: \"error\", message } };\n}\n\n// ---- per-action parameter validation ---------------------------------------\n// Parameters each action accepts. Anything else is rejected with guidance\n// instead of being silently ignored (a model that passes blockedBy on update\n// should learn about addBlockedBy, not lose the edit).\nconst ACTION_PARAMS: Record<TodoAction, ReadonlySet<string>> = {\n\tcreate: new Set([\"subject\", \"description\", \"activeForm\", \"status\", \"blockedBy\", \"owner\", \"metadata\"]),\n\tupdate: new Set([\n\t\t\"id\",\n\t\t\"subject\",\n\t\t\"description\",\n\t\t\"activeForm\",\n\t\t\"status\",\n\t\t\"addBlockedBy\",\n\t\t\"removeBlockedBy\",\n\t\t\"addBlocks\",\n\t\t\"removeBlocks\",\n\t\t\"owner\",\n\t\t\"metadata\",\n\t]),\n\tlist: new Set([\"status\", \"includeDeleted\"]),\n\tget: new Set([\"id\"]),\n\tdelete: new Set([\"id\"]),\n\tclear: new Set<string>(),\n};\n\nconst UPDATE_ONLY_EDGE_PARAMS = new Set([\"addBlockedBy\", \"removeBlockedBy\", \"addBlocks\", \"removeBlocks\"]);\n\nfunction inapplicableParamError(action: TodoAction, key: string): string {\n\tif (action === \"update\" && key === \"blockedBy\") {\n\t\treturn \"blockedBy is create-only; use addBlockedBy/removeBlockedBy on update\";\n\t}\n\tif (action === \"create\" && UPDATE_ONLY_EDGE_PARAMS.has(key)) {\n\t\treturn `${key} is update-only; use blockedBy on create`;\n\t}\n\treturn `${key} does not apply to action ${action}`;\n}\n\nfunction findInapplicableParam(params: TodoParams): string | undefined {\n\tconst allowed = ACTION_PARAMS[params.action];\n\tfor (const [key, value] of Object.entries(params)) {\n\t\tif (key === \"action\" || value === undefined) continue;\n\t\tif (!allowed.has(key)) return inapplicableParamError(params.action, key);\n\t}\n\treturn undefined;\n}\n\nfunction isTransitionAllowed(from: TodoStatus, to: TodoStatus): boolean {\n\t// `deleted` is the only terminal status; `completed` can be reopened to\n\t// in_progress or pending so a premature completion recovers without losing\n\t// the task id and its blockedBy edges.\n\tif (from === to) return true;\n\tif (from === \"deleted\") return false;\n\tif (to === \"deleted\") return true;\n\tif (to === \"completed\") return from === \"pending\" || from === \"in_progress\";\n\tif (to === \"pending\") return from === \"in_progress\" || from === \"completed\";\n\tif (to === \"in_progress\") return from === \"pending\" || from === \"completed\";\n\treturn false;\n}\n\nfunction findItem(state: TodoState, id: number): TodoItem | undefined {\n\treturn state.items.find((item) => item.id === id);\n}\n\nfunction validateDependencies(state: TodoState, deps: number[] | undefined, currentId?: number): string | undefined {\n\tif (!deps?.length) return undefined;\n\tfor (const dep of deps) {\n\t\tif (dep === currentId) return `cannot block #${currentId} on itself`;\n\t\tconst item = findItem(state, dep);\n\t\tif (!item) return `blockedBy: #${dep} not found`;\n\t\tif (item.status === \"deleted\") return `blockedBy: #${dep} is deleted`;\n\t}\n\treturn undefined;\n}\n\n/** All listed dependencies must be completed before starting or closing a task. */\nfunction validateDependenciesReady(state: TodoState, deps: number[] | undefined): string | undefined {\n\tif (!deps?.length) return undefined;\n\tfor (const dep of deps) {\n\t\tconst item = findItem(state, dep);\n\t\tif (!item || item.status !== \"completed\") {\n\t\t\treturn `blockedBy: complete #${dep} before starting or finishing this task`;\n\t\t}\n\t}\n\treturn undefined;\n}\n\n/** IDs of dependencies that still prevent a task from starting or completing. */\nexport function unresolvedDependencyIds(state: TodoState, item: TodoItem): number[] {\n\treturn (item.blockedBy ?? []).filter((id) => findItem(state, id)?.status !== \"completed\");\n}\n\n/** True when every blockedBy dependency is completed (for transition and overlay checks). */\nexport function dependenciesSatisfied(state: TodoState, item: TodoItem): boolean {\n\treturn unresolvedDependencyIds(state, item).length === 0;\n}\n\n/** True when any task whose deps change in nextDepsById can reach itself through blockedBy edges. */\nfunction createsCycle(items: TodoItem[], nextDepsById: ReadonlyMap<number, number[]>): boolean {\n\tconst depsById = new Map<number, number[]>();\n\tfor (const item of items) depsById.set(item.id, item.blockedBy ?? []);\n\tfor (const [id, deps] of nextDepsById) depsById.set(id, deps);\n\n\tconst seen = new Set<number>();\n\tconst stack = new Set<number>();\n\n\tfunction visit(node: number): boolean {\n\t\tif (stack.has(node)) return true;\n\t\tif (seen.has(node)) return false;\n\t\tseen.add(node);\n\t\tstack.add(node);\n\t\tfor (const dep of depsById.get(node) ?? []) {\n\t\t\tif (visit(dep)) return true;\n\t\t}\n\t\tstack.delete(node);\n\t\treturn false;\n\t}\n\n\tfor (const id of nextDepsById.keys()) {\n\t\tif (visit(id)) return true;\n\t}\n\treturn false;\n}\n\nexport function applyTodoMutation(input: TodoState, params: TodoParams): MutationResult {\n\tconst state = cloneState(input);\n\n\tconst inapplicable = findInapplicableParam(params);\n\tif (inapplicable) return error(state, inapplicable);\n\n\tswitch (params.action) {\n\t\tcase \"create\": {\n\t\t\tconst subject = params.subject?.trim();\n\t\t\tif (!subject) return error(state, \"subject required for create\");\n\t\t\tif (!params.description?.trim()) {\n\t\t\t\treturn error(state, \"description required for create: state what done means for this task\");\n\t\t\t}\n\t\t\tif (params.status !== undefined && params.status !== \"pending\") {\n\t\t\t\treturn error(state, \"create always starts pending; use update to start or complete a task\");\n\t\t\t}\n\t\t\tconst dependencyError = validateDependencies(state, params.blockedBy);\n\t\t\tif (dependencyError) return error(state, dependencyError);\n\n\t\t\tconst item: TodoItem = {\n\t\t\t\tid: state.nextId,\n\t\t\t\tsubject,\n\t\t\t\tstatus: \"pending\",\n\t\t\t\tdescription: params.description,\n\t\t\t};\n\t\t\tif (params.activeForm) item.activeForm = params.activeForm;\n\t\t\tif (params.blockedBy?.length) item.blockedBy = Array.from(new Set<number>(params.blockedBy));\n\t\t\tif (params.owner) item.owner = params.owner;\n\t\t\tif (params.metadata) item.metadata = { ...params.metadata };\n\n\t\t\treturn {\n\t\t\t\tstate: { items: [...state.items, item], nextId: state.nextId + 1 },\n\t\t\t\toperation: { kind: \"create\", id: item.id },\n\t\t\t};\n\t\t}\n\n\t\tcase \"update\": {\n\t\t\tif (params.id === undefined) return error(state, \"id required for update\");\n\t\t\tconst index = state.items.findIndex((item) => item.id === params.id);\n\t\t\tif (index === -1) return error(state, `#${params.id} not found`);\n\t\t\tconst current = state.items[index];\n\t\t\tif (current.status === \"deleted\") return error(state, `#${params.id} is deleted and cannot be updated`);\n\t\t\tif (params.subject !== undefined && !params.subject.trim()) return error(state, \"subject cannot be empty\");\n\n\t\t\tconst edgeChange =\n\t\t\t\t(params.addBlockedBy?.length ?? 0) > 0 ||\n\t\t\t\t(params.removeBlockedBy?.length ?? 0) > 0 ||\n\t\t\t\t(params.addBlocks?.length ?? 0) > 0 ||\n\t\t\t\t(params.removeBlocks?.length ?? 0) > 0;\n\t\t\tconst fieldChange =\n\t\t\t\tparams.subject !== undefined ||\n\t\t\t\tparams.description !== undefined ||\n\t\t\t\tparams.activeForm !== undefined ||\n\t\t\t\tparams.owner !== undefined ||\n\t\t\t\tparams.metadata !== undefined;\n\t\t\tif (!fieldChange && !edgeChange && params.status === undefined) {\n\t\t\t\treturn error(state, \"update requires at least one field\");\n\t\t\t}\n\n\t\t\t// `status: deleted` is the update form of delete; keep its dependency\n\t\t\t// cleanup identical to the dedicated delete action. Other edits do not\n\t\t\t// combine with it: a tombstone is immutable, so applying them would\n\t\t\t// silently produce an unreachable revision.\n\t\t\tif (params.status === \"deleted\") {\n\t\t\t\tif (fieldChange || edgeChange) {\n\t\t\t\t\treturn error(\n\t\t\t\t\t\tstate,\n\t\t\t\t\t\t\"status deleted cannot be combined with other changes; apply edits first or delete in a separate call\",\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tconst deleted = markDeleted(state, current.id);\n\t\t\t\treturn {\n\t\t\t\t\tstate: deleted.state,\n\t\t\t\t\toperation: {\n\t\t\t\t\t\tkind: \"update\",\n\t\t\t\t\t\tid: current.id,\n\t\t\t\t\t\tfrom: current.status,\n\t\t\t\t\t\tto: \"deleted\",\n\t\t\t\t\t\t...(deleted.releasedIds.length ? { releasedIds: deleted.releasedIds } : {}),\n\t\t\t\t\t},\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tconst nextStatus = params.status ?? current.status;\n\t\t\tif (!isTransitionAllowed(current.status, nextStatus)) {\n\t\t\t\treturn error(state, `illegal transition ${current.status} -> ${nextStatus}`);\n\t\t\t}\n\n\t\t\t// Collect every task whose blockedBy changes: this task (addBlockedBy /\n\t\t\t// removeBlockedBy) plus reverse-edge targets (addBlocks / removeBlocks).\n\t\t\tconst nextDepsById = new Map<number, number[]>();\n\t\t\tlet nextDeps = current.blockedBy ? [...current.blockedBy] : [];\n\t\t\tif (params.removeBlockedBy?.length) {\n\t\t\t\tconst remove = new Set(params.removeBlockedBy);\n\t\t\t\tnextDeps = nextDeps.filter((id) => !remove.has(id));\n\t\t\t}\n\t\t\tif (params.addBlockedBy?.length) {\n\t\t\t\tconst dependencyError = validateDependencies(state, params.addBlockedBy, current.id);\n\t\t\t\tif (dependencyError) return error(state, dependencyError);\n\t\t\t\tfor (const dep of params.addBlockedBy) {\n\t\t\t\t\tif (!nextDeps.includes(dep)) nextDeps.push(dep);\n\t\t\t\t}\n\t\t\t}\n\t\t\tnextDepsById.set(current.id, nextDeps);\n\n\t\t\tif (params.removeBlocks?.length) {\n\t\t\t\tconst release = new Set(params.removeBlocks);\n\t\t\t\tfor (const candidate of state.items) {\n\t\t\t\t\tif (!release.has(candidate.id) || !candidate.blockedBy?.includes(current.id)) continue;\n\t\t\t\t\tnextDepsById.set(\n\t\t\t\t\t\tcandidate.id,\n\t\t\t\t\t\tcandidate.blockedBy.filter((dependencyId) => dependencyId !== current.id),\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (params.addBlocks?.length) {\n\t\t\t\tfor (const targetId of params.addBlocks) {\n\t\t\t\t\tif (targetId === current.id) return error(state, `cannot block #${targetId} on itself`);\n\t\t\t\t\tconst target = findItem(state, targetId);\n\t\t\t\t\tif (!target) return error(state, `addBlocks: #${targetId} not found`);\n\t\t\t\t\tif (target.status === \"deleted\") return error(state, `addBlocks: #${targetId} is deleted`);\n\t\t\t\t\tconst deps = nextDepsById.get(targetId) ?? (target.blockedBy ? [...target.blockedBy] : []);\n\t\t\t\t\tif (!deps.includes(current.id)) deps.push(current.id);\n\t\t\t\t\tnextDepsById.set(targetId, deps);\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (createsCycle(state.items, nextDepsById)) {\n\t\t\t\treturn error(state, \"blockedBy would create a cycle\");\n\t\t\t}\n\n\t\t\t// Readiness gates only status *changes*: an already-active task may take\n\t\t\t// on a new incomplete dependency — a prerequisite discovered mid-work.\n\t\t\t// The overlay flags it as \"deps incomplete\" instead.\n\t\t\tif ((nextStatus === \"in_progress\" || nextStatus === \"completed\") && current.status !== nextStatus) {\n\t\t\t\tconst readyError = validateDependenciesReady(state, nextDeps);\n\t\t\t\tif (readyError) return error(state, readyError);\n\t\t\t}\n\n\t\t\tconst updated: TodoItem = { ...current, status: nextStatus };\n\t\t\tif (params.subject !== undefined) updated.subject = params.subject.trim();\n\t\t\t// Empty string removes an optional text field (metadata uses null keys).\n\t\t\tif (params.description !== undefined) {\n\t\t\t\tif (params.description) updated.description = params.description;\n\t\t\t\telse delete updated.description;\n\t\t\t}\n\t\t\tif (params.activeForm !== undefined) {\n\t\t\t\tif (params.activeForm) updated.activeForm = params.activeForm;\n\t\t\t\telse delete updated.activeForm;\n\t\t\t}\n\t\t\tif (params.owner !== undefined) {\n\t\t\t\tif (params.owner) updated.owner = params.owner;\n\t\t\t\telse delete updated.owner;\n\t\t\t}\n\t\t\tif (nextDeps.length) updated.blockedBy = nextDeps;\n\t\t\telse delete updated.blockedBy;\n\n\t\t\tif (params.metadata !== undefined) {\n\t\t\t\tconst merged = { ...(current.metadata ?? {}) };\n\t\t\t\tfor (const [key, value] of Object.entries(params.metadata)) {\n\t\t\t\t\tif (value === null) delete merged[key];\n\t\t\t\t\telse merged[key] = value;\n\t\t\t\t}\n\t\t\t\tif (Object.keys(merged).length) updated.metadata = merged;\n\t\t\t\telse delete updated.metadata;\n\t\t\t}\n\n\t\t\tconst items = state.items.map((task) => {\n\t\t\t\tif (task.id === current.id) return task;\n\t\t\t\tconst deps = nextDepsById.get(task.id);\n\t\t\t\tif (deps === undefined) return task;\n\t\t\t\treturn deps.length ? { ...task, blockedBy: deps } : omitBlockedBy(task);\n\t\t\t});\n\t\t\titems[index] = updated;\n\n\t\t\t// Exactly one in_progress: demote any other active tasks to pending.\n\t\t\tconst demotedIds: number[] = [];\n\t\t\tif (nextStatus === \"in_progress\") {\n\t\t\t\tfor (let i = 0; i < items.length; i++) {\n\t\t\t\t\tconst item = items[i];\n\t\t\t\t\tif (item.id === updated.id) continue;\n\t\t\t\t\tif (item.status !== \"in_progress\") continue;\n\t\t\t\t\titems[i] = { ...item, status: \"pending\" };\n\t\t\t\t\tdemotedIds.push(item.id);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst nextState: TodoState = { items, nextId: state.nextId };\n\t\t\tconst newlyCompleted = current.status !== \"completed\" && nextStatus === \"completed\";\n\t\t\treturn {\n\t\t\t\tstate: nextState,\n\t\t\t\toperation: {\n\t\t\t\t\tkind: \"update\",\n\t\t\t\t\tid: updated.id,\n\t\t\t\t\tfrom: current.status,\n\t\t\t\t\tto: updated.status,\n\t\t\t\t\t...(demotedIds.length ? { demotedIds } : {}),\n\t\t\t\t\t...(newlyCompleted && needsVerificationNudge(nextState) ? { verificationNudge: true } : {}),\n\t\t\t\t},\n\t\t\t};\n\t\t}\n\n\t\tcase \"list\":\n\t\t\treturn {\n\t\t\t\tstate,\n\t\t\t\toperation: {\n\t\t\t\t\tkind: \"list\",\n\t\t\t\t\tstatus: params.status,\n\t\t\t\t\tincludeDeleted: params.includeDeleted === true,\n\t\t\t\t},\n\t\t\t};\n\n\t\tcase \"get\": {\n\t\t\tif (params.id === undefined) return error(state, \"id required for get\");\n\t\t\tconst item = findItem(state, params.id);\n\t\t\tif (!item) return error(state, `#${params.id} not found`);\n\t\t\treturn { state, operation: { kind: \"get\", item } };\n\t\t}\n\n\t\tcase \"delete\": {\n\t\t\tif (params.id === undefined) return error(state, \"id required for delete\");\n\t\t\tconst index = state.items.findIndex((item) => item.id === params.id);\n\t\t\tif (index === -1) return error(state, `#${params.id} not found`);\n\t\t\tconst current = state.items[index];\n\t\t\tif (current.status === \"deleted\") return error(state, `#${params.id} is already deleted`);\n\n\t\t\tconst deleted = markDeleted(state, current.id);\n\t\t\treturn {\n\t\t\t\tstate: deleted.state,\n\t\t\t\toperation: {\n\t\t\t\t\tkind: \"delete\",\n\t\t\t\t\tid: current.id,\n\t\t\t\t\tsubject: current.subject,\n\t\t\t\t\t...(deleted.releasedIds.length ? { releasedIds: deleted.releasedIds } : {}),\n\t\t\t\t},\n\t\t\t};\n\t\t}\n\n\t\tcase \"clear\":\n\t\t\treturn {\n\t\t\t\t// IDs remain monotonic across a clear so stale references cannot point\n\t\t\t\t// at an unrelated task created later on the same conversation branch.\n\t\t\t\tstate: { items: [], nextId: state.nextId },\n\t\t\t\toperation: { kind: \"clear\", count: state.items.length },\n\t\t\t};\n\t}\n\n\treturn error(state, `unknown action: ${(params as { action?: unknown }).action}`);\n}\n\nfunction isTodoDetails(value: unknown): value is TodoDetails {\n\tif (!value || typeof value !== \"object\") return false;\n\tconst record = value as Record<string, unknown>;\n\treturn Array.isArray(record.items) && typeof record.nextId === \"number\";\n}\n\nexport function replayTodosFromBranch(ctx: { sessionManager: { getBranch(): Iterable<unknown> } }): TodoState {\n\t// Latest todo toolResult wins; scan tail → head so long branches stop early.\n\tconst branch = Array.from(ctx.sessionManager.getBranch());\n\tfor (let i = branch.length - 1; i >= 0; i--) {\n\t\tconst item = branch[i] as {\n\t\t\ttype?: string;\n\t\t\tmessage?: { role?: string; toolName?: string; details?: unknown };\n\t\t};\n\t\tif (item.type !== \"message\") continue;\n\t\tif (item.message?.role !== \"toolResult\" || item.message.toolName !== TODO_TOOL_NAME) continue;\n\t\tif (!isTodoDetails(item.message.details)) continue;\n\t\treturn cloneState({\n\t\t\titems: item.message.details.items,\n\t\t\tnextId: item.message.details.nextId,\n\t\t});\n\t}\n\treturn cloneState(EMPTY_TODO_STATE);\n}\n\nexport function buildTodoDetails(params: TodoParams, next: TodoState): TodoDetails {\n\treturn {\n\t\taction: params.action,\n\t\tparams: params as Record<string, unknown>,\n\t\titems: cloneState(next).items,\n\t\tnextId: next.nextId,\n\t};\n}\n\nconst VERIFICATION_NUDGE_NOTE =\n\t\"NOTE: You closed out 3+ tasks with no verification/test/review step. Before the final summary, run checks or add a verification task and complete it — do not self-declare done with known failures.\";\n\nfunction formatReleasedSuffix(releasedIds: number[] | undefined): string {\n\tif (!releasedIds?.length) return \"\";\n\treturn `; released ${releasedIds.map((id) => `#${id}`).join(\",\")} (no longer blocked)`;\n}\n\nexport function formatTodoContent(operation: Operation, state: TodoState): string {\n\tswitch (operation.kind) {\n\t\tcase \"create\": {\n\t\t\tconst item = findItem(state, operation.id);\n\t\t\treturn item ? `Created #${item.id}: ${item.subject} (pending)` : `Created #${operation.id}`;\n\t\t}\n\t\tcase \"update\": {\n\t\t\tconst transition = operation.from === operation.to ? \"\" : ` (${operation.from} -> ${operation.to})`;\n\t\t\tlet text = `Updated #${operation.id}${transition}`;\n\t\t\tif (operation.demotedIds?.length) {\n\t\t\t\ttext += `; ${operation.demotedIds.map((id) => `#${id}`).join(\",\")} demoted to pending`;\n\t\t\t}\n\t\t\ttext += formatReleasedSuffix(operation.releasedIds);\n\t\t\tif (operation.verificationNudge) text += `\\n\\n${VERIFICATION_NUDGE_NOTE}`;\n\t\t\treturn text;\n\t\t}\n\t\tcase \"delete\":\n\t\t\treturn `Deleted #${operation.id}: ${operation.subject}${formatReleasedSuffix(operation.releasedIds)}`;\n\t\tcase \"clear\":\n\t\t\treturn `Cleared ${operation.count} tasks`;\n\t\tcase \"list\": {\n\t\t\tlet view = state.items;\n\t\t\t// An explicit deleted-status query is sufficient intent to include tombstones.\n\t\t\tif (!operation.includeDeleted && operation.status !== \"deleted\")\n\t\t\t\tview = view.filter((item) => item.status !== \"deleted\");\n\t\t\tif (operation.status) view = view.filter((item) => item.status === operation.status);\n\t\t\treturn formatBoundedList(view, state, operation.status);\n\t\t}\n\t\tcase \"get\":\n\t\t\treturn formatDetailItem(operation.item, state);\n\t\tcase \"error\":\n\t\t\treturn `Error: ${operation.message}`;\n\t}\n}\n\n/**\n * Soft nudge when the whole list is done (no active work), there are 3+ completed\n * tasks, and none look like a verification/test/review step — mirrors CC TodoWrite.\n */\nfunction needsVerificationNudge(state: TodoState): boolean {\n\tconst active = state.items.filter((item) => item.status !== \"deleted\");\n\tif (active.length < 3) return false;\n\tif (active.some((item) => item.status === \"pending\" || item.status === \"in_progress\")) return false;\n\tconst completed = active.filter((item) => item.status === \"completed\");\n\tif (completed.length < 3) return false;\n\treturn !completed.some(\n\t\t(item) =>\n\t\t\tVERIFICATION_PATTERN.test(item.subject) ||\n\t\t\t(item.description !== undefined && VERIFICATION_PATTERN.test(item.description)),\n\t);\n}\n\nfunction formatBoundedList(view: TodoItem[], state: TodoState, statusFilter: TodoStatus | undefined): string {\n\tif (!view.length) return \"No tasks\";\n\tconst shown = view.slice(0, LIST_DISPLAY_MAX_ITEMS);\n\tconst lines = shown.map((item) => formatListItem(item, state));\n\tconst omitted = view.length - shown.length;\n\tif (omitted > 0) {\n\t\t// Do not suggest a filter that is already applied.\n\t\tconst hint = statusFilter ? \"use get with id= for details\" : \"narrow with status= or use get with id=\";\n\t\tlines.push(`… and ${omitted} more (${shown.length} of ${view.length} shown); ${hint}.`);\n\t}\n\treturn lines.join(\"\\n\");\n}\n\nfunction formatListItem(item: TodoItem, state: TodoState): string {\n\tconst unresolved = unresolvedDependencyIds(state, item);\n\tconst deps = unresolved.length ? ` blockedBy=${unresolved.map((id) => `#${id}`).join(\",\")}` : \"\";\n\tconst owner = item.owner ? ` @${item.owner}` : \"\";\n\tconst active = item.status === \"in_progress\" && item.activeForm ? ` (${item.activeForm})` : \"\";\n\treturn `[${item.status}] #${item.id} ${item.subject}${active}${owner}${deps}`;\n}\n\nfunction formatDetailItem(item: TodoItem, state: TodoState): string {\n\tconst lines = [`#${item.id} [${item.status}] ${item.subject}`];\n\tif (item.description) lines.push(`description: ${item.description}`);\n\tif (item.activeForm) lines.push(`activeForm: ${item.activeForm}`);\n\tif (item.blockedBy?.length) lines.push(`blockedBy: ${item.blockedBy.map((id) => `#${id}`).join(\", \")}`);\n\tconst blocks = state.items\n\t\t.filter((candidate) => candidate.blockedBy?.includes(item.id))\n\t\t.map((candidate) => candidate.id);\n\tif (blocks.length) lines.push(`blocks: ${blocks.map((id) => `#${id}`).join(\", \")}`);\n\tif (item.owner) lines.push(`owner: ${item.owner}`);\n\treturn lines.join(\"\\n\");\n}\n"]}
1
+ {"version":3,"file":"state.js","sourceRoot":"","sources":["../../../src/extensions/todo/state.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n\tLIST_DISPLAY_MAX_ITEMS,\n\tTODO_MAX_ACTIVE_FORM_LENGTH,\n\tTODO_MAX_BATCH_ITEMS,\n\tTODO_MAX_BATCH_KEY_LENGTH,\n\tTODO_MAX_BLOCKED_BY,\n\tTODO_MAX_DESCRIPTION_LENGTH,\n\tTODO_MAX_LIST_LIMIT,\n\tTODO_MAX_LIST_QUERY_LENGTH,\n\tTODO_MAX_METADATA_BYTES,\n\tTODO_MAX_METADATA_DEPTH,\n\tTODO_MAX_METADATA_ENTRIES,\n\tTODO_MAX_METADATA_KEY_LENGTH,\n\tTODO_MAX_OWNER_LENGTH,\n\tTODO_MAX_SUBJECT_LENGTH,\n\tTODO_TOOL_NAME,\n} from \"./constants.ts\";\nimport {\n\tEMPTY_TODO_STATE,\n\tTODO_DETAILS_SCHEMA_VERSION,\n\ttype TodoAction,\n\ttype TodoDetails,\n\ttype TodoItem,\n\ttype TodoOperationSummary,\n\ttype TodoParams,\n\ttype TodoState,\n\ttype TodoStatus,\n} from \"./schema.ts\";\n\ntype Operation =\n\t| { kind: \"create\"; id: number }\n\t| { kind: \"create_many\"; ids: number[] }\n\t| {\n\t\t\tkind: \"update\";\n\t\t\tid: number;\n\t\t\tfrom: TodoStatus;\n\t\t\tto: TodoStatus;\n\t\t\t/** Other tasks auto-demoted from in_progress → pending to keep exactly one active. */\n\t\t\tdemotedIds?: number[];\n\t\t\t/** Active tasks demoted because a new dependency is still incomplete. */\n\t\t\tblockedIds?: number[];\n\t\t\t/** Pending dependents left fully unblocked by an update to status deleted. */\n\t\t\treleasedIds?: number[];\n\t\t\t/** Soft note when the list is fully closed without a verification-style task. */\n\t\t\tverificationNudge?: boolean;\n\t }\n\t| {\n\t\t\tkind: \"list\";\n\t\t\tstatus?: TodoStatus;\n\t\t\tincludeDeleted: boolean;\n\t\t\tlimit: number;\n\t\t\tafterId?: number;\n\t\t\tquery?: string;\n\t\t\tunblockedOnly: boolean;\n\t\t\t/** Keep the historical no-options list text stable. */\n\t\t\tlegacyOutput: boolean;\n\t }\n\t| { kind: \"get\"; item: TodoItem }\n\t| { kind: \"delete\"; id: number; subject: string; releasedIds?: number[] }\n\t| { kind: \"clear\"; count: number }\n\t| { kind: \"error\"; message: string };\n\n/** Subjects/descriptions that count as a verification step (CC-style soft nudge). */\nconst VERIFICATION_PATTERN = /verif|test|check|review/i;\nconst TODO_STATUSES: ReadonlySet<TodoStatus> = new Set([\"pending\", \"in_progress\", \"completed\", \"deleted\"]);\nconst TODO_ACTIONS: ReadonlySet<TodoAction> = new Set([\n\t\"create\",\n\t\"create_many\",\n\t\"update\",\n\t\"list\",\n\t\"get\",\n\t\"delete\",\n\t\"clear\",\n]);\nconst LEGACY_METADATA_LIMITS = {\n\tmaxDepth: 64,\n\tmaxEntries: 100_000,\n\tmaxBytes: 16 * 1024 * 1024,\n};\n\ninterface MetadataLimits {\n\tmaxDepth: number;\n\tmaxEntries: number;\n\tmaxBytes: number;\n\tmaxKeyLength?: number;\n}\n\ninterface MetadataStats {\n\tentries: number;\n\tbytes: number;\n}\n\ninterface ValidMetadata {\n\tmetadata: Record<string, unknown>;\n}\n\ninterface InvalidMetadata {\n\terror: string;\n}\n\ntype MetadataValidation = ValidMetadata | InvalidMetadata;\n\ninterface BatchItem {\n\tkey?: string;\n\tsubject: string;\n\tdescription: string;\n\tactiveForm?: string;\n\tblockedBy: number[];\n\tblockedByKeys: string[];\n\towner?: string;\n\tmetadata?: Record<string, unknown>;\n}\n\nexport interface MutationResult {\n\tstate: TodoState;\n\toperation: Operation;\n}\n\n// ---- per-session state ------------------------------------------------------\n// Keyed by session id like rewind's engine state: one Pi process can host more\n// than one session over its lifetime (resume, /tree branch switches), and a\n// module-level singleton would leak one session's list into another. Tool\n// renderers get no ctx, so the active session is a module-level pointer kept\n// current by execute and the lifecycle handlers (which do have ctx).\nconst states = new Map<string, TodoState>();\nlet activeSid = \"\";\n\n/** Point the module at a session's state bucket. Call wherever ctx is in hand. */\nexport function setActiveTodoSession(sid: string): void {\n\tactiveSid = sid;\n}\n\n/** Snapshot of the active session's state; mutate via applyTodoMutation + commitTodoState. */\nexport function getTodoState(): TodoState {\n\treturn cloneState(states.get(activeSid) ?? EMPTY_TODO_STATE);\n}\n\nexport function replaceTodoState(next: TodoState): void {\n\tstates.set(activeSid, cloneState(next));\n}\n\nexport function commitTodoState(next: TodoState): void {\n\treplaceTodoState(next);\n}\n\n/** Drop in-memory state for a session (call from session_shutdown). */\nexport function disposeTodoSession(sid: string): void {\n\tif (!sid) return;\n\tstates.delete(sid);\n\tif (activeSid === sid) activeSid = \"\";\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n\treturn value !== null && typeof value === \"object\" && !Array.isArray(value);\n}\n\nfunction isPlainRecord(value: unknown): value is Record<string, unknown> {\n\tif (!isRecord(value)) return false;\n\tconst prototype = Object.getPrototypeOf(value);\n\treturn prototype === Object.prototype || prototype === null;\n}\n\nfunction isPositiveInteger(value: unknown): value is number {\n\treturn typeof value === \"number\" && Number.isSafeInteger(value) && value >= 1;\n}\n\nfunction isTodoStatus(value: unknown): value is TodoStatus {\n\treturn typeof value === \"string\" && TODO_STATUSES.has(value as TodoStatus);\n}\n\nfunction isTodoAction(value: unknown): value is TodoAction {\n\treturn typeof value === \"string\" && TODO_ACTIONS.has(value as TodoAction);\n}\n\nfunction jsonStringUtf8Bytes(value: string): number {\n\tlet bytes = 2; // JSON quotes\n\tfor (let index = 0; index < value.length; index++) {\n\t\tconst code = value.charCodeAt(index);\n\t\tif (\n\t\t\tcode === 0x22 ||\n\t\t\tcode === 0x5c ||\n\t\t\tcode === 0x08 ||\n\t\t\tcode === 0x0c ||\n\t\t\tcode === 0x0a ||\n\t\t\tcode === 0x0d ||\n\t\t\tcode === 0x09\n\t\t) {\n\t\t\tbytes += 2;\n\t\t\tcontinue;\n\t\t}\n\t\tif (code <= 0x1f) {\n\t\t\tbytes += 6;\n\t\t\tcontinue;\n\t\t}\n\t\tif (code >= 0xd800 && code <= 0xdbff) {\n\t\t\tconst next = value.charCodeAt(index + 1);\n\t\t\tif (next >= 0xdc00 && next <= 0xdfff) {\n\t\t\t\tbytes += 4;\n\t\t\t\tindex++;\n\t\t\t} else {\n\t\t\t\tbytes += 6; // JSON escapes lone surrogates.\n\t\t\t}\n\t\t\tcontinue;\n\t\t}\n\t\tif (code >= 0xdc00 && code <= 0xdfff) {\n\t\t\tbytes += 6;\n\t\t\tcontinue;\n\t\t}\n\t\tbytes += code <= 0x7f ? 1 : code <= 0x7ff ? 2 : 3;\n\t}\n\treturn bytes;\n}\n\nfunction addMetadataBytes(stats: MetadataStats, amount: number, limits: MetadataLimits): void {\n\tstats.bytes += amount;\n\tif (stats.bytes > limits.maxBytes) throw new Error(`metadata exceeds ${limits.maxBytes} UTF-8 bytes`);\n}\n\nfunction addMetadataEntry(stats: MetadataStats, limits: MetadataLimits): void {\n\tstats.entries++;\n\tif (stats.entries > limits.maxEntries) throw new Error(`metadata exceeds ${limits.maxEntries} entries`);\n}\n\n/**\n * Validate and clone JSON-like values without using JSON.stringify as the\n * validator. This rejects cycles, accessors, non-finite numbers, functions,\n * symbols, bigint, undefined, and non-plain object instances.\n */\nfunction cloneJsonValue(\n\tvalue: unknown,\n\tdepth: number,\n\tancestors: WeakSet<object>,\n\tstats: MetadataStats,\n\tlimits: MetadataLimits,\n): unknown {\n\tif (depth > limits.maxDepth) throw new Error(`metadata exceeds depth ${limits.maxDepth}`);\n\tif (value === null) {\n\t\taddMetadataBytes(stats, 4, limits);\n\t\treturn null;\n\t}\n\tif (typeof value === \"string\") {\n\t\taddMetadataBytes(stats, jsonStringUtf8Bytes(value), limits);\n\t\treturn value;\n\t}\n\tif (typeof value === \"boolean\") {\n\t\taddMetadataBytes(stats, value ? 4 : 5, limits);\n\t\treturn value;\n\t}\n\tif (typeof value === \"number\") {\n\t\tif (!Number.isFinite(value)) throw new Error(\"metadata numbers must be finite\");\n\t\taddMetadataBytes(stats, Buffer.byteLength(String(value), \"utf8\"), limits);\n\t\treturn value;\n\t}\n\tif (typeof value !== \"object\") throw new Error(\"metadata must contain only JSON-like values\");\n\tif (ancestors.has(value)) throw new Error(\"metadata cannot contain cycles\");\n\n\tancestors.add(value);\n\ttry {\n\t\tif (Array.isArray(value)) {\n\t\t\tif (value.length > limits.maxEntries - stats.entries) {\n\t\t\t\tthrow new Error(`metadata exceeds ${limits.maxEntries} entries`);\n\t\t\t}\n\t\t\tconst ownKeys = Object.keys(value);\n\t\t\tif (ownKeys.length !== value.length)\n\t\t\t\tthrow new Error(\"metadata arrays cannot be sparse or have extra properties\");\n\t\t\tconst copy: unknown[] = [];\n\t\t\taddMetadataBytes(stats, 2, limits);\n\t\t\tfor (let index = 0; index < value.length; index++) {\n\t\t\t\taddMetadataEntry(stats, limits);\n\t\t\t\tif (index > 0) addMetadataBytes(stats, 1, limits);\n\t\t\t\tconst descriptor = Object.getOwnPropertyDescriptor(value, String(index));\n\t\t\t\tif (!descriptor || !(\"value\" in descriptor)) throw new Error(\"metadata cannot contain accessors\");\n\t\t\t\tcopy.push(cloneJsonValue(descriptor.value, depth + 1, ancestors, stats, limits));\n\t\t\t}\n\t\t\treturn copy;\n\t\t}\n\n\t\tif (!isPlainRecord(value)) throw new Error(\"metadata objects must be plain objects\");\n\t\tconst copy: Record<string, unknown> = {};\n\t\tconst keys = Object.keys(value);\n\t\tif (keys.length > limits.maxEntries - stats.entries) {\n\t\t\tthrow new Error(`metadata exceeds ${limits.maxEntries} entries`);\n\t\t}\n\t\taddMetadataBytes(stats, 2, limits);\n\t\tfor (let index = 0; index < keys.length; index++) {\n\t\t\tconst key = keys[index];\n\t\t\tif (limits.maxKeyLength !== undefined && key.length > limits.maxKeyLength) {\n\t\t\t\tthrow new Error(`metadata keys exceed ${limits.maxKeyLength} characters`);\n\t\t\t}\n\t\t\tconst descriptor = Object.getOwnPropertyDescriptor(value, key);\n\t\t\tif (!descriptor || !(\"value\" in descriptor)) throw new Error(\"metadata cannot contain accessors\");\n\t\t\taddMetadataEntry(stats, limits);\n\t\t\tif (index > 0) addMetadataBytes(stats, 1, limits);\n\t\t\taddMetadataBytes(stats, jsonStringUtf8Bytes(key) + 1, limits);\n\t\t\tObject.defineProperty(copy, key, {\n\t\t\t\tvalue: cloneJsonValue(descriptor.value, depth + 1, ancestors, stats, limits),\n\t\t\t\tenumerable: true,\n\t\t\t\twritable: true,\n\t\t\t\tconfigurable: true,\n\t\t\t});\n\t\t}\n\t\treturn copy;\n\t} finally {\n\t\tancestors.delete(value);\n\t}\n}\n\nfunction validateAndCloneMetadata(value: unknown, limits: MetadataLimits): MetadataValidation {\n\tif (!isPlainRecord(value)) return { error: \"metadata must be a plain object\" };\n\ttry {\n\t\tconst cloned = cloneJsonValue(value, 1, new WeakSet<object>(), { entries: 0, bytes: 0 }, limits);\n\t\tif (!isPlainRecord(cloned)) return { error: \"metadata must be a plain object\" };\n\t\treturn { metadata: cloned };\n\t} catch (error) {\n\t\treturn { error: error instanceof Error ? error.message : \"metadata is invalid\" };\n\t}\n}\n\nfunction cloneStoredMetadata(value: Record<string, unknown>): Record<string, unknown> | undefined {\n\tconst result = validateAndCloneMetadata(value, LEGACY_METADATA_LIMITS);\n\treturn \"metadata\" in result ? result.metadata : undefined;\n}\n\nexport function cloneState(source: TodoState): TodoState {\n\treturn {\n\t\titems: source.items.map((item) => {\n\t\t\tconst clone: TodoItem = { ...item };\n\t\t\tif (item.blockedBy) clone.blockedBy = [...item.blockedBy];\n\t\t\telse delete clone.blockedBy;\n\t\t\tif (item.metadata) {\n\t\t\t\tconst metadata = cloneStoredMetadata(item.metadata);\n\t\t\t\tif (metadata) clone.metadata = metadata;\n\t\t\t\telse delete clone.metadata;\n\t\t\t} else delete clone.metadata;\n\t\t\treturn clone;\n\t\t}),\n\t\tnextId: source.nextId,\n\t};\n}\n\nfunction omitBlockedBy(item: TodoItem): TodoItem {\n\tconst next = { ...item };\n\tdelete next.blockedBy;\n\treturn next;\n}\n\n/**\n * Keep a tombstone while detaching its id from every dependent task. Also\n * reports which pending dependents ended up fully unblocked, so the tool\n * result can tell the model what became workable (mirrors the demote note).\n */\nfunction markDeleted(state: TodoState, id: number): { state: TodoState; releasedIds: number[] } {\n\tconst items = state.items.map((item) => {\n\t\tif (item.id === id) return { ...item, status: \"deleted\" as const };\n\t\tif (!item.blockedBy?.includes(id)) return item;\n\t\tconst blockedBy = item.blockedBy.filter((dependencyId) => dependencyId !== id);\n\t\treturn blockedBy.length ? { ...item, blockedBy } : omitBlockedBy(item);\n\t});\n\tconst nextState: TodoState = { items, nextId: state.nextId };\n\tconst releasedIds = state.items\n\t\t.filter((item) => item.id !== id && item.status === \"pending\" && item.blockedBy?.includes(id))\n\t\t.map((item) => item.id)\n\t\t.filter((dependentId) => {\n\t\t\tconst dependent = findItem(nextState, dependentId);\n\t\t\treturn dependent !== undefined && unresolvedDependencyIds(nextState, dependent).length === 0;\n\t\t});\n\treturn { state: nextState, releasedIds };\n}\n\nfunction error(state: TodoState, message: string): MutationResult {\n\treturn { state, operation: { kind: \"error\", message } };\n}\n\n// ---- per-action parameter validation ---------------------------------------\n// Parameters each action accepts. Anything else is rejected with guidance\n// instead of being silently ignored (a model that passes blockedBy on update\n// should learn about addBlockedBy, not lose the edit).\nconst ACTION_PARAMS: Record<TodoAction, ReadonlySet<string>> = {\n\tcreate: new Set([\"subject\", \"description\", \"activeForm\", \"status\", \"blockedBy\", \"owner\", \"metadata\"]),\n\tcreate_many: new Set([\"items\"]),\n\tupdate: new Set([\n\t\t\"id\",\n\t\t\"subject\",\n\t\t\"description\",\n\t\t\"activeForm\",\n\t\t\"status\",\n\t\t\"addBlockedBy\",\n\t\t\"removeBlockedBy\",\n\t\t\"addBlocks\",\n\t\t\"removeBlocks\",\n\t\t\"owner\",\n\t\t\"metadata\",\n\t]),\n\tlist: new Set([\"status\", \"includeDeleted\", \"limit\", \"afterId\", \"query\", \"unblockedOnly\"]),\n\tget: new Set([\"id\"]),\n\tdelete: new Set([\"id\"]),\n\tclear: new Set([\"confirm\", \"expectedCount\"]),\n};\n\nconst UPDATE_ONLY_EDGE_PARAMS = new Set([\"addBlockedBy\", \"removeBlockedBy\", \"addBlocks\", \"removeBlocks\"]);\n\nfunction inapplicableParamError(action: TodoAction, key: string): string {\n\tif (action === \"update\" && key === \"blockedBy\") {\n\t\treturn \"blockedBy is create-only; use addBlockedBy/removeBlockedBy on update\";\n\t}\n\tif (action === \"create\" && UPDATE_ONLY_EDGE_PARAMS.has(key)) {\n\t\treturn `${key} is update-only; use blockedBy on create`;\n\t}\n\treturn `${key} does not apply to action ${action}`;\n}\n\nfunction findInapplicableParam(params: TodoParams): string | undefined {\n\tconst allowed = ACTION_PARAMS[params.action];\n\tfor (const [key, value] of Object.entries(params)) {\n\t\tif (key === \"action\" || value === undefined) continue;\n\t\tif (!allowed.has(key)) return inapplicableParamError(params.action, key);\n\t}\n\treturn undefined;\n}\n\nfunction validateBoundedString(value: unknown, label: string, maximum: number): string | undefined {\n\tif (typeof value !== \"string\") return `${label} must be a string`;\n\tif (value.length > maximum) return `${label} exceeds ${maximum} characters`;\n\treturn undefined;\n}\n\nfunction validateTaskTextFields(params: TodoParams, requireDescription: boolean): string | undefined {\n\tif (params.subject !== undefined) {\n\t\tconst subjectError = validateBoundedString(params.subject, \"subject\", TODO_MAX_SUBJECT_LENGTH);\n\t\tif (subjectError) return subjectError;\n\t}\n\tif (params.description !== undefined) {\n\t\tconst descriptionError = validateBoundedString(params.description, \"description\", TODO_MAX_DESCRIPTION_LENGTH);\n\t\tif (descriptionError) return descriptionError;\n\t}\n\tif (params.activeForm !== undefined) {\n\t\tconst activeFormError = validateBoundedString(params.activeForm, \"activeForm\", TODO_MAX_ACTIVE_FORM_LENGTH);\n\t\tif (activeFormError) return activeFormError;\n\t}\n\tif (params.owner !== undefined) {\n\t\tconst ownerError = validateBoundedString(params.owner, \"owner\", TODO_MAX_OWNER_LENGTH);\n\t\tif (ownerError) return ownerError;\n\t}\n\tif (params.subject !== undefined && !params.subject.trim()) return \"subject cannot be empty\";\n\tif (requireDescription && !params.description?.trim()) {\n\t\treturn \"description required for create: state what done means for this task\";\n\t}\n\treturn undefined;\n}\n\nfunction validateIdArray(value: unknown, label: string): number[] | string {\n\tif (value === undefined) return [];\n\tif (!Array.isArray(value)) return `${label} must be an array`;\n\tif (value.length > TODO_MAX_BLOCKED_BY) return `${label} exceeds ${TODO_MAX_BLOCKED_BY} ids`;\n\tconst ids: number[] = [];\n\tfor (const id of value) {\n\t\tif (!isPositiveInteger(id)) return `${label} must contain positive integer ids`;\n\t\tif (!ids.includes(id)) ids.push(id);\n\t}\n\treturn ids;\n}\n\nfunction isTransitionAllowed(from: TodoStatus, to: TodoStatus): boolean {\n\t// `deleted` is the only terminal status; `completed` can be reopened to\n\t// in_progress or pending so a premature completion recovers without losing\n\t// the task id and its blockedBy edges.\n\tif (from === to) return true;\n\tif (from === \"deleted\") return false;\n\tif (to === \"deleted\") return true;\n\tif (to === \"completed\") return from === \"pending\" || from === \"in_progress\";\n\tif (to === \"pending\") return from === \"in_progress\" || from === \"completed\";\n\tif (to === \"in_progress\") return from === \"pending\" || from === \"completed\";\n\treturn false;\n}\n\nfunction findItem(state: TodoState, id: number): TodoItem | undefined {\n\treturn state.items.find((item) => item.id === id);\n}\n\nfunction validateDependencies(state: TodoState, deps: number[], currentId?: number): string | undefined {\n\tfor (const dep of deps) {\n\t\tif (dep === currentId) return `cannot block #${currentId} on itself`;\n\t\tconst item = findItem(state, dep);\n\t\tif (!item) return `blockedBy: #${dep} not found`;\n\t\tif (item.status === \"deleted\") return `blockedBy: #${dep} is deleted`;\n\t}\n\treturn undefined;\n}\n\n/** All listed dependencies must be completed before starting or closing a task. */\nfunction validateDependenciesReady(state: TodoState, deps: number[]): string | undefined {\n\tfor (const dep of deps) {\n\t\tconst item = findItem(state, dep);\n\t\tif (!item || item.status !== \"completed\") {\n\t\t\treturn `blockedBy: complete #${dep} before starting or finishing this task`;\n\t\t}\n\t}\n\treturn undefined;\n}\n\n/** IDs of dependencies that still prevent a task from starting or completing. */\nexport function unresolvedDependencyIds(state: TodoState, item: TodoItem): number[] {\n\treturn (item.blockedBy ?? []).filter((id) => findItem(state, id)?.status !== \"completed\");\n}\n\n/** True when every blockedBy dependency is completed (for transition and overlay checks). */\nexport function dependenciesSatisfied(state: TodoState, item: TodoItem): boolean {\n\treturn unresolvedDependencyIds(state, item).length === 0;\n}\n\n/** True when the resulting dependency graph contains a cycle. */\nfunction createsCycle(items: TodoItem[], nextDepsById: ReadonlyMap<number, number[]>): boolean {\n\tconst depsById = new Map<number, number[]>();\n\tfor (const item of items) depsById.set(item.id, item.blockedBy ?? []);\n\tfor (const [id, deps] of nextDepsById) depsById.set(id, deps);\n\n\t// An iterative color walk keeps replay and dependency edits safe for long,\n\t// valid chains that would overflow the JavaScript call stack recursively.\n\tconst colors = new Map<number, 0 | 1 | 2>();\n\tconst stack: Array<{ id: number; nextDependencyIndex: number }> = [];\n\tfor (const initialId of depsById.keys()) {\n\t\tif ((colors.get(initialId) ?? 0) !== 0) continue;\n\t\tcolors.set(initialId, 1);\n\t\tstack.push({ id: initialId, nextDependencyIndex: 0 });\n\n\t\twhile (stack.length) {\n\t\t\tconst frame = stack[stack.length - 1]!;\n\t\t\tconst dependencies = depsById.get(frame.id) ?? [];\n\t\t\tif (frame.nextDependencyIndex >= dependencies.length) {\n\t\t\t\tcolors.set(frame.id, 2);\n\t\t\t\tstack.pop();\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst dependencyId = dependencies[frame.nextDependencyIndex]!;\n\t\t\tframe.nextDependencyIndex++;\n\t\t\tif (!depsById.has(dependencyId)) continue;\n\t\t\tconst color = colors.get(dependencyId) ?? 0;\n\t\t\tif (color === 1) return true;\n\t\t\tif (color === 2) continue;\n\t\t\tcolors.set(dependencyId, 1);\n\t\t\tstack.push({ id: dependencyId, nextDependencyIndex: 0 });\n\t\t}\n\t}\n\treturn false;\n}\n\nfunction validateAndNormalizeBatch(params: TodoParams, state: TodoState): BatchItem[] | string {\n\tconst rawItems: unknown = (params as Record<string, unknown>).items;\n\tif (!Array.isArray(rawItems) || rawItems.length === 0) return \"items required for create_many\";\n\tif (rawItems.length > TODO_MAX_BATCH_ITEMS) return `items exceeds ${TODO_MAX_BATCH_ITEMS} tasks`;\n\n\tconst allowedKeys = new Set([\n\t\t\"key\",\n\t\t\"subject\",\n\t\t\"description\",\n\t\t\"activeForm\",\n\t\t\"blockedBy\",\n\t\t\"blockedByKeys\",\n\t\t\"owner\",\n\t\t\"metadata\",\n\t]);\n\tconst batch: BatchItem[] = [];\n\tconst keys = new Map<string, number>();\n\tfor (let index = 0; index < rawItems.length; index++) {\n\t\tconst raw = rawItems[index];\n\t\tif (!isPlainRecord(raw)) return `items[${index}] must be an object`;\n\t\tfor (const property of Object.keys(raw)) {\n\t\t\tif (!allowedKeys.has(property)) return `items[${index}].${property} does not apply to create_many`;\n\t\t}\n\t\tconst taskParams = raw as TodoParams;\n\t\tif (typeof raw.subject !== \"string\" || !raw.subject.trim())\n\t\t\treturn `items[${index}]: subject required for create_many`;\n\t\tconst taskTextError = validateTaskTextFields(taskParams, true);\n\t\tif (taskTextError) return `items[${index}]: ${taskTextError}`;\n\n\t\tlet key: string | undefined;\n\t\tif (raw.key !== undefined) {\n\t\t\tconst keyError = validateBoundedString(raw.key, \"key\", TODO_MAX_BATCH_KEY_LENGTH);\n\t\t\tif (keyError) return `items[${index}]: ${keyError}`;\n\t\t\tkey = (raw.key as string).trim();\n\t\t\tif (!key) return `items[${index}]: key cannot be empty`;\n\t\t\tif (keys.has(key)) return `items[${index}]: duplicate key ${key}`;\n\t\t\tkeys.set(key, index);\n\t\t}\n\n\t\tconst blockedBy = validateIdArray(raw.blockedBy, `items[${index}].blockedBy`);\n\t\tif (typeof blockedBy === \"string\") return blockedBy;\n\t\tconst blockedByError = validateDependencies(state, blockedBy);\n\t\tif (blockedByError) return `items[${index}]: ${blockedByError}`;\n\n\t\tconst rawBlockedByKeys = raw.blockedByKeys;\n\t\tif (rawBlockedByKeys !== undefined && !Array.isArray(rawBlockedByKeys)) {\n\t\t\treturn `items[${index}].blockedByKeys must be an array`;\n\t\t}\n\t\tif (Array.isArray(rawBlockedByKeys) && rawBlockedByKeys.length > TODO_MAX_BLOCKED_BY) {\n\t\t\treturn `items[${index}].blockedByKeys exceeds ${TODO_MAX_BLOCKED_BY} keys`;\n\t\t}\n\t\tconst blockedByKeys: string[] = [];\n\t\tfor (const reference of rawBlockedByKeys ?? []) {\n\t\t\tconst referenceError = validateBoundedString(reference, \"blockedByKeys\", TODO_MAX_BATCH_KEY_LENGTH);\n\t\t\tif (referenceError) return `items[${index}]: ${referenceError}`;\n\t\t\tconst normalizedReference = (reference as string).trim();\n\t\t\tif (!normalizedReference) return `items[${index}]: blockedByKeys cannot contain an empty key`;\n\t\t\tif (!blockedByKeys.includes(normalizedReference)) blockedByKeys.push(normalizedReference);\n\t\t}\n\n\t\tlet metadata: Record<string, unknown> | undefined;\n\t\tif (raw.metadata !== undefined) {\n\t\t\tconst metadataResult = validateAndCloneMetadata(raw.metadata, {\n\t\t\t\tmaxDepth: TODO_MAX_METADATA_DEPTH,\n\t\t\t\tmaxEntries: TODO_MAX_METADATA_ENTRIES,\n\t\t\t\tmaxBytes: TODO_MAX_METADATA_BYTES,\n\t\t\t\tmaxKeyLength: TODO_MAX_METADATA_KEY_LENGTH,\n\t\t\t});\n\t\t\tif (\"error\" in metadataResult) return `items[${index}]: ${metadataResult.error}`;\n\t\t\tmetadata = metadataResult.metadata;\n\t\t}\n\n\t\tbatch.push({\n\t\t\t...(key ? { key } : {}),\n\t\t\tsubject: (raw.subject as string).trim(),\n\t\t\tdescription: raw.description as string,\n\t\t\t...(raw.activeForm ? { activeForm: raw.activeForm as string } : {}),\n\t\t\tblockedBy,\n\t\t\tblockedByKeys,\n\t\t\t...(raw.owner ? { owner: raw.owner as string } : {}),\n\t\t\t...(metadata ? { metadata } : {}),\n\t\t});\n\t}\n\n\tfor (let index = 0; index < batch.length; index++) {\n\t\tfor (const key of batch[index].blockedByKeys) {\n\t\t\tif (!keys.has(key)) return `items[${index}]: blockedByKeys references missing key ${key}`;\n\t\t\tif (key === batch[index].key) return `items[${index}]: cannot block a task on itself`;\n\t\t}\n\t}\n\treturn batch;\n}\n\nfunction createMany(state: TodoState, params: TodoParams): MutationResult {\n\tconst batch = validateAndNormalizeBatch(params, state);\n\tif (typeof batch === \"string\") return error(state, batch);\n\tif (\n\t\t!Number.isSafeInteger(state.nextId) ||\n\t\tstate.nextId < 1 ||\n\t\tstate.nextId + batch.length - 1 > Number.MAX_SAFE_INTEGER\n\t) {\n\t\treturn error(state, \"next id is invalid or exhausted\");\n\t}\n\n\tconst idsByKey = new Map<string, number>();\n\tfor (let index = 0; index < batch.length; index++) {\n\t\tconst key = batch[index].key;\n\t\tif (key) idsByKey.set(key, state.nextId + index);\n\t}\n\tconst created = batch.map((source, index) => {\n\t\tconst blockedBy = [...source.blockedBy];\n\t\tfor (const key of source.blockedByKeys) {\n\t\t\tconst id = idsByKey.get(key);\n\t\t\tif (id !== undefined && !blockedBy.includes(id)) blockedBy.push(id);\n\t\t}\n\t\tconst item: TodoItem = {\n\t\t\tid: state.nextId + index,\n\t\t\tsubject: source.subject,\n\t\t\tdescription: source.description,\n\t\t\tstatus: \"pending\",\n\t\t};\n\t\tif (source.activeForm) item.activeForm = source.activeForm;\n\t\tif (blockedBy.length) item.blockedBy = blockedBy;\n\t\tif (source.owner) item.owner = source.owner;\n\t\tif (source.metadata) item.metadata = source.metadata;\n\t\treturn item;\n\t});\n\tconst batchEdges = new Map<number, number[]>();\n\tfor (const item of created) batchEdges.set(item.id, item.blockedBy ?? []);\n\tif (createsCycle([...state.items, ...created], batchEdges)) return error(state, \"blockedBy would create a cycle\");\n\n\treturn {\n\t\tstate: { items: [...state.items, ...created], nextId: state.nextId + created.length },\n\t\toperation: { kind: \"create_many\", ids: created.map((item) => item.id) },\n\t};\n}\n\nexport function applyTodoMutation(input: TodoState, params: TodoParams): MutationResult {\n\tconst state = cloneState(input);\n\tif (!isTodoAction(params.action)) return error(state, `unknown action: ${String(params.action)}`);\n\n\tconst inapplicable = findInapplicableParam(params);\n\tif (inapplicable) return error(state, inapplicable);\n\n\tswitch (params.action) {\n\t\tcase \"create\": {\n\t\t\tif (typeof params.subject !== \"string\" || !params.subject.trim())\n\t\t\t\treturn error(state, \"subject required for create\");\n\t\t\tconst taskTextError = validateTaskTextFields(params, true);\n\t\t\tif (taskTextError) return error(state, taskTextError);\n\t\t\tif (params.status !== undefined && params.status !== \"pending\") {\n\t\t\t\treturn error(state, \"create always starts pending; use update to start or complete a task\");\n\t\t\t}\n\t\t\tconst blockedBy = validateIdArray(params.blockedBy, \"blockedBy\");\n\t\t\tif (typeof blockedBy === \"string\") return error(state, blockedBy);\n\t\t\tconst dependencyError = validateDependencies(state, blockedBy);\n\t\t\tif (dependencyError) return error(state, dependencyError);\n\n\t\t\tlet metadata: Record<string, unknown> | undefined;\n\t\t\tif (params.metadata !== undefined) {\n\t\t\t\tconst metadataResult = validateAndCloneMetadata(params.metadata, {\n\t\t\t\t\tmaxDepth: TODO_MAX_METADATA_DEPTH,\n\t\t\t\t\tmaxEntries: TODO_MAX_METADATA_ENTRIES,\n\t\t\t\t\tmaxBytes: TODO_MAX_METADATA_BYTES,\n\t\t\t\t\tmaxKeyLength: TODO_MAX_METADATA_KEY_LENGTH,\n\t\t\t\t});\n\t\t\t\tif (\"error\" in metadataResult) return error(state, metadataResult.error);\n\t\t\t\tmetadata = metadataResult.metadata;\n\t\t\t}\n\n\t\t\tif (!Number.isSafeInteger(state.nextId) || state.nextId < 1 || state.nextId === Number.MAX_SAFE_INTEGER) {\n\t\t\t\treturn error(state, \"next id is invalid or exhausted\");\n\t\t\t}\n\t\t\tconst item: TodoItem = {\n\t\t\t\tid: state.nextId,\n\t\t\t\tsubject: (params.subject as string).trim(),\n\t\t\t\tstatus: \"pending\",\n\t\t\t\tdescription: params.description as string,\n\t\t\t};\n\t\t\tif (params.activeForm) item.activeForm = params.activeForm;\n\t\t\tif (blockedBy.length) item.blockedBy = blockedBy;\n\t\t\tif (params.owner) item.owner = params.owner;\n\t\t\tif (metadata) item.metadata = metadata;\n\n\t\t\treturn {\n\t\t\t\tstate: { items: [...state.items, item], nextId: state.nextId + 1 },\n\t\t\t\toperation: { kind: \"create\", id: item.id },\n\t\t\t};\n\t\t}\n\n\t\tcase \"create_many\":\n\t\t\treturn createMany(state, params);\n\n\t\tcase \"update\": {\n\t\t\tif (!isPositiveInteger(params.id)) return error(state, \"id required for update\");\n\t\t\tconst index = state.items.findIndex((item) => item.id === params.id);\n\t\t\tif (index === -1) return error(state, `#${params.id} not found`);\n\t\t\tconst current = state.items[index];\n\t\t\tif (current.status === \"deleted\") return error(state, `#${params.id} is deleted and cannot be updated`);\n\t\t\tconst taskTextError = validateTaskTextFields(params, false);\n\t\t\tif (taskTextError) return error(state, taskTextError);\n\t\t\tif (params.status !== undefined && !isTodoStatus(params.status)) return error(state, \"status is invalid\");\n\n\t\t\tconst addBlockedBy = validateIdArray(params.addBlockedBy, \"addBlockedBy\");\n\t\t\tconst removeBlockedBy = validateIdArray(params.removeBlockedBy, \"removeBlockedBy\");\n\t\t\tconst addBlocks = validateIdArray(params.addBlocks, \"addBlocks\");\n\t\t\tconst removeBlocks = validateIdArray(params.removeBlocks, \"removeBlocks\");\n\t\t\tif (typeof addBlockedBy === \"string\") return error(state, addBlockedBy);\n\t\t\tif (typeof removeBlockedBy === \"string\") return error(state, removeBlockedBy);\n\t\t\tif (typeof addBlocks === \"string\") return error(state, addBlocks);\n\t\t\tif (typeof removeBlocks === \"string\") return error(state, removeBlocks);\n\t\t\tconst edgeChange =\n\t\t\t\taddBlockedBy.length > 0 || removeBlockedBy.length > 0 || addBlocks.length > 0 || removeBlocks.length > 0;\n\t\t\tconst fieldChange =\n\t\t\t\tparams.subject !== undefined ||\n\t\t\t\tparams.description !== undefined ||\n\t\t\t\tparams.activeForm !== undefined ||\n\t\t\t\tparams.owner !== undefined ||\n\t\t\t\tparams.metadata !== undefined;\n\t\t\tif (!fieldChange && !edgeChange && params.status === undefined) {\n\t\t\t\treturn error(state, \"update requires at least one field\");\n\t\t\t}\n\n\t\t\tif (params.status === \"deleted\") {\n\t\t\t\tif (fieldChange || edgeChange) {\n\t\t\t\t\treturn error(\n\t\t\t\t\t\tstate,\n\t\t\t\t\t\t\"status deleted cannot be combined with other changes; apply edits first or delete in a separate call\",\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tconst deleted = markDeleted(state, current.id);\n\t\t\t\treturn {\n\t\t\t\t\tstate: deleted.state,\n\t\t\t\t\toperation: {\n\t\t\t\t\t\tkind: \"update\",\n\t\t\t\t\t\tid: current.id,\n\t\t\t\t\t\tfrom: current.status,\n\t\t\t\t\t\tto: \"deleted\",\n\t\t\t\t\t\t...(deleted.releasedIds.length ? { releasedIds: deleted.releasedIds } : {}),\n\t\t\t\t\t},\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tconst nextStatus = params.status ?? current.status;\n\t\t\tif (!isTransitionAllowed(current.status, nextStatus)) {\n\t\t\t\treturn error(state, `illegal transition ${current.status} -> ${nextStatus}`);\n\t\t\t}\n\n\t\t\tlet metadata: Record<string, unknown> | undefined;\n\t\t\tif (params.metadata !== undefined) {\n\t\t\t\tconst patchResult = validateAndCloneMetadata(params.metadata, {\n\t\t\t\t\tmaxDepth: TODO_MAX_METADATA_DEPTH,\n\t\t\t\t\tmaxEntries: TODO_MAX_METADATA_ENTRIES,\n\t\t\t\t\tmaxBytes: TODO_MAX_METADATA_BYTES,\n\t\t\t\t\tmaxKeyLength: TODO_MAX_METADATA_KEY_LENGTH,\n\t\t\t\t});\n\t\t\t\tif (\"error\" in patchResult) return error(state, patchResult.error);\n\t\t\t\tconst merged: Record<string, unknown> = Object.create(null) as Record<string, unknown>;\n\t\t\t\tfor (const [key, value] of Object.entries(current.metadata ?? {})) merged[key] = value;\n\t\t\t\tfor (const [key, value] of Object.entries(patchResult.metadata)) {\n\t\t\t\t\tif (value === null) delete merged[key];\n\t\t\t\t\telse merged[key] = value;\n\t\t\t\t}\n\t\t\t\tif (Object.keys(merged).length) {\n\t\t\t\t\tconst mergedResult = validateAndCloneMetadata(merged, {\n\t\t\t\t\t\tmaxDepth: TODO_MAX_METADATA_DEPTH,\n\t\t\t\t\t\tmaxEntries: TODO_MAX_METADATA_ENTRIES,\n\t\t\t\t\t\tmaxBytes: TODO_MAX_METADATA_BYTES,\n\t\t\t\t\t\tmaxKeyLength: TODO_MAX_METADATA_KEY_LENGTH,\n\t\t\t\t\t});\n\t\t\t\t\tif (\"error\" in mergedResult) return error(state, mergedResult.error);\n\t\t\t\t\tmetadata = mergedResult.metadata;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Collect every task whose blockedBy changes: this task (addBlockedBy /\n\t\t\t// removeBlockedBy) plus reverse-edge targets (addBlocks / removeBlocks).\n\t\t\tconst nextDepsById = new Map<number, number[]>();\n\t\t\tlet nextDeps = current.blockedBy ? [...current.blockedBy] : [];\n\t\t\tif (removeBlockedBy.length) {\n\t\t\t\tconst remove = new Set(removeBlockedBy);\n\t\t\t\tnextDeps = nextDeps.filter((id) => !remove.has(id));\n\t\t\t}\n\t\t\tif (addBlockedBy.length) {\n\t\t\t\tconst dependencyError = validateDependencies(state, addBlockedBy, current.id);\n\t\t\t\tif (dependencyError) return error(state, dependencyError);\n\t\t\t\tfor (const dep of addBlockedBy) {\n\t\t\t\t\tif (!nextDeps.includes(dep)) nextDeps.push(dep);\n\t\t\t\t}\n\t\t\t}\n\t\t\tnextDepsById.set(current.id, nextDeps);\n\n\t\t\tif (removeBlocks.length) {\n\t\t\t\tconst release = new Set(removeBlocks);\n\t\t\t\tfor (const candidate of state.items) {\n\t\t\t\t\tif (!release.has(candidate.id) || !candidate.blockedBy?.includes(current.id)) continue;\n\t\t\t\t\tnextDepsById.set(\n\t\t\t\t\t\tcandidate.id,\n\t\t\t\t\t\tcandidate.blockedBy.filter((dependencyId) => dependencyId !== current.id),\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (addBlocks.length) {\n\t\t\t\tfor (const targetId of addBlocks) {\n\t\t\t\t\tif (targetId === current.id) return error(state, `cannot block #${targetId} on itself`);\n\t\t\t\t\tconst target = findItem(state, targetId);\n\t\t\t\t\tif (!target) return error(state, `addBlocks: #${targetId} not found`);\n\t\t\t\t\tif (target.status === \"deleted\") return error(state, `addBlocks: #${targetId} is deleted`);\n\t\t\t\t\tconst deps = nextDepsById.get(targetId) ?? (target.blockedBy ? [...target.blockedBy] : []);\n\t\t\t\t\tif (!deps.includes(current.id)) deps.push(current.id);\n\t\t\t\t\tnextDepsById.set(targetId, deps);\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (createsCycle(state.items, nextDepsById)) {\n\t\t\t\treturn error(state, \"blockedBy would create a cycle\");\n\t\t\t}\n\n\t\t\t// Readiness gates explicit status changes. An already active task that\n\t\t\t// takes on a new incomplete edge is instead automatically demoted below.\n\t\t\tif ((nextStatus === \"in_progress\" || nextStatus === \"completed\") && current.status !== nextStatus) {\n\t\t\t\tconst readyError = validateDependenciesReady(state, nextDeps);\n\t\t\t\tif (readyError) return error(state, readyError);\n\t\t\t}\n\n\t\t\tconst updated: TodoItem = { ...current, status: nextStatus };\n\t\t\tif (params.subject !== undefined) updated.subject = params.subject.trim();\n\t\t\t// Empty string removes an optional text field (metadata uses null keys).\n\t\t\tif (params.description !== undefined) {\n\t\t\t\tif (params.description) updated.description = params.description;\n\t\t\t\telse delete updated.description;\n\t\t\t}\n\t\t\tif (params.activeForm !== undefined) {\n\t\t\t\tif (params.activeForm) updated.activeForm = params.activeForm;\n\t\t\t\telse delete updated.activeForm;\n\t\t\t}\n\t\t\tif (params.owner !== undefined) {\n\t\t\t\tif (params.owner) updated.owner = params.owner;\n\t\t\t\telse delete updated.owner;\n\t\t\t}\n\t\t\tif (nextDeps.length) updated.blockedBy = nextDeps;\n\t\t\telse delete updated.blockedBy;\n\t\t\tif (params.metadata !== undefined) {\n\t\t\t\tif (metadata) updated.metadata = metadata;\n\t\t\t\telse delete updated.metadata;\n\t\t\t}\n\n\t\t\tconst items = state.items.map((task) => {\n\t\t\t\tif (task.id === current.id) return updated;\n\t\t\t\tconst deps = nextDepsById.get(task.id);\n\t\t\t\tif (deps === undefined) return task;\n\t\t\t\treturn deps.length ? { ...task, blockedBy: deps } : omitBlockedBy(task);\n\t\t\t});\n\n\t\t\t// A task that was already active may become newly blocked through either\n\t\t\t// direction of an edge edit. Keep it out of in_progress and distinguish\n\t\t\t// this from the usual single-active-task demotion in the result.\n\t\t\tconst blockedIds: number[] = [];\n\t\t\tfor (const [targetId, deps] of nextDepsById) {\n\t\t\t\tconst before = findItem(state, targetId);\n\t\t\t\tconst targetIndex = items.findIndex((item) => item.id === targetId);\n\t\t\t\tif (!before || targetIndex === -1 || items[targetIndex].status !== \"in_progress\") continue;\n\t\t\t\tconst previousDeps = before.blockedBy ?? [];\n\t\t\t\tconst gainedUnresolved = deps.some((dependencyId) => {\n\t\t\t\t\tif (previousDeps.includes(dependencyId)) return false;\n\t\t\t\t\tconst dependency = items.find((item) => item.id === dependencyId);\n\t\t\t\t\treturn dependency?.status !== \"completed\";\n\t\t\t\t});\n\t\t\t\tif (gainedUnresolved) {\n\t\t\t\t\titems[targetIndex] = { ...items[targetIndex], status: \"pending\" };\n\t\t\t\t\tblockedIds.push(targetId);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Exactly one in_progress: demote any other active tasks to pending.\n\t\t\tconst demotedIds: number[] = [];\n\t\t\tconst finalCurrent = items[index];\n\t\t\tif (nextStatus === \"in_progress\" && finalCurrent.status === \"in_progress\") {\n\t\t\t\tfor (let itemIndex = 0; itemIndex < items.length; itemIndex++) {\n\t\t\t\t\tconst item = items[itemIndex];\n\t\t\t\t\tif (item.id === finalCurrent.id || item.status !== \"in_progress\") continue;\n\t\t\t\t\titems[itemIndex] = { ...item, status: \"pending\" };\n\t\t\t\t\tdemotedIds.push(item.id);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst nextState: TodoState = { items, nextId: state.nextId };\n\t\t\tconst finalItem = items[index];\n\t\t\tconst newlyCompleted = current.status !== \"completed\" && finalItem.status === \"completed\";\n\t\t\treturn {\n\t\t\t\tstate: nextState,\n\t\t\t\toperation: {\n\t\t\t\t\tkind: \"update\",\n\t\t\t\t\tid: finalItem.id,\n\t\t\t\t\tfrom: current.status,\n\t\t\t\t\tto: finalItem.status,\n\t\t\t\t\t...(demotedIds.length ? { demotedIds } : {}),\n\t\t\t\t\t...(blockedIds.length ? { blockedIds } : {}),\n\t\t\t\t\t...(newlyCompleted && needsVerificationNudge(nextState) ? { verificationNudge: true } : {}),\n\t\t\t\t},\n\t\t\t};\n\t\t}\n\n\t\tcase \"list\": {\n\t\t\tif (params.status !== undefined && !isTodoStatus(params.status)) return error(state, \"status is invalid\");\n\t\t\tif (params.includeDeleted !== undefined && typeof params.includeDeleted !== \"boolean\") {\n\t\t\t\treturn error(state, \"includeDeleted must be a boolean\");\n\t\t\t}\n\t\t\tif (params.unblockedOnly !== undefined && typeof params.unblockedOnly !== \"boolean\") {\n\t\t\t\treturn error(state, \"unblockedOnly must be a boolean\");\n\t\t\t}\n\t\t\tif (\n\t\t\t\tparams.limit !== undefined &&\n\t\t\t\t(!Number.isSafeInteger(params.limit) || params.limit < 1 || params.limit > TODO_MAX_LIST_LIMIT)\n\t\t\t) {\n\t\t\t\treturn error(state, `limit must be an integer from 1 to ${TODO_MAX_LIST_LIMIT}`);\n\t\t\t}\n\t\t\tif (params.afterId !== undefined && !isPositiveInteger(params.afterId))\n\t\t\t\treturn error(state, \"afterId must be a positive integer\");\n\t\t\tif (params.query !== undefined) {\n\t\t\t\tconst queryError = validateBoundedString(params.query, \"query\", TODO_MAX_LIST_QUERY_LENGTH);\n\t\t\t\tif (queryError) return error(state, queryError);\n\t\t\t}\n\t\t\treturn {\n\t\t\t\tstate,\n\t\t\t\toperation: {\n\t\t\t\t\tkind: \"list\",\n\t\t\t\t\tstatus: params.status,\n\t\t\t\t\tincludeDeleted: params.includeDeleted === true,\n\t\t\t\t\tlimit: params.limit ?? LIST_DISPLAY_MAX_ITEMS,\n\t\t\t\t\t...(params.afterId !== undefined ? { afterId: params.afterId } : {}),\n\t\t\t\t\t...(params.query !== undefined ? { query: params.query } : {}),\n\t\t\t\t\tunblockedOnly: params.unblockedOnly === true,\n\t\t\t\t\tlegacyOutput:\n\t\t\t\t\t\tparams.limit === undefined &&\n\t\t\t\t\t\tparams.afterId === undefined &&\n\t\t\t\t\t\tparams.query === undefined &&\n\t\t\t\t\t\tparams.unblockedOnly === undefined,\n\t\t\t\t},\n\t\t\t};\n\t\t}\n\n\t\tcase \"get\": {\n\t\t\tif (!isPositiveInteger(params.id)) return error(state, \"id required for get\");\n\t\t\tconst item = findItem(state, params.id);\n\t\t\tif (!item) return error(state, `#${params.id} not found`);\n\t\t\treturn { state, operation: { kind: \"get\", item } };\n\t\t}\n\n\t\tcase \"delete\": {\n\t\t\tif (!isPositiveInteger(params.id)) return error(state, \"id required for delete\");\n\t\t\tconst index = state.items.findIndex((item) => item.id === params.id);\n\t\t\tif (index === -1) return error(state, `#${params.id} not found`);\n\t\t\tconst current = state.items[index];\n\t\t\tif (current.status === \"deleted\") return error(state, `#${params.id} is already deleted`);\n\n\t\t\tconst deleted = markDeleted(state, current.id);\n\t\t\treturn {\n\t\t\t\tstate: deleted.state,\n\t\t\t\toperation: {\n\t\t\t\t\tkind: \"delete\",\n\t\t\t\t\tid: current.id,\n\t\t\t\t\tsubject: current.subject,\n\t\t\t\t\t...(deleted.releasedIds.length ? { releasedIds: deleted.releasedIds } : {}),\n\t\t\t\t},\n\t\t\t};\n\t\t}\n\n\t\tcase \"clear\":\n\t\t\tif (params.confirm !== true) return error(state, \"clear requires confirm: true\");\n\t\t\tif (!Number.isSafeInteger(params.expectedCount) || params.expectedCount !== state.items.length) {\n\t\t\t\treturn error(state, `clear expectedCount must equal current task count (${state.items.length})`);\n\t\t\t}\n\t\t\treturn {\n\t\t\t\t// IDs remain monotonic across a clear so stale references cannot point\n\t\t\t\t// at an unrelated task created later on the same conversation branch.\n\t\t\t\tstate: { items: [], nextId: state.nextId },\n\t\t\t\toperation: { kind: \"clear\", count: state.items.length },\n\t\t\t};\n\t}\n}\n\nfunction isTodoStatusCounts(value: unknown): boolean {\n\tif (!isPlainRecord(value)) return false;\n\tfor (const [status, count] of Object.entries(value)) {\n\t\tif (!isTodoStatus(status) || typeof count !== \"number\" || !Number.isSafeInteger(count) || count < 0) return false;\n\t}\n\treturn true;\n}\n\nfunction isOperationSummary(value: unknown, action: TodoAction): value is TodoOperationSummary {\n\tif (!isPlainRecord(value) || value.kind !== action) return false;\n\tswitch (action) {\n\t\tcase \"create\":\n\t\tcase \"create_many\":\n\t\t\treturn Array.isArray(value.ids) && value.ids.every(isPositiveInteger);\n\t\tcase \"update\":\n\t\t\treturn isPositiveInteger(value.id) && isTodoStatus(value.status);\n\t\tcase \"list\":\n\t\t\treturn (\n\t\t\t\ttypeof value.includeDeleted === \"boolean\" &&\n\t\t\t\ttypeof value.unblockedOnly === \"boolean\" &&\n\t\t\t\t(value.status === undefined || isTodoStatus(value.status)) &&\n\t\t\t\t(value.limit === undefined ||\n\t\t\t\t\t(typeof value.limit === \"number\" && Number.isSafeInteger(value.limit) && value.limit >= 1)) &&\n\t\t\t\t(value.afterId === undefined || isPositiveInteger(value.afterId)) &&\n\t\t\t\t(value.query === undefined || typeof value.query === \"string\") &&\n\t\t\t\t(value.statusCounts === undefined || isTodoStatusCounts(value.statusCounts)) &&\n\t\t\t\t(value.resultCount === undefined ||\n\t\t\t\t\t(typeof value.resultCount === \"number\" &&\n\t\t\t\t\t\tNumber.isSafeInteger(value.resultCount) &&\n\t\t\t\t\t\tvalue.resultCount >= 0))\n\t\t\t);\n\t\tcase \"get\":\n\t\tcase \"delete\":\n\t\t\treturn isPositiveInteger(value.id);\n\t\tcase \"clear\":\n\t\t\treturn typeof value.count === \"number\" && Number.isSafeInteger(value.count) && value.count >= 0;\n\t}\n}\n\nfunction normalizeSnapshotState(itemsValue: unknown, nextIdValue: unknown): TodoState | undefined {\n\tif (!Array.isArray(itemsValue) || !isPositiveInteger(nextIdValue)) return undefined;\n\tconst items: TodoItem[] = [];\n\tconst ids = new Set<number>();\n\tconst itemsById = new Map<number, TodoItem>();\n\tfor (const rawItem of itemsValue) {\n\t\tif (!isPlainRecord(rawItem) || !isPositiveInteger(rawItem.id) || ids.has(rawItem.id)) return undefined;\n\t\tif (typeof rawItem.subject !== \"string\" || !isTodoStatus(rawItem.status)) return undefined;\n\t\tif (rawItem.description !== undefined && typeof rawItem.description !== \"string\") return undefined;\n\t\tif (rawItem.activeForm !== undefined && typeof rawItem.activeForm !== \"string\") return undefined;\n\t\tif (rawItem.owner !== undefined && typeof rawItem.owner !== \"string\") return undefined;\n\t\tlet blockedBy: number[] | undefined;\n\t\tif (rawItem.blockedBy !== undefined) {\n\t\t\tif (!Array.isArray(rawItem.blockedBy) || !rawItem.blockedBy.every(isPositiveInteger)) return undefined;\n\t\t\tblockedBy = Array.from(new Set(rawItem.blockedBy));\n\t\t}\n\t\tlet metadata: Record<string, unknown> | undefined;\n\t\tif (rawItem.metadata !== undefined) {\n\t\t\tconst metadataResult = validateAndCloneMetadata(rawItem.metadata, LEGACY_METADATA_LIMITS);\n\t\t\tif (\"error\" in metadataResult) return undefined;\n\t\t\tmetadata = metadataResult.metadata;\n\t\t}\n\t\tconst item: TodoItem = { id: rawItem.id, subject: rawItem.subject, status: rawItem.status };\n\t\tif (rawItem.description !== undefined) item.description = rawItem.description;\n\t\tif (rawItem.activeForm !== undefined) item.activeForm = rawItem.activeForm;\n\t\tif (blockedBy?.length) item.blockedBy = blockedBy;\n\t\tif (rawItem.owner !== undefined) item.owner = rawItem.owner;\n\t\tif (metadata) item.metadata = metadata;\n\t\titems.push(item);\n\t\titemsById.set(item.id, item);\n\t\tids.add(item.id);\n\t}\n\tconst highestId = items.reduce((highest, item) => Math.max(highest, item.id), 0);\n\tif (nextIdValue <= highestId) return undefined;\n\tfor (const item of items) {\n\t\tfor (const dependencyId of item.blockedBy ?? []) {\n\t\t\tconst dependency = itemsById.get(dependencyId);\n\t\t\tif (!dependency || dependency.status === \"deleted\") return undefined;\n\t\t}\n\t}\n\tif (createsCycle(items, new Map<number, number[]>())) return undefined;\n\n\t// Legacy snapshots could contain the formerly permitted \"active but newly\n\t// blocked\" state. Normalize it to the current invariant rather than losing\n\t// the newest otherwise-valid task list during replay.\n\tfor (const item of items) {\n\t\tif (item.status !== \"in_progress\") continue;\n\t\tif ((item.blockedBy ?? []).some((id) => itemsById.get(id)?.status !== \"completed\")) {\n\t\t\titem.status = \"pending\";\n\t\t}\n\t}\n\tif (items.filter((item) => item.status === \"in_progress\").length > 1) return undefined;\n\titems.sort((first, second) => first.id - second.id);\n\treturn { items, nextId: nextIdValue };\n}\n\nfunction normalizeDetails(value: unknown): TodoState | undefined {\n\tif (!isPlainRecord(value) || !isTodoAction(value.action) || !isPlainRecord(value.params)) return undefined;\n\tif (value.schemaVersion !== undefined) {\n\t\tif (value.schemaVersion !== TODO_DETAILS_SCHEMA_VERSION || !isOperationSummary(value.operation, value.action)) {\n\t\t\treturn undefined;\n\t\t}\n\t}\n\treturn normalizeSnapshotState(value.items, value.nextId);\n}\n\nexport function replayTodosFromBranch(ctx: { sessionManager: { getBranch(): Iterable<unknown> } }): TodoState {\n\t// Latest valid todo toolResult wins; scan tail → head so malformed latest\n\t// snapshots cannot poison a branch that still has an earlier valid state.\n\tconst branch = Array.from(ctx.sessionManager.getBranch());\n\tfor (let index = branch.length - 1; index >= 0; index--) {\n\t\tconst entry = branch[index] as {\n\t\t\ttype?: string;\n\t\t\tmessage?: { role?: string; toolName?: string; details?: unknown };\n\t\t};\n\t\tif (entry.type !== \"message\") continue;\n\t\tif (entry.message?.role !== \"toolResult\" || entry.message.toolName !== TODO_TOOL_NAME) continue;\n\t\tlet state: TodoState | undefined;\n\t\ttry {\n\t\t\tstate = normalizeDetails(entry.message.details);\n\t\t} catch {\n\t\t\t// Session history is external input; ignore hostile or malformed details.\n\t\t\tcontinue;\n\t\t}\n\t\tif (state) return cloneState(state);\n\t}\n\treturn cloneState(EMPTY_TODO_STATE);\n}\n\nfunction cloneDetailsParams(params: TodoParams): Record<string, unknown> {\n\tconst copy: Record<string, unknown> = {};\n\tfor (const [key, value] of Object.entries(params)) {\n\t\tif (value === undefined) continue;\n\t\tif (key === \"metadata\") {\n\t\t\tconst metadata = validateAndCloneMetadata(value, LEGACY_METADATA_LIMITS);\n\t\t\tif (\"metadata\" in metadata) copy[key] = metadata.metadata;\n\t\t\tcontinue;\n\t\t}\n\t\tif (key === \"items\" && Array.isArray(value)) {\n\t\t\tcopy[key] = value.map((item) => {\n\t\t\t\tif (!isPlainRecord(item)) return item;\n\t\t\t\tconst itemCopy: Record<string, unknown> = { ...item };\n\t\t\t\tif (item.metadata !== undefined) {\n\t\t\t\t\tconst metadata = validateAndCloneMetadata(item.metadata, LEGACY_METADATA_LIMITS);\n\t\t\t\t\tif (\"metadata\" in metadata) itemCopy.metadata = metadata.metadata;\n\t\t\t\t}\n\t\t\t\treturn itemCopy;\n\t\t\t});\n\t\t\tcontinue;\n\t\t}\n\t\tcopy[key] = value;\n\t}\n\treturn copy;\n}\n\nfunction buildTodoOperationSummary(params: TodoParams, next: TodoState): TodoOperationSummary {\n\tswitch (params.action) {\n\t\tcase \"create\":\n\t\t\treturn { kind: \"create\", ids: [next.nextId - 1] };\n\t\tcase \"create_many\": {\n\t\t\tconst count = Array.isArray(params.items) ? params.items.length : 0;\n\t\t\tconst firstId = next.nextId - count;\n\t\t\treturn { kind: \"create_many\", ids: Array.from({ length: count }, (_, index) => firstId + index) };\n\t\t}\n\t\tcase \"update\": {\n\t\t\tconst item = findItem(next, params.id as number);\n\t\t\treturn { kind: \"update\", id: params.id as number, status: item?.status ?? \"pending\" };\n\t\t}\n\t\tcase \"list\": {\n\t\t\tconst listOperation: Extract<Operation, { kind: \"list\" }> = {\n\t\t\t\tkind: \"list\",\n\t\t\t\t...(params.status !== undefined ? { status: params.status } : {}),\n\t\t\t\tincludeDeleted: params.includeDeleted === true,\n\t\t\t\tlimit: params.limit ?? LIST_DISPLAY_MAX_ITEMS,\n\t\t\t\t...(params.afterId !== undefined ? { afterId: params.afterId } : {}),\n\t\t\t\t...(params.query !== undefined ? { query: params.query } : {}),\n\t\t\t\tunblockedOnly: params.unblockedOnly === true,\n\t\t\t\tlegacyOutput: false,\n\t\t\t};\n\t\t\tconst shown = getListView(listOperation, next).slice(0, listOperation.limit);\n\t\t\tconst statusCounts: Partial<Record<TodoStatus, number>> = {};\n\t\t\tfor (const item of shown) statusCounts[item.status] = (statusCounts[item.status] ?? 0) + 1;\n\t\t\treturn {\n\t\t\t\tkind: \"list\",\n\t\t\t\t...(listOperation.status !== undefined ? { status: listOperation.status } : {}),\n\t\t\t\tincludeDeleted: listOperation.includeDeleted,\n\t\t\t\tlimit: listOperation.limit,\n\t\t\t\t...(listOperation.afterId !== undefined ? { afterId: listOperation.afterId } : {}),\n\t\t\t\t...(listOperation.query !== undefined ? { query: listOperation.query } : {}),\n\t\t\t\tunblockedOnly: listOperation.unblockedOnly,\n\t\t\t\tstatusCounts,\n\t\t\t\tresultCount: shown.length,\n\t\t\t};\n\t\t}\n\t\tcase \"get\":\n\t\t\treturn { kind: \"get\", id: params.id as number };\n\t\tcase \"delete\":\n\t\t\treturn { kind: \"delete\", id: params.id as number };\n\t\tcase \"clear\":\n\t\t\treturn { kind: \"clear\", count: params.expectedCount as number };\n\t}\n}\n\nexport function buildTodoDetails(params: TodoParams, next: TodoState): TodoDetails {\n\tconst snapshot = cloneState(next);\n\treturn {\n\t\tschemaVersion: TODO_DETAILS_SCHEMA_VERSION,\n\t\taction: params.action,\n\t\tparams: cloneDetailsParams(params),\n\t\toperation: buildTodoOperationSummary(params, snapshot),\n\t\titems: snapshot.items,\n\t\tnextId: snapshot.nextId,\n\t};\n}\n\nconst VERIFICATION_NUDGE_NOTE =\n\t\"NOTE: You closed out 3+ tasks with no verification/test/review step. Before the final summary, run checks or add a verification task and complete it — do not self-declare done with known failures.\";\n\nfunction formatReleasedSuffix(releasedIds: number[] | undefined): string {\n\tif (!releasedIds?.length) return \"\";\n\treturn `; released ${releasedIds.map((id) => `#${id}`).join(\",\")} (no longer blocked)`;\n}\n\nfunction formatDisplayText(value: string, maximum: number): string {\n\treturn value.length > maximum ? `${value.slice(0, maximum)}…` : value;\n}\n\nfunction getListView(operation: Extract<Operation, { kind: \"list\" }>, state: TodoState): TodoItem[] {\n\tlet view = state.items;\n\t// An explicit deleted-status query is sufficient intent to include tombstones.\n\tif (!operation.includeDeleted && operation.status !== \"deleted\") {\n\t\tview = view.filter((item) => item.status !== \"deleted\");\n\t}\n\tif (operation.status) view = view.filter((item) => item.status === operation.status);\n\tif (operation.afterId !== undefined) {\n\t\tconst afterId = operation.afterId;\n\t\tview = view.filter((item) => item.id > afterId);\n\t}\n\tif (operation.query !== undefined) {\n\t\tconst query = operation.query.toLocaleLowerCase();\n\t\tview = view.filter(\n\t\t\t(item) =>\n\t\t\t\titem.subject.toLocaleLowerCase().includes(query) || item.description?.toLocaleLowerCase().includes(query),\n\t\t);\n\t}\n\tif (operation.unblockedOnly) view = view.filter((item) => dependenciesSatisfied(state, item));\n\treturn [...view].sort((first, second) => first.id - second.id);\n}\n\nexport function formatTodoContent(operation: Operation, state: TodoState): string {\n\tswitch (operation.kind) {\n\t\tcase \"create\": {\n\t\t\tconst item = findItem(state, operation.id);\n\t\t\treturn item\n\t\t\t\t? `Created #${item.id}: ${formatDisplayText(item.subject, TODO_MAX_SUBJECT_LENGTH)} (pending)`\n\t\t\t\t: `Created #${operation.id}`;\n\t\t}\n\t\tcase \"create_many\": {\n\t\t\tconst noun = operation.ids.length === 1 ? \"task\" : \"tasks\";\n\t\t\tconst lines = operation.ids.map((id) => {\n\t\t\t\tconst item = findItem(state, id);\n\t\t\t\treturn item\n\t\t\t\t\t? `#${item.id}: ${formatDisplayText(item.subject, TODO_MAX_SUBJECT_LENGTH)} (${item.status})`\n\t\t\t\t\t: `#${id}`;\n\t\t\t});\n\t\t\treturn `Created ${operation.ids.length} ${noun}:${lines.length ? `\\n${lines.join(\"\\n\")}` : \"\"}`;\n\t\t}\n\t\tcase \"update\": {\n\t\t\tconst transition = operation.from === operation.to ? \"\" : ` (${operation.from} -> ${operation.to})`;\n\t\t\tlet text = `Updated #${operation.id}${transition}`;\n\t\t\tif (operation.demotedIds?.length) {\n\t\t\t\ttext += `; ${operation.demotedIds.map((id) => `#${id}`).join(\",\")} demoted to pending`;\n\t\t\t}\n\t\t\tif (operation.blockedIds?.length) {\n\t\t\t\ttext += `; ${operation.blockedIds.map((id) => `#${id}`).join(\",\")} moved to pending (dependencies incomplete)`;\n\t\t\t}\n\t\t\ttext += formatReleasedSuffix(operation.releasedIds);\n\t\t\tif (operation.verificationNudge) text += `\\n\\n${VERIFICATION_NUDGE_NOTE}`;\n\t\t\treturn text;\n\t\t}\n\t\tcase \"delete\":\n\t\t\treturn `Deleted #${operation.id}: ${formatDisplayText(operation.subject, TODO_MAX_SUBJECT_LENGTH)}${formatReleasedSuffix(operation.releasedIds)}`;\n\t\tcase \"clear\":\n\t\t\treturn `Cleared ${operation.count} tasks`;\n\t\tcase \"list\":\n\t\t\treturn formatBoundedList(getListView(operation, state), state, operation);\n\t\tcase \"get\":\n\t\t\treturn formatDetailItem(operation.item, state);\n\t\tcase \"error\":\n\t\t\treturn `Error: ${operation.message}`;\n\t}\n}\n\n/**\n * Soft nudge when the whole list is done (no active work), there are 3+ completed\n * tasks, and none look like a verification/test/review step — mirrors CC TodoWrite.\n */\nfunction needsVerificationNudge(state: TodoState): boolean {\n\tconst active = state.items.filter((item) => item.status !== \"deleted\");\n\tif (active.length < 3) return false;\n\tif (active.some((item) => item.status === \"pending\" || item.status === \"in_progress\")) return false;\n\tconst completed = active.filter((item) => item.status === \"completed\");\n\tif (completed.length < 3) return false;\n\treturn !completed.some(\n\t\t(item) =>\n\t\t\tVERIFICATION_PATTERN.test(item.subject) ||\n\t\t\t(item.description !== undefined && VERIFICATION_PATTERN.test(item.description)),\n\t);\n}\n\nfunction formatBoundedList(\n\tview: TodoItem[],\n\tstate: TodoState,\n\toperation: Extract<Operation, { kind: \"list\" }>,\n): string {\n\tif (!view.length) return \"No tasks\";\n\tconst shown = view.slice(0, operation.limit);\n\tconst lines = shown.map((item) => formatListItem(item, state));\n\tconst omitted = view.length - shown.length;\n\tif (omitted > 0) {\n\t\tif (!operation.legacyOutput) {\n\t\t\tlines.push(`… and ${omitted} more; next page: afterId=${shown.at(-1)?.id}.`);\n\t\t} else {\n\t\t\t// Do not suggest a filter that is already applied.\n\t\t\tconst hint = operation.status ? \"use get with id= for details\" : \"narrow with status= or use get with id=\";\n\t\t\tlines.push(`… and ${omitted} more (${shown.length} of ${view.length} shown); ${hint}.`);\n\t\t}\n\t}\n\treturn lines.join(\"\\n\");\n}\n\nfunction formatListIdList(ids: number[]): string {\n\tconst shown = ids.slice(0, TODO_MAX_BLOCKED_BY).map((id) => `#${id}`);\n\treturn ids.length > shown.length ? `${shown.join(\",\")},…+${ids.length - shown.length}` : shown.join(\",\");\n}\n\nfunction formatListItem(item: TodoItem, state: TodoState): string {\n\tconst unresolved = unresolvedDependencyIds(state, item);\n\tconst deps = unresolved.length ? ` blockedBy=${formatListIdList(unresolved)}` : \"\";\n\tconst owner = item.owner ? ` @${formatDisplayText(item.owner, TODO_MAX_OWNER_LENGTH)}` : \"\";\n\tconst active =\n\t\titem.status === \"in_progress\" && item.activeForm\n\t\t\t? ` (${formatDisplayText(item.activeForm, TODO_MAX_ACTIVE_FORM_LENGTH)})`\n\t\t\t: \"\";\n\treturn `[${item.status}] #${item.id} ${formatDisplayText(item.subject, TODO_MAX_SUBJECT_LENGTH)}${active}${owner}${deps}`;\n}\n\nfunction formatIdList(ids: number[]): string {\n\tconst shown = ids.slice(0, TODO_MAX_BLOCKED_BY).map((id) => `#${id}`);\n\treturn ids.length > shown.length ? `${shown.join(\", \")}, … +${ids.length - shown.length}` : shown.join(\", \");\n}\n\nfunction formatDetailItem(item: TodoItem, state: TodoState): string {\n\tconst lines = [`#${item.id} [${item.status}] ${formatDisplayText(item.subject, TODO_MAX_SUBJECT_LENGTH)}`];\n\tif (item.description) lines.push(`description: ${formatDisplayText(item.description, TODO_MAX_DESCRIPTION_LENGTH)}`);\n\tif (item.activeForm) lines.push(`activeForm: ${formatDisplayText(item.activeForm, TODO_MAX_ACTIVE_FORM_LENGTH)}`);\n\tif (item.blockedBy?.length) lines.push(`blockedBy: ${formatIdList(item.blockedBy)}`);\n\tconst blocks = state.items\n\t\t.filter((candidate) => candidate.blockedBy?.includes(item.id))\n\t\t.map((candidate) => candidate.id);\n\tif (blocks.length) lines.push(`blocks: ${formatIdList(blocks)}`);\n\tif (item.owner) lines.push(`owner: ${formatDisplayText(item.owner, TODO_MAX_OWNER_LENGTH)}`);\n\treturn lines.join(\"\\n\");\n}\n"]}
@@ -1,8 +1,23 @@
1
+ import type { AgentToolResult } from "../../core/extensions/types.ts";
1
2
  import type { Theme } from "../../modes/interactive/theme/theme.ts";
2
- import type { TodoState, TodoStatus } from "./schema.ts";
3
+ import { type TodoParams, type TodoState, type TodoStatus } from "./schema.ts";
3
4
  export declare const STATUS_MARK: Record<TodoStatus, string>;
4
5
  export declare const STATUS_COLOR: Record<TodoStatus, "dim" | "warning" | "success" | "muted">;
5
6
  export declare function hasVisibleOverlayItems(state: TodoState, hiddenCompleted: ReadonlySet<number>): boolean;
6
7
  export declare function renderOverlayLines(state: TodoState, theme: Theme, width: number, hiddenCompleted: ReadonlySet<number>): string[];
8
+ type TodoCallArgs = Partial<Record<keyof TodoParams, unknown>>;
9
+ /**
10
+ * One-line call summary when collapsed; the same headline plus the parameters
11
+ * the result never echoes (description, activeForm, dependencies) when expanded.
12
+ */
13
+ export declare function formatTodoCall(args: TodoCallArgs | undefined, theme: Theme, expanded: boolean, result?: AgentToolResult<unknown>): string;
14
+ interface TodoGroupRenderContext {
15
+ isError: boolean;
16
+ isPartial: boolean;
17
+ result?: AgentToolResult<unknown>;
18
+ }
19
+ /** Compact result-aware summary used only by collapsed todo tool groups. */
20
+ export declare function formatTodoGroupCall(args: TodoCallArgs | undefined, theme: Theme, context: TodoGroupRenderContext): string;
7
21
  export declare function formatCommandList(state: TodoState): string;
22
+ export {};
8
23
  //# sourceMappingURL=view.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"view.d.ts","sourceRoot":"","sources":["../../../src/extensions/todo/view.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,wCAAwC,CAAC;AACpE,OAAO,KAAK,EAAY,SAAS,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAGnE,eAAO,MAAM,WAAW,EAAE,MAAM,CAAC,UAAU,EAAE,MAAM,CAKlD,CAAC;AAEF,eAAO,MAAM,YAAY,EAAE,MAAM,CAAC,UAAU,EAAE,KAAK,GAAG,SAAS,GAAG,SAAS,GAAG,OAAO,CAKpF,CAAC;AAQF,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,SAAS,EAAE,eAAe,EAAE,WAAW,CAAC,MAAM,CAAC,GAAG,OAAO,CAEtG;AAYD,wBAAgB,kBAAkB,CACjC,KAAK,EAAE,SAAS,EAChB,KAAK,EAAE,KAAK,EACZ,KAAK,EAAE,MAAM,EACb,eAAe,EAAE,WAAW,CAAC,MAAM,CAAC,GAClC,MAAM,EAAE,CAoBV;AAsDD,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,SAAS,GAAG,MAAM,CAiB1D","sourcesContent":["import { truncateToWidth } from \"@earendil-works/pi-tui\";\nimport type { Theme } from \"../../modes/interactive/theme/theme.ts\";\nimport type { TodoItem, TodoState, TodoStatus } from \"./schema.ts\";\nimport { unresolvedDependencyIds } from \"./state.ts\";\n\nexport const STATUS_MARK: Record<TodoStatus, string> = {\n\tpending: \"[ ]\",\n\tin_progress: \"[>]\",\n\tcompleted: \"[x]\",\n\tdeleted: \"[-]\",\n};\n\nexport const STATUS_COLOR: Record<TodoStatus, \"dim\" | \"warning\" | \"success\" | \"muted\"> = {\n\tpending: \"dim\",\n\tin_progress: \"warning\",\n\tcompleted: \"success\",\n\tdeleted: \"muted\",\n};\n\nconst OVERLAY_BODY_MAX_ITEMS = 10;\n\nfunction visibleTodos(state: TodoState): TodoItem[] {\n\treturn state.items.filter((item) => item.status !== \"deleted\");\n}\n\nexport function hasVisibleOverlayItems(state: TodoState, hiddenCompleted: ReadonlySet<number>): boolean {\n\treturn visibleTodos(state).some((item) => item.status !== \"completed\" || !hiddenCompleted.has(item.id));\n}\n\nfunction todoCounts(items: TodoItem[]): { total: number; pending: number; inProgress: number; completed: number } {\n\tconst counts = { total: items.length, pending: 0, inProgress: 0, completed: 0 };\n\tfor (const item of items) {\n\t\tif (item.status === \"pending\") counts.pending++;\n\t\telse if (item.status === \"in_progress\") counts.inProgress++;\n\t\telse if (item.status === \"completed\") counts.completed++;\n\t}\n\treturn counts;\n}\n\nexport function renderOverlayLines(\n\tstate: TodoState,\n\ttheme: Theme,\n\twidth: number,\n\thiddenCompleted: ReadonlySet<number>,\n): string[] {\n\tconst allVisible = visibleTodos(state);\n\tconst visible = allVisible.filter((item) => item.status !== \"completed\" || !hiddenCompleted.has(item.id));\n\tif (!visible.length) return [];\n\n\tconst counts = todoCounts(allVisible);\n\tconst hasActive = visible.some((item) => item.status === \"pending\" || item.status === \"in_progress\");\n\tconst heading = `${theme.fg(hasActive ? \"accent\" : \"dim\", \"Todos\")} ${theme.fg(\"dim\", `(${counts.completed}/${counts.total})`)}`;\n\tconst lines = [truncateToWidth(heading, width, \"...\")];\n\n\tconst showIds = visible.some((item) => item.blockedBy?.length);\n\tconst body = chooseOverlayItems(visible, state, OVERLAY_BODY_MAX_ITEMS);\n\tfor (const item of body.items) {\n\t\tlines.push(truncateToWidth(` ${formatOverlayItem(item, state, theme, showIds)}`, width, \"...\"));\n\t}\n\tif (body.hidden.length > 0) {\n\t\tlines.push(truncateToWidth(theme.fg(\"dim\", ` ${formatHiddenSummary(body.hidden)}`), width, \"...\"));\n\t}\n\tlines.push(\"\");\n\treturn lines;\n}\n\nfunction byIdAsc(first: TodoItem, second: TodoItem): number {\n\treturn first.id - second.id;\n}\n\nfunction overlayPriority(state: TodoState, item: TodoItem): number {\n\tif (item.status === \"in_progress\") return 0;\n\tif (item.status === \"pending\" && unresolvedDependencyIds(state, item).length === 0) return 1;\n\tif (item.status === \"pending\") return 2;\n\treturn 3; // Completed items here are recent; older ones are hidden by TodoOverlay.\n}\n\nfunction chooseOverlayItems(\n\titems: TodoItem[],\n\tstate: TodoState,\n\tmaxBody: number,\n): { items: TodoItem[]; hidden: TodoItem[] } {\n\tconst prioritized = [...items].sort((first, second) => {\n\t\tconst priorityDelta = overlayPriority(state, first) - overlayPriority(state, second);\n\t\treturn priorityDelta || byIdAsc(first, second);\n\t});\n\tif (prioritized.length <= maxBody) return { items: prioritized, hidden: [] };\n\n\tconst shown = prioritized.slice(0, Math.max(1, maxBody - 1));\n\treturn { items: shown, hidden: prioritized.slice(shown.length) };\n}\n\nfunction formatHiddenSummary(items: TodoItem[]): string {\n\tconst counts = todoCounts(items);\n\tconst parts: string[] = [];\n\tif (counts.inProgress) parts.push(`${counts.inProgress} in progress`);\n\tif (counts.pending) parts.push(`${counts.pending} pending`);\n\tif (counts.completed) parts.push(`${counts.completed} completed`);\n\treturn `+${items.length} more${parts.length ? ` (${parts.join(\", \")})` : \"\"}`;\n}\n\nfunction formatOverlayItem(item: TodoItem, state: TodoState, theme: Theme, showId: boolean): string {\n\tlet text = theme.fg(STATUS_COLOR[item.status], STATUS_MARK[item.status]);\n\tif (showId) text += ` ${theme.fg(\"accent\", `#${item.id}`)}`;\n\tconst subject =\n\t\titem.status === \"completed\" ? theme.strikethrough(theme.fg(\"dim\", item.subject)) : theme.fg(\"text\", item.subject);\n\ttext += ` ${subject}`;\n\tif (item.status === \"in_progress\" && item.activeForm) text += ` ${theme.fg(\"dim\", `(${item.activeForm})`)}`;\n\n\tconst unresolved = unresolvedDependencyIds(state, item);\n\tif (unresolved.length) {\n\t\ttext += ` ${theme.fg(\"dim\", `blocked by ${unresolved.map((id) => `#${id}`).join(\",\")}`)}`;\n\t\tif (item.status === \"pending\" || item.status === \"in_progress\")\n\t\t\ttext += ` ${theme.fg(\"warning\", \"(deps incomplete)\")}`;\n\t}\n\treturn text;\n}\n\nexport function formatCommandList(state: TodoState): string {\n\tconst visible = visibleTodos(state);\n\tif (!visible.length) return \"No todos yet.\";\n\tconst lines: string[] = [];\n\tfor (const status of [\"in_progress\", \"pending\", \"completed\"] as const) {\n\t\tconst group = visible.filter((item) => item.status === status).sort(byIdAsc);\n\t\tif (!group.length) continue;\n\t\tlines.push(status);\n\t\tfor (const item of group) {\n\t\t\tconst active = item.status === \"in_progress\" && item.activeForm ? ` (${item.activeForm})` : \"\";\n\t\t\tconst owner = item.owner ? ` @${item.owner}` : \"\";\n\t\t\tconst unresolved = unresolvedDependencyIds(state, item);\n\t\t\tconst deps = unresolved.length ? ` blocked by ${unresolved.map((id) => `#${id}`).join(\",\")}` : \"\";\n\t\t\tlines.push(` ${STATUS_MARK[item.status]} #${item.id} ${item.subject}${active}${owner}${deps}`);\n\t\t}\n\t}\n\treturn lines.join(\"\\n\");\n}\n"]}
1
+ {"version":3,"file":"view.d.ts","sourceRoot":"","sources":["../../../src/extensions/todo/view.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AACtE,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,wCAAwC,CAAC;AAEpE,OAAO,EAGN,KAAK,UAAU,EACf,KAAK,SAAS,EACd,KAAK,UAAU,EACf,MAAM,aAAa,CAAC;AAGrB,eAAO,MAAM,WAAW,EAAE,MAAM,CAAC,UAAU,EAAE,MAAM,CAKlD,CAAC;AAEF,eAAO,MAAM,YAAY,EAAE,MAAM,CAAC,UAAU,EAAE,KAAK,GAAG,SAAS,GAAG,SAAS,GAAG,OAAO,CAKpF,CAAC;AAQF,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,SAAS,EAAE,eAAe,EAAE,WAAW,CAAC,MAAM,CAAC,GAAG,OAAO,CAEtG;AAYD,wBAAgB,kBAAkB,CACjC,KAAK,EAAE,SAAS,EAChB,KAAK,EAAE,KAAK,EACZ,KAAK,EAAE,MAAM,EACb,eAAe,EAAE,WAAW,CAAC,MAAM,CAAC,GAClC,MAAM,EAAE,CAoBV;AA4DD,KAAK,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,UAAU,EAAE,OAAO,CAAC,CAAC,CAAC;AA4N/D;;;GAGG;AACH,wBAAgB,cAAc,CAC7B,IAAI,EAAE,YAAY,GAAG,SAAS,EAC9B,KAAK,EAAE,KAAK,EACZ,QAAQ,EAAE,OAAO,EACjB,MAAM,CAAC,EAAE,eAAe,CAAC,OAAO,CAAC,GAC/B,MAAM,CAIR;AAED,UAAU,sBAAsB;IAC/B,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,EAAE,OAAO,CAAC;IACnB,MAAM,CAAC,EAAE,eAAe,CAAC,OAAO,CAAC,CAAC;CAClC;AA4LD,4EAA4E;AAC5E,wBAAgB,mBAAmB,CAClC,IAAI,EAAE,YAAY,GAAG,SAAS,EAC9B,KAAK,EAAE,KAAK,EACZ,OAAO,EAAE,sBAAsB,GAC7B,MAAM,CASR;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,SAAS,GAAG,MAAM,CAuB1D","sourcesContent":["import { truncateToWidth } from \"@earendil-works/pi-tui\";\nimport type { AgentToolResult } from \"../../core/extensions/types.ts\";\nimport type { Theme } from \"../../modes/interactive/theme/theme.ts\";\nimport { LIST_DISPLAY_MAX_ITEMS, TODO_MAX_BATCH_ITEMS, TODO_MAX_BLOCKED_BY } from \"./constants.ts\";\nimport {\n\tTODO_DETAILS_SCHEMA_VERSION,\n\ttype TodoItem,\n\ttype TodoParams,\n\ttype TodoState,\n\ttype TodoStatus,\n} from \"./schema.ts\";\nimport { unresolvedDependencyIds } from \"./state.ts\";\n\nexport const STATUS_MARK: Record<TodoStatus, string> = {\n\tpending: \"[ ]\",\n\tin_progress: \"[>]\",\n\tcompleted: \"[x]\",\n\tdeleted: \"[-]\",\n};\n\nexport const STATUS_COLOR: Record<TodoStatus, \"dim\" | \"warning\" | \"success\" | \"muted\"> = {\n\tpending: \"dim\",\n\tin_progress: \"warning\",\n\tcompleted: \"success\",\n\tdeleted: \"muted\",\n};\n\nconst OVERLAY_BODY_MAX_ITEMS = 10;\n\nfunction visibleTodos(state: TodoState): TodoItem[] {\n\treturn state.items.filter((item) => item.status !== \"deleted\");\n}\n\nexport function hasVisibleOverlayItems(state: TodoState, hiddenCompleted: ReadonlySet<number>): boolean {\n\treturn visibleTodos(state).some((item) => item.status !== \"completed\" || !hiddenCompleted.has(item.id));\n}\n\nfunction todoCounts(items: TodoItem[]): { total: number; pending: number; inProgress: number; completed: number } {\n\tconst counts = { total: items.length, pending: 0, inProgress: 0, completed: 0 };\n\tfor (const item of items) {\n\t\tif (item.status === \"pending\") counts.pending++;\n\t\telse if (item.status === \"in_progress\") counts.inProgress++;\n\t\telse if (item.status === \"completed\") counts.completed++;\n\t}\n\treturn counts;\n}\n\nexport function renderOverlayLines(\n\tstate: TodoState,\n\ttheme: Theme,\n\twidth: number,\n\thiddenCompleted: ReadonlySet<number>,\n): string[] {\n\tconst allVisible = visibleTodos(state);\n\tconst visible = allVisible.filter((item) => item.status !== \"completed\" || !hiddenCompleted.has(item.id));\n\tif (!visible.length) return [];\n\n\tconst counts = todoCounts(allVisible);\n\tconst hasActive = visible.some((item) => item.status === \"pending\" || item.status === \"in_progress\");\n\tconst heading = `${theme.fg(hasActive ? \"accent\" : \"dim\", \"Todos\")} ${theme.fg(\"dim\", `(${counts.completed}/${counts.total})`)}`;\n\tconst lines = [truncateToWidth(heading, width, \"...\")];\n\n\tconst showIds = visible.some((item) => item.blockedBy?.length);\n\tconst body = chooseOverlayItems(visible, state, OVERLAY_BODY_MAX_ITEMS);\n\tfor (const item of body.items) {\n\t\tlines.push(truncateToWidth(` ${formatOverlayItem(item, state, theme, showIds)}`, width, \"...\"));\n\t}\n\tif (body.hidden.length > 0) {\n\t\tlines.push(truncateToWidth(theme.fg(\"dim\", ` ${formatHiddenSummary(body.hidden)}`), width, \"...\"));\n\t}\n\tlines.push(\"\");\n\treturn lines;\n}\n\nfunction byIdAsc(first: TodoItem, second: TodoItem): number {\n\treturn first.id - second.id;\n}\n\nfunction overlayPriority(state: TodoState, item: TodoItem): number {\n\tif (item.status === \"in_progress\") return 0;\n\tif (item.status === \"pending\" && unresolvedDependencyIds(state, item).length === 0) return 1;\n\tif (item.status === \"pending\") return 2;\n\treturn 3; // Completed items here are recent; older ones are hidden by TodoOverlay.\n}\n\nfunction chooseOverlayItems(\n\titems: TodoItem[],\n\tstate: TodoState,\n\tmaxBody: number,\n): { items: TodoItem[]; hidden: TodoItem[] } {\n\tconst prioritized = [...items].sort((first, second) => {\n\t\tconst priorityDelta = overlayPriority(state, first) - overlayPriority(state, second);\n\t\treturn priorityDelta || byIdAsc(first, second);\n\t});\n\tif (prioritized.length <= maxBody) return { items: prioritized, hidden: [] };\n\n\tconst shown = prioritized.slice(0, Math.max(1, maxBody - 1));\n\treturn { items: shown, hidden: prioritized.slice(shown.length) };\n}\n\nfunction formatHiddenSummary(items: TodoItem[]): string {\n\tconst counts = todoCounts(items);\n\tconst parts: string[] = [];\n\tif (counts.inProgress) parts.push(`${counts.inProgress} in progress`);\n\tif (counts.pending) parts.push(`${counts.pending} pending`);\n\tif (counts.completed) parts.push(`${counts.completed} completed`);\n\treturn `+${items.length} more${parts.length ? ` (${parts.join(\", \")})` : \"\"}`;\n}\n\nfunction formatOverlayItem(item: TodoItem, state: TodoState, theme: Theme, showId: boolean): string {\n\tlet text = theme.fg(STATUS_COLOR[item.status], STATUS_MARK[item.status]);\n\tif (showId) text += ` ${theme.fg(\"accent\", `#${item.id}`)}`;\n\tconst subject =\n\t\titem.status === \"completed\" ? theme.strikethrough(theme.fg(\"dim\", item.subject)) : theme.fg(\"text\", item.subject);\n\ttext += ` ${subject}`;\n\tif (item.status === \"in_progress\" && item.activeForm) text += ` ${theme.fg(\"dim\", `(${item.activeForm})`)}`;\n\n\tconst unresolved = unresolvedDependencyIds(state, item);\n\tif (unresolved.length) {\n\t\ttext += ` ${theme.fg(\"dim\", `blocked by ${unresolved.map((id) => `#${id}`).join(\",\")}`)}`;\n\t\tif (item.status === \"pending\" || item.status === \"in_progress\")\n\t\t\ttext += ` ${theme.fg(\"warning\", \"(deps incomplete)\")}`;\n\t}\n\treturn text;\n}\n\n// ---- tool call rendering ----------------------------------------------------\n// Collapsed todo calls join the `todo` tool group, so each row must survive as a\n// single headline with no result beneath it (ToolGroupComponent drops results and\n// appends one shared expand hint). Args come straight off the wire and can be\n// partial while the call streams, so every field is read defensively.\n\ntype TodoCallArgs = Partial<Record<keyof TodoParams, unknown>>;\n\nconst EDGE_PARAMS = [\"blockedBy\", \"addBlockedBy\", \"removeBlockedBy\", \"addBlocks\", \"removeBlocks\"] as const;\n\nfunction callText(value: unknown): string {\n\treturn typeof value === \"string\" ? value.trim() : \"\";\n}\n\nfunction callSubject(value: unknown): string {\n\treturn callText(value).replace(/\\s+/g, \" \");\n}\n\nfunction callId(value: unknown): number | undefined {\n\treturn typeof value === \"number\" && Number.isInteger(value) ? value : undefined;\n}\n\nfunction callIds(value: unknown): number[] {\n\tif (!Array.isArray(value)) return [];\n\tconst ids: number[] = [];\n\tlet count: number;\n\ttry {\n\t\tcount = Math.min(value.length, TODO_MAX_BLOCKED_BY);\n\t} catch {\n\t\treturn ids;\n\t}\n\tfor (let index = 0; index < count; index++) {\n\t\tlet entry: unknown;\n\t\ttry {\n\t\t\tentry = value[index];\n\t\t} catch {\n\t\t\tcontinue;\n\t\t}\n\t\tif (typeof entry === \"number\" && Number.isSafeInteger(entry) && entry >= 1) ids.push(entry);\n\t}\n\treturn ids;\n}\n\nfunction callArrayLength(value: unknown): number | undefined {\n\ttry {\n\t\treturn Array.isArray(value) ? value.length : undefined;\n\t} catch {\n\t\treturn undefined;\n\t}\n}\n\nconst CALL_BATCH_SUBJECT_PREVIEW_COUNT = 2;\nconst CALL_SUBJECT_PREVIEW_WIDTH = 72;\nconst CALL_DESCRIPTION_PREVIEW_LENGTH = 120;\n\ninterface CallBatchItem {\n\tsubject: string;\n\tdescription: string;\n\tblockedBy: number[];\n\tblockedByKeys: string[];\n}\n\nfunction callStrings(value: unknown): string[] {\n\tif (!Array.isArray(value)) return [];\n\tconst strings: string[] = [];\n\tlet count: number;\n\ttry {\n\t\tcount = Math.min(value.length, TODO_MAX_BLOCKED_BY);\n\t} catch {\n\t\treturn strings;\n\t}\n\tfor (let index = 0; index < count; index++) {\n\t\tlet entry: unknown;\n\t\ttry {\n\t\t\tentry = value[index];\n\t\t} catch {\n\t\t\tcontinue;\n\t\t}\n\t\tconst text = callText(entry);\n\t\tif (text) strings.push(text);\n\t}\n\treturn strings;\n}\n\nfunction callBatchItems(value: unknown): CallBatchItem[] {\n\tif (!Array.isArray(value)) return [];\n\tlet count: number;\n\ttry {\n\t\tcount = Math.min(value.length, TODO_MAX_BATCH_ITEMS);\n\t} catch {\n\t\treturn [];\n\t}\n\tconst items: CallBatchItem[] = [];\n\tfor (let index = 0; index < count; index++) {\n\t\tlet valueAtIndex: unknown;\n\t\ttry {\n\t\t\tvalueAtIndex = value[index];\n\t\t} catch {\n\t\t\tvalueAtIndex = undefined;\n\t\t}\n\t\tconst item = safeRecord(valueAtIndex);\n\t\titems.push({\n\t\t\tsubject: item ? callSubject(safeValue(item, \"subject\")) : \"\",\n\t\t\tdescription: item ? callText(safeValue(item, \"description\")) : \"\",\n\t\t\tblockedBy: item ? callIds(safeValue(item, \"blockedBy\")) : [],\n\t\t\tblockedByKeys: item ? callStrings(safeValue(item, \"blockedByKeys\")) : [],\n\t\t});\n\t}\n\treturn items;\n}\n\nfunction formatSubjectPreview(subjects: string[], total: number): string {\n\tconst shown = subjects\n\t\t.slice(0, CALL_BATCH_SUBJECT_PREVIEW_COUNT)\n\t\t.filter(Boolean)\n\t\t.map((subject) => truncateToWidth(subject, CALL_SUBJECT_PREVIEW_WIDTH, \"…\"));\n\tif (!shown.length) return \"\";\n\tconst hidden = Math.max(0, total - shown.length);\n\treturn `${shown.join(\", \")}${hidden ? `, +${hidden} more` : \"\"}`;\n}\n\nfunction callBatchSubjectPreview(items: CallBatchItem[], total: number): string {\n\treturn formatSubjectPreview(\n\t\titems.map((item) => item.subject),\n\t\ttotal,\n\t);\n}\n\nfunction callDescriptionPreview(value: string): string {\n\tconst text = value.replace(/\\s+/g, \" \");\n\treturn text.length > CALL_DESCRIPTION_PREVIEW_LENGTH\n\t\t? `${text.slice(0, CALL_DESCRIPTION_PREVIEW_LENGTH - 1)}…`\n\t\t: text;\n}\n\nfunction callNonNegativeInteger(value: unknown): number | undefined {\n\treturn typeof value === \"number\" && Number.isInteger(value) && value >= 0 ? value : undefined;\n}\n\nfunction isTodoStatus(value: string): value is TodoStatus {\n\treturn Object.hasOwn(STATUS_MARK, value);\n}\n\nfunction formatCallHeadline(args: TodoCallArgs | undefined, theme: Theme): string {\n\tconst action = callText(args?.action);\n\tconst displayAction = action === \"create_many\" ? \"create\" : action;\n\tconst parts = [theme.fg(\"toolTitle\", theme.bold(displayAction ? `todo ${displayAction}` : \"todo\"))];\n\n\tif (action === \"create_many\") {\n\t\tconst items = callBatchItems(args?.items);\n\t\tconst count = callArrayLength(args?.items);\n\t\tif (count !== undefined) {\n\t\t\tparts.push(theme.fg(\"dim\", `${count} ${count === 1 ? \"task\" : \"tasks\"}`));\n\t\t\tconst preview = callBatchSubjectPreview(items, count);\n\t\t\tif (preview) {\n\t\t\t\tparts.push(theme.fg(\"dim\", \"·\"));\n\t\t\t\tparts.push(theme.fg(\"text\", preview));\n\t\t\t}\n\t\t}\n\t}\n\n\tconst id = callId(args?.id);\n\tif (id !== undefined) parts.push(theme.fg(\"accent\", `#${id}`));\n\n\tconst status = callText(args?.status);\n\tif (status && isTodoStatus(status)) parts.push(theme.fg(STATUS_COLOR[status], status));\n\n\tconst subject = callSubject(args?.subject);\n\tif (subject) parts.push(theme.fg(\"text\", subject));\n\n\t// Dependency-only updates would otherwise render as a bare `todo update #3`.\n\tconst hasEdgeChange = EDGE_PARAMS.some((key) => callIds(args?.[key]).length > 0);\n\tif (!status && !subject && hasEdgeChange) parts.push(theme.fg(\"dim\", \"dependencies\"));\n\n\treturn parts.join(\" \");\n}\n\nfunction batchResultIds(result: AgentToolResult<unknown> | undefined, count: number): number[] | undefined {\n\tconst details = groupDetails(result?.details);\n\tif (!details || details.action !== \"create_many\") return undefined;\n\tconst ids = groupIds(safeValue(details.operation, \"ids\"));\n\treturn ids?.length === count ? ids : undefined;\n}\n\nfunction formatCallDetails(args: TodoCallArgs | undefined, theme: Theme, result?: AgentToolResult<unknown>): string[] {\n\tconst lines: string[] = [];\n\tconst push = (label: string, value: string) => {\n\t\tif (value) lines.push(theme.fg(\"dim\", `${label}: ${value}`));\n\t};\n\n\tconst action = callText(args?.action);\n\tif (action === \"create_many\") {\n\t\tconst items = callBatchItems(args?.items);\n\t\tconst ids = batchResultIds(result, items.length);\n\t\tfor (const [index, item] of items.entries()) {\n\t\t\tconst dependencies = [...item.blockedBy.map((id) => `#${id}`), ...item.blockedByKeys];\n\t\t\tlet line = theme.fg(\"accent\", ids ? `#${ids[index]}` : `${index + 1}.`);\n\t\t\tif (item.subject) line += ` ${theme.fg(\"text\", item.subject)}`;\n\t\t\tif (dependencies.length) line += ` ${theme.fg(\"dim\", `· blocked by ${dependencies.join(\", \")}`)}`;\n\t\t\tlines.push(line);\n\t\t\tif (item.description) lines.push(` ${theme.fg(\"dim\", callDescriptionPreview(item.description))}`);\n\t\t}\n\t}\n\n\tpush(\"description\", callText(args?.description));\n\tpush(\"activeForm\", callText(args?.activeForm));\n\tpush(\"owner\", callText(args?.owner));\n\tfor (const key of EDGE_PARAMS) {\n\t\tconst ids = callIds(args?.[key]);\n\t\tif (ids.length) push(key, ids.map((id) => `#${id}`).join(\",\"));\n\t}\n\tif (args?.includeDeleted === true) push(\"includeDeleted\", \"true\");\n\tconst limit = callId(args?.limit);\n\tif (limit !== undefined) push(\"limit\", String(limit));\n\tconst afterId = callId(args?.afterId);\n\tif (afterId !== undefined) push(\"afterId\", String(afterId));\n\tpush(\"query\", callText(args?.query));\n\tif (args?.unblockedOnly === true) push(\"unblockedOnly\", \"true\");\n\tif (args?.confirm === true) push(\"confirm\", \"true\");\n\tconst expectedCount = callNonNegativeInteger(args?.expectedCount);\n\tif (expectedCount !== undefined) push(\"expectedCount\", String(expectedCount));\n\tconst metadata = args?.metadata;\n\tif (metadata && typeof metadata === \"object\") push(\"metadata\", Object.keys(metadata).join(\",\"));\n\treturn lines;\n}\n\n/**\n * One-line call summary when collapsed; the same headline plus the parameters\n * the result never echoes (description, activeForm, dependencies) when expanded.\n */\nexport function formatTodoCall(\n\targs: TodoCallArgs | undefined,\n\ttheme: Theme,\n\texpanded: boolean,\n\tresult?: AgentToolResult<unknown>,\n): string {\n\tconst headline = formatCallHeadline(args, theme);\n\tif (!expanded) return headline;\n\treturn [headline, ...formatCallDetails(args, theme, result)].join(\"\\n\");\n}\n\ninterface TodoGroupRenderContext {\n\tisError: boolean;\n\tisPartial: boolean;\n\tresult?: AgentToolResult<unknown>;\n}\n\ninterface GroupTodoDetails {\n\taction: string;\n\toperation: Record<string, unknown>;\n\titems: unknown;\n}\n\nconst GROUP_FAILURE_MAX_LENGTH = 120;\nconst GROUP_MAX_IDS = 20;\nconst GROUP_MAX_SNAPSHOT_ITEMS = 10_000;\nconst TODO_ACTIONS = new Set([\"create\", \"create_many\", \"update\", \"list\", \"get\", \"delete\", \"clear\"]);\n\nfunction safeRecord(value: unknown): Record<string, unknown> | undefined {\n\ttry {\n\t\treturn value !== null && typeof value === \"object\" && !Array.isArray(value)\n\t\t\t? (value as Record<string, unknown>)\n\t\t\t: undefined;\n\t} catch {\n\t\treturn undefined;\n\t}\n}\n\nfunction safeValue(record: Record<string, unknown>, key: string): unknown {\n\ttry {\n\t\treturn record[key];\n\t} catch {\n\t\treturn undefined;\n\t}\n}\n\nfunction safeString(value: unknown): string | undefined {\n\treturn typeof value === \"string\" ? value : undefined;\n}\n\nfunction groupDetails(value: unknown): GroupTodoDetails | undefined {\n\tconst details = safeRecord(value);\n\tif (!details || safeValue(details, \"schemaVersion\") !== TODO_DETAILS_SCHEMA_VERSION) return undefined;\n\tconst action = safeString(safeValue(details, \"action\"));\n\tif (!action || !TODO_ACTIONS.has(action)) return undefined;\n\tconst operation = safeRecord(safeValue(details, \"operation\"));\n\tif (!operation || safeValue(operation, \"kind\") !== action) return undefined;\n\treturn { action, operation, items: safeValue(details, \"items\") };\n}\n\nfunction groupPositiveInteger(value: unknown): number | undefined {\n\treturn typeof value === \"number\" && Number.isSafeInteger(value) && value >= 1 ? value : undefined;\n}\n\nfunction groupIds(value: unknown): number[] | undefined {\n\ttry {\n\t\tif (!Array.isArray(value) || value.length === 0 || value.length > GROUP_MAX_IDS) return undefined;\n\t\tconst ids: number[] = [];\n\t\tfor (const valueAtIndex of value) {\n\t\t\tconst id = groupPositiveInteger(valueAtIndex);\n\t\t\tif (id === undefined) return undefined;\n\t\t\tids.push(id);\n\t\t}\n\t\treturn ids;\n\t} catch {\n\t\treturn undefined;\n\t}\n}\n\nfunction groupNonNegativeInteger(value: unknown): number | undefined {\n\treturn typeof value === \"number\" && Number.isSafeInteger(value) && value >= 0 ? value : undefined;\n}\n\nfunction formatGroupStatusCounts(value: unknown, resultCount: unknown): string | undefined {\n\tconst count = groupNonNegativeInteger(resultCount);\n\tif (count === undefined) return undefined;\n\tif (count === 0) return \"no tasks\";\n\n\tconst rawCounts = safeRecord(value);\n\tif (!rawCounts) return undefined;\n\tconst parts: string[] = [];\n\tlet total = 0;\n\tfor (const status of [\"pending\", \"in_progress\", \"completed\", \"deleted\"] as const) {\n\t\tconst statusCount = groupNonNegativeInteger(safeValue(rawCounts, status));\n\t\tif (statusCount === undefined) continue;\n\t\ttotal += statusCount;\n\t\tif (statusCount > 0) parts.push(`${statusCount} ${status}`);\n\t}\n\treturn total === count && parts.length ? parts.join(\", \") : undefined;\n}\n\nfunction groupItem(value: unknown, id: number): Record<string, unknown> | undefined {\n\ttry {\n\t\tif (!Array.isArray(value) || value.length > GROUP_MAX_SNAPSHOT_ITEMS) return undefined;\n\t\tfor (const rawItem of value) {\n\t\t\tconst item = safeRecord(rawItem);\n\t\t\tif (item && safeValue(item, \"id\") === id) return item;\n\t\t}\n\t} catch {\n\t\treturn undefined;\n\t}\n\treturn undefined;\n}\n\nfunction groupItemStatus(value: unknown, id: number): TodoStatus | undefined {\n\tconst item = groupItem(value, id);\n\tif (!item) return undefined;\n\tconst status = safeString(safeValue(item, \"status\"));\n\treturn status && isTodoStatus(status) ? status : undefined;\n}\n\nfunction groupItemSubject(value: unknown, id: number): string | undefined {\n\tconst item = groupItem(value, id);\n\tif (!item) return undefined;\n\tconst subject = callSubject(safeValue(item, \"subject\"));\n\treturn subject || undefined;\n}\n\nfunction formatGroupIds(ids: number[]): string {\n\tconst consecutive = ids.length > 1 && ids.every((id, index) => id === ids[0] + index);\n\treturn consecutive ? `#${ids[0]}–#${ids.at(-1)}` : ids.map((id) => `#${id}`).join(\", \");\n}\n\nfunction formatGroupFailure(result: AgentToolResult<unknown> | undefined): string {\n\ttry {\n\t\tfor (const block of result?.content.slice(0, 8) ?? []) {\n\t\t\tif (block.type !== \"text\" || typeof block.text !== \"string\") continue;\n\t\t\tconst reason = block.text\n\t\t\t\t.replace(/[\\u0000-\\u001f\\u007f-\\u009f]/g, \" \")\n\t\t\t\t.replace(/\\s+/g, \" \")\n\t\t\t\t.trim();\n\t\t\tif (!reason) continue;\n\t\t\treturn reason.length > GROUP_FAILURE_MAX_LENGTH ? `${reason.slice(0, GROUP_FAILURE_MAX_LENGTH - 1)}…` : reason;\n\t\t}\n\t} catch {\n\t\t// Tool results can come from historical or third-party sources.\n\t}\n\treturn \"tool failed\";\n}\n\nfunction formatTodoGroupSuccess(args: TodoCallArgs | undefined, result: AgentToolResult<unknown>): string | undefined {\n\tconst details = groupDetails(result.details);\n\tif (!details) return undefined;\n\n\tswitch (details.action) {\n\t\tcase \"create\": {\n\t\t\tconst ids = groupIds(safeValue(details.operation, \"ids\"));\n\t\t\tif (!ids || ids.length !== 1) return undefined;\n\t\t\tconst subject = groupItemSubject(details.items, ids[0]) ?? callSubject(args?.subject);\n\t\t\tconst preview = subject ? truncateToWidth(subject, CALL_SUBJECT_PREVIEW_WIDTH, \"…\") : \"\";\n\t\t\treturn `todo created #${ids[0]}${preview ? ` ${preview}` : \"\"}`;\n\t\t}\n\t\tcase \"create_many\": {\n\t\t\tconst ids = groupIds(safeValue(details.operation, \"ids\"));\n\t\t\tif (!ids) return undefined;\n\t\t\tconst callItems = callBatchItems(args?.items);\n\t\t\tconst subjects = ids.map(\n\t\t\t\t(id, index) => groupItemSubject(details.items, id) ?? callItems[index]?.subject ?? \"\",\n\t\t\t);\n\t\t\tconst preview = formatSubjectPreview(subjects, ids.length);\n\t\t\treturn `todo created ${formatGroupIds(ids)}${preview ? ` · ${preview}` : \"\"}`;\n\t\t}\n\t\tcase \"update\": {\n\t\t\tconst id = groupPositiveInteger(safeValue(details.operation, \"id\"));\n\t\t\tconst status = safeString(safeValue(details.operation, \"status\"));\n\t\t\treturn id !== undefined && status && isTodoStatus(status) ? `todo updated #${id} ${status}` : undefined;\n\t\t}\n\t\tcase \"list\": {\n\t\t\tconst counts = formatGroupStatusCounts(\n\t\t\t\tsafeValue(details.operation, \"statusCounts\"),\n\t\t\t\tsafeValue(details.operation, \"resultCount\"),\n\t\t\t);\n\t\t\treturn counts === undefined ? undefined : `todo list: ${counts}`;\n\t\t}\n\t\tcase \"get\": {\n\t\t\tconst id = groupPositiveInteger(safeValue(details.operation, \"id\"));\n\t\t\tconst status = id === undefined ? undefined : groupItemStatus(details.items, id);\n\t\t\treturn status ? `todo get #${id} ${status}` : undefined;\n\t\t}\n\t\tcase \"delete\": {\n\t\t\tconst id = groupPositiveInteger(safeValue(details.operation, \"id\"));\n\t\t\tif (id === undefined) return undefined;\n\t\t\tconst subject = groupItemSubject(details.items, id);\n\t\t\tconst preview = subject ? truncateToWidth(subject, CALL_SUBJECT_PREVIEW_WIDTH, \"…\") : \"\";\n\t\t\treturn `todo deleted #${id}${preview ? ` ${preview}` : \"\"}`;\n\t\t}\n\t\tcase \"clear\": {\n\t\t\tconst count = callNonNegativeInteger(safeValue(details.operation, \"count\"));\n\t\t\treturn count === undefined ? undefined : `todo cleared ${count} ${count === 1 ? \"task\" : \"tasks\"}`;\n\t\t}\n\t}\n}\n\n/** Compact result-aware summary used only by collapsed todo tool groups. */\nexport function formatTodoGroupCall(\n\targs: TodoCallArgs | undefined,\n\ttheme: Theme,\n\tcontext: TodoGroupRenderContext,\n): string {\n\tif (context.isError) {\n\t\treturn `${formatTodoCall(args, theme, false)} ${theme.fg(\"error\", `failed: ${formatGroupFailure(context.result)}`)}`;\n\t}\n\tif (!context.isPartial && context.result) {\n\t\tconst summary = formatTodoGroupSuccess(args, context.result);\n\t\tif (summary) return theme.fg(\"toolTitle\", summary);\n\t}\n\treturn formatTodoCall(args, theme, false);\n}\n\nexport function formatCommandList(state: TodoState): string {\n\tconst visible = visibleTodos(state);\n\tif (!visible.length) return \"No todos yet.\";\n\tconst lines: string[] = [];\n\tlet shown = 0;\n\tfor (const status of [\"in_progress\", \"pending\", \"completed\"] as const) {\n\t\tconst group = visible.filter((item) => item.status === status).sort(byIdAsc);\n\t\tif (!group.length || shown >= LIST_DISPLAY_MAX_ITEMS) continue;\n\t\tlines.push(status);\n\t\tfor (const item of group) {\n\t\t\tif (shown >= LIST_DISPLAY_MAX_ITEMS) break;\n\t\t\tconst active = item.status === \"in_progress\" && item.activeForm ? ` (${item.activeForm})` : \"\";\n\t\t\tconst owner = item.owner ? ` @${item.owner}` : \"\";\n\t\t\tconst unresolved = unresolvedDependencyIds(state, item);\n\t\t\tconst deps = unresolved.length ? ` blocked by ${unresolved.map((id) => `#${id}`).join(\",\")}` : \"\";\n\t\t\tlines.push(` ${STATUS_MARK[item.status]} #${item.id} ${item.subject}${active}${owner}${deps}`);\n\t\t\tshown++;\n\t\t}\n\t}\n\tif (visible.length > shown) {\n\t\tlines.push(`… and ${visible.length - shown} more; use todo list with limit and afterId to page.`);\n\t}\n\treturn lines.join(\"\\n\");\n}\n"]}