@myagentroam/agent 0.9.158 → 0.9.160

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 +21 -0
  61. package/dist/agent-core/model/openai-responses.d.ts +3 -1
  62. package/dist/agent-core/model/openai-responses.js +248 -97
  63. package/dist/agent-core/model/text-blocks.d.ts +7 -0
  64. package/dist/agent-core/model/text-blocks.js +40 -0
  65. package/dist/agent-core/prompts/index.d.ts +6 -2
  66. package/dist/agent-core/prompts/index.js +38 -24
  67. package/dist/agent-core/runtime/context/gc-tokens.js +6 -1
  68. package/dist/agent-core/runtime/context/normalize.js +21 -1
  69. package/dist/agent-core/runtime/context/projection.js +35 -1
  70. package/dist/agent-core/runtime/context/request-budget.js +5 -2
  71. package/dist/agent-core/runtime/context/restore.d.ts +5 -0
  72. package/dist/agent-core/runtime/context/restore.js +47 -4
  73. package/dist/agent-core/runtime/context/usage.js +2 -3
  74. package/dist/agent-core/runtime/contracts.d.ts +2 -0
  75. package/dist/agent-core/runtime/execution.js +5 -2
  76. package/dist/agent-core/sdk/agent.js +177 -40
  77. package/dist/agent-core/sdk/extension-agents.d.ts +9 -0
  78. package/dist/agent-core/sdk/extension-agents.js +51 -0
  79. package/dist/agent-core/sdk/extension-models.d.ts +13 -0
  80. package/dist/agent-core/sdk/extension-models.js +128 -0
  81. package/dist/agent-core/sdk/extension-session.d.ts +30 -0
  82. package/dist/agent-core/sdk/extension-session.js +103 -0
  83. package/dist/agent-core/sdk/extension-tools.d.ts +16 -0
  84. package/dist/agent-core/sdk/extension-tools.js +126 -0
  85. package/dist/agent-core/sdk/session.d.ts +26 -2
  86. package/dist/agent-core/sdk/session.js +1215 -506
  87. package/dist/agent-core/sdk/types.d.ts +3 -0
  88. package/dist/agent-core/session/context-gc-checkpoint.js +1 -1
  89. package/dist/agent-core/session/jsonl-store.d.ts +28 -8
  90. package/dist/agent-core/session/jsonl-store.js +124 -84
  91. package/dist/agent-core/session/types.d.ts +4 -1
  92. package/dist/agent-core/storage/file-lock.d.ts +4 -0
  93. package/dist/agent-core/storage/file-lock.js +83 -0
  94. package/dist/agent-core/subagent/contracts.d.ts +11 -1
  95. package/dist/agent-core/subagent/scheduler.d.ts +8 -0
  96. package/dist/agent-core/subagent/session-controller.d.ts +22 -1
  97. package/dist/agent-core/subagent/session-controller.js +355 -98
  98. package/dist/agent-core/tools/agent/agent-start.d.ts +1 -1
  99. package/dist/agent-core/tools/code-mode/cells.js +5 -15
  100. package/dist/agent-core/tools/code-mode/dispatch.d.ts +1 -0
  101. package/dist/agent-core/tools/code-mode/dispatch.js +13 -1
  102. package/dist/agent-core/tools/code-mode/index.js +1 -2
  103. package/dist/agent-core/tools/code-mode/observations.d.ts +5 -0
  104. package/dist/agent-core/tools/code-mode/observations.js +16 -5
  105. package/dist/agent-core/tools/code-mode/quickjs-engine.js +10 -5
  106. package/dist/agent-core/tools/execution.d.ts +11 -2
  107. package/dist/agent-core/tools/execution.js +58 -21
  108. package/dist/agent-core/tools/input.d.ts +2 -0
  109. package/dist/agent-core/tools/input.js +36 -0
  110. package/dist/agent-core/tools/local/apply-patch.js +21 -17
  111. package/dist/agent-core/tools/local/exec.d.ts +4 -4
  112. package/dist/agent-core/tools/local/exec.js +234 -62
  113. package/dist/agent-core/tools/local/registry.d.ts +6 -0
  114. package/dist/agent-core/tools/local/registry.js +60 -9
  115. package/dist/agent-core/tools/local/view-image.js +108 -2
  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
