@qduc/term2 0.10.1 → 0.11.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/dist/agent.d.ts +7 -0
- package/dist/agent.d.ts.map +1 -1
- package/dist/agent.js +20 -14
- package/dist/agent.js.map +1 -1
- package/dist/app.d.ts.map +1 -1
- package/dist/app.js +10 -11
- package/dist/app.js.map +1 -1
- package/dist/components/layout/BackgroundTasksPanel.d.ts +10 -0
- package/dist/components/layout/BackgroundTasksPanel.d.ts.map +1 -0
- package/dist/components/layout/BackgroundTasksPanel.js +60 -0
- package/dist/components/layout/BackgroundTasksPanel.js.map +1 -0
- package/dist/components/layout/BottomArea.d.ts +3 -0
- package/dist/components/layout/BottomArea.d.ts.map +1 -1
- package/dist/components/layout/BottomArea.js +3 -1
- package/dist/components/layout/BottomArea.js.map +1 -1
- package/dist/components/message/CommandMessage.js +21 -1
- package/dist/components/message/CommandMessage.js.map +1 -1
- package/dist/components/message/SubagentActivityMessage.d.ts +1 -0
- package/dist/components/message/SubagentActivityMessage.d.ts.map +1 -1
- package/dist/components/message/SubagentActivityMessage.js +3 -3
- package/dist/components/message/SubagentActivityMessage.js.map +1 -1
- package/dist/components/message/command-message-helpers.d.ts.map +1 -1
- package/dist/components/message/command-message-helpers.js +10 -0
- package/dist/components/message/command-message-helpers.js.map +1 -1
- package/dist/components/prompt/ApprovalPrompt.d.ts.map +1 -1
- package/dist/components/prompt/ApprovalPrompt.js +28 -3
- package/dist/components/prompt/ApprovalPrompt.js.map +1 -1
- package/dist/hooks/settings-completion-config.d.ts.map +1 -1
- package/dist/hooks/settings-completion-config.js +4 -0
- package/dist/hooks/settings-completion-config.js.map +1 -1
- package/dist/hooks/use-conversation.d.ts +3 -0
- package/dist/hooks/use-conversation.d.ts.map +1 -1
- package/dist/hooks/use-conversation.js +23 -1
- package/dist/hooks/use-conversation.js.map +1 -1
- package/dist/lib/agent-client.d.ts +16 -1
- package/dist/lib/agent-client.d.ts.map +1 -1
- package/dist/lib/agent-client.js +22 -1
- package/dist/lib/agent-client.js.map +1 -1
- package/dist/lib/agent-configuration.d.ts.map +1 -1
- package/dist/lib/agent-configuration.js +2 -0
- package/dist/lib/agent-configuration.js.map +1 -1
- package/dist/lib/agent-factory.d.ts +7 -0
- package/dist/lib/agent-factory.d.ts.map +1 -1
- package/dist/lib/agent-factory.js +2 -0
- package/dist/lib/agent-factory.js.map +1 -1
- package/dist/lib/subagent-bridge.d.ts +37 -3
- package/dist/lib/subagent-bridge.d.ts.map +1 -1
- package/dist/lib/subagent-bridge.js +115 -8
- package/dist/lib/subagent-bridge.js.map +1 -1
- package/dist/prompts/async-subagent-delegation.d.ts +9 -0
- package/dist/prompts/async-subagent-delegation.d.ts.map +1 -0
- package/dist/prompts/async-subagent-delegation.js +36 -0
- package/dist/prompts/async-subagent-delegation.js.map +1 -0
- package/dist/prompts/async-subagent-delegation.ts +45 -0
- package/dist/prompts/orchestrator.md +16 -3
- package/dist/prompts/prompt-constructor.d.ts +1 -0
- package/dist/prompts/prompt-constructor.d.ts.map +1 -1
- package/dist/prompts/prompt-constructor.js +5 -1
- package/dist/prompts/prompt-constructor.js.map +1 -1
- package/dist/prompts/prompt-constructor.test.ts +51 -0
- package/dist/prompts/prompt-constructor.ts +7 -0
- package/dist/prompts/subagent-delegation.d.ts.map +1 -1
- package/dist/prompts/subagent-delegation.js +2 -1
- package/dist/prompts/subagent-delegation.js.map +1 -1
- package/dist/prompts/subagent-delegation.ts +2 -1
- package/dist/services/agent-runtime/execution-budget.d.ts +6 -0
- package/dist/services/agent-runtime/execution-budget.d.ts.map +1 -1
- package/dist/services/agent-runtime/execution-budget.js +32 -24
- package/dist/services/agent-runtime/execution-budget.js.map +1 -1
- package/dist/services/agent-runtime/permission-resolver.js +1 -1
- package/dist/services/agent-runtime/permission-resolver.js.map +1 -1
- package/dist/services/conversation/conversation-adapter.d.ts.map +1 -1
- package/dist/services/conversation/conversation-adapter.js +2 -0
- package/dist/services/conversation/conversation-adapter.js.map +1 -1
- package/dist/services/conversation/conversation-events.d.ts +12 -1
- package/dist/services/conversation/conversation-events.d.ts.map +1 -1
- package/dist/services/conversation/conversation-orchestrator.d.ts.map +1 -1
- package/dist/services/conversation/conversation-orchestrator.js +138 -22
- package/dist/services/conversation/conversation-orchestrator.js.map +1 -1
- package/dist/services/conversation/conversation-replay.d.ts.map +1 -1
- package/dist/services/conversation/conversation-replay.js +1 -0
- package/dist/services/conversation/conversation-replay.js.map +1 -1
- package/dist/services/conversation/conversation-service.d.ts +22 -0
- package/dist/services/conversation/conversation-service.d.ts.map +1 -1
- package/dist/services/conversation/conversation-service.js +40 -0
- package/dist/services/conversation/conversation-service.js.map +1 -1
- package/dist/services/conversation/conversation-store.d.ts +6 -0
- package/dist/services/conversation/conversation-store.d.ts.map +1 -1
- package/dist/services/conversation/conversation-store.js +17 -0
- package/dist/services/conversation/conversation-store.js.map +1 -1
- package/dist/services/conversation-agent-client.d.ts +13 -0
- package/dist/services/conversation-agent-client.d.ts.map +1 -1
- package/dist/services/logging/conversation-log-events.d.ts +1 -0
- package/dist/services/logging/conversation-log-events.d.ts.map +1 -1
- package/dist/services/logging/conversation-log-events.js.map +1 -1
- package/dist/services/logging/conversation-logger.d.ts.map +1 -1
- package/dist/services/logging/conversation-logger.js +1 -0
- package/dist/services/logging/conversation-logger.js.map +1 -1
- package/dist/services/plan-mode-interceptor.js +2 -2
- package/dist/services/plan-mode-interceptor.js.map +1 -1
- package/dist/services/session/session-composition.d.ts +23 -0
- package/dist/services/session/session-composition.d.ts.map +1 -1
- package/dist/services/session/session-composition.js +65 -1
- package/dist/services/session/session-composition.js.map +1 -1
- package/dist/services/settings/settings-merger.d.ts.map +1 -1
- package/dist/services/settings/settings-merger.js +2 -0
- package/dist/services/settings/settings-merger.js.map +1 -1
- package/dist/services/settings/settings-schema.d.ts +15 -0
- package/dist/services/settings/settings-schema.d.ts.map +1 -1
- package/dist/services/settings/settings-schema.js +23 -0
- package/dist/services/settings/settings-schema.js.map +1 -1
- package/dist/services/subagents/execution-runner.d.ts +3 -0
- package/dist/services/subagents/execution-runner.d.ts.map +1 -1
- package/dist/services/subagents/execution-runner.js +33 -7
- package/dist/services/subagents/execution-runner.js.map +1 -1
- package/dist/services/subagents/mentor-runner.d.ts +5 -1
- package/dist/services/subagents/mentor-runner.d.ts.map +1 -1
- package/dist/services/subagents/mentor-runner.js +40 -2
- package/dist/services/subagents/mentor-runner.js.map +1 -1
- package/dist/services/subagents/runtime.d.ts +2 -0
- package/dist/services/subagents/runtime.d.ts.map +1 -1
- package/dist/services/subagents/runtime.js +20 -0
- package/dist/services/subagents/runtime.js.map +1 -1
- package/dist/services/subagents/subagent-async-registry.d.ts +39 -0
- package/dist/services/subagents/subagent-async-registry.d.ts.map +1 -0
- package/dist/services/subagents/subagent-async-registry.js +233 -0
- package/dist/services/subagents/subagent-async-registry.js.map +1 -0
- package/dist/services/subagents/subagent-manager.d.ts +17 -0
- package/dist/services/subagents/subagent-manager.d.ts.map +1 -1
- package/dist/services/subagents/subagent-manager.js +45 -1
- package/dist/services/subagents/subagent-manager.js.map +1 -1
- package/dist/services/subagents/subagent-notification-store.d.ts +89 -0
- package/dist/services/subagents/subagent-notification-store.d.ts.map +1 -0
- package/dist/services/subagents/subagent-notification-store.js +167 -0
- package/dist/services/subagents/subagent-notification-store.js.map +1 -0
- package/dist/services/subagents/subagent-session.d.ts +12 -1
- package/dist/services/subagents/subagent-session.d.ts.map +1 -1
- package/dist/services/subagents/subagent-session.js +29 -6
- package/dist/services/subagents/subagent-session.js.map +1 -1
- package/dist/services/subagents/types.d.ts +11 -0
- package/dist/services/subagents/types.d.ts.map +1 -1
- package/dist/services/subagents/types.js +1 -0
- package/dist/services/subagents/types.js.map +1 -1
- package/dist/services/subagents/utils.d.ts +6 -0
- package/dist/services/subagents/utils.d.ts.map +1 -1
- package/dist/services/subagents/utils.js +21 -0
- package/dist/services/subagents/utils.js.map +1 -1
- package/dist/tools/agent/run-subagent-async.d.ts +25 -0
- package/dist/tools/agent/run-subagent-async.d.ts.map +1 -0
- package/dist/tools/agent/run-subagent-async.js +178 -0
- package/dist/tools/agent/run-subagent-async.js.map +1 -0
- package/dist/types/message.d.ts +1 -0
- package/dist/types/message.d.ts.map +1 -1
- package/dist/types/message.js.map +1 -1
- package/dist/utils/conversation/conversation-event-handler.d.ts.map +1 -1
- package/dist/utils/conversation/conversation-event-handler.js +1 -0
- package/dist/utils/conversation/conversation-event-handler.js.map +1 -1
- package/dist/utils/settings-command.d.ts.map +1 -1
- package/dist/utils/settings-command.js +10 -0
- package/dist/utils/settings-command.js.map +1 -1
- package/dist/utils/shell/sandbox/sandbox-network-approval.d.ts +2 -1
- package/dist/utils/shell/sandbox/sandbox-network-approval.d.ts.map +1 -1
- package/dist/utils/shell/sandbox/sandbox-network-approval.js +17 -1
- package/dist/utils/shell/sandbox/sandbox-network-approval.js.map +1 -1
- package/dist/utils/shell/sandbox/sandbox-network-store.d.ts +20 -0
- package/dist/utils/shell/sandbox/sandbox-network-store.d.ts.map +1 -0
- package/dist/utils/shell/sandbox/sandbox-network-store.js +99 -0
- package/dist/utils/shell/sandbox/sandbox-network-store.js.map +1 -0
- package/package.json +1 -1
|
@@ -7,6 +7,7 @@ import type { ISubagentClient, ISubagentClientFactory } from './subagent-client-
|
|
|
7
7
|
import type { SubagentRunContext } from './tool-policy.js';
|
|
8
8
|
import type { AgentRuntime } from '../agent-runtime/agent-runtime.js';
|
|
9
9
|
import type { SkillsService } from '../skills/skills-service.js';
|
|
10
|
+
import type { SubagentRunHandle } from './types.js';
|
|
10
11
|
export declare class SubagentManager {
|
|
11
12
|
#private;
|
|
12
13
|
constructor(deps: {
|
|
@@ -33,5 +34,21 @@ export declare class SubagentManager {
|
|
|
33
34
|
*/
|
|
34
35
|
getAgentRuntime(): AgentRuntime;
|
|
35
36
|
run(request: SubagentRequest): Promise<SubagentResult>;
|
|
37
|
+
/**
|
|
38
|
+
* Start an asynchronous subagent run.
|
|
39
|
+
*
|
|
40
|
+
* Delegates to the SubagentAsyncRegistry, which owns the live session and
|
|
41
|
+
* run lifecycle. The returned handle exposes only the live-run contract.
|
|
42
|
+
*/
|
|
43
|
+
startRunAsync(request: SubagentRequest): SubagentRunHandle;
|
|
44
|
+
/**
|
|
45
|
+
* Retrieve the result of a previously started asynchronous subagent run.
|
|
46
|
+
*/
|
|
47
|
+
getRunResult(runId: string, signal?: AbortSignal): Promise<SubagentResult>;
|
|
48
|
+
abortAsyncRun(runId: string): void;
|
|
49
|
+
resetAsyncRuns(): void;
|
|
50
|
+
/** Cancel all live asynchronous runs for an explicit parent abort. */
|
|
51
|
+
cancelAllAsyncRuns(): void;
|
|
52
|
+
dispose(): void;
|
|
36
53
|
}
|
|
37
54
|
//# sourceMappingURL=subagent-manager.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"subagent-manager.d.ts","sourceRoot":"","sources":["../../../source/services/subagents/subagent-manager.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,KAAK,EAAE,eAAe,EAAE,gBAAgB,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAC1G,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAChE,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,qBAAqB,EAAsB,MAAM,YAAY,CAAC;AAC7G,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,wCAAwC,CAAC;AAChF,OAAO,KAAK,EAAE,eAAe,EAAE,sBAAsB,EAAE,MAAM,4BAA4B,CAAC;AAI1F,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAG3D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mCAAmC,CAAC;AACtE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;
|
|
1
|
+
{"version":3,"file":"subagent-manager.d.ts","sourceRoot":"","sources":["../../../source/services/subagents/subagent-manager.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,KAAK,EAAE,eAAe,EAAE,gBAAgB,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAC1G,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAChE,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,qBAAqB,EAAsB,MAAM,YAAY,CAAC;AAC7G,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,wCAAwC,CAAC;AAChF,OAAO,KAAK,EAAE,eAAe,EAAE,sBAAsB,EAAE,MAAM,4BAA4B,CAAC;AAI1F,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAG3D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mCAAmC,CAAC;AACtE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AACjE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAGpD,qBAAa,eAAe;;IAO1B,YAAY,IAAI,EAAE;QAChB,MAAM,EAAE,eAAe,CAAC;QACxB,QAAQ,EAAE,gBAAgB,CAAC;QAC3B,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;QACpC,qBAAqB,EAAE,sBAAsB,CAAC;QAC9C,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,iBAAiB,KAAK,IAAI,CAAC;QAC7C,WAAW,CAAC,EAAE,eAAe,CAAC;QAC9B,YAAY,CAAC,EAAE,sBAAsB,CAAC,cAAc,CAAC,CAAC;QACtD,aAAa,CAAC,EAAE,aAAa,CAAC;KAC/B,EAKA;IAED,kBAAkB,IAAI,IAAI,CAGzB;IAED,UAAU,IAAI,IAAI,CAEjB;IAED,gBAAgB,CAAC,IAAI,EAAE,qBAAqB,GAAG,IAAI,CAAC,kBAAkB,CAAC,CAEtE;IAED,YAAY,CAAC,IAAI,EAAE,qBAAqB,GAAG,KAAK,CAAC,kBAAkB,CAAC,CAEnE;IAEK,SAAS,CAAC,OAAO,EAAE,eAAe,EAAE,OAAO,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,cAAc,CAAC,CAEvG;IAED;;;;;;OAMG;IACH,eAAe,IAAI,YAAY,CAQ9B;IAaK,GAAG,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,cAAc,CAAC,CAyD3D;IAED;;;;;OAKG;IACH,aAAa,CAAC,OAAO,EAAE,eAAe,GAAG,iBAAiB,CAKzD;IAED;;OAEG;IACH,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,cAAc,CAAC,CAEzE;IAED,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAEjC;IAED,cAAc,IAAI,IAAI,CAErB;IAED,sEAAsE;IACtE,kBAAkB,IAAI,IAAI,CAEzB;IAED,OAAO,IAAI,IAAI,CAEd;CACF"}
|
|
@@ -4,11 +4,13 @@ import { isAbortLike, safeEmit } from './utils.js';
|
|
|
4
4
|
import { normalizeAgentRunUsage, extractUsage } from '../../utils/ai/token-usage.js';
|
|
5
5
|
import { adaptLegacyRole, adaptLegacyDefinition } from '../agent-runtime/legacy-adapter.js';
|
|
6
6
|
import { createAgentRuntimeFromSubagentRuntime } from '../agent-runtime/compose-agent-runtime.js';
|
|
7
|
+
import { SubagentRegistryError } from './subagent-async-registry.js';
|
|
7
8
|
export class SubagentManager {
|
|
8
9
|
#logger;
|
|
9
10
|
#settings;
|
|
10
11
|
#onEvent;
|
|
11
12
|
#runtime;
|
|
13
|
+
#mentorActive = false;
|
|
12
14
|
constructor(deps) {
|
|
13
15
|
this.#logger = deps.logger;
|
|
14
16
|
this.#settings = deps.settings;
|
|
@@ -17,6 +19,7 @@ export class SubagentManager {
|
|
|
17
19
|
}
|
|
18
20
|
resetMentorSession() {
|
|
19
21
|
this.#runtime.mentorRunner.reset();
|
|
22
|
+
this.#runtime.asyncRegistry.reset();
|
|
20
23
|
}
|
|
21
24
|
clearCache() {
|
|
22
25
|
this.#runtime.nestedRunner.clearCache();
|
|
@@ -67,8 +70,14 @@ export class SubagentManager {
|
|
|
67
70
|
parentTool: request.parentTool,
|
|
68
71
|
});
|
|
69
72
|
try {
|
|
73
|
+
if (request.role === 'mentor') {
|
|
74
|
+
if (this.#mentorActive || this.#runtime.asyncRegistry.hasActiveRunForRole('mentor')) {
|
|
75
|
+
throw new SubagentRegistryError('already_active', 'Mentor session is already active');
|
|
76
|
+
}
|
|
77
|
+
this.#mentorActive = true;
|
|
78
|
+
}
|
|
70
79
|
const result = request.role === 'mentor'
|
|
71
|
-
? await this.#runtime.mentorRunner.run(agentId, request.task, request.signal)
|
|
80
|
+
? await this.#runtime.mentorRunner.run(agentId, request.task, request.signal, undefined, request.executionBudget)
|
|
72
81
|
: await this.#runtime.executionRunner.run(agentId, request, this.#resolveRoleDefinition(request.role));
|
|
73
82
|
safeEmit(this.#logger, this.#onEvent, { type: 'subagent_completed', result });
|
|
74
83
|
return result;
|
|
@@ -95,6 +104,41 @@ export class SubagentManager {
|
|
|
95
104
|
safeEmit(this.#logger, this.#onEvent, { type: 'subagent_completed', result });
|
|
96
105
|
return result;
|
|
97
106
|
}
|
|
107
|
+
finally {
|
|
108
|
+
if (request.role === 'mentor')
|
|
109
|
+
this.#mentorActive = false;
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Start an asynchronous subagent run.
|
|
114
|
+
*
|
|
115
|
+
* Delegates to the SubagentAsyncRegistry, which owns the live session and
|
|
116
|
+
* run lifecycle. The returned handle exposes only the live-run contract.
|
|
117
|
+
*/
|
|
118
|
+
startRunAsync(request) {
|
|
119
|
+
if (request.role === 'mentor' && this.#mentorActive) {
|
|
120
|
+
throw new SubagentRegistryError('already_active', 'Mentor session is already active');
|
|
121
|
+
}
|
|
122
|
+
return this.#runtime.asyncRegistry.startRun(request);
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Retrieve the result of a previously started asynchronous subagent run.
|
|
126
|
+
*/
|
|
127
|
+
getRunResult(runId, signal) {
|
|
128
|
+
return this.#runtime.asyncRegistry.getResult(runId, signal);
|
|
129
|
+
}
|
|
130
|
+
abortAsyncRun(runId) {
|
|
131
|
+
this.#runtime.asyncRegistry.abortRun(runId);
|
|
132
|
+
}
|
|
133
|
+
resetAsyncRuns() {
|
|
134
|
+
this.#runtime.asyncRegistry.reset();
|
|
135
|
+
}
|
|
136
|
+
/** Cancel all live asynchronous runs for an explicit parent abort. */
|
|
137
|
+
cancelAllAsyncRuns() {
|
|
138
|
+
this.#runtime.asyncRegistry.cancelAllRuns();
|
|
139
|
+
}
|
|
140
|
+
dispose() {
|
|
141
|
+
this.#runtime.asyncRegistry.dispose();
|
|
98
142
|
}
|
|
99
143
|
}
|
|
100
144
|
//# sourceMappingURL=subagent-manager.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"subagent-manager.js","sourceRoot":"","sources":["../../../source/services/subagents/subagent-manager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAOzC,OAAO,EAAE,qBAAqB,EAAwB,MAAM,cAAc,CAAC;AAC3E,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACnD,OAAO,EAAE,sBAAsB,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAErF,OAAO,EAAE,eAAe,EAAE,qBAAqB,EAAE,MAAM,oCAAoC,CAAC;AAC5F,OAAO,EAAE,qCAAqC,EAAE,MAAM,2CAA2C,CAAC;AAIlG,MAAM,OAAO,eAAe;IAC1B,OAAO,CAAkB;IACzB,SAAS,CAAmB;IAC5B,QAAQ,CAAsC;IAC9C,QAAQ,CAAkB;
|
|
1
|
+
{"version":3,"file":"subagent-manager.js","sourceRoot":"","sources":["../../../source/services/subagents/subagent-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import type { ConversationEvent } from '../conversation/conversation-events.js';
|
|
2
|
+
/** A background subagent run that finished and still owes the main agent a notification. */
|
|
3
|
+
export interface BackgroundSubagentNotification {
|
|
4
|
+
runId: string;
|
|
5
|
+
role: string;
|
|
6
|
+
status: 'completed' | 'failed' | 'cancelled';
|
|
7
|
+
preview: string;
|
|
8
|
+
error?: string;
|
|
9
|
+
completedAt: number;
|
|
10
|
+
}
|
|
11
|
+
export type BackgroundSubagentTaskStatus = 'running' | 'completed' | 'failed' | 'cancelled';
|
|
12
|
+
/** Conversation-scoped projection of one background subagent lifecycle. */
|
|
13
|
+
export interface BackgroundSubagentTask {
|
|
14
|
+
runId: string;
|
|
15
|
+
role: string;
|
|
16
|
+
task: string;
|
|
17
|
+
status: BackgroundSubagentTaskStatus;
|
|
18
|
+
startedAt: number;
|
|
19
|
+
completedAt?: number;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* The delivery half of {@link SubagentNotificationStore}, for callers that hand
|
|
23
|
+
* pending notifications to the main agent but never produce them.
|
|
24
|
+
*/
|
|
25
|
+
export interface BackgroundSubagentNotificationPort {
|
|
26
|
+
readonly pendingCount: number;
|
|
27
|
+
drain(): BackgroundSubagentNotification[];
|
|
28
|
+
retain(notifications: readonly BackgroundSubagentNotification[]): void;
|
|
29
|
+
}
|
|
30
|
+
/** Read-only lifecycle projection used by the background-tasks UI. */
|
|
31
|
+
export interface BackgroundSubagentTaskPort {
|
|
32
|
+
getSnapshot(): readonly BackgroundSubagentTask[];
|
|
33
|
+
setObserver(observer: (() => void) | null): void;
|
|
34
|
+
}
|
|
35
|
+
export interface SubagentNotificationStoreDeps {
|
|
36
|
+
/** Injectable clock so completion timestamps stay deterministic under test. */
|
|
37
|
+
now?: () => number;
|
|
38
|
+
/** How long terminal tasks remain visible in the background overview. */
|
|
39
|
+
recentTaskRetentionMs?: number;
|
|
40
|
+
/**
|
|
41
|
+
* Upper bound on remembered run ids. The async registry caps sessions at 50
|
|
42
|
+
* and TTLs terminal runs out after 30 minutes, so a few hundred ids covers
|
|
43
|
+
* every run that could still be replayed while staying O(1) in memory.
|
|
44
|
+
*/
|
|
45
|
+
deliveredIdCap?: number;
|
|
46
|
+
}
|
|
47
|
+
export declare const BACKGROUND_TASK_RECENT_RETENTION_MS = 5000;
|
|
48
|
+
/**
|
|
49
|
+
* Pending notifications for background (async) subagent runs.
|
|
50
|
+
*
|
|
51
|
+
* Owns three invariants the callers must not have to re-derive:
|
|
52
|
+
* - Only `subagent_completed` events flagged `async: true` are notifiable.
|
|
53
|
+
* Foreground and nested runs emit the same event type without the flag and
|
|
54
|
+
* must never surface a notification.
|
|
55
|
+
* - A run is announced at most once, ever. The registry already guards against
|
|
56
|
+
* double-settling a run, so the duplicates guarded here come from buffered
|
|
57
|
+
* event flushes and conversation replay, which can re-present an event long
|
|
58
|
+
* after it was first seen — including after it was already delivered.
|
|
59
|
+
* - Delivery is confirmed by the caller, not by reading. `drain()` hands over
|
|
60
|
+
* the pending batch and clears it; a caller whose delivery failed calls
|
|
61
|
+
* `retain()` to put the batch back at the front of the queue. Drain/retain
|
|
62
|
+
* was chosen over peek/commit because the common path (delivery succeeds) is
|
|
63
|
+
* then a single call, and because retained notifications are handed back as
|
|
64
|
+
* values rather than leaving the store holding provisional state. A run id
|
|
65
|
+
* stays deduped across both paths, so a retained notification is redelivered
|
|
66
|
+
* exactly once and a replayed event for it is still dropped.
|
|
67
|
+
*/
|
|
68
|
+
export declare class SubagentNotificationStore implements BackgroundSubagentNotificationPort {
|
|
69
|
+
#private;
|
|
70
|
+
constructor(deps?: SubagentNotificationStoreDeps);
|
|
71
|
+
/**
|
|
72
|
+
* Updates the read-only task projection for async starts and completions.
|
|
73
|
+
* Internal tool events intentionally do not enter this state.
|
|
74
|
+
*/
|
|
75
|
+
recordLifecycle(event: ConversationEvent): boolean;
|
|
76
|
+
getTaskSnapshot(): readonly BackgroundSubagentTask[];
|
|
77
|
+
/**
|
|
78
|
+
* Records a completion event when it belongs to a background run that has not
|
|
79
|
+
* been seen before. Returns whether the notification was novel, so a caller
|
|
80
|
+
* can act (wake a turn) only on first sight.
|
|
81
|
+
*/
|
|
82
|
+
enqueue(event: ConversationEvent): boolean;
|
|
83
|
+
get pendingCount(): number;
|
|
84
|
+
/** Hands over every pending notification in completion order and clears them. */
|
|
85
|
+
drain(): BackgroundSubagentNotification[];
|
|
86
|
+
/** Returns undelivered notifications to the queue, ahead of anything newer. */
|
|
87
|
+
retain(notifications: readonly BackgroundSubagentNotification[]): void;
|
|
88
|
+
}
|
|
89
|
+
//# sourceMappingURL=subagent-notification-store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"subagent-notification-store.d.ts","sourceRoot":"","sources":["../../../source/services/subagents/subagent-notification-store.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,wCAAwC,CAAC;AAIhF,4FAA4F;AAC5F,MAAM,WAAW,8BAA8B;IAC7C,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,WAAW,GAAG,QAAQ,GAAG,WAAW,CAAC;IAC7C,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,MAAM,4BAA4B,GAAG,SAAS,GAAG,WAAW,GAAG,QAAQ,GAAG,WAAW,CAAC;AAE5F,2EAA2E;AAC3E,MAAM,WAAW,sBAAsB;IACrC,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,4BAA4B,CAAC;IACrC,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;;GAGG;AACH,MAAM,WAAW,kCAAkC;IACjD,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,KAAK,IAAI,8BAA8B,EAAE,CAAC;IAC1C,MAAM,CAAC,aAAa,EAAE,SAAS,8BAA8B,EAAE,GAAG,IAAI,CAAC;CACxE;AAED,sEAAsE;AACtE,MAAM,WAAW,0BAA0B;IACzC,WAAW,IAAI,SAAS,sBAAsB,EAAE,CAAC;IACjD,WAAW,CAAC,QAAQ,EAAE,CAAC,MAAM,IAAI,CAAC,GAAG,IAAI,GAAG,IAAI,CAAC;CAClD;AAED,MAAM,WAAW,6BAA6B;IAC5C,+EAA+E;IAC/E,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;IACnB,yEAAyE;IACzE,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B;;;;OAIG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAGD,eAAO,MAAM,mCAAmC,OAAQ,CAAC;AAEzD;;;;;;;;;;;;;;;;;;;GAmBG;AACH,qBAAa,yBAA0B,YAAW,kCAAkC;;IASlF,YAAY,IAAI,GAAE,6BAAkC,EAInD;IAED;;;OAGG;IACH,eAAe,CAAC,KAAK,EAAE,iBAAiB,GAAG,OAAO,CA2CjD;IAED,eAAe,IAAI,SAAS,sBAAsB,EAAE,CAQnD;IAED;;;;OAIG;IACH,OAAO,CAAC,KAAK,EAAE,iBAAiB,GAAG,OAAO,CAkBzC;IAED,IAAI,YAAY,IAAI,MAAM,CAEzB;IAED,iFAAiF;IACjF,KAAK,IAAI,8BAA8B,EAAE,CAOxC;IAED,+EAA+E;IAC/E,MAAM,CAAC,aAAa,EAAE,SAAS,8BAA8B,EAAE,GAAG,IAAI,CASrE;CAiBF"}
|
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
import { truncatePreview } from './utils.js';
|
|
2
|
+
const DEFAULT_DELIVERED_ID_CAP = 256;
|
|
3
|
+
export const BACKGROUND_TASK_RECENT_RETENTION_MS = 5_000;
|
|
4
|
+
/**
|
|
5
|
+
* Pending notifications for background (async) subagent runs.
|
|
6
|
+
*
|
|
7
|
+
* Owns three invariants the callers must not have to re-derive:
|
|
8
|
+
* - Only `subagent_completed` events flagged `async: true` are notifiable.
|
|
9
|
+
* Foreground and nested runs emit the same event type without the flag and
|
|
10
|
+
* must never surface a notification.
|
|
11
|
+
* - A run is announced at most once, ever. The registry already guards against
|
|
12
|
+
* double-settling a run, so the duplicates guarded here come from buffered
|
|
13
|
+
* event flushes and conversation replay, which can re-present an event long
|
|
14
|
+
* after it was first seen — including after it was already delivered.
|
|
15
|
+
* - Delivery is confirmed by the caller, not by reading. `drain()` hands over
|
|
16
|
+
* the pending batch and clears it; a caller whose delivery failed calls
|
|
17
|
+
* `retain()` to put the batch back at the front of the queue. Drain/retain
|
|
18
|
+
* was chosen over peek/commit because the common path (delivery succeeds) is
|
|
19
|
+
* then a single call, and because retained notifications are handed back as
|
|
20
|
+
* values rather than leaving the store holding provisional state. A run id
|
|
21
|
+
* stays deduped across both paths, so a retained notification is redelivered
|
|
22
|
+
* exactly once and a replayed event for it is still dropped.
|
|
23
|
+
*/
|
|
24
|
+
export class SubagentNotificationStore {
|
|
25
|
+
#pending = new Map();
|
|
26
|
+
#seen = new Set();
|
|
27
|
+
#tasks = new Map();
|
|
28
|
+
#settledTaskIds = new Set();
|
|
29
|
+
#now;
|
|
30
|
+
#deliveredIdCap;
|
|
31
|
+
#recentTaskRetentionMs;
|
|
32
|
+
constructor(deps = {}) {
|
|
33
|
+
this.#now = deps.now ?? Date.now;
|
|
34
|
+
this.#deliveredIdCap = Math.max(1, deps.deliveredIdCap ?? DEFAULT_DELIVERED_ID_CAP);
|
|
35
|
+
this.#recentTaskRetentionMs = Math.max(0, deps.recentTaskRetentionMs ?? BACKGROUND_TASK_RECENT_RETENTION_MS);
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Updates the read-only task projection for async starts and completions.
|
|
39
|
+
* Internal tool events intentionally do not enter this state.
|
|
40
|
+
*/
|
|
41
|
+
recordLifecycle(event) {
|
|
42
|
+
if (event.type === 'subagent_started' && event.async === true) {
|
|
43
|
+
if (this.#settledTaskIds.has(event.agentId))
|
|
44
|
+
return false;
|
|
45
|
+
const existing = this.#tasks.get(event.agentId);
|
|
46
|
+
if (existing && existing.status !== 'running')
|
|
47
|
+
return false;
|
|
48
|
+
if (existing?.status === 'running' && existing.role === event.role && existing.task === event.task) {
|
|
49
|
+
return false;
|
|
50
|
+
}
|
|
51
|
+
this.#tasks.set(event.agentId, {
|
|
52
|
+
runId: event.agentId,
|
|
53
|
+
role: event.role,
|
|
54
|
+
task: event.task,
|
|
55
|
+
status: 'running',
|
|
56
|
+
startedAt: existing?.startedAt ?? this.#now(),
|
|
57
|
+
});
|
|
58
|
+
return true;
|
|
59
|
+
}
|
|
60
|
+
if (event.type !== 'subagent_completed' || event.async !== true)
|
|
61
|
+
return false;
|
|
62
|
+
const result = event.result;
|
|
63
|
+
if (!result?.agentId)
|
|
64
|
+
return false;
|
|
65
|
+
if (this.#settledTaskIds.has(result.agentId))
|
|
66
|
+
return false;
|
|
67
|
+
const existing = this.#tasks.get(result.agentId);
|
|
68
|
+
if (existing && existing.status !== 'running')
|
|
69
|
+
return false;
|
|
70
|
+
const completedAt = this.#now();
|
|
71
|
+
this.#tasks.set(result.agentId, {
|
|
72
|
+
runId: result.agentId,
|
|
73
|
+
role: existing?.role ?? result.role,
|
|
74
|
+
task: existing?.task ?? '',
|
|
75
|
+
status: result.status,
|
|
76
|
+
startedAt: existing?.startedAt ?? completedAt,
|
|
77
|
+
completedAt,
|
|
78
|
+
});
|
|
79
|
+
this.#settledTaskIds.add(result.agentId);
|
|
80
|
+
while (this.#settledTaskIds.size > this.#deliveredIdCap) {
|
|
81
|
+
const oldest = this.#settledTaskIds.values().next().value;
|
|
82
|
+
if (oldest === undefined)
|
|
83
|
+
break;
|
|
84
|
+
this.#settledTaskIds.delete(oldest);
|
|
85
|
+
}
|
|
86
|
+
return true;
|
|
87
|
+
}
|
|
88
|
+
getTaskSnapshot() {
|
|
89
|
+
const now = this.#now();
|
|
90
|
+
for (const [runId, task] of this.#tasks) {
|
|
91
|
+
if (task.completedAt !== undefined && now - task.completedAt >= this.#recentTaskRetentionMs) {
|
|
92
|
+
this.#tasks.delete(runId);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
return [...this.#tasks.values()];
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Records a completion event when it belongs to a background run that has not
|
|
99
|
+
* been seen before. Returns whether the notification was novel, so a caller
|
|
100
|
+
* can act (wake a turn) only on first sight.
|
|
101
|
+
*/
|
|
102
|
+
enqueue(event) {
|
|
103
|
+
if (event?.type !== 'subagent_completed' || event.async !== true)
|
|
104
|
+
return false;
|
|
105
|
+
const result = event.result;
|
|
106
|
+
const runId = result?.agentId;
|
|
107
|
+
if (!result || !runId)
|
|
108
|
+
return false;
|
|
109
|
+
if (this.#seen.has(runId))
|
|
110
|
+
return false;
|
|
111
|
+
this.#pending.set(runId, {
|
|
112
|
+
runId,
|
|
113
|
+
role: result.role,
|
|
114
|
+
status: result.status,
|
|
115
|
+
preview: truncatePreview(result.finalText || result.error),
|
|
116
|
+
...(result.error ? { error: result.error } : {}),
|
|
117
|
+
completedAt: this.#now(),
|
|
118
|
+
});
|
|
119
|
+
this.#seen.add(runId);
|
|
120
|
+
this.#evictOldestSeen();
|
|
121
|
+
return true;
|
|
122
|
+
}
|
|
123
|
+
get pendingCount() {
|
|
124
|
+
return this.#pending.size;
|
|
125
|
+
}
|
|
126
|
+
/** Hands over every pending notification in completion order and clears them. */
|
|
127
|
+
drain() {
|
|
128
|
+
const drained = [...this.#pending.values()];
|
|
129
|
+
this.#pending.clear();
|
|
130
|
+
// Handing the batch over is the point at which old ids become evictable:
|
|
131
|
+
// nothing is owed a notification any more, only replay protection.
|
|
132
|
+
this.#evictOldestSeen();
|
|
133
|
+
return drained;
|
|
134
|
+
}
|
|
135
|
+
/** Returns undelivered notifications to the queue, ahead of anything newer. */
|
|
136
|
+
retain(notifications) {
|
|
137
|
+
if (notifications.length === 0)
|
|
138
|
+
return;
|
|
139
|
+
const newer = [...this.#pending.values()];
|
|
140
|
+
this.#pending.clear();
|
|
141
|
+
for (const notification of notifications) {
|
|
142
|
+
this.#pending.set(notification.runId, notification);
|
|
143
|
+
this.#seen.add(notification.runId);
|
|
144
|
+
}
|
|
145
|
+
for (const notification of newer)
|
|
146
|
+
this.#pending.set(notification.runId, notification);
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* Drops the oldest remembered ids once the cap is exceeded, skipping runs that
|
|
150
|
+
* still owe a notification: correctness of an undelivered notification wins
|
|
151
|
+
* over the memory bound, and the pending queue is itself bounded by the number
|
|
152
|
+
* of runs the registry will retain. Forgetting an id only costs replay
|
|
153
|
+
* protection for a run that was delivered long ago.
|
|
154
|
+
*/
|
|
155
|
+
#evictOldestSeen() {
|
|
156
|
+
if (this.#seen.size <= this.#deliveredIdCap)
|
|
157
|
+
return;
|
|
158
|
+
for (const runId of this.#seen) {
|
|
159
|
+
if (this.#seen.size <= this.#deliveredIdCap)
|
|
160
|
+
return;
|
|
161
|
+
if (this.#pending.has(runId))
|
|
162
|
+
continue;
|
|
163
|
+
this.#seen.delete(runId);
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
//# sourceMappingURL=subagent-notification-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"subagent-notification-store.js","sourceRoot":"","sources":["../../../source/services/subagents/subagent-notification-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,10 +1,16 @@
|
|
|
1
|
-
import type { Agent, Runner } from '@openai/agents';
|
|
1
|
+
import type { Agent, Runner, AgentInputItem } from '@openai/agents';
|
|
2
|
+
import type { SavedToolExecution } from '../tool-execution-ledger.js';
|
|
2
3
|
/**
|
|
3
4
|
* General-purpose subagent session. Replaces the private MentorSession shape.
|
|
4
5
|
*
|
|
5
6
|
* For persistent sessions (e.g. mentor): reuse across calls, track store and previousResponseId.
|
|
6
7
|
* For one-shot runs (e.g. run_subagent): create a new session per call, discard after.
|
|
7
8
|
*/
|
|
9
|
+
export type SubagentSessionState = {
|
|
10
|
+
history: AgentInputItem[];
|
|
11
|
+
previousResponseId: string | null;
|
|
12
|
+
toolLedger: SavedToolExecution[];
|
|
13
|
+
};
|
|
8
14
|
export declare class SubagentSession {
|
|
9
15
|
#private;
|
|
10
16
|
readonly id: string;
|
|
@@ -15,6 +21,10 @@ export declare class SubagentSession {
|
|
|
15
21
|
get agent(): Agent | null;
|
|
16
22
|
get previousResponseId(): string | null;
|
|
17
23
|
reset(): void;
|
|
24
|
+
exportState(): SubagentSessionState;
|
|
25
|
+
importState(state: SubagentSessionState): void;
|
|
26
|
+
getUserTurnCount(): number;
|
|
27
|
+
trimHistory(maxUserTurns: number): void;
|
|
18
28
|
switchProvider(provider: string): void;
|
|
19
29
|
ensureRunner(provider: string, createRunner: (providerId: string) => Runner | null): Runner | null;
|
|
20
30
|
ensureAgent(createAgent: () => Agent): Agent;
|
|
@@ -22,5 +32,6 @@ export declare class SubagentSession {
|
|
|
22
32
|
getInput(task: string, supportsConversationChaining: boolean): any;
|
|
23
33
|
getRunOptions(supportsConversationChaining: boolean, maxTurns: number): Record<string, any>;
|
|
24
34
|
appendOutput(result: any): void;
|
|
35
|
+
setToolLedger(toolLedger: SavedToolExecution[]): void;
|
|
25
36
|
}
|
|
26
37
|
//# sourceMappingURL=subagent-session.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"subagent-session.d.ts","sourceRoot":"","sources":["../../../source/services/subagents/subagent-session.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"subagent-session.d.ts","sourceRoot":"","sources":["../../../source/services/subagents/subagent-session.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAEpE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;AAEtE;;;;;GAKG;AACH,MAAM,MAAM,oBAAoB,GAAG;IACjC,OAAO,EAAE,cAAc,EAAE,CAAC;IAC1B,kBAAkB,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,UAAU,EAAE,kBAAkB,EAAE,CAAC;CAClC,CAAC;AAEF,qBAAa,eAAe;;IAC1B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAQtB,YAAY,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAGnC;IAED,IAAI,QAAQ,IAAI,MAAM,GAAG,IAAI,CAE5B;IAED,IAAI,MAAM,IAAI,MAAM,GAAG,IAAI,CAE1B;IAED,IAAI,KAAK,IAAI,KAAK,GAAG,IAAI,CAExB;IAED,IAAI,kBAAkB,IAAI,MAAM,GAAG,IAAI,CAEtC;IAED,KAAK,IAAI,IAAI,CAUZ;IAED,WAAW,IAAI,oBAAoB,CAMlC;IAED,WAAW,CAAC,KAAK,EAAE,oBAAoB,GAAG,IAAI,CAU7C;IAED,gBAAgB,IAAI,MAAM,CAEzB;IAED,WAAW,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI,CAEtC;IAED,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAQrC;IAED,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,MAAM,GAAG,IAAI,GAAG,MAAM,GAAG,IAAI,CAKjG;IAED,WAAW,CAAC,WAAW,EAAE,MAAM,KAAK,GAAG,KAAK,CAM3C;IAED,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAEpC;IAED,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,4BAA4B,EAAE,OAAO,GAAG,GAAG,CAEjE;IAED,aAAa,CAAC,4BAA4B,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAQ1F;IAED,YAAY,CAAC,MAAM,EAAE,GAAG,GAAG,IAAI,CAK9B;IAED,aAAa,CAAC,UAAU,EAAE,kBAAkB,EAAE,GAAG,IAAI,CAEpD;CACF"}
|
|
@@ -1,10 +1,4 @@
|
|
|
1
1
|
import { ConversationStore } from '../conversation/conversation-store.js';
|
|
2
|
-
/**
|
|
3
|
-
* General-purpose subagent session. Replaces the private MentorSession shape.
|
|
4
|
-
*
|
|
5
|
-
* For persistent sessions (e.g. mentor): reuse across calls, track store and previousResponseId.
|
|
6
|
-
* For one-shot runs (e.g. run_subagent): create a new session per call, discard after.
|
|
7
|
-
*/
|
|
8
2
|
export class SubagentSession {
|
|
9
3
|
id;
|
|
10
4
|
role;
|
|
@@ -13,6 +7,7 @@ export class SubagentSession {
|
|
|
13
7
|
#agent = null;
|
|
14
8
|
#store = null;
|
|
15
9
|
#previousResponseId = null;
|
|
10
|
+
#toolLedger = [];
|
|
16
11
|
constructor(id, role) {
|
|
17
12
|
this.id = id;
|
|
18
13
|
this.role = role;
|
|
@@ -34,11 +29,36 @@ export class SubagentSession {
|
|
|
34
29
|
this.#store.clear();
|
|
35
30
|
}
|
|
36
31
|
this.#previousResponseId = null;
|
|
32
|
+
this.#toolLedger = [];
|
|
37
33
|
this.#store = null;
|
|
38
34
|
this.#runner = null;
|
|
39
35
|
this.#provider = null;
|
|
40
36
|
this.#agent = null;
|
|
41
37
|
}
|
|
38
|
+
exportState() {
|
|
39
|
+
return {
|
|
40
|
+
history: this.#store?.getHistory() ?? [],
|
|
41
|
+
previousResponseId: this.#previousResponseId,
|
|
42
|
+
toolLedger: [...this.#toolLedger],
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
importState(state) {
|
|
46
|
+
this.#store?.clear();
|
|
47
|
+
if (!this.#store) {
|
|
48
|
+
this.#store = new ConversationStore();
|
|
49
|
+
}
|
|
50
|
+
for (const item of state.history ?? []) {
|
|
51
|
+
this.#store.addImportedItem(item);
|
|
52
|
+
}
|
|
53
|
+
this.#previousResponseId = state.previousResponseId ?? null;
|
|
54
|
+
this.#toolLedger = state.toolLedger ? [...state.toolLedger] : [];
|
|
55
|
+
}
|
|
56
|
+
getUserTurnCount() {
|
|
57
|
+
return this.#store?.listUserTurns().length ?? 0;
|
|
58
|
+
}
|
|
59
|
+
trimHistory(maxUserTurns) {
|
|
60
|
+
this.#store?.trimUserTurns(maxUserTurns);
|
|
61
|
+
}
|
|
42
62
|
switchProvider(provider) {
|
|
43
63
|
if (this.#provider !== provider) {
|
|
44
64
|
this.#agent = null;
|
|
@@ -82,5 +102,8 @@ export class SubagentSession {
|
|
|
82
102
|
this.#previousResponseId = result.responseId;
|
|
83
103
|
}
|
|
84
104
|
}
|
|
105
|
+
setToolLedger(toolLedger) {
|
|
106
|
+
this.#toolLedger = [...toolLedger];
|
|
107
|
+
}
|
|
85
108
|
}
|
|
86
109
|
//# sourceMappingURL=subagent-session.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"subagent-session.js","sourceRoot":"","sources":["../../../source/services/subagents/subagent-session.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,uCAAuC,CAAC;
|
|
1
|
+
{"version":3,"file":"subagent-session.js","sourceRoot":"","sources":["../../../source/services/subagents/subagent-session.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
import type { NormalizedUsage } from '../../utils/ai/token-usage.js';
|
|
2
2
|
import type { ExecutionBudget } from '../agent-runtime/execution-budget.js';
|
|
3
3
|
export declare const SUBAGENT_ROLES: readonly ['explorer', 'worker', 'researcher', 'mentor', 'librarian'];
|
|
4
|
+
export declare const PHASE_1_ASYNC_SUBAGENT_ROLES: readonly ['explorer', 'researcher', 'mentor'];
|
|
4
5
|
export type SupportedSubagentRole = (typeof SUBAGENT_ROLES)[number];
|
|
6
|
+
export type Phase1AsyncSubagentRole = (typeof PHASE_1_ASYNC_SUBAGENT_ROLES)[number];
|
|
5
7
|
export type SubagentRole = SupportedSubagentRole | string;
|
|
6
8
|
export interface SubagentRequest {
|
|
7
9
|
role: SubagentRole;
|
|
@@ -14,6 +16,8 @@ export interface SubagentRequest {
|
|
|
14
16
|
parentTool?: string;
|
|
15
17
|
/** Execution-tree budget for tracking aggregate resource usage. */
|
|
16
18
|
executionBudget?: ExecutionBudget;
|
|
19
|
+
/** Continue a completed async session. */
|
|
20
|
+
continueRunId?: string;
|
|
17
21
|
}
|
|
18
22
|
export interface SubagentDefinition {
|
|
19
23
|
role: SubagentRole;
|
|
@@ -78,4 +82,11 @@ export interface SubagentResult {
|
|
|
78
82
|
/** SDK nested run result used to propagate/resume delegated approvals. */
|
|
79
83
|
nestedRunResult?: unknown;
|
|
80
84
|
}
|
|
85
|
+
/** The only state exposed while an asynchronous run is live. */
|
|
86
|
+
export interface SubagentRunHandle {
|
|
87
|
+
runId: string;
|
|
88
|
+
role: string;
|
|
89
|
+
status: 'running';
|
|
90
|
+
task: string;
|
|
91
|
+
}
|
|
81
92
|
//# sourceMappingURL=types.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../source/services/subagents/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AACrE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sCAAsC,CAAC;AAE5E,eAAO,MAAM,cAAc,YAAI,UAAU,EAAE,QAAQ,EAAE,YAAY,EAAE,QAAQ,EAAE,WAAW,CAAU,CAAC;AACnG,MAAM,MAAM,qBAAqB,GAAG,CAAC,OAAO,cAAc,CAAC,CAAC,MAAM,CAAC,CAAC;AACpE,MAAM,MAAM,YAAY,GAAG,qBAAqB,GAAG,MAAM,CAAC;AAE1D,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,YAAY,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,2CAA2C;IAC3C,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,2FAA2F;IAC3F,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,0DAA0D;IAC1D,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,mEAAmE;IACnE,eAAe,CAAC,EAAE,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../source/services/subagents/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AACrE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sCAAsC,CAAC;AAE5E,eAAO,MAAM,cAAc,YAAI,UAAU,EAAE,QAAQ,EAAE,YAAY,EAAE,QAAQ,EAAE,WAAW,CAAU,CAAC;AACnG,eAAO,MAAM,4BAA4B,YAAI,UAAU,EAAE,YAAY,EAAE,QAAQ,CAAU,CAAC;AAC1F,MAAM,MAAM,qBAAqB,GAAG,CAAC,OAAO,cAAc,CAAC,CAAC,MAAM,CAAC,CAAC;AACpE,MAAM,MAAM,uBAAuB,GAAG,CAAC,OAAO,4BAA4B,CAAC,CAAC,MAAM,CAAC,CAAC;AACpF,MAAM,MAAM,YAAY,GAAG,qBAAqB,GAAG,MAAM,CAAC;AAE1D,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,YAAY,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,2CAA2C;IAC3C,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,2FAA2F;IAC3F,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,0DAA0D;IAC1D,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,mEAAmE;IACnE,eAAe,CAAC,EAAE,eAAe,CAAC;IAClC,0CAA0C;IAC1C,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,YAAY,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,OAAO,CAAC;IAClB,YAAY,EAAE,OAAO,CAAC;IACtB,WAAW,EAAE,OAAO,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,eAAe,EAAE,MAAM,CAAC;IACxB,gEAAgE;IAChE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;;OAIG;IACH,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB;;;;OAIG;IACH,eAAe,CAAC,EAAE;QAChB,IAAI,EAAE,MAAM,EAAE,CAAC;QACf,KAAK,EAAE,MAAM,EAAE,CAAC;KACjB,CAAC;IACF;;;;OAIG;IACH,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB;;;OAGG;IACH,eAAe,CAAC,EAAE,eAAe,CAAC;IAClC;;;;OAIG;IACH,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,WAAW,GAAG,QAAQ,GAAG,WAAW,CAAC;IAC7C,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,SAAS,EAAE,KAAK,CAAC;QACf,QAAQ,EAAE,MAAM,CAAC;QACjB,KAAK,EAAE,MAAM,CAAC;KACf,CAAC,CAAC;IACH,KAAK,CAAC,EAAE,eAAe,CAAC;IACxB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,0EAA0E;IAC1E,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED,gEAAgE;AAChE,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,SAAS,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;CACd"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../source/services/subagents/types.ts"],"names":[],"mappings":"AAGA,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,UAAU,EAAE,QAAQ,EAAE,YAAY,EAAE,QAAQ,EAAE,WAAW,CAAU,CAAC"}
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../source/services/subagents/types.ts"],"names":[],"mappings":"AAGA,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,UAAU,EAAE,QAAQ,EAAE,YAAY,EAAE,QAAQ,EAAE,WAAW,CAAU,CAAC;AACnG,MAAM,CAAC,MAAM,4BAA4B,GAAG,CAAC,UAAU,EAAE,YAAY,EAAE,QAAQ,CAAU,CAAC"}
|
|
@@ -22,5 +22,11 @@ export declare function createCompositeAbortSignal(...signals: (AbortSignal | un
|
|
|
22
22
|
signal: AbortSignal;
|
|
23
23
|
cleanup: () => void;
|
|
24
24
|
} | undefined;
|
|
25
|
+
export declare const MAX_PREVIEW_LENGTH = 300;
|
|
26
|
+
/**
|
|
27
|
+
* Condenses subagent output into a single-line, length-bounded preview: the
|
|
28
|
+
* first paragraph with whitespace collapsed, ellipsised at MAX_PREVIEW_LENGTH.
|
|
29
|
+
*/
|
|
30
|
+
export declare function truncatePreview(text: unknown): string;
|
|
25
31
|
export declare function createAbortError(message?: string): Error;
|
|
26
32
|
//# sourceMappingURL=utils.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../source/services/subagents/utils.ts"],"names":[],"mappings":"AAGA,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,EAAE,GAAG,CAAC,EAAE,OAAO,GAAG,OAAO,CAK/E;AAED,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,GAAG,GAAG,OAAO,CAInD;AAED,wBAAgB,aAAa,CAAC,GAAG,EAAE,GAAG,GAAG,MAAM,GAAG,IAAI,CAWrD;AAED,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,GAAG,GAAG,MAAM,CA2BpD;AAED,wBAAgB,eAAe,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,CAiBnH;AAED,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,KAAK,CAAC;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,CAE9G;AAED,wBAAgB,yBAAyB,CACvC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GACjC,KAAK,CAAC;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,CAE5C;AAED,wBAAgB,QAAQ,CAAC,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,GAAG,IAAI,CAMpE;AAED;;;;;GAKG;AACH,wBAAgB,0BAA0B,CACxC,GAAG,OAAO,EAAE,CAAC,WAAW,GAAG,SAAS,GAAG,IAAI,CAAC,EAAE,GAC7C;IAAE,MAAM,EAAE,WAAW,CAAC;IAAC,OAAO,EAAE,MAAM,IAAI,CAAA;CAAE,GAAG,SAAS,CAqC1D;AAED,wBAAgB,gBAAgB,CAAC,OAAO,SAAkC,GAAG,KAAK,CAIjF"}
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../source/services/subagents/utils.ts"],"names":[],"mappings":"AAGA,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,EAAE,GAAG,CAAC,EAAE,OAAO,GAAG,OAAO,CAK/E;AAED,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,GAAG,GAAG,OAAO,CAInD;AAED,wBAAgB,aAAa,CAAC,GAAG,EAAE,GAAG,GAAG,MAAM,GAAG,IAAI,CAWrD;AAED,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,GAAG,GAAG,MAAM,CA2BpD;AAED,wBAAgB,eAAe,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,CAiBnH;AAED,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,KAAK,CAAC;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,CAE9G;AAED,wBAAgB,yBAAyB,CACvC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GACjC,KAAK,CAAC;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,CAE5C;AAED,wBAAgB,QAAQ,CAAC,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,GAAG,IAAI,CAMpE;AAED;;;;;GAKG;AACH,wBAAgB,0BAA0B,CACxC,GAAG,OAAO,EAAE,CAAC,WAAW,GAAG,SAAS,GAAG,IAAI,CAAC,EAAE,GAC7C;IAAE,MAAM,EAAE,WAAW,CAAC;IAAC,OAAO,EAAE,MAAM,IAAI,CAAA;CAAE,GAAG,SAAS,CAqC1D;AAED,eAAO,MAAM,kBAAkB,MAAM,CAAC;AAEtC;;;GAGG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM,CAmBrD;AAED,wBAAgB,gBAAgB,CAAC,OAAO,SAAkC,GAAG,KAAK,CAIjF"}
|
|
@@ -120,6 +120,27 @@ export function createCompositeAbortSignal(...signals) {
|
|
|
120
120
|
}
|
|
121
121
|
return { signal: controller.signal, cleanup };
|
|
122
122
|
}
|
|
123
|
+
export const MAX_PREVIEW_LENGTH = 300;
|
|
124
|
+
/**
|
|
125
|
+
* Condenses subagent output into a single-line, length-bounded preview: the
|
|
126
|
+
* first paragraph with whitespace collapsed, ellipsised at MAX_PREVIEW_LENGTH.
|
|
127
|
+
*/
|
|
128
|
+
export function truncatePreview(text) {
|
|
129
|
+
if (typeof text !== 'string') {
|
|
130
|
+
return '';
|
|
131
|
+
}
|
|
132
|
+
const firstParagraph = text
|
|
133
|
+
.split(/\n\s*\n/)[0]
|
|
134
|
+
?.replace(/\s+/g, ' ')
|
|
135
|
+
.trim() || '';
|
|
136
|
+
if (!firstParagraph) {
|
|
137
|
+
return '';
|
|
138
|
+
}
|
|
139
|
+
if (firstParagraph.length <= MAX_PREVIEW_LENGTH) {
|
|
140
|
+
return firstParagraph;
|
|
141
|
+
}
|
|
142
|
+
return `${firstParagraph.slice(0, MAX_PREVIEW_LENGTH - 3)}...`;
|
|
143
|
+
}
|
|
123
144
|
export function createAbortError(message = 'The subagent run was aborted.') {
|
|
124
145
|
const error = new Error(message);
|
|
125
146
|
error.name = 'AbortError';
|