@qwen-code/arena-agent 0.0.7-preview.0 → 0.0.8-dev.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 (53) hide show
  1. package/.env.example +15 -5
  2. package/README.md +127 -16
  3. package/dist/agent.d.ts +23 -4
  4. package/dist/agent.js +287 -95
  5. package/dist/agent.js.map +1 -1
  6. package/dist/anthropic.d.ts +16 -0
  7. package/dist/anthropic.js +391 -0
  8. package/dist/anthropic.js.map +1 -0
  9. package/dist/attachments.d.ts +29 -0
  10. package/dist/attachments.js +222 -0
  11. package/dist/attachments.js.map +1 -0
  12. package/dist/canonical-data.d.ts +2 -0
  13. package/dist/canonical-data.js +4 -0
  14. package/dist/canonical-data.js.map +1 -0
  15. package/dist/cli.js +55 -13
  16. package/dist/cli.js.map +1 -1
  17. package/dist/compaction.d.ts +16 -0
  18. package/dist/compaction.js +183 -0
  19. package/dist/compaction.js.map +1 -0
  20. package/dist/config.d.ts +6 -1
  21. package/dist/config.js +28 -2
  22. package/dist/config.js.map +1 -1
  23. package/dist/history.d.ts +3 -3
  24. package/dist/history.js +4 -4
  25. package/dist/history.js.map +1 -1
  26. package/dist/index.d.ts +9 -0
  27. package/dist/index.js +9 -0
  28. package/dist/index.js.map +1 -0
  29. package/dist/mock.js +24 -1
  30. package/dist/mock.js.map +1 -1
  31. package/dist/protocol.d.ts +5 -2
  32. package/dist/protocol.js +20 -1
  33. package/dist/protocol.js.map +1 -1
  34. package/dist/provider.d.ts +4 -0
  35. package/dist/provider.js +163 -4
  36. package/dist/provider.js.map +1 -1
  37. package/dist/repo.js +2 -5
  38. package/dist/repo.js.map +1 -1
  39. package/dist/server.js +9 -174
  40. package/dist/server.js.map +1 -1
  41. package/dist/spec.d.ts +7 -9
  42. package/dist/spec.js +128 -27
  43. package/dist/spec.js.map +1 -1
  44. package/dist/tools.d.ts +13 -3
  45. package/dist/tools.js +289 -29
  46. package/dist/tools.js.map +1 -1
  47. package/dist/tui.js +48 -12
  48. package/dist/tui.js.map +1 -1
  49. package/dist/types.d.ts +26 -9
  50. package/dist/web/app.js +2 -3
  51. package/dist/web/app.js.map +1 -1
  52. package/package.json +22 -8
  53. package/spec/tools.json +0 -418
package/dist/spec.js CHANGED
@@ -1,14 +1,14 @@
1
- import { readFileSync } from "node:fs";
2
1
  import { fileURLToPath } from "node:url";
3
2
  import path from "node:path";
4
- import { agentSystemPromptTemplate, repoAgentSystemPromptTemplate, } from "./prompts.js";
3
+ import { messageFixtureJson, modelSpecJson } from "./canonical-data.js";
4
+ import { repoAgentSystemPromptTemplate } from "./prompts.js";
5
5
  const packageRoot = path.resolve(path.dirname(fileURLToPath(import.meta.url)), "..");
6
- function readJson(relativePath) {
7
- return JSON.parse(readFileSync(path.join(packageRoot, relativePath), "utf8"));
8
- }
6
+ let cachedMessageFixture;
9
7
  let cachedModelSpec;
10
8
  const locationAbsentLine = "The user's approximate location was not provided by the client.";
11
9
  const clientContextPattern = /Today's date is [^\n]*\nThe user's approximate location (?:is:[^\n]*|was not provided by the client\.)/;
10
+ const workspaceGuidancePattern = /Many of the tools are for the workspace;[\s\S]*?Turn-end snapshots are best-effort capped around 128 MB or 10,000 files\.\n\n/;
11
+ const viewerGuidancePattern = /Note, when user views a workspace file[\s\S]*?tell them it will download rather than preview\.\n\n/;
12
12
  export const userInterruptionNotice = "<arena-system-message>\n" +
13
13
  "The previous assistant response was stopped by the user before it completed. " +
14
14
  "Treat that response as partial and do not assume any unfinished text or tool calls completed.\n" +
