@wrenai/genbi 0.0.4 → 0.0.6

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 (234) hide show
  1. package/README.md +65 -3
  2. package/dist/assets/{echarts-LTFC-ysd.js → echarts-DYM4hjvk.js} +2 -2
  3. package/dist/assets/index-A_Wrq7Ey.css +1 -0
  4. package/dist/assets/{index-Bo--QMUN.js → index-DsH129tV.js} +18 -17
  5. package/dist/index.html +2 -2
  6. package/dist-server/harness/bundle/schema.d.ts +38 -0
  7. package/dist-server/harness/bundle/schema.js +18 -10
  8. package/dist-server/harness/bundle/version.js +1 -1
  9. package/dist-server/harness/cli-args.d.ts +10 -2
  10. package/dist-server/harness/cli-args.js +24 -8
  11. package/dist-server/harness/cli.js +75 -9
  12. package/dist-server/harness/compile/cache.js +4 -4
  13. package/dist-server/harness/compile/compose-profile.d.ts +51 -14
  14. package/dist-server/harness/compile/compose-profile.js +85 -19
  15. package/dist-server/harness/compile/context-loader.d.ts +56 -0
  16. package/dist-server/harness/compile/context-loader.js +237 -0
  17. package/dist-server/harness/compile/errors.d.ts +19 -0
  18. package/dist-server/harness/compile/errors.js +35 -0
  19. package/dist-server/harness/compile/index.d.ts +4 -3
  20. package/dist-server/harness/compile/index.js +4 -3
  21. package/dist-server/harness/compile/pipeline.d.ts +15 -7
  22. package/dist-server/harness/compile/pipeline.js +62 -14
  23. package/dist-server/harness/compile/resolve-binary.d.ts +2 -2
  24. package/dist-server/harness/compile/resolve-binary.js +3 -3
  25. package/dist-server/harness/compile/types.d.ts +29 -0
  26. package/dist-server/harness/compile/warble-identity.d.ts +11 -0
  27. package/dist-server/harness/compile/warble-identity.js +13 -0
  28. package/dist-server/harness/components/ai-step.d.ts +4 -0
  29. package/dist-server/harness/components/ai-step.js +40 -0
  30. package/dist-server/harness/components/broker.d.ts +60 -0
  31. package/dist-server/harness/components/broker.js +117 -0
  32. package/dist-server/harness/components/capability-card.d.ts +98 -0
  33. package/dist-server/harness/components/capability-card.js +169 -0
  34. package/dist-server/harness/components/context.d.ts +2 -0
  35. package/dist-server/harness/components/context.js +30 -0
  36. package/dist-server/harness/components/display.d.ts +6 -0
  37. package/dist-server/harness/components/display.js +29 -0
  38. package/dist-server/harness/components/egress-judge.d.ts +12 -0
  39. package/dist-server/harness/components/egress-judge.js +27 -0
  40. package/dist-server/harness/components/egress.d.ts +142 -0
  41. package/dist-server/harness/components/egress.js +469 -0
  42. package/dist-server/harness/components/in-process.d.ts +7 -0
  43. package/dist-server/harness/components/in-process.js +245 -0
  44. package/dist-server/harness/components/normalize.d.ts +35 -0
  45. package/dist-server/harness/components/normalize.js +245 -0
  46. package/dist-server/harness/components/plan.d.ts +31 -0
  47. package/dist-server/harness/components/plan.js +184 -0
  48. package/dist-server/harness/components/report.d.ts +207 -0
  49. package/dist-server/harness/components/report.js +309 -0
  50. package/dist-server/harness/components/runner.d.ts +193 -0
  51. package/dist-server/harness/components/runner.js +492 -0
  52. package/dist-server/harness/components/semantic-guards.d.ts +20 -0
  53. package/dist-server/harness/components/semantic-guards.js +42 -0
  54. package/dist-server/harness/components/terminal-json.d.ts +18 -0
  55. package/dist-server/harness/components/terminal-json.js +82 -0
  56. package/dist-server/harness/components/usage.d.ts +14 -0
  57. package/dist-server/harness/components/usage.js +19 -0
  58. package/dist-server/harness/components/wren-access.d.ts +29 -0
  59. package/dist-server/harness/components/wren-access.js +233 -0
  60. package/dist-server/harness/components/zone-dry-run.d.ts +43 -0
  61. package/dist-server/harness/components/zone-dry-run.js +107 -0
  62. package/dist-server/harness/components/zone-gate.d.ts +76 -0
  63. package/dist-server/harness/components/zone-gate.js +144 -0
  64. package/dist-server/harness/events/index.d.ts +1 -1
  65. package/dist-server/harness/events/types.d.ts +52 -0
  66. package/dist-server/harness/index.d.ts +9 -2
  67. package/dist-server/harness/index.js +5 -1
  68. package/dist-server/harness/loop/executor.d.ts +1 -0
  69. package/dist-server/harness/loop/executor.js +37 -15
  70. package/dist-server/harness/npm-package-resolve.d.ts +2 -0
  71. package/dist-server/harness/npm-package-resolve.js +16 -4
  72. package/dist-server/harness/providers/adapters/openai-compatible.d.ts +13 -0
  73. package/dist-server/harness/providers/adapters/openai-compatible.js +17 -0
  74. package/dist-server/harness/providers/adapters/openai.d.ts +7 -0
  75. package/dist-server/harness/providers/adapters/openai.js +6 -0
  76. package/dist-server/harness/providers/adapters/pi-ai.d.ts +48 -0
  77. package/dist-server/harness/providers/adapters/pi-ai.js +518 -0
  78. package/dist-server/harness/providers/binding.d.ts +45 -4
  79. package/dist-server/harness/providers/binding.js +44 -8
  80. package/dist-server/harness/providers/index.d.ts +9 -3
  81. package/dist-server/harness/providers/index.js +10 -3
  82. package/dist-server/harness/providers/zone.d.ts +96 -0
  83. package/dist-server/harness/providers/zone.js +112 -0
  84. package/dist-server/harness/render/answering-query.d.ts +29 -0
  85. package/dist-server/harness/render/answering-query.js +62 -0
  86. package/dist-server/harness/render/envelope.d.ts +6 -0
  87. package/dist-server/harness/render/envelope.js +10 -3
  88. package/dist-server/harness/route/adapter-spec.d.ts +8 -9
  89. package/dist-server/harness/route/adapter-spec.js +13 -14
  90. package/dist-server/harness/route/codex-ask-events.js +2 -1
  91. package/dist-server/harness/route/codex-ask.d.ts +4 -0
  92. package/dist-server/harness/route/codex-ask.js +43 -45
  93. package/dist-server/harness/route/codex-local-manifest.d.ts +9 -1
  94. package/dist-server/harness/route/codex-local-manifest.js +96 -15
  95. package/dist-server/harness/route/describe.js +45 -6
  96. package/dist-server/harness/route/dispatched.d.ts +20 -0
  97. package/dist-server/harness/route/dispatched.js +122 -24
  98. package/dist-server/harness/route/host-query.d.ts +93 -0
  99. package/dist-server/harness/route/host-query.js +257 -0
  100. package/dist-server/harness/route/in-process.d.ts +22 -1
  101. package/dist-server/harness/route/in-process.js +54 -4
  102. package/dist-server/harness/route/route.js +8 -2
  103. package/dist-server/harness/route/types.d.ts +47 -1
  104. package/dist-server/harness/route/wren-host-proxy.d.ts +33 -0
  105. package/dist-server/harness/route/wren-host-proxy.js +228 -0
  106. package/dist-server/harness/session/run.js +30 -10
  107. package/dist-server/harness/setup/runner.d.ts +17 -3
  108. package/dist-server/harness/setup/runner.js +272 -89
  109. package/dist-server/harness/setup/yaml-scalar.d.ts +23 -0
  110. package/dist-server/harness/setup/yaml-scalar.js +62 -0
  111. package/dist-server/harness/tools/setup-native.d.ts +7 -0
  112. package/dist-server/harness/tools/setup-native.js +7 -4
  113. package/dist-server/server/adopt.js +1 -17
  114. package/dist-server/server/app.d.ts +1 -0
  115. package/dist-server/server/app.js +175 -17
  116. package/dist-server/server/auth-choice.d.ts +13 -1
  117. package/dist-server/server/auth-choice.js +66 -1
  118. package/dist-server/server/bin.js +185 -25
  119. package/dist-server/server/codex-native-session.d.ts +25 -0
  120. package/dist-server/server/codex-native-session.js +1 -0
  121. package/dist-server/server/codex-runtime-composition.d.ts +34 -0
  122. package/dist-server/server/codex-runtime-composition.js +250 -0
  123. package/dist-server/server/codex-structured-ask.d.ts +23 -0
  124. package/dist-server/server/codex-structured-ask.js +102 -0
  125. package/dist-server/server/conn-config.js +4 -16
  126. package/dist-server/server/conversation-socket.d.ts +16 -0
  127. package/dist-server/server/conversation-socket.js +65 -0
  128. package/dist-server/server/db.d.ts +46 -0
  129. package/dist-server/server/db.js +88 -9
  130. package/dist-server/server/env-detect.d.ts +6 -0
  131. package/dist-server/server/env-detect.js +7 -0
  132. package/dist-server/server/fold.d.ts +23 -4
  133. package/dist-server/server/fold.js +42 -5
  134. package/dist-server/server/harness.d.ts +2 -2
  135. package/dist-server/server/harness.js +33 -7
  136. package/dist-server/server/host-evidence-grounding.d.ts +21 -0
  137. package/dist-server/server/host-evidence-grounding.js +93 -0
  138. package/dist-server/server/interactive-terminal.d.ts +10 -6
  139. package/dist-server/server/interactive-terminal.js +33 -8
  140. package/dist-server/server/managed-wren-runtime.d.ts +116 -0
  141. package/dist-server/server/managed-wren-runtime.js +670 -0
  142. package/dist-server/server/native-artifacts.d.ts +112 -7
  143. package/dist-server/server/native-artifacts.js +194 -14
  144. package/dist-server/server/native-component-context.d.ts +19 -0
  145. package/dist-server/server/native-component-context.js +76 -0
  146. package/dist-server/server/native-component-preparation.d.ts +20 -0
  147. package/dist-server/server/native-component-preparation.js +129 -0
  148. package/dist-server/server/native-component-runtime.d.ts +36 -0
  149. package/dist-server/server/native-component-runtime.js +92 -0
  150. package/dist-server/server/native-components.d.ts +84 -0
  151. package/dist-server/server/native-components.js +160 -0
  152. package/dist-server/server/native-dispatch-process.d.ts +8 -0
  153. package/dist-server/server/native-dispatch-process.js +65 -0
  154. package/dist-server/server/native-runtime-spec.d.ts +89 -0
  155. package/dist-server/server/native-runtime-spec.js +169 -0
  156. package/dist-server/server/native-sessions.d.ts +172 -19
  157. package/dist-server/server/native-sessions.js +839 -244
  158. package/dist-server/server/native-shutdown.d.ts +6 -0
  159. package/dist-server/server/native-shutdown.js +28 -0
  160. package/dist-server/server/native-wren-home.d.ts +18 -0
  161. package/dist-server/server/native-wren-home.js +262 -0
  162. package/dist-server/server/node-pty-host.d.ts +2 -1
  163. package/dist-server/server/node-pty-host.js +3 -2
  164. package/dist-server/server/profile-registry.d.ts +139 -0
  165. package/dist-server/server/profile-registry.js +620 -0
  166. package/dist-server/server/runtime-binding.d.ts +4 -1
  167. package/dist-server/server/runtime-binding.js +50 -2
  168. package/dist-server/server/runtime-host/claude-component-step.d.ts +25 -0
  169. package/dist-server/server/runtime-host/claude-component-step.js +186 -0
  170. package/dist-server/server/runtime-host/codex-app-server.d.ts +75 -0
  171. package/dist-server/server/runtime-host/codex-app-server.js +239 -0
  172. package/dist-server/server/runtime-host/codex-compatibility.d.ts +110 -0
  173. package/dist-server/server/runtime-host/codex-compatibility.js +162 -0
  174. package/dist-server/server/runtime-host/codex-component-step.d.ts +19 -0
  175. package/dist-server/server/runtime-host/codex-component-step.js +308 -0
  176. package/dist-server/server/runtime-host/codex-conversation.d.ts +109 -0
  177. package/dist-server/server/runtime-host/codex-conversation.js +295 -0
  178. package/dist-server/server/runtime-host/codex-direct-tools.d.ts +23 -0
  179. package/dist-server/server/runtime-host/codex-direct-tools.js +59 -0
  180. package/dist-server/server/runtime-host/codex-events.d.ts +647 -0
  181. package/dist-server/server/runtime-host/codex-events.js +66 -0
  182. package/dist-server/server/runtime-host/codex-policy.d.ts +16 -0
  183. package/dist-server/server/runtime-host/codex-policy.js +151 -0
  184. package/dist-server/server/runtime-host/codex-process.d.ts +8 -0
  185. package/dist-server/server/runtime-host/codex-process.js +96 -0
  186. package/dist-server/server/runtime-host/codex-rpc.d.ts +47 -0
  187. package/dist-server/server/runtime-host/codex-rpc.js +182 -0
  188. package/dist-server/server/runtime-host/codex-session.d.ts +74 -0
  189. package/dist-server/server/runtime-host/codex-session.js +492 -0
  190. package/dist-server/server/runtime-host/codex-terminal-protocol.d.ts +35 -0
  191. package/dist-server/server/runtime-host/codex-terminal-protocol.js +243 -0
  192. package/dist-server/server/runtime-host/codex-terminal.d.ts +16 -0
  193. package/dist-server/server/runtime-host/codex-terminal.js +120 -0
  194. package/dist-server/server/runtime-host/index.d.ts +5 -0
  195. package/dist-server/server/runtime-host/index.js +3 -0
  196. package/dist-server/server/runtime-host/local.d.ts +29 -0
  197. package/dist-server/server/runtime-host/local.js +90 -0
  198. package/dist-server/server/runtime-host/policy.d.ts +8 -0
  199. package/dist-server/server/runtime-host/policy.js +78 -0
  200. package/dist-server/server/runtime-host/types.d.ts +52 -0
  201. package/dist-server/server/runtime-host/types.js +62 -0
  202. package/dist-server/server/structured-query-evidence.d.ts +7 -0
  203. package/dist-server/server/structured-query-evidence.js +47 -0
  204. package/dist-server/server/structured-runtime.d.ts +52 -0
  205. package/dist-server/server/structured-runtime.js +130 -0
  206. package/dist-server/server/structured-scope.d.ts +4 -0
  207. package/dist-server/server/structured-scope.js +12 -0
  208. package/dist-server/server/turn.d.ts +6 -1
  209. package/dist-server/server/turn.js +86 -26
  210. package/dist-server/server/wire-types.d.ts +67 -3
  211. package/dist-server/server/wren-profiles.js +1 -1
  212. package/managed-wren/README.md +60 -0
  213. package/managed-wren/dependency-wheels.json +282 -0
  214. package/managed-wren/manifest.json +373 -0
  215. package/managed-wren/release-inputs.json +45 -0
  216. package/managed-wren/runtime-tree.cjs +115 -0
  217. package/managed-wren/source-inputs.json +40 -0
  218. package/package.json +15 -6
  219. package/profiles/genbi-default/context/binding.yml +17 -7
  220. package/profiles/genbi-default/context/context.json +146 -0
  221. package/profiles/genbi-default/ir.golden.json +39 -43
  222. package/profiles/genbi-default/profile.yml +31 -0
  223. package/profiles/genbi-enrich-context/context/binding.yml +14 -3
  224. package/profiles/genbi-enrich-context/context/context.json +146 -0
  225. package/profiles/genbi-enrich-context/ir.golden.json +4 -5
  226. package/profiles/genbi-monitor/context/binding.yml +13 -5
  227. package/profiles/genbi-monitor/context/context.json +146 -0
  228. package/profiles/genbi-monitor/ir.golden.json +13 -7
  229. package/profiles/genbi-report/context/binding.yml +19 -0
  230. package/profiles/genbi-report/context/context.json +223 -0
  231. package/profiles/genbi-report/ir.golden.json +328 -0
  232. package/profiles/genbi-report/profile.yml +38 -0
  233. package/profiles/genbi-setup/ir.golden.json +3 -1
  234. package/dist/assets/index-Xs4q7pNo.css +0 -1
