@myagentroam/agent 0.9.159 → 0.9.161

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 (130) hide show
  1. package/dist/agent-core/extensions/agents.d.ts +69 -0
  2. package/dist/agent-core/extensions/agents.js +160 -0
  3. package/dist/agent-core/extensions/contracts.d.ts +260 -0
  4. package/dist/agent-core/extensions/contracts.js +1 -0
  5. package/dist/agent-core/extensions/data.d.ts +84 -0
  6. package/dist/agent-core/extensions/data.js +83 -0
  7. package/dist/agent-core/extensions/environment.d.ts +27 -0
  8. package/dist/agent-core/extensions/environment.js +52 -0
  9. package/dist/agent-core/extensions/files.d.ts +64 -0
  10. package/dist/agent-core/extensions/files.js +26 -0
  11. package/dist/agent-core/extensions/hooks.d.ts +32 -0
  12. package/dist/agent-core/extensions/hooks.js +135 -0
  13. package/dist/agent-core/extensions/manager.d.ts +39 -0
  14. package/dist/agent-core/extensions/manager.js +458 -0
  15. package/dist/agent-core/extensions/mcp.d.ts +99 -0
  16. package/dist/agent-core/extensions/mcp.js +433 -0
  17. package/dist/agent-core/extensions/model-request.d.ts +60 -0
  18. package/dist/agent-core/extensions/model-request.js +167 -0
  19. package/dist/agent-core/extensions/model-stream.d.ts +9 -0
  20. package/dist/agent-core/extensions/model-stream.js +101 -0
  21. package/dist/agent-core/extensions/models.d.ts +43 -0
  22. package/dist/agent-core/extensions/models.js +1 -0
  23. package/dist/agent-core/extensions/network.d.ts +32 -0
  24. package/dist/agent-core/extensions/network.js +97 -0
  25. package/dist/agent-core/extensions/operation.d.ts +29 -0
  26. package/dist/agent-core/extensions/operation.js +98 -0
  27. package/dist/agent-core/extensions/processes.d.ts +52 -0
  28. package/dist/agent-core/extensions/processes.js +283 -0
  29. package/dist/agent-core/extensions/prompt-composition.d.ts +24 -0
  30. package/dist/agent-core/extensions/prompt-composition.js +106 -0
  31. package/dist/agent-core/extensions/prompt-input.d.ts +23 -0
  32. package/dist/agent-core/extensions/prompt-input.js +46 -0
  33. package/dist/agent-core/extensions/resources.d.ts +27 -0
  34. package/dist/agent-core/extensions/resources.js +221 -0
  35. package/dist/agent-core/extensions/services.d.ts +31 -0
  36. package/dist/agent-core/extensions/services.js +61 -0
  37. package/dist/agent-core/extensions/session-input.d.ts +151 -0
  38. package/dist/agent-core/extensions/session-input.js +351 -0
  39. package/dist/agent-core/extensions/session-messages.d.ts +41 -0
  40. package/dist/agent-core/extensions/session-messages.js +76 -0
  41. package/dist/agent-core/extensions/session.d.ts +68 -0
  42. package/dist/agent-core/extensions/session.js +593 -0
  43. package/dist/agent-core/extensions/settings.d.ts +59 -0
  44. package/dist/agent-core/extensions/settings.js +115 -0
  45. package/dist/agent-core/extensions/store.d.ts +10 -0
  46. package/dist/agent-core/extensions/store.js +131 -0
  47. package/dist/agent-core/extensions/tools.d.ts +61 -0
  48. package/dist/agent-core/extensions/tools.js +266 -0
  49. package/dist/agent-core/host/contracts.d.ts +25 -0
  50. package/dist/agent-core/host/local-agent-host.d.ts +10 -1
  51. package/dist/agent-core/host/local-agent-host.js +132 -20
  52. package/dist/agent-core/host/local-file-access.d.ts +30 -0
  53. package/dist/agent-core/host/local-file-access.js +107 -0
  54. package/dist/agent-core/host/local-network-access.d.ts +6 -0
  55. package/dist/agent-core/host/local-network-access.js +97 -0
  56. package/dist/agent-core/host/local-process-executor.d.ts +5 -1
  57. package/dist/agent-core/host/local-session-environment.d.ts +18 -0
  58. package/dist/agent-core/host/local-session-environment.js +102 -0
  59. package/dist/agent-core/model/anthropic-messages.js +73 -23
  60. package/dist/agent-core/model/contracts.d.ts +12 -0
  61. package/dist/agent-core/model/openai-responses.js +73 -12
  62. package/dist/agent-core/model/text-blocks.d.ts +7 -0
  63. package/dist/agent-core/model/text-blocks.js +40 -0
  64. package/dist/agent-core/prompts/index.d.ts +6 -2
  65. package/dist/agent-core/prompts/index.js +38 -24
  66. package/dist/agent-core/runtime/context/gc-tokens.js +6 -1
  67. package/dist/agent-core/runtime/context/normalize.js +21 -1
  68. package/dist/agent-core/runtime/context/projection.js +35 -1
  69. package/dist/agent-core/runtime/context/request-budget.js +5 -2
  70. package/dist/agent-core/runtime/context/restore.d.ts +5 -0
  71. package/dist/agent-core/runtime/context/restore.js +47 -4
  72. package/dist/agent-core/runtime/context/usage.js +2 -3
  73. package/dist/agent-core/runtime/contracts.d.ts +2 -0
  74. package/dist/agent-core/runtime/execution.js +5 -2
  75. package/dist/agent-core/sdk/agent.js +177 -40
  76. package/dist/agent-core/sdk/extension-agents.d.ts +9 -0
  77. package/dist/agent-core/sdk/extension-agents.js +51 -0
  78. package/dist/agent-core/sdk/extension-models.d.ts +13 -0
  79. package/dist/agent-core/sdk/extension-models.js +128 -0
  80. package/dist/agent-core/sdk/extension-session.d.ts +30 -0
  81. package/dist/agent-core/sdk/extension-session.js +103 -0
  82. package/dist/agent-core/sdk/extension-tools.d.ts +16 -0
  83. package/dist/agent-core/sdk/extension-tools.js +126 -0
  84. package/dist/agent-core/sdk/session.d.ts +26 -2
  85. package/dist/agent-core/sdk/session.js +1215 -506
  86. package/dist/agent-core/sdk/types.d.ts +3 -0
  87. package/dist/agent-core/session/context-gc-checkpoint.js +1 -1
  88. package/dist/agent-core/session/jsonl-store.d.ts +28 -8
  89. package/dist/agent-core/session/jsonl-store.js +124 -84
  90. package/dist/agent-core/session/types.d.ts +4 -1
  91. package/dist/agent-core/storage/file-lock.d.ts +4 -0
  92. package/dist/agent-core/storage/file-lock.js +83 -0
  93. package/dist/agent-core/subagent/contracts.d.ts +11 -1
  94. package/dist/agent-core/subagent/scheduler.d.ts +8 -0
  95. package/dist/agent-core/subagent/session-controller.d.ts +22 -1
  96. package/dist/agent-core/subagent/session-controller.js +355 -98
  97. package/dist/agent-core/tools/agent/agent-start.d.ts +1 -1
  98. package/dist/agent-core/tools/code-mode/cells.js +5 -15
  99. package/dist/agent-core/tools/code-mode/dispatch.d.ts +1 -0
  100. package/dist/agent-core/tools/code-mode/dispatch.js +13 -1
  101. package/dist/agent-core/tools/code-mode/index.js +1 -2
  102. package/dist/agent-core/tools/code-mode/observations.d.ts +5 -0
  103. package/dist/agent-core/tools/code-mode/observations.js +16 -5
  104. package/dist/agent-core/tools/code-mode/quickjs-engine.js +10 -5
  105. package/dist/agent-core/tools/execution-limits.d.ts +0 -1
  106. package/dist/agent-core/tools/execution-limits.js +0 -1
  107. package/dist/agent-core/tools/execution.d.ts +11 -2
  108. package/dist/agent-core/tools/execution.js +58 -21
  109. package/dist/agent-core/tools/input.d.ts +2 -0
  110. package/dist/agent-core/tools/input.js +36 -0
  111. package/dist/agent-core/tools/local/apply-patch.js +21 -17
  112. package/dist/agent-core/tools/local/exec.d.ts +4 -4
  113. package/dist/agent-core/tools/local/exec.js +242 -63
  114. package/dist/agent-core/tools/local/registry.d.ts +6 -0
  115. package/dist/agent-core/tools/local/registry.js +60 -9
  116. package/dist/agent-core/tools/mcp/catalog.d.ts +6 -2
  117. package/dist/agent-core/tools/mcp/catalog.js +4 -4
  118. package/dist/agent-core/tools/mcp/history.js +2 -2
  119. package/dist/agent-core/tools/mcp/tool-search.d.ts +3 -1
  120. package/dist/agent-core/tools/mcp/tool-search.js +2 -2
  121. package/dist/agent-core/tools/output-projection.d.ts +3 -1
  122. package/dist/agent-core/tools/output-projection.js +11 -2
  123. package/dist/agent-core/tools/runtime-context.d.ts +1 -0
  124. package/dist/agent-core/tools/runtime.d.ts +3 -1
  125. package/dist/agent-core/tools/runtime.js +22 -7
  126. package/dist/agent-core/tools/scheduler.d.ts +2 -0
  127. package/dist/agent-core/tools/scheduler.js +43 -6
  128. package/dist/index.d.ts +21 -0
  129. package/dist/sandbox/linux/bubblewrap-sandbox-executor.js +5 -2
  130. package/package.json +1 -1
