@ai0x0/codex-ts 0.1.0 → 0.2.1

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 (67) hide show
  1. package/dist/core/src/base_instructions.d.ts +20 -0
  2. package/dist/core/src/base_instructions.d.ts.map +1 -0
  3. package/dist/core/src/base_instructions.js +40 -0
  4. package/dist/core/src/base_instructions.js.map +1 -0
  5. package/dist/core/src/codex_thread.d.ts +48 -0
  6. package/dist/core/src/codex_thread.d.ts.map +1 -1
  7. package/dist/core/src/codex_thread.js +72 -6
  8. package/dist/core/src/codex_thread.js.map +1 -1
  9. package/dist/core/src/compact.d.ts +37 -0
  10. package/dist/core/src/compact.d.ts.map +1 -0
  11. package/dist/core/src/compact.js +154 -0
  12. package/dist/core/src/compact.js.map +1 -0
  13. package/dist/core/src/index.d.ts +6 -0
  14. package/dist/core/src/index.d.ts.map +1 -1
  15. package/dist/core/src/index.js +4 -0
  16. package/dist/core/src/index.js.map +1 -1
  17. package/dist/core/src/session/sse.d.ts +7 -0
  18. package/dist/core/src/session/sse.d.ts.map +1 -0
  19. package/dist/core/src/session/sse.js +40 -0
  20. package/dist/core/src/session/sse.js.map +1 -0
  21. package/dist/core/src/session/turn.d.ts +29 -1
  22. package/dist/core/src/session/turn.d.ts.map +1 -1
  23. package/dist/core/src/session/turn.js +90 -40
  24. package/dist/core/src/session/turn.js.map +1 -1
  25. package/dist/core/src/skills.d.ts +66 -0
  26. package/dist/core/src/skills.d.ts.map +1 -0
  27. package/dist/core/src/skills.js +304 -0
  28. package/dist/core/src/skills.js.map +1 -0
  29. package/dist/core/src/state/auto_compact_window.d.ts +42 -0
  30. package/dist/core/src/state/auto_compact_window.d.ts.map +1 -0
  31. package/dist/core/src/state/auto_compact_window.js +59 -0
  32. package/dist/core/src/state/auto_compact_window.js.map +1 -0
  33. package/dist/core/src/tools/router.d.ts +26 -1
  34. package/dist/core/src/tools/router.d.ts.map +1 -1
  35. package/dist/core/src/tools/router.js +15 -2
  36. package/dist/core/src/tools/router.js.map +1 -1
  37. package/dist/core/tests/suite/compact.test.d.ts +10 -0
  38. package/dist/core/tests/suite/compact.test.d.ts.map +1 -0
  39. package/dist/core/tests/suite/compact.test.js +170 -0
  40. package/dist/core/tests/suite/compact.test.js.map +1 -0
  41. package/dist/core/tests/suite/extensions.test.d.ts +8 -0
  42. package/dist/core/tests/suite/extensions.test.d.ts.map +1 -0
  43. package/dist/core/tests/suite/extensions.test.js +186 -0
  44. package/dist/core/tests/suite/extensions.test.js.map +1 -0
  45. package/dist/core/tests/suite/message_item_type.test.d.ts +17 -0
  46. package/dist/core/tests/suite/message_item_type.test.d.ts.map +1 -0
  47. package/dist/core/tests/suite/message_item_type.test.js +111 -0
  48. package/dist/core/tests/suite/message_item_type.test.js.map +1 -0
  49. package/dist/core/tests/suite/skills.test.d.ts +7 -0
  50. package/dist/core/tests/suite/skills.test.d.ts.map +1 -0
  51. package/dist/core/tests/suite/skills.test.js +324 -0
  52. package/dist/core/tests/suite/skills.test.js.map +1 -0
  53. package/dist/protocol/src/index.d.ts +1 -0
  54. package/dist/protocol/src/index.d.ts.map +1 -1
  55. package/dist/protocol/src/protocol.d.ts +32 -0
  56. package/dist/protocol/src/protocol.d.ts.map +1 -1
  57. package/dist/thread-store/src/index.d.ts +1 -0
  58. package/dist/thread-store/src/index.d.ts.map +1 -1
  59. package/dist/thread-store/src/index.js +1 -0
  60. package/dist/thread-store/src/index.js.map +1 -1
  61. package/dist/thread-store/src/indexeddb.d.ts +29 -0
  62. package/dist/thread-store/src/indexeddb.d.ts.map +1 -0
  63. package/dist/thread-store/src/indexeddb.js +97 -0
  64. package/dist/thread-store/src/indexeddb.js.map +1 -0
  65. package/dist/thread-store/src/types.d.ts +2 -0
  66. package/dist/thread-store/src/types.d.ts.map +1 -1
  67. package/package.json +1 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skills.js","sourceRoot":"","sources":["../../../core/src/skills.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,42 @@
