@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.
Files changed (161) hide show
  1. package/dist/cli/catalog-file.d.ts +2 -0
  2. package/dist/cli/main.js +11 -4
  3. package/dist/cli/subagent/control.d.ts +56 -0
  4. package/dist/cli/subagent/control.js +219 -0
  5. package/dist/cli/subagent/history.d.ts +17 -0
  6. package/dist/cli/subagent/history.js +85 -0
  7. package/dist/cli/subagent/index.d.ts +10 -0
  8. package/dist/cli/subagent/index.js +94 -0
  9. package/dist/cli/subagent/native.d.ts +91 -0
  10. package/dist/cli/subagent/native.js +359 -0
  11. package/dist/cli/subagent/observations.d.ts +57 -0
  12. package/dist/cli/subagent/observations.js +351 -0
  13. package/dist/cli/subagent/query.d.ts +4 -0
  14. package/dist/cli/subagent/query.js +114 -0
  15. package/dist/cli/subagent/resources.d.ts +3 -0
  16. package/dist/cli/subagent/resources.js +112 -0
  17. package/dist/cli/subagent/snapshot.d.ts +77 -0
  18. package/dist/cli/subagent/snapshot.js +127 -0
  19. package/dist/cli/subagent/start.d.ts +24 -0
  20. package/dist/cli/subagent/start.js +201 -0
  21. package/dist/cli/subagent/wait-output.d.ts +19 -0
  22. package/dist/cli/subagent/wait-output.js +56 -0
  23. package/dist/cli/subagent/wait.d.ts +175 -0
  24. package/dist/cli/subagent/wait.js +453 -0
  25. package/dist/extensions/contracts.d.ts +2 -5
  26. package/dist/extensions/manager.d.ts +0 -2
  27. package/dist/extensions/manager.js +1 -2
  28. package/dist/extensions/models.d.ts +3 -0
  29. package/dist/extensions/operation.d.ts +8 -0
  30. package/dist/extensions/operation.js +3 -0
  31. package/dist/extensions/services.d.ts +9 -1
  32. package/dist/extensions/services.js +26 -3
  33. package/dist/extensions/session-context.d.ts +18 -0
  34. package/dist/extensions/session-context.js +4 -0
  35. package/dist/extensions/session-input.d.ts +2 -2
  36. package/dist/extensions/session-input.js +3 -4
  37. package/dist/extensions/session-messages.d.ts +1 -1
  38. package/dist/extensions/session-tools.js +20 -3
  39. package/dist/extensions/session.d.ts +1 -4
  40. package/dist/extensions/session.js +2 -16
  41. package/dist/extensions/tools.js +21 -3
  42. package/dist/extensions.d.ts +5 -2
  43. package/dist/extensions.js +2 -1
  44. package/dist/host/local-agent-host.d.ts +2 -2
  45. package/dist/host/local-exec-tool.d.ts +1 -1
  46. package/dist/host/local-exec-tool.js +28 -3
  47. package/dist/host/local-tool-registry.d.ts +2 -2
  48. package/dist/index.d.ts +2 -2
  49. package/dist/model/configuration.d.ts +3 -1
  50. package/dist/model/configuration.js +1 -0
  51. package/dist/model/openai-responses.js +5 -0
  52. package/dist/model/responses-request.js +9 -0
  53. package/dist/prompts/index.js +1 -3
  54. package/dist/prompts/resources.d.ts +1 -5
  55. package/dist/prompts/resources.js +3 -12
  56. package/dist/prompts/subagent.d.ts +1 -1
  57. package/dist/prompts/subagent.js +1 -1
  58. package/dist/runtime/context/gc-candidates-web.d.ts +6 -0
  59. package/dist/runtime/context/gc-candidates-web.js +53 -1
  60. package/dist/runtime/context/gc-candidates.js +1 -9
  61. package/dist/runtime/context/gc.js +19 -11
  62. package/dist/runtime/context/projection.js +1 -0
  63. package/dist/runtime/events.d.ts +4 -3
  64. package/dist/runtime/execution-handle.d.ts +2 -0
  65. package/dist/runtime/wait.js +12 -2
  66. package/dist/sdk/agent.js +94 -5
  67. package/dist/sdk/execution-context-coordinator.d.ts +2 -3
  68. package/dist/sdk/execution-context-coordinator.js +3 -3
  69. package/dist/sdk/execution-input.d.ts +3 -4
  70. package/dist/sdk/execution-input.js +31 -25
  71. package/dist/sdk/execution-round-preparation.d.ts +1 -1
  72. package/dist/sdk/execution-round-preparation.js +4 -4
  73. package/dist/sdk/execution-tool-catalog.js +2 -10
  74. package/dist/sdk/execution-tool-scope.d.ts +1 -3
  75. package/dist/sdk/execution-tool-scope.js +10 -12
  76. package/dist/sdk/extension-models.js +3 -0
  77. package/dist/sdk/extension-session-launch.d.ts +3 -2
  78. package/dist/sdk/extension-session-launch.js +2 -3
  79. package/dist/sdk/extension-tools.js +0 -2
  80. package/dist/sdk/native-steer.d.ts +2 -2
  81. package/dist/sdk/native-steer.js +2 -2
  82. package/dist/sdk/session-composition.d.ts +2 -17
  83. package/dist/sdk/session-execution-factory.d.ts +2 -3
  84. package/dist/sdk/session-execution-factory.js +20 -114
  85. package/dist/sdk/session-execution.d.ts +13 -7
  86. package/dist/sdk/session-execution.js +11 -3
  87. package/dist/sdk/session-extension-messages.d.ts +1 -3
  88. package/dist/sdk/session-extension-messages.js +14 -9
  89. package/dist/sdk/session-extension-prompt.js +1 -3
  90. package/dist/sdk/session-maintenance.d.ts +1 -0
  91. package/dist/sdk/session-maintenance.js +16 -7
  92. package/dist/sdk/session-open.d.ts +2 -3
  93. package/dist/sdk/session-open.js +5 -24
  94. package/dist/sdk/session-runtime.d.ts +19 -8
  95. package/dist/sdk/session-runtime.js +36 -30
  96. package/dist/sdk/session.d.ts +3 -2
  97. package/dist/sdk/session.js +22 -89
  98. package/dist/sdk/types.d.ts +36 -0
  99. package/dist/session/catalog.d.ts +22 -1
  100. package/dist/session/catalog.js +102 -0
  101. package/dist/session/context-gc-checkpoint.js +30 -1
  102. package/dist/session/context-gc-contract.d.ts +7 -0
  103. package/dist/session/context-gc-replacements.d.ts +3 -0
  104. package/dist/session/context-gc-replacements.js +26 -0
  105. package/dist/session/store/contracts.d.ts +2 -2
  106. package/dist/session/store/jsonl/directory-index.d.ts +1 -1
  107. package/dist/session/store/jsonl/directory-index.js +18 -17
  108. package/dist/session/store/jsonl/history.js +1 -1
  109. package/dist/session/store/jsonl/index-transaction.js +2 -8
  110. package/dist/session/store/jsonl/jsonl-store.d.ts +1 -1
  111. package/dist/session/store/jsonl/jsonl-store.js +24 -9
  112. package/dist/session/types.d.ts +1 -0
  113. package/dist/tools/agent/sleep.js +1 -1
  114. package/dist/tools/callers.js +1 -12
  115. package/dist/tools/code-mode/dispatch.js +5 -2
  116. package/dist/tools/code-mode/index.d.ts +1 -1
  117. package/dist/tools/code-mode/index.js +2 -0
  118. package/dist/tools/contracts.d.ts +20 -0
  119. package/dist/tools/execution-limits.d.ts +5 -20
  120. package/dist/tools/execution-limits.js +0 -2
  121. package/dist/tools/execution.js +16 -4
  122. package/dist/tools/local/exec.js +8 -2
  123. package/dist/tools/output-projection.d.ts +5 -2
  124. package/dist/tools/output-projection.js +133 -92
  125. package/dist/tools/registry.js +1 -13
  126. package/dist/tools/runtime-context.d.ts +1 -21
  127. package/package.json +2 -2
  128. package/dist/extensions/agents.d.ts +0 -100
  129. package/dist/extensions/agents.js +0 -121
  130. package/dist/runtime/context/gc-candidates-subagent.d.ts +0 -6
  131. package/dist/runtime/context/gc-candidates-subagent.js +0 -100
  132. package/dist/sdk/extension-agent-controller.d.ts +0 -3
  133. package/dist/sdk/extension-agent-controller.js +0 -69
  134. package/dist/sdk/extension-agents.d.ts +0 -9
  135. package/dist/sdk/extension-agents.js +0 -58
  136. package/dist/sdk/subagent-backend.d.ts +0 -3
  137. package/dist/sdk/subagent-backend.js +0 -49
  138. package/dist/subagent/contracts.d.ts +0 -107
  139. package/dist/subagent/contracts.js +0 -1
  140. package/dist/subagent/limits.d.ts +0 -17
  141. package/dist/subagent/limits.js +0 -17
  142. package/dist/subagent/model-update.d.ts +0 -2
  143. package/dist/subagent/model-update.js +0 -81
  144. package/dist/subagent/session-controller.d.ts +0 -87
  145. package/dist/subagent/session-controller.js +0 -1343
  146. package/dist/subagent/task.d.ts +0 -134
  147. package/dist/subagent/task.js +0 -436
  148. package/dist/subagent/turn-contracts.d.ts +0 -64
  149. package/dist/subagent/turn-contracts.js +0 -1
  150. package/dist/subagent/wait-targets.d.ts +0 -10
  151. package/dist/subagent/wait-targets.js +0 -26
  152. package/dist/subagent/wait.d.ts +0 -26
  153. package/dist/subagent/wait.js +0 -73
  154. package/dist/tools/agent/agent-cancel.d.ts +0 -7
  155. package/dist/tools/agent/agent-cancel.js +0 -29
  156. package/dist/tools/agent/agent-message.d.ts +0 -7
  157. package/dist/tools/agent/agent-message.js +0 -57
  158. package/dist/tools/agent/agent-start.d.ts +0 -12
  159. package/dist/tools/agent/agent-start.js +0 -106
  160. package/dist/tools/agent/agent-wait.d.ts +0 -7
  161. package/dist/tools/agent/agent-wait.js +0 -91
