@agimon-ai/doompi-task 0.0.1-alpha.72 → 0.0.1-alpha.75
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/README.md +12 -3
- package/package.json +15 -14
- package/dist/_virtual/_rolldown/runtime.cjs +0 -1
- package/dist/api-contracts.cjs +0 -1
- package/dist/api-contracts.d.cts +0 -2
- package/dist/api-contracts.d.mts +0 -2
- package/dist/api-contracts.mjs +0 -1
- package/dist/commands.cjs +0 -1
- package/dist/commands.d.cts +0 -2
- package/dist/commands.d.mts +0 -2
- package/dist/commands.mjs +0 -1
- package/dist/config.cjs +0 -1
- package/dist/config.d.cts +0 -2
- package/dist/config.d.mts +0 -2
- package/dist/config.mjs +0 -1
- package/dist/constants/promptGuidelines.cjs +0 -2
- package/dist/constants/promptGuidelines.cjs.map +0 -1
- package/dist/constants/promptGuidelines.d.cts +0 -13
- package/dist/constants/promptGuidelines.d.cts.map +0 -1
- package/dist/constants/promptGuidelines.d.mts +0 -13
- package/dist/constants/promptGuidelines.d.mts.map +0 -1
- package/dist/constants/promptGuidelines.mjs +0 -2
- package/dist/constants/promptGuidelines.mjs.map +0 -1
- package/dist/constants/task.cjs +0 -2
- package/dist/constants/task.cjs.map +0 -1
- package/dist/constants/task.d.cts +0 -4
- package/dist/constants/task.d.cts.map +0 -1
- package/dist/constants/task.d.mts +0 -4
- package/dist/constants/task.d.mts.map +0 -1
- package/dist/constants/task.mjs +0 -2
- package/dist/constants/task.mjs.map +0 -1
- package/dist/controllers/tasksCommand.cjs +0 -2
- package/dist/controllers/tasksCommand.cjs.map +0 -1
- package/dist/controllers/tasksCommand.d.cts +0 -15
- package/dist/controllers/tasksCommand.d.cts.map +0 -1
- package/dist/controllers/tasksCommand.d.mts +0 -15
- package/dist/controllers/tasksCommand.d.mts.map +0 -1
- package/dist/controllers/tasksCommand.mjs +0 -2
- package/dist/controllers/tasksCommand.mjs.map +0 -1
- package/dist/controllers/webTasksChannel.cjs +0 -2
- package/dist/controllers/webTasksChannel.cjs.map +0 -1
- package/dist/controllers/webTasksChannel.mjs +0 -2
- package/dist/controllers/webTasksChannel.mjs.map +0 -1
- package/dist/delegation-manager.cjs +0 -1
- package/dist/delegation-manager.d.cts +0 -3
- package/dist/delegation-manager.d.mts +0 -3
- package/dist/delegation-manager.mjs +0 -1
- package/dist/extensions/pi.cjs +0 -3
- package/dist/extensions/pi.cjs.map +0 -1
- package/dist/extensions/pi.d.cts +0 -6
- package/dist/extensions/pi.d.cts.map +0 -1
- package/dist/extensions/pi.d.mts +0 -6
- package/dist/extensions/pi.d.mts.map +0 -1
- package/dist/extensions/pi.mjs +0 -3
- package/dist/extensions/pi.mjs.map +0 -1
- package/dist/extensions/server.cjs +0 -2
- package/dist/extensions/server.cjs.map +0 -1
- package/dist/extensions/server.d.cts +0 -5
- package/dist/extensions/server.d.cts.map +0 -1
- package/dist/extensions/server.d.mts +0 -5
- package/dist/extensions/server.d.mts.map +0 -1
- package/dist/extensions/server.mjs +0 -2
- package/dist/extensions/server.mjs.map +0 -1
- package/dist/index.cjs +0 -1
- package/dist/index.d.cts +0 -16
- package/dist/index.d.mts +0 -16
- package/dist/index.mjs +0 -1
- package/dist/logSinkTelemetry.cjs +0 -1
- package/dist/logSinkTelemetry.d.cts +0 -3
- package/dist/logSinkTelemetry.d.mts +0 -3
- package/dist/logSinkTelemetry.mjs +0 -1
- package/dist/models/task.cjs +0 -2
- package/dist/models/task.cjs.map +0 -1
- package/dist/models/task.d.cts +0 -176
- package/dist/models/task.d.cts.map +0 -1
- package/dist/models/task.d.mts +0 -176
- package/dist/models/task.d.mts.map +0 -1
- package/dist/models/task.mjs +0 -2
- package/dist/models/task.mjs.map +0 -1
- package/dist/models/taskGraph.cjs +0 -2
- package/dist/models/taskGraph.cjs.map +0 -1
- package/dist/models/taskGraph.d.cts +0 -24
- package/dist/models/taskGraph.d.cts.map +0 -1
- package/dist/models/taskGraph.d.mts +0 -24
- package/dist/models/taskGraph.d.mts.map +0 -1
- package/dist/models/taskGraph.mjs +0 -2
- package/dist/models/taskGraph.mjs.map +0 -1
- package/dist/schemas/apiContracts.cjs +0 -2
- package/dist/schemas/apiContracts.cjs.map +0 -1
- package/dist/schemas/apiContracts.d.cts +0 -53
- package/dist/schemas/apiContracts.d.cts.map +0 -1
- package/dist/schemas/apiContracts.d.mts +0 -53
- package/dist/schemas/apiContracts.d.mts.map +0 -1
- package/dist/schemas/apiContracts.mjs +0 -2
- package/dist/schemas/apiContracts.mjs.map +0 -1
- package/dist/schemas/task.cjs +0 -2
- package/dist/schemas/task.cjs.map +0 -1
- package/dist/schemas/task.d.cts +0 -103
- package/dist/schemas/task.d.cts.map +0 -1
- package/dist/schemas/task.d.mts +0 -103
- package/dist/schemas/task.d.mts.map +0 -1
- package/dist/schemas/task.mjs +0 -2
- package/dist/schemas/task.mjs.map +0 -1
- package/dist/services/config/index.cjs +0 -2
- package/dist/services/config/index.cjs.map +0 -1
- package/dist/services/config/index.d.cts +0 -42
- package/dist/services/config/index.d.cts.map +0 -1
- package/dist/services/config/index.d.mts +0 -42
- package/dist/services/config/index.d.mts.map +0 -1
- package/dist/services/config/index.mjs +0 -2
- package/dist/services/config/index.mjs.map +0 -1
- package/dist/services/contextContribution/index.cjs +0 -3
- package/dist/services/contextContribution/index.cjs.map +0 -1
- package/dist/services/contextContribution/index.mjs +0 -3
- package/dist/services/contextContribution/index.mjs.map +0 -1
- package/dist/services/delegation/index.cjs +0 -6
- package/dist/services/delegation/index.cjs.map +0 -1
- package/dist/services/delegation/index.d.cts +0 -192
- package/dist/services/delegation/index.d.cts.map +0 -1
- package/dist/services/delegation/index.d.mts +0 -192
- package/dist/services/delegation/index.d.mts.map +0 -1
- package/dist/services/delegation/index.mjs +0 -6
- package/dist/services/delegation/index.mjs.map +0 -1
- package/dist/services/delegationPlatform/index.cjs +0 -2
- package/dist/services/delegationPlatform/index.cjs.map +0 -1
- package/dist/services/delegationPlatform/index.mjs +0 -2
- package/dist/services/delegationPlatform/index.mjs.map +0 -1
- package/dist/services/invariants/index.cjs +0 -2
- package/dist/services/invariants/index.cjs.map +0 -1
- package/dist/services/invariants/index.d.cts +0 -23
- package/dist/services/invariants/index.d.cts.map +0 -1
- package/dist/services/invariants/index.d.mts +0 -23
- package/dist/services/invariants/index.d.mts.map +0 -1
- package/dist/services/invariants/index.mjs +0 -2
- package/dist/services/invariants/index.mjs.map +0 -1
- package/dist/services/logSinkTelemetry/index.cjs +0 -2
- package/dist/services/logSinkTelemetry/index.cjs.map +0 -1
- package/dist/services/logSinkTelemetry/index.d.cts +0 -23
- package/dist/services/logSinkTelemetry/index.d.cts.map +0 -1
- package/dist/services/logSinkTelemetry/index.d.mts +0 -23
- package/dist/services/logSinkTelemetry/index.d.mts.map +0 -1
- package/dist/services/logSinkTelemetry/index.mjs +0 -2
- package/dist/services/logSinkTelemetry/index.mjs.map +0 -1
- package/dist/services/paths/index.cjs +0 -2
- package/dist/services/paths/index.cjs.map +0 -1
- package/dist/services/paths/index.d.cts +0 -25
- package/dist/services/paths/index.d.cts.map +0 -1
- package/dist/services/paths/index.d.mts +0 -25
- package/dist/services/paths/index.d.mts.map +0 -1
- package/dist/services/paths/index.mjs +0 -2
- package/dist/services/paths/index.mjs.map +0 -1
- package/dist/services/processLiveness/index.cjs +0 -2
- package/dist/services/processLiveness/index.cjs.map +0 -1
- package/dist/services/processLiveness/index.d.cts +0 -11
- package/dist/services/processLiveness/index.d.cts.map +0 -1
- package/dist/services/processLiveness/index.d.mts +0 -11
- package/dist/services/processLiveness/index.d.mts.map +0 -1
- package/dist/services/processLiveness/index.mjs +0 -2
- package/dist/services/processLiveness/index.mjs.map +0 -1
- package/dist/services/reconcile/index.cjs +0 -2
- package/dist/services/reconcile/index.cjs.map +0 -1
- package/dist/services/reconcile/index.d.cts +0 -33
- package/dist/services/reconcile/index.d.cts.map +0 -1
- package/dist/services/reconcile/index.d.mts +0 -33
- package/dist/services/reconcile/index.d.mts.map +0 -1
- package/dist/services/reconcile/index.mjs +0 -2
- package/dist/services/reconcile/index.mjs.map +0 -1
- package/dist/services/reducer/index.cjs +0 -3
- package/dist/services/reducer/index.cjs.map +0 -1
- package/dist/services/reducer/index.d.cts +0 -71
- package/dist/services/reducer/index.d.cts.map +0 -1
- package/dist/services/reducer/index.d.mts +0 -71
- package/dist/services/reducer/index.d.mts.map +0 -1
- package/dist/services/reducer/index.mjs +0 -3
- package/dist/services/reducer/index.mjs.map +0 -1
- package/dist/services/taskNarration/index.cjs +0 -2
- package/dist/services/taskNarration/index.cjs.map +0 -1
- package/dist/services/taskNarration/index.mjs +0 -2
- package/dist/services/taskNarration/index.mjs.map +0 -1
- package/dist/services/taskResult/index.cjs +0 -7
- package/dist/services/taskResult/index.cjs.map +0 -1
- package/dist/services/taskResult/index.d.cts +0 -50
- package/dist/services/taskResult/index.d.cts.map +0 -1
- package/dist/services/taskResult/index.d.mts +0 -50
- package/dist/services/taskResult/index.d.mts.map +0 -1
- package/dist/services/taskResult/index.mjs +0 -7
- package/dist/services/taskResult/index.mjs.map +0 -1
- package/dist/services/taskStore/index.cjs +0 -2
- package/dist/services/taskStore/index.cjs.map +0 -1
- package/dist/services/taskStore/index.d.cts +0 -69
- package/dist/services/taskStore/index.d.cts.map +0 -1
- package/dist/services/taskStore/index.d.mts +0 -69
- package/dist/services/taskStore/index.d.mts.map +0 -1
- package/dist/services/taskStore/index.mjs +0 -2
- package/dist/services/taskStore/index.mjs.map +0 -1
- package/dist/store-invariants.cjs +0 -1
- package/dist/store-invariants.d.cts +0 -2
- package/dist/store-invariants.d.mts +0 -2
- package/dist/store-invariants.mjs +0 -1
- package/dist/store-paths.cjs +0 -1
- package/dist/store-paths.d.cts +0 -2
- package/dist/store-paths.d.mts +0 -2
- package/dist/store-paths.mjs +0 -1
- package/dist/store-process-liveness.cjs +0 -1
- package/dist/store-process-liveness.d.cts +0 -2
- package/dist/store-process-liveness.d.mts +0 -2
- package/dist/store-process-liveness.mjs +0 -1
- package/dist/store-reconcile.cjs +0 -1
- package/dist/store-reconcile.d.cts +0 -2
- package/dist/store-reconcile.d.mts +0 -2
- package/dist/store-reconcile.mjs +0 -1
- package/dist/store-reducer.cjs +0 -1
- package/dist/store-reducer.d.cts +0 -2
- package/dist/store-reducer.d.mts +0 -2
- package/dist/store-reducer.mjs +0 -1
- package/dist/store-task-graph.cjs +0 -1
- package/dist/store-task-graph.d.cts +0 -2
- package/dist/store-task-graph.d.mts +0 -2
- package/dist/store-task-graph.mjs +0 -1
- package/dist/store-task-store.cjs +0 -1
- package/dist/store-task-store.d.cts +0 -2
- package/dist/store-task-store.d.mts +0 -2
- package/dist/store-task-store.mjs +0 -1
- package/dist/store-types.cjs +0 -1
- package/dist/store-types.d.cts +0 -2
- package/dist/store-types.d.mts +0 -2
- package/dist/store-types.mjs +0 -1
- package/dist/tool-prompt-guidelines.cjs +0 -1
- package/dist/tool-prompt-guidelines.d.cts +0 -2
- package/dist/tool-prompt-guidelines.d.mts +0 -2
- package/dist/tool-prompt-guidelines.mjs +0 -1
- package/dist/tool-response-envelope.cjs +0 -1
- package/dist/tool-response-envelope.d.cts +0 -2
- package/dist/tool-response-envelope.d.mts +0 -2
- package/dist/tool-response-envelope.mjs +0 -1
- package/dist/tool-schema.cjs +0 -1
- package/dist/tool-schema.d.cts +0 -3
- package/dist/tool-schema.d.mts +0 -3
- package/dist/tool-schema.mjs +0 -1
- package/dist/tool-task-tool.cjs +0 -1
- package/dist/tool-task-tool.d.cts +0 -3
- package/dist/tool-task-tool.d.mts +0 -3
- package/dist/tool-task-tool.mjs +0 -1
- package/dist/tools/task.cjs +0 -3
- package/dist/tools/task.cjs.map +0 -1
- package/dist/tools/task.d.cts +0 -22
- package/dist/tools/task.d.cts.map +0 -1
- package/dist/tools/task.d.mts +0 -22
- package/dist/tools/task.d.mts.map +0 -1
- package/dist/tools/task.mjs +0 -3
- package/dist/tools/task.mjs.map +0 -1
- package/dist/tui/format.cjs +0 -4
- package/dist/tui/format.cjs.map +0 -1
- package/dist/tui/format.d.cts +0 -61
- package/dist/tui/format.d.cts.map +0 -1
- package/dist/tui/format.d.mts +0 -61
- package/dist/tui/format.d.mts.map +0 -1
- package/dist/tui/format.mjs +0 -4
- package/dist/tui/format.mjs.map +0 -1
- package/dist/tui/selectors.cjs +0 -2
- package/dist/tui/selectors.cjs.map +0 -1
- package/dist/tui/selectors.d.cts +0 -59
- package/dist/tui/selectors.d.cts.map +0 -1
- package/dist/tui/selectors.d.mts +0 -59
- package/dist/tui/selectors.d.mts.map +0 -1
- package/dist/tui/selectors.mjs +0 -2
- package/dist/tui/selectors.mjs.map +0 -1
- package/dist/tui/taskOverlay.cjs +0 -2
- package/dist/tui/taskOverlay.cjs.map +0 -1
- package/dist/tui/taskOverlay.d.cts +0 -37
- package/dist/tui/taskOverlay.d.cts.map +0 -1
- package/dist/tui/taskOverlay.d.mts +0 -37
- package/dist/tui/taskOverlay.d.mts.map +0 -1
- package/dist/tui/taskOverlay.mjs +0 -2
- package/dist/tui/taskOverlay.mjs.map +0 -1
- package/dist/tui/taskSpace.cjs +0 -5
- package/dist/tui/taskSpace.cjs.map +0 -1
- package/dist/tui/taskSpace.d.cts +0 -60
- package/dist/tui/taskSpace.d.cts.map +0 -1
- package/dist/tui/taskSpace.d.mts +0 -60
- package/dist/tui/taskSpace.d.mts.map +0 -1
- package/dist/tui/taskSpace.mjs +0 -5
- package/dist/tui/taskSpace.mjs.map +0 -1
- package/dist/tui-format.cjs +0 -1
- package/dist/tui-format.d.cts +0 -2
- package/dist/tui-format.d.mts +0 -2
- package/dist/tui-format.mjs +0 -1
- package/dist/tui-selectors.cjs +0 -1
- package/dist/tui-selectors.d.cts +0 -2
- package/dist/tui-selectors.d.mts +0 -2
- package/dist/tui-selectors.mjs +0 -1
- package/dist/tui-task-overlay.cjs +0 -1
- package/dist/tui-task-overlay.d.cts +0 -2
- package/dist/tui-task-overlay.d.mts +0 -2
- package/dist/tui-task-overlay.mjs +0 -1
- package/dist/tui-task-space.cjs +0 -1
- package/dist/tui-task-space.d.cts +0 -2
- package/dist/tui-task-space.d.mts +0 -2
- package/dist/tui-task-space.mjs +0 -1
- package/dist/types/delegation.cjs +0 -2
- package/dist/types/delegation.cjs.map +0 -1
- package/dist/types/delegation.d.cts +0 -5
- package/dist/types/delegation.d.cts.map +0 -1
- package/dist/types/delegation.d.mts +0 -5
- package/dist/types/delegation.d.mts.map +0 -1
- package/dist/types/delegation.mjs +0 -2
- package/dist/types/delegation.mjs.map +0 -1
- package/dist/types/telemetry.cjs +0 -2
- package/dist/types/telemetry.cjs.map +0 -1
- package/dist/types/telemetry.d.cts +0 -35
- package/dist/types/telemetry.d.cts.map +0 -1
- package/dist/types/telemetry.d.mts +0 -35
- package/dist/types/telemetry.d.mts.map +0 -1
- package/dist/types/telemetry.mjs +0 -2
- package/dist/types/telemetry.mjs.map +0 -1
- package/dist/types/webTasks.cjs +0 -2
- package/dist/types/webTasks.cjs.map +0 -1
- package/dist/types/webTasks.mjs +0 -2
- package/dist/types/webTasks.mjs.map +0 -1
- package/src/extensions/web.ts +0 -18
- package/src/web/components/TaskDetailDialog.tsx +0 -251
- package/src/web/components/TaskToolMessage.tsx +0 -120
- package/src/web/components/TasksActivitySection.tsx +0 -200
- package/src/web/lib/taskToolFormat.ts +0 -330
- package/src/web/stores/tasksStore.ts +0 -114
- package/src/web/tsconfig.json +0 -23
package/README.md
CHANGED
|
@@ -107,12 +107,21 @@ Intercom and Team membership remain Team state; `tasks.json` remains Task state.
|
|
|
107
107
|
## Public API
|
|
108
108
|
|
|
109
109
|
```ts
|
|
110
|
-
import { detectCycle, isBlocked, TaskStore
|
|
110
|
+
import { detectCycle, isBlocked, TaskStore } from '@agimon-ai/doompi-task';
|
|
111
111
|
import type { Task, TaskStatus } from '@agimon-ai/doompi-task';
|
|
112
112
|
```
|
|
113
113
|
|
|
114
|
-
Focused subpaths include `/tool
|
|
115
|
-
`/delegation
|
|
114
|
+
Focused subpaths include `/tool-schema`, `/store-reducer`, `/store-task-store`,
|
|
115
|
+
`/delegation-manager`, and `/tui-selectors`. Pi loads `/extensions/pi` through package metadata.
|
|
116
|
+
|
|
117
|
+
## Source layout
|
|
118
|
+
|
|
119
|
+
The host entries are generated from `src/extensions`. Pi and headless session roots hold each
|
|
120
|
+
session's store, delegation manager, startup work, service injection, and cleanup. Their tools,
|
|
121
|
+
commands, hooks, and resources register from files beside the roots. The global backend channel
|
|
122
|
+
publishes task graph updates. The session frontend owns the cockpit channel and Activity dock
|
|
123
|
+
section, plus Task Space, the terminal widget, and the task tool renderer. Shared task rules and
|
|
124
|
+
persistence stay in `src/services`; the published compatibility APIs remain in `src/exports`.
|
|
116
125
|
|
|
117
126
|
## Development
|
|
118
127
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@agimon-ai/doompi-task",
|
|
3
|
-
"version": "0.0.1-alpha.
|
|
3
|
+
"version": "0.0.1-alpha.75",
|
|
4
4
|
"description": "Persistent, dependency-aware task graphs and subagent delegation for Pi coding sessions.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"ai",
|
|
@@ -27,11 +27,8 @@
|
|
|
27
27
|
},
|
|
28
28
|
"files": [
|
|
29
29
|
"dist",
|
|
30
|
-
"src/web",
|
|
31
|
-
"src/extensions/web.ts",
|
|
32
30
|
"src/types/webTasks.ts",
|
|
33
|
-
"package.json"
|
|
34
|
-
"!src/web/**/*.stories.tsx"
|
|
31
|
+
"package.json"
|
|
35
32
|
],
|
|
36
33
|
"type": "module",
|
|
37
34
|
"main": "./dist/index.cjs",
|
|
@@ -68,6 +65,9 @@
|
|
|
68
65
|
"import": "./dist/extensions/server.mjs",
|
|
69
66
|
"require": "./dist/extensions/server.cjs"
|
|
70
67
|
},
|
|
68
|
+
"./extensions/web": {
|
|
69
|
+
"import": "./dist/extensions/web.mjs"
|
|
70
|
+
},
|
|
71
71
|
"./logSinkTelemetry": {
|
|
72
72
|
"types": "./dist/logSinkTelemetry.d.mts",
|
|
73
73
|
"import": "./dist/logSinkTelemetry.mjs",
|
|
@@ -160,14 +160,15 @@
|
|
|
160
160
|
"registry": "https://registry.npmjs.org/"
|
|
161
161
|
},
|
|
162
162
|
"dependencies": {
|
|
163
|
-
"@agimon-ai/doompi-core": "0.0.1-alpha.
|
|
164
|
-
"@agimon-ai/doompi-telemetry": "0.0.1-alpha.
|
|
165
|
-
"@agimon-ai/doompi-ui": "0.0.1-alpha.
|
|
166
|
-
"@agimon-ai/doompi-web-components": "0.0.1-alpha.
|
|
163
|
+
"@agimon-ai/doompi-core": "0.0.1-alpha.75",
|
|
164
|
+
"@agimon-ai/doompi-telemetry": "0.0.1-alpha.72",
|
|
165
|
+
"@agimon-ai/doompi-ui": "0.0.1-alpha.75",
|
|
166
|
+
"@agimon-ai/doompi-web-components": "0.0.1-alpha.33",
|
|
167
167
|
"@deepseek-ai/cordis": "4.0.2",
|
|
168
168
|
"typebox": "1.3.30"
|
|
169
169
|
},
|
|
170
170
|
"devDependencies": {
|
|
171
|
+
"@agimon-ai/doompi-build": "0.0.1-alpha.4",
|
|
171
172
|
"@earendil-works/pi-coding-agent": "0.85.1",
|
|
172
173
|
"@earendil-works/pi-tui": "0.85.1",
|
|
173
174
|
"@tanstack/react-store": "0.11.1",
|
|
@@ -197,12 +198,12 @@
|
|
|
197
198
|
"node": ">=22.19.0"
|
|
198
199
|
},
|
|
199
200
|
"doompiServer": {
|
|
200
|
-
"entry": "./
|
|
201
|
+
"entry": "./generated/server.ts",
|
|
201
202
|
"dist": "./dist/extensions/server.mjs",
|
|
202
203
|
"scopes": [
|
|
203
|
-
"session",
|
|
204
204
|
"global",
|
|
205
|
-
"workspace"
|
|
205
|
+
"workspace",
|
|
206
|
+
"session"
|
|
206
207
|
],
|
|
207
208
|
"contracts": {
|
|
208
209
|
"entry": "./src/exports/apiContracts.ts",
|
|
@@ -214,7 +215,7 @@
|
|
|
214
215
|
"channels": [
|
|
215
216
|
"task_graph"
|
|
216
217
|
],
|
|
217
|
-
"client": "./
|
|
218
|
+
"client": "./dist/extensions/web.mjs",
|
|
218
219
|
"scopes": [
|
|
219
220
|
"session"
|
|
220
221
|
]
|
|
@@ -227,7 +228,7 @@
|
|
|
227
228
|
"scripts": {
|
|
228
229
|
"build": "tsdown",
|
|
229
230
|
"test": "vitest --run",
|
|
230
|
-
"typecheck": "tsc --noEmit && tsc --noEmit -p
|
|
231
|
+
"typecheck": "tsc --noEmit && tsc --noEmit -p tsconfig.web.json",
|
|
231
232
|
"lint": "oxlint . && oxfmt . --check",
|
|
232
233
|
"fixcode": "oxlint . --fix && oxfmt ."
|
|
233
234
|
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
var e=Object.create,t=Object.defineProperty,n=Object.getOwnPropertyDescriptor,r=Object.getOwnPropertyNames,i=Object.getPrototypeOf,a=Object.prototype.hasOwnProperty,o=(e,i,o,s)=>{if(i&&typeof i==`object`||typeof i==`function`)for(var c=r(i),l=0,u=c.length,d;l<u;l++)d=c[l],!a.call(e,d)&&d!==o&&t(e,d,{get:(e=>i[e]).bind(null,d),enumerable:!(s=n(i,d))||s.enumerable});return e},s=(n,r,s)=>(s=n==null?{}:e(i(n)),o(r||!n||!n.__esModule||!a.call(n,`default`)?t(s,`default`,{value:n,enumerable:!0}):s,n));exports.__toESM=s;
|
package/dist/api-contracts.cjs
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:`Module`}});const e=require("./schemas/apiContracts.cjs");exports.apiContracts=e.apiContracts,exports.default=e.apiContracts;
|
package/dist/api-contracts.d.cts
DELETED
package/dist/api-contracts.d.mts
DELETED
package/dist/api-contracts.mjs
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{apiContracts as e}from"./schemas/apiContracts.mjs";export{e as apiContracts,e as default};
|
package/dist/commands.cjs
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("./controllers/tasksCommand.cjs");exports.createTasksCommand=e.createTasksCommand;
|
package/dist/commands.d.cts
DELETED
package/dist/commands.d.mts
DELETED
package/dist/commands.mjs
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{createTasksCommand as e}from"./controllers/tasksCommand.mjs";export{e as createTasksCommand};
|
package/dist/config.cjs
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("./services/config/index.cjs");exports.COLLAPSE_KEY_ENV=e.COLLAPSE_KEY_ENV,exports.COLLAPSE_KEY_OFF=e.COLLAPSE_KEY_OFF,exports.DEFAULT_COLLAPSE_KEY=e.DEFAULT_COLLAPSE_KEY,exports.DEFAULT_DELEGATION_TIMEOUT_MS=e.DEFAULT_DELEGATION_TIMEOUT_MS,exports.DEFAULT_MAX_TASKS=e.DEFAULT_MAX_TASKS,exports.DEFAULT_MAX_WIDGET_LINES=e.DEFAULT_MAX_WIDGET_LINES,exports.DEFAULT_STORE_TTL_MS=e.DEFAULT_STORE_TTL_MS,exports.DELEGATION_TIMEOUT_MS_ENV=e.DELEGATION_TIMEOUT_MS_ENV,exports.MAX_TASKS_ENV=e.MAX_TASKS_ENV,exports.MAX_WIDGET_LINES_ENV=e.MAX_WIDGET_LINES_ENV,exports.STORE_TTL_MS_ENV=e.STORE_TTL_MS_ENV,exports.getDelegationTimeoutMs=e.getDelegationTimeoutMs,exports.getMaxTasks=e.getMaxTasks,exports.getMaxWidgetLines=e.getMaxWidgetLines,exports.getStoreTtlMs=e.getStoreTtlMs,exports.parsePiTaskConfig=e.parsePiTaskConfig,exports.resolveCollapseKey=e.resolveCollapseKey;
|
package/dist/config.d.cts
DELETED
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import { COLLAPSE_KEY_ENV, COLLAPSE_KEY_OFF, DEFAULT_COLLAPSE_KEY, DEFAULT_DELEGATION_TIMEOUT_MS, DEFAULT_MAX_TASKS, DEFAULT_MAX_WIDGET_LINES, DEFAULT_STORE_TTL_MS, DELEGATION_TIMEOUT_MS_ENV, MAX_TASKS_ENV, MAX_WIDGET_LINES_ENV, PiTaskConfig, STORE_TTL_MS_ENV, getDelegationTimeoutMs, getMaxTasks, getMaxWidgetLines, getStoreTtlMs, parsePiTaskConfig, resolveCollapseKey } from "./services/config/index.cjs";
|
|
2
|
-
export { COLLAPSE_KEY_ENV, COLLAPSE_KEY_OFF, DEFAULT_COLLAPSE_KEY, DEFAULT_DELEGATION_TIMEOUT_MS, DEFAULT_MAX_TASKS, DEFAULT_MAX_WIDGET_LINES, DEFAULT_STORE_TTL_MS, DELEGATION_TIMEOUT_MS_ENV, MAX_TASKS_ENV, MAX_WIDGET_LINES_ENV, PiTaskConfig, STORE_TTL_MS_ENV, getDelegationTimeoutMs, getMaxTasks, getMaxWidgetLines, getStoreTtlMs, parsePiTaskConfig, resolveCollapseKey };
|
package/dist/config.d.mts
DELETED
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import { COLLAPSE_KEY_ENV, COLLAPSE_KEY_OFF, DEFAULT_COLLAPSE_KEY, DEFAULT_DELEGATION_TIMEOUT_MS, DEFAULT_MAX_TASKS, DEFAULT_MAX_WIDGET_LINES, DEFAULT_STORE_TTL_MS, DELEGATION_TIMEOUT_MS_ENV, MAX_TASKS_ENV, MAX_WIDGET_LINES_ENV, PiTaskConfig, STORE_TTL_MS_ENV, getDelegationTimeoutMs, getMaxTasks, getMaxWidgetLines, getStoreTtlMs, parsePiTaskConfig, resolveCollapseKey } from "./services/config/index.mjs";
|
|
2
|
-
export { COLLAPSE_KEY_ENV, COLLAPSE_KEY_OFF, DEFAULT_COLLAPSE_KEY, DEFAULT_DELEGATION_TIMEOUT_MS, DEFAULT_MAX_TASKS, DEFAULT_MAX_WIDGET_LINES, DEFAULT_STORE_TTL_MS, DELEGATION_TIMEOUT_MS_ENV, MAX_TASKS_ENV, MAX_WIDGET_LINES_ENV, PiTaskConfig, STORE_TTL_MS_ENV, getDelegationTimeoutMs, getMaxTasks, getMaxWidgetLines, getStoreTtlMs, parsePiTaskConfig, resolveCollapseKey };
|
package/dist/config.mjs
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{COLLAPSE_KEY_ENV as e,COLLAPSE_KEY_OFF as t,DEFAULT_COLLAPSE_KEY as n,DEFAULT_DELEGATION_TIMEOUT_MS as r,DEFAULT_MAX_TASKS as i,DEFAULT_MAX_WIDGET_LINES as a,DEFAULT_STORE_TTL_MS as o,DELEGATION_TIMEOUT_MS_ENV as s,MAX_TASKS_ENV as c,MAX_WIDGET_LINES_ENV as l,STORE_TTL_MS_ENV as u,getDelegationTimeoutMs as d,getMaxTasks as f,getMaxWidgetLines as p,getStoreTtlMs as m,parsePiTaskConfig as h,resolveCollapseKey as g}from"./services/config/index.mjs";export{e as COLLAPSE_KEY_ENV,t as COLLAPSE_KEY_OFF,n as DEFAULT_COLLAPSE_KEY,r as DEFAULT_DELEGATION_TIMEOUT_MS,i as DEFAULT_MAX_TASKS,a as DEFAULT_MAX_WIDGET_LINES,o as DEFAULT_STORE_TTL_MS,s as DELEGATION_TIMEOUT_MS_ENV,c as MAX_TASKS_ENV,l as MAX_WIDGET_LINES_ENV,u as STORE_TTL_MS_ENV,d as getDelegationTimeoutMs,f as getMaxTasks,p as getMaxWidgetLines,m as getStoreTtlMs,h as parsePiTaskConfig,g as resolveCollapseKey};
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
const e=[`Batch the whole plan in one upsert: {"action":"upsert","tasks":[{"subject":"Research the store"},{"subject":"Write the reducer"}]}. Report progress one call at a time: mark a task in_progress before you start it and completed the moment it lands, never batched at the end of a turn. Keep one task in_progress for your own work; delegated tasks run in parallel and do not count.`,`Never mark a task completed while tests fail or the work is partial. Use failed, or keep it in_progress and add a task for the blocker in the same upsert.`,`When every non-deleted task is completed, review the list once and call {"action":"clear"}.`,`Status flow: pending, in_progress, completed. failed is recoverable, deleted is a tombstone. Pass activeForm (e.g. 'writing tests') when marking in_progress.`,`upsert applies each entry independently: passing entries commit and failures are reported by array index. Resend only the corrected failures, because resending an applied entry with no id creates a duplicate task.`,`Apply the session delegation criteria before choosing what to delegate, then call subagent {"action":"agents"} and use an exact discovered name. Prefer a general-purpose write-capable agent such as delegate or worker when no specialist fits, and use a focused inlineAgent only for read-only work.`,`Assign through assignments[] even for a single task: {"action":"assign","assignments":[{"id":1,"agent":"researcher"}]}. Put independent ready tasks in one batch rather than repeated calls or multi_tool, and do not start a direct subagent run for work already on the task list. Successful entries keep running when another entry fails, so retry only the failures.`,`Fill relevantFiles only with files you actually read or located, and priorFindings only with verified facts in a few lines, not directives. A guessed path costs more than an omitted one.`,`Subject stays short and imperative. description is the durable brief handed to the subagent, extended at assign time by instructions, relevantFiles and priorFindings, so do not repeat one in the other.`,`When a delegated task completes and unblocks another, reconsider it promptly. If a child asks for a decision or an assignment fails to start, respond, rescope or retry instead of leaving it pending. Doom Task records delegated lifecycle and results on the task itself.`];exports.DEFAULT_PROMPT_GUIDELINES=e;
|
|
2
|
-
//# sourceMappingURL=promptGuidelines.cjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"promptGuidelines.cjs","names":[],"sources":["../../src/constants/promptGuidelines.ts"],"sourcesContent":["/**\n * Cross-call behaviour the schema cannot express.\n *\n * Every rule lives in exactly one surface. Argument-site mechanics belong to\n * the parameter descriptions in `schemas/task.ts`, the use/do-not-use policy\n * and session scoping belong to the tool description, and general delegation\n * judgement belongs to the Team orchestrator prompt. What is left here is what\n * none of those three can carry: how calls should be sequenced across a turn.\n */\nexport const DEFAULT_PROMPT_GUIDELINES: string[] = [\n 'Batch the whole plan in one upsert: {\"action\":\"upsert\",\"tasks\":[{\"subject\":\"Research the store\"},{\"subject\":\"Write the reducer\"}]}. Report progress one call at a time: mark a task in_progress before you start it and completed the moment it lands, never batched at the end of a turn. Keep one task in_progress for your own work; delegated tasks run in parallel and do not count.',\n 'Never mark a task completed while tests fail or the work is partial. Use failed, or keep it in_progress and add a task for the blocker in the same upsert.',\n 'When every non-deleted task is completed, review the list once and call {\"action\":\"clear\"}.',\n \"Status flow: pending, in_progress, completed. failed is recoverable, deleted is a tombstone. Pass activeForm (e.g. 'writing tests') when marking in_progress.\",\n 'upsert applies each entry independently: passing entries commit and failures are reported by array index. Resend only the corrected failures, because resending an applied entry with no id creates a duplicate task.',\n 'Apply the session delegation criteria before choosing what to delegate, then call subagent {\"action\":\"agents\"} and use an exact discovered name. Prefer a general-purpose write-capable agent such as delegate or worker when no specialist fits, and use a focused inlineAgent only for read-only work.',\n 'Assign through assignments[] even for a single task: {\"action\":\"assign\",\"assignments\":[{\"id\":1,\"agent\":\"researcher\"}]}. Put independent ready tasks in one batch rather than repeated calls or multi_tool, and do not start a direct subagent run for work already on the task list. Successful entries keep running when another entry fails, so retry only the failures.',\n 'Fill relevantFiles only with files you actually read or located, and priorFindings only with verified facts in a few lines, not directives. A guessed path costs more than an omitted one.',\n 'Subject stays short and imperative. description is the durable brief handed to the subagent, extended at assign time by instructions, relevantFiles and priorFindings, so do not repeat one in the other.',\n 'When a delegated task completes and unblocks another, reconsider it promptly. If a child asks for a decision or an assignment fails to start, respond, rescope or retry instead of leaving it pending. Doom Task records delegated lifecycle and results on the task itself.',\n];\n"],"mappings":"AASA,MAAa,EAAsC,CACjD,4XACA,6JACA,8FACA,gKACA,wNACA,2SACA,6WACA,6LACA,4MACA,8QACF"}
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
//#region src/constants/promptGuidelines.d.ts
|
|
2
|
-
/**
|
|
3
|
-
* Cross-call behaviour the schema cannot express.
|
|
4
|
-
*
|
|
5
|
-
* Every rule lives in exactly one surface. Argument-site mechanics belong to
|
|
6
|
-
* the parameter descriptions in `schemas/task.ts`, the use/do-not-use policy
|
|
7
|
-
* and session scoping belong to the tool description, and general delegation
|
|
8
|
-
* judgement belongs to the Team orchestrator prompt. What is left here is what
|
|
9
|
-
* none of those three can carry: how calls should be sequenced across a turn.
|
|
10
|
-
*/
|
|
11
|
-
export declare const DEFAULT_PROMPT_GUIDELINES: string[];
|
|
12
|
-
//#endregion
|
|
13
|
-
//# sourceMappingURL=promptGuidelines.d.cts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"promptGuidelines.d.cts","names":[],"sources":["../../src/constants/promptGuidelines.ts"],"mappings":";;;;;;;;;;qBASa"}
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
//#region src/constants/promptGuidelines.d.ts
|
|
2
|
-
/**
|
|
3
|
-
* Cross-call behaviour the schema cannot express.
|
|
4
|
-
*
|
|
5
|
-
* Every rule lives in exactly one surface. Argument-site mechanics belong to
|
|
6
|
-
* the parameter descriptions in `schemas/task.ts`, the use/do-not-use policy
|
|
7
|
-
* and session scoping belong to the tool description, and general delegation
|
|
8
|
-
* judgement belongs to the Team orchestrator prompt. What is left here is what
|
|
9
|
-
* none of those three can carry: how calls should be sequenced across a turn.
|
|
10
|
-
*/
|
|
11
|
-
export declare const DEFAULT_PROMPT_GUIDELINES: string[];
|
|
12
|
-
//#endregion
|
|
13
|
-
//# sourceMappingURL=promptGuidelines.d.mts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"promptGuidelines.d.mts","names":[],"sources":["../../src/constants/promptGuidelines.ts"],"mappings":";;;;;;;;;;qBASa"}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
const e=[`Batch the whole plan in one upsert: {"action":"upsert","tasks":[{"subject":"Research the store"},{"subject":"Write the reducer"}]}. Report progress one call at a time: mark a task in_progress before you start it and completed the moment it lands, never batched at the end of a turn. Keep one task in_progress for your own work; delegated tasks run in parallel and do not count.`,`Never mark a task completed while tests fail or the work is partial. Use failed, or keep it in_progress and add a task for the blocker in the same upsert.`,`When every non-deleted task is completed, review the list once and call {"action":"clear"}.`,`Status flow: pending, in_progress, completed. failed is recoverable, deleted is a tombstone. Pass activeForm (e.g. 'writing tests') when marking in_progress.`,`upsert applies each entry independently: passing entries commit and failures are reported by array index. Resend only the corrected failures, because resending an applied entry with no id creates a duplicate task.`,`Apply the session delegation criteria before choosing what to delegate, then call subagent {"action":"agents"} and use an exact discovered name. Prefer a general-purpose write-capable agent such as delegate or worker when no specialist fits, and use a focused inlineAgent only for read-only work.`,`Assign through assignments[] even for a single task: {"action":"assign","assignments":[{"id":1,"agent":"researcher"}]}. Put independent ready tasks in one batch rather than repeated calls or multi_tool, and do not start a direct subagent run for work already on the task list. Successful entries keep running when another entry fails, so retry only the failures.`,`Fill relevantFiles only with files you actually read or located, and priorFindings only with verified facts in a few lines, not directives. A guessed path costs more than an omitted one.`,`Subject stays short and imperative. description is the durable brief handed to the subagent, extended at assign time by instructions, relevantFiles and priorFindings, so do not repeat one in the other.`,`When a delegated task completes and unblocks another, reconsider it promptly. If a child asks for a decision or an assignment fails to start, respond, rescope or retry instead of leaving it pending. Doom Task records delegated lifecycle and results on the task itself.`];export{e as DEFAULT_PROMPT_GUIDELINES};
|
|
2
|
-
//# sourceMappingURL=promptGuidelines.mjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"promptGuidelines.mjs","names":[],"sources":["../../src/constants/promptGuidelines.ts"],"sourcesContent":["/**\n * Cross-call behaviour the schema cannot express.\n *\n * Every rule lives in exactly one surface. Argument-site mechanics belong to\n * the parameter descriptions in `schemas/task.ts`, the use/do-not-use policy\n * and session scoping belong to the tool description, and general delegation\n * judgement belongs to the Team orchestrator prompt. What is left here is what\n * none of those three can carry: how calls should be sequenced across a turn.\n */\nexport const DEFAULT_PROMPT_GUIDELINES: string[] = [\n 'Batch the whole plan in one upsert: {\"action\":\"upsert\",\"tasks\":[{\"subject\":\"Research the store\"},{\"subject\":\"Write the reducer\"}]}. Report progress one call at a time: mark a task in_progress before you start it and completed the moment it lands, never batched at the end of a turn. Keep one task in_progress for your own work; delegated tasks run in parallel and do not count.',\n 'Never mark a task completed while tests fail or the work is partial. Use failed, or keep it in_progress and add a task for the blocker in the same upsert.',\n 'When every non-deleted task is completed, review the list once and call {\"action\":\"clear\"}.',\n \"Status flow: pending, in_progress, completed. failed is recoverable, deleted is a tombstone. Pass activeForm (e.g. 'writing tests') when marking in_progress.\",\n 'upsert applies each entry independently: passing entries commit and failures are reported by array index. Resend only the corrected failures, because resending an applied entry with no id creates a duplicate task.',\n 'Apply the session delegation criteria before choosing what to delegate, then call subagent {\"action\":\"agents\"} and use an exact discovered name. Prefer a general-purpose write-capable agent such as delegate or worker when no specialist fits, and use a focused inlineAgent only for read-only work.',\n 'Assign through assignments[] even for a single task: {\"action\":\"assign\",\"assignments\":[{\"id\":1,\"agent\":\"researcher\"}]}. Put independent ready tasks in one batch rather than repeated calls or multi_tool, and do not start a direct subagent run for work already on the task list. Successful entries keep running when another entry fails, so retry only the failures.',\n 'Fill relevantFiles only with files you actually read or located, and priorFindings only with verified facts in a few lines, not directives. A guessed path costs more than an omitted one.',\n 'Subject stays short and imperative. description is the durable brief handed to the subagent, extended at assign time by instructions, relevantFiles and priorFindings, so do not repeat one in the other.',\n 'When a delegated task completes and unblocks another, reconsider it promptly. If a child asks for a decision or an assignment fails to start, respond, rescope or retry instead of leaving it pending. Doom Task records delegated lifecycle and results on the task itself.',\n];\n"],"mappings":"AASA,MAAa,EAAsC,CACjD,4XACA,6JACA,8FACA,gKACA,wNACA,2SACA,6WACA,6LACA,4MACA,8QACF"}
|
package/dist/constants/task.cjs
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"task.cjs","names":[],"sources":["../../src/constants/task.ts"],"sourcesContent":["export const COMMAND_NAME = 'tasks';\n"],"mappings":""}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"task.d.cts","names":[],"sources":["../../src/constants/task.ts"],"mappings":";qBAAa"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"task.d.mts","names":[],"sources":["../../src/constants/task.ts"],"mappings":";qBAAa"}
|
package/dist/constants/task.mjs
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"task.mjs","names":[],"sources":["../../src/constants/task.ts"],"sourcesContent":["export const COMMAND_NAME = 'tasks';\n"],"mappings":"AAAA,MAAa,EAAe"}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
const e=require("../constants/task.cjs"),t=require("../schemas/task.cjs");function n(n,r,i){return[e.COMMAND_NAME,{description:`Open Task Space for this session tree`,handler:async(e,a)=>{if(!a.hasUI){a.ui.notify(t.ERR_REQUIRES_INTERACTIVE,`error`);return}await i?.(a),n.read(),await r(a,{store:n})}}]}exports.createTasksCommand=n;
|
|
2
|
-
//# sourceMappingURL=tasksCommand.cjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"tasksCommand.cjs","names":["COMMAND_NAME","ERR_REQUIRES_INTERACTIVE"],"sources":["../../src/controllers/tasksCommand.ts"],"sourcesContent":["import type { ExtensionAPI, ExtensionContext } from '@earendil-works/pi-coding-agent';\n\nimport { COMMAND_NAME, ERR_REQUIRES_INTERACTIVE } from '../schemas/task';\nimport type { TaskStore } from '../services/taskStore';\n\n/**\n * `/tasks`, reachable from the leader palette as `SPC t l`.\n *\n * The command opens the Task Space overlay rather than printing a listing: the\n * overlay is the readable surface and it can edit, while a transcript dump could\n * only be read.\n */\nexport function createTasksCommand(\n store: TaskStore,\n openTaskSpace: (context: ExtensionContext, options: { store: TaskStore }) => Promise<void>,\n waitUntilReady?: (context: ExtensionContext) => Promise<void>,\n): readonly [string, Parameters<ExtensionAPI['registerCommand']>[1]] {\n return [\n COMMAND_NAME,\n {\n description: 'Open Task Space for this session tree',\n handler: async (_args, ctx) => {\n if (!ctx.hasUI) {\n ctx.ui.notify(ERR_REQUIRES_INTERACTIVE, 'error');\n return;\n }\n\n await waitUntilReady?.(ctx);\n store.read();\n await openTaskSpace(ctx, { store });\n },\n },\n ];\n}\n"],"mappings":"0EAYA,SAAgB,EACd,EACA,EACA,EACmE,CACnE,MAAO,CACLA,EAAAA,aACA,CACE,YAAa,wCACb,QAAS,MAAO,EAAO,IAAQ,CAC7B,GAAI,CAAC,EAAI,MAAO,CACd,EAAI,GAAG,OAAOC,EAAAA,yBAA0B,OAAO,EAC/C,MACF,CAEA,MAAM,IAAiB,CAAG,EAC1B,EAAM,KAAK,EACX,MAAM,EAAc,EAAK,CAAE,OAAM,CAAC,CACpC,CACF,CACF,CACF"}
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
import { TaskStore } from "../services/taskStore/index.cjs";
|
|
2
|
-
import { ExtensionAPI, ExtensionContext } from "@earendil-works/pi-coding-agent";
|
|
3
|
-
//#region src/controllers/tasksCommand.d.ts
|
|
4
|
-
/**
|
|
5
|
-
* `/tasks`, reachable from the leader palette as `SPC t l`.
|
|
6
|
-
*
|
|
7
|
-
* The command opens the Task Space overlay rather than printing a listing: the
|
|
8
|
-
* overlay is the readable surface and it can edit, while a transcript dump could
|
|
9
|
-
* only be read.
|
|
10
|
-
*/
|
|
11
|
-
export declare function createTasksCommand(store: TaskStore, openTaskSpace: (context: ExtensionContext, options: {
|
|
12
|
-
store: TaskStore;
|
|
13
|
-
}) => Promise<void>, waitUntilReady?: (context: ExtensionContext) => Promise<void>): readonly [string, Parameters<ExtensionAPI['registerCommand']>[1]];
|
|
14
|
-
//#endregion
|
|
15
|
-
//# sourceMappingURL=tasksCommand.d.cts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"tasksCommand.d.cts","names":[],"sources":["../../src/controllers/tasksCommand.ts"],"mappings":";;;;;;;;;;wBAYgB,mBACd,OAAO,WACP,gBAAgB,SAAS,kBAAkB;EAAW,OAAO;MAAgB,eAC7E,kBAAkB,SAAS,qBAAqB,kCAC7B,WAAW"}
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
import { TaskStore } from "../services/taskStore/index.mjs";
|
|
2
|
-
import { ExtensionAPI, ExtensionContext } from "@earendil-works/pi-coding-agent";
|
|
3
|
-
//#region src/controllers/tasksCommand.d.ts
|
|
4
|
-
/**
|
|
5
|
-
* `/tasks`, reachable from the leader palette as `SPC t l`.
|
|
6
|
-
*
|
|
7
|
-
* The command opens the Task Space overlay rather than printing a listing: the
|
|
8
|
-
* overlay is the readable surface and it can edit, while a transcript dump could
|
|
9
|
-
* only be read.
|
|
10
|
-
*/
|
|
11
|
-
export declare function createTasksCommand(store: TaskStore, openTaskSpace: (context: ExtensionContext, options: {
|
|
12
|
-
store: TaskStore;
|
|
13
|
-
}) => Promise<void>, waitUntilReady?: (context: ExtensionContext) => Promise<void>): readonly [string, Parameters<ExtensionAPI['registerCommand']>[1]];
|
|
14
|
-
//#endregion
|
|
15
|
-
//# sourceMappingURL=tasksCommand.d.mts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"tasksCommand.d.mts","names":[],"sources":["../../src/controllers/tasksCommand.ts"],"mappings":";;;;;;;;;;wBAYgB,mBACd,OAAO,WACP,gBAAgB,SAAS,kBAAkB;EAAW,OAAO;MAAgB,eAC7E,kBAAkB,SAAS,qBAAqB,kCAC7B,WAAW"}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{COMMAND_NAME as e}from"../constants/task.mjs";import{ERR_REQUIRES_INTERACTIVE as t}from"../schemas/task.mjs";function n(n,r,i){return[e,{description:`Open Task Space for this session tree`,handler:async(e,a)=>{if(!a.hasUI){a.ui.notify(t,`error`);return}await i?.(a),n.read(),await r(a,{store:n})}}]}export{n as createTasksCommand};
|
|
2
|
-
//# sourceMappingURL=tasksCommand.mjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"tasksCommand.mjs","names":[],"sources":["../../src/controllers/tasksCommand.ts"],"sourcesContent":["import type { ExtensionAPI, ExtensionContext } from '@earendil-works/pi-coding-agent';\n\nimport { COMMAND_NAME, ERR_REQUIRES_INTERACTIVE } from '../schemas/task';\nimport type { TaskStore } from '../services/taskStore';\n\n/**\n * `/tasks`, reachable from the leader palette as `SPC t l`.\n *\n * The command opens the Task Space overlay rather than printing a listing: the\n * overlay is the readable surface and it can edit, while a transcript dump could\n * only be read.\n */\nexport function createTasksCommand(\n store: TaskStore,\n openTaskSpace: (context: ExtensionContext, options: { store: TaskStore }) => Promise<void>,\n waitUntilReady?: (context: ExtensionContext) => Promise<void>,\n): readonly [string, Parameters<ExtensionAPI['registerCommand']>[1]] {\n return [\n COMMAND_NAME,\n {\n description: 'Open Task Space for this session tree',\n handler: async (_args, ctx) => {\n if (!ctx.hasUI) {\n ctx.ui.notify(ERR_REQUIRES_INTERACTIVE, 'error');\n return;\n }\n\n await waitUntilReady?.(ctx);\n store.read();\n await openTaskSpace(ctx, { store });\n },\n },\n ];\n}\n"],"mappings":"oHAYA,SAAgB,EACd,EACA,EACA,EACmE,CACnE,MAAO,CACL,EACA,CACE,YAAa,wCACb,QAAS,MAAO,EAAO,IAAQ,CAC7B,GAAI,CAAC,EAAI,MAAO,CACd,EAAI,GAAG,OAAO,EAA0B,OAAO,EAC/C,MACF,CAEA,MAAM,IAAiB,CAAG,EAC1B,EAAM,KAAK,EACX,MAAM,EAAc,EAAK,CAAE,OAAM,CAAC,CACpC,CACF,CACF,CACF"}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
const e=require("../services/paths/index.cjs"),t=require("../services/taskStore/index.cjs"),n=require("../types/webTasks.cjs");function r(e){return typeof e==`object`&&!!e&&typeof e.rev==`number`&&Array.isArray(e.tasks)}function i(e){return{tasks:e.tasks.flatMap(e=>{if(e.status===`deleted`)return[];let t={id:e.id,subject:e.subject,status:e.status,blockedBy:e.blockedBy??[]};return e.description&&(t.description=e.description),e.activeForm&&(t.activeForm=e.activeForm),e.owner&&(t.owner=e.owner),e.updatedAt&&(t.updatedAt=e.updatedAt),e.delegation&&(t.delegation={...e.delegation.agent===void 0?{}:{agent:e.delegation.agent},...e.delegation.state===void 0?{}:{state:e.delegation.state}}),[t]}),rev:e.rev}}function a(a={}){return{frameType:n.TASKS_CHANNEL_TYPE,start(o){let s=new Map,c=c=>{if(s.has(c.sessionId))return;let l=a.storeFor?.(c);if(l===void 0){if(c.environment===void 0)throw Error(`Task channel requires an admitted environment for session '${c.sessionId}'.`);l=new t.TaskStore({cwd:c.cwd,env:c.environment,storePath:e.resolveStorePath(c.cwd,c.environment,c.sessionId)})}l.read();let u={store:l,unsubscribe:()=>void 0};s.set(c.sessionId,u),u.unsubscribe=o.directEvents.subscribe(n.TASKS_CHANNEL_TYPE,c.sessionId,e=>{if(!r(e))return;let t=s.get(c.sessionId);t!==void 0&&(t.latest=e,o.publish(c.sessionId,i(e)))},{replayLatest:!0})},l=e=>{let t=s.get(e);t&&(t.unsubscribe(),t.store.dispose(),s.delete(e))};for(let e of o.sessions())c(e);return{payloadFor(e){c(e);let t=s.get(e.sessionId),n=t?.latest??t?.store.snapshot;return n===void 0?void 0:i(n)},sessionAdded:c,sessionRemoved:l,close(){for(let e of s.keys())l(e)}}}}}exports.createTasksChannel=a;
|
|
2
|
-
//# sourceMappingURL=webTasksChannel.cjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"webTasksChannel.cjs","names":["TASKS_CHANNEL_TYPE","TaskStore","resolveStorePath"],"sources":["../../src/controllers/webTasksChannel.ts"],"sourcesContent":["import type { DoomHubChannelSource, DoomHubSessionScope, DoomHubChannel } from '@agimon-ai/doompi-core/hub-channel';\n\nimport type { TaskDocument } from '../models/task';\nimport { resolveStorePath } from '../services/paths';\nimport { TaskStore } from '../services/taskStore';\nimport { TASKS_CHANNEL_TYPE, type WebTask, type WebTasksPayload } from '../types/webTasks';\n\ninterface TaskStoreSource {\n readonly snapshot: TaskDocument;\n read(): TaskDocument;\n dispose(): void;\n}\n\nfunction isTaskDocument(value: unknown): value is TaskDocument {\n return (\n typeof value === 'object' &&\n value !== null &&\n typeof (value as TaskDocument).rev === 'number' &&\n Array.isArray((value as TaskDocument).tasks)\n );\n}\n\nexport interface TasksChannelOptions {\n /** Injectable for tests. The default opens the session tree's durable task store. */\n storeFor?: (scope: DoomHubSessionScope) => TaskStoreSource;\n}\n\nfunction present(document: TaskDocument): WebTasksPayload {\n const tasks: WebTask[] = document.tasks.flatMap((task) => {\n if (task.status === 'deleted') return [];\n const view: WebTask = {\n id: task.id,\n subject: task.subject,\n status: task.status,\n blockedBy: task.blockedBy ?? [],\n };\n if (task.description) view.description = task.description;\n if (task.activeForm) view.activeForm = task.activeForm;\n if (task.owner) view.owner = task.owner;\n if (task.updatedAt) view.updatedAt = task.updatedAt;\n if (task.delegation) {\n view.delegation = {\n ...(task.delegation.agent === undefined ? {} : { agent: task.delegation.agent }),\n ...(task.delegation.state === undefined ? {} : { state: task.delegation.state }),\n };\n }\n return [view];\n });\n return { tasks, rev: document.rev };\n}\n\n/** Publishes each managed session's durable task graph and follows direct session commits. */\nexport function createTasksChannel(options: TasksChannelOptions = {}): DoomHubChannel {\n return {\n frameType: TASKS_CHANNEL_TYPE,\n start(host) {\n const stores = new Map<string, { store: TaskStoreSource; unsubscribe: () => void; latest?: TaskDocument }>();\n const open = (scope: DoomHubSessionScope): void => {\n if (stores.has(scope.sessionId)) return;\n let store = options.storeFor?.(scope);\n if (store === undefined) {\n if (scope.environment === undefined)\n throw new Error(`Task channel requires an admitted environment for session '${scope.sessionId}'.`);\n store = new TaskStore({\n cwd: scope.cwd,\n env: scope.environment,\n storePath: resolveStorePath(scope.cwd, scope.environment, scope.sessionId),\n });\n }\n store.read();\n const source = { store, unsubscribe: () => undefined as void };\n stores.set(scope.sessionId, source);\n source.unsubscribe = host.directEvents.subscribe(\n TASKS_CHANNEL_TYPE,\n scope.sessionId,\n (payload) => {\n if (!isTaskDocument(payload)) return;\n const current = stores.get(scope.sessionId);\n if (current === undefined) return;\n current.latest = payload;\n host.publish(scope.sessionId, present(payload));\n },\n { replayLatest: true },\n );\n };\n const close = (sessionId: string): void => {\n const source = stores.get(sessionId);\n if (!source) return;\n source.unsubscribe();\n source.store.dispose();\n stores.delete(sessionId);\n };\n for (const scope of host.sessions()) open(scope);\n\n const source: DoomHubChannelSource = {\n payloadFor(scope) {\n open(scope);\n const source = stores.get(scope.sessionId);\n const document = source?.latest ?? source?.store.snapshot;\n return document === undefined ? undefined : present(document);\n },\n sessionAdded: open,\n sessionRemoved: close,\n close() {\n for (const sessionId of stores.keys()) close(sessionId);\n },\n };\n return source;\n },\n };\n}\n"],"mappings":"+HAaA,SAAS,EAAe,EAAuC,CAC7D,OACE,OAAO,GAAU,YACjB,GACA,OAAQ,EAAuB,KAAQ,UACvC,MAAM,QAAS,EAAuB,KAAK,CAE/C,CAOA,SAAS,EAAQ,EAAyC,CAqBxD,MAAO,CAAE,MApBgB,EAAS,MAAM,QAAS,GAAS,CACxD,GAAI,EAAK,SAAW,UAAW,MAAO,CAAC,EACvC,IAAM,EAAgB,CACpB,GAAI,EAAK,GACT,QAAS,EAAK,QACd,OAAQ,EAAK,OACb,UAAW,EAAK,WAAa,CAAC,CAChC,EAWA,OAVI,EAAK,cAAa,EAAK,YAAc,EAAK,aAC1C,EAAK,aAAY,EAAK,WAAa,EAAK,YACxC,EAAK,QAAO,EAAK,MAAQ,EAAK,OAC9B,EAAK,YAAW,EAAK,UAAY,EAAK,WACtC,EAAK,aACP,EAAK,WAAa,CAChB,GAAI,EAAK,WAAW,QAAU,IAAA,GAAY,CAAC,EAAI,CAAE,MAAO,EAAK,WAAW,KAAM,EAC9E,GAAI,EAAK,WAAW,QAAU,IAAA,GAAY,CAAC,EAAI,CAAE,MAAO,EAAK,WAAW,KAAM,CAChF,GAEK,CAAC,CAAI,CACd,CACa,EAAG,IAAK,EAAS,GAAI,CACpC,CAGA,SAAgB,EAAmB,EAA+B,CAAC,EAAmB,CACpF,MAAO,CACL,UAAWA,EAAAA,mBACX,MAAM,EAAM,CACV,IAAM,EAAS,IAAI,IACb,EAAQ,GAAqC,CACjD,GAAI,EAAO,IAAI,EAAM,SAAS,EAAG,OACjC,IAAI,EAAQ,EAAQ,WAAW,CAAK,EACpC,GAAI,IAAU,IAAA,GAAW,CACvB,GAAI,EAAM,cAAgB,IAAA,GACxB,MAAU,MAAM,8DAA8D,EAAM,UAAU,GAAG,EACnG,EAAQ,IAAIC,EAAAA,UAAU,CACpB,IAAK,EAAM,IACX,IAAK,EAAM,YACX,UAAWC,EAAAA,iBAAiB,EAAM,IAAK,EAAM,YAAa,EAAM,SAAS,CAC3E,CAAC,CACH,CACA,EAAM,KAAK,EACX,IAAM,EAAS,CAAE,QAAO,gBAAmB,IAAA,EAAkB,EAC7D,EAAO,IAAI,EAAM,UAAW,CAAM,EAClC,EAAO,YAAc,EAAK,aAAa,UACrCF,EAAAA,mBACA,EAAM,UACL,GAAY,CACX,GAAI,CAAC,EAAe,CAAO,EAAG,OAC9B,IAAM,EAAU,EAAO,IAAI,EAAM,SAAS,EACtC,IAAY,IAAA,KAChB,EAAQ,OAAS,EACjB,EAAK,QAAQ,EAAM,UAAW,EAAQ,CAAO,CAAC,EAChD,EACA,CAAE,aAAc,EAAK,CACvB,CACF,EACM,EAAS,GAA4B,CACzC,IAAM,EAAS,EAAO,IAAI,CAAS,EAC9B,IACL,EAAO,YAAY,EACnB,EAAO,MAAM,QAAQ,EACrB,EAAO,OAAO,CAAS,EACzB,EACA,IAAK,IAAM,KAAS,EAAK,SAAS,EAAG,EAAK,CAAK,EAe/C,MAAO,CAZL,WAAW,EAAO,CAChB,EAAK,CAAK,EACV,IAAM,EAAS,EAAO,IAAI,EAAM,SAAS,EACnC,EAAW,GAAQ,QAAU,GAAQ,MAAM,SACjD,OAAO,IAAa,IAAA,GAAY,IAAA,GAAY,EAAQ,CAAQ,CAC9D,EACA,aAAc,EACd,eAAgB,EAChB,OAAQ,CACN,IAAK,IAAM,KAAa,EAAO,KAAK,EAAG,EAAM,CAAS,CACxD,CAEU,CACd,CACF,CACF"}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{resolveStorePath as e}from"../services/paths/index.mjs";import{TaskStore as t}from"../services/taskStore/index.mjs";import{TASKS_CHANNEL_TYPE as n}from"../types/webTasks.mjs";function r(e){return typeof e==`object`&&!!e&&typeof e.rev==`number`&&Array.isArray(e.tasks)}function i(e){return{tasks:e.tasks.flatMap(e=>{if(e.status===`deleted`)return[];let t={id:e.id,subject:e.subject,status:e.status,blockedBy:e.blockedBy??[]};return e.description&&(t.description=e.description),e.activeForm&&(t.activeForm=e.activeForm),e.owner&&(t.owner=e.owner),e.updatedAt&&(t.updatedAt=e.updatedAt),e.delegation&&(t.delegation={...e.delegation.agent===void 0?{}:{agent:e.delegation.agent},...e.delegation.state===void 0?{}:{state:e.delegation.state}}),[t]}),rev:e.rev}}function a(a={}){return{frameType:n,start(o){let s=new Map,c=c=>{if(s.has(c.sessionId))return;let l=a.storeFor?.(c);if(l===void 0){if(c.environment===void 0)throw Error(`Task channel requires an admitted environment for session '${c.sessionId}'.`);l=new t({cwd:c.cwd,env:c.environment,storePath:e(c.cwd,c.environment,c.sessionId)})}l.read();let u={store:l,unsubscribe:()=>void 0};s.set(c.sessionId,u),u.unsubscribe=o.directEvents.subscribe(n,c.sessionId,e=>{if(!r(e))return;let t=s.get(c.sessionId);t!==void 0&&(t.latest=e,o.publish(c.sessionId,i(e)))},{replayLatest:!0})},l=e=>{let t=s.get(e);t&&(t.unsubscribe(),t.store.dispose(),s.delete(e))};for(let e of o.sessions())c(e);return{payloadFor(e){c(e);let t=s.get(e.sessionId),n=t?.latest??t?.store.snapshot;return n===void 0?void 0:i(n)},sessionAdded:c,sessionRemoved:l,close(){for(let e of s.keys())l(e)}}}}}export{a as createTasksChannel};
|
|
2
|
-
//# sourceMappingURL=webTasksChannel.mjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"webTasksChannel.mjs","names":[],"sources":["../../src/controllers/webTasksChannel.ts"],"sourcesContent":["import type { DoomHubChannelSource, DoomHubSessionScope, DoomHubChannel } from '@agimon-ai/doompi-core/hub-channel';\n\nimport type { TaskDocument } from '../models/task';\nimport { resolveStorePath } from '../services/paths';\nimport { TaskStore } from '../services/taskStore';\nimport { TASKS_CHANNEL_TYPE, type WebTask, type WebTasksPayload } from '../types/webTasks';\n\ninterface TaskStoreSource {\n readonly snapshot: TaskDocument;\n read(): TaskDocument;\n dispose(): void;\n}\n\nfunction isTaskDocument(value: unknown): value is TaskDocument {\n return (\n typeof value === 'object' &&\n value !== null &&\n typeof (value as TaskDocument).rev === 'number' &&\n Array.isArray((value as TaskDocument).tasks)\n );\n}\n\nexport interface TasksChannelOptions {\n /** Injectable for tests. The default opens the session tree's durable task store. */\n storeFor?: (scope: DoomHubSessionScope) => TaskStoreSource;\n}\n\nfunction present(document: TaskDocument): WebTasksPayload {\n const tasks: WebTask[] = document.tasks.flatMap((task) => {\n if (task.status === 'deleted') return [];\n const view: WebTask = {\n id: task.id,\n subject: task.subject,\n status: task.status,\n blockedBy: task.blockedBy ?? [],\n };\n if (task.description) view.description = task.description;\n if (task.activeForm) view.activeForm = task.activeForm;\n if (task.owner) view.owner = task.owner;\n if (task.updatedAt) view.updatedAt = task.updatedAt;\n if (task.delegation) {\n view.delegation = {\n ...(task.delegation.agent === undefined ? {} : { agent: task.delegation.agent }),\n ...(task.delegation.state === undefined ? {} : { state: task.delegation.state }),\n };\n }\n return [view];\n });\n return { tasks, rev: document.rev };\n}\n\n/** Publishes each managed session's durable task graph and follows direct session commits. */\nexport function createTasksChannel(options: TasksChannelOptions = {}): DoomHubChannel {\n return {\n frameType: TASKS_CHANNEL_TYPE,\n start(host) {\n const stores = new Map<string, { store: TaskStoreSource; unsubscribe: () => void; latest?: TaskDocument }>();\n const open = (scope: DoomHubSessionScope): void => {\n if (stores.has(scope.sessionId)) return;\n let store = options.storeFor?.(scope);\n if (store === undefined) {\n if (scope.environment === undefined)\n throw new Error(`Task channel requires an admitted environment for session '${scope.sessionId}'.`);\n store = new TaskStore({\n cwd: scope.cwd,\n env: scope.environment,\n storePath: resolveStorePath(scope.cwd, scope.environment, scope.sessionId),\n });\n }\n store.read();\n const source = { store, unsubscribe: () => undefined as void };\n stores.set(scope.sessionId, source);\n source.unsubscribe = host.directEvents.subscribe(\n TASKS_CHANNEL_TYPE,\n scope.sessionId,\n (payload) => {\n if (!isTaskDocument(payload)) return;\n const current = stores.get(scope.sessionId);\n if (current === undefined) return;\n current.latest = payload;\n host.publish(scope.sessionId, present(payload));\n },\n { replayLatest: true },\n );\n };\n const close = (sessionId: string): void => {\n const source = stores.get(sessionId);\n if (!source) return;\n source.unsubscribe();\n source.store.dispose();\n stores.delete(sessionId);\n };\n for (const scope of host.sessions()) open(scope);\n\n const source: DoomHubChannelSource = {\n payloadFor(scope) {\n open(scope);\n const source = stores.get(scope.sessionId);\n const document = source?.latest ?? source?.store.snapshot;\n return document === undefined ? undefined : present(document);\n },\n sessionAdded: open,\n sessionRemoved: close,\n close() {\n for (const sessionId of stores.keys()) close(sessionId);\n },\n };\n return source;\n },\n };\n}\n"],"mappings":"sLAaA,SAAS,EAAe,EAAuC,CAC7D,OACE,OAAO,GAAU,YACjB,GACA,OAAQ,EAAuB,KAAQ,UACvC,MAAM,QAAS,EAAuB,KAAK,CAE/C,CAOA,SAAS,EAAQ,EAAyC,CAqBxD,MAAO,CAAE,MApBgB,EAAS,MAAM,QAAS,GAAS,CACxD,GAAI,EAAK,SAAW,UAAW,MAAO,CAAC,EACvC,IAAM,EAAgB,CACpB,GAAI,EAAK,GACT,QAAS,EAAK,QACd,OAAQ,EAAK,OACb,UAAW,EAAK,WAAa,CAAC,CAChC,EAWA,OAVI,EAAK,cAAa,EAAK,YAAc,EAAK,aAC1C,EAAK,aAAY,EAAK,WAAa,EAAK,YACxC,EAAK,QAAO,EAAK,MAAQ,EAAK,OAC9B,EAAK,YAAW,EAAK,UAAY,EAAK,WACtC,EAAK,aACP,EAAK,WAAa,CAChB,GAAI,EAAK,WAAW,QAAU,IAAA,GAAY,CAAC,EAAI,CAAE,MAAO,EAAK,WAAW,KAAM,EAC9E,GAAI,EAAK,WAAW,QAAU,IAAA,GAAY,CAAC,EAAI,CAAE,MAAO,EAAK,WAAW,KAAM,CAChF,GAEK,CAAC,CAAI,CACd,CACa,EAAG,IAAK,EAAS,GAAI,CACpC,CAGA,SAAgB,EAAmB,EAA+B,CAAC,EAAmB,CACpF,MAAO,CACL,UAAW,EACX,MAAM,EAAM,CACV,IAAM,EAAS,IAAI,IACb,EAAQ,GAAqC,CACjD,GAAI,EAAO,IAAI,EAAM,SAAS,EAAG,OACjC,IAAI,EAAQ,EAAQ,WAAW,CAAK,EACpC,GAAI,IAAU,IAAA,GAAW,CACvB,GAAI,EAAM,cAAgB,IAAA,GACxB,MAAU,MAAM,8DAA8D,EAAM,UAAU,GAAG,EACnG,EAAQ,IAAI,EAAU,CACpB,IAAK,EAAM,IACX,IAAK,EAAM,YACX,UAAW,EAAiB,EAAM,IAAK,EAAM,YAAa,EAAM,SAAS,CAC3E,CAAC,CACH,CACA,EAAM,KAAK,EACX,IAAM,EAAS,CAAE,QAAO,gBAAmB,IAAA,EAAkB,EAC7D,EAAO,IAAI,EAAM,UAAW,CAAM,EAClC,EAAO,YAAc,EAAK,aAAa,UACrC,EACA,EAAM,UACL,GAAY,CACX,GAAI,CAAC,EAAe,CAAO,EAAG,OAC9B,IAAM,EAAU,EAAO,IAAI,EAAM,SAAS,EACtC,IAAY,IAAA,KAChB,EAAQ,OAAS,EACjB,EAAK,QAAQ,EAAM,UAAW,EAAQ,CAAO,CAAC,EAChD,EACA,CAAE,aAAc,EAAK,CACvB,CACF,EACM,EAAS,GAA4B,CACzC,IAAM,EAAS,EAAO,IAAI,CAAS,EAC9B,IACL,EAAO,YAAY,EACnB,EAAO,MAAM,QAAQ,EACrB,EAAO,OAAO,CAAS,EACzB,EACA,IAAK,IAAM,KAAS,EAAK,SAAS,EAAG,EAAK,CAAK,EAe/C,MAAO,CAZL,WAAW,EAAO,CAChB,EAAK,CAAK,EACV,IAAM,EAAS,EAAO,IAAI,EAAM,SAAS,EACnC,EAAW,GAAQ,QAAU,GAAQ,MAAM,SACjD,OAAO,IAAa,IAAA,GAAY,IAAA,GAAY,EAAQ,CAAQ,CAC9D,EACA,aAAc,EACd,eAAgB,EAChB,OAAQ,CACN,IAAK,IAAM,KAAa,EAAO,KAAK,EAAG,EAAM,CAAS,CACxD,CAEU,CACd,CACF,CACF"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("./types/delegation.cjs"),t=require("./services/delegation/index.cjs");exports.BACKGROUND_WORK_PROVIDER=t.BACKGROUND_WORK_PROVIDER,exports.DelegationManager=t.DelegationManager,exports.ERR_CANCEL_UNACKNOWLEDGED=t.ERR_CANCEL_UNACKNOWLEDGED,exports.ERR_CHILD_SESSION=t.ERR_CHILD_SESSION,exports.ERR_NO_RUNTIME=t.ERR_NO_RUNTIME,exports.MAX_BRIEF_FILES=e.MAX_BRIEF_FILES,exports.NOTIFY_CUSTOM_TYPE=t.NOTIFY_CUSTOM_TYPE;
|
|
@@ -1,3 +0,0 @@
|
|
|
1
|
-
import { MAX_BRIEF_FILES } from "./types/delegation.cjs";
|
|
2
|
-
import { AssignOptions, BACKGROUND_WORK_PROVIDER, DelegationManager, DelegationManagerOptions, DelegationNotifier, DelegationOutcome, DelegationPlatform, DelegationProgress, ERR_CANCEL_UNACKNOWLEDGED, ERR_CHILD_SESSION, ERR_NO_RUNTIME, NOTIFY_CUSTOM_TYPE } from "./services/delegation/index.cjs";
|
|
3
|
-
export { AssignOptions, BACKGROUND_WORK_PROVIDER, DelegationManager, DelegationManagerOptions, DelegationNotifier, DelegationOutcome, DelegationPlatform, DelegationProgress, ERR_CANCEL_UNACKNOWLEDGED, ERR_CHILD_SESSION, ERR_NO_RUNTIME, MAX_BRIEF_FILES, NOTIFY_CUSTOM_TYPE };
|
|
@@ -1,3 +0,0 @@
|
|
|
1
|
-
import { MAX_BRIEF_FILES } from "./types/delegation.mjs";
|
|
2
|
-
import { AssignOptions, BACKGROUND_WORK_PROVIDER, DelegationManager, DelegationManagerOptions, DelegationNotifier, DelegationOutcome, DelegationPlatform, DelegationProgress, ERR_CANCEL_UNACKNOWLEDGED, ERR_CHILD_SESSION, ERR_NO_RUNTIME, NOTIFY_CUSTOM_TYPE } from "./services/delegation/index.mjs";
|
|
3
|
-
export { AssignOptions, BACKGROUND_WORK_PROVIDER, DelegationManager, DelegationManagerOptions, DelegationNotifier, DelegationOutcome, DelegationPlatform, DelegationProgress, ERR_CANCEL_UNACKNOWLEDGED, ERR_CHILD_SESSION, ERR_NO_RUNTIME, MAX_BRIEF_FILES, NOTIFY_CUSTOM_TYPE };
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{MAX_BRIEF_FILES as e}from"./types/delegation.mjs";import{BACKGROUND_WORK_PROVIDER as t,DelegationManager as n,ERR_CANCEL_UNACKNOWLEDGED as r,ERR_CHILD_SESSION as i,ERR_NO_RUNTIME as a,NOTIFY_CUSTOM_TYPE as o}from"./services/delegation/index.mjs";export{t as BACKGROUND_WORK_PROVIDER,n as DelegationManager,r as ERR_CANCEL_UNACKNOWLEDGED,i as ERR_CHILD_SESSION,a as ERR_NO_RUNTIME,e as MAX_BRIEF_FILES,o as NOTIFY_CUSTOM_TYPE};
|
package/dist/extensions/pi.cjs
DELETED
|
@@ -1,3 +0,0 @@
|
|
|
1
|
-
Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:`Module`}});const e=require("../types/telemetry.cjs"),t=require("../services/delegation/index.cjs"),n=require("../services/logSinkTelemetry/index.cjs"),r=require("../constants/task.cjs");require("../schemas/task.cjs");const i=require("../controllers/tasksCommand.cjs"),a=require("../services/config/index.cjs"),o=require("../tui/format.cjs"),s=require("../tui/taskOverlay.cjs"),c=require("../services/paths/index.cjs"),l=require("../services/taskStore/index.cjs"),u=require("../tui/taskSpace.cjs"),d=require("../tools/task.cjs"),f=require("../services/contextContribution/index.cjs"),p=require("../services/delegationPlatform/index.cjs"),m=require("../services/taskNarration/index.cjs");let h=require("@agimon-ai/doompi-core/delegation"),g=require("@earendil-works/pi-tui"),_=require("@agimon-ai/doompi-core/background-work"),v=require("@agimon-ai/doompi-core/context-contributions"),y=require("@agimon-ai/doompi-core/narration"),b=require("@agimon-ai/doompi-core/pi-extension"),x=require("@agimon-ai/doompi-core/readiness"),S=require("@agimon-ai/doompi-core/ui-hub");const C=f.TASK_CONTEXT_CONTRIBUTION_SOURCE,w=`error.type`,T=`task.stage`,E={sessionId:`session_id`,storeCleanup:`store_cleanup`,storeSweep:`store_sweep`,storeRead:`store_read`,reconcile:`reconcile`,refresh:`refresh`};function D(e){return e instanceof Error?e.name||`Error`:typeof e==`string`?`StringError`:e&&typeof e==`object`?`ObjectError`:`UnknownError`}const O=(0,b.definePiExtension)(C,({context:O,pi:k,signal:A})=>{let j=n.createTaskErrorReporter(),M=n.toFailureReporter(j),N=!0,P=0,F,I,L,R,z,B,V,H,U,W=e=>{j.recordWarning(`doom_task.narration_failed`,e).catch(e=>{process.emitWarning(`Doom-task could not record a narration failure: ${String(e)}`)})},G={narrate(e){let t=F,n=(0,y.createNarrationRequest)(e);if(t&&n)try{Promise.resolve(t.request(n)).catch(W)}catch(e){W(e)}}},K=async(e,t)=>{t?.throwIfAborted();let n=U;if(!n)throw Error(`doom-task session initialization has not started`);if(n.sessionManager!==e.sessionManager)throw Error(`doom-task readiness belongs to a stale Pi session`);if(await n.operation,t?.throwIfAborted(),!N||A.aborted||n!==U||!H)throw Error(`doom-task readiness belongs to a stale extension generation`)},q=()=>{z?.(),z=void 0,L?.reset(),R?.dispose(),H=void 0},J=new l.TaskStore({report:M,onCommitted:(e,t)=>m.narrateTaskCommit(G,e,t)});I=J;let Y=()=>{N&&!A.aborted&&(R?.update(),B?.update())},X=new t.DelegationManager({store:J,cwd:process.cwd(),platform:p.createNodeDelegationPlatform(),notify:(e,t)=>k.sendMessage(e,t),getSessionId:()=>H,onChange:Y,runTimeoutMs:a.getDelegationTimeoutMs(),report:M,onNotifyError:(e,t)=>{j.recordNotificationError(e,t)}});L=X;let Z=new s.TaskOverlay({getTasks:()=>J.snapshot.tasks,delegation:X});R=Z;let ee={store:J,delegation:X,maxTasks:a.getMaxTasks(),onChange:Y,report:M,waitUntilReady:K},te=async(t,n)=>{if(!N||A.aborted)return;let r=++P;H!==void 0&&q();let i=n,o=async t=>{let n=()=>!t?.aborted&&N&&!A.aborted&&r===P,o=E.sessionId,s=async(t,n)=>{o=t;try{await n()}catch(n){M.warn(e.TASK_EVENT.sessionStartDegraded,n,{[T]:t,[w]:D(n)})}};try{let t=i.sessionManager?.getSessionId();if(!t)throw Error(`doom-task requires a session id`);H=t,J.configureSession(c.resolveSessionKey(t)),o=E.storeCleanup;let r=await c.removeLegacyStoreDirectoryAsync(J.storePath);if(!n())return;o=E.storeSweep;let l=c.hasStorePathOverride()?{removed:[],errors:[]}:await c.sweepStoreFilesAsync(J.storePath,a.getStoreTtlMs());if(!n())return;let u=[...r.errors,...l.errors];for(let t of u)M.warn(e.TASK_EVENT.storeSweepFailed,Error(t));if(u.length>0&&i.hasUI&&i.ui.notify(u.join(`
|
|
2
|
-
`),`warning`),i.hasUI&&Z.setUICtx(i.ui),await s(E.storeRead,async()=>{await J.readAsync(n)}),!n()||(z=J.onExternalChange(Y),await s(E.reconcile,async()=>{await X.reconcile(n)}),!n()))return;o=E.refresh,Y()}catch(t){if(!n())return;throw q(),M.error(e.TASK_EVENT.sessionStartFailed,t,{[T]:o,[w]:D(t)}),t}},s=(0,x.readDoomReadinessCoordinator)(O);if(!s){let e=o();return U={sessionManager:n.sessionManager,operation:e},e}let l=U?.operation,u=(async()=>{l&&await Promise.allSettled([l]),N&&!A.aborted&&r===P&&await s.start(C,`${n.sessionManager.getSessionId()}:${r}`,async e=>(await o(e),{value:void 0})).wait()})();U={sessionManager:n.sessionManager,operation:u},Promise.allSettled([u])},ne=e=>{N&&!A.aborted&&e.toolName===`task`&&Y()},re={description:`Collapse or expand the task overlay`,handler:async e=>{N&&!A.aborted&&e.hasUI&&(await K(e),N&&!A.aborted&&Z.isRegistered()&&Z.toggleCollapse())}},Q=async()=>{if(!N)return;N=!1,P+=1;let e=U?.operation;U=void 0;try{e&&await Promise.allSettled([e]),q(),L?.dispose(),V?.(),V=void 0,I?.dispose()}finally{await j.shutdown()}},$=a.resolveCollapseKey();return{services:[e=>{e.inject([y.DOOM_NARRATION_SERVICE],e=>{let t=(0,y.requireDoomNarrationService)(e);return F=t,()=>{F===t&&(F=void 0)}}),e.inject([v.DOOM_CONTEXT_CONTRIBUTIONS_SERVICE],e=>{let t=(0,v.requireDoomContextContributions)(e).register(f.createTaskContextContribution(()=>J.snapshot.tasks));return()=>t.dispose()}),e.inject([h.DOOM_DELEGATION_SERVICE],e=>{let t=(0,h.readDoomDelegationService)(e);if(t)return X.bind(e,t)}),e.inject([_.DOOM_BACKGROUND_WORK_SERVICE],e=>{let n=(0,_.readDoomBackgroundWorkService)(e);if(!n)return;let r=n.register({provider:t.BACKGROUND_WORK_PROVIDER,listActiveWork:()=>X.listActiveWork()});return B=r,()=>{r.dispose(),B===r&&(B=void 0)}}),e.inject([S.DOOM_UI_HUB_SERVICE],e=>{let t=(0,S.requireDoomUiHub)(e).registerLeader({source:C,bindings:[{id:`tasks.open`,path:[{key:`t`,label:`tasks`,detail:`session task list`,order:65},{key:`l`,label:`list`,detail:`tasks in this session`}],command:{name:r.COMMAND_NAME}}]}),n=()=>t.dispose();return V=n,()=>{n(),V===n&&(V=void 0)}})}],onStop:Q,onDispose:Q,tools:[(0,b.definePiTool)(d.createTaskTool(ee,{renderCall:(e,t)=>o.renderTaskCall(e,t,J.snapshot.tasks),renderResult:o.renderTaskResult}))],commands:[i.createTasksCommand(J,u.openTaskSpace,K)],messageRenderers:[[t.NOTIFY_CUSTOM_TYPE,(e,t,n)=>new g.Text(n.fg(`muted`,typeof e.content==`string`?e.content:``),0,0)]],shortcuts:$===`off`?[]:[[$,re]],events:{session_start:te,session_compact:Y,session_tree:Y,tool_execution_end:ne}}});exports.default=O,exports.taskExtension=O;
|
|
3
|
-
//# sourceMappingURL=pi.cjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"pi.cjs","names":["TASK_CONTEXT_CONTRIBUTION_SOURCE","definePiExtension","createTaskErrorReporter","toFailureReporter","createNarrationRequest","TaskStore","narrateTaskCommit","DelegationManager","createNodeDelegationPlatform","getDelegationTimeoutMs","TaskOverlay","getMaxTasks","TASK_EVENT","resolveSessionKey","removeLegacyStoreDirectoryAsync","hasStorePathOverride","sweepStoreFilesAsync","getStoreTtlMs","readDoomReadinessCoordinator","resolveCollapseKey","DOOM_NARRATION_SERVICE","requireDoomNarrationService","DOOM_CONTEXT_CONTRIBUTIONS_SERVICE","requireDoomContextContributions","createTaskContextContribution","DOOM_DELEGATION_SERVICE","readDoomDelegationService","DOOM_BACKGROUND_WORK_SERVICE","readDoomBackgroundWorkService","BACKGROUND_WORK_PROVIDER","DOOM_UI_HUB_SERVICE","requireDoomUiHub","COMMAND_NAME","definePiTool","createTaskTool","renderTaskCall","renderTaskResult","createTasksCommand","openTaskSpace","NOTIFY_CUSTOM_TYPE","Text"],"sources":["../../src/extensions/pi.ts"],"sourcesContent":["import {\n DOOM_BACKGROUND_WORK_SERVICE,\n type BackgroundWorkProviderHandle,\n readDoomBackgroundWorkService,\n} from '@agimon-ai/doompi-core/background-work';\nimport {\n DOOM_CONTEXT_CONTRIBUTIONS_SERVICE,\n requireDoomContextContributions,\n} from '@agimon-ai/doompi-core/context-contributions';\nimport { DOOM_DELEGATION_SERVICE, readDoomDelegationService } from '@agimon-ai/doompi-core/delegation';\nimport {\n createNarrationRequest,\n DOOM_NARRATION_SERVICE,\n type DoomNarrationService,\n requireDoomNarrationService,\n} from '@agimon-ai/doompi-core/narration';\nimport { definePiExtension, definePiTool } from '@agimon-ai/doompi-core/pi-extension';\nimport { readDoomReadinessCoordinator } from '@agimon-ai/doompi-core/readiness';\nimport { DOOM_UI_HUB_SERVICE, requireDoomUiHub } from '@agimon-ai/doompi-core/ui-hub';\nimport type { Context } from '@deepseek-ai/cordis';\nimport type { ExtensionAPI, ExtensionContext } from '@earendil-works/pi-coding-agent';\nimport type { KeyId } from '@earendil-works/pi-tui';\nimport { Text } from '@earendil-works/pi-tui';\n\nimport { createTasksCommand } from '../controllers/tasksCommand';\nimport { COMMAND_NAME, TOOL_NAME } from '../schemas/task';\nimport {\n COLLAPSE_KEY_OFF,\n getDelegationTimeoutMs,\n getMaxTasks,\n getStoreTtlMs,\n resolveCollapseKey,\n} from '../services/config';\nimport { createTaskContextContribution, TASK_CONTEXT_CONTRIBUTION_SOURCE } from '../services/contextContribution';\nimport { BACKGROUND_WORK_PROVIDER, DelegationManager, NOTIFY_CUSTOM_TYPE } from '../services/delegation';\nimport { createNodeDelegationPlatform } from '../services/delegationPlatform';\nimport { createTaskErrorReporter, TASK_EVENT, toFailureReporter } from '../services/logSinkTelemetry';\nimport {\n hasStorePathOverride,\n removeLegacyStoreDirectoryAsync,\n resolveSessionKey,\n sweepStoreFilesAsync,\n} from '../services/paths';\nimport { narrateTaskCommit, type TaskNarrationSink } from '../services/taskNarration';\nimport { TaskStore } from '../services/taskStore';\nimport { createTaskTool } from '../tools/task';\nimport { renderTaskCall, renderTaskResult } from '../tui/format';\nimport { TaskOverlay } from '../tui/taskOverlay';\nimport { openTaskSpace } from '../tui/taskSpace';\n\ninterface SessionContextLike {\n hasUI: boolean;\n ui: Parameters<TaskOverlay['setUICtx']>[0];\n sessionManager?: { getSessionId(): string };\n}\n\nconst LEADER_SOURCE = TASK_CONTEXT_CONTRIBUTION_SOURCE;\nconst NARRATION_FAILED_EVENT = 'doom_task.narration_failed';\n/** Between doom-plan's 60 and the core help group's 70, so `t` sits after `p`. */\nconst LEADER_GROUP_ORDER = 65;\nconst ERROR_TYPE_ATTRIBUTE = 'error.type';\n/**\n * Which part of session start ran. The telemetry sanitizer drops free text, so\n * the failing branch has to travel as a stable low-cardinality token.\n */\nconst SESSION_START_STAGE_ATTRIBUTE = 'task.stage';\nconst SESSION_START_STAGE = {\n sessionId: 'session_id',\n storeCleanup: 'store_cleanup',\n storeSweep: 'store_sweep',\n storeRead: 'store_read',\n reconcile: 'reconcile',\n refresh: 'refresh',\n} as const;\ntype SessionStartStage = (typeof SESSION_START_STAGE)[keyof typeof SESSION_START_STAGE];\n\n/**\n * Mirror of the telemetry sink's own `error.type` token. The sink overwrites it\n * for any defined error, so this only guarantees the attribute exists when the\n * thrown value is `undefined`.\n */\nfunction errorTypeToken(error: unknown): string {\n if (error instanceof Error) return error.name || 'Error';\n if (typeof error === 'string') return 'StringError';\n if (error && typeof error === 'object') return 'ObjectError';\n return 'UnknownError';\n}\n/** Install Task state and external resources into its host-owned Cordis plugin fiber. */\nexport const taskExtension = definePiExtension(LEADER_SOURCE, ({ context: cordis, pi, signal: pluginSignal }) => {\n const errorReporter = createTaskErrorReporter();\n const report = toFailureReporter(errorReporter);\n let active = true;\n let sessionGeneration = 0;\n let narrationService: DoomNarrationService | undefined;\n let store: TaskStore | undefined;\n let delegation: DelegationManager | undefined;\n let overlay: TaskOverlay | undefined;\n let unwatch: (() => void) | undefined;\n let backgroundWork: BackgroundWorkProviderHandle | undefined;\n let disposeLeader: (() => void) | undefined;\n let sessionId: string | undefined;\n let sessionInitialization:\n | {\n readonly sessionManager: object;\n readonly operation: Promise<void>;\n }\n | undefined;\n\n const reportNarrationFailure = (error: unknown): void => {\n void errorReporter.recordWarning(NARRATION_FAILED_EVENT, error).catch((telemetryError: unknown) => {\n process.emitWarning(`Doom-task could not record a narration failure: ${String(telemetryError)}`);\n });\n };\n const narrationSink: TaskNarrationSink = {\n narrate(text) {\n const service = narrationService;\n const request = createNarrationRequest(text);\n if (!service || !request) return;\n try {\n void Promise.resolve(service.request(request)).catch(reportNarrationFailure);\n } catch (error) {\n reportNarrationFailure(error);\n }\n },\n };\n\n const waitForSessionReadiness = async (\n context: { readonly sessionManager: object },\n signal?: AbortSignal,\n ): Promise<void> => {\n signal?.throwIfAborted();\n const current = sessionInitialization;\n if (!current) throw new Error('doom-task session initialization has not started');\n if (current.sessionManager !== context.sessionManager) {\n throw new Error('doom-task readiness belongs to a stale Pi session');\n }\n await current.operation;\n signal?.throwIfAborted();\n if (!active || pluginSignal.aborted || current !== sessionInitialization || !sessionId) {\n throw new Error('doom-task readiness belongs to a stale extension generation');\n }\n };\n\n const clearSessionResources = (): void => {\n unwatch?.();\n unwatch = undefined;\n delegation?.reset();\n overlay?.dispose();\n sessionId = undefined;\n };\n\n const taskStore = new TaskStore({\n report,\n onCommitted: (previous, committed) => narrateTaskCommit(narrationSink, previous, committed),\n });\n store = taskStore;\n\n const refresh = (): void => {\n if (!active || pluginSignal.aborted) return;\n overlay?.update();\n backgroundWork?.update();\n };\n\n const delegationManager = new DelegationManager({\n store: taskStore,\n cwd: process.cwd(),\n platform: createNodeDelegationPlatform(),\n notify: (message, options) => pi.sendMessage(message, options),\n getSessionId: () => sessionId,\n onChange: refresh,\n runTimeoutMs: getDelegationTimeoutMs(),\n report,\n onNotifyError: (error, taskId) => {\n void errorReporter.recordNotificationError(error, taskId);\n },\n });\n delegation = delegationManager;\n\n const taskOverlay = new TaskOverlay({ getTasks: () => taskStore.snapshot.tasks, delegation: delegationManager });\n overlay = taskOverlay;\n\n const toolDependencies: Parameters<typeof createTaskTool>[0] = {\n store: taskStore,\n delegation: delegationManager,\n maxTasks: getMaxTasks(),\n onChange: refresh,\n report,\n waitUntilReady: waitForSessionReadiness,\n };\n\n const sessionStart = async (_event: unknown, ctx: ExtensionContext) => {\n if (!active || pluginSignal.aborted) return;\n const ownGeneration = ++sessionGeneration;\n if (sessionId !== undefined) clearSessionResources();\n const context = ctx as unknown as SessionContextLike;\n const initialize = async (signal?: AbortSignal): Promise<void> => {\n const isCurrent = (): boolean =>\n !signal?.aborted && active && !pluginSignal.aborted && ownGeneration === sessionGeneration;\n let stage: SessionStartStage = SESSION_START_STAGE.sessionId;\n /**\n * Run a stage whose failure only degrades task visibility. The session\n * still starts, and the warning keeps the degraded state from being silent.\n */\n const degrade = async (next: SessionStartStage, operation: () => Promise<void>): Promise<void> => {\n stage = next;\n try {\n await operation();\n } catch (error) {\n report.warn(TASK_EVENT.sessionStartDegraded, error, {\n [SESSION_START_STAGE_ATTRIBUTE]: next,\n [ERROR_TYPE_ATTRIBUTE]: errorTypeToken(error),\n });\n }\n };\n try {\n const currentSessionId = context.sessionManager?.getSessionId();\n if (!currentSessionId) throw new Error('doom-task requires a session id');\n sessionId = currentSessionId;\n taskStore.configureSession(resolveSessionKey(currentSessionId));\n stage = SESSION_START_STAGE.storeCleanup;\n const cleanup = await removeLegacyStoreDirectoryAsync(taskStore.storePath);\n if (!isCurrent()) return;\n stage = SESSION_START_STAGE.storeSweep;\n const sweep = hasStorePathOverride()\n ? { removed: [], errors: [] }\n : await sweepStoreFilesAsync(taskStore.storePath, getStoreTtlMs());\n if (!isCurrent()) return;\n const storeErrors = [...cleanup.errors, ...sweep.errors];\n for (const failure of storeErrors) report.warn(TASK_EVENT.storeSweepFailed, new Error(failure));\n if (storeErrors.length > 0 && context.hasUI) context.ui.notify(storeErrors.join('\\n'), 'warning');\n if (context.hasUI) taskOverlay.setUICtx(context.ui);\n await degrade(SESSION_START_STAGE.storeRead, async () => {\n await taskStore.readAsync(isCurrent);\n });\n if (!isCurrent()) return;\n unwatch = taskStore.onExternalChange(refresh);\n await degrade(SESSION_START_STAGE.reconcile, async () => {\n await delegationManager.reconcile(isCurrent);\n });\n if (!isCurrent()) return;\n stage = SESSION_START_STAGE.refresh;\n refresh();\n } catch (error) {\n if (!isCurrent()) return;\n clearSessionResources();\n report.error(TASK_EVENT.sessionStartFailed, error, {\n [SESSION_START_STAGE_ATTRIBUTE]: stage,\n [ERROR_TYPE_ATTRIBUTE]: errorTypeToken(error),\n });\n throw error;\n }\n };\n\n const coordinator = readDoomReadinessCoordinator(cordis);\n if (!coordinator) {\n const operation = initialize();\n sessionInitialization = { sessionManager: ctx.sessionManager, operation };\n return operation;\n }\n\n const previous = sessionInitialization?.operation;\n const operation = (async (): Promise<void> => {\n if (previous) await Promise.allSettled([previous]);\n if (!active || pluginSignal.aborted || ownGeneration !== sessionGeneration) return;\n const handle = coordinator.start(\n LEADER_SOURCE,\n `${ctx.sessionManager.getSessionId()}:${ownGeneration}`,\n async (signal) => {\n await initialize(signal);\n return { value: undefined };\n },\n );\n await handle.wait();\n })();\n sessionInitialization = { sessionManager: ctx.sessionManager, operation };\n // Config's coordinator owns the single failure notification. This detached\n // observer only keeps a failed background generation from going unhandled.\n void Promise.allSettled([operation]);\n return undefined;\n };\n\n const toolExecutionEnd = (event: { toolName: string }) => {\n if (active && !pluginSignal.aborted && event.toolName === TOOL_NAME) refresh();\n };\n const shortcutOptions: Parameters<ExtensionAPI['registerShortcut']>[1] = {\n description: 'Collapse or expand the task overlay',\n handler: async (ctx: ExtensionContext) => {\n if (!active || pluginSignal.aborted || !ctx.hasUI) return;\n await waitForSessionReadiness(ctx);\n if (!active || pluginSignal.aborted || !taskOverlay.isRegistered()) return;\n taskOverlay.toggleCollapse();\n },\n };\n const dispose = async () => {\n if (!active) return;\n active = false;\n sessionGeneration += 1;\n const pendingInitialization = sessionInitialization?.operation;\n sessionInitialization = undefined;\n try {\n if (pendingInitialization) await Promise.allSettled([pendingInitialization]);\n clearSessionResources();\n delegation?.dispose();\n disposeLeader?.();\n disposeLeader = undefined;\n store?.dispose();\n } finally {\n await errorReporter.shutdown();\n }\n };\n const collapseKey = resolveCollapseKey();\n return {\n services: [\n (cordis: Context) => {\n cordis.inject([DOOM_NARRATION_SERVICE], (serviceContext) => {\n const service = requireDoomNarrationService(serviceContext);\n narrationService = service;\n return () => {\n if (narrationService === service) narrationService = undefined;\n };\n });\n cordis.inject([DOOM_CONTEXT_CONTRIBUTIONS_SERVICE], (contextContributionsContext) => {\n const registration = requireDoomContextContributions(contextContributionsContext).register(\n createTaskContextContribution(() => taskStore.snapshot.tasks),\n );\n return () => registration.dispose();\n });\n cordis.inject([DOOM_DELEGATION_SERVICE], (serviceContext) => {\n const service = readDoomDelegationService(serviceContext);\n if (!service) return undefined;\n return delegationManager.bind(serviceContext, service);\n });\n cordis.inject([DOOM_BACKGROUND_WORK_SERVICE], (serviceContext) => {\n const service = readDoomBackgroundWorkService(serviceContext);\n if (!service) return undefined;\n const handle = service.register({\n provider: BACKGROUND_WORK_PROVIDER,\n listActiveWork: () => delegationManager.listActiveWork(),\n });\n backgroundWork = handle;\n return () => {\n handle.dispose();\n if (backgroundWork === handle) backgroundWork = undefined;\n };\n });\n cordis.inject([DOOM_UI_HUB_SERVICE], (uiContext) => {\n const contribution = requireDoomUiHub(uiContext).registerLeader({\n source: LEADER_SOURCE,\n bindings: [\n {\n id: 'tasks.open',\n path: [\n { key: 't', label: 'tasks', detail: 'session task list', order: LEADER_GROUP_ORDER },\n { key: 'l', label: 'list', detail: 'tasks in this session' },\n ],\n command: { name: COMMAND_NAME },\n },\n ],\n });\n const dispose = (): void => contribution.dispose();\n disposeLeader = dispose;\n return () => {\n dispose();\n if (disposeLeader === dispose) disposeLeader = undefined;\n };\n });\n },\n ],\n onStop: dispose,\n onDispose: dispose,\n tools: [\n definePiTool(\n createTaskTool(toolDependencies, {\n renderCall: (args, theme) => renderTaskCall(args as never, theme, taskStore.snapshot.tasks),\n renderResult: renderTaskResult,\n }),\n ),\n ],\n commands: [createTasksCommand(taskStore, openTaskSpace, waitForSessionReadiness)],\n messageRenderers: [\n [\n NOTIFY_CUSTOM_TYPE,\n (message, _options, theme) =>\n new Text(theme.fg('muted', typeof message.content === 'string' ? message.content : ''), 0, 0),\n ],\n ],\n shortcuts: collapseKey === COLLAPSE_KEY_OFF ? [] : [[collapseKey as KeyId, shortcutOptions]],\n events: {\n session_start: sessionStart,\n session_compact: refresh,\n session_tree: refresh,\n tool_execution_end: toolExecutionEnd,\n },\n };\n});\nexport default taskExtension;\n"],"mappings":"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"}
|
package/dist/extensions/pi.d.cts
DELETED
|
@@ -1,6 +0,0 @@
|
|
|
1
|
-
//#region src/extensions/pi.d.ts
|
|
2
|
-
/** Install Task state and external resources into its host-owned Cordis plugin fiber. */
|
|
3
|
-
export declare const taskExtension: import("@agimon-ai/doompi-core/runtime-pi-extension").DefinedPiExtension<undefined>;
|
|
4
|
-
//#endregion
|
|
5
|
-
export { taskExtension as default };
|
|
6
|
-
//# sourceMappingURL=pi.d.cts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"pi.d.cts","names":[],"sources":["../../src/extensions/pi.ts"],"mappings":";;qBAwFa,qEAAa"}
|
package/dist/extensions/pi.d.mts
DELETED
|
@@ -1,6 +0,0 @@
|
|
|
1
|
-
//#region src/extensions/pi.d.ts
|
|
2
|
-
/** Install Task state and external resources into its host-owned Cordis plugin fiber. */
|
|
3
|
-
export declare const taskExtension: import("@agimon-ai/doompi-core/runtime-pi-extension").DefinedPiExtension<undefined>;
|
|
4
|
-
//#endregion
|
|
5
|
-
export { taskExtension as default };
|
|
6
|
-
//# sourceMappingURL=pi.d.mts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"pi.d.mts","names":[],"sources":["../../src/extensions/pi.ts"],"mappings":";;qBAwFa,qEAAa"}
|
package/dist/extensions/pi.mjs
DELETED
|
@@ -1,3 +0,0 @@
|
|
|
1
|
-
import{TASK_EVENT as e}from"../types/telemetry.mjs";import{BACKGROUND_WORK_PROVIDER as t,DelegationManager as n,NOTIFY_CUSTOM_TYPE as r}from"../services/delegation/index.mjs";import{createTaskErrorReporter as i,toFailureReporter as a}from"../services/logSinkTelemetry/index.mjs";import{COMMAND_NAME as o}from"../constants/task.mjs";import"../schemas/task.mjs";import{createTasksCommand as s}from"../controllers/tasksCommand.mjs";import{getDelegationTimeoutMs as c,getMaxTasks as l,getStoreTtlMs as u,resolveCollapseKey as d}from"../services/config/index.mjs";import{renderTaskCall as f,renderTaskResult as p}from"../tui/format.mjs";import{TaskOverlay as m}from"../tui/taskOverlay.mjs";import{hasStorePathOverride as h,removeLegacyStoreDirectoryAsync as ee,resolveSessionKey as te,sweepStoreFilesAsync as ne}from"../services/paths/index.mjs";import{TaskStore as re}from"../services/taskStore/index.mjs";import{openTaskSpace as ie}from"../tui/taskSpace.mjs";import{createTaskTool as ae}from"../tools/task.mjs";import{TASK_CONTEXT_CONTRIBUTION_SOURCE as g,createTaskContextContribution as oe}from"../services/contextContribution/index.mjs";import{createNodeDelegationPlatform as se}from"../services/delegationPlatform/index.mjs";import{narrateTaskCommit as _}from"../services/taskNarration/index.mjs";import{DOOM_DELEGATION_SERVICE as ce,readDoomDelegationService as le}from"@agimon-ai/doompi-core/delegation";import{Text as v}from"@earendil-works/pi-tui";import{DOOM_BACKGROUND_WORK_SERVICE as y,readDoomBackgroundWorkService as b}from"@agimon-ai/doompi-core/background-work";import{DOOM_CONTEXT_CONTRIBUTIONS_SERVICE as x,requireDoomContextContributions as S}from"@agimon-ai/doompi-core/context-contributions";import{DOOM_NARRATION_SERVICE as C,createNarrationRequest as w,requireDoomNarrationService as ue}from"@agimon-ai/doompi-core/narration";import{definePiExtension as T,definePiTool as de}from"@agimon-ai/doompi-core/pi-extension";import{readDoomReadinessCoordinator as fe}from"@agimon-ai/doompi-core/readiness";import{DOOM_UI_HUB_SERVICE as pe,requireDoomUiHub as me}from"@agimon-ai/doompi-core/ui-hub";const E=g,D=`error.type`,O=`task.stage`,k={sessionId:`session_id`,storeCleanup:`store_cleanup`,storeSweep:`store_sweep`,storeRead:`store_read`,reconcile:`reconcile`,refresh:`refresh`};function A(e){return e instanceof Error?e.name||`Error`:typeof e==`string`?`StringError`:e&&typeof e==`object`?`ObjectError`:`UnknownError`}const j=T(E,({context:g,pi:T,signal:j})=>{let M=i(),N=a(M),P=!0,F=0,I,L,R,z,B,V,H,U,W,G=e=>{M.recordWarning(`doom_task.narration_failed`,e).catch(e=>{process.emitWarning(`Doom-task could not record a narration failure: ${String(e)}`)})},he={narrate(e){let t=I,n=w(e);if(t&&n)try{Promise.resolve(t.request(n)).catch(G)}catch(e){G(e)}}},K=async(e,t)=>{t?.throwIfAborted();let n=W;if(!n)throw Error(`doom-task session initialization has not started`);if(n.sessionManager!==e.sessionManager)throw Error(`doom-task readiness belongs to a stale Pi session`);if(await n.operation,t?.throwIfAborted(),!P||j.aborted||n!==W||!U)throw Error(`doom-task readiness belongs to a stale extension generation`)},q=()=>{B?.(),B=void 0,R?.reset(),z?.dispose(),U=void 0},J=new re({report:N,onCommitted:(e,t)=>_(he,e,t)});L=J;let Y=()=>{P&&!j.aborted&&(z?.update(),V?.update())},X=new n({store:J,cwd:process.cwd(),platform:se(),notify:(e,t)=>T.sendMessage(e,t),getSessionId:()=>U,onChange:Y,runTimeoutMs:c(),report:N,onNotifyError:(e,t)=>{M.recordNotificationError(e,t)}});R=X;let Z=new m({getTasks:()=>J.snapshot.tasks,delegation:X});z=Z;let ge={store:J,delegation:X,maxTasks:l(),onChange:Y,report:N,waitUntilReady:K},_e=async(t,n)=>{if(!P||j.aborted)return;let r=++F;U!==void 0&&q();let i=n,a=async t=>{let n=()=>!t?.aborted&&P&&!j.aborted&&r===F,a=k.sessionId,o=async(t,n)=>{a=t;try{await n()}catch(n){N.warn(e.sessionStartDegraded,n,{[O]:t,[D]:A(n)})}};try{let t=i.sessionManager?.getSessionId();if(!t)throw Error(`doom-task requires a session id`);U=t,J.configureSession(te(t)),a=k.storeCleanup;let r=await ee(J.storePath);if(!n())return;a=k.storeSweep;let s=h()?{removed:[],errors:[]}:await ne(J.storePath,u());if(!n())return;let c=[...r.errors,...s.errors];for(let t of c)N.warn(e.storeSweepFailed,Error(t));if(c.length>0&&i.hasUI&&i.ui.notify(c.join(`
|
|
2
|
-
`),`warning`),i.hasUI&&Z.setUICtx(i.ui),await o(k.storeRead,async()=>{await J.readAsync(n)}),!n()||(B=J.onExternalChange(Y),await o(k.reconcile,async()=>{await X.reconcile(n)}),!n()))return;a=k.refresh,Y()}catch(t){if(!n())return;throw q(),N.error(e.sessionStartFailed,t,{[O]:a,[D]:A(t)}),t}},o=fe(g);if(!o){let e=a();return W={sessionManager:n.sessionManager,operation:e},e}let s=W?.operation,c=(async()=>{s&&await Promise.allSettled([s]),P&&!j.aborted&&r===F&&await o.start(E,`${n.sessionManager.getSessionId()}:${r}`,async e=>(await a(e),{value:void 0})).wait()})();W={sessionManager:n.sessionManager,operation:c},Promise.allSettled([c])},ve=e=>{P&&!j.aborted&&e.toolName===`task`&&Y()},ye={description:`Collapse or expand the task overlay`,handler:async e=>{P&&!j.aborted&&e.hasUI&&(await K(e),P&&!j.aborted&&Z.isRegistered()&&Z.toggleCollapse())}},Q=async()=>{if(!P)return;P=!1,F+=1;let e=W?.operation;W=void 0;try{e&&await Promise.allSettled([e]),q(),R?.dispose(),H?.(),H=void 0,L?.dispose()}finally{await M.shutdown()}},$=d();return{services:[e=>{e.inject([C],e=>{let t=ue(e);return I=t,()=>{I===t&&(I=void 0)}}),e.inject([x],e=>{let t=S(e).register(oe(()=>J.snapshot.tasks));return()=>t.dispose()}),e.inject([ce],e=>{let t=le(e);if(t)return X.bind(e,t)}),e.inject([y],e=>{let n=b(e);if(!n)return;let r=n.register({provider:t,listActiveWork:()=>X.listActiveWork()});return V=r,()=>{r.dispose(),V===r&&(V=void 0)}}),e.inject([pe],e=>{let t=me(e).registerLeader({source:E,bindings:[{id:`tasks.open`,path:[{key:`t`,label:`tasks`,detail:`session task list`,order:65},{key:`l`,label:`list`,detail:`tasks in this session`}],command:{name:o}}]}),n=()=>t.dispose();return H=n,()=>{n(),H===n&&(H=void 0)}})}],onStop:Q,onDispose:Q,tools:[de(ae(ge,{renderCall:(e,t)=>f(e,t,J.snapshot.tasks),renderResult:p}))],commands:[s(J,ie,K)],messageRenderers:[[r,(e,t,n)=>new v(n.fg(`muted`,typeof e.content==`string`?e.content:``),0,0)]],shortcuts:$===`off`?[]:[[$,ye]],events:{session_start:_e,session_compact:Y,session_tree:Y,tool_execution_end:ve}}});export{j as default,j as taskExtension};
|
|
3
|
-
//# sourceMappingURL=pi.mjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"pi.mjs","names":[],"sources":["../../src/extensions/pi.ts"],"sourcesContent":["import {\n DOOM_BACKGROUND_WORK_SERVICE,\n type BackgroundWorkProviderHandle,\n readDoomBackgroundWorkService,\n} from '@agimon-ai/doompi-core/background-work';\nimport {\n DOOM_CONTEXT_CONTRIBUTIONS_SERVICE,\n requireDoomContextContributions,\n} from '@agimon-ai/doompi-core/context-contributions';\nimport { DOOM_DELEGATION_SERVICE, readDoomDelegationService } from '@agimon-ai/doompi-core/delegation';\nimport {\n createNarrationRequest,\n DOOM_NARRATION_SERVICE,\n type DoomNarrationService,\n requireDoomNarrationService,\n} from '@agimon-ai/doompi-core/narration';\nimport { definePiExtension, definePiTool } from '@agimon-ai/doompi-core/pi-extension';\nimport { readDoomReadinessCoordinator } from '@agimon-ai/doompi-core/readiness';\nimport { DOOM_UI_HUB_SERVICE, requireDoomUiHub } from '@agimon-ai/doompi-core/ui-hub';\nimport type { Context } from '@deepseek-ai/cordis';\nimport type { ExtensionAPI, ExtensionContext } from '@earendil-works/pi-coding-agent';\nimport type { KeyId } from '@earendil-works/pi-tui';\nimport { Text } from '@earendil-works/pi-tui';\n\nimport { createTasksCommand } from '../controllers/tasksCommand';\nimport { COMMAND_NAME, TOOL_NAME } from '../schemas/task';\nimport {\n COLLAPSE_KEY_OFF,\n getDelegationTimeoutMs,\n getMaxTasks,\n getStoreTtlMs,\n resolveCollapseKey,\n} from '../services/config';\nimport { createTaskContextContribution, TASK_CONTEXT_CONTRIBUTION_SOURCE } from '../services/contextContribution';\nimport { BACKGROUND_WORK_PROVIDER, DelegationManager, NOTIFY_CUSTOM_TYPE } from '../services/delegation';\nimport { createNodeDelegationPlatform } from '../services/delegationPlatform';\nimport { createTaskErrorReporter, TASK_EVENT, toFailureReporter } from '../services/logSinkTelemetry';\nimport {\n hasStorePathOverride,\n removeLegacyStoreDirectoryAsync,\n resolveSessionKey,\n sweepStoreFilesAsync,\n} from '../services/paths';\nimport { narrateTaskCommit, type TaskNarrationSink } from '../services/taskNarration';\nimport { TaskStore } from '../services/taskStore';\nimport { createTaskTool } from '../tools/task';\nimport { renderTaskCall, renderTaskResult } from '../tui/format';\nimport { TaskOverlay } from '../tui/taskOverlay';\nimport { openTaskSpace } from '../tui/taskSpace';\n\ninterface SessionContextLike {\n hasUI: boolean;\n ui: Parameters<TaskOverlay['setUICtx']>[0];\n sessionManager?: { getSessionId(): string };\n}\n\nconst LEADER_SOURCE = TASK_CONTEXT_CONTRIBUTION_SOURCE;\nconst NARRATION_FAILED_EVENT = 'doom_task.narration_failed';\n/** Between doom-plan's 60 and the core help group's 70, so `t` sits after `p`. */\nconst LEADER_GROUP_ORDER = 65;\nconst ERROR_TYPE_ATTRIBUTE = 'error.type';\n/**\n * Which part of session start ran. The telemetry sanitizer drops free text, so\n * the failing branch has to travel as a stable low-cardinality token.\n */\nconst SESSION_START_STAGE_ATTRIBUTE = 'task.stage';\nconst SESSION_START_STAGE = {\n sessionId: 'session_id',\n storeCleanup: 'store_cleanup',\n storeSweep: 'store_sweep',\n storeRead: 'store_read',\n reconcile: 'reconcile',\n refresh: 'refresh',\n} as const;\ntype SessionStartStage = (typeof SESSION_START_STAGE)[keyof typeof SESSION_START_STAGE];\n\n/**\n * Mirror of the telemetry sink's own `error.type` token. The sink overwrites it\n * for any defined error, so this only guarantees the attribute exists when the\n * thrown value is `undefined`.\n */\nfunction errorTypeToken(error: unknown): string {\n if (error instanceof Error) return error.name || 'Error';\n if (typeof error === 'string') return 'StringError';\n if (error && typeof error === 'object') return 'ObjectError';\n return 'UnknownError';\n}\n/** Install Task state and external resources into its host-owned Cordis plugin fiber. */\nexport const taskExtension = definePiExtension(LEADER_SOURCE, ({ context: cordis, pi, signal: pluginSignal }) => {\n const errorReporter = createTaskErrorReporter();\n const report = toFailureReporter(errorReporter);\n let active = true;\n let sessionGeneration = 0;\n let narrationService: DoomNarrationService | undefined;\n let store: TaskStore | undefined;\n let delegation: DelegationManager | undefined;\n let overlay: TaskOverlay | undefined;\n let unwatch: (() => void) | undefined;\n let backgroundWork: BackgroundWorkProviderHandle | undefined;\n let disposeLeader: (() => void) | undefined;\n let sessionId: string | undefined;\n let sessionInitialization:\n | {\n readonly sessionManager: object;\n readonly operation: Promise<void>;\n }\n | undefined;\n\n const reportNarrationFailure = (error: unknown): void => {\n void errorReporter.recordWarning(NARRATION_FAILED_EVENT, error).catch((telemetryError: unknown) => {\n process.emitWarning(`Doom-task could not record a narration failure: ${String(telemetryError)}`);\n });\n };\n const narrationSink: TaskNarrationSink = {\n narrate(text) {\n const service = narrationService;\n const request = createNarrationRequest(text);\n if (!service || !request) return;\n try {\n void Promise.resolve(service.request(request)).catch(reportNarrationFailure);\n } catch (error) {\n reportNarrationFailure(error);\n }\n },\n };\n\n const waitForSessionReadiness = async (\n context: { readonly sessionManager: object },\n signal?: AbortSignal,\n ): Promise<void> => {\n signal?.throwIfAborted();\n const current = sessionInitialization;\n if (!current) throw new Error('doom-task session initialization has not started');\n if (current.sessionManager !== context.sessionManager) {\n throw new Error('doom-task readiness belongs to a stale Pi session');\n }\n await current.operation;\n signal?.throwIfAborted();\n if (!active || pluginSignal.aborted || current !== sessionInitialization || !sessionId) {\n throw new Error('doom-task readiness belongs to a stale extension generation');\n }\n };\n\n const clearSessionResources = (): void => {\n unwatch?.();\n unwatch = undefined;\n delegation?.reset();\n overlay?.dispose();\n sessionId = undefined;\n };\n\n const taskStore = new TaskStore({\n report,\n onCommitted: (previous, committed) => narrateTaskCommit(narrationSink, previous, committed),\n });\n store = taskStore;\n\n const refresh = (): void => {\n if (!active || pluginSignal.aborted) return;\n overlay?.update();\n backgroundWork?.update();\n };\n\n const delegationManager = new DelegationManager({\n store: taskStore,\n cwd: process.cwd(),\n platform: createNodeDelegationPlatform(),\n notify: (message, options) => pi.sendMessage(message, options),\n getSessionId: () => sessionId,\n onChange: refresh,\n runTimeoutMs: getDelegationTimeoutMs(),\n report,\n onNotifyError: (error, taskId) => {\n void errorReporter.recordNotificationError(error, taskId);\n },\n });\n delegation = delegationManager;\n\n const taskOverlay = new TaskOverlay({ getTasks: () => taskStore.snapshot.tasks, delegation: delegationManager });\n overlay = taskOverlay;\n\n const toolDependencies: Parameters<typeof createTaskTool>[0] = {\n store: taskStore,\n delegation: delegationManager,\n maxTasks: getMaxTasks(),\n onChange: refresh,\n report,\n waitUntilReady: waitForSessionReadiness,\n };\n\n const sessionStart = async (_event: unknown, ctx: ExtensionContext) => {\n if (!active || pluginSignal.aborted) return;\n const ownGeneration = ++sessionGeneration;\n if (sessionId !== undefined) clearSessionResources();\n const context = ctx as unknown as SessionContextLike;\n const initialize = async (signal?: AbortSignal): Promise<void> => {\n const isCurrent = (): boolean =>\n !signal?.aborted && active && !pluginSignal.aborted && ownGeneration === sessionGeneration;\n let stage: SessionStartStage = SESSION_START_STAGE.sessionId;\n /**\n * Run a stage whose failure only degrades task visibility. The session\n * still starts, and the warning keeps the degraded state from being silent.\n */\n const degrade = async (next: SessionStartStage, operation: () => Promise<void>): Promise<void> => {\n stage = next;\n try {\n await operation();\n } catch (error) {\n report.warn(TASK_EVENT.sessionStartDegraded, error, {\n [SESSION_START_STAGE_ATTRIBUTE]: next,\n [ERROR_TYPE_ATTRIBUTE]: errorTypeToken(error),\n });\n }\n };\n try {\n const currentSessionId = context.sessionManager?.getSessionId();\n if (!currentSessionId) throw new Error('doom-task requires a session id');\n sessionId = currentSessionId;\n taskStore.configureSession(resolveSessionKey(currentSessionId));\n stage = SESSION_START_STAGE.storeCleanup;\n const cleanup = await removeLegacyStoreDirectoryAsync(taskStore.storePath);\n if (!isCurrent()) return;\n stage = SESSION_START_STAGE.storeSweep;\n const sweep = hasStorePathOverride()\n ? { removed: [], errors: [] }\n : await sweepStoreFilesAsync(taskStore.storePath, getStoreTtlMs());\n if (!isCurrent()) return;\n const storeErrors = [...cleanup.errors, ...sweep.errors];\n for (const failure of storeErrors) report.warn(TASK_EVENT.storeSweepFailed, new Error(failure));\n if (storeErrors.length > 0 && context.hasUI) context.ui.notify(storeErrors.join('\\n'), 'warning');\n if (context.hasUI) taskOverlay.setUICtx(context.ui);\n await degrade(SESSION_START_STAGE.storeRead, async () => {\n await taskStore.readAsync(isCurrent);\n });\n if (!isCurrent()) return;\n unwatch = taskStore.onExternalChange(refresh);\n await degrade(SESSION_START_STAGE.reconcile, async () => {\n await delegationManager.reconcile(isCurrent);\n });\n if (!isCurrent()) return;\n stage = SESSION_START_STAGE.refresh;\n refresh();\n } catch (error) {\n if (!isCurrent()) return;\n clearSessionResources();\n report.error(TASK_EVENT.sessionStartFailed, error, {\n [SESSION_START_STAGE_ATTRIBUTE]: stage,\n [ERROR_TYPE_ATTRIBUTE]: errorTypeToken(error),\n });\n throw error;\n }\n };\n\n const coordinator = readDoomReadinessCoordinator(cordis);\n if (!coordinator) {\n const operation = initialize();\n sessionInitialization = { sessionManager: ctx.sessionManager, operation };\n return operation;\n }\n\n const previous = sessionInitialization?.operation;\n const operation = (async (): Promise<void> => {\n if (previous) await Promise.allSettled([previous]);\n if (!active || pluginSignal.aborted || ownGeneration !== sessionGeneration) return;\n const handle = coordinator.start(\n LEADER_SOURCE,\n `${ctx.sessionManager.getSessionId()}:${ownGeneration}`,\n async (signal) => {\n await initialize(signal);\n return { value: undefined };\n },\n );\n await handle.wait();\n })();\n sessionInitialization = { sessionManager: ctx.sessionManager, operation };\n // Config's coordinator owns the single failure notification. This detached\n // observer only keeps a failed background generation from going unhandled.\n void Promise.allSettled([operation]);\n return undefined;\n };\n\n const toolExecutionEnd = (event: { toolName: string }) => {\n if (active && !pluginSignal.aborted && event.toolName === TOOL_NAME) refresh();\n };\n const shortcutOptions: Parameters<ExtensionAPI['registerShortcut']>[1] = {\n description: 'Collapse or expand the task overlay',\n handler: async (ctx: ExtensionContext) => {\n if (!active || pluginSignal.aborted || !ctx.hasUI) return;\n await waitForSessionReadiness(ctx);\n if (!active || pluginSignal.aborted || !taskOverlay.isRegistered()) return;\n taskOverlay.toggleCollapse();\n },\n };\n const dispose = async () => {\n if (!active) return;\n active = false;\n sessionGeneration += 1;\n const pendingInitialization = sessionInitialization?.operation;\n sessionInitialization = undefined;\n try {\n if (pendingInitialization) await Promise.allSettled([pendingInitialization]);\n clearSessionResources();\n delegation?.dispose();\n disposeLeader?.();\n disposeLeader = undefined;\n store?.dispose();\n } finally {\n await errorReporter.shutdown();\n }\n };\n const collapseKey = resolveCollapseKey();\n return {\n services: [\n (cordis: Context) => {\n cordis.inject([DOOM_NARRATION_SERVICE], (serviceContext) => {\n const service = requireDoomNarrationService(serviceContext);\n narrationService = service;\n return () => {\n if (narrationService === service) narrationService = undefined;\n };\n });\n cordis.inject([DOOM_CONTEXT_CONTRIBUTIONS_SERVICE], (contextContributionsContext) => {\n const registration = requireDoomContextContributions(contextContributionsContext).register(\n createTaskContextContribution(() => taskStore.snapshot.tasks),\n );\n return () => registration.dispose();\n });\n cordis.inject([DOOM_DELEGATION_SERVICE], (serviceContext) => {\n const service = readDoomDelegationService(serviceContext);\n if (!service) return undefined;\n return delegationManager.bind(serviceContext, service);\n });\n cordis.inject([DOOM_BACKGROUND_WORK_SERVICE], (serviceContext) => {\n const service = readDoomBackgroundWorkService(serviceContext);\n if (!service) return undefined;\n const handle = service.register({\n provider: BACKGROUND_WORK_PROVIDER,\n listActiveWork: () => delegationManager.listActiveWork(),\n });\n backgroundWork = handle;\n return () => {\n handle.dispose();\n if (backgroundWork === handle) backgroundWork = undefined;\n };\n });\n cordis.inject([DOOM_UI_HUB_SERVICE], (uiContext) => {\n const contribution = requireDoomUiHub(uiContext).registerLeader({\n source: LEADER_SOURCE,\n bindings: [\n {\n id: 'tasks.open',\n path: [\n { key: 't', label: 'tasks', detail: 'session task list', order: LEADER_GROUP_ORDER },\n { key: 'l', label: 'list', detail: 'tasks in this session' },\n ],\n command: { name: COMMAND_NAME },\n },\n ],\n });\n const dispose = (): void => contribution.dispose();\n disposeLeader = dispose;\n return () => {\n dispose();\n if (disposeLeader === dispose) disposeLeader = undefined;\n };\n });\n },\n ],\n onStop: dispose,\n onDispose: dispose,\n tools: [\n definePiTool(\n createTaskTool(toolDependencies, {\n renderCall: (args, theme) => renderTaskCall(args as never, theme, taskStore.snapshot.tasks),\n renderResult: renderTaskResult,\n }),\n ),\n ],\n commands: [createTasksCommand(taskStore, openTaskSpace, waitForSessionReadiness)],\n messageRenderers: [\n [\n NOTIFY_CUSTOM_TYPE,\n (message, _options, theme) =>\n new Text(theme.fg('muted', typeof message.content === 'string' ? message.content : ''), 0, 0),\n ],\n ],\n shortcuts: collapseKey === COLLAPSE_KEY_OFF ? [] : [[collapseKey as KeyId, shortcutOptions]],\n events: {\n session_start: sessionStart,\n session_compact: refresh,\n session_tree: refresh,\n tool_execution_end: toolExecutionEnd,\n },\n };\n});\nexport default taskExtension;\n"],"mappings":"6jEAwDA,MAAM,EAAgB,EAIhB,EAAuB,aAKvB,EAAgC,aAChC,EAAsB,CAC1B,UAAW,aACX,aAAc,gBACd,WAAY,cACZ,UAAW,aACX,UAAW,YACX,QAAS,SACX,EAQA,SAAS,EAAe,EAAwB,CAI9C,OAHI,aAAiB,MAAc,EAAM,MAAQ,QAC7C,OAAO,GAAU,SAAiB,cAClC,GAAS,OAAO,GAAU,SAAiB,cACxC,cACT,CAEA,MAAa,EAAgB,EAAkB,GAAgB,CAAE,QAAS,EAAQ,KAAI,OAAQ,KAAmB,CAC/G,IAAM,EAAgB,EAAwB,EACxC,EAAS,EAAkB,CAAa,EAC1C,EAAS,GACT,EAAoB,EACpB,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EAOE,EAA0B,GAAyB,CACvD,EAAmB,cAAc,6BAAwB,CAAK,CAAC,CAAC,MAAO,GAA4B,CACjG,QAAQ,YAAY,mDAAmD,OAAO,CAAc,GAAG,CACjG,CAAC,CACH,EACM,GAAmC,CACvC,QAAQ,EAAM,CACZ,IAAM,EAAU,EACV,EAAU,EAAuB,CAAI,EACvC,GAAC,GAAY,EACjB,GAAI,CACF,QAAa,QAAQ,EAAQ,QAAQ,CAAO,CAAC,CAAC,CAAC,MAAM,CAAsB,CAC7E,OAAS,EAAO,CACd,EAAuB,CAAK,CAC9B,CACF,CACF,EAEM,EAA0B,MAC9B,EACA,IACkB,CAClB,GAAQ,eAAe,EACvB,IAAM,EAAU,EAChB,GAAI,CAAC,EAAS,MAAU,MAAM,kDAAkD,EAChF,GAAI,EAAQ,iBAAmB,EAAQ,eACrC,MAAU,MAAM,mDAAmD,EAIrE,GAFA,MAAM,EAAQ,UACd,GAAQ,eAAe,EACnB,CAAC,GAAU,EAAa,SAAW,IAAY,GAAyB,CAAC,EAC3E,MAAU,MAAM,6DAA6D,CAEjF,EAEM,MAAoC,CACxC,IAAU,EACV,EAAU,IAAA,GACV,GAAY,MAAM,EAClB,GAAS,QAAQ,EACjB,EAAY,IAAA,EACd,EAEM,EAAY,IAAI,GAAU,CAC9B,SACA,aAAc,EAAU,IAAc,EAAkB,GAAe,EAAU,CAAS,CAC5F,CAAC,EACD,EAAQ,EAER,IAAM,MAAsB,CACrB,GAAU,GAAa,UAC5B,GAAS,OAAO,EAChB,GAAgB,OAAO,EACzB,EAEM,EAAoB,IAAI,EAAkB,CAC9C,MAAO,EACP,IAAK,QAAQ,IAAI,EACjB,SAAU,GAA6B,EACvC,QAAS,EAAS,IAAY,EAAG,YAAY,EAAS,CAAO,EAC7D,iBAAoB,EACpB,SAAU,EACV,aAAc,EAAuB,EACrC,SACA,eAAgB,EAAO,IAAW,CAChC,EAAmB,wBAAwB,EAAO,CAAM,CAC1D,CACF,CAAC,EACD,EAAa,EAEb,IAAM,EAAc,IAAI,EAAY,CAAE,aAAgB,EAAU,SAAS,MAAO,WAAY,CAAkB,CAAC,EAC/G,EAAU,EAEV,IAAM,GAAyD,CAC7D,MAAO,EACP,WAAY,EACZ,SAAU,EAAY,EACtB,SAAU,EACV,SACA,eAAgB,CAClB,EAEM,GAAe,MAAO,EAAiB,IAA0B,CACrE,GAAI,CAAC,GAAU,EAAa,QAAS,OACrC,IAAM,EAAgB,EAAE,EACpB,IAAc,IAAA,IAAW,EAAsB,EACnD,IAAM,EAAU,EACV,EAAa,KAAO,IAAwC,CAChE,IAAM,MACJ,CAAC,GAAQ,SAAW,GAAU,CAAC,EAAa,SAAW,IAAkB,EACvE,EAA2B,EAAoB,UAK7C,EAAU,MAAO,EAAyB,IAAkD,CAChG,EAAQ,EACR,GAAI,CACF,MAAM,EAAU,CAClB,OAAS,EAAO,CACd,EAAO,KAAK,EAAW,qBAAsB,EAAO,EACjD,GAAgC,GAChC,GAAuB,EAAe,CAAK,CAC9C,CAAC,CACH,CACF,EACA,GAAI,CACF,IAAM,EAAmB,EAAQ,gBAAgB,aAAa,EAC9D,GAAI,CAAC,EAAkB,MAAU,MAAM,iCAAiC,EACxE,EAAY,EACZ,EAAU,iBAAiB,GAAkB,CAAgB,CAAC,EAC9D,EAAQ,EAAoB,aAC5B,IAAM,EAAU,MAAM,GAAgC,EAAU,SAAS,EACzE,GAAI,CAAC,EAAU,EAAG,OAClB,EAAQ,EAAoB,WAC5B,IAAM,EAAQ,EAAqB,EAC/B,CAAE,QAAS,CAAC,EAAG,OAAQ,CAAC,CAAE,EAC1B,MAAM,GAAqB,EAAU,UAAW,EAAc,CAAC,EACnE,GAAI,CAAC,EAAU,EAAG,OAClB,IAAM,EAAc,CAAC,GAAG,EAAQ,OAAQ,GAAG,EAAM,MAAM,EACvD,IAAK,IAAM,KAAW,EAAa,EAAO,KAAK,EAAW,iBAAsB,MAAM,CAAO,CAAC,EAW9F,GAVI,EAAY,OAAS,GAAK,EAAQ,OAAO,EAAQ,GAAG,OAAO,EAAY,KAAK;CAAI,EAAG,SAAS,EAC5F,EAAQ,OAAO,EAAY,SAAS,EAAQ,EAAE,EAClD,MAAM,EAAQ,EAAoB,UAAW,SAAY,CACvD,MAAM,EAAU,UAAU,CAAS,CACrC,CAAC,EACG,CAAC,EAAU,IACf,EAAU,EAAU,iBAAiB,CAAO,EAC5C,MAAM,EAAQ,EAAoB,UAAW,SAAY,CACvD,MAAM,EAAkB,UAAU,CAAS,CAC7C,CAAC,EACG,CAAC,EAAU,GAAG,OAClB,EAAQ,EAAoB,QAC5B,EAAQ,CACV,OAAS,EAAO,CACd,GAAI,CAAC,EAAU,EAAG,OAMlB,MALA,EAAsB,EACtB,EAAO,MAAM,EAAW,mBAAoB,EAAO,EAChD,GAAgC,GAChC,GAAuB,EAAe,CAAK,CAC9C,CAAC,EACK,CACR,CACF,EAEM,EAAc,GAA6B,CAAM,EACvD,GAAI,CAAC,EAAa,CAChB,IAAM,EAAY,EAAW,EAE7B,MADA,GAAwB,CAAE,eAAgB,EAAI,eAAgB,WAAU,EACjE,CACT,CAEA,IAAM,EAAW,GAAuB,UAClC,GAAa,SAA2B,CACxC,GAAU,MAAM,QAAQ,WAAW,CAAC,CAAQ,CAAC,EAC5C,GAAU,GAAa,SAAW,IAAkB,GASzD,MARe,EAAY,MACzB,EACA,GAAG,EAAI,eAAe,aAAa,EAAE,GAAG,IACxC,KAAO,KACL,MAAM,EAAW,CAAM,EAChB,CAAE,MAAO,IAAA,EAAU,EAGnB,CAAC,CAAC,KAAK,CACpB,EAAA,CAAG,EACH,EAAwB,CAAE,eAAgB,EAAI,eAAgB,WAAU,EAGxE,QAAa,WAAW,CAAC,CAAS,CAAC,CAErC,EAEM,GAAoB,GAAgC,CACpD,GAAU,CAAC,EAAa,SAAW,EAAM,WAAA,QAAwB,EAAQ,CAC/E,EACM,GAAmE,CACvE,YAAa,sCACb,QAAS,KAAO,IAA0B,CACnC,GAAU,GAAa,SAAY,EAAI,QAC5C,MAAM,EAAwB,CAAG,EAC5B,GAAU,GAAa,SAAY,EAAY,aAAa,GACjE,EAAY,eAAe,EAC7B,CACF,EACM,EAAU,SAAY,CAC1B,GAAI,CAAC,EAAQ,OACb,EAAS,GACT,GAAqB,EACrB,IAAM,EAAwB,GAAuB,UACrD,EAAwB,IAAA,GACxB,GAAI,CACE,GAAuB,MAAM,QAAQ,WAAW,CAAC,CAAqB,CAAC,EAC3E,EAAsB,EACtB,GAAY,QAAQ,EACpB,IAAgB,EAChB,EAAgB,IAAA,GAChB,GAAO,QAAQ,CACjB,QAAU,CACR,MAAM,EAAc,SAAS,CAC/B,CACF,EACM,EAAc,EAAmB,EACvC,MAAO,CACL,SAAU,CACP,GAAoB,CACnB,EAAO,OAAO,CAAC,CAAsB,EAAI,GAAmB,CAC1D,IAAM,EAAU,GAA4B,CAAc,EAE1D,MADA,GAAmB,MACN,CACP,IAAqB,IAAS,EAAmB,IAAA,GACvD,CACF,CAAC,EACD,EAAO,OAAO,CAAC,CAAkC,EAAI,GAAgC,CACnF,IAAM,EAAe,EAAgC,CAA2B,CAAC,CAAC,SAChF,OAAoC,EAAU,SAAS,KAAK,CAC9D,EACA,UAAa,EAAa,QAAQ,CACpC,CAAC,EACD,EAAO,OAAO,CAAC,EAAuB,EAAI,GAAmB,CAC3D,IAAM,EAAU,GAA0B,CAAc,EACnD,KACL,OAAO,EAAkB,KAAK,EAAgB,CAAO,CACvD,CAAC,EACD,EAAO,OAAO,CAAC,CAA4B,EAAI,GAAmB,CAChE,IAAM,EAAU,EAA8B,CAAc,EAC5D,GAAI,CAAC,EAAS,OACd,IAAM,EAAS,EAAQ,SAAS,CAC9B,SAAU,EACV,mBAAsB,EAAkB,eAAe,CACzD,CAAC,EAED,MADA,GAAiB,MACJ,CACX,EAAO,QAAQ,EACX,IAAmB,IAAQ,EAAiB,IAAA,GAClD,CACF,CAAC,EACD,EAAO,OAAO,CAAC,EAAmB,EAAI,GAAc,CAClD,IAAM,EAAe,GAAiB,CAAS,CAAC,CAAC,eAAe,CAC9D,OAAQ,EACR,SAAU,CACR,CACE,GAAI,aACJ,KAAM,CACJ,CAAE,IAAK,IAAK,MAAO,QAAS,OAAQ,oBAAqB,MAAO,EAAmB,EACnF,CAAE,IAAK,IAAK,MAAO,OAAQ,OAAQ,uBAAwB,CAC7D,EACA,QAAS,CAAE,KAAM,CAAa,CAChC,CACF,CACF,CAAC,EACK,MAAsB,EAAa,QAAQ,EAEjD,MADA,GAAgB,MACH,CACX,EAAQ,EACJ,IAAkB,IAAS,EAAgB,IAAA,GACjD,CACF,CAAC,CACH,CACF,EACA,OAAQ,EACR,UAAW,EACX,MAAO,CACL,GACE,GAAe,GAAkB,CAC/B,YAAa,EAAM,IAAU,EAAe,EAAe,EAAO,EAAU,SAAS,KAAK,EAC1F,aAAc,CAChB,CAAC,CACH,CACF,EACA,SAAU,CAAC,EAAmB,EAAW,GAAe,CAAuB,CAAC,EAChF,iBAAkB,CAChB,CACE,GACC,EAAS,EAAU,IAClB,IAAI,EAAK,EAAM,GAAG,QAAS,OAAO,EAAQ,SAAY,SAAW,EAAQ,QAAU,EAAE,EAAG,EAAG,CAAC,CAChG,CACF,EACA,UAAW,IAAA,MAAmC,CAAC,EAAI,CAAC,CAAC,EAAsB,EAAe,CAAC,EAC3F,OAAQ,CACN,cAAe,GACf,gBAAiB,EACjB,aAAc,EACd,mBAAoB,EACtB,CACF,CACF,CAAC"}
|