@qwen-code/arena-agent 0.0.8-dev.5 → 0.0.9-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 (60) hide show
  1. package/.env.example +41 -15
  2. package/README.md +128 -29
  3. package/dist/agent.d.ts +8 -17
  4. package/dist/agent.js +60 -75
  5. package/dist/agent.js.map +1 -1
  6. package/dist/cli.js +12 -4
  7. package/dist/cli.js.map +1 -1
  8. package/dist/compaction.js +2 -1
  9. package/dist/compaction.js.map +1 -1
  10. package/dist/config.d.ts +11 -0
  11. package/dist/config.js +73 -9
  12. package/dist/config.js.map +1 -1
  13. package/dist/conversation-metrics.d.ts +61 -0
  14. package/dist/conversation-metrics.js +433 -0
  15. package/dist/conversation-metrics.js.map +1 -0
  16. package/dist/document-reader.js +9 -0
  17. package/dist/document-reader.js.map +1 -1
  18. package/dist/history.d.ts +31 -2
  19. package/dist/history.js +53 -3
  20. package/dist/history.js.map +1 -1
  21. package/dist/metrics.d.ts +61 -0
  22. package/dist/metrics.js +578 -0
  23. package/dist/metrics.js.map +1 -0
  24. package/dist/mock.js +153 -0
  25. package/dist/mock.js.map +1 -1
  26. package/dist/protocol.d.ts +2 -3
  27. package/dist/protocol.js +9 -5
  28. package/dist/protocol.js.map +1 -1
  29. package/dist/provider.js +22 -8
  30. package/dist/provider.js.map +1 -1
  31. package/dist/runtime-assets.d.ts +3 -0
  32. package/dist/runtime-assets.js +16 -0
  33. package/dist/runtime-assets.js.map +1 -0
  34. package/dist/sdk.d.ts +28 -1
  35. package/dist/sdk.js +38 -0
  36. package/dist/sdk.js.map +1 -1
  37. package/dist/server.js +486 -36
  38. package/dist/server.js.map +1 -1
  39. package/dist/side-query.d.ts +31 -0
  40. package/dist/side-query.js +138 -0
  41. package/dist/side-query.js.map +1 -0
  42. package/dist/spec.d.ts +1 -1
  43. package/dist/spec.js +6 -4
  44. package/dist/spec.js.map +1 -1
  45. package/dist/tools.d.ts +3 -8
  46. package/dist/tools.js +149 -200
  47. package/dist/tools.js.map +1 -1
  48. package/dist/tui.js +4 -3
  49. package/dist/tui.js.map +1 -1
  50. package/dist/types.d.ts +155 -5
  51. package/dist/web/app.d.ts +1 -0
  52. package/dist/web/app.js +333 -10
  53. package/dist/web/app.js.map +1 -1
  54. package/docs/SDK.md +42 -0
  55. package/package.json +10 -20
  56. package/web/index.html +25 -0
  57. package/web/styles.css +109 -3
  58. package/dist/index.d.ts +0 -9
  59. package/dist/index.js +0 -9
  60. package/dist/index.js.map +0 -1
package/dist/history.d.ts CHANGED
@@ -1,5 +1,34 @@
1
- import type { Message } from "./types.js";
1
+ import type { ArenaConfig } from "./config.js";
2
+ import type { Message, ReasoningEffort, SessionMetrics } from "./types.js";
3
+ export interface StoredHistoryState {
4
+ messages: Message[];
5
+ metadata?: HistoryMetadata;
6
+ metrics?: SessionMetrics;
7
+ }
8
+ export interface HistoryMetadata {
9
+ schema_version: 1;
10
+ session_id: string;
11
+ tenant_id: string;
12
+ model: string;
13
+ parameters: {
14
+ max_turns: number | null;
15
+ max_tokens: number;
16
+ temperature: number;
17
+ reasoning_effort?: ReasoningEffort;
18
+ enable_thinking: boolean;
19
+ thinking_budget: number;
20
+ preserve_thinking: boolean;
21
+ tool_choice: string;
22
+ disallowed_tools?: string[];
23
+ extra_body?: Record<string, unknown>;
24
+ context_window: number;
25
+ context_compaction_ratio: number;
26
+ compaction_summary_max_tokens: number;
27
+ };
28
+ }
29
+ export declare function historyMetadata(config: ArenaConfig, sessionId: string): HistoryMetadata;
2
30
  export declare function sessionStorageRoot(stateRoot: string, tenantId: string, sessionId: string): string;