@@ -1,100 +0,0 @@
1
- import type { AgentReasoningEffort } from '../model/configuration.js';
2
- import type { SubagentTaskSnapshot, SubagentManyOutput, SubagentHandledResult } from '../subagent/contracts.js';
3
- import type { ExtensionOperationContext } from './operation.js';
4
- import type { ExtensionResourceScope } from './resources.js';
5
- import type { ExtensionHooks } from './hooks.js';
6
- import type { ExtensionCapabilitySnapshot } from './capabilities.js';
7
- export type ExtensionAgentSnapshot = Readonly<SubagentTaskSnapshot>;
8
- export type ExtensionAgentManySnapshot = Readonly<SubagentManyOutput>;
9
- export type ExtensionAgentWaitResult = ExtensionAgentSnapshot | ExtensionAgentManySnapshot;
10
- export type ExtensionAgentHandledResult = SubagentHandledResult;
11
- export type ExtensionAgentSpawnResult = ExtensionAgentSnapshot | ExtensionAgentHandledResult;
12
- export declare function isHandledAgentResult(value: ExtensionAgentSpawnResult | ExtensionAgentManySnapshot): value is ExtensionAgentHandledResult;
13
- export interface ExtensionAgentSpawnInput {
14
- readonly turnSignal?: AbortSignal;
15
- readonly waitFor?: 'start' | 'completion';
16
- readonly background?: boolean;
17
- readonly prompt: string;
18
- readonly description?: string;
19
- readonly modelId?: string;
20
- readonly reasoningEffort?: AgentReasoningEffort;
21
- readonly role?: 'general-purpose' | 'explore';
22
- readonly signal?: AbortSignal;
23
- }
24
- export interface ExtensionAgentTarget {
25
- readonly agentId: string;
26
- readonly signal?: AbortSignal;
27
- }
28
- export interface ExtensionAgentWaitInput {
29
- readonly untilSettled?: true;
30
- readonly agentId?: string;
31
- readonly agentIds?: readonly string[];
32
- readonly mode?: 'any' | 'all';
33
- readonly signal?: AbortSignal;
34
- readonly waitMs?: number;
35
- readonly waitFor?: 'completion' | 'message';
36
- }
37
- export interface ExtensionAgentMessageInput extends ExtensionAgentTarget {
38
- readonly message: string;
39
- readonly delivery?: 'append' | 'replace';
40
- }
41
- export interface ExtensionAgentsBackend {
42
- own(ownerInstanceId: string): () => Promise<void>;
43
- spawn(input: ExtensionAgentSpawnInput, call: ExtensionOperationContext): Promise<ExtensionAgentSnapshot>;
44
- list(call: ExtensionOperationContext): Promise<readonly ExtensionAgentSnapshot[]>;
45
- inspect(input: ExtensionAgentTarget, call: ExtensionOperationContext): Promise<ExtensionAgentSnapshot>;
46
- wait(input: ExtensionAgentWaitInput, call: ExtensionOperationContext): Promise<ExtensionAgentWaitResult>;
47
- message(input: ExtensionAgentMessageInput, call: ExtensionOperationContext): Promise<ExtensionAgentSnapshot>;
48
- cancel(input: ExtensionAgentTarget, call: ExtensionOperationContext): Promise<ExtensionAgentSnapshot>;
49
- }
50
- export interface ExtensionAgentsApi {
51
- spawn(input: ExtensionAgentSpawnInput): Promise<ExtensionAgentSpawnResult>;
52
- list(input?: {
53
- readonly signal?: AbortSignal;
54
- }): Promise<readonly ExtensionAgentSnapshot[]>;
55
- inspect(input: ExtensionAgentTarget): Promise<ExtensionAgentSnapshot>;
56
- wait(input: ExtensionAgentWaitInput & {
57
- readonly agentIds: readonly string[];
58
- }): Promise<ExtensionAgentManySnapshot>;
59
- wait(input: ExtensionAgentWaitInput & {
60
- readonly agentIds?: undefined;
61
- }): Promise<ExtensionAgentSnapshot>;
62
- wait(input: ExtensionAgentWaitInput): Promise<ExtensionAgentWaitResult>;
63
- message(input: ExtensionAgentMessageInput): Promise<ExtensionAgentSnapshot>;
64
- cancel(input: ExtensionAgentTarget): Promise<ExtensionAgentSnapshot>;
65
- }
66
- export interface ExtensionAgentCompletion {
67
- readonly operation: 'spawn' | 'wait' | 'message' | 'cancel';
68
- readonly agentId: string;
69
- readonly status: SubagentTaskSnapshot['status'];
70
- readonly deliveryStatus?: SubagentTaskSnapshot['deliveryStatus'];
71
- }
72
- type AgentOperation = 'agent.spawn' | 'agent.wait' | 'agent.message' | 'agent.cancel';
73
- export type ExtensionAgentAction = <Key extends AgentOperation>(key: Key, input: DomainAgentOperations[Key]['input'], leaf: (input: DomainAgentOperations[Key]['input'], call: ExtensionOperationContext) => Promise<DomainAgentOperations[Key]['output']>) => Promise<DomainAgentOperations[Key]['output']>;
74
- /** All callers share one interception and authoritative leaf-completion boundary. */
75
- export declare function invokeCoreAgentOperation<Key extends AgentOperation>(hooks: Pick<ExtensionHooks<DomainAgentOperations, DomainAgentFacts>, 'invoke' | 'emit'>, key: Key, input: DomainAgentOperations[Key]['input'], call: ExtensionOperationContext, leaf: (input: DomainAgentOperations[Key]['input'], call: ExtensionOperationContext) => Promise<DomainAgentOperations[Key]['output']>): Promise<DomainAgentOperations[Key]['output']>;
76
- export declare function resolveAgentSpawn(input: ExtensionAgentSpawnInput): ExtensionAgentSpawnInput;
77
- export declare function agentCapabilities(capabilities: ExtensionCapabilitySnapshot, available: boolean): ExtensionCapabilitySnapshot;
78
- export declare function bindCoreAgents(backend: ExtensionAgentsBackend, scope: ExtensionResourceScope, run: <Value>(operation: (call: ExtensionOperationContext) => Promise<Value>, signal?: AbortSignal) => Promise<Value>, hooks: Pick<ExtensionHooks<DomainAgentOperations, DomainAgentFacts>, 'invoke' | 'emit'>): ExtensionAgentsApi;
79
- export interface DomainAgentOperations {
80
- 'agent.spawn': {
81
- input: ExtensionAgentSpawnInput;
82
- output: ExtensionAgentSpawnResult;
83
- };
84
- 'agent.wait': {
85
- input: ExtensionAgentWaitInput;
86
- output: ExtensionAgentWaitResult;
87
- };
88
- 'agent.message': {
89
- input: ExtensionAgentMessageInput;
90
- output: ExtensionAgentSnapshot;
91
- };
92
- 'agent.cancel': {
93
- input: ExtensionAgentTarget;
94
- output: ExtensionAgentSnapshot;
95
- };
96
- }
97
- export interface DomainAgentFacts {
98
- 'agent.completed': ExtensionAgentCompletion;
99
- }
100
- export {};
@@ -1,121 +0,0 @@
1
- import { AgentError } from '../error.js';
2
- import { parseAgentWaitTargets } from '../subagent/wait-targets.js';
3
- export function isHandledAgentResult(value) {
4
- return 'outcome' in value && value.outcome === 'handled' && !Object.hasOwn(value, 'agentId');
5
- }
6
- /** All callers share one interception and authoritative leaf-completion boundary. */
7
- export function invokeCoreAgentOperation(hooks, key, input, call, leaf) {
8
- return hooks.invoke(key, input, call, async (input, effective) => {
9
- const result = structuredClone(await leaf(input, effective));
10
- if (isHandledAgentResult(result))
11
- return result;
12
- const agents = Array.isArray(result.agents)
13
- ? result.agents
14
- : [result];
15
- for (const agent of agents)
16
- await hooks.emit('agent.completed', {
17
- operation: key.slice('agent.'.length),
18
- agentId: agent.agentId,
19
- status: agent.status,
20
- ...(agent.deliveryStatus === undefined ? {} : { deliveryStatus: agent.deliveryStatus })
21
- }, effective);
22
- return result;
23
- });
24
- }
25
- export function resolveAgentSpawn(input) {
26
- if (!input ||
27
- typeof input !== 'object' ||
28
- Array.isArray(input) ||
29
- typeof input.prompt !== 'string' ||
30
- !input.prompt.trim() ||
31
- (input.turnSignal !== undefined && !(input.turnSignal instanceof AbortSignal)) ||
32
- (input.description !== undefined &&
33
- (typeof input.description !== 'string' || !input.description.trim())) ||
34
- (input.modelId !== undefined && (typeof input.modelId !== 'string' || !input.modelId)) ||
35
- (input.role !== undefined && input.role !== 'general-purpose' && input.role !== 'explore') ||
36
- (input.background !== undefined && typeof input.background !== 'boolean') ||
37
- (input.waitFor !== undefined && input.waitFor !== 'start' && input.waitFor !== 'completion') ||
38
- (input.reasoningEffort !== undefined &&
39
- !['low', 'medium', 'high', 'xhigh', 'max', 'ultra'].includes(input.reasoningEffort)))
40
- throw invalid('Agent spawn input is invalid.');
41
- return {
42
- prompt: input.prompt,
43
- ...(input.turnSignal === undefined ? {} : { turnSignal: input.turnSignal }),
44
- ...(input.waitFor === undefined ? {} : { waitFor: input.waitFor }),
45
- ...(input.background === undefined ? {} : { background: input.background }),
46
- description: input.description ?? 'Extension agent',
47
- ...(input.signal === undefined ? {} : { signal: input.signal }),
48
- ...(input.modelId === undefined ? {} : { modelId: input.modelId }),
49
- ...(input.reasoningEffort === undefined ? {} : { reasoningEffort: input.reasoningEffort }),
50
- role: input.role ?? 'general-purpose'
51
- };
52
- }
53
- export function agentCapabilities(capabilities, available) {
54
- const values = Object.freeze(capabilities.list().filter((id) => id !== 'agents' || available));
55
- return Object.freeze({ has: (id) => values.includes(id), list: () => values });
56
- }
57
- export function bindCoreAgents(backend, scope, run, hooks) {
58
- scope.effect(() => backend.own(scope.instanceId));
59
- const invoke = (key, input) => run((call) => invokeCoreAgentOperation(hooks, key, input, call, async (effectiveInput, effective) => {
60
- let result;
61
- switch (key) {
62
- case 'agent.spawn':
63
- result = await backend.spawn({
64
- ...resolveAgentSpawn(effectiveInput),
65
- ...(effectiveInput.turnSignal === undefined
66
- ? {}
67
- : {
68
- turnSignal: AbortSignal.any([
69
- scope.signal,
70
- effectiveInput.turnSignal
71
- ])
72
- })
73
- }, effective);
74
- break;
75
- case 'agent.wait':
76
- result = await backend.wait(effectiveInput, effective);
77
- break;
78
- case 'agent.message':
79
- result = await backend.message(effectiveInput, effective);
80
- break;
81
- case 'agent.cancel':
82
- result = await backend.cancel(effectiveInput, effective);
83
- break;
84
- }
85
- return result;
86
- }), input.signal);
87
- const target = (input) => {
88
- if (!input ||
89
- typeof input !== 'object' ||
90
- Array.isArray(input) ||
91
- typeof input.agentId !== 'string' ||
92
- !input.agentId)
93
- throw invalid('Agent target is invalid.');
94
- return { ...input };
95
- };
96
- return {
97
- spawn: (input) => invoke('agent.spawn', { ...input }),
98
- list: async (input = {}) => {
99
- if (!input || typeof input !== 'object' || Array.isArray(input))
100
- throw invalid('Agent list input is invalid.');
101
- return run(async (call) => structuredClone(await backend.list(call)), input.signal);
102
- },
103
- inspect: async (input) => {
104
- const copied = target(input);
105
- return run(async (call) => structuredClone(await backend.inspect(copied, call)), copied.signal);
106
- },
107
- wait: (async (input) => {
108
- if (!input || typeof input !== 'object' || Array.isArray(input))
109
- throw invalid('Agent wait input is invalid.');
110
- const selection = parseAgentWaitTargets(input);
111
- return invoke('agent.wait', input.agentId === undefined
112
- ? { ...input, ...selection }
113
- : target(input));
114
- }),
115
- message: async (input) => invoke('agent.message', target(input)),
116
- cancel: async (input) => invoke('agent.cancel', target(input))
117
- };
118
- }
119
- function invalid(message) {
120
- return new AgentError('MAR_AGENT_EXTENSION_AGENT_INPUT_INVALID', message);
121
- }
@@ -1,6 +0,0 @@
1
- import { type ContextGcPlannerInput, type ContextCandidate, type CandidateSavings, type ToolGroup } from './gc-contracts.js';
2
- export declare function collectSubagentCandidates(input: ContextGcPlannerInput, groups: ReadonlyMap<string, ToolGroup>, existingTargets: ReadonlySet<string>, candidateSavings: CandidateSavings): {
3
- eligible: ContextCandidate[];
4
- protectedTokens: number;
5
- retryAfterRollouts: number;
6
- };
@@ -1,100 +0,0 @@
1
- import { contextGcTargetKey } from '../../session/context-gc-checkpoint.js';
2
- import { contextGcSubagentNeedsRetainedPriorFinal, contextGcSubagentOutputReplacement, contextGcSubagentPriorFinalIsRetained, contextGcSubagentSnapshotIsPreciselyCovered, contextGcSubagentSnapshotIsSuperseded, contextGcSubagentSnapshotTurnId, normalizeContextGcSubagentSnapshot } from '../../session/context-gc-subagent.js';
3
- import { CONTEXT_GC_POLICY } from './gc-economics.js';
4
- import { successfulRolloutsAfter, targetFor } from './gc-candidates.js';
5
- export function collectSubagentCandidates(input, groups, existingTargets, candidateSavings) {
6
- const eligible = [];
7
- let protectedTokens = 0;
8
- let retryAfterRollouts = Infinity;
9
- const invocations = [...groups.values()]
10
- .flatMap((group) => {
11
- if (!isContextGcSubagentToolName(group.toolName) ||
12
- !group.call ||
13
- !group.result ||
14
- group.failed ||
15
- !group.completed ||
16
- group.call.message.role !== 'tool_call' ||
17
- group.result.message.role !== 'tool')
18
- return [];
19
- const snapshot = normalizeContextGcSubagentSnapshot(group.result.message.content, group.completed.payload, group.toolName);
20
- const turnId = snapshot && contextGcSubagentSnapshotTurnId(snapshot);
21
- return snapshot && turnId ? [{ group, snapshot, turnId }] : [];
22
- })
23
- .sort((left, right) => left.group.completed.sequence - right.group.completed.sequence);
24
- for (const [index, source] of invocations.entries()) {
25
- if (source.group.evidenceOnly)
26
- continue;
27
- if (source.group.toolName !== 'agent_wait' &&
28
- source.group.toolName !== 'agent_message' &&
29
- source.group.toolName !== 'agent_cancel')
30
- continue;
31
- const sourceTarget = targetFor(source.group.result.record, source.group.result.message);
32
- if (!sourceTarget || existingTargets.has(contextGcTargetKey(sourceTarget)))
33
- continue;
34
- const needsRetainedPriorFinal = contextGcSubagentNeedsRetainedPriorFinal(source.snapshot);
35
- const retainedPriorFinal = needsRetainedPriorFinal
36
- ? invocations
37
- .slice(0, index)
38
- .findLast((candidate) => contextGcSubagentPriorFinalIsRetained(source.snapshot, candidate.snapshot))
39
- : undefined;
40
- if (needsRetainedPriorFinal && retainedPriorFinal === undefined)
41
- continue;
42
- const terminal = invocations
43
- .slice(index + 1)
44
- .find((candidate) => candidate.snapshot.agentId === source.snapshot.agentId &&
45
- candidate.turnId === source.turnId &&
46
- (contextGcSubagentSnapshotIsSuperseded(source.snapshot, candidate.snapshot, retainedPriorFinal?.snapshot) ||
47
- contextGcSubagentSnapshotIsPreciselyCovered(source.snapshot, candidate.snapshot)));
48
- if (!terminal)
49
- continue;
50
- const sourceContent = source.group.result.message.content;
51
- if (typeof sourceContent !== 'string')
52
- continue;
53
- const evidenceSequence = terminal.group.result.record.sequence;
54
- const observedRollouts = successfulRolloutsAfter(input.records, evidenceSequence, input.modelId, input.contextWindowTokens);
55
- const replacement = {
56
- kind: 'SUBAGENT_OUTPUT',
57
- toolName: source.group.toolName,
58
- callId: source.group.callId,
59
- target: sourceTarget,
60
- replacementContent: contextGcSubagentOutputReplacement({
61
- sourceContent,
62
- source: source.snapshot,
63
- terminal: terminal.snapshot
64
- }),
65
- terminalToolName: terminal.group.toolName,
66
- terminalCallId: terminal.group.callId,
67
- evidenceSequence,
68
- ...(retainedPriorFinal === undefined
69
- ? {}
70
- : {
71
- retainedPriorFinal: {
72
- toolName: retainedPriorFinal.group.toolName,
73
- callId: retainedPriorFinal.group.callId,
74
- evidenceSequence: retainedPriorFinal.group.result.record.sequence
75
- }
76
- })
77
- };
78
- const candidate = {
79
- replacements: [replacement],
80
- observedRollouts,
81
- evidenceSequence
82
- };
83
- const reclaimedTokens = candidateSavings(candidate);
84
- if (reclaimedTokens <= 0)
85
- continue;
86
- if (observedRollouts >= CONTEXT_GC_POLICY.stageAProtectionRollouts)
87
- eligible.push(candidate);
88
- else {
89
- protectedTokens += reclaimedTokens;
90
- retryAfterRollouts = Math.min(retryAfterRollouts, CONTEXT_GC_POLICY.stageAProtectionRollouts - observedRollouts);
91
- }
92
- }
93
- return { eligible, protectedTokens, retryAfterRollouts };
94
- }
95
- function isContextGcSubagentToolName(value) {
96
- return (value === 'agent_start' ||
97
- value === 'agent_wait' ||
98
- value === 'agent_message' ||
99
- value === 'agent_cancel');
100
- }
@@ -1,3 +0,0 @@
1
- import type { SubagentController } from '../subagent/contracts.js';
2
- import { type ExtensionAgentAction } from '../extensions/agents.js';
3
- export declare function bindAgentController(controller: SubagentController, action: ExtensionAgentAction): SubagentController;
@@ -1,69 +0,0 @@
1
- import { parseAgentWaitTargets } from '../subagent/wait-targets.js';
2
- import { resolveAgentSpawn } from '../extensions/agents.js';
3
- export function bindAgentController(controller, action) {
4
- const wait = (input, waitInterrupt) => action('agent.wait', input, (target, call) => {
5
- const selection = parseAgentWaitTargets(target);
6
- return selection.agentIds !== undefined
7
- ? controller.outputMany(selection.agentIds, {
8
- ...target,
9
- waitInterrupt,
10
- mode: selection.mode ?? 'any',
11
- signal: call.signal
12
- })
13
- : target.agentId === undefined
14
- ? controller.outputAny({ ...target, waitInterrupt, signal: call.signal })
15
- : controller.output(target.agentId, { ...target, waitInterrupt, signal: call.signal });
16
- });
17
- return {
18
- run: (input, options) => {
19
- return action('agent.spawn', {
20
- ...(options?.waitFor === undefined ? {} : { waitFor: options.waitFor }),
21
- prompt: input.prompt,
22
- description: input.description,
23
- role: input.role,
24
- background: input.background ?? false,
25
- ...(input.modelId === undefined ? {} : { modelId: input.modelId }),
26
- ...(input.reasoningEffort === undefined ? {} : { reasoningEffort: input.reasoningEffort })
27
- }, async (target, call) => {
28
- const task = resolveAgentSpawn(target);
29
- return controller.run({
30
- prompt: task.prompt,
31
- description: task.description ?? input.description,
32
- role: task.role ?? input.role,
33
- background: task.background ?? false,
34
- ...(input.parentSubagentId === undefined
35
- ? {}
36
- : { parentSubagentId: input.parentSubagentId }),
37
- ...(task.modelId === undefined ? {} : { modelId: task.modelId }),
38
- ...(task.reasoningEffort === undefined
39
- ? {}
40
- : { reasoningEffort: task.reasoningEffort })
41
- }, {
42
- ...options,
43
- ...(task.turnSignal === undefined ? {} : { turnSignal: task.turnSignal }),
44
- ...(task.waitFor === undefined ? {} : { waitFor: task.waitFor }),
45
- signal: call.signal
46
- });
47
- });
48
- },
49
- output: (id, options) => {
50
- const { waitInterrupt, ...input } = options ?? {};
51
- return wait({ ...input, agentId: id }, waitInterrupt);
52
- },
53
- outputAny: (options) => {
54
- const { waitInterrupt, ...input } = options ?? {};
55
- return wait(input, waitInterrupt);
56
- },
57
- outputMany: (ids, options) => {
58
- const { waitInterrupt, ...input } = options ?? {};
59
- return wait({ ...input, agentIds: ids }, waitInterrupt);
60
- },
61
- message: (id, message, options) => action('agent.message', { ...options, agentId: id, message }, (target, call) => controller.message(target.agentId, target.message, {
62
- ...(target.delivery === undefined ? {} : { delivery: target.delivery }),
63
- signal: call.signal
64
- })),
65
- cancel: (id) => action('agent.cancel', { agentId: id }, (target) => controller.cancel(target.agentId)),
66
- listSessionResources: () => controller.listSessionResources(),
67
- dispose: () => controller.dispose()
68
- };
69
- }
@@ -1,9 +0,0 @@
1
- import type { ExtensionAgentsBackend } from '../extensions/agents.js';
2
- import type { ExtensionOperationContext } from '../extensions/operation.js';
3
- import type { SubagentParentOperation, SubagentSessionController } from '../subagent/session-controller.js';
4
- /** Uses the Session's sole task controller, including its durable children and queue. */
5
- export declare function createExtensionAgentsBackend(input: {
6
- readonly controller: () => Promise<SubagentSessionController>;
7
- readonly existingController: () => SubagentSessionController | undefined;
8
- readonly parent: (controller: SubagentSessionController, call: ExtensionOperationContext) => SubagentParentOperation;
9
- }): ExtensionAgentsBackend;
@@ -1,58 +0,0 @@
1
- import { AgentError } from '../error.js';
2
- import { parseAgentWaitTargets } from '../subagent/wait-targets.js';
3
- /** Uses the Session's sole task controller, including its durable children and queue. */
4
- export function createExtensionAgentsBackend(input) {
5
- const withController = async (call, run) => {
6
- call.signal.throwIfAborted();
7
- const controller = await input.controller();
8
- call.signal.throwIfAborted();
9
- return controller.withOperation(input.parent(controller, call), () => run(controller));
10
- };
11
- return {
12
- own: (owner) => async () => {
13
- await input.existingController()?.cancelOwned(owner);
14
- },
15
- spawn: (task, call) => withController(call, (controller) => controller.run({
16
- description: task.description ?? 'Extension agent',
17
- prompt: task.prompt,
18
- role: task.role ?? 'general-purpose',
19
- background: task.background ?? true,
20
- ...(task.modelId === undefined ? {} : { modelId: task.modelId }),
21
- ...(task.reasoningEffort === undefined ? {} : { reasoningEffort: task.reasoningEffort })
22
- }, {
23
- signal: call.signal,
24
- ...(task.turnSignal === undefined ? {} : { turnSignal: task.turnSignal }),
25
- ...(task.waitFor === undefined ? {} : { waitFor: task.waitFor }),
26
- onCreated: (created) => {
27
- if (created.status === 'failed')
28
- throw new AgentError(created.errorCode ?? 'MAR_AGENT_SUBAGENT_FAILED', created.errorMessage ?? 'Agent could not start.');
29
- }
30
- })),
31
- list: (call) => withController(call, (controller) => controller.list(call.signal)),
32
- inspect: (target, call) => withController(call, (controller) => controller.inspect(target.agentId)),
33
- wait: (target, call) => withController(call, (controller) => {
34
- const selection = parseAgentWaitTargets(target);
35
- const options = {
36
- waitMs: target.waitMs ?? 30_000,
37
- ...(target.untilSettled === undefined ? {} : { untilSettled: target.untilSettled }),
38
- ...(target.waitFor === undefined ? {} : { waitFor: target.waitFor }),
39
- signal: call.signal
40
- };
41
- if (selection.agentIds !== undefined)
42
- return controller.outputMany(selection.agentIds, {
43
- ...options,
44
- mode: selection.mode ?? 'any'
45
- });
46
- if (target.untilSettled && target.agentId === undefined)
47
- throw new AgentError('MAR_AGENT_TOOL_INPUT_INVALID', 'An unbounded wait requires an agent id.');
48
- return target.agentId === undefined
49
- ? controller.outputAny(options)
50
- : controller.output(target.agentId, options);
51
- }),
52
- message: (target, call) => withController(call, (controller) => controller.message(target.agentId, target.message, {
53
- ...(target.delivery === undefined ? {} : { delivery: target.delivery }),
54
- signal: call.signal
55
- })),
56
- cancel: (target, call) => withController(call, (controller) => controller.cancel(target.agentId))
57
- };
58
- }
@@ -1,3 +0,0 @@
1
- import type { SessionStore } from '../session/store/contracts.js';
2
- import type { SubagentSessionControllerBackend } from '../subagent/session-controller.js';
3
- export declare function createSubagentBackend(store: Pick<SessionStore, 'createSession' | 'delete' | 'listSubagentChildren' | 'getSession' | 'read'>, workspace: string): SubagentSessionControllerBackend;
@@ -1,49 +0,0 @@
1
- import { AgentError } from '../error.js';
2
- export function createSubagentBackend(store, workspace) {
3
- return {
4
- createSession: async (input) => {
5
- const session = await store.createSession({
6
- workspace,
7
- title: input.title,
8
- source: input.source
9
- });
10
- return { id: session.id };
11
- },
12
- deleteSession: async (sessionId) => {
13
- await store.delete(sessionId);
14
- },
15
- listChildren: async (parentSessionId) => {
16
- const sessions = await store.listSubagentChildren(parentSessionId);
17
- return sessions.map((session) => ({
18
- id: session.id,
19
- createdAt: session.createdAt,
20
- lastActivityAt: session.lastActivityAt,
21
- source: session.source
22
- }));
23
- },
24
- loadChild: async (parentSessionId, childSessionId) => {
25
- try {
26
- const session = await store.getSession(childSessionId);
27
- if (session.source.type !== 'subagent' ||
28
- session.source.parentSessionId !== parentSessionId)
29
- return undefined;
30
- return {
31
- id: session.id,
32
- createdAt: session.createdAt,
33
- lastActivityAt: session.lastActivityAt,
34
- source: session.source,
35
- records: await store.read(session.id)
36
- };
37
- }
38
- catch (error) {
39
- if (error instanceof AgentError && error.code === 'MAR_AGENT_SESSION_NOT_FOUND') {
40
- // A history read failure is not proof that the child was deleted.
41
- const children = await store.listSubagentChildren(parentSessionId);
42
- if (!children.some((child) => child.id === childSessionId))
43
- return undefined;
44
- }
45
- throw error;
46
- }
47
- }
48
- };
49
- }
@@ -1,107 +0,0 @@
1
- import type { AgentReasoningEffort } from '../model/configuration.js';
2
- import type { ExecutionResult } from '../runtime/contracts.js';
3
- export interface SubagentTaskInput {
4
- description: string;
5
- prompt: string;
6
- role: 'general-purpose' | 'explore';
7
- modelId?: string;
8
- reasoningEffort?: AgentReasoningEffort;
9
- background?: boolean;
10
- parentSubagentId?: string;
11
- }
12
- export interface SubagentLatestMessage {
13
- itemId: string;
14
- turnId: string;
15
- phase: 'commentary' | 'final_answer';
16
- text: string;
17
- timestamp: string;
18
- truncated: boolean;
19
- }
20
- export type SubagentLatestActivity = {
21
- kind: 'message';
22
- timestamp: string;
23
- phase: 'commentary' | 'final_answer';
24
- } | {
25
- kind: 'tool';
26
- timestamp: string;
27
- toolName: string;
28
- status: 'started' | 'completed' | 'failed';
29
- };
30
- export interface SubagentTaskSnapshot extends Record<string, unknown> {
31
- permissionStop?: ExecutionResult['permissionStop'];
32
- agentId: string;
33
- description: string;
34
- role?: SubagentTaskInput['role'];
35
- extensionId?: string;
36
- status: 'queued' | 'running' | 'completed' | 'failed' | 'cancelled' | 'interrupted';
37
- modelId?: string;
38
- modelName?: string;
39
- reasoningEffort?: AgentReasoningEffort;
40
- latestMessage?: SubagentLatestMessage;
41
- latestActivity?: SubagentLatestActivity;
42
- summary?: string;
43
- changedFiles?: string[];
44
- verification?: string[];
45
- evidence?: Array<{
46
- path: string;
47
- startLine?: number;
48
- endLine?: number;
49
- }>;
50
- errorCode?: string;
51
- errorMessage?: string;
52
- messageId?: string;
53
- turnId?: string;
54
- deliveryStatus?: 'accepted' | 'applied' | 'cancelled' | 'failed';
55
- waitOutcome?: SubagentWaitOutcome;
56
- reason?: 'steer';
57
- }
58
- export type SubagentWaitFor = 'completion' | 'message';
59
- export type SubagentWaitOutcome = Exclude<import('../runtime/wait.js').ToolWaitOutcome, 'yield'>;
60
- export interface SubagentMessageOptions {
61
- delivery?: 'append' | 'replace';
62
- signal?: AbortSignal;
63
- }
64
- export interface SubagentRunOptions {
65
- turnSignal?: AbortSignal;
66
- waitFor?: 'start' | 'completion';
67
- signal?: AbortSignal;
68
- onCreated?: (task: SubagentTaskSnapshot) => Promise<void> | void;
69
- }
70
- export interface SubagentOutputOptions {
71
- waitInterrupt?: import('../runtime/wait.js').ToolWaitInterrupt | undefined;
72
- untilSettled?: true;
73
- waitMs?: number;
74
- waitFor?: SubagentWaitFor;
75
- signal?: AbortSignal;
76
- }
77
- export type SubagentWaitMode = 'any' | 'all';
78
- export interface SubagentManyOutputOptions extends Omit<SubagentOutputOptions, 'untilSettled'> {
79
- mode?: SubagentWaitMode;
80
- }
81
- export interface SubagentManyOutput {
82
- mode: SubagentWaitMode;
83
- waitFor: SubagentWaitFor;
84
- waitOutcome: SubagentWaitOutcome;
85
- reason?: 'steer';
86
- agents: SubagentTaskSnapshot[];
87
- pendingAgentIds: string[];
88
- }
89
- export interface SubagentHandledResult {
90
- readonly outcome: 'handled';
91
- readonly value?: unknown;
92
- }
93
- export type SubagentRunResult = SubagentTaskSnapshot | SubagentHandledResult;
94
- export interface SubagentController {
95
- run(input: SubagentTaskInput, options?: SubagentRunOptions): Promise<SubagentRunResult>;
96
- output(agentId: string, options?: SubagentOutputOptions): Promise<SubagentTaskSnapshot>;
97
- outputAny(options?: SubagentOutputOptions): Promise<SubagentTaskSnapshot>;
98
- outputMany(agentIds: readonly string[], options?: SubagentManyOutputOptions): Promise<SubagentManyOutput>;
99
- message(agentId: string, message: string, options?: SubagentMessageOptions): Promise<SubagentTaskSnapshot>;
100
- cancel(agentId: string): Promise<SubagentTaskSnapshot>;
101
- listSessionResources(): readonly {
102
- agentId: string;
103
- status: SubagentTaskSnapshot['status'];
104
- description: string;
105
- }[];
106
- dispose(): Promise<void>;
107
- }
@@ -1 +0,0 @@
1
- export {};
@@ -1,17 +0,0 @@
1
- export declare const SUBAGENT_LIMITS: Readonly<{
2
- agentWaitMinWaitMs: 0;
3
- agentWaitWaitFloorMs: 10000;
4
- agentWaitDefaultWaitMs: 30000;
5
- agentWaitMaxWaitMs: 300000;
6
- agentWaitMaxAgents: 8;
7
- subagentDescriptionMaxCharacters: 80;
8
- subagentPromptMaxBytes: 131072;
9
- subagentMessageMaxBytes: 131072;
10
- subagentReasoningEffortMaxCharacters: 64;
11
- subagentSummaryMaxBytes: 16384;
12
- subagentUpdateMaxBytes: 32768;
13
- subagentRunningLatestMessageMaxCharacters: 2000;
14
- subagentEvidenceMaxItems: 64;
15
- subagentVerificationMaxItems: 16;
16
- subagentChangedFilesMaxItems: 200;
17
- }>;