1
+ /**
2
+ * mirrors codex-rs/core/src/state/auto_compact_window.rs
3
+ *
4
+ * Tracks the token baseline for the current compaction window so that
5
+ * BodyAfterPrefix mode can measure context growth since the last compaction
6
+ * rather than total context size.
7
+ */
8
+ export interface AutoCompactWindowSnapshot {
9
+ ordinal: number;
10
+ prefillInputTokens: number | null;
11
+ }
12
+ export declare class AutoCompactWindow {
13
+ private ordinal;
14
+ /**
15
+ * Absolute input-token baseline for the current window.
16
+ * Set from the first server-observed usage after a new window opens;
17
+ * falls back to an estimated value when the server hasn't responded yet.
18
+ */
19
+ private prefillInputTokens;
20
+ private prefillSource;
21
+ clearPrefill(): void;
22
+ /** Called after each compaction to start a fresh measurement window */
23
+ startNext(): void;
24
+ /**
25
+ * Records the request-input side of the first server usage sample.
26
+ * Server-observed values take priority and are never overwritten.
27
+ * mirrors: ensure_server_observed_prefill_from_usage
28
+ */
29
+ ensureServerObservedPrefill(inputTokens: number): void;
30
+ /**
31
+ * Set an estimated prefill when actual usage isn't available yet.
32
+ * mirrors: set_estimated_prefill
33
+ */
34
+ setEstimatedPrefill(tokens: number): void;
35
+ snapshot(): AutoCompactWindowSnapshot;
36
+ /**
37
+ * Tokens added since the start of this window (BodyAfterPrefix mode).
38
+ * Falls back to total when no baseline is recorded yet.
39
+ */
40
+ bodyAfterPrefix(totalInputTokens: number): number;
41
+ }
42
+ //# sourceMappingURL=auto_compact_window.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auto_compact_window.d.ts","sourceRoot":"","sources":["../../../../core/src/state/auto_compact_window.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,MAAM,WAAW,yBAAyB;IACxC,OAAO,EAAE,MAAM,CAAC;IAChB,kBAAkB,EAAE,MAAM,GAAG,IAAI,CAAC;CACnC;AAED,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,OAAO,CAAK;IACpB;;;;OAIG;IACH,OAAO,CAAC,kBAAkB,CAAuB;IACjD,OAAO,CAAC,aAAa,CAAuC;IAE5D,YAAY,IAAI,IAAI;IAKpB,uEAAuE;IACvE,SAAS,IAAI,IAAI;IAKjB;;;;OAIG;IACH,2BAA2B,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI;IAMtD;;;OAGG;IACH,mBAAmB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAMzC,QAAQ,IAAI,yBAAyB;IAIrC;;;OAGG;IACH,eAAe,CAAC,gBAAgB,EAAE,MAAM,GAAG,MAAM;CAIlD"}
@@ -0,0 +1,59 @@
1
+ /**
2
+ * mirrors codex-rs/core/src/state/auto_compact_window.rs
3
+ *
4
+ * Tracks the token baseline for the current compaction window so that
5
+ * BodyAfterPrefix mode can measure context growth since the last compaction
6
+ * rather than total context size.
7
+ */
8
+ export class AutoCompactWindow {
9
+ ordinal = 1;
10
+ /**
11
+ * Absolute input-token baseline for the current window.
12
+ * Set from the first server-observed usage after a new window opens;
13
+ * falls back to an estimated value when the server hasn't responded yet.
14
+ */
15
+ prefillInputTokens = null;
16
+ prefillSource = null;
17
+ clearPrefill() {
18
+ this.prefillInputTokens = null;
19
+ this.prefillSource = null;
20
+ }
21
+ /** Called after each compaction to start a fresh measurement window */
22
+ startNext() {
23
+ this.ordinal += 1;
24
+ this.clearPrefill();
25
+ }
26
+ /**
27
+ * Records the request-input side of the first server usage sample.
28
+ * Server-observed values take priority and are never overwritten.
29
+ * mirrors: ensure_server_observed_prefill_from_usage
30
+ */
31
+ ensureServerObservedPrefill(inputTokens) {
32
+ if (this.prefillSource === "server")
33
+ return;
34
+ this.prefillInputTokens = Math.max(0, inputTokens);
35
+ this.prefillSource = "server";
36
+ }
37
+ /**
38
+ * Set an estimated prefill when actual usage isn't available yet.
39
+ * mirrors: set_estimated_prefill
40
+ */
41
+ setEstimatedPrefill(tokens) {
42
+ if (this.prefillSource === "server")
43
+ return;
44
+ this.prefillInputTokens = Math.max(0, tokens);
45
+ this.prefillSource = "estimated";
46
+ }
47
+ snapshot() {
48
+ return { ordinal: this.ordinal, prefillInputTokens: this.prefillInputTokens };
49
+ }
50
+ /**
51
+ * Tokens added since the start of this window (BodyAfterPrefix mode).
52
+ * Falls back to total when no baseline is recorded yet.
53
+ */
54
+ bodyAfterPrefix(totalInputTokens) {
55
+ const baseline = this.prefillInputTokens ?? totalInputTokens;
56
+ return Math.max(0, totalInputTokens - baseline);
57
+ }
58
+ }
59
+ //# sourceMappingURL=auto_compact_window.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auto_compact_window.js","sourceRoot":"","sources":["../../../../core/src/state/auto_compact_window.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAOH,MAAM,OAAO,iBAAiB;IACpB,OAAO,GAAG,CAAC,CAAC;IACpB;;;;OAIG;IACK,kBAAkB,GAAkB,IAAI,CAAC;IACzC,aAAa,GAAkC,IAAI,CAAC;IAE5D,YAAY;QACV,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC;QAC/B,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;IAC5B,CAAC;IAED,uEAAuE;IACvE,SAAS;QACP,IAAI,CAAC,OAAO,IAAI,CAAC,CAAC;QAClB,IAAI,CAAC,YAAY,EAAE,CAAC;IACtB,CAAC;IAED;;;;OAIG;IACH,2BAA2B,CAAC,WAAmB;QAC7C,IAAI,IAAI,CAAC,aAAa,KAAK,QAAQ;YAAE,OAAO;QAC5C,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC;QACnD,IAAI,CAAC,aAAa,GAAG,QAAQ,CAAC;IAChC,CAAC;IAED;;;OAGG;IACH,mBAAmB,CAAC,MAAc;QAChC,IAAI,IAAI,CAAC,aAAa,KAAK,QAAQ;YAAE,OAAO;QAC5C,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;QAC9C,IAAI,CAAC,aAAa,GAAG,WAAW,CAAC;IACnC,CAAC;IAED,QAAQ;QACN,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,kBAAkB,EAAE,IAAI,CAAC,kBAAkB,EAAE,CAAC;IAChF,CAAC;IAED;;;OAGG;IACH,eAAe,CAAC,gBAAwB;QACtC,MAAM,QAAQ,GAAG,IAAI,CAAC,kBAAkB,IAAI,gBAAgB,CAAC;QAC7D,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,gBAAgB,GAAG,QAAQ,CAAC,CAAC;IAClD,CAAC;CACF"}
@@ -14,10 +14,35 @@ export interface ToolRouterContext {
14
14
  /** Emit an event immediately — used for events that must fire before suspension */
15
15
  emitEvent: (msg: EventMsg) => void;
16
16
  }
