@agimon-ai/po-task 0.0.0-alpha.0
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/LICENSE +21 -0
- package/README.md +131 -0
- package/dist/apiContracts.cjs +54 -0
- package/dist/apiContracts.cjs.map +1 -0
- package/dist/apiContracts.d.mts +53 -0
- package/dist/apiContracts.d.mts.map +1 -0
- package/dist/apiContracts.mjs +49 -0
- package/dist/apiContracts.mjs.map +1 -0
- package/dist/config-CFSs3iku.mjs +72 -0
- package/dist/config-CFSs3iku.mjs.map +1 -0
- package/dist/config-CdX-Bv8q.cjs +173 -0
- package/dist/config-CdX-Bv8q.cjs.map +1 -0
- package/dist/config.cjs +19 -0
- package/dist/config.d.mts +2 -0
- package/dist/config.mjs +2 -0
- package/dist/delegation-BiOy3_7g.mjs +7 -0
- package/dist/delegation-BiOy3_7g.mjs.map +1 -0
- package/dist/delegation-CdMqOZB4.mjs +626 -0
- package/dist/delegation-CdMqOZB4.mjs.map +1 -0
- package/dist/delegation-DsnKjMbJ.cjs +661 -0
- package/dist/delegation-DsnKjMbJ.cjs.map +1 -0
- package/dist/delegation-LDpHP2CC.cjs +12 -0
- package/dist/delegation-LDpHP2CC.cjs.map +1 -0
- package/dist/delegationManager.cjs +10 -0
- package/dist/delegationManager.d.mts +2 -0
- package/dist/delegationManager.mjs +3 -0
- package/dist/extensions/mcp-ui.mjs +23 -0
- package/dist/extensions/mcp-ui.mjs.map +1 -0
- package/dist/extensions/mcp.cjs +1144 -0
- package/dist/extensions/mcp.cjs.map +1 -0
- package/dist/extensions/mcp.d.mts +5 -0
- package/dist/extensions/mcp.d.mts.map +1 -0
- package/dist/extensions/mcp.mjs +1115 -0
- package/dist/extensions/mcp.mjs.map +1 -0
- package/dist/extensions/native.mjs +1175 -0
- package/dist/extensions/native.mjs.map +1 -0
- package/dist/extensions/server.cjs +569 -0
- package/dist/extensions/server.cjs.map +1 -0
- package/dist/extensions/server.d.mts +5 -0
- package/dist/extensions/server.d.mts.map +1 -0
- package/dist/extensions/server.mjs +563 -0
- package/dist/extensions/server.mjs.map +1 -0
- package/dist/extensions/web.mjs +1018 -0
- package/dist/extensions/web.mjs.map +1 -0
- package/dist/index-B-3sCF2S.d.mts +43 -0
- package/dist/index-B-3sCF2S.d.mts.map +1 -0
- package/dist/index-B1JPJdpZ.d.mts +51 -0
- package/dist/index-B1JPJdpZ.d.mts.map +1 -0
- package/dist/index-CUWCvh-E.d.mts +72 -0
- package/dist/index-CUWCvh-E.d.mts.map +1 -0
- package/dist/index-DlmXKyhQ.d.mts +34 -0
- package/dist/index-DlmXKyhQ.d.mts.map +1 -0
- package/dist/index-Dvb8X_qB.d.mts +67 -0
- package/dist/index-Dvb8X_qB.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-teIf67qQ.d.mts +196 -0
- package/dist/index-teIf67qQ.d.mts.map +1 -0
- package/dist/index.cjs +93 -0
- package/dist/index.d.mts +11 -0
- package/dist/index.mjs +12 -0
- package/dist/invariants-DhjEjBPU.cjs +79 -0
- package/dist/invariants-DhjEjBPU.cjs.map +1 -0
- package/dist/invariants-q_UamF7D.mjs +62 -0
- package/dist/invariants-q_UamF7D.mjs.map +1 -0
- package/dist/logSinkTelemetry-B23qGiP-.cjs +52 -0
- package/dist/logSinkTelemetry-B23qGiP-.cjs.map +1 -0
- package/dist/logSinkTelemetry-BMBsC54p.mjs +41 -0
- package/dist/logSinkTelemetry-BMBsC54p.mjs.map +1 -0
- package/dist/logSinkTelemetry.cjs +6 -0
- package/dist/logSinkTelemetry.d.mts +23 -0
- package/dist/logSinkTelemetry.d.mts.map +1 -0
- package/dist/logSinkTelemetry.mjs +3 -0
- package/dist/paths-CSya2l9_.cjs +308 -0
- package/dist/paths-CSya2l9_.cjs.map +1 -0
- package/dist/paths-Cah1vFGv.mjs +207 -0
- package/dist/paths-Cah1vFGv.mjs.map +1 -0
- package/dist/processLiveness-Ccd9wenT.mjs +20 -0
- package/dist/processLiveness-Ccd9wenT.mjs.map +1 -0
- package/dist/processLiveness-umpNgsPR.cjs +25 -0
- package/dist/processLiveness-umpNgsPR.cjs.map +1 -0
- package/dist/reconcile-BcD-hTbd.mjs +63 -0
- package/dist/reconcile-BcD-hTbd.mjs.map +1 -0
- package/dist/reconcile-cRL0NjDr.cjs +80 -0
- package/dist/reconcile-cRL0NjDr.cjs.map +1 -0
- package/dist/reducer-BEfJFM5L.mjs +345 -0
- package/dist/reducer-BEfJFM5L.mjs.map +1 -0
- package/dist/reducer-BV0YIZ2o.cjs +380 -0
- package/dist/reducer-BV0YIZ2o.cjs.map +1 -0
- package/dist/storeInvariants.cjs +5 -0
- package/dist/storeInvariants.d.mts +23 -0
- 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/storeProcessLiveness.d.mts +11 -0
- 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/storeTaskGraph.cjs +7 -0
- 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/storeTypes.cjs +6 -0
- package/dist/storeTypes.d.mts +2 -0
- package/dist/storeTypes.mjs +2 -0
- package/dist/task-CXF9VULl.cjs +49 -0
- package/dist/task-CXF9VULl.cjs.map +1 -0
- package/dist/task-DJpTteeJ.d.mts +187 -0
- package/dist/task-DJpTteeJ.d.mts.map +1 -0
- package/dist/task-DO0TwZ0z.mjs +132 -0
- package/dist/task-DO0TwZ0z.mjs.map +1 -0
- package/dist/task-Dhta7JyA.d.mts +126 -0
- package/dist/task-Dhta7JyA.d.mts.map +1 -0
- package/dist/task-UvW877Ez.cjs +227 -0
- package/dist/task-UvW877Ez.cjs.map +1 -0
- package/dist/task-giCbpKzV.mjs +26 -0
- package/dist/task-giCbpKzV.mjs.map +1 -0
- package/dist/taskGraph-BOQvT0-M.mjs +63 -0
- package/dist/taskGraph-BOQvT0-M.mjs.map +1 -0
- package/dist/taskGraph-BskRslrr.cjs +92 -0
- package/dist/taskGraph-BskRslrr.cjs.map +1 -0
- package/dist/taskGraph-D0zFHF2p.d.mts +25 -0
- package/dist/taskGraph-D0zFHF2p.d.mts.map +1 -0
- package/dist/taskResult-D2G7b4w-.cjs +224 -0
- package/dist/taskResult-D2G7b4w-.cjs.map +1 -0
- package/dist/taskResult-edBAAKSH.mjs +165 -0
- package/dist/taskResult-edBAAKSH.mjs.map +1 -0
- package/dist/taskStore-DjU60rMm.cjs +215 -0
- package/dist/taskStore-DjU60rMm.cjs.map +1 -0
- package/dist/taskStore-pAJ971Ml.mjs +208 -0
- package/dist/taskStore-pAJ971Ml.mjs.map +1 -0
- package/dist/telemetry-Ca0I3Tqo.cjs +30 -0
- package/dist/telemetry-Ca0I3Tqo.cjs.map +1 -0
- package/dist/telemetry-DyS44zAD.mjs +25 -0
- package/dist/telemetry-DyS44zAD.mjs.map +1 -0
- package/dist/telemetry-FMGRovb4.d.mts +35 -0
- package/dist/telemetry-FMGRovb4.d.mts.map +1 -0
- package/dist/toolPromptGuidelines.cjs +27 -0
- package/dist/toolPromptGuidelines.cjs.map +1 -0
- package/dist/toolPromptGuidelines.d.mts +13 -0
- package/dist/toolPromptGuidelines.d.mts.map +1 -0
- package/dist/toolPromptGuidelines.mjs +26 -0
- package/dist/toolPromptGuidelines.mjs.map +1 -0
- package/dist/toolResponseEnvelope.cjs +12 -0
- package/dist/toolResponseEnvelope.d.mts +2 -0
- package/dist/toolResponseEnvelope.mjs +2 -0
- package/dist/toolSchema.cjs +18 -0
- package/dist/toolSchema.d.mts +2 -0
- package/dist/toolSchema.mjs +2 -0
- package/package.json +223 -0
- package/src/types/webTasks.ts +24 -0
|
@@ -0,0 +1,569 @@
|
|
|
1
|
+
Object.defineProperties(exports, {
|
|
2
|
+
__esModule: { value: true },
|
|
3
|
+
[Symbol.toStringTag]: { value: "Module" }
|
|
4
|
+
});
|
|
5
|
+
const require_paths = require("../paths-CSya2l9_.cjs");
|
|
6
|
+
const require_config = require("../config-CdX-Bv8q.cjs");
|
|
7
|
+
const require_telemetry = require("../telemetry-Ca0I3Tqo.cjs");
|
|
8
|
+
const require_delegation = require("../delegation-DsnKjMbJ.cjs");
|
|
9
|
+
const require_taskResult = require("../taskResult-D2G7b4w-.cjs");
|
|
10
|
+
const require_task = require("../task-UvW877Ez.cjs");
|
|
11
|
+
const require_reducer = require("../reducer-BV0YIZ2o.cjs");
|
|
12
|
+
const require_taskStore = require("../taskStore-DjU60rMm.cjs");
|
|
13
|
+
const require_logSinkTelemetry = require("../logSinkTelemetry-B23qGiP-.cjs");
|
|
14
|
+
let _agimon_ai_po_core_delegation = require("@agimon-ai/po-core/delegation");
|
|
15
|
+
let node_path = require("node:path");
|
|
16
|
+
node_path = require_paths.__toESM(node_path, 1);
|
|
17
|
+
let _agimon_ai_po_core_serverFacet = require("@agimon-ai/po-core/serverFacet");
|
|
18
|
+
let _agimon_ai_po_core_extensionFile = require("@agimon-ai/po-core/extensionFile");
|
|
19
|
+
let _agimon_ai_po_core_backgroundWork = require("@agimon-ai/po-core/backgroundWork");
|
|
20
|
+
let _agimon_ai_po_core_contextContributions = require("@agimon-ai/po-core/contextContributions");
|
|
21
|
+
let _agimon_ai_po_core_readiness = require("@agimon-ai/po-core/readiness");
|
|
22
|
+
let node_crypto = require("node:crypto");
|
|
23
|
+
let typebox_value = require("typebox/value");
|
|
24
|
+
//#region src/services/contextContribution/index.ts
|
|
25
|
+
const TASK_CONTEXT_CONTRIBUTION_SOURCE = "@agimon-ai/po-task";
|
|
26
|
+
const TASK_CONTEXT_CONTRIBUTION_ID = "active-tasks";
|
|
27
|
+
const TASK_CONTEXT_CONTRIBUTION_LABEL = "Active tasks";
|
|
28
|
+
function activeTaskSnapshots(tasks) {
|
|
29
|
+
return tasks.filter((task) => task.status === "pending" || task.status === "in_progress" || task.status === "failed").map((task) => ({
|
|
30
|
+
id: task.id,
|
|
31
|
+
status: task.status,
|
|
32
|
+
subject: task.subject,
|
|
33
|
+
...task.activeForm ? { activeForm: task.activeForm } : {},
|
|
34
|
+
...task.owner ? { owner: task.owner } : {},
|
|
35
|
+
...task.blockedBy?.length ? { blockedBy: task.blockedBy } : {},
|
|
36
|
+
...task.delegation ? { delegation: {
|
|
37
|
+
agent: task.delegation.agent,
|
|
38
|
+
state: task.delegation.state,
|
|
39
|
+
...task.delegation.result?.error ? { error: task.delegation.result.error } : {}
|
|
40
|
+
} } : {}
|
|
41
|
+
}));
|
|
42
|
+
}
|
|
43
|
+
function formatTaskSnapshots(tasks) {
|
|
44
|
+
if (tasks.length === 0) return "(no active tasks)";
|
|
45
|
+
return tasks.map((task) => {
|
|
46
|
+
const details = [
|
|
47
|
+
task.activeForm ? `active: ${task.activeForm}` : void 0,
|
|
48
|
+
task.owner ? `owner: ${task.owner}` : void 0,
|
|
49
|
+
task.blockedBy?.length ? `blocked by: ${task.blockedBy.join(", ")}` : void 0,
|
|
50
|
+
task.delegation ? `delegation: ${task.delegation.agent} (${task.delegation.state})` : void 0,
|
|
51
|
+
task.delegation?.error ? `error: ${task.delegation.error}` : void 0
|
|
52
|
+
].filter((value) => Boolean(value));
|
|
53
|
+
return `- #${task.id} [${task.status}] ${task.subject}${details.length > 0 ? ` | ${details.join(" | ")}` : ""}`;
|
|
54
|
+
}).join("\n");
|
|
55
|
+
}
|
|
56
|
+
/** Builds Task's bounded, synchronous contribution from its in-memory store snapshot. */
|
|
57
|
+
function createTaskContextContribution(readTasks) {
|
|
58
|
+
return Object.freeze({
|
|
59
|
+
source: TASK_CONTEXT_CONTRIBUTION_SOURCE,
|
|
60
|
+
id: TASK_CONTEXT_CONTRIBUTION_ID,
|
|
61
|
+
label: TASK_CONTEXT_CONTRIBUTION_LABEL,
|
|
62
|
+
order: 100,
|
|
63
|
+
snapshot: () => formatTaskSnapshots(activeTaskSnapshots(readTasks()))
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
//#endregion
|
|
67
|
+
//#region src/services/delegationPlatform/index.ts
|
|
68
|
+
function formatBriefPath(entry, cwd) {
|
|
69
|
+
if (!node_path.default.isAbsolute(entry)) return node_path.default.normalize(entry);
|
|
70
|
+
const relative = node_path.default.relative(cwd, entry);
|
|
71
|
+
return relative && !relative.startsWith("..") ? relative : entry;
|
|
72
|
+
}
|
|
73
|
+
/** Supply Node-owned process and path facilities to the host-neutral manager. */
|
|
74
|
+
function createNodeDelegationPlatform(environment = process.env) {
|
|
75
|
+
return {
|
|
76
|
+
environment,
|
|
77
|
+
processId: process.pid,
|
|
78
|
+
createRequestId: node_crypto.randomUUID,
|
|
79
|
+
formatBriefPath
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
//#endregion
|
|
83
|
+
//#region src/types/webTasks.ts
|
|
84
|
+
/** Browser-safe task view published by the cockpit hub channel. */
|
|
85
|
+
const TASKS_CHANNEL_TYPE = "task_graph";
|
|
86
|
+
//#endregion
|
|
87
|
+
//#region src/extensions/workspaces/sessions/(backend)/_lib/root.server.ts
|
|
88
|
+
const SOURCE = "@agimon-ai/po-task";
|
|
89
|
+
/** The notification body: one line, since `client.notify` collapses the rest anyway. */
|
|
90
|
+
function headlineOf(content) {
|
|
91
|
+
return content.split("\n").find((line) => line.trim().length > 0) ?? content;
|
|
92
|
+
}
|
|
93
|
+
const root = (0, _agimon_ai_po_core_extensionFile.defineRoot)(({ host: serverHost, agent: host, signal: pluginSignal }) => {
|
|
94
|
+
if (!host) throw new Error("Task session requires the headless host.");
|
|
95
|
+
const execution = host.context;
|
|
96
|
+
if (serverHost.context.directEvents === void 0) throw new Error("Task headless facet requires the session direct event bus.");
|
|
97
|
+
const directEvents = serverHost.context.directEvents;
|
|
98
|
+
const reporter = require_logSinkTelemetry.createTaskErrorReporter({
|
|
99
|
+
cwd: execution.cwd,
|
|
100
|
+
env: execution.environment
|
|
101
|
+
});
|
|
102
|
+
const report = require_logSinkTelemetry.toFailureReporter(reporter);
|
|
103
|
+
let active = true;
|
|
104
|
+
let disposed = false;
|
|
105
|
+
let generation = 0;
|
|
106
|
+
let unwatch;
|
|
107
|
+
let backgroundService;
|
|
108
|
+
let background;
|
|
109
|
+
let serviceContext;
|
|
110
|
+
let startup = Promise.resolve();
|
|
111
|
+
let startupAbort = new AbortController();
|
|
112
|
+
const ownedReadiness = (0, _agimon_ai_po_core_readiness.createDoomReadinessCoordinator)({ notify: (notification) => execution.client.notify({
|
|
113
|
+
body: notification.error?.message ?? notification.diagnostics.join("; "),
|
|
114
|
+
level: "warning"
|
|
115
|
+
}) });
|
|
116
|
+
const refresh = () => {
|
|
117
|
+
if (!active || disposed) return;
|
|
118
|
+
execution.client.setStatus(SOURCE, `tasks: ${store.snapshot.tasks.length}`);
|
|
119
|
+
background?.update();
|
|
120
|
+
};
|
|
121
|
+
const registerBackground = () => {
|
|
122
|
+
if (!active || disposed || !backgroundService || background) return;
|
|
123
|
+
background = backgroundService.register({
|
|
124
|
+
provider: require_delegation.BACKGROUND_WORK_PROVIDER,
|
|
125
|
+
listActiveWork: () => active && !disposed ? manager.listActiveWork() : []
|
|
126
|
+
});
|
|
127
|
+
};
|
|
128
|
+
const maxTasks = require_config.getMaxTasks(execution.environment);
|
|
129
|
+
const store = new require_taskStore.TaskStore({
|
|
130
|
+
cwd: execution.cwd,
|
|
131
|
+
env: execution.environment,
|
|
132
|
+
report
|
|
133
|
+
});
|
|
134
|
+
store.configureSession(require_paths.resolveSessionKey(execution.sessionId, execution.environment));
|
|
135
|
+
let notifications = Promise.resolve();
|
|
136
|
+
const manager = new require_delegation.DelegationManager({
|
|
137
|
+
store,
|
|
138
|
+
cwd: execution.cwd,
|
|
139
|
+
platform: createNodeDelegationPlatform(execution.environment),
|
|
140
|
+
getSessionId: () => execution.sessionId,
|
|
141
|
+
report,
|
|
142
|
+
notify: (message, options) => {
|
|
143
|
+
const ownGeneration = generation;
|
|
144
|
+
const isCurrent = () => active && !disposed && !pluginSignal?.aborted && generation === ownGeneration;
|
|
145
|
+
notifications = notifications.then(async () => {
|
|
146
|
+
if (!isCurrent()) return;
|
|
147
|
+
await execution.client.notify({
|
|
148
|
+
body: headlineOf(message.content),
|
|
149
|
+
level: "info"
|
|
150
|
+
});
|
|
151
|
+
if (!isCurrent()) return;
|
|
152
|
+
await execution.session.appendCustomEntry(message.customType, { content: message.content });
|
|
153
|
+
if (!isCurrent() || options?.triggerTurn === false) return;
|
|
154
|
+
if (!execution.session.admitPrompt) throw new Error("The session cannot admit a task notification.");
|
|
155
|
+
await execution.session.admitPrompt(message.content, "steer");
|
|
156
|
+
}).catch((error) => {
|
|
157
|
+
if (isCurrent()) execution.client.notify({
|
|
158
|
+
body: String(error),
|
|
159
|
+
level: "warning"
|
|
160
|
+
});
|
|
161
|
+
});
|
|
162
|
+
},
|
|
163
|
+
onChange: refresh,
|
|
164
|
+
runTimeoutMs: require_config.getDelegationTimeoutMs(execution.environment),
|
|
165
|
+
onNotifyError: (error, taskId) => {
|
|
166
|
+
reporter.recordNotificationError(error, taskId);
|
|
167
|
+
if (active && !disposed) execution.client.notify({
|
|
168
|
+
body: String(error),
|
|
169
|
+
level: "warning"
|
|
170
|
+
});
|
|
171
|
+
}
|
|
172
|
+
});
|
|
173
|
+
return {
|
|
174
|
+
value: {
|
|
175
|
+
store,
|
|
176
|
+
manager,
|
|
177
|
+
maxTasks
|
|
178
|
+
},
|
|
179
|
+
services: [(serviceContextOwner) => {
|
|
180
|
+
serviceContext = serviceContextOwner;
|
|
181
|
+
serviceContextOwner.inject([_agimon_ai_po_core_contextContributions.DOOM_CONTEXT_CONTRIBUTIONS_SERVICE], (context) => {
|
|
182
|
+
const registration = (0, _agimon_ai_po_core_contextContributions.requireDoomContextContributions)(context).register(createTaskContextContribution(() => active && !disposed ? store.snapshot.tasks : []));
|
|
183
|
+
return () => registration.dispose();
|
|
184
|
+
});
|
|
185
|
+
serviceContextOwner.inject([_agimon_ai_po_core_backgroundWork.DOOM_BACKGROUND_WORK_SERVICE], (context) => {
|
|
186
|
+
const service = (0, _agimon_ai_po_core_backgroundWork.readDoomBackgroundWorkService)(context);
|
|
187
|
+
if (!service) return void 0;
|
|
188
|
+
backgroundService = service;
|
|
189
|
+
registerBackground();
|
|
190
|
+
return () => {
|
|
191
|
+
if (backgroundService !== service) return;
|
|
192
|
+
background?.dispose();
|
|
193
|
+
background = void 0;
|
|
194
|
+
backgroundService = void 0;
|
|
195
|
+
};
|
|
196
|
+
});
|
|
197
|
+
serviceContextOwner.inject([_agimon_ai_po_core_delegation.DOOM_DELEGATION_SERVICE], (serviceContext) => {
|
|
198
|
+
const service = (0, _agimon_ai_po_core_delegation.readDoomDelegationService)(serviceContext);
|
|
199
|
+
if (service) return manager.bind(serviceContext, service);
|
|
200
|
+
});
|
|
201
|
+
}],
|
|
202
|
+
activities: [{
|
|
203
|
+
name: SOURCE,
|
|
204
|
+
async start(activityContext) {
|
|
205
|
+
if (disposed) throw new Error("Task session is disposed.");
|
|
206
|
+
active = true;
|
|
207
|
+
const ownGeneration = ++generation;
|
|
208
|
+
startupAbort.abort();
|
|
209
|
+
const controller = new AbortController();
|
|
210
|
+
startupAbort = controller;
|
|
211
|
+
await Promise.allSettled([startup]);
|
|
212
|
+
startup = ((serviceContext && (0, _agimon_ai_po_core_readiness.readDoomReadinessCoordinator)(serviceContext)) ?? ownedReadiness).start(SOURCE, `${execution.sessionId}:${ownGeneration}`, async (signal) => {
|
|
213
|
+
const isCurrent = () => !disposed && !pluginSignal?.aborted && active && generation === ownGeneration && !signal.aborted && !controller.signal.aborted;
|
|
214
|
+
const diagnostics = [];
|
|
215
|
+
const degrade = async (stage, operation) => {
|
|
216
|
+
try {
|
|
217
|
+
await operation();
|
|
218
|
+
} catch (error) {
|
|
219
|
+
diagnostics.push(`Task ${stage} failed: ${String(error)}`);
|
|
220
|
+
report.warn(require_telemetry.TASK_EVENT.sessionStartDegraded, error, { "task.stage": stage });
|
|
221
|
+
}
|
|
222
|
+
};
|
|
223
|
+
try {
|
|
224
|
+
if (!isCurrent()) return { value: void 0 };
|
|
225
|
+
store.configureSession(require_paths.resolveSessionKey(activityContext.sessionId, activityContext.environment));
|
|
226
|
+
manager.setCwd(activityContext.cwd);
|
|
227
|
+
const cleanup = await require_paths.removeLegacyStoreDirectoryAsync(store.storePath, activityContext.cwd);
|
|
228
|
+
if (!isCurrent()) return { value: void 0 };
|
|
229
|
+
const sweep = require_paths.hasStorePathOverride(activityContext.environment) ? { errors: [] } : await require_paths.sweepStoreFilesAsync(store.storePath, require_config.getStoreTtlMs(activityContext.environment));
|
|
230
|
+
for (const error of [...cleanup.errors, ...sweep.errors]) {
|
|
231
|
+
diagnostics.push(error);
|
|
232
|
+
report.warn(require_telemetry.TASK_EVENT.storeSweepFailed, new Error(error));
|
|
233
|
+
}
|
|
234
|
+
if (!isCurrent()) return { value: void 0 };
|
|
235
|
+
await degrade("store_read", async () => {
|
|
236
|
+
const errors = [];
|
|
237
|
+
await store.readAsync(isCurrent, (error) => errors.push(error));
|
|
238
|
+
if (errors.length > 0) throw new Error(String(errors[0]), { cause: errors[0] });
|
|
239
|
+
});
|
|
240
|
+
if (!isCurrent()) return { value: void 0 };
|
|
241
|
+
unwatch?.();
|
|
242
|
+
unwatch = store.onExternalChange(() => {
|
|
243
|
+
refresh();
|
|
244
|
+
if (isCurrent()) directEvents.publish(TASKS_CHANNEL_TYPE, execution.sessionId, store.snapshot);
|
|
245
|
+
});
|
|
246
|
+
await degrade("reconcile", () => manager.reconcile(isCurrent));
|
|
247
|
+
if (!isCurrent()) return { value: void 0 };
|
|
248
|
+
registerBackground();
|
|
249
|
+
refresh();
|
|
250
|
+
directEvents.publish(TASKS_CHANNEL_TYPE, execution.sessionId, store.snapshot);
|
|
251
|
+
return {
|
|
252
|
+
value: void 0,
|
|
253
|
+
diagnostics
|
|
254
|
+
};
|
|
255
|
+
} catch (error) {
|
|
256
|
+
if (!isCurrent()) return { value: void 0 };
|
|
257
|
+
report.error(require_telemetry.TASK_EVENT.sessionStartFailed, error);
|
|
258
|
+
throw error;
|
|
259
|
+
}
|
|
260
|
+
}).wait();
|
|
261
|
+
await Promise.allSettled([startup]);
|
|
262
|
+
return () => {
|
|
263
|
+
if (ownGeneration !== generation) return;
|
|
264
|
+
active = false;
|
|
265
|
+
generation += 1;
|
|
266
|
+
controller.abort();
|
|
267
|
+
unwatch?.();
|
|
268
|
+
unwatch = void 0;
|
|
269
|
+
background?.dispose();
|
|
270
|
+
background = void 0;
|
|
271
|
+
manager.reset();
|
|
272
|
+
execution.client.setStatus(SOURCE, void 0);
|
|
273
|
+
};
|
|
274
|
+
}
|
|
275
|
+
}],
|
|
276
|
+
async onDispose() {
|
|
277
|
+
if (disposed) return;
|
|
278
|
+
disposed = true;
|
|
279
|
+
active = false;
|
|
280
|
+
generation += 1;
|
|
281
|
+
startupAbort.abort();
|
|
282
|
+
await Promise.allSettled([startup]);
|
|
283
|
+
unwatch?.();
|
|
284
|
+
background?.dispose();
|
|
285
|
+
manager.dispose();
|
|
286
|
+
store.dispose();
|
|
287
|
+
await ownedReadiness.dispose();
|
|
288
|
+
await reporter.shutdown();
|
|
289
|
+
}
|
|
290
|
+
};
|
|
291
|
+
});
|
|
292
|
+
//#endregion
|
|
293
|
+
//#region src/extensions/workspaces/sessions/(backend)/root.server.ts
|
|
294
|
+
var root_server_default = (0, _agimon_ai_po_core_extensionFile.defineRoot)(root);
|
|
295
|
+
//#endregion
|
|
296
|
+
//#region src/extensions/(backend)/channel/_lib/task-graph.ts
|
|
297
|
+
function isTaskDocument(value) {
|
|
298
|
+
return typeof value === "object" && value !== null && typeof value.rev === "number" && Array.isArray(value.tasks);
|
|
299
|
+
}
|
|
300
|
+
function present(document) {
|
|
301
|
+
return {
|
|
302
|
+
tasks: document.tasks.flatMap((task) => {
|
|
303
|
+
if (task.status === "deleted") return [];
|
|
304
|
+
const view = {
|
|
305
|
+
id: task.id,
|
|
306
|
+
subject: task.subject,
|
|
307
|
+
status: task.status,
|
|
308
|
+
blockedBy: task.blockedBy ?? []
|
|
309
|
+
};
|
|
310
|
+
if (task.description) view.description = task.description;
|
|
311
|
+
if (task.activeForm) view.activeForm = task.activeForm;
|
|
312
|
+
if (task.owner) view.owner = task.owner;
|
|
313
|
+
if (task.updatedAt) view.updatedAt = task.updatedAt;
|
|
314
|
+
if (task.delegation) view.delegation = {
|
|
315
|
+
...task.delegation.agent === void 0 ? {} : { agent: task.delegation.agent },
|
|
316
|
+
...task.delegation.state === void 0 ? {} : { state: task.delegation.state }
|
|
317
|
+
};
|
|
318
|
+
return [view];
|
|
319
|
+
}),
|
|
320
|
+
rev: document.rev
|
|
321
|
+
};
|
|
322
|
+
}
|
|
323
|
+
/** Publishes each managed session's durable task graph and follows direct session commits. */
|
|
324
|
+
function createTasksChannel(options = {}) {
|
|
325
|
+
return {
|
|
326
|
+
frameType: TASKS_CHANNEL_TYPE,
|
|
327
|
+
start(host) {
|
|
328
|
+
const stores = /* @__PURE__ */ new Map();
|
|
329
|
+
const open = (scope) => {
|
|
330
|
+
if (stores.has(scope.sessionId)) return;
|
|
331
|
+
let store = options.storeFor?.(scope);
|
|
332
|
+
if (store === void 0) {
|
|
333
|
+
if (scope.environment === void 0) throw new Error(`Task channel requires an admitted environment for session '${scope.sessionId}'.`);
|
|
334
|
+
store = new require_taskStore.TaskStore({
|
|
335
|
+
cwd: scope.cwd,
|
|
336
|
+
env: scope.environment,
|
|
337
|
+
storePath: require_paths.resolveStorePath(scope.cwd, scope.environment, scope.sessionId)
|
|
338
|
+
});
|
|
339
|
+
}
|
|
340
|
+
store.read();
|
|
341
|
+
const source = {
|
|
342
|
+
store,
|
|
343
|
+
unsubscribe: () => void 0
|
|
344
|
+
};
|
|
345
|
+
stores.set(scope.sessionId, source);
|
|
346
|
+
source.unsubscribe = host.directEvents.subscribe(TASKS_CHANNEL_TYPE, scope.sessionId, (payload) => {
|
|
347
|
+
if (!isTaskDocument(payload)) return;
|
|
348
|
+
const current = stores.get(scope.sessionId);
|
|
349
|
+
if (current === void 0) return;
|
|
350
|
+
current.latest = payload;
|
|
351
|
+
host.publish(scope.sessionId, present(payload));
|
|
352
|
+
}, { replayLatest: true });
|
|
353
|
+
};
|
|
354
|
+
const close = (sessionId) => {
|
|
355
|
+
const source = stores.get(sessionId);
|
|
356
|
+
if (!source) return;
|
|
357
|
+
source.unsubscribe();
|
|
358
|
+
source.store.dispose();
|
|
359
|
+
stores.delete(sessionId);
|
|
360
|
+
};
|
|
361
|
+
for (const scope of host.sessions()) open(scope);
|
|
362
|
+
return {
|
|
363
|
+
payloadFor(scope) {
|
|
364
|
+
open(scope);
|
|
365
|
+
const source = stores.get(scope.sessionId);
|
|
366
|
+
const document = source?.latest ?? source?.store.snapshot;
|
|
367
|
+
return document === void 0 ? void 0 : present(document);
|
|
368
|
+
},
|
|
369
|
+
sessionAdded: open,
|
|
370
|
+
sessionRemoved: close,
|
|
371
|
+
close() {
|
|
372
|
+
for (const sessionId of stores.keys()) close(sessionId);
|
|
373
|
+
}
|
|
374
|
+
};
|
|
375
|
+
}
|
|
376
|
+
};
|
|
377
|
+
}
|
|
378
|
+
//#endregion
|
|
379
|
+
//#region src/extensions/(backend)/channel/task-graph.server.ts
|
|
380
|
+
var task_graph_server_default = (0, _agimon_ai_po_core_extensionFile.defineChannel)(createTasksChannel);
|
|
381
|
+
//#endregion
|
|
382
|
+
//#region src/services/taskTool/index.ts
|
|
383
|
+
function output(value) {
|
|
384
|
+
if (typeof value === "object" && value !== null && "content" in value) return value;
|
|
385
|
+
return {
|
|
386
|
+
content: [{
|
|
387
|
+
type: "text",
|
|
388
|
+
text: typeof value === "string" ? value : JSON.stringify(value, null, 2)
|
|
389
|
+
}],
|
|
390
|
+
details: value
|
|
391
|
+
};
|
|
392
|
+
}
|
|
393
|
+
function failure(error) {
|
|
394
|
+
return {
|
|
395
|
+
content: [{
|
|
396
|
+
type: "text",
|
|
397
|
+
text: error instanceof Error ? error.message : String(error)
|
|
398
|
+
}],
|
|
399
|
+
isError: true
|
|
400
|
+
};
|
|
401
|
+
}
|
|
402
|
+
async function reducerAction(store, action, params, maxTasks) {
|
|
403
|
+
const { document, value } = await store.mutate((current) => {
|
|
404
|
+
const result = require_reducer.applyTaskMutation(current, action, params, void 0, maxTasks);
|
|
405
|
+
return {
|
|
406
|
+
...require_reducer.isCommittingOp(result.op) ? { document: result.document } : {},
|
|
407
|
+
value: result
|
|
408
|
+
};
|
|
409
|
+
});
|
|
410
|
+
if (value.op.kind === "error") throw new Error(value.op.message);
|
|
411
|
+
return require_taskResult.buildToolResult(action, params, document, value.op);
|
|
412
|
+
}
|
|
413
|
+
async function assignmentBatch(manager, assignments, signal) {
|
|
414
|
+
const result = [];
|
|
415
|
+
for (const [index, assignment] of assignments.entries()) try {
|
|
416
|
+
const outcome = await manager.assign(assignment.id, {
|
|
417
|
+
agent: assignment.agent,
|
|
418
|
+
inlineAgent: assignment.inlineAgent,
|
|
419
|
+
instructions: assignment.instructions,
|
|
420
|
+
relevantFiles: assignment.relevantFiles,
|
|
421
|
+
priorFindings: assignment.priorFindings,
|
|
422
|
+
model: assignment.model,
|
|
423
|
+
...assignment.context === "fork" || assignment.context === "fresh" ? { context: assignment.context } : {},
|
|
424
|
+
signal
|
|
425
|
+
});
|
|
426
|
+
result.push({
|
|
427
|
+
index,
|
|
428
|
+
id: assignment.id,
|
|
429
|
+
agent: assignment.agent,
|
|
430
|
+
...outcome
|
|
431
|
+
});
|
|
432
|
+
} catch (error) {
|
|
433
|
+
result.push({
|
|
434
|
+
index,
|
|
435
|
+
id: assignment.id,
|
|
436
|
+
agent: assignment.agent,
|
|
437
|
+
ok: false,
|
|
438
|
+
message: String(error)
|
|
439
|
+
});
|
|
440
|
+
}
|
|
441
|
+
return result;
|
|
442
|
+
}
|
|
443
|
+
function createHeadlessTaskTool(store, manager, maxTasks) {
|
|
444
|
+
return {
|
|
445
|
+
name: "task",
|
|
446
|
+
label: "Task",
|
|
447
|
+
description: "Maintain a persistent task graph and delegate ready tasks to background agents.",
|
|
448
|
+
parameters: require_task.TaskParamsSchema,
|
|
449
|
+
promptSnippet: "Track complex work persistently and delegate ready tasks",
|
|
450
|
+
executionMode: "serial",
|
|
451
|
+
async execute(_toolCallId, rawParams, signal, onUpdate) {
|
|
452
|
+
if (!(0, typebox_value.Check)(require_task.TaskParamsSchema, rawParams)) return failure("Invalid task parameters.");
|
|
453
|
+
const params = rawParams;
|
|
454
|
+
try {
|
|
455
|
+
if ((params.action === "assign" || params.action === "cancel") && !manager) throw new Error("Delegation is not available on this connection.");
|
|
456
|
+
if (params.action === "assign") {
|
|
457
|
+
if (!params.assignments?.length) throw new Error("assign requires a non-empty assignments[] array");
|
|
458
|
+
onUpdate?.(output(`Delegating ${params.assignments.length} task${params.assignments.length === 1 ? "" : "s"}...`));
|
|
459
|
+
const items = await assignmentBatch(manager, params.assignments, signal);
|
|
460
|
+
const assigned = items.filter((item) => item.ok).map((item) => item.id);
|
|
461
|
+
const text = require_taskResult.formatAssignmentResults(items);
|
|
462
|
+
if (assigned.length === 0) throw new Error(text);
|
|
463
|
+
return require_taskResult.buildAssignmentResult(params, store.snapshot, text, {
|
|
464
|
+
assigned,
|
|
465
|
+
failed: items.length - assigned.length
|
|
466
|
+
});
|
|
467
|
+
}
|
|
468
|
+
if (params.action === "cancel") {
|
|
469
|
+
const outcome = await manager.cancel(params.id ?? NaN);
|
|
470
|
+
if (!outcome.ok) throw new Error(outcome.message);
|
|
471
|
+
return require_taskResult.buildTextResult("cancel", params, store.snapshot, outcome.message);
|
|
472
|
+
}
|
|
473
|
+
return reducerAction(store, params.action, params, maxTasks);
|
|
474
|
+
} catch (error) {
|
|
475
|
+
return failure(error);
|
|
476
|
+
}
|
|
477
|
+
}
|
|
478
|
+
};
|
|
479
|
+
}
|
|
480
|
+
//#endregion
|
|
481
|
+
//#region src/extensions/workspaces/sessions/(backend)/command/_lib/tasks.server.ts
|
|
482
|
+
var tasks_server_default$1 = (context) => ({
|
|
483
|
+
name: require_task.COMMAND_NAME,
|
|
484
|
+
description: "List or clear the persistent task graph.",
|
|
485
|
+
async execute(args, commandContext) {
|
|
486
|
+
const action = args.trim() === "clear" ? "clear" : "list";
|
|
487
|
+
const content = (await reducerAction(context.root.store, action, { action }, context.root.maxTasks)).content[0];
|
|
488
|
+
await commandContext.client.notify({
|
|
489
|
+
body: content?.type === "text" ? content.text : "No tasks",
|
|
490
|
+
level: "info"
|
|
491
|
+
});
|
|
492
|
+
}
|
|
493
|
+
});
|
|
494
|
+
//#endregion
|
|
495
|
+
//#region src/extensions/workspaces/sessions/(backend)/command/tasks.server.ts
|
|
496
|
+
var tasks_server_default = (0, _agimon_ai_po_core_extensionFile.defineServerCommand)(tasks_server_default$1);
|
|
497
|
+
//#endregion
|
|
498
|
+
//#region src/extensions/workspaces/sessions/(backend)/resource/_lib/task-board.server.ts
|
|
499
|
+
var task_board_server_default$1 = (context) => ({
|
|
500
|
+
name: "po/task-board",
|
|
501
|
+
kind: "context",
|
|
502
|
+
/**
|
|
503
|
+
* The same bounded projection the Pi facet renders: open work only, one line each.
|
|
504
|
+
* Dumping the whole TaskDocument put every completed task plus the store's own
|
|
505
|
+
* version/rev/nextId bookkeeping in the prompt, and an idle board still cost a
|
|
506
|
+
* paragraph. '' is dropped by the prompt composer.
|
|
507
|
+
*/
|
|
508
|
+
read: () => {
|
|
509
|
+
const rendered = formatTaskSnapshots(activeTaskSnapshots(context.root.store.snapshot.tasks));
|
|
510
|
+
return rendered === "(no active tasks)" ? "" : rendered;
|
|
511
|
+
}
|
|
512
|
+
});
|
|
513
|
+
//#endregion
|
|
514
|
+
//#region src/extensions/workspaces/sessions/(backend)/resource/task-board.server.ts
|
|
515
|
+
var task_board_server_default = (0, _agimon_ai_po_core_extensionFile.defineResource)(task_board_server_default$1);
|
|
516
|
+
//#endregion
|
|
517
|
+
//#region src/extensions/workspaces/sessions/(backend)/tool/_lib/task.server.ts
|
|
518
|
+
var task_server_default$1 = (0, _agimon_ai_po_core_extensionFile.defineServerTool)((context) => createHeadlessTaskTool(context.root.store, context.root.manager, context.root.maxTasks));
|
|
519
|
+
//#endregion
|
|
520
|
+
//#region src/extensions/workspaces/sessions/(backend)/tool/task.server.ts
|
|
521
|
+
var task_server_default = (0, _agimon_ai_po_core_extensionFile.defineServerTool)(task_server_default$1);
|
|
522
|
+
//#endregion
|
|
523
|
+
//#region generated/server.ts
|
|
524
|
+
const at = (value, context) => typeof value === "function" ? value(context) : value;
|
|
525
|
+
const via = (identity, value) => value === void 0 ? void 0 : {
|
|
526
|
+
...identity,
|
|
527
|
+
...value
|
|
528
|
+
};
|
|
529
|
+
const facet = (0, _agimon_ai_po_core_serverFacet.defineServerPlugin)({
|
|
530
|
+
name: "@agimon-ai/po-task",
|
|
531
|
+
providerOverrides: (0, _agimon_ai_po_core_serverFacet.composeServerProviderOverrides)(root_server_default),
|
|
532
|
+
global: () => ({ get channels() {
|
|
533
|
+
return [() => via({ frameType: "task_graph" }, task_graph_server_default())];
|
|
534
|
+
} }),
|
|
535
|
+
workspace: () => ({ get channels() {
|
|
536
|
+
return [() => via({ frameType: "task_graph" }, task_graph_server_default())];
|
|
537
|
+
} }),
|
|
538
|
+
session: async (context) => {
|
|
539
|
+
const scopeSession = await root_server_default(context);
|
|
540
|
+
const contextSession = {
|
|
541
|
+
...context,
|
|
542
|
+
root: scopeSession.value
|
|
543
|
+
};
|
|
544
|
+
return {
|
|
545
|
+
...(0, _agimon_ai_po_core_extensionFile.composeRootHooks)(scopeSession),
|
|
546
|
+
get channels() {
|
|
547
|
+
return [() => via({ frameType: "task_graph" }, task_graph_server_default())];
|
|
548
|
+
},
|
|
549
|
+
get commands() {
|
|
550
|
+
return [via({ name: "tasks" }, at(tasks_server_default, contextSession))];
|
|
551
|
+
},
|
|
552
|
+
get resources() {
|
|
553
|
+
return [at(task_board_server_default, contextSession)];
|
|
554
|
+
},
|
|
555
|
+
get tools() {
|
|
556
|
+
return [via({ name: "task" }, at(task_server_default, contextSession))];
|
|
557
|
+
},
|
|
558
|
+
services: [...scopeSession.services ?? []],
|
|
559
|
+
get activities() {
|
|
560
|
+
return [...scopeSession.activities ?? []];
|
|
561
|
+
}
|
|
562
|
+
};
|
|
563
|
+
}
|
|
564
|
+
});
|
|
565
|
+
//#endregion
|
|
566
|
+
exports.default = facet;
|
|
567
|
+
exports.facet = facet;
|
|
568
|
+
|
|
569
|
+
//# sourceMappingURL=server.cjs.map
|