@@ -16,8 +16,12 @@ export const userInterruptionNotice = "<arena-system-message>\n" +
16
16
  export function projectRoot() {
17
17
  return packageRoot;
18
18
  }
19
+ export function messageFixture() {
20
+ cachedMessageFixture ??= JSON.parse(messageFixtureJson);
21
+ return cachedMessageFixture;
22
+ }
19
23
  export function modelSpec() {
20
- cachedModelSpec ??= readJson("spec/tools.json");
24
+ cachedModelSpec ??= JSON.parse(modelSpecJson);
21
25
  return cachedModelSpec;
22
26
  }
23
27
  // Single pass so substituted values are never rescanned.
@@ -70,11 +74,49 @@ function clientContextValues(context) {
70
74
  locationLine: locationLine(context.location),
71
75
  };
72
76
  }
73
- export function systemMessage(context) {
74
- return {
75
- role: "system",
76
- content: renderTemplate(agentSystemPromptTemplate, clientContextValues(context)),
77
- };
77
+ function applyWorkspaceContext(message, workspaceContext) {
78
+ if (!workspaceContext)
79
+ return message;
80
+ const root = path.resolve(workspaceContext.root);
81
+ const cwd = path.resolve(workspaceContext.cwd);
82
+ const displayedRoot = JSON.stringify(root);
83
+ const displayedCwd = JSON.stringify(cwd);
84
+ const workspaceGuidance = "Many of the tools operate on a shared workspace. The workspace root is " +
85
+ `${displayedRoot}, and the default working directory is ${displayedCwd}. ` +
86
+ "Bash commands run with the permissions provided by the current runtime environment. " +
87
+ "Files written to the workspace persist across messages in this conversation.\n\n" +
88
+ "Tool path arguments resolve relative to the default working directory unless " +
89
+ `an absolute path inside ${displayedRoot} is provided. Prefer relative paths, ` +
90
+ "and report these actual runtime paths rather than translating them to a fixed virtual path.\n\n";
91
+ const viewerGuidance = "The current client does not provide an in-app file viewer. When you create a " +
92
+ "deliverable, tell the user its workspace-relative path and, when useful, " +
93
+ "its resolved runtime path. Do not claim that the client opened the file, Finder, " +
94
+ "or another host application.\n\n";
95
+ if (!workspaceGuidancePattern.test(message.content)) {
96
+ throw new Error("canonical system prompt workspace guidance was not found");
97
+ }
98
+ message.content = message.content.replace(workspaceGuidancePattern, workspaceGuidance);
99
+ if (!workspaceContext.presentFile) {
100
+ if (!viewerGuidancePattern.test(message.content)) {
101
+ throw new Error("canonical system prompt viewer guidance was not found");
102
+ }
103
+ message.content = message.content.replace(viewerGuidancePattern, viewerGuidance);
104
+ }
105
+ return message;
106
+ }
107
+ export function systemMessage(context, workspaceContext) {
108
+ const fixture = messageFixture().messages;
109
+ const canonical = structuredClone(fixture[0]);
110
+ const currentDate = cleanContextValue(context.currentDate);
111
+ const timezone = cleanContextValue(context.timezone);
112
+ const dynamicContext = `Today's date is ${currentDate} in the user's local timezone (${timezone}). ` +
113
+ "Trust this date over any assumptions you may have from your training data; " +
114
+ 'if a user\'s question references a year or relative time ("this year", ' +
115
+ '"today", "the most recent X"), interpret it against today\'s date in the ' +
116
+ "user's local timezone.\n" +
117
+ locationLine(context.location);
118
+ canonical.content = canonical.content.replace(clientContextPattern, dynamicContext);
119
+ return applyWorkspaceContext(canonical, workspaceContext);
78
120
  }
79
121
  export function repoSystemMessage(context, repo) {
80
122
  return {
@@ -89,10 +131,7 @@ export function repoSystemMessage(context, repo) {
89
131
  }),
90
132
  };
91
133
  }
