@myagentroam/agent 0.10.59 → 0.10.61

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 (58) hide show
  1. package/dist/agent-core/runtime/compaction/history.d.ts +1 -1
  2. package/dist/agent-core/runtime/compaction/retained-context.d.ts +1 -1
  3. package/dist/agent-core/runtime/compaction/retained-context.js +1 -1
  4. package/dist/agent-core/runtime/compaction/smart.d.ts +1 -1
  5. package/dist/agent-core/runtime/compaction/smart.js +1 -1
  6. package/dist/agent-core/runtime/context/gc-runtime.d.ts +1 -1
  7. package/dist/agent-core/runtime/context/gc-runtime.js +20 -14
  8. package/dist/agent-core/runtime/context/gc.d.ts +1 -1
  9. package/dist/agent-core/runtime/context/gc.js +4 -10
  10. package/dist/agent-core/runtime/context/projection.d.ts +1 -1
  11. package/dist/agent-core/runtime/context/projection.js +3 -5
  12. package/dist/agent-core/runtime/context/restore.d.ts +4 -4
  13. package/dist/agent-core/runtime/context/restore.js +1 -1
  14. package/dist/agent-core/runtime/context/usage.d.ts +2 -2
  15. package/dist/agent-core/runtime/context/usage.js +1 -1
  16. package/dist/agent-core/runtime/context/world-state.d.ts +2 -2
  17. package/dist/agent-core/runtime/context/world-state.js +1 -1
  18. package/dist/agent-core/sdk/agent.js +2 -2
  19. package/dist/agent-core/sdk/extension-agents.js +5 -1
  20. package/dist/agent-core/sdk/native-steer.d.ts +1 -1
  21. package/dist/agent-core/sdk/session.d.ts +19 -13
  22. package/dist/agent-core/sdk/session.js +35 -40
  23. package/dist/agent-core/sdk/subagent-backend.d.ts +1 -1
  24. package/dist/agent-core/sdk/subagent-backend.js +20 -17
  25. package/dist/agent-core/session/catalog.js +1 -1
  26. package/dist/agent-core/session/context-gc-checkpoint.d.ts +4 -8
  27. package/dist/agent-core/session/context-gc-checkpoint.js +82 -137
  28. package/dist/agent-core/session/context-gc-observations.d.ts +1 -1
  29. package/dist/agent-core/session/context-gc-replacements.d.ts +4 -7
  30. package/dist/agent-core/session/context-gc-replacements.js +25 -59
  31. package/dist/agent-core/session/context-gc-subagent.d.ts +0 -3
  32. package/dist/agent-core/session/context-gc-subagent.js +2 -16
  33. package/dist/agent-core/session/deferred-input.d.ts +1 -1
  34. package/dist/agent-core/session/store/current-state.d.ts +17 -0
  35. package/dist/agent-core/session/store/current-state.js +53 -0
  36. package/dist/agent-core/session/store/directory-index.d.ts +18 -0
  37. package/dist/agent-core/session/store/directory-index.js +169 -0
  38. package/dist/agent-core/session/store/execution-state.d.ts +18 -0
  39. package/dist/agent-core/session/store/execution-state.js +187 -0
  40. package/dist/agent-core/session/store/history.d.ts +25 -0
  41. package/dist/agent-core/session/store/history.js +157 -0
  42. package/dist/agent-core/session/store/images.d.ts +21 -0
  43. package/dist/agent-core/session/store/images.js +248 -0
  44. package/dist/agent-core/session/store/index.d.ts +4 -0
  45. package/dist/agent-core/session/store/index.js +2 -0
  46. package/dist/agent-core/session/{jsonl-store.d.ts → store/jsonl-store.d.ts} +14 -94
  47. package/dist/agent-core/session/{jsonl-store.js → store/jsonl-store.js} +323 -1269
  48. package/dist/agent-core/session/store/records.d.ts +23 -0
  49. package/dist/agent-core/session/store/records.js +249 -0
  50. package/dist/agent-core/session/store/types.d.ts +84 -0
  51. package/dist/agent-core/session/store/types.js +1 -0
  52. package/dist/agent-core/session/tool-result-resources.d.ts +1 -1
  53. package/dist/agent-core/subagent/scheduler.js +1 -1
  54. package/dist/agent-core/subagent/session-controller.d.ts +5 -2
  55. package/dist/agent-core/subagent/session-controller.js +99 -15
  56. package/dist/agent-core/tools/code-mode/state.d.ts +1 -1
  57. package/dist/agent-core/tools/code-mode/state.js +2 -2
  58. package/package.json +1 -1