3
31
  export declare function storedHistoryPath(stateRoot: string, tenantId: string, sessionId: string): string;
4
32
  export declare function loadStoredHistory(filePath: string): Promise<Message[] | undefined>;
5
- export declare function saveStoredHistory(filePath: string, messages: readonly Message[]): Promise<void>;
33
+ export declare function loadStoredHistoryState(filePath: string): Promise<StoredHistoryState | undefined>;
34
+ export declare function saveStoredHistory(filePath: string, messages: readonly Message[], metadata?: HistoryMetadata, metrics?: SessionMetrics | null): Promise<void>;
package/dist/history.js CHANGED
@@ -1,6 +1,36 @@
1
1
  import crypto from "node:crypto";
2
2
  import { mkdir, readFile, rename, writeFile } from "node:fs/promises";
3
3
  import path from "node:path";
4
+ import { normalizeSessionMetrics } from "./metrics.js";
5
+ export function historyMetadata(config, sessionId) {
6
+ return {
7
+ schema_version: 1,
8
+ session_id: sessionId,
9
+ tenant_id: config.tenantId,
10
+ model: config.model,
11
+ parameters: {
12
+ max_turns: config.maxTurns ?? null,
13
+ max_tokens: config.maxTokens,
14
+ temperature: config.temperature,
15
+ ...(config.reasoningEffort
16
+ ? { reasoning_effort: config.reasoningEffort }
17
+ : {}),
18
+ enable_thinking: config.enableThinking,
19
+ thinking_budget: config.thinkingBudget,
20
+ preserve_thinking: config.preserveThinking,
21
+ tool_choice: config.toolChoice,
22
+ ...(config.disallowedTools?.length
23
+ ? { disallowed_tools: [...config.disallowedTools] }
24
+ : {}),
25
+ ...(config.extraBody
26
+ ? { extra_body: structuredClone(config.extraBody) }
27
+ : {}),
28
+ context_window: config.contextWindow,
29
+ context_compaction_ratio: config.contextCompactionRatio,
30
+ compaction_summary_max_tokens: config.compactionSummaryMaxTokens,
31
+ },
32
+ };
33
+ }
4
34
  export function sessionStorageRoot(stateRoot, tenantId, sessionId) {
5
35
  return path.join(stateRoot, "tenants", tenantId, "sessions", sessionId);
6
36
  }
@@ -8,13 +38,24 @@ export function storedHistoryPath(stateRoot, tenantId, sessionId) {
8
38
  return path.join(sessionStorageRoot(stateRoot, tenantId, sessionId), "history.json");
9
39
  }