@@ -0,0 +1,128 @@
1
+ import { MarAgentError } from '../error.js';
2
+ import { ExtensionRequestBridge } from '../extensions/model-request.js';
3
+ import { transformCoreModelStream } from '../extensions/model-stream.js';
4
+ import { modelTextInput } from '../model/text-blocks.js';
5
+ export function createExtensionModels(state, createAdapter, resolveSnapshot) {
6
+ return {
7
+ list: () => {
8
+ const { models, defaultModelId } = state();
9
+ return Object.freeze([...models.values()].map((model) => Object.freeze({
10
+ id: model.id,
11
+ name: model.name,
12
+ modelId: model.modelId,
13
+ contextWindowTokens: model.contextWindowTokens,
14
+ maxOutputTokens: model.maxOutputTokens,
15
+ inputCapabilities: Object.freeze([...model.inputCapabilities]),
16
+ reasoningEfforts: Object.freeze([...model.reasoningEfforts]),
17
+ isDefault: model.id === defaultModelId
18
+ })));
19
+ },
20
+ async generate(input, call, transform, transformEvent, diagnoseCleanup) {
21
+ call.signal.throwIfAborted();
22
+ const { models, defaultModelId } = state();
23
+ const snapshot = input.requestSnapshot === undefined
24
+ ? undefined
25
+ : resolveSnapshot?.(input.requestSnapshot, call);
26
+ if (input.requestSnapshot !== undefined && !snapshot)
27
+ throw new MarAgentError('MAR_AGENT_MODEL_SNAPSHOT_INVALID', 'Request snapshot is unavailable.');
28
+ if (input.retainToolCatalog && !snapshot)
29
+ throw new MarAgentError('MAR_AGENT_MODEL_SNAPSHOT_INVALID', 'A retained tool catalog requires a real request snapshot.');
30
+ const modelId = input.modelId ?? snapshot?.modelId ?? defaultModelId;
31
+ const configuration = models.get(modelId);
32
+ if (!configuration)
33
+ throw new MarAgentError('MAR_AGENT_MODEL_DISABLED', 'Selected model is unavailable.');
34
+ if (input.outputLimit !== undefined &&
35
+ (!Number.isSafeInteger(input.outputLimit) || input.outputLimit < 1))
36
+ throw new MarAgentError('MAR_AGENT_MODEL_REQUEST_INVALID', 'Output limit must be a positive integer.');
37
+ const system = input.system === undefined ? undefined : modelTextInput(input.system);
38
+ const prompt = input.prompt === undefined ? undefined : modelTextInput(input.prompt);
39
+ const { systemBlocks: capturedBlocks, ...captured } = snapshot?.request ?? {};
40
+ const systemBlocks = system ? system.blocks : capturedBlocks;
41
+ const bridge = new ExtensionRequestBridge(modelId, {
42
+ ...captured,
43
+ system: system?.text ?? snapshot?.request.system ?? '',
44
+ ...(systemBlocks === undefined ? {} : { systemBlocks }),
45
+ messages: snapshot?.request.messages ?? [],
46
+ tools: input.retainToolCatalog ? snapshot.request.tools : [],
47
+ toolChoice: 'none'
48
+ }, snapshot?.view.messages);
49
+ const view = await transform({
50
+ ...bridge.view,
51
+ messages: [
52
+ ...(input.messages ?? bridge.view.messages),
53
+ ...(prompt
54
+ ? [
55
+ {
56
+ role: 'user',
57
+ content: prompt.text,
58
+ ...(prompt.blocks === undefined ? {} : { textBlocks: prompt.blocks })
59
+ }
60
+ ]
61
+ : [])
62
+ ],
63
+ ...(input.reasoningEffort ? { reasoningEffort: input.reasoningEffort } : {})
64
+ });
65
+ const lowered = bridge.lower(view);
66
+ if (lowered.tools.length && !input.retainToolCatalog)
67
+ throw new MarAgentError('MAR_AGENT_MODEL_REQUEST_INVALID', 'Independent generation does not execute tools.');
68
+ const request = {
69
+ ...lowered,
70
+ ...(input.retainToolCatalog &&
71
+ snapshot.request.systemBlocks === undefined &&
72
+ snapshot.request.messages.every((message) => message.textBlocks === undefined)
73
+ ? { cachePrefixMessages: Math.max(0, lowered.messages.length - (prompt ? 1 : 0)) }
74
+ : {}),
75
+ toolChoice: 'none',
76
+ allowTools: input.retainToolCatalog === true,
77
+ outputLimit: Math.min(input.outputLimit ?? configuration.maxOutputTokens, configuration.maxOutputTokens)
78
+ };
79
+ const adapter = createAdapter(modelId, models);
80
+ let text = '';
81
+ const chunks = new Map();
82
+ let stopReason;
83
+ let usage;
84
+ let failed = false;
85
+ try {
86
+ for await (const event of transformCoreModelStream((signal) => adapter.start(request, signal), call.signal, transformEvent, () => diagnoseCleanup?.('MAR_AGENT_MODEL_STREAM_CLEANUP_FAILED'))) {
87
+ call.signal.throwIfAborted();
88
+ if (event.type === 'text.delta' && event.phase === 'final_answer')
89
+ chunks.set(event.itemId, (chunks.get(event.itemId) ?? '') + event.delta);
90
+ else if (event.type === 'text.completed' && event.phase !== 'commentary')
91
+ chunks.set(event.itemId, event.text);
92
+ else if (event.type === 'output.reset')
93
+ chunks.clear();
94
+ else if (event.type === 'usage')
95
+ usage = { ...event.usage };
96
+ else if (event.type === 'completed')
97
+ stopReason = event.reason;
98
+ else if (event.type === 'client_tool.call' && !input.retainToolCatalog)
99
+ throw new MarAgentError('MAR_AGENT_MODEL_REQUEST_INVALID', 'Independent generation received a tool call.');
100
+ }
101
+ call.signal.throwIfAborted();
102
+ if (!stopReason)
103
+ throw new MarAgentError('MAR_AGENT_MODEL_STREAM_INCOMPLETE', 'Model stream ended without a terminal outcome.');
104
+ text = [...chunks.values()].join('');
105
+ return {
106
+ outcome: stopReason === 'cancelled' ? 'cancelled' : text ? 'text' : 'empty',
107
+ text,
108
+ stopReason,
109
+ ...(usage ? { usage: Object.freeze(usage) } : {})
110
+ };
111
+ }
112
+ catch (error) {
113
+ failed = true;
114
+ throw error;
115
+ }
116
+ finally {
117
+ try {
118
+ await adapter.close?.();
119
+ }
120
+ catch (error) {
121
+ if (!failed)
122
+ throw error;
123
+ diagnoseCleanup?.('MAR_AGENT_MODEL_ADAPTER_CLEANUP_FAILED');
124
+ }
125
+ }
126
+ }
127
+ };
128
+ }
@@ -0,0 +1,30 @@
1
+ import type { ExecutionHandle } from './types.js';
2
+ import type { CoreOperationContext } from '../extensions/operation.js';
3
+ import type { CoreRequestSnapshot } from '../extensions/model-request.js';
4
+ import type { CorePromptComposition, CorePromptFacts } from '../extensions/prompt-composition.js';
5
+ import { SessionInputCoordinator, type CoreSessionBackend, type CoreSessionRequest, type SessionInputEntry, type CoreSessionMessages, type CoreSessionMessagesInput, type CoreSessionActionResult } from '../extensions/session-input.js';
6
+ import type { CoreSessionDescription } from '../extensions/session-input.js';
7
+ export interface ExtensionSessionPorts {
8
+ describe?(call: CoreOperationContext): Promise<CoreSessionDescription>;
9
+ composePrompt?(facts: CorePromptFacts, call: CoreOperationContext): Promise<CorePromptComposition>;
10
+ captureRequest(call: CoreOperationContext, input?: {
11
+ readonly completed?: boolean;
12
+ }): Promise<CoreRequestSnapshot | undefined>;
13
+ readonly sessionId: string;
14
+ coordinator(): SessionInputCoordinator;
15
+ activeExecutionId(): string | undefined;
16
+ messages(input: CoreSessionMessagesInput, call: CoreOperationContext): Promise<CoreSessionMessages>;
17
+ append(entry: SessionInputEntry, request: Extract<CoreSessionRequest, {
18
+ kind: 'append';
19
+ }>, call: CoreOperationContext): Promise<CoreSessionActionResult>;
20
+ launch(entry: SessionInputEntry, request: Exclude<CoreSessionRequest, {
21
+ kind: 'append';
22
+ }>, call: CoreOperationContext): Promise<ExecutionHandle & {
23
+ readonly inputCommitted: Promise<CoreSessionActionResult>;
24
+ }>;
25
+ diagnose(code: string, operationId: string): void;
26
+ }
27
+ /** Admission and idle execution reuse the same Session coordinator and SDK entry. */
28
+ export declare function createExtensionSessionBackend(ports: ExtensionSessionPorts): CoreSessionBackend & {
29
+ kick(): void;
30
+ };
@@ -0,0 +1,103 @@
1
+ import { MarAgentError } from '../error.js';
2
+ /** Admission and idle execution reuse the same Session coordinator and SDK entry. */
3
+ export function createExtensionSessionBackend(ports) {
4
+ let scheduled;
5
+ const idleLeaf = async (entry, request, call) => {
6
+ call.signal.throwIfAborted();
7
+ if (request.kind === 'append')
8
+ return ports.append(entry, request, call);
9
+ const handle = await ports.launch(entry, request, call);
10
+ ports.coordinator().startExecution(entry, handle.executionId);
11
+ const cancel = () => handle.cancel();
12
+ call.signal.addEventListener('abort', cancel, { once: true });
13
+ if (call.signal.aborted)
14
+ cancel();
15
+ const completion = handle
16
+ .result()
17
+ .then((result) => {
18
+ ports.coordinator().settleExecution(handle.executionId, result.status);
19
+ return result;
20
+ })
21
+ .finally(() => call.signal.removeEventListener('abort', cancel));
22
+ if (request.kind === 'compact') {
23
+ const result = await completion;
24
+ if (result.status !== 'completed')
25
+ throw new MarAgentError(result.errorCode ?? 'MAR_AGENT_COMPACT_FAILED', 'Requested compaction did not complete.');
26
+ }
27
+ else {
28
+ void completion.catch(() => ports.diagnose('MAR_AGENT_SESSION_INPUT_FAILED', call.operationId));
29
+ return await handle.inputCommitted;
30
+ }
31
+ return { changed: true, executionId: handle.executionId };
32
+ };
33
+ const kick = () => {
34
+ if (scheduled ||
35
+ ports.activeExecutionId() ||
36
+ ports.coordinator().executing ||
37
+ !ports.coordinator().hasPending)
38
+ return;
39
+ scheduled = Promise.resolve()
40
+ .then(async () => {
41
+ if (!ports.activeExecutionId())
42
+ await ports.coordinator().drain(idleLeaf, undefined, 1);
43
+ })
44
+ .catch(() => ports.diagnose('MAR_AGENT_SESSION_INPUT_FAILED', 'idle-admission'))
45
+ .finally(() => {
46
+ scheduled = undefined;
47
+ kick();
48
+ });
49
+ };
50
+ return {
51
+ ...(ports.describe ? { describe: (call) => ports.describe(call) } : {}),
52
+ ...(ports.composePrompt
53
+ ? {
54
+ composePrompt: (facts, call) => ports.composePrompt(facts, call)
55
+ }
56
+ : {}),
57
+ captureRequest: (call, input) => ports.captureRequest(call, input),
58
+ kick,
59
+ inspect: async (call) => {
60
+ call.signal.throwIfAborted();
61
+ const executionId = ports.activeExecutionId();
62
+ return {
63
+ sessionId: ports.sessionId,
64
+ epoch: call.sessionEpoch,
65
+ ...(executionId ? { activeExecutionId: executionId } : {}),
66
+ operations: ports.coordinator().inspect()
67
+ };
68
+ },
69
+ messages: (input, call) => ports.messages(input, call),
70
+ handled: (input, call, value) => ports.coordinator().handled(input, call, value),
71
+ own: (id) => {
72
+ const coordinator = ports.coordinator();
73
+ return () => coordinator.retire(id);
74
+ },
75
+ enqueue: async (request, call, action) => {
76
+ const coordinator = ports.coordinator();
77
+ if (request.kind === 'append' && request.input.delivery === 'immediate') {
78
+ try {
79
+ return await coordinator.performAppend(request.input, call, action, (entry, value, effective) => {
80
+ if (value.kind !== 'append')
81
+ throw new MarAgentError('MAR_AGENT_SESSION_INPUT_INVALID', 'Immediate record submission must remain an append.');
82
+ return ports.append(entry, value, effective);
83
+ });
84
+ }
85
+ finally {
86
+ kick();
87
+ }
88
+ }
89
+ const current = request.kind === 'compact' ? coordinator.currentCompact() : undefined;
90
+ if (current)
91
+ return current;
92
+ const idle = !ports.activeExecutionId() && !coordinator.executing;
93
+ const entry = coordinator.accept(request, call, action, request.kind === 'submit' ? 'accepted' : 'queued');
94
+ kick();
95
+ if (idle && request.kind === 'submit' && request.input.waitFor === 'start')
96
+ await entry.started;
97
+ else if ((idle && request.kind !== 'submit') ||
98
+ (request.kind === 'submit' && request.input.waitFor === 'commit'))
99
+ await entry.terminal;
100
+ return Object.freeze({ ...entry.receipt });
101
+ }
102
+ };
103
+ }
@@ -0,0 +1,16 @@
1
+ import type { CoreToolBinding } from '../extensions/tools.js';
2
+ import type { ClientToolDefinition, McpToolCatalog } from '../tools/contracts.js';
3
+ import { type RoundToolScope } from '../tools/execution.js';
4
+ import type { ToolRuntimeContext } from '../tools/runtime-context.js';
5
+ /** One real Execution's sources; a retained physical frame is distinct from its active main round. */
6
+ export declare class ExecutionToolSources {
7
+ #private;
8
+ readonly executionId: string;
9
+ readonly sessionId: string;
10
+ readonly bindings: readonly CoreToolBinding[];
11
+ constructor(executionId: string, sessionId: string, definitions: readonly ClientToolDefinition[], builtins: readonly ClientToolDefinition[], catalog: McpToolCatalog, supplemental?: readonly CoreToolBinding[]);
12
+ bind(scope: RoundToolScope): void;
13
+ assertActive(): void;
14
+ withFrame<Value>(context: ToolRuntimeContext, run: () => Value): Value;
15
+ close(): void;
16
+ }
@@ -0,0 +1,126 @@
1
+ import { AsyncLocalStorage } from 'node:async_hooks';
2
+ import { randomUUID } from 'node:crypto';
3
+ import { MarAgentError } from '../error.js';
4
+ import { toolCallers } from '../tools/callers.js';
5
+ import { createRoundToolRuntimeContext } from '../tools/execution.js';
6
+ import { executeCapturedTool } from '../tools/runtime.js';
7
+ /** One real Execution's sources; a retained physical frame is distinct from its active main round. */
8
+ export class ExecutionToolSources {
9
+ executionId;
10
+ sessionId;
11
+ bindings;
12
+ #frame = new AsyncLocalStorage();
13
+ #scope;
14
+ #closed = false;
15
+ constructor(executionId, sessionId, definitions, builtins, catalog, supplemental = []) {
16
+ this.executionId = executionId;
17
+ this.sessionId = sessionId;
18
+ this.bindings = Object.freeze([
19
+ ...definitions.map((original) => {
20
+ const captured = catalog.tools.find((tool) => tool.definition.name === original.name);
21
+ const mcp = captured === undefined ? undefined : structuredClone(captured);
22
+ const kind = mcp ? 'mcp' : builtins.includes(original) ? 'builtin' : 'host';
23
+ const definition = Object.freeze({
24
+ ...structuredClone(original),
25
+ allowedCallers: Object.freeze([...toolCallers(original)])
26
+ });
27
+ return Object.freeze({
28
+ definition,
29
+ source: Object.freeze({
30
+ kind,
31
+ id: mcp?.sourceIdentity ?? `${kind}:${executionId}:${definition.name}`,
32
+ revision: mcp?.definitionRevision ?? executionId
33
+ }),
34
+ ...(mcp === undefined ? {} : { mcp }),
35
+ available: (call) => {
36
+ const context = this.#context(call);
37
+ if (!context)
38
+ return false;
39
+ if (definition.name === 'skill')
40
+ return context.skills.size > 0;
41
+ if (['agent_start', 'agent_wait', 'agent_message', 'agent_cancel'].includes(definition.name))
42
+ return context.subagents !== undefined;
43
+ if (definition.name === 'tool_search')
44
+ return (this.#currentFrame()?.searchMcpTools !== undefined || this.#scope !== undefined);
45
+ return true;
46
+ },
47
+ invoke: async (input, call) => {
48
+ const context = this.#context(call);
49
+ if (!context)
50
+ throw unavailable();
51
+ const frame = this.#currentFrame();
52
+ const scope = this.#scope;
53
+ const actual = frame ??
54
+ (scope &&
55
+ (await createRoundToolRuntimeContext(scope, { ...input, callId: input.callId ?? randomUUID() }, call.signal)));
56
+ if (!actual || !this.#context(call))
57
+ throw unavailable();
58
+ call.signal.throwIfAborted();
59
+ return executeCapturedTool(kind, input, {
60
+ ...actual,
61
+ signal: call.signal,
62
+ ...(mcp === undefined
63
+ ? {}
64
+ : {
65
+ expectedMcpTool: {
66
+ sourceIdentity: mcp.sourceIdentity,
67
+ definitionRevision: mcp.definitionRevision
68
+ }
69
+ })
70
+ });
71
+ }
72
+ });
73
+ }),
74
+ ...supplemental
75
+ ]);
76
+ }
77
+ bind(scope) {
78
+ if (this.#closed ||
79
+ scope.context.executionId !== this.executionId ||
80
+ scope.context.sessionId !== this.sessionId)
81
+ throw unavailable();
82
+ this.#scope = scope;
83
+ }
84
+ assertActive() {
85
+ if (this.#closed)
86
+ throw unavailable();
87
+ }
88
+ withFrame(context, run) {
89
+ if (context.executionId !== this.executionId || context.sessionId !== this.sessionId)
90
+ throw unavailable();
91
+ const frame = { context, active: true };
92
+ return this.#frame.run(frame, () => {
93
+ try {
94
+ const result = run();
95
+ if (result instanceof Promise)
96
+ return result.finally(() => {
97
+ frame.active = false;
98
+ });
99
+ frame.active = false;
100
+ return result;
101
+ }
102
+ catch (error) {
103
+ frame.active = false;
104
+ throw error;
105
+ }
106
+ });
107
+ }
108
+ close() {
109
+ this.#closed = true;
110
+ this.#scope = undefined;
111
+ }
112
+ #context(call) {
113
+ if (call.executionId !== this.executionId || call.sessionId !== this.sessionId)
114
+ return;
115
+ const frame = this.#currentFrame();
116
+ const context = frame ?? (this.#closed ? undefined : this.#scope?.context);
117
+ return context && !context.signal.aborted ? context : undefined;
118
+ }
119
+ #currentFrame() {
120
+ const frame = this.#frame.getStore();
121
+ return frame?.active ? frame.context : undefined;
122
+ }
123
+ }
124
+ function unavailable() {
125
+ return new MarAgentError('MAR_AGENT_TOOL_NOT_AVAILABLE', 'Execution tool source is unavailable.');
126
+ }
@@ -1,8 +1,14 @@
1
1
  import type { ContextualWorldState } from '../runtime/context/world-state.js';