@@ -1,4 +1,4 @@
1
1
  export { createAgentEventEmitter } from "./emitter.js";
2
2
  export type { AgentEventEmitter, AgentEventInput } from "./emitter.js";
3
3
  export { MalformedSseFrameError, parseAgentEvent, serializeAgentEvent } from "./sse.js";
4
- export type { AgentEvent, AgentEventBase, AgentEventKind, AnswerAgentEvent, ArtifactAgentEvent, ArtifactKind, ErrorAgentEvent, RefusalAgentEvent, RunFinishEvent, RunStartEvent, StepFinishEvent, StepStartEvent, StepTrace, TokenEvent, ToolCallEvent, ToolResultEvent, TraceStep, } from "./types.js";
4
+ export type { AgentEvent, AgentEventBase, AgentEventKind, AnswerAgentEvent, ArtifactAgentEvent, ArtifactKind, ErrorAgentEvent, RefusalAgentEvent, RunFinishEvent, RunStartEvent, StepFinishEvent, StepStartEvent, PromptSurfaceRecord, StepTrace, TokenEvent, ToolCallEvent, ToolResultEvent, TraceStep, } from "./types.js";
@@ -126,6 +126,58 @@ export interface TraceStep {
126
126
  */
127
127
  readonly detail?: string;
128
128
  }
