@arnilo/prism 0.5.5 → 0.6.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 (71) hide show
  1. package/CHANGELOG.md +46 -0
  2. package/README.md +10 -10
  3. package/dist/agent-approval.js +7 -6
  4. package/dist/agent-loops.js +51 -12
  5. package/dist/agent-session/session.d.ts +1 -0
  6. package/dist/agent-session/session.js +20 -2
  7. package/dist/agent-tool-dispatch.js +5 -4
  8. package/dist/cli-runner.d.ts +8 -1
  9. package/dist/cli-runner.js +97 -7
  10. package/dist/content.d.ts +3 -16
  11. package/dist/content.js +9 -99
  12. package/dist/context-budget.d.ts +12 -1
  13. package/dist/context-budget.js +42 -19
  14. package/dist/contracts-core/agent.d.ts +11 -0
  15. package/dist/contracts-core/agent.js +4 -1
  16. package/dist/extensions.d.ts +18 -1
  17. package/dist/extensions.js +10 -0
  18. package/dist/index.d.ts +6 -6
  19. package/dist/index.js +4 -4
  20. package/dist/input.d.ts +6 -0
  21. package/dist/input.js +12 -1
  22. package/dist/media-types.d.ts +34 -0
  23. package/dist/media-types.js +158 -0
  24. package/dist/pinned-fetch.d.ts +2 -2
  25. package/dist/pinned-fetch.js +11 -12
  26. package/dist/redaction.js +74 -1
  27. package/dist/session-stores.d.ts +11 -0
  28. package/dist/session-stores.js +23 -8
  29. package/docs/acp.md +1 -1
  30. package/docs/ag-ui.md +4 -2
  31. package/docs/agent-events.md +2 -0
  32. package/docs/agent-loops.md +1 -1
  33. package/docs/agent-session-runtime.md +3 -1
  34. package/docs/browser-automation.md +5 -2
  35. package/docs/cli-rpc.md +15 -1
  36. package/docs/contributing.md +37 -0
  37. package/docs/core.md +2 -0
  38. package/docs/document-reader.md +2 -0
  39. package/docs/documents.md +1 -1
  40. package/docs/extension-authoring.md +8 -9
  41. package/docs/extensions.md +13 -1
  42. package/docs/graft.md +29 -5
  43. package/docs/history/release-handoffs.md +33 -0
  44. package/docs/host-security.md +2 -2
  45. package/docs/index.md +33 -17
  46. package/docs/input-and-prompt-assembly.md +4 -4
  47. package/docs/language-intelligence.md +1 -1
  48. package/docs/migrate-to-0.5.md +7 -2
  49. package/docs/migrate-to-0.6.md +89 -0
  50. package/docs/migration.md +30 -0
  51. package/docs/model-registry.md +1 -1
  52. package/docs/multimodal-content.md +1 -1
  53. package/docs/obscura.md +3 -1
  54. package/docs/options-index.md +286 -0
  55. package/docs/peer-dependencies.md +94 -0
  56. package/docs/performance.md +34 -2
  57. package/docs/ponytail.md +2 -0
  58. package/docs/postgres-persistence.md +3 -1
  59. package/docs/provider-conformance.md +1 -1
  60. package/docs/provider-packages.md +21 -21
  61. package/docs/provider-primitives.md +2 -1
  62. package/docs/providers/ai-sdk.md +5 -2
  63. package/docs/public-contracts.md +2 -2
  64. package/docs/release-and-install.md +75 -55
  65. package/docs/server.md +1 -1
  66. package/docs/session-stores.md +3 -1
  67. package/docs/sqlite-persistence.md +2 -0
  68. package/docs/testing.md +38 -0
  69. package/docs/tools.md +1 -1
  70. package/docs/wiki.md +47 -3
  71. package/package.json +5 -5
@@ -37,7 +37,7 @@ import { createModelRegistry, type ModelConfig } from "@arnilo/prism";
37
37
  | `provider` / `model` | Required registry key. |
38
38
  | `displayName` | Human-readable label. |
39
39
  | `capabilities` | Input/output modes (`text`, `image`, `audio`, `file`, `document`) plus reasoning/tools/streaming booleans and optional `structuredOutput` (`true` or `"json_schema"`) for native JSON-schema requests. |
40
- | `limits` | Context and output-token limits. |
40
+ | `limits` | Context and output-token limits (`ModelLimits`). |
41
41
  | `cost` | Input/output/cache read/cache write pricing. |
42
42
  | `cache` | Generic `ModelCacheCapabilities`. |
43
43
  | `compat` | Provider-owned inert JSON escape hatch. |
@@ -167,7 +167,7 @@ from `@arnilo/prism/testing/provider-conformance`.
167
167
  ## Security and performance notes
168
168
 
169
169
  - SSRF deny-by-default blocks IPv4/IPv6 loopback, private/unique-local, link-local, unspecified, multicast, IPv4-mapped private, and cloud metadata targets. DNS answers are all classified before one public address is pinned; mixed public/private answers fail closed.
170
- - `allowedHostnames` is an explicit trust override and may permit a private destination. `denyPrivateHosts: false` is broader and should be reserved for hosts that intentionally own private-network access.
170
+ - `allowedHostnames` is an explicit trust override and may permit a private destination. `allowedCidrs` is the range equivalent (`"10.0.0.0/8"`, `"fd00::/8"`; IPv4 + IPv6): it is checked after the hostname allow-list and the denied-name list, applies to both URL literals and resolved DNS answers, and bypasses **only** the private-IP block — `metadata.google.internal`/localhost-class names, credentials, and every literal outside the listed ranges stay denied, and a malformed entry fails the policy closed. `denyPrivateHosts: false` is broader and should be reserved for hosts that intentionally own private-network access.
171
171
  - DNS lookup, connection, and body streaming share `fetchTimeoutMs` and caller abort; more than 32 resolved addresses, redirects, and oversized response bodies are rejected.
172
172
  - Media URL fetches (0.2.1) route through the core `pinnedFetch` primitive — DNS-pinned resolution with per-answer SSRF checks (rebinding defense) and outright 3xx rejection — while keeping the `fetch`/`resolveHostname`/`requestUrl` host seams and the existing byte budgets.
173
173
  - MIME validation rejects common magic-byte spoofing; extensions alone are never trusted.
package/docs/obscura.md CHANGED
@@ -1,5 +1,7 @@
1
1
  # Obscura browser engine
2
2
 
3
+ > **Optional peer install:** `playwright-core@1.63.0` (exact pin) for the CDP leg — see [Optional peer dependencies](peer-dependencies.md).
4
+
3
5
  Optional `@arnilo/prism-web-tools/obscura` support for a host-installed
