@qwen-code/arena-agent 0.0.10-dev.8-test.0 → 0.0.10-test.0

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 (151) hide show
  1. package/.env.example +61 -10
  2. package/CHANGELOG.md +148 -17
  3. package/README.md +309 -46
  4. package/dist/agent.d.ts +20 -6
  5. package/dist/agent.js +353 -72
  6. package/dist/agent.js.map +1 -1
  7. package/dist/anthropic.d.ts +1 -1
  8. package/dist/anthropic.js +46 -57
  9. package/dist/anthropic.js.map +1 -1
  10. package/dist/arena-history.d.ts +12 -0
  11. package/dist/arena-history.js +119 -0
  12. package/dist/arena-history.js.map +1 -0
  13. package/dist/ask-user.js +44 -2
  14. package/dist/ask-user.js.map +1 -1
  15. package/dist/attachment-limits.d.ts +4 -0
  16. package/dist/attachment-limits.js +10 -0
  17. package/dist/attachment-limits.js.map +1 -0
  18. package/dist/attachments.d.ts +4 -2
  19. package/dist/attachments.js +9 -11
  20. package/dist/attachments.js.map +1 -1
  21. package/dist/brave-search.js +11 -7
  22. package/dist/brave-search.js.map +1 -1
  23. package/dist/canonical-data.d.ts +9 -0
  24. package/dist/canonical-data.js +12 -3
  25. package/dist/canonical-data.js.map +1 -1
  26. package/dist/cli.js +140 -40
  27. package/dist/cli.js.map +1 -1
  28. package/dist/code-tool-schema.d.ts +3 -0
  29. package/dist/code-tool-schema.js +92 -0
  30. package/dist/code-tool-schema.js.map +1 -0
  31. package/dist/code-tools.d.ts +2 -1
  32. package/dist/code-tools.js +103 -31
  33. package/dist/code-tools.js.map +1 -1
  34. package/dist/compaction-threshold.d.ts +3 -0
  35. package/dist/compaction-threshold.js +6 -0
  36. package/dist/compaction-threshold.js.map +1 -0
  37. package/dist/compaction.d.ts +24 -7
  38. package/dist/compaction.js +242 -66
  39. package/dist/compaction.js.map +1 -1
  40. package/dist/config.d.ts +17 -0
  41. package/dist/config.js +30 -5
  42. package/dist/config.js.map +1 -1
  43. package/dist/connector-errors.d.ts +16 -0
  44. package/dist/connector-errors.js +69 -0
  45. package/dist/connector-errors.js.map +1 -0
  46. package/dist/connector-files.d.ts +31 -0
  47. package/dist/connector-files.js +249 -0
  48. package/dist/connector-files.js.map +1 -0
  49. package/dist/connector-input.d.ts +10 -0
  50. package/dist/connector-input.js +79 -0
  51. package/dist/connector-input.js.map +1 -0
  52. package/dist/connector-mcp.d.ts +60 -0
  53. package/dist/connector-mcp.js +474 -0
  54. package/dist/connector-mcp.js.map +1 -0
  55. package/dist/connectors.d.ts +13 -0
  56. package/dist/connectors.js +69 -0
  57. package/dist/connectors.js.map +1 -0
  58. package/dist/fetch-page.js +2 -2
  59. package/dist/fetch-page.js.map +1 -1
  60. package/dist/history.d.ts +16 -5
  61. package/dist/history.js +73 -14
  62. package/dist/history.js.map +1 -1
  63. package/dist/image-choice.d.ts +23 -0
  64. package/dist/image-choice.js +190 -0
  65. package/dist/image-choice.js.map +1 -0
  66. package/dist/image-input-fallback.js +5 -0
  67. package/dist/image-input-fallback.js.map +1 -1
  68. package/dist/image-model.d.ts +6 -0
  69. package/dist/image-model.js +32 -0
  70. package/dist/image-model.js.map +1 -0
  71. package/dist/midturn-checkpoint-hook.d.ts +14 -1
  72. package/dist/midturn-checkpoint-hook.js.map +1 -1
  73. package/dist/mode.js +1 -1
  74. package/dist/mode.js.map +1 -1
  75. package/dist/model-capabilities.js +18 -8
  76. package/dist/model-capabilities.js.map +1 -1
  77. package/dist/model-router-media.js +55 -3
  78. package/dist/model-router-media.js.map +1 -1
  79. package/dist/model-stream.d.ts +16 -0
  80. package/dist/model-stream.js +129 -0
  81. package/dist/model-stream.js.map +1 -0
  82. package/dist/openai-responses.d.ts +2 -1
  83. package/dist/openai-responses.js +85 -88
  84. package/dist/openai-responses.js.map +1 -1
  85. package/dist/process-manager.js +9 -9
  86. package/dist/process-manager.js.map +1 -1
  87. package/dist/prompts.d.ts +0 -2
  88. package/dist/prompts.js +10 -60
  89. package/dist/prompts.js.map +1 -1
  90. package/dist/protocol.d.ts +5 -1
  91. package/dist/protocol.js +23 -2
  92. package/dist/protocol.js.map +1 -1
  93. package/dist/provider.d.ts +18 -0
  94. package/dist/provider.js +120 -51
  95. package/dist/provider.js.map +1 -1
  96. package/dist/repo.d.ts +1 -1
  97. package/dist/repo.js +26 -4
  98. package/dist/repo.js.map +1 -1
  99. package/dist/routify-web-fetch.js +2 -2
  100. package/dist/routify-web-fetch.js.map +1 -1
  101. package/dist/server.js +55 -27
  102. package/dist/server.js.map +1 -1
  103. package/dist/session-memory-prompts.d.ts +3 -1
  104. package/dist/session-memory-prompts.js +4 -2
  105. package/dist/session-memory-prompts.js.map +1 -1
  106. package/dist/side-query.js +5 -0
  107. package/dist/side-query.js.map +1 -1
  108. package/dist/spec.d.ts +5 -4
  109. package/dist/spec.js +31 -23
  110. package/dist/spec.js.map +1 -1
  111. package/dist/startup-config.d.ts +39 -0
  112. package/dist/startup-config.js +347 -0
  113. package/dist/startup-config.js.map +1 -0
  114. package/dist/startup-main-config.d.ts +63 -0
  115. package/dist/startup-main-config.js +94 -0
  116. package/dist/startup-main-config.js.map +1 -0
  117. package/dist/startup-tool-config.d.ts +8 -0
  118. package/dist/startup-tool-config.js +116 -0
  119. package/dist/startup-tool-config.js.map +1 -0
  120. package/dist/summary-compaction.d.ts +29 -0
  121. package/dist/{legacy-compaction.js → summary-compaction.js} +79 -14
  122. package/dist/summary-compaction.js.map +1 -0
  123. package/dist/tools.d.ts +5 -1
  124. package/dist/tools.js +195 -68
  125. package/dist/tools.js.map +1 -1
  126. package/dist/tui.js +26 -6
  127. package/dist/tui.js.map +1 -1
  128. package/dist/types.d.ts +21 -1
  129. package/dist/web/app.js +30 -5
  130. package/dist/web/app.js.map +1 -1
  131. package/dist/workspace.js +61 -13
  132. package/dist/workspace.js.map +1 -1
  133. package/docs/BINARY_DISTRIBUTION.md +44 -8
  134. package/docs/MODES_AND_RELEASES.md +79 -6
  135. package/docs/SDK.md +1 -0
  136. package/modes/code-arena/capture-provenance.json +57 -0
  137. package/modes/code-arena/full-stack/dependencies.lock.json +8670 -0
  138. package/modes/code-arena/full-stack/system-prompt.txt +1 -1
  139. package/modes/code-arena/full-stack/template/eslint.config.mjs +3 -4
  140. package/modes/code-arena/full-stack/template/postcss.config.mjs +2 -2
  141. package/modes/code-arena/full-stack/tools.json +186 -186
  142. package/modes/code-arena/html/system-prompt.txt +1 -1
  143. package/modes/code-arena/html/tools.json +123 -123
  144. package/modes/code-arena/react/dependencies.lock.json +2707 -0
  145. package/modes/code-arena/react/system-prompt.txt +4 -3
  146. package/modes/code-arena/react/tools.json +178 -184
  147. package/package.json +7 -2
  148. package/scripts/README.md +23 -4
  149. package/web/styles.css +22 -0
  150. package/dist/legacy-compaction.d.ts +0 -16
  151. package/dist/legacy-compaction.js.map +0 -1