129
+ /**
130
+ * One model call's prompt surfaces, digested per surface and in total (the
131
+ * prompt-fingerprint contract): what the model was told, never the question.
132
+ * `context` names which host context the step received — the prepared
133
+ * snapshot (private zone) or the capability card (public zone) — so an audit
134
+ * can see the card went only where it was allowed to.
135
+ */
136
+ export interface PromptSurfaceRecord {
137
+ readonly component: string;
138
+ readonly step: string;
139
+ readonly tier: string;
140
+ readonly zone: "private" | "public" | "unbound";
141
+ readonly context: "snapshot" | "card" | "none";
142
+ readonly algorithm: string;
143
+ readonly digest: string;
144
+ readonly surfaces: Readonly<Record<string, string>>;
145
+ }
146
+ /**
147
+ * One model call's provider-reported token counts, attributed to the step
148
+ * and the provider that served it. Counts only, never payloads. A provider
149
+ * that reports nothing is recorded as zeros, not omitted. `depth` is 0 for a
150
+ * root step and 1+ inside a child run; the egress judge is recorded under the
151
+ * callee it judged, as step `egress_judge` on the judge tier.
152
+ */
153
+ export interface UsageRecord {
154
+ readonly component: string;
155
+ readonly step: string;
156
+ readonly tier: string;
157
+ readonly depth: number;
158
+ readonly zone: "private" | "public" | "unbound";
159
+ readonly adapter: string;
160
+ readonly model: string;
161
+ readonly inputTokens: number;
162
+ readonly outputTokens: number;
163
+ }
164
+ /** Usage summed per provider (zone, adapter, model); `calls` counts the records summed. */
165
+ export interface ProviderUsage {
166
+ readonly zone: UsageRecord["zone"];
167
+ readonly adapter: string;
168
+ readonly model: string;
169
+ readonly calls: number;
170
+ readonly inputTokens: number;
171
+ readonly outputTokens: number;
172
+ }
173
+ export interface UsageTrace {
174
+ readonly steps: readonly UsageRecord[];
175
+ readonly providers: readonly ProviderUsage[];
176
+ }
129
177
  export interface StepTrace {
130
178
  readonly steps: readonly TraceStep[];
179
+ /** Composed in-process runs only; absent elsewhere. */
180
+ readonly surfaces?: readonly PromptSurfaceRecord[];
181
+ /** Composed in-process runs only; absent elsewhere. */
182
+ readonly usage?: UsageTrace;
131
183
  }
