@agimon-ai/doompi-task 0.0.1-alpha.80 → 0.0.1-alpha.82
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/dist/{src/schemas/apiContracts.cjs → apiContracts.cjs} +6 -3
- package/dist/apiContracts.cjs.map +1 -0
- package/dist/{src/schemas/apiContracts.d.mts.map → apiContracts.d.mts.map} +1 -1
- package/dist/{src/schemas/apiContracts.mjs → apiContracts.mjs} +2 -2
- package/dist/apiContracts.mjs.map +1 -0
- package/dist/commands.cjs +1 -1
- package/dist/commands.d.mts +20 -2
- package/dist/commands.d.mts.map +1 -0
- package/dist/commands.mjs +1 -1
- package/dist/{src/services/config/index.cjs → config-BPNE_wEU.cjs} +103 -18
- package/dist/config-BPNE_wEU.cjs.map +1 -0
- package/dist/{src/services/config/index.mjs → config-DmsCPDuF.mjs} +2 -2
- package/dist/config-DmsCPDuF.mjs.map +1 -0
- package/dist/config.cjs +18 -18
- package/dist/config.d.mts +1 -1
- package/dist/config.mjs +1 -1
- package/dist/{src/types/delegation.mjs → delegation-BiOy3_7g.mjs} +2 -2
- package/dist/delegation-BiOy3_7g.mjs.map +1 -0
- package/dist/{src/services/delegation/index.cjs → delegation-BtzyLnYM.cjs} +43 -14
- package/dist/delegation-BtzyLnYM.cjs.map +1 -0
- package/dist/{src/services/delegation/index.mjs → delegation-CTFGZtwp.mjs} +7 -7
- package/dist/delegation-CTFGZtwp.mjs.map +1 -0
- package/dist/delegation-LDpHP2CC.cjs +12 -0
- package/dist/delegation-LDpHP2CC.cjs.map +1 -0
- package/dist/delegation-Ot2xltLi.d.mts +6 -0
- package/dist/delegation-Ot2xltLi.d.mts.map +1 -0
- package/dist/delegationManager.cjs +10 -0
- package/dist/delegationManager.d.mts +3 -0
- package/dist/delegationManager.mjs +3 -0
- package/dist/{src/services/contextContribution/index.cjs → delegationPlatform-Cfn-Lqew.cjs} +51 -7
- package/dist/delegationPlatform-Cfn-Lqew.cjs.map +1 -0
- package/dist/{src/services/contextContribution/index.mjs → delegationPlatform-DZ4SZ8a5.mjs} +20 -2
- package/dist/delegationPlatform-DZ4SZ8a5.mjs.map +1 -0
- package/dist/extensions/mcp.cjs +7 -7
- package/dist/extensions/mcp.cjs.map +1 -1
- package/dist/extensions/mcp.d.mts +1 -1
- package/dist/extensions/mcp.d.mts.map +1 -1
- package/dist/extensions/mcp.mjs +2 -2
- package/dist/extensions/mcp.mjs.map +1 -1
- package/dist/extensions/pi.cjs +408 -21
- package/dist/extensions/pi.cjs.map +1 -1
- package/dist/extensions/pi.d.mts +1 -1
- package/dist/extensions/pi.d.mts.map +1 -1
- package/dist/extensions/pi.mjs +399 -12
- package/dist/extensions/pi.mjs.map +1 -1
- package/dist/extensions/server.cjs +339 -16
- package/dist/extensions/server.cjs.map +1 -1
- package/dist/extensions/server.d.mts +1 -1
- package/dist/extensions/server.d.mts.map +1 -1
- package/dist/extensions/server.mjs +330 -7
- package/dist/extensions/server.mjs.map +1 -1
- package/dist/{src/extensions/workspaces/sessions/(frontend)/_shared/format.cli.cjs → format.cli-CKxfl-lR.cjs} +76 -16
- package/dist/format.cli-CKxfl-lR.cjs.map +1 -0
- package/dist/{src/extensions/workspaces/sessions/(frontend)/_shared/format.cli.mjs → format.cli-CuTlvk8J.mjs} +4 -4
- package/dist/format.cli-CuTlvk8J.mjs.map +1 -0
- package/dist/{src/services/taskStore/index.d.cts → index-B7oVjSey.d.mts} +7 -6
- package/dist/index-B7oVjSey.d.mts.map +1 -0
- package/dist/{src/services/reconcile/index.d.cts → index-BNMm9g0K.d.mts} +8 -7
- package/dist/index-BNMm9g0K.d.mts.map +1 -0
- package/dist/{src/services/delegation/index.d.cts → index-BUmf786V.d.mts} +17 -18
- package/dist/index-BUmf786V.d.mts.map +1 -0
- package/dist/index-C3DgOhEm.d.mts +51 -0
- package/dist/index-C3DgOhEm.d.mts.map +1 -0
- package/dist/index-D4goIk4Z.d.mts +43 -0
- package/dist/index-D4goIk4Z.d.mts.map +1 -0
- package/dist/{src/services/reducer/index.d.cts → index-DIpc6_uJ.d.mts} +12 -11
- package/dist/index-DIpc6_uJ.d.mts.map +1 -0
- package/dist/index-XY9VPmfm.d.mts +26 -0
- package/dist/index-XY9VPmfm.d.mts.map +1 -0
- package/dist/index.cjs +88 -88
- package/dist/index.d.mts +15 -15
- package/dist/index.mjs +15 -15
- package/dist/{src/services/invariants/index.cjs → invariants-DhjEjBPU.cjs} +19 -4
- package/dist/invariants-DhjEjBPU.cjs.map +1 -0
- package/dist/{src/services/invariants/index.mjs → invariants-q_UamF7D.mjs} +2 -2
- package/dist/invariants-q_UamF7D.mjs.map +1 -0
- package/dist/{src/services/logSinkTelemetry/index.mjs → logSinkTelemetry-C5QjZipw.mjs} +3 -3
- package/dist/logSinkTelemetry-C5QjZipw.mjs.map +1 -0
- package/dist/{src/services/logSinkTelemetry/index.cjs → logSinkTelemetry-CqiTuh3a.cjs} +14 -5
- package/dist/logSinkTelemetry-CqiTuh3a.cjs.map +1 -0
- package/dist/logSinkTelemetry.cjs +4 -4
- package/dist/logSinkTelemetry.d.mts +23 -3
- package/dist/logSinkTelemetry.d.mts.map +1 -0
- package/dist/logSinkTelemetry.mjs +2 -2
- package/dist/{src/services/paths/index.mjs → paths-Bg8EEbk1.mjs} +4 -4
- package/dist/paths-Bg8EEbk1.mjs.map +1 -0
- package/dist/{src/services/paths/index.cjs → paths-BsFVRulr.cjs} +109 -22
- package/dist/paths-BsFVRulr.cjs.map +1 -0
- package/dist/{src/services/processLiveness/index.mjs → processLiveness-Ccd9wenT.mjs} +2 -2
- package/dist/processLiveness-Ccd9wenT.mjs.map +1 -0
- package/dist/{src/services/processLiveness/index.cjs → processLiveness-umpNgsPR.cjs} +7 -2
- package/dist/processLiveness-umpNgsPR.cjs.map +1 -0
- package/dist/{src/constants/promptGuidelines.d.cts → promptGuidelines-DaxWrqud.d.mts} +3 -2
- package/dist/promptGuidelines-DaxWrqud.d.mts.map +1 -0
- package/dist/{src/constants/promptGuidelines.mjs → promptGuidelines-g4QT8GNM.mjs} +2 -2
- package/dist/promptGuidelines-g4QT8GNM.mjs.map +1 -0
- package/dist/{src/constants/promptGuidelines.cjs → promptGuidelines-j_SZTzlH.cjs} +7 -2
- package/dist/promptGuidelines-j_SZTzlH.cjs.map +1 -0
- package/dist/{src/services/reconcile/index.mjs → reconcile-BcD-hTbd.mjs} +4 -4
- package/dist/reconcile-BcD-hTbd.mjs.map +1 -0
- package/dist/{src/services/reconcile/index.cjs → reconcile-cRL0NjDr.cjs} +22 -7
- package/dist/reconcile-cRL0NjDr.cjs.map +1 -0
- package/dist/{src/services/reducer/index.mjs → reducer-BEfJFM5L.mjs} +5 -5
- package/dist/reducer-BEfJFM5L.mjs.map +1 -0
- package/dist/{src/services/reducer/index.cjs → reducer-BV0YIZ2o.cjs} +41 -11
- package/dist/reducer-BV0YIZ2o.cjs.map +1 -0
- package/dist/root.cli-BfEKqt8s.d.mts +56 -0
- package/dist/root.cli-BfEKqt8s.d.mts.map +1 -0
- package/dist/{src/extensions/workspaces/sessions/(frontend)/overlay/_lib/selectors.mjs → selectors-BaS6dObz.mjs} +3 -3
- package/dist/selectors-BaS6dObz.mjs.map +1 -0
- package/dist/{src/extensions/workspaces/sessions/(frontend)/overlay/_lib/selectors.d.mts → selectors-DPDPPjH3.d.mts} +15 -14
- package/dist/selectors-DPDPPjH3.d.mts.map +1 -0
- package/dist/{src/extensions/workspaces/sessions/(frontend)/overlay/_lib/selectors.cjs → selectors-b-69vb4W.cjs} +52 -12
- package/dist/selectors-b-69vb4W.cjs.map +1 -0
- package/dist/storeInvariants.cjs +5 -0
- package/dist/{src/services/invariants/index.d.cts → storeInvariants.d.mts} +2 -2
- package/dist/storeInvariants.d.mts.map +1 -0
- package/dist/storeInvariants.mjs +2 -0
- package/dist/storePaths.cjs +14 -0
- package/dist/storePaths.d.mts +2 -0
- package/dist/storePaths.mjs +2 -0
- package/dist/storeProcessLiveness.cjs +3 -0
- package/dist/{src/services/processLiveness/index.d.mts → storeProcessLiveness.d.mts} +1 -1
- package/dist/storeProcessLiveness.d.mts.map +1 -0
- package/dist/storeProcessLiveness.mjs +2 -0
- package/dist/storeReconcile.cjs +5 -0
- package/dist/storeReconcile.d.mts +2 -0
- package/dist/storeReconcile.mjs +2 -0
- package/dist/storeReducer.cjs +8 -0
- package/dist/storeReducer.d.mts +2 -0
- package/dist/storeReducer.mjs +2 -0
- package/dist/{store-task-graph.cjs → storeTaskGraph.cjs} +1 -1
- package/dist/storeTaskGraph.d.mts +2 -0
- package/dist/storeTaskGraph.mjs +2 -0
- package/dist/storeTaskStore.cjs +3 -0
- package/dist/storeTaskStore.d.mts +2 -0
- package/dist/storeTaskStore.mjs +2 -0
- package/dist/{store-types.cjs → storeTypes.cjs} +1 -1
- package/dist/storeTypes.d.mts +2 -0
- package/dist/storeTypes.mjs +2 -0
- package/dist/{src/constants/task.mjs → task-B4aF5J9s.mjs} +2 -2
- package/dist/task-B4aF5J9s.mjs.map +1 -0
- package/dist/{src/models/task.cjs → task-CXF9VULl.cjs} +25 -5
- package/dist/task-CXF9VULl.cjs.map +1 -0
- package/dist/task-CkFjC3Fo.d.mts +5 -0
- package/dist/task-CkFjC3Fo.d.mts.map +1 -0
- package/dist/{src/schemas/task.d.cts → task-DHSvdK6E.d.mts} +19 -20
- package/dist/task-DHSvdK6E.d.mts.map +1 -0
- package/dist/{src/schemas/task.mjs → task-DKHKuems.mjs} +3 -4
- package/dist/task-DKHKuems.mjs.map +1 -0
- package/dist/task-DaagqdPK.cjs +11 -0
- package/dist/task-DaagqdPK.cjs.map +1 -0
- package/dist/{src/schemas/task.cjs → task-Dqy88_rr.cjs} +80 -17
- package/dist/task-Dqy88_rr.cjs.map +1 -0
- package/dist/{src/models/task.mjs → task-giCbpKzV.mjs} +2 -2
- package/dist/task-giCbpKzV.mjs.map +1 -0
- package/dist/{src/models/task.d.mts → task-hLh4BOO7.d.mts} +21 -20
- package/dist/task-hLh4BOO7.d.mts.map +1 -0
- package/dist/{src/extensions/workspaces/sessions/(frontend)/overlay/_lib/task-space.cli.cjs → task-space.cli-BdDqn-_h.cjs} +33 -19
- package/dist/task-space.cli-BdDqn-_h.cjs.map +1 -0
- package/dist/{src/extensions/workspaces/sessions/(frontend)/overlay/_lib/task-space.cli.mjs → task-space.cli-DowNll0k.mjs} +9 -9
- package/dist/task-space.cli-DowNll0k.mjs.map +1 -0
- package/dist/{src/extensions/workspaces/sessions/(backend)/tool/_lib/task.cli.mjs → task.cli-BM34E7GG.mjs} +10 -10
- package/dist/task.cli-BM34E7GG.mjs.map +1 -0
- package/dist/{src/extensions/workspaces/sessions/(backend)/tool/_lib/task.cli.cjs → task.cli-CiTkjUaX.cjs} +37 -23
- package/dist/task.cli-CiTkjUaX.cjs.map +1 -0
- package/dist/{src/models/taskGraph.mjs → taskGraph-BOQvT0-M.mjs} +2 -2
- package/dist/taskGraph-BOQvT0-M.mjs.map +1 -0
- package/dist/{src/models/taskGraph.cjs → taskGraph-BskRslrr.cjs} +31 -6
- package/dist/taskGraph-BskRslrr.cjs.map +1 -0
- package/dist/{src/models/taskGraph.d.mts → taskGraph-YQXCfXTn.d.mts} +8 -7
- package/dist/taskGraph-YQXCfXTn.d.mts.map +1 -0
- package/dist/{src/extensions/workspaces/sessions/(frontend)/overlay/_lib/taskOverlay.cjs → taskOverlay-BKiu4cVj.cjs} +19 -9
- package/dist/taskOverlay-BKiu4cVj.cjs.map +1 -0
- package/dist/{src/extensions/workspaces/sessions/(frontend)/overlay/_lib/taskOverlay.mjs → taskOverlay-DVvLdTtf.mjs} +5 -5
- package/dist/taskOverlay-DVvLdTtf.mjs.map +1 -0
- package/dist/{src/services/taskResult/index.cjs → taskResult-D2G7b4w-.cjs} +62 -12
- package/dist/taskResult-D2G7b4w-.cjs.map +1 -0
- package/dist/{src/services/taskResult/index.mjs → taskResult-edBAAKSH.mjs} +3 -3
- package/dist/taskResult-edBAAKSH.mjs.map +1 -0
- package/dist/{src/services/taskStore/index.mjs → taskStore-CFx12KJk.mjs} +8 -8
- package/dist/taskStore-CFx12KJk.mjs.map +1 -0
- package/dist/{src/services/taskStore/index.cjs → taskStore-T1pPy-UJ.cjs} +21 -17
- package/dist/{src/services/taskStore/index.mjs.map → taskStore-T1pPy-UJ.cjs.map} +1 -1
- package/dist/{src/extensions/workspaces/sessions/(backend)/command/_lib/tasks.cli.cjs → tasks.cli-8VvuN9YQ.cjs} +15 -5
- package/dist/tasks.cli-8VvuN9YQ.cjs.map +1 -0
- package/dist/{src/extensions/workspaces/sessions/(backend)/command/_lib/tasks.cli.mjs → tasks.cli-BZj83YD_.mjs} +4 -4
- package/dist/tasks.cli-BZj83YD_.mjs.map +1 -0
- package/dist/{src/types/telemetry.d.mts → telemetry-DOyZLj8E.d.mts} +8 -7
- package/dist/telemetry-DOyZLj8E.d.mts.map +1 -0
- package/dist/{src/types/telemetry.cjs → telemetry-I4md7Xzz.cjs} +7 -2
- package/dist/telemetry-I4md7Xzz.cjs.map +1 -0
- package/dist/{src/types/telemetry.mjs → telemetry-PmX_1Y8a.mjs} +2 -2
- package/dist/telemetry-PmX_1Y8a.mjs.map +1 -0
- package/dist/{tool-prompt-guidelines.cjs → toolPromptGuidelines.cjs} +1 -1
- package/dist/toolPromptGuidelines.d.mts +2 -0
- package/dist/toolPromptGuidelines.mjs +2 -0
- package/dist/toolResponseEnvelope.cjs +12 -0
- package/dist/toolResponseEnvelope.d.mts +2 -0
- package/dist/toolResponseEnvelope.mjs +2 -0
- package/dist/{tool-schema.cjs → toolSchema.cjs} +2 -2
- package/dist/toolSchema.d.mts +3 -0
- package/dist/toolSchema.mjs +3 -0
- package/dist/{tool-task-tool.cjs → toolTaskTool.cjs} +2 -2
- package/dist/toolTaskTool.d.mts +3 -0
- package/dist/toolTaskTool.mjs +3 -0
- package/dist/{tui-format.cjs → tuiFormat.cjs} +1 -1
- package/dist/{src/extensions/workspaces/sessions/(frontend)/_shared/format.cli.d.cts → tuiFormat.d.mts} +4 -4
- package/dist/tuiFormat.d.mts.map +1 -0
- package/dist/tuiFormat.mjs +2 -0
- package/dist/{tui-selectors.cjs → tuiSelectors.cjs} +1 -1
- package/dist/tuiSelectors.d.mts +2 -0
- package/dist/tuiSelectors.mjs +2 -0
- package/dist/{tui-task-overlay.cjs → tuiTaskOverlay.cjs} +1 -1
- package/dist/{src/extensions/workspaces/sessions/(frontend)/overlay/_lib/taskOverlay.d.cts → tuiTaskOverlay.d.mts} +3 -3
- package/dist/tuiTaskOverlay.d.mts.map +1 -0
- package/dist/tuiTaskOverlay.mjs +2 -0
- package/dist/{tui-task-space.cjs → tuiTaskSpace.cjs} +2 -2
- package/dist/{src/extensions/workspaces/sessions/(frontend)/overlay/_lib/task-space.cli.d.mts → tuiTaskSpace.d.mts} +3 -4
- package/dist/tuiTaskSpace.d.mts.map +1 -0
- package/dist/tuiTaskSpace.mjs +2 -0
- package/package.json +95 -94
- package/dist/_virtual/_rolldown/runtime.cjs +0 -23
- package/dist/api-contracts.cjs +0 -7
- package/dist/api-contracts.d.cts +0 -2
- package/dist/api-contracts.d.mts +0 -2
- package/dist/api-contracts.mjs +0 -2
- package/dist/commands.d.cts +0 -2
- package/dist/config.d.cts +0 -2
- package/dist/delegation-manager.cjs +0 -10
- package/dist/delegation-manager.d.cts +0 -3
- package/dist/delegation-manager.d.mts +0 -3
- package/dist/delegation-manager.mjs +0 -3
- package/dist/extensions/mcp.d.cts +0 -5
- package/dist/extensions/mcp.d.cts.map +0 -1
- package/dist/extensions/pi.d.cts +0 -5
- package/dist/extensions/pi.d.cts.map +0 -1
- package/dist/extensions/server.d.cts +0 -5
- package/dist/extensions/server.d.cts.map +0 -1
- package/dist/index.d.cts +0 -16
- package/dist/logSinkTelemetry.d.cts +0 -3
- package/dist/src/constants/promptGuidelines.cjs.map +0 -1
- package/dist/src/constants/promptGuidelines.d.cts.map +0 -1
- package/dist/src/constants/promptGuidelines.d.mts +0 -13
- package/dist/src/constants/promptGuidelines.d.mts.map +0 -1
- package/dist/src/constants/promptGuidelines.mjs.map +0 -1
- package/dist/src/constants/task.cjs +0 -6
- package/dist/src/constants/task.cjs.map +0 -1
- package/dist/src/constants/task.d.cts +0 -4
- package/dist/src/constants/task.d.cts.map +0 -1
- package/dist/src/constants/task.d.mts +0 -4
- package/dist/src/constants/task.d.mts.map +0 -1
- package/dist/src/constants/task.mjs.map +0 -1
- package/dist/src/extensions/(backend)/channel/_lib/task-graph.cjs +0 -90
- package/dist/src/extensions/(backend)/channel/_lib/task-graph.cjs.map +0 -1
- package/dist/src/extensions/(backend)/channel/_lib/task-graph.mjs +0 -89
- package/dist/src/extensions/(backend)/channel/_lib/task-graph.mjs.map +0 -1
- package/dist/src/extensions/(backend)/channel/task-graph.server.cjs +0 -7
- package/dist/src/extensions/(backend)/channel/task-graph.server.cjs.map +0 -1
- package/dist/src/extensions/(backend)/channel/task-graph.server.mjs +0 -8
- package/dist/src/extensions/(backend)/channel/task-graph.server.mjs.map +0 -1
- package/dist/src/extensions/workspaces/sessions/(backend)/_lib/root.cli.cjs +0 -317
- package/dist/src/extensions/workspaces/sessions/(backend)/_lib/root.cli.cjs.map +0 -1
- package/dist/src/extensions/workspaces/sessions/(backend)/_lib/root.cli.d.cts +0 -39
- package/dist/src/extensions/workspaces/sessions/(backend)/_lib/root.cli.d.cts.map +0 -1
- package/dist/src/extensions/workspaces/sessions/(backend)/_lib/root.cli.d.mts +0 -39
- package/dist/src/extensions/workspaces/sessions/(backend)/_lib/root.cli.d.mts.map +0 -1
- package/dist/src/extensions/workspaces/sessions/(backend)/_lib/root.cli.mjs +0 -317
- package/dist/src/extensions/workspaces/sessions/(backend)/_lib/root.cli.mjs.map +0 -1
- package/dist/src/extensions/workspaces/sessions/(backend)/_lib/root.server.cjs +0 -95
- package/dist/src/extensions/workspaces/sessions/(backend)/_lib/root.server.cjs.map +0 -1
- package/dist/src/extensions/workspaces/sessions/(backend)/_lib/root.server.mjs +0 -95
- package/dist/src/extensions/workspaces/sessions/(backend)/_lib/root.server.mjs.map +0 -1
- package/dist/src/extensions/workspaces/sessions/(backend)/command/_lib/tasks.cli.cjs.map +0 -1
- package/dist/src/extensions/workspaces/sessions/(backend)/command/_lib/tasks.cli.d.cts +0 -20
- package/dist/src/extensions/workspaces/sessions/(backend)/command/_lib/tasks.cli.d.cts.map +0 -1
- package/dist/src/extensions/workspaces/sessions/(backend)/command/_lib/tasks.cli.d.mts +0 -20
- package/dist/src/extensions/workspaces/sessions/(backend)/command/_lib/tasks.cli.d.mts.map +0 -1
- package/dist/src/extensions/workspaces/sessions/(backend)/command/_lib/tasks.cli.mjs.map +0 -1
- package/dist/src/extensions/workspaces/sessions/(backend)/command/_lib/tasks.server.cjs +0 -19
- package/dist/src/extensions/workspaces/sessions/(backend)/command/_lib/tasks.server.cjs.map +0 -1
- package/dist/src/extensions/workspaces/sessions/(backend)/command/_lib/tasks.server.mjs +0 -19
- package/dist/src/extensions/workspaces/sessions/(backend)/command/_lib/tasks.server.mjs.map +0 -1
- package/dist/src/extensions/workspaces/sessions/(backend)/command/tasks.cli.cjs +0 -8
- package/dist/src/extensions/workspaces/sessions/(backend)/command/tasks.cli.cjs.map +0 -1
- package/dist/src/extensions/workspaces/sessions/(backend)/command/tasks.cli.mjs +0 -9
- package/dist/src/extensions/workspaces/sessions/(backend)/command/tasks.cli.mjs.map +0 -1
- package/dist/src/extensions/workspaces/sessions/(backend)/command/tasks.server.cjs +0 -7
- package/dist/src/extensions/workspaces/sessions/(backend)/command/tasks.server.cjs.map +0 -1
- package/dist/src/extensions/workspaces/sessions/(backend)/command/tasks.server.mjs +0 -8
- package/dist/src/extensions/workspaces/sessions/(backend)/command/tasks.server.mjs.map +0 -1
- package/dist/src/extensions/workspaces/sessions/(backend)/hook/_lib/session-compact.cli.cjs +0 -6
- package/dist/src/extensions/workspaces/sessions/(backend)/hook/_lib/session-compact.cli.cjs.map +0 -1
- package/dist/src/extensions/workspaces/sessions/(backend)/hook/_lib/session-compact.cli.mjs +0 -6
- package/dist/src/extensions/workspaces/sessions/(backend)/hook/_lib/session-compact.cli.mjs.map +0 -1
- package/dist/src/extensions/workspaces/sessions/(backend)/hook/_lib/session-start.cli.cjs +0 -6
- package/dist/src/extensions/workspaces/sessions/(backend)/hook/_lib/session-start.cli.cjs.map +0 -1
- package/dist/src/extensions/workspaces/sessions/(backend)/hook/_lib/session-start.cli.mjs +0 -6
- package/dist/src/extensions/workspaces/sessions/(backend)/hook/_lib/session-start.cli.mjs.map +0 -1
- package/dist/src/extensions/workspaces/sessions/(backend)/hook/_lib/session-tree.cli.cjs +0 -6
- package/dist/src/extensions/workspaces/sessions/(backend)/hook/_lib/session-tree.cli.cjs.map +0 -1
- package/dist/src/extensions/workspaces/sessions/(backend)/hook/_lib/session-tree.cli.mjs +0 -6
- package/dist/src/extensions/workspaces/sessions/(backend)/hook/_lib/session-tree.cli.mjs.map +0 -1
- package/dist/src/extensions/workspaces/sessions/(backend)/hook/_lib/tool-execution-end.cli.cjs +0 -6
- package/dist/src/extensions/workspaces/sessions/(backend)/hook/_lib/tool-execution-end.cli.cjs.map +0 -1
- package/dist/src/extensions/workspaces/sessions/(backend)/hook/_lib/tool-execution-end.cli.mjs +0 -6
- package/dist/src/extensions/workspaces/sessions/(backend)/hook/_lib/tool-execution-end.cli.mjs.map +0 -1
- package/dist/src/extensions/workspaces/sessions/(backend)/hook/session-compact.cli.cjs +0 -7
- package/dist/src/extensions/workspaces/sessions/(backend)/hook/session-compact.cli.cjs.map +0 -1
- package/dist/src/extensions/workspaces/sessions/(backend)/hook/session-compact.cli.mjs +0 -8
- package/dist/src/extensions/workspaces/sessions/(backend)/hook/session-compact.cli.mjs.map +0 -1
- package/dist/src/extensions/workspaces/sessions/(backend)/hook/session-start.cli.cjs +0 -7
- package/dist/src/extensions/workspaces/sessions/(backend)/hook/session-start.cli.cjs.map +0 -1
- package/dist/src/extensions/workspaces/sessions/(backend)/hook/session-start.cli.mjs +0 -8
- package/dist/src/extensions/workspaces/sessions/(backend)/hook/session-start.cli.mjs.map +0 -1
- package/dist/src/extensions/workspaces/sessions/(backend)/hook/session-tree.cli.cjs +0 -7
- package/dist/src/extensions/workspaces/sessions/(backend)/hook/session-tree.cli.cjs.map +0 -1
- package/dist/src/extensions/workspaces/sessions/(backend)/hook/session-tree.cli.mjs +0 -8
- package/dist/src/extensions/workspaces/sessions/(backend)/hook/session-tree.cli.mjs.map +0 -1
- package/dist/src/extensions/workspaces/sessions/(backend)/hook/tool-execution-end.cli.cjs +0 -7
- package/dist/src/extensions/workspaces/sessions/(backend)/hook/tool-execution-end.cli.cjs.map +0 -1
- package/dist/src/extensions/workspaces/sessions/(backend)/hook/tool-execution-end.cli.mjs +0 -8
- package/dist/src/extensions/workspaces/sessions/(backend)/hook/tool-execution-end.cli.mjs.map +0 -1
- package/dist/src/extensions/workspaces/sessions/(backend)/resource/_lib/task-board.server.cjs +0 -20
- package/dist/src/extensions/workspaces/sessions/(backend)/resource/_lib/task-board.server.cjs.map +0 -1
- package/dist/src/extensions/workspaces/sessions/(backend)/resource/_lib/task-board.server.mjs +0 -20
- package/dist/src/extensions/workspaces/sessions/(backend)/resource/_lib/task-board.server.mjs.map +0 -1
- package/dist/src/extensions/workspaces/sessions/(backend)/resource/task-board.server.cjs +0 -7
- package/dist/src/extensions/workspaces/sessions/(backend)/resource/task-board.server.cjs.map +0 -1
- package/dist/src/extensions/workspaces/sessions/(backend)/resource/task-board.server.mjs +0 -8
- package/dist/src/extensions/workspaces/sessions/(backend)/resource/task-board.server.mjs.map +0 -1
- package/dist/src/extensions/workspaces/sessions/(backend)/root.cli.cjs +0 -11
- package/dist/src/extensions/workspaces/sessions/(backend)/root.cli.cjs.map +0 -1
- package/dist/src/extensions/workspaces/sessions/(backend)/root.cli.mjs +0 -12
- package/dist/src/extensions/workspaces/sessions/(backend)/root.cli.mjs.map +0 -1
- package/dist/src/extensions/workspaces/sessions/(backend)/root.server.cjs +0 -7
- package/dist/src/extensions/workspaces/sessions/(backend)/root.server.cjs.map +0 -1
- package/dist/src/extensions/workspaces/sessions/(backend)/root.server.mjs +0 -8
- package/dist/src/extensions/workspaces/sessions/(backend)/root.server.mjs.map +0 -1
- package/dist/src/extensions/workspaces/sessions/(backend)/tool/_lib/task.cli.cjs.map +0 -1
- package/dist/src/extensions/workspaces/sessions/(backend)/tool/_lib/task.cli.d.cts +0 -25
- package/dist/src/extensions/workspaces/sessions/(backend)/tool/_lib/task.cli.d.cts.map +0 -1
- package/dist/src/extensions/workspaces/sessions/(backend)/tool/_lib/task.cli.d.mts +0 -25
- package/dist/src/extensions/workspaces/sessions/(backend)/tool/_lib/task.cli.d.mts.map +0 -1
- package/dist/src/extensions/workspaces/sessions/(backend)/tool/_lib/task.cli.mjs.map +0 -1
- package/dist/src/extensions/workspaces/sessions/(backend)/tool/_lib/task.server.cjs +0 -7
- package/dist/src/extensions/workspaces/sessions/(backend)/tool/_lib/task.server.cjs.map +0 -1
- package/dist/src/extensions/workspaces/sessions/(backend)/tool/_lib/task.server.mjs +0 -8
- package/dist/src/extensions/workspaces/sessions/(backend)/tool/_lib/task.server.mjs.map +0 -1
- package/dist/src/extensions/workspaces/sessions/(backend)/tool/task.cli.cjs +0 -7
- package/dist/src/extensions/workspaces/sessions/(backend)/tool/task.cli.cjs.map +0 -1
- package/dist/src/extensions/workspaces/sessions/(backend)/tool/task.cli.mjs +0 -8
- package/dist/src/extensions/workspaces/sessions/(backend)/tool/task.cli.mjs.map +0 -1
- package/dist/src/extensions/workspaces/sessions/(backend)/tool/task.server.cjs +0 -7
- package/dist/src/extensions/workspaces/sessions/(backend)/tool/task.server.cjs.map +0 -1
- package/dist/src/extensions/workspaces/sessions/(backend)/tool/task.server.mjs +0 -8
- package/dist/src/extensions/workspaces/sessions/(backend)/tool/task.server.mjs.map +0 -1
- package/dist/src/extensions/workspaces/sessions/(frontend)/_shared/format.cli.cjs.map +0 -1
- package/dist/src/extensions/workspaces/sessions/(frontend)/_shared/format.cli.d.cts.map +0 -1
- package/dist/src/extensions/workspaces/sessions/(frontend)/_shared/format.cli.d.mts +0 -61
- package/dist/src/extensions/workspaces/sessions/(frontend)/_shared/format.cli.d.mts.map +0 -1
- package/dist/src/extensions/workspaces/sessions/(frontend)/_shared/format.cli.mjs.map +0 -1
- package/dist/src/extensions/workspaces/sessions/(frontend)/message/doom-task-notify.cli.cjs +0 -9
- package/dist/src/extensions/workspaces/sessions/(frontend)/message/doom-task-notify.cli.cjs.map +0 -1
- package/dist/src/extensions/workspaces/sessions/(frontend)/message/doom-task-notify.cli.mjs +0 -9
- package/dist/src/extensions/workspaces/sessions/(frontend)/message/doom-task-notify.cli.mjs.map +0 -1
- package/dist/src/extensions/workspaces/sessions/(frontend)/overlay/_lib/selectors.cjs.map +0 -1
- package/dist/src/extensions/workspaces/sessions/(frontend)/overlay/_lib/selectors.d.cts +0 -59
- package/dist/src/extensions/workspaces/sessions/(frontend)/overlay/_lib/selectors.d.cts.map +0 -1
- package/dist/src/extensions/workspaces/sessions/(frontend)/overlay/_lib/selectors.d.mts.map +0 -1
- package/dist/src/extensions/workspaces/sessions/(frontend)/overlay/_lib/selectors.mjs.map +0 -1
- package/dist/src/extensions/workspaces/sessions/(frontend)/overlay/_lib/task-space.cli.cjs.map +0 -1
- package/dist/src/extensions/workspaces/sessions/(frontend)/overlay/_lib/task-space.cli.d.cts +0 -61
- package/dist/src/extensions/workspaces/sessions/(frontend)/overlay/_lib/task-space.cli.d.cts.map +0 -1
- package/dist/src/extensions/workspaces/sessions/(frontend)/overlay/_lib/task-space.cli.d.mts.map +0 -1
- package/dist/src/extensions/workspaces/sessions/(frontend)/overlay/_lib/task-space.cli.mjs.map +0 -1
- package/dist/src/extensions/workspaces/sessions/(frontend)/overlay/_lib/taskOverlay.cjs.map +0 -1
- package/dist/src/extensions/workspaces/sessions/(frontend)/overlay/_lib/taskOverlay.d.cts.map +0 -1
- package/dist/src/extensions/workspaces/sessions/(frontend)/overlay/_lib/taskOverlay.d.mts +0 -39
- package/dist/src/extensions/workspaces/sessions/(frontend)/overlay/_lib/taskOverlay.d.mts.map +0 -1
- package/dist/src/extensions/workspaces/sessions/(frontend)/overlay/_lib/taskOverlay.mjs.map +0 -1
- package/dist/src/extensions/workspaces/sessions/(frontend)/tool/_lib/task.cli.cjs +0 -13
- package/dist/src/extensions/workspaces/sessions/(frontend)/tool/_lib/task.cli.cjs.map +0 -1
- package/dist/src/extensions/workspaces/sessions/(frontend)/tool/_lib/task.cli.mjs +0 -13
- package/dist/src/extensions/workspaces/sessions/(frontend)/tool/_lib/task.cli.mjs.map +0 -1
- package/dist/src/extensions/workspaces/sessions/(frontend)/tool/task.cli.cjs +0 -7
- package/dist/src/extensions/workspaces/sessions/(frontend)/tool/task.cli.cjs.map +0 -1
- package/dist/src/extensions/workspaces/sessions/(frontend)/tool/task.cli.mjs +0 -8
- package/dist/src/extensions/workspaces/sessions/(frontend)/tool/task.cli.mjs.map +0 -1
- package/dist/src/models/task.cjs.map +0 -1
- package/dist/src/models/task.d.cts +0 -186
- package/dist/src/models/task.d.cts.map +0 -1
- package/dist/src/models/task.d.mts.map +0 -1
- package/dist/src/models/task.mjs.map +0 -1
- package/dist/src/models/taskGraph.cjs.map +0 -1
- package/dist/src/models/taskGraph.d.cts +0 -24
- package/dist/src/models/taskGraph.d.cts.map +0 -1
- package/dist/src/models/taskGraph.d.mts.map +0 -1
- package/dist/src/models/taskGraph.mjs.map +0 -1
- package/dist/src/schemas/apiContracts.cjs.map +0 -1
- package/dist/src/schemas/apiContracts.d.cts +0 -53
- package/dist/src/schemas/apiContracts.d.cts.map +0 -1
- package/dist/src/schemas/apiContracts.mjs.map +0 -1
- package/dist/src/schemas/task.cjs.map +0 -1
- package/dist/src/schemas/task.d.cts.map +0 -1
- package/dist/src/schemas/task.d.mts +0 -103
- package/dist/src/schemas/task.d.mts.map +0 -1
- package/dist/src/schemas/task.mjs.map +0 -1
- package/dist/src/services/config/index.cjs.map +0 -1
- package/dist/src/services/config/index.d.cts +0 -42
- package/dist/src/services/config/index.d.cts.map +0 -1
- package/dist/src/services/config/index.d.mts +0 -42
- package/dist/src/services/config/index.d.mts.map +0 -1
- package/dist/src/services/config/index.mjs.map +0 -1
- package/dist/src/services/contextContribution/index.cjs.map +0 -1
- package/dist/src/services/contextContribution/index.mjs.map +0 -1
- package/dist/src/services/delegation/index.cjs.map +0 -1
- package/dist/src/services/delegation/index.d.cts.map +0 -1
- package/dist/src/services/delegation/index.d.mts +0 -192
- package/dist/src/services/delegation/index.d.mts.map +0 -1
- package/dist/src/services/delegation/index.mjs.map +0 -1
- package/dist/src/services/delegationPlatform/index.cjs +0 -23
- package/dist/src/services/delegationPlatform/index.cjs.map +0 -1
- package/dist/src/services/delegationPlatform/index.mjs +0 -21
- package/dist/src/services/delegationPlatform/index.mjs.map +0 -1
- package/dist/src/services/invariants/index.cjs.map +0 -1
- package/dist/src/services/invariants/index.d.cts.map +0 -1
- package/dist/src/services/invariants/index.d.mts +0 -23
- package/dist/src/services/invariants/index.d.mts.map +0 -1
- package/dist/src/services/invariants/index.mjs.map +0 -1
- package/dist/src/services/logSinkTelemetry/index.cjs.map +0 -1
- package/dist/src/services/logSinkTelemetry/index.d.cts +0 -23
- package/dist/src/services/logSinkTelemetry/index.d.cts.map +0 -1
- package/dist/src/services/logSinkTelemetry/index.d.mts +0 -23
- package/dist/src/services/logSinkTelemetry/index.d.mts.map +0 -1
- package/dist/src/services/logSinkTelemetry/index.mjs.map +0 -1
- package/dist/src/services/paths/index.cjs.map +0 -1
- package/dist/src/services/paths/index.d.cts +0 -25
- package/dist/src/services/paths/index.d.cts.map +0 -1
- package/dist/src/services/paths/index.d.mts +0 -25
- package/dist/src/services/paths/index.d.mts.map +0 -1
- package/dist/src/services/paths/index.mjs.map +0 -1
- package/dist/src/services/processLiveness/index.cjs.map +0 -1
- package/dist/src/services/processLiveness/index.d.cts +0 -11
- package/dist/src/services/processLiveness/index.d.cts.map +0 -1
- package/dist/src/services/processLiveness/index.d.mts.map +0 -1
- package/dist/src/services/processLiveness/index.mjs.map +0 -1
- package/dist/src/services/reconcile/index.cjs.map +0 -1
- package/dist/src/services/reconcile/index.d.cts.map +0 -1
- package/dist/src/services/reconcile/index.d.mts +0 -33
- package/dist/src/services/reconcile/index.d.mts.map +0 -1
- package/dist/src/services/reconcile/index.mjs.map +0 -1
- package/dist/src/services/reducer/index.cjs.map +0 -1
- package/dist/src/services/reducer/index.d.cts.map +0 -1
- package/dist/src/services/reducer/index.d.mts +0 -71
- package/dist/src/services/reducer/index.d.mts.map +0 -1
- package/dist/src/services/reducer/index.mjs.map +0 -1
- package/dist/src/services/taskNarration/index.cjs +0 -32
- package/dist/src/services/taskNarration/index.cjs.map +0 -1
- package/dist/src/services/taskNarration/index.mjs +0 -32
- package/dist/src/services/taskNarration/index.mjs.map +0 -1
- package/dist/src/services/taskResult/index.cjs.map +0 -1
- package/dist/src/services/taskResult/index.d.cts +0 -50
- package/dist/src/services/taskResult/index.d.cts.map +0 -1
- package/dist/src/services/taskResult/index.d.mts +0 -50
- package/dist/src/services/taskResult/index.d.mts.map +0 -1
- package/dist/src/services/taskResult/index.mjs.map +0 -1
- package/dist/src/services/taskStore/index.cjs.map +0 -1
- package/dist/src/services/taskStore/index.d.cts.map +0 -1
- package/dist/src/services/taskStore/index.d.mts +0 -69
- package/dist/src/services/taskStore/index.d.mts.map +0 -1
- package/dist/src/services/taskTool/index.cjs +0 -106
- package/dist/src/services/taskTool/index.cjs.map +0 -1
- package/dist/src/services/taskTool/index.mjs +0 -105
- package/dist/src/services/taskTool/index.mjs.map +0 -1
- package/dist/src/types/delegation.cjs +0 -7
- package/dist/src/types/delegation.cjs.map +0 -1
- package/dist/src/types/delegation.d.cts +0 -5
- package/dist/src/types/delegation.d.cts.map +0 -1
- package/dist/src/types/delegation.d.mts +0 -5
- package/dist/src/types/delegation.d.mts.map +0 -1
- package/dist/src/types/delegation.mjs.map +0 -1
- package/dist/src/types/telemetry.cjs.map +0 -1
- package/dist/src/types/telemetry.d.cts +0 -35
- package/dist/src/types/telemetry.d.cts.map +0 -1
- package/dist/src/types/telemetry.d.mts.map +0 -1
- package/dist/src/types/telemetry.mjs.map +0 -1
- package/dist/src/types/webTasks.cjs +0 -7
- package/dist/src/types/webTasks.cjs.map +0 -1
- package/dist/src/types/webTasks.mjs +0 -7
- package/dist/src/types/webTasks.mjs.map +0 -1
- package/dist/store-invariants.cjs +0 -5
- package/dist/store-invariants.d.cts +0 -2
- package/dist/store-invariants.d.mts +0 -2
- package/dist/store-invariants.mjs +0 -2
- package/dist/store-paths.cjs +0 -14
- package/dist/store-paths.d.cts +0 -2
- package/dist/store-paths.d.mts +0 -2
- package/dist/store-paths.mjs +0 -2
- package/dist/store-process-liveness.cjs +0 -3
- 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 -2
- package/dist/store-reconcile.cjs +0 -5
- package/dist/store-reconcile.d.cts +0 -2
- package/dist/store-reconcile.d.mts +0 -2
- package/dist/store-reconcile.mjs +0 -2
- package/dist/store-reducer.cjs +0 -8
- package/dist/store-reducer.d.cts +0 -2
- package/dist/store-reducer.d.mts +0 -2
- package/dist/store-reducer.mjs +0 -2
- 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 -2
- package/dist/store-task-store.cjs +0 -3
- 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 -2
- package/dist/store-types.d.cts +0 -2
- package/dist/store-types.d.mts +0 -2
- package/dist/store-types.mjs +0 -2
- 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 -2
- package/dist/tool-response-envelope.cjs +0 -12
- 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 -2
- package/dist/tool-schema.d.cts +0 -3
- package/dist/tool-schema.d.mts +0 -3
- package/dist/tool-schema.mjs +0 -3
- 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 -3
- package/dist/tui-format.d.cts +0 -2
- package/dist/tui-format.d.mts +0 -2
- package/dist/tui-format.mjs +0 -2
- package/dist/tui-selectors.d.cts +0 -2
- package/dist/tui-selectors.d.mts +0 -2
- package/dist/tui-selectors.mjs +0 -2
- 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 -2
- 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 -2
- /package/dist/{src/schemas/apiContracts.d.mts → apiContracts.d.mts} +0 -0
package/dist/src/extensions/workspaces/sessions/(frontend)/overlay/_lib/task-space.cli.cjs.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"task-space.cli.cjs","names":["DOOM_FULLSCREEN_UI_OPTIONS","homedir","visibleWidth","truncateToWidth","fitStyledLine","DoomOverlay","visibleTasks","applyTaskMutation","isCommittingOp","singleItemOutcome","matchesKey","TASK_STATUSES","MSG_NO_TASKS","overlayStatusGlyph","isBlocked","STATUS_LABEL","countTasks","DOOM_OVERLAY_ACCENT"],"sources":["../../../../../../../../src/extensions/workspaces/sessions/(frontend)/overlay/_lib/task-space.cli.ts"],"sourcesContent":["/**\n * Task Space: the `SPC t l` overlay.\n *\n * The task list and detail pane render from plain values so the whole surface\n * can be asserted as text without a live terminal.\n *\n * The overlay reads the store on every render rather than caching rows, so an\n * external write by a delegated child shows up without closing the overlay.\n *\n * Every commit it makes is a single-entry `upsert` that carries the selected\n * task's id. That id is what keeps creating a task a tool-only path: an entry\n * without one would create rather than be rejected.\n */\n\nimport { homedir } from 'node:os';\n\nimport {\n DOOM_FULLSCREEN_UI_OPTIONS,\n DOOM_OVERLAY_ACCENT,\n DoomOverlay,\n type DoomOverlayChrome,\n type DoomOverlayTui,\n} from '@agimon-ai/doompi-ui/doom-overlay';\nimport { fitStyledLine } from '@agimon-ai/doompi-ui/rendering';\nimport type { ExtensionContext, Theme } from '@earendil-works/pi-coding-agent';\nimport { matchesKey, truncateToWidth, visibleWidth } from '@earendil-works/pi-tui';\n\nimport type { Task, TaskItemMutation } from '../../../../../../models/task';\nimport { isBlocked } from '../../../../../../models/taskGraph';\nimport { MSG_NO_TASKS, TASK_STATUSES } from '../../../../../../schemas/task';\nimport { applyTaskMutation, isCommittingOp, type Op, singleItemOutcome } from '../../../../../../services/reducer';\nimport type { TaskStore } from '../../../../../../services/taskStore';\nimport { overlayStatusGlyph, STATUS_LABEL } from '../../_shared/format.cli';\nimport { countTasks, visibleTasks } from '.././_lib/selectors';\n\nexport const TASK_SPACE_OVERLAY_OPTIONS = DOOM_FULLSCREEN_UI_OPTIONS.overlayOptions;\n\nexport interface TaskSpaceOptions {\n store: TaskStore;\n}\n\ntype EditMode = 'browse' | 'status' | 'subject';\n\nconst KEY_BACKSPACE = '\\x7f';\nconst KEY_ENTER = '\\r';\nconst KEY_NEWLINE = '\\n';\nconst FIRST_PRINTABLE_CODE_POINT = 0x20;\nconst DELETE_CODE_POINT = 0x7f;\n\n/**\n * Keystrokes that carry no text: escape sequences, control keys, delete.\n * Indexed rather than iterated so surrogate pairs stay intact; both halves sit\n * far above the control range, so no emoji is ever mistaken for one.\n */\nfunction isControlInput(data: string): boolean {\n for (let index = 0; index < data.length; index++) {\n const code = data.charCodeAt(index);\n if (code < FIRST_PRINTABLE_CODE_POINT || code === DELETE_CODE_POINT) return true;\n }\n return false;\n}\n\n/**\n * Store path for the list heading: home collapses to `~`, and an over-long path\n * loses leading segments rather than its tail, because the file name identifies\n * the store while `/var/folders/...` does not.\n */\nfunction storeLabel(storePath: string, width: number): string {\n const home = homedir();\n const abbreviated = home && storePath.startsWith(home) ? `~${storePath.slice(home.length)}` : storePath;\n if (visibleWidth(abbreviated) <= width) return abbreviated;\n\n const segments = abbreviated.split('/');\n let tail = segments.pop() ?? abbreviated;\n while (segments.length > 0) {\n const candidate = `${segments[segments.length - 1]}/${tail}`;\n if (visibleWidth(`…/${candidate}`) > width) break;\n tail = candidate;\n segments.pop();\n }\n return truncateToWidth(`…/${tail}`, width, '');\n}\n\n/** Neither palette name is exported, so take both from the theme's methods. */\ntype ThemeBg = Parameters<Theme['bg']>[0];\ntype ThemeColor = Parameters<Theme['fg']>[0];\n\n/** Each task occupies a heading row and a metadata row beneath it. */\nconst ROWS_PER_TASK = 2;\n/** Hanging indent for the metadata row: clears marker, glyph and id. */\nconst META_INDENT = 6;\n\nconst MIN_WIDTH = 48;\n/** A third for the list, two thirds for the task being read or edited. */\nconst LIST_PANE_RATIO = 1 / 3;\n/** One blank column each side of the pane divider so neither column touches it. */\nconst PANE_GUTTER = 1;\nconst MIN_PANE_WIDTH = 18;\nconst SELECTION_MARKER = '›';\nconst CURRENT_MARKER = '▸';\nconst CURSOR_BLOCK = '█';\nconst ELLIPSIS = '…';\nconst NO_VALUE = 'none';\n\nconst TITLE = 'TASK SPACE';\nconst BREADCRUMB = 'SPC › t › t / tasks';\n/** Key/label pairs rendered as capped keys, matching the mockup's footer. */\nconst LIST_HINTS: readonly (readonly [string, string])[] = [\n ['↑↓', 'select'],\n ['enter', 'edit subject'],\n ['s', 'status'],\n ['esc', 'close'],\n];\nconst LIST_HEADER_RIGHT = 'esc close';\nconst STATUS_HINT = 'STATUS s cycles · enter commits';\nconst SUBJECT_HINT = 'SUBJECT enter commits · esc cancels';\nfunction fitRow(text: string, width: number): string {\n return fitStyledLine(text, width, ELLIPSIS);\n}\n\nfunction rightAligned(left: string, right: string, width: number): string {\n const rightWidth = visibleWidth(right);\n const leftWidth = Math.max(0, width - rightWidth - 1);\n return fitRow(left, leftWidth) + ' '.repeat(Math.max(1, width - leftWidth - rightWidth)) + fitRow(right, rightWidth);\n}\n\nfunction wrap(text: string, width: number): string[] {\n if (width <= 0) return [];\n const lines: string[] = [];\n let current = '';\n for (const word of text.split(/\\s+/).filter(Boolean)) {\n if (current.length === 0) current = word;\n else if (current.length + 1 + word.length <= width) current += ` ${word}`;\n else {\n lines.push(current);\n current = word;\n }\n }\n if (current.length > 0) lines.push(current);\n return lines;\n}\n\n/**\n * Task Space overlay component.\n *\n * Rendering is pure: `render(width)` reads the live store and returns lines with\n * no side effects, so the fidelity job can capture it and unit tests can assert on it.\n */\nexport class TaskSpaceComponent extends DoomOverlay {\n private readonly options: TaskSpaceOptions;\n private readonly done: (result: undefined) => void;\n private readonly unwatch: () => void;\n\n private mode: EditMode = 'browse';\n private selected = 0;\n private statusIndex = 0;\n private draft = '';\n private notice: string | undefined;\n private bodyHeight = 1;\n\n constructor(tui: DoomOverlayTui, theme: Theme, options: TaskSpaceOptions, done: (result: undefined) => void) {\n super(tui, theme);\n this.options = options;\n this.done = done;\n this.unwatch = options.store.onExternalChange(() => this.tui.requestRender());\n }\n\n private tasks(): Task[] {\n return visibleTasks(this.options.store.snapshot.tasks);\n }\n\n private selectedTask(): Task | undefined {\n const tasks = this.tasks();\n if (tasks.length === 0) return undefined;\n return tasks[Math.min(this.selected, tasks.length - 1)];\n }\n\n private move(delta: number): void {\n const tasks = this.tasks();\n if (tasks.length === 0) return;\n this.selected = Math.max(0, Math.min(tasks.length - 1, this.selected + delta));\n this.tui.requestRender();\n }\n\n /** Commits through the same reducer the task tool uses, so both paths share every invariant. */\n private commit(item: TaskItemMutation): void {\n this.options.store\n .mutate<Op>((document) => {\n const result = applyTaskMutation(document, 'upsert', { tasks: [item] });\n // A rejected mutation must not reach the writer: committing it would\n // bump `rev` for an edit that never happened.\n if (!isCommittingOp(result.op)) return { value: result.op };\n return { document: result.document, value: result.op };\n })\n .then((outcome) => {\n // The reducer's message is unprefixed, so the notice reads\n // \"subject must not be blank\" rather than \"item[0] failed: ...\".\n const single = singleItemOutcome(outcome.value);\n this.notice = single?.kind === 'failed' ? single.message : undefined;\n this.tui.requestRender();\n })\n .catch((error: unknown) => {\n // Shown in the overlay rather than swallowed: a rejected write means the\n // edit the operator just made never landed.\n this.notice = error instanceof Error ? error.message : String(error);\n this.tui.requestRender();\n });\n }\n\n private handleStatusInput(data: string): void {\n const task = this.selectedTask();\n if (matchesKey(data, 'up')) this.statusIndex = Math.max(0, this.statusIndex - 1);\n else if (matchesKey(data, 'down')) this.statusIndex = Math.min(TASK_STATUSES.length - 1, this.statusIndex + 1);\n else if (data === 's') this.statusIndex = (this.statusIndex + 1) % TASK_STATUSES.length;\n else if (data === KEY_ENTER || data === KEY_NEWLINE) {\n this.mode = 'browse';\n if (task) this.commit({ id: task.id, status: TASK_STATUSES[this.statusIndex] });\n } else if (matchesKey(data, 'escape')) this.mode = 'browse';\n this.tui.requestRender();\n }\n\n private handleSubjectInput(data: string): void {\n const task = this.selectedTask();\n if (data === KEY_ENTER || data === KEY_NEWLINE) {\n this.mode = 'browse';\n if (task) this.commit({ id: task.id, subject: this.draft });\n } else if (matchesKey(data, 'escape')) this.mode = 'browse';\n else if (data === KEY_BACKSPACE) this.draft = this.draft.slice(0, -1);\n else if (!isControlInput(data)) this.draft += data;\n this.tui.requestRender();\n }\n\n handleInput(data: string): void {\n if (this.mode === 'status') {\n this.handleStatusInput(data);\n return;\n }\n if (this.mode === 'subject') {\n this.handleSubjectInput(data);\n return;\n }\n\n if (matchesKey(data, 'escape') || matchesKey(data, 'ctrl+c')) {\n this.done(undefined);\n return;\n }\n if (matchesKey(data, 'up')) {\n this.move(-1);\n return;\n }\n if (matchesKey(data, 'down')) {\n this.move(1);\n return;\n }\n\n const task = this.selectedTask();\n if (!task) return;\n if (data === 's') {\n this.mode = 'status';\n this.statusIndex = Math.max(0, TASK_STATUSES.indexOf(task.status));\n this.tui.requestRender();\n return;\n }\n if (data === KEY_ENTER || data === KEY_NEWLINE) {\n this.mode = 'subject';\n this.draft = task.subject;\n this.tui.requestRender();\n }\n }\n\n /**\n * A padded, background-filled chip. Foreground is applied inside the fill so\n * the colour closes with it, rather than a reset stripping the background\n * partway through the label.\n */\n private badge(text: string, background: ThemeBg, colour: ThemeColor = 'text'): string {\n return this.theme.bg(background, this.theme.fg(colour, ` ${text} `));\n }\n\n /** Footer hints as capped keys: `[ enter ] edit subject`, per the mockup. */\n private hintLine(hints: readonly (readonly [string, string])[]): string {\n return hints\n .map(([key, label]) => `${this.badge(key, 'selectedBg')}${this.theme.fg('dim', ` ${label}`)}`)\n .join(this.theme.fg('dim', ' '));\n }\n\n private listLines(width: number): string[] {\n const tasks = this.tasks();\n const label = this.theme.bold('TASKS');\n const pathWidth = Math.max(0, width - visibleWidth('TASKS') - 2);\n const lines = [`${label} ${this.theme.fg('dim', storeLabel(this.options.store.storePath, pathWidth))}`, ''];\n if (tasks.length === 0) {\n lines.push(this.theme.fg('dim', MSG_NO_TASKS));\n return lines;\n }\n\n // Two rows per task: at a third of the width a single row left the subject\n // with a handful of columns once owner and state took their share.\n const budget = Math.max(1, Math.floor((this.bodyHeight - lines.length) / ROWS_PER_TASK));\n const start = Math.max(0, Math.min(this.selected - budget + 1, Math.max(0, tasks.length - budget)));\n for (const [offset, task] of tasks.slice(start, start + budget).entries()) {\n const index = start + offset;\n const active = index === Math.min(this.selected, tasks.length - 1);\n const marker = active ? this.theme.fg('accent', SELECTION_MARKER) : ' ';\n const subject = active ? this.theme.bold(task.subject) : task.subject;\n const glyph = overlayStatusGlyph(task.status, this.theme);\n const owner = task.owner ?? task.delegation?.agent ?? NO_VALUE;\n const blocked = task.status === 'pending' && isBlocked(this.options.store.snapshot.tasks, task);\n const state = blocked\n ? this.theme.fg('warning', `blocked by ${(task.blockedBy ?? []).map((id) => `#${id}`).join(', ')}`)\n : this.theme.fg('dim', STATUS_LABEL[task.status]);\n // Subject owns the first row outright; the metadata hangs under it.\n const heading = `${marker} ${glyph} ${this.theme.fg('dim', `#${task.id}`)} ${subject}`;\n const meta = `${' '.repeat(META_INDENT)}${this.badge(owner, 'userMessageBg', 'muted')} ${state}`;\n // Every task sits on a band, the selected one a shade lighter, as in the\n // mockup; the marker stays so selection survives themes with no background.\n const background: ThemeBg = active ? 'selectedBg' : 'userMessageBg';\n for (const row of [heading, meta]) {\n lines.push(this.theme.bg(background, fitRow(row, width)));\n }\n }\n return lines;\n }\n\n private statusLines(task: Task, width: number): string[] {\n if (this.mode !== 'status') {\n const glyph = overlayStatusGlyph(task.status, this.theme);\n return [this.theme.fg('dim', 'STATUS'), `${glyph} ${STATUS_LABEL[task.status]}`];\n }\n // Editing draws the picker as a filled panel, so the whole option list reads\n // as one surface rather than five loose rows.\n const lines = [this.theme.fg('dim', STATUS_HINT)];\n for (const [index, status] of TASK_STATUSES.entries()) {\n const selected = index === this.statusIndex;\n const marker = selected ? this.theme.fg('accent', CURRENT_MARKER) : ' ';\n const label = selected ? this.theme.bold(this.theme.fg('accent', status)) : this.theme.fg('muted', status);\n const current = status === task.status ? this.theme.fg('dim', 'current') : '';\n const row = rightAligned(` ${marker} ${label}`, current, width);\n lines.push(this.theme.bg(selected ? 'selectedBg' : 'userMessageBg', row));\n }\n return lines;\n }\n\n /** The subject as an input: a filled field with a caret, as in the mockup. */\n private subjectField(task: Task, width: number): string[] {\n const editing = this.mode === 'subject';\n const value = editing ? `${this.draft}${CURSOR_BLOCK}` : task.subject;\n return [\n this.theme.fg('dim', editing ? SUBJECT_HINT : 'SUBJECT'),\n this.theme.bg(editing ? 'selectedBg' : 'userMessageBg', fitRow(` ${value}`, width)),\n ];\n }\n\n private detailLines(width: number): string[] {\n const task = this.selectedTask();\n if (!task) return [this.theme.fg('dim', 'No task selected')];\n\n const editing = this.mode === 'subject' || this.mode === 'status';\n const badge = editing ? this.badge('EDIT', 'toolSuccessBg', 'warning') : '';\n const lines = [rightAligned(this.theme.bold(this.theme.fg('accent', `TASK #${task.id}`)), badge, width), ''];\n lines.push(...this.subjectField(task, width));\n lines.push('', ...this.statusLines(task, width), '');\n\n if (task.activeForm) lines.push(this.theme.fg('dim', 'ACTIVE FORM'), task.activeForm, '');\n const owner = task.owner ?? task.delegation?.agent ?? NO_VALUE;\n const delegated = task.delegation?.runId ? this.theme.fg('success', `delegated run ${task.delegation.runId}`) : '';\n lines.push(\n this.theme.fg('dim', 'OWNER'),\n delegated ? `${owner} ${this.theme.fg('dim', '·')} ${delegated}` : owner,\n '',\n );\n lines.push(\n this.theme.fg('dim', 'BLOCKED BY'),\n task.blockedBy?.length ? task.blockedBy.map((id) => `#${id}`).join(' · ') : NO_VALUE,\n );\n if (task.description) lines.push('', this.theme.fg('dim', 'DESCRIPTION'), ...wrap(task.description, width));\n if (this.notice) lines.push('', this.theme.fg('error', this.notice));\n return lines;\n }\n\n private headerSummary(): string {\n const counts = countTasks(this.options.store.snapshot.tasks);\n const summary = [`${counts.completed}/${counts.total} completed`];\n if (counts.inProgress > 0) summary.push(`${counts.inProgress} in progress`);\n if (counts.blocked > 0) summary.push(`${counts.blocked} blocked`);\n if (counts.failed > 0) summary.push(`${counts.failed} failed`);\n return summary.join(' · ');\n }\n\n protected getChrome(): DoomOverlayChrome {\n return {\n title: TITLE,\n accent: DOOM_OVERLAY_ACCENT,\n breadcrumb: BREADCRUMB,\n headerRight: `${this.headerSummary()} · ${LIST_HEADER_RIGHT}`,\n footer: this.hintLine(LIST_HINTS),\n };\n }\n\n protected renderBody(width: number, height: number): string[] {\n this.bodyHeight = height;\n if (width < MIN_WIDTH) return this.renderStacked(width, height);\n\n const leftWidth = Math.max(MIN_PANE_WIDTH, Math.floor((width - 1) * LIST_PANE_RATIO));\n const rightWidth = Math.max(1, width - leftWidth - 1);\n // Each column gives up one column to the gutter, so content never abuts the\n // divider: a long store path used to run straight into the detail heading.\n const leftContent = Math.max(1, leftWidth - PANE_GUTTER);\n const rightContent = Math.max(1, rightWidth - PANE_GUTTER);\n const left = this.listLines(leftContent);\n const right = this.detailLines(rightContent);\n\n const divider = this.theme.fg('borderMuted', '│');\n return Array.from({ length: height }, (_, index) => {\n const row = `${fitRow(left[index] ?? '', leftContent)} ${divider} ${fitRow(right[index] ?? '', rightContent)}`;\n return truncateToWidth(row, width, ELLIPSIS);\n });\n }\n\n private renderStacked(width: number, height: number): string[] {\n const topHeight = Math.max(1, Math.floor((height - 1) / 2));\n const bottomHeight = Math.max(0, height - topHeight - 1);\n this.bodyHeight = topHeight;\n const top = this.listLines(width);\n const bottom = this.detailLines(width);\n return [\n ...top.slice(0, topHeight),\n ...Array.from({ length: Math.max(0, topHeight - top.length) }, () => ''),\n this.theme.fg('borderMuted', '─'.repeat(width)),\n ...bottom.slice(0, bottomHeight),\n ];\n }\n\n dispose(): void {\n this.unwatch();\n }\n}\n\nexport async function openTaskSpace(ctx: ExtensionContext, options: TaskSpaceOptions): Promise<void> {\n await ctx.ui.custom<undefined>(\n (tui, theme, _keybindings, done) => new TaskSpaceComponent(tui, theme, options, done),\n DOOM_FULLSCREEN_UI_OPTIONS,\n );\n}\n\nexport default openTaskSpace;\n"],"mappings":"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"}
|
package/dist/src/extensions/workspaces/sessions/(frontend)/overlay/_lib/task-space.cli.d.cts
DELETED
|
@@ -1,61 +0,0 @@
|
|
|
1
|
-
import { TaskStore } from "../../../../../../services/taskStore/index.cjs";
|
|
2
|
-
import { ExtensionContext, Theme } from "@earendil-works/pi-coding-agent";
|
|
3
|
-
import { DoomOverlay, DoomOverlayChrome, DoomOverlayTui } from "@agimon-ai/doompi-ui/doom-overlay";
|
|
4
|
-
//#region src/extensions/workspaces/sessions/(frontend)/overlay/_lib/task-space.cli.d.ts
|
|
5
|
-
export declare const TASK_SPACE_OVERLAY_OPTIONS: {
|
|
6
|
-
readonly anchor: 'top-left';
|
|
7
|
-
readonly width: '100%';
|
|
8
|
-
readonly maxHeight: '100%';
|
|
9
|
-
readonly margin: 0;
|
|
10
|
-
};
|
|
11
|
-
export interface TaskSpaceOptions {
|
|
12
|
-
store: TaskStore;
|
|
13
|
-
}
|
|
14
|
-
/**
|
|
15
|
-
* Task Space overlay component.
|
|
16
|
-
*
|
|
17
|
-
* Rendering is pure: `render(width)` reads the live store and returns lines with
|
|
18
|
-
* no side effects, so the fidelity job can capture it and unit tests can assert on it.
|
|
19
|
-
*/
|
|
20
|
-
export declare class TaskSpaceComponent extends DoomOverlay {
|
|
21
|
-
private readonly options;
|
|
22
|
-
private readonly done;
|
|
23
|
-
private readonly unwatch;
|
|
24
|
-
private mode;
|
|
25
|
-
private selected;
|
|
26
|
-
private statusIndex;
|
|
27
|
-
private draft;
|
|
28
|
-
private notice;
|
|
29
|
-
private bodyHeight;
|
|
30
|
-
constructor(tui: DoomOverlayTui, theme: Theme, options: TaskSpaceOptions, done: (result: undefined) => void);
|
|
31
|
-
private tasks;
|
|
32
|
-
private selectedTask;
|
|
33
|
-
private move;
|
|
34
|
-
/** Commits through the same reducer the task tool uses, so both paths share every invariant. */
|
|
35
|
-
private commit;
|
|
36
|
-
private handleStatusInput;
|
|
37
|
-
private handleSubjectInput;
|
|
38
|
-
handleInput(data: string): void;
|
|
39
|
-
/**
|
|
40
|
-
* A padded, background-filled chip. Foreground is applied inside the fill so
|
|
41
|
-
* the colour closes with it, rather than a reset stripping the background
|
|
42
|
-
* partway through the label.
|
|
43
|
-
*/
|
|
44
|
-
private badge;
|
|
45
|
-
/** Footer hints as capped keys: `[ enter ] edit subject`, per the mockup. */
|
|
46
|
-
private hintLine;
|
|
47
|
-
private listLines;
|
|
48
|
-
private statusLines;
|
|
49
|
-
/** The subject as an input: a filled field with a caret, as in the mockup. */
|
|
50
|
-
private subjectField;
|
|
51
|
-
private detailLines;
|
|
52
|
-
private headerSummary;
|
|
53
|
-
protected getChrome(): DoomOverlayChrome;
|
|
54
|
-
protected renderBody(width: number, height: number): string[];
|
|
55
|
-
private renderStacked;
|
|
56
|
-
dispose(): void;
|
|
57
|
-
}
|
|
58
|
-
export declare function openTaskSpace(ctx: ExtensionContext, options: TaskSpaceOptions): Promise<void>;
|
|
59
|
-
//#endregion
|
|
60
|
-
export { openTaskSpace as default };
|
|
61
|
-
//# sourceMappingURL=task-space.cli.d.cts.map
|
package/dist/src/extensions/workspaces/sessions/(frontend)/overlay/_lib/task-space.cli.d.cts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"task-space.cli.d.cts","names":[],"sources":["../../../../../../../../src/extensions/workspaces/sessions/(frontend)/overlay/_lib/task-space.cli.ts"],"mappings":";;;;qBAmCa;;;;;;iBAEI;EACf,OAAO;;;;;;;;qBA8GI,2BAA2B;mBACrB;mBACA;mBACA;UAET;UACA;UACA;UACA;UACA;UACA;EAER,YAAY,KAAK,gBAAgB,OAAO,OAAO,SAAS,kBAAkB,OAAO;UAOzE;UAIA;UAMA;;UAQA;UAwBA;UAYA;EAWR,YAAY;;;;;;UA2CJ;;UAKA;UAMA;UAsCA;;UAoBA;UASA;UA2BA;YASE,aAAa;YAUb,WAAW,eAAe;UAoB5B;EAcR;;wBAKoB,cAAc,KAAK,kBAAkB,SAAS,mBAAmB"}
|
package/dist/src/extensions/workspaces/sessions/(frontend)/overlay/_lib/task-space.cli.d.mts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"task-space.cli.d.mts","names":[],"sources":["../../../../../../../../src/extensions/workspaces/sessions/(frontend)/overlay/_lib/task-space.cli.ts"],"mappings":";;;;qBAmCa;;;;;;iBAEI;EACf,OAAO;;;;;;;;qBA8GI,2BAA2B;mBACrB;mBACA;mBACA;UAET;UACA;UACA;UACA;UACA;UACA;EAER,YAAY,KAAK,gBAAgB,OAAO,OAAO,SAAS,kBAAkB,OAAO;UAOzE;UAIA;UAMA;;UAQA;UAwBA;UAYA;EAWR,YAAY;;;;;;UA2CJ;;UAKA;UAMA;UAsCA;;UAoBA;UASA;UA2BA;YASE,aAAa;YAUb,WAAW,eAAe;UAoB5B;EAcR;;wBAKoB,cAAc,KAAK,kBAAkB,SAAS,mBAAmB"}
|
package/dist/src/extensions/workspaces/sessions/(frontend)/overlay/_lib/task-space.cli.mjs.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"task-space.cli.mjs","names":[],"sources":["../../../../../../../../src/extensions/workspaces/sessions/(frontend)/overlay/_lib/task-space.cli.ts"],"sourcesContent":["/**\n * Task Space: the `SPC t l` overlay.\n *\n * The task list and detail pane render from plain values so the whole surface\n * can be asserted as text without a live terminal.\n *\n * The overlay reads the store on every render rather than caching rows, so an\n * external write by a delegated child shows up without closing the overlay.\n *\n * Every commit it makes is a single-entry `upsert` that carries the selected\n * task's id. That id is what keeps creating a task a tool-only path: an entry\n * without one would create rather than be rejected.\n */\n\nimport { homedir } from 'node:os';\n\nimport {\n DOOM_FULLSCREEN_UI_OPTIONS,\n DOOM_OVERLAY_ACCENT,\n DoomOverlay,\n type DoomOverlayChrome,\n type DoomOverlayTui,\n} from '@agimon-ai/doompi-ui/doom-overlay';\nimport { fitStyledLine } from '@agimon-ai/doompi-ui/rendering';\nimport type { ExtensionContext, Theme } from '@earendil-works/pi-coding-agent';\nimport { matchesKey, truncateToWidth, visibleWidth } from '@earendil-works/pi-tui';\n\nimport type { Task, TaskItemMutation } from '../../../../../../models/task';\nimport { isBlocked } from '../../../../../../models/taskGraph';\nimport { MSG_NO_TASKS, TASK_STATUSES } from '../../../../../../schemas/task';\nimport { applyTaskMutation, isCommittingOp, type Op, singleItemOutcome } from '../../../../../../services/reducer';\nimport type { TaskStore } from '../../../../../../services/taskStore';\nimport { overlayStatusGlyph, STATUS_LABEL } from '../../_shared/format.cli';\nimport { countTasks, visibleTasks } from '.././_lib/selectors';\n\nexport const TASK_SPACE_OVERLAY_OPTIONS = DOOM_FULLSCREEN_UI_OPTIONS.overlayOptions;\n\nexport interface TaskSpaceOptions {\n store: TaskStore;\n}\n\ntype EditMode = 'browse' | 'status' | 'subject';\n\nconst KEY_BACKSPACE = '\\x7f';\nconst KEY_ENTER = '\\r';\nconst KEY_NEWLINE = '\\n';\nconst FIRST_PRINTABLE_CODE_POINT = 0x20;\nconst DELETE_CODE_POINT = 0x7f;\n\n/**\n * Keystrokes that carry no text: escape sequences, control keys, delete.\n * Indexed rather than iterated so surrogate pairs stay intact; both halves sit\n * far above the control range, so no emoji is ever mistaken for one.\n */\nfunction isControlInput(data: string): boolean {\n for (let index = 0; index < data.length; index++) {\n const code = data.charCodeAt(index);\n if (code < FIRST_PRINTABLE_CODE_POINT || code === DELETE_CODE_POINT) return true;\n }\n return false;\n}\n\n/**\n * Store path for the list heading: home collapses to `~`, and an over-long path\n * loses leading segments rather than its tail, because the file name identifies\n * the store while `/var/folders/...` does not.\n */\nfunction storeLabel(storePath: string, width: number): string {\n const home = homedir();\n const abbreviated = home && storePath.startsWith(home) ? `~${storePath.slice(home.length)}` : storePath;\n if (visibleWidth(abbreviated) <= width) return abbreviated;\n\n const segments = abbreviated.split('/');\n let tail = segments.pop() ?? abbreviated;\n while (segments.length > 0) {\n const candidate = `${segments[segments.length - 1]}/${tail}`;\n if (visibleWidth(`…/${candidate}`) > width) break;\n tail = candidate;\n segments.pop();\n }\n return truncateToWidth(`…/${tail}`, width, '');\n}\n\n/** Neither palette name is exported, so take both from the theme's methods. */\ntype ThemeBg = Parameters<Theme['bg']>[0];\ntype ThemeColor = Parameters<Theme['fg']>[0];\n\n/** Each task occupies a heading row and a metadata row beneath it. */\nconst ROWS_PER_TASK = 2;\n/** Hanging indent for the metadata row: clears marker, glyph and id. */\nconst META_INDENT = 6;\n\nconst MIN_WIDTH = 48;\n/** A third for the list, two thirds for the task being read or edited. */\nconst LIST_PANE_RATIO = 1 / 3;\n/** One blank column each side of the pane divider so neither column touches it. */\nconst PANE_GUTTER = 1;\nconst MIN_PANE_WIDTH = 18;\nconst SELECTION_MARKER = '›';\nconst CURRENT_MARKER = '▸';\nconst CURSOR_BLOCK = '█';\nconst ELLIPSIS = '…';\nconst NO_VALUE = 'none';\n\nconst TITLE = 'TASK SPACE';\nconst BREADCRUMB = 'SPC › t › t / tasks';\n/** Key/label pairs rendered as capped keys, matching the mockup's footer. */\nconst LIST_HINTS: readonly (readonly [string, string])[] = [\n ['↑↓', 'select'],\n ['enter', 'edit subject'],\n ['s', 'status'],\n ['esc', 'close'],\n];\nconst LIST_HEADER_RIGHT = 'esc close';\nconst STATUS_HINT = 'STATUS s cycles · enter commits';\nconst SUBJECT_HINT = 'SUBJECT enter commits · esc cancels';\nfunction fitRow(text: string, width: number): string {\n return fitStyledLine(text, width, ELLIPSIS);\n}\n\nfunction rightAligned(left: string, right: string, width: number): string {\n const rightWidth = visibleWidth(right);\n const leftWidth = Math.max(0, width - rightWidth - 1);\n return fitRow(left, leftWidth) + ' '.repeat(Math.max(1, width - leftWidth - rightWidth)) + fitRow(right, rightWidth);\n}\n\nfunction wrap(text: string, width: number): string[] {\n if (width <= 0) return [];\n const lines: string[] = [];\n let current = '';\n for (const word of text.split(/\\s+/).filter(Boolean)) {\n if (current.length === 0) current = word;\n else if (current.length + 1 + word.length <= width) current += ` ${word}`;\n else {\n lines.push(current);\n current = word;\n }\n }\n if (current.length > 0) lines.push(current);\n return lines;\n}\n\n/**\n * Task Space overlay component.\n *\n * Rendering is pure: `render(width)` reads the live store and returns lines with\n * no side effects, so the fidelity job can capture it and unit tests can assert on it.\n */\nexport class TaskSpaceComponent extends DoomOverlay {\n private readonly options: TaskSpaceOptions;\n private readonly done: (result: undefined) => void;\n private readonly unwatch: () => void;\n\n private mode: EditMode = 'browse';\n private selected = 0;\n private statusIndex = 0;\n private draft = '';\n private notice: string | undefined;\n private bodyHeight = 1;\n\n constructor(tui: DoomOverlayTui, theme: Theme, options: TaskSpaceOptions, done: (result: undefined) => void) {\n super(tui, theme);\n this.options = options;\n this.done = done;\n this.unwatch = options.store.onExternalChange(() => this.tui.requestRender());\n }\n\n private tasks(): Task[] {\n return visibleTasks(this.options.store.snapshot.tasks);\n }\n\n private selectedTask(): Task | undefined {\n const tasks = this.tasks();\n if (tasks.length === 0) return undefined;\n return tasks[Math.min(this.selected, tasks.length - 1)];\n }\n\n private move(delta: number): void {\n const tasks = this.tasks();\n if (tasks.length === 0) return;\n this.selected = Math.max(0, Math.min(tasks.length - 1, this.selected + delta));\n this.tui.requestRender();\n }\n\n /** Commits through the same reducer the task tool uses, so both paths share every invariant. */\n private commit(item: TaskItemMutation): void {\n this.options.store\n .mutate<Op>((document) => {\n const result = applyTaskMutation(document, 'upsert', { tasks: [item] });\n // A rejected mutation must not reach the writer: committing it would\n // bump `rev` for an edit that never happened.\n if (!isCommittingOp(result.op)) return { value: result.op };\n return { document: result.document, value: result.op };\n })\n .then((outcome) => {\n // The reducer's message is unprefixed, so the notice reads\n // \"subject must not be blank\" rather than \"item[0] failed: ...\".\n const single = singleItemOutcome(outcome.value);\n this.notice = single?.kind === 'failed' ? single.message : undefined;\n this.tui.requestRender();\n })\n .catch((error: unknown) => {\n // Shown in the overlay rather than swallowed: a rejected write means the\n // edit the operator just made never landed.\n this.notice = error instanceof Error ? error.message : String(error);\n this.tui.requestRender();\n });\n }\n\n private handleStatusInput(data: string): void {\n const task = this.selectedTask();\n if (matchesKey(data, 'up')) this.statusIndex = Math.max(0, this.statusIndex - 1);\n else if (matchesKey(data, 'down')) this.statusIndex = Math.min(TASK_STATUSES.length - 1, this.statusIndex + 1);\n else if (data === 's') this.statusIndex = (this.statusIndex + 1) % TASK_STATUSES.length;\n else if (data === KEY_ENTER || data === KEY_NEWLINE) {\n this.mode = 'browse';\n if (task) this.commit({ id: task.id, status: TASK_STATUSES[this.statusIndex] });\n } else if (matchesKey(data, 'escape')) this.mode = 'browse';\n this.tui.requestRender();\n }\n\n private handleSubjectInput(data: string): void {\n const task = this.selectedTask();\n if (data === KEY_ENTER || data === KEY_NEWLINE) {\n this.mode = 'browse';\n if (task) this.commit({ id: task.id, subject: this.draft });\n } else if (matchesKey(data, 'escape')) this.mode = 'browse';\n else if (data === KEY_BACKSPACE) this.draft = this.draft.slice(0, -1);\n else if (!isControlInput(data)) this.draft += data;\n this.tui.requestRender();\n }\n\n handleInput(data: string): void {\n if (this.mode === 'status') {\n this.handleStatusInput(data);\n return;\n }\n if (this.mode === 'subject') {\n this.handleSubjectInput(data);\n return;\n }\n\n if (matchesKey(data, 'escape') || matchesKey(data, 'ctrl+c')) {\n this.done(undefined);\n return;\n }\n if (matchesKey(data, 'up')) {\n this.move(-1);\n return;\n }\n if (matchesKey(data, 'down')) {\n this.move(1);\n return;\n }\n\n const task = this.selectedTask();\n if (!task) return;\n if (data === 's') {\n this.mode = 'status';\n this.statusIndex = Math.max(0, TASK_STATUSES.indexOf(task.status));\n this.tui.requestRender();\n return;\n }\n if (data === KEY_ENTER || data === KEY_NEWLINE) {\n this.mode = 'subject';\n this.draft = task.subject;\n this.tui.requestRender();\n }\n }\n\n /**\n * A padded, background-filled chip. Foreground is applied inside the fill so\n * the colour closes with it, rather than a reset stripping the background\n * partway through the label.\n */\n private badge(text: string, background: ThemeBg, colour: ThemeColor = 'text'): string {\n return this.theme.bg(background, this.theme.fg(colour, ` ${text} `));\n }\n\n /** Footer hints as capped keys: `[ enter ] edit subject`, per the mockup. */\n private hintLine(hints: readonly (readonly [string, string])[]): string {\n return hints\n .map(([key, label]) => `${this.badge(key, 'selectedBg')}${this.theme.fg('dim', ` ${label}`)}`)\n .join(this.theme.fg('dim', ' '));\n }\n\n private listLines(width: number): string[] {\n const tasks = this.tasks();\n const label = this.theme.bold('TASKS');\n const pathWidth = Math.max(0, width - visibleWidth('TASKS') - 2);\n const lines = [`${label} ${this.theme.fg('dim', storeLabel(this.options.store.storePath, pathWidth))}`, ''];\n if (tasks.length === 0) {\n lines.push(this.theme.fg('dim', MSG_NO_TASKS));\n return lines;\n }\n\n // Two rows per task: at a third of the width a single row left the subject\n // with a handful of columns once owner and state took their share.\n const budget = Math.max(1, Math.floor((this.bodyHeight - lines.length) / ROWS_PER_TASK));\n const start = Math.max(0, Math.min(this.selected - budget + 1, Math.max(0, tasks.length - budget)));\n for (const [offset, task] of tasks.slice(start, start + budget).entries()) {\n const index = start + offset;\n const active = index === Math.min(this.selected, tasks.length - 1);\n const marker = active ? this.theme.fg('accent', SELECTION_MARKER) : ' ';\n const subject = active ? this.theme.bold(task.subject) : task.subject;\n const glyph = overlayStatusGlyph(task.status, this.theme);\n const owner = task.owner ?? task.delegation?.agent ?? NO_VALUE;\n const blocked = task.status === 'pending' && isBlocked(this.options.store.snapshot.tasks, task);\n const state = blocked\n ? this.theme.fg('warning', `blocked by ${(task.blockedBy ?? []).map((id) => `#${id}`).join(', ')}`)\n : this.theme.fg('dim', STATUS_LABEL[task.status]);\n // Subject owns the first row outright; the metadata hangs under it.\n const heading = `${marker} ${glyph} ${this.theme.fg('dim', `#${task.id}`)} ${subject}`;\n const meta = `${' '.repeat(META_INDENT)}${this.badge(owner, 'userMessageBg', 'muted')} ${state}`;\n // Every task sits on a band, the selected one a shade lighter, as in the\n // mockup; the marker stays so selection survives themes with no background.\n const background: ThemeBg = active ? 'selectedBg' : 'userMessageBg';\n for (const row of [heading, meta]) {\n lines.push(this.theme.bg(background, fitRow(row, width)));\n }\n }\n return lines;\n }\n\n private statusLines(task: Task, width: number): string[] {\n if (this.mode !== 'status') {\n const glyph = overlayStatusGlyph(task.status, this.theme);\n return [this.theme.fg('dim', 'STATUS'), `${glyph} ${STATUS_LABEL[task.status]}`];\n }\n // Editing draws the picker as a filled panel, so the whole option list reads\n // as one surface rather than five loose rows.\n const lines = [this.theme.fg('dim', STATUS_HINT)];\n for (const [index, status] of TASK_STATUSES.entries()) {\n const selected = index === this.statusIndex;\n const marker = selected ? this.theme.fg('accent', CURRENT_MARKER) : ' ';\n const label = selected ? this.theme.bold(this.theme.fg('accent', status)) : this.theme.fg('muted', status);\n const current = status === task.status ? this.theme.fg('dim', 'current') : '';\n const row = rightAligned(` ${marker} ${label}`, current, width);\n lines.push(this.theme.bg(selected ? 'selectedBg' : 'userMessageBg', row));\n }\n return lines;\n }\n\n /** The subject as an input: a filled field with a caret, as in the mockup. */\n private subjectField(task: Task, width: number): string[] {\n const editing = this.mode === 'subject';\n const value = editing ? `${this.draft}${CURSOR_BLOCK}` : task.subject;\n return [\n this.theme.fg('dim', editing ? SUBJECT_HINT : 'SUBJECT'),\n this.theme.bg(editing ? 'selectedBg' : 'userMessageBg', fitRow(` ${value}`, width)),\n ];\n }\n\n private detailLines(width: number): string[] {\n const task = this.selectedTask();\n if (!task) return [this.theme.fg('dim', 'No task selected')];\n\n const editing = this.mode === 'subject' || this.mode === 'status';\n const badge = editing ? this.badge('EDIT', 'toolSuccessBg', 'warning') : '';\n const lines = [rightAligned(this.theme.bold(this.theme.fg('accent', `TASK #${task.id}`)), badge, width), ''];\n lines.push(...this.subjectField(task, width));\n lines.push('', ...this.statusLines(task, width), '');\n\n if (task.activeForm) lines.push(this.theme.fg('dim', 'ACTIVE FORM'), task.activeForm, '');\n const owner = task.owner ?? task.delegation?.agent ?? NO_VALUE;\n const delegated = task.delegation?.runId ? this.theme.fg('success', `delegated run ${task.delegation.runId}`) : '';\n lines.push(\n this.theme.fg('dim', 'OWNER'),\n delegated ? `${owner} ${this.theme.fg('dim', '·')} ${delegated}` : owner,\n '',\n );\n lines.push(\n this.theme.fg('dim', 'BLOCKED BY'),\n task.blockedBy?.length ? task.blockedBy.map((id) => `#${id}`).join(' · ') : NO_VALUE,\n );\n if (task.description) lines.push('', this.theme.fg('dim', 'DESCRIPTION'), ...wrap(task.description, width));\n if (this.notice) lines.push('', this.theme.fg('error', this.notice));\n return lines;\n }\n\n private headerSummary(): string {\n const counts = countTasks(this.options.store.snapshot.tasks);\n const summary = [`${counts.completed}/${counts.total} completed`];\n if (counts.inProgress > 0) summary.push(`${counts.inProgress} in progress`);\n if (counts.blocked > 0) summary.push(`${counts.blocked} blocked`);\n if (counts.failed > 0) summary.push(`${counts.failed} failed`);\n return summary.join(' · ');\n }\n\n protected getChrome(): DoomOverlayChrome {\n return {\n title: TITLE,\n accent: DOOM_OVERLAY_ACCENT,\n breadcrumb: BREADCRUMB,\n headerRight: `${this.headerSummary()} · ${LIST_HEADER_RIGHT}`,\n footer: this.hintLine(LIST_HINTS),\n };\n }\n\n protected renderBody(width: number, height: number): string[] {\n this.bodyHeight = height;\n if (width < MIN_WIDTH) return this.renderStacked(width, height);\n\n const leftWidth = Math.max(MIN_PANE_WIDTH, Math.floor((width - 1) * LIST_PANE_RATIO));\n const rightWidth = Math.max(1, width - leftWidth - 1);\n // Each column gives up one column to the gutter, so content never abuts the\n // divider: a long store path used to run straight into the detail heading.\n const leftContent = Math.max(1, leftWidth - PANE_GUTTER);\n const rightContent = Math.max(1, rightWidth - PANE_GUTTER);\n const left = this.listLines(leftContent);\n const right = this.detailLines(rightContent);\n\n const divider = this.theme.fg('borderMuted', '│');\n return Array.from({ length: height }, (_, index) => {\n const row = `${fitRow(left[index] ?? '', leftContent)} ${divider} ${fitRow(right[index] ?? '', rightContent)}`;\n return truncateToWidth(row, width, ELLIPSIS);\n });\n }\n\n private renderStacked(width: number, height: number): string[] {\n const topHeight = Math.max(1, Math.floor((height - 1) / 2));\n const bottomHeight = Math.max(0, height - topHeight - 1);\n this.bodyHeight = topHeight;\n const top = this.listLines(width);\n const bottom = this.detailLines(width);\n return [\n ...top.slice(0, topHeight),\n ...Array.from({ length: Math.max(0, topHeight - top.length) }, () => ''),\n this.theme.fg('borderMuted', '─'.repeat(width)),\n ...bottom.slice(0, bottomHeight),\n ];\n }\n\n dispose(): void {\n this.unwatch();\n }\n}\n\nexport async function openTaskSpace(ctx: ExtensionContext, options: TaskSpaceOptions): Promise<void> {\n await ctx.ui.custom<undefined>(\n (tui, theme, _keybindings, done) => new TaskSpaceComponent(tui, theme, options, done),\n DOOM_FULLSCREEN_UI_OPTIONS,\n );\n}\n\nexport default openTaskSpace;\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"taskOverlay.cjs","names":["resolveCollapseKey","visibleTasks","deriveTaskProjection","truncateToWidth","selectOverlayLayoutFromProjection","getMaxWidgetLines","allocateAgentIdentityColor","formatOverlayTaskLine"],"sources":["../../../../../../../../src/extensions/workspaces/sessions/(frontend)/overlay/_lib/taskOverlay.ts"],"sourcesContent":["import { allocateAgentIdentityColor } from '@agimon-ai/doompi-ui/theme';\nimport type { ExtensionAPI, ExtensionContext, ExtensionUIContext, Theme } from '@earendil-works/pi-coding-agent';\nimport type { KeyId } from '@earendil-works/pi-tui';\nimport { type TUI, truncateToWidth } from '@earendil-works/pi-tui';\n\nimport type { Task } from '../../../../../../models/task';\nimport { COLLAPSE_KEY_OFF, getMaxWidgetLines, resolveCollapseKey } from '../../../../../../services/config';\nimport type { DelegationManager } from '../../../../../../services/delegation';\nimport { formatOverlayTaskLine } from '../../_shared/format.cli';\nimport { deriveTaskProjection, selectOverlayLayoutFromProjection, visibleTasks } from './selectors';\n\nconst WIDGET_KEY = 'doom-tasks';\nconst OVERLAY_HEADING = 'Tasks';\nconst PROGRESS_TICK_MS = 1000;\n\nexport interface TaskOverlayOptions {\n getTasks: () => readonly Task[];\n delegation: DelegationManager;\n}\n\n/** The widget owns its collapse key, while the session root owns its lifetime. */\nexport function registerTaskCollapseShortcut(\n pi: Pick<ExtensionAPI, 'registerShortcut'>,\n overlay: TaskOverlay,\n waitUntilReady: (context: ExtensionContext) => Promise<void>,\n isActive: () => boolean,\n): void {\n const key = resolveCollapseKey();\n if (key === COLLAPSE_KEY_OFF) return;\n pi.registerShortcut(key as KeyId, {\n description: 'Collapse or expand the task overlay',\n handler: async (context) => {\n if (!isActive() || !context.hasUI) return;\n await waitUntilReady(context);\n if (!isActive() || !overlay.isRegistered()) return;\n overlay.toggleCollapse();\n },\n });\n}\n\n/**\n * Persistent widget listing tasks above the editor.\n *\n * Registered once per UI context and refreshed with `requestRender()`; it\n * auto-hides when there is nothing to show so an idle session keeps a clean\n * prompt.\n */\nexport class TaskOverlay {\n private readonly options: TaskOverlayOptions;\n private uiCtx: ExtensionUIContext | undefined;\n private widgetRegistered = false;\n private tui: TUI | undefined;\n private progressTimer: NodeJS.Timeout | undefined;\n private collapsed = false;\n\n constructor(options: TaskOverlayOptions) {\n this.options = options;\n }\n\n /** Identity-compare so repeated session_start handlers stay idempotent. */\n setUICtx(ctx: ExtensionUIContext): void {\n if (ctx === this.uiCtx) return;\n if (this.uiCtx && this.widgetRegistered) this.uiCtx.setWidget(WIDGET_KEY, undefined);\n this.stopProgressTimer();\n this.uiCtx = ctx;\n this.widgetRegistered = false;\n this.tui = undefined;\n }\n\n update(): void {\n if (!this.uiCtx) {\n this.stopProgressTimer();\n return;\n }\n const tasks = visibleTasks(this.options.getTasks());\n\n if (tasks.length === 0) {\n if (this.widgetRegistered) {\n this.uiCtx.setWidget(WIDGET_KEY, undefined);\n this.widgetRegistered = false;\n this.tui = undefined;\n }\n this.stopProgressTimer();\n return;\n }\n\n if (this.widgetRegistered) {\n this.syncProgressTimer(tasks);\n this.tui?.requestRender();\n return;\n }\n\n this.uiCtx.setWidget(\n WIDGET_KEY,\n (tui, factoryTheme) => {\n this.tui = tui;\n return {\n render: (width: number) => this.renderWidget(this.uiCtx?.theme ?? factoryTheme, width),\n invalidate: () => {\n // Nothing is cached: the next render reads the live theme and store.\n },\n };\n },\n { placement: 'aboveEditor' },\n );\n this.widgetRegistered = true;\n this.syncProgressTimer(tasks);\n }\n\n private syncProgressTimer(tasks: readonly Task[]): void {\n const hasRunningDelegation = tasks.some(\n (task) => task.status !== 'deleted' && task.delegation?.state === 'running',\n );\n if (this.collapsed || !this.widgetRegistered || !hasRunningDelegation) {\n this.stopProgressTimer();\n return;\n }\n if (this.progressTimer) return;\n this.progressTimer = setInterval(() => this.tui?.requestRender(), PROGRESS_TICK_MS);\n this.progressTimer.unref?.();\n }\n\n private stopProgressTimer(): void {\n if (this.progressTimer) clearInterval(this.progressTimer);\n this.progressTimer = undefined;\n }\n\n toggleCollapse(): void {\n this.collapsed = !this.collapsed;\n this.syncProgressTimer(this.options.getTasks());\n // Forced redraw: collapsing changes the widget height, not just its content.\n this.tui?.requestRender(true);\n }\n\n isRegistered(): boolean {\n return this.widgetRegistered;\n }\n\n private renderWidget(theme: Theme, width: number): string[] {\n const projection = deriveTaskProjection(this.options.getTasks());\n if (projection.visible.length === 0) return [];\n\n const truncate = (line: string): string => truncateToWidth(line, width, '…');\n const headingColor = projection.hasActiveWork ? 'accent' : 'dim';\n const headingIcon = projection.hasActiveWork ? '●' : '○';\n let headingText = `${OVERLAY_HEADING} (${projection.counts.completed}/${projection.counts.total})`;\n if (projection.counts.failed > 0) headingText += ` · ${projection.counts.failed} failed`;\n const heading = truncate(`${theme.fg(headingColor, headingIcon)} ${theme.fg(headingColor, headingText)}`);\n\n if (this.collapsed) {\n const key = resolveCollapseKey();\n const hint = key === COLLAPSE_KEY_OFF ? 'collapsed' : `${key} to expand`;\n return this.withTrailingSpacer([heading, truncate(`${theme.fg('dim', '└─')} ${theme.fg('dim', hint)}`)]);\n }\n\n const layout = selectOverlayLayoutFromProjection(projection, getMaxWidgetLines() - 1);\n const occupiedColors = new Set<ReturnType<typeof allocateAgentIdentityColor>>();\n const agentColors = new Map<string, ReturnType<typeof allocateAgentIdentityColor>>();\n for (const task of layout.visible) {\n if (task.delegation?.state !== 'running') continue;\n const identity = task.delegation.runId ?? task.delegation.requestId;\n const color = allocateAgentIdentityColor(identity, occupiedColors);\n occupiedColors.add(color);\n agentColors.set(identity, color);\n }\n\n const nowMs = Date.now();\n const lines = [heading];\n for (const task of layout.visible) {\n const progress = this.options.delegation.progressFor(task);\n const identity = task.delegation?.runId ?? task.delegation?.requestId;\n lines.push(\n truncate(\n `${theme.fg('dim', '├─')} ${formatOverlayTaskLine(\n task,\n theme,\n projection.showIds,\n progress,\n nowMs,\n identity ? agentColors.get(identity) : undefined,\n )}`,\n ),\n );\n }\n\n const hidden = layout.hiddenCompleted + layout.truncatedTail;\n if (hidden === 0) {\n const last = lines.length - 1;\n lines[last] = lines[last].replace('├─', '└─');\n return this.withTrailingSpacer(lines);\n }\n\n const parts: string[] = [];\n if (layout.hiddenCompleted > 0) parts.push(`${layout.hiddenCompleted} completed`);\n if (layout.truncatedTail > 0) parts.push(`${layout.truncatedTail} pending`);\n const summary = parts.length > 0 ? `+${hidden} more (${parts.join(', ')})` : `+${hidden} more`;\n lines.push(truncate(`${theme.fg('dim', '└─')} ${theme.fg('dim', summary)}`));\n return this.withTrailingSpacer(lines);\n }\n\n /** Pi adds a spacer above the widget but none below, which glues the last row to the input box. */\n private withTrailingSpacer(lines: string[]): string[] {\n if (lines.length === 0) return lines;\n lines.push('');\n return lines;\n }\n\n dispose(): void {\n this.stopProgressTimer();\n if (this.uiCtx) this.uiCtx.setWidget(WIDGET_KEY, undefined);\n this.widgetRegistered = false;\n this.tui = undefined;\n this.uiCtx = undefined;\n this.collapsed = false;\n }\n}\n"],"mappings":"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"}
|
package/dist/src/extensions/workspaces/sessions/(frontend)/overlay/_lib/taskOverlay.d.cts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"taskOverlay.d.cts","names":[],"sources":["../../../../../../../../src/extensions/workspaces/sessions/(frontend)/overlay/_lib/taskOverlay.ts"],"mappings":";;;;iBAeiB;EACf,yBAAyB;EACzB,YAAY;;;wBAIE,6BACd,IAAI,KAAK,mCACT,SAAS,aACT,iBAAiB,SAAS,qBAAqB,eAC/C;;;;;;;;qBAsBW;mBACM;UACT;UACA;UACA;UACA;UACA;EAER,YAAY,SAAS;;EAKrB,SAAS,KAAK;EASd;UAwCQ;UAaA;EAKR;EAOA;UAIQ;;UA+DA;EAMR"}
|
|
@@ -1,39 +0,0 @@
|
|
|
1
|
-
import { Task } from "../../../../../../models/task.mjs";
|
|
2
|
-
import { DelegationManager } from "../../../../../../services/delegation/index.mjs";
|
|
3
|
-
import { ExtensionAPI, ExtensionContext, ExtensionUIContext } from "@earendil-works/pi-coding-agent";
|
|
4
|
-
//#region src/extensions/workspaces/sessions/(frontend)/overlay/_lib/taskOverlay.d.ts
|
|
5
|
-
export interface TaskOverlayOptions {
|
|
6
|
-
getTasks: () => readonly Task[];
|
|
7
|
-
delegation: DelegationManager;
|
|
8
|
-
}
|
|
9
|
-
/** The widget owns its collapse key, while the session root owns its lifetime. */
|
|
10
|
-
export declare function registerTaskCollapseShortcut(pi: Pick<ExtensionAPI, 'registerShortcut'>, overlay: TaskOverlay, waitUntilReady: (context: ExtensionContext) => Promise<void>, isActive: () => boolean): void;
|
|
11
|
-
/**
|
|
12
|
-
* Persistent widget listing tasks above the editor.
|
|
13
|
-
*
|
|
14
|
-
* Registered once per UI context and refreshed with `requestRender()`; it
|
|
15
|
-
* auto-hides when there is nothing to show so an idle session keeps a clean
|
|
16
|
-
* prompt.
|
|
17
|
-
*/
|
|
18
|
-
export declare class TaskOverlay {
|
|
19
|
-
private readonly options;
|
|
20
|
-
private uiCtx;
|
|
21
|
-
private widgetRegistered;
|
|
22
|
-
private tui;
|
|
23
|
-
private progressTimer;
|
|
24
|
-
private collapsed;
|
|
25
|
-
constructor(options: TaskOverlayOptions);
|
|
26
|
-
/** Identity-compare so repeated session_start handlers stay idempotent. */
|
|
27
|
-
setUICtx(ctx: ExtensionUIContext): void;
|
|
28
|
-
update(): void;
|
|
29
|
-
private syncProgressTimer;
|
|
30
|
-
private stopProgressTimer;
|
|
31
|
-
toggleCollapse(): void;
|
|
32
|
-
isRegistered(): boolean;
|
|
33
|
-
private renderWidget;
|
|
34
|
-
/** Pi adds a spacer above the widget but none below, which glues the last row to the input box. */
|
|
35
|
-
private withTrailingSpacer;
|
|
36
|
-
dispose(): void;
|
|
37
|
-
}
|
|
38
|
-
//#endregion
|
|
39
|
-
//# sourceMappingURL=taskOverlay.d.mts.map
|
package/dist/src/extensions/workspaces/sessions/(frontend)/overlay/_lib/taskOverlay.d.mts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"taskOverlay.d.mts","names":[],"sources":["../../../../../../../../src/extensions/workspaces/sessions/(frontend)/overlay/_lib/taskOverlay.ts"],"mappings":";;;;iBAeiB;EACf,yBAAyB;EACzB,YAAY;;;wBAIE,6BACd,IAAI,KAAK,mCACT,SAAS,aACT,iBAAiB,SAAS,qBAAqB,eAC/C;;;;;;;;qBAsBW;mBACM;UACT;UACA;UACA;UACA;UACA;EAER,YAAY,SAAS;;EAKrB,SAAS,KAAK;EASd;UAwCQ;UAaA;EAKR;EAOA;UAIQ;;UA+DA;EAMR"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"taskOverlay.mjs","names":[],"sources":["../../../../../../../../src/extensions/workspaces/sessions/(frontend)/overlay/_lib/taskOverlay.ts"],"sourcesContent":["import { allocateAgentIdentityColor } from '@agimon-ai/doompi-ui/theme';\nimport type { ExtensionAPI, ExtensionContext, ExtensionUIContext, Theme } from '@earendil-works/pi-coding-agent';\nimport type { KeyId } from '@earendil-works/pi-tui';\nimport { type TUI, truncateToWidth } from '@earendil-works/pi-tui';\n\nimport type { Task } from '../../../../../../models/task';\nimport { COLLAPSE_KEY_OFF, getMaxWidgetLines, resolveCollapseKey } from '../../../../../../services/config';\nimport type { DelegationManager } from '../../../../../../services/delegation';\nimport { formatOverlayTaskLine } from '../../_shared/format.cli';\nimport { deriveTaskProjection, selectOverlayLayoutFromProjection, visibleTasks } from './selectors';\n\nconst WIDGET_KEY = 'doom-tasks';\nconst OVERLAY_HEADING = 'Tasks';\nconst PROGRESS_TICK_MS = 1000;\n\nexport interface TaskOverlayOptions {\n getTasks: () => readonly Task[];\n delegation: DelegationManager;\n}\n\n/** The widget owns its collapse key, while the session root owns its lifetime. */\nexport function registerTaskCollapseShortcut(\n pi: Pick<ExtensionAPI, 'registerShortcut'>,\n overlay: TaskOverlay,\n waitUntilReady: (context: ExtensionContext) => Promise<void>,\n isActive: () => boolean,\n): void {\n const key = resolveCollapseKey();\n if (key === COLLAPSE_KEY_OFF) return;\n pi.registerShortcut(key as KeyId, {\n description: 'Collapse or expand the task overlay',\n handler: async (context) => {\n if (!isActive() || !context.hasUI) return;\n await waitUntilReady(context);\n if (!isActive() || !overlay.isRegistered()) return;\n overlay.toggleCollapse();\n },\n });\n}\n\n/**\n * Persistent widget listing tasks above the editor.\n *\n * Registered once per UI context and refreshed with `requestRender()`; it\n * auto-hides when there is nothing to show so an idle session keeps a clean\n * prompt.\n */\nexport class TaskOverlay {\n private readonly options: TaskOverlayOptions;\n private uiCtx: ExtensionUIContext | undefined;\n private widgetRegistered = false;\n private tui: TUI | undefined;\n private progressTimer: NodeJS.Timeout | undefined;\n private collapsed = false;\n\n constructor(options: TaskOverlayOptions) {\n this.options = options;\n }\n\n /** Identity-compare so repeated session_start handlers stay idempotent. */\n setUICtx(ctx: ExtensionUIContext): void {\n if (ctx === this.uiCtx) return;\n if (this.uiCtx && this.widgetRegistered) this.uiCtx.setWidget(WIDGET_KEY, undefined);\n this.stopProgressTimer();\n this.uiCtx = ctx;\n this.widgetRegistered = false;\n this.tui = undefined;\n }\n\n update(): void {\n if (!this.uiCtx) {\n this.stopProgressTimer();\n return;\n }\n const tasks = visibleTasks(this.options.getTasks());\n\n if (tasks.length === 0) {\n if (this.widgetRegistered) {\n this.uiCtx.setWidget(WIDGET_KEY, undefined);\n this.widgetRegistered = false;\n this.tui = undefined;\n }\n this.stopProgressTimer();\n return;\n }\n\n if (this.widgetRegistered) {\n this.syncProgressTimer(tasks);\n this.tui?.requestRender();\n return;\n }\n\n this.uiCtx.setWidget(\n WIDGET_KEY,\n (tui, factoryTheme) => {\n this.tui = tui;\n return {\n render: (width: number) => this.renderWidget(this.uiCtx?.theme ?? factoryTheme, width),\n invalidate: () => {\n // Nothing is cached: the next render reads the live theme and store.\n },\n };\n },\n { placement: 'aboveEditor' },\n );\n this.widgetRegistered = true;\n this.syncProgressTimer(tasks);\n }\n\n private syncProgressTimer(tasks: readonly Task[]): void {\n const hasRunningDelegation = tasks.some(\n (task) => task.status !== 'deleted' && task.delegation?.state === 'running',\n );\n if (this.collapsed || !this.widgetRegistered || !hasRunningDelegation) {\n this.stopProgressTimer();\n return;\n }\n if (this.progressTimer) return;\n this.progressTimer = setInterval(() => this.tui?.requestRender(), PROGRESS_TICK_MS);\n this.progressTimer.unref?.();\n }\n\n private stopProgressTimer(): void {\n if (this.progressTimer) clearInterval(this.progressTimer);\n this.progressTimer = undefined;\n }\n\n toggleCollapse(): void {\n this.collapsed = !this.collapsed;\n this.syncProgressTimer(this.options.getTasks());\n // Forced redraw: collapsing changes the widget height, not just its content.\n this.tui?.requestRender(true);\n }\n\n isRegistered(): boolean {\n return this.widgetRegistered;\n }\n\n private renderWidget(theme: Theme, width: number): string[] {\n const projection = deriveTaskProjection(this.options.getTasks());\n if (projection.visible.length === 0) return [];\n\n const truncate = (line: string): string => truncateToWidth(line, width, '…');\n const headingColor = projection.hasActiveWork ? 'accent' : 'dim';\n const headingIcon = projection.hasActiveWork ? '●' : '○';\n let headingText = `${OVERLAY_HEADING} (${projection.counts.completed}/${projection.counts.total})`;\n if (projection.counts.failed > 0) headingText += ` · ${projection.counts.failed} failed`;\n const heading = truncate(`${theme.fg(headingColor, headingIcon)} ${theme.fg(headingColor, headingText)}`);\n\n if (this.collapsed) {\n const key = resolveCollapseKey();\n const hint = key === COLLAPSE_KEY_OFF ? 'collapsed' : `${key} to expand`;\n return this.withTrailingSpacer([heading, truncate(`${theme.fg('dim', '└─')} ${theme.fg('dim', hint)}`)]);\n }\n\n const layout = selectOverlayLayoutFromProjection(projection, getMaxWidgetLines() - 1);\n const occupiedColors = new Set<ReturnType<typeof allocateAgentIdentityColor>>();\n const agentColors = new Map<string, ReturnType<typeof allocateAgentIdentityColor>>();\n for (const task of layout.visible) {\n if (task.delegation?.state !== 'running') continue;\n const identity = task.delegation.runId ?? task.delegation.requestId;\n const color = allocateAgentIdentityColor(identity, occupiedColors);\n occupiedColors.add(color);\n agentColors.set(identity, color);\n }\n\n const nowMs = Date.now();\n const lines = [heading];\n for (const task of layout.visible) {\n const progress = this.options.delegation.progressFor(task);\n const identity = task.delegation?.runId ?? task.delegation?.requestId;\n lines.push(\n truncate(\n `${theme.fg('dim', '├─')} ${formatOverlayTaskLine(\n task,\n theme,\n projection.showIds,\n progress,\n nowMs,\n identity ? agentColors.get(identity) : undefined,\n )}`,\n ),\n );\n }\n\n const hidden = layout.hiddenCompleted + layout.truncatedTail;\n if (hidden === 0) {\n const last = lines.length - 1;\n lines[last] = lines[last].replace('├─', '└─');\n return this.withTrailingSpacer(lines);\n }\n\n const parts: string[] = [];\n if (layout.hiddenCompleted > 0) parts.push(`${layout.hiddenCompleted} completed`);\n if (layout.truncatedTail > 0) parts.push(`${layout.truncatedTail} pending`);\n const summary = parts.length > 0 ? `+${hidden} more (${parts.join(', ')})` : `+${hidden} more`;\n lines.push(truncate(`${theme.fg('dim', '└─')} ${theme.fg('dim', summary)}`));\n return this.withTrailingSpacer(lines);\n }\n\n /** Pi adds a spacer above the widget but none below, which glues the last row to the input box. */\n private withTrailingSpacer(lines: string[]): string[] {\n if (lines.length === 0) return lines;\n lines.push('');\n return lines;\n }\n\n dispose(): void {\n this.stopProgressTimer();\n if (this.uiCtx) this.uiCtx.setWidget(WIDGET_KEY, undefined);\n this.widgetRegistered = false;\n this.tui = undefined;\n this.uiCtx = undefined;\n this.collapsed = false;\n }\n}\n"],"mappings":"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"}
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
const require_format_cli = require("../../_shared/format.cli.cjs");
|
|
2
|
-
let _agimon_ai_doompi_core_pi_extension = require("@agimon-ai/doompi-core/pi-extension");
|
|
3
|
-
//#region src/extensions/workspaces/sessions/(frontend)/tool/_lib/task.cli.ts
|
|
4
|
-
/** Pair the tool presentation with the same session store used by execution. */
|
|
5
|
-
var task_cli_default = (context) => (0, _agimon_ai_doompi_core_pi_extension.definePiToolRenderer)({
|
|
6
|
-
renderShell: "self",
|
|
7
|
-
renderCall: (params, theme) => require_format_cli.renderTaskCall(params, theme, context.root.taskStore.snapshot.tasks),
|
|
8
|
-
renderResult: require_format_cli.renderTaskResult
|
|
9
|
-
});
|
|
10
|
-
//#endregion
|
|
11
|
-
exports.default = task_cli_default;
|
|
12
|
-
|
|
13
|
-
//# sourceMappingURL=task.cli.cjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"task.cli.cjs","names":["definePiToolRenderer","renderTaskCall","renderTaskResult"],"sources":["../../../../../../../../src/extensions/workspaces/sessions/(frontend)/tool/_lib/task.cli.ts"],"sourcesContent":["import type { WithRoot } from '@agimon-ai/doompi-core/extension-file';\nimport { definePiToolRenderer, type PiPluginContext } from '@agimon-ai/doompi-core/pi-extension';\n\nimport type { TaskStore } from '../../../../../../services/taskStore';\nimport { renderTaskCall, renderTaskResult } from '../../_shared/format.cli';\n\n/** Pair the tool presentation with the same session store used by execution. */\nexport default (context: WithRoot<PiPluginContext, { taskStore: TaskStore }>) =>\n definePiToolRenderer({\n renderShell: 'self',\n renderCall: (params, theme) => renderTaskCall(params as never, theme, context.root.taskStore.snapshot.tasks),\n renderResult: renderTaskResult,\n });\n"],"mappings":";;;;AAOA,IAAA,oBAAgB,aAAA,GACdA,oCAAAA,qBAAAA,CAAqB;CACnB,aAAa;CACb,aAAa,QAAQ,UAAUC,mBAAAA,eAAe,QAAiB,OAAO,QAAQ,KAAK,UAAU,SAAS,KAAK;CAC3G,cAAcC,mBAAAA;AAChB,CAAC"}
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
import { renderTaskCall, renderTaskResult } from "../../_shared/format.cli.mjs";
|
|
2
|
-
import { definePiToolRenderer } from "@agimon-ai/doompi-core/pi-extension";
|
|
3
|
-
//#region src/extensions/workspaces/sessions/(frontend)/tool/_lib/task.cli.ts
|
|
4
|
-
/** Pair the tool presentation with the same session store used by execution. */
|
|
5
|
-
var task_cli_default = (context) => definePiToolRenderer({
|
|
6
|
-
renderShell: "self",
|
|
7
|
-
renderCall: (params, theme) => renderTaskCall(params, theme, context.root.taskStore.snapshot.tasks),
|
|
8
|
-
renderResult: renderTaskResult
|
|
9
|
-
});
|
|
10
|
-
//#endregion
|
|
11
|
-
export { task_cli_default as default };
|
|
12
|
-
|
|
13
|
-
//# sourceMappingURL=task.cli.mjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"task.cli.mjs","names":[],"sources":["../../../../../../../../src/extensions/workspaces/sessions/(frontend)/tool/_lib/task.cli.ts"],"sourcesContent":["import type { WithRoot } from '@agimon-ai/doompi-core/extension-file';\nimport { definePiToolRenderer, type PiPluginContext } from '@agimon-ai/doompi-core/pi-extension';\n\nimport type { TaskStore } from '../../../../../../services/taskStore';\nimport { renderTaskCall, renderTaskResult } from '../../_shared/format.cli';\n\n/** Pair the tool presentation with the same session store used by execution. */\nexport default (context: WithRoot<PiPluginContext, { taskStore: TaskStore }>) =>\n definePiToolRenderer({\n renderShell: 'self',\n renderCall: (params, theme) => renderTaskCall(params as never, theme, context.root.taskStore.snapshot.tasks),\n renderResult: renderTaskResult,\n });\n"],"mappings":";;;;AAOA,IAAA,oBAAgB,YACd,qBAAqB;CACnB,aAAa;CACb,aAAa,QAAQ,UAAU,eAAe,QAAiB,OAAO,QAAQ,KAAK,UAAU,SAAS,KAAK;CAC3G,cAAc;AAChB,CAAC"}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
const require_task_cli = require("./_lib/task.cli.cjs");
|
|
2
|
-
//#region src/extensions/workspaces/sessions/(frontend)/tool/task.cli.ts
|
|
3
|
-
var task_cli_default = (0, require("@agimon-ai/doompi-core/pi-extension").defineCliToolRenderer)(require_task_cli.default);
|
|
4
|
-
//#endregion
|
|
5
|
-
exports.default = task_cli_default;
|
|
6
|
-
|
|
7
|
-
//# sourceMappingURL=task.cli.cjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"task.cli.cjs","names":["defineCliToolRenderer","contribution"],"sources":["../../../../../../../src/extensions/workspaces/sessions/(frontend)/tool/task.cli.ts"],"sourcesContent":["import { defineCliToolRenderer } from '@agimon-ai/doompi-core/pi-extension';\n\nimport contribution from './_lib/task.cli';\n\nexport default defineCliToolRenderer(contribution);\n"],"mappings":";;AAIA,IAAA,oBAAA,gDAAeA,CAAAA,CAAAA,sBAAAA,CAAsBC,iBAAAA,OAAY"}
|
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
import task_cli_default$1 from "./_lib/task.cli.mjs";
|
|
2
|
-
import { defineCliToolRenderer } from "@agimon-ai/doompi-core/pi-extension";
|
|
3
|
-
//#region src/extensions/workspaces/sessions/(frontend)/tool/task.cli.ts
|
|
4
|
-
var task_cli_default = defineCliToolRenderer(task_cli_default$1);
|
|
5
|
-
//#endregion
|
|
6
|
-
export { task_cli_default as default };
|
|
7
|
-
|
|
8
|
-
//# sourceMappingURL=task.cli.mjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"task.cli.mjs","names":["contribution"],"sources":["../../../../../../../src/extensions/workspaces/sessions/(frontend)/tool/task.cli.ts"],"sourcesContent":["import { defineCliToolRenderer } from '@agimon-ai/doompi-core/pi-extension';\n\nimport contribution from './_lib/task.cli';\n\nexport default defineCliToolRenderer(contribution);\n"],"mappings":";;;AAIA,IAAA,mBAAe,sBAAsBA,kBAAY"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"task.cjs","names":[],"sources":["../../../src/models/task.ts"],"sourcesContent":["/**\n * Domain types for the file-backed task store.\n *\n * The on-disk document is the durable source of truth (unlike rpiv-todo, which\n * replayed state from the transcript). Every field here round-trips through\n * JSON, so nothing may hold non-serializable values.\n */\n\nimport type { InlineAgent } from '@agimon-ai/doompi-core/delegation';\n\nexport type TaskStatus = 'pending' | 'in_progress' | 'completed' | 'failed' | 'deleted';\n\nexport const DELETED_STATUS: TaskStatus = 'deleted';\n\nexport type TaskAction = 'upsert' | 'list' | 'get' | 'delete' | 'clear' | 'assign' | 'cancel';\n\nexport type DelegationState = 'requested' | 'running' | 'completed' | 'failed' | 'cancelled';\n\n/** Terminal result of a delegated subagent run, copied off the delegation response. */\nexport interface DelegationResult {\n status: string;\n output?: string;\n outputPath?: string;\n sessionFile?: string;\n error?: string;\n durationMs?: number;\n toolCount?: number;\n}\n\n/**\n * Delegation bookkeeping attached to a task that was handed to a subagent.\n *\n * `pid` is the harness process that owns the run: it is the only way to tell an\n * genuinely-running delegation from one orphaned by a harness crash, since the\n * child dies with its parent but the file survives.\n */\nexport interface TaskDelegation {\n requestId: string;\n agent: string;\n state: DelegationState;\n sessionId?: string;\n pid?: number;\n runId?: string;\n model?: string;\n startedAt?: string;\n endedAt?: string;\n result?: DelegationResult;\n}\n\nexport interface Task {\n id: number;\n subject: string;\n description?: string;\n activeForm?: string;\n status: TaskStatus;\n blockedBy?: number[];\n owner?: string;\n metadata?: Record<string, unknown>;\n createdAt?: string;\n updatedAt?: string;\n delegation?: TaskDelegation;\n}\n\nexport const STORE_SCHEMA_VERSION = 1;\n\n/** The complete on-disk document. `rev` increments on every committed write. */\nexport interface TaskDocument {\n version: number;\n rev: number;\n nextId: number;\n tasks: Task[];\n}\n\nexport function emptyDocument(): TaskDocument {\n return { version: STORE_SCHEMA_VERSION, rev: 0, nextId: 1, tasks: [] };\n}\n\n/**\n * A dependency target inside an upsert item: an existing task id, or the `ref`\n * of a task created earlier in the same call.\n *\n * Refs must start with a letter (see `REF_PATTERN`), so a ref is structurally\n * unconfusable with a stringified id and the discrimination is just `typeof`.\n */\nexport type DepToken = number | string;\n\n/**\n * One entry of an `upsert` call. No `id` creates a task; an `id` updates one.\n *\n * `blockedBy` (absolute set) is create-only and `addBlockedBy`/`removeBlockedBy`\n * (additive merge) are update-only, matching the split the two former actions\n * had. A field used against the wrong kind fails that item rather than being\n * silently ignored.\n */\nexport interface TaskItemMutation {\n id?: number;\n ref?: string;\n subject?: string;\n description?: string;\n activeForm?: string;\n status?: TaskStatus;\n blockedBy?: DepToken[];\n addBlockedBy?: DepToken[];\n removeBlockedBy?: DepToken[];\n owner?: string;\n metadata?: Record<string, unknown>;\n}\n\n/**\n * What one upsert item did. `index` is its position in the request array, so a\n * model reading a partial result can tell which entries still need resending.\n *\n * `message` is unprefixed: the `item[N] failed:` framing belongs to the\n * formatter, because the Task Space overlay shows this text on its own.\n */\nexport type UpsertItemOutcome =\n | {\n index: number;\n kind: 'created';\n id: number;\n subject: string;\n status: TaskStatus;\n ref?: string;\n blockedBy?: number[];\n }\n | { index: number; kind: 'updated'; id: number; fromStatus: TaskStatus; toStatus: TaskStatus }\n | { index: number; kind: 'unchanged'; id: number; status: TaskStatus }\n | { index: number; kind: 'failed'; message: string; id?: number; ref?: string };\n\n/** Which tasks an upsert touched, so renderResult names them instead of guessing. */\nexport interface UpsertSummary {\n /** Ids of applied entries, in request order. A failed entry contributes nothing. */\n applied: number[];\n failed: number;\n}\n\n/** One task-to-agent handoff inside a native assignment batch. */\nexport interface TaskAssignment {\n id: number;\n agent: string;\n inlineAgent?: InlineAgent;\n instructions?: string;\n relevantFiles?: string[];\n priorFindings?: string;\n model?: string;\n context?: 'fresh' | 'fork';\n}\n\n/** Which assignment entries started, so renderResult can show one consolidated batch. */\nexport interface AssignmentSummary {\n /** Ids of successful entries, in request order. A failed entry contributes nothing. */\n assigned: number[];\n failed: number;\n}\n\n/**\n * Open-shape input bag the reducer accepts. The index signature lets the\n * runtime pass a TypeBox `Static<typeof TaskParamsSchema>` through without\n * casting each field.\n *\n * Per-task fields live on `tasks[]`, not here: a top-level `subject` or\n * `status` would be ambiguous once one call can carry many tasks.\n */\nexport interface TaskMutationParams {\n [key: string]: unknown;\n tasks?: TaskItemMutation[];\n /** `assign` only: independent task-to-agent handoffs dispatched by one tool call. */\n assignments?: TaskAssignment[];\n /** `list` filter only. To set a status, upsert the task by id. */\n status?: TaskStatus;\n /** `get`, `delete`, and `cancel` only. Assign ids live in `assignments[]`. */\n id?: number;\n includeDeleted?: boolean;\n}\n\n/** Snapshot returned under a tool result's `details` for renderResult. */\nexport interface TaskDetails {\n action: TaskAction;\n params: Record<string, unknown>;\n tasks: Task[];\n nextId: number;\n rev: number;\n error?: string;\n upsert?: UpsertSummary;\n assignment?: AssignmentSummary;\n}\n\n/**\n * A delegation is \"live\" while the owning run may still produce a response.\n *\n * Takes the delegation shape rather than `Task` so the cockpit's `WebTask`,\n * which carries the state as a plain string, answers the question the same way\n * the store does.\n */\nexport function isDelegationActive(task: { delegation?: { state?: string } }): boolean {\n const state = task.delegation?.state;\n return state === 'requested' || state === 'running';\n}\n"],"mappings":";AAYA,MAAa,iBAA6B;AAmD1C,MAAa,uBAAuB;AAUpC,SAAgB,gBAA8B;CAC5C,OAAO;EAAE,SAAA;EAA+B,KAAK;EAAG,QAAQ;EAAG,OAAO,CAAC;CAAE;AACvE;;;;;;;;AAuHA,SAAgB,mBAAmB,MAAoD;CACrF,MAAM,QAAQ,KAAK,YAAY;CAC/B,OAAO,UAAU,eAAe,UAAU;AAC5C"}
|
|
@@ -1,186 +0,0 @@
|
|
|
1
|
-
import { InlineAgent } from "@agimon-ai/doompi-core/delegation";
|
|
2
|
-
//#region src/models/task.d.ts
|
|
3
|
-
export type TaskStatus = 'pending' | 'in_progress' | 'completed' | 'failed' | 'deleted';
|
|
4
|
-
export declare const DELETED_STATUS: TaskStatus;
|
|
5
|
-
export type TaskAction = 'upsert' | 'list' | 'get' | 'delete' | 'clear' | 'assign' | 'cancel';
|
|
6
|
-
export type DelegationState = 'requested' | 'running' | 'completed' | 'failed' | 'cancelled';
|
|
7
|
-
/** Terminal result of a delegated subagent run, copied off the delegation response. */
|
|
8
|
-
export interface DelegationResult {
|
|
9
|
-
status: string;
|
|
10
|
-
output?: string;
|
|
11
|
-
outputPath?: string;
|
|
12
|
-
sessionFile?: string;
|
|
13
|
-
error?: string;
|
|
14
|
-
durationMs?: number;
|
|
15
|
-
toolCount?: number;
|
|
16
|
-
}
|
|
17
|
-
/**
|
|
18
|
-
* Delegation bookkeeping attached to a task that was handed to a subagent.
|
|
19
|
-
*
|
|
20
|
-
* `pid` is the harness process that owns the run: it is the only way to tell an
|
|
21
|
-
* genuinely-running delegation from one orphaned by a harness crash, since the
|
|
22
|
-
* child dies with its parent but the file survives.
|
|
23
|
-
*/
|
|
24
|
-
export interface TaskDelegation {
|
|
25
|
-
requestId: string;
|
|
26
|
-
agent: string;
|
|
27
|
-
state: DelegationState;
|
|
28
|
-
sessionId?: string;
|
|
29
|
-
pid?: number;
|
|
30
|
-
runId?: string;
|
|
31
|
-
model?: string;
|
|
32
|
-
startedAt?: string;
|
|
33
|
-
endedAt?: string;
|
|
34
|
-
result?: DelegationResult;
|
|
35
|
-
}
|
|
36
|
-
export interface Task {
|
|
37
|
-
id: number;
|
|
38
|
-
subject: string;
|
|
39
|
-
description?: string;
|
|
40
|
-
activeForm?: string;
|
|
41
|
-
status: TaskStatus;
|
|
42
|
-
blockedBy?: number[];
|
|
43
|
-
owner?: string;
|
|
44
|
-
metadata?: Record<string, unknown>;
|
|
45
|
-
createdAt?: string;
|
|
46
|
-
updatedAt?: string;
|
|
47
|
-
delegation?: TaskDelegation;
|
|
48
|
-
}
|
|
49
|
-
export declare const STORE_SCHEMA_VERSION = 1;
|
|
50
|
-
/** The complete on-disk document. `rev` increments on every committed write. */
|
|
51
|
-
export interface TaskDocument {
|
|
52
|
-
version: number;
|
|
53
|
-
rev: number;
|
|
54
|
-
nextId: number;
|
|
55
|
-
tasks: Task[];
|
|
56
|
-
}
|
|
57
|
-
export declare function emptyDocument(): TaskDocument;
|
|
58
|
-
/**
|
|
59
|
-
* A dependency target inside an upsert item: an existing task id, or the `ref`
|
|
60
|
-
* of a task created earlier in the same call.
|
|
61
|
-
*
|
|
62
|
-
* Refs must start with a letter (see `REF_PATTERN`), so a ref is structurally
|
|
63
|
-
* unconfusable with a stringified id and the discrimination is just `typeof`.
|
|
64
|
-
*/
|
|
65
|
-
export type DepToken = number | string;
|
|
66
|
-
/**
|
|
67
|
-
* One entry of an `upsert` call. No `id` creates a task; an `id` updates one.
|
|
68
|
-
*
|
|
69
|
-
* `blockedBy` (absolute set) is create-only and `addBlockedBy`/`removeBlockedBy`
|
|
70
|
-
* (additive merge) are update-only, matching the split the two former actions
|
|
71
|
-
* had. A field used against the wrong kind fails that item rather than being
|
|
72
|
-
* silently ignored.
|
|
73
|
-
*/
|
|
74
|
-
export interface TaskItemMutation {
|
|
75
|
-
id?: number;
|
|
76
|
-
ref?: string;
|
|
77
|
-
subject?: string;
|
|
78
|
-
description?: string;
|
|
79
|
-
activeForm?: string;
|
|
80
|
-
status?: TaskStatus;
|
|
81
|
-
blockedBy?: DepToken[];
|
|
82
|
-
addBlockedBy?: DepToken[];
|
|
83
|
-
removeBlockedBy?: DepToken[];
|
|
84
|
-
owner?: string;
|
|
85
|
-
metadata?: Record<string, unknown>;
|
|
86
|
-
}
|
|
87
|
-
/**
|
|
88
|
-
* What one upsert item did. `index` is its position in the request array, so a
|
|
89
|
-
* model reading a partial result can tell which entries still need resending.
|
|
90
|
-
*
|
|
91
|
-
* `message` is unprefixed: the `item[N] failed:` framing belongs to the
|
|
92
|
-
* formatter, because the Task Space overlay shows this text on its own.
|
|
93
|
-
*/
|
|
94
|
-
export type UpsertItemOutcome = {
|
|
95
|
-
index: number;
|
|
96
|
-
kind: 'created';
|
|
97
|
-
id: number;
|
|
98
|
-
subject: string;
|
|
99
|
-
status: TaskStatus;
|
|
100
|
-
ref?: string;
|
|
101
|
-
blockedBy?: number[];
|
|
102
|
-
} | {
|
|
103
|
-
index: number;
|
|
104
|
-
kind: 'updated';
|
|
105
|
-
id: number;
|
|
106
|
-
fromStatus: TaskStatus;
|
|
107
|
-
toStatus: TaskStatus;
|
|
108
|
-
} | {
|
|
109
|
-
index: number;
|
|
110
|
-
kind: 'unchanged';
|
|
111
|
-
id: number;
|
|
112
|
-
status: TaskStatus;
|
|
113
|
-
} | {
|
|
114
|
-
index: number;
|
|
115
|
-
kind: 'failed';
|
|
116
|
-
message: string;
|
|
117
|
-
id?: number;
|
|
118
|
-
ref?: string;
|
|
119
|
-
};
|
|
120
|
-
/** Which tasks an upsert touched, so renderResult names them instead of guessing. */
|
|
121
|
-
export interface UpsertSummary {
|
|
122
|
-
/** Ids of applied entries, in request order. A failed entry contributes nothing. */
|
|
123
|
-
applied: number[];
|
|
124
|
-
failed: number;
|
|
125
|
-
}
|
|
126
|
-
/** One task-to-agent handoff inside a native assignment batch. */
|
|
127
|
-
export interface TaskAssignment {
|
|
128
|
-
id: number;
|
|
129
|
-
agent: string;
|
|
130
|
-
inlineAgent?: InlineAgent;
|
|
131
|
-
instructions?: string;
|
|
132
|
-
relevantFiles?: string[];
|
|
133
|
-
priorFindings?: string;
|
|
134
|
-
model?: string;
|
|
135
|
-
context?: 'fresh' | 'fork';
|
|
136
|
-
}
|
|
137
|
-
/** Which assignment entries started, so renderResult can show one consolidated batch. */
|
|
138
|
-
export interface AssignmentSummary {
|
|
139
|
-
/** Ids of successful entries, in request order. A failed entry contributes nothing. */
|
|
140
|
-
assigned: number[];
|
|
141
|
-
failed: number;
|
|
142
|
-
}
|
|
143
|
-
/**
|
|
144
|
-
* Open-shape input bag the reducer accepts. The index signature lets the
|
|
145
|
-
* runtime pass a TypeBox `Static<typeof TaskParamsSchema>` through without
|
|
146
|
-
* casting each field.
|
|
147
|
-
*
|
|
148
|
-
* Per-task fields live on `tasks[]`, not here: a top-level `subject` or
|
|
149
|
-
* `status` would be ambiguous once one call can carry many tasks.
|
|
150
|
-
*/
|
|
151
|
-
export interface TaskMutationParams {
|
|
152
|
-
[key: string]: unknown;
|
|
153
|
-
tasks?: TaskItemMutation[];
|
|
154
|
-
/** `assign` only: independent task-to-agent handoffs dispatched by one tool call. */
|
|
155
|
-
assignments?: TaskAssignment[];
|
|
156
|
-
/** `list` filter only. To set a status, upsert the task by id. */
|
|
157
|
-
status?: TaskStatus;
|
|
158
|
-
/** `get`, `delete`, and `cancel` only. Assign ids live in `assignments[]`. */
|
|
159
|
-
id?: number;
|
|
160
|
-
includeDeleted?: boolean;
|
|
161
|
-
}
|
|
162
|
-
/** Snapshot returned under a tool result's `details` for renderResult. */
|
|
163
|
-
export interface TaskDetails {
|
|
164
|
-
action: TaskAction;
|
|
165
|
-
params: Record<string, unknown>;
|
|
166
|
-
tasks: Task[];
|
|
167
|
-
nextId: number;
|
|
168
|
-
rev: number;
|
|
169
|
-
error?: string;
|
|
170
|
-
upsert?: UpsertSummary;
|
|
171
|
-
assignment?: AssignmentSummary;
|
|
172
|
-
}
|
|
173
|
-
/**
|
|
174
|
-
* A delegation is "live" while the owning run may still produce a response.
|
|
175
|
-
*
|
|
176
|
-
* Takes the delegation shape rather than `Task` so the cockpit's `WebTask`,
|
|
177
|
-
* which carries the state as a plain string, answers the question the same way
|
|
178
|
-
* the store does.
|
|
179
|
-
*/
|
|
180
|
-
export declare function isDelegationActive(task: {
|
|
181
|
-
delegation?: {
|
|
182
|
-
state?: string;
|
|
183
|
-
};
|
|
184
|
-
}): boolean;
|
|
185
|
-
//#endregion
|
|
186
|
-
//# sourceMappingURL=task.d.cts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"task.d.cts","names":[],"sources":["../../../src/models/task.ts"],"mappings":";;YAUY;qBAEC,gBAAgB;YAEjB;YAEA;;iBAGK;EACf;EACA;EACA;EACA;EACA;EACA;EACA;;;;;;;;;iBAUe;EACf;EACA;EACA,OAAO;EACP;EACA;EACA;EACA;EACA;EACA;EACA,SAAS;;iBAGM;EACf;EACA;EACA;EACA;EACA,QAAQ;EACR;EACA;EACA,WAAW;EACX;EACA;EACA,aAAa;;qBAGF;;iBAGI;EACf;EACA;EACA;EACA,OAAO;;wBAGO,iBAAiB;;;;;;;;YAWrB;;;;;;;;;iBAUK;EACf;EACA;EACA;EACA;EACA;EACA,SAAS;EACT,YAAY;EACZ,eAAe;EACf,kBAAkB;EAClB;EACA,WAAW;;;;;;;;;YAUD;EAEN;EACA;EACA;EACA;EACA,QAAQ;EACR;EACA;;EAEA;EAAe;EAAiB;EAAY,YAAY;EAAY,UAAU;;EAC9E;EAAe;EAAmB;EAAY,QAAQ;;EACtD;EAAe;EAAgB;EAAiB;EAAa;;;iBAGlD;;EAEf;EACA;;;iBAIe;EACf;EACA;EACA,cAAc;EACd;EACA;EACA;EACA;EACA;;;iBAIe;;EAEf;EACA;;;;;;;;;;iBAWe;GACd;EACD,QAAQ;;EAER,cAAc;;EAEd,SAAS;;EAET;EACA;;;iBAIe;EACf,QAAQ;EACR,QAAQ;EACR,OAAO;EACP;EACA;EACA;EACA,SAAS;EACT,aAAa;;;;;;;;;wBAUC,mBAAmB;EAAQ;IAAe"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"task.d.mts","names":[],"sources":["../../../src/models/task.ts"],"mappings":";;YAUY;qBAEC,gBAAgB;YAEjB;YAEA;;iBAGK;EACf;EACA;EACA;EACA;EACA;EACA;EACA;;;;;;;;;iBAUe;EACf;EACA;EACA,OAAO;EACP;EACA;EACA;EACA;EACA;EACA;EACA,SAAS;;iBAGM;EACf;EACA;EACA;EACA;EACA,QAAQ;EACR;EACA;EACA,WAAW;EACX;EACA;EACA,aAAa;;qBAGF;;iBAGI;EACf;EACA;EACA;EACA,OAAO;;wBAGO,iBAAiB;;;;;;;;YAWrB;;;;;;;;;iBAUK;EACf;EACA;EACA;EACA;EACA;EACA,SAAS;EACT,YAAY;EACZ,eAAe;EACf,kBAAkB;EAClB;EACA,WAAW;;;;;;;;;YAUD;EAEN;EACA;EACA;EACA;EACA,QAAQ;EACR;EACA;;EAEA;EAAe;EAAiB;EAAY,YAAY;EAAY,UAAU;;EAC9E;EAAe;EAAmB;EAAY,QAAQ;;EACtD;EAAe;EAAgB;EAAiB;EAAa;;;iBAGlD;;EAEf;EACA;;;iBAIe;EACf;EACA;EACA,cAAc;EACd;EACA;EACA;EACA;EACA;;;iBAIe;;EAEf;EACA;;;;;;;;;;iBAWe;GACd;EACD,QAAQ;;EAER,cAAc;;EAEd,SAAS;;EAET;EACA;;;iBAIe;EACf,QAAQ;EACR,QAAQ;EACR,OAAO;EACP;EACA;EACA;EACA,SAAS;EACT,aAAa;;;;;;;;;wBAUC,mBAAmB;EAAQ;IAAe"}
|