@@ -0,0 +1,116 @@
1
+ import { tmpdir } from "node:os";
2
+ import path from "node:path";
3
+ import { arenaImageAlternativeModel, defaultArenaImageModels, defaultCodeArenaImageModels } from "./image-model.js";
4
+ function positiveInteger(value, fallback) {
5
+ if (!value)
6
+ return fallback;
7
+ const parsed = Number(value);
8
+ return Number.isInteger(parsed) && parsed > 0 ? parsed : fallback;
9
+ }
10
+ /**
11
+ * Settings read lazily by tools rather than configFromEnv. Match each tool's
12
+ * parsing rules without importing its executor or triggering tool work.
13
+ * Null means unset or unused by this headless entry point / harness mode.
14
+ * Endpoint defaults describe available services, not requests already made.
15
+ */
16
+ export function startupToolConfig(mode, env, hostEnv) {
17
+ const arena = mode === "arena";
18
+ const code = !arena;
19
+ const codeImage = code && mode !== "html";
20
+ const mediaGeneration = arena || codeImage;
21
+ const fullStack = mode === "full-stack";
22
+ const configuredMediaRetries = Number(env.ROUTIFY_MEDIA_MAX_RETRIES || env.CODE_HARNESS_TOOL_MAX_RETRIES || 5);
23
+ const mediaRetries = Number.isSafeInteger(configuredMediaRetries) && configuredMediaRetries >= 0
24
+ ? configuredMediaRetries : 5;
25
+ const configuredCacheTtl = Number(env.CODE_HARNESS_MEDIA_CACHE_TTL_MS);
26
+ const cacheTtl = Number.isFinite(configuredCacheTtl) && configuredCacheTtl >= 0
27
+ ? configuredCacheTtl : 24 * 60 * 60 * 1000;
28
+ const webFetchBytesText = env.CODE_HARNESS_WEB_FETCH_MAX_BYTES?.trim() || "";
29
+ const parsedWebFetchBytes = /^\d+$/.test(webFetchBytesText) ? Number(webFetchBytesText) : NaN;
30
+ const webFetchBytes = Number.isSafeInteger(parsedWebFetchBytes) && parsedWebFetchBytes > 0
31
+ ? parsedWebFetchBytes : 40_000;
32
+ const configuredBashTimeout = Number(env.CODE_HARNESS_BASH_TIMEOUT_SECONDS || 180);
33
+ const bashTimeout = Number.isFinite(configuredBashTimeout) && configuredBashTimeout > 0
34
+ ? configuredBashTimeout : 180;
35
+ const previewPort = positiveInteger(env.CODE_HARNESS_PREVIEW_PORT, 3000);
36
+ const sandboxId = env.E2B_SANDBOX_ID?.trim() || null;
37
+ const previewHostTemplate = env.ARENA_PREVIEW_HOST_TEMPLATE?.trim()
38
+ || (sandboxId ? `{port}-${sandboxId}.e2b.app` : null);
39
+ const checkpointHook = hostEnv.ARENA_MIDTURN_CHECKPOINT_HOOK?.trim();
40
+ const arenaImagePrimary = env.ARENA_IMAGE_MODEL || defaultArenaImageModels[0];
41
+ return {
42
+ ARENA_CONFIG_LOGGING: !["0", "false", "no"].includes((env.ARENA_CONFIG_LOGGING ?? "").toLowerCase()),
43
+ // CLI naming and checkpoint configuration are captured before workspace .env.
44
+ ARENA_CLI_NAME: hostEnv.ARENA_CLI_NAME === "code-harness" ? "code-harness" : "arena",
45
+ ARENA_MIDTURN_CHECKPOINT_HOOK: checkpointHook ? path.resolve(checkpointHook) : null,
46
+ HARBOR_REMOTE_COMMAND_BASE_URL: hostEnv.HARBOR_REMOTE_COMMAND_BASE_URL?.trim().replace(/\/+$/, "") || null,
47
+ HARBOR_REMOTE_COMMAND_API_KEY: hostEnv.HARBOR_REMOTE_COMMAND_API_KEY?.trim() || null,
48
+ ARENA_SESSION_WORKSPACE_MODE: null,
49
+ NO_COLOR: null,
50
+ ARENA_WEB_SEARCH_MODEL: arena ? env.ARENA_WEB_SEARCH_MODEL || "brave.llm-context" : null,
51
+ CODE_HARNESS_WEB_SEARCH_MODEL: code
52
+ ? env.CODE_HARNESS_WEB_SEARCH_MODEL || env.ARENA_WEB_SEARCH_MODEL || "brave.llm-context" : null,
53
+ ROUTIFY_API_KEY: env.ROUTIFY_API_KEY || null,
54
+ ROUTIFY_WEB_SEARCH_API_KEY: env.ROUTIFY_WEB_SEARCH_API_KEY?.trim() || env.ROUTIFY_API_KEY || null,
55
+ ROUTIFY_IMAGE_SEARCH_API_KEY: arena
56
+ ? env.ROUTIFY_IMAGE_SEARCH_API_KEY?.trim() || env.ROUTIFY_API_KEY || null : null,
57
+ ROUTIFY_GENERATE_IMAGE_API_KEY: mediaGeneration
58
+ ? env.ROUTIFY_GENERATE_IMAGE_API_KEY?.trim() || env.ROUTIFY_API_KEY?.trim() || null : null,
59
+ ROUTIFY_WEB_SEARCH_URL: env.ROUTIFY_WEB_SEARCH_URL?.trim()
60
+ || "https://routify-pub.alibaba-inc.com/protocol/compatible-mode/res/v1/llm/context",
61
+ ROUTIFY_IMAGE_SEARCH_URL: arena
62
+ ? env.ROUTIFY_IMAGE_SEARCH_URL?.trim()
63
+ || "https://routify-pub.alibaba-inc.com/protocol/brave/res/v1/images/search" : null,
64
+ CODE_HARNESS_ROUTIFY_WEB_FETCH_ENABLED: code
65
+ ? ["1", "true", "yes", "on"].includes(env.CODE_HARNESS_ROUTIFY_WEB_FETCH_ENABLED?.trim().toLowerCase() || "") : null,
66
+ CODE_HARNESS_WEB_FETCH_MAX_BYTES: code ? webFetchBytes : null,
67
+ // Arrays describe per-call random selection; startup must not sample it.
68
+ ARENA_IMAGE_MODEL: arena ? env.ARENA_IMAGE_MODEL || defaultArenaImageModels : null,
69
+ ARENA_IMAGE_ALTERNATIVE_MODEL: arena
70
+ ? arenaImageAlternativeModel(arenaImagePrimary, env) : null,
71
+ ARENA_IMAGE_SIZE: arena ? env.ARENA_IMAGE_SIZE || "1024*1024" : null,
72
+ CODE_HARNESS_IMAGE_MODEL: codeImage
73
+ ? env.CODE_HARNESS_IMAGE_MODEL || env.ARENA_IMAGE_MODEL || defaultCodeArenaImageModels : null,
74
+ CODE_HARNESS_IMAGE_SIZE: codeImage
75
+ ? env.CODE_HARNESS_IMAGE_SIZE || env.ARENA_IMAGE_SIZE || "1024*1024" : null,
76
+ // Remote input attachments use these limits in every mode.
77
+ ARENA_IMAGE_MAX_EDGE: positiveInteger(env.ARENA_IMAGE_MAX_EDGE, 1568),
78
+ ARENA_IMAGE_MAX_PATCHES: positiveInteger(env.ARENA_IMAGE_MAX_PATCHES, 1568),
79
+ ARENA_SPEECH_MODEL: arena ? env.ARENA_SPEECH_MODEL || "gemini-3.1-flash-tts-preview" : null,
80
+ // The default voice depends on the voice selected by each tool call.
81
+ ARENA_SPEECH_VOICE: arena ? env.ARENA_SPEECH_VOICE || null : null,
82
+ ROUTIFY_VERTEX_BASE_URL: mediaGeneration
83
+ ? (env.ROUTIFY_VERTEX_BASE_URL || "https://routify-pub.alibaba-inc.com/protocol/vertex/v1beta").replace(/\/+$/, "") : null,
84
+ ROUTIFY_OPENAI_BASE_URL: mediaGeneration
85
+ ? (env.ROUTIFY_OPENAI_BASE_URL || "https://routify-pub.alibaba-inc.com/protocol/openai/v1").replace(/\/+$/, "") : null,
86
+ ROUTIFY_MEDIA_MAX_RETRIES: mediaGeneration ? mediaRetries : null,
87
+ PEXELS_API_KEY: code ? env.PEXELS_API_KEY || null : null,
88
+ CODE_HARNESS_MEDIA_CACHE_TTL_MS: code ? cacheTtl : null,
89
+ CODE_HARNESS_MEDIA_CACHE_DIR: code
90
+ ? env.CODE_HARNESS_MEDIA_CACHE_DIR || path.join(tmpdir(), "code-harness", "fetch-media-cache-v1") : null,
91
+ ARENA_SOFFICE_PATH: arena ? env.ARENA_SOFFICE_PATH || "soffice" : null,
92
+ // The actual privilege gate also checks platform, workspace, Docker and uid.
93
+ ARENA_SANDBOX_PRIVILEGED_FILE_CREATION: arena ? env.ARENA_SANDBOX_PRIVILEGED_FILE_CREATION || null : null,
94
+ ARENA_PREVIEW_HOST_TEMPLATE: arena ? previewHostTemplate : null,
95
+ E2B_SANDBOX_ID: arena ? sandboxId : null,
96
+ CODE_HARNESS_APPLY_PATCH_TOOL: code
97
+ ? env.CODE_HARNESS_APPLY_PATCH_TOOL !== undefined
98
+ && !["0", "false", "no"].includes(env.CODE_HARNESS_APPLY_PATCH_TOOL.toLowerCase()) : null,
99
+ CODE_HARNESS_NPM_CLI_JS: code ? env.CODE_HARNESS_NPM_CLI_JS || null : null,
100
+ CODE_HARNESS_BASH_TIMEOUT_SECONDS: codeImage ? bashTimeout : null,
101
+ // Preserve non-finite Number results for the caller's invalid-value marker.
102
+ CODE_HARNESS_FULLSTACK_BUILD_TIMEOUT_MS: fullStack
103
+ ? Number(env.CODE_HARNESS_FULLSTACK_BUILD_TIMEOUT_MS || 300_000) : null,
104
+ CODE_HARNESS_PREVIEW_PORT: fullStack ? previewPort : null,
105
+ CODE_HARNESS_PREVIEW_URL: fullStack
106
+ ? env.CODE_HARNESS_PREVIEW_URL || `http://127.0.0.1:${previewPort}` : null,
107
+ // Both executors load the recording lazily; only the exit hook is eager.
108
+ CODE_HARNESS_REPLAY_RESPONSES: env.CODE_HARNESS_REPLAY_RESPONSES
109
+ ? path.resolve(env.CODE_HARNESS_REPLAY_RESPONSES) : null,
110
+ replayExitSummaryEnabled: Boolean(hostEnv.CODE_HARNESS_REPLAY_RESPONSES),
111
+ HTTP_PROXY: env.http_proxy ?? env.HTTP_PROXY ?? null,
112
+ HTTPS_PROXY: env.https_proxy ?? env.HTTPS_PROXY ?? null,
113
+ NO_PROXY: env.no_proxy ?? env.NO_PROXY ?? null,
114
+ };
115
+ }
116
+ //# sourceMappingURL=startup-tool-config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"startup-tool-config.js","sourceRoot":"","sources":["../src/startup-tool-config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ import type { Message, ModelClient, ModelUsage, ToolDefinition } from "./types.js";
2
+ export interface CompactionSettings {
3
+ contextWindow: number;
4
+ triggerRatio: number;
5
+ summaryMaxTokens: number;
6
+ imageTokenEstimate?: number;
7
+ compactionThresholdTokens?: number;
8
+ /** Shared runtime accounting, supplied by compaction.ts for both arenas. */
9
+ estimateTokens?: typeof estimateContextTokens;
10
+ estimateLocalTokens?: typeof estimateContextTokens;
11
+ allowMidturn?: boolean;
12
+ onBeforeCompaction?: (estimatedTokensBefore: number, thresholdTokens: number) => Promise<void>;
13
+ }
14
+ export interface CompactionResult {
15
+ compacted: boolean;
16
+ estimatedTokensBefore: number;
17
+ estimatedTokensAfter: number;
18
+ usage?: ModelUsage;
19
+ memory?: string;
20
+ /** Exclusive boundary in the input context, including its system prefix. */
21
+ coveredMessages?: number;
22
+ }
23
+ /** Keep the newest complete step, including all parallel results and images. */
24
+ export declare function latestCompleteStepStart(messages: readonly Message[]): number;
25
+ /** Omit accounting metadata and tool correlation IDs, including embedded signatures. */
26
+ export declare function contextTokenReplacer(this: Record<string, unknown>, key: string, value: unknown): unknown;
27
+ export declare function estimateContextTokens(messages: readonly Message[], tools: readonly ToolDefinition[], imageTokenEstimate?: number): number;
28
+ export declare function continuationSummaryBlock(summary: string): string;
29
+ export declare function compactMessagesIfNeeded(messages: Message[], tools: readonly ToolDefinition[], client: ModelClient, model: string, settings: CompactionSettings, signal?: AbortSignal): Promise<CompactionResult>;
@@ -1,3 +1,4 @@
1
+ import { assertCompleteTextResponse } from "./model-stream.js";
1
2
  const continuationPreamble = "Another language model started to solve this problem and produced a summary " +