@@ -45,7 +45,7 @@ import { AGENT_EXECUTION_POLICY } from '../runtime/execution-policy.js';
45
45
  import { loadAgentInstructions, renderAgentInstructions } from '../runtime/context/instructions.js';
46
46
  import { normalizeMessagesForModel } from '../runtime/context/normalize.js';
47
47
  import { latestSmartContextTokens, projectSmartCompactionMessage, requestSmartCompaction } from '../runtime/compaction/smart.js';
48
- import { compactSummaryFromCheckpoint, inputMetadataFromRecord } from '../session/jsonl-store.js';
48
+ import { compactSummaryFromCheckpoint, inputMetadataFromRecord } from '../session/store/index.js';
49
49
  import { SubagentSessionController } from '../subagent/session-controller.js';
50
50
  import { agentStartToolDefinitionWithModels } from '../tools/agent/agent-start.js';
51
51
  import { allowsDirectTool, allowsToolCaller, toolCallers } from '../tools/callers.js';
@@ -123,7 +123,6 @@ export function createSessionOpener(services) {
123
123
  text: sessionSource.type === 'subagent' ? childSubagentInstruction || null : null
124
124
  }
125
125
  ]);
126
- let promptDefaults;
127
126
  const sessionAdapter = (modelId, configuredModels) => {
128
127
  let selected = sessionRuntime.adapters.get(modelId);
129
128
  if (selected === undefined) {
@@ -187,7 +186,7 @@ export function createSessionOpener(services) {
187
186
  };
188
187
  recordSessionInputCommit(entry, result);
189
188
  if (message)
190
- sessionRuntime.appendedMessages?.append(record.recordId, message);
189
+ sessionRuntime.execution?.appendedMessages?.append(record.recordId, message);
191
190
  return result;
192
191
  });
193
192
  }