@@ -5,6 +5,7 @@ import { resolveModelDefaultReasoningEffort } from './configuration.js';
5
5
  import { isRetryableUpstreamOverloadCode, number, parseSse, record, text, observeModelStreamEvent, modelStreamEventObservedAt } from './sse.js';
6
6
  import { fetchModelResponse, modelRetryMaxAttempts, isRetryableModelRequestError, isRetryableModelTransportError, waitForModelRetry } from './http.js';
7
7
  import { anthropicThinkingBlock, assertAnthropicThinkingBudget } from './anthropic-thinking.js';
8
+ import { resolveModelTextBlocks } from './text-blocks.js';
8
9
  export class AnthropicMessagesAdapter {
9
10
  configuration;
10
11
  constructor(configuration) {
@@ -74,20 +75,25 @@ export class AnthropicMessagesAdapter {
74
75
  },
75
76
  body: JSON.stringify({
76
77
  model: this.configuration.modelId,
77
- system: [
78
- {
79
- type: 'text',
80
- text: request.system,
81
- cache_control: { type: 'ephemeral' }
82
- }
83
- ],
84
- messages: anthropicMessages(request.messages, request.images, request.tools, this.configuration.id),
78
+ system: request.systemBlocks !== undefined
79
+ ? anthropicTextBlocks(request.system, request.systemBlocks)
80
+ : request.system
81
+ ? [
82
+ {
83
+ type: 'text',
84
+ text: request.system,
85
+ cache_control: { type: 'ephemeral' }
86
+ }
87
+ ]
88
+ : [],
89
+ messages: anthropicMessages(request.messages, request.images, request.tools, this.configuration.id, request.systemBlocks === undefined &&
90
+ request.messages.every((message) => message.textBlocks === undefined), request.cachePrefixMessages),
85
91
  tools,
86
92
  ...(request.toolChoice === undefined
87
93
  ? {}
88
94
  : { tool_choice: { type: request.toolChoice } }),
89
95
  stream: true,
90
- max_tokens: this.configuration.maxOutputTokens,
96
+ max_tokens: Math.min(request.outputLimit ?? this.configuration.maxOutputTokens, this.configuration.maxOutputTokens),
91
97
  output_config: {
92
98
  effort: request.reasoningEffort?.trim() ||
93
99
  resolveModelDefaultReasoningEffort(this.configuration)
@@ -452,12 +458,20 @@ function boundedError(value, maximum) {
452
458
  return undefined;
453
459
  return [...normalized].slice(0, maximum).join('');
454
460
  }
455
- function anthropicMessages(messages, images, tools = [], modelId) {
461
+ function anthropicMessages(messages, images, tools = [], modelId, automaticCache = true, cachePrefixMessages) {
462
+ if (cachePrefixMessages !== undefined &&
463
+ (!Number.isSafeInteger(cachePrefixMessages) ||
464
+ cachePrefixMessages < 0 ||
465
+ cachePrefixMessages > messages.length))
466
+ throw new MarAgentError('MAR_AGENT_MODEL_REQUEST_INVALID', 'The captured cache prefix is invalid.');
456
467
  const imageMessage = messages.findLastIndex((message) => message.role === 'user');
457
468
  const toolDefinitions = new Map(tools.map((tool) => [tool.name, tool]));
458
469
  const result = [];
459
470
  let thinkingBytes = 0;
460
471
  for (const [index, message] of messages.entries()) {
472
+ if (index === cachePrefixMessages)
473
+ for (const prior of result.slice(-2))
474
+ prior.content = withCacheBreakpoint(prior.content);
461
475
  const userImages = message.role === 'user'
462
476
  ? uniqueModelImages(message.images, index === imageMessage ? images : undefined)
463
477
  : [];
@@ -494,6 +508,7 @@ function anthropicMessages(messages, images, tools = [], modelId) {
494
508
  const block = {
495
509
  type: 'tool_result',
496
510
  tool_use_id: message.callId,
511
+ ...(message.isError === undefined ? {} : { is_error: message.isError }),
497
512
  content: observationModelParts(message)?.map((part) => part.type === 'text'
498
513
  ? { type: 'text', text: part.text }
499
514
  : {
@@ -504,10 +519,10 @@ function anthropicMessages(messages, images, tools = [], modelId) {
504
519
  data: part.image.dataBase64
505
520
  }
506
521
  }) ??
507
- (message.images?.length
522
+ (message.textBlocks !== undefined
508
523
  ? [
509
- { type: 'text', text: message.content },
510
- ...message.images.map((image) => ({
524
+ ...anthropicTextBlocks(message.content, message.textBlocks),
525
+ ...(message.images ?? []).map((image) => ({
511
526
  type: 'image',
512
527
  source: {
513
528
  type: 'base64',
@@ -516,7 +531,19 @@ function anthropicMessages(messages, images, tools = [], modelId) {
516
531
  }
517
532
  }))
518
533
  ]
519
- : message.content)
534
+ : message.images?.length
535
+ ? [
536
+ { type: 'text', text: message.content },
537
+ ...message.images.map((image) => ({
538
+ type: 'image',
539
+ source: {
540
+ type: 'base64',
541
+ media_type: image.mimeType,
542
+ data: image.dataBase64
543
+ }
544
+ }))
545
+ ]
546
+ : message.content)
520
547
  };
521
548
  const previous = result.at(-1);
522
549
  if (previous?.role === 'user' && Array.isArray(previous.content))
@@ -526,19 +553,21 @@ function anthropicMessages(messages, images, tools = [], modelId) {
526
553
  continue;
527
554
  }
528
555
  if (message.role === 'assistant') {
529
- if (!message.content)
556
+ if (!message.content && message.textBlocks === undefined)
530
557
  continue;
531
- const block = { type: 'text', text: message.content };
558
+ const blocks = message.textBlocks !== undefined
559
+ ? anthropicTextBlocks(message.content, message.textBlocks)
560
+ : [{ type: 'text', text: message.content }];
532
561
  const previous = result.at(-1);
533
562
  if (previous?.role === 'assistant' && Array.isArray(previous.content))
534
- previous.content.push(block);
563
+ previous.content.push(...blocks);
535
564
  else
536
- result.push({ role: 'assistant', content: [block] });
565
+ result.push({ role: 'assistant', content: blocks });
537
566
  continue;
538
567
  }
539
568
  result.push({
540
569
  role: message.role,
541
- content: userImages.length > 0
570
+ content: message.textBlocks !== undefined
542
571
  ? [
543
572
  ...userImages.map((image) => ({
544
573
  type: 'image',
@@ -548,15 +577,36 @@ function anthropicMessages(messages, images, tools = [], modelId) {
548
577
  data: image.dataBase64
549
578
  }
550
579
  })),
551
- { type: 'text', text: message.content }
580
+ ...anthropicTextBlocks(message.content, message.textBlocks)
552
581
  ]
553
- : message.content
582
+ : userImages.length > 0
583
+ ? [
584
+ ...userImages.map((image) => ({
585
+ type: 'image',
586
+ source: {
587
+ type: 'base64',
588
+ media_type: image.mimeType,
589
+ data: image.dataBase64
590
+ }
591
+ })),
592
+ { type: 'text', text: message.content }
593
+ ]
594
+ : message.content
554
595
  });
555
596
  }
556
- for (const message of result.slice(-2))
557
- message.content = withCacheBreakpoint(message.content);
597
+ if (cachePrefixMessages === messages.length ||
598
+ (cachePrefixMessages === undefined && automaticCache))
599
+ for (const message of result.slice(-2))
600
+ message.content = withCacheBreakpoint(message.content);
558
601
  return result;
559
602
  }
603
+ function anthropicTextBlocks(text, blocks) {
604
+ return resolveModelTextBlocks(text, blocks).map((block) => ({
605
+ type: 'text',
606
+ text: block.text,
607
+ ...(block.cache ? { cache_control: { type: 'ephemeral' } } : {})
608
+ }));
609
+ }
560
610
  function uniqueModelImages(...groups) {
561
611
  const seen = new Set();
562
612
  return groups.flatMap((group) => (group ?? []).flatMap((image) => {
@@ -1,10 +1,17 @@
1
1
  import type { ClientToolDefinition } from '../tools/contracts.js';
2
2
  import type { MarAgentModelConfiguration, MarAgentReasoningEffort, ModelCredentialAcquireReason } from './configuration.js';
3
3
  export type { ClientToolDefinition, ToolCaller } from '../tools/contracts.js';
4
+ export interface ModelTextBlock {
5
+ readonly text: string;
6
+ readonly cache?: true;
7
+ }
4
8
  export interface ModelMessage {
9
+ /** Model-facing tool-result status; independent of the actual execution outcome. */
10
+ isError?: boolean;
5
11
  calls?: readonly import('../tools/code-mode/observations.js').CodeToolCallRecord[];
6
12
  role: 'user' | 'assistant' | 'tool' | 'tool_call' | 'provider';
7
13
  content: string;
14
+ textBlocks?: readonly ModelTextBlock[];
8
15
  contextKind?: 'environment' | 'private';
9
16
  callId?: string;
10
17
  name?: string;
@@ -36,6 +43,15 @@ export interface ModelAttemptDiagnostic {
36
43
  connectionId?: string;
37
44
  connectionReused?: boolean;
38
45
  proxyType?: 'DIRECT' | 'SOCKS5';
46
+ /** Actual serialized WebSocket request size, including inline image Base64. */
47
+ requestBytes?: number;
48
+ imageCount?: number;
49
+ /** Decoded byte count of inline input images; external URLs do not add bytes. */
50
+ imageBytes?: number;
51
+ requestFrameCount?: number;
52
+ sentFrameCount?: number;
53
+ webSocketPhase?: 'CONNECT' | 'SEND' | 'RECEIVE';
54
+ webSocketCloseCode?: number;
39
55
  durationMs?: number;
40
56
  errorCode?: string;
41
57
  errorMessage?: string;
@@ -55,8 +71,13 @@ export interface ModelRequest {
55
71
  /** Shared local attempt accounting across Adapter retries and Runtime continuation. Never sent upstream. */
56
72
  retryState?: ModelRetryState;
57
73
  system: string;
74
+ systemBlocks?: readonly ModelTextBlock[];
75
+ /** Retain the automatic cache boundary of an actual captured prefix, excluding a fork tail. */
76
+ cachePrefixMessages?: number;
58
77
  messages: readonly ModelMessage[];
59
78
  tools: readonly ClientToolDefinition[];
79
+ /** Optional per-request cap; adapters never exceed their configured output ceiling. */
80
+ outputLimit?: number;
60
81
  allowTools?: boolean;
61
82
  /** Preserve the visible tool catalog while controlling whether the model may call it. */
62
83
  toolChoice?: 'auto' | 'none';
@@ -25,6 +25,7 @@ interface PreparedResponsesRequest {
25
25
  readonly body: ResponsesRequestBody;
26
26
  readonly continuation: boolean;
27
27
  }
28
+ type ResponsesWebSocketDiagnostic = Pick<ModelAttemptDiagnostic, 'requestBytes' | 'imageCount' | 'imageBytes' | 'requestFrameCount' | 'sentFrameCount' | 'webSocketPhase' | 'webSocketCloseCode'>;
28
29
  export declare class OpenAiResponsesAdapter implements ModelAdapter {
29
30
  #private;
30
31
  constructor(configuration: MarAgentModelConfiguration);
@@ -51,7 +52,8 @@ declare class OpenAiResponsesTurnSession implements ModelTurnSession {
51
52
  fullRequestBody(): ResponsesRequestBody;
52
53
  currentTurnState(): string | undefined;
53
54
  beginAttempt(): void;
54
- connectionDiagnostic(): Pick<ModelAttemptDiagnostic, 'connectionId' | 'connectionReused' | 'proxyType'>;
55
+ captureWebSocketDiagnostic(diagnostic: ResponsesWebSocketDiagnostic): void;
56
+ connectionDiagnostic(): Pick<ModelAttemptDiagnostic, 'connectionId' | 'connectionReused' | 'proxyType'> & ResponsesWebSocketDiagnostic;
55
57
  captureTurnState(value: unknown): void;
56
58
  withTurnStateMetadata(body: ResponsesRequestBody): ResponsesRequestBody;
57
59
  invalidateWebSocket(): void;