4
6
  [Obscura](https://github.com/h4ckf0r0day/obscura) headless browser. Obscura is never
5
7
  bundled — install the binary (or use the `h4ckf0r0day/obscura` Docker image) and point
@@ -99,7 +101,7 @@ await session.close(); // browser first, then the owned process
99
101
  - Endpoints are loopback-only unless `allowRemoteEndpoint` is set; credentials in the
100
102
  URL are always rejected; remote plain `ws:`/`http:` is refused (no authentication —
101
103
  require an authenticated `wss:`/`https:` tunnel).
102
- - The Playwright import is an optional exact `playwright-core@1.61.0` peer; supply
104
+ - The Playwright import is an optional exact `playwright-core@1.63.0` peer; supply
103
105
  `connectObscuraCdp({ playwright })` to inject a host-selected build.
104
106
  - The returned browser composes with `createBrowserManager`/`createBrowserTools`:
105
107
  snapshots, actions, policy, checkpoints, and artifacts are Prism-owned. Raw CDP
@@ -0,0 +1,286 @@
1
+ # Configuration options index
2
+
3
+ ## What it does
4
+
5
+ Maps every public configuration surface — the `*Options`, `*Limits`, and `*Config` types a host passes into Prism — to the doc page that owns its fields. Prism has one options object per seam rather than a global config tree, so "where do I set this?" is the recurring onboarding question; this page answers it in one hop.
6
+
7
+ ## When to use it
8
+
9
+ - Wiring a host for the first time and looking for the right seam (`AgentConfig`, `RunOptions`, `ModelConfig`, …).
10
+ - Reviewing which surfaces a run, session, or adapter can override before writing an override.
11
+ - Checking whether a knob is host-tunable at all before assuming a limit is hardcoded.
12
+
13
+ Field-level detail (defaults, bounds, failure modes) lives on the owning page — this index only routes you there.
14
+
15
+ ## Start here: the surfaces most hosts set
16
+
17
+ | Surface | Configures | Owning page |
18
+ | --- | --- | --- |
19
+ | `AgentConfig` | The reusable agent: provider, model, tools, skills, stores, retry, compaction, prompts, limits | [Agent/session runtime](agent-session-runtime.md) |
20
+ | `RunOptions` | One run's overrides: model, limits, thinking level, skills, middleware, metadata, signal | [Agent/session runtime](agent-session-runtime.md) |
21
+ | `AgentSessionConfig` | Session creation: id, agent, store, branch leaf, snapshot cache TTL | [Agent/session runtime](agent-session-runtime.md) |
22
+ | `ModelConfig` | A registered model record: capabilities, limits, cost, cache and thinking metadata | [Model registry](model-registry.md) |
23
+ | `ProviderRequestOptions` | Per-request provider hints: session/cache/header/compat/extra, applied after host policies | [Provider layer](provider-layer.md) |
24
+
25
+ ## How options behave
26
+
27
+ - **Fixed defaults, host overrides.** Every option is optional; the value it replaces is the documented default, and an omitted option is exactly equivalent to passing the default explicitly.
28
+ - **Two-tier caps.** Tunable limits follow the repo convention `DEFAULT_*` (used when the host sets nothing) and `HARD_*` (the ceiling a host value is validated against), exported next to the option that accepts them. A value outside `1..HARD` (or `0..HARD` where zero means "disabled") fails closed with a `TypeError` at construction or assembly — never a silent clamp.
29
+ - **Request-time overrides narrow, never widen.** `RunOptions.limits` can only tighten `AgentConfig.limits`; a configured finite ceiling wins over `null`.
30
+ - **Byte caps are not estimator-dependent.** Token-budget options that accept a host estimator (`tokenEstimator`) affect eviction accounting only; byte caps and redaction stay authoritative.
31
+
32
+ ## Agent/session runtime
33
+
34
+ **Agent definitions** — [`agent-definitions.md`](agent-definitions.md)
35
+ `DiscoverAgentBundlesOptions`, `ResolveAgentBundleOptions`
36
+
37
+ **Agent events** — [`agent-events.md`](agent-events.md)
38
+ `SubscribeOptions`
39
+
40
+ **Agent loops** — [`agent-loops.md`](agent-loops.md)
41
+ `AgentLoopOptions`
42
+
43
+ **Agent/session runtime** — [`agent-session-runtime.md`](agent-session-runtime.md)
44
+ `AgentConfig`, `AgentRunResumeStreamOptions`, `AgentSessionCloneOptions`, `AgentSessionConfig`, `AgentSessionForkOptions`, `RunOptions`, `SteerOptions`
45
+
46
+ **Evaluations** — [`evaluations.md`](evaluations.md)
47
+ `ScoreRunOptions`
48
+
49
+ **Runs and usage ledger** — [`runs-and-usage.md`](runs-and-usage.md)
50
+ `RunLimits`
51
+
52
+ **Structured output** — [`structured-output.md`](structured-output.md)
53
+ `StructuredOutputOptions`
54
+
55
+ ## Compaction and session memory
56
+
57
+ **Compaction and retry policies** — [`compaction-and-retry.md`](compaction-and-retry.md)
58
+ `CompactionOptions`, `DefaultCompactionStrategyOptions`, `DefaultRetryPolicyOptions`, `RetryOptions`
59
+
60
+ **LLM compaction package** — [`compaction-llm.md`](compaction-llm.md)
61
+ `LlmCompactionStrategyOptions`
62
+
63
+ **Conversations** — [`conversations.md`](conversations.md)
64
+ `ConversationLimits`
65
+
66
+ **Node JSONL session store** — [`node-jsonl-session-store.md`](node-jsonl-session-store.md)
67
+ `JsonlSessionStoreOptions`
68
+
69
+ **PostgreSQL persistence** — [`postgres-persistence.md`](postgres-persistence.md)
70
+ `AgentEventSourceOptions`, `PostgresPersistenceOptions`
71
+
72
+ **Session stores** — [`session-stores.md`](session-stores.md)
73
+ `CreateMemorySessionStoreOptions`, `SessionAppendOptions`
74
+
75
+ **SQLite persistence** — [`sqlite-persistence.md`](sqlite-persistence.md)
76
+ `SqlitePersistenceOptions`
77
+
78
+ **Working and semantic memory** — [`working-and-semantic-memory.md`](working-and-semantic-memory.md)
79
+ `PostgresVectorStoreOptions`, `RecallScoringOptions`
80
+
81
+ ## Provider and model connection
82
+
83
+ **Model registry** — [`model-registry.md`](model-registry.md)
84
+ `ModelConfig`, `ModelLimits`
85
+
86
+ **Provider layer** — [`provider-layer.md`](provider-layer.md)
87
+ `MockProviderOptions`, `ProviderRequestOptions`
88
+
89
+ **Provider primitives** — [`provider-primitives.md`](provider-primitives.md)
90
+ `BoundedStreamLimits`
91
+
92
+ **Alibaba Cloud provider package** — [`providers/alibaba.md`](providers/alibaba.md)
93
+ `AlibabaEmbedderOptions`, `AlibabaModelConfig`, `AlibabaProviderOptions`, `AlibabaProviderPackageOptions`, `ListAlibabaModelsOptions`
94
+
95
+ **Anthropic provider package** — [`providers/anthropic.md`](providers/anthropic.md)
96
+ `AnthropicProviderPackageOptions`, `ListAnthropicModelsOptions`
97
+
98
+ **ClinePass provider package** — [`providers/clinepass.md`](providers/clinepass.md)
99
+ `ClinePassProviderPackageOptions`
100
+
101
+ **Command Code provider package** — [`providers/commandcode.md`](providers/commandcode.md)
102
+ `CommandCodeProviderPackageOptions`
103
+
104
+ **DeepSeek provider package** — [`providers/deepseek.md`](providers/deepseek.md)
105
+ `DeepSeekModelConfig`, `DeepSeekProviderPackageOptions`, `ListDeepSeekModelsOptions`
106
+
107
+ **Google provider package** — [`providers/google.md`](providers/google.md)
108
+ `GoogleProviderPackageOptions`, `ListGoogleModelsOptions`
109
+
110
+ **Hyper provider package** — [`providers/hyper.md`](providers/hyper.md)
111
+ `HyperProviderPackageOptions`
112
+
113
+ **Kimi provider package** — [`providers/kimi.md`](providers/kimi.md)
114
+ `KimiModelConfig`, `KimiProviderPackageOptions`, `ListKimiModelsOptions`
115
+
116
+ **NeuralWatt provider package** — [`providers/neuralwatt.md`](providers/neuralwatt.md)
117
+ `GetNeuralWattQuotaOptions`, `ListNeuralWattModelsOptions`, `NeuralWattModelConfig`, `NeuralWattProviderPackageOptions`
118
+
119
+ **Ollama Cloud provider package** — [`providers/ollama.md`](providers/ollama.md)
120
+ `ListOllamaModelsOptions`, `OllamaModelConfig`, `OllamaProviderOptions`, `OllamaProviderPackageOptions`
121
+
122
+ **OpenAI-compatible provider** — [`providers/openai-compatible.md`](providers/openai-compatible.md)
123
+ `OpenAICompatibleProviderOptions`
124
+
125
+ **OpenAI provider package** — [`providers/openai.md`](providers/openai.md)
126
+ `OpenAICodexOAuthOptions`, `OpenAIProviderPackageOptions`
127
+
128
+ **OpenCode Go provider package** — [`providers/opencode-go.md`](providers/opencode-go.md)
129
+ `OpenCodeGoProviderPackageOptions`
130
+
131
+ **OpenRouter provider package** — [`providers/openrouter.md`](providers/openrouter.md)
132
+ `ListOpenRouterModelsOptions`, `OpenRouterModelConfig`, `OpenRouterProviderPackageOptions`
133
+
134
+ **xAI provider package** — [`providers/xai.md`](providers/xai.md)
135
+ `ListXaiModelsOptions`, `XaiOAuthOptions`, `XaiProviderPackageOptions`
136
+
137
+ **Z.AI provider package** — [`providers/zai.md`](providers/zai.md)
138
+ `ListZaiModelsOptions`, `ZaiModelConfig`, `ZaiProviderPackageOptions`
139
+
140
+ ## Input, prompt, and context assembly
141
+
142
+ **Context and skills** — [`context-and-skills.md`](context-and-skills.md)
143
+ `ResolveActiveSkillsOptions`, `ResolveContextOptions`
144
+
145
+ **Input and prompt assembly** — [`input-and-prompt-assembly.md`](input-and-prompt-assembly.md)
146
+ `AssembleProviderInputOptions`, `PromptTemplateOptions`
147
+
148
+ **Multimodal content** — [`multimodal-content.md`](multimodal-content.md)
149
+ `ResolveMediaContentOptions`
150
+
151
+ **Retrieval-augmented generation (RAG)** — [`rag.md`](rag.md)
152
+ `CreateTeiRerankerOptions`
153
+
154
+ **System prompts** — [`system-prompts.md`](system-prompts.md)
155
+ `SystemPromptConfig`
156
+
157
+ ## Tools
158
+
159
+ **Browser automation** — [`browser-automation.md`](browser-automation.md)
160
+ `BrowserCdpOptions`
161
+
162
+ **Coding agent tools (first-party package)** — [`coding-agent-tools.md`](coding-agent-tools.md)
163
+ `EditToolOptions`, `ReadTextOptions`, `ReadToolOptions`, `RepositoryLimitOptions`, `ShellToolOptions`, `ToolsOptions`, `WriteToolOptions`
164
+
165
+ **Coding execution approval and sandboxing** — [`coding-security.md`](coding-security.md)
166
+ `DockerNetworkConfig`
167
+
168
+ **Device adapters** — [`device-adapters.md`](device-adapters.md)
169
+ `DevicePolicyOptions`
170
+
171
+ **GitHub forge integration** — [`forge-integration.md`](forge-integration.md)
172
+ `CreateGitRunnerOptions`, `ForgeLimits`
173
+
174
+ **Language intelligence** — [`language-intelligence.md`](language-intelligence.md)
175
+ `LanguageIntelligenceLimits`
176
+
177
+ **MCP client bridge and server exposure** — [`mcp-tools.md`](mcp-tools.md)
178
+ `CreatePrismMcpServerOptions`
179
+
180
+ **Process sessions** — [`process-sessions.md`](process-sessions.md)
181
+ `ProcessSessionLimits`
182
+
183
+ **Tools** — [`tools.md`](tools.md)
184
+ `DispatchToolCallOptions`
185
+
186
+ ## Documents, sheets, and diagrams
187
+
188
+ **Diagramming, draw.io embed client, and mxGraph XML validation** — [`diagrams.md`](diagrams.md)
189
+ `DrawioCanonicalizeOptions`, `DrawioEmbedOptions`, `DrawioExportOptions`, `DrawioLoadOptions`, `DrawioXmlOptions`
190
+
191
+ **Documents, spreadsheets, and presentations** — [`documents.md`](documents.md)
192
+ `GenerateDocumentOptions`, `ParseDocumentOptions`, `PatchDocumentOptions`, `PreviewBlocksOptions`, `PreviewHtmlOptions`
193
+
194
+ **Spreadsheets, CSV parsing, and typed schema inference** — [`sheets.md`](sheets.md)
195
+ `ParseCsvOptions`, `ParseWorkbookOptions`
196
+
197
+ ## Extensions and plugins
198
+
199
+ **Contribution discovery (workspace)** — [`contribution-discovery.md`](contribution-discovery.md)
200
+ `DiscoveryOptions`
201
+
202
+ **Extension kernel and event bus** — [`extensions.md`](extensions.md)
203
+ `ExtensionKernelOptions`
204
+
205
+ **Middleware hooks** — [`middleware-hooks.md`](middleware-hooks.md)
206
+ `MiddlewareRegistryOptions`
207
+
208
+ ## Configuration and manifests
209
+
210
+ **Resource loading** — [`resource-loading.md`](resource-loading.md)
211
+ `LoadBinaryResourceOptions`
212
+
213
+ ## Server/API
214
+
215
+ **Web-standard server handler** — [`server.md`](server.md)
216
+ `PrismServerLimits`
217
+
218
+ ## Multi-agent and interoperability
219
+
220
+ **Agent Client Protocol (ACP) coding-host interop** — [`acp.md`](acp.md)
221
+ `AcpCapabilitiesOptions`, `CreatePrismAcpAgentOptions`
222
+
223
+ **Frontend interoperability (AG-UI and ACP)** — [`ag-ui.md`](ag-ui.md)
224
+ `AgUiLimitOptions`
225
+
226
+ ## CLI/RPC
227
+
228
+ **Workflows** — [`workflows.md`](workflows.md)
229
+ `RunWorkflowOptions`
230
+
231
+ ## Conformance harnesses
232
+
233
+ These option objects configure the shipped test doubles a host runs against its own adapters (provider, store, run ledger, compaction, tool, extension). They are host-facing, but only in test code.
234
+
235
+ **Compaction conformance** — [`compaction-conformance.md`](compaction-conformance.md)
236
+ `CompactionConformanceOptions`
237
+
238
+ **Extension conformance** — [`extension-conformance.md`](extension-conformance.md)
239
+ `ExtensionConformanceOptions`
240
+
241
+ **Run ledger conformance** — [`run-ledger-conformance.md`](run-ledger-conformance.md)
242
+ `RunLedgerConformanceOptions`
243
+
244
+ **Session store conformance** — [`session-store-conformance.md`](session-store-conformance.md)
245
+ `SessionStoreConformanceOptions`
246
+
247
+ **Tool conformance** — [`tool-conformance.md`](tool-conformance.md)
248
+ `ToolConformanceOptions`, `ToolDisclosureConformanceOptions`, `ToolDispatchProbeOptions`
249
+
250
+ ## Implementation example
251
+
252
+ ```ts
253
+ import { createAgent, createMemorySessionStore } from "@arnilo/prism";
254
+
255
+ // Agent-level: the long-lived defaults.
256
+ const agent = createAgent({
257
+ provider,
258
+ model: { id: "gpt-4o", provider: "openai" },
259
+ limits: { maxTurns: 12, maxToolRounds: 8 }, // AgentConfig.limits
260
+ store: createMemorySessionStore([], { search: { maxLinearSessions: 5_000 } }),
261
+ });
262
+
263
+ // Session-level: identity, branch, and snapshot cache.
264
+ const session = agent.createSession({ leafId: "leaf-1", snapshotCacheTtlMs: 0 });
265
+
266
+ // Run-level: only narrows what the agent configured.
267
+ await session.run("hi", { limits: { maxToolRounds: 2 }, thinkingLevel: "low" });
268
+ ```
269
+
270
+ ## Extension and configuration notes
271
+
272
+ - Options are plain data. A host overrides behavior by passing a *different implementation* to the seam (`store`, `providerSource`, `loop`, policies), not by mutating a shared config object.
273
+ - Layered JSON configuration (`mergeConfigLayers`) resolves to the same option shapes; see [Configuration and manifests](configuration-and-manifests.md).
274
+ - This index is checked against the source tree: every surface named here must exist as a declared `*Options`/`*Limits`/`*Config` type, and every link must resolve. See `scripts/live-doc-check.test.mjs`.
275
+
276
+ ## Security and performance notes
277
+
278
+ - Credentials never appear in these option objects; secrets resolve through credential providers and are redacted before they reach requests, logs, or events. See [Credentials and redaction](credentials-and-redaction.md).
279
+ - Trust boundaries are options too (`trust`, permission policies, sandbox and egress config). Tightening them is always allowed; loosening one requires the host to pass it explicitly. See [Host security guide](host-security.md).
280
+ - Raising a cap raises resource use. Caps exist to bound memory, sockets, subprocesses, and provider spend; prefer narrowing per run over raising an agent-wide ceiling.
281
+
282
+ ## Related APIs
283
+
284
+ - [Public contracts](public-contracts.md): the shapes these options produce and the store/tool/provider interfaces they configure.
285
+ - [Optional peer dependencies](peer-dependencies.md): which surfaces need an extra install before their options are reachable.
286
+ - [SDK customization guide](customization.md): a seam-by-seam walkthrough of replacing Prism primitives.
@@ -0,0 +1,94 @@
1
+ # Optional peer dependencies
2
+
3
+ ## What it does
4
+
5
+ Lists every third-party peer a Prism package declares, what importing that peer unlocks, and the exact install line for it. Prism keeps optional integrations behind peer dependencies so a host installs a browser, a database driver, or a vendor SDK only when it actually uses that surface — and so the host, not Prism, owns the version, the binary, and the supply chain.
6
+
7
+ ## When to use it
8
+
9
+ - Before installing a subpath: check whether it needs an extra package.
10
+ - Reviewing supply chain: which peers open a network connection, and which are pinned.
11
+ - Debugging a "peer not installed" error from a gated subpath.
12
+ - Auditing which of your already-installed packages a Prism surface will reuse.
13
+
14
+ Internal `@arnilo/*` peers are not listed here: every first-party package declares a required `@arnilo/prism` peer, and the release gate keeps all internal ranges locked to the cut version. This page covers the **11 third-party declarations across 6 packages**.
15
+
16
+ ## Matrix
17
+
18
+ One row per declaration. `Unlocks` names the subpath whose import reaches the peer; `Install` is the exact command for a host that has already installed the Prism package.
19
+
20
+ | Peer | Declared range | Optional | Declared by | Unlocks | Install | Network |
21
+ | --- | --- | --- | --- | --- | --- | --- |
22
+ | `zod` | `^3.25.0 \|\| ^4.0.0` | no | `@arnilo/prism-ag-ui` | `./acp` | `npm i zod` | no |
23
+ | `@nanonets/graft` | `^0.16.0 \|\| ^0.18.0` | yes | `@arnilo/prism-memory` | `./graft` | `npm i @nanonets/graft` | no |
24
+ | `@dietrichgebert/ponytail` | `^4.9.0` | yes | `@arnilo/prism-coding-tools` | `./ponytail` | `npm i @dietrichgebert/ponytail` | no |
25
+ | `mammoth` | `^1.8.0` | yes | `@arnilo/prism-coding-tools` | `./document-reader` | `npm i mammoth` | no |
26
+ | `pdf-parse` | `^2.4.5` | yes | `@arnilo/prism-coding-tools` | `./document-reader` | `npm i pdf-parse` | no |
27
+ | `better-sqlite3` | `^13.0.3` | yes | `@arnilo/prism-core` | `./sessions/sqlite`, `./governance/prompts` | `npm i better-sqlite3` | no |
28
+ | `pg` | `^8.23.0` | yes | `@arnilo/prism-core` | `./sessions/postgres`, `./enterprise/postgres`, `./governance/prompts` | `npm i pg` | yes |
29
+ | `@nats-io/jetstream` | `^3.4.0` | yes | `@arnilo/prism-core` | `./sessions/nats` | `npm i @nats-io/jetstream @nats-io/transport-node` | yes |
30
+ | `@nats-io/transport-node` | `^3.4.0` | yes | `@arnilo/prism-core` | `./sessions/nats` | `npm i @nats-io/transport-node` | yes |
31
+ | `@ai-sdk/provider` | `4.0.13` | yes | `@arnilo/prism-providers` | `./ai-sdk` | `npm i @ai-sdk/provider@4.0.13` | no |
32
+ | `playwright-core` | `1.63.0` | yes | `@arnilo/prism-web-tools` | `./browser`, `./obscura` | `npm i playwright-core@1.63.0` | yes |
33
+
34
+ ## Exact pins and why
35
+
36
+ Two peers are pinned to an exact version instead of a range, because the pin is a contract rather than a convenience:
37
+
38
+ - **`playwright-core@1.63.0`** (`@arnilo/prism-web-tools/browser`, `/obscura`). Browser automation rides Playwright's CDP transport and accessibility snapshot shapes, which move between minors. Prism never launches, downloads, or bundles a browser: the host supplies the binary, the image, and the cache, and must match the pinned client. See [Browser automation](browser-automation.md).
39
+ - **`@ai-sdk/provider@4.0.13`** (`@arnilo/prism-providers/ai-sdk`). The adapter consumes deterministic specification-versioned types (`LanguageModelV4`) and gates on an exact supported-version matrix at construction, so an unlisted version fails closed instead of silently mis-mapping. See [AI SDK provider](providers/ai-sdk.md).
40
+
41
+ `zod` is the only **required** third-party peer. `@agentclientprotocol/sdk` — a hard dependency of `@arnilo/prism-ag-ui` — declares `zod: ^3.25.0 || ^4.0.0` as its own peer, so `@arnilo/prism-ag-ui` re-declares the same range to keep the install tree satisfiable; the range is deliberately identical to the SDK's. Nothing in Prism imports zod directly.
42
+
43
+ ## Peers that touch the network
44
+
45
+ `pg`, `@nats-io/jetstream`, `@nats-io/transport-node`, and `playwright-core` open sockets. For a supply-chain review of those four:
46
+
47
+ - **Connection targets are host-owned.** Every one of them is passed a host-supplied connection string, endpoint list, browser instance, or service URL. Prism holds no default endpoint, and no peer is reachable from the root import.
48
+ - **Bytes stay local otherwise.** `better-sqlite3`, `mammoth`, `pdf-parse`, `@nanonets/graft`, and `@dietrichgebert/ponytail` are filesystem/process peers; the remaining two (`zod`, `@ai-sdk/provider`) are pure types/schemas.
49
+ - **No secrets are read by the peers.** Prism resolves credentials through host providers and redacts them at the boundary; peers only ever receive a resolved connection string or model object. See [Credentials and redaction](credentials-and-redaction.md) and [Host security guide](host-security.md).
50
+ - **Nothing is installed implicitly.** Optional peers are never auto-installed by npm; a missing one fails closed at the call site with a typed error naming the peer and the subpath. Required peers (today only `zod`) are installed by npm with the package.
51
+
52
+ Test-only dependencies are *not* peers. `playwright-core` appears in `@arnilo/prism-office` as a devDependency only, because the office diagrams embed takes a host-supplied iframe and the sole consumer is the gated live draw.io conformance test.
53
+
54
+ ## Implementation example
55
+
56
+ ```bash
57
+ # Browser automation: pinned client, host-owned browser binary
58
+ npm i @arnilo/prism-web-tools playwright-core@1.63.0
59
+
60
+ # PostgreSQL session store: pool driver only
61
+ npm i @arnilo/prism-core pg
62
+
63
+ # NATS JetStream event source: transport + jetstream together
64
+ npm i @arnilo/prism-core @nats-io/transport-node @nats-io/jetstream
65
+
66
+ # Document reader: pick the parser you need (both are independent)
67
+ npm i @arnilo/prism-coding-tools pdf-parse mammoth
68
+ ```
69
+
70
+ ```ts
71
+ import { chromium } from "playwright-core"; // host supplies the binary/image
72
+ import { createBrowserTools } from "@arnilo/prism-web-tools/browser";
73
+
74
+ const browser = await chromium.launch({ headless: true }); // host-owned, never Prism's
75
+ const tools = await createBrowserTools({ browser });
76
+ ```
77
+
78
+ ## Extension and configuration notes
79
+
80
+ - A peer is an *implementation the host owns*. When a peer's default wiring is not what you want, pass your own implementation instead of installing theirs: the document reader accepts host parsers (`createReadTool({ documentReader })`), the memory `/graft` resolver accepts an explicit package root, and the browser surfaces accept a host `Browser`.
81
+ - Subpaths that need a peer isolate that import, so importing another subpath of the same package never evaluates it. The office family is the extreme case: zero peers, because it takes structural inputs.
82
+ - Adding a peer to a Prism package is a release-gated change: the declaration must be optional unless a hard dependency's own peer forces it (the `zod` case), and exact pins must come with a version-gate or compatibility rationale.
83
+
84
+ ## Security and performance notes
85
+
86
+ - Pinned peers must be updated through the release process, not by a host override: an unpinned browser client or AI SDK type surface is a silent behavior change.
87
+ - Peer installs are host-visible supply-chain additions. Prefer one peer per capability, keep them out of the root import, and audit transitive dependencies of the four network-touching peers in your own policy.
88
+ - Prism adds no runtime cost for an uninstalled peer; the failure is a typed error at first use.
89
+
90
+ ## Related APIs
91
+
92
+ - [Release and install](release-and-install.md): install profiles that pair with each peer.
93
+ - [Configuration options index](options-index.md): the option surfaces each peer unlocks.
94
+ - Package-level detail: [Coding tools](coding-tools.md), [Core runtime](core.md), [Session stores](session-stores.md), [Browser automation](browser-automation.md), [Document reader](document-reader.md), [Graft](graft.md), [Ponytail](ponytail.md), [Provider packages](provider-packages.md).
@@ -85,6 +85,16 @@ Recorded 2026-08-31 on Node v24.19.0 / Linux x64: 5 warmups + 20 measured runs,
85
85
  node scripts/benchmark.mjs --scenario workflow-loop --out /tmp/prism-workflow-loop.json
86
86
  ```
87
87
 
88
+ ## Secret redaction (plan 070)
89
+
90
+ `node scripts/benchmark.mjs --scenario redaction` is network-free (in-memory, no credentials). It builds one transcript-scale string (≥ 1 MiB) and one small entry-shaped object, both carrying 16 realistic secret-shaped needles, and measures `redactSecrets` against a local copy of the ordered `needles.reduce(split/join)` loop it replaced for large strings: the two must stay byte-identical and no needle may survive either path. Caps live in `scripts/budgets.json#redaction` (same-process speedup floor 5, transcript p95 ceiling 250 ms, small-entry p95 ceiling 25 ms — sanity bounds, machine-dependent). Schema/caps/network-free gating in `npm test`: `scripts/benchmark-redaction.test.mjs`.
91
+
92
+ ```bash
93
+ node scripts/benchmark.mjs --scenario redaction --out /tmp/prism-redaction.json
94
+ ```
95
+
96
+ Recorded 2026-09-11, Node v24.19.0 / Linux x64: 1 MiB transcript × 16 needles **9.39 ms → 0.69 ms p50 (13.7×, floor 5×)**, small entry 0.15 ms p50 / 0.22 ms p95. Strings below 16 KB keep the ordered loop (`src/redaction.ts`): the equivalence check that guards the single scan costs more than the passes it saves below ~4 KB.
97
+
88
98
  ## Current-line root artifact diet
89
99
 
90
100
  `npm pack --dry-run --json` on `@arnilo/prism` is gated by `scripts/budget-gate.test.mjs` against `scripts/budgets.json#root` (±5%). Repository-only history stays out of the tarball: `docs/_evidence/**`, `docs/release-*-evidence.md`, `docs/api-page-template.md`, `dist/__tests__`, and `*.map`. Every page linked from shipped `docs/index.md` must be in the pack. Recorded 2026-08-27: **923,045 packed / 3,149,665 unpacked / 375 files** (226 `dist` js+d.ts, 124 index-linked docs, 25 other). 0.1.0 freeze 713,454 / 293 stays historical.
@@ -102,10 +112,32 @@ demand gate.
102
112
  **Pass/fail thresholds.** Network-free rows fail above the frozen ceiling in
103
113
  the table below; protected PostgreSQL rows fail above their per-phase
104
114
  budgets.json ceilings (50/100 ms per the approved budget contract); startup
105
- import fails above `startupImportMsCeiling` (250 ms); root packed bytes and
115
+ import fails above `startupImportMsCeiling` (250 ms) on a quiet machine — see the
116
+ startup-gate note below for how the in-chain check stays load-tolerant; root
117
+ packed bytes and
106
118
  file count fail above baseline × 1.05. Labels: **network-free** = runs in
107
119
  `npm test` evidence, no network; **protected** = requires live PostgreSQL.
108
120
 
121
+ **Startup gate (plan 071 Task 3).** The in-`npm test` check in
122
+ `scripts/budget-gate.test.mjs` asserts a *machine-relative ratio* rather than a raw
123
+ millisecond bound: cold-process `import('./dist/index.js')` wall time (trimmed mean
124
+ of five spawns, min/max dropped) over the median empty `node -e ''` process start
125
+ measured in the same run. External CPU load inflates both numbers, so the ratio held
126
+ at 3.3 idle, 3.5–4.1 with a full `npm test` running concurrently, and up to 7.2 with
127
+ 40 competing processes, while the absolute import alone moved 60 ms → 258 ms — the
128
+ same contention that failed the old fixed 250 ms check (273 ms at plan 070 Task 11,
129
+ 1104.8 ms at Task 13, both at load average ~25). Off load
130
+ (loadavg-per-CPU < 1.5) the tight ratio ceiling (`importRatioCeiling` 8) and the
131
+ absolute ceiling (250 ms) are both asserted; under load the ratio ceiling widens to
132
+ `importRatioCeilingUnderLoad` (20) and the absolute bound becomes
133
+ evidence-of-record, still measured by `scripts/benchmark-0.1.0.mjs` (39.79 ms in
134
+ `scripts/benchmark-0.1.0.json`) and re-gated by `scripts/benchmark-0.1.0.test.mjs`;
135
+ the current-line scenario runner `scripts/benchmark.mjs` carries the six scenario
136
+ medians and no startup row. Both ceilings live in
137
+ `scripts/budgets.json#startup` with the calibration recorded in their `$comment`;
138
+ freeze deviation `dev-007` records the enforcement change (the frozen 250 ms number
139
+ itself is unchanged).
140
+
109
141
  | Envelope | Recorded p95 ms | Ceiling ms | Source leg | Label |
110
142
  | --- | ---: | ---: | --- | --- |
111
143
  | oidcVerifyCacheHitMs | 0.151 | 5 | enterprise adapters (0.0.28) | network-free |
@@ -543,7 +575,7 @@ The ledger percentage overhead is intentionally not a threshold: its no-ledger b
543
575
 
544
576
  ### 0.0.5 Phase 0 baseline (2026-07-15)
545
577
 
546
- Scope froze at commit `f5128a816ae204c52f3e2f089de71c99bd5de6d4`. Measurement host: Node v24.18.0, npm 11.16.0, Linux 7.1.3 x86_64, AMD Ryzen 9 PRO 7940HS (16 logical CPUs). Supported package runtime remains Node >=20. These are dated local comparison points, not portable CI wall-clock assertions.
578
+ Scope froze at commit `f5128a816ae204c52f3e2f089de71c99bd5de6d4`. Measurement host: Node v24.18.0, npm 11.16.0, Linux 7.1.3 x86_64, AMD Ryzen 9 PRO 7940HS (16 logical CPUs). Supported package runtime is Node >=22 (>=20 at the time of this baseline; raised in 0.6.0) and the host measured above is Node 24. These are dated local comparison points, not portable CI wall-clock assertions.
547
579
 
548
580
  | Surface | Workload | Result |
549
581
  | --- | --- | --- |
package/docs/ponytail.md CHANGED
@@ -1,5 +1,7 @@
1
1
  # Ponytail behavior integration
2
2
 
3
+ > **Optional peer install:** `@dietrichgebert/ponytail` — see [Optional peer dependencies](peer-dependencies.md).
4
+
3
5
  ## What it does
4
6
 
5
7
  `@arnilo/prism-coding-tools/ponytail` is an optional package that wires [DietrichGebert/ponytail](https://github.com/DietrichGebert/ponytail) into Prism contribution contracts.
@@ -1,5 +1,7 @@
1
1
  # PostgreSQL persistence
2
2
 
3
+ > **Optional peer install:** `pg` — see [Optional peer dependencies](peer-dependencies.md).
4
+
3
5
  ## What it does
4
6
 
5
7
  The optional `@arnilo/prism-core/sessions/postgres` package ships a production-oriented PostgreSQL adapter that implements:
@@ -14,7 +16,7 @@ Factory:
14
16
  - `PostgresPersistenceOptions`
15
17
  - `PostgresPersistence.close()` (async; ends adapter-owned pools only)
16
18
 
17
- The adapter uses `pg@^8.22.0`, applies versioned migrations from the shared Plan 056 schema model inside a transaction guarded by `pg_advisory_xact_lock`, validates/quotes schema identifiers, and passes the full session-store and run-ledger conformance suites when `PRISM_TEST_POSTGRES_URL` is set.
19
+ The adapter uses `pg@^8.23.0`, applies versioned migrations from the shared Plan 056 schema model inside a transaction guarded by `pg_advisory_xact_lock`, validates/quotes schema identifiers, and passes the full session-store and run-ledger conformance suites when `PRISM_TEST_POSTGRES_URL` is set.
18
20
 
19
21
  ## When to use it
20
22
 
@@ -31,7 +31,7 @@ Offline conformance is mandatory for every package; credentialed probes are not
31
31
  | Package | Required offline evidence | Restricted live evidence |
32
32
  | --- | --- | --- |
33
33
  | OpenAI | Responses serialization/stream ordering, provider-hosted authority, continuation cap/cursor, Realtime fake WebSocket caps | Standard API-key smoke; separate protected hosted-tool/Realtime entitlement probe |
34
- | AI SDK | Exact 4.0.10/V4 gate (`4.0.3` and `4.0.4` also listed); every mapped stream part; authority, cache usage, redaction, unsupported mapping | Host-created V4 model only; no Prism credential fixture |
34
+ | AI SDK | Exact 4.0.13/V4 gate (`4.0.3`, `4.0.4`, `4.0.10` also listed); every mapped stream part; authority, cache usage, redaction, unsupported mapping | Host-created V4 model only; no Prism credential fixture |
35
35
  | Anthropic | Messages serialization, cache/thinking/tools, header/redaction/abort assertions | Protected `ANTHROPIC_API_KEY` smoke |
36
36
  | Google | `generateContent` serialization, complete tool calls, media/abort/redaction assertions | Protected `GOOGLE_API_KEY` or `GEMINI_API_KEY` smoke |
37
37
  | Kimi | Coding/Moonshot route fixtures, thinking/tool reconstruction, headers/redaction | Protected `KIMI_API_KEY` smoke |
@@ -25,26 +25,26 @@ Do not use provider packages as a package manager, credential store, env loader,
25
25
 
26
26
  | adapter package | version |
27
27
  | --- | --- |
28
- | `@arnilo/prism-providers/ai-sdk` | 0.5.5 |
29
- | `@arnilo/prism-providers/alibaba` | 0.5.5 |
30
- | `@arnilo/prism-providers/anthropic` | 0.5.5 |
31
- | `@arnilo/prism-providers/azure` | 0.5.5 |
32
- | `@arnilo/prism-providers/bedrock` | 0.5.5 |
33
- | `@arnilo/prism-providers/clinepass` | 0.5.5 |
34
- | `@arnilo/prism-providers/commandcode` | 0.5.5 |
35
- | `@arnilo/prism-providers/deepseek` | 0.5.5 |
36
- | `@arnilo/prism-providers/google` | 0.5.5 |
37
- | `@arnilo/prism-providers/hyper` | 0.5.5 |
38
- | `@arnilo/prism-providers/kimi` | 0.5.5 |
39
- | `@arnilo/prism-providers/model-discovery` | 0.5.5 |
40
- | `@arnilo/prism-providers/neuralwatt` | 0.5.5 |
41
- | `@arnilo/prism-providers/ollama` | 0.5.5 |
42
- | `@arnilo/prism-providers/openai` | 0.5.5 |
43
- | `@arnilo/prism-providers/opencode-go` | 0.5.5 |
44
- | `@arnilo/prism-providers/openrouter` | 0.5.5 |
45
- | `@arnilo/prism-providers/vertex` | 0.5.5 |
46
- | `@arnilo/prism-providers/xai` | 0.5.5 |
47
- | `@arnilo/prism-providers/zai` | 0.5.5 |
28
+ | `@arnilo/prism-providers/ai-sdk` | 0.6.0 |
29
+ | `@arnilo/prism-providers/alibaba` | 0.6.0 |
30
+ | `@arnilo/prism-providers/anthropic` | 0.6.0 |
31
+ | `@arnilo/prism-providers/azure` | 0.6.0 |
32
+ | `@arnilo/prism-providers/bedrock` | 0.6.0 |
33
+ | `@arnilo/prism-providers/clinepass` | 0.6.0 |
34
+ | `@arnilo/prism-providers/commandcode` | 0.6.0 |
35
+ | `@arnilo/prism-providers/deepseek` | 0.6.0 |
36
+ | `@arnilo/prism-providers/google` | 0.6.0 |
37
+ | `@arnilo/prism-providers/hyper` | 0.6.0 |
38
+ | `@arnilo/prism-providers/kimi` | 0.6.0 |
39
+ | `@arnilo/prism-providers/model-discovery` | 0.6.0 |
40
+ | `@arnilo/prism-providers/neuralwatt` | 0.6.0 |
41
+ | `@arnilo/prism-providers/ollama` | 0.6.0 |
42
+ | `@arnilo/prism-providers/openai` | 0.6.0 |
43
+ | `@arnilo/prism-providers/opencode-go` | 0.6.0 |
44
+ | `@arnilo/prism-providers/openrouter` | 0.6.0 |
45
+ | `@arnilo/prism-providers/vertex` | 0.6.0 |
46
+ | `@arnilo/prism-providers/xai` | 0.6.0 |
47
+ | `@arnilo/prism-providers/zai` | 0.6.0 |
48
48
  <!-- generated:package-truth:providers end -->
49
49
 
50
50
 
@@ -123,7 +123,7 @@ Every package remains explicit, setup-zero-fetch, and late-credential-bound. `Mo
123
123
  | Package | Protocol / model source | Content mapping | Stream, tools, and reasoning | Cache / canary |
124
124
  | --- | --- | --- | --- | --- |
125
125
  | OpenAI | Responses; featured or caller-gated `listOpenAIModels` | text, image, audio, file, document | Host and provider-hosted tools; 8-hop continuation; Realtime seam; Responses reasoning | `openai_key`; checked-in standard smoke + protected hosted/Realtime probe |
126
- | AI SDK | Host `LanguageModelV4`; no Prism catalog | declared text/image/audio/file/document prompt parts (role-limited) | v4 mapping; provider-executed tool authority; host-owned reasoning | host-owned; exact 4.0.10 matrix (`4.0.3` and `4.0.4` also listed); protected host integration |
126
+ | AI SDK | Host `LanguageModelV4`; no Prism catalog | declared text/image/audio/file/document prompt parts (role-limited) | v4 mapping; provider-executed tool authority; host-owned reasoning | host-owned; exact 4.0.13 matrix (`4.0.3`, `4.0.4`, `4.0.10` also listed); protected host integration |
127
127
  | Anthropic | Messages; caller-gated list | text, image, PDF document/file | tool deltas, thinking | `cache_control`; protected API-key smoke |
128
128
  | Google | Gemini `generateContent`; caller-gated list | text, image, audio, document/file | complete tool calls, thinking | no Prism cache marker; protected API-key smoke |
129
129
  | Kimi | Coding Messages or opt-in Moonshot; caller-gated list | text, image, PDF document/file by route/model | tool deltas, route-native thinking replay | implicit / optional Anthropic markers; protected API-key smoke |
@@ -35,9 +35,10 @@ Static scan of root `src/providers/` and `packages/prism-providers/src/*/` befor
35
35
  | Runtime retry | `@arnilo/prism` `AgentConfig.retry` / `RunOptions.retry` | Classifies `ErrorInfo.code`; provider packages set numeric HTTP `code` on errors |
36
36
  | `ProviderRequestOptions.maxRetries` / `timeoutMs` | Contracts | **Removed in 0.1.5**; use `RunOptions.signal` / `AgentConfig.retry` / `RunOptions.retry` |
37
37
  | NeuralWatt `classifyNeuralWattError` | `packages/prism-providers/src/neuralwatt` | Parses `Retry-After`, `error.retry_after`, `retry_strategy`; no extra network calls |
38
+ | Shared retry HTTP plane | `packages/prism-providers/src/shared/retry-http.ts` | **Migrated (plan 070 Task 11)** — `readRetryAfterMs` (header, plus a caller-supplied body field), `parseErrorBody`, the secret-redacting `providerHttpError` builder, and `RETRYABLE_STATUSES`; hyper, NeuralWatt, and Command Code classifiers keep their own status/field decisions |
38
39
  | Quota endpoint throttling | `packages/prism-providers/src/neuralwatt/quota.ts` | Documents 1 rps limit; caller-owned cache |
39
40
 
40
- No generic core helper extracts `Retry-After` / `x-request-id` for all providers yet.
41
+ The `Retry-After` HTTP plane is shared inside `@arnilo/prism-providers` (`src/shared/retry-http.ts`, plan 070 Task 11), so the three classifiers cannot drift on header reading or on the redaction of provider error text. `x-request-id` extraction and a *core*-level helper for every provider do not exist yet.
41
42
 
42
43
  ### Structured output
43
44
 
@@ -1,5 +1,7 @@
1
1
  # AI SDK provider adapter
2
2
 
3
+ > **Optional peer install:** `@ai-sdk/provider@4.0.13` (exact pin) — see [Optional peer dependencies](../peer-dependencies.md).
4
+
3
5
  ## What it does
4
6
 
5
7
  `@arnilo/prism-providers/ai-sdk` adapts a host-supplied AI SDK `LanguageModelV4` into a Prism `AIProvider`. It maps Prism messages, tools, and structured-output options into `doStream` call options, then translates stream parts into Prism provider events incrementally.
@@ -12,7 +14,8 @@ Core `@arnilo/prism` does not depend on the AI SDK.
12
14
  | --- | --- | --- |
13
15
  | `4.0.3` | `LanguageModelV4`, `specificationVersion: "v4"` | Supported and offline-tested |
14
16
  | `4.0.4` | `LanguageModelV4`, `specificationVersion: "v4"` | Supported and offline-tested |
15
- | `4.0.10` | `LanguageModelV4`, `specificationVersion: "v4"` | Current peer; supported and offline-tested |
17
+ | `4.0.10` | `LanguageModelV4`, `specificationVersion: "v4"` | Supported and offline-tested |
18
+ | `4.0.13` | `LanguageModelV4`, `specificationVersion: "v4"` | Current peer; supported and offline-tested |
16
19
 
17
20
  The peer dependency is intentionally exact. `createAiSdkProvider()` reads its resolved `@ai-sdk/provider/package.json` version during setup and throws typed `AiSdkProviderError { code: "unsupported_version" }` for an unlisted version; it does not infer compatibility from a matching `"v4"` string.
18
21
 
@@ -145,7 +148,7 @@ Official evidence: [Custom providers / LanguageModelV4](https://ai-sdk.dev/provi
145
148
 
146
149
  ## Extension and configuration notes
147
150
 
148
- - Peer dependency: `@ai-sdk/provider@4.0.10` (matrix also lists `4.0.3` and `4.0.4`). Upgrade policy adds a matrix row and offline conformance fixture before accepting any new version.
151
+ - Peer dependency: `@ai-sdk/provider@4.0.13` (matrix also lists `4.0.3`, `4.0.4`, and `4.0.10`). Upgrade policy adds a matrix row and offline conformance fixture before accepting any new version.
149
152
  - First-party HTTP providers remain independent; this adapter is available directly or through `@arnilo/prism-providers`. Installation does not select a model or invoke AI SDK.
150
153
  - `options.compat` / `options.extra` pass through as AI SDK `providerOptions.prism`.
151
154
  - Export helpers `toAiSdkCallOptions`, `toAiSdkPrompt`, and `mapAiSdkStream` for tests and custom hosts.