pi-mono/packages/durable/test
Petr Houška 6d3e342b25
fix(coding-agent): follow local schema refs in tool search and codemode summaries (#11850)
Fixes #11803.

**Problem**

`tool_search` builds a tool's search text from its parameter schema but
never followed `$ref`. MCP servers (Pydantic, FastMCP) often put nested
models in `$defs`:

```json
{ "properties": { "options": { "$ref": "#/$defs/options" } },
  "$defs": { "options": { "properties": { "mode": { "description": "reconciliation" } } } } }
```

Search text was `Inspect records options`, so
`tool_search("reconciliation")` found nothing. Durable's copy of
`tool_search` had the same gap. The codemode `resolves to` summary had
the same blind spot for output schemas: a field behind a `$ref` showed
as `structuredContent?` with no field names.

**Fix**

- pi-codemode exports its existing local JSON Pointer resolver as
`resolveSchemaRef(ref, root)`. A malformed percent escape now resolves
to nothing instead of throwing `URIError` (this also affected
`schemaToType()`).
- coding-agent and Durable `schemaText()` follow local `$ref`s. Each
referenced subschema is read once, so recursive and shared definitions
neither loop nor inflate BM25 term counts. Unreferenced `$defs` and
remote refs stay out.
- coding-agent `describeFields()`/`describeUnionFields()` resolve `$ref`
chains against the output schema root.

**Tests**

- `packages/codemode/test/declarations.test.ts`: escaped, remote,
missing, malformed refs.
- `packages/coding-agent/test/tool-search.test.ts`: refs, escaped
segments, recursion and shared definitions, unused definitions.
- `packages/coding-agent/test/suite/agent-session-codemode.test.ts`:
summary through root, field, const, and union refs.
- `packages/durable/test/tool-search.test.ts`: end-to-end load via a
ref'd description; unused definition does not match.

`npm run check` passes.
2026-11-06 00:19:58 +01:00
..
examples feat(chord): Chord v2 is the package's root 2026-11-02 22:36:55 +00:00
fixtures feat(durable): first coding-agent tool turn (Package 16) 2026-09-29 21:24:32 +02:00
chat-support.ts feat(chord): Chord v2 is the package's root 2026-11-02 22:36:55 +00:00
codemode-bench.ts feat(ai,agent,coding-agent): validate tool arguments with pi-schema, drop TypeBox 2026-11-01 10:08:42 +00:00
codemode-checkpoints.test.ts feat: checkpointWhen is required on Durable document definitions 2026-10-19 18:17:42 +00:00
codemode-describe.test.ts feat(ai,agent,coding-agent): validate tool arguments with pi-schema, drop TypeBox 2026-11-01 10:08:42 +00:00
codemode-imports.test.ts fix(durable): import toCodemodeIdentifier from pi-codemode/declarations 2026-10-27 21:31:47 +00:00
codemode-models.test.ts feat(chord): Chord v2 is the package's root 2026-11-02 22:36:55 +00:00
codemode.test.ts feat(chord): Chord v2 is the package's root 2026-11-02 22:36:55 +00:00
conversation-transcript.test.ts feat(chord,durable): failures are watch calls; one vocabulary for watches, observers and reports 2026-10-27 20:38:08 +00:00
conversation-view-bench.ts feat(chord): Chord v2 is the package's root 2026-11-02 22:36:55 +00:00
document-append-bench.ts feat: checkpointWhen is required on Durable document definitions 2026-10-19 18:17:42 +00:00
env-line-scan.test.ts feat(durable): bounded read tool via BinaryReader.scanLines 2026-10-04 23:15:37 +02:00
env-node-conformance.test.ts feat(chord,durable): failures are watch calls; one vocabulary for watches, observers and reports 2026-10-27 20:38:08 +00:00
env-node-spill.test.ts feat(durable): first coding-agent tool turn (Package 16) 2026-09-29 21:24:32 +02:00
env-node.test.ts fix(coding-agent): resolve Windows shells from installation directories 2026-10-19 21:55:12 +02:00
env-truncate.test.ts feat(chord,durable): move OutputBuffer and Progress to @earendil-works/chord/output 2026-10-15 09:59:46 +00:00
harness-after-run.test.ts feat(chord): Chord v2 is the package's root 2026-11-02 22:36:55 +00:00
harness-blocked.test.ts feat(durable): group commit and batch Storage.commit 2026-10-30 10:41:11 +00:00
harness-callers.test.ts feat(ai,agent,coding-agent): validate tool arguments with pi-schema, drop TypeBox 2026-11-01 10:08:42 +00:00
harness-cancellation-barrier.test.ts feat(chord): Chord v2 is the package's root 2026-11-02 22:36:55 +00:00
harness-compaction.test.ts feat(ai,agent,coding-agent): validate tool arguments with pi-schema, drop TypeBox 2026-11-01 10:08:42 +00:00
harness-context-range.test.ts feat(durable): group commit and batch Storage.commit 2026-10-30 10:41:11 +00:00
harness-context.test.ts feat(chord): Chord v2 is the package's root 2026-11-02 22:36:55 +00:00
harness-continue.test.ts feat(ai,agent,coding-agent): validate tool arguments with pi-schema, drop TypeBox 2026-11-01 10:08:42 +00:00
harness-conversations.test.ts feat: Durable storage adopt callback inside the commit, watch types in Chord, explicit watch retirement 2026-10-22 10:52:59 +00:00
harness-deferred-progress.test.ts feat(ai,agent,coding-agent): validate tool arguments with pi-schema, drop TypeBox 2026-11-01 10:08:42 +00:00
harness-failed-run-inbox.test.ts fix(durable): review fixes for the crash-loop guard, reports, and blocked tasks 2026-10-18 00:53:14 +00:00
harness-generation-recovery.test.ts feat(durable): run-end tasks with the afterRun hook 2026-10-28 14:03:25 +00:00
harness-generation.test.ts feat(durable): expose thinking budget and websocket timeout options (#10410) 2026-11-04 11:22:51 +01:00
harness-group-commit.test.ts feat(chord): Chord v2 is the package's root 2026-11-02 22:36:55 +00:00
harness-hook-reads.test.ts feat(durable): entry reads for hooks and tasks 2026-10-28 14:03:00 +00:00
harness-host-inputs.test.ts feat(ai,agent,coding-agent): validate tool arguments with pi-schema, drop TypeBox 2026-11-01 10:08:42 +00:00
harness-idle-scopes.test.ts fix(durable): idle checks and wake() without per-commit scans 2026-10-30 23:17:56 +00:00
harness-inbox.test.ts feat(ai,agent,coding-agent): validate tool arguments with pi-schema, drop TypeBox 2026-11-01 10:08:42 +00:00
harness-input-entries.test.ts feat(ai,agent,coding-agent): validate tool arguments with pi-schema, drop TypeBox 2026-11-01 10:08:42 +00:00
harness-inspect.test.ts feat(chord,durable): failures are watch calls; one vocabulary for watches, observers and reports 2026-10-27 20:38:08 +00:00
harness-json.test.ts fix: harden handling of untrusted URLs, terminal text, and streamed data 2026-10-26 20:46:31 +01:00
harness-lifecycle.test.ts feat(chord): Chord v2 is the package's root 2026-11-02 22:36:55 +00:00
harness-live-deltas.test.ts feat(ai,agent,coding-agent): validate tool arguments with pi-schema, drop TypeBox 2026-11-01 10:08:42 +00:00
harness-nested-tools-restart.test.ts feat(chord): Chord v2 is the package's root 2026-11-02 22:36:55 +00:00
harness-nested-tools.test.ts feat(chord): Chord v2 is the package's root 2026-11-02 22:36:55 +00:00
harness-observers.test.ts feat(chord): Chord v2 is the package's root 2026-11-02 22:36:55 +00:00
harness-ownership.test.ts feat(ai,agent,coding-agent): validate tool arguments with pi-schema, drop TypeBox 2026-11-01 10:08:42 +00:00
harness-partial-changes.test.ts feat(chord): Chord v2 is the package's root 2026-11-02 22:36:55 +00:00
harness-prompt.test.ts feat(ai,agent,coding-agent): validate tool arguments with pi-schema, drop TypeBox 2026-11-01 10:08:42 +00:00
harness-read-only.test.ts feat(chord,durable): failures are watch calls; one vocabulary for watches, observers and reports 2026-10-27 20:38:08 +00:00
harness-registry-reader.test.ts feat(chord): Chord v2 is the package's root 2026-11-02 22:36:55 +00:00
harness-registry.test.ts feat(ai,agent,coding-agent): validate tool arguments with pi-schema, drop TypeBox 2026-11-01 10:08:42 +00:00
harness-reports.test.ts feat(ai,agent,coding-agent): validate tool arguments with pi-schema, drop TypeBox 2026-11-01 10:08:42 +00:00
harness-restart-failure.test.ts feat(ai,agent,coding-agent): validate tool arguments with pi-schema, drop TypeBox 2026-11-01 10:08:42 +00:00
harness-run-failure.test.ts feat(ai,agent,coding-agent): validate tool arguments with pi-schema, drop TypeBox 2026-11-01 10:08:42 +00:00
harness-scheduler-indexes.test.ts feat(durable): group commit and batch Storage.commit 2026-10-30 10:41:11 +00:00
harness-scheduler-retention.test.ts feat(durable): group commit and batch Storage.commit 2026-10-30 10:41:11 +00:00
harness-sleep.test.ts feat: Durable storage adopt callback inside the commit, watch types in Chord, explicit watch retirement 2026-10-22 10:52:59 +00:00
harness-storage-failure.test.ts feat(chord): Chord v2 is the package's root 2026-11-02 22:36:55 +00:00
harness-structured-output.test.ts feat(chord): Chord v2 is the package's root 2026-11-02 22:36:55 +00:00
harness-structured.test.ts feat(chord): Chord v2 is the package's root 2026-11-02 22:36:55 +00:00
harness-submissions.test.ts feat(durable): group commit and batch Storage.commit 2026-10-30 10:41:11 +00:00
harness-submit-in-commit.test.ts feat(durable): Tx.submission(id) reads a submission record by ID 2026-11-04 21:57:58 +00:00
harness-support.ts feat(ai,agent,coding-agent): validate tool arguments with pi-schema, drop TypeBox 2026-11-01 10:08:42 +00:00
harness-task-graph.test.ts feat(chord): Chord v2 is the package's root 2026-11-02 22:36:55 +00:00
harness-tasks-recovery.test.ts feat(chord): Chord v2 is the package's root 2026-11-02 22:36:55 +00:00
harness-tasks.test.ts feat(chord): Chord v2 is the package's root 2026-11-02 22:36:55 +00:00
harness-telemetry-options.test.ts feat: Durable and pi-ai telemetry; Context.telemetry is always a span 2026-10-19 06:26:02 +00:00
harness-telemetry.test.ts feat(ai,agent,coding-agent): validate tool arguments with pi-schema, drop TypeBox 2026-11-01 10:08:42 +00:00
harness-tool-hooks.test.ts feat(chord): Chord v2 is the package's root 2026-11-02 22:36:55 +00:00
harness-tools-recovery.test.ts feat(chord): Chord v2 is the package's root 2026-11-02 22:36:55 +00:00
harness-tools.test.ts feat(chord): Chord v2 is the package's root 2026-11-02 22:36:55 +00:00
harness-turn-limit.test.ts feat(ai,agent,coding-agent): validate tool arguments with pi-schema, drop TypeBox 2026-11-01 10:08:42 +00:00
harness-view-run.test.ts feat(chord): Chord v2 is the package's root 2026-11-02 22:36:55 +00:00
harness-view.test.ts feat(durable): group commit and batch Storage.commit 2026-10-30 10:41:11 +00:00
heap-retained.ts feat(durable): bound the Session's document cache by use (documentRetentionMs) 2026-10-11 08:03:35 +00:00
images-wasm-module.test.ts feat(durable): read returns images, optional Photon image processor 2026-10-09 19:38:02 +00:00
indexeddb-storage.test.ts feat(chord): Chord v2 is the package's root 2026-11-02 22:36:55 +00:00
jsonl-storage.test.ts feat(chord): Chord v2 is the package's root 2026-11-02 22:36:55 +00:00
live-support.ts feat(chord,durable): failures are watch calls; one vocabulary for watches, observers and reports 2026-10-27 20:38:08 +00:00
memory-storage.test.ts feat(durable): group commit and batch Storage.commit 2026-10-30 10:41:11 +00:00
nested-images-bench.ts feat(ai,agent,coding-agent): validate tool arguments with pi-schema, drop TypeBox 2026-11-01 10:08:42 +00:00
nested-tools-bench.ts feat(ai,agent,coding-agent): validate tool arguments with pi-schema, drop TypeBox 2026-11-01 10:08:42 +00:00
provider-session-cache-e2e.test.ts fix(durable): run the Codex prompt-cache e2e test on gpt-6.1-sol 2026-10-16 19:42:02 +00:00
scheduler-fanout-bench.ts feat(ai,agent,coding-agent): validate tool arguments with pi-schema, drop TypeBox 2026-11-01 10:08:42 +00:00
scheduler-memory-bench.ts feat(durable): bound the Session's document cache by use (documentRetentionMs) 2026-10-11 08:03:35 +00:00
search.test.ts fix(durable,coding-agent): support Unicode word segmentation in tool search (#11037) 2026-10-30 23:34:00 +01:00
session-adoption.test.ts feat(chord): Chord v2 is the package's root 2026-11-02 22:36:55 +00:00
session-cached-storage.test.ts feat(chord): Chord v2 is the package's root 2026-11-02 22:36:55 +00:00
session-checkpoints-migrations.test.ts feat(chord,durable): failures are watch calls; one vocabulary for watches, observers and reports 2026-10-27 20:38:08 +00:00
session-conversation-tails.test.ts feat(durable): group commit and batch Storage.commit 2026-10-30 10:41:11 +00:00
session-deferred-commits.test.ts feat(chord): Chord v2 is the package's root 2026-11-02 22:36:55 +00:00
session-definitions.test.ts feat(chord): Chord v2 is the package's root 2026-11-02 22:36:55 +00:00
session-document-cache-bench.ts feat(durable): bound the Session's document cache by use (documentRetentionMs) 2026-10-11 08:03:35 +00:00
session-document-retention.test.ts feat(ai,agent,coding-agent): validate tool arguments with pi-schema, drop TypeBox 2026-11-01 10:08:42 +00:00
session-documents.test.ts feat(chord): Chord v2 is the package's root 2026-11-02 22:36:55 +00:00
session-forks.test.ts feat(chord,durable): failures are watch calls; one vocabulary for watches, observers and reports 2026-10-27 20:38:08 +00:00
session-group-commit.test.ts feat(chord): Chord v2 is the package's root 2026-11-02 22:36:55 +00:00
session-observers.test.ts feat(chord): Chord v2 is the package's root 2026-11-02 22:36:55 +00:00
session-support.ts feat(chord): Chord v2 is the package's root 2026-11-02 22:36:55 +00:00
session-tables.test.ts feat(chord): Chord v2 is the package's root 2026-11-02 22:36:55 +00:00
session-watches.test.ts feat(chord): Chord v2 is the package's root 2026-11-02 22:36:55 +00:00
setup-document-retention.ts feat(durable): bound the Session's document cache by use (documentRetentionMs) 2026-10-11 08:03:35 +00:00
spec-usage.test.ts feat(chord): Chord v2 is the package's root 2026-11-02 22:36:55 +00:00
sqlite-cloudflare.test.ts feat(durable): group commit and batch Storage.commit 2026-10-30 10:41:11 +00:00
sqlite-commit.test.ts fix(durable): raise timeout of seeded SqliteStorage batch commit tests 2026-11-05 09:50:00 +01:00
sqlite-facade.test.ts feat(durable): group commit and batch Storage.commit 2026-10-30 10:41:11 +00:00
sqlite-migrations.test.ts feat(durable): group commit and batch Storage.commit 2026-10-30 10:41:11 +00:00
sqlite-storage.test.ts feat(durable): SqliteStorage commits a group in a few statements 2026-11-04 19:53:23 +00:00
storage-memory.ts feat(chord,durable): Chord v2 slice 6b, Durable and jobs on the store 2026-10-28 19:18:30 +00:00
storage-runtime-boundary.test.ts feat(durable): first coding-agent tool turn (Package 16) 2026-09-29 21:24:32 +02:00
storage.bench.ts feat(chord,durable): Chord v2 slice 6b, Durable and jobs on the store 2026-10-28 19:18:30 +00:00
store-storage-commit.test.ts feat(chord): Chord v2 is the package's root 2026-11-02 22:36:55 +00:00
store-storage-node.ts feat(chord,durable): Chord v2 slice 6b, Durable and jobs on the store 2026-10-28 19:18:30 +00:00
store-storage-support.ts feat(chord): Chord v2 is the package's root 2026-11-02 22:36:55 +00:00
store-storage.test.ts feat(chord): Chord v2 is the package's root 2026-11-02 22:36:55 +00:00
system-order-cache-e2e.test.ts feat(ai,agent,coding-agent): validate tool arguments with pi-schema, drop TypeBox 2026-11-01 10:08:42 +00:00
task-support.ts feat(chord,durable): failures are watch calls; one vocabulary for watches, observers and reports 2026-10-27 20:38:08 +00:00
tool-args-typebox.test.ts feat(agent): pi-schema's Static types TypeBox-built schemas too, without depending on TypeBox 2026-11-01 11:12:44 +00:00
tool-output-bench.ts feat(ai,agent,coding-agent): validate tool arguments with pi-schema, drop TypeBox 2026-11-01 10:08:42 +00:00
tool-search.test.ts fix(coding-agent): follow local schema refs in tool search and codemode summaries (#11850) 2026-11-06 00:19:58 +01:00
tools-images.test.ts fix(durable): encode base64 with btoa, without retaining concatenation trees 2026-10-14 09:41:45 +00:00
tools-read-differential.test.ts fix(durable): return image blocks from read in Code Mode scripts (#11606) 2026-10-30 12:23:48 +01:00
tools.test.ts feat(chord): Chord v2 is the package's root 2026-11-02 22:36:55 +00:00
types.test.ts feat(chord): Chord v2 is the package's root 2026-11-02 22:36:55 +00:00