10
40
  export async function loadStoredHistory(filePath) {
41
+ return (await loadStoredHistoryState(filePath))?.messages;
42
+ }
43
+ export async function loadStoredHistoryState(filePath) {
11
44
  try {
12
45
  const stored = JSON.parse(await readFile(filePath, "utf8"));
13
46
  const messages = Array.isArray(stored) ? stored : stored.messages;
14
47
  if (!Array.isArray(messages)) {
15
48
  throw new Error("history file must contain a messages array");
16
49
  }
17
- return messages;
50
+ return {
51
+ messages,
52
+ ...(!Array.isArray(stored) && stored.metadata
53
+ ? { metadata: stored.metadata }
54
+ : {}),
55
+ ...(!Array.isArray(stored) && stored.metrics
56
+ ? { metrics: normalizeSessionMetrics(stored.metrics) }
57
+ : {}),
58
+ };
18
59
  }
19
60
  catch (error) {
20
61
  if (error.code === "ENOENT")
@@ -22,10 +63,19 @@ export async function loadStoredHistory(filePath) {
22
63
  throw error;
23
64
  }
24
65
  }
25
- export async function saveStoredHistory(filePath, messages) {
66
+ export async function saveStoredHistory(filePath, messages, metadata, metrics) {
26
67
  await mkdir(path.dirname(filePath), { recursive: true });
68
+ const previous = await loadStoredHistoryState(filePath);
69
+ const persistedMetadata = metadata ?? previous?.metadata;
70
+ const persistedMetrics = metrics === undefined ? previous?.metrics : metrics ?? undefined;
27
71
  const temporary = `${filePath}.${crypto.randomUUID()}.tmp`;
28
- await writeFile(temporary, JSON.stringify({ messages }), "utf8");
72
+ const envelope = {
73
+ ...(persistedMetrics ? { version: 3 } : {}),
74
+ ...(persistedMetadata ? { metadata: persistedMetadata } : {}),
75
+ messages,
76
+ ...(persistedMetrics ? { metrics: persistedMetrics } : {}),
77
+ };
78
+ await writeFile(temporary, JSON.stringify(envelope), "utf8");
29
79
  await rename(temporary, filePath);
30
80
  }
31
81
  //# sourceMappingURL=history.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"history.js","sourceRoot":"","sources":["../src/history.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,aAAa,CAAC;AACjC,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACtE,OAAO,IAAI,MAAM,WAAW,CAAC;AAI7B,MAAM,UAAU,kBAAkB,CAChC,SAAiB,EACjB,QAAgB,EAChB,SAAiB;IAEjB,OAAO,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,SAAS,EAAE,QAAQ,EAAE,UAAU,EAAE,SAAS,CAAC,CAAC;AAC1E,CAAC;AAED,MAAM,UAAU,iBAAiB,CAC/B,SAAiB,EACjB,QAAgB,EAChB,SAAiB;IAEjB,OAAO,IAAI,CAAC,IAAI,CAAC,kBAAkB,CAAC,SAAS,EAAE,QAAQ,EAAE,SAAS,CAAC,EAAE,cAAc,CAAC,CAAC;AACvF,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,QAAgB;IAEhB,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,CAE7C,CAAC;QACd,MAAM,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC;QAClE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC7B,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAC;QAChE,CAAC;QACD,OAAO,QAAQ,CAAC;IAClB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAK,KAA+B,CAAC,IAAI,KAAK,QAAQ;YAAE,OAAO,SAAS,CAAC;QACzE,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,QAAgB,EAChB,QAA4B;IAE5B,MAAM,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACzD,MAAM,SAAS,GAAG,GAAG,QAAQ,IAAI,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC;IAC3D,MAAM,SAAS,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC;IACjE,MAAM,MAAM,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;AACpC,CAAC"}
1
+ {"version":3,"file":"history.js","sourceRoot":"","sources":["../src/history.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,aAAa,CAAC;AACjC,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACtE,OAAO,IAAI,MAAM,WAAW,CAAC;AAI7B,OAAO,EAAE,uBAAuB,EAAE,MAAM,cAAc,CAAC;AA8BvD,MAAM,UAAU,eAAe,CAC7B,MAAmB,EACnB,SAAiB;IAEjB,OAAO;QACL,cAAc,EAAE,CAAC;QACjB,UAAU,EAAE,SAAS;QACrB,SAAS,EAAE,MAAM,CAAC,QAAQ;QAC1B,KAAK,EAAE,MAAM,CAAC,KAAK;QACnB,UAAU,EAAE;YACV,SAAS,EAAE,MAAM,CAAC,QAAQ,IAAI,IAAI;YAClC,UAAU,EAAE,MAAM,CAAC,SAAS;YAC5B,WAAW,EAAE,MAAM,CAAC,WAAW;YAC/B,GAAG,CAAC,MAAM,CAAC,eAAe;gBACxB,CAAC,CAAC,EAAE,gBAAgB,EAAE,MAAM,CAAC,eAAe,EAAE;gBAC9C,CAAC,CAAC,EAAE,CAAC;YACP,eAAe,EAAE,MAAM,CAAC,cAAc;YACtC,eAAe,EAAE,MAAM,CAAC,cAAc;YACtC,iBAAiB,EAAE,MAAM,CAAC,gBAAgB;YAC1C,WAAW,EAAE,MAAM,CAAC,UAAU;YAC9B,GAAG,CAAC,MAAM,CAAC,eAAe,EAAE,MAAM;gBAChC,CAAC,CAAC,EAAE,gBAAgB,EAAE,CAAC,GAAG,MAAM,CAAC,eAAe,CAAC,EAAE;gBACnD,CAAC,CAAC,EAAE,CAAC;YACP,GAAG,CAAC,MAAM,CAAC,SAAS;gBAClB,CAAC,CAAC,EAAE,UAAU,EAAE,eAAe,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE;gBACnD,CAAC,CAAC,EAAE,CAAC;YACP,cAAc,EAAE,MAAM,CAAC,aAAa;YACpC,wBAAwB,EAAE,MAAM,CAAC,sBAAsB;YACvD,6BAA6B,EAAE,MAAM,CAAC,0BAA0B;SACjE;KACF,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,kBAAkB,CAChC,SAAiB,EACjB,QAAgB,EAChB,SAAiB;IAEjB,OAAO,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,SAAS,EAAE,QAAQ,EAAE,UAAU,EAAE,SAAS,CAAC,CAAC;AAC1E,CAAC;AAED,MAAM,UAAU,iBAAiB,CAC/B,SAAiB,EACjB,QAAgB,EAChB,SAAiB;IAEjB,OAAO,IAAI,CAAC,IAAI,CAAC,kBAAkB,CAAC,SAAS,EAAE,QAAQ,EAAE,SAAS,CAAC,EAAE,cAAc,CAAC,CAAC;AACvF,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,QAAgB;IAEhB,OAAO,CAAC,MAAM,sBAAsB,CAAC,QAAQ,CAAC,CAAC,EAAE,QAAQ,CAAC;AAC5D,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAC1C,QAAgB;IAEhB,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,CAM7C,CAAC;QACd,MAAM,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC;QAClE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC7B,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAC;QAChE,CAAC;QACD,OAAO;YACL,QAAQ;YACR,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,QAAQ;gBAC3C,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE;gBAC/B,CAAC,CAAC,EAAE,CAAC;YACP,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,OAAO;gBAC1C,CAAC,CAAC,EAAE,OAAO,EAAE,uBAAuB,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE;gBACtD,CAAC,CAAC,EAAE,CAAC;SACR,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAK,KAA+B,CAAC,IAAI,KAAK,QAAQ;YAAE,OAAO,SAAS,CAAC;QACzE,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,QAAgB,EAChB,QAA4B,EAC5B,QAA0B,EAC1B,OAA+B;IAE/B,MAAM,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACzD,MAAM,QAAQ,GAAG,MAAM,sBAAsB,CAAC,QAAQ,CAAC,CAAC;IACxD,MAAM,iBAAiB,GAAG,QAAQ,IAAI,QAAQ,EAAE,QAAQ,CAAC;IACzD,MAAM,gBAAgB,GACpB,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC,OAAO,IAAI,SAAS,CAAC;IACnE,MAAM,SAAS,GAAG,GAAG,QAAQ,IAAI,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC;IAC3D,MAAM,QAAQ,GAAG;QACf,GAAG,CAAC,gBAAgB,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC3C,GAAG,CAAC,iBAAiB,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,iBAAiB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC7D,QAAQ;QACR,GAAG,CAAC,gBAAgB,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,gBAAgB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC3D,CAAC;IACF,MAAM,SAAS,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC,CAAC;IAC7D,MAAM,MAAM,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;AACpC,CAAC"}
@@ -0,0 +1,61 @@
1
+ import type { AgentResult, BashCallMetric, BashFailureOrigin, BashRecoveryEpisode, BashRecoverySummary, Message, SessionMetrics, SideQueryAudit, ToolCallMetric, ToolHallucinationSummary } from "./types.js";
2
+ import { StructuredSideQueryRunner } from "./side-query.js";
3
+ import { type ConversationMetricJudge } from "./conversation-metrics.js";
4
+ export declare const sessionMetricsAnalyzerVersion = "session-signals-v4";
5
+ export declare const bashRecoveryPolicyVersion = "arena-public-next-bash-v2";
6
+ export declare const toolHallucinationPolicyVersion = "exact-offered-name-v1";
7
+ export interface BashFailureDecision {
8
+ origin: BashFailureOrigin;
9
+ reason: string;
10
+ confidence: number;
11
+ audit?: SideQueryAudit;
12
+ }
13
+ export type BashTerminalOutcome = "gave_up" | "resolved_by_alternative" | "still_open" | "censored" | "ambiguous";
14
+ export interface BashTerminalDecision {
15
+ outcome: BashTerminalOutcome;
16
+ reason: string;
17
+ confidence: number;
18
+ audit?: SideQueryAudit;
19
+ }
20
+ export interface BashMetricJudge {
21
+ classifyFailure(input: Record<string, unknown>): Promise<BashFailureDecision>;
22
+ classifyTerminal(input: Record<string, unknown>): Promise<BashTerminalDecision>;
23
+ }
24
+ export interface SessionMetricsAnalyzerOptions {
25
+ fallbackOfferedToolNames?: readonly string[];
26
+ judge?: BashMetricJudge;
27
+ conversationJudge?: ConversationMetricJudge;
28
+ now?: () => Date;
29
+ }
30
+ export interface SessionMetricsUpdateInput {
31
+ messages: readonly Message[];
32
+ previous?: SessionMetrics;
33
+ throughTurnId: string;
34
+ turnStatus: AgentResult["status"];
35
+ offeredToolNamesByCallId?: ReadonlyMap<string, readonly string[]>;
36
+ currentUserText?: string;
37
+ previousAssistantText?: string;
38
+ currentTurnMessages?: readonly Message[];
39
+ }
40
+ /** Metric-specific adapter over the generic structured side-query subsystem. */
41
+ export declare class ModelBashMetricJudge implements BashMetricJudge {
42
+ private readonly runner;
43
+ constructor(runner: StructuredSideQueryRunner);
44
+ classifyFailure(input: Record<string, unknown>): Promise<BashFailureDecision>;
45
+ classifyTerminal(input: Record<string, unknown>): Promise<BashTerminalDecision>;
46
+ }
47
+ export declare function summarizeBashRecovery(calls: readonly BashCallMetric[], episodes: readonly BashRecoveryEpisode[]): BashRecoverySummary;
48
+ export declare function summarizeToolHallucination(calls: readonly ToolCallMetric[]): ToolHallucinationSummary;
49
+ /**
50
+ * Normalizes persisted metric snapshots to the current compact schema.
51
+ * Detailed observations are canonical; every rollup is recomputed from them
52
+ * so legacy materialized counters cannot drift into a resumed session.
53
+ */
54
+ export declare function normalizeSessionMetrics(value: unknown): SessionMetrics | undefined;
55
+ export declare class SessionMetricsAnalyzer {
56
+ private readonly options;
57
+ private readonly fallbackOfferedToolNames;
58
+ private readonly now;
59
+ constructor(options?: SessionMetricsAnalyzerOptions);
60
+ update(input: SessionMetricsUpdateInput): Promise<SessionMetrics>;
61
+ }