@wrenai/genbi 0.0.3 → 0.0.5
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.
- package/README.md +65 -3
- package/dist/assets/{echarts-LTFC-ysd.js → echarts-DYM4hjvk.js} +2 -2
- package/dist/assets/index-A_Wrq7Ey.css +1 -0
- package/dist/assets/{index-Bo--QMUN.js → index-DsH129tV.js} +18 -17
- package/dist/index.html +2 -2
- package/dist-server/harness/bundle/schema.d.ts +38 -0
- package/dist-server/harness/bundle/schema.js +18 -10
- package/dist-server/harness/bundle/version.js +1 -1
- package/dist-server/harness/cli-args.d.ts +10 -2
- package/dist-server/harness/cli-args.js +24 -8
- package/dist-server/harness/cli.js +75 -9
- package/dist-server/harness/compile/cache.js +4 -4
- package/dist-server/harness/compile/compose-profile.d.ts +51 -14
- package/dist-server/harness/compile/compose-profile.js +85 -19
- package/dist-server/harness/compile/context-loader.d.ts +56 -0
- package/dist-server/harness/compile/context-loader.js +237 -0
- package/dist-server/harness/compile/errors.d.ts +19 -0
- package/dist-server/harness/compile/errors.js +35 -0
- package/dist-server/harness/compile/index.d.ts +4 -3
- package/dist-server/harness/compile/index.js +4 -3
- package/dist-server/harness/compile/pipeline.d.ts +15 -7
- package/dist-server/harness/compile/pipeline.js +62 -14
- package/dist-server/harness/compile/resolve-binary.d.ts +2 -2
- package/dist-server/harness/compile/resolve-binary.js +13 -3
- package/dist-server/harness/compile/types.d.ts +29 -0
- package/dist-server/harness/compile/warble-identity.d.ts +11 -0
- package/dist-server/harness/compile/warble-identity.js +13 -0
- package/dist-server/harness/components/ai-step.d.ts +4 -0
- package/dist-server/harness/components/ai-step.js +40 -0
- package/dist-server/harness/components/broker.d.ts +60 -0
- package/dist-server/harness/components/broker.js +117 -0
- package/dist-server/harness/components/capability-card.d.ts +98 -0
- package/dist-server/harness/components/capability-card.js +169 -0
- package/dist-server/harness/components/context.d.ts +2 -0
- package/dist-server/harness/components/context.js +30 -0
- package/dist-server/harness/components/display.d.ts +6 -0
- package/dist-server/harness/components/display.js +29 -0
- package/dist-server/harness/components/egress-judge.d.ts +12 -0
- package/dist-server/harness/components/egress-judge.js +27 -0
- package/dist-server/harness/components/egress.d.ts +142 -0
- package/dist-server/harness/components/egress.js +469 -0
- package/dist-server/harness/components/in-process.d.ts +7 -0
- package/dist-server/harness/components/in-process.js +245 -0
- package/dist-server/harness/components/normalize.d.ts +35 -0
- package/dist-server/harness/components/normalize.js +245 -0
- package/dist-server/harness/components/plan.d.ts +31 -0
- package/dist-server/harness/components/plan.js +184 -0
- package/dist-server/harness/components/report.d.ts +207 -0
- package/dist-server/harness/components/report.js +309 -0
- package/dist-server/harness/components/runner.d.ts +193 -0
- package/dist-server/harness/components/runner.js +492 -0
- package/dist-server/harness/components/semantic-guards.d.ts +20 -0
- package/dist-server/harness/components/semantic-guards.js +42 -0
- package/dist-server/harness/components/terminal-json.d.ts +18 -0
- package/dist-server/harness/components/terminal-json.js +82 -0
- package/dist-server/harness/components/usage.d.ts +14 -0
- package/dist-server/harness/components/usage.js +19 -0
- package/dist-server/harness/components/wren-access.d.ts +29 -0
- package/dist-server/harness/components/wren-access.js +233 -0
- package/dist-server/harness/components/zone-dry-run.d.ts +43 -0
- package/dist-server/harness/components/zone-dry-run.js +107 -0
- package/dist-server/harness/components/zone-gate.d.ts +76 -0
- package/dist-server/harness/components/zone-gate.js +144 -0
- package/dist-server/harness/events/index.d.ts +1 -1
- package/dist-server/harness/events/types.d.ts +52 -0
- package/dist-server/harness/index.d.ts +9 -2
- package/dist-server/harness/index.js +5 -1
- package/dist-server/harness/loop/executor.d.ts +1 -0
- package/dist-server/harness/loop/executor.js +37 -15
- package/dist-server/harness/npm-package-resolve.d.ts +2 -0
- package/dist-server/harness/npm-package-resolve.js +16 -4
- package/dist-server/harness/providers/adapters/openai-compatible.d.ts +13 -0
- package/dist-server/harness/providers/adapters/openai-compatible.js +17 -0
- package/dist-server/harness/providers/adapters/openai.d.ts +7 -0
- package/dist-server/harness/providers/adapters/openai.js +6 -0
- package/dist-server/harness/providers/adapters/pi-ai.d.ts +48 -0
- package/dist-server/harness/providers/adapters/pi-ai.js +518 -0
- package/dist-server/harness/providers/binding.d.ts +45 -4
- package/dist-server/harness/providers/binding.js +44 -8
- package/dist-server/harness/providers/index.d.ts +9 -3
- package/dist-server/harness/providers/index.js +10 -3
- package/dist-server/harness/providers/zone.d.ts +96 -0
- package/dist-server/harness/providers/zone.js +112 -0
- package/dist-server/harness/render/answering-query.d.ts +29 -0
- package/dist-server/harness/render/answering-query.js +62 -0
- package/dist-server/harness/render/envelope.d.ts +6 -0
- package/dist-server/harness/render/envelope.js +10 -3
- package/dist-server/harness/route/adapter-spec.d.ts +8 -9
- package/dist-server/harness/route/adapter-spec.js +13 -14
- package/dist-server/harness/route/codex-ask-events.js +2 -1
- package/dist-server/harness/route/codex-ask.d.ts +4 -0
- package/dist-server/harness/route/codex-ask.js +69 -30
- package/dist-server/harness/route/codex-host-query.d.ts +52 -0
- package/dist-server/harness/route/codex-host-query.js +191 -0
- package/dist-server/harness/route/codex-local-manifest.d.ts +9 -1
- package/dist-server/harness/route/codex-local-manifest.js +96 -15
- package/dist-server/harness/route/codex-wren-proxy.d.ts +33 -0
- package/dist-server/harness/route/codex-wren-proxy.js +227 -0
- package/dist-server/harness/route/describe.js +45 -6
- package/dist-server/harness/route/in-process.d.ts +22 -1
- package/dist-server/harness/route/in-process.js +54 -4
- package/dist-server/harness/route/route.js +5 -2
- package/dist-server/harness/route/types.d.ts +30 -1
- package/dist-server/harness/session/run.js +30 -10
- package/dist-server/harness/setup/runner.d.ts +2 -0
- package/dist-server/harness/setup/runner.js +38 -17
- package/dist-server/harness/setup/yaml-scalar.d.ts +23 -0
- package/dist-server/harness/setup/yaml-scalar.js +62 -0
- package/dist-server/server/adopt.js +1 -17
- package/dist-server/server/app.d.ts +1 -0
- package/dist-server/server/app.js +163 -14
- package/dist-server/server/auth-choice.d.ts +13 -1
- package/dist-server/server/auth-choice.js +66 -1
- package/dist-server/server/bin.js +197 -26
- package/dist-server/server/codex-local-grounding.d.ts +18 -0
- package/dist-server/server/codex-local-grounding.js +92 -0
- package/dist-server/server/codex-native-session.d.ts +25 -0
- package/dist-server/server/codex-native-session.js +1 -0
- package/dist-server/server/codex-runtime-composition.d.ts +34 -0
- package/dist-server/server/codex-runtime-composition.js +250 -0
- package/dist-server/server/codex-structured-ask.d.ts +23 -0
- package/dist-server/server/codex-structured-ask.js +102 -0
- package/dist-server/server/conn-config.js +4 -16
- package/dist-server/server/conversation-socket.d.ts +16 -0
- package/dist-server/server/conversation-socket.js +65 -0
- package/dist-server/server/db.d.ts +46 -0
- package/dist-server/server/db.js +88 -9
- package/dist-server/server/env-detect.d.ts +6 -0
- package/dist-server/server/env-detect.js +7 -0
- package/dist-server/server/fold.d.ts +22 -4
- package/dist-server/server/fold.js +37 -5
- package/dist-server/server/harness.d.ts +2 -2
- package/dist-server/server/harness.js +33 -7
- package/dist-server/server/interactive-terminal.d.ts +10 -6
- package/dist-server/server/interactive-terminal.js +33 -8
- package/dist-server/server/managed-wren-runtime.d.ts +116 -0
- package/dist-server/server/managed-wren-runtime.js +670 -0
- package/dist-server/server/native-artifacts.d.ts +23 -7
- package/dist-server/server/native-artifacts.js +43 -12
- package/dist-server/server/native-component-context.d.ts +19 -0
- package/dist-server/server/native-component-context.js +76 -0
- package/dist-server/server/native-component-preparation.d.ts +20 -0
- package/dist-server/server/native-component-preparation.js +129 -0
- package/dist-server/server/native-component-runtime.d.ts +36 -0
- package/dist-server/server/native-component-runtime.js +92 -0
- package/dist-server/server/native-components.d.ts +84 -0
- package/dist-server/server/native-components.js +160 -0
- package/dist-server/server/native-dispatch-process.d.ts +8 -0
- package/dist-server/server/native-dispatch-process.js +65 -0
- package/dist-server/server/native-runtime-spec.d.ts +89 -0
- package/dist-server/server/native-runtime-spec.js +169 -0
- package/dist-server/server/native-sessions.d.ts +172 -19
- package/dist-server/server/native-sessions.js +870 -251
- package/dist-server/server/native-shutdown.d.ts +6 -0
- package/dist-server/server/native-shutdown.js +28 -0
- package/dist-server/server/native-wren-home.d.ts +18 -0
- package/dist-server/server/native-wren-home.js +262 -0
- package/dist-server/server/node-pty-host.d.ts +2 -1
- package/dist-server/server/node-pty-host.js +3 -2
- package/dist-server/server/profile-registry.d.ts +139 -0
- package/dist-server/server/profile-registry.js +620 -0
- package/dist-server/server/runtime-binding.d.ts +4 -1
- package/dist-server/server/runtime-binding.js +50 -2
- package/dist-server/server/runtime-host/claude-component-step.d.ts +25 -0
- package/dist-server/server/runtime-host/claude-component-step.js +186 -0
- package/dist-server/server/runtime-host/codex-app-server.d.ts +75 -0
- package/dist-server/server/runtime-host/codex-app-server.js +239 -0
- package/dist-server/server/runtime-host/codex-compatibility.d.ts +110 -0
- package/dist-server/server/runtime-host/codex-compatibility.js +162 -0
- package/dist-server/server/runtime-host/codex-component-step.d.ts +19 -0
- package/dist-server/server/runtime-host/codex-component-step.js +308 -0
- package/dist-server/server/runtime-host/codex-conversation.d.ts +109 -0
- package/dist-server/server/runtime-host/codex-conversation.js +295 -0
- package/dist-server/server/runtime-host/codex-direct-tools.d.ts +23 -0
- package/dist-server/server/runtime-host/codex-direct-tools.js +59 -0
- package/dist-server/server/runtime-host/codex-events.d.ts +647 -0
- package/dist-server/server/runtime-host/codex-events.js +66 -0
- package/dist-server/server/runtime-host/codex-policy.d.ts +16 -0
- package/dist-server/server/runtime-host/codex-policy.js +151 -0
- package/dist-server/server/runtime-host/codex-process.d.ts +8 -0
- package/dist-server/server/runtime-host/codex-process.js +96 -0
- package/dist-server/server/runtime-host/codex-rpc.d.ts +47 -0
- package/dist-server/server/runtime-host/codex-rpc.js +182 -0
- package/dist-server/server/runtime-host/codex-session.d.ts +74 -0
- package/dist-server/server/runtime-host/codex-session.js +492 -0
- package/dist-server/server/runtime-host/codex-terminal-protocol.d.ts +35 -0
- package/dist-server/server/runtime-host/codex-terminal-protocol.js +243 -0
- package/dist-server/server/runtime-host/codex-terminal.d.ts +16 -0
- package/dist-server/server/runtime-host/codex-terminal.js +120 -0
- package/dist-server/server/runtime-host/index.d.ts +5 -0
- package/dist-server/server/runtime-host/index.js +3 -0
- package/dist-server/server/runtime-host/local.d.ts +29 -0
- package/dist-server/server/runtime-host/local.js +90 -0
- package/dist-server/server/runtime-host/policy.d.ts +8 -0
- package/dist-server/server/runtime-host/policy.js +78 -0
- package/dist-server/server/runtime-host/types.d.ts +52 -0
- package/dist-server/server/runtime-host/types.js +62 -0
- package/dist-server/server/structured-query-evidence.d.ts +7 -0
- package/dist-server/server/structured-query-evidence.js +47 -0
- package/dist-server/server/structured-runtime.d.ts +52 -0
- package/dist-server/server/structured-runtime.js +130 -0
- package/dist-server/server/structured-scope.d.ts +4 -0
- package/dist-server/server/structured-scope.js +12 -0
- package/dist-server/server/turn.d.ts +6 -1
- package/dist-server/server/turn.js +82 -25
- package/dist-server/server/wire-types.d.ts +67 -3
- package/dist-server/server/wren-profiles.js +1 -1
- package/managed-wren/README.md +60 -0
- package/managed-wren/dependency-wheels.json +282 -0
- package/managed-wren/manifest.json +373 -0
- package/managed-wren/release-inputs.json +45 -0
- package/managed-wren/runtime-tree.cjs +115 -0
- package/managed-wren/source-inputs.json +40 -0
- package/package.json +15 -6
- package/profiles/genbi-default/context/binding.yml +17 -7
- package/profiles/genbi-default/context/context.json +146 -0
- package/profiles/genbi-default/ir.golden.json +39 -43
- package/profiles/genbi-default/profile.yml +31 -0
- package/profiles/genbi-enrich-context/context/binding.yml +14 -3
- package/profiles/genbi-enrich-context/context/context.json +146 -0
- package/profiles/genbi-enrich-context/ir.golden.json +4 -5
- package/profiles/genbi-monitor/context/binding.yml +13 -5
- package/profiles/genbi-monitor/context/context.json +146 -0
- package/profiles/genbi-monitor/ir.golden.json +13 -7
- package/profiles/genbi-report/context/binding.yml +19 -0
- package/profiles/genbi-report/context/context.json +223 -0
- package/profiles/genbi-report/ir.golden.json +328 -0
- package/profiles/genbi-report/profile.yml +38 -0
- package/profiles/genbi-setup/ir.golden.json +3 -1
- 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
|
-
*
|
|
366
|
-
*
|
|
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}
|
|
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
|
|
25
|
-
|
|
26
|
-
|
|
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(
|
|
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 {};
|