@@ -208,7 +207,6 @@ export function createSessionOpener(services) {
208
207
  const messageSources = new WeakMap();
209
208
  let liveModelMessages = [];
210
209
  const compactRequests = new CompactRequests(executionId, () => compactCoordinator.assertNotReentrant());
211
- sessionRuntime.compactRequests = compactRequests;
212
210
  const permissionPolicy = new ExecutionToolPermissions(mode === 'compact' ? 'full-access' : resolvePermissionMode(input.permissionMode), { sessionId, executionId }, host.requestToolApproval
213
211
  ? {
214
212
  request: (request, signal) => host.requestToolApproval(request, signal),
@@ -225,13 +223,15 @@ export function createSessionOpener(services) {
225
223
  ...currentLocalTimeContext()
226
224
  };
227
225
  const executionSystemInstruction = settings.systemInstruction;
228
- promptDefaults = {
226
+ const executionContext = {
229
227
  executionId,
230
228
  modelId: input.modelId ?? executionDefaultModelId,
231
229
  mode: mode === 'compact' ? 'run' : mode,
232
230
  models: executionModels,
233
- instruction: executionSystemInstruction
231
+ instruction: executionSystemInstruction,
232
+ compactRequests
234
233
  };
234
+ sessionRuntime.execution = executionContext;
235
235
  const manualCompactionId = mode === 'compact' ? randomUUID() : undefined;
236
236
  active.set(`${sessionId}:${executionId}`, controller);
237
237
  const inputs = sessionInputs();
@@ -369,8 +369,7 @@ export function createSessionOpener(services) {
369
369
  await inputs.idle();
370
370
  let immediateTarget;
371
371
  const pendingAppends = [];
372
- sessionRuntime.appendedMessages = {
373
- executionId,
372
+ executionContext.appendedMessages = {
374
373
  append(recordId, message) {
375
374
  pendingAppends.push({
376
375
  recordId,
@@ -755,7 +754,7 @@ export function createSessionOpener(services) {
755
754
  const coreExtensions = await services.extensions.prepare(sessionId, controller.signal, sourceBindings, sessionSource.type === 'user' &&
756
755
  (mode === 'run' || mode === 'plan') &&
757
756
  !internal.automaticInput);
758
- sessionRuntime.toolSources = sources;
757
+ executionContext.toolSources = sources;
759
758
  const operation = (run) => services.extensions.operations.run({
760
759
  sessionId,
761
760
  sessionEpoch: coreExtensions.epoch,
@@ -863,6 +862,7 @@ export function createSessionOpener(services) {
863
862
  executionTools = mcpRegistry.project(baseTools());
864
863
  };
865
864
  const loadRetainedSessionResources = async () => {
865
+ await subagents?.prepareSessionResources(controller.signal);
866
866
  const hostResources = (await host.listSessionResources?.(sessionId)) ?? {
867
867
  processes: []
868
868
  };
@@ -1128,8 +1128,7 @@ export function createSessionOpener(services) {
1128
1128
  sources.bind(captureRoundToolScope().toolScope);
1129
1129
  let preparingRequestMessages;
1130
1130
  let preparingRequestBaseLength = 0;
1131
- sessionRuntime.requestMessages = {
1132
- executionId,
1131
+ executionContext.requestMessages = {
1133
1132
  read: () => preparingRequestMessages !== undefined
1134
1133
  ? normalizeMessagesForModel([...preparingRequestMessages, ...messages.slice(preparingRequestBaseLength)], { supportsImages: selectedModel.inputCapabilities.includes('IMAGE') })
1135
1134
  : projectSessionRequestMessages(messages.map((message, index) => index === currentExecutionUserIndex && modelInputImages?.length
@@ -1192,7 +1191,7 @@ export function createSessionOpener(services) {
1192
1191
  return { executionId, status: 'completed', finalAnswer: '', inputHandled: true };
1193
1192
  }
1194
1193
  acceptsSteer = true;
1195
- sessionRuntime.steer = createNativeSteer({
1194
+ executionContext.steer = createNativeSteer({
1196
1195
  executionId,
1197
1196
  inputs,
1198
1197
  signal: controller.signal,
@@ -1885,12 +1884,12 @@ export function createSessionOpener(services) {
1885
1884
  finalAnswer = executionLoop?.finalAnswer ?? finalAnswer;
1886
1885
  acceptsMailbox = false;
1887
1886
  acceptsSteer = false;
1888
- delete sessionRuntime.steer;
1887
+ delete executionContext.steer;
1889
1888
  await sessionRuntime.recordProjection?.catch(() => undefined);
1890
1889
  await compactCoordinator.close(error);
1891
1890
  compactRequests.close(new MarAgentError('MAR_AGENT_CANCELLED', 'Execution ended.'));
1892
- if (sessionRuntime.compactRequests === compactRequests)
1893
- delete sessionRuntime.compactRequests;
1891
+ if (executionContext.compactRequests === compactRequests)
1892
+ delete executionContext.compactRequests;
1894
1893
  if (controller.signal.aborted) {
1895
1894
  subagents?.endParentExecution(executionId);
1896
1895
  await emit({ type: 'execution.cancelled' });
@@ -1912,19 +1911,16 @@ export function createSessionOpener(services) {
1912
1911
  };
1913
1912
  }
1914
1913
  finally {
1915
- if (sessionRuntime.requestMessages?.executionId === executionId)
1916
- delete sessionRuntime.requestMessages;
1914
+ delete executionContext.requestMessages;
1917
1915
  compactRequests.close(new MarAgentError('MAR_AGENT_CANCELLED', 'Execution ended.'));
1918
- if (sessionRuntime.compactRequests === compactRequests)
1919
- delete sessionRuntime.compactRequests;
1920
- if (sessionRuntime.appendedMessages?.executionId === executionId)
1921
- delete sessionRuntime.appendedMessages;
1922
- if (promptDefaults?.executionId === executionId)
1923
- promptDefaults = undefined;
1916
+ if (executionContext.compactRequests === compactRequests)
1917
+ delete executionContext.compactRequests;
1918
+ delete executionContext.appendedMessages;
1919
+ delete executionContext.steer;
1924
1920
  acceptsMailbox = false;
1925
1921
  executionToolSources?.close();
1926
- if (sessionRuntime.toolSources === executionToolSources)
1927
- delete sessionRuntime.toolSources;
1922
+ if (executionContext.toolSources === executionToolSources)
1923
+ delete executionContext.toolSources;
1928
1924
  internal.signal?.removeEventListener('abort', abortSource);
1929
1925
  await compactCoordinator.close(controller.signal.reason ?? new MarAgentError('MAR_AGENT_CANCELLED', 'Execution ended.'));
1930
1926
  await selectedTurn?.close().catch(() => undefined);
@@ -1940,6 +1936,8 @@ export function createSessionOpener(services) {
1940
1936
  }
1941
1937
  subagents?.endParentExecution(executionId);
1942
1938
  await releaseSession?.();
1939
+ if (sessionRuntime.execution === executionContext)
1940
+ delete sessionRuntime.execution;
1943
1941
  active.delete(`${sessionId}:${executionId}`);
1944
1942
  sessionRuntime.sessionBackend?.kick();
1945
1943
  queue.close();
@@ -1974,20 +1972,15 @@ export function createSessionOpener(services) {
1974
1972
  sessionRuntime.sessionBackend ??= createExtensionSessionBackend({
1975
1973
  describe: async (call) => {
1976
1974
  call.signal.throwIfAborted();
1975
+ const defaults = sessionRuntime.execution;
1976
+ const state = defaults ?? services.modelState();
1977
+ const modelId = defaults?.modelId ?? services.modelState().defaultModelId;
1977
1978
  const current = await store.getSession(sessionId);
1978
- const records = await store.read(sessionId);
1979
+ const userTurns = await store.userTurnCount(sessionId);
1979
1980
  call.signal.throwIfAborted();
1980
- const state = promptDefaults ?? services.modelState();
1981
- const modelId = promptDefaults?.modelId ?? services.modelState().defaultModelId;
1982
1981
  const model = state.models.get(modelId);
1983
1982
  if (!model)
1984
1983
  throw new MarAgentError('MAR_AGENT_MODEL_DISABLED', 'Selected model is unavailable.');
1985
- const userTurns = records.filter((record) => {
1986
- if (record.type !== 'turn.user')
1987
- return false;
1988
- const payload = record.payload;
1989
- return payload.inputSource === undefined;
1990
- }).length;
1991
1984
  return {
1992
1985
  sessionId,
1993
1986
  ...(logicalWorkspace ? { cwd: logicalWorkspace, root: logicalWorkspace } : {}),
@@ -2000,9 +1993,10 @@ export function createSessionOpener(services) {
2000
1993
  },
2001
1994
  composePrompt: async (facts, call) => {
2002
1995
  call.signal.throwIfAborted();
2003
- const defaults = promptDefaults;
1996
+ const defaults = sessionRuntime.execution;
2004
1997
  const state = defaults ?? services.modelState();
2005
1998
  const modelId = facts.modelId ?? defaults?.modelId ?? services.modelState().defaultModelId;
1999
+ const instruction = defaults ? defaults.instruction : settings.systemInstruction;
2006
2000
  const model = state.models.get(modelId);
2007
2001
  if (!model)
2008
2002
  throw new MarAgentError('MAR_AGENT_MODEL_DISABLED', 'Selected model is unavailable.');
@@ -2047,7 +2041,7 @@ export function createSessionOpener(services) {
2047
2041
  });
2048
2042
  call.signal.throwIfAborted();
2049
2043
  return {
2050
- sections: buildSessionPromptSections(tools, mode, model, defaults?.instruction ?? settings.systemInstruction, instructions?.skillCatalog),
2044
+ sections: buildSessionPromptSections(tools, mode, model, instruction, instructions?.skillCatalog),
2051
2045
  facts: { modelId, mode, tools: tools.map((tool) => tool.name) }
2052
2046
  };
2053
2047
  },
@@ -2075,8 +2069,9 @@ export function createSessionOpener(services) {
2075
2069
  }
2076
2070
  call.signal.throwIfAborted();
2077
2071
  const targetRuntime = sessionRuntimes.get(target);
2078
- if (selection.view === 'request' && targetRuntime?.requestMessages)
2079
- return sessionMessagesPage(targetRuntime.requestMessages.read(), selection);
2072
+ const requestMessages = targetRuntime?.execution?.requestMessages;
2073
+ if (selection.view === 'request' && requestMessages)
2074
+ return sessionMessagesPage(requestMessages.read(), selection);
2080
2075
  const modelState = services.modelState();
2081
2076
  const requestModel = selection.view === 'request'
2082
2077
  ? modelState.models.get(targetModelId ?? modelState.defaultModelId)
@@ -2215,8 +2210,8 @@ export function createSessionOpener(services) {
2215
2210
  id: sessionId,
2216
2211
  run: (input) => execution('run', input),
2217
2212
  plan: (input) => execution('plan', input),
2218
- steer: (input) => sessionRuntime.steer?.(input) ?? Promise.resolve({ status: 'notAccepted' }),
2219
- compact: (input = {}) => sessionRuntime.compactRequests?.request(input) ??
2213
+ steer: (input) => sessionRuntime.execution?.steer?.(input) ?? Promise.resolve({ status: 'notAccepted' }),
2214
+ compact: (input = {}) => sessionRuntime.execution?.compactRequests?.request(input) ??
2220
2215
  execution('compact', {
2221
2216
  prompt: input.prompt ?? DEFAULT_COMPACTION_FOCUS,
2222
2217
  ...input
@@ -1,3 +1,3 @@
1
- import type { JsonlSessionStore } from '../session/jsonl-store.js';
1
+ import type { JsonlSessionStore } from '../session/store/index.js';
2
2
  import type { SubagentSessionControllerBackend } from '../subagent/session-controller.js';
3
3
  export declare function createSubagentBackend(store: JsonlSessionStore, workspace: string): SubagentSessionControllerBackend;
@@ -14,33 +14,36 @@ export function createSubagentBackend(store, workspace) {
14
14
  },
15
15
  listChildren: async (parentSessionId) => {
16
16
  const sessions = await store.listSubagentChildren(parentSessionId);
17
- return Promise.all(sessions.map(async (session) => ({
17
+ return sessions.map((session) => ({
18
18
  id: session.id,
19
19
  createdAt: session.createdAt,
20
20
  lastActivityAt: session.lastActivityAt,
21
- source: session.source,
22
- records: await store.read(session.id)
23
- })));
21
+ source: session.source
22
+ }));
24
23
  },
25
24
  loadChild: async (parentSessionId, childSessionId) => {
26
- let session;
27
25
  try {
28
- session = await store.getSession(childSessionId);
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
+ };
29
37
  }
30
38
  catch (error) {
31
- if (error instanceof MarAgentError && error.code === 'MAR_AGENT_SESSION_NOT_FOUND')
32
- return undefined;
39
+ if (error instanceof MarAgentError && 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
+ }
33
45
  throw error;
34
46
  }
35
- if (session.source.type !== 'subagent' || session.source.parentSessionId !== parentSessionId)
36
- return undefined;
37
- return {
38
- id: session.id,
39
- createdAt: session.createdAt,
40
- lastActivityAt: session.lastActivityAt,
41
- source: session.source,
42
- records: await store.read(session.id)
43
- };
44
47
  }
45
48
  };
46
49
  }
@@ -1,6 +1,6 @@
1
1
  import { MarAgentError } from '../error.js';
2
2
  import { publicHostedToolEvents } from '../runtime/event-projection.js';
3
- import { JsonlSessionStore } from './jsonl-store.js';
3
+ import { JsonlSessionStore } from './store/index.js';
4
4
  const MAX_INPUT_IMAGE_BYTES = 5 * 1024 * 1024;
5
5
  const INPUT_IMAGE_MIME_TYPES = new Set(['image/png', 'image/jpeg', 'image/gif', 'image/webp']);
6
6
  export async function openMarAgentSessionCatalog(input) {
@@ -1,6 +1,6 @@
1
1
  import { type ContextGcWebToolName } from './context-gc-replacements.js';
2
2
  import { type ContextGcSubagentToolName } from './context-gc-subagent.js';
3
- import type { SessionRecord } from './jsonl-store.js';
3
+ import type { SessionRecord } from './store/index.js';
4
4
  export declare const CONTEXT_GC_CHECKPOINT_VERSION: 1;
5
5
  export declare const CONTEXT_GC_MAX_TARGETS = 4096;
6
6
  export type ContextGcPlatform = 'linux' | 'darwin' | 'win32';
@@ -35,7 +35,6 @@ export interface ContextGcTarget {
35
35
  readonly role: 'tool_call' | 'tool' | 'provider';
36
36
  readonly callId?: string;
37
37
  readonly toolName?: string;
38
- readonly sourceHash: string;
39
38
  }
40
39
  export interface ContextGcReadItemReplacement {
41
40
  readonly supersededByCallId?: string;
@@ -125,7 +124,6 @@ export interface ContextGcCheckpointDraft {
125
124
  readonly version: 1;
126
125
  readonly base: ContextGcBase;
127
126
  readonly boundarySequence: number;
128
- sourceProjectionHash: string;
129
127
  readonly replacements: readonly ContextGcReplacement[];
130
128
  readonly trigger: {
131
129
  readonly usageSequence: number;
@@ -145,20 +143,18 @@ export interface ContextGcCheckpointPayload extends ContextGcCheckpointDraft {
145
143
  /** Disposable memoization for one evaluation's immutable record snapshot. */
146
144
  export declare class ContextGcCheckpointCache {
147
145
  #private;
148
- read(records: readonly SessionRecord[], boundarySequence?: number, workspace?: string | undefined): ReturnType<typeof latestValidContextGcCheckpoint>;
146
+ read(records: readonly SessionRecord[], boundarySequence?: number, workspace?: string): ReturnType<typeof latestValidContextGcCheckpoint>;
149
147
  }
150
148
  export declare function contextGcMinimumUsageGrowth(contextWindowTokens: number): number;
151
- export declare function contextGcRecordSourceHash(record: Pick<SessionRecord, 'payload'>): string;
152
149
  export declare function contextGcLogicalPathKey(path: string, workspace: string, platform?: ContextGcPlatform): string | undefined;
153
150
  export declare function contextGcTargetKey(target: ContextGcTarget): string;
154
151
  export declare function contextGcReplacementKey(replacement: ContextGcReplacement): string;
155
152
  export declare function contextGcBaseFromRecords(records: readonly SessionRecord[], boundarySequence?: number): ContextGcBase | undefined;
156
153
  export declare function contextGcBaseSequence(base: ContextGcBase): number;
157
- export declare function contextGcSourceProjectionHash(records: readonly SessionRecord[], boundarySequence: number, base?: ContextGcBase | undefined): string | undefined;
158
154
  export declare function normalizeContextGcReplacements(replacements: readonly ContextGcReplacement[]): ContextGcReplacement[] | undefined;
159
155
  export declare function parseContextGcCheckpoint(record: SessionRecord | undefined): ContextGcCheckpointPayload | undefined;
160
- export declare function validateContextGcCheckpoint(records: readonly SessionRecord[], record: SessionRecord, workspace?: string | undefined): ContextGcCheckpointPayload | undefined;
161
- export declare function latestValidContextGcCheckpoint(records: readonly SessionRecord[], boundarySequence?: number, workspace?: string | undefined): {
156
+ export declare function validateContextGcCheckpoint(records: readonly SessionRecord[], record: SessionRecord, workspace?: string | undefined, committedReplacements?: readonly ContextGcReplacement[]): ContextGcCheckpointPayload | undefined;
157
+ export declare function latestValidContextGcCheckpoint(records: readonly SessionRecord[], boundarySequence?: number, _workspace?: string): {
162
158
  readonly record: SessionRecord;
163
159
  readonly payload: ContextGcCheckpointPayload;
164
160
  } | undefined;