17
+ /**
18
+ * Context handed to a CustomTool's execute(). Carries the identifiers a host
19
+ * needs to correlate the call (callId / turnId) and an emitEvent escape hatch.
20
+ */
21
+ export interface CustomToolContext {
22
+ callId: string;
23
+ turnId: string;
24
+ emitEvent: (msg: EventMsg) => void;
25
+ }
26
+ /**
27
+ * A host-supplied tool.
28
+ *
29
+ * TypeScript equivalent of implementing `ToolExecutor<ToolInvocation>` in
30
+ * codex-rs: the host provides the spec (advertised to the model) and an async
31
+ * execute() whose returned string becomes the function_call_output sent back.
32
+ */
33
+ export interface CustomTool {
34
+ /** Tool name as advertised to and called by the model */
35
+ name: string;
36
+ /** ToolSpec included in Responses API requests */
37
+ spec(): ToolSpec;
38
+ /** Run the call; the returned string is fed back to the model as output */
39
+ execute(args: unknown, ctx: CustomToolContext): Promise<string>;
40
+ }
17
41
  /** mirrors ToolRouter in router.rs */
18
42
  export declare class ToolRouter {
19
43
  private readonly goalExecutor;
20
- constructor(goalExecutor: GoalToolExecutor);
44
+ private readonly customTools;
45
+ constructor(goalExecutor: GoalToolExecutor, customTools?: CustomTool[]);
21
46
  /** All tool specs to include in Responses API requests */
22
47
  toolSpecs(): ToolSpec[];
23
48
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"router.d.ts","sourceRoot":"","sources":["../../../../core/src/tools/router.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,mCAAmC,CAAC;AAElE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,iCAAiC,CAAC;AAChE,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AAkBjE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kCAAkC,CAAC;AAOtE,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,MAAM,CAAC;IACf,aAAa,EAAE,aAAa,CAAC;IAC7B,mFAAmF;IACnF,SAAS,EAAE,CAAC,GAAG,EAAE,QAAQ,KAAK,IAAI,CAAC;CACpC;AAED,sCAAsC;AACtC,qBAAa,UAAU;IACrB,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAmB;gBAEpC,YAAY,EAAE,gBAAgB;IAI1C,0DAA0D;IAC1D,SAAS,IAAI,QAAQ,EAAE;IAUvB;;;;OAIG;IACG,QAAQ,CACZ,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,OAAO,EAChB,GAAG,EAAE,iBAAiB,GACrB,OAAO,CAAC,MAAM,CAAC;CA+DnB"}
1
+ {"version":3,"file":"router.d.ts","sourceRoot":"","sources":["../../../../core/src/tools/router.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,mCAAmC,CAAC;AAElE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,iCAAiC,CAAC;AAChE,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AAkBjE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kCAAkC,CAAC;AAOtE,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,MAAM,CAAC;IACf,aAAa,EAAE,aAAa,CAAC;IAC7B,mFAAmF;IACnF,SAAS,EAAE,CAAC,GAAG,EAAE,QAAQ,KAAK,IAAI,CAAC;CACpC;AAUD;;;GAGG;AACH,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,CAAC,GAAG,EAAE,QAAQ,KAAK,IAAI,CAAC;CACpC;AAED;;;;;;GAMG;AACH,MAAM,WAAW,UAAU;IACzB,yDAAyD;IACzD,IAAI,EAAE,MAAM,CAAC;IACb,kDAAkD;IAClD,IAAI,IAAI,QAAQ,CAAC;IACjB,2EAA2E;IAC3E,OAAO,CAAC,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,iBAAiB,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;CACjE;AAED,sCAAsC;AACtC,qBAAa,UAAU;IACrB,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAmB;IAChD,OAAO,CAAC,QAAQ,CAAC,WAAW,CAA0B;gBAE1C,YAAY,EAAE,gBAAgB,EAAE,WAAW,GAAE,UAAU,EAAO;IAK1E,0DAA0D;IAC1D,SAAS,IAAI,QAAQ,EAAE;IAWvB;;;;OAIG;IACG,QAAQ,CACZ,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,OAAO,EAChB,GAAG,EAAE,iBAAiB,GACrB,OAAO,CAAC,MAAM,CAAC;CAyEnB"}
@@ -11,8 +11,10 @@ import { UPDATE_PLAN_TOOL_NAME, createUpdatePlanTool, parseUpdatePlanArgs, } fro
11
11
  /** mirrors ToolRouter in router.rs */
12
12
  export class ToolRouter {
13
13
  goalExecutor;
14
- constructor(goalExecutor) {
14
+ customTools;
15
+ constructor(goalExecutor, customTools = []) {
15
16
  this.goalExecutor = goalExecutor;
17
+ this.customTools = new Map(customTools.map((tool) => [tool.name, tool]));
16
18
  }
17
19
  /** All tool specs to include in Responses API requests */
18
20
  toolSpecs() {
@@ -22,6 +24,7 @@ export class ToolRouter {
22
24
  createUpdateGoalTool(),
23
25
  createRequestUserInputTool(),
24
26
  createUpdatePlanTool(),
27
+ ...Array.from(this.customTools.values(), (tool) => tool.spec()),
25
28
  ];
26
29
  }
27
30
  /**
@@ -74,8 +77,18 @@ export class ToolRouter {
74
77
  ctx.emitEvent({ type: "PlanUpdate", event: parsed.args });
75
78
  return "Plan updated";
76
79
  }
77
- default:
80
+ default: {
81
+ const custom = this.customTools.get(toolName);
82
+ if (custom) {
83
+ // Hand the raw (un-normalised) args to the host; it does its own parsing.
84
+ return custom.execute(rawArgs, {
85
+ callId,
86
+ turnId: ctx.turnId,
87
+ emitEvent: ctx.emitEvent,
88
+ });
89
+ }
78
90
  return JSON.stringify({ error: `Unknown tool: ${toolName}` });
91
+ }
79
92
  }
80
93
  }
81
94
  }
@@ -1 +1 @@
1
- {"version":3,"file":"router.js","sourceRoot":"","sources":["../../../../core/src/tools/router.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"router.js","sourceRoot":"","sources":["../../../../core/src/tools/router.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * mirrors codex-rs/core/tests/suite/compact.rs
3
+ *
4
+ * Tests for inline auto-compaction:
5
+ * - AutoCompactWindow token tracking (BodyAfterPrefix mode)
6
+ * - collectUserMessages / buildCompactedHistory helpers
7
+ * - Mid-turn compaction triggered when inputTokens >= autoCompactTokenLimit
8
+ */
9
+ export {};
10
+ //# sourceMappingURL=compact.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compact.test.d.ts","sourceRoot":"","sources":["../../../../core/tests/suite/compact.test.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG"}
@@ -0,0 +1,170 @@
1
+ /**
2
+ * mirrors codex-rs/core/tests/suite/compact.rs
3
+ *
4
+ * Tests for inline auto-compaction:
5
+ * - AutoCompactWindow token tracking (BodyAfterPrefix mode)
6
+ * - collectUserMessages / buildCompactedHistory helpers
7
+ * - Mid-turn compaction triggered when inputTokens >= autoCompactTokenLimit
8
+ */
9
+ import { describe, expect, it, vi, beforeEach } from "vitest";
10
+ import { AutoCompactWindow } from "../../src/state/auto_compact_window.js";
11
+ import { collectUserMessages, buildCompactedHistory, SUMMARIZATION_PROMPT, SUMMARY_PREFIX, } from "../../src/compact.js";
12
+ import { CodexThread } from "../../src/codex_thread.js";
13
+ import { evAssistantMessage, evCompleted, evFunctionCall, evResponseCreated, makeSseResponse, sseFlat, waitForEvent, } from "../common/lib.js";
14
+ // ─── AutoCompactWindow unit tests ─────────────────────────────────────────────
15
+ describe("AutoCompactWindow — BodyAfterPrefix tracking", () => {
16
+ it("starts with no baseline; bodyAfterPrefix returns 0", () => {
17
+ const w = new AutoCompactWindow();
18
+ // No prefill set → baseline == totalInputTokens → 0 growth
19
+ expect(w.bodyAfterPrefix(1000)).toBe(0);
20
+ });
21
+ it("records server-observed prefill and measures growth", () => {
22
+ const w = new AutoCompactWindow();
23
+ w.ensureServerObservedPrefill(800);
24
+ expect(w.bodyAfterPrefix(1000)).toBe(200);
25
+ });
26
+ it("server-observed prefill wins over estimated", () => {
27
+ const w = new AutoCompactWindow();
28
+ w.setEstimatedPrefill(500);
29
+ w.ensureServerObservedPrefill(800);
30
+ // server value (800) should win
31
+ expect(w.bodyAfterPrefix(1000)).toBe(200);
32
+ // Further calls to setEstimatedPrefill should be ignored
33
+ w.setEstimatedPrefill(100);
34
+ expect(w.bodyAfterPrefix(1000)).toBe(200);
35
+ });
36
+ it("startNext resets baseline and bumps ordinal", () => {
37
+ const w = new AutoCompactWindow();
38
+ w.ensureServerObservedPrefill(800);
39
+ expect(w.snapshot().ordinal).toBe(1);
40
+ w.startNext();
41
+ const snap = w.snapshot();
42
+ expect(snap.ordinal).toBe(2);
43
+ expect(snap.prefillInputTokens).toBeNull();
44
+ // After reset, no growth again
45
+ expect(w.bodyAfterPrefix(400)).toBe(0);
46
+ });
47
+ });
48
+ // ─── History helper unit tests ─────────────────────────────────────────────────
49
+ describe("collectUserMessages", () => {
50
+ it("extracts text from user messages", () => {
51
+ const history = [
52
+ { type: "message", role: "user", content: "hello" },
53
+ { type: "message", role: "assistant", content: "hi" },
54
+ {
55
+ type: "message",
56
+ role: "user",
57
+ content: [{ type: "input_text", text: "follow-up" }],
58
+ },
59
+ ];
60
+ expect(collectUserMessages(history)).toEqual(["hello", "follow-up"]);
61
+ });
62
+ it("skips assistant and tool messages", () => {
63
+ const history = [
64
+ { type: "message", role: "assistant", content: "response" },
65
+ { type: "function_call", call_id: "c1", name: "tool", arguments: "{}" },
66
+ ];
67
+ expect(collectUserMessages(history)).toEqual([]);
68
+ });
69
+ });
70
+ describe("buildCompactedHistory", () => {
71
+ it("produces summary as the last user message", () => {
72
+ const result = buildCompactedHistory(["msg1", "msg2"], "SUMMARY");
73
+ const last = result[result.length - 1];
74
+ expect("role" in (last ?? {}) && last.role).toBe("user");
75
+ expect(JSON.stringify(last)).toContain("SUMMARY");
76
+ });
77
+ it("uses fallback text when summary is empty", () => {
78
+ const result = buildCompactedHistory([], "");
79
+ const last = result[result.length - 1];
80
+ expect(JSON.stringify(last)).toContain("(no summary available)");
81
+ });
82
+ });
83
+ // ─── Integration: mid-turn compaction triggered ───────────────────────────────
84
+ describe("mid-turn auto-compaction", () => {
85
+ beforeEach(() => { vi.unstubAllGlobals(); });
86
+ function sseWithUsage(inputTokens, items) {
87
+ return sseFlat([
88
+ ...items,
89
+ {
90
+ type: "response.done",
91
+ response: {
92
+ id: "resp",
93
+ status: "completed",
94
+ usage: { input_tokens: inputTokens, output_tokens: 10, total_tokens: inputTokens + 10 },
95
+ },
96
+ },
97
+ ]);
98
+ }
99
+ it("compacts mid-turn when BodyAfterPrefix growth >= autoCompactTokenLimit", async () => {
100
+ // BodyAfterPrefix mode: round 1 sets the baseline; round 2 measures growth.
101
+ // round 1 baseline = 1000 tokens, round 2 reports 2000 → growth = 1000 >= 900 → compact.
102
+ const fetchMock = vi.fn();
103
+ // Round 1 — model calls get_goal; reports 1000 tokens (sets baseline)
104
+ fetchMock.mockResolvedValueOnce(makeSseResponse(sseWithUsage(1000, [
105
+ evResponseCreated("resp-1"),
106
+ evFunctionCall("call-1", "get_goal", {}),
107
+ ])));
108
+ // Round 2 — after get_goal, model calls update_plan; usage = 2000 → growth 1000 ≥ 900
109
+ fetchMock.mockResolvedValueOnce(makeSseResponse(sseWithUsage(2000, [
110
+ evResponseCreated("resp-2"),
111
+ evFunctionCall("call-2", "update_plan", { plan: [{ step: "s", status: "completed" }] }),
112
+ ])));
113
+ // Compaction request — model returns a summary
114
+ fetchMock.mockResolvedValueOnce(makeSseResponse(sseFlat([
115
+ evResponseCreated("resp-compact"),
116
+ evAssistantMessage("summary text"),
117
+ evCompleted("resp-compact"),
118
+ ])));
119
+ // Round 3 — after compaction, model returns final reply
120
+ fetchMock.mockResolvedValueOnce(makeSseResponse(sseFlat([
121
+ evResponseCreated("resp-3"),
122
+ evAssistantMessage("done"),
123
+ evCompleted("resp-3"),
124
+ ])));
125
+ vi.stubGlobal("fetch", fetchMock);
126
+ const codex = new CodexThread({
127
+ apiKey: "test",
128
+ model: "gpt-4o",
129
+ autoCompactTokenLimit: 900,
130
+ });
131
+ await codex.submit({ type: "UserInput", items: [{ type: "text", text: "hi" }] });
132
+ const compacted = await waitForEvent(codex, (msg) => msg.type === "ContextCompacted");
133
+ expect(compacted.type).toBe("ContextCompacted");
134
+ const warning = await waitForEvent(codex, (msg) => msg.type === "Warning");
135
+ expect(warning.type).toBe("Warning");
136
+ await waitForEvent(codex, (msg) => msg.type === "TurnComplete");
137
+ // 4 fetches: round1, round2, compaction, round3
138
+ expect(fetchMock).toHaveBeenCalledTimes(4);
139
+ // Compaction request (index 2) must include SUMMARIZATION_PROMPT as last input item
140
+ const compactBody = JSON.parse(fetchMock.mock.calls[2][1].body);
141
+ const lastItem = compactBody.input[compactBody.input.length - 1];
142
+ expect(JSON.stringify(lastItem)).toContain(SUMMARIZATION_PROMPT.slice(0, 30));
143
+ // Round 3 request (index 3) must contain SUMMARY_PREFIX in history
144
+ const finalBody = JSON.parse(fetchMock.mock.calls[3][1].body);
145
+ expect(JSON.stringify(finalBody.input)).toContain(SUMMARY_PREFIX.slice(0, 30));
146
+ });
147
+ it("does NOT compact when usage is below the limit", async () => {
148
+ const fetchMock = vi.fn();
149
+ fetchMock.mockResolvedValueOnce(makeSseResponse(sseWithUsage(500, [
150
+ evResponseCreated("resp-1"),
151
+ evFunctionCall("call-1", "get_goal", {}),
152
+ ])));
153
+ fetchMock.mockResolvedValueOnce(makeSseResponse(sseFlat([
154
+ evResponseCreated("resp-2"),
155
+ evAssistantMessage("done"),
156
+ evCompleted("resp-2"),
157
+ ])));
158
+ vi.stubGlobal("fetch", fetchMock);
159
+ const codex = new CodexThread({
160
+ apiKey: "test",
161
+ model: "gpt-4o",
162
+ autoCompactTokenLimit: 900,
163
+ });
164
+ await codex.submit({ type: "UserInput", items: [{ type: "text", text: "hi" }] });
165
+ await waitForEvent(codex, (msg) => msg.type === "TurnComplete");
166
+ // Only two fetches: no compaction
167
+ expect(fetchMock).toHaveBeenCalledTimes(2);
168
+ });
169
+ });
170
+ //# sourceMappingURL=compact.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compact.test.js","sourceRoot":"","sources":["../../../../core/tests/suite/compact.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Tests for the host-extension features added on top of the codex-rs mirror:
3
+ * - custom tool registration (CodexThreadConfig.customTools)
4
+ * - Op.Interrupt aborting the in-flight turn
5
+ * - baseInstructions layering (DEFAULT_BASE_INSTRUCTIONS + dev instructions)
6
+ */
7
+ export {};
8
+ //# sourceMappingURL=extensions.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extensions.test.d.ts","sourceRoot":"","sources":["../../../../core/tests/suite/extensions.test.ts"],"names":[],"mappings":"AAAA;;;;;GAKG"}
@@ -0,0 +1,186 @@
1
+ /**
2
+ * Tests for the host-extension features added on top of the codex-rs mirror:
3
+ * - custom tool registration (CodexThreadConfig.customTools)
4
+ * - Op.Interrupt aborting the in-flight turn
5
+ * - baseInstructions layering (DEFAULT_BASE_INSTRUCTIONS + dev instructions)
6
+ */
7
+ import { beforeEach, describe, expect, it, vi } from "vitest";
8
+ import { CodexThread } from "../../src/codex_thread.js";
9
+ import { DEFAULT_BASE_INSTRUCTIONS } from "../../src/base_instructions.js";
10
+ import { evAssistantMessage, evCompleted, evFunctionCall, evResponseCreated, makeSseResponse, sseFlat, waitForEvent, } from "../common/lib.js";
11
+ describe("custom tools", () => {
12
+ beforeEach(() => {
13
+ vi.unstubAllGlobals();
14
+ });
15
+ it("advertises the spec and routes calls to execute()", async () => {
16
+ const fetchMock = vi.fn();
17
+ fetchMock.mockResolvedValueOnce(makeSseResponse(sseFlat([
18
+ evResponseCreated("resp-1"),
19
+ evFunctionCall("call-1", "echo_tool", { value: "hi" }),
20
+ evCompleted("resp-1"),
21
+ ])));
22
+ fetchMock.mockResolvedValueOnce(makeSseResponse(sseFlat([
23
+ evResponseCreated("resp-2"),
24
+ evAssistantMessage("done"),
25
+ evCompleted("resp-2"),
26
+ ])));
27
+ vi.stubGlobal("fetch", fetchMock);
28
+ const calls = [];
29
+ const echoTool = {
30
+ name: "echo_tool",
31
+ spec: () => ({
32
+ type: "function",
33
+ tool: {
34
+ name: "echo_tool",
35
+ description: "Echo the value back.",
36
+ parameters: {
37
+ type: "object",
38
+ properties: { value: { type: "string" } },
39
+ required: ["value"],
40
+ additionalProperties: false,
41
+ },
42
+ strict: false,
43
+ },
44
+ }),
45
+ execute: async (args, ctx) => {
46
+ calls.push({ args, callId: ctx.callId });
47
+ return JSON.stringify({ echoed: args.value });
48
+ },
49
+ };
50
+ const codex = new CodexThread({
51
+ apiKey: "test",
52
+ model: "gpt-4o",
53
+ customTools: [echoTool],
54
+ });
55
+ await codex.submit({
56
+ type: "UserInput",
57
+ items: [{ type: "text", text: "echo hi" }],
58
+ });
59
+ await waitForEvent(codex, (m) => m.type === "TurnComplete");
60
+ expect(calls).toHaveLength(1);
61
+ expect(calls[0].args).toEqual({ value: "hi" });
62
+ expect(calls[0].callId).toBe("call-1");
63
+ // The custom tool spec is advertised in the first request.
64
+ const firstInit = fetchMock.mock.calls[0][1];
65
+ const firstBody = JSON.parse(firstInit.body);
66
+ expect(firstBody.tools.some((t) => t.name === "echo_tool")).toBe(true);
67
+ // The tool output is appended to history before the second request.
68
+ const secondInit = fetchMock.mock.calls[1][1];
69
+ const secondBody = JSON.parse(secondInit.body);
70
+ const output = secondBody.input.find((item) => item.type === "function_call_output");
71
+ expect(output?.output).toContain("echoed");
72
+ });
73
+ it("applies per-turn instructions/model overrides", async () => {
74
+ const fetchMock = vi.fn().mockResolvedValue(makeSseResponse(sseFlat([
75
+ evResponseCreated("resp-1"),
76
+ evAssistantMessage("ok"),
77
+ evCompleted("resp-1"),
78
+ ])));
79
+ vi.stubGlobal("fetch", fetchMock);
80
+ const codex = new CodexThread({
81
+ apiKey: "test",
82
+ model: "thread-model",
83
+ instructions: "thread-instructions",
84
+ });
85
+ await codex.submit({
86
+ type: "UserInput",
87
+ items: [{ type: "text", text: "go" }],
88
+ instructions: "turn-instructions",
89
+ model: "turn-model",
90
+ });
91
+ await waitForEvent(codex, (m) => m.type === "TurnComplete");
92
+ const init = fetchMock.mock.calls[0][1];
93
+ const body = JSON.parse(init.body);
94
+ expect(body.model).toBe("turn-model");
95
+ // instructions = base agent harness + per-turn developer instructions
96
+ expect(body.instructions).toContain("turn-instructions");
97
+ expect(body.instructions).toContain("autonomous agent");
98
+ });
99
+ });
100
+ describe("interrupt", () => {
101
+ beforeEach(() => {
102
+ vi.unstubAllGlobals();
103
+ });
104
+ it("aborts the in-flight turn and emits an Error", async () => {
105
+ const fetchMock = vi.fn().mockImplementation((_url, init) => new Promise((_resolve, reject) => {
106
+ const signal = init.signal;
107
+ const onAbort = () => reject(new DOMException("aborted", "AbortError"));
108
+ if (signal?.aborted) {
109
+ onAbort();
110
+ return;
111
+ }
112
+ signal?.addEventListener("abort", onAbort);
113
+ }));
114
+ vi.stubGlobal("fetch", fetchMock);
115
+ const codex = new CodexThread({ apiKey: "test", model: "gpt-4o" });
116
+ await codex.submit({
117
+ type: "UserInput",
118
+ items: [{ type: "text", text: "hang" }],
119
+ });
120
+ await waitForEvent(codex, (m) => m.type === "TurnStarted");
121
+ // Let the turn reach fetch() and register the abort listener.
122
+ await new Promise((resolve) => setTimeout(resolve, 20));
123
+ await codex.submit({ type: "Interrupt" });
124
+ const err = await waitForEvent(codex, (m) => m.type === "Error");
125
+ expect(err.type).toBe("Error");
126
+ });
127
+ });
128
+ // ─── baseInstructions layering ────────────────────────────────────────────────
129
+ function makeSimpleResponse() {
130
+ return makeSseResponse(sseFlat([evResponseCreated("r"), evAssistantMessage("ok"), evCompleted("r")]));
131
+ }
132
+ function capturedInstructions(fetchMock) {
133
+ const init = fetchMock.mock.calls[0][1];
134
+ return JSON.parse(init.body).instructions ?? "";
135
+ }
136
+ describe("baseInstructions layering", () => {
137
+ beforeEach(() => { vi.unstubAllGlobals(); });
138
+ it("prepends DEFAULT_BASE_INSTRUCTIONS when no baseInstructions is set", async () => {
139
+ const fetchMock = vi.fn().mockResolvedValue(makeSimpleResponse());
140
+ vi.stubGlobal("fetch", fetchMock);
141
+ const codex = new CodexThread({
142
+ apiKey: "k", model: "m",
143
+ instructions: "dev instructions",
144
+ });
145
+ await codex.submit({ type: "UserInput", items: [{ type: "text", text: "hi" }] });
146
+ await waitForEvent(codex, (m) => m.type === "TurnComplete");
147
+ const instr = capturedInstructions(fetchMock);
148
+ expect(instr).toContain(DEFAULT_BASE_INSTRUCTIONS.slice(0, 40));
149
+ expect(instr).toContain("dev instructions");
150
+ // Base comes first
151
+ expect(instr.indexOf(DEFAULT_BASE_INSTRUCTIONS.slice(0, 20)))
152
+ .toBeLessThan(instr.indexOf("dev instructions"));
153
+ });
154
+ it("passing baseInstructions: '' disables the base harness", async () => {
155
+ const fetchMock = vi.fn().mockResolvedValue(makeSimpleResponse());
156
+ vi.stubGlobal("fetch", fetchMock);
157
+ const codex = new CodexThread({
158
+ apiKey: "k", model: "m",
159
+ baseInstructions: "",
160
+ instructions: "only dev",
161
+ });
162
+ await codex.submit({ type: "UserInput", items: [{ type: "text", text: "hi" }] });
163
+ await waitForEvent(codex, (m) => m.type === "TurnComplete");
164
+ const instr = capturedInstructions(fetchMock);
165
+ expect(instr).toBe("only dev");
166
+ });
167
+ it("per-turn instructions override thread instructions but keep base", async () => {
168
+ const fetchMock = vi.fn().mockResolvedValue(makeSimpleResponse());
169
+ vi.stubGlobal("fetch", fetchMock);
170
+ const codex = new CodexThread({
171
+ apiKey: "k", model: "m",
172
+ instructions: "thread-level",
173
+ });
174
+ await codex.submit({
175
+ type: "UserInput",
176
+ items: [{ type: "text", text: "hi" }],
177
+ instructions: "per-turn override",
178
+ });
179
+ await waitForEvent(codex, (m) => m.type === "TurnComplete");
180
+ const instr = capturedInstructions(fetchMock);
181
+ expect(instr).toContain("per-turn override");
182
+ expect(instr).not.toContain("thread-level");
183
+ expect(instr).toContain(DEFAULT_BASE_INSTRUCTIONS.slice(0, 20));
184
+ });
185
+ });
186
+ //# sourceMappingURL=extensions.test.js.map