@myagentroam/agent 0.9.141 → 0.9.142
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/agent-core/host/contracts.d.ts +64 -0
- package/dist/{host → agent-core/host}/local-agent-host.d.ts +6 -5
- package/dist/{host → agent-core/host}/local-agent-host.js +4 -4
- package/dist/{model → agent-core/model}/contracts.d.ts +2 -16
- package/dist/agent-core/model/recovery.d.ts +4 -0
- package/dist/agent-core/model/recovery.js +71 -0
- package/dist/{prompts → agent-core/prompts}/core.d.ts +3 -13
- package/dist/{prompts → agent-core/prompts}/index.d.ts +1 -1
- package/dist/{prompts → agent-core/prompts}/modes.d.ts +1 -1
- package/dist/{prompts → agent-core/prompts}/resources.d.ts +1 -1
- package/dist/{runtime/compact.d.ts → agent-core/runtime/compaction/history.d.ts} +2 -23
- package/dist/{runtime/compact.js → agent-core/runtime/compaction/history.js} +2 -92
- package/dist/agent-core/runtime/compaction/operation.d.ts +22 -0
- package/dist/agent-core/runtime/compaction/operation.js +91 -0
- package/dist/agent-core/runtime/context/contracts.d.ts +12 -0
- package/dist/{runtime/environment-context.d.ts → agent-core/runtime/context/environment.d.ts} +2 -2
- package/dist/{runtime/environment-context.js → agent-core/runtime/context/environment.js} +1 -1
- package/dist/{runtime/context-gc-runtime.d.ts → agent-core/runtime/context/gc-runtime.d.ts} +4 -4
- package/dist/{runtime/context-gc-runtime.js → agent-core/runtime/context/gc-runtime.js} +3 -3
- package/dist/{runtime/context-gc-tokens.d.ts → agent-core/runtime/context/gc-tokens.d.ts} +2 -2
- package/dist/{runtime/context-gc-tokens.js → agent-core/runtime/context/gc-tokens.js} +3 -3
- package/dist/{runtime/context-gc.d.ts → agent-core/runtime/context/gc.d.ts} +3 -3
- package/dist/{runtime/context-gc.js → agent-core/runtime/context/gc.js} +6 -6
- package/dist/{runtime → agent-core/runtime/context}/instructions.d.ts +1 -1
- package/dist/{runtime → agent-core/runtime/context}/instructions.js +1 -1
- package/dist/{runtime → agent-core/runtime/context}/normalize.d.ts +1 -1
- package/dist/{runtime/context-projection.d.ts → agent-core/runtime/context/projection.d.ts} +3 -3
- package/dist/{runtime/context-projection.js → agent-core/runtime/context/projection.js} +4 -4
- package/dist/agent-core/runtime/context/request-budget.d.ts +6 -0
- package/dist/agent-core/runtime/context/request-budget.js +22 -0
- package/dist/agent-core/runtime/context/restore.d.ts +15 -0
- package/dist/agent-core/runtime/context/restore.js +85 -0
- package/dist/agent-core/runtime/context/usage.d.ts +18 -0
- package/dist/agent-core/runtime/context/usage.js +138 -0
- package/dist/agent-core/runtime/context/world-state.d.ts +35 -0
- package/dist/agent-core/runtime/context/world-state.js +133 -0
- package/dist/agent-core/runtime/contracts.d.ts +37 -0
- package/dist/agent-core/runtime/event-projection.d.ts +5 -0
- package/dist/agent-core/runtime/event-projection.js +17 -0
- package/dist/agent-core/runtime/events.d.ts +142 -0
- package/dist/agent-core/runtime/execution.d.ts +50 -0
- package/dist/agent-core/runtime/execution.js +393 -0
- package/dist/{runtime → agent-core/runtime}/rollout-budget.d.ts +1 -1
- package/dist/agent-core/sdk/agent.js +209 -0
- package/dist/agent-core/sdk/model-runtime.d.ts +13 -0
- package/dist/agent-core/sdk/model-runtime.js +63 -0
- package/dist/agent-core/sdk/session-title.d.ts +3 -0
- package/dist/agent-core/sdk/session-title.js +42 -0
- package/dist/agent-core/sdk/session.d.ts +62 -0
- package/dist/agent-core/sdk/session.js +1147 -0
- package/dist/agent-core/sdk/subagent-backend.d.ts +3 -0
- package/dist/agent-core/sdk/subagent-backend.js +46 -0
- package/dist/agent-core/sdk/types.d.ts +56 -0
- package/dist/{session → agent-core/session}/catalog.d.ts +2 -1
- package/dist/{session → agent-core/session}/context-gc-checkpoint.js +1 -1
- package/dist/{session → agent-core/session}/jsonl-store.d.ts +2 -2
- package/dist/{session → agent-core/session}/jsonl-store.js +1 -1
- package/dist/agent-core/subagent/contracts.d.ts +91 -0
- package/dist/agent-core/subagent/contracts.js +1 -0
- package/dist/agent-core/subagent/scheduler.d.ts +117 -0
- package/dist/{subagent → agent-core/subagent}/session-controller.d.ts +3 -2
- package/dist/agent-core/tools/agent/agent-cancel.d.ts +7 -0
- package/dist/{tools → agent-core/tools/agent}/agent-cancel.js +1 -1
- package/dist/agent-core/tools/agent/agent-message.d.ts +7 -0
- package/dist/{tools → agent-core/tools/agent}/agent-message.js +2 -2
- package/dist/{tools → agent-core/tools/agent}/agent-start.d.ts +3 -3
- package/dist/{tools → agent-core/tools/agent}/agent-start.js +3 -3
- package/dist/agent-core/tools/agent/agent-wait.d.ts +7 -0
- package/dist/{tools → agent-core/tools/agent}/agent-wait.js +2 -2
- package/dist/{tools → agent-core/tools/agent}/question.d.ts +2 -2
- package/dist/{tools → agent-core/tools/agent}/question.js +2 -2
- package/dist/{tools → agent-core/tools/agent}/skill.d.ts +2 -2
- package/dist/{tools → agent-core/tools/agent}/skill.js +2 -2
- package/dist/{tools → agent-core/tools/agent}/todo-read.d.ts +2 -2
- package/dist/{tools → agent-core/tools/agent}/todo-write.d.ts +2 -2
- package/dist/{tools → agent-core/tools/agent}/todo-write.js +2 -2
- package/dist/{tools → agent-core/tools/agent}/todo.d.ts +2 -9
- package/dist/{tools → agent-core/tools/agent}/todo.js +1 -1
- package/dist/{tools → agent-core/tools}/code-mode/cells.d.ts +1 -1
- package/dist/{tools → agent-core/tools}/code-mode/dispatch.d.ts +2 -4
- package/dist/{tools → agent-core/tools}/code-mode/dispatch.js +5 -4
- package/dist/{tools → agent-core/tools}/code-mode/engine.d.ts +1 -1
- package/dist/agent-core/tools/code-mode/engine.js +1 -0
- package/dist/{tools/code-mode.d.ts → agent-core/tools/code-mode/index.d.ts} +7 -7
- package/dist/{tools/code-mode.js → agent-core/tools/code-mode/index.js} +14 -15
- package/dist/{tools → agent-core/tools}/code-mode/state.d.ts +2 -13
- package/dist/agent-core/tools/code-mode/worker.d.ts +1 -0
- package/dist/agent-core/tools/contracts.d.ts +168 -0
- package/dist/agent-core/tools/contracts.js +1 -0
- package/dist/agent-core/tools/execution.d.ts +34 -0
- package/dist/agent-core/tools/execution.js +102 -0
- package/dist/agent-core/tools/local/apply-patch.d.ts +19 -0
- package/dist/{tools → agent-core/tools/local}/apply-patch.js +8 -2
- package/dist/{tools → agent-core/tools/local}/exec.d.ts +5 -17
- package/dist/{tools → agent-core/tools/local}/exec.js +4 -4
- package/dist/{tools → agent-core/tools/local}/read.d.ts +7 -15
- package/dist/{tools → agent-core/tools/local}/read.js +185 -2
- package/dist/{tools/local-registry.d.ts → agent-core/tools/local/registry.d.ts} +5 -5
- package/dist/agent-core/tools/local/registry.js +101 -0
- package/dist/{tools → agent-core/tools/local}/view-image.d.ts +4 -9
- package/dist/{tools → agent-core/tools/local}/view-image.js +2 -2
- package/dist/agent-core/tools/local/web-fetch.d.ts +4 -0
- package/dist/agent-core/tools/local/web-fetch.js +85 -0
- package/dist/agent-core/tools/local/web-search.d.ts +7 -0
- package/dist/agent-core/tools/local/web-search.js +34 -0
- package/dist/{tools/local-workspace-tools.js → agent-core/tools/local/workspace-tools.js} +1 -1
- package/dist/{sdk/mcp-catalog.d.ts → agent-core/tools/mcp/catalog.d.ts} +1 -2
- package/dist/{sdk/mcp-catalog.js → agent-core/tools/mcp/catalog.js} +1 -1
- package/dist/agent-core/tools/mcp/history.d.ts +4 -0
- package/dist/agent-core/tools/mcp/history.js +33 -0
- package/dist/{tools → agent-core/tools/mcp}/tool-search.d.ts +3 -3
- package/dist/{tools → agent-core/tools/mcp}/tool-search.js +4 -4
- package/dist/agent-core/tools/output-projection.d.ts +14 -0
- package/dist/agent-core/tools/output-projection.js +189 -0
- package/dist/{tools → agent-core/tools}/registry.d.ts +1 -1
- package/dist/agent-core/tools/registry.js +47 -0
- package/dist/{tools → agent-core/tools}/runtime-context.d.ts +8 -7
- package/dist/agent-core/tools/runtime-context.js +1 -0
- package/dist/{tools → agent-core/tools}/runtime.d.ts +1 -1
- package/dist/cli/codex-auth-file.d.ts +1 -1
- package/dist/cli/codex-auth-file.js +2 -2
- package/dist/cli/main.js +9 -9
- package/dist/index.d.ts +17 -15
- package/dist/index.js +8 -8
- package/dist/sandbox/linux/bubblewrap-sandbox-executor.d.ts +1 -1
- package/dist/sandbox/linux/bubblewrap-sandbox-executor.js +1 -1
- package/package.json +3 -3
- package/dist/host/contracts.d.ts +0 -21
- package/dist/sdk/agent.js +0 -2548
- package/dist/sdk/types.d.ts +0 -349
- package/dist/subagent/scheduler.d.ts +0 -206
- package/dist/tools/agent-cancel.d.ts +0 -7
- package/dist/tools/agent-message.d.ts +0 -7
- package/dist/tools/agent-wait.d.ts +0 -7
- package/dist/tools/apply-patch.d.ts +0 -32
- package/dist/tools/local-registry.js +0 -373
- package/dist/tools/registry.js +0 -47
- package/dist/tools/web-fetch.d.ts +0 -2
- package/dist/tools/web-fetch.js +0 -12
- package/dist/tools/web-search.d.ts +0 -2
- package/dist/tools/web-search.js +0 -15
- package/dist/{error.d.ts → agent-core/error.d.ts} +0 -0
- package/dist/{error.js → agent-core/error.js} +0 -0
- package/dist/{host → agent-core/host}/contracts.js +0 -0
- package/dist/{host → agent-core/host}/local-process-executor.d.ts +0 -0
- package/dist/{host → agent-core/host}/local-process-executor.js +0 -0
- package/dist/{host → agent-core/host}/network.d.ts +0 -0
- package/dist/{host → agent-core/host}/network.js +0 -0
- package/dist/{model → agent-core/model}/anthropic-messages.d.ts +0 -0
- package/dist/{model → agent-core/model}/anthropic-messages.js +0 -0
- package/dist/{model → agent-core/model}/anthropic-thinking.d.ts +0 -0
- package/dist/{model → agent-core/model}/anthropic-thinking.js +0 -0
- package/dist/{model → agent-core/model}/catalog-file.d.ts +0 -0
- package/dist/{model → agent-core/model}/catalog-file.js +0 -0
- package/dist/{model → agent-core/model}/configuration.d.ts +0 -0
- package/dist/{model → agent-core/model}/configuration.js +0 -0
- package/dist/{model → agent-core/model}/contracts.js +0 -0
- package/dist/{model → agent-core/model}/http.d.ts +0 -0
- package/dist/{model → agent-core/model}/http.js +0 -0
- package/dist/{model → agent-core/model}/openai-responses.d.ts +0 -0
- package/dist/{model → agent-core/model}/openai-responses.js +0 -0
- package/dist/{model → agent-core/model}/runtime-credential.d.ts +0 -0
- package/dist/{model → agent-core/model}/runtime-credential.js +0 -0
- package/dist/{model → agent-core/model}/sse.d.ts +0 -0
- package/dist/{model → agent-core/model}/sse.js +0 -0
- package/dist/{model → agent-core/model}/transport-test.d.ts +0 -0
- package/dist/{model → agent-core/model}/transport-test.js +0 -0
- package/dist/{prompts → agent-core/prompts}/compact.d.ts +0 -0
- package/dist/{prompts → agent-core/prompts}/compact.js +0 -0
- package/dist/{prompts → agent-core/prompts}/core.js +0 -0
- package/dist/{prompts → agent-core/prompts}/execution-budget.d.ts +0 -0
- package/dist/{prompts → agent-core/prompts}/execution-budget.js +0 -0
- package/dist/{prompts → agent-core/prompts}/index.js +0 -0
- package/dist/{prompts → agent-core/prompts}/modes.js +0 -0
- package/dist/{prompts → agent-core/prompts}/output.d.ts +0 -0
- package/dist/{prompts → agent-core/prompts}/output.js +0 -0
- package/dist/{prompts → agent-core/prompts}/resources.js +0 -0
- package/dist/{prompts → agent-core/prompts}/subagent.d.ts +0 -0
- package/dist/{prompts → agent-core/prompts}/subagent.js +0 -0
- package/dist/{prompts → agent-core/prompts}/title.d.ts +0 -0
- package/dist/{prompts → agent-core/prompts}/title.js +0 -0
- package/dist/{prompts → agent-core/prompts}/workflow.d.ts +0 -0
- package/dist/{prompts → agent-core/prompts}/workflow.js +0 -0
- package/dist/{runtime → agent-core/runtime}/async-queue.d.ts +0 -0
- package/dist/{runtime → agent-core/runtime}/async-queue.js +0 -0
- package/dist/{sdk/types.js → agent-core/runtime/context/contracts.js} +0 -0
- package/dist/{runtime → agent-core/runtime/context}/normalize.js +0 -0
- package/dist/{session/types.js → agent-core/runtime/contracts.js} +0 -0
- package/dist/{tools/code-mode/engine.js → agent-core/runtime/events.js} +0 -0
- package/dist/{runtime → agent-core/runtime}/execution-policy.d.ts +0 -0
- package/dist/{runtime → agent-core/runtime}/execution-policy.js +0 -0
- package/dist/{runtime → agent-core/runtime}/plan-output.d.ts +0 -0
- package/dist/{runtime → agent-core/runtime}/plan-output.js +0 -0
- package/dist/{runtime → agent-core/runtime}/rollout-budget.js +0 -0
- package/dist/{runtime → agent-core/runtime}/token-budget.d.ts +0 -0
- package/dist/{runtime → agent-core/runtime}/token-budget.js +0 -0
- package/dist/{sdk → agent-core/sdk}/agent.d.ts +0 -0
- package/dist/{tools/code-mode/worker.d.ts → agent-core/sdk/types.js} +0 -0
- package/dist/{session → agent-core/session}/catalog.js +0 -0
- package/dist/{session → agent-core/session}/context-gc-checkpoint.d.ts +0 -0
- package/dist/{session → agent-core/session}/context-gc-replacements.d.ts +0 -0
- package/dist/{session → agent-core/session}/context-gc-replacements.js +0 -0
- package/dist/{session → agent-core/session}/context-gc-subagent.d.ts +0 -0
- package/dist/{session → agent-core/session}/context-gc-subagent.js +0 -0
- package/dist/{session → agent-core/session}/transaction-recovery.d.ts +0 -0
- package/dist/{session → agent-core/session}/transaction-recovery.js +0 -0
- package/dist/{session → agent-core/session}/types.d.ts +0 -0
- package/dist/{tools/runtime-context.js → agent-core/session/types.js} +0 -0
- package/dist/{subagent → agent-core/subagent}/scheduler.js +0 -0
- package/dist/{subagent → agent-core/subagent}/session-controller.js +0 -0
- package/dist/{tools → agent-core/tools/agent}/todo-read.js +0 -0
- package/dist/{tools → agent-core/tools}/callers.d.ts +0 -0
- package/dist/{tools → agent-core/tools}/callers.js +0 -0
- package/dist/{tools → agent-core/tools}/code-mode/cells.js +1 -1
- /package/dist/{tools → agent-core/tools}/code-mode/quickjs-engine.d.ts +0 -0
- /package/dist/{tools → agent-core/tools}/code-mode/quickjs-engine.js +0 -0
- /package/dist/{tools → agent-core/tools}/code-mode/state.js +0 -0
- /package/dist/{tools → agent-core/tools}/code-mode/text-output.d.ts +0 -0
- /package/dist/{tools → agent-core/tools}/code-mode/text-output.js +0 -0
- /package/dist/{tools → agent-core/tools}/code-mode/worker.js +0 -0
- /package/dist/{tools → agent-core/tools}/execution-limits.d.ts +0 -0
- /package/dist/{tools → agent-core/tools}/execution-limits.js +0 -0
- /package/dist/{tools → agent-core/tools/local}/read-context.d.ts +0 -0
- /package/dist/{tools → agent-core/tools/local}/read-context.js +0 -0
- /package/dist/{tools/local-workspace-tools.d.ts → agent-core/tools/local/workspace-tools.d.ts} +0 -0
- /package/dist/{tools → agent-core/tools}/runtime.js +0 -0
- /package/dist/{tools → agent-core/tools}/scheduler.d.ts +0 -0
- /package/dist/{tools → agent-core/tools}/scheduler.js +0 -0
- /package/dist/{tools → agent-core/tools}/shared/path-resolver.d.ts +0 -0
- /package/dist/{tools → agent-core/tools}/shared/path-resolver.js +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import type { ModelMessage } from '
|
|
2
|
-
import { type ContextGcCheckpointCache, type ContextGcCheckpointPayload, type ContextGcReplacement } from '
|
|
3
|
-
import type { SessionRecord } from '
|
|
1
|
+
import type { ModelMessage } from '../../model/contracts.js';
|
|
2
|
+
import { type ContextGcCheckpointCache, type ContextGcCheckpointPayload, type ContextGcReplacement } from '../../session/context-gc-checkpoint.js';
|
|
3
|
+
import type { SessionRecord } from '../../session/jsonl-store.js';
|
|
4
4
|
export interface ContextProjectionEntry {
|
|
5
5
|
readonly record: SessionRecord;
|
|
6
6
|
readonly message: ModelMessage;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { anthropicThinkingBlock } from '
|
|
2
|
-
import {
|
|
3
|
-
import { TOOL_EXECUTION_LIMITS } from '
|
|
4
|
-
import { replaceReadContextItems } from '
|
|
1
|
+
import { anthropicThinkingBlock } from '../../model/anthropic-thinking.js';
|
|
2
|
+
import { contextGcRecordSourceHash, contextGcTargetKey, latestValidContextGcCheckpoint } from '../../session/context-gc-checkpoint.js';
|
|
3
|
+
import { TOOL_EXECUTION_LIMITS } from '../../tools/execution-limits.js';
|
|
4
|
+
import { replaceReadContextItems } from '../../tools/local/read-context.js';
|
|
5
5
|
const MAX_MODEL_CONTEXT_BYTES = 1024 * 1024;
|
|
6
6
|
export function buildContextProjection(records, workspace, checkpointCache) {
|
|
7
7
|
let activeModelId;
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { ClientToolDefinition, ModelMessage } from '../../model/contracts.js';
|
|
2
|
+
export declare function estimatedRequestTokens(system: string, messages: readonly ModelMessage[], tools: readonly ClientToolDefinition[], images?: readonly {
|
|
3
|
+
mimeType: string;
|
|
4
|
+
dataBase64: string;
|
|
5
|
+
}[]): number;
|
|
6
|
+
export declare function stableJson(value: unknown): string;
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { AGENT_EXECUTION_POLICY } from '../execution-policy.js';
|
|
2
|
+
import { countModelTokens } from '../token-budget.js';
|
|
3
|
+
export function estimatedRequestTokens(system, messages, tools, images) {
|
|
4
|
+
const transientImageCount = messages.reduce((total, message) => total + (message.images?.length ?? 0), images?.length ?? 0);
|
|
5
|
+
const textMessages = messages.map((message) => {
|
|
6
|
+
const textMessage = { ...message };
|
|
7
|
+
delete textMessage.images;
|
|
8
|
+
return textMessage;
|
|
9
|
+
});
|
|
10
|
+
return (countModelTokens(`${system}${stableJson(textMessages)}${stableJson(tools)}`) +
|
|
11
|
+
transientImageCount * AGENT_EXECUTION_POLICY.estimatedTokensPerImage);
|
|
12
|
+
}
|
|
13
|
+
export function stableJson(value) {
|
|
14
|
+
if (Array.isArray(value))
|
|
15
|
+
return `[${value.map(stableJson).join(',')}]`;
|
|
16
|
+
if (value !== null && typeof value === 'object')
|
|
17
|
+
return `{${Object.entries(value)
|
|
18
|
+
.sort(([left], [right]) => left.localeCompare(right))
|
|
19
|
+
.map(([key, entry]) => `${JSON.stringify(key)}:${stableJson(entry)}`)
|
|
20
|
+
.join(',')}}`;
|
|
21
|
+
return JSON.stringify(value) ?? 'undefined';
|
|
22
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { ModelMessage } from '../../model/contracts.js';
|
|
2
|
+
import { type JsonlSessionStore } from '../../session/jsonl-store.js';
|
|
3
|
+
import type { EnvironmentContextState } from './contracts.js';
|
|
4
|
+
import { type ContextProjection } from './projection.js';
|
|
5
|
+
export declare function restoreMessages(store: JsonlSessionStore, sessionId: string, records: readonly import('../../session/jsonl-store.js').SessionRecord[], options: {
|
|
6
|
+
includeImages: boolean;
|
|
7
|
+
currentTurnId?: string;
|
|
8
|
+
projection?: ContextProjection;
|
|
9
|
+
}): Promise<{
|
|
10
|
+
environmentState: EnvironmentContextState | undefined;
|
|
11
|
+
userMessages: string[];
|
|
12
|
+
messages: ModelMessage[];
|
|
13
|
+
ignoredImages: number;
|
|
14
|
+
currentTurnUserIndex: number | undefined;
|
|
15
|
+
}>;
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import { MarAgentError } from '../../error.js';
|
|
2
|
+
import { compactSummaryFromCheckpoint, replacementHistoryFromCheckpoint } from '../../session/jsonl-store.js';
|
|
3
|
+
import { compactedHistoryMessages, continuationMessage } from '../compaction/history.js';
|
|
4
|
+
import { environmentContextUpdate, restoreEnvironmentState } from './environment.js';
|
|
5
|
+
import { buildContextProjection } from './projection.js';
|
|
6
|
+
export async function restoreMessages(store, sessionId, records, options) {
|
|
7
|
+
const messages = [];
|
|
8
|
+
const modelProjection = new Map((options.projection ??
|
|
9
|
+
buildContextProjection(records, (await store.getSession(sessionId)).workspace)).entries.map((entry) => [entry.record.recordId, entry.message]));
|
|
10
|
+
let userMessages = [];
|
|
11
|
+
let ignoredImages = 0;
|
|
12
|
+
let currentTurnUserIndex;
|
|
13
|
+
let environmentState;
|
|
14
|
+
for (const record of records) {
|
|
15
|
+
const payload = record.payload;
|
|
16
|
+
const compactSummary = compactSummaryFromCheckpoint(record);
|
|
17
|
+
if (record.type === 'turn.user' && typeof payload.prompt === 'string') {
|
|
18
|
+
userMessages.push(payload.prompt);
|
|
19
|
+
let images = [];
|
|
20
|
+
if (options.includeImages)
|
|
21
|
+
try {
|
|
22
|
+
images = await store.readInputImages(sessionId, payload.images);
|
|
23
|
+
}
|
|
24
|
+
catch (error) {
|
|
25
|
+
if (!(error instanceof MarAgentError) || error.code !== 'MAR_AGENT_SESSION_CORRUPT')
|
|
26
|
+
throw error;
|
|
27
|
+
ignoredImages += Array.isArray(payload.images) ? payload.images.length : 1;
|
|
28
|
+
}
|
|
29
|
+
if (record.turnId === options.currentTurnId && currentTurnUserIndex === undefined)
|
|
30
|
+
currentTurnUserIndex = messages.length;
|
|
31
|
+
messages.push({
|
|
32
|
+
role: 'user',
|
|
33
|
+
content: payload.prompt,
|
|
34
|
+
...(images.length ? { images } : {})
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
else if ((record.type === 'message.completed' || record.type === 'plan.completed') &&
|
|
38
|
+
typeof payload.text === 'string')
|
|
39
|
+
messages.push({ role: 'assistant', content: payload.text });
|
|
40
|
+
else if (compactSummary !== undefined) {
|
|
41
|
+
environmentState = restoreEnvironmentState({ version: 1, state: payload.environment });
|
|
42
|
+
if (environmentState)
|
|
43
|
+
messages.push(environmentContextUpdate(environmentState));
|
|
44
|
+
const history = replacementHistoryFromCheckpoint(record);
|
|
45
|
+
userMessages =
|
|
46
|
+
history
|
|
47
|
+
?.filter((message) => message.kind === 'user_input')
|
|
48
|
+
.map((message) => message.content) ?? [];
|
|
49
|
+
messages.push(...(history
|
|
50
|
+
? compactedHistoryMessages(history)
|
|
51
|
+
: [{ role: 'user', content: continuationMessage(compactSummary) }]));
|
|
52
|
+
}
|
|
53
|
+
else if (record.type === 'context.environment') {
|
|
54
|
+
const current = restoreEnvironmentState(payload);
|
|
55
|
+
if (current) {
|
|
56
|
+
const message = environmentContextUpdate(current, environmentState);
|
|
57
|
+
if (message)
|
|
58
|
+
messages.push(message);
|
|
59
|
+
environmentState = current;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
else if (record.type === 'model.context') {
|
|
63
|
+
const message = modelProjection.get(record.recordId);
|
|
64
|
+
if (message)
|
|
65
|
+
messages.push(message);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
const completedToolCalls = new Set(messages.filter((message) => message.role === 'tool').map((message) => message.callId));
|
|
69
|
+
return {
|
|
70
|
+
environmentState,
|
|
71
|
+
userMessages,
|
|
72
|
+
messages: messages.filter((message) => {
|
|
73
|
+
if (message.role === 'tool_call')
|
|
74
|
+
return completedToolCalls.has(message.callId);
|
|
75
|
+
if (message.role !== 'provider' || message.provider !== 'OPENAI_RESPONSES')
|
|
76
|
+
return true;
|
|
77
|
+
const item = message.item;
|
|
78
|
+
if (item.type !== 'function_call' && item.type !== 'custom_tool_call')
|
|
79
|
+
return true;
|
|
80
|
+
return typeof item.call_id !== 'string' || completedToolCalls.has(item.call_id);
|
|
81
|
+
}),
|
|
82
|
+
ignoredImages,
|
|
83
|
+
currentTurnUserIndex
|
|
84
|
+
};
|
|
85
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { type MarAgentReasoningEffort } from '../../model/configuration.js';
|
|
2
|
+
import type { ModelMessage } from '../../model/contracts.js';
|
|
3
|
+
export interface AuthoritativeModelUsage {
|
|
4
|
+
readonly contextInputTokens: number;
|
|
5
|
+
readonly outputTokens: number | undefined;
|
|
6
|
+
readonly historyMessages?: readonly ModelMessage[];
|
|
7
|
+
readonly appendedMessages?: readonly ModelMessage[];
|
|
8
|
+
}
|
|
9
|
+
export declare function latestModelUsage(records: readonly import('../../session/jsonl-store.js').SessionRecord[], selectedModelId: string): AuthoritativeModelUsage | undefined;
|
|
10
|
+
export declare function reasoningEffortBaseline(records: readonly import('../../session/jsonl-store.js').SessionRecord[], modelId: string): MarAgentReasoningEffort | undefined;
|
|
11
|
+
export declare function lastConfigurationEffort(messages: readonly ModelMessage[], modelId: string): MarAgentReasoningEffort | undefined;
|
|
12
|
+
export declare function shouldUseNativeCompaction(input: {
|
|
13
|
+
readonly estimatedRequestTokens: number;
|
|
14
|
+
readonly contextWindowTokens: number;
|
|
15
|
+
readonly latestUsage: AuthoritativeModelUsage | undefined;
|
|
16
|
+
readonly historyMessages: readonly ModelMessage[];
|
|
17
|
+
readonly appendedMessages: readonly ModelMessage[];
|
|
18
|
+
}): boolean;
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
import { isDeepStrictEqual } from 'node:util';
|
|
2
|
+
import { marAgentReasoningEffortSchema } from '../../model/configuration.js';
|
|
3
|
+
import { compactSummaryFromCheckpoint } from '../../session/jsonl-store.js';
|
|
4
|
+
import { countModelTokens } from '../token-budget.js';
|
|
5
|
+
import { stableJson } from './request-budget.js';
|
|
6
|
+
export function latestModelUsage(records, selectedModelId) {
|
|
7
|
+
let usage;
|
|
8
|
+
const toolCallIds = new Set();
|
|
9
|
+
// readContext starts at compact.completed, whose execution header is before the boundary.
|
|
10
|
+
let activeModelId = selectedModelId;
|
|
11
|
+
for (const record of records) {
|
|
12
|
+
const payload = record.payload;
|
|
13
|
+
if (compactSummaryFromCheckpoint(record) !== undefined) {
|
|
14
|
+
usage = undefined;
|
|
15
|
+
toolCallIds.clear();
|
|
16
|
+
activeModelId = modelIdFromPayload(payload);
|
|
17
|
+
continue;
|
|
18
|
+
}
|
|
19
|
+
if (record.type === 'execution.header') {
|
|
20
|
+
activeModelId = modelIdFromPayload(payload);
|
|
21
|
+
usage = undefined;
|
|
22
|
+
toolCallIds.clear();
|
|
23
|
+
continue;
|
|
24
|
+
}
|
|
25
|
+
if (record.type === 'model.context' && payload.role === 'tool_call') {
|
|
26
|
+
if (typeof payload.callId === 'string' && payload.callId.length > 0)
|
|
27
|
+
toolCallIds.add(payload.callId);
|
|
28
|
+
else
|
|
29
|
+
usage = undefined;
|
|
30
|
+
}
|
|
31
|
+
if (usage !== undefined) {
|
|
32
|
+
if (record.type === 'model.context') {
|
|
33
|
+
const role = payload.role;
|
|
34
|
+
if (role === 'tool') {
|
|
35
|
+
if (typeof payload.callId !== 'string' || !toolCallIds.has(payload.callId))
|
|
36
|
+
usage = undefined;
|
|
37
|
+
else
|
|
38
|
+
usage = {
|
|
39
|
+
...usage,
|
|
40
|
+
appendedMessages: [
|
|
41
|
+
...(usage.appendedMessages ?? []),
|
|
42
|
+
payload
|
|
43
|
+
]
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
else if (role !== 'tool_call' && role !== 'assistant' && role !== 'provider')
|
|
47
|
+
usage = undefined;
|
|
48
|
+
}
|
|
49
|
+
else if (invalidatesUsageCalibration(record.type, payload.type))
|
|
50
|
+
usage = undefined;
|
|
51
|
+
}
|
|
52
|
+
if (payload.type === 'usage.updated' && activeModelId === selectedModelId) {
|
|
53
|
+
const value = payload.contextInputTokens ?? payload.inputTokens;
|
|
54
|
+
if (typeof value === 'number' && Number.isSafeInteger(value) && value >= 0)
|
|
55
|
+
usage = {
|
|
56
|
+
contextInputTokens: value,
|
|
57
|
+
outputTokens: typeof payload.outputTokens === 'number' &&
|
|
58
|
+
Number.isSafeInteger(payload.outputTokens) &&
|
|
59
|
+
payload.outputTokens >= 0
|
|
60
|
+
? payload.outputTokens
|
|
61
|
+
: undefined
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
return usage;
|
|
66
|
+
}
|
|
67
|
+
export function reasoningEffortBaseline(records, modelId) {
|
|
68
|
+
let baseline;
|
|
69
|
+
for (let index = records.length - 1; index >= 0; index--) {
|
|
70
|
+
const record = records[index];
|
|
71
|
+
if (compactSummaryFromCheckpoint(record) !== undefined)
|
|
72
|
+
break;
|
|
73
|
+
if (record.type !== 'execution.header')
|
|
74
|
+
continue;
|
|
75
|
+
const payload = record.payload;
|
|
76
|
+
if (payload.modelId !== modelId)
|
|
77
|
+
break;
|
|
78
|
+
const effort = marAgentReasoningEffortSchema.safeParse(payload.reasoningEffort);
|
|
79
|
+
if (effort.success)
|
|
80
|
+
baseline = effort.data;
|
|
81
|
+
}
|
|
82
|
+
return baseline;
|
|
83
|
+
}
|
|
84
|
+
export function lastConfigurationEffort(messages, modelId) {
|
|
85
|
+
for (let index = messages.length - 1; index >= 0; index--) {
|
|
86
|
+
const message = messages[index];
|
|
87
|
+
if (message.role !== 'provider' ||
|
|
88
|
+
message.provider !== 'OPENAI_RESPONSES' ||
|
|
89
|
+
message.providerModelId !== modelId ||
|
|
90
|
+
message.item?.type !== 'configuration_update')
|
|
91
|
+
continue;
|
|
92
|
+
const reasoning = message.item.reasoning;
|
|
93
|
+
const effort = marAgentReasoningEffortSchema.safeParse(reasoning?.effort);
|
|
94
|
+
if (effort.success)
|
|
95
|
+
return effort.data;
|
|
96
|
+
}
|
|
97
|
+
return undefined;
|
|
98
|
+
}
|
|
99
|
+
export function shouldUseNativeCompaction(input) {
|
|
100
|
+
if (input.estimatedRequestTokens <= input.contextWindowTokens)
|
|
101
|
+
return true;
|
|
102
|
+
if (input.latestUsage === undefined || input.latestUsage.outputTokens === undefined)
|
|
103
|
+
return false;
|
|
104
|
+
const historyDelta = appendOnlyUsageDelta(input.latestUsage, input.historyMessages);
|
|
105
|
+
if (historyDelta === undefined)
|
|
106
|
+
return false;
|
|
107
|
+
const appendedTokens = countModelTokens(stableJson([...historyDelta, ...input.appendedMessages]));
|
|
108
|
+
return (input.latestUsage.contextInputTokens + input.latestUsage.outputTokens + appendedTokens <=
|
|
109
|
+
input.contextWindowTokens);
|
|
110
|
+
}
|
|
111
|
+
function appendOnlyUsageDelta(usage, historyMessages) {
|
|
112
|
+
if (usage.historyMessages === undefined)
|
|
113
|
+
return usage.appendedMessages ?? [];
|
|
114
|
+
if (historyMessages.length < usage.historyMessages.length)
|
|
115
|
+
return undefined;
|
|
116
|
+
for (let index = 0; index < usage.historyMessages.length; index++)
|
|
117
|
+
if (!isDeepStrictEqual(usage.historyMessages[index], historyMessages[index]))
|
|
118
|
+
return undefined;
|
|
119
|
+
const appended = historyMessages.slice(usage.historyMessages.length);
|
|
120
|
+
const toolCallIds = new Set(usage.historyMessages
|
|
121
|
+
.filter((message) => message.role === 'tool_call')
|
|
122
|
+
.map((message) => message.callId));
|
|
123
|
+
return appended.every((message) => (message.role === 'tool' && toolCallIds.has(message.callId)) ||
|
|
124
|
+
(message.role === 'user' && message.contextKind === 'environment'))
|
|
125
|
+
? appended
|
|
126
|
+
: undefined;
|
|
127
|
+
}
|
|
128
|
+
function invalidatesUsageCalibration(recordType, payloadType) {
|
|
129
|
+
if (recordType === 'turn.user' ||
|
|
130
|
+
recordType === 'context.environment' ||
|
|
131
|
+
recordType === 'context.gc.completed')
|
|
132
|
+
return true;
|
|
133
|
+
return payloadType === 'message.completed';
|
|
134
|
+
}
|
|
135
|
+
function modelIdFromPayload(payload, key = 'modelId') {
|
|
136
|
+
const value = payload[key];
|
|
137
|
+
return typeof value === 'string' && value.length > 0 ? value : undefined;
|
|
138
|
+
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import type { ModelMessage } from '../../model/contracts.js';
|
|
2
|
+
export interface ContextualWorldState {
|
|
3
|
+
generation: string | undefined;
|
|
4
|
+
initialized: boolean;
|
|
5
|
+
instructionSnapshot: string | undefined;
|
|
6
|
+
resourceSnapshot: string | undefined;
|
|
7
|
+
mcpSnapshot?: string | undefined;
|
|
8
|
+
entries: Array<{
|
|
9
|
+
index: number;
|
|
10
|
+
kind: 'instructions' | 'resources' | 'mcp';
|
|
11
|
+
content: string;
|
|
12
|
+
}>;
|
|
13
|
+
}
|
|
14
|
+
export declare function insertContextualWorldState(messages: readonly ModelMessage[], entries: readonly {
|
|
15
|
+
index: number;
|
|
16
|
+
kind: 'instructions' | 'resources' | 'mcp';
|
|
17
|
+
content: string;
|
|
18
|
+
}[]): ModelMessage[];
|
|
19
|
+
export declare function latestContextualWorldStateGeneration(records: readonly import('../../session/jsonl-store.js').SessionRecord[]): string | undefined;
|
|
20
|
+
export declare function parsePersistedContextualWorldState(payload: unknown): ContextualWorldState | undefined;
|
|
21
|
+
export declare function persistContextualWorldState(store: import('../../session/jsonl-store.js').JsonlSessionStore, sessionId: string, state: ContextualWorldState): Promise<void>;
|
|
22
|
+
export declare function compactHistoryMayContainRetainedResources(records: readonly import('../../session/jsonl-store.js').SessionRecord[]): boolean;
|
|
23
|
+
export declare function updateContextualWorldState(state: ContextualWorldState, index: number, current: {
|
|
24
|
+
instructionSnapshot: string | undefined;
|
|
25
|
+
instructionContent: string | undefined;
|
|
26
|
+
resourceSnapshot: string | undefined;
|
|
27
|
+
previousMayContainResources?: boolean;
|
|
28
|
+
}): ContextualWorldState;
|
|
29
|
+
export declare function resetContextualWorldState(generation: string | undefined, index: number, current: {
|
|
30
|
+
instructionSnapshot: string | undefined;
|
|
31
|
+
instructionContent: string | undefined;
|
|
32
|
+
resourceSnapshot: string | undefined;
|
|
33
|
+
previousMayContainResources?: boolean;
|
|
34
|
+
}): ContextualWorldState;
|
|
35
|
+
export declare function contextualInstructionInsertIndex(messages: readonly ModelMessage[]): number;
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
import { retainedSessionResourcesUpdate } from '../../prompts/resources.js';
|
|
2
|
+
import { compactSummaryFromCheckpoint } from '../../session/jsonl-store.js';
|
|
3
|
+
export function insertContextualWorldState(messages, entries) {
|
|
4
|
+
const result = [...messages];
|
|
5
|
+
let offset = 0;
|
|
6
|
+
for (const entry of entries) {
|
|
7
|
+
const insertionIndex = Math.max(0, Math.min(entry.index + offset, result.length));
|
|
8
|
+
result.splice(insertionIndex, 0, { role: 'user', content: entry.content });
|
|
9
|
+
offset++;
|
|
10
|
+
}
|
|
11
|
+
return result;
|
|
12
|
+
}
|
|
13
|
+
export function latestContextualWorldStateGeneration(records) {
|
|
14
|
+
let generation;
|
|
15
|
+
for (const record of records)
|
|
16
|
+
if (record.type === 'context.gc.completed' ||
|
|
17
|
+
compactSummaryFromCheckpoint(record) !== undefined)
|
|
18
|
+
generation = record.recordId;
|
|
19
|
+
return generation;
|
|
20
|
+
}
|
|
21
|
+
const MAX_CONTEXTUAL_WORLD_STATE_ENTRIES = 1_024;
|
|
22
|
+
const MAX_CONTEXTUAL_WORLD_STATE_CONTENT_BYTES = 8 * 1024 * 1024;
|
|
23
|
+
export function parsePersistedContextualWorldState(payload) {
|
|
24
|
+
if (payload === null || typeof payload !== 'object' || Array.isArray(payload))
|
|
25
|
+
return undefined;
|
|
26
|
+
const record = payload;
|
|
27
|
+
if (record.version !== 1)
|
|
28
|
+
return undefined;
|
|
29
|
+
const generation = record.generation === null
|
|
30
|
+
? undefined
|
|
31
|
+
: typeof record.generation === 'string' && record.generation.length <= 128
|
|
32
|
+
? record.generation
|
|
33
|
+
: null;
|
|
34
|
+
if (generation === null)
|
|
35
|
+
return undefined;
|
|
36
|
+
const instructionSnapshot = nullableWorldStateString(record.instructionSnapshot);
|
|
37
|
+
const resourceSnapshot = nullableWorldStateString(record.resourceSnapshot);
|
|
38
|
+
if (instructionSnapshot === null || resourceSnapshot === null || !Array.isArray(record.entries))
|
|
39
|
+
return undefined;
|
|
40
|
+
if (record.entries.length > MAX_CONTEXTUAL_WORLD_STATE_ENTRIES)
|
|
41
|
+
return undefined;
|
|
42
|
+
const entries = [];
|
|
43
|
+
let contentBytes = 0;
|
|
44
|
+
for (const value of record.entries) {
|
|
45
|
+
if (value === null || typeof value !== 'object' || Array.isArray(value))
|
|
46
|
+
return undefined;
|
|
47
|
+
const entry = value;
|
|
48
|
+
if (!Number.isSafeInteger(entry.index) ||
|
|
49
|
+
entry.index < 0 ||
|
|
50
|
+
(entry.kind !== 'instructions' && entry.kind !== 'resources' && entry.kind !== 'mcp') ||
|
|
51
|
+
typeof entry.content !== 'string' ||
|
|
52
|
+
entry.content.length === 0)
|
|
53
|
+
return undefined;
|
|
54
|
+
contentBytes += Buffer.byteLength(entry.content);
|
|
55
|
+
if (contentBytes > MAX_CONTEXTUAL_WORLD_STATE_CONTENT_BYTES)
|
|
56
|
+
return undefined;
|
|
57
|
+
entries.push({
|
|
58
|
+
index: entry.index,
|
|
59
|
+
kind: entry.kind,
|
|
60
|
+
content: entry.content
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
return {
|
|
64
|
+
generation,
|
|
65
|
+
initialized: true,
|
|
66
|
+
instructionSnapshot,
|
|
67
|
+
resourceSnapshot,
|
|
68
|
+
mcpSnapshot: typeof record.mcpSnapshot === 'string' ? record.mcpSnapshot : undefined,
|
|
69
|
+
entries
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
function nullableWorldStateString(value) {
|
|
73
|
+
if (value === null)
|
|
74
|
+
return undefined;
|
|
75
|
+
return typeof value === 'string' &&
|
|
76
|
+
Buffer.byteLength(value) <= MAX_CONTEXTUAL_WORLD_STATE_CONTENT_BYTES
|
|
77
|
+
? value
|
|
78
|
+
: null;
|
|
79
|
+
}
|
|
80
|
+
export async function persistContextualWorldState(store, sessionId, state) {
|
|
81
|
+
await store.writeContextualWorldState(sessionId, {
|
|
82
|
+
version: 1,
|
|
83
|
+
generation: state.generation ?? null,
|
|
84
|
+
instructionSnapshot: state.instructionSnapshot ?? null,
|
|
85
|
+
resourceSnapshot: state.resourceSnapshot ?? null,
|
|
86
|
+
mcpSnapshot: state.mcpSnapshot ?? null,
|
|
87
|
+
entries: state.entries
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
export function compactHistoryMayContainRetainedResources(records) {
|
|
91
|
+
return records.some((record) => compactSummaryFromCheckpoint(record)?.includes('# Retained Session resources'));
|
|
92
|
+
}
|
|
93
|
+
export function updateContextualWorldState(state, index, current) {
|
|
94
|
+
const entries = [...state.entries];
|
|
95
|
+
if (!state.initialized || state.instructionSnapshot !== current.instructionSnapshot) {
|
|
96
|
+
if (current.instructionContent !== undefined)
|
|
97
|
+
entries.push({ index, kind: 'instructions', content: current.instructionContent });
|
|
98
|
+
}
|
|
99
|
+
const resourceContent = retainedSessionResourcesUpdate(current.resourceSnapshot, state.initialized ? state.resourceSnapshot : undefined, current.previousMayContainResources);
|
|
100
|
+
if (resourceContent !== undefined)
|
|
101
|
+
entries.push({ index, kind: 'resources', content: resourceContent });
|
|
102
|
+
return {
|
|
103
|
+
generation: state.generation,
|
|
104
|
+
mcpSnapshot: state.mcpSnapshot,
|
|
105
|
+
initialized: true,
|
|
106
|
+
instructionSnapshot: current.instructionSnapshot,
|
|
107
|
+
resourceSnapshot: current.resourceSnapshot,
|
|
108
|
+
entries
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
export function resetContextualWorldState(generation, index, current) {
|
|
112
|
+
const entries = [];
|
|
113
|
+
if (current.instructionContent !== undefined)
|
|
114
|
+
entries.push({ index, kind: 'instructions', content: current.instructionContent });
|
|
115
|
+
const resourceContent = retainedSessionResourcesUpdate(current.resourceSnapshot, undefined, current.previousMayContainResources);
|
|
116
|
+
if (resourceContent !== undefined)
|
|
117
|
+
entries.push({ index, kind: 'resources', content: resourceContent });
|
|
118
|
+
return {
|
|
119
|
+
generation,
|
|
120
|
+
initialized: true,
|
|
121
|
+
instructionSnapshot: current.instructionSnapshot,
|
|
122
|
+
resourceSnapshot: current.resourceSnapshot,
|
|
123
|
+
entries
|
|
124
|
+
};
|
|
125
|
+
}
|
|
126
|
+
export function contextualInstructionInsertIndex(messages) {
|
|
127
|
+
let index = messages.findLastIndex((message) => message.role === 'user' && message.contextKind !== 'environment');
|
|
128
|
+
if (index < 0)
|
|
129
|
+
return 0;
|
|
130
|
+
if (index > 0 && messages[index - 1]?.contextKind === 'environment')
|
|
131
|
+
index--;
|
|
132
|
+
return index;
|
|
133
|
+
}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import type { MarAgentReasoningEffort } from '../model/configuration.js';
|
|
2
|
+
/** @deprecated MAR Agent always executes tools directly through the Host. */
|
|
3
|
+
export type AccessMode = 'full-access';
|
|
4
|
+
export type ExecutionMode = 'run' | 'plan' | 'compact';
|
|
5
|
+
export interface RunInputImage {
|
|
6
|
+
name: string;
|
|
7
|
+
mimeType: string;
|
|
8
|
+
dataBase64: string;
|
|
9
|
+
}
|
|
10
|
+
export interface MarAgentImageMetadata {
|
|
11
|
+
name: string;
|
|
12
|
+
mimeType: string;
|
|
13
|
+
byteSize: number;
|
|
14
|
+
}
|
|
15
|
+
export interface RunInput {
|
|
16
|
+
prompt: string;
|
|
17
|
+
clientMessageId?: string;
|
|
18
|
+
modelId?: string;
|
|
19
|
+
reasoningEffort?: MarAgentReasoningEffort;
|
|
20
|
+
/** @deprecated Accepted for source compatibility and otherwise ignored. */
|
|
21
|
+
access?: AccessMode;
|
|
22
|
+
images?: readonly RunInputImage[];
|
|
23
|
+
}
|
|
24
|
+
export interface ExecutionResult {
|
|
25
|
+
executionId: string;
|
|
26
|
+
status: 'completed' | 'failed' | 'cancelled';
|
|
27
|
+
finalAnswer: string;
|
|
28
|
+
errorCode?: string;
|
|
29
|
+
errorMessage?: string;
|
|
30
|
+
}
|
|
31
|
+
export interface RolloutBudgetOptions {
|
|
32
|
+
limitTokens?: number;
|
|
33
|
+
conserveAtRemainingTokens?: number;
|
|
34
|
+
finalizeAtRemainingTokens?: number;
|
|
35
|
+
samplingTokenWeight?: number;
|
|
36
|
+
prefillTokenWeight?: number;
|
|
37
|
+
}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { ModelUsage } from '../model/contracts.js';
|
|
2
|
+
import type { MarAgentEvent } from './events.js';
|
|
3
|
+
/** Keep streaming deltas live-only; exec output has one durable copy in model context records. */
|
|
4
|
+
export declare function eventForPersistence(event: MarAgentEvent): MarAgentEvent | undefined;
|
|
5
|
+
export declare function publicModelUsage(usage: ModelUsage): Omit<ModelUsage, 'rolloutBudgetUnits'>;
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/** Keep streaming deltas live-only; exec output has one durable copy in model context records. */
|
|
2
|
+
export function eventForPersistence(event) {
|
|
3
|
+
if (event.type === 'message.delta' ||
|
|
4
|
+
event.type === 'context.compacting' ||
|
|
5
|
+
event.type === 'model.performance' ||
|
|
6
|
+
event.type === 'message.performance')
|
|
7
|
+
return undefined;
|
|
8
|
+
if (event.type !== 'tool.completed' || event.toolName !== 'exec' || !event.data)
|
|
9
|
+
return event;
|
|
10
|
+
const metadata = Object.fromEntries(Object.entries(event.data).filter(([key]) => key !== 'stdout' && key !== 'stderr'));
|
|
11
|
+
return { ...event, data: metadata };
|
|
12
|
+
}
|
|
13
|
+
export function publicModelUsage(usage) {
|
|
14
|
+
const { rolloutBudgetUnits, ...publicUsage } = usage;
|
|
15
|
+
void rolloutBudgetUnits;
|
|
16
|
+
return publicUsage;
|
|
17
|
+
}
|