@wrenai/genbi 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +201 -0
- package/README.md +141 -0
- package/bin/genbi.mjs +31 -0
- package/dist/assets/echarts-LTFC-ysd.js +40 -0
- package/dist/assets/index-Bo--QMUN.js +441 -0
- package/dist/assets/index-Xs4q7pNo.css +1 -0
- package/dist/index.html +14 -0
- package/dist/wrenai_logo.png +0 -0
- package/dist/wrenai_logo_white.png +0 -0
- package/dist-server/harness/auth/detect.d.ts +18 -0
- package/dist-server/harness/auth/detect.js +37 -0
- package/dist-server/harness/auth/index.d.ts +4 -0
- package/dist-server/harness/auth/index.js +2 -0
- package/dist-server/harness/auth/probe.d.ts +18 -0
- package/dist-server/harness/auth/probe.js +52 -0
- package/dist-server/harness/auth/types.d.ts +42 -0
- package/dist-server/harness/auth/types.js +9 -0
- package/dist-server/harness/bundle/loader.d.ts +32 -0
- package/dist-server/harness/bundle/loader.js +43 -0
- package/dist-server/harness/bundle/schema.d.ts +199 -0
- package/dist-server/harness/bundle/schema.js +127 -0
- package/dist-server/harness/bundle/version.d.ts +10 -0
- package/dist-server/harness/bundle/version.js +43 -0
- package/dist-server/harness/capability/gate.d.ts +6 -0
- package/dist-server/harness/capability/gate.js +29 -0
- package/dist-server/harness/capability/registry.d.ts +6 -0
- package/dist-server/harness/capability/registry.js +17 -0
- package/dist-server/harness/cli-args.d.ts +123 -0
- package/dist-server/harness/cli-args.js +247 -0
- package/dist-server/harness/cli.d.ts +2 -0
- package/dist-server/harness/cli.js +151 -0
- package/dist-server/harness/compile/cache.d.ts +23 -0
- package/dist-server/harness/compile/cache.js +109 -0
- package/dist-server/harness/compile/compose-profile.d.ts +34 -0
- package/dist-server/harness/compile/compose-profile.js +95 -0
- package/dist-server/harness/compile/errors.d.ts +22 -0
- package/dist-server/harness/compile/errors.js +41 -0
- package/dist-server/harness/compile/fingerprint.d.ts +22 -0
- package/dist-server/harness/compile/fingerprint.js +84 -0
- package/dist-server/harness/compile/index.d.ts +8 -0
- package/dist-server/harness/compile/index.js +7 -0
- package/dist-server/harness/compile/pipeline.d.ts +66 -0
- package/dist-server/harness/compile/pipeline.js +176 -0
- package/dist-server/harness/compile/resolve-binary.d.ts +55 -0
- package/dist-server/harness/compile/resolve-binary.js +133 -0
- package/dist-server/harness/compile/types.d.ts +107 -0
- package/dist-server/harness/compile/types.js +1 -0
- package/dist-server/harness/compile/warble-identity.d.ts +12 -0
- package/dist-server/harness/compile/warble-identity.js +33 -0
- package/dist-server/harness/compliance/gate.d.ts +35 -0
- package/dist-server/harness/compliance/gate.js +48 -0
- package/dist-server/harness/compliance/index.d.ts +2 -0
- package/dist-server/harness/compliance/index.js +1 -0
- package/dist-server/harness/compliance/types.d.ts +16 -0
- package/dist-server/harness/compliance/types.js +1 -0
- package/dist-server/harness/events/emitter.d.ts +34 -0
- package/dist-server/harness/events/emitter.js +25 -0
- package/dist-server/harness/events/index.d.ts +4 -0
- package/dist-server/harness/events/index.js +2 -0
- package/dist-server/harness/events/sse.d.ts +20 -0
- package/dist-server/harness/events/sse.js +48 -0
- package/dist-server/harness/events/types.d.ts +131 -0
- package/dist-server/harness/events/types.js +1 -0
- package/dist-server/harness/exec/errors.d.ts +16 -0
- package/dist-server/harness/exec/errors.js +29 -0
- package/dist-server/harness/exec/index.d.ts +5 -0
- package/dist-server/harness/exec/index.js +2 -0
- package/dist-server/harness/exec/local.d.ts +32 -0
- package/dist-server/harness/exec/local.js +134 -0
- package/dist-server/harness/exec/policy.d.ts +12 -0
- package/dist-server/harness/exec/policy.js +1 -0
- package/dist-server/harness/exec/types.d.ts +63 -0
- package/dist-server/harness/exec/types.js +1 -0
- package/dist-server/harness/guardrails/index.d.ts +2 -0
- package/dist-server/harness/guardrails/index.js +1 -0
- package/dist-server/harness/guardrails/policy.d.ts +45 -0
- package/dist-server/harness/guardrails/policy.js +57 -0
- package/dist-server/harness/index.d.ts +37 -0
- package/dist-server/harness/index.js +19 -0
- package/dist-server/harness/loop/errors.d.ts +53 -0
- package/dist-server/harness/loop/errors.js +72 -0
- package/dist-server/harness/loop/executor.d.ts +123 -0
- package/dist-server/harness/loop/executor.js +380 -0
- package/dist-server/harness/loop/guard.d.ts +16 -0
- package/dist-server/harness/loop/guard.js +1 -0
- package/dist-server/harness/loop/index.d.ts +5 -0
- package/dist-server/harness/loop/index.js +3 -0
- package/dist-server/harness/native-producer/index.d.ts +109 -0
- package/dist-server/harness/native-producer/index.js +302 -0
- package/dist-server/harness/npm-package-resolve.d.ts +28 -0
- package/dist-server/harness/npm-package-resolve.js +47 -0
- package/dist-server/harness/providers/adapters/anthropic.d.ts +7 -0
- package/dist-server/harness/providers/adapters/anthropic.js +6 -0
- package/dist-server/harness/providers/adapters/mock.d.ts +4 -0
- package/dist-server/harness/providers/adapters/mock.js +5 -0
- package/dist-server/harness/providers/adapters/openai-compatible.d.ts +10 -0
- package/dist-server/harness/providers/adapters/openai-compatible.js +10 -0
- package/dist-server/harness/providers/binding.d.ts +23 -0
- package/dist-server/harness/providers/binding.js +13 -0
- package/dist-server/harness/providers/errors.d.ts +6 -0
- package/dist-server/harness/providers/errors.js +12 -0
- package/dist-server/harness/providers/index.d.ts +18 -0
- package/dist-server/harness/providers/index.js +22 -0
- package/dist-server/harness/providers/registry.d.ts +16 -0
- package/dist-server/harness/providers/registry.js +24 -0
- package/dist-server/harness/render/envelope.d.ts +145 -0
- package/dist-server/harness/render/envelope.js +428 -0
- package/dist-server/harness/render/errors.d.ts +33 -0
- package/dist-server/harness/render/errors.js +46 -0
- package/dist-server/harness/render/index.d.ts +5 -0
- package/dist-server/harness/render/index.js +3 -0
- package/dist-server/harness/render/validate.d.ts +13 -0
- package/dist-server/harness/render/validate.js +88 -0
- package/dist-server/harness/route/adapter-spec.d.ts +40 -0
- package/dist-server/harness/route/adapter-spec.js +61 -0
- package/dist-server/harness/route/agent-sdk-cli.d.ts +30 -0
- package/dist-server/harness/route/agent-sdk-cli.js +86 -0
- package/dist-server/harness/route/agent-sdk-manifest.d.ts +31 -0
- package/dist-server/harness/route/agent-sdk-manifest.js +56 -0
- package/dist-server/harness/route/artifact-content.d.ts +53 -0
- package/dist-server/harness/route/artifact-content.js +83 -0
- package/dist-server/harness/route/chat-event-mapper.d.ts +95 -0
- package/dist-server/harness/route/chat-event-mapper.js +164 -0
- package/dist-server/harness/route/codex-ask-events.d.ts +25 -0
- package/dist-server/harness/route/codex-ask-events.js +395 -0
- package/dist-server/harness/route/codex-ask.d.ts +15 -0
- package/dist-server/harness/route/codex-ask.js +242 -0
- package/dist-server/harness/route/codex-local-cli.d.ts +20 -0
- package/dist-server/harness/route/codex-local-cli.js +78 -0
- package/dist-server/harness/route/codex-local-manifest.d.ts +22 -0
- package/dist-server/harness/route/codex-local-manifest.js +180 -0
- package/dist-server/harness/route/describe.d.ts +54 -0
- package/dist-server/harness/route/describe.js +84 -0
- package/dist-server/harness/route/dispatched.d.ts +138 -0
- package/dist-server/harness/route/dispatched.js +339 -0
- package/dist-server/harness/route/in-process.d.ts +43 -0
- package/dist-server/harness/route/in-process.js +106 -0
- package/dist-server/harness/route/index.d.ts +19 -0
- package/dist-server/harness/route/index.js +12 -0
- package/dist-server/harness/route/profile-source.d.ts +37 -0
- package/dist-server/harness/route/profile-source.js +76 -0
- package/dist-server/harness/route/route.d.ts +33 -0
- package/dist-server/harness/route/route.js +114 -0
- package/dist-server/harness/route/tier-binding.d.ts +36 -0
- package/dist-server/harness/route/tier-binding.js +63 -0
- package/dist-server/harness/route/types.d.ts +286 -0
- package/dist-server/harness/route/types.js +1 -0
- package/dist-server/harness/session/errors.d.ts +4 -0
- package/dist-server/harness/session/errors.js +7 -0
- package/dist-server/harness/session/gate.d.ts +11 -0
- package/dist-server/harness/session/gate.js +13 -0
- package/dist-server/harness/session/index.d.ts +5 -0
- package/dist-server/harness/session/index.js +3 -0
- package/dist-server/harness/session/run.d.ts +60 -0
- package/dist-server/harness/session/run.js +333 -0
- package/dist-server/harness/session/types.d.ts +29 -0
- package/dist-server/harness/session/types.js +1 -0
- package/dist-server/harness/setup/codex-events.d.ts +12 -0
- package/dist-server/harness/setup/codex-events.js +108 -0
- package/dist-server/harness/setup/runner.d.ts +497 -0
- package/dist-server/harness/setup/runner.js +1314 -0
- package/dist-server/harness/tools/errors.d.ts +107 -0
- package/dist-server/harness/tools/errors.js +141 -0
- package/dist-server/harness/tools/index.d.ts +13 -0
- package/dist-server/harness/tools/index.js +8 -0
- package/dist-server/harness/tools/mcp.d.ts +26 -0
- package/dist-server/harness/tools/mcp.js +15 -0
- package/dist-server/harness/tools/native.d.ts +179 -0
- package/dist-server/harness/tools/native.js +322 -0
- package/dist-server/harness/tools/parse.d.ts +14 -0
- package/dist-server/harness/tools/parse.js +18 -0
- package/dist-server/harness/tools/resolve-wren-binary.d.ts +12 -0
- package/dist-server/harness/tools/resolve-wren-binary.js +21 -0
- package/dist-server/harness/tools/resolve.d.ts +51 -0
- package/dist-server/harness/tools/resolve.js +79 -0
- package/dist-server/harness/tools/setup-native.d.ts +84 -0
- package/dist-server/harness/tools/setup-native.js +353 -0
- package/dist-server/harness/tools/wiring.d.ts +10 -0
- package/dist-server/harness/tools/wiring.js +16 -0
- package/dist-server/providers/setup.provider.yaml +31 -0
- package/dist-server/providers/wren.provider.yaml +33 -0
- package/dist-server/server/adopt.d.ts +87 -0
- package/dist-server/server/adopt.js +263 -0
- package/dist-server/server/app.d.ts +6 -0
- package/dist-server/server/app.js +2521 -0
- package/dist-server/server/auth-choice.d.ts +16 -0
- package/dist-server/server/auth-choice.js +36 -0
- package/dist-server/server/bin.d.ts +2 -0
- package/dist-server/server/bin.js +601 -0
- package/dist-server/server/bootstrap-project-binding.d.ts +31 -0
- package/dist-server/server/bootstrap-project-binding.js +71 -0
- package/dist-server/server/clarify.d.ts +10 -0
- package/dist-server/server/clarify.js +17 -0
- package/dist-server/server/codex-setup-mcp.d.ts +2 -0
- package/dist-server/server/codex-setup-mcp.js +147 -0
- package/dist-server/server/compose.d.ts +89 -0
- package/dist-server/server/compose.js +271 -0
- package/dist-server/server/conn-config.d.ts +30 -0
- package/dist-server/server/conn-config.js +253 -0
- package/dist-server/server/context-files.d.ts +12 -0
- package/dist-server/server/context-files.js +117 -0
- package/dist-server/server/context-map.d.ts +30 -0
- package/dist-server/server/context-map.js +95 -0
- package/dist-server/server/context-source.d.ts +68 -0
- package/dist-server/server/context-source.js +85 -0
- package/dist-server/server/db.d.ts +862 -0
- package/dist-server/server/db.js +1839 -0
- package/dist-server/server/enrichment-runner.d.ts +184 -0
- package/dist-server/server/enrichment-runner.js +213 -0
- package/dist-server/server/enrichment-verify.d.ts +73 -0
- package/dist-server/server/enrichment-verify.js +290 -0
- package/dist-server/server/enrichment.d.ts +232 -0
- package/dist-server/server/enrichment.js +199 -0
- package/dist-server/server/env-detect.d.ts +8 -0
- package/dist-server/server/env-detect.js +17 -0
- package/dist-server/server/env-field-hints.d.ts +46 -0
- package/dist-server/server/env-field-hints.js +48 -0
- package/dist-server/server/fold.d.ts +133 -0
- package/dist-server/server/fold.js +407 -0
- package/dist-server/server/harness-profile-sources.d.ts +3 -0
- package/dist-server/server/harness-profile-sources.js +24 -0
- package/dist-server/server/harness.d.ts +19 -0
- package/dist-server/server/harness.js +439 -0
- package/dist-server/server/impact.d.ts +18 -0
- package/dist-server/server/impact.js +85 -0
- package/dist-server/server/interactive-terminal.d.ts +175 -0
- package/dist-server/server/interactive-terminal.js +336 -0
- package/dist-server/server/native-artifacts.d.ts +1004 -0
- package/dist-server/server/native-artifacts.js +564 -0
- package/dist-server/server/native-dispatch-registry.d.ts +42 -0
- package/dist-server/server/native-dispatch-registry.js +45 -0
- package/dist-server/server/native-producer-fence.d.ts +14 -0
- package/dist-server/server/native-producer-fence.js +48 -0
- package/dist-server/server/native-session-resume.d.ts +6 -0
- package/dist-server/server/native-session-resume.js +103 -0
- package/dist-server/server/native-session-workspace.d.ts +40 -0
- package/dist-server/server/native-session-workspace.js +175 -0
- package/dist-server/server/native-sessions.d.ts +374 -0
- package/dist-server/server/native-sessions.js +1517 -0
- package/dist-server/server/native-wren-runtime.d.ts +20 -0
- package/dist-server/server/native-wren-runtime.js +259 -0
- package/dist-server/server/node-pty-host.d.ts +31 -0
- package/dist-server/server/node-pty-host.js +100 -0
- package/dist-server/server/route-intent.d.ts +40 -0
- package/dist-server/server/route-intent.js +23 -0
- package/dist-server/server/runtime-binding.d.ts +52 -0
- package/dist-server/server/runtime-binding.js +258 -0
- package/dist-server/server/source-catalog.d.ts +84 -0
- package/dist-server/server/source-catalog.js +221 -0
- package/dist-server/server/source-driver.d.ts +35 -0
- package/dist-server/server/source-driver.js +124 -0
- package/dist-server/server/spa.d.ts +2 -0
- package/dist-server/server/spa.js +51 -0
- package/dist-server/server/subscription-model-catalog.d.ts +27 -0
- package/dist-server/server/subscription-model-catalog.js +203 -0
- package/dist-server/server/turn.d.ts +249 -0
- package/dist-server/server/turn.js +1074 -0
- package/dist-server/server/wire-types.d.ts +799 -0
- package/dist-server/server/wire-types.js +1 -0
- package/dist-server/server/wren-home.d.ts +19 -0
- package/dist-server/server/wren-home.js +33 -0
- package/dist-server/server/wren-profiles.d.ts +43 -0
- package/dist-server/server/wren-profiles.js +123 -0
- package/package.json +93 -0
- package/profiles/genbi-default/context/binding.yml +9 -0
- package/profiles/genbi-default/ir.golden.json +506 -0
- package/profiles/genbi-default/profile.yml +16 -0
- package/profiles/genbi-enrich-context/components/apply_enrichment/component.yml +42 -0
- package/profiles/genbi-enrich-context/components/draft_enrichment/component.yml +30 -0
- package/profiles/genbi-enrich-context/components/draft_enrichment/steps/draft.md +34 -0
- package/profiles/genbi-enrich-context/components/inspect_context/component.yml +32 -0
- package/profiles/genbi-enrich-context/components/inspect_context/steps/inspect.md +13 -0
- package/profiles/genbi-enrich-context/context/binding.yml +4 -0
- package/profiles/genbi-enrich-context/ir.golden.json +302 -0
- package/profiles/genbi-enrich-context/profile.yml +15 -0
- package/profiles/genbi-monitor/context/binding.yml +7 -0
- package/profiles/genbi-monitor/ir.golden.json +188 -0
- package/profiles/genbi-monitor/profile.yml +27 -0
- package/profiles/genbi-setup/components/build_context/component.yml +44 -0
- package/profiles/genbi-setup/components/build_context/steps/build.md +14 -0
- package/profiles/genbi-setup/components/connect_source/component.yml +51 -0
- package/profiles/genbi-setup/components/connect_source/steps/connect.md +23 -0
- package/profiles/genbi-setup/context/binding.yml +8 -0
- package/profiles/genbi-setup/ir.golden.json +140 -0
- package/profiles/genbi-setup/profile.yml +18 -0
- package/profiles/genbi-setup/raw/schema.json +5 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
.xterm{cursor:text;-webkit-user-select:none;user-select:none;position:relative}.xterm.focus,.xterm:focus{outline:none}.xterm .xterm-helpers{z-index:5;position:absolute;top:0}.xterm .xterm-helper-textarea{opacity:0;z-index:-5;white-space:nowrap;resize:none;border:0;width:0;height:0;margin:0;padding:0;position:absolute;top:0;left:-9999em;overflow:hidden}.xterm .composition-view{color:#fff;white-space:nowrap;z-index:1;background:#000;display:none;position:absolute}.xterm .composition-view.active{display:block}.xterm .xterm-viewport{cursor:default;background-color:#000;position:absolute;inset:0;overflow-y:scroll}.xterm .xterm-screen{position:relative}.xterm .xterm-screen canvas{position:absolute;top:0;left:0}.xterm-char-measure-element{visibility:hidden;line-height:normal;display:inline-block;position:absolute;top:0;left:-9999em}.xterm.enable-mouse-events{cursor:default}.xterm.xterm-cursor-pointer,.xterm .xterm-cursor-pointer{cursor:pointer}.xterm.column-select.focus{cursor:crosshair}.xterm .xterm-accessibility:not(.debug),.xterm .xterm-message{z-index:10;color:#0000;pointer-events:none;position:absolute;inset:0}.xterm .xterm-accessibility-tree:not(.debug) ::selection{color:#0000}.xterm .xterm-accessibility-tree{-webkit-user-select:text;user-select:text;white-space:pre;font-family:monospace}.xterm .xterm-accessibility-tree>div{transform-origin:0;width:fit-content}.xterm .live-region{width:1px;height:1px;position:absolute;left:-9999px;overflow:hidden}.xterm-dim{opacity:1!important}.xterm-underline-1{text-decoration:underline}.xterm-underline-2{-webkit-text-decoration:underline double;text-decoration:underline double}.xterm-underline-3{-webkit-text-decoration:underline wavy;text-decoration:underline wavy}.xterm-underline-4{-webkit-text-decoration:underline dotted;text-decoration:underline dotted}.xterm-underline-5{-webkit-text-decoration:underline dashed;text-decoration:underline dashed}.xterm-overline{text-decoration:overline}.xterm-overline.xterm-underline-1{text-decoration:underline overline}.xterm-overline.xterm-underline-2{-webkit-text-decoration:overline double underline;text-decoration:overline double underline}.xterm-overline.xterm-underline-3{-webkit-text-decoration:overline wavy underline;text-decoration:overline wavy underline}.xterm-overline.xterm-underline-4{-webkit-text-decoration:overline dotted underline;text-decoration:overline dotted underline}.xterm-overline.xterm-underline-5{-webkit-text-decoration:overline dashed underline;text-decoration:overline dashed underline}.xterm-strikethrough{text-decoration:line-through}.xterm-screen .xterm-decoration-container .xterm-decoration{z-index:6;position:absolute}.xterm-screen .xterm-decoration-container .xterm-decoration.xterm-decoration-top-layer{z-index:7}.xterm-decoration-overview-ruler{z-index:8;pointer-events:none;position:absolute;top:0;right:0}.xterm-decoration-top{z-index:2;position:relative}.xterm .xterm-scrollable-element>.scrollbar{cursor:default}.xterm .xterm-scrollable-element>.scrollbar>.scra{cursor:pointer;font-size:11px!important}.xterm .xterm-scrollable-element>.visible{opacity:1;z-index:11;background:0 0;transition:opacity .1s linear}.xterm .xterm-scrollable-element>.invisible{opacity:0;pointer-events:none}.xterm .xterm-scrollable-element>.invisible.fade{transition:opacity .8s linear}.xterm .xterm-scrollable-element>.shadow{display:none;position:absolute}.xterm .xterm-scrollable-element>.shadow.top{width:100%;height:3px;box-shadow:var(--vscode-scrollbar-shadow,#000) 0 6px 6px -6px inset;display:block;top:0;left:3px}.xterm .xterm-scrollable-element>.shadow.left{width:3px;height:100%;box-shadow:var(--vscode-scrollbar-shadow,#000) 6px 0 6px -6px inset;display:block;top:3px;left:0}.xterm .xterm-scrollable-element>.shadow.top-left-corner{width:3px;height:3px;display:block;top:0;left:0}.xterm .xterm-scrollable-element>.shadow.top.left{box-shadow:var(--vscode-scrollbar-shadow,#000) 6px 0 6px -6px inset}.sessions-workbench{background:var(--ant-color-bg-container);flex-direction:column;height:100%;min-height:0;display:flex}.sessions-toolbar{border-bottom:1px solid var(--ant-color-border-secondary);background:var(--ant-color-bg-container);align-items:center;gap:10px;min-height:42px;padding:6px 12px;display:flex}.sessions-toolbar-title{flex:1;align-items:baseline;gap:8px;min-width:0;display:flex}.sessions-toolbar-title strong{white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.sessions-toolbar-title span{color:var(--ant-color-text-tertiary);white-space:nowrap;text-overflow:ellipsis;font-size:12px;overflow:hidden}.sessions-toolbar-actions{gap:4px;display:flex}.sessions-toolbar-error{color:var(--ant-color-error);font-size:12px}.sessions-terminal-wrap{box-sizing:border-box;flex:1;min-height:0;padding:12px;position:relative;overflow:hidden}.sessions-terminal{outline:none;height:100%}.sessions-terminal .xterm{height:100%}.sessions-terminal .xterm-viewport{scrollbar-color:var(--ant-color-border) transparent;scrollbar-width:thin}.sessions-terminal .xterm:focus-within{outline:2px solid var(--ant-color-primary);outline-offset:-2px}.sessions-terminal-message{z-index:1;border:1px solid var(--ant-color-border-secondary);background:var(--ant-color-bg-elevated);max-width:340px;color:var(--ant-color-text-secondary);border-radius:4px;padding:6px 8px;font-size:12px;position:absolute;top:12px;right:12px}.sessions-terminal-state,.sessions-empty{flex:1;place-items:center;min-height:0;padding:24px;display:grid}.sessions-empty{text-align:center;color:var(--ant-color-text-secondary);align-content:center}.sessions-empty h1{color:var(--ant-color-text);margin:0}.sessions-sidebar{flex-direction:column;min-width:0;height:100%;display:flex;overflow:hidden auto}.sessions-sidebar-new{min-width:0;padding:12px 8px 4px}.sessions-sidebar-group{min-width:0;padding:12px 8px 0}.sessions-sidebar-heading{letter-spacing:.06em;text-transform:uppercase;padding:0 8px 6px;font-size:11px;display:block}.sessions-sidebar-item{box-sizing:border-box;width:100%;min-width:0;color:inherit;text-align:left;cursor:pointer;background:0 0;border:0;border-radius:6px;padding:7px 8px}.sessions-sidebar-item:hover,.sessions-sidebar-item.is-selected{background:var(--ant-color-fill-secondary)}.sessions-sidebar-item:focus-visible{outline:2px solid var(--ant-color-primary);outline-offset:-2px}.sessions-sidebar-title{overflow-wrap:anywhere;-webkit-line-clamp:2;-webkit-box-orient:vertical;min-width:0;font-size:13px;line-height:1.35;display:-webkit-box;overflow:hidden}.sessions-sidebar-title-row{align-items:start;gap:6px;display:flex}.sessions-sidebar-purpose{overflow-wrap:anywhere;-webkit-line-clamp:2;-webkit-box-orient:vertical;flex:auto;min-width:0;display:-webkit-box;overflow:hidden}.sessions-sidebar-id{color:var(--ant-color-text-tertiary);font-family:var(--ant-font-family-code);white-space:nowrap;flex:none;font-size:11px;line-height:1.6}.sessions-sidebar-meta{min-width:0;color:var(--ant-color-text-tertiary);flex-wrap:wrap;gap:0 5px;font-size:11px;line-height:1.4;display:flex}.sessions-sidebar-meta>span+span:before{content:"·";margin-right:5px}.sessions-sidebar-state{color:var(--ant-color-text-tertiary);padding:12px 16px;font-size:11px;line-height:1.45}.sessions-new-popover{max-width:calc(100vw - 16px)}.sessions-new-popover .ant-popover-content{box-sizing:border-box;width:min(220px,100vw - 16px);max-width:100%}.sessions-new-menu{flex-direction:column;gap:10px;width:100%;min-width:0;display:flex;overflow-x:hidden}.sessions-new-menu section,.sessions-new-menu .ant-space{min-width:0}.sessions-new-menu section{flex-direction:column;gap:6px;display:flex}.sessions-new-menu .ant-typography{overflow-wrap:anywhere}.sessions-new-menu .ant-btn{white-space:normal;text-align:left;justify-content:flex-start;width:100%;height:auto;min-height:32px;line-height:1.35}.sessions-new-menu .ant-btn>span{overflow-wrap:anywhere;min-width:0}.sessions-workbench.is-compact .sessions-toolbar{gap:6px;padding-inline:8px}.sessions-workbench.is-compact .sessions-toolbar-title span{display:none}.sessions-workbench.is-compact .sessions-terminal-wrap{padding:8px}.sessions-workbench.is-compact .sessions-toolbar-actions .ant-btn{padding-inline:6px}.genbi-page{box-sizing:border-box;width:100%;margin:0 auto;padding:24px 26px 40px}.genbi-page-head{align-items:flex-start;gap:12px;margin-bottom:16px;display:flex}.genbi-page-head-text{flex:1;min-width:0}.genbi-page-title.ant-typography{margin:0!important}.genbi-page-lead{max-width:64ch;color:var(--ant-color-text-tertiary);margin:4px 0 0;font-size:13.5px;line-height:1.5}.genbi-page-actions{flex:none;align-items:center;gap:8px;margin-left:auto;display:flex}.genbi-page-body{flex-direction:column;gap:16px;min-width:0;display:flex}.genbi-artifacts-list{min-width:0;margin:0;padding:8px 0;list-style:none}.genbi-arow{width:100%;min-width:0;font:inherit;color:var(--ant-color-text-secondary);text-align:left;cursor:pointer;border-radius:var(--ant-border-radius-sm);background:0 0;border:0;grid-template-columns:auto minmax(0,1fr);align-items:start;gap:8px;padding:7px 12px;font-size:13px;line-height:1.4;display:grid}.genbi-arow:hover{background:var(--genbi-surface-2)}.genbi-arow:focus-visible{outline:2px solid var(--ant-color-primary);outline-offset:-2px}.genbi-arow.is-sel{background:color-mix(in srgb, var(--ant-color-primary) 12%, transparent);color:var(--ant-color-primary);font-weight:500}.genbi-arow.is-sel .genbi-aicon{color:var(--ant-color-primary)}.genbi-aicon{color:var(--ant-color-text-tertiary);grid-row:1/span 2;align-items:center;margin-top:3px;font-size:14px;display:inline-flex}.genbi-atext{flex-direction:column;gap:2px;min-width:0;display:flex}.genbi-aname{overflow-wrap:anywhere;-webkit-line-clamp:2;-webkit-box-orient:vertical;min-width:0;line-height:1.35;display:-webkit-box;overflow:hidden}.genbi-abadges{flex-wrap:wrap;grid-column:2;align-items:center;gap:4px;min-width:0;display:flex}.genbi-canvas-er{border:1px solid var(--ant-color-border-secondary);border-radius:var(--ant-border-radius);box-shadow:var(--ant-box-shadow-tertiary);background:radial-gradient(circle at 1px 1px, var(--ant-color-border-secondary) 1px, transparent 0) 0 0 / 22px 22px, var(--ant-color-bg-container);position:relative;overflow:auto}.genbi-er-inner{position:relative}.genbi-er-edges{position:absolute;inset:0}.genbi-er-edges path{fill:none;stroke:var(--ant-color-border);stroke-width:1.5px}.genbi-er-edges circle{fill:var(--ant-color-link)}.genbi-er-edges text{fill:var(--ant-color-text-tertiary);font-size:10px}.genbi-er-edges.is-impact path.is-active{stroke:var(--ant-color-primary);stroke-width:2px}.genbi-er-edges.is-impact circle.is-active{fill:var(--ant-color-primary)}.genbi-mnode{background:var(--ant-color-bg-container);border:1px solid var(--ant-color-border);box-shadow:var(--ant-box-shadow-tertiary);font:inherit;text-align:left;color:inherit;border-radius:9px;margin:0;padding:0;position:absolute;overflow:hidden}.genbi-mnode.is-interactive{cursor:pointer}.genbi-mnode.is-interactive:hover{border-color:var(--ant-color-primary)}.genbi-mnode.is-interactive:focus-visible{outline:2px solid var(--ant-color-primary);outline-offset:2px}.genbi-mnode .genbi-mh{background:var(--genbi-surface-2);border-bottom:1px solid var(--ant-color-border-secondary);color:var(--ant-color-text);align-items:center;gap:6px;padding:8px 10px;font-size:12px;font-weight:600;display:flex}.genbi-mnode .genbi-cnt{color:var(--ant-color-text-tertiary);margin-left:auto;font-size:11px;font-weight:400}.genbi-mnode ul{margin:0;padding:0;list-style:none}.genbi-mnode li{font-family:var(--ant-font-family-code);border-top:1px solid var(--ant-color-border-secondary);align-items:center;gap:6px;padding:4px 10px;font-size:11px;display:flex}.genbi-mnode li:first-child{border-top:none}.genbi-mnode .genbi-fn{color:var(--ant-color-text-secondary);text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.genbi-mnode .genbi-ft{color:var(--ant-color-text-tertiary);margin-left:auto}.genbi-mnode .genbi-key{border-radius:4px;flex:none;padding:0 5px;font-size:10px;font-weight:700;line-height:16px}.genbi-mnode .genbi-key-pk{background:color-mix(in srgb, var(--ant-color-primary) 16%, transparent);color:var(--ant-color-primary-active)}.genbi-mnode .genbi-key-fk{background:color-mix(in srgb, var(--ant-color-link) 16%, transparent);color:var(--ant-color-link)}.genbi-mnode.is-selected{outline:2px solid var(--ant-color-primary);outline-offset:1px;box-shadow:0 0 0 4px color-mix(in srgb, var(--ant-color-primary) 16%, transparent)}.genbi-mnode.is-affected{outline:2px solid color-mix(in srgb, var(--ant-color-warning) 72%, transparent);outline-offset:1px}.genbi-mdl-wrap{flex-direction:column;gap:16px;display:flex}.genbi-project-identity{align-items:baseline;gap:10px;font-size:13px;display:flex}.genbi-project-name{color:var(--ant-color-text);font-size:15px;font-weight:600}.genbi-project-path{color:var(--ant-color-text-secondary)}.genbi-project-path code{font-family:var(--ant-font-family-code);font-size:12px}.genbi-project-path-unbound{color:var(--ant-color-text-tertiary);font-style:italic}.genbi-mdl-toolbar{border:1px solid var(--ant-color-border-secondary);border-radius:var(--ant-border-radius);background:var(--ant-color-bg-container);color:var(--ant-color-text-secondary);align-items:center;gap:10px;padding:8px 12px;font-size:13px;display:flex}.genbi-mdl-stat b{color:var(--ant-color-text)}.genbi-mdl-stat-sep{color:var(--ant-color-border)}.genbi-mdl-layout{grid-template-columns:minmax(0,1fr) 296px;align-items:start;gap:16px;display:grid}@media (width<=900px){.genbi-mdl-layout{grid-template-columns:1fr}}.genbi-mdl-side{flex-direction:column;gap:14px;min-width:0;display:flex}.genbi-measure{border-top:1px solid var(--ant-color-border-secondary);align-items:flex-start;gap:8px;padding:8px 0;display:flex}.genbi-measure:first-child{border-top:none;padding-top:0}.genbi-mtxt{flex:1;min-width:0}.genbi-mname{color:var(--ant-color-text);font-size:13px;font-weight:600}.genbi-mexpr{font-family:var(--ant-font-family-code);color:var(--ant-color-text-tertiary);text-overflow:ellipsis;white-space:nowrap;margin-top:2px;font-size:11px;overflow:hidden}.genbi-measure-actions{flex-direction:column;flex:none;align-items:flex-end;gap:2px;display:flex}.genbi-relrow{border-top:1px solid var(--ant-color-border-secondary);justify-content:space-between;align-items:center;gap:8px;padding:6px 0;font-size:12px;display:flex}.genbi-relrow:first-child{border-top:none;padding-top:0}.genbi-relname{text-overflow:ellipsis;white-space:nowrap;min-width:0;overflow:hidden}.genbi-kstat{gap:20px;display:flex}.genbi-kstat-item .genbi-num{color:var(--ant-color-text);font-size:22px;font-weight:700;line-height:1.2}.genbi-kstat-item .genbi-lbl{color:var(--ant-color-text-tertiary);font-size:11px}.genbi-num-muted{color:var(--ant-color-text-tertiary);font-size:13px;font-style:italic;font-weight:400}.genbi-outscope{flex-direction:column;gap:8px;display:flex}.genbi-filetree{min-width:0;padding:10px 0}.genbi-rail-proj{border-bottom:1px solid var(--ant-color-border-secondary);min-width:0;color:var(--ant-color-text);align-items:center;gap:8px;margin-bottom:4px;padding:2px 12px 10px;font-size:13px;font-weight:600;display:flex}.genbi-rail-proj .genbi-tname{text-overflow:ellipsis;white-space:nowrap;flex:1;min-width:0;overflow:hidden}.genbi-ttree,.genbi-tchildren{min-width:0;margin:0;padding:0;list-style:none}.genbi-trow{width:100%;min-width:0;font:inherit;color:var(--ant-color-text-secondary);text-align:left;cursor:pointer;border-radius:var(--ant-border-radius-sm);background:0 0;border:0;align-items:center;gap:7px;padding:5px 12px;font-size:13px;line-height:1.4;display:flex}.genbi-trow:hover{background:var(--genbi-surface-2)}.genbi-trow:focus-visible{outline:2px solid var(--ant-color-primary);outline-offset:-2px}.genbi-tdirhdr{color:var(--ant-color-text);font-weight:500}.genbi-tfile.is-sel{background:color-mix(in srgb, var(--ant-color-primary) 12%, transparent);color:var(--ant-color-primary);font-weight:500}.genbi-tfile.is-sel .genbi-fi{color:var(--ant-color-primary)}.genbi-chev{color:var(--ant-color-text-tertiary);flex:none;align-items:center;font-size:10px;transition:transform .15s;display:inline-flex}.genbi-chev.is-open{transform:rotate(90deg)}.genbi-fi{color:var(--ant-color-text-tertiary);flex:none;align-items:center;font-size:14px;display:inline-flex}.genbi-tname{text-overflow:ellipsis;white-space:nowrap;flex:1;min-width:0;overflow:hidden}.harness-execution-path{grid-template-columns:repeat(auto-fit,minmax(150px,1fr));gap:12px;margin-bottom:8px;display:grid}.harness-execution-path>div{flex-direction:column;gap:2px;min-width:0;display:flex}.harness-execution-path strong{overflow-wrap:anywhere}.harness-diagnostic-grid{grid-template-columns:repeat(2,minmax(0,1fr));gap:24px;display:grid}@media (width<=640px){.harness-execution-path,.harness-diagnostic-grid{grid-template-columns:1fr;gap:8px}}html,body,#root{height:100%;margin:0}body{font-family:var(--ant-font-family);overflow:hidden}.ant-tag{border-radius:999px}.ant-table-thead>tr>th{text-transform:uppercase;letter-spacing:.04em;font-size:11px;font-weight:600}
|
package/dist/index.html
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
<!doctype html>
|
|
2
|
+
<html lang="en">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="UTF-8" />
|
|
5
|
+
<link rel="icon" type="image/png" href="/wrenai_logo.png" />
|
|
6
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
7
|
+
<title>GenBI</title>
|
|
8
|
+
<script type="module" crossorigin src="/assets/index-Bo--QMUN.js"></script>
|
|
9
|
+
<link rel="stylesheet" crossorigin href="/assets/index-Xs4q7pNo.css">
|
|
10
|
+
</head>
|
|
11
|
+
<body>
|
|
12
|
+
<div id="root"></div>
|
|
13
|
+
</body>
|
|
14
|
+
</html>
|
|
Binary file
|
|
Binary file
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { LoginProbe } from "./probe.js";
|
|
2
|
+
import type { AuthChoice, AuthOption } from "./types.js";
|
|
3
|
+
/**
|
|
4
|
+
* Enumerate the credential options available right now. A `subscription`
|
|
5
|
+
* entry for a given provider only appears when `probe` reports that
|
|
6
|
+
* provider's CLI as detected and logged in; `api-key`, `local`, and
|
|
7
|
+
* `gateway` are always offered. This only reports availability — it does
|
|
8
|
+
* not route requests through any option and does not apply any
|
|
9
|
+
* compliance/policy judgment on top of the raw signal (later milestones).
|
|
10
|
+
*/
|
|
11
|
+
export declare function detectAndPick(probe: LoginProbe): Promise<AuthOption[]>;
|
|
12
|
+
/**
|
|
13
|
+
* Turn a selected `AuthOption` into an `AuthChoice`. `api-key`/`gateway`
|
|
14
|
+
* fields beyond `mode` are left as minimal placeholders — the routing layer
|
|
15
|
+
* (a later milestone) is responsible for filling in the concrete
|
|
16
|
+
* adapter/config.
|
|
17
|
+
*/
|
|
18
|
+
export declare function toAuthChoice(option: AuthOption): AuthChoice;
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Enumerate the credential options available right now. A `subscription`
|
|
3
|
+
* entry for a given provider only appears when `probe` reports that
|
|
4
|
+
* provider's CLI as detected and logged in; `api-key`, `local`, and
|
|
5
|
+
* `gateway` are always offered. This only reports availability — it does
|
|
6
|
+
* not route requests through any option and does not apply any
|
|
7
|
+
* compliance/policy judgment on top of the raw signal (later milestones).
|
|
8
|
+
*/
|
|
9
|
+
export async function detectAndPick(probe) {
|
|
10
|
+
const options = [];
|
|
11
|
+
if (await probe.claudeLoggedIn()) {
|
|
12
|
+
options.push({ mode: "subscription", provider: "claude" });
|
|
13
|
+
}
|
|
14
|
+
if (await probe.codexLoggedIn()) {
|
|
15
|
+
options.push({ mode: "subscription", provider: "codex" });
|
|
16
|
+
}
|
|
17
|
+
options.push({ mode: "api-key" }, { mode: "local" }, { mode: "gateway" });
|
|
18
|
+
return options;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Turn a selected `AuthOption` into an `AuthChoice`. `api-key`/`gateway`
|
|
22
|
+
* fields beyond `mode` are left as minimal placeholders — the routing layer
|
|
23
|
+
* (a later milestone) is responsible for filling in the concrete
|
|
24
|
+
* adapter/config.
|
|
25
|
+
*/
|
|
26
|
+
export function toAuthChoice(option) {
|
|
27
|
+
switch (option.mode) {
|
|
28
|
+
case "subscription":
|
|
29
|
+
return { mode: "subscription", provider: option.provider };
|
|
30
|
+
case "api-key":
|
|
31
|
+
return { mode: "api-key", adapter: "" };
|
|
32
|
+
case "local":
|
|
33
|
+
return { mode: "local" };
|
|
34
|
+
case "gateway":
|
|
35
|
+
return { mode: "gateway" };
|
|
36
|
+
}
|
|
37
|
+
}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export type { ApiKeyAuthChoice, AuthChoice, AuthOption, GatewayAuthChoice, LocalAuthChoice, SubscriptionAuthChoice, } from "./types.js";
|
|
2
|
+
export { createDefaultLoginProbe } from "./probe.js";
|
|
3
|
+
export type { LoginProbe } from "./probe.js";
|
|
4
|
+
export { detectAndPick, toAuthChoice } from "./detect.js";
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Injectable "is this CLI usable right now" check for `detectAndPick`. Kept
|
|
3
|
+
* as an interface — rather than baked directly into `detectAndPick` — so
|
|
4
|
+
* tests can inject a mock and stay fully offline, never touching `PATH` or
|
|
5
|
+
* the filesystem.
|
|
6
|
+
*/
|
|
7
|
+
export interface LoginProbe {
|
|
8
|
+
claudeLoggedIn(): boolean | Promise<boolean>;
|
|
9
|
+
codexLoggedIn(): boolean | Promise<boolean>;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Real default `LoginProbe`. Best-effort and side-effect-light: it only
|
|
13
|
+
* resolves the CLI binary on `PATH` and checks whether a credential/config
|
|
14
|
+
* file exists next to it — it never invokes `claude`/`codex` and never
|
|
15
|
+
* makes a network call. Production callers use this; tests should inject a
|
|
16
|
+
* mock `LoginProbe` instead.
|
|
17
|
+
*/
|
|
18
|
+
export declare function createDefaultLoginProbe(): LoginProbe;
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { accessSync, constants as fsConstants, existsSync } from "node:fs";
|
|
2
|
+
import { homedir } from "node:os";
|
|
3
|
+
import { delimiter, join } from "node:path";
|
|
4
|
+
const WINDOWS_EXECUTABLE_EXTENSIONS = [".exe", ".cmd", ".bat"];
|
|
5
|
+
/** Best-effort, side-effect-light check that `binaryName` resolves on `PATH`. Never invokes the binary. */
|
|
6
|
+
function resolvesOnPath(binaryName) {
|
|
7
|
+
const pathEnv = process.env.PATH ?? "";
|
|
8
|
+
const candidateNames = process.platform === "win32"
|
|
9
|
+
? [binaryName, ...WINDOWS_EXECUTABLE_EXTENSIONS.map((ext) => `${binaryName}${ext}`)]
|
|
10
|
+
: [binaryName];
|
|
11
|
+
for (const dir of pathEnv.split(delimiter)) {
|
|
12
|
+
if (!dir)
|
|
13
|
+
continue;
|
|
14
|
+
for (const name of candidateNames) {
|
|
15
|
+
try {
|
|
16
|
+
accessSync(join(dir, name), fsConstants.X_OK);
|
|
17
|
+
return true;
|
|
18
|
+
}
|
|
19
|
+
catch {
|
|
20
|
+
// not in this directory — keep looking
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
return false;
|
|
25
|
+
}
|
|
26
|
+
/** Cheap "has this CLI ever logged in" signal: does its credential/config file exist? Never reads its contents. */
|
|
27
|
+
function hasCredentialFile(relativePathFromHome) {
|
|
28
|
+
return existsSync(join(homedir(), relativePathFromHome));
|
|
29
|
+
}
|
|
30
|
+
/** Existence-only Codex login signal, honoring an explicitly isolated CODEX_HOME. */
|
|
31
|
+
function hasCodexCredentialFile() {
|
|
32
|
+
const configuredHome = process.env.CODEX_HOME?.trim();
|
|
33
|
+
const codexHome = configuredHome ? configuredHome : join(homedir(), ".codex");
|
|
34
|
+
return existsSync(join(codexHome, "auth.json"));
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Real default `LoginProbe`. Best-effort and side-effect-light: it only
|
|
38
|
+
* resolves the CLI binary on `PATH` and checks whether a credential/config
|
|
39
|
+
* file exists next to it — it never invokes `claude`/`codex` and never
|
|
40
|
+
* makes a network call. Production callers use this; tests should inject a
|
|
41
|
+
* mock `LoginProbe` instead.
|
|
42
|
+
*/
|
|
43
|
+
export function createDefaultLoginProbe() {
|
|
44
|
+
return {
|
|
45
|
+
claudeLoggedIn() {
|
|
46
|
+
return resolvesOnPath("claude") && hasCredentialFile(".claude.json");
|
|
47
|
+
},
|
|
48
|
+
codexLoggedIn() {
|
|
49
|
+
return resolvesOnPath("codex") && hasCodexCredentialFile();
|
|
50
|
+
},
|
|
51
|
+
};
|
|
52
|
+
}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The four credential modes an operator can pick between when a harness
|
|
3
|
+
* needs to talk to a model provider. This module only *models* the choice
|
|
4
|
+
* and enumerates which options are available (offline, from an injected
|
|
5
|
+
* `LoginProbe`) — it does not route requests through any of them (that's a
|
|
6
|
+
* later milestone) and does not apply any compliance/policy judgment on top
|
|
7
|
+
* of the raw availability signal.
|
|
8
|
+
*/
|
|
9
|
+
/** Reuse an existing CLI subscription session (e.g. an already-`claude login`'d shell). */
|
|
10
|
+
export interface SubscriptionAuthChoice {
|
|
11
|
+
readonly mode: "subscription";
|
|
12
|
+
readonly provider: "claude" | "codex";
|
|
13
|
+
}
|
|
14
|
+
/** Call a provider directly with an API key. Adapter/config shape is filled in by routing (later milestone). */
|
|
15
|
+
export interface ApiKeyAuthChoice {
|
|
16
|
+
readonly mode: "api-key";
|
|
17
|
+
readonly adapter: string;
|
|
18
|
+
readonly config?: Readonly<Record<string, unknown>>;
|
|
19
|
+
}
|
|
20
|
+
/** Talk to a model served on the local machine/network (e.g. Ollama). */
|
|
21
|
+
export interface LocalAuthChoice {
|
|
22
|
+
readonly mode: "local";
|
|
23
|
+
readonly endpoint?: string;
|
|
24
|
+
}
|
|
25
|
+
/** Route through an operator-managed gateway. Config shape is filled in by routing (later milestone). */
|
|
26
|
+
export interface GatewayAuthChoice {
|
|
27
|
+
readonly mode: "gateway";
|
|
28
|
+
readonly config?: Readonly<Record<string, unknown>>;
|
|
29
|
+
}
|
|
30
|
+
/** The full set of credential choices as an explicit, exhaustive union. */
|
|
31
|
+
export type AuthChoice = SubscriptionAuthChoice | ApiKeyAuthChoice | LocalAuthChoice | GatewayAuthChoice;
|
|
32
|
+
/** One entry in the menu `detectAndPick` enumerates: a mode plus whatever's needed to build its `AuthChoice`. */
|
|
33
|
+
export type AuthOption = {
|
|
34
|
+
readonly mode: "subscription";
|
|
35
|
+
readonly provider: "claude" | "codex";
|
|
36
|
+
} | {
|
|
37
|
+
readonly mode: "api-key";
|
|
38
|
+
} | {
|
|
39
|
+
readonly mode: "local";
|
|
40
|
+
} | {
|
|
41
|
+
readonly mode: "gateway";
|
|
42
|
+
};
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The four credential modes an operator can pick between when a harness
|
|
3
|
+
* needs to talk to a model provider. This module only *models* the choice
|
|
4
|
+
* and enumerates which options are available (offline, from an injected
|
|
5
|
+
* `LoginProbe`) — it does not route requests through any of them (that's a
|
|
6
|
+
* later milestone) and does not apply any compliance/policy judgment on top
|
|
7
|
+
* of the raw availability signal.
|
|
8
|
+
*/
|
|
9
|
+
export {};
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { type Bundle } from "./schema.js";
|
|
2
|
+
import { type HarnessSupport } from "./version.js";
|
|
3
|
+
export declare class BundleValidationError extends Error {
|
|
4
|
+
constructor(message: string);
|
|
5
|
+
}
|
|
6
|
+
export declare function loadBundle(json: unknown, support?: HarnessSupport): Bundle;
|
|
7
|
+
/**
|
|
8
|
+
* Which on-disk checkout actually produced (or would consume) a bundle — the piece a bare
|
|
9
|
+
* {@link BundleCompatError} is missing. `resolveWarbleBinary` (`harness/compile/resolve-binary.ts`)
|
|
10
|
+
* and `resolveDefaultProfileSource`/`resolveDefaultSetupIrPath` (`harness/route/profile-source.ts`)
|
|
11
|
+
* each walk this package's ancestor directories independently looking for a sibling `warble`
|
|
12
|
+
* checkout; nothing stops them from picking two DIFFERENT ones (a stale `warble` earlier on `PATH`
|
|
13
|
+
* while the profile/IR sibling-walk still finds a fresh checkout, or vice versa), and when that
|
|
14
|
+
* happens the resulting version mismatch is real IR-version friction, not a bug in the mismatch
|
|
15
|
+
* detection itself — but the bare error names neither side's checkout, so diagnosing it means
|
|
16
|
+
* reading `resolve-binary.ts`/`profile-source.ts` source to even know there's an ancestor walk to
|
|
17
|
+
* suspect. See {@link loadBundleWithProvenance}.
|
|
18
|
+
*/
|
|
19
|
+
export interface BundleProvenance {
|
|
20
|
+
/** The resolved `warble` binary path that compiled/dispatched this bundle, if known. */
|
|
21
|
+
readonly warbleBin?: string;
|
|
22
|
+
/** The resolved profile directory or pre-committed IR file this bundle was produced from, if known. */
|
|
23
|
+
readonly profileSource?: string;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* {@link loadBundle}, but on a {@link BundleCompatError} names which on-disk checkout(s) produced
|
|
27
|
+
* the bundle before rethrowing — the fix for the "which warble checkout did this even come from"
|
|
28
|
+
* gap described on {@link BundleProvenance}. Every other error (malformed structure, unknown bundle
|
|
29
|
+
* format version) passes through unchanged: provenance only helps once you already know it's a
|
|
30
|
+
* version problem.
|
|
31
|
+
*/
|
|
32
|
+
export declare function loadBundleWithProvenance(json: unknown, provenance: BundleProvenance, support?: HarnessSupport): Bundle;
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { bundleSchema } from "./schema.js";
|
|
2
|
+
import { assertCompat, BundleCompatError } from "./version.js";
|
|
3
|
+
export class BundleValidationError extends Error {
|
|
4
|
+
constructor(message) {
|
|
5
|
+
super(message);
|
|
6
|
+
this.name = "BundleValidationError";
|
|
7
|
+
}
|
|
8
|
+
}
|
|
9
|
+
export function loadBundle(json, support) {
|
|
10
|
+
const result = bundleSchema.safeParse(json);
|
|
11
|
+
if (!result.success) {
|
|
12
|
+
const issues = result.error.issues
|
|
13
|
+
.map((issue) => ` - ${issue.path.join(".") || "<root>"}: ${issue.message}`)
|
|
14
|
+
.join("\n");
|
|
15
|
+
throw new BundleValidationError(`invalid bundle structure:\n${issues}`);
|
|
16
|
+
}
|
|
17
|
+
assertCompat(result.data, support);
|
|
18
|
+
return result.data;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* {@link loadBundle}, but on a {@link BundleCompatError} names which on-disk checkout(s) produced
|
|
22
|
+
* the bundle before rethrowing — the fix for the "which warble checkout did this even come from"
|
|
23
|
+
* gap described on {@link BundleProvenance}. Every other error (malformed structure, unknown bundle
|
|
24
|
+
* format version) passes through unchanged: provenance only helps once you already know it's a
|
|
25
|
+
* version problem.
|
|
26
|
+
*/
|
|
27
|
+
export function loadBundleWithProvenance(json, provenance, support) {
|
|
28
|
+
try {
|
|
29
|
+
return loadBundle(json, support);
|
|
30
|
+
}
|
|
31
|
+
catch (error) {
|
|
32
|
+
if (error instanceof BundleCompatError) {
|
|
33
|
+
const resolved = [
|
|
34
|
+
provenance.warbleBin !== undefined ? `warble binary resolved from "${provenance.warbleBin}"` : undefined,
|
|
35
|
+
provenance.profileSource !== undefined ? `profile/IR source resolved from "${provenance.profileSource}"` : undefined,
|
|
36
|
+
].filter((part) => part !== undefined);
|
|
37
|
+
if (resolved.length > 0) {
|
|
38
|
+
throw new BundleCompatError(`${error.message} (${resolved.join("; ")})`);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
throw error;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
@@ -0,0 +1,199 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
declare const stepRealizationSchema: z.ZodObject<{
|
|
3
|
+
kind: z.ZodEnum<{
|
|
4
|
+
independent: "independent";
|
|
5
|
+
repair_fold: "repair_fold";
|
|
6
|
+
}>;
|
|
7
|
+
fold_into: z.ZodOptional<z.ZodString>;
|
|
8
|
+
max_attempts: z.ZodOptional<z.ZodNumber>;
|
|
9
|
+
}, z.core.$strip>;
|
|
10
|
+
declare const stepGuardSchema: z.ZodObject<{
|
|
11
|
+
guard: z.ZodString;
|
|
12
|
+
target: z.ZodString;
|
|
13
|
+
}, z.core.$strip>;
|
|
14
|
+
declare const stepSchema: z.ZodObject<{
|
|
15
|
+
name: z.ZodString;
|
|
16
|
+
tier: z.ZodString;
|
|
17
|
+
consumes: z.ZodArray<z.ZodString>;
|
|
18
|
+
produces: z.ZodString;
|
|
19
|
+
prompt: z.ZodString;
|
|
20
|
+
realization: z.ZodObject<{
|
|
21
|
+
kind: z.ZodEnum<{
|
|
22
|
+
independent: "independent";
|
|
23
|
+
repair_fold: "repair_fold";
|
|
24
|
+
}>;
|
|
25
|
+
fold_into: z.ZodOptional<z.ZodString>;
|
|
26
|
+
max_attempts: z.ZodOptional<z.ZodNumber>;
|
|
27
|
+
}, z.core.$strip>;
|
|
28
|
+
when: z.ZodOptional<z.ZodObject<{
|
|
29
|
+
guard: z.ZodString;
|
|
30
|
+
target: z.ZodString;
|
|
31
|
+
}, z.core.$strip>>;
|
|
32
|
+
}, z.core.$strip>;
|
|
33
|
+
declare const guardrailSchema: z.ZodObject<{
|
|
34
|
+
enforcement: z.ZodString;
|
|
35
|
+
locked: z.ZodBoolean;
|
|
36
|
+
threshold: z.ZodOptional<z.ZodNumber>;
|
|
37
|
+
scope: z.ZodOptional<z.ZodString>;
|
|
38
|
+
}, z.core.$strip>;
|
|
39
|
+
declare const toolSchema: z.ZodObject<{
|
|
40
|
+
name: z.ZodString;
|
|
41
|
+
source: z.ZodString;
|
|
42
|
+
}, z.core.$strip>;
|
|
43
|
+
declare const capabilitySchema: z.ZodObject<{
|
|
44
|
+
capability: z.ZodString;
|
|
45
|
+
outcome: z.ZodString;
|
|
46
|
+
provided_by: z.ZodString;
|
|
47
|
+
criticality: z.ZodString;
|
|
48
|
+
}, z.core.$strip>;
|
|
49
|
+
declare const outputSchemaSchema: z.ZodRecord<z.ZodString, z.ZodUnknown>;
|
|
50
|
+
declare const agentSchema: z.ZodUnion<readonly [z.ZodObject<{
|
|
51
|
+
id: z.ZodString;
|
|
52
|
+
verb: z.ZodString;
|
|
53
|
+
component_type: z.ZodString;
|
|
54
|
+
realization_kind: z.ZodString;
|
|
55
|
+
trigger: z.ZodString;
|
|
56
|
+
outcome: z.ZodString;
|
|
57
|
+
steps: z.ZodArray<z.ZodObject<{
|
|
58
|
+
name: z.ZodString;
|
|
59
|
+
tier: z.ZodString;
|
|
60
|
+
consumes: z.ZodArray<z.ZodString>;
|
|
61
|
+
produces: z.ZodString;
|
|
62
|
+
prompt: z.ZodString;
|
|
63
|
+
realization: z.ZodObject<{
|
|
64
|
+
kind: z.ZodEnum<{
|
|
65
|
+
independent: "independent";
|
|
66
|
+
repair_fold: "repair_fold";
|
|
67
|
+
}>;
|
|
68
|
+
fold_into: z.ZodOptional<z.ZodString>;
|
|
69
|
+
max_attempts: z.ZodOptional<z.ZodNumber>;
|
|
70
|
+
}, z.core.$strip>;
|
|
71
|
+
when: z.ZodOptional<z.ZodObject<{
|
|
72
|
+
guard: z.ZodString;
|
|
73
|
+
target: z.ZodString;
|
|
74
|
+
}, z.core.$strip>>;
|
|
75
|
+
}, z.core.$strip>>;
|
|
76
|
+
guardrails: z.ZodRecord<z.ZodString, z.ZodObject<{
|
|
77
|
+
enforcement: z.ZodString;
|
|
78
|
+
locked: z.ZodBoolean;
|
|
79
|
+
threshold: z.ZodOptional<z.ZodNumber>;
|
|
80
|
+
scope: z.ZodOptional<z.ZodString>;
|
|
81
|
+
}, z.core.$strip>>;
|
|
82
|
+
tools: z.ZodArray<z.ZodObject<{
|
|
83
|
+
name: z.ZodString;
|
|
84
|
+
source: z.ZodString;
|
|
85
|
+
}, z.core.$strip>>;
|
|
86
|
+
output_schema: z.ZodRecord<z.ZodString, z.ZodUnknown>;
|
|
87
|
+
capabilities: z.ZodArray<z.ZodObject<{
|
|
88
|
+
capability: z.ZodString;
|
|
89
|
+
outcome: z.ZodString;
|
|
90
|
+
provided_by: z.ZodString;
|
|
91
|
+
criticality: z.ZodString;
|
|
92
|
+
}, z.core.$strip>>;
|
|
93
|
+
}, z.core.$strict>, z.ZodObject<{
|
|
94
|
+
id: z.ZodString;
|
|
95
|
+
verb: z.ZodString;
|
|
96
|
+
component_type: z.ZodString;
|
|
97
|
+
realization_kind: z.ZodString;
|
|
98
|
+
trigger: z.ZodString;
|
|
99
|
+
outcome: z.ZodString;
|
|
100
|
+
steps: z.ZodTuple<[], null>;
|
|
101
|
+
guardrails: z.ZodObject<{}, z.core.$strict>;
|
|
102
|
+
tools: z.ZodTuple<[], null>;
|
|
103
|
+
output_schema: z.ZodObject<{}, z.core.$strict>;
|
|
104
|
+
capabilities: z.ZodTuple<[], null>;
|
|
105
|
+
availability: z.ZodObject<{
|
|
106
|
+
status: z.ZodLiteral<"unavailable">;
|
|
107
|
+
reason: z.ZodLiteral<"component is unavailable on the configured runtime">;
|
|
108
|
+
}, z.core.$strict>;
|
|
109
|
+
}, z.core.$strict>]>;
|
|
110
|
+
export declare const bundleSchema: z.ZodObject<{
|
|
111
|
+
vercel_bundle_version: z.ZodOptional<z.ZodString>;
|
|
112
|
+
manifest_version: z.ZodOptional<z.ZodString>;
|
|
113
|
+
compat: z.ZodObject<{
|
|
114
|
+
min_ir_version: z.ZodString;
|
|
115
|
+
max_ir_version: z.ZodString;
|
|
116
|
+
}, z.core.$strip>;
|
|
117
|
+
profile: z.ZodString;
|
|
118
|
+
target: z.ZodString;
|
|
119
|
+
agents: z.ZodArray<z.ZodUnion<readonly [z.ZodObject<{
|
|
120
|
+
id: z.ZodString;
|
|
121
|
+
verb: z.ZodString;
|
|
122
|
+
component_type: z.ZodString;
|
|
123
|
+
realization_kind: z.ZodString;
|
|
124
|
+
trigger: z.ZodString;
|
|
125
|
+
outcome: z.ZodString;
|
|
126
|
+
steps: z.ZodArray<z.ZodObject<{
|
|
127
|
+
name: z.ZodString;
|
|
128
|
+
tier: z.ZodString;
|
|
129
|
+
consumes: z.ZodArray<z.ZodString>;
|
|
130
|
+
produces: z.ZodString;
|
|
131
|
+
prompt: z.ZodString;
|
|
132
|
+
realization: z.ZodObject<{
|
|
133
|
+
kind: z.ZodEnum<{
|
|
134
|
+
independent: "independent";
|
|
135
|
+
repair_fold: "repair_fold";
|
|
136
|
+
}>;
|
|
137
|
+
fold_into: z.ZodOptional<z.ZodString>;
|
|
138
|
+
max_attempts: z.ZodOptional<z.ZodNumber>;
|
|
139
|
+
}, z.core.$strip>;
|
|
140
|
+
when: z.ZodOptional<z.ZodObject<{
|
|
141
|
+
guard: z.ZodString;
|
|
142
|
+
target: z.ZodString;
|
|
143
|
+
}, z.core.$strip>>;
|
|
144
|
+
}, z.core.$strip>>;
|
|
145
|
+
guardrails: z.ZodRecord<z.ZodString, z.ZodObject<{
|
|
146
|
+
enforcement: z.ZodString;
|
|
147
|
+
locked: z.ZodBoolean;
|
|
148
|
+
threshold: z.ZodOptional<z.ZodNumber>;
|
|
149
|
+
scope: z.ZodOptional<z.ZodString>;
|
|
150
|
+
}, z.core.$strip>>;
|
|
151
|
+
tools: z.ZodArray<z.ZodObject<{
|
|
152
|
+
name: z.ZodString;
|
|
153
|
+
source: z.ZodString;
|
|
154
|
+
}, z.core.$strip>>;
|
|
155
|
+
output_schema: z.ZodRecord<z.ZodString, z.ZodUnknown>;
|
|
156
|
+
capabilities: z.ZodArray<z.ZodObject<{
|
|
157
|
+
capability: z.ZodString;
|
|
158
|
+
outcome: z.ZodString;
|
|
159
|
+
provided_by: z.ZodString;
|
|
160
|
+
criticality: z.ZodString;
|
|
161
|
+
}, z.core.$strip>>;
|
|
162
|
+
}, z.core.$strict>, z.ZodObject<{
|
|
163
|
+
id: z.ZodString;
|
|
164
|
+
verb: z.ZodString;
|
|
165
|
+
component_type: z.ZodString;
|
|
166
|
+
realization_kind: z.ZodString;
|
|
167
|
+
trigger: z.ZodString;
|
|
168
|
+
outcome: z.ZodString;
|
|
169
|
+
steps: z.ZodTuple<[], null>;
|
|
170
|
+
guardrails: z.ZodObject<{}, z.core.$strict>;
|
|
171
|
+
tools: z.ZodTuple<[], null>;
|
|
172
|
+
output_schema: z.ZodObject<{}, z.core.$strict>;
|
|
173
|
+
capabilities: z.ZodTuple<[], null>;
|
|
174
|
+
availability: z.ZodObject<{
|
|
175
|
+
status: z.ZodLiteral<"unavailable">;
|
|
176
|
+
reason: z.ZodLiteral<"component is unavailable on the configured runtime">;
|
|
177
|
+
}, z.core.$strict>;
|
|
178
|
+
}, z.core.$strict>]>>;
|
|
179
|
+
}, z.core.$strip>;
|
|
180
|
+
export type StepRealization = z.infer<typeof stepRealizationSchema>;
|
|
181
|
+
export type StepGuard = z.infer<typeof stepGuardSchema>;
|
|
182
|
+
export type Step = z.infer<typeof stepSchema>;
|
|
183
|
+
export type Guardrail = z.infer<typeof guardrailSchema>;
|
|
184
|
+
export type Tool = z.infer<typeof toolSchema>;
|
|
185
|
+
export type Capability = z.infer<typeof capabilitySchema>;
|
|
186
|
+
export type OutputSchema = z.infer<typeof outputSchemaSchema>;
|
|
187
|
+
export type Agent = z.infer<typeof agentSchema>;
|
|
188
|
+
export type Bundle = z.infer<typeof bundleSchema>;
|
|
189
|
+
/**
|
|
190
|
+
* A loaded bundle's format-version, regardless of which top-level key it
|
|
191
|
+
* arrived under (see `bundleSchema`'s doc comment) — the accessor `server/harness.ts`'s
|
|
192
|
+
* `HarnessProfile.bundleVersion` (and any other "what version is this bundle"
|
|
193
|
+
* caller) should use instead of reading either field name directly. Never
|
|
194
|
+
* throws in practice: `bundleSchema`'s `.refine` already guarantees at least
|
|
195
|
+
* one of the two fields is present on any `Bundle` that made it through
|
|
196
|
+
* `loadBundle`.
|
|
197
|
+
*/
|
|
198
|
+
export declare function bundleFormatVersion(bundle: Bundle): string;
|
|
199
|
+
export {};
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
const stepRealizationSchema = z.object({
|
|
3
|
+
kind: z.enum(["independent", "repair_fold"]),
|
|
4
|
+
fold_into: z.string().optional(),
|
|
5
|
+
max_attempts: z.number().int().nonnegative().optional(),
|
|
6
|
+
});
|
|
7
|
+
const stepGuardSchema = z.object({
|
|
8
|
+
guard: z.string(),
|
|
9
|
+
target: z.string(),
|
|
10
|
+
});
|
|
11
|
+
const stepSchema = z.object({
|
|
12
|
+
name: z.string(),
|
|
13
|
+
tier: z.string(),
|
|
14
|
+
consumes: z.array(z.string()),
|
|
15
|
+
produces: z.string(),
|
|
16
|
+
prompt: z.string(),
|
|
17
|
+
realization: stepRealizationSchema,
|
|
18
|
+
when: stepGuardSchema.optional(),
|
|
19
|
+
});
|
|
20
|
+
const guardrailSchema = z.object({
|
|
21
|
+
enforcement: z.string(),
|
|
22
|
+
locked: z.boolean(),
|
|
23
|
+
threshold: z.number().optional(),
|
|
24
|
+
scope: z.string().optional(),
|
|
25
|
+
});
|
|
26
|
+
const toolSchema = z.object({
|
|
27
|
+
name: z.string(),
|
|
28
|
+
source: z.string(),
|
|
29
|
+
});
|
|
30
|
+
const capabilitySchema = z.object({
|
|
31
|
+
capability: z.string(),
|
|
32
|
+
outcome: z.string(),
|
|
33
|
+
provided_by: z.string(),
|
|
34
|
+
criticality: z.string(),
|
|
35
|
+
});
|
|
36
|
+
// output_schema is a nested JSON Schema document. The harness stores it as-is
|
|
37
|
+
// and does not interpret it until a later milestone validates output against it.
|
|
38
|
+
const outputSchemaSchema = z.record(z.string(), z.unknown());
|
|
39
|
+
// Keep these variants strict. In particular, an available component must not
|
|
40
|
+
// silently discard an `availability` marker: doing so would turn a redacted
|
|
41
|
+
// unavailable declaration into an executable-looking component downstream.
|
|
42
|
+
//
|
|
43
|
+
// Strictness has a cost worth naming, because it has already been paid once.
|
|
44
|
+
// IR 0.5 added an optional component-level `brief`, and no key for it is
|
|
45
|
+
// declared below. Warble omits the field entirely while no profile sets one, so
|
|
46
|
+
// nothing fails today — but the first time a profile author writes `brief:` on a
|
|
47
|
+
// component, the next dispatch emits that key, `loadBundle` rejects the bundle,
|
|
48
|
+
// and `GET /api/harness` starts returning 500 for a reason that has nothing to
|
|
49
|
+
// do with the annotation someone just added. That is a deliberate deferral, not
|
|
50
|
+
// an oversight: adding a key for a field nothing populates would be guessing at
|
|
51
|
+
// its shape. Declare it here when a profile first needs it.
|
|
52
|
+
const availableAgentSchema = z.object({
|
|
53
|
+
id: z.string(),
|
|
54
|
+
verb: z.string(),
|
|
55
|
+
component_type: z.string(),
|
|
56
|
+
realization_kind: z.string(),
|
|
57
|
+
trigger: z.string(),
|
|
58
|
+
outcome: z.string(),
|
|
59
|
+
steps: z.array(stepSchema),
|
|
60
|
+
guardrails: z.record(z.string(), guardrailSchema),
|
|
61
|
+
tools: z.array(toolSchema),
|
|
62
|
+
output_schema: outputSchemaSchema,
|
|
63
|
+
capabilities: z.array(capabilitySchema),
|
|
64
|
+
}).strict();
|
|
65
|
+
/** Read-only manifest variant for a declared component this target cannot execute. */
|
|
66
|
+
const unavailableAgentSchema = z.object({
|
|
67
|
+
id: z.string(),
|
|
68
|
+
verb: z.string(),
|
|
69
|
+
component_type: z.string(),
|
|
70
|
+
realization_kind: z.string(),
|
|
71
|
+
trigger: z.string(),
|
|
72
|
+
outcome: z.string(),
|
|
73
|
+
// Fixed empty executable surfaces: display may name the declaration, never
|
|
74
|
+
// carry an executable step, tool, capability, guardrail, or output contract.
|
|
75
|
+
steps: z.tuple([]),
|
|
76
|
+
guardrails: z.object({}).strict(),
|
|
77
|
+
tools: z.tuple([]),
|
|
78
|
+
output_schema: z.object({}).strict(),
|
|
79
|
+
capabilities: z.tuple([]),
|
|
80
|
+
availability: z.object({
|
|
81
|
+
status: z.literal("unavailable"),
|
|
82
|
+
reason: z.literal("component is unavailable on the configured runtime"),
|
|
83
|
+
}).strict(),
|
|
84
|
+
}).strict();
|
|
85
|
+
// The strict variants make this union a closed discriminator boundary: an
|
|
86
|
+
// `availability` field cannot be stripped by the available branch, and only
|
|
87
|
+
// the unavailable branch accepts the one supported status/reason pair.
|
|
88
|
+
const agentSchema = z.union([availableAgentSchema, unavailableAgentSchema]);
|
|
89
|
+
// The bundle's top-level format-version field is target-dependent: `warble
|
|
90
|
+
// dispatch --target vercel` names it `vercel_bundle_version`, while the
|
|
91
|
+
// claude-agent-sdk dispatcher's `manifest` command (otherwise structurally
|
|
92
|
+
// identical — see its doc comment in `repos/warble/dispatcher/claude-agent-sdk`)
|
|
93
|
+
// names the same field `manifest_version`. Both are accepted here (the
|
|
94
|
+
// `.refine` below requires exactly one to be present) so `loadBundle` works
|
|
95
|
+
// for whichever back-end actually produced the bundle; read the field back
|
|
96
|
+
// through `bundleFormatVersion` rather than either name directly.
|
|
97
|
+
export const bundleSchema = z
|
|
98
|
+
.object({
|
|
99
|
+
vercel_bundle_version: z.string().optional(),
|
|
100
|
+
manifest_version: z.string().optional(),
|
|
101
|
+
compat: z.object({
|
|
102
|
+
min_ir_version: z.string(),
|
|
103
|
+
max_ir_version: z.string(),
|
|
104
|
+
}),
|
|
105
|
+
profile: z.string(),
|
|
106
|
+
target: z.string(),
|
|
107
|
+
agents: z.array(agentSchema),
|
|
108
|
+
})
|
|
109
|
+
.refine((bundle) => bundle.vercel_bundle_version !== undefined || bundle.manifest_version !== undefined, {
|
|
110
|
+
message: 'bundle must include either "vercel_bundle_version" (vercel target) or "manifest_version" (claude-agent-sdk target)',
|
|
111
|
+
});
|
|
112
|
+
/**
|
|
113
|
+
* A loaded bundle's format-version, regardless of which top-level key it
|
|
114
|
+
* arrived under (see `bundleSchema`'s doc comment) — the accessor `server/harness.ts`'s
|
|
115
|
+
* `HarnessProfile.bundleVersion` (and any other "what version is this bundle"
|
|
116
|
+
* caller) should use instead of reading either field name directly. Never
|
|
117
|
+
* throws in practice: `bundleSchema`'s `.refine` already guarantees at least
|
|
118
|
+
* one of the two fields is present on any `Bundle` that made it through
|
|
119
|
+
* `loadBundle`.
|
|
120
|
+
*/
|
|
121
|
+
export function bundleFormatVersion(bundle) {
|
|
122
|
+
const version = bundle.vercel_bundle_version ?? bundle.manifest_version;
|
|
123
|
+
if (version === undefined) {
|
|
124
|
+
throw new Error("bundle has neither vercel_bundle_version nor manifest_version");
|
|
125
|
+
}
|
|
126
|
+
return version;
|
|
127
|
+
}
|