@myagentroam/agent 0.11.38 → 0.11.40
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/cli/catalog-file.d.ts +2 -0
- package/dist/cli/main.js +11 -4
- package/dist/cli/subagent/control.d.ts +56 -0
- package/dist/cli/subagent/control.js +219 -0
- package/dist/cli/subagent/history.d.ts +17 -0
- package/dist/cli/subagent/history.js +85 -0
- package/dist/cli/subagent/index.d.ts +10 -0
- package/dist/cli/subagent/index.js +94 -0
- package/dist/cli/subagent/native.d.ts +91 -0
- package/dist/cli/subagent/native.js +359 -0
- package/dist/cli/subagent/observations.d.ts +57 -0
- package/dist/cli/subagent/observations.js +351 -0
- package/dist/cli/subagent/query.d.ts +4 -0
- package/dist/cli/subagent/query.js +114 -0
- package/dist/cli/subagent/resources.d.ts +3 -0
- package/dist/cli/subagent/resources.js +112 -0
- package/dist/cli/subagent/snapshot.d.ts +77 -0
- package/dist/cli/subagent/snapshot.js +127 -0
- package/dist/cli/subagent/start.d.ts +24 -0
- package/dist/cli/subagent/start.js +201 -0
- package/dist/cli/subagent/wait-output.d.ts +19 -0
- package/dist/cli/subagent/wait-output.js +56 -0
- package/dist/cli/subagent/wait.d.ts +175 -0
- package/dist/cli/subagent/wait.js +453 -0
- package/dist/extensions/contracts.d.ts +2 -5
- package/dist/extensions/manager.d.ts +0 -2
- package/dist/extensions/manager.js +1 -2
- package/dist/extensions/models.d.ts +3 -0
- package/dist/extensions/operation.d.ts +8 -0
- package/dist/extensions/operation.js +3 -0
- package/dist/extensions/services.d.ts +9 -1
- package/dist/extensions/services.js +26 -3
- package/dist/extensions/session-context.d.ts +18 -0
- package/dist/extensions/session-context.js +4 -0
- package/dist/extensions/session-input.d.ts +2 -2
- package/dist/extensions/session-input.js +3 -4
- package/dist/extensions/session-messages.d.ts +1 -1
- package/dist/extensions/session-tools.js +20 -3
- package/dist/extensions/session.d.ts +1 -4
- package/dist/extensions/session.js +2 -16
- package/dist/extensions/tools.js +21 -3
- package/dist/extensions.d.ts +5 -2
- package/dist/extensions.js +2 -1
- package/dist/host/local-agent-host.d.ts +2 -2
- package/dist/host/local-exec-tool.d.ts +1 -1
- package/dist/host/local-exec-tool.js +28 -3
- package/dist/host/local-tool-registry.d.ts +2 -2
- package/dist/index.d.ts +2 -2
- package/dist/model/configuration.d.ts +3 -1
- package/dist/model/configuration.js +1 -0
- package/dist/model/openai-responses.js +5 -0
- package/dist/model/responses-request.js +9 -0
- package/dist/prompts/index.js +1 -3
- package/dist/prompts/resources.d.ts +1 -5
- package/dist/prompts/resources.js +3 -12
- package/dist/prompts/subagent.d.ts +1 -1
- package/dist/prompts/subagent.js +1 -1
- package/dist/runtime/context/gc-candidates-web.d.ts +6 -0
- package/dist/runtime/context/gc-candidates-web.js +53 -1
- package/dist/runtime/context/gc-candidates.js +1 -9
- package/dist/runtime/context/gc.js +19 -11
- package/dist/runtime/context/projection.js +1 -0
- package/dist/runtime/events.d.ts +4 -3
- package/dist/runtime/execution-handle.d.ts +2 -0
- package/dist/runtime/wait.js +12 -2
- package/dist/sdk/agent.js +94 -5
- package/dist/sdk/execution-context-coordinator.d.ts +2 -3
- package/dist/sdk/execution-context-coordinator.js +3 -3
- package/dist/sdk/execution-input.d.ts +3 -4
- package/dist/sdk/execution-input.js +31 -25
- package/dist/sdk/execution-round-preparation.d.ts +1 -1
- package/dist/sdk/execution-round-preparation.js +4 -4
- package/dist/sdk/execution-tool-catalog.js +2 -10
- package/dist/sdk/execution-tool-scope.d.ts +1 -3
- package/dist/sdk/execution-tool-scope.js +10 -12
- package/dist/sdk/extension-models.js +3 -0
- package/dist/sdk/extension-session-launch.d.ts +3 -2
- package/dist/sdk/extension-session-launch.js +2 -3
- package/dist/sdk/extension-tools.js +0 -2
- package/dist/sdk/native-steer.d.ts +2 -2
- package/dist/sdk/native-steer.js +2 -2
- package/dist/sdk/session-composition.d.ts +2 -17
- package/dist/sdk/session-execution-factory.d.ts +2 -3
- package/dist/sdk/session-execution-factory.js +20 -114
- package/dist/sdk/session-execution.d.ts +13 -7
- package/dist/sdk/session-execution.js +11 -3
- package/dist/sdk/session-extension-messages.d.ts +1 -3
- package/dist/sdk/session-extension-messages.js +14 -9
- package/dist/sdk/session-extension-prompt.js +1 -3
- package/dist/sdk/session-maintenance.d.ts +1 -0
- package/dist/sdk/session-maintenance.js +16 -7
- package/dist/sdk/session-open.d.ts +2 -3
- package/dist/sdk/session-open.js +5 -24
- package/dist/sdk/session-runtime.d.ts +19 -8
- package/dist/sdk/session-runtime.js +36 -30
- package/dist/sdk/session.d.ts +3 -2
- package/dist/sdk/session.js +22 -89
- package/dist/sdk/types.d.ts +36 -0
- package/dist/session/catalog.d.ts +22 -1
- package/dist/session/catalog.js +102 -0
- package/dist/session/context-gc-checkpoint.js +30 -1
- package/dist/session/context-gc-contract.d.ts +7 -0
- package/dist/session/context-gc-replacements.d.ts +3 -0
- package/dist/session/context-gc-replacements.js +26 -0
- package/dist/session/store/contracts.d.ts +2 -2
- package/dist/session/store/jsonl/directory-index.d.ts +1 -1
- package/dist/session/store/jsonl/directory-index.js +18 -17
- package/dist/session/store/jsonl/history.js +1 -1
- package/dist/session/store/jsonl/index-transaction.js +2 -8
- package/dist/session/store/jsonl/jsonl-store.d.ts +1 -1
- package/dist/session/store/jsonl/jsonl-store.js +24 -9
- package/dist/session/types.d.ts +1 -0
- package/dist/tools/agent/sleep.js +1 -1
- package/dist/tools/callers.js +1 -12
- package/dist/tools/code-mode/dispatch.js +5 -2
- package/dist/tools/code-mode/index.d.ts +1 -1
- package/dist/tools/code-mode/index.js +2 -0
- package/dist/tools/contracts.d.ts +20 -0
- package/dist/tools/execution-limits.d.ts +5 -20
- package/dist/tools/execution-limits.js +0 -2
- package/dist/tools/execution.js +16 -4
- package/dist/tools/local/exec.js +8 -2
- package/dist/tools/output-projection.d.ts +5 -2
- package/dist/tools/output-projection.js +133 -92
- package/dist/tools/registry.js +1 -13
- package/dist/tools/runtime-context.d.ts +1 -21
- package/package.json +2 -2
- package/dist/extensions/agents.d.ts +0 -100
- package/dist/extensions/agents.js +0 -121
- package/dist/runtime/context/gc-candidates-subagent.d.ts +0 -6
- package/dist/runtime/context/gc-candidates-subagent.js +0 -100
- package/dist/sdk/extension-agent-controller.d.ts +0 -3
- package/dist/sdk/extension-agent-controller.js +0 -69
- package/dist/sdk/extension-agents.d.ts +0 -9
- package/dist/sdk/extension-agents.js +0 -58
- package/dist/sdk/subagent-backend.d.ts +0 -3
- package/dist/sdk/subagent-backend.js +0 -49
- package/dist/subagent/contracts.d.ts +0 -107
- package/dist/subagent/contracts.js +0 -1
- package/dist/subagent/limits.d.ts +0 -17
- package/dist/subagent/limits.js +0 -17
- package/dist/subagent/model-update.d.ts +0 -2
- package/dist/subagent/model-update.js +0 -81
- package/dist/subagent/session-controller.d.ts +0 -87
- package/dist/subagent/session-controller.js +0 -1343
- package/dist/subagent/task.d.ts +0 -134
- package/dist/subagent/task.js +0 -436
- package/dist/subagent/turn-contracts.d.ts +0 -64
- package/dist/subagent/turn-contracts.js +0 -1
- package/dist/subagent/wait-targets.d.ts +0 -10
- package/dist/subagent/wait-targets.js +0 -26
- package/dist/subagent/wait.d.ts +0 -26
- package/dist/subagent/wait.js +0 -73
- package/dist/tools/agent/agent-cancel.d.ts +0 -7
- package/dist/tools/agent/agent-cancel.js +0 -29
- package/dist/tools/agent/agent-message.d.ts +0 -7
- package/dist/tools/agent/agent-message.js +0 -57
- package/dist/tools/agent/agent-start.d.ts +0 -12
- package/dist/tools/agent/agent-start.js +0 -106
- package/dist/tools/agent/agent-wait.d.ts +0 -7
- package/dist/tools/agent/agent-wait.js +0 -91
package/dist/subagent/task.d.ts
DELETED
|
@@ -1,134 +0,0 @@
|
|
|
1
|
-
import type { AgentReasoningEffort } from '../model/configuration.js';
|
|
2
|
-
import type { ExecutionResult } from '../runtime/contracts.js';
|
|
3
|
-
import type { AgentEvent } from '../runtime/events.js';
|
|
4
|
-
import type { SubagentTaskInput, SubagentTaskSnapshot, SubagentLatestMessage, SubagentLatestActivity } from './contracts.js';
|
|
5
|
-
import type { SubagentOrigin, SubagentMessageDelivery, SubagentMailboxMessage, SubagentParentExecution, SubagentTurnHandle } from './turn-contracts.js';
|
|
6
|
-
interface TurnState {
|
|
7
|
-
readonly turnId: string;
|
|
8
|
-
readonly ownerInstanceId?: string;
|
|
9
|
-
readonly origin?: SubagentOrigin;
|
|
10
|
-
readonly delivery?: SubagentMessageDelivery;
|
|
11
|
-
readonly prompt: string;
|
|
12
|
-
readonly start: SubagentParentExecution['startTurn'];
|
|
13
|
-
readonly pendingMessages: SubagentMailboxMessage[];
|
|
14
|
-
readonly handleReady: Promise<void>;
|
|
15
|
-
readonly completion: Promise<void>;
|
|
16
|
-
resolve(): void;
|
|
17
|
-
resolveHandleReady(): void;
|
|
18
|
-
handle?: SubagentTurnHandle;
|
|
19
|
-
cancelRequested?: boolean;
|
|
20
|
-
}
|
|
21
|
-
export type TurnView = Readonly<Omit<TurnState, 'pendingMessages' | 'resolve' | 'resolveHandleReady' | 'cancelRequested'>>;
|
|
22
|
-
type TurnInput = Omit<TurnState, 'handleReady' | 'completion' | 'resolve' | 'resolveHandleReady' | 'handle' | 'cancelRequested'>;
|
|
23
|
-
export interface SubagentTaskState {
|
|
24
|
-
detailsEvicted?: boolean | undefined;
|
|
25
|
-
restorable?: boolean | undefined;
|
|
26
|
-
permissionStop?: ExecutionResult['permissionStop'] | undefined;
|
|
27
|
-
readonly agentId: string;
|
|
28
|
-
readonly description: string;
|
|
29
|
-
readonly role: SubagentTaskInput['role'];
|
|
30
|
-
readonly ownerInstanceId?: string | undefined;
|
|
31
|
-
readonly extensionId?: string | undefined;
|
|
32
|
-
status: SubagentTaskSnapshot['status'];
|
|
33
|
-
modelId?: string | undefined;
|
|
34
|
-
modelName?: string | undefined;
|
|
35
|
-
reasoningEffort?: AgentReasoningEffort | undefined;
|
|
36
|
-
latestMessage?: SubagentLatestMessage | undefined;
|
|
37
|
-
latestActivity?: SubagentLatestActivity | undefined;
|
|
38
|
-
messageRevision: number;
|
|
39
|
-
observedMessageRevision: number;
|
|
40
|
-
latestMessageActivityRevision: number;
|
|
41
|
-
summary?: string | undefined;
|
|
42
|
-
changedFiles: string[];
|
|
43
|
-
verification: string[];
|
|
44
|
-
evidence: Array<{
|
|
45
|
-
path: string;
|
|
46
|
-
startLine?: number;
|
|
47
|
-
endLine?: number;
|
|
48
|
-
}>;
|
|
49
|
-
errorCode?: string | undefined;
|
|
50
|
-
errorMessage?: string | undefined;
|
|
51
|
-
terminalPending: boolean;
|
|
52
|
-
observedTerminalRevision: number;
|
|
53
|
-
terminalRevision?: number | undefined;
|
|
54
|
-
resourceRevision: number;
|
|
55
|
-
turn?: TurnState | undefined;
|
|
56
|
-
controlTail?: Promise<unknown> | undefined;
|
|
57
|
-
receipt?: {
|
|
58
|
-
messageId: string;
|
|
59
|
-
turnId: string;
|
|
60
|
-
deliveryStatus: 'accepted' | 'applied' | 'cancelled' | 'failed';
|
|
61
|
-
} | undefined;
|
|
62
|
-
}
|
|
63
|
-
export type TaskView = Omit<SubagentTaskState, 'turn' | 'receipt' | 'changedFiles' | 'verification' | 'evidence'> & {
|
|
64
|
-
readonly turn?: TurnView | undefined;
|
|
65
|
-
readonly receipt?: Readonly<NonNullable<SubagentTaskState['receipt']>> | undefined;
|
|
66
|
-
readonly changedFiles: readonly string[];
|
|
67
|
-
readonly verification: readonly string[];
|
|
68
|
-
readonly evidence: readonly Readonly<SubagentTaskState['evidence'][number]>[];
|
|
69
|
-
};
|
|
70
|
-
/** Owns the mutable state and transitions of one child task. */
|
|
71
|
-
export declare class SubagentTask {
|
|
72
|
-
#private;
|
|
73
|
-
private readonly state;
|
|
74
|
-
get detailsEvicted(): SubagentTaskState['detailsEvicted'];
|
|
75
|
-
get restorable(): SubagentTaskState['restorable'];
|
|
76
|
-
get permissionStop(): SubagentTaskState['permissionStop'];
|
|
77
|
-
get agentId(): SubagentTaskState['agentId'];
|
|
78
|
-
get description(): SubagentTaskState['description'];
|
|
79
|
-
get role(): SubagentTaskState['role'];
|
|
80
|
-
get ownerInstanceId(): SubagentTaskState['ownerInstanceId'];
|
|
81
|
-
get extensionId(): SubagentTaskState['extensionId'];
|
|
82
|
-
get status(): SubagentTaskState['status'];
|
|
83
|
-
get modelId(): SubagentTaskState['modelId'];
|
|
84
|
-
get modelName(): SubagentTaskState['modelName'];
|
|
85
|
-
get reasoningEffort(): SubagentTaskState['reasoningEffort'];
|
|
86
|
-
get latestMessage(): SubagentTaskState['latestMessage'];
|
|
87
|
-
get latestActivity(): SubagentTaskState['latestActivity'];
|
|
88
|
-
get messageRevision(): SubagentTaskState['messageRevision'];
|
|
89
|
-
get observedMessageRevision(): SubagentTaskState['observedMessageRevision'];
|
|
90
|
-
get latestMessageActivityRevision(): SubagentTaskState['latestMessageActivityRevision'];
|
|
91
|
-
get summary(): SubagentTaskState['summary'];
|
|
92
|
-
get changedFiles(): readonly string[];
|
|
93
|
-
get verification(): readonly string[];
|
|
94
|
-
get evidence(): readonly Readonly<SubagentTaskState['evidence'][number]>[];
|
|
95
|
-
get errorCode(): SubagentTaskState['errorCode'];
|
|
96
|
-
get errorMessage(): SubagentTaskState['errorMessage'];
|
|
97
|
-
get terminalPending(): SubagentTaskState['terminalPending'];
|
|
98
|
-
get observedTerminalRevision(): SubagentTaskState['observedTerminalRevision'];
|
|
99
|
-
get terminalRevision(): SubagentTaskState['terminalRevision'];
|
|
100
|
-
get resourceRevision(): SubagentTaskState['resourceRevision'];
|
|
101
|
-
get turn(): TurnView | undefined;
|
|
102
|
-
get controlTail(): SubagentTaskState['controlTail'];
|
|
103
|
-
get receipt(): Readonly<NonNullable<SubagentTaskState['receipt']>> | undefined;
|
|
104
|
-
constructor(state: SubagentTaskState);
|
|
105
|
-
runTurn(turn: TurnView, nextActivityRevision: () => number, onMessage: () => void, onTerminal: () => void): Promise<'opening-failed' | 'settled'>;
|
|
106
|
-
acknowledgeMessage(revision: number): void;
|
|
107
|
-
acknowledgeTerminal(revision: number): void;
|
|
108
|
-
selectModel(model: {
|
|
109
|
-
id: string;
|
|
110
|
-
name: string;
|
|
111
|
-
reasoningEffort?: AgentReasoningEffort;
|
|
112
|
-
}): void;
|
|
113
|
-
setReceipt(receipt: NonNullable<SubagentTaskState['receipt']>): void;
|
|
114
|
-
updateDelivery(receipt: NonNullable<SubagentTaskState['receipt']>, status: 'applied' | 'cancelled' | 'failed'): boolean;
|
|
115
|
-
requestCancel(expected: TurnView): void;
|
|
116
|
-
settleQueuedTurn(expected: TurnView): void;
|
|
117
|
-
settleTurn(expected: TurnView): void;
|
|
118
|
-
appendMessage(message: SubagentMailboxMessage): void;
|
|
119
|
-
control<T>(operation: () => Promise<T>): Promise<T>;
|
|
120
|
-
cancelQueued(publish: boolean): void;
|
|
121
|
-
queueTurn(input: TurnInput, onComplete: () => void): TurnView;
|
|
122
|
-
markRunning(expected: TurnView): boolean;
|
|
123
|
-
releaseTurn(expected: TurnView): void;
|
|
124
|
-
observeEvent(event: AgentEvent, revision: number): boolean;
|
|
125
|
-
complete(result: ExecutionResult, terminal: 'completed' | 'failed' | 'cancelled' | undefined, persisted: boolean, previousActivity: SubagentTaskState['latestActivity'], previousRevision: number): void;
|
|
126
|
-
fail(error: unknown): void;
|
|
127
|
-
touch(revision: number, terminal?: boolean): void;
|
|
128
|
-
terminalPublished(revision: number | undefined): void;
|
|
129
|
-
evictDetails(): void;
|
|
130
|
-
restoreDetails(restored: SubagentTaskState): void;
|
|
131
|
-
copyWaitState(): TaskView;
|
|
132
|
-
}
|
|
133
|
-
export declare function observeAgentEvent(state: SubagentTaskState, event: AgentEvent): boolean;
|
|
134
|
-
export {};
|
package/dist/subagent/task.js
DELETED
|
@@ -1,436 +0,0 @@
|
|
|
1
|
-
import { describeAgentError } from '../error.js';
|
|
2
|
-
/** Owns the mutable state and transitions of one child task. */
|
|
3
|
-
export class SubagentTask {
|
|
4
|
-
state;
|
|
5
|
-
get detailsEvicted() {
|
|
6
|
-
return this.state.detailsEvicted;
|
|
7
|
-
}
|
|
8
|
-
get restorable() {
|
|
9
|
-
return this.state.restorable;
|
|
10
|
-
}
|
|
11
|
-
get permissionStop() {
|
|
12
|
-
return this.state.permissionStop;
|
|
13
|
-
}
|
|
14
|
-
get agentId() {
|
|
15
|
-
return this.state.agentId;
|
|
16
|
-
}
|
|
17
|
-
get description() {
|
|
18
|
-
return this.state.description;
|
|
19
|
-
}
|
|
20
|
-
get role() {
|
|
21
|
-
return this.state.role;
|
|
22
|
-
}
|
|
23
|
-
get ownerInstanceId() {
|
|
24
|
-
return this.state.ownerInstanceId;
|
|
25
|
-
}
|
|
26
|
-
get extensionId() {
|
|
27
|
-
return this.state.extensionId;
|
|
28
|
-
}
|
|
29
|
-
get status() {
|
|
30
|
-
return this.state.status;
|
|
31
|
-
}
|
|
32
|
-
get modelId() {
|
|
33
|
-
return this.state.modelId;
|
|
34
|
-
}
|
|
35
|
-
get modelName() {
|
|
36
|
-
return this.state.modelName;
|
|
37
|
-
}
|
|
38
|
-
get reasoningEffort() {
|
|
39
|
-
return this.state.reasoningEffort;
|
|
40
|
-
}
|
|
41
|
-
get latestMessage() {
|
|
42
|
-
return this.state.latestMessage;
|
|
43
|
-
}
|
|
44
|
-
get latestActivity() {
|
|
45
|
-
return this.state.latestActivity;
|
|
46
|
-
}
|
|
47
|
-
get messageRevision() {
|
|
48
|
-
return this.state.messageRevision;
|
|
49
|
-
}
|
|
50
|
-
get observedMessageRevision() {
|
|
51
|
-
return this.state.observedMessageRevision;
|
|
52
|
-
}
|
|
53
|
-
get latestMessageActivityRevision() {
|
|
54
|
-
return this.state.latestMessageActivityRevision;
|
|
55
|
-
}
|
|
56
|
-
get summary() {
|
|
57
|
-
return this.state.summary;
|
|
58
|
-
}
|
|
59
|
-
get changedFiles() {
|
|
60
|
-
return this.state.changedFiles;
|
|
61
|
-
}
|
|
62
|
-
get verification() {
|
|
63
|
-
return this.state.verification;
|
|
64
|
-
}
|
|
65
|
-
get evidence() {
|
|
66
|
-
return this.state.evidence;
|
|
67
|
-
}
|
|
68
|
-
get errorCode() {
|
|
69
|
-
return this.state.errorCode;
|
|
70
|
-
}
|
|
71
|
-
get errorMessage() {
|
|
72
|
-
return this.state.errorMessage;
|
|
73
|
-
}
|
|
74
|
-
get terminalPending() {
|
|
75
|
-
return this.state.terminalPending;
|
|
76
|
-
}
|
|
77
|
-
get observedTerminalRevision() {
|
|
78
|
-
return this.state.observedTerminalRevision;
|
|
79
|
-
}
|
|
80
|
-
get terminalRevision() {
|
|
81
|
-
return this.state.terminalRevision;
|
|
82
|
-
}
|
|
83
|
-
get resourceRevision() {
|
|
84
|
-
return this.state.resourceRevision;
|
|
85
|
-
}
|
|
86
|
-
get turn() {
|
|
87
|
-
return this.state.turn;
|
|
88
|
-
}
|
|
89
|
-
get controlTail() {
|
|
90
|
-
return this.state.controlTail;
|
|
91
|
-
}
|
|
92
|
-
get receipt() {
|
|
93
|
-
return this.state.receipt;
|
|
94
|
-
}
|
|
95
|
-
constructor(state) {
|
|
96
|
-
this.state = state;
|
|
97
|
-
}
|
|
98
|
-
async runTurn(turn, nextActivityRevision, onMessage, onTerminal) {
|
|
99
|
-
try {
|
|
100
|
-
const handle = await turn.start({
|
|
101
|
-
turnId: turn.turnId,
|
|
102
|
-
...(turn.delivery === undefined ? {} : { delivery: turn.delivery }),
|
|
103
|
-
...(turn.origin === undefined ? {} : { origin: turn.origin }),
|
|
104
|
-
sessionId: this.agentId,
|
|
105
|
-
prompt: turn.prompt,
|
|
106
|
-
modelId: this.modelId,
|
|
107
|
-
reasoningEffort: this.reasoningEffort,
|
|
108
|
-
role: this.role,
|
|
109
|
-
initialMailbox: this.#takePendingMessages(turn)
|
|
110
|
-
});
|
|
111
|
-
this.#attachHandle(turn, handle);
|
|
112
|
-
}
|
|
113
|
-
catch (error) {
|
|
114
|
-
this.#settleHandleReady(turn);
|
|
115
|
-
this.fail(error);
|
|
116
|
-
onTerminal();
|
|
117
|
-
return 'opening-failed';
|
|
118
|
-
}
|
|
119
|
-
this.#cancelPending(turn);
|
|
120
|
-
this.#settleHandleReady(turn);
|
|
121
|
-
const previousActivity = this.latestActivity;
|
|
122
|
-
const previousMessageRevision = this.messageRevision;
|
|
123
|
-
let terminal;
|
|
124
|
-
try {
|
|
125
|
-
const consume = (async () => {
|
|
126
|
-
for await (const event of turn.handle) {
|
|
127
|
-
if (event.type === 'execution.completed')
|
|
128
|
-
terminal = 'completed';
|
|
129
|
-
else if (event.type === 'execution.failed')
|
|
130
|
-
terminal = 'failed';
|
|
131
|
-
else if (event.type === 'execution.cancelled')
|
|
132
|
-
terminal = 'cancelled';
|
|
133
|
-
if (this.observeEvent(event, nextActivityRevision()))
|
|
134
|
-
onMessage();
|
|
135
|
-
}
|
|
136
|
-
})();
|
|
137
|
-
const [result, stream] = await Promise.allSettled([
|
|
138
|
-
Promise.resolve().then(() => turn.handle.result()),
|
|
139
|
-
consume
|
|
140
|
-
]);
|
|
141
|
-
if (result.status === 'rejected')
|
|
142
|
-
throw result.reason;
|
|
143
|
-
if (stream.status === 'rejected')
|
|
144
|
-
throw stream.reason;
|
|
145
|
-
this.complete(result.value, terminal, turn.handle.persistedEvents === true, previousActivity, previousMessageRevision);
|
|
146
|
-
}
|
|
147
|
-
catch (error) {
|
|
148
|
-
this.fail(error);
|
|
149
|
-
}
|
|
150
|
-
onTerminal();
|
|
151
|
-
return 'settled';
|
|
152
|
-
}
|
|
153
|
-
acknowledgeMessage(revision) {
|
|
154
|
-
this.state.observedMessageRevision = Math.max(this.state.observedMessageRevision, revision);
|
|
155
|
-
}
|
|
156
|
-
acknowledgeTerminal(revision) {
|
|
157
|
-
this.state.observedTerminalRevision = Math.max(this.state.observedTerminalRevision, revision);
|
|
158
|
-
}
|
|
159
|
-
selectModel(model) {
|
|
160
|
-
this.state.modelId = model.id;
|
|
161
|
-
this.state.modelName = model.name;
|
|
162
|
-
if (model.reasoningEffort !== undefined)
|
|
163
|
-
this.state.reasoningEffort = model.reasoningEffort;
|
|
164
|
-
}
|
|
165
|
-
setReceipt(receipt) {
|
|
166
|
-
this.state.receipt = receipt;
|
|
167
|
-
}
|
|
168
|
-
updateDelivery(receipt, status) {
|
|
169
|
-
if (status !== 'applied' && receipt.deliveryStatus !== 'accepted')
|
|
170
|
-
return false;
|
|
171
|
-
receipt.deliveryStatus = status;
|
|
172
|
-
return true;
|
|
173
|
-
}
|
|
174
|
-
requestCancel(expected) {
|
|
175
|
-
const turn = this.state.turn;
|
|
176
|
-
if (turn !== expected)
|
|
177
|
-
return;
|
|
178
|
-
if (turn.handle)
|
|
179
|
-
turn.handle.cancel();
|
|
180
|
-
else
|
|
181
|
-
turn.cancelRequested = true;
|
|
182
|
-
}
|
|
183
|
-
#attachHandle(expected, handle) {
|
|
184
|
-
const turn = this.state.turn;
|
|
185
|
-
if (turn !== expected)
|
|
186
|
-
return;
|
|
187
|
-
turn.handle = handle;
|
|
188
|
-
}
|
|
189
|
-
#cancelPending(expected) {
|
|
190
|
-
const turn = this.state.turn;
|
|
191
|
-
if (turn === expected && turn.cancelRequested)
|
|
192
|
-
turn.handle.cancel();
|
|
193
|
-
}
|
|
194
|
-
#takePendingMessages(expected) {
|
|
195
|
-
const turn = this.state.turn;
|
|
196
|
-
return turn === expected ? turn.pendingMessages.splice(0) : [];
|
|
197
|
-
}
|
|
198
|
-
#settleHandleReady(expected) {
|
|
199
|
-
if (this.state.turn === expected)
|
|
200
|
-
this.state.turn.resolveHandleReady();
|
|
201
|
-
}
|
|
202
|
-
settleQueuedTurn(expected) {
|
|
203
|
-
this.#settleHandleReady(expected);
|
|
204
|
-
this.settleTurn(expected);
|
|
205
|
-
}
|
|
206
|
-
settleTurn(expected) {
|
|
207
|
-
if (this.state.turn === expected)
|
|
208
|
-
this.state.turn.resolve();
|
|
209
|
-
}
|
|
210
|
-
appendMessage(message) {
|
|
211
|
-
this.state.turn.pendingMessages.push(message);
|
|
212
|
-
}
|
|
213
|
-
control(operation) {
|
|
214
|
-
const result = (this.state.controlTail ?? Promise.resolve()).then(operation);
|
|
215
|
-
const tail = result.then(() => undefined, () => undefined);
|
|
216
|
-
this.state.controlTail = tail;
|
|
217
|
-
void tail.then(() => {
|
|
218
|
-
if (this.state.controlTail === tail)
|
|
219
|
-
delete this.state.controlTail;
|
|
220
|
-
});
|
|
221
|
-
return result;
|
|
222
|
-
}
|
|
223
|
-
cancelQueued(publish) {
|
|
224
|
-
this.state.status = 'cancelled';
|
|
225
|
-
if (publish)
|
|
226
|
-
this.state.terminalPending = true;
|
|
227
|
-
}
|
|
228
|
-
queueTurn(input, onComplete) {
|
|
229
|
-
let resolve;
|
|
230
|
-
let resolveHandleReady;
|
|
231
|
-
const completion = new Promise((done) => (resolve = done));
|
|
232
|
-
const handleReady = new Promise((done) => (resolveHandleReady = done));
|
|
233
|
-
const turn = {
|
|
234
|
-
...input,
|
|
235
|
-
handleReady,
|
|
236
|
-
completion,
|
|
237
|
-
resolve: () => {
|
|
238
|
-
onComplete();
|
|
239
|
-
resolve();
|
|
240
|
-
},
|
|
241
|
-
resolveHandleReady
|
|
242
|
-
};
|
|
243
|
-
this.state.status = 'queued';
|
|
244
|
-
this.state.restorable = false;
|
|
245
|
-
delete this.state.summary;
|
|
246
|
-
delete this.state.permissionStop;
|
|
247
|
-
delete this.state.errorCode;
|
|
248
|
-
delete this.state.errorMessage;
|
|
249
|
-
this.state.changedFiles = [];
|
|
250
|
-
this.state.verification = [];
|
|
251
|
-
this.state.evidence = [];
|
|
252
|
-
this.state.terminalPending = false;
|
|
253
|
-
this.state.turn = turn;
|
|
254
|
-
return turn;
|
|
255
|
-
}
|
|
256
|
-
markRunning(expected) {
|
|
257
|
-
if (this.state.turn !== expected || this.state.status !== 'queued')
|
|
258
|
-
return false;
|
|
259
|
-
this.state.status = 'running';
|
|
260
|
-
return true;
|
|
261
|
-
}
|
|
262
|
-
releaseTurn(expected) {
|
|
263
|
-
if (this.state.turn === expected)
|
|
264
|
-
delete this.state.turn;
|
|
265
|
-
}
|
|
266
|
-
observeEvent(event, revision) {
|
|
267
|
-
if (!observeAgentEvent(this.state, event))
|
|
268
|
-
return false;
|
|
269
|
-
this.state.messageRevision++;
|
|
270
|
-
this.state.latestMessageActivityRevision = revision;
|
|
271
|
-
return true;
|
|
272
|
-
}
|
|
273
|
-
complete(result, terminal, persisted, previousActivity, previousRevision) {
|
|
274
|
-
if (result.status === 'completed') {
|
|
275
|
-
this.state.status = 'completed';
|
|
276
|
-
this.state.summary = result.finalAnswer;
|
|
277
|
-
if (result.permissionStop)
|
|
278
|
-
this.state.permissionStop = result.permissionStop;
|
|
279
|
-
else
|
|
280
|
-
delete this.state.permissionStop;
|
|
281
|
-
}
|
|
282
|
-
else if (result.status === 'cancelled')
|
|
283
|
-
this.state.status = 'cancelled';
|
|
284
|
-
else {
|
|
285
|
-
this.state.status = 'failed';
|
|
286
|
-
this.state.errorCode = result.errorCode ?? 'MAR_AGENT_SUBAGENT_FAILED';
|
|
287
|
-
this.state.errorMessage = result.errorMessage ?? 'Subagent execution failed.';
|
|
288
|
-
}
|
|
289
|
-
this.state.restorable =
|
|
290
|
-
persisted &&
|
|
291
|
-
terminal === this.state.status &&
|
|
292
|
-
(previousActivity === undefined || this.state.latestActivity !== previousActivity) &&
|
|
293
|
-
(this.state.latestMessage === undefined || this.state.messageRevision > previousRevision) &&
|
|
294
|
-
(this.state.status !== 'completed' ||
|
|
295
|
-
(this.state.latestMessage?.phase === 'final_answer' &&
|
|
296
|
-
this.state.summary === this.state.latestMessage.text));
|
|
297
|
-
this.state.terminalPending = true;
|
|
298
|
-
}
|
|
299
|
-
fail(error) {
|
|
300
|
-
const diagnostic = describeAgentError(error, 'MAR_AGENT_SUBAGENT_FAILED');
|
|
301
|
-
this.state.status = 'failed';
|
|
302
|
-
this.state.restorable = false;
|
|
303
|
-
this.state.errorCode = diagnostic.code;
|
|
304
|
-
this.state.errorMessage = diagnostic.message;
|
|
305
|
-
this.state.terminalPending = true;
|
|
306
|
-
}
|
|
307
|
-
touch(revision, terminal = false) {
|
|
308
|
-
this.state.resourceRevision = revision;
|
|
309
|
-
if (terminal)
|
|
310
|
-
this.state.terminalRevision = revision;
|
|
311
|
-
}
|
|
312
|
-
terminalPublished(revision) {
|
|
313
|
-
if (this.state.terminalRevision === revision)
|
|
314
|
-
this.state.terminalPending = false;
|
|
315
|
-
}
|
|
316
|
-
evictDetails() {
|
|
317
|
-
for (const key of DETAIL_FIELDS)
|
|
318
|
-
delete this.state[key];
|
|
319
|
-
this.state.changedFiles = [];
|
|
320
|
-
this.state.verification = [];
|
|
321
|
-
this.state.evidence = [];
|
|
322
|
-
this.state.detailsEvicted = true;
|
|
323
|
-
}
|
|
324
|
-
restoreDetails(restored) {
|
|
325
|
-
for (const key of DETAIL_FIELDS) {
|
|
326
|
-
if (key in restored)
|
|
327
|
-
Object.assign(this.state, { [key]: restored[key] });
|
|
328
|
-
else
|
|
329
|
-
delete this.state[key];
|
|
330
|
-
}
|
|
331
|
-
delete this.state.detailsEvicted;
|
|
332
|
-
}
|
|
333
|
-
copyWaitState() {
|
|
334
|
-
return {
|
|
335
|
-
...this.state,
|
|
336
|
-
changedFiles: [...this.state.changedFiles],
|
|
337
|
-
verification: [...this.state.verification],
|
|
338
|
-
evidence: this.state.evidence.map((item) => ({ ...item }))
|
|
339
|
-
};
|
|
340
|
-
}
|
|
341
|
-
}
|
|
342
|
-
const DETAIL_FIELDS = [
|
|
343
|
-
'latestMessage',
|
|
344
|
-
'latestActivity',
|
|
345
|
-
'summary',
|
|
346
|
-
'changedFiles',
|
|
347
|
-
'verification',
|
|
348
|
-
'evidence',
|
|
349
|
-
'permissionStop',
|
|
350
|
-
'errorMessage'
|
|
351
|
-
];
|
|
352
|
-
export function observeAgentEvent(state, event) {
|
|
353
|
-
if (event.type === 'message.completed') {
|
|
354
|
-
state.latestMessage = latestMessageFromEvent(event);
|
|
355
|
-
state.latestActivity = {
|
|
356
|
-
kind: 'message',
|
|
357
|
-
timestamp: event.timestamp,
|
|
358
|
-
phase: event.phase
|
|
359
|
-
};
|
|
360
|
-
return true;
|
|
361
|
-
}
|
|
362
|
-
if (event.type === 'tool.started') {
|
|
363
|
-
state.latestActivity = {
|
|
364
|
-
kind: 'tool',
|
|
365
|
-
timestamp: event.timestamp,
|
|
366
|
-
toolName: event.toolName,
|
|
367
|
-
status: 'started'
|
|
368
|
-
};
|
|
369
|
-
return false;
|
|
370
|
-
}
|
|
371
|
-
if (event.type === 'tool.failed') {
|
|
372
|
-
state.latestActivity = {
|
|
373
|
-
kind: 'tool',
|
|
374
|
-
timestamp: event.timestamp,
|
|
375
|
-
toolName: event.toolName,
|
|
376
|
-
status: 'failed'
|
|
377
|
-
};
|
|
378
|
-
return false;
|
|
379
|
-
}
|
|
380
|
-
if (event.type !== 'tool.completed')
|
|
381
|
-
return false;
|
|
382
|
-
state.latestActivity = {
|
|
383
|
-
kind: 'tool',
|
|
384
|
-
timestamp: event.timestamp,
|
|
385
|
-
toolName: event.toolName,
|
|
386
|
-
status: 'completed'
|
|
387
|
-
};
|
|
388
|
-
if (event.toolName === 'apply_patch' && isRecord(event.data)) {
|
|
389
|
-
const data = event.data;
|
|
390
|
-
const files = Array.isArray(data.files) ? data.files : [];
|
|
391
|
-
for (const file of files) {
|
|
392
|
-
if (!isRecord(file))
|
|
393
|
-
continue;
|
|
394
|
-
for (const path of [file.path, file.targetPath])
|
|
395
|
-
if (typeof path === 'string' && path.length > 0 && !state.changedFiles.includes(path))
|
|
396
|
-
state.changedFiles.push(path);
|
|
397
|
-
}
|
|
398
|
-
}
|
|
399
|
-
else if (event.toolName === 'read' && isRecord(event.data)) {
|
|
400
|
-
const data = event.data;
|
|
401
|
-
const results = Array.isArray(data.results) ? data.results : [];
|
|
402
|
-
for (const result of results) {
|
|
403
|
-
if (!isRecord(result) || typeof result.path !== 'string' || result.error !== undefined)
|
|
404
|
-
continue;
|
|
405
|
-
const evidence = {
|
|
406
|
-
path: result.path,
|
|
407
|
-
...(isPositiveInteger(result.startLine) ? { startLine: result.startLine } : {}),
|
|
408
|
-
...(isPositiveInteger(result.endLine) ? { endLine: result.endLine } : {})
|
|
409
|
-
};
|
|
410
|
-
if (!state.evidence.some((item) => item.path === evidence.path &&
|
|
411
|
-
item.startLine === evidence.startLine &&
|
|
412
|
-
item.endLine === evidence.endLine))
|
|
413
|
-
state.evidence.push(evidence);
|
|
414
|
-
}
|
|
415
|
-
}
|
|
416
|
-
else if (event.toolName === 'exec')
|
|
417
|
-
state.verification.push(event.summary);
|
|
418
|
-
return false;
|
|
419
|
-
}
|
|
420
|
-
function latestMessageFromEvent(event) {
|
|
421
|
-
const text = event.text;
|
|
422
|
-
return {
|
|
423
|
-
itemId: event.itemId,
|
|
424
|
-
turnId: event.turnId ?? '',
|
|
425
|
-
phase: event.phase,
|
|
426
|
-
text,
|
|
427
|
-
timestamp: event.timestamp,
|
|
428
|
-
truncated: text !== event.text
|
|
429
|
-
};
|
|
430
|
-
}
|
|
431
|
-
function isRecord(value) {
|
|
432
|
-
return value !== null && typeof value === 'object' && !Array.isArray(value);
|
|
433
|
-
}
|
|
434
|
-
function isPositiveInteger(value) {
|
|
435
|
-
return typeof value === 'number' && Number.isInteger(value) && value >= 1;
|
|
436
|
-
}
|
|
@@ -1,64 +0,0 @@
|
|
|
1
|
-
import type { AgentReasoningEffort } from '../model/configuration.js';
|
|
2
|
-
import type { ExecutionResult } from '../runtime/contracts.js';
|
|
3
|
-
import type { AgentEvent } from '../runtime/events.js';
|
|
4
|
-
import type { SubagentTaskInput, SubagentTaskSnapshot } from './contracts.js';
|
|
5
|
-
export interface SubagentModelOption {
|
|
6
|
-
readonly id: string;
|
|
7
|
-
readonly name: string;
|
|
8
|
-
readonly conversationModel?: boolean;
|
|
9
|
-
readonly reasoningEfforts: readonly AgentReasoningEffort[];
|
|
10
|
-
readonly defaultReasoningEffort: AgentReasoningEffort;
|
|
11
|
-
}
|
|
12
|
-
export interface SubagentTurnHandle extends AsyncIterable<AgentEvent> {
|
|
13
|
-
readonly executionId: string;
|
|
14
|
-
readonly turnId: string;
|
|
15
|
-
/** True only after the child terminal event was durably appended. */
|
|
16
|
-
readonly persistedEvents?: boolean;
|
|
17
|
-
result(): Promise<ExecutionResult>;
|
|
18
|
-
cancel(): void;
|
|
19
|
-
enqueueMessage(message: string, delivery?: SubagentMessageDelivery): boolean;
|
|
20
|
-
}
|
|
21
|
-
/** Caller-owned correlation is opaque to Subagent; the adapter restores it at delivery. */
|
|
22
|
-
export interface SubagentOrigin {
|
|
23
|
-
readonly signal: AbortSignal;
|
|
24
|
-
readonly correlation: unknown;
|
|
25
|
-
}
|
|
26
|
-
export interface SubagentMessageDelivery {
|
|
27
|
-
readonly messageId: string;
|
|
28
|
-
readonly origin?: SubagentOrigin;
|
|
29
|
-
readonly signal?: AbortSignal;
|
|
30
|
-
applied(): void;
|
|
31
|
-
settled?(status: 'cancelled' | 'failed'): void;
|
|
32
|
-
}
|
|
33
|
-
export interface SubagentMailboxMessage {
|
|
34
|
-
readonly text: string;
|
|
35
|
-
readonly delivery?: SubagentMessageDelivery;
|
|
36
|
-
}
|
|
37
|
-
export interface SubagentParentExecution {
|
|
38
|
-
readonly executionId: string;
|
|
39
|
-
readonly modelId: string;
|
|
40
|
-
readonly reasoningEffort: AgentReasoningEffort;
|
|
41
|
-
readonly models: ReadonlyMap<string, SubagentModelOption>;
|
|
42
|
-
emitTerminal(snapshot: SubagentTaskSnapshot): Promise<void>;
|
|
43
|
-
startTurn(input: {
|
|
44
|
-
readonly sessionId: string;
|
|
45
|
-
readonly prompt: string;
|
|
46
|
-
readonly modelId: string;
|
|
47
|
-
readonly reasoningEffort: AgentReasoningEffort;
|
|
48
|
-
readonly role: SubagentTaskInput['role'];
|
|
49
|
-
readonly initialMailbox: readonly SubagentMailboxMessage[];
|
|
50
|
-
readonly turnId: string;
|
|
51
|
-
readonly delivery?: SubagentMessageDelivery;
|
|
52
|
-
readonly origin?: SubagentOrigin;
|
|
53
|
-
}): Promise<SubagentTurnHandle>;
|
|
54
|
-
}
|
|
55
|
-
/** A native operation has its own provenance even when no parent Execution is active. */
|
|
56
|
-
export interface SubagentParentOperation extends Omit<SubagentParentExecution, 'executionId'> {
|
|
57
|
-
readonly operationId: string;
|
|
58
|
-
readonly executionId?: string;
|
|
59
|
-
readonly ownerInstanceId?: string;
|
|
60
|
-
readonly extensionId?: string;
|
|
61
|
-
readonly signal: AbortSignal;
|
|
62
|
-
readonly origin?: SubagentOrigin;
|
|
63
|
-
}
|
|
64
|
-
export type SubagentParentContext = SubagentParentExecution | SubagentParentOperation;
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
import type { SubagentWaitMode } from './contracts.js';
|
|
2
|
-
/** Validate the entire target set before any observation can be consumed. */
|
|
3
|
-
export declare function parseAgentWaitTargets(input: {
|
|
4
|
-
agentId?: unknown;
|
|
5
|
-
agentIds?: unknown;
|
|
6
|
-
mode?: unknown;
|
|
7
|
-
}, maxAgents?: number): {
|
|
8
|
-
agentIds?: string[];
|
|
9
|
-
mode?: SubagentWaitMode;
|
|
10
|
-
};
|
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
import { AgentError } from '../error.js';
|
|
2
|
-
/** Validate the entire target set before any observation can be consumed. */
|
|
3
|
-
export function parseAgentWaitTargets(input, maxAgents = Infinity) {
|
|
4
|
-
if (input.agentIds === undefined || input.agentIds === null) {
|
|
5
|
-
if (input.mode !== undefined && input.mode !== null)
|
|
6
|
-
invalid();
|
|
7
|
-
return {};
|
|
8
|
-
}
|
|
9
|
-
if ((input.agentId !== undefined && input.agentId !== null) ||
|
|
10
|
-
!Array.isArray(input.agentIds) ||
|
|
11
|
-
input.agentIds.length === 0 ||
|
|
12
|
-
input.agentIds.length > maxAgents ||
|
|
13
|
-
input.agentIds.some((id) => typeof id !== 'string' || !id.trim()) ||
|
|
14
|
-
(input.mode !== undefined &&
|
|
15
|
-
input.mode !== null &&
|
|
16
|
-
input.mode !== 'any' &&
|
|
17
|
-
input.mode !== 'all'))
|
|
18
|
-
invalid();
|
|
19
|
-
const agentIds = input.agentIds.map((id) => id.trim());
|
|
20
|
-
if (new Set(agentIds).size !== agentIds.length)
|
|
21
|
-
invalid();
|
|
22
|
-
return { agentIds, mode: input.mode === 'all' ? 'all' : 'any' };
|
|
23
|
-
}
|
|
24
|
-
function invalid() {
|
|
25
|
-
throw new AgentError('MAR_AGENT_TOOL_INPUT_INVALID', 'Agent wait targets are invalid.');
|
|
26
|
-
}
|