92
- /**
93
- * Inverse of `repoSystemMessage()`. Extracts without validating; callers feed
94
- * the result back through `repoSystemMessage()` + `isCanonicalSystemMessage()`.
95
- */
134
+ /** Extract the stable repo session context encoded in a repo-mode prompt. */
96
135
  export function repoContextFromSystemMessage(message) {
97
136
  if (message?.role !== "system" || typeof message.content !== "string") {
98
137
  return undefined;
@@ -109,38 +148,100 @@ export function repoContextFromSystemMessage(message) {
109
148
  baseBranch: branch[3],
110
149
  };
111
150
  }
112
- export function isCanonicalSystemMessage(message, expected) {
151
+ export function isCanonicalSystemMessage(message, expectedOrWorkspace) {
113
152
  if (message?.role !== "system" ||
114
153
  typeof message.content !== "string" ||
115
154
  !message.content) {
116
155
  return false;
117
156
  }
118
- const canonical = expected ?? systemMessage(defaultClientContext());
119
- return (canonical?.role === "system" &&
120
- message.content.replace(clientContextPattern, "<client-context>") ===
121
- canonical.content.replace(clientContextPattern, "<client-context>"));
157
+ const canonical = expectedOrWorkspace && "role" in expectedOrWorkspace
158
+ ? expectedOrWorkspace
159
+ : systemMessage(defaultClientContext(), expectedOrWorkspace);
160
+ return (message.content.replace(clientContextPattern, "<client-context>") ===
161
+ canonical.content.replace(clientContextPattern, "<client-context>"));
122
162
  }
123
- export function initialMessages(prompt, context = defaultClientContext(), repo) {
163
+ export function initialMessages(prompt, context = defaultClientContext(), workspaceContext, repo) {
124
164
  return [
125
- repo ? repoSystemMessage(context, repo) : systemMessage(context),
165
+ repo
166
+ ? repoSystemMessage(context, repo)
167
+ : systemMessage(context, workspaceContext),
126
168
  { role: "user", content: prompt },
127
169
  ];
128
170
  }
129
171
  export function interruptedUserMessage(promptOrMessage) {
130
172
  const content = typeof promptOrMessage === "string"
131
- ? [{ type: "text", text: promptOrMessage }]
173
+ ? [{ text: promptOrMessage }]
132
174
  : typeof promptOrMessage.content === "string"
133
- ? [{ type: "text", text: promptOrMessage.content }]
175
+ ? [{ text: promptOrMessage.content }]
134
176
  : structuredClone(promptOrMessage.content);
135
177
  return {
136
178
  role: "user",
137
179
  content: [
138
- { type: "text", text: userInterruptionNotice },
180
+ { text: userInterruptionNotice },
139
181
  ...content,
140
182
  ],
141
183
  };
142
184
  }
143
- export function toolDefinitions() {
144
- return structuredClone(modelSpec().tools);
185
+ function parameterProperties(definition) {
186
+ return definition.function.parameters.properties;
187
+ }
188
+ function parameterProperty(definition, name) {
189
+ const property = parameterProperties(definition)[name];
190
+ if (!property) {
191
+ throw new Error(`canonical tool parameter not found: ${definition.function.name}.${name}`);
192
+ }
193
+ return property;
194
+ }
195
+ export function toolDefinitions(workspaceContext, toolNames) {
196
+ const selected = toolNames ? new Set(toolNames) : undefined;
197
+ const definitions = structuredClone(modelSpec().tools).filter((definition) => selected
198
+ ? selected.has(definition.function.name)
199
+ : definition.function.name !== "generate_video");
200
+ if (!workspaceContext)
201
+ return definitions;
202
+ const root = path.resolve(workspaceContext.root);
203
+ const cwd = path.resolve(workspaceContext.cwd);
204
+ const displayedRoot = JSON.stringify(root);
205
+ const displayedCwd = JSON.stringify(cwd);
206
+ const absoluteExample = (relativePath) => JSON.stringify(path.join(cwd, relativePath));
207
+ const find = (name) => {
208
+ const definition = definitions.find((candidate) => candidate.function.name === name);
209
+ if (!definition)
210
+ throw new Error(`canonical tool definition not found: ${name}`);
211
+ return definition;
212
+ };
213
+ const bash = find("bash");
214
+ bash.function.description =
215
+ "Run a bash command in the current runtime environment, starting in the provided cwd. " +
216
+ `The workspace root is ${displayedRoot}, and cwd defaults to ${displayedCwd}. ` +
217
+ "Commands run without a controlling terminal and with stdin closed. " +
218
+ "Working directory changes, shell variables, aliases, functions, history, " +
219
+ "exported environment changes, and background process state are not preserved across calls.";
220
+ const bashCwd = parameterProperty(bash, "cwd");
221
+ bashCwd.description = `Working directory for this command. Defaults to ${displayedCwd}.`;
222
+ bashCwd.default = cwd;
223
+ const runtimePathDescription = (relativeExample, suffix = "") => `Path inside the workspace ${displayedRoot}: either an absolute path ` +
224
+ `(e.g. ${absoluteExample(relativeExample)}) or a path relative to the ` +
225
+ `default working directory ${displayedCwd} ` +
226
+ `(e.g. ${JSON.stringify(relativeExample)}).${suffix}`;
227
+ parameterProperty(find("edit_file"), "path").description =
228
+ runtimePathDescription("notes.txt");
229
+ parameterProperty(find("read_file"), "path").description =
230
+ runtimePathDescription("images/dog.jpg");
231
+ parameterProperty(find("write_file"), "path").description =
232
+ runtimePathDescription("src/app.js", " Parent directories are created as needed.");
233
+ const generateImage = find("generate_image");
234
+ parameterProperty(generateImage, "file_path").description =
235
+ runtimePathDescription("images/hero.jpg", " Parent directories are created as needed. Must end in .jpg, .jpeg, or .png.");
236
+ parameterProperty(generateImage, "images").description =
237
+ `Optional paths to existing images inside the workspace ${displayedRoot}, ` +
238
+ `given as absolute paths or paths relative to ${displayedCwd}. ` +
239
+ "Omit for text-to-image generation.";
240
+ parameterProperty(find("generate_speech"), "file_path").description =
241
+ runtimePathDescription("audio/narration.mp3", " Parent directories are created as needed. Must end in a supported audio " +
242
+ "extension (.mp3, .wav, .ogg, .opus, .flac, .aac, .m4a, .aiff).");
243
+ return workspaceContext.presentFile
244
+ ? definitions
245
+ : definitions.filter((definition) => definition.function.name !== "present_file");
145
246
  }
146
247
  //# sourceMappingURL=spec.js.map
package/dist/spec.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"spec.js","sourceRoot":"","sources":["../src/spec.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"spec.js","sourceRoot":"","sources":["../src/spec.ts"],"names":[],"mappings":"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"}
package/dist/tools.d.ts CHANGED
@@ -1,8 +1,10 @@
1
1
  import type { ArenaConfig } from "./config.js";
2
- import type { AskUserHandler, MultimodalUserMessage, ToolCall, ToolMessage } from "./types.js";
3
- interface ToolExecutorOptions {
2
+ import type { AskUserHandler, MultimodalUserMessage, ToolCall, ToolDefinition, ToolMessage, WorkspaceContext } from "./types.js";
3
+ export interface ToolExecutorOptions {
4
4
  askUserHandler?: AskUserHandler;
5
+ deferUserInput?: boolean;
5
6
  signal?: AbortSignal;
7
+ workspaceContext?: WorkspaceContext;
6
8
  }
7
9
  export declare class ToolExecutor {
8
10
  private readonly config;
@@ -11,12 +13,20 @@ export declare class ToolExecutor {
11
13
  private readonly validators;
12
14
  private readonly pendingVisualContent;
13
15
  private readonly askUserHandler?;
16
+ private readonly deferUserInput;
14
17
  private readonly signal?;
18
+ private readonly workspaceContext?;
15
19
  private readonly pageReader;
16
20
  private readonly ajv;
21
+ readonly askUserEnabled: boolean;
17
22
  constructor(config: ArenaConfig, options?: ToolExecutorOptions);
23
+ availableTools(toolNames?: readonly string[]): ToolDefinition[];
18
24
  execute(call: ToolCall): Promise<ToolMessage>;
19
25
  takeVisualMessage(toolCallIds: string[]): MultimodalUserMessage | undefined;
26
+ workspaceSnapshot(): Promise<Array<{
27
+ path: string;
28
+ content: string;
29
+ }>>;
20
30
  private dispatch;
21
31
  private confinedPath;
22
32
  private relativePath;
@@ -31,5 +41,5 @@ export declare class ToolExecutor {
31
41
  private presentFile;
32
42
  private generateImage;
33
43
  private generateSpeech;
44
+ private generateVideo;
34
45
  }
35
- export {};