@@ -7,8 +7,15 @@ export type { Agent, Bundle, Capability, Guardrail, OutputSchema, Step, StepGuar
7
7
  export { createDefaultCapabilityRegistry, createRegistry, DEFAULT_CAPABILITIES, } from "./capability/registry.js";
8
8
  export type { CapabilityRegistry } from "./capability/registry.js";
9
9
  export { assertCapabilities, CapabilityGateError } from "./capability/gate.js";
10
- export { ANTHROPIC_ADAPTER_ID, createAnthropicAdapter, createDefaultProviderRegistry, createMockAdapter, createOpenAICompatibleAdapter, createProviderRegistry, MOCK_ADAPTER_ID, OPENAI_COMPATIBLE_ADAPTER_ID, resolveStepModel, resolveTierModel, UnknownAdapterError, UnknownTierError, } from "./providers/index.js";
11
- export type { AdapterFactory, AdapterSpec, AnthropicAdapterConfig, MockAdapterConfig, OpenAICompatibleAdapterConfig, ProviderRegistry, TierBinding, } from "./providers/index.js";
10
+ export { ANTHROPIC_ADAPTER_ID, createAnthropicAdapter, createDefaultProviderRegistry, createMockAdapter, createOpenAIAdapter, createOpenAICompatibleAdapter, createProviderRegistry, isZoneAwareBinding, MOCK_ADAPTER_ID, OPENAI_ADAPTER_ID, OPENAI_COMPATIBLE_ADAPTER_ID, parseDisclosurePolicy, parseTierBindingDocument, readTierBindingFile, resolveStepModel, resolveTierModel, resolveTierSpec, tierBindingKey, TierBindingParseError, UnknownAdapterError, UnknownTierError, } from "./providers/index.js";
11
+ export type { AdapterFactory, AdapterSpec, AnthropicAdapterConfig, AnswerShape, DisclosurePolicy, MockAdapterConfig, OpenAIAdapterConfig, OpenAICompatibleAdapterConfig, ProviderRegistry, TierBinding, TierBindingDocument, Zone, ZoneRoles, } from "./providers/index.js";
12
+ export { assertZoneGate, evaluateZoneGate, reachableMounts, ZoneGateError } from "./components/zone-gate.js";
13
+ export type { ZoneGateResult, ZoneGateViolation, ZoneStepReport } from "./components/zone-gate.js";
14
+ export { describeZoneDryRun, formatZoneDryRun } from "./components/zone-dry-run.js";
15
+ export { BUILT_IN_PII_PATTERNS, readSlots, slotDeclarationSchema, verifyEgress } from "./components/egress.js";
16
+ export type { DisclosedAnswer, EgressDecision, EgressJudge, EgressJudgeInput, EgressOutcome, EgressProvenance, EgressReason, EgressStatus, SlotDeclaration } from "./components/egress.js";
17
+ export { createModelJudge, EGRESS_JUDGE_INSTRUCTIONS } from "./components/egress-judge.js";
18
+ export type { ZoneDryRun } from "./components/zone-dry-run.js";
12
19
  export { AgentScopeError, executeAgent, InvalidRepairFoldError, passthroughGuardEvaluator, RepairExhaustedError, } from "./loop/index.js";
13
20
  export type { DataflowArtifacts, ExecuteAgentContext, GuardEvaluator, StepGuardContext, ToolCallOutcome, ToolCallOutcomeListener, } from "./loop/index.js";
14
21
  export { createAgentEventEmitter, MalformedSseFrameError, parseAgentEvent, serializeAgentEvent, } from "./events/index.js";
@@ -3,7 +3,11 @@ export { bundleFormatVersion } from "./bundle/schema.js";
3
3
  export { assertCompat, BundleCompatError, HARNESS_SUPPORT } from "./bundle/version.js";
4
4
  export { createDefaultCapabilityRegistry, createRegistry, DEFAULT_CAPABILITIES, } from "./capability/registry.js";
5
5
  export { assertCapabilities, CapabilityGateError } from "./capability/gate.js";
6
- export { ANTHROPIC_ADAPTER_ID, createAnthropicAdapter, createDefaultProviderRegistry, createMockAdapter, createOpenAICompatibleAdapter, createProviderRegistry, MOCK_ADAPTER_ID, OPENAI_COMPATIBLE_ADAPTER_ID, resolveStepModel, resolveTierModel, UnknownAdapterError, UnknownTierError, } from "./providers/index.js";
6
+ export { ANTHROPIC_ADAPTER_ID, createAnthropicAdapter, createDefaultProviderRegistry, createMockAdapter, createOpenAIAdapter, createOpenAICompatibleAdapter, createProviderRegistry, isZoneAwareBinding, MOCK_ADAPTER_ID, OPENAI_ADAPTER_ID, OPENAI_COMPATIBLE_ADAPTER_ID, parseDisclosurePolicy, parseTierBindingDocument, readTierBindingFile, resolveStepModel, resolveTierModel, resolveTierSpec, tierBindingKey, TierBindingParseError, UnknownAdapterError, UnknownTierError, } from "./providers/index.js";
7
+ export { assertZoneGate, evaluateZoneGate, reachableMounts, ZoneGateError } from "./components/zone-gate.js";
8
+ export { describeZoneDryRun, formatZoneDryRun } from "./components/zone-dry-run.js";
9
+ export { BUILT_IN_PII_PATTERNS, readSlots, slotDeclarationSchema, verifyEgress } from "./components/egress.js";
10
+ export { createModelJudge, EGRESS_JUDGE_INSTRUCTIONS } from "./components/egress-judge.js";
7
11
  export { AgentScopeError, executeAgent, InvalidRepairFoldError, passthroughGuardEvaluator, RepairExhaustedError, } from "./loop/index.js";
8
12
  export { createAgentEventEmitter, MalformedSseFrameError, parseAgentEvent, serializeAgentEvent, } from "./events/index.js";
9
13
  export { BUILD_DASHBOARD_TOOL_NAME, connectMcpServer, createDefaultNativeToolRegistry, createNativeToolRegistry, createWrenNativeToolRegistry, createWrenQueryTool, createWriteArtifactTool, McpServerNotConfiguredError, McpToolNotExposedError, parseToolSource, resolveTools, UnknownNativeToolError, UnsupportedToolSourceError, withResolvedTools, WREN_QUERY_TOOL_NAME, WrenQueryExecutionError, WRITE_ARTIFACT_TOOL_NAME, } from "./tools/index.js";
@@ -42,6 +42,7 @@ export interface ToolCallOutcome {
42
42
  }
43
43
  export type ToolCallOutcomeListener = (outcome: ToolCallOutcome) => void;
44
44
  export interface ExecuteAgentContext {
45
+ readonly signal?: AbortSignal;
45
46
  /** Tier -> adapter binding; resolves each step's model. */
46
47
  readonly binding: TierBinding;
47
48
  readonly registry: ProviderRegistry;
@@ -31,6 +31,7 @@ const SUPPORTED_OUTCOME = "none";
31
31
  * (the two-stage structured-output envelope is built in `harness/render/`).
32
32
  */
33
33
  export async function executeAgent(agent, ctx) {
34
+ ctx.signal?.throwIfAborted();
34
35
  assertV1Scope(agent);
35
36
  const artifacts = new Map();
36
37
  const evaluateGuard = ctx.evaluateGuard ?? passthroughGuardEvaluator;
@@ -44,6 +45,9 @@ export async function executeAgent(agent, ctx) {
44
45
  // consumed by the fold-into-loop logic below, keyed by their fold_into
45
46
  // target's step name.
46
47
  const repairByTarget = buildRepairFoldMap(agent, hasTools);
48
+ // Component-level, not per-step: read once and thread the same value into
49
+ // every step's rendered prompt below.
50
+ const brief = agentBrief(agent);
47
51
  const pending = agent.steps.filter((step) => step.realization.kind !== "repair_fold");
48
52
  while (pending.length > 0) {
49
53
  const readyIndex = pending.findIndex((step) => isConsumesSatisfied(step, artifacts));
@@ -60,7 +64,7 @@ export async function executeAgent(agent, ctx) {
60
64
  // its `produces` artifact absent. The default guard used here never does this.
61
65
  continue;
62
66
  }
63
- const prompt = renderStepPrompt(step, ctx.userInput, artifacts);
67
+ const prompt = renderStepPrompt(step, ctx.userInput, artifacts, brief);
64
68
  const model = resolveStepModel(step, ctx.binding, ctx.registry);
65
69
  const repairStep = repairByTarget.get(step.name);
66
70
  const stepId = step.name;
@@ -75,7 +79,7 @@ export async function executeAgent(agent, ctx) {
75
79
  if (repairStep) {
76
80
  // Validated up front in buildRepairFoldMap: a repair_fold target is
77
81
  // always a tools-bearing step, so hasTools is guaranteed true here.
78
- const result = await runToolLoopStepWithRepair(model, ctx.tools, prompt, repairStep, ctx.binding, ctx.registry, stepId, ctx.onToolCallOutcome, ctx.onEvent, ctx.maxSteps);
82
+ const result = await runToolLoopStepWithRepair(model, ctx.tools, prompt, repairStep, ctx.binding, ctx.registry, stepId, ctx.onToolCallOutcome, ctx.onEvent, ctx.maxSteps, ctx.signal);
79
83
  if (result.exhausted) {
80
84
  throw new StepBudgetExhaustedError(stepId, ctx.maxSteps, artifacts.size);
81
85
  }
@@ -83,14 +87,14 @@ export async function executeAgent(agent, ctx) {
83
87
  repaired = result.repaired;
84
88
  }
85
89
  else if (hasTools) {
86
- const result = await runToolLoopStep(model, ctx.tools, prompt, stepId, ctx.onToolCallOutcome, ctx.onEvent, ctx.maxSteps);
90
+ const result = await runToolLoopStep(model, ctx.tools, prompt, stepId, ctx.onToolCallOutcome, ctx.onEvent, ctx.maxSteps, ctx.signal);
87
91
  if (result.exhausted) {
88
92
  throw new StepBudgetExhaustedError(stepId, ctx.maxSteps, artifacts.size);
89
93
  }
90
94
  text = result.text;
91
95
  }
92
96
  else {
93
- text = await runSingleGenerateStep(model, prompt);
97
+ text = await runSingleGenerateStep(model, prompt, ctx.signal);
94
98
  }
95
99
  }
96
100
  catch (error) {
@@ -162,20 +166,31 @@ function assertV1Scope(agent) {
162
166
  throw new AgentScopeError(agent.id, agent.component_type, agent.trigger, agent.outcome);
163
167
  }
164
168
  }
169
+ /**
170
+ * `brief` is declared only on the available branch of the `Agent` union
171
+ * (see `bundle/schema.ts`), so a plain `agent.brief` doesn't type-check on
172
+ * the union itself. This is the one narrowing site for it: `executeAgent`
173
+ * only ever runs the available branch (the unavailable manifest variant has
174
+ * no executable steps to run), so this always resolves to the authored
175
+ * value when one exists.
176
+ */
177
+ function agentBrief(agent) {
178
+ return "brief" in agent ? agent.brief : undefined;
179
+ }
165
180
  function isConsumesSatisfied(step, artifacts) {
166
181
  return step.consumes.every((artifactName) => artifacts.has(artifactName));
167
182
  }
168
- async function runSingleGenerateStep(model, prompt) {
169
- const result = await generateText({ model, prompt });
183
+ async function runSingleGenerateStep(model, prompt, signal) {
184
+ const result = await generateText({ model, prompt, ...(signal ? { abortSignal: signal } : {}) });
170
185
  return result.text;
171
186
  }
172
- async function runToolLoopStep(model, tools, prompt, stepId, onToolCallOutcome, onEvent, maxSteps) {
187
+ async function runToolLoopStep(model, tools, prompt, stepId, onToolCallOutcome, onEvent, maxSteps, signal) {
173
188
  const agentRunner = new ToolLoopAgent({
174
189
  model,
175
190
  tools,
176
191
  ...(maxSteps !== undefined ? { stopWhen: isStepCount(maxSteps) } : {}),
177
192
  });
178
- const result = await agentRunner.generate({ prompt });
193
+ const result = await agentRunner.generate({ prompt, ...(signal ? { abortSignal: signal } : {}) });
179
194
  reportToolCallOutcomes(result.steps, stepId, onToolCallOutcome, onEvent);
180
195
  return { text: result.text, exhausted: isBudgetExhausted(result, maxSteps) };
181
196
  }
@@ -192,7 +207,7 @@ async function runToolLoopStep(model, tools, prompt, stepId, onToolCallOutcome,
192
207
  * (default 1); once exhausted, a further tool-error throws
193
208
  * {@link RepairExhaustedError} instead of retrying again.
194
209
  */
195
- async function runToolLoopStepWithRepair(model, tools, prompt, repairStep, binding, registry, stepId, onToolCallOutcome, onEvent, maxSteps) {
210
+ async function runToolLoopStepWithRepair(model, tools, prompt, repairStep, binding, registry, stepId, onToolCallOutcome, onEvent, maxSteps, signal) {
196
211
  const maxAttempts = repairStep.realization.max_attempts ?? 1;
197
212
  const repairModel = resolveStepModel(repairStep, binding, registry);
198
213
  const foldTarget = repairStep.realization.fold_into ?? repairStep.name;
@@ -215,7 +230,7 @@ async function runToolLoopStepWithRepair(model, tools, prompt, repairStep, bindi
215
230
  return { model: repairModel, instructions: repairStep.prompt };
216
231
  },
217
232
  });
218
- const result = await agentRunner.generate({ prompt });
233
+ const result = await agentRunner.generate({ prompt, ...(signal ? { abortSignal: signal } : {}) });
219
234
  reportToolCallOutcomes(result.steps, stepId, onToolCallOutcome, onEvent);
220
235
  return { text: result.text, repaired, exhausted: isBudgetExhausted(result, maxSteps) };
221
236
  }
@@ -361,12 +376,19 @@ function basenameOf(filePath) {
361
376
  }
362
377
  /**
363
378
  * Builds the message sent for a step: the user's question (always present,
364
- * so steps with `consumes: []` like `resolve_intent` can still see it),
365
- * the step's own prompt, and the resolved values of every artifact it
366
- * consumes.
379
+ * so steps with `consumes: []` like `resolve_intent` can still see it), the
380
+ * component's authored `brief` when the profile sets one (framing shared
381
+ * across every step — placed after the question, before the step's own
382
+ * prompt body, matching where every Warble back-end places it relative to
383
+ * its own preamble/context), the step's own prompt, and the resolved values
384
+ * of every artifact it consumes.
367
385
  */
368
- function renderStepPrompt(step, userInput, artifacts) {
369
- const sections = [`User's question: ${userInput}`, step.prompt];
386
+ function renderStepPrompt(step, userInput, artifacts, brief) {
387
+ const sections = [`User's question: ${userInput}`];
388
+ if (brief !== undefined) {
389
+ sections.push(brief);
390
+ }
391
+ sections.push(step.prompt);
370
392
  if (step.consumes.length > 0) {
371
393
  const consumedSection = step.consumes
372
394
  .map((name) => `${name}: ${formatArtifactValue(artifacts.get(name))}`)
@@ -17,6 +17,8 @@
17
17
  * next resolution tier.
18
18
  */
19
19
  export declare function resolveInstalledPackageBin(packageName: string, binName: string): string | undefined;
20
+ /** Returns an installed package's canonical root through Node resolution, never by walking PATH. */
21
+ export declare function resolveInstalledPackageRoot(packageName: string): string | undefined;
20
22
  /**
21
23
  * Named, explicit opt-in that re-enables the legacy "sibling `warble` git checkout"
22
24
  * development-mode resolution tier in `resolveWarbleBinary`, `resolveAgentSdkCli`, and
@@ -21,19 +21,31 @@ import path from "node:path";
21
21
  */
22
22
  export function resolveInstalledPackageBin(packageName, binName) {
23
23
  try {
24
- const require = createRequire(import.meta.url);
25
- const pkgJsonPath = require.resolve(`${packageName}/package.json`);
26
- const pkg = JSON.parse(readFileSync(pkgJsonPath, "utf8"));
24
+ const pkgJsonPath = resolveInstalledPackageRoot(packageName);
25
+ if (pkgJsonPath === undefined)
26
+ return undefined;
27
+ const manifestPath = path.join(pkgJsonPath, "package.json");
28
+ const pkg = JSON.parse(readFileSync(manifestPath, "utf8"));
27
29
  const binField = typeof pkg.bin === "string" ? pkg.bin : pkg.bin?.[binName];
28
30
  if (binField === undefined)
29
31
  return undefined;
30
- const resolved = path.resolve(path.dirname(pkgJsonPath), binField);
32
+ const resolved = path.resolve(pkgJsonPath, binField);
31
33
  return existsSync(resolved) ? resolved : undefined;
32
34
  }
33
35
  catch {
34
36
  return undefined;
35
37
  }
36
38
  }
39
+ /** Returns an installed package's canonical root through Node resolution, never by walking PATH. */
40
+ export function resolveInstalledPackageRoot(packageName) {
41
+ try {
42
+ const require = createRequire(import.meta.url);
43
+ return path.dirname(require.resolve(`${packageName}/package.json`));
44
+ }
45
+ catch {
46
+ return undefined;
47
+ }
48
+ }
37
49
  /**
38
50
  * Named, explicit opt-in that re-enables the legacy "sibling `warble` git checkout"
39
51
  * development-mode resolution tier in `resolveWarbleBinary`, `resolveAgentSdkCli`, and
@@ -6,5 +6,18 @@ export interface OpenAICompatibleAdapterConfig {
6
6
  readonly apiKey?: string;
7
7
  /** Provider name reported in telemetry/errors. Defaults to the adapter id. */
8
8
  readonly name?: string;
9
+ /**
10
+ * Extra fields merged into every chat-completions request body, for serving
11
+ * runtimes whose switches live in the body rather than in a header or the
12
+ * model id — e.g. Nemotron's reasoning toggle
13
+ * `{ chat_template_kwargs: { enable_thinking: true } }` on NIM/vLLM. Merged
14
+ * deeply over the SDK-built body; a key the SDK also sets is overridden by
15
+ * the operator's value, since the operator declared it on purpose.
16
+ */
17
+ readonly extraBody?: Readonly<Record<string, unknown>>;
18
+ /** Test seam: a fetch replacement so the serialized request can be inspected offline. */
19
+ readonly fetch?: typeof fetch;
9
20
  }
21
+ /** Deep-merges `extra` into `base`; arrays and scalars in `extra` replace, objects merge. */
22
+ export declare function mergeRequestBody(base: Record<string, unknown>, extra: Readonly<Record<string, unknown>>): Record<string, unknown>;
10
23
  export declare function createOpenAICompatibleAdapter(config: OpenAICompatibleAdapterConfig): LanguageModel;
@@ -1,10 +1,27 @@
1
1
  import { createOpenAICompatible } from "@ai-sdk/openai-compatible";
2
2
  export const OPENAI_COMPATIBLE_ADAPTER_ID = "openai-compatible";
3
+ function isPlainObject(value) {
4
+ return typeof value === "object" && value !== null && !Array.isArray(value);
5
+ }
6
+ /** Deep-merges `extra` into `base`; arrays and scalars in `extra` replace, objects merge. */
7
+ export function mergeRequestBody(base, extra) {
8
+ const out = { ...base };
9
+ for (const [key, value] of Object.entries(extra)) {
10
+ const existing = out[key];
11
+ out[key] = isPlainObject(existing) && isPlainObject(value) ? mergeRequestBody(existing, value) : value;
12
+ }
13
+ return out;
14
+ }
3
15
  export function createOpenAICompatibleAdapter(config) {
16
+ const extraBody = config.extraBody;
4
17
  const provider = createOpenAICompatible({
5
18
  name: config.name ?? OPENAI_COMPATIBLE_ADAPTER_ID,
6
19
  baseURL: config.baseURL,
7
20
  ...(config.apiKey !== undefined ? { apiKey: config.apiKey } : {}),
21
+ ...(config.fetch !== undefined ? { fetch: config.fetch } : {}),
22
+ ...(extraBody !== undefined && Object.keys(extraBody).length > 0
23
+ ? { transformRequestBody: (body) => mergeRequestBody(body, extraBody) }
24
+ : {}),
8
25
  });
9
26
  return provider.languageModel(config.model);
10
27
  }
@@ -0,0 +1,7 @@
1
+ import type { LanguageModel } from "ai";
2
+ export declare const OPENAI_ADAPTER_ID = "openai";
3
+ export interface OpenAIAdapterConfig {
4
+ readonly model: string;
5
+ readonly apiKey?: string;
6
+ }
7
+ export declare function createOpenAIAdapter(config: OpenAIAdapterConfig): LanguageModel;
@@ -0,0 +1,6 @@
1
+ import { createOpenAI } from "@ai-sdk/openai";
2
+ export const OPENAI_ADAPTER_ID = "openai";
3
+ export function createOpenAIAdapter(config) {
4
+ const provider = createOpenAI(config.apiKey !== undefined ? { apiKey: config.apiKey } : {});
5
+ return provider.languageModel(config.model);
6
+ }
@@ -0,0 +1,48 @@
1
+ import type { LanguageModelV4, LanguageModelV4CallOptions, LanguageModelV4FinishReason, LanguageModelV4Prompt, LanguageModelV4StreamPart, LanguageModelV4Usage, SharedV4Warning } from "@ai-sdk/provider";
2
+ import type { Api, AssistantMessage, AssistantMessageEvent, Context, Model, StopReason, Usage } from "@earendil-works/pi-ai";
3
+ export declare const PI_AI_ADAPTER_ID = "pi-ai";
4
+ /**
5
+ * Config for the `pi-ai` adapter: one model behind pi-ai's unified client.
6
+ *
7
+ * - `provider` is a pi-ai built-in provider id (`openrouter`, `amazon-bedrock`,
8
+ * `vercel-ai-gateway`, ...), or — together with `baseUrl` — the name given to
9
+ * a custom endpoint.
10
+ * - `baseUrl` turns the binding into a custom provider speaking the OpenAI
11
+ * chat-completions wire (`openai-completions`). Custom endpoints speaking the
12
+ * Anthropic messages wire are not wired up here and are untested.
13
+ * - `apiKey` is passed on every request. Nothing else is consulted: no
14
+ * environment variables, no `~/.pi` files, no stored or OAuth credentials.
15
+ */
16
+ export interface PiAiAdapterConfig {
17
+ readonly provider: string;
18
+ readonly model: string;
19
+ readonly apiKey?: string;
20
+ readonly baseUrl?: string;
21
+ readonly headers?: Readonly<Record<string, string>>;
22
+ /** Test seam: a fetch replacement so requests can be scripted offline. */
23
+ readonly fetch?: typeof fetch;
24
+ }
25
+ type Warnings = SharedV4Warning[];
26
+ /** Maps the AI SDK prompt and tools onto a pi-ai `Context`. */
27
+ export declare function toPiContext(prompt: LanguageModelV4Prompt, options: Pick<LanguageModelV4CallOptions, "tools" | "toolChoice" | "responseFormat">, model: Pick<Model<Api>, "api" | "provider" | "id">, warnings: Warnings): Context;
28
+ /** Maps pi-ai's stop reason onto the AI SDK's unified finish reason. */
29
+ export declare function toFinishReason(stopReason: StopReason): LanguageModelV4FinishReason;
30
+ /** Maps pi-ai usage (where `input` excludes cached tokens) onto AI SDK usage. */
31
+ export declare function toUsage(usage: Usage): LanguageModelV4Usage;
32
+ /** Maps one pi-ai stream event onto zero or more AI SDK stream parts. */
33
+ export declare function toStreamParts(event: AssistantMessageEvent, toolInputIds: Map<number, string>, failure: (message: AssistantMessage) => Error): LanguageModelV4StreamPart[];
34
+ /** pi-ai's built-in, offline catalog: API-key providers and one provider's chat models. */
35
+ export interface PiAiCatalog {
36
+ readonly providers: readonly string[];
37
+ readonly models: readonly {
38
+ readonly id: string;
39
+ readonly name: string;
40
+ }[];
41
+ }
42
+ /**
43
+ * Lists the catalog that ships inside pi-ai — no network, no credentials.
44
+ * OAuth-only providers are left out because gateway mode cannot use them.
45
+ */
46
+ export declare function listPiAiCatalog(provider?: string): Promise<PiAiCatalog>;
47
+ export declare function createPiAiAdapter(config: PiAiAdapterConfig): LanguageModelV4;
48
+ export {};