2
3
  "of its thinking process. You also have access to the state of the tools that " +
3
4
  "were used by that language model. Use this to build on the work that has " +
@@ -44,6 +45,29 @@ function latestHumanUserIndex(messages) {
44
45
  }
45
46
  return -1;
46
47
  }
48
+ /** Keep the newest complete step, including all parallel results and images. */
49
+ export function latestCompleteStepStart(messages) {
50
+ const pending = new Set();
51
+ let start = -1;
52
+ for (let index = 1; index < messages.length; index++) {
53
+ const message = messages[index];
54
+ if (message.role === "assistant" || (message.role === "user" && !isVisualToolResult(message))) {
55
+ if (pending.size)
56
+ return -1;
57
+ start = index;
58
+ while (start > 1 && messages[start - 1]?.role === "user" && !isVisualToolResult(messages[start - 1]))
59
+ start--;
60
+ if (message.role === "assistant") {
61
+ for (const call of message.tool_calls ?? [])
62
+ pending.add(call.id);
63
+ }
64
+ }
65
+ else if (message.role === "tool" && !pending.delete(message.tool_call_id)) {
66
+ return -1;
67
+ }
68
+ }
69
+ return pending.size ? -1 : start;
70
+ }
47
71
  function addCharacterCounts(counts, value) {
48
72
  for (const character of value) {
49
73
  if (character.codePointAt(0) <= 0x7f)
@@ -52,9 +76,23 @@ function addCharacterCounts(counts, value) {
52
76
  counts.nonAscii += 1;
53
77
  }
54
78
  }
79
+ /** Omit accounting metadata and tool correlation IDs, including embedded signatures. */
80
+ export function contextTokenReplacer(key, value) {
81
+ if (key === "image" && typeof value === "string")
82
+ return "<image>";
83
+ if (key === "usage" && this.role === "assistant")
84
+ return undefined;
85
+ if (key === "tool_call_id" && this.role === "tool")
86
+ return undefined;
87
+ if (key === "id" && this.type === "function" && this.function)
88
+ return undefined;
89
+ if ((key === "id" || key === "call_id") &&
90
+ (this.type === "function_call" || this.type === "function_call_output"))
91
+ return undefined;
92
+ return value;
93
+ }
55
94
  function serializedContextTokens(messages, tools) {
56
95
  const counts = { ascii: 0, nonAscii: 0 };
57
- const replacer = (key, value) => key === "image" && typeof value === "string" ? "<image>" : value;
58
96
  addCharacterCounts(counts, '{"messages":[');
59
97
  for (let index = 0; index < messages.length; index += 1) {
60
98
  if (index)
@@ -66,10 +104,10 @@ function serializedContextTokens(messages, tools) {
66
104
  openai_response_items: message.openai_response_items,
67
105
  }
68
106
  : message;
69
- addCharacterCounts(counts, JSON.stringify(modelVisible, replacer));
107
+ addCharacterCounts(counts, JSON.stringify(modelVisible, contextTokenReplacer));
70
108
  }
71
109
  addCharacterCounts(counts, '],"tools":');
72
- addCharacterCounts(counts, JSON.stringify(tools, replacer));
110
+ addCharacterCounts(counts, JSON.stringify(tools, contextTokenReplacer));
73
111
  addCharacterCounts(counts, "}");
74
112
  return Math.ceil(counts.ascii / 4 + counts.nonAscii);
75
113
  }
@@ -144,20 +182,26 @@ async function generateSummary(client, model, sourceMessages, maxTokens, signal)
144
182
  };