2
2
  import type { ResolvedModelConfiguration } from './model-runtime.js';
3
+ import { ExecutionToolSources } from './extension-tools.js';
4
+ import type { ExtensionManager } from '../extensions/manager.js';
5
+ import type { CoreOperationContext } from '../extensions/operation.js';
6
+ import { ExtensionRequestSnapshots } from '../extensions/model-request.js';
7
+ import { SessionInputCoordinator, type CoreSessionBackend } from '../extensions/session-input.js';
8
+ import type { CoreAgentsBackend } from '../extensions/agents.js';
3
9
  import type { HostDescription, MarAgentHost } from '../host/contracts.js';
4
10
  import { type MarAgentReasoningEffort } from '../model/configuration.js';
5
- import type { ModelAdapter } from '../model/contracts.js';
11
+ import type { ModelAdapter, ModelMessage } from '../model/contracts.js';
6
12
  import { RolloutBudget, resolveRolloutBudgetOptions } from '../runtime/rollout-budget.js';
7
13
  import { JsonlSessionStore } from '../session/jsonl-store.js';
8
14
  import { SubagentSessionController, type SubagentMailboxMessage, type SubagentMessageDelivery, type SubagentTurnHandle } from '../subagent/session-controller.js';
@@ -18,6 +24,22 @@ export interface SessionRuntime {
18
24
  contextualWorldState?: ContextualWorldState;
19
25
  subagents?: SubagentSessionController;
20
26
  subagentsOpening?: Promise<SubagentSessionController>;
27
+ inputs?: SessionInputCoordinator;
28
+ requestSnapshots?: ExtensionRequestSnapshots;
29
+ requestMessages?: {
30
+ readonly executionId: string;
31
+ read(): readonly ModelMessage[];
32
+ };
33
+ recordProjection?: Promise<unknown>;
34
+ appendedMessages?: {
35
+ readonly executionId: string;
36
+ append(recordId: string, message: ModelMessage): void;
37
+ };
38
+ sessionBackend?: CoreSessionBackend & {
39
+ kick(): void;
40
+ };
41
+ agentsBackend?: CoreAgentsBackend;
42
+ toolSources?: ExecutionToolSources;
21
43
  }
22
44
  interface InternalMarAgentSession extends MarAgentSession {
23
45
  startSubagentTurn(input: {
@@ -29,7 +51,8 @@ interface InternalMarAgentSession extends MarAgentSession {
29
51
  readonly turnId: string;
30
52
  readonly delivery?: SubagentMessageDelivery;
31
53
  readonly sharedRolloutBudget?: RolloutBudget;
32
- readonly mcpExecutionScopeId: string;
54
+ readonly mcpExecutionScopeId?: string;
55
+ readonly origin?: CoreOperationContext;
33
56
  }): SubagentTurnHandle;
34
57
  }
35
58
  /** Agent-owned registries shared with Session orchestration, not public execution state. */
@@ -45,6 +68,7 @@ interface SessionServices {
45
68
  readonly description: HostDescription;
46
69
  readonly settings: Pick<CreateMarAgentOptions, 'workspaceMapping' | 'systemInstruction'>;
47
70
  readonly store: JsonlSessionStore;
71
+ readonly extensions: ExtensionManager;
48
72
  readonly registry: AgentSessionRegistry;
49
73
  readonly rolloutBudgetOptions: ReturnType<typeof resolveRolloutBudgetOptions>;
50
74
  readonly hasCustomAdapters: boolean;