@astralyn/pi 0.84.7 → 0.84.9
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.
- package/CHANGELOG.md +25 -0
- package/dist/core/compaction/compaction.d.ts +2 -0
- package/dist/core/compaction/compaction.d.ts.map +1 -1
- package/dist/core/compaction/compaction.js +7 -7
- package/dist/core/compaction/compaction.js.map +1 -1
- package/dist/extensions/background/index.d.ts.map +1 -1
- package/dist/extensions/background/index.js +48 -72
- package/dist/extensions/background/index.js.map +1 -1
- package/dist/extensions/background/manager.d.ts.map +1 -1
- package/dist/extensions/background/manager.js +5 -3
- package/dist/extensions/background/manager.js.map +1 -1
- package/dist/extensions/background/registry.d.ts +11 -13
- package/dist/extensions/background/registry.d.ts.map +1 -1
- package/dist/extensions/background/registry.js +71 -80
- package/dist/extensions/background/registry.js.map +1 -1
- package/dist/extensions/background/render.d.ts.map +1 -1
- package/dist/extensions/background/render.js +8 -3
- package/dist/extensions/background/render.js.map +1 -1
- package/dist/extensions/deepwiki/constants.d.ts +2 -2
- package/dist/extensions/deepwiki/constants.d.ts.map +1 -1
- package/dist/extensions/deepwiki/constants.js +5 -5
- package/dist/extensions/deepwiki/constants.js.map +1 -1
- package/dist/extensions/deepwiki/schema.js +1 -1
- package/dist/extensions/deepwiki/schema.js.map +1 -1
- package/dist/extensions/question/constants.d.ts +2 -2
- package/dist/extensions/question/constants.d.ts.map +1 -1
- package/dist/extensions/question/constants.js +5 -2
- package/dist/extensions/question/constants.js.map +1 -1
- package/dist/extensions/subagent/activity.d.ts +9 -0
- package/dist/extensions/subagent/activity.d.ts.map +1 -1
- package/dist/extensions/subagent/activity.js +21 -0
- package/dist/extensions/subagent/activity.js.map +1 -1
- package/dist/extensions/subagent/agents.d.ts.map +1 -1
- package/dist/extensions/subagent/agents.js +7 -3
- package/dist/extensions/subagent/agents.js.map +1 -1
- package/dist/extensions/subagent/constants.d.ts +1 -0
- package/dist/extensions/subagent/constants.d.ts.map +1 -1
- package/dist/extensions/subagent/constants.js +4 -0
- package/dist/extensions/subagent/constants.js.map +1 -1
- package/dist/extensions/subagent/index.js +4 -4
- package/dist/extensions/subagent/index.js.map +1 -1
- package/dist/extensions/subagent/render.d.ts +6 -2
- package/dist/extensions/subagent/render.d.ts.map +1 -1
- package/dist/extensions/subagent/render.js +143 -138
- package/dist/extensions/subagent/render.js.map +1 -1
- package/dist/extensions/subagent/sdk-runner.d.ts.map +1 -1
- package/dist/extensions/subagent/sdk-runner.js +19 -0
- package/dist/extensions/subagent/sdk-runner.js.map +1 -1
- package/dist/extensions/subagent/state.d.ts +9 -0
- package/dist/extensions/subagent/state.d.ts.map +1 -1
- package/dist/extensions/subagent/state.js +33 -2
- package/dist/extensions/subagent/state.js.map +1 -1
- package/dist/extensions/todo/constants.d.ts +1 -1
- package/dist/extensions/todo/constants.d.ts.map +1 -1
- package/dist/extensions/todo/constants.js +10 -27
- package/dist/extensions/todo/constants.js.map +1 -1
- package/dist/extensions/todo/state.d.ts.map +1 -1
- package/dist/extensions/todo/state.js +27 -16
- package/dist/extensions/todo/state.js.map +1 -1
- package/dist/extensions/todo/view.d.ts.map +1 -1
- package/dist/extensions/todo/view.js +16 -5
- package/dist/extensions/todo/view.js.map +1 -1
- package/docs/bundled/extensions/background.md +3 -3
- package/docs/bundled/extensions/subagent.md +40 -23
- package/docs/bundled/extensions/todo.md +2 -2
- package/docs/compaction.md +2 -0
- package/npm-shrinkwrap.json +2 -2
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"state.js","sourceRoot":"","sources":["../../../src/extensions/todo/state.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * todo/state.ts — v2 pure state core: closure-scoped store, atomic actions,\n * snapshot cloning, and branch replay. No session registry, metadata,\n * dependency graph, tombstones, filters, or legacy normalizers.\n */\nimport {\n\tTODO_MAX_BATCH_ITEMS,\n\tTODO_MAX_DESCRIPTION_LENGTH,\n\tTODO_MAX_ITEMS,\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 TodoChange,\n\ttype TodoDetails,\n\ttype TodoItem,\n\ttype TodoParams,\n\ttype TodoState,\n\ttype TodoStatus,\n} from \"./schema.ts\";\n\nconst TODO_STATUSES: ReadonlySet<TodoStatus> = new Set([\"pending\", \"in_progress\", \"completed\"]);\nconst TODO_ACTIONS: ReadonlySet<TodoAction> = new Set([\"create\", \"update\", \"list\", \"delete\"]);\n\n/** Parameters each action accepts; anything else is rejected with guidance. */\nconst ACTION_PARAMS: Record<TodoAction, ReadonlySet<string>> = {\n\tcreate: new Set([\"items\"]),\n\tupdate: new Set([\"id\", \"subject\", \"description\", \"status\"]),\n\tlist: new Set([]),\n\tdelete: new Set([\"ids\"]),\n};\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n\treturn value !== null && typeof value === \"object\" && !Array.isArray(value);\n}\n\nfunction isPositiveSafeInteger(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 findItem(state: TodoState, id: number): TodoItem | undefined {\n\treturn state.items.find((item) => item.id === id);\n}\n\n/** De-duplicate ids preserving first-seen input order. */\nfunction dedupeIds(ids: number[]): number[] {\n\tconst seen: number[] = [];\n\tfor (const id of ids) {\n\t\tif (!seen.includes(id)) seen.push(id);\n\t}\n\treturn seen;\n}\n\n/** Trim and collapse every internal whitespace run to a single space. */\nfunction normalizeText(value: string): string {\n\treturn value.trim().replace(/\\s+/g, \" \");\n}\n\nfunction validateNormalizedText(value: unknown, label: string, maximum: number): string {\n\tif (typeof value !== \"string\") throw new Error(`${label} must be a string`);\n\tconst normalized = normalizeText(value);\n\tif (!normalized) throw new Error(`${label} cannot be empty`);\n\tif (normalized.length > maximum) throw new Error(`${label} exceeds ${maximum} characters`);\n\treturn normalized;\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 `${key} does not apply to action ${params.action}`;\n\t}\n\treturn undefined;\n}\n\n/** Snapshot clone: items are plain string/number records, so a shallow copy is safe. */\nexport function cloneTodoState(state: TodoState): TodoState {\n\treturn { items: state.items.map((item) => ({ ...item })), nextId: state.nextId };\n}\n\nfunction applyCreate(state: TodoState, params: TodoParams): TodoState {\n\tconst rawItems = params.items;\n\tif (!Array.isArray(rawItems) || rawItems.length === 0) throw new Error(\"items required for create\");\n\tif (rawItems.length > TODO_MAX_BATCH_ITEMS) throw new Error(`items exceeds ${TODO_MAX_BATCH_ITEMS} tasks`);\n\tif (state.items.length + rawItems.length > TODO_MAX_ITEMS) {\n\t\tthrow new Error(`todo list is full (max ${TODO_MAX_ITEMS} tasks)`);\n\t}\n\tif (!Number.isSafeInteger(state.nextId) || state.nextId < 1) throw new Error(\"next id is invalid\");\n\tif (state.nextId > Number.MAX_SAFE_INTEGER - rawItems.length) throw new Error(\"next id is exhausted\");\n\n\tconst sources: Array<{ subject: string; description: string }> = [];\n\tfor (let index = 0; index < rawItems.length; index++) {\n\t\tconst raw = rawItems[index];\n\t\tif (!isRecord(raw)) throw new Error(`items[${index}] must be an object`);\n\t\tfor (const key of Object.keys(raw)) {\n\t\t\tif (key !== \"subject\" && key !== \"description\") {\n\t\t\t\tthrow new Error(`items[${index}].${key} does not apply to action create`);\n\t\t\t}\n\t\t}\n\t\tsources.push({\n\t\t\tsubject: validateNormalizedText(raw.subject, `items[${index}].subject`, TODO_MAX_SUBJECT_LENGTH),\n\t\t\tdescription: validateNormalizedText(\n\t\t\t\traw.description,\n\t\t\t\t`items[${index}].description`,\n\t\t\t\tTODO_MAX_DESCRIPTION_LENGTH,\n\t\t\t),\n\t\t});\n\t}\n\n\t// Atomic: everything above is validated before the new state is built.\n\tconst created = sources.map((source, index) => ({\n\t\tid: state.nextId + index,\n\t\tsubject: source.subject,\n\t\tdescription: source.description,\n\t\tstatus: \"pending\" as const,\n\t}));\n\treturn { items: [...state.items, ...created], nextId: state.nextId + created.length };\n}\n\nfunction applyUpdate(state: TodoState, params: TodoParams): TodoState {\n\tconst id = params.id;\n\tif (!isPositiveSafeInteger(id)) throw new Error(\"id required for update\");\n\tconst index = state.items.findIndex((item) => item.id === id);\n\tif (index === -1) throw new Error(`#${id} not found`);\n\tif (params.subject === undefined && params.description === undefined && params.status === undefined) {\n\t\tthrow new Error(\"update requires at least one of subject, description, or status\");\n\t}\n\tconst subject =\n\t\tparams.subject === undefined\n\t\t\t? undefined\n\t\t\t: validateNormalizedText(params.subject, \"subject\", TODO_MAX_SUBJECT_LENGTH);\n\tconst description =\n\t\tparams.description === undefined\n\t\t\t? undefined\n\t\t\t: validateNormalizedText(params.description, \"description\", TODO_MAX_DESCRIPTION_LENGTH);\n\tif (params.status !== undefined && !isTodoStatus(params.status)) throw new Error(\"status is invalid\");\n\n\tconst current = state.items[index];\n\tconst updated: TodoItem = {\n\t\tid: current.id,\n\t\tsubject: subject ?? current.subject,\n\t\tdescription: description ?? current.description,\n\t\tstatus: params.status ?? current.status,\n\t};\n\n\t// Exactly one in_progress: setting one demotes every other active task.\n\tconst items = state.items.map((item, itemIndex) => {\n\t\tif (itemIndex === index) return updated;\n\t\tif (updated.status === \"in_progress\" && item.status === \"in_progress\") {\n\t\t\treturn { ...item, status: \"pending\" as const };\n\t\t}\n\t\treturn item;\n\t});\n\treturn { items, nextId: state.nextId };\n}\n\nfunction applyDelete(state: TodoState, params: TodoParams): TodoState {\n\tconst rawIds = params.ids;\n\tif (!Array.isArray(rawIds) || rawIds.length === 0) throw new Error(\"ids required for delete\");\n\tif (rawIds.length > TODO_MAX_BATCH_ITEMS) throw new Error(`ids exceeds ${TODO_MAX_BATCH_ITEMS} ids`);\n\tconst ids: number[] = [];\n\tfor (const raw of rawIds) {\n\t\tif (!isPositiveSafeInteger(raw)) throw new Error(\"ids must contain positive integer ids\");\n\t\tids.push(raw);\n\t}\n\tconst idsToRemove = dedupeIds(ids);\n\t// Atomic: every id must exist before anything is removed.\n\tconst byId = new Map(state.items.map((item) => [item.id, item]));\n\tfor (const candidate of idsToRemove) {\n\t\tif (!byId.has(candidate)) throw new Error(`#${candidate} not found`);\n\t}\n\tconst remove = new Set(idsToRemove);\n\treturn { items: state.items.filter((item) => !remove.has(item.id)), nextId: state.nextId };\n}\n\n/**\n * Pure action application: validates every runtime input and inapplicable\n * parameter (tool args can be tampered after schema validation), throws on\n * any invalid call, and never mutates the input state.\n */\nexport function applyTodoAction(state: TodoState, params: TodoParams): TodoState {\n\tif (!isRecord(params)) throw new Error(\"todo params must be an object\");\n\tif (!isTodoAction(params.action)) throw new Error(`unknown todo action: ${String(params.action)}`);\n\tconst inapplicable = findInapplicableParam(params);\n\tif (inapplicable) throw new Error(inapplicable);\n\tswitch (params.action) {\n\t\tcase \"create\":\n\t\t\treturn applyCreate(state, params);\n\t\tcase \"update\":\n\t\t\treturn applyUpdate(state, params);\n\t\tcase \"list\":\n\t\t\treturn cloneTodoState(state);\n\t\tcase \"delete\":\n\t\t\treturn applyDelete(state, params);\n\t}\n}\n\n/** Derive the operation model for one call from the before/after states. */\nexport function buildTodoChange(params: TodoParams, before: TodoState, after: TodoState): TodoChange {\n\tswitch (params.action) {\n\t\tcase \"create\": {\n\t\t\tconst count = Array.isArray(params.items) ? params.items.length : 0;\n\t\t\treturn { kind: \"create\", ids: after.items.slice(after.items.length - count).map((item) => item.id) };\n\t\t}\n\t\tcase \"update\": {\n\t\t\tconst id = params.id;\n\t\t\tif (!isPositiveSafeInteger(id)) throw new Error(\"id required for update\");\n\t\t\tconst demotedId = before.items.find(\n\t\t\t\t(item) => item.id !== id && item.status === \"in_progress\" && findItem(after, item.id)?.status === \"pending\",\n\t\t\t)?.id;\n\t\t\treturn {\n\t\t\t\tkind: \"update\",\n\t\t\t\tid,\n\t\t\t\tfrom: findItem(before, id)?.status ?? \"pending\",\n\t\t\t\tto: findItem(after, id)?.status ?? \"pending\",\n\t\t\t\t...(demotedId !== undefined ? { demotedId } : {}),\n\t\t\t};\n\t\t}\n\t\tcase \"list\":\n\t\t\treturn { kind: \"list\" };\n\t\tcase \"delete\": {\n\t\t\tconst ids = Array.isArray(params.ids) ? dedupeIds(params.ids) : [];\n\t\t\tconst removed = ids\n\t\t\t\t.map((id) => findItem(before, id))\n\t\t\t\t.filter((item): item is TodoItem => item !== undefined)\n\t\t\t\t.map((item) => ({ id: item.id, subject: item.subject }));\n\t\t\treturn { kind: \"delete\", removed };\n\t\t}\n\t}\n}\n\nexport function buildTodoDetails(change: TodoChange, state: TodoState): TodoDetails {\n\treturn { schemaVersion: TODO_DETAILS_SCHEMA_VERSION, change, state: cloneTodoState(state) };\n}\n\nexport interface TodoStore {\n\tgetState(): TodoState;\n\treplaceState(state: TodoState): void;\n\texecute(params: TodoParams): TodoDetails;\n}\n\nfunction requireValidState(value: unknown): TodoState {\n\tconst state = normalizeSnapshotState(value);\n\tif (!state) throw new Error(\"todo state is invalid\");\n\treturn state;\n}\n\n/** Closure-scoped store: one list per store, no module-global session state. */\nexport function createTodoStore(initial?: TodoState): TodoStore {\n\tlet state = requireValidState(initial ?? EMPTY_TODO_STATE);\n\treturn {\n\t\tgetState() {\n\t\t\treturn cloneTodoState(state);\n\t\t},\n\t\treplaceState(next: TodoState) {\n\t\t\tstate = requireValidState(next);\n\t\t},\n\t\texecute(params: TodoParams): TodoDetails {\n\t\t\tconst before = state;\n\t\t\tconst after = applyTodoAction(before, params);\n\t\t\tconst details = buildTodoDetails(buildTodoChange(params, before, after), after);\n\t\t\tstate = after;\n\t\t\treturn details;\n\t\t},\n\t};\n}\n\n/** Validate an external v2 snapshot; returns undefined when malformed. */\nfunction normalizeSnapshotState(value: unknown): TodoState | undefined {\n\tif (!isRecord(value) || !Array.isArray(value.items) || !isPositiveSafeInteger(value.nextId)) return undefined;\n\tif (value.items.length > TODO_MAX_ITEMS) return undefined;\n\tconst items: TodoItem[] = [];\n\tconst ids = new Set<number>();\n\tlet maxId = 0;\n\tlet activeCount = 0;\n\tfor (const rawItem of value.items) {\n\t\tif (!isRecord(rawItem)) return undefined;\n\t\tconst id = rawItem.id;\n\t\tif (!isPositiveSafeInteger(id) || ids.has(id)) return undefined;\n\t\tconst subject = rawItem.subject;\n\t\tconst description = rawItem.description;\n\t\tconst status = rawItem.status;\n\t\tif (typeof subject !== \"string\" || typeof description !== \"string\") return undefined;\n\t\tif (subject !== normalizeText(subject) || description !== normalizeText(description)) return undefined;\n\t\tif (!subject || subject.length > TODO_MAX_SUBJECT_LENGTH) return undefined;\n\t\tif (!description || description.length > TODO_MAX_DESCRIPTION_LENGTH) return undefined;\n\t\tif (!isTodoStatus(status)) return undefined;\n\t\tids.add(id);\n\t\tif (id > maxId) maxId = id;\n\t\tif (status === \"in_progress\") activeCount++;\n\t\titems.push({ id, subject, description, status });\n\t}\n\tif (activeCount > 1) return undefined;\n\tif (value.nextId <= maxId) return undefined;\n\treturn { items, nextId: value.nextId };\n}\n\n/**\n * Replay the newest valid v2 todo snapshot from a branch, scanning tail to\n * head so a malformed latest snapshot falls back to an earlier valid one.\n * v1 details are ignored, and the `change` field is not validated.\n */\nexport function replayTodosFromBranch(ctx: { sessionManager: { getBranch(): Iterable<unknown> } }): TodoState {\n\tconst branch = Array.from(ctx.sessionManager.getBranch());\n\tfor (let index = branch.length - 1; index >= 0; index--) {\n\t\tconst entry = branch[index];\n\t\tif (!isRecord(entry) || entry.type !== \"message\") continue;\n\t\tconst message = entry.message;\n\t\tif (!isRecord(message) || message.role !== \"toolResult\" || message.toolName !== TODO_TOOL_NAME) continue;\n\t\tconst details = message.details;\n\t\tif (!isRecord(details) || details.schemaVersion !== TODO_DETAILS_SCHEMA_VERSION) continue;\n\t\ttry {\n\t\t\tconst state = normalizeSnapshotState(details.state);\n\t\t\tif (state) return state;\n\t\t} catch {\n\t\t\t// Session history is external input; keep scanning for an earlier valid v2.\n\t\t}\n\t}\n\treturn cloneTodoState(EMPTY_TODO_STATE);\n}\n"]}
|
|
1
|
+
{"version":3,"file":"state.js","sourceRoot":"","sources":["../../../src/extensions/todo/state.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * todo/state.ts — v2 pure state core: closure-scoped store, atomic actions,\n * snapshot cloning, and branch replay. No session registry, metadata,\n * dependency graph, tombstones, filters, or legacy normalizers.\n */\nimport {\n\tTODO_MAX_BATCH_ITEMS,\n\tTODO_MAX_DESCRIPTION_LENGTH,\n\tTODO_MAX_ITEMS,\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 TodoChange,\n\ttype TodoDetails,\n\ttype TodoItem,\n\ttype TodoParams,\n\ttype TodoState,\n\ttype TodoStatus,\n} from \"./schema.ts\";\n\nconst TODO_STATUSES: ReadonlySet<TodoStatus> = new Set([\"pending\", \"in_progress\", \"completed\"]);\nconst TODO_ACTIONS: ReadonlySet<TodoAction> = new Set([\"create\", \"update\", \"list\", \"delete\"]);\n\n/** Parameters each action accepts; anything else is rejected with guidance. */\nconst ACTION_PARAMS: Record<TodoAction, ReadonlySet<string>> = {\n\tcreate: new Set([\"items\"]),\n\tupdate: new Set([\"id\", \"subject\", \"description\", \"status\"]),\n\tlist: new Set([]),\n\tdelete: new Set([\"ids\"]),\n};\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n\treturn value !== null && typeof value === \"object\" && !Array.isArray(value);\n}\n\nfunction isPositiveSafeInteger(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 findItem(state: TodoState, id: number): TodoItem | undefined {\n\treturn state.items.find((item) => item.id === id);\n}\n\n/** De-duplicate ids preserving first-seen input order. */\nfunction dedupeIds(ids: number[]): number[] {\n\tconst seen: number[] = [];\n\tfor (const id of ids) {\n\t\tif (!seen.includes(id)) seen.push(id);\n\t}\n\treturn seen;\n}\n\n/** Trim and collapse every internal whitespace run to a single space. */\nfunction normalizeText(value: string): string {\n\treturn value.trim().replace(/\\s+/g, \" \");\n}\n\nfunction validateNormalizedText(value: unknown, label: string, maximum: number): string {\n\tif (typeof value !== \"string\") throw new Error(`${label} must be a string`);\n\tconst normalized = normalizeText(value);\n\tif (!normalized) throw new Error(`${label} cannot be empty`);\n\tif (normalized.length > maximum) throw new Error(`${label} exceeds ${maximum} characters`);\n\treturn normalized;\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 `${key} does not apply to action ${params.action}`;\n\t}\n\treturn undefined;\n}\n\n/** Snapshot clone: items are plain string/number records, so a shallow copy is safe. */\nexport function cloneTodoState(state: TodoState): TodoState {\n\treturn { items: state.items.map((item) => ({ ...item })), nextId: state.nextId };\n}\n\nfunction applyCreate(state: TodoState, params: TodoParams): TodoState {\n\tconst rawItems = params.items;\n\tif (!Array.isArray(rawItems) || rawItems.length === 0) throw new Error(\"items required for create\");\n\tif (rawItems.length > TODO_MAX_BATCH_ITEMS) throw new Error(`items exceeds ${TODO_MAX_BATCH_ITEMS} tasks`);\n\tif (state.items.length + rawItems.length > TODO_MAX_ITEMS) {\n\t\tthrow new Error(`todo list is full (max ${TODO_MAX_ITEMS} tasks); delete completed or obsolete tasks first`);\n\t}\n\tif (!Number.isSafeInteger(state.nextId) || state.nextId < 1) throw new Error(\"next id is invalid\");\n\tif (state.nextId > Number.MAX_SAFE_INTEGER - rawItems.length) throw new Error(\"next id is exhausted\");\n\n\tconst sources: Array<{ subject: string; description: string }> = [];\n\tfor (let index = 0; index < rawItems.length; index++) {\n\t\tconst raw = rawItems[index];\n\t\tif (!isRecord(raw)) throw new Error(`items[${index}] must be an object`);\n\t\tfor (const key of Object.keys(raw)) {\n\t\t\tif (key !== \"subject\" && key !== \"description\") {\n\t\t\t\tthrow new Error(`items[${index}].${key} does not apply to action create`);\n\t\t\t}\n\t\t}\n\t\tsources.push({\n\t\t\tsubject: validateNormalizedText(raw.subject, `items[${index}].subject`, TODO_MAX_SUBJECT_LENGTH),\n\t\t\tdescription: validateNormalizedText(\n\t\t\t\traw.description,\n\t\t\t\t`items[${index}].description`,\n\t\t\t\tTODO_MAX_DESCRIPTION_LENGTH,\n\t\t\t),\n\t\t});\n\t}\n\n\t// Atomic: everything above is validated before the new state is built.\n\tconst created = sources.map((source, index) => ({\n\t\tid: state.nextId + index,\n\t\tsubject: source.subject,\n\t\tdescription: source.description,\n\t\tstatus: \"pending\" as const,\n\t}));\n\treturn { items: [...state.items, ...created], nextId: state.nextId + created.length };\n}\n\nfunction applyUpdate(state: TodoState, params: TodoParams): TodoState {\n\tconst id = params.id;\n\tif (!isPositiveSafeInteger(id)) throw new Error(\"id required for update\");\n\tconst index = state.items.findIndex((item) => item.id === id);\n\tif (index === -1) throw new Error(`#${id} not found`);\n\tif (params.subject === undefined && params.description === undefined && params.status === undefined) {\n\t\tthrow new Error(\"update requires at least one of subject, description, or status\");\n\t}\n\tconst subject =\n\t\tparams.subject === undefined\n\t\t\t? undefined\n\t\t\t: validateNormalizedText(params.subject, \"subject\", TODO_MAX_SUBJECT_LENGTH);\n\tconst description =\n\t\tparams.description === undefined\n\t\t\t? undefined\n\t\t\t: validateNormalizedText(params.description, \"description\", TODO_MAX_DESCRIPTION_LENGTH);\n\tif (params.status !== undefined && !isTodoStatus(params.status)) throw new Error(\"status is invalid\");\n\n\tconst current = state.items[index];\n\tconst updated: TodoItem = {\n\t\tid: current.id,\n\t\tsubject: subject ?? current.subject,\n\t\tdescription: description ?? current.description,\n\t\tstatus: params.status ?? current.status,\n\t};\n\n\t// Exactly one in_progress: setting one demotes every other active task.\n\tconst items = state.items.map((item, itemIndex) => {\n\t\tif (itemIndex === index) return updated;\n\t\tif (updated.status === \"in_progress\" && item.status === \"in_progress\") {\n\t\t\treturn { ...item, status: \"pending\" as const };\n\t\t}\n\t\treturn item;\n\t});\n\treturn { items, nextId: state.nextId };\n}\n\nfunction applyDelete(state: TodoState, params: TodoParams): TodoState {\n\tconst rawIds = params.ids;\n\tif (!Array.isArray(rawIds) || rawIds.length === 0) throw new Error(\"ids required for delete\");\n\tif (rawIds.length > TODO_MAX_BATCH_ITEMS) throw new Error(`ids exceeds ${TODO_MAX_BATCH_ITEMS} ids`);\n\tconst ids: number[] = [];\n\tfor (const raw of rawIds) {\n\t\tif (!isPositiveSafeInteger(raw)) throw new Error(\"ids must contain positive integer ids\");\n\t\tids.push(raw);\n\t}\n\tconst idsToRemove = dedupeIds(ids);\n\t// Atomic: every id must exist before anything is removed.\n\tconst byId = new Map(state.items.map((item) => [item.id, item]));\n\tfor (const candidate of idsToRemove) {\n\t\tif (!byId.has(candidate)) throw new Error(`#${candidate} not found`);\n\t}\n\tconst remove = new Set(idsToRemove);\n\treturn { items: state.items.filter((item) => !remove.has(item.id)), nextId: state.nextId };\n}\n\n/**\n * Pure action application: validates every runtime input and inapplicable\n * parameter (tool args can be tampered after schema validation), throws on\n * any invalid call, and never mutates the input state.\n */\nexport function applyTodoAction(state: TodoState, params: TodoParams): TodoState {\n\tif (!isRecord(params)) throw new Error(\"todo params must be an object\");\n\tif (!isTodoAction(params.action)) throw new Error(`unknown todo action: ${String(params.action)}`);\n\tconst inapplicable = findInapplicableParam(params);\n\tif (inapplicable) throw new Error(inapplicable);\n\tswitch (params.action) {\n\t\tcase \"create\":\n\t\t\treturn applyCreate(state, params);\n\t\tcase \"update\":\n\t\t\treturn applyUpdate(state, params);\n\t\tcase \"list\":\n\t\t\treturn cloneTodoState(state);\n\t\tcase \"delete\":\n\t\t\treturn applyDelete(state, params);\n\t}\n}\n\n/** Derive the operation model for one call from the before/after states. */\nexport function buildTodoChange(params: TodoParams, before: TodoState, after: TodoState): TodoChange {\n\tswitch (params.action) {\n\t\t// Derived from the validated before/after states rather than params.items,\n\t\t// which is external input and could read differently on a second access.\n\t\tcase \"create\":\n\t\t\treturn { kind: \"create\", ids: after.items.slice(before.items.length).map((item) => item.id) };\n\t\tcase \"update\": {\n\t\t\tconst id = params.id;\n\t\t\tif (!isPositiveSafeInteger(id)) throw new Error(\"id required for update\");\n\t\t\tconst demotedId = before.items.find(\n\t\t\t\t(item) => item.id !== id && item.status === \"in_progress\" && findItem(after, item.id)?.status === \"pending\",\n\t\t\t)?.id;\n\t\t\treturn {\n\t\t\t\tkind: \"update\",\n\t\t\t\tid,\n\t\t\t\tfrom: findItem(before, id)?.status ?? \"pending\",\n\t\t\t\tto: findItem(after, id)?.status ?? \"pending\",\n\t\t\t\t...(demotedId !== undefined ? { demotedId } : {}),\n\t\t\t};\n\t\t}\n\t\tcase \"list\":\n\t\t\treturn { kind: \"list\" };\n\t\tcase \"delete\": {\n\t\t\tconst ids = Array.isArray(params.ids) ? dedupeIds(params.ids) : [];\n\t\t\tconst removed = ids\n\t\t\t\t.map((id) => findItem(before, id))\n\t\t\t\t.filter((item): item is TodoItem => item !== undefined)\n\t\t\t\t.map((item) => ({ id: item.id, subject: item.subject }));\n\t\t\treturn { kind: \"delete\", removed };\n\t\t}\n\t}\n}\n\nexport function buildTodoDetails(change: TodoChange, state: TodoState): TodoDetails {\n\treturn { schemaVersion: TODO_DETAILS_SCHEMA_VERSION, change, state: cloneTodoState(state) };\n}\n\nexport interface TodoStore {\n\tgetState(): TodoState;\n\treplaceState(state: TodoState): void;\n\texecute(params: TodoParams): TodoDetails;\n}\n\nfunction requireValidState(value: unknown): TodoState {\n\tconst state = normalizeSnapshotState(value);\n\tif (!state) throw new Error(\"todo state is invalid\");\n\treturn state;\n}\n\n/** Closure-scoped store: one list per store, no module-global session state. */\nexport function createTodoStore(initial?: TodoState): TodoStore {\n\tlet state = requireValidState(initial ?? EMPTY_TODO_STATE);\n\treturn {\n\t\tgetState() {\n\t\t\treturn cloneTodoState(state);\n\t\t},\n\t\treplaceState(next: TodoState) {\n\t\t\tstate = requireValidState(next);\n\t\t},\n\t\texecute(params: TodoParams): TodoDetails {\n\t\t\tconst before = state;\n\t\t\tconst after = applyTodoAction(before, params);\n\t\t\tconst details = buildTodoDetails(buildTodoChange(params, before, after), after);\n\t\t\tstate = after;\n\t\t\treturn details;\n\t\t},\n\t};\n}\n\n/**\n * Validate an external v2 snapshot; returns undefined when malformed.\n *\n * Snapshot text must already be in normalizeText() form, which makes that\n * function's output part of the v2 persistence contract: relaxing or changing\n * it would silently invalidate every historical snapshot, falling back to an\n * earlier one or to the empty state with no diagnostic. Change normalizeText\n * only together with TODO_DETAILS_SCHEMA_VERSION.\n */\nfunction normalizeSnapshotState(value: unknown): TodoState | undefined {\n\tif (!isRecord(value) || !Array.isArray(value.items) || !isPositiveSafeInteger(value.nextId)) return undefined;\n\tif (value.items.length > TODO_MAX_ITEMS) return undefined;\n\tconst items: TodoItem[] = [];\n\tconst ids = new Set<number>();\n\tlet maxId = 0;\n\tlet activeCount = 0;\n\tfor (const rawItem of value.items) {\n\t\tif (!isRecord(rawItem)) return undefined;\n\t\tconst id = rawItem.id;\n\t\tif (!isPositiveSafeInteger(id) || ids.has(id)) return undefined;\n\t\tconst subject = rawItem.subject;\n\t\tconst description = rawItem.description;\n\t\tconst status = rawItem.status;\n\t\tif (typeof subject !== \"string\" || typeof description !== \"string\") return undefined;\n\t\tif (subject !== normalizeText(subject) || description !== normalizeText(description)) return undefined;\n\t\tif (!subject || subject.length > TODO_MAX_SUBJECT_LENGTH) return undefined;\n\t\tif (!description || description.length > TODO_MAX_DESCRIPTION_LENGTH) return undefined;\n\t\tif (!isTodoStatus(status)) return undefined;\n\t\tids.add(id);\n\t\tif (id > maxId) maxId = id;\n\t\tif (status === \"in_progress\") activeCount++;\n\t\titems.push({ id, subject, description, status });\n\t}\n\tif (activeCount > 1) return undefined;\n\tif (value.nextId <= maxId) return undefined;\n\treturn { items, nextId: value.nextId };\n}\n\n/**\n * Replay the newest valid v2 todo snapshot from a branch, scanning tail to\n * head so a malformed latest snapshot falls back to an earlier valid one.\n * v1 details are ignored, and the `change` field is not validated.\n */\nexport function replayTodosFromBranch(ctx: { sessionManager: { getBranch(): Iterable<unknown> } }): TodoState {\n\tconst branch = Array.from(ctx.sessionManager.getBranch());\n\tfor (let index = branch.length - 1; index >= 0; index--) {\n\t\t// Session history is external input, so every field read stays inside the\n\t\t// guard: a hostile entry falls through to an earlier snapshot instead of\n\t\t// escaping to the lifecycle handler.\n\t\ttry {\n\t\t\tconst entry = branch[index];\n\t\t\tif (!isRecord(entry) || entry.type !== \"message\") continue;\n\t\t\tconst message = entry.message;\n\t\t\tif (!isRecord(message) || message.role !== \"toolResult\" || message.toolName !== TODO_TOOL_NAME) continue;\n\t\t\tconst details = message.details;\n\t\t\tif (!isRecord(details) || details.schemaVersion !== TODO_DETAILS_SCHEMA_VERSION) continue;\n\t\t\tconst state = normalizeSnapshotState(details.state);\n\t\t\tif (state) return state;\n\t\t} catch {\n\t\t\t// Keep scanning for an earlier valid v2 snapshot.\n\t\t}\n\t}\n\treturn cloneTodoState(EMPTY_TODO_STATE);\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"view.d.ts","sourceRoot":"","sources":["../../../src/extensions/todo/view.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AACtE,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,wCAAwC,CAAC;AAOpE,OAAO,EAEN,KAAK,UAAU,EAEf,KAAK,UAAU,EACf,KAAK,SAAS,EACd,KAAK,UAAU,EACf,MAAM,aAAa,CAAC;AAErB,eAAO,MAAM,WAAW,EAAE,MAAM,CAAC,UAAU,EAAE,MAAM,CAIlD,CAAC;AAmBF,mFAAmF;AACnF,wBAAgB,YAAY,CAAC,KAAK,EAAE,SAAS,GAAG,OAAO,CAEtD;AAgCD,8HAA8H;AAC9H,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CAkExF;AAID,iFAAiF;AACjF,iBAAS,cAAc,CAAC,KAAK,EAAE,SAAS,GAAG,MAAM,CAYhD;AAED,yFAAyF;AACzF,eAAO,MAAM,iBAAiB,uBAAiB,CAAC;AAEhD,uFAAuF;AACvF,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,SAAS,GAAG,MAAM,CAyB9E;AASD,KAAK,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,UAAU,EAAE,OAAO,CAAC,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"view.d.ts","sourceRoot":"","sources":["../../../src/extensions/todo/view.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AACtE,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,wCAAwC,CAAC;AAOpE,OAAO,EAEN,KAAK,UAAU,EAEf,KAAK,UAAU,EACf,KAAK,SAAS,EACd,KAAK,UAAU,EACf,MAAM,aAAa,CAAC;AAErB,eAAO,MAAM,WAAW,EAAE,MAAM,CAAC,UAAU,EAAE,MAAM,CAIlD,CAAC;AAmBF,mFAAmF;AACnF,wBAAgB,YAAY,CAAC,KAAK,EAAE,SAAS,GAAG,OAAO,CAEtD;AAgCD,8HAA8H;AAC9H,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CAkExF;AAID,iFAAiF;AACjF,iBAAS,cAAc,CAAC,KAAK,EAAE,SAAS,GAAG,MAAM,CAYhD;AAED,yFAAyF;AACzF,eAAO,MAAM,iBAAiB,uBAAiB,CAAC;AAEhD,uFAAuF;AACvF,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,SAAS,GAAG,MAAM,CAyB9E;AASD,KAAK,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,UAAU,EAAE,OAAO,CAAC,CAAC,CAAC;AAsM/D,iFAAiF;AACjF,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,CAGR;AAyGD,MAAM,WAAW,sBAAsB;IACtC,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,EAAE,OAAO,CAAC;IACnB,MAAM,CAAC,EAAE,eAAe,CAAC,OAAO,CAAC,CAAC;CAClC;AAED,4EAA4E;AAC5E,wBAAgB,mBAAmB,CAClC,IAAI,EAAE,YAAY,GAAG,SAAS,EAC9B,KAAK,EAAE,KAAK,EACZ,OAAO,EAAE,sBAAsB,GAC7B,MAAM,CAwBR"}
|
|
@@ -276,9 +276,11 @@ function descriptionPreview(value) {
|
|
|
276
276
|
}
|
|
277
277
|
/** At most two subjects, each truncated to the preview width, plus `+N more`. */
|
|
278
278
|
function formatSubjectPreview(subjects, total) {
|
|
279
|
+
// Filter before slicing so an empty subject (streaming args) does not consume
|
|
280
|
+
// a preview slot.
|
|
279
281
|
const shown = subjects
|
|
280
|
-
.slice(0, CALL_SUBJECT_PREVIEW_COUNT)
|
|
281
282
|
.filter(Boolean)
|
|
283
|
+
.slice(0, CALL_SUBJECT_PREVIEW_COUNT)
|
|
282
284
|
.map((subject) => truncateToWidth(subject, CALL_SUBJECT_PREVIEW_WIDTH, "…"));
|
|
283
285
|
if (!shown.length)
|
|
284
286
|
return "";
|
|
@@ -307,6 +309,13 @@ function createResultIds(result, count) {
|
|
|
307
309
|
const ids = readIds(safeValue(details.change, "ids"), true);
|
|
308
310
|
return ids?.length === count ? ids : undefined;
|
|
309
311
|
}
|
|
312
|
+
/** Removed entries for an expanded delete; absent until a v2 delete result arrives. */
|
|
313
|
+
function deleteResultRemoved(result) {
|
|
314
|
+
const details = todoDetails(result?.details);
|
|
315
|
+
if (!details || safeString(safeValue(details.change, "kind")) !== "delete")
|
|
316
|
+
return undefined;
|
|
317
|
+
return removedEntries(safeValue(details.change, "removed"));
|
|
318
|
+
}
|
|
310
319
|
/** Headline plus the parameters the result never echoes as detail lines. */
|
|
311
320
|
function formatCallParts(args, theme, result) {
|
|
312
321
|
const action = clipText(args?.action, TODO_MAX_SUBJECT_LENGTH);
|
|
@@ -348,10 +357,12 @@ function formatCallParts(args, theme, result) {
|
|
|
348
357
|
}
|
|
349
358
|
else if (verb === "delete") {
|
|
350
359
|
const ids = readIds(args?.ids, false) ?? [];
|
|
351
|
-
if (ids.length)
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
360
|
+
if (ids.length)
|
|
361
|
+
headline.push(theme.fg("accent", ids.map((id) => `#${id}`).join(", ")));
|
|
362
|
+
// The headline already carries the ids, so details only earn their line
|
|
363
|
+
// once the result names what was actually removed.
|
|
364
|
+
for (const entry of deleteResultRemoved(result) ?? []) {
|
|
365
|
+
details.push(`${theme.fg("accent", `#${entry.id}`)} ${theme.fg("text", entry.subject)}`);
|
|
355
366
|
}
|
|
356
367
|
}
|
|
357
368
|
return { headline: headline.join(" "), details };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"view.js","sourceRoot":"","sources":["../../../src/extensions/todo/view.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * todo/view.ts — v2 presentation: the one-line above-editor widget renderer,\n * tool call/group renderers, the /todos list formatter, and model-facing\n * result text. Wire input (args, details, snapshots) is read defensively and\n * bounded so partial or hostile input cannot grow output without limit.\n */\n\nimport { truncateToWidth, visibleWidth } from \"@earendil-works/pi-tui\";\nimport type { AgentToolResult } from \"../../core/extensions/types.ts\";\nimport type { Theme } from \"../../modes/interactive/theme/theme.ts\";\nimport {\n\tTODO_MAX_BATCH_ITEMS,\n\tTODO_MAX_DESCRIPTION_LENGTH,\n\tTODO_MAX_ITEMS,\n\tTODO_MAX_SUBJECT_LENGTH,\n} from \"./constants.ts\";\nimport {\n\tTODO_DETAILS_SCHEMA_VERSION,\n\ttype TodoChange,\n\ttype TodoItem,\n\ttype TodoParams,\n\ttype TodoState,\n\ttype TodoStatus,\n} from \"./schema.ts\";\n\nexport const STATUS_MARK: Record<TodoStatus, string> = {\n\tpending: \"[ ]\",\n\tin_progress: \"[>]\",\n\tcompleted: \"[x]\",\n};\n\nconst STATUS_COLOR: Record<TodoStatus, \"dim\" | \"warning\" | \"success\"> = {\n\tpending: \"dim\",\n\tin_progress: \"warning\",\n\tcompleted: \"success\",\n};\n\nconst STATUS_RANK: Record<TodoStatus, number> = {\n\tin_progress: 0,\n\tpending: 1,\n\tcompleted: 2,\n};\n\n// --- One-line widget --------------------------------------------------------\n\nconst WIDGET_HEADER_SEPARATOR = \" · \";\nconst WIDGET_ITEM_SEPARATOR = \" \";\n\n/** True while any open task exists; the widget is registered only in that case. */\nexport function hasOpenTodos(state: TodoState): boolean {\n\treturn state.items.some((item) => item.status === \"pending\" || item.status === \"in_progress\");\n}\n\n/** Status counts across the whole list. */\nfunction widgetCounts(state: TodoState): { active: number; pending: number; completed: number } {\n\tconst counts = { active: 0, pending: 0, completed: 0 };\n\tfor (const item of state.items) {\n\t\tif (item.status === \"in_progress\") counts.active++;\n\t\telse if (item.status === \"pending\") counts.pending++;\n\t\telse counts.completed++;\n\t}\n\treturn counts;\n}\n\nfunction widgetSegment(item: TodoItem, subject: string, theme: Theme): string {\n\treturn `${theme.fg(STATUS_COLOR[item.status], STATUS_MARK[item.status])} ${theme.fg(\"accent\", `#${item.id}`)} ${theme.fg(\"text\", subject)}`;\n}\n\nfunction widgetLine(header: string, segments: string[], overflow: string): string {\n\tconst body = [...segments, ...(overflow ? [overflow] : [])].join(WIDGET_ITEM_SEPARATOR);\n\treturn body ? `${header}${WIDGET_HEADER_SEPARATOR}${body}` : header;\n}\n\n/** Long overflow with counts (zero parts omitted), e.g. `+4 more (4 completed)`. */\nfunction widgetOverflowLong(remaining: number, counts: { active: number; pending: number; completed: number }): string {\n\tconst parts = [\n\t\tcounts.active > 0 ? `${counts.active} active` : \"\",\n\t\tcounts.pending > 0 ? `${counts.pending} pending` : \"\",\n\t\tcounts.completed > 0 ? `${counts.completed} completed` : \"\",\n\t].filter(Boolean);\n\treturn `+${remaining} more${parts.length ? ` (${parts.join(\", \")})` : \"\"}`;\n}\n\n/** One-line widget: `Todos 2/6 · [>] #4 s [ ] #5 s +N more (…)`; completed tasks are hidden but counted in the overflow. */\nexport function renderWidgetLine(state: TodoState, theme: Theme, width: number): string[] {\n\tconst safeWidth = Math.max(1, width);\n\tconst items = state.items;\n\tconst candidates = items\n\t\t.filter((item) => item.status !== \"completed\")\n\t\t.sort((first, second) => STATUS_RANK[first.status] - STATUS_RANK[second.status] || first.id - second.id);\n\tif (candidates.length === 0) return [];\n\n\tconst total = items.length;\n\tconst completed = items.filter((item) => item.status === \"completed\").length;\n\tconst header = `${theme.fg(\"accent\", \"Todos\")} ${theme.fg(\"dim\", `${completed}/${total}`)}`;\n\tconst counts = widgetCounts(state);\n\tconst shown: Array<{ item: TodoItem; subject: string }> = [];\n\tlet overflow = \"\";\n\n\t// Best overflow for a trial segment set: the long counts form when it fits,\n\t// the short `+N more` form otherwise, undefined when even that overflows.\n\tconst bestOverflow = (trial: Array<{ item: TodoItem; subject: string }>): string | undefined => {\n\t\tconst remaining = total - trial.length;\n\t\tconst segments = trial.map((entry) => widgetSegment(entry.item, entry.subject, theme));\n\t\tconst activeShown = trial.some((entry) => entry.item.status === \"in_progress\") ? 1 : 0;\n\t\tconst hidden: typeof counts = {\n\t\t\tactive: counts.active - activeShown,\n\t\t\tpending: counts.pending - (trial.length - activeShown),\n\t\t\tcompleted: counts.completed,\n\t\t};\n\t\tif (remaining <= 0) return visibleWidth(widgetLine(header, segments, \"\")) <= safeWidth ? \"\" : undefined;\n\t\tconst long = theme.fg(\"dim\", widgetOverflowLong(remaining, hidden));\n\t\tif (visibleWidth(widgetLine(header, segments, long)) <= safeWidth) return long;\n\t\tconst short = theme.fg(\"dim\", `+${remaining} more`);\n\t\treturn visibleWidth(widgetLine(header, segments, short)) <= safeWidth ? short : undefined;\n\t};\n\n\t// Extreme narrow widths: the best summary that fits, then the bare header.\n\tconst fallback = (): string[] => {\n\t\tconst best = bestOverflow([]);\n\t\tif (best !== undefined) return [widgetLine(header, [], best)];\n\t\tif (visibleWidth(header) <= safeWidth) return [header];\n\t\treturn [truncateToWidth(header, safeWidth, \"…\")];\n\t};\n\n\t// Segments are added whole, active first then pending by id, while the\n\t// line keeps fitting; only the active subject may be truncated.\n\tfor (const candidate of candidates) {\n\t\tconst best = bestOverflow([...shown, { item: candidate, subject: candidate.subject }]);\n\t\tif (best !== undefined) {\n\t\t\tshown.push({ item: candidate, subject: candidate.subject });\n\t\t\toverflow = best;\n\t\t\tcontinue;\n\t\t}\n\t\tif (candidate.status !== \"in_progress\") break;\n\t\tconst remaining = total - shown.length - 1;\n\t\tconst suffix = remaining > 0 ? `${WIDGET_ITEM_SEPARATOR}+${remaining} more` : \"\";\n\t\tconst prefix = `${header}${WIDGET_HEADER_SEPARATOR}${widgetSegment(candidate, \"\", theme)}${suffix}`;\n\t\tconst available = safeWidth - visibleWidth(prefix);\n\t\tif (available < 1) return fallback();\n\t\tshown.push({ item: candidate, subject: truncateToWidth(candidate.subject, available, \"…\") });\n\t\toverflow = bestOverflow(shown) ?? \"\";\n\t}\n\n\tif (shown.length === 0) return fallback();\n\n\tconst segments = shown.map((entry) => widgetSegment(entry.item, entry.subject, theme));\n\tconst line = widgetLine(header, segments, overflow);\n\t// Safety net: the visible width always stays within the terminal width.\n\treturn [visibleWidth(line) <= safeWidth ? line : truncateToWidth(line, safeWidth, \"…\")];\n}\n\n// --- Full list (used by /todos and the model-facing list result) ------------\n\n/** `Todos: X in progress, Y pending, Z completed` header plus two-line tasks. */\nfunction formatTodoList(state: TodoState): string {\n\tif (state.items.length === 0) return \"No todos.\";\n\tconst counts = widgetCounts(state);\n\tconst lines = [`Todos: ${counts.active} in progress, ${counts.pending} pending, ${counts.completed} completed`];\n\tconst items = [...state.items].sort(\n\t\t(first, second) => STATUS_RANK[first.status] - STATUS_RANK[second.status] || first.id - second.id,\n\t);\n\tfor (const item of items) {\n\t\tlines.push(`${STATUS_MARK[item.status]} #${item.id} ${item.subject}`);\n\t\tlines.push(` ${item.description}`);\n\t}\n\treturn lines.join(\"\\n\");\n}\n\n/** /todos command output: full list, subject line plus indented description per task. */\nexport const formatCommandList = formatTodoList;\n\n/** Model-facing text for one completed todo call; bounded by list and input limits. */\nexport function formatTodoContent(change: TodoChange, state: TodoState): string {\n\tswitch (change.kind) {\n\t\tcase \"create\": {\n\t\t\tconst parts = change.ids.map((id) => {\n\t\t\t\tconst item = state.items.find((entry) => entry.id === id);\n\t\t\t\treturn item ? `#${item.id}: ${item.subject}` : `#${id}`;\n\t\t\t});\n\t\t\tconst noun = change.ids.length === 1 ? \"task\" : \"tasks\";\n\t\t\treturn `Created ${change.ids.length} ${noun}${parts.length ? `: ${parts.join(\"; \")}` : \"\"}`;\n\t\t}\n\t\tcase \"update\": {\n\t\t\tconst item = state.items.find((entry) => entry.id === change.id);\n\t\t\tconst subject = item ? `: ${item.subject}` : \"\";\n\t\t\tconst transition = change.from === change.to ? \"\" : ` (${change.from} -> ${change.to})`;\n\t\t\tconst demoted = change.demotedId !== undefined ? `; demoted #${change.demotedId} to pending` : \"\";\n\t\t\treturn `Updated #${change.id}${transition}${subject}${demoted}`;\n\t\t}\n\t\tcase \"list\":\n\t\t\treturn formatTodoList(state);\n\t\tcase \"delete\": {\n\t\t\tconst noun = change.removed.length === 1 ? \"task\" : \"tasks\";\n\t\t\tconst parts = change.removed.map((entry) => `#${entry.id}: ${entry.subject}`);\n\t\t\treturn `Deleted ${change.removed.length} ${noun}${parts.length ? `: ${parts.join(\"; \")}` : \"\"}`;\n\t\t}\n\t}\n}\n\n// --- Tool calls and collapsed group summaries -------------------------------\n\n// Collapsed todo calls join the `todo` group as one headline per row. Args can\n// be partial or hostile and details may come from any source, so one defensive\n// reading family (record/field/text/id/status/array) serves both renderers.\n// Output stays bounded: batches at 20, subjects at 160, descriptions at 500.\n\ntype TodoCallArgs = Partial<Record<keyof TodoParams, unknown>>;\n\nconst CALL_ITEMS_MAX = TODO_MAX_BATCH_ITEMS;\nconst CALL_SUBJECT_PREVIEW_COUNT = 2;\nconst CALL_SUBJECT_PREVIEW_WIDTH = 72;\nconst CALL_DESCRIPTION_PREVIEW_LENGTH = 120;\nconst GROUP_FAILURE_MAX_LENGTH = 120;\nconst TODO_ACTIONS = new Set([\"create\", \"update\", \"list\", \"delete\"]);\n\n/** Record-like read; proxies that throw on inspection are treated as absent. */\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\n/** Field read that never throws, even for exotic objects with throwing getters. */\nfunction safeValue(record: Record<string, unknown> | undefined, 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\n/** Trimmed, whitespace-collapsed, length-clipped text (empty when absent). */\nfunction clipText(value: unknown, max: number): string {\n\treturn safeString(value)?.trim().replace(/\\s+/g, \" \").slice(0, max) ?? \"\";\n}\n\nconst safeSubject = (value: unknown): string => clipText(value, TODO_MAX_SUBJECT_LENGTH);\nconst safeDescription = (value: unknown): string => clipText(value, TODO_MAX_DESCRIPTION_LENGTH);\n\nfunction safeId(value: unknown): number | undefined {\n\treturn typeof value === \"number\" && Number.isSafeInteger(value) && value >= 1 ? value : undefined;\n}\n\nfunction safeStatus(value: unknown): TodoStatus | undefined {\n\tconst status = safeString(value);\n\tif (status === \"pending\" || status === \"in_progress\" || status === \"completed\") return status;\n\treturn undefined;\n}\n\nfunction readArray(value: unknown, limit = CALL_ITEMS_MAX): { values: unknown[]; length: number } | undefined {\n\ttry {\n\t\tif (!Array.isArray(value)) return undefined;\n\t\tconst length = value.length;\n\t\tconst values: unknown[] = [];\n\t\tfor (let index = 0; index < Math.min(length, limit); index++) {\n\t\t\ttry {\n\t\t\t\tvalues.push(value[index]);\n\t\t\t} catch {\n\t\t\t\tvalues.push(undefined);\n\t\t\t}\n\t\t}\n\t\treturn { values, length };\n\t} catch {\n\t\treturn undefined;\n\t}\n}\n\n/** Id lists: lenient for delete args (invalid entries drop), strict for result changes (any invalid entry rejects). */\nfunction readIds(value: unknown, strict: boolean): number[] | undefined {\n\tconst array = readArray(value);\n\tif (strict && (!array || array.length === 0 || array.length > CALL_ITEMS_MAX)) return undefined;\n\tif (!array) return strict ? undefined : [];\n\tconst ids: number[] = [];\n\tfor (const entry of array.values) {\n\t\tconst id = safeId(entry);\n\t\tif (id === undefined) {\n\t\t\tif (strict) return undefined;\n\t\t\tcontinue;\n\t\t}\n\t\tids.push(id);\n\t}\n\treturn ids;\n}\n\n/** Create args: sparse or invalid entries drop; the batch caps at the maximum. */\nfunction batchItems(value: unknown): Array<{ subject: string; description: string }> {\n\tconst result: Array<{ subject: string; description: string }> = [];\n\tfor (const raw of readArray(value)?.values ?? []) {\n\t\tconst item = safeRecord(raw);\n\t\tif (!item) continue;\n\t\tresult.push({\n\t\t\tsubject: safeSubject(safeValue(item, \"subject\")),\n\t\t\tdescription: safeDescription(safeValue(item, \"description\")),\n\t\t});\n\t}\n\treturn result;\n}\n\nfunction descriptionPreview(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\n/** At most two subjects, each truncated to the preview width, plus `+N more`. */\nfunction formatSubjectPreview(subjects: string[], total: number): string {\n\tconst shown = subjects\n\t\t.slice(0, CALL_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\n/** v2 details guard shared by the call and group renderers. */\nfunction todoDetails(value: unknown): { change: Record<string, unknown>; state: Record<string, unknown> } | undefined {\n\tconst details = safeRecord(value);\n\tif (!details || safeValue(details, \"schemaVersion\") !== TODO_DETAILS_SCHEMA_VERSION) return undefined;\n\tconst change = safeRecord(safeValue(details, \"change\"));\n\tconst state = safeRecord(safeValue(details, \"state\"));\n\tif (!change || !state) return undefined;\n\tconst kind = safeString(safeValue(change, \"kind\"));\n\tif (!kind || !TODO_ACTIONS.has(kind)) return undefined;\n\treturn { change, state };\n}\n\n/** Result ids for an expanded create, only when they match the shown items. */\nfunction createResultIds(result: AgentToolResult<unknown> | undefined, count: number): number[] | undefined {\n\tconst details = todoDetails(result?.details);\n\tif (!details || safeString(safeValue(details.change, \"kind\")) !== \"create\") return undefined;\n\tconst ids = readIds(safeValue(details.change, \"ids\"), true);\n\treturn ids?.length === count ? ids : undefined;\n}\n\n/** Headline plus the parameters the result never echoes as detail lines. */\nfunction formatCallParts(\n\targs: TodoCallArgs | undefined,\n\ttheme: Theme,\n\tresult?: AgentToolResult<unknown>,\n): { headline: string; details: string[] } {\n\tconst action = clipText(args?.action, TODO_MAX_SUBJECT_LENGTH);\n\tconst verb = TODO_ACTIONS.has(action) ? action : undefined;\n\tconst headline: string[] = [theme.fg(\"toolTitle\", theme.bold(verb ? `todo ${verb}` : \"todo\"))];\n\tconst details: string[] = [];\n\n\tif (verb === \"create\") {\n\t\tconst items = batchItems(args?.items);\n\t\tconst rawCount = readArray(args?.items)?.length;\n\t\tif (rawCount !== undefined) {\n\t\t\tconst count = Math.min(rawCount, CALL_ITEMS_MAX);\n\t\t\theadline.push(theme.fg(\"dim\", `${count} ${count === 1 ? \"task\" : \"tasks\"}`));\n\t\t\tconst subjects = items.map((item) => item.subject);\n\t\t\tconst preview = formatSubjectPreview(subjects, count);\n\t\t\tif (preview) headline.push(theme.fg(\"dim\", \"·\"), theme.fg(\"text\", preview));\n\t\t}\n\t\tconst ids = createResultIds(result, items.length);\n\t\tfor (const [index, item] of items.entries()) {\n\t\t\tconst marker = ids ? theme.fg(\"accent\", `#${ids[index]}`) : theme.fg(\"accent\", `${index + 1}.`);\n\t\t\tdetails.push(item.subject ? `${marker} ${theme.fg(\"text\", item.subject)}` : marker);\n\t\t\tif (item.description) details.push(` ${theme.fg(\"dim\", descriptionPreview(item.description))}`);\n\t\t}\n\t} else if (verb === \"update\") {\n\t\tconst id = safeId(args?.id);\n\t\tif (id !== undefined) headline.push(theme.fg(\"accent\", `#${id}`));\n\t\tconst status = safeStatus(args?.status);\n\t\tif (status) headline.push(theme.fg(STATUS_COLOR[status], status));\n\t\tconst subject = safeSubject(args?.subject);\n\t\tif (subject) headline.push(theme.fg(\"text\", truncateToWidth(subject, CALL_SUBJECT_PREVIEW_WIDTH, \"…\")));\n\t\tconst description = safeDescription(args?.description);\n\t\tif (description) details.push(` ${theme.fg(\"dim\", descriptionPreview(description))}`);\n\t} else if (verb === \"delete\") {\n\t\tconst ids = readIds(args?.ids, false) ?? [];\n\t\tif (ids.length) {\n\t\t\tconst rendered = theme.fg(\"accent\", ids.map((id) => `#${id}`).join(\", \"));\n\t\t\theadline.push(rendered);\n\t\t\tdetails.push(rendered);\n\t\t}\n\t}\n\n\treturn { headline: headline.join(\" \"), details };\n}\n\n/** One-line call summary when collapsed; headline plus details when expanded. */\nexport function formatTodoCall(\n\targs: TodoCallArgs | undefined,\n\ttheme: Theme,\n\texpanded: boolean,\n\tresult?: AgentToolResult<unknown>,\n): string {\n\tconst { headline, details } = formatCallParts(args, theme, result);\n\treturn !expanded || details.length === 0 ? headline : [headline, ...details].join(\"\\n\");\n}\n\n/** Id -> item index plus status counts over the v2 snapshot (one defensive walk). */\nfunction stateIndex(state: Record<string, unknown>):\n\t| {\n\t\t\tbyId: Map<number, Record<string, unknown>>;\n\t\t\tcounts: { inProgress: number; pending: number; completed: number };\n\t }\n\t| undefined {\n\tconst array = readArray(safeValue(state, \"items\"), TODO_MAX_ITEMS);\n\tif (!array || array.length > TODO_MAX_ITEMS) return undefined;\n\tconst byId = new Map<number, Record<string, unknown>>();\n\tconst counts = { inProgress: 0, pending: 0, completed: 0 };\n\tfor (const raw of array.values) {\n\t\tconst item = safeRecord(raw);\n\t\tif (!item) continue;\n\t\tconst id = safeId(safeValue(item, \"id\"));\n\t\tif (id !== undefined && !byId.has(id)) byId.set(id, item);\n\t\tconst status = safeStatus(safeValue(item, \"status\"));\n\t\tif (status === \"in_progress\") counts.inProgress++;\n\t\telse if (status === \"pending\") counts.pending++;\n\t\telse if (status === \"completed\") counts.completed++;\n\t}\n\treturn { byId, counts };\n}\n\nfunction stateSubject(map: Map<number, Record<string, unknown>>, id: number): string {\n\tconst item = map.get(id);\n\treturn item ? safeSubject(safeValue(item, \"subject\")) : \"\";\n}\n\n/** Deleted entries: one invalid or empty entry rejects the whole list. */\nfunction removedEntries(value: unknown): Array<{ id: number; subject: string }> | undefined {\n\tconst array = readArray(value);\n\tif (!array || array.length === 0 || array.length > CALL_ITEMS_MAX) return undefined;\n\tconst removed: Array<{ id: number; subject: string }> = [];\n\tfor (const raw of array.values) {\n\t\tconst id = safeId(safeValue(safeRecord(raw), \"id\"));\n\t\tconst subject = safeSubject(safeValue(safeRecord(raw), \"subject\"));\n\t\tif (id === undefined || !subject) return undefined;\n\t\tremoved.push({ id, subject });\n\t}\n\treturn removed;\n}\n\nfunction formatTodoGroupSuccess(\n\targs: TodoCallArgs | undefined,\n\ttheme: Theme,\n\tresult: AgentToolResult<unknown>,\n): string | undefined {\n\tconst parsed = todoDetails(result.details);\n\tif (!parsed) return undefined;\n\tconst { change, state } = parsed;\n\tconst verb = (word: string) => theme.fg(\"toolTitle\", `todo ${word}`);\n\tconst withPreview = (word: string, ids: number[], subjects: string[]): string => {\n\t\tconst text = formatSubjectPreview(subjects, subjects.length);\n\t\tconst consecutive = ids.length > 1 && ids.every((id, index) => id === ids[0] + index);\n\t\tconst rendered = consecutive ? `#${ids[0]}–#${ids.at(-1)}` : ids.map((id) => `#${id}`).join(\", \");\n\t\tconst base = `${verb(word)} ${theme.fg(\"accent\", rendered)}`;\n\t\treturn text ? `${base}${theme.fg(\"dim\", \" · \")}${theme.fg(\"text\", text)}` : base;\n\t};\n\tconst kind = safeString(safeValue(change, \"kind\"));\n\n\tif (kind === \"create\") {\n\t\tconst ids = readIds(safeValue(change, \"ids\"), true);\n\t\tconst index = stateIndex(state);\n\t\tif (!ids || !index) return undefined;\n\t\tconst subjects = ids.map((id) => stateSubject(index.byId, id));\n\t\treturn withPreview(\"created\", ids, subjects);\n\t}\n\tif (kind === \"update\") {\n\t\tconst id = safeId(safeValue(change, \"id\"));\n\t\tconst index = stateIndex(state);\n\t\tif (id === undefined || !index) return undefined;\n\t\tconst to = safeStatus(safeValue(change, \"to\"));\n\t\tconst demotedId = safeId(safeValue(change, \"demotedId\"));\n\t\tconst parts = [verb(\"updated\"), theme.fg(\"accent\", `#${id}`)];\n\t\tif (to) parts.push(theme.fg(STATUS_COLOR[to], to));\n\t\tconst subject = stateSubject(index.byId, id) || safeSubject(args?.subject) || \"\";\n\t\tif (subject) parts.push(theme.fg(\"text\", truncateToWidth(subject, CALL_SUBJECT_PREVIEW_WIDTH, \"…\")));\n\t\tif (demotedId !== undefined) parts.push(theme.fg(\"dim\", `· demoted #${demotedId}`));\n\t\treturn parts.join(\" \");\n\t}\n\tif (kind === \"list\") {\n\t\tconst counts = stateIndex(state)?.counts;\n\t\tif (!counts) return undefined;\n\t\tconst parts: string[] = [];\n\t\tif (counts.inProgress > 0) parts.push(`${counts.inProgress} in progress`);\n\t\tif (counts.pending > 0) parts.push(`${counts.pending} pending`);\n\t\tif (counts.completed > 0) parts.push(`${counts.completed} completed`);\n\t\treturn `${verb(\"list\")}: ${theme.fg(\"dim\", parts.length ? parts.join(\", \") : \"no tasks\")}`;\n\t}\n\tif (kind === \"delete\") {\n\t\tconst removed = removedEntries(safeValue(change, \"removed\"));\n\t\tif (!removed) return undefined;\n\t\tconst subjects = removed.map((entry) => entry.subject);\n\t\treturn withPreview(\n\t\t\t\"deleted\",\n\t\t\tremoved.map((entry) => entry.id),\n\t\t\tsubjects,\n\t\t);\n\t}\n\treturn undefined;\n}\n\nexport interface TodoGroupRenderContext {\n\tisError: boolean;\n\tisPartial: boolean;\n\tresult?: AgentToolResult<unknown>;\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\tlet reason = \"tool failed\";\n\t\ttry {\n\t\t\tfor (const block of context.result?.content.slice(0, 8) ?? []) {\n\t\t\t\tif (block.type !== \"text\" || typeof block.text !== \"string\") continue;\n\t\t\t\tconst text = block.text\n\t\t\t\t\t.replace(/[\\u0000-\\u001f\\u007f-\\u009f]/g, \" \")\n\t\t\t\t\t.replace(/\\s+/g, \" \")\n\t\t\t\t\t.trim();\n\t\t\t\tif (!text) continue;\n\t\t\t\treason = text.length > GROUP_FAILURE_MAX_LENGTH ? `${text.slice(0, GROUP_FAILURE_MAX_LENGTH - 1)}…` : text;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t} catch {\n\t\t\t// Tool results can come from historical or third-party sources.\n\t\t}\n\t\treturn `${formatTodoCall(args, theme, false)} ${theme.fg(\"error\", `failed: ${reason}`)}`;\n\t}\n\tif (!context.isPartial && context.result) {\n\t\tconst summary = formatTodoGroupSuccess(args, theme, context.result);\n\t\tif (summary) return summary;\n\t}\n\treturn formatTodoCall(args, theme, false);\n}\n"]}
|
|
1
|
+
{"version":3,"file":"view.js","sourceRoot":"","sources":["../../../src/extensions/todo/view.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * todo/view.ts — v2 presentation: the one-line above-editor widget renderer,\n * tool call/group renderers, the /todos list formatter, and model-facing\n * result text. Wire input (args, details, snapshots) is read defensively and\n * bounded so partial or hostile input cannot grow output without limit.\n */\n\nimport { truncateToWidth, visibleWidth } from \"@earendil-works/pi-tui\";\nimport type { AgentToolResult } from \"../../core/extensions/types.ts\";\nimport type { Theme } from \"../../modes/interactive/theme/theme.ts\";\nimport {\n\tTODO_MAX_BATCH_ITEMS,\n\tTODO_MAX_DESCRIPTION_LENGTH,\n\tTODO_MAX_ITEMS,\n\tTODO_MAX_SUBJECT_LENGTH,\n} from \"./constants.ts\";\nimport {\n\tTODO_DETAILS_SCHEMA_VERSION,\n\ttype TodoChange,\n\ttype TodoItem,\n\ttype TodoParams,\n\ttype TodoState,\n\ttype TodoStatus,\n} from \"./schema.ts\";\n\nexport const STATUS_MARK: Record<TodoStatus, string> = {\n\tpending: \"[ ]\",\n\tin_progress: \"[>]\",\n\tcompleted: \"[x]\",\n};\n\nconst STATUS_COLOR: Record<TodoStatus, \"dim\" | \"warning\" | \"success\"> = {\n\tpending: \"dim\",\n\tin_progress: \"warning\",\n\tcompleted: \"success\",\n};\n\nconst STATUS_RANK: Record<TodoStatus, number> = {\n\tin_progress: 0,\n\tpending: 1,\n\tcompleted: 2,\n};\n\n// --- One-line widget --------------------------------------------------------\n\nconst WIDGET_HEADER_SEPARATOR = \" · \";\nconst WIDGET_ITEM_SEPARATOR = \" \";\n\n/** True while any open task exists; the widget is registered only in that case. */\nexport function hasOpenTodos(state: TodoState): boolean {\n\treturn state.items.some((item) => item.status === \"pending\" || item.status === \"in_progress\");\n}\n\n/** Status counts across the whole list. */\nfunction widgetCounts(state: TodoState): { active: number; pending: number; completed: number } {\n\tconst counts = { active: 0, pending: 0, completed: 0 };\n\tfor (const item of state.items) {\n\t\tif (item.status === \"in_progress\") counts.active++;\n\t\telse if (item.status === \"pending\") counts.pending++;\n\t\telse counts.completed++;\n\t}\n\treturn counts;\n}\n\nfunction widgetSegment(item: TodoItem, subject: string, theme: Theme): string {\n\treturn `${theme.fg(STATUS_COLOR[item.status], STATUS_MARK[item.status])} ${theme.fg(\"accent\", `#${item.id}`)} ${theme.fg(\"text\", subject)}`;\n}\n\nfunction widgetLine(header: string, segments: string[], overflow: string): string {\n\tconst body = [...segments, ...(overflow ? [overflow] : [])].join(WIDGET_ITEM_SEPARATOR);\n\treturn body ? `${header}${WIDGET_HEADER_SEPARATOR}${body}` : header;\n}\n\n/** Long overflow with counts (zero parts omitted), e.g. `+4 more (4 completed)`. */\nfunction widgetOverflowLong(remaining: number, counts: { active: number; pending: number; completed: number }): string {\n\tconst parts = [\n\t\tcounts.active > 0 ? `${counts.active} active` : \"\",\n\t\tcounts.pending > 0 ? `${counts.pending} pending` : \"\",\n\t\tcounts.completed > 0 ? `${counts.completed} completed` : \"\",\n\t].filter(Boolean);\n\treturn `+${remaining} more${parts.length ? ` (${parts.join(\", \")})` : \"\"}`;\n}\n\n/** One-line widget: `Todos 2/6 · [>] #4 s [ ] #5 s +N more (…)`; completed tasks are hidden but counted in the overflow. */\nexport function renderWidgetLine(state: TodoState, theme: Theme, width: number): string[] {\n\tconst safeWidth = Math.max(1, width);\n\tconst items = state.items;\n\tconst candidates = items\n\t\t.filter((item) => item.status !== \"completed\")\n\t\t.sort((first, second) => STATUS_RANK[first.status] - STATUS_RANK[second.status] || first.id - second.id);\n\tif (candidates.length === 0) return [];\n\n\tconst total = items.length;\n\tconst completed = items.filter((item) => item.status === \"completed\").length;\n\tconst header = `${theme.fg(\"accent\", \"Todos\")} ${theme.fg(\"dim\", `${completed}/${total}`)}`;\n\tconst counts = widgetCounts(state);\n\tconst shown: Array<{ item: TodoItem; subject: string }> = [];\n\tlet overflow = \"\";\n\n\t// Best overflow for a trial segment set: the long counts form when it fits,\n\t// the short `+N more` form otherwise, undefined when even that overflows.\n\tconst bestOverflow = (trial: Array<{ item: TodoItem; subject: string }>): string | undefined => {\n\t\tconst remaining = total - trial.length;\n\t\tconst segments = trial.map((entry) => widgetSegment(entry.item, entry.subject, theme));\n\t\tconst activeShown = trial.some((entry) => entry.item.status === \"in_progress\") ? 1 : 0;\n\t\tconst hidden: typeof counts = {\n\t\t\tactive: counts.active - activeShown,\n\t\t\tpending: counts.pending - (trial.length - activeShown),\n\t\t\tcompleted: counts.completed,\n\t\t};\n\t\tif (remaining <= 0) return visibleWidth(widgetLine(header, segments, \"\")) <= safeWidth ? \"\" : undefined;\n\t\tconst long = theme.fg(\"dim\", widgetOverflowLong(remaining, hidden));\n\t\tif (visibleWidth(widgetLine(header, segments, long)) <= safeWidth) return long;\n\t\tconst short = theme.fg(\"dim\", `+${remaining} more`);\n\t\treturn visibleWidth(widgetLine(header, segments, short)) <= safeWidth ? short : undefined;\n\t};\n\n\t// Extreme narrow widths: the best summary that fits, then the bare header.\n\tconst fallback = (): string[] => {\n\t\tconst best = bestOverflow([]);\n\t\tif (best !== undefined) return [widgetLine(header, [], best)];\n\t\tif (visibleWidth(header) <= safeWidth) return [header];\n\t\treturn [truncateToWidth(header, safeWidth, \"…\")];\n\t};\n\n\t// Segments are added whole, active first then pending by id, while the\n\t// line keeps fitting; only the active subject may be truncated.\n\tfor (const candidate of candidates) {\n\t\tconst best = bestOverflow([...shown, { item: candidate, subject: candidate.subject }]);\n\t\tif (best !== undefined) {\n\t\t\tshown.push({ item: candidate, subject: candidate.subject });\n\t\t\toverflow = best;\n\t\t\tcontinue;\n\t\t}\n\t\tif (candidate.status !== \"in_progress\") break;\n\t\tconst remaining = total - shown.length - 1;\n\t\tconst suffix = remaining > 0 ? `${WIDGET_ITEM_SEPARATOR}+${remaining} more` : \"\";\n\t\tconst prefix = `${header}${WIDGET_HEADER_SEPARATOR}${widgetSegment(candidate, \"\", theme)}${suffix}`;\n\t\tconst available = safeWidth - visibleWidth(prefix);\n\t\tif (available < 1) return fallback();\n\t\tshown.push({ item: candidate, subject: truncateToWidth(candidate.subject, available, \"…\") });\n\t\toverflow = bestOverflow(shown) ?? \"\";\n\t}\n\n\tif (shown.length === 0) return fallback();\n\n\tconst segments = shown.map((entry) => widgetSegment(entry.item, entry.subject, theme));\n\tconst line = widgetLine(header, segments, overflow);\n\t// Safety net: the visible width always stays within the terminal width.\n\treturn [visibleWidth(line) <= safeWidth ? line : truncateToWidth(line, safeWidth, \"…\")];\n}\n\n// --- Full list (used by /todos and the model-facing list result) ------------\n\n/** `Todos: X in progress, Y pending, Z completed` header plus two-line tasks. */\nfunction formatTodoList(state: TodoState): string {\n\tif (state.items.length === 0) return \"No todos.\";\n\tconst counts = widgetCounts(state);\n\tconst lines = [`Todos: ${counts.active} in progress, ${counts.pending} pending, ${counts.completed} completed`];\n\tconst items = [...state.items].sort(\n\t\t(first, second) => STATUS_RANK[first.status] - STATUS_RANK[second.status] || first.id - second.id,\n\t);\n\tfor (const item of items) {\n\t\tlines.push(`${STATUS_MARK[item.status]} #${item.id} ${item.subject}`);\n\t\tlines.push(` ${item.description}`);\n\t}\n\treturn lines.join(\"\\n\");\n}\n\n/** /todos command output: full list, subject line plus indented description per task. */\nexport const formatCommandList = formatTodoList;\n\n/** Model-facing text for one completed todo call; bounded by list and input limits. */\nexport function formatTodoContent(change: TodoChange, state: TodoState): string {\n\tswitch (change.kind) {\n\t\tcase \"create\": {\n\t\t\tconst parts = change.ids.map((id) => {\n\t\t\t\tconst item = state.items.find((entry) => entry.id === id);\n\t\t\t\treturn item ? `#${item.id}: ${item.subject}` : `#${id}`;\n\t\t\t});\n\t\t\tconst noun = change.ids.length === 1 ? \"task\" : \"tasks\";\n\t\t\treturn `Created ${change.ids.length} ${noun}${parts.length ? `: ${parts.join(\"; \")}` : \"\"}`;\n\t\t}\n\t\tcase \"update\": {\n\t\t\tconst item = state.items.find((entry) => entry.id === change.id);\n\t\t\tconst subject = item ? `: ${item.subject}` : \"\";\n\t\t\tconst transition = change.from === change.to ? \"\" : ` (${change.from} -> ${change.to})`;\n\t\t\tconst demoted = change.demotedId !== undefined ? `; demoted #${change.demotedId} to pending` : \"\";\n\t\t\treturn `Updated #${change.id}${transition}${subject}${demoted}`;\n\t\t}\n\t\tcase \"list\":\n\t\t\treturn formatTodoList(state);\n\t\tcase \"delete\": {\n\t\t\tconst noun = change.removed.length === 1 ? \"task\" : \"tasks\";\n\t\t\tconst parts = change.removed.map((entry) => `#${entry.id}: ${entry.subject}`);\n\t\t\treturn `Deleted ${change.removed.length} ${noun}${parts.length ? `: ${parts.join(\"; \")}` : \"\"}`;\n\t\t}\n\t}\n}\n\n// --- Tool calls and collapsed group summaries -------------------------------\n\n// Collapsed todo calls join the `todo` group as one headline per row. Args can\n// be partial or hostile and details may come from any source, so one defensive\n// reading family (record/field/text/id/status/array) serves both renderers.\n// Output stays bounded: batches at 20, subjects at 160, descriptions at 500.\n\ntype TodoCallArgs = Partial<Record<keyof TodoParams, unknown>>;\n\nconst CALL_ITEMS_MAX = TODO_MAX_BATCH_ITEMS;\nconst CALL_SUBJECT_PREVIEW_COUNT = 2;\nconst CALL_SUBJECT_PREVIEW_WIDTH = 72;\nconst CALL_DESCRIPTION_PREVIEW_LENGTH = 120;\nconst GROUP_FAILURE_MAX_LENGTH = 120;\nconst TODO_ACTIONS = new Set([\"create\", \"update\", \"list\", \"delete\"]);\n\n/** Record-like read; proxies that throw on inspection are treated as absent. */\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\n/** Field read that never throws, even for exotic objects with throwing getters. */\nfunction safeValue(record: Record<string, unknown> | undefined, 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\n/** Trimmed, whitespace-collapsed, length-clipped text (empty when absent). */\nfunction clipText(value: unknown, max: number): string {\n\treturn safeString(value)?.trim().replace(/\\s+/g, \" \").slice(0, max) ?? \"\";\n}\n\nconst safeSubject = (value: unknown): string => clipText(value, TODO_MAX_SUBJECT_LENGTH);\nconst safeDescription = (value: unknown): string => clipText(value, TODO_MAX_DESCRIPTION_LENGTH);\n\nfunction safeId(value: unknown): number | undefined {\n\treturn typeof value === \"number\" && Number.isSafeInteger(value) && value >= 1 ? value : undefined;\n}\n\nfunction safeStatus(value: unknown): TodoStatus | undefined {\n\tconst status = safeString(value);\n\tif (status === \"pending\" || status === \"in_progress\" || status === \"completed\") return status;\n\treturn undefined;\n}\n\nfunction readArray(value: unknown, limit = CALL_ITEMS_MAX): { values: unknown[]; length: number } | undefined {\n\ttry {\n\t\tif (!Array.isArray(value)) return undefined;\n\t\tconst length = value.length;\n\t\tconst values: unknown[] = [];\n\t\tfor (let index = 0; index < Math.min(length, limit); index++) {\n\t\t\ttry {\n\t\t\t\tvalues.push(value[index]);\n\t\t\t} catch {\n\t\t\t\tvalues.push(undefined);\n\t\t\t}\n\t\t}\n\t\treturn { values, length };\n\t} catch {\n\t\treturn undefined;\n\t}\n}\n\n/** Id lists: lenient for delete args (invalid entries drop), strict for result changes (any invalid entry rejects). */\nfunction readIds(value: unknown, strict: boolean): number[] | undefined {\n\tconst array = readArray(value);\n\tif (strict && (!array || array.length === 0 || array.length > CALL_ITEMS_MAX)) return undefined;\n\tif (!array) return strict ? undefined : [];\n\tconst ids: number[] = [];\n\tfor (const entry of array.values) {\n\t\tconst id = safeId(entry);\n\t\tif (id === undefined) {\n\t\t\tif (strict) return undefined;\n\t\t\tcontinue;\n\t\t}\n\t\tids.push(id);\n\t}\n\treturn ids;\n}\n\n/** Create args: sparse or invalid entries drop; the batch caps at the maximum. */\nfunction batchItems(value: unknown): Array<{ subject: string; description: string }> {\n\tconst result: Array<{ subject: string; description: string }> = [];\n\tfor (const raw of readArray(value)?.values ?? []) {\n\t\tconst item = safeRecord(raw);\n\t\tif (!item) continue;\n\t\tresult.push({\n\t\t\tsubject: safeSubject(safeValue(item, \"subject\")),\n\t\t\tdescription: safeDescription(safeValue(item, \"description\")),\n\t\t});\n\t}\n\treturn result;\n}\n\nfunction descriptionPreview(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\n/** At most two subjects, each truncated to the preview width, plus `+N more`. */\nfunction formatSubjectPreview(subjects: string[], total: number): string {\n\t// Filter before slicing so an empty subject (streaming args) does not consume\n\t// a preview slot.\n\tconst shown = subjects\n\t\t.filter(Boolean)\n\t\t.slice(0, CALL_SUBJECT_PREVIEW_COUNT)\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\n/** v2 details guard shared by the call and group renderers. */\nfunction todoDetails(value: unknown): { change: Record<string, unknown>; state: Record<string, unknown> } | undefined {\n\tconst details = safeRecord(value);\n\tif (!details || safeValue(details, \"schemaVersion\") !== TODO_DETAILS_SCHEMA_VERSION) return undefined;\n\tconst change = safeRecord(safeValue(details, \"change\"));\n\tconst state = safeRecord(safeValue(details, \"state\"));\n\tif (!change || !state) return undefined;\n\tconst kind = safeString(safeValue(change, \"kind\"));\n\tif (!kind || !TODO_ACTIONS.has(kind)) return undefined;\n\treturn { change, state };\n}\n\n/** Result ids for an expanded create, only when they match the shown items. */\nfunction createResultIds(result: AgentToolResult<unknown> | undefined, count: number): number[] | undefined {\n\tconst details = todoDetails(result?.details);\n\tif (!details || safeString(safeValue(details.change, \"kind\")) !== \"create\") return undefined;\n\tconst ids = readIds(safeValue(details.change, \"ids\"), true);\n\treturn ids?.length === count ? ids : undefined;\n}\n\n/** Removed entries for an expanded delete; absent until a v2 delete result arrives. */\nfunction deleteResultRemoved(\n\tresult: AgentToolResult<unknown> | undefined,\n): Array<{ id: number; subject: string }> | undefined {\n\tconst details = todoDetails(result?.details);\n\tif (!details || safeString(safeValue(details.change, \"kind\")) !== \"delete\") return undefined;\n\treturn removedEntries(safeValue(details.change, \"removed\"));\n}\n\n/** Headline plus the parameters the result never echoes as detail lines. */\nfunction formatCallParts(\n\targs: TodoCallArgs | undefined,\n\ttheme: Theme,\n\tresult?: AgentToolResult<unknown>,\n): { headline: string; details: string[] } {\n\tconst action = clipText(args?.action, TODO_MAX_SUBJECT_LENGTH);\n\tconst verb = TODO_ACTIONS.has(action) ? action : undefined;\n\tconst headline: string[] = [theme.fg(\"toolTitle\", theme.bold(verb ? `todo ${verb}` : \"todo\"))];\n\tconst details: string[] = [];\n\n\tif (verb === \"create\") {\n\t\tconst items = batchItems(args?.items);\n\t\tconst rawCount = readArray(args?.items)?.length;\n\t\tif (rawCount !== undefined) {\n\t\t\tconst count = Math.min(rawCount, CALL_ITEMS_MAX);\n\t\t\theadline.push(theme.fg(\"dim\", `${count} ${count === 1 ? \"task\" : \"tasks\"}`));\n\t\t\tconst subjects = items.map((item) => item.subject);\n\t\t\tconst preview = formatSubjectPreview(subjects, count);\n\t\t\tif (preview) headline.push(theme.fg(\"dim\", \"·\"), theme.fg(\"text\", preview));\n\t\t}\n\t\tconst ids = createResultIds(result, items.length);\n\t\tfor (const [index, item] of items.entries()) {\n\t\t\tconst marker = ids ? theme.fg(\"accent\", `#${ids[index]}`) : theme.fg(\"accent\", `${index + 1}.`);\n\t\t\tdetails.push(item.subject ? `${marker} ${theme.fg(\"text\", item.subject)}` : marker);\n\t\t\tif (item.description) details.push(` ${theme.fg(\"dim\", descriptionPreview(item.description))}`);\n\t\t}\n\t} else if (verb === \"update\") {\n\t\tconst id = safeId(args?.id);\n\t\tif (id !== undefined) headline.push(theme.fg(\"accent\", `#${id}`));\n\t\tconst status = safeStatus(args?.status);\n\t\tif (status) headline.push(theme.fg(STATUS_COLOR[status], status));\n\t\tconst subject = safeSubject(args?.subject);\n\t\tif (subject) headline.push(theme.fg(\"text\", truncateToWidth(subject, CALL_SUBJECT_PREVIEW_WIDTH, \"…\")));\n\t\tconst description = safeDescription(args?.description);\n\t\tif (description) details.push(` ${theme.fg(\"dim\", descriptionPreview(description))}`);\n\t} else if (verb === \"delete\") {\n\t\tconst ids = readIds(args?.ids, false) ?? [];\n\t\tif (ids.length) headline.push(theme.fg(\"accent\", ids.map((id) => `#${id}`).join(\", \")));\n\t\t// The headline already carries the ids, so details only earn their line\n\t\t// once the result names what was actually removed.\n\t\tfor (const entry of deleteResultRemoved(result) ?? []) {\n\t\t\tdetails.push(`${theme.fg(\"accent\", `#${entry.id}`)} ${theme.fg(\"text\", entry.subject)}`);\n\t\t}\n\t}\n\n\treturn { headline: headline.join(\" \"), details };\n}\n\n/** One-line call summary when collapsed; headline plus details when expanded. */\nexport function formatTodoCall(\n\targs: TodoCallArgs | undefined,\n\ttheme: Theme,\n\texpanded: boolean,\n\tresult?: AgentToolResult<unknown>,\n): string {\n\tconst { headline, details } = formatCallParts(args, theme, result);\n\treturn !expanded || details.length === 0 ? headline : [headline, ...details].join(\"\\n\");\n}\n\n/** Id -> item index plus status counts over the v2 snapshot (one defensive walk). */\nfunction stateIndex(state: Record<string, unknown>):\n\t| {\n\t\t\tbyId: Map<number, Record<string, unknown>>;\n\t\t\tcounts: { inProgress: number; pending: number; completed: number };\n\t }\n\t| undefined {\n\tconst array = readArray(safeValue(state, \"items\"), TODO_MAX_ITEMS);\n\tif (!array || array.length > TODO_MAX_ITEMS) return undefined;\n\tconst byId = new Map<number, Record<string, unknown>>();\n\tconst counts = { inProgress: 0, pending: 0, completed: 0 };\n\tfor (const raw of array.values) {\n\t\tconst item = safeRecord(raw);\n\t\tif (!item) continue;\n\t\tconst id = safeId(safeValue(item, \"id\"));\n\t\tif (id !== undefined && !byId.has(id)) byId.set(id, item);\n\t\tconst status = safeStatus(safeValue(item, \"status\"));\n\t\tif (status === \"in_progress\") counts.inProgress++;\n\t\telse if (status === \"pending\") counts.pending++;\n\t\telse if (status === \"completed\") counts.completed++;\n\t}\n\treturn { byId, counts };\n}\n\nfunction stateSubject(map: Map<number, Record<string, unknown>>, id: number): string {\n\tconst item = map.get(id);\n\treturn item ? safeSubject(safeValue(item, \"subject\")) : \"\";\n}\n\n/** Deleted entries: one invalid or empty entry rejects the whole list. */\nfunction removedEntries(value: unknown): Array<{ id: number; subject: string }> | undefined {\n\tconst array = readArray(value);\n\tif (!array || array.length === 0 || array.length > CALL_ITEMS_MAX) return undefined;\n\tconst removed: Array<{ id: number; subject: string }> = [];\n\tfor (const raw of array.values) {\n\t\tconst id = safeId(safeValue(safeRecord(raw), \"id\"));\n\t\tconst subject = safeSubject(safeValue(safeRecord(raw), \"subject\"));\n\t\tif (id === undefined || !subject) return undefined;\n\t\tremoved.push({ id, subject });\n\t}\n\treturn removed;\n}\n\nfunction formatTodoGroupSuccess(\n\targs: TodoCallArgs | undefined,\n\ttheme: Theme,\n\tresult: AgentToolResult<unknown>,\n): string | undefined {\n\tconst parsed = todoDetails(result.details);\n\tif (!parsed) return undefined;\n\tconst { change, state } = parsed;\n\tconst verb = (word: string) => theme.fg(\"toolTitle\", `todo ${word}`);\n\tconst withPreview = (word: string, ids: number[], subjects: string[]): string => {\n\t\tconst text = formatSubjectPreview(subjects, subjects.length);\n\t\tconst consecutive = ids.length > 1 && ids.every((id, index) => id === ids[0] + index);\n\t\tconst rendered = consecutive ? `#${ids[0]}–#${ids.at(-1)}` : ids.map((id) => `#${id}`).join(\", \");\n\t\tconst base = `${verb(word)} ${theme.fg(\"accent\", rendered)}`;\n\t\treturn text ? `${base}${theme.fg(\"dim\", \" · \")}${theme.fg(\"text\", text)}` : base;\n\t};\n\tconst kind = safeString(safeValue(change, \"kind\"));\n\n\tif (kind === \"create\") {\n\t\tconst ids = readIds(safeValue(change, \"ids\"), true);\n\t\tconst index = stateIndex(state);\n\t\tif (!ids || !index) return undefined;\n\t\tconst subjects = ids.map((id) => stateSubject(index.byId, id));\n\t\treturn withPreview(\"created\", ids, subjects);\n\t}\n\tif (kind === \"update\") {\n\t\tconst id = safeId(safeValue(change, \"id\"));\n\t\tconst index = stateIndex(state);\n\t\tif (id === undefined || !index) return undefined;\n\t\tconst to = safeStatus(safeValue(change, \"to\"));\n\t\tconst demotedId = safeId(safeValue(change, \"demotedId\"));\n\t\tconst parts = [verb(\"updated\"), theme.fg(\"accent\", `#${id}`)];\n\t\tif (to) parts.push(theme.fg(STATUS_COLOR[to], to));\n\t\tconst subject = stateSubject(index.byId, id) || safeSubject(args?.subject) || \"\";\n\t\tif (subject) parts.push(theme.fg(\"text\", truncateToWidth(subject, CALL_SUBJECT_PREVIEW_WIDTH, \"…\")));\n\t\tif (demotedId !== undefined) parts.push(theme.fg(\"dim\", `· demoted #${demotedId}`));\n\t\treturn parts.join(\" \");\n\t}\n\tif (kind === \"list\") {\n\t\tconst counts = stateIndex(state)?.counts;\n\t\tif (!counts) return undefined;\n\t\tconst parts: string[] = [];\n\t\tif (counts.inProgress > 0) parts.push(`${counts.inProgress} in progress`);\n\t\tif (counts.pending > 0) parts.push(`${counts.pending} pending`);\n\t\tif (counts.completed > 0) parts.push(`${counts.completed} completed`);\n\t\treturn `${verb(\"list\")}: ${theme.fg(\"dim\", parts.length ? parts.join(\", \") : \"no tasks\")}`;\n\t}\n\tif (kind === \"delete\") {\n\t\tconst removed = removedEntries(safeValue(change, \"removed\"));\n\t\tif (!removed) return undefined;\n\t\tconst subjects = removed.map((entry) => entry.subject);\n\t\treturn withPreview(\n\t\t\t\"deleted\",\n\t\t\tremoved.map((entry) => entry.id),\n\t\t\tsubjects,\n\t\t);\n\t}\n\treturn undefined;\n}\n\nexport interface TodoGroupRenderContext {\n\tisError: boolean;\n\tisPartial: boolean;\n\tresult?: AgentToolResult<unknown>;\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\tlet reason = \"tool failed\";\n\t\ttry {\n\t\t\tfor (const block of context.result?.content.slice(0, 8) ?? []) {\n\t\t\t\tif (block.type !== \"text\" || typeof block.text !== \"string\") continue;\n\t\t\t\tconst text = block.text\n\t\t\t\t\t.replace(/[\\u0000-\\u001f\\u007f-\\u009f]/g, \" \")\n\t\t\t\t\t.replace(/\\s+/g, \" \")\n\t\t\t\t\t.trim();\n\t\t\t\tif (!text) continue;\n\t\t\t\treason = text.length > GROUP_FAILURE_MAX_LENGTH ? `${text.slice(0, GROUP_FAILURE_MAX_LENGTH - 1)}…` : text;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t} catch {\n\t\t\t// Tool results can come from historical or third-party sources.\n\t\t}\n\t\treturn `${formatTodoCall(args, theme, false)} ${theme.fg(\"error\", `failed: ${reason}`)}`;\n\t}\n\tif (!context.isPartial && context.result) {\n\t\tconst summary = formatTodoGroupSuccess(args, theme, context.result);\n\t\tif (summary) return summary;\n\t}\n\treturn formatTodoCall(args, theme, false);\n}\n"]}
|
|
@@ -41,7 +41,7 @@ Blocks until a task finishes, within a bound:
|
|
|
41
41
|
- `waitMs` defaults to 20000 and clamps between 1000 and 60000.
|
|
42
42
|
- `sinceBytes` (taken from a previous read/wait result) restricts the returned output to what was written after that offset; without it the last 32KB is returned. Offsets past EOF (for example after output truncation) fall back to the tail and say so.
|
|
43
43
|
|
|
44
|
-
If the task finishes within the window, the result is delivered inline — status, exit code, runtime, and the bounded output delta — and the followUp notification is suppressed, so the completion is delivered exactly once. If the window expires, the result says the task is still running, includes a small tail peek so progress stays visible, and the notification fires later as usual. This is the only sanctioned way to wait; sleeping to emulate it is never correct.
|
|
44
|
+
If the task finishes within the window, the result is delivered inline — status, exit code, runtime, and the bounded output delta — and the followUp notification is suppressed, so the completion is delivered exactly once. Interrupting the turn during a wait releases that claim, so the notification arrives normally instead. If the window expires, the result says the task is still running, includes a small tail peek so progress stays visible, and the notification fires later as usual. This is the only sanctioned way to wait; sleeping to emulate it is never correct.
|
|
45
45
|
|
|
46
46
|
### kill
|
|
47
47
|
|
|
@@ -90,10 +90,10 @@ Running and finished counts appear in the footer as `bg 2 running · 1 done`; ta
|
|
|
90
90
|
## Limits and lifecycle
|
|
91
91
|
|
|
92
92
|
- Background tasks inherit the session's `PI_*` environment variables (`PI_SESSION_ID`, `PI_MODEL`, …) just like the built-in bash tool, snapshotted when the task starts.
|
|
93
|
-
- Tasks run through the session's configured shell (`shellPath`) and honor `shellCommandPrefix`, matching the built-in bash tool. The prefix is applied at execution time only — it never appears in task labels or notifications.
|
|
93
|
+
- Tasks run through the session's configured shell (`shellPath`) and honor `shellCommandPrefix`, matching the built-in bash tool. The prefix is applied at execution time only — it never appears in task labels or notifications. Unlike the built-in bash tool, `bg` does not apply an SDK host's `spawnHook` — extensions have no access to it — so a host that rewrites or sandboxes commands through that hook does not cover background tasks.
|
|
94
94
|
- Output streams directly to a system-temp file (`pi-bg-<id>.log`), never into the project or into memory. Memory holds only a byte counter.
|
|
95
95
|
- Output is capped at 20MB. Hitting the cap kills the task and marks it `failed` rather than silently truncating.
|
|
96
96
|
- At most 8 tasks may run concurrently; `create` reports the running tasks when the limit is reached.
|
|
97
97
|
- Aborting the current turn (Esc) does not kill background tasks — that is what `kill` and `/bg` are for.
|
|
98
98
|
- Session shutdown, `/reload`, new sessions, and session switches kill all running tasks; those kills are silent (no notification flood). There is no restart reattachment: finished-task records live only for the current session.
|
|
99
|
-
- Output files outlive the session for later inspection (the `read` action and notifications keep pointing at them); Pi never deletes them automatically — the system temp directory's own cleanup policy applies.
|
|
99
|
+
- Output files outlive the session for later inspection (the `read` action and notifications keep pointing at them); Pi never deletes them automatically — the system temp directory's own cleanup policy applies. That policy varies by platform: Linux usually clears `/tmp` on reboot and macOS after a few days, but Windows never clears `%TEMP%` on its own.
|
|
@@ -82,41 +82,58 @@ Child sessions share the parent's canonical model/authentication runtime, so ext
|
|
|
82
82
|
|
|
83
83
|
## Transcript UI
|
|
84
84
|
|
|
85
|
-
While running, the collapsed view
|
|
86
|
-
row per task in original input order:
|
|
85
|
+
The native tool title owns whole-call elapsed time. While running, the collapsed view lists one width-bounded physical row per task:
|
|
87
86
|
|
|
88
87
|
```text
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
88
|
+
● Subagent · 12s
|
|
89
|
+
│ › #1 Explorer · Thinking...
|
|
90
|
+
│ › #2 Explorer · Run git log
|
|
91
|
+
│ ○ #3 Explorer · Queued
|
|
92
|
+
│ › #4 General · Compacting...
|
|
94
93
|
```
|
|
95
94
|
|
|
96
|
-
|
|
97
|
-
reordering, and no `+N more` truncation. Live rows append the current
|
|
98
|
-
activity, failure reason, or retry countdown.
|
|
95
|
+
`#N` is the task's stable one-based input position. Rows always remain in `#1` through `#N` order: there is no progress header, prompt excerpt, row cap, active-first reordering, or `+N more` truncation. A row reports the task's current state directly:
|
|
99
96
|
|
|
100
|
-
|
|
97
|
+
- `Starting...` before the worker has begun a turn;
|
|
98
|
+
- `Thinking...` while the model is active without a tool;
|
|
99
|
+
- `Read`, `Search`, `Find`, `List`, `Run`, `Edit`, or `Write` for the current tool;
|
|
100
|
+
- `Compacting...` during worker auto-compaction;
|
|
101
|
+
- `Queued` while waiting for a worker slot;
|
|
102
|
+
- `Retrying (n/m) in Xs` during retry backoff;
|
|
103
|
+
- `Completed`, `Failed`, or `Aborted`, with duration when the task started.
|
|
101
104
|
|
|
102
|
-
|
|
105
|
+
Long states and activities are truncated by visible terminal width, including ANSI styling and wide CJK characters, instead of wrapping onto continuation rows.
|
|
106
|
+
|
|
107
|
+
Once settled, aggregate cost joins the frozen duration in the native title, and the ordered task rows become the complete collapsed outcome summary:
|
|
108
|
+
|
|
109
|
+
```text
|
|
110
|
+
● Subagent · 1m 24s · $0.042
|
|
111
|
+
│ ✓ #1 Explorer · Completed · 48s
|
|
112
|
+
│ ✓ #2 Explorer · Completed · 1m 3s
|
|
113
|
+
│ × #3 General · Failed · 36s
|
|
114
|
+
│ ✓ #4 Explorer · Completed · 1m 20s
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
Zero cost is omitted. There is no separate aggregate count line; the per-task markers show the mixed outcome directly.
|
|
118
|
+
|
|
119
|
+
Expanded sections also remain in input order. Their single-line header contains only identity and compact runtime metadata:
|
|
103
120
|
|
|
104
121
|
```text
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
122
|
+
── #1 Explorer · anthropic/claude-sonnet-4-5 · medium · 3 tool uses · 2 turns · 1m 5s
|
|
123
|
+
|
|
124
|
+
Prompt
|
|
125
|
+
<complete original task briefing>
|
|
126
|
+
|
|
127
|
+
Activity
|
|
128
|
+
Read .github/workflows/ci.yml
|
|
129
|
+
› Run npm test
|
|
110
130
|
```
|
|
111
131
|
|
|
112
|
-
The
|
|
132
|
+
The thinking level is shown as its raw value (`medium`, not `medium thinking`) and omitted when it is `off`; a non-parent working directory appears as `cwd: ...`. Per-run token, context, and cost fields are omitted from this header.
|
|
113
133
|
|
|
114
|
-
|
|
115
|
-
- model, thinking, cwd, usage, cost, and duration;
|
|
116
|
-
- Error when present;
|
|
117
|
-
- the final Report, or `Report · partial` when a failed/aborted worker produced useful output.
|
|
134
|
+
Every expanded task shows the complete original Prompt, including while the batch is still running. Active and queued tasks show bounded Activity history and retry state. A completed, failed, or aborted task immediately switches to Error/Report presentation even if sibling tasks are still active; failed or aborted workers with useful output use `Report · partial`. Streaming assistant text is not copied into the parent transcript.
|
|
118
135
|
|
|
119
|
-
|
|
136
|
+
Full child transcripts are not stored separately. Activity, errors, reports, usage, and model-facing output remain bounded, and completed calls restore through the parent session tree.
|
|
120
137
|
|
|
121
138
|
## Deliberate non-features
|
|
122
139
|
|
|
@@ -57,7 +57,7 @@ Todos: 1 in progress, 3 pending, 2 completed
|
|
|
57
57
|
Cover invalid redirects and session restoration
|
|
58
58
|
```
|
|
59
59
|
|
|
60
|
-
Consecutive tool calls collapse into the native `todo` transcript group. Collapsed settled rows use result-aware v2 details to show actual created IDs and subjects, update status and automatic demotion, list counts, or deleted IDs. Expanding restores the complete call and native result. Malformed or older details fall back to a bounded call summary.
|
|
60
|
+
Consecutive tool calls collapse into the native `todo` transcript group. Collapsed settled rows use result-aware v2 details to show actual created IDs and subjects, update status and automatic demotion, list counts, or deleted IDs. Expanding restores the complete call and native result: a created batch lists each task's ID, subject, and indented description, and a settled deletion names every removed task's ID and subject. Malformed or older details fall back to a bounded call summary.
|
|
61
61
|
|
|
62
62
|
## Limits
|
|
63
63
|
|
|
@@ -68,7 +68,7 @@ Consecutive tool calls collapse into the native `todo` transcript group. Collaps
|
|
|
68
68
|
- Subject and description whitespace is normalized to one line.
|
|
69
69
|
- Model-facing list output is bounded by those limits; no pagination is needed.
|
|
70
70
|
|
|
71
|
-
Delete completed or obsolete tasks before the list reaches capacity.
|
|
71
|
+
Delete completed or obsolete tasks before the list reaches capacity; `create` past the limit fails with an error that names that remedy.
|
|
72
72
|
|
|
73
73
|
## Storage and replay
|
|
74
74
|
|
package/docs/compaction.md
CHANGED
|
@@ -119,6 +119,8 @@ Valid cut points are:
|
|
|
119
119
|
|
|
120
120
|
Never cut at tool results (they must stay with their tool call).
|
|
121
121
|
|
|
122
|
+
Because tool results are not valid cut points, a batch of trailing tool results can exceed `keepRecentTokens` on its own, leaving no cut point at or after the entry that crosses the budget. The cut then lands on the last valid cut point — the least the message structure allows Pi to keep. This matters most for sessions with very few cut points, such as a subagent worker, whose whole session is a single turn: one prompt followed by assistant and tool result entries only.
|
|
123
|
+
|
|
122
124
|
### CompactionEntry Structure
|
|
123
125
|
|
|
124
126
|
The public `CompactionEntry` type is documented in [Session Format](session-format.md):
|
package/npm-shrinkwrap.json
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@astralyn/pi",
|
|
3
|
-
"version": "0.84.
|
|
3
|
+
"version": "0.84.9",
|
|
4
4
|
"lockfileVersion": 3,
|
|
5
5
|
"requires": true,
|
|
6
6
|
"packages": {
|
|
7
7
|
"": {
|
|
8
8
|
"name": "@astralyn/pi",
|
|
9
|
-
"version": "0.84.
|
|
9
|
+
"version": "0.84.9",
|
|
10
10
|
"license": "MIT",
|
|
11
11
|
"dependencies": {
|
|
12
12
|
"@earendil-works/pi-agent-core": "0.84.2",
|