145
183
  const content = [];
146
184
  let usage;
185
+ let finishReason;
147
186
  for await (const chunk of client.stream(request)) {
148
187
  if (chunk.usage)
149
188
  usage = chunk.usage;
189
+ if (chunk.choices?.[0]?.finish_reason)
190
+ finishReason = chunk.choices[0].finish_reason;
150
191
  const value = chunk.choices?.[0]?.delta?.content;
151
192
  if (value)
152
193
  content.push(String(value));
153
194
  }
195
+ assertCompleteTextResponse(finishReason);
154
196
  return { summary: safeSummary(content.join("")), usage };
155
197
  }
156
198
  export async function compactMessagesIfNeeded(messages, tools, client, model, settings, signal) {
157
199
  const imageTokens = settings.imageTokenEstimate ?? 2048;
158
- const before = estimateContextTokens(messages, tools, imageTokens);
159
- const threshold = Math.max(1, settings.contextWindow) *
160
- Math.min(1, Math.max(0, settings.triggerRatio));
200
+ const estimate = settings.estimateTokens ?? estimateContextTokens;
201
+ const estimateLocal = settings.estimateLocalTokens ?? estimateContextTokens;
202
+ const before = estimate(messages, tools, imageTokens);
203
+ const threshold = settings.compactionThresholdTokens ?? (Math.max(1, settings.contextWindow) *
204
+ Math.min(1, Math.max(0, settings.triggerRatio)));
161
205
  if (before < threshold) {
162
206
  return {
163
207
  compacted: false,
@@ -166,14 +210,21 @@ export async function compactMessagesIfNeeded(messages, tools, client, model, se
166
210
  };
167
211
  }
168
212
  const currentTurnStart = latestHumanUserIndex(messages);
169
- if (currentTurnStart <= 1) {
213
+ let boundary = currentTurnStart;
214
+ if (settings.allowMidturn && (boundary <= 1 ||
215
+ estimateLocal([messages[0], ...messages.slice(boundary)], tools, imageTokens) >= threshold)) {
216
+ boundary = latestCompleteStepStart(messages);
217
+ }
218
+ if (boundary <= 1) {
170
219
  return {
171
220
  compacted: false,
172
221
  estimatedTokensBefore: before,
173
222
  estimatedTokensAfter: before,
174
223
  };
175
224
  }
176
- const { summary, usage } = await generateSummary(client, model, messages.slice(1, currentTurnStart), Math.max(1, Math.floor(settings.summaryMaxTokens)), signal);
225
+ if (settings.onBeforeCompaction)
226
+ await settings.onBeforeCompaction(before, threshold);
227
+ const { summary, usage } = await generateSummary(client, model, messages.slice(1, boundary), Math.max(1, Math.floor(settings.summaryMaxTokens)), signal);
177
228
  if (!summary) {
178
229
  return {
179
230
  compacted: false,
@@ -182,8 +233,8 @@ export async function compactMessagesIfNeeded(messages, tools, client, model, se
182
233
  usage,
183
234
  };
184
235
  }
185
- const currentUser = messages[currentTurnStart];
186
- if (currentUser?.role !== "user") {
236
+ const firstRetained = messages[boundary];
237
+ if (!firstRetained || (firstRetained.role !== "user" && firstRetained.role !== "assistant")) {
187
238
  return {
188
239
  compacted: false,
189
240
  estimatedTokensBefore: before,
@@ -193,15 +244,29 @@ export async function compactMessagesIfNeeded(messages, tools, client, model, se
193
244
  }
194
245
  const compactedMessages = [
195
246
  messages[0],
196
- prependSummary(currentUser, continuationSummaryBlock(summary)),
197
- ...messages.slice(currentTurnStart + 1),
247
+ ...(firstRetained.role === "user"
248
+ ? [prependSummary(firstRetained, continuationSummaryBlock(summary)), ...messages.slice(boundary + 1)]
249
+ : [{ role: "user", content: [{ text: continuationSummaryBlock(summary) }] }, ...messages.slice(boundary)]),
198
250
  ];
251
+ if (settings.allowMidturn) {
252
+ // The retained requests used the old prefix. Raw history keeps their usage;
253
+ // the next request will establish a fresh baseline for this shorter context.
254
+ for (let index = 1; index < compactedMessages.length; index++) {
255
+ const message = compactedMessages[index];
256
+ if (message.role === "assistant") {
257
+ const { usage: _usage, ...rest } = message;
258
+ compactedMessages[index] = rest;
259
+ }
260
+ }
261
+ }
199
262
  messages.splice(0, messages.length, ...compactedMessages);
200
263
  return {
201
264
  compacted: true,
202
265
  estimatedTokensBefore: before,
203
- estimatedTokensAfter: estimateContextTokens(messages, tools, imageTokens),
266
+ estimatedTokensAfter: estimateLocal(messages, tools, imageTokens),
204
267
  usage,
268
+ memory: summary,
269
+ coveredMessages: boundary,
205
270
  };
206
271
  }
207
- //# sourceMappingURL=legacy-compaction.js.map
272
+ //# sourceMappingURL=summary-compaction.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"summary-compaction.js","sourceRoot":"","sources":["../src/summary-compaction.ts"],"names":[],"mappings":"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"}
package/dist/tools.d.ts CHANGED
@@ -1,7 +1,7 @@
1
1
  import { type ArenaConfig } from "./config.js";
2
2
  import { type ModelConnectionOptions } from "./provider.js";
3
3
  import type { CheckpointHookToolCall } from "./midturn-checkpoint-hook.js";
4
- import type { AskUserHandler, AskUserContext, MultimodalUserMessage, ModelClient, ToolCall, ToolDefinition, ToolMessage, WorkspaceContext } from "./types.js";
4
+ import type { AskUserHandler, AskUserContext, MultimodalUserMessage, ModelClient, ToolCall, ToolDefinition, ToolMessage, Message, WorkspaceContext } from "./types.js";
5
5
  interface ToolExecutorOptions {
6
6
  askUserHandler?: AskUserHandler;
7
7
  modelClient?: ModelClient;
@@ -21,6 +21,10 @@ export declare class ToolExecutor {
21
21
  get workspace(): string;
22
22
  get askUserEnabled(): boolean;
23
23
  availableTools(): ToolDefinition[];
24
+ historyCall(call: ToolCall): ToolCall;
25
+ takeInteractionBoundary(callId: string): boolean;
26
+ beginConnectorTurn(history?: readonly Message[]): Promise<void>;
27
+ closeConnectors(): Promise<void>;
24
28
  inspect(call: ToolCall): CheckpointHookToolCall;
25
29
  execute(call: ToolCall, context?: AskUserContext): Promise<ToolMessage>;
26
30
  takeVisualMessage(toolCallIds: string[]): MultimodalUserMessage | undefined;