@agimon-ai/doompi-task 0.0.1-alpha.72 → 0.0.1-alpha.75
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +12 -3
- package/package.json +15 -14
- package/dist/_virtual/_rolldown/runtime.cjs +0 -1
- package/dist/api-contracts.cjs +0 -1
- package/dist/api-contracts.d.cts +0 -2
- package/dist/api-contracts.d.mts +0 -2
- package/dist/api-contracts.mjs +0 -1
- package/dist/commands.cjs +0 -1
- package/dist/commands.d.cts +0 -2
- package/dist/commands.d.mts +0 -2
- package/dist/commands.mjs +0 -1
- package/dist/config.cjs +0 -1
- package/dist/config.d.cts +0 -2
- package/dist/config.d.mts +0 -2
- package/dist/config.mjs +0 -1
- package/dist/constants/promptGuidelines.cjs +0 -2
- package/dist/constants/promptGuidelines.cjs.map +0 -1
- package/dist/constants/promptGuidelines.d.cts +0 -13
- package/dist/constants/promptGuidelines.d.cts.map +0 -1
- package/dist/constants/promptGuidelines.d.mts +0 -13
- package/dist/constants/promptGuidelines.d.mts.map +0 -1
- package/dist/constants/promptGuidelines.mjs +0 -2
- package/dist/constants/promptGuidelines.mjs.map +0 -1
- package/dist/constants/task.cjs +0 -2
- package/dist/constants/task.cjs.map +0 -1
- package/dist/constants/task.d.cts +0 -4
- package/dist/constants/task.d.cts.map +0 -1
- package/dist/constants/task.d.mts +0 -4
- package/dist/constants/task.d.mts.map +0 -1
- package/dist/constants/task.mjs +0 -2
- package/dist/constants/task.mjs.map +0 -1
- package/dist/controllers/tasksCommand.cjs +0 -2
- package/dist/controllers/tasksCommand.cjs.map +0 -1
- package/dist/controllers/tasksCommand.d.cts +0 -15
- package/dist/controllers/tasksCommand.d.cts.map +0 -1
- package/dist/controllers/tasksCommand.d.mts +0 -15
- package/dist/controllers/tasksCommand.d.mts.map +0 -1
- package/dist/controllers/tasksCommand.mjs +0 -2
- package/dist/controllers/tasksCommand.mjs.map +0 -1
- package/dist/controllers/webTasksChannel.cjs +0 -2
- package/dist/controllers/webTasksChannel.cjs.map +0 -1
- package/dist/controllers/webTasksChannel.mjs +0 -2
- package/dist/controllers/webTasksChannel.mjs.map +0 -1
- package/dist/delegation-manager.cjs +0 -1
- package/dist/delegation-manager.d.cts +0 -3
- package/dist/delegation-manager.d.mts +0 -3
- package/dist/delegation-manager.mjs +0 -1
- package/dist/extensions/pi.cjs +0 -3
- package/dist/extensions/pi.cjs.map +0 -1
- package/dist/extensions/pi.d.cts +0 -6
- package/dist/extensions/pi.d.cts.map +0 -1
- package/dist/extensions/pi.d.mts +0 -6
- package/dist/extensions/pi.d.mts.map +0 -1
- package/dist/extensions/pi.mjs +0 -3
- package/dist/extensions/pi.mjs.map +0 -1
- package/dist/extensions/server.cjs +0 -2
- package/dist/extensions/server.cjs.map +0 -1
- package/dist/extensions/server.d.cts +0 -5
- package/dist/extensions/server.d.cts.map +0 -1
- package/dist/extensions/server.d.mts +0 -5
- package/dist/extensions/server.d.mts.map +0 -1
- package/dist/extensions/server.mjs +0 -2
- package/dist/extensions/server.mjs.map +0 -1
- package/dist/index.cjs +0 -1
- package/dist/index.d.cts +0 -16
- package/dist/index.d.mts +0 -16
- package/dist/index.mjs +0 -1
- package/dist/logSinkTelemetry.cjs +0 -1
- package/dist/logSinkTelemetry.d.cts +0 -3
- package/dist/logSinkTelemetry.d.mts +0 -3
- package/dist/logSinkTelemetry.mjs +0 -1
- package/dist/models/task.cjs +0 -2
- package/dist/models/task.cjs.map +0 -1
- package/dist/models/task.d.cts +0 -176
- package/dist/models/task.d.cts.map +0 -1
- package/dist/models/task.d.mts +0 -176
- package/dist/models/task.d.mts.map +0 -1
- package/dist/models/task.mjs +0 -2
- package/dist/models/task.mjs.map +0 -1
- package/dist/models/taskGraph.cjs +0 -2
- package/dist/models/taskGraph.cjs.map +0 -1
- package/dist/models/taskGraph.d.cts +0 -24
- package/dist/models/taskGraph.d.cts.map +0 -1
- package/dist/models/taskGraph.d.mts +0 -24
- package/dist/models/taskGraph.d.mts.map +0 -1
- package/dist/models/taskGraph.mjs +0 -2
- package/dist/models/taskGraph.mjs.map +0 -1
- package/dist/schemas/apiContracts.cjs +0 -2
- package/dist/schemas/apiContracts.cjs.map +0 -1
- package/dist/schemas/apiContracts.d.cts +0 -53
- package/dist/schemas/apiContracts.d.cts.map +0 -1
- package/dist/schemas/apiContracts.d.mts +0 -53
- package/dist/schemas/apiContracts.d.mts.map +0 -1
- package/dist/schemas/apiContracts.mjs +0 -2
- package/dist/schemas/apiContracts.mjs.map +0 -1
- package/dist/schemas/task.cjs +0 -2
- package/dist/schemas/task.cjs.map +0 -1
- package/dist/schemas/task.d.cts +0 -103
- package/dist/schemas/task.d.cts.map +0 -1
- package/dist/schemas/task.d.mts +0 -103
- package/dist/schemas/task.d.mts.map +0 -1
- package/dist/schemas/task.mjs +0 -2
- package/dist/schemas/task.mjs.map +0 -1
- package/dist/services/config/index.cjs +0 -2
- package/dist/services/config/index.cjs.map +0 -1
- package/dist/services/config/index.d.cts +0 -42
- package/dist/services/config/index.d.cts.map +0 -1
- package/dist/services/config/index.d.mts +0 -42
- package/dist/services/config/index.d.mts.map +0 -1
- package/dist/services/config/index.mjs +0 -2
- package/dist/services/config/index.mjs.map +0 -1
- package/dist/services/contextContribution/index.cjs +0 -3
- package/dist/services/contextContribution/index.cjs.map +0 -1
- package/dist/services/contextContribution/index.mjs +0 -3
- package/dist/services/contextContribution/index.mjs.map +0 -1
- package/dist/services/delegation/index.cjs +0 -6
- package/dist/services/delegation/index.cjs.map +0 -1
- package/dist/services/delegation/index.d.cts +0 -192
- package/dist/services/delegation/index.d.cts.map +0 -1
- package/dist/services/delegation/index.d.mts +0 -192
- package/dist/services/delegation/index.d.mts.map +0 -1
- package/dist/services/delegation/index.mjs +0 -6
- package/dist/services/delegation/index.mjs.map +0 -1
- package/dist/services/delegationPlatform/index.cjs +0 -2
- package/dist/services/delegationPlatform/index.cjs.map +0 -1
- package/dist/services/delegationPlatform/index.mjs +0 -2
- package/dist/services/delegationPlatform/index.mjs.map +0 -1
- package/dist/services/invariants/index.cjs +0 -2
- package/dist/services/invariants/index.cjs.map +0 -1
- package/dist/services/invariants/index.d.cts +0 -23
- package/dist/services/invariants/index.d.cts.map +0 -1
- package/dist/services/invariants/index.d.mts +0 -23
- package/dist/services/invariants/index.d.mts.map +0 -1
- package/dist/services/invariants/index.mjs +0 -2
- package/dist/services/invariants/index.mjs.map +0 -1
- package/dist/services/logSinkTelemetry/index.cjs +0 -2
- package/dist/services/logSinkTelemetry/index.cjs.map +0 -1
- package/dist/services/logSinkTelemetry/index.d.cts +0 -23
- package/dist/services/logSinkTelemetry/index.d.cts.map +0 -1
- package/dist/services/logSinkTelemetry/index.d.mts +0 -23
- package/dist/services/logSinkTelemetry/index.d.mts.map +0 -1
- package/dist/services/logSinkTelemetry/index.mjs +0 -2
- package/dist/services/logSinkTelemetry/index.mjs.map +0 -1
- package/dist/services/paths/index.cjs +0 -2
- package/dist/services/paths/index.cjs.map +0 -1
- package/dist/services/paths/index.d.cts +0 -25
- package/dist/services/paths/index.d.cts.map +0 -1
- package/dist/services/paths/index.d.mts +0 -25
- package/dist/services/paths/index.d.mts.map +0 -1
- package/dist/services/paths/index.mjs +0 -2
- package/dist/services/paths/index.mjs.map +0 -1
- package/dist/services/processLiveness/index.cjs +0 -2
- package/dist/services/processLiveness/index.cjs.map +0 -1
- package/dist/services/processLiveness/index.d.cts +0 -11
- package/dist/services/processLiveness/index.d.cts.map +0 -1
- package/dist/services/processLiveness/index.d.mts +0 -11
- package/dist/services/processLiveness/index.d.mts.map +0 -1
- package/dist/services/processLiveness/index.mjs +0 -2
- package/dist/services/processLiveness/index.mjs.map +0 -1
- package/dist/services/reconcile/index.cjs +0 -2
- package/dist/services/reconcile/index.cjs.map +0 -1
- package/dist/services/reconcile/index.d.cts +0 -33
- package/dist/services/reconcile/index.d.cts.map +0 -1
- package/dist/services/reconcile/index.d.mts +0 -33
- package/dist/services/reconcile/index.d.mts.map +0 -1
- package/dist/services/reconcile/index.mjs +0 -2
- package/dist/services/reconcile/index.mjs.map +0 -1
- package/dist/services/reducer/index.cjs +0 -3
- package/dist/services/reducer/index.cjs.map +0 -1
- package/dist/services/reducer/index.d.cts +0 -71
- package/dist/services/reducer/index.d.cts.map +0 -1
- package/dist/services/reducer/index.d.mts +0 -71
- package/dist/services/reducer/index.d.mts.map +0 -1
- package/dist/services/reducer/index.mjs +0 -3
- package/dist/services/reducer/index.mjs.map +0 -1
- package/dist/services/taskNarration/index.cjs +0 -2
- package/dist/services/taskNarration/index.cjs.map +0 -1
- package/dist/services/taskNarration/index.mjs +0 -2
- package/dist/services/taskNarration/index.mjs.map +0 -1
- package/dist/services/taskResult/index.cjs +0 -7
- package/dist/services/taskResult/index.cjs.map +0 -1
- package/dist/services/taskResult/index.d.cts +0 -50
- package/dist/services/taskResult/index.d.cts.map +0 -1
- package/dist/services/taskResult/index.d.mts +0 -50
- package/dist/services/taskResult/index.d.mts.map +0 -1
- package/dist/services/taskResult/index.mjs +0 -7
- package/dist/services/taskResult/index.mjs.map +0 -1
- package/dist/services/taskStore/index.cjs +0 -2
- package/dist/services/taskStore/index.cjs.map +0 -1
- package/dist/services/taskStore/index.d.cts +0 -69
- package/dist/services/taskStore/index.d.cts.map +0 -1
- package/dist/services/taskStore/index.d.mts +0 -69
- package/dist/services/taskStore/index.d.mts.map +0 -1
- package/dist/services/taskStore/index.mjs +0 -2
- package/dist/services/taskStore/index.mjs.map +0 -1
- package/dist/store-invariants.cjs +0 -1
- package/dist/store-invariants.d.cts +0 -2
- package/dist/store-invariants.d.mts +0 -2
- package/dist/store-invariants.mjs +0 -1
- package/dist/store-paths.cjs +0 -1
- package/dist/store-paths.d.cts +0 -2
- package/dist/store-paths.d.mts +0 -2
- package/dist/store-paths.mjs +0 -1
- package/dist/store-process-liveness.cjs +0 -1
- package/dist/store-process-liveness.d.cts +0 -2
- package/dist/store-process-liveness.d.mts +0 -2
- package/dist/store-process-liveness.mjs +0 -1
- package/dist/store-reconcile.cjs +0 -1
- package/dist/store-reconcile.d.cts +0 -2
- package/dist/store-reconcile.d.mts +0 -2
- package/dist/store-reconcile.mjs +0 -1
- package/dist/store-reducer.cjs +0 -1
- package/dist/store-reducer.d.cts +0 -2
- package/dist/store-reducer.d.mts +0 -2
- package/dist/store-reducer.mjs +0 -1
- package/dist/store-task-graph.cjs +0 -1
- package/dist/store-task-graph.d.cts +0 -2
- package/dist/store-task-graph.d.mts +0 -2
- package/dist/store-task-graph.mjs +0 -1
- package/dist/store-task-store.cjs +0 -1
- package/dist/store-task-store.d.cts +0 -2
- package/dist/store-task-store.d.mts +0 -2
- package/dist/store-task-store.mjs +0 -1
- package/dist/store-types.cjs +0 -1
- package/dist/store-types.d.cts +0 -2
- package/dist/store-types.d.mts +0 -2
- package/dist/store-types.mjs +0 -1
- package/dist/tool-prompt-guidelines.cjs +0 -1
- package/dist/tool-prompt-guidelines.d.cts +0 -2
- package/dist/tool-prompt-guidelines.d.mts +0 -2
- package/dist/tool-prompt-guidelines.mjs +0 -1
- package/dist/tool-response-envelope.cjs +0 -1
- package/dist/tool-response-envelope.d.cts +0 -2
- package/dist/tool-response-envelope.d.mts +0 -2
- package/dist/tool-response-envelope.mjs +0 -1
- package/dist/tool-schema.cjs +0 -1
- package/dist/tool-schema.d.cts +0 -3
- package/dist/tool-schema.d.mts +0 -3
- package/dist/tool-schema.mjs +0 -1
- package/dist/tool-task-tool.cjs +0 -1
- package/dist/tool-task-tool.d.cts +0 -3
- package/dist/tool-task-tool.d.mts +0 -3
- package/dist/tool-task-tool.mjs +0 -1
- package/dist/tools/task.cjs +0 -3
- package/dist/tools/task.cjs.map +0 -1
- package/dist/tools/task.d.cts +0 -22
- package/dist/tools/task.d.cts.map +0 -1
- package/dist/tools/task.d.mts +0 -22
- package/dist/tools/task.d.mts.map +0 -1
- package/dist/tools/task.mjs +0 -3
- package/dist/tools/task.mjs.map +0 -1
- package/dist/tui/format.cjs +0 -4
- package/dist/tui/format.cjs.map +0 -1
- package/dist/tui/format.d.cts +0 -61
- package/dist/tui/format.d.cts.map +0 -1
- package/dist/tui/format.d.mts +0 -61
- package/dist/tui/format.d.mts.map +0 -1
- package/dist/tui/format.mjs +0 -4
- package/dist/tui/format.mjs.map +0 -1
- package/dist/tui/selectors.cjs +0 -2
- package/dist/tui/selectors.cjs.map +0 -1
- package/dist/tui/selectors.d.cts +0 -59
- package/dist/tui/selectors.d.cts.map +0 -1
- package/dist/tui/selectors.d.mts +0 -59
- package/dist/tui/selectors.d.mts.map +0 -1
- package/dist/tui/selectors.mjs +0 -2
- package/dist/tui/selectors.mjs.map +0 -1
- package/dist/tui/taskOverlay.cjs +0 -2
- package/dist/tui/taskOverlay.cjs.map +0 -1
- package/dist/tui/taskOverlay.d.cts +0 -37
- package/dist/tui/taskOverlay.d.cts.map +0 -1
- package/dist/tui/taskOverlay.d.mts +0 -37
- package/dist/tui/taskOverlay.d.mts.map +0 -1
- package/dist/tui/taskOverlay.mjs +0 -2
- package/dist/tui/taskOverlay.mjs.map +0 -1
- package/dist/tui/taskSpace.cjs +0 -5
- package/dist/tui/taskSpace.cjs.map +0 -1
- package/dist/tui/taskSpace.d.cts +0 -60
- package/dist/tui/taskSpace.d.cts.map +0 -1
- package/dist/tui/taskSpace.d.mts +0 -60
- package/dist/tui/taskSpace.d.mts.map +0 -1
- package/dist/tui/taskSpace.mjs +0 -5
- package/dist/tui/taskSpace.mjs.map +0 -1
- package/dist/tui-format.cjs +0 -1
- package/dist/tui-format.d.cts +0 -2
- package/dist/tui-format.d.mts +0 -2
- package/dist/tui-format.mjs +0 -1
- package/dist/tui-selectors.cjs +0 -1
- package/dist/tui-selectors.d.cts +0 -2
- package/dist/tui-selectors.d.mts +0 -2
- package/dist/tui-selectors.mjs +0 -1
- package/dist/tui-task-overlay.cjs +0 -1
- package/dist/tui-task-overlay.d.cts +0 -2
- package/dist/tui-task-overlay.d.mts +0 -2
- package/dist/tui-task-overlay.mjs +0 -1
- package/dist/tui-task-space.cjs +0 -1
- package/dist/tui-task-space.d.cts +0 -2
- package/dist/tui-task-space.d.mts +0 -2
- package/dist/tui-task-space.mjs +0 -1
- package/dist/types/delegation.cjs +0 -2
- package/dist/types/delegation.cjs.map +0 -1
- package/dist/types/delegation.d.cts +0 -5
- package/dist/types/delegation.d.cts.map +0 -1
- package/dist/types/delegation.d.mts +0 -5
- package/dist/types/delegation.d.mts.map +0 -1
- package/dist/types/delegation.mjs +0 -2
- package/dist/types/delegation.mjs.map +0 -1
- package/dist/types/telemetry.cjs +0 -2
- package/dist/types/telemetry.cjs.map +0 -1
- package/dist/types/telemetry.d.cts +0 -35
- package/dist/types/telemetry.d.cts.map +0 -1
- package/dist/types/telemetry.d.mts +0 -35
- package/dist/types/telemetry.d.mts.map +0 -1
- package/dist/types/telemetry.mjs +0 -2
- package/dist/types/telemetry.mjs.map +0 -1
- package/dist/types/webTasks.cjs +0 -2
- package/dist/types/webTasks.cjs.map +0 -1
- package/dist/types/webTasks.mjs +0 -2
- package/dist/types/webTasks.mjs.map +0 -1
- package/src/extensions/web.ts +0 -18
- package/src/web/components/TaskDetailDialog.tsx +0 -251
- package/src/web/components/TaskToolMessage.tsx +0 -120
- package/src/web/components/TasksActivitySection.tsx +0 -200
- package/src/web/lib/taskToolFormat.ts +0 -330
- package/src/web/stores/tasksStore.ts +0 -114
- package/src/web/tsconfig.json +0 -23
|
@@ -1,35 +0,0 @@
|
|
|
1
|
-
//#region src/types/telemetry.d.ts
|
|
2
|
-
export declare const TASK_EVENT: {
|
|
3
|
-
readonly notificationFailed: 'doom_task.notification_failed';
|
|
4
|
-
readonly storeReadFailed: 'doom_task.store_read_failed';
|
|
5
|
-
readonly storeLockTimeout: 'doom_task.store_lock_timeout';
|
|
6
|
-
readonly storeLockBreakFailed: 'doom_task.store_lock_break_failed';
|
|
7
|
-
readonly storeWatchFailed: 'doom_task.store_watch_failed';
|
|
8
|
-
readonly storeListenerFailed: 'doom_task.store_listener_failed';
|
|
9
|
-
readonly storeCommitListenerFailed: 'doom_task.store_commit_listener_failed';
|
|
10
|
-
readonly storeSweepFailed: 'doom_task.store_sweep_failed';
|
|
11
|
-
readonly sessionStartFailed: 'doom_task.session_start_failed';
|
|
12
|
-
readonly sessionStartDegraded: 'doom_task.session_start_degraded';
|
|
13
|
-
readonly toolFailed: 'doom_task.tool_failed';
|
|
14
|
-
readonly delegationRequestFailed: 'doom_task.delegation_request_failed';
|
|
15
|
-
readonly delegationStartFailed: 'doom_task.delegation_start_failed';
|
|
16
|
-
readonly delegationResponseFailed: 'doom_task.delegation_response_failed';
|
|
17
|
-
readonly delegationSettleFailed: 'doom_task.delegation_settle_failed';
|
|
18
|
-
readonly delegationTimedOut: 'doom_task.delegation_timed_out';
|
|
19
|
-
readonly delegationOrphaned: 'doom_task.delegation_orphaned';
|
|
20
|
-
readonly delegationAssigned: 'doom_task.delegation_assigned';
|
|
21
|
-
readonly delegationCompleted: 'doom_task.delegation_completed';
|
|
22
|
-
};
|
|
23
|
-
export type TaskEventName = (typeof TASK_EVENT)[keyof typeof TASK_EVENT];
|
|
24
|
-
export type TaskErrorAttributes = Record<string, string | number | boolean>;
|
|
25
|
-
export type TaskErrorSink = (event: TaskEventName, error: unknown, attributes?: TaskErrorAttributes) => void;
|
|
26
|
-
export type TaskEventSink = (event: TaskEventName, attributes?: TaskErrorAttributes) => void;
|
|
27
|
-
/** Host-neutral telemetry port consumed by Task services and store adapters. */
|
|
28
|
-
export interface TaskFailureReporter {
|
|
29
|
-
error: TaskErrorSink;
|
|
30
|
-
warn: TaskErrorSink;
|
|
31
|
-
/** Info-level event sink. Required so an unwired reporter fails to compile. */
|
|
32
|
-
event: TaskEventSink;
|
|
33
|
-
}
|
|
34
|
-
//#endregion
|
|
35
|
-
//# sourceMappingURL=telemetry.d.mts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"telemetry.d.mts","names":[],"sources":["../../src/types/telemetry.ts"],"mappings":";qBAAa;WACX;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WAGA;WACA;;YAGU,wBAAwB,yBAAyB;YACjD,sBAAsB;YACtB,iBAAiB,OAAO,eAAe,gBAAgB,aAAa;YACpE,iBAAiB,OAAO,eAAe,aAAa;;iBAG/C;EACf,OAAO;EACP,MAAM;;EAEN,OAAO"}
|
package/dist/types/telemetry.mjs
DELETED
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
const e={notificationFailed:`doom_task.notification_failed`,storeReadFailed:`doom_task.store_read_failed`,storeLockTimeout:`doom_task.store_lock_timeout`,storeLockBreakFailed:`doom_task.store_lock_break_failed`,storeWatchFailed:`doom_task.store_watch_failed`,storeListenerFailed:`doom_task.store_listener_failed`,storeCommitListenerFailed:`doom_task.store_commit_listener_failed`,storeSweepFailed:`doom_task.store_sweep_failed`,sessionStartFailed:`doom_task.session_start_failed`,sessionStartDegraded:`doom_task.session_start_degraded`,toolFailed:`doom_task.tool_failed`,delegationRequestFailed:`doom_task.delegation_request_failed`,delegationStartFailed:`doom_task.delegation_start_failed`,delegationResponseFailed:`doom_task.delegation_response_failed`,delegationSettleFailed:`doom_task.delegation_settle_failed`,delegationTimedOut:`doom_task.delegation_timed_out`,delegationOrphaned:`doom_task.delegation_orphaned`,delegationAssigned:`doom_task.delegation_assigned`,delegationCompleted:`doom_task.delegation_completed`};export{e as TASK_EVENT};
|
|
2
|
-
//# sourceMappingURL=telemetry.mjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"telemetry.mjs","names":[],"sources":["../../src/types/telemetry.ts"],"sourcesContent":["export const TASK_EVENT = {\n notificationFailed: 'doom_task.notification_failed',\n storeReadFailed: 'doom_task.store_read_failed',\n storeLockTimeout: 'doom_task.store_lock_timeout',\n storeLockBreakFailed: 'doom_task.store_lock_break_failed',\n storeWatchFailed: 'doom_task.store_watch_failed',\n storeListenerFailed: 'doom_task.store_listener_failed',\n storeCommitListenerFailed: 'doom_task.store_commit_listener_failed',\n storeSweepFailed: 'doom_task.store_sweep_failed',\n sessionStartFailed: 'doom_task.session_start_failed',\n sessionStartDegraded: 'doom_task.session_start_degraded',\n toolFailed: 'doom_task.tool_failed',\n delegationRequestFailed: 'doom_task.delegation_request_failed',\n delegationStartFailed: 'doom_task.delegation_start_failed',\n delegationResponseFailed: 'doom_task.delegation_response_failed',\n delegationSettleFailed: 'doom_task.delegation_settle_failed',\n delegationTimedOut: 'doom_task.delegation_timed_out',\n delegationOrphaned: 'doom_task.delegation_orphaned',\n // Info-level lifecycle events. These are the measurement pair: the shape of\n // the brief that went out, and the cost of the run it produced.\n delegationAssigned: 'doom_task.delegation_assigned',\n delegationCompleted: 'doom_task.delegation_completed',\n} as const;\n\nexport type TaskEventName = (typeof TASK_EVENT)[keyof typeof TASK_EVENT];\nexport type TaskErrorAttributes = Record<string, string | number | boolean>;\nexport type TaskErrorSink = (event: TaskEventName, error: unknown, attributes?: TaskErrorAttributes) => void;\nexport type TaskEventSink = (event: TaskEventName, attributes?: TaskErrorAttributes) => void;\n\n/** Host-neutral telemetry port consumed by Task services and store adapters. */\nexport interface TaskFailureReporter {\n error: TaskErrorSink;\n warn: TaskErrorSink;\n /** Info-level event sink. Required so an unwired reporter fails to compile. */\n event: TaskEventSink;\n}\n"],"mappings":"AAAA,MAAa,EAAa,CACxB,mBAAoB,gCACpB,gBAAiB,8BACjB,iBAAkB,+BAClB,qBAAsB,oCACtB,iBAAkB,+BAClB,oBAAqB,kCACrB,0BAA2B,yCAC3B,iBAAkB,+BAClB,mBAAoB,iCACpB,qBAAsB,mCACtB,WAAY,wBACZ,wBAAyB,sCACzB,sBAAuB,oCACvB,yBAA0B,uCAC1B,uBAAwB,qCACxB,mBAAoB,iCACpB,mBAAoB,gCAGpB,mBAAoB,gCACpB,oBAAqB,gCACvB"}
|
package/dist/types/webTasks.cjs
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"webTasks.cjs","names":[],"sources":["../../src/types/webTasks.ts"],"sourcesContent":["/** Browser-safe task view published by the cockpit hub channel. */\nexport const TASKS_CHANNEL_TYPE = 'task_graph';\n\nexport type WebTaskStatus = 'pending' | 'in_progress' | 'completed' | 'failed' | 'deleted';\n\nexport interface WebTask {\n id: number;\n subject: string;\n description?: string;\n activeForm?: string;\n status: WebTaskStatus;\n blockedBy: number[];\n owner?: string;\n updatedAt?: string;\n delegation?: {\n agent?: string;\n state?: string;\n };\n}\n\nexport interface WebTasksPayload {\n tasks: WebTask[];\n rev: number;\n}\n"],"mappings":""}
|
package/dist/types/webTasks.mjs
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"webTasks.mjs","names":[],"sources":["../../src/types/webTasks.ts"],"sourcesContent":["/** Browser-safe task view published by the cockpit hub channel. */\nexport const TASKS_CHANNEL_TYPE = 'task_graph';\n\nexport type WebTaskStatus = 'pending' | 'in_progress' | 'completed' | 'failed' | 'deleted';\n\nexport interface WebTask {\n id: number;\n subject: string;\n description?: string;\n activeForm?: string;\n status: WebTaskStatus;\n blockedBy: number[];\n owner?: string;\n updatedAt?: string;\n delegation?: {\n agent?: string;\n state?: string;\n };\n}\n\nexport interface WebTasksPayload {\n tasks: WebTask[];\n rev: number;\n}\n"],"mappings":"AACA,MAAa,EAAqB"}
|
package/src/extensions/web.ts
DELETED
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
import { defineWebPlugin } from '@agimon-ai/doompi-core/web';
|
|
2
|
-
|
|
3
|
-
import { TasksActivitySection } from '../web/components/TasksActivitySection';
|
|
4
|
-
import { TaskToolMessage } from '../web/components/TaskToolMessage';
|
|
5
|
-
import { tasksChannel } from '../web/stores/tasksStore';
|
|
6
|
-
|
|
7
|
-
/**
|
|
8
|
-
* This package's cockpit presence: the live session task graph in the activity
|
|
9
|
-
* dock and the task tool's timeline card.
|
|
10
|
-
*/
|
|
11
|
-
export const webPlugin = defineWebPlugin({
|
|
12
|
-
id: 'task',
|
|
13
|
-
session: {
|
|
14
|
-
channels: [tasksChannel],
|
|
15
|
-
activitySections: [{ id: 'tasks', component: TasksActivitySection }],
|
|
16
|
-
toolRenderers: [{ tools: ['task'], message: TaskToolMessage }],
|
|
17
|
-
},
|
|
18
|
-
});
|
|
@@ -1,251 +0,0 @@
|
|
|
1
|
-
import type { SessionFrameSender } from '@agimon-ai/doompi-core/web';
|
|
2
|
-
import {
|
|
3
|
-
Button,
|
|
4
|
-
Dialog,
|
|
5
|
-
DialogBody,
|
|
6
|
-
DialogContent,
|
|
7
|
-
DialogFooter,
|
|
8
|
-
DialogHeader,
|
|
9
|
-
DialogTitle,
|
|
10
|
-
Input,
|
|
11
|
-
Select,
|
|
12
|
-
SelectContent,
|
|
13
|
-
SelectItem,
|
|
14
|
-
SelectTrigger,
|
|
15
|
-
SelectValue,
|
|
16
|
-
Textarea,
|
|
17
|
-
} from '@agimon-ai/doompi-web-components';
|
|
18
|
-
import { type ReactNode, useState } from 'react';
|
|
19
|
-
|
|
20
|
-
import type { WebTask, WebTaskStatus } from '../../types/webTasks';
|
|
21
|
-
import { requestTaskEdit, requestTaskMessage, taskEditDraft, type TaskEditDraft } from '../stores/tasksStore';
|
|
22
|
-
|
|
23
|
-
/** How the one task dialog is opened: reading it, changing it, or steering its run. */
|
|
24
|
-
export type TaskDialogMode = 'view' | 'edit' | 'message';
|
|
25
|
-
|
|
26
|
-
const STATUS_CHOICES: readonly WebTaskStatus[] = ['pending', 'in_progress', 'completed', 'failed'];
|
|
27
|
-
const DESCRIPTION_ROWS = 5;
|
|
28
|
-
const MESSAGE_ROWS = 4;
|
|
29
|
-
|
|
30
|
-
function FieldLabel({ children }: { children: string }) {
|
|
31
|
-
return <span className="text-2xs font-bold tracking-widest text-doom-faint">{children}</span>;
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
function Field({ label, children }: { label: string; children: ReactNode }) {
|
|
35
|
-
return (
|
|
36
|
-
<div className="flex flex-col gap-1.5">
|
|
37
|
-
<FieldLabel>{label}</FieldLabel>
|
|
38
|
-
{children}
|
|
39
|
-
</div>
|
|
40
|
-
);
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
function ReadOnlyValue({ value, testId }: { value: string; testId: string }) {
|
|
44
|
-
return (
|
|
45
|
-
<span data-testid={testId} className="whitespace-pre-wrap break-words text-sm leading-relaxed text-doom-dim">
|
|
46
|
-
{value}
|
|
47
|
-
</span>
|
|
48
|
-
);
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
function TaskFacts({ task }: { task: WebTask }) {
|
|
52
|
-
return (
|
|
53
|
-
<div className="flex flex-wrap gap-5">
|
|
54
|
-
<Field label="STATUS">
|
|
55
|
-
<ReadOnlyValue testId="task-detail-status" value={task.status.replace('_', ' ')} />
|
|
56
|
-
</Field>
|
|
57
|
-
{task.activeForm ? (
|
|
58
|
-
<Field label="ACTIVE FORM">
|
|
59
|
-
<ReadOnlyValue testId="task-detail-active-form" value={task.activeForm} />
|
|
60
|
-
</Field>
|
|
61
|
-
) : null}
|
|
62
|
-
{task.owner ? (
|
|
63
|
-
<Field label="OWNER">
|
|
64
|
-
<ReadOnlyValue testId="task-detail-owner" value={task.owner} />
|
|
65
|
-
</Field>
|
|
66
|
-
) : null}
|
|
67
|
-
{task.delegation?.agent ? (
|
|
68
|
-
<Field label="DELEGATED TO">
|
|
69
|
-
<ReadOnlyValue
|
|
70
|
-
testId="task-detail-agent"
|
|
71
|
-
value={
|
|
72
|
-
task.delegation.state ? `${task.delegation.agent} · ${task.delegation.state}` : task.delegation.agent
|
|
73
|
-
}
|
|
74
|
-
/>
|
|
75
|
-
</Field>
|
|
76
|
-
) : null}
|
|
77
|
-
{task.blockedBy.length > 0 ? (
|
|
78
|
-
<Field label="BLOCKED BY">
|
|
79
|
-
<ReadOnlyValue testId="task-detail-blocked-by" value={task.blockedBy.map((id) => `#${id}`).join(', ')} />
|
|
80
|
-
</Field>
|
|
81
|
-
) : null}
|
|
82
|
-
{task.updatedAt ? (
|
|
83
|
-
<Field label="UPDATED">
|
|
84
|
-
<ReadOnlyValue testId="task-detail-updated" value={task.updatedAt} />
|
|
85
|
-
</Field>
|
|
86
|
-
) : null}
|
|
87
|
-
</div>
|
|
88
|
-
);
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
/**
|
|
92
|
-
* One task, read first and changed second. Every change leaves as a prompt the
|
|
93
|
-
* session can see, so the agent remains the only writer of task state.
|
|
94
|
-
*/
|
|
95
|
-
export function TaskDetailDialog({
|
|
96
|
-
task,
|
|
97
|
-
sessionId,
|
|
98
|
-
mode: initialMode,
|
|
99
|
-
send,
|
|
100
|
-
onClose,
|
|
101
|
-
}: {
|
|
102
|
-
task: WebTask;
|
|
103
|
-
sessionId: string;
|
|
104
|
-
mode: TaskDialogMode;
|
|
105
|
-
send: SessionFrameSender;
|
|
106
|
-
onClose: () => void;
|
|
107
|
-
}) {
|
|
108
|
-
const [mode, setMode] = useState<TaskDialogMode>(initialMode);
|
|
109
|
-
const [draft, setDraft] = useState<TaskEditDraft>(() => taskEditDraft(task));
|
|
110
|
-
const [message, setMessage] = useState('');
|
|
111
|
-
const agent = task.delegation?.agent;
|
|
112
|
-
|
|
113
|
-
const submitEdit = (): void => {
|
|
114
|
-
if (requestTaskEdit(send, sessionId, task, draft)) onClose();
|
|
115
|
-
};
|
|
116
|
-
const submitMessage = (): void => {
|
|
117
|
-
if (!message.trim() || !agent) return;
|
|
118
|
-
requestTaskMessage(send, sessionId, task.id, agent, message);
|
|
119
|
-
onClose();
|
|
120
|
-
};
|
|
121
|
-
|
|
122
|
-
return (
|
|
123
|
-
<Dialog
|
|
124
|
-
open
|
|
125
|
-
onOpenChange={(open) => {
|
|
126
|
-
if (!open) onClose();
|
|
127
|
-
}}
|
|
128
|
-
>
|
|
129
|
-
<DialogContent width="lg" data-testid="task-detail-dialog" data-mode={mode} aria-describedby={undefined}>
|
|
130
|
-
<DialogHeader>
|
|
131
|
-
<div className="flex min-w-0 flex-col items-start gap-1 sm:flex-row sm:items-center sm:gap-2.5">
|
|
132
|
-
<span className="text-2xs text-doom-faint">task #{task.id}</span>
|
|
133
|
-
<DialogTitle data-testid="task-detail-title" className="max-w-full break-words">
|
|
134
|
-
{task.subject}
|
|
135
|
-
</DialogTitle>
|
|
136
|
-
</div>
|
|
137
|
-
</DialogHeader>
|
|
138
|
-
<DialogBody>
|
|
139
|
-
{mode === 'view' ? (
|
|
140
|
-
<>
|
|
141
|
-
<Field label="DESCRIPTION">
|
|
142
|
-
<ReadOnlyValue
|
|
143
|
-
testId="task-detail-description"
|
|
144
|
-
value={task.description ?? 'no description on this task'}
|
|
145
|
-
/>
|
|
146
|
-
</Field>
|
|
147
|
-
<TaskFacts task={task} />
|
|
148
|
-
<DialogFooter>
|
|
149
|
-
<span className="min-w-0 flex-1" />
|
|
150
|
-
{agent ? (
|
|
151
|
-
<Button
|
|
152
|
-
variant="outline"
|
|
153
|
-
size="xs"
|
|
154
|
-
data-testid="task-detail-open-message"
|
|
155
|
-
onClick={() => setMode('message')}
|
|
156
|
-
>
|
|
157
|
-
message agent
|
|
158
|
-
</Button>
|
|
159
|
-
) : null}
|
|
160
|
-
<Button variant="primary" size="xs" data-testid="task-detail-open-edit" onClick={() => setMode('edit')}>
|
|
161
|
-
edit
|
|
162
|
-
</Button>
|
|
163
|
-
</DialogFooter>
|
|
164
|
-
</>
|
|
165
|
-
) : null}
|
|
166
|
-
|
|
167
|
-
{mode === 'edit' ? (
|
|
168
|
-
<>
|
|
169
|
-
<Field label="SUBJECT">
|
|
170
|
-
<Input
|
|
171
|
-
data-testid="task-detail-subject-input"
|
|
172
|
-
autoFocus
|
|
173
|
-
value={draft.subject}
|
|
174
|
-
onChange={(event) => setDraft({ ...draft, subject: event.target.value })}
|
|
175
|
-
/>
|
|
176
|
-
</Field>
|
|
177
|
-
<Field label="DESCRIPTION">
|
|
178
|
-
<Textarea
|
|
179
|
-
data-testid="task-detail-description-input"
|
|
180
|
-
rows={DESCRIPTION_ROWS}
|
|
181
|
-
value={draft.description}
|
|
182
|
-
placeholder="what this task covers"
|
|
183
|
-
onChange={(event) => setDraft({ ...draft, description: event.target.value })}
|
|
184
|
-
/>
|
|
185
|
-
</Field>
|
|
186
|
-
<Field label="STATUS">
|
|
187
|
-
<Select
|
|
188
|
-
value={draft.status}
|
|
189
|
-
onValueChange={(value) => setDraft({ ...draft, status: value as WebTaskStatus })}
|
|
190
|
-
>
|
|
191
|
-
<SelectTrigger
|
|
192
|
-
data-testid="task-detail-status-input"
|
|
193
|
-
className="h-7 w-full min-w-0 text-xs sm:min-w-[200px]"
|
|
194
|
-
>
|
|
195
|
-
<SelectValue />
|
|
196
|
-
</SelectTrigger>
|
|
197
|
-
<SelectContent>
|
|
198
|
-
{STATUS_CHOICES.map((status) => (
|
|
199
|
-
<SelectItem key={status} value={status}>
|
|
200
|
-
{status.replace('_', ' ')}
|
|
201
|
-
</SelectItem>
|
|
202
|
-
))}
|
|
203
|
-
</SelectContent>
|
|
204
|
-
</Select>
|
|
205
|
-
</Field>
|
|
206
|
-
<DialogFooter className="flex-wrap sm:flex-nowrap">
|
|
207
|
-
<span className="w-full text-2xs text-doom-faint sm:w-auto">
|
|
208
|
-
saved as one prompt naming only the fields you changed
|
|
209
|
-
</span>
|
|
210
|
-
<span className="min-w-0 flex-1" />
|
|
211
|
-
<Button variant="outline" size="xs" data-testid="task-detail-cancel" onClick={onClose}>
|
|
212
|
-
cancel
|
|
213
|
-
</Button>
|
|
214
|
-
<Button variant="primary" size="xs" data-testid="task-detail-save" onClick={submitEdit}>
|
|
215
|
-
save
|
|
216
|
-
</Button>
|
|
217
|
-
</DialogFooter>
|
|
218
|
-
</>
|
|
219
|
-
) : null}
|
|
220
|
-
|
|
221
|
-
{mode === 'message' && agent ? (
|
|
222
|
-
<>
|
|
223
|
-
<Field label={`MESSAGE TO ${agent.toUpperCase()}`}>
|
|
224
|
-
<Textarea
|
|
225
|
-
data-testid="task-detail-message-input"
|
|
226
|
-
autoFocus
|
|
227
|
-
rows={MESSAGE_ROWS}
|
|
228
|
-
value={message}
|
|
229
|
-
placeholder="guidance for the run working on this task"
|
|
230
|
-
onChange={(event) => setMessage(event.target.value)}
|
|
231
|
-
/>
|
|
232
|
-
</Field>
|
|
233
|
-
<DialogFooter className="flex-wrap sm:flex-nowrap">
|
|
234
|
-
<span className="w-full text-2xs text-doom-faint sm:w-auto">
|
|
235
|
-
steers the run, it does not edit the task
|
|
236
|
-
</span>
|
|
237
|
-
<span className="min-w-0 flex-1" />
|
|
238
|
-
<Button variant="outline" size="xs" data-testid="task-detail-cancel" onClick={onClose}>
|
|
239
|
-
cancel
|
|
240
|
-
</Button>
|
|
241
|
-
<Button variant="primary" size="xs" data-testid="task-detail-send" onClick={submitMessage}>
|
|
242
|
-
send
|
|
243
|
-
</Button>
|
|
244
|
-
</DialogFooter>
|
|
245
|
-
</>
|
|
246
|
-
) : null}
|
|
247
|
-
</DialogBody>
|
|
248
|
-
</DialogContent>
|
|
249
|
-
</Dialog>
|
|
250
|
-
);
|
|
251
|
-
}
|
|
@@ -1,120 +0,0 @@
|
|
|
1
|
-
import type { ToolMessageRenderProps } from '@agimon-ai/doompi-core/web';
|
|
2
|
-
import {
|
|
3
|
-
MessageItem,
|
|
4
|
-
MessageItemBody,
|
|
5
|
-
MessageItemHeader,
|
|
6
|
-
MessageItemStatus,
|
|
7
|
-
type StatusTone,
|
|
8
|
-
toolTone,
|
|
9
|
-
} from '@agimon-ai/doompi-web-components';
|
|
10
|
-
|
|
11
|
-
import {
|
|
12
|
-
STATUS_LABEL,
|
|
13
|
-
type TaskResultTone,
|
|
14
|
-
type TaskRow,
|
|
15
|
-
type TaskStatus,
|
|
16
|
-
taskCallView,
|
|
17
|
-
taskResultView,
|
|
18
|
-
} from '../lib/taskToolFormat';
|
|
19
|
-
|
|
20
|
-
const STATUS_TONE: Record<TaskStatus, string> = {
|
|
21
|
-
pending: 'text-doom-dim',
|
|
22
|
-
in_progress: 'text-doom-yellow',
|
|
23
|
-
completed: 'text-doom-green',
|
|
24
|
-
failed: 'text-doom-red',
|
|
25
|
-
deleted: 'text-doom-faint',
|
|
26
|
-
};
|
|
27
|
-
|
|
28
|
-
const RESULT_TONE: Record<TaskResultTone, StatusTone> = {
|
|
29
|
-
running: 'running',
|
|
30
|
-
ok: 'ok',
|
|
31
|
-
error: 'error',
|
|
32
|
-
warning: 'running',
|
|
33
|
-
};
|
|
34
|
-
|
|
35
|
-
/** One task row: status glyph, id, subject and chips on the left, the status label flushed right. */
|
|
36
|
-
function TaskRowLine({ row }: { row: TaskRow }) {
|
|
37
|
-
return (
|
|
38
|
-
<li data-testid="tool-result-task-row" data-task-id={row.id} className="flex items-baseline gap-2">
|
|
39
|
-
<span className={`shrink-0 ${STATUS_TONE[row.status]}`}>{row.glyph}</span>
|
|
40
|
-
<span className="shrink-0 text-doom-faint">#{row.id}</span>
|
|
41
|
-
<span
|
|
42
|
-
className={`min-w-0 flex-1 truncate ${row.closed ? 'text-doom-faint line-through' : row.status === 'in_progress' ? 'text-doom-blue' : 'text-doom-text'}`}
|
|
43
|
-
>
|
|
44
|
-
{row.subject}
|
|
45
|
-
{row.agent ? <span className="text-doom-faint"> [{row.agent}]</span> : null}
|
|
46
|
-
{row.activeForm ? <span className="text-doom-faint"> ({row.activeForm})</span> : null}
|
|
47
|
-
{row.blockedBy.length > 0 ? (
|
|
48
|
-
<span className="text-doom-faint"> ⛓ {row.blockedBy.map((id) => `#${id}`).join(',')}</span>
|
|
49
|
-
) : null}
|
|
50
|
-
</span>
|
|
51
|
-
<span className={`shrink-0 ${STATUS_TONE[row.status]}`}>{STATUS_LABEL[row.status]}</span>
|
|
52
|
-
</li>
|
|
53
|
-
);
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
/**
|
|
57
|
-
* The task tool's timeline item: `glyph action subject` with the assignee or
|
|
58
|
-
* list filter in the header, as renderTaskCall shows it; the rows the action
|
|
59
|
-
* touched, then the batch or list summary, in the body, as renderTaskResult
|
|
60
|
-
* lays it out.
|
|
61
|
-
*/
|
|
62
|
-
export function TaskToolMessage({ args, result, output, running, isError }: ToolMessageRenderProps) {
|
|
63
|
-
const call = taskCallView(args);
|
|
64
|
-
const collapsed = taskResultView({ details: result?.details, output, expanded: false, isPartial: running, isError });
|
|
65
|
-
const full = taskResultView({ details: result?.details, output, expanded: true, isPartial: running, isError });
|
|
66
|
-
const hidden = full.rows.length - collapsed.rows.length + (full.errorLines.length - collapsed.errorLines.length);
|
|
67
|
-
return (
|
|
68
|
-
<MessageItem tone={toolTone({ running, isError })} expandable={hidden > 0}>
|
|
69
|
-
{({ expanded }) => {
|
|
70
|
-
const view = expanded ? full : collapsed;
|
|
71
|
-
const empty = view.rows.length === 0 && view.errorLines.length === 0 && view.status === null;
|
|
72
|
-
return (
|
|
73
|
-
<>
|
|
74
|
-
<MessageItemHeader title="task">
|
|
75
|
-
<span data-testid="tool-call-task" className="flex min-w-0 flex-1 items-center gap-1.5">
|
|
76
|
-
<span className="shrink-0 text-doom-text">
|
|
77
|
-
{call.glyph} {call.action}
|
|
78
|
-
</span>
|
|
79
|
-
{call.subject ? (
|
|
80
|
-
<span
|
|
81
|
-
className={`min-w-0 truncate ${call.subjectTone === 'accent' ? 'text-doom-blue' : 'text-doom-dim'}`}
|
|
82
|
-
>
|
|
83
|
-
{call.subject}
|
|
84
|
-
</span>
|
|
85
|
-
) : null}
|
|
86
|
-
{call.detail ? <span className="shrink-0 text-doom-faint">{call.detail}</span> : null}
|
|
87
|
-
</span>
|
|
88
|
-
</MessageItemHeader>
|
|
89
|
-
{empty ? null : (
|
|
90
|
-
<MessageItemBody data-testid="tool-result-task" className="flex flex-col gap-1">
|
|
91
|
-
{view.rows.length > 0 ? (
|
|
92
|
-
<ul className="flex flex-col gap-0.5">
|
|
93
|
-
{view.rows.map((row) => (
|
|
94
|
-
<TaskRowLine key={row.id} row={row} />
|
|
95
|
-
))}
|
|
96
|
-
</ul>
|
|
97
|
-
) : null}
|
|
98
|
-
{view.errorLines.length > 0 ? (
|
|
99
|
-
<pre className="whitespace-pre-wrap break-words font-mono text-doom-dim">
|
|
100
|
-
{view.errorLines.join('\n')}
|
|
101
|
-
</pre>
|
|
102
|
-
) : null}
|
|
103
|
-
{!expanded && hidden > 0 ? <MessageItemStatus expands>{hidden} more</MessageItemStatus> : null}
|
|
104
|
-
{view.status ? (
|
|
105
|
-
<MessageItemStatus
|
|
106
|
-
data-testid="tool-result-task-status"
|
|
107
|
-
tone={RESULT_TONE[view.status.tone]}
|
|
108
|
-
glyph={view.status.glyph}
|
|
109
|
-
>
|
|
110
|
-
{view.status.text}
|
|
111
|
-
</MessageItemStatus>
|
|
112
|
-
) : null}
|
|
113
|
-
</MessageItemBody>
|
|
114
|
-
)}
|
|
115
|
-
</>
|
|
116
|
-
);
|
|
117
|
-
}}
|
|
118
|
-
</MessageItem>
|
|
119
|
-
);
|
|
120
|
-
}
|
|
@@ -1,200 +0,0 @@
|
|
|
1
|
-
import type { WebPluginSlotProps } from '@agimon-ai/doompi-core/web';
|
|
2
|
-
import {
|
|
3
|
-
Button,
|
|
4
|
-
ChevronDownIcon,
|
|
5
|
-
ChevronRightIcon,
|
|
6
|
-
Dot,
|
|
7
|
-
DropdownMenu,
|
|
8
|
-
DropdownMenuContent,
|
|
9
|
-
DropdownMenuItem,
|
|
10
|
-
DropdownMenuTrigger,
|
|
11
|
-
EditIcon,
|
|
12
|
-
KebabIcon,
|
|
13
|
-
MessageIcon,
|
|
14
|
-
TrashIcon,
|
|
15
|
-
type DotTone,
|
|
16
|
-
} from '@agimon-ai/doompi-web-components';
|
|
17
|
-
import { useStore } from '@tanstack/react-store';
|
|
18
|
-
import { useState } from 'react';
|
|
19
|
-
|
|
20
|
-
import type { WebTask } from '../../types/webTasks';
|
|
21
|
-
import { requestTaskRemoval, tasks } from '../stores/tasksStore';
|
|
22
|
-
import { TaskDetailDialog, type TaskDialogMode } from './TaskDetailDialog';
|
|
23
|
-
|
|
24
|
-
const STATUS_TONE: Readonly<Record<WebTask['status'], DotTone>> = {
|
|
25
|
-
pending: 'muted',
|
|
26
|
-
in_progress: 'yellow',
|
|
27
|
-
completed: 'green',
|
|
28
|
-
failed: 'red',
|
|
29
|
-
deleted: 'muted',
|
|
30
|
-
};
|
|
31
|
-
|
|
32
|
-
interface DialogState {
|
|
33
|
-
taskId: number;
|
|
34
|
-
mode: TaskDialogMode;
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
function TaskRow({
|
|
38
|
-
task,
|
|
39
|
-
sessionId,
|
|
40
|
-
sendSessionFrame,
|
|
41
|
-
openDialog,
|
|
42
|
-
}: {
|
|
43
|
-
task: WebTask;
|
|
44
|
-
sessionId: string;
|
|
45
|
-
sendSessionFrame: WebPluginSlotProps['sendSessionFrame'];
|
|
46
|
-
openDialog: (mode: TaskDialogMode) => void;
|
|
47
|
-
}) {
|
|
48
|
-
const detail = task.status === 'in_progress' ? task.activeForm : task.description;
|
|
49
|
-
const agent = task.delegation?.agent;
|
|
50
|
-
return (
|
|
51
|
-
<div
|
|
52
|
-
data-testid={`activity-task-${task.id}`}
|
|
53
|
-
data-task-status={task.status}
|
|
54
|
-
className="flex flex-col gap-1 rounded-md px-1 py-1"
|
|
55
|
-
>
|
|
56
|
-
<div className="grid min-w-0 grid-cols-[auto_minmax(0,1fr)_auto_auto] items-center gap-x-1.5">
|
|
57
|
-
<Dot tone={STATUS_TONE[task.status]} pulse={task.status === 'in_progress'} />
|
|
58
|
-
<button
|
|
59
|
-
type="button"
|
|
60
|
-
data-testid={`activity-task-title-${task.id}`}
|
|
61
|
-
title={task.subject}
|
|
62
|
-
onClick={() => openDialog('view')}
|
|
63
|
-
className={`min-w-0 truncate text-left text-xs font-bold hover:underline ${task.status === 'failed' ? 'text-doom-red' : task.status === 'completed' ? 'text-doom-dim' : 'text-doom-hi'}`}
|
|
64
|
-
>
|
|
65
|
-
<span className="text-doom-faint">#{task.id}</span> {task.subject}
|
|
66
|
-
</button>
|
|
67
|
-
<span className="shrink-0 text-2xs text-doom-faint">{task.status.replace('_', ' ')}</span>
|
|
68
|
-
{task.status !== 'completed' && task.status !== 'deleted' ? (
|
|
69
|
-
<DropdownMenu>
|
|
70
|
-
<DropdownMenuTrigger asChild>
|
|
71
|
-
<Button
|
|
72
|
-
variant="ghost"
|
|
73
|
-
size="icon"
|
|
74
|
-
data-testid={`activity-task-menu-${task.id}`}
|
|
75
|
-
aria-label={`task #${task.id} actions`}
|
|
76
|
-
title={`task #${task.id} actions`}
|
|
77
|
-
className="self-center shrink-0 text-doom-faint hover:bg-doom-deep hover:text-doom-hi data-[state=open]:bg-doom-deep data-[state=open]:text-doom-hi"
|
|
78
|
-
>
|
|
79
|
-
<KebabIcon className="h-3 w-3" />
|
|
80
|
-
</Button>
|
|
81
|
-
</DropdownMenuTrigger>
|
|
82
|
-
<DropdownMenuContent data-testid={`activity-task-menu-list-${task.id}`}>
|
|
83
|
-
<DropdownMenuItem data-testid={`activity-task-edit-${task.id}`} onSelect={() => openDialog('edit')}>
|
|
84
|
-
<EditIcon className="h-3 w-3" />
|
|
85
|
-
Edit
|
|
86
|
-
</DropdownMenuItem>
|
|
87
|
-
{agent ? (
|
|
88
|
-
<DropdownMenuItem
|
|
89
|
-
data-testid={`activity-task-message-${task.id}`}
|
|
90
|
-
onSelect={() => openDialog('message')}
|
|
91
|
-
>
|
|
92
|
-
<MessageIcon className="h-3 w-3" />
|
|
93
|
-
Message agent
|
|
94
|
-
</DropdownMenuItem>
|
|
95
|
-
) : null}
|
|
96
|
-
<DropdownMenuItem
|
|
97
|
-
variant="destructive"
|
|
98
|
-
data-testid={`activity-task-remove-${task.id}`}
|
|
99
|
-
onSelect={() => requestTaskRemoval(sendSessionFrame, sessionId, task.id)}
|
|
100
|
-
>
|
|
101
|
-
<TrashIcon className="h-3 w-3" />
|
|
102
|
-
Remove
|
|
103
|
-
</DropdownMenuItem>
|
|
104
|
-
</DropdownMenuContent>
|
|
105
|
-
</DropdownMenu>
|
|
106
|
-
) : null}
|
|
107
|
-
</div>
|
|
108
|
-
{detail || agent || task.blockedBy.length > 0 ? (
|
|
109
|
-
<span className="truncate pl-3 text-2xs text-doom-faint">
|
|
110
|
-
{agent ? `[${agent}] ` : ''}
|
|
111
|
-
{detail ?? ''}
|
|
112
|
-
{task.blockedBy.length > 0 ? ` · blocked by ${task.blockedBy.map((id) => `#${id}`).join(', ')}` : ''}
|
|
113
|
-
</span>
|
|
114
|
-
) : null}
|
|
115
|
-
</div>
|
|
116
|
-
);
|
|
117
|
-
}
|
|
118
|
-
|
|
119
|
-
/** Session task graph in the activity dock. Empty graphs have no cockpit presence. */
|
|
120
|
-
export function TasksActivitySection({ sessionId, sendSessionFrame }: WebPluginSlotProps) {
|
|
121
|
-
const sessionTasks = useStore(tasks.store, (state) => tasks.select(state, sessionId).tasks);
|
|
122
|
-
const [historyOpen, setHistoryOpen] = useState(false);
|
|
123
|
-
const [dialog, setDialog] = useState<DialogState>();
|
|
124
|
-
if (sessionId === null || sessionTasks.length === 0) return null;
|
|
125
|
-
|
|
126
|
-
const active = sessionTasks.filter((task) => task.status === 'pending' || task.status === 'in_progress');
|
|
127
|
-
const history = sessionTasks.filter((task) => task.status === 'completed' || task.status === 'failed');
|
|
128
|
-
const dialogTask = dialog ? sessionTasks.find((task) => task.id === dialog.taskId) : undefined;
|
|
129
|
-
return (
|
|
130
|
-
<section data-testid="activity-tasks" className="flex flex-col gap-2 border-b border-doom-border-soft px-3 py-3">
|
|
131
|
-
<div className="flex items-center gap-2 px-1">
|
|
132
|
-
<span
|
|
133
|
-
aria-hidden
|
|
134
|
-
className={
|
|
135
|
-
active.length > 0 ? 'animate-pulse text-sm font-bold text-doom-yellow' : 'text-sm font-bold text-doom-faint'
|
|
136
|
-
}
|
|
137
|
-
>
|
|
138
|
-
#
|
|
139
|
-
</span>
|
|
140
|
-
<span className="flex-1 text-sm font-bold text-doom-text">tasks</span>
|
|
141
|
-
<span className="text-2xs text-doom-faint">{active.length} active</span>
|
|
142
|
-
</div>
|
|
143
|
-
{active.length > 0 ? (
|
|
144
|
-
<div className="flex flex-col gap-0.5">
|
|
145
|
-
{active.map((task) => (
|
|
146
|
-
<TaskRow
|
|
147
|
-
key={task.id}
|
|
148
|
-
task={task}
|
|
149
|
-
sessionId={sessionId}
|
|
150
|
-
sendSessionFrame={sendSessionFrame}
|
|
151
|
-
openDialog={(mode) => setDialog({ taskId: task.id, mode })}
|
|
152
|
-
/>
|
|
153
|
-
))}
|
|
154
|
-
</div>
|
|
155
|
-
) : null}
|
|
156
|
-
{history.length > 0 ? (
|
|
157
|
-
<div className="flex flex-col gap-0.5">
|
|
158
|
-
<Button
|
|
159
|
-
variant="ghost"
|
|
160
|
-
size="xs"
|
|
161
|
-
aria-expanded={historyOpen}
|
|
162
|
-
onClick={() => setHistoryOpen((open) => !open)}
|
|
163
|
-
className="justify-start gap-1.5 rounded-md px-1 py-0.5 hover:bg-doom-panel"
|
|
164
|
-
>
|
|
165
|
-
{historyOpen ? (
|
|
166
|
-
<ChevronDownIcon className="h-2.5 w-2.5 text-doom-faint" />
|
|
167
|
-
) : (
|
|
168
|
-
<ChevronRightIcon className="h-2.5 w-2.5 text-doom-faint" />
|
|
169
|
-
)}
|
|
170
|
-
<span className="text-xs font-bold text-doom-dim">session</span>
|
|
171
|
-
<span className="text-2xs text-doom-faint">{history.length}</span>
|
|
172
|
-
</Button>
|
|
173
|
-
{historyOpen ? (
|
|
174
|
-
<div className="flex flex-col gap-0.5 pl-2">
|
|
175
|
-
{history.map((task) => (
|
|
176
|
-
<TaskRow
|
|
177
|
-
key={task.id}
|
|
178
|
-
task={task}
|
|
179
|
-
sessionId={sessionId}
|
|
180
|
-
sendSessionFrame={sendSessionFrame}
|
|
181
|
-
openDialog={(mode) => setDialog({ taskId: task.id, mode })}
|
|
182
|
-
/>
|
|
183
|
-
))}
|
|
184
|
-
</div>
|
|
185
|
-
) : null}
|
|
186
|
-
</div>
|
|
187
|
-
) : null}
|
|
188
|
-
{dialog && dialogTask ? (
|
|
189
|
-
<TaskDetailDialog
|
|
190
|
-
key={`${dialogTask.id}-${dialog.mode}`}
|
|
191
|
-
task={dialogTask}
|
|
192
|
-
sessionId={sessionId}
|
|
193
|
-
mode={dialog.mode}
|
|
194
|
-
send={sendSessionFrame}
|
|
195
|
-
onClose={() => setDialog(undefined)}
|
|
196
|
-
/>
|
|
197
|
-
) : null}
|
|
198
|
-
</section>
|
|
199
|
-
);
|
|
200
|
-
}
|