trail-code 0.0.0-stage → 0.28.0-semantic.3
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 +21 -0
- package/README.md +567 -2
- package/dist/ai/crux.d.ts +88 -0
- package/dist/ai/crux.d.ts.map +1 -0
- package/dist/ai/crux.js +219 -0
- package/dist/ai/crux.js.map +1 -0
- package/dist/ai/failure.d.ts +60 -0
- package/dist/ai/failure.d.ts.map +1 -0
- package/dist/ai/failure.js +86 -0
- package/dist/ai/failure.js.map +1 -0
- package/dist/ai/llm/anthropic.d.ts +37 -0
- package/dist/ai/llm/anthropic.d.ts.map +1 -0
- package/dist/ai/llm/anthropic.js +144 -0
- package/dist/ai/llm/anthropic.js.map +1 -0
- package/dist/ai/llm/factory.d.ts +28 -0
- package/dist/ai/llm/factory.d.ts.map +1 -0
- package/dist/ai/llm/factory.js +36 -0
- package/dist/ai/llm/factory.js.map +1 -0
- package/dist/ai/llm/litellm.d.ts +34 -0
- package/dist/ai/llm/litellm.d.ts.map +1 -0
- package/dist/ai/llm/litellm.js +45 -0
- package/dist/ai/llm/litellm.js.map +1 -0
- package/dist/ai/llm/openai.d.ts +145 -0
- package/dist/ai/llm/openai.d.ts.map +1 -0
- package/dist/ai/llm/openai.js +629 -0
- package/dist/ai/llm/openai.js.map +1 -0
- package/dist/ai/llm/orcarouter.d.ts +34 -0
- package/dist/ai/llm/orcarouter.d.ts.map +1 -0
- package/dist/ai/llm/orcarouter.js +45 -0
- package/dist/ai/llm/orcarouter.js.map +1 -0
- package/dist/ai/llm/recover-tool.d.ts +21 -0
- package/dist/ai/llm/recover-tool.d.ts.map +1 -0
- package/dist/ai/llm/recover-tool.js +109 -0
- package/dist/ai/llm/recover-tool.js.map +1 -0
- package/dist/ai/llm/types.d.ts +122 -0
- package/dist/ai/llm/types.d.ts.map +1 -0
- package/dist/ai/llm/types.js +33 -0
- package/dist/ai/llm/types.js.map +1 -0
- package/dist/ai/providers.d.ts +59 -0
- package/dist/ai/providers.d.ts.map +1 -0
- package/dist/ai/providers.js +54 -0
- package/dist/ai/providers.js.map +1 -0
- package/dist/ai/summarize.d.ts +25 -0
- package/dist/ai/summarize.d.ts.map +1 -0
- package/dist/ai/summarize.js +34 -0
- package/dist/ai/summarize.js.map +1 -0
- package/dist/ai/synthesize.d.ts +40 -0
- package/dist/ai/synthesize.d.ts.map +1 -0
- package/dist/ai/synthesize.js +230 -0
- package/dist/ai/synthesize.js.map +1 -0
- package/dist/ask/ask.d.ts +199 -0
- package/dist/ask/ask.d.ts.map +1 -0
- package/dist/ask/ask.js +1291 -0
- package/dist/ask/ask.js.map +1 -0
- package/dist/ask/file-rank.d.ts +72 -0
- package/dist/ask/file-rank.d.ts.map +1 -0
- package/dist/ask/file-rank.js +160 -0
- package/dist/ask/file-rank.js.map +1 -0
- package/dist/ask/file-selection.d.ts +22 -0
- package/dist/ask/file-selection.d.ts.map +1 -0
- package/dist/ask/file-selection.js +66 -0
- package/dist/ask/file-selection.js.map +1 -0
- package/dist/ask/fuse.d.ts +195 -0
- package/dist/ask/fuse.d.ts.map +1 -0
- package/dist/ask/fuse.js +344 -0
- package/dist/ask/fuse.js.map +1 -0
- package/dist/ask/graphrank.d.ts +61 -0
- package/dist/ask/graphrank.d.ts.map +1 -0
- package/dist/ask/graphrank.js +130 -0
- package/dist/ask/graphrank.js.map +1 -0
- package/dist/ask/index-file.d.ts +44 -0
- package/dist/ask/index-file.d.ts.map +1 -0
- package/dist/ask/index-file.js +128 -0
- package/dist/ask/index-file.js.map +1 -0
- package/dist/ask/semantic.d.ts +42 -0
- package/dist/ask/semantic.d.ts.map +1 -0
- package/dist/ask/semantic.js +293 -0
- package/dist/ask/semantic.js.map +1 -0
- package/dist/bin/graft.d.ts +3 -0
- package/dist/bin/graft.d.ts.map +1 -0
- package/dist/bin/graft.js +14 -0
- package/dist/bin/graft.js.map +1 -0
- package/dist/bin/trail.d.ts +3 -0
- package/dist/bin/trail.d.ts.map +1 -0
- package/dist/bin/trail.js +13 -0
- package/dist/bin/trail.js.map +1 -0
- package/dist/blast/blast-cli.d.ts +35 -0
- package/dist/blast/blast-cli.d.ts.map +1 -0
- package/dist/blast/blast-cli.js +155 -0
- package/dist/blast/blast-cli.js.map +1 -0
- package/dist/blast/blast.d.ts +128 -0
- package/dist/blast/blast.d.ts.map +1 -0
- package/dist/blast/blast.js +383 -0
- package/dist/blast/blast.js.map +1 -0
- package/dist/blast/diff.d.ts +53 -0
- package/dist/blast/diff.d.ts.map +1 -0
- package/dist/blast/diff.js +193 -0
- package/dist/blast/diff.js.map +1 -0
- package/dist/blast/evidence.d.ts +51 -0
- package/dist/blast/evidence.d.ts.map +1 -0
- package/dist/blast/evidence.js +162 -0
- package/dist/blast/evidence.js.map +1 -0
- package/dist/blast/modules.d.ts +33 -0
- package/dist/blast/modules.d.ts.map +1 -0
- package/dist/blast/modules.js +83 -0
- package/dist/blast/modules.js.map +1 -0
- package/dist/blast/name.d.ts +74 -0
- package/dist/blast/name.d.ts.map +1 -0
- package/dist/blast/name.js +269 -0
- package/dist/blast/name.js.map +1 -0
- package/dist/blast/owners.d.ts +85 -0
- package/dist/blast/owners.d.ts.map +1 -0
- package/dist/blast/owners.js +272 -0
- package/dist/blast/owners.js.map +1 -0
- package/dist/blast/render.d.ts +46 -0
- package/dist/blast/render.d.ts.map +1 -0
- package/dist/blast/render.js +422 -0
- package/dist/blast/render.js.map +1 -0
- package/dist/blast/viz.d.ts +37 -0
- package/dist/blast/viz.d.ts.map +1 -0
- package/dist/blast/viz.js +180 -0
- package/dist/blast/viz.js.map +1 -0
- package/dist/brand.d.ts +111 -0
- package/dist/brand.d.ts.map +1 -0
- package/dist/brand.js +282 -0
- package/dist/brand.js.map +1 -0
- package/dist/claude/build-progress.d.ts +30 -0
- package/dist/claude/build-progress.d.ts.map +1 -0
- package/dist/claude/build-progress.js +81 -0
- package/dist/claude/build-progress.js.map +1 -0
- package/dist/claude/hermes-skill-template.d.ts +16 -0
- package/dist/claude/hermes-skill-template.d.ts.map +1 -0
- package/dist/claude/hermes-skill-template.js +154 -0
- package/dist/claude/hermes-skill-template.js.map +1 -0
- package/dist/claude/init.d.ts +65 -0
- package/dist/claude/init.d.ts.map +1 -0
- package/dist/claude/init.js +258 -0
- package/dist/claude/init.js.map +1 -0
- package/dist/claude/paths.d.ts +9 -0
- package/dist/claude/paths.d.ts.map +1 -0
- package/dist/claude/paths.js +22 -0
- package/dist/claude/paths.js.map +1 -0
- package/dist/claude/session-metrics.d.ts +73 -0
- package/dist/claude/session-metrics.d.ts.map +1 -0
- package/dist/claude/session-metrics.js +209 -0
- package/dist/claude/session-metrics.js.map +1 -0
- package/dist/claude/settings-merge.d.ts +76 -0
- package/dist/claude/settings-merge.d.ts.map +1 -0
- package/dist/claude/settings-merge.js +283 -0
- package/dist/claude/settings-merge.js.map +1 -0
- package/dist/claude/skill-template.d.ts +13 -0
- package/dist/claude/skill-template.d.ts.map +1 -0
- package/dist/claude/skill-template.js +290 -0
- package/dist/claude/skill-template.js.map +1 -0
- package/dist/claude/state.d.ts +85 -0
- package/dist/claude/state.d.ts.map +1 -0
- package/dist/claude/state.js +88 -0
- package/dist/claude/state.js.map +1 -0
- package/dist/claude/stats.d.ts +5 -0
- package/dist/claude/stats.d.ts.map +1 -0
- package/dist/claude/stats.js +24 -0
- package/dist/claude/stats.js.map +1 -0
- package/dist/cli-epilogue.d.ts +12 -0
- package/dist/cli-epilogue.d.ts.map +1 -0
- package/dist/cli-epilogue.js +72 -0
- package/dist/cli-epilogue.js.map +1 -0
- package/dist/cli-meta.d.ts +82 -0
- package/dist/cli-meta.d.ts.map +1 -0
- package/dist/cli-meta.js +238 -0
- package/dist/cli-meta.js.map +1 -0
- package/dist/cli-picker.d.ts +139 -0
- package/dist/cli-picker.d.ts.map +1 -0
- package/dist/cli-picker.js +439 -0
- package/dist/cli-picker.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +1638 -0
- package/dist/cli.js.map +1 -0
- package/dist/context/batches.d.ts +29 -0
- package/dist/context/batches.d.ts.map +1 -0
- package/dist/context/batches.js +130 -0
- package/dist/context/batches.js.map +1 -0
- package/dist/context/build.d.ts +57 -0
- package/dist/context/build.d.ts.map +1 -0
- package/dist/context/build.js +396 -0
- package/dist/context/build.js.map +1 -0
- package/dist/context/check.d.ts +42 -0
- package/dist/context/check.d.ts.map +1 -0
- package/dist/context/check.js +162 -0
- package/dist/context/check.js.map +1 -0
- package/dist/context/map-dir.d.ts +13 -0
- package/dist/context/map-dir.d.ts.map +1 -0
- package/dist/context/map-dir.js +81 -0
- package/dist/context/map-dir.js.map +1 -0
- package/dist/context/node-file.d.ts +109 -0
- package/dist/context/node-file.d.ts.map +1 -0
- package/dist/context/node-file.js +390 -0
- package/dist/context/node-file.js.map +1 -0
- package/dist/context/price.d.ts +49 -0
- package/dist/context/price.d.ts.map +1 -0
- package/dist/context/price.js +83 -0
- package/dist/context/price.js.map +1 -0
- package/dist/context/savings.d.ts +67 -0
- package/dist/context/savings.d.ts.map +1 -0
- package/dist/context/savings.js +125 -0
- package/dist/context/savings.js.map +1 -0
- package/dist/engine.d.ts +85 -0
- package/dist/engine.d.ts.map +1 -0
- package/dist/engine.js +122 -0
- package/dist/engine.js.map +1 -0
- package/dist/graph/bindings.d.ts +64 -0
- package/dist/graph/bindings.d.ts.map +1 -0
- package/dist/graph/bindings.js +713 -0
- package/dist/graph/bindings.js.map +1 -0
- package/dist/graph/build-run.d.ts +25 -0
- package/dist/graph/build-run.d.ts.map +1 -0
- package/dist/graph/build-run.js +121 -0
- package/dist/graph/build-run.js.map +1 -0
- package/dist/graph/build.d.ts +88 -0
- package/dist/graph/build.d.ts.map +1 -0
- package/dist/graph/build.js +386 -0
- package/dist/graph/build.js.map +1 -0
- package/dist/graph/cards.d.ts +46 -0
- package/dist/graph/cards.d.ts.map +1 -0
- package/dist/graph/cards.js +280 -0
- package/dist/graph/cards.js.map +1 -0
- package/dist/graph/check.d.ts +25 -0
- package/dist/graph/check.d.ts.map +1 -0
- package/dist/graph/check.js +192 -0
- package/dist/graph/check.js.map +1 -0
- package/dist/graph/container.d.ts +63 -0
- package/dist/graph/container.d.ts.map +1 -0
- package/dist/graph/container.js +191 -0
- package/dist/graph/container.js.map +1 -0
- package/dist/graph/depth-parser.d.ts +61 -0
- package/dist/graph/depth-parser.d.ts.map +1 -0
- package/dist/graph/depth-parser.js +153 -0
- package/dist/graph/depth-parser.js.map +1 -0
- package/dist/graph/enrich.d.ts +62 -0
- package/dist/graph/enrich.d.ts.map +1 -0
- package/dist/graph/enrich.js +258 -0
- package/dist/graph/enrich.js.map +1 -0
- package/dist/graph/extract-cache.d.ts +101 -0
- package/dist/graph/extract-cache.d.ts.map +1 -0
- package/dist/graph/extract-cache.js +199 -0
- package/dist/graph/extract-cache.js.map +1 -0
- package/dist/graph/extract.d.ts +85 -0
- package/dist/graph/extract.d.ts.map +1 -0
- package/dist/graph/extract.js +2377 -0
- package/dist/graph/extract.js.map +1 -0
- package/dist/graph/fingerprint.d.ts +76 -0
- package/dist/graph/fingerprint.d.ts.map +1 -0
- package/dist/graph/fingerprint.js +160 -0
- package/dist/graph/fingerprint.js.map +1 -0
- package/dist/graph/generic.d.ts +74 -0
- package/dist/graph/generic.d.ts.map +1 -0
- package/dist/graph/generic.js +773 -0
- package/dist/graph/generic.js.map +1 -0
- package/dist/graph/invariants.d.ts +33 -0
- package/dist/graph/invariants.d.ts.map +1 -0
- package/dist/graph/invariants.js +52 -0
- package/dist/graph/invariants.js.map +1 -0
- package/dist/graph/load.d.ts +29 -0
- package/dist/graph/load.d.ts.map +1 -0
- package/dist/graph/load.js +97 -0
- package/dist/graph/load.js.map +1 -0
- package/dist/graph/lsp/client.d.ts +61 -0
- package/dist/graph/lsp/client.d.ts.map +1 -0
- package/dist/graph/lsp/client.js +217 -0
- package/dist/graph/lsp/client.js.map +1 -0
- package/dist/graph/lsp/enrich.d.ts +11 -0
- package/dist/graph/lsp/enrich.d.ts.map +1 -0
- package/dist/graph/lsp/enrich.js +163 -0
- package/dist/graph/lsp/enrich.js.map +1 -0
- package/dist/graph/lsp/registry.d.ts +22 -0
- package/dist/graph/lsp/registry.d.ts.map +1 -0
- package/dist/graph/lsp/registry.js +71 -0
- package/dist/graph/lsp/registry.js.map +1 -0
- package/dist/graph/map.d.ts +107 -0
- package/dist/graph/map.d.ts.map +1 -0
- package/dist/graph/map.js +239 -0
- package/dist/graph/map.js.map +1 -0
- package/dist/graph/markdown.d.ts +22 -0
- package/dist/graph/markdown.d.ts.map +1 -0
- package/dist/graph/markdown.js +143 -0
- package/dist/graph/markdown.js.map +1 -0
- package/dist/graph/native.d.ts +46 -0
- package/dist/graph/native.d.ts.map +1 -0
- package/dist/graph/native.js +169 -0
- package/dist/graph/native.js.map +1 -0
- package/dist/graph/queries/c.scm +13 -0
- package/dist/graph/queries/c_sharp.scm +19 -0
- package/dist/graph/queries/clojure.scm +58 -0
- package/dist/graph/queries/cpp.scm +23 -0
- package/dist/graph/queries/dart.scm +42 -0
- package/dist/graph/queries/elixir.scm +54 -0
- package/dist/graph/queries/gleam.scm +51 -0
- package/dist/graph/queries/java.scm +20 -0
- package/dist/graph/queries/kotlin.scm +43 -0
- package/dist/graph/queries/lua.scm +36 -0
- package/dist/graph/queries/nix.scm +32 -0
- package/dist/graph/queries/php.scm +40 -0
- package/dist/graph/queries/ruby.scm +65 -0
- package/dist/graph/queries/rust.scm +41 -0
- package/dist/graph/queries/scala.scm +66 -0
- package/dist/graph/queries/solidity.scm +43 -0
- package/dist/graph/queries/swift.scm +51 -0
- package/dist/graph/refresh.d.ts +106 -0
- package/dist/graph/refresh.d.ts.map +1 -0
- package/dist/graph/refresh.js +430 -0
- package/dist/graph/refresh.js.map +1 -0
- package/dist/graph/relations.d.ts +14 -0
- package/dist/graph/relations.d.ts.map +1 -0
- package/dist/graph/relations.js +8 -0
- package/dist/graph/relations.js.map +1 -0
- package/dist/graph/resolve.d.ts +17 -0
- package/dist/graph/resolve.d.ts.map +1 -0
- package/dist/graph/resolve.js +716 -0
- package/dist/graph/resolve.js.map +1 -0
- package/dist/graph/root.d.ts +11 -0
- package/dist/graph/root.d.ts.map +1 -0
- package/dist/graph/root.js +40 -0
- package/dist/graph/root.js.map +1 -0
- package/dist/graph/scopes.d.ts +40 -0
- package/dist/graph/scopes.d.ts.map +1 -0
- package/dist/graph/scopes.js +383 -0
- package/dist/graph/scopes.js.map +1 -0
- package/dist/graph/seed.d.ts +38 -0
- package/dist/graph/seed.d.ts.map +1 -0
- package/dist/graph/seed.js +229 -0
- package/dist/graph/seed.js.map +1 -0
- package/dist/graph/source-files.d.ts +46 -0
- package/dist/graph/source-files.d.ts.map +1 -0
- package/dist/graph/source-files.js +118 -0
- package/dist/graph/source-files.js.map +1 -0
- package/dist/graph/traverse-cli.d.ts +55 -0
- package/dist/graph/traverse-cli.d.ts.map +1 -0
- package/dist/graph/traverse-cli.js +189 -0
- package/dist/graph/traverse-cli.js.map +1 -0
- package/dist/graph/traverse.d.ts +112 -0
- package/dist/graph/traverse.d.ts.map +1 -0
- package/dist/graph/traverse.js +192 -0
- package/dist/graph/traverse.js.map +1 -0
- package/dist/graph/types.d.ts +78 -0
- package/dist/graph/types.d.ts.map +1 -0
- package/dist/graph/types.js +14 -0
- package/dist/graph/types.js.map +1 -0
- package/dist/graph/wasm-runtime.d.ts +19 -0
- package/dist/graph/wasm-runtime.d.ts.map +1 -0
- package/dist/graph/wasm-runtime.js +38 -0
- package/dist/graph/wasm-runtime.js.map +1 -0
- package/dist/graph/workspace-cli.d.ts +56 -0
- package/dist/graph/workspace-cli.d.ts.map +1 -0
- package/dist/graph/workspace-cli.js +111 -0
- package/dist/graph/workspace-cli.js.map +1 -0
- package/dist/graph/workspace.d.ts +172 -0
- package/dist/graph/workspace.d.ts.map +1 -0
- package/dist/graph/workspace.js +714 -0
- package/dist/graph/workspace.js.map +1 -0
- package/dist/graph/write.d.ts +13 -0
- package/dist/graph/write.d.ts.map +1 -0
- package/dist/graph/write.js +86 -0
- package/dist/graph/write.js.map +1 -0
- package/dist/hosts/antigravity.d.ts +14 -0
- package/dist/hosts/antigravity.d.ts.map +1 -0
- package/dist/hosts/antigravity.js +59 -0
- package/dist/hosts/antigravity.js.map +1 -0
- package/dist/hosts/auto.d.ts +37 -0
- package/dist/hosts/auto.d.ts.map +1 -0
- package/dist/hosts/auto.js +141 -0
- package/dist/hosts/auto.js.map +1 -0
- package/dist/hosts/claude-global.d.ts +72 -0
- package/dist/hosts/claude-global.d.ts.map +1 -0
- package/dist/hosts/claude-global.js +230 -0
- package/dist/hosts/claude-global.js.map +1 -0
- package/dist/hosts/config-write.d.ts +36 -0
- package/dist/hosts/config-write.d.ts.map +1 -0
- package/dist/hosts/config-write.js +64 -0
- package/dist/hosts/config-write.js.map +1 -0
- package/dist/hosts/init.d.ts +28 -0
- package/dist/hosts/init.d.ts.map +1 -0
- package/dist/hosts/init.js +89 -0
- package/dist/hosts/init.js.map +1 -0
- package/dist/hosts/instructions.d.ts +14 -0
- package/dist/hosts/instructions.d.ts.map +1 -0
- package/dist/hosts/instructions.js +95 -0
- package/dist/hosts/instructions.js.map +1 -0
- package/dist/hosts/mcp-config.d.ts +78 -0
- package/dist/hosts/mcp-config.d.ts.map +1 -0
- package/dist/hosts/mcp-config.js +251 -0
- package/dist/hosts/mcp-config.js.map +1 -0
- package/dist/hosts/plan.d.ts +32 -0
- package/dist/hosts/plan.d.ts.map +1 -0
- package/dist/hosts/plan.js +73 -0
- package/dist/hosts/plan.js.map +1 -0
- package/dist/hosts/registry.d.ts +41 -0
- package/dist/hosts/registry.d.ts.map +1 -0
- package/dist/hosts/registry.js +164 -0
- package/dist/hosts/registry.js.map +1 -0
- package/dist/hosts/retract.d.ts +47 -0
- package/dist/hosts/retract.d.ts.map +1 -0
- package/dist/hosts/retract.js +520 -0
- package/dist/hosts/retract.js.map +1 -0
- package/dist/hosts/sections.d.ts +47 -0
- package/dist/hosts/sections.d.ts.map +1 -0
- package/dist/hosts/sections.js +127 -0
- package/dist/hosts/sections.js.map +1 -0
- package/dist/index.d.ts +41 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +32 -0
- package/dist/index.js.map +1 -0
- package/dist/ingest/fs.d.ts +79 -0
- package/dist/ingest/fs.d.ts.map +1 -0
- package/dist/ingest/fs.js +306 -0
- package/dist/ingest/fs.js.map +1 -0
- package/dist/init-guard.d.ts +16 -0
- package/dist/init-guard.d.ts.map +1 -0
- package/dist/init-guard.js +27 -0
- package/dist/init-guard.js.map +1 -0
- package/dist/mcp/instructions.d.ts +5 -0
- package/dist/mcp/instructions.d.ts.map +1 -0
- package/dist/mcp/instructions.js +64 -0
- package/dist/mcp/instructions.js.map +1 -0
- package/dist/mcp/kept-listing.d.ts +27 -0
- package/dist/mcp/kept-listing.d.ts.map +1 -0
- package/dist/mcp/kept-listing.js +63 -0
- package/dist/mcp/kept-listing.js.map +1 -0
- package/dist/mcp/server.d.ts +4 -0
- package/dist/mcp/server.d.ts.map +1 -0
- package/dist/mcp/server.js +147 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/mcp/tool-names.d.ts +27 -0
- package/dist/mcp/tool-names.d.ts.map +1 -0
- package/dist/mcp/tool-names.js +47 -0
- package/dist/mcp/tool-names.js.map +1 -0
- package/dist/mcp/tools.d.ts +22 -0
- package/dist/mcp/tools.d.ts.map +1 -0
- package/dist/mcp/tools.js +440 -0
- package/dist/mcp/tools.js.map +1 -0
- package/dist/node-version.d.ts +15 -0
- package/dist/node-version.d.ts.map +1 -0
- package/dist/node-version.js +23 -0
- package/dist/node-version.js.map +1 -0
- package/dist/search/grep-cli.d.ts +35 -0
- package/dist/search/grep-cli.d.ts.map +1 -0
- package/dist/search/grep-cli.js +115 -0
- package/dist/search/grep-cli.js.map +1 -0
- package/dist/search/grep.d.ts +60 -0
- package/dist/search/grep.d.ts.map +1 -0
- package/dist/search/grep.js +143 -0
- package/dist/search/grep.js.map +1 -0
- package/dist/search/ignored-code.d.ts +9 -0
- package/dist/search/ignored-code.d.ts.map +1 -0
- package/dist/search/ignored-code.js +73 -0
- package/dist/search/ignored-code.js.map +1 -0
- package/dist/search/user-regexp.d.ts +26 -0
- package/dist/search/user-regexp.d.ts.map +1 -0
- package/dist/search/user-regexp.js +150 -0
- package/dist/search/user-regexp.js.map +1 -0
- package/dist/telemetry/contract.d.ts +117 -0
- package/dist/telemetry/contract.d.ts.map +1 -0
- package/dist/telemetry/contract.js +341 -0
- package/dist/telemetry/contract.js.map +1 -0
- package/dist/telemetry/flush.d.ts +21 -0
- package/dist/telemetry/flush.d.ts.map +1 -0
- package/dist/telemetry/flush.js +85 -0
- package/dist/telemetry/flush.js.map +1 -0
- package/dist/telemetry/gate.d.ts +30 -0
- package/dist/telemetry/gate.d.ts.map +1 -0
- package/dist/telemetry/gate.js +81 -0
- package/dist/telemetry/gate.js.map +1 -0
- package/dist/telemetry/identity.d.ts +40 -0
- package/dist/telemetry/identity.d.ts.map +1 -0
- package/dist/telemetry/identity.js +80 -0
- package/dist/telemetry/identity.js.map +1 -0
- package/dist/telemetry/index.d.ts +18 -0
- package/dist/telemetry/index.d.ts.map +1 -0
- package/dist/telemetry/index.js +16 -0
- package/dist/telemetry/index.js.map +1 -0
- package/dist/telemetry/key.d.ts +21 -0
- package/dist/telemetry/key.d.ts.map +1 -0
- package/dist/telemetry/key.js +49 -0
- package/dist/telemetry/key.js.map +1 -0
- package/dist/telemetry/notice.d.ts +19 -0
- package/dist/telemetry/notice.d.ts.map +1 -0
- package/dist/telemetry/notice.js +93 -0
- package/dist/telemetry/notice.js.map +1 -0
- package/dist/telemetry/queue.d.ts +35 -0
- package/dist/telemetry/queue.d.ts.map +1 -0
- package/dist/telemetry/queue.js +162 -0
- package/dist/telemetry/queue.js.map +1 -0
- package/dist/telemetry/send.d.ts +19 -0
- package/dist/telemetry/send.d.ts.map +1 -0
- package/dist/telemetry/send.js +84 -0
- package/dist/telemetry/send.js.map +1 -0
- package/dist/telemetry/sessions.d.ts +25 -0
- package/dist/telemetry/sessions.d.ts.map +1 -0
- package/dist/telemetry/sessions.js +104 -0
- package/dist/telemetry/sessions.js.map +1 -0
- package/dist/telemetry/track.d.ts +62 -0
- package/dist/telemetry/track.d.ts.map +1 -0
- package/dist/telemetry/track.js +143 -0
- package/dist/telemetry/track.js.map +1 -0
- package/dist/upkeep-run.d.ts +22 -0
- package/dist/upkeep-run.d.ts.map +1 -0
- package/dist/upkeep-run.js +85 -0
- package/dist/upkeep-run.js.map +1 -0
- package/dist/upkeep.d.ts +127 -0
- package/dist/upkeep.d.ts.map +1 -0
- package/dist/upkeep.js +252 -0
- package/dist/upkeep.js.map +1 -0
- package/dist/util/actions-folder.d.ts +2 -0
- package/dist/util/actions-folder.d.ts.map +1 -0
- package/dist/util/actions-folder.js +9 -0
- package/dist/util/actions-folder.js.map +1 -0
- package/dist/util/browser.d.ts +3 -0
- package/dist/util/browser.d.ts.map +1 -0
- package/dist/util/browser.js +14 -0
- package/dist/util/browser.js.map +1 -0
- package/dist/util/child-process.d.ts +15 -0
- package/dist/util/child-process.d.ts.map +1 -0
- package/dist/util/child-process.js +15 -0
- package/dist/util/child-process.js.map +1 -0
- package/dist/util/front-matter.d.ts +46 -0
- package/dist/util/front-matter.d.ts.map +1 -0
- package/dist/util/front-matter.js +113 -0
- package/dist/util/front-matter.js.map +1 -0
- package/dist/util/id.d.ts +7 -0
- package/dist/util/id.d.ts.map +1 -0
- package/dist/util/id.js +14 -0
- package/dist/util/id.js.map +1 -0
- package/dist/util/paths.d.ts +29 -0
- package/dist/util/paths.d.ts.map +1 -0
- package/dist/util/paths.js +71 -0
- package/dist/util/paths.js.map +1 -0
- package/dist/util/private-file.d.ts +14 -0
- package/dist/util/private-file.d.ts.map +1 -0
- package/dist/util/private-file.js +82 -0
- package/dist/util/private-file.js.map +1 -0
- package/dist/util/source.d.ts +4 -0
- package/dist/util/source.d.ts.map +1 -0
- package/dist/util/source.js +12 -0
- package/dist/util/source.js.map +1 -0
- package/dist/util/spinner.d.ts +15 -0
- package/dist/util/spinner.d.ts.map +1 -0
- package/dist/util/spinner.js +52 -0
- package/dist/util/spinner.js.map +1 -0
- package/dist/util/state.d.ts +120 -0
- package/dist/util/state.d.ts.map +1 -0
- package/dist/util/state.js +264 -0
- package/dist/util/state.js.map +1 -0
- package/dist/vendor/grammars/tree-sitter-go.LICENSE +21 -0
- package/dist/vendor/grammars/tree-sitter-go.wasm +0 -0
- package/dist/vendor/grammars/tree-sitter-java.LICENSE +21 -0
- package/dist/vendor/grammars/tree-sitter-java.wasm +0 -0
- package/dist/vendor/grammars/tree-sitter-kotlin.LICENSE +9 -0
- package/dist/vendor/grammars/tree-sitter-kotlin.wasm +0 -0
- package/dist/vendor/grammars/tree-sitter-php.LICENSE +22 -0
- package/dist/vendor/grammars/tree-sitter-php.wasm +0 -0
- package/dist/vendor/grammars/tree-sitter-python.LICENSE +21 -0
- package/dist/vendor/grammars/tree-sitter-python.wasm +0 -0
- package/dist/vendor/grammars/tree-sitter-r.LICENSE +9 -0
- package/dist/vendor/grammars/tree-sitter-r.wasm +0 -0
- package/dist/vendor/grammars/tree-sitter-swift.LICENSE +21 -0
- package/dist/vendor/grammars/tree-sitter-swift.wasm +0 -0
- package/dist/vendor/grammars/tree-sitter-tsx.wasm +0 -0
- package/dist/vendor/grammars/tree-sitter-typescript.LICENSE +21 -0
- package/dist/vendor/grammars/tree-sitter-typescript.wasm +0 -0
- package/dist/viewer/app.js +2 -0
- package/dist/viewer/index.html +49 -0
- package/dist/viewer/style.css +154 -0
- package/dist/viz/assemble.d.ts +83 -0
- package/dist/viz/assemble.d.ts.map +1 -0
- package/dist/viz/assemble.js +101 -0
- package/dist/viz/assemble.js.map +1 -0
- package/dist/viz/export.d.ts +39 -0
- package/dist/viz/export.d.ts.map +1 -0
- package/dist/viz/export.js +98 -0
- package/dist/viz/export.js.map +1 -0
- package/dist/viz/serve.d.ts +13 -0
- package/dist/viz/serve.d.ts.map +1 -0
- package/dist/viz/serve.js +130 -0
- package/dist/viz/serve.js.map +1 -0
- package/package.json +115 -4
- package/scripts/build-grammar-wasm.mjs +112 -0
- package/scripts/build-viewer.mjs +44 -0
- package/scripts/graph-quality.mjs +117 -0
- package/scripts/pack-trail.mjs +53 -0
- package/scripts/postinstall.mjs +65 -0
- package/scripts/run-tests.mjs +72 -0
- package/scripts/stamp-telemetry-key.mjs +56 -0
- package/scripts/tally-audit.mjs +140 -0
- package/scripts/vendor-grammars.mjs +53 -0
|
@@ -0,0 +1,629 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OpenAI-compatible transport. Wraps the `openai` SDK pointed at any
|
|
3
|
+
* OpenAI-compatible endpoint (OpenAI, OpenRouter, Fireworks, a LiteLLM proxy,
|
|
4
|
+
* Groq, Together, DeepSeek, a local server, …) — the user picks the endpoint
|
|
5
|
+
* with `baseUrl` and authenticates with their own key.
|
|
6
|
+
*
|
|
7
|
+
* This adapter reproduces graft's historical wire behavior exactly: temperature
|
|
8
|
+
* is forwarded, cache breakpoints become `cache_control` content parts (which
|
|
9
|
+
* OpenRouter forwards to Anthropic), and cached tokens are subtracted out of the
|
|
10
|
+
* input count so {@link Usage.input} is uncached-only.
|
|
11
|
+
*
|
|
12
|
+
* Past that, everything here is tolerance rather than preference. An
|
|
13
|
+
* OpenAI-compatible endpoint is a gateway whose own upstream calls can fail
|
|
14
|
+
* while the HTTP status stays 200, and whose support for a forced `tool_choice`
|
|
15
|
+
* — the one structured-output mechanism graft can rely on across providers —
|
|
16
|
+
* ranges from exact to none. Each way that goes wrong gets its own narrow
|
|
17
|
+
* recovery: {@link ProviderResponseError} for a 200 that is not a completion,
|
|
18
|
+
* and a bounded rung ladder in {@link OpenAIChatModel.structured} for a
|
|
19
|
+
* structured reply the endpoint answers some other way. None of it changes the
|
|
20
|
+
* bytes on the wire for an endpoint that behaves.
|
|
21
|
+
*/
|
|
22
|
+
import OpenAI from "openai";
|
|
23
|
+
import { transportRetries } from "./types.js";
|
|
24
|
+
import { unwrapMarkdownFence } from "./recover-tool.js";
|
|
25
|
+
const PROVIDER = "openai";
|
|
26
|
+
/** Synthetic tool used to coerce a plain JSON object out of `{ kind: "json" }`. */
|
|
27
|
+
const JSON_TOOL = "emit_json";
|
|
28
|
+
/** Backoff before re-sending a 200 that carried an error instead of a completion. */
|
|
29
|
+
const EMPTY_RESPONSE_BACKOFF_MS = [500, 1000, 2000, 4000, 8000];
|
|
30
|
+
/** How many nested emulated `{name, parameters}` wrappers to unwrap before stopping. */
|
|
31
|
+
const MAX_UNWRAP_DEPTH = 2;
|
|
32
|
+
/** Stand-in id for a payload lifted out of `content` — no wire call ever had one. */
|
|
33
|
+
const CONTENT_CALL_ID = "from-content";
|
|
34
|
+
/**
|
|
35
|
+
* Endpoints already seen to answer a forced `tool_choice` with something other
|
|
36
|
+
* than a tool call, keyed `<baseUrl>|<model>`. Process-local on purpose: it
|
|
37
|
+
* describes one gateway's current behaviour, the rung that works costs at most
|
|
38
|
+
* one extra call, and the next run re-probes for free.
|
|
39
|
+
*
|
|
40
|
+
* Two observations are proof, because neither survives a retry: a reply the
|
|
41
|
+
* endpoint did serve that just doesn't carry the asked-for call (prose where a
|
|
42
|
+
* tool call was forced), and — counted over {@link forcedFallbackThreshold}
|
|
43
|
+
* separate calls by {@link forcedToolChoiceRescues} — errored bodies on every
|
|
44
|
+
* forced-family rung of a call that a lower rung then answered.
|
|
45
|
+
*/
|
|
46
|
+
const forcedToolChoiceIgnored = new Set();
|
|
47
|
+
/**
|
|
48
|
+
* Rescued calls per `<baseUrl>|<model>`: structured calls where every
|
|
49
|
+
* forced-family rung failed with an errored body and the final "auto" rung then
|
|
50
|
+
* answered. One such call is a hiccup — the upstream behind the gateway may
|
|
51
|
+
* already be back, and a healthy endpoint must not spend the rest of the run
|
|
52
|
+
* on the slow rungs — so the downgrade waits for
|
|
53
|
+
* {@link forcedFallbackThreshold} of them, and a forced call that succeeds
|
|
54
|
+
* resets the count.
|
|
55
|
+
*/
|
|
56
|
+
const forcedToolChoiceRescues = new Map();
|
|
57
|
+
/**
|
|
58
|
+
* Rescued calls it takes to stop probing the forced rung on an endpoint +
|
|
59
|
+
* model (`GRAFT_LLM_FORCED_RESCUES`). Two by default: the first errored body
|
|
60
|
+
* says the endpoint's upstream blinked; a second call walking the same ladder
|
|
61
|
+
* to the same answer says the endpoint itself cannot serve the ask.
|
|
62
|
+
*/
|
|
63
|
+
function forcedFallbackThreshold() {
|
|
64
|
+
const raw = Number(process.env.GRAFT_LLM_FORCED_RESCUES);
|
|
65
|
+
return Number.isFinite(raw) && raw >= 1 ? Math.floor(raw) : 2;
|
|
66
|
+
}
|
|
67
|
+
/** A text content part, optionally carrying a cache breakpoint (OpenRouter passthrough). */
|
|
68
|
+
function textPart(text, cache) {
|
|
69
|
+
return cache
|
|
70
|
+
? [{ type: "text", text, cache_control: { type: "ephemeral" } }]
|
|
71
|
+
: text;
|
|
72
|
+
}
|
|
73
|
+
function toChatMessage(m) {
|
|
74
|
+
switch (m.role) {
|
|
75
|
+
case "system":
|
|
76
|
+
return { role: "system", content: textPart(m.content, m.cacheBreakpoint) };
|
|
77
|
+
case "user":
|
|
78
|
+
return { role: "user", content: textPart(m.content, m.cacheBreakpoint) };
|
|
79
|
+
case "tool":
|
|
80
|
+
return {
|
|
81
|
+
role: "tool",
|
|
82
|
+
tool_call_id: m.toolCallId ?? "",
|
|
83
|
+
content: textPart(m.content, m.cacheBreakpoint),
|
|
84
|
+
};
|
|
85
|
+
case "assistant": {
|
|
86
|
+
if (m.providerRaw?.provider === PROVIDER)
|
|
87
|
+
return m.providerRaw.raw;
|
|
88
|
+
const tool_calls = m.toolCalls?.map((tc) => ({
|
|
89
|
+
id: tc.id,
|
|
90
|
+
type: "function",
|
|
91
|
+
function: { name: tc.name, arguments: JSON.stringify(tc.args ?? {}) },
|
|
92
|
+
}));
|
|
93
|
+
return {
|
|
94
|
+
role: "assistant",
|
|
95
|
+
content: m.content || null,
|
|
96
|
+
...(tool_calls?.length ? { tool_calls } : {}),
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
function toChatTool(t) {
|
|
102
|
+
return { type: "function", function: { name: t.name, description: t.description, parameters: t.parameters } };
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Some OpenAI-compatible servers — LM Studio's local server, at least as of
|
|
106
|
+
* 2026 — reject the object form of `tool_choice` outright with a 400
|
|
107
|
+
* ("Invalid tool_choice type: 'object'. Supported string values: none, auto,
|
|
108
|
+
* required"), even though the upstream OpenAI spec allows it.
|
|
109
|
+
*/
|
|
110
|
+
function isRejectedObjectToolChoice(err) {
|
|
111
|
+
return (err instanceof OpenAI.APIError &&
|
|
112
|
+
err.status === 400 &&
|
|
113
|
+
/tool_choice/i.test(String(err.message ?? "")));
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Newer reasoning-family models (o1/o3/o4, the gpt-5.x line, …) reject the
|
|
117
|
+
* classic `max_tokens` param outright and require `max_completion_tokens`
|
|
118
|
+
* instead, even though both are still in wide use across OpenAI-compatible
|
|
119
|
+
* servers. Detect the specific 400 rather than guessing from the model name,
|
|
120
|
+
* so older endpoints that still expect `max_tokens` are untouched.
|
|
121
|
+
*/
|
|
122
|
+
function isRejectedMaxTokens(err) {
|
|
123
|
+
return (err instanceof OpenAI.APIError &&
|
|
124
|
+
err.status === 400 &&
|
|
125
|
+
/max_tokens.*not supported.*max_completion_tokens/i.test(String(err.message ?? "")));
|
|
126
|
+
}
|
|
127
|
+
/** Same reasoning-family models: temperature is fixed at 1, not caller-settable. */
|
|
128
|
+
function isRejectedTemperature(err) {
|
|
129
|
+
return (err instanceof OpenAI.APIError &&
|
|
130
|
+
err.status === 400 &&
|
|
131
|
+
/temperature.*does not support/i.test(String(err.message ?? "")));
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Same models again: function tools are rejected on /v1/chat/completions while
|
|
135
|
+
* the model's default reasoning effort is active. The API's own error message
|
|
136
|
+
* names the fix — `reasoning_effort: "none"` — so apply exactly that.
|
|
137
|
+
*
|
|
138
|
+
* DeepSeek's v4 line refuses the same combination ("Thinking mode does not
|
|
139
|
+
* support this tool_choice") for every tool_choice except "auto", and accepts
|
|
140
|
+
* the identical `reasoning_effort: "none"` remedy. Matching both phrasings here
|
|
141
|
+
* keeps a forced tool_choice working rather than degrading it to "auto", which
|
|
142
|
+
* would leave the model free not to call the tool the caller asked for.
|
|
143
|
+
*/
|
|
144
|
+
function isRejectedToolsWithReasoning(err) {
|
|
145
|
+
const message = String(err.message ?? "");
|
|
146
|
+
return (err instanceof OpenAI.APIError &&
|
|
147
|
+
err.status === 400 &&
|
|
148
|
+
(/function tools with reasoning_effort/i.test(message) ||
|
|
149
|
+
/thinking mode does not support this tool_choice/i.test(message)));
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* A 200 that is not a completion.
|
|
153
|
+
*
|
|
154
|
+
* A proxy in front of a model can answer HTTP 200 with
|
|
155
|
+
* `{"error": {...}}` and no `choices` when the upstream call fails, because the
|
|
156
|
+
* failure belongs to a server the proxy itself did not talk to. The SDK's retry
|
|
157
|
+
* policy only ever sees the status, so it returns that body as a success, and
|
|
158
|
+
* the first `choices[0]` used to turn it into a TypeError naming nothing a user
|
|
159
|
+
* could act on. Retryable by construction — the request was never served — and
|
|
160
|
+
* carrying the provider's own message and code so the failure that does reach
|
|
161
|
+
* the caller says what the endpoint said.
|
|
162
|
+
*/
|
|
163
|
+
export class ProviderResponseError extends Error {
|
|
164
|
+
code;
|
|
165
|
+
/** The status the provider actually sent. 200: that is the whole surprise. */
|
|
166
|
+
status = 200;
|
|
167
|
+
/** Always true — the same request can succeed on a later attempt. */
|
|
168
|
+
retryable = true;
|
|
169
|
+
constructor(message,
|
|
170
|
+
/** The provider's own error code, when the body carried one. */
|
|
171
|
+
code) {
|
|
172
|
+
super(message);
|
|
173
|
+
this.code = code;
|
|
174
|
+
this.name = "ProviderResponseError";
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
/**
|
|
178
|
+
* The completion inside a 200 body, or a typed error saying what came back
|
|
179
|
+
* instead. The only gate onto the response fields: no caller downstream of it
|
|
180
|
+
* may touch `choices` before this has decided the body holds one.
|
|
181
|
+
*/
|
|
182
|
+
function completionOrThrow(resp) {
|
|
183
|
+
const body = resp;
|
|
184
|
+
const err = body?.error;
|
|
185
|
+
if (err) {
|
|
186
|
+
const message = typeof err.message === "string" && err.message.trim()
|
|
187
|
+
? err.message
|
|
188
|
+
: "the provider returned an error body with no choices";
|
|
189
|
+
const code = typeof err.code === "string" || typeof err.code === "number" ? err.code : undefined;
|
|
190
|
+
throw new ProviderResponseError(message, code);
|
|
191
|
+
}
|
|
192
|
+
if (!Array.isArray(body?.choices) || body.choices.length === 0) {
|
|
193
|
+
throw new ProviderResponseError("the provider returned a successful response with no choices");
|
|
194
|
+
}
|
|
195
|
+
return body;
|
|
196
|
+
}
|
|
197
|
+
/**
|
|
198
|
+
* A JSON value the model wrote into `content` instead of a tool call: fenced or
|
|
199
|
+
* bare, or wrapped in a sentence around it. Object before array, the same order
|
|
200
|
+
* the content recovery in ./recover-tool.ts uses, so both agree on what a
|
|
201
|
+
* half-written reply contains.
|
|
202
|
+
*/
|
|
203
|
+
function jsonFromContent(text) {
|
|
204
|
+
const raw = unwrapMarkdownFence((text ?? "").trim());
|
|
205
|
+
if (!raw)
|
|
206
|
+
return undefined;
|
|
207
|
+
try {
|
|
208
|
+
return JSON.parse(raw);
|
|
209
|
+
}
|
|
210
|
+
catch {
|
|
211
|
+
/* a sentence around the payload — try the outermost braces/brackets */
|
|
212
|
+
}
|
|
213
|
+
for (const [open, close] of [
|
|
214
|
+
["{", "}"],
|
|
215
|
+
["[", "]"],
|
|
216
|
+
]) {
|
|
217
|
+
const start = raw.indexOf(open);
|
|
218
|
+
const end = raw.lastIndexOf(close);
|
|
219
|
+
if (start < 0 || end <= start)
|
|
220
|
+
continue;
|
|
221
|
+
try {
|
|
222
|
+
return JSON.parse(raw.slice(start, end + 1));
|
|
223
|
+
}
|
|
224
|
+
catch {
|
|
225
|
+
/* not a single well-formed value — the caller judges it as prose */
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
return undefined;
|
|
229
|
+
}
|
|
230
|
+
/**
|
|
231
|
+
* The `{name, parameters|arguments|args}` call a model wrote into `content`
|
|
232
|
+
* instead of `tool_calls` (#129) — alone, emulated in an array, or wrapped in a
|
|
233
|
+
* sentence — and failing that a plain JSON object, which is what a gateway that
|
|
234
|
+
* ignored a forced `tool_choice` writes when one tool was offered.
|
|
235
|
+
*
|
|
236
|
+
* Deliberately conservative: only the tool the caller named is accepted, and
|
|
237
|
+
* the caller still validates the shape it asked for.
|
|
238
|
+
*/
|
|
239
|
+
function payloadFromContent(text, toolName, depth = 0) {
|
|
240
|
+
const value = jsonFromContent(text);
|
|
241
|
+
if (!value || typeof value !== "object")
|
|
242
|
+
return undefined;
|
|
243
|
+
if (Array.isArray(value)) {
|
|
244
|
+
for (const item of value) {
|
|
245
|
+
const hit = item && typeof item === "object" ? payloadOf(item, toolName, depth) : undefined;
|
|
246
|
+
if (hit)
|
|
247
|
+
return hit;
|
|
248
|
+
}
|
|
249
|
+
return undefined;
|
|
250
|
+
}
|
|
251
|
+
return payloadOf(value, toolName, depth);
|
|
252
|
+
}
|
|
253
|
+
/** One emulated call object, at whatever depth of nesting it sits. */
|
|
254
|
+
function payloadOf(obj, toolName, depth) {
|
|
255
|
+
// A wrapper naming a different tool is not this caller's payload.
|
|
256
|
+
if (typeof obj.name === "string" && obj.name !== toolName)
|
|
257
|
+
return undefined;
|
|
258
|
+
const params = obj.parameters ?? obj.arguments ?? obj.args;
|
|
259
|
+
if (params === undefined)
|
|
260
|
+
return Object.keys(obj).length ? obj : undefined;
|
|
261
|
+
const parsed = typeof params === "string" ? tryParse(params) : params;
|
|
262
|
+
if (!parsed || typeof parsed !== "object" || Array.isArray(parsed))
|
|
263
|
+
return undefined;
|
|
264
|
+
return depth < MAX_UNWRAP_DEPTH
|
|
265
|
+
? payloadOf(parsed, toolName, depth + 1)
|
|
266
|
+
: parsed;
|
|
267
|
+
}
|
|
268
|
+
function tryParse(s) {
|
|
269
|
+
try {
|
|
270
|
+
return JSON.parse(s);
|
|
271
|
+
}
|
|
272
|
+
catch {
|
|
273
|
+
return undefined;
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
export class OpenAIChatModel {
|
|
277
|
+
label;
|
|
278
|
+
client;
|
|
279
|
+
model;
|
|
280
|
+
sleep;
|
|
281
|
+
/** Key into {@link forcedToolChoiceIgnored}: one entry per endpoint + model. */
|
|
282
|
+
choiceKey;
|
|
283
|
+
forcedIgnored;
|
|
284
|
+
constructor(opts) {
|
|
285
|
+
this.model = opts.model;
|
|
286
|
+
this.label = opts.label ?? `${PROVIDER}:${opts.model}`;
|
|
287
|
+
this.sleep = opts.sleep ?? ((ms) => new Promise((resolve) => setTimeout(resolve, ms)));
|
|
288
|
+
this.choiceKey = `${opts.baseUrl ?? ""}|${opts.model}`;
|
|
289
|
+
this.forcedIgnored = forcedToolChoiceIgnored.has(this.choiceKey);
|
|
290
|
+
this.client =
|
|
291
|
+
opts.client ??
|
|
292
|
+
new OpenAI({
|
|
293
|
+
apiKey: opts.apiKey,
|
|
294
|
+
baseURL: opts.baseUrl,
|
|
295
|
+
defaultHeaders: opts.headers,
|
|
296
|
+
maxRetries: transportRetries(),
|
|
297
|
+
});
|
|
298
|
+
}
|
|
299
|
+
async create(req) {
|
|
300
|
+
const messages = req.messages.map(toChatMessage);
|
|
301
|
+
const tools = req.tools ? req.tools.map(toChatTool) : undefined;
|
|
302
|
+
const params = { model: this.model, messages };
|
|
303
|
+
if (req.temperature !== undefined)
|
|
304
|
+
params.temperature = req.temperature;
|
|
305
|
+
if (req.maxTokens !== undefined)
|
|
306
|
+
params.max_tokens = req.maxTokens;
|
|
307
|
+
const fmt = req.responseFormat ?? { kind: "text" };
|
|
308
|
+
// The tool whose call answers the request, and the format that needs one.
|
|
309
|
+
let structured = null;
|
|
310
|
+
if (fmt.kind === "json") {
|
|
311
|
+
// Coerce JSON via a forced synthetic tool — the one structured-output
|
|
312
|
+
// mechanism shared with Anthropic (no reliance on `response_format`).
|
|
313
|
+
params.tools = [
|
|
314
|
+
...(tools ?? []),
|
|
315
|
+
{ type: "function", function: { name: JSON_TOOL, description: "Return the answer as a JSON object.", parameters: { type: "object", additionalProperties: true } } },
|
|
316
|
+
];
|
|
317
|
+
structured = { tool: JSON_TOOL, kind: "json" };
|
|
318
|
+
}
|
|
319
|
+
else if (fmt.kind === "tool") {
|
|
320
|
+
params.tools = tools;
|
|
321
|
+
structured = { tool: fmt.name, kind: "tool" };
|
|
322
|
+
}
|
|
323
|
+
else if (tools) {
|
|
324
|
+
params.tools = tools;
|
|
325
|
+
}
|
|
326
|
+
if (!structured)
|
|
327
|
+
return this.fromResponse(await this.complete(params, true), "text");
|
|
328
|
+
return this.structured(params, structured.tool, structured.kind);
|
|
329
|
+
}
|
|
330
|
+
/**
|
|
331
|
+
* A structured reply, however the endpoint is willing to produce one.
|
|
332
|
+
*
|
|
333
|
+
* A forced `tool_choice` is the only structured-output mechanism graft can
|
|
334
|
+
* rely on across providers, and it is the least portable corner of the
|
|
335
|
+
* OpenAI-compatible spec: an endpoint can reject the object form (handled one
|
|
336
|
+
* layer down), answer 200 with an error object, or quietly answer in prose.
|
|
337
|
+
* So walk a bounded ladder — the object form, then `"required"`, then
|
|
338
|
+
* `"auto"` with the tool named in the prompt — and take the payload from
|
|
339
|
+
* `content` if that is where it landed. `"required"` only stands in for the
|
|
340
|
+
* object form when one tool was offered, the same rule the 400 fallback
|
|
341
|
+
* applies: with several tools it would let the model pick freely rather than
|
|
342
|
+
* honour the caller's choice.
|
|
343
|
+
*
|
|
344
|
+
* An endpoint that honours the forced form never sees rung two — the first
|
|
345
|
+
* attempt answers the question and the ladder ends.
|
|
346
|
+
*
|
|
347
|
+
* An errored body is a weaker signal than a served-but-wrong reply, since it
|
|
348
|
+
* may belong to an upstream that a retry would reach, so it never downgrades
|
|
349
|
+
* on its own: it is counted instead. A call where every forced-family rung
|
|
350
|
+
* failed that way and the final "auto" rung then answered is a rescue, and
|
|
351
|
+
* the second rescue with no successful forced call in between is the
|
|
352
|
+
* endpoint's pattern, not its upstream's — that, and only that, switches
|
|
353
|
+
* later calls straight to "auto".
|
|
354
|
+
*/
|
|
355
|
+
async structured(base, tool, kind) {
|
|
356
|
+
const rungs = this.forcedIgnored
|
|
357
|
+
? ["auto"]
|
|
358
|
+
: base.tools?.length === 1
|
|
359
|
+
? ["forced", "required", "auto"]
|
|
360
|
+
: ["forced", "auto"];
|
|
361
|
+
// How many rungs of this call have answered with an errored body so far.
|
|
362
|
+
// The rescue judgement needs the whole call: forced-family rungs errored,
|
|
363
|
+
// and the rung that finally answered being the one below all of them.
|
|
364
|
+
let erroredAbove = 0;
|
|
365
|
+
for (const rung of rungs.slice(0, -1)) {
|
|
366
|
+
let res;
|
|
367
|
+
try {
|
|
368
|
+
// No empty-response retry on a rung with a successor: changing the ask
|
|
369
|
+
// is a better next move than re-sending a request the endpoint cannot
|
|
370
|
+
// serve, and it costs the same one call.
|
|
371
|
+
res = this.fromResponse(await this.complete(this.attempt(base, rung, tool), false), kind);
|
|
372
|
+
}
|
|
373
|
+
catch (err) {
|
|
374
|
+
if (!(err instanceof ProviderResponseError))
|
|
375
|
+
throw err;
|
|
376
|
+
erroredAbove += 1;
|
|
377
|
+
continue;
|
|
378
|
+
}
|
|
379
|
+
if (this.delivered(res, kind, tool)) {
|
|
380
|
+
// The forced rung answering is the strongest counter-evidence there
|
|
381
|
+
// is: whatever errored bodies came before, this endpoint serves the
|
|
382
|
+
// ask, and the count starts over.
|
|
383
|
+
if (rung === "forced")
|
|
384
|
+
forcedToolChoiceRescues.delete(this.choiceKey);
|
|
385
|
+
return fromContentAsPayload(res, kind, tool);
|
|
386
|
+
}
|
|
387
|
+
this.rememberForcedIgnored();
|
|
388
|
+
}
|
|
389
|
+
// Last rung: "auto" plus the tool named in the prompt, retried on an
|
|
390
|
+
// errored body. Whatever comes back is the answer — the payload from
|
|
391
|
+
// `content` when that is where it landed, the raw reply otherwise, so the
|
|
392
|
+
// caller's own miss classification still sees exactly what the model said.
|
|
393
|
+
const last = this.fromResponse(await this.complete(this.attempt(base, "auto", tool), true), kind);
|
|
394
|
+
if (this.delivered(last, kind, tool) && erroredAbove === rungs.length - 1)
|
|
395
|
+
this.noteForcedRescue();
|
|
396
|
+
return fromContentAsPayload(last, kind, tool);
|
|
397
|
+
}
|
|
398
|
+
/** One rung: the forced object form, its equivalent string form, or "auto" plus a prompt. */
|
|
399
|
+
attempt(base, rung, tool) {
|
|
400
|
+
if (rung === "forced")
|
|
401
|
+
return { ...base, tool_choice: { type: "function", function: { name: tool } } };
|
|
402
|
+
if (rung === "required")
|
|
403
|
+
return { ...base, tool_choice: "required" };
|
|
404
|
+
return { ...base, tool_choice: "auto", messages: withToolInstruction(base.messages, tool) };
|
|
405
|
+
}
|
|
406
|
+
/** Did the reply carry the payload the caller forced a tool for? */
|
|
407
|
+
delivered(res, kind, tool) {
|
|
408
|
+
if (kind === "json")
|
|
409
|
+
return jsonFromContent(res.text) !== undefined;
|
|
410
|
+
return res.toolCalls.some((c) => c.name === tool) || payloadFromContent(res.text, tool) !== undefined;
|
|
411
|
+
}
|
|
412
|
+
/**
|
|
413
|
+
* One more rescued call for this endpoint + model. When the count reaches
|
|
414
|
+
* the threshold with no successful forced call in between, the endpoint is
|
|
415
|
+
* marked the same way a served-but-wrong reply marks it.
|
|
416
|
+
*/
|
|
417
|
+
noteForcedRescue() {
|
|
418
|
+
if (this.forcedIgnored)
|
|
419
|
+
return;
|
|
420
|
+
const rescues = (forcedToolChoiceRescues.get(this.choiceKey) ?? 0) + 1;
|
|
421
|
+
forcedToolChoiceRescues.set(this.choiceKey, rescues);
|
|
422
|
+
if (rescues >= forcedFallbackThreshold())
|
|
423
|
+
this.rememberForcedIgnored();
|
|
424
|
+
}
|
|
425
|
+
/**
|
|
426
|
+
* Remember, for this process, that the endpoint did not answer a forced
|
|
427
|
+
* `tool_choice` with a tool call, so later requests go straight to the rung
|
|
428
|
+
* that works. Logged once per endpoint + model — the set is shared by every
|
|
429
|
+
* instance, so a second adapter for the same endpoint never repeats it: it
|
|
430
|
+
* changes the bytes on the wire, which is exactly what someone reading a
|
|
431
|
+
* failing build needs told.
|
|
432
|
+
*/
|
|
433
|
+
rememberForcedIgnored() {
|
|
434
|
+
this.forcedIgnored = true;
|
|
435
|
+
if (forcedToolChoiceIgnored.has(this.choiceKey))
|
|
436
|
+
return;
|
|
437
|
+
forcedToolChoiceIgnored.add(this.choiceKey);
|
|
438
|
+
console.error(`⚠ ${this.label}: the endpoint did not honor a forced tool_choice — asking for the tool in the prompt instead (tool_choice "auto") for the rest of this run.`);
|
|
439
|
+
}
|
|
440
|
+
/**
|
|
441
|
+
* One completion, with the transport's retry policy extended to a 200 that
|
|
442
|
+
* carried an error instead of one. The SDK retries 429, 5xx and connection
|
|
443
|
+
* failures but never a successful status, and that body is the endpoint
|
|
444
|
+
* reporting a failed upstream call — the same judgement, so the same
|
|
445
|
+
* `GRAFT_LLM_RETRIES` budget and backoff apply, and the typed error is what
|
|
446
|
+
* reaches the caller once that budget is spent.
|
|
447
|
+
*/
|
|
448
|
+
async complete(params, retryErroredBody) {
|
|
449
|
+
const retries = retryErroredBody ? transportRetries() : 0;
|
|
450
|
+
for (let attempt = 0;; attempt++) {
|
|
451
|
+
let failure;
|
|
452
|
+
try {
|
|
453
|
+
return completionOrThrow(await this.createChatCompletion(params));
|
|
454
|
+
}
|
|
455
|
+
catch (err) {
|
|
456
|
+
if (!(err instanceof ProviderResponseError))
|
|
457
|
+
throw err;
|
|
458
|
+
failure = err;
|
|
459
|
+
}
|
|
460
|
+
if (attempt >= retries)
|
|
461
|
+
throw failure;
|
|
462
|
+
const wait = EMPTY_RESPONSE_BACKOFF_MS[Math.min(attempt, EMPTY_RESPONSE_BACKOFF_MS.length - 1)];
|
|
463
|
+
await this.sleep(wait);
|
|
464
|
+
}
|
|
465
|
+
}
|
|
466
|
+
/**
|
|
467
|
+
* Wraps `chat.completions.create` with a narrow, safe fallback: if the
|
|
468
|
+
* server rejects an object-form `tool_choice` and exactly one tool was
|
|
469
|
+
* offered, "required" is behaviorally identical (the model has nothing
|
|
470
|
+
* else to pick), so retry once with the string form instead of failing
|
|
471
|
+
* the whole build. Left alone when more than one tool is offered, since
|
|
472
|
+
* "required" would then let the model choose freely instead of the
|
|
473
|
+
* caller-specified tool — that ambiguity isn't safe to paper over
|
|
474
|
+
* automatically.
|
|
475
|
+
*/
|
|
476
|
+
async createChatCompletion(params) {
|
|
477
|
+
let attempt = params;
|
|
478
|
+
// Bounded: one retry per known incompatibility below, never an open loop.
|
|
479
|
+
for (let i = 0; i < 4; i++) {
|
|
480
|
+
try {
|
|
481
|
+
return await this.client.chat.completions.create(attempt);
|
|
482
|
+
}
|
|
483
|
+
catch (err) {
|
|
484
|
+
// Checked before the tool_choice fallback below: a reasoning refusal
|
|
485
|
+
// also names tool_choice, and turning reasoning off keeps the caller's
|
|
486
|
+
// chosen tool instead of loosening the choice to work around it.
|
|
487
|
+
if (isRejectedToolsWithReasoning(err) && attempt.reasoning_effort === undefined) {
|
|
488
|
+
attempt = { ...attempt, reasoning_effort: "none" };
|
|
489
|
+
continue;
|
|
490
|
+
}
|
|
491
|
+
if (isRejectedObjectToolChoice(err) && typeof attempt.tool_choice === "object" && attempt.tools?.length === 1) {
|
|
492
|
+
attempt = { ...attempt, tool_choice: "required" };
|
|
493
|
+
continue;
|
|
494
|
+
}
|
|
495
|
+
if (isRejectedMaxTokens(err) && attempt.max_tokens !== undefined) {
|
|
496
|
+
const { max_tokens, ...rest } = attempt;
|
|
497
|
+
attempt = { ...rest, max_completion_tokens: max_tokens };
|
|
498
|
+
continue;
|
|
499
|
+
}
|
|
500
|
+
if (isRejectedTemperature(err) && attempt.temperature !== undefined) {
|
|
501
|
+
const { temperature, ...rest } = attempt;
|
|
502
|
+
attempt = rest;
|
|
503
|
+
continue;
|
|
504
|
+
}
|
|
505
|
+
throw err;
|
|
506
|
+
}
|
|
507
|
+
}
|
|
508
|
+
return this.client.chat.completions.create(attempt);
|
|
509
|
+
}
|
|
510
|
+
/**
|
|
511
|
+
* Normalize provider message content to the plain text representation
|
|
512
|
+
* expected by the rest of Graft. Some OpenAI-compatible providers
|
|
513
|
+
* (observed with GLM-5.3 hosted on Mistral's platform) return content as
|
|
514
|
+
* structured content parts, e.g. `[{ type: "text", text: "..." }]`,
|
|
515
|
+
* instead of a plain string — this path in Graft assumed the latter.
|
|
516
|
+
*/
|
|
517
|
+
static contentToText(content) {
|
|
518
|
+
if (typeof content === "string")
|
|
519
|
+
return content;
|
|
520
|
+
if (content == null)
|
|
521
|
+
return "";
|
|
522
|
+
if (Array.isArray(content)) {
|
|
523
|
+
return content
|
|
524
|
+
.filter((part) => part?.type === "text" || typeof part === "string")
|
|
525
|
+
.map((part) => (typeof part === "string" ? part : (part.text ?? "")))
|
|
526
|
+
.join("");
|
|
527
|
+
}
|
|
528
|
+
// An unrecognized shape is a signal worth surfacing loudly rather than
|
|
529
|
+
// silently coercing to "" or "[object Object]" — that hides a future
|
|
530
|
+
// provider format change instead of flagging it.
|
|
531
|
+
throw new Error(`Unsupported message.content type from provider: ${typeof content}`);
|
|
532
|
+
}
|
|
533
|
+
fromResponse(resp, format) {
|
|
534
|
+
// `resp` came through `completionOrThrow`, so `choices` holds at least one
|
|
535
|
+
// entry by now: this is a peek at the first one, not a dereference of a
|
|
536
|
+
// possibly-missing array.
|
|
537
|
+
const choice = resp.choices[0];
|
|
538
|
+
const msg = choice?.message;
|
|
539
|
+
const rawCalls = (msg?.tool_calls ?? []).filter((c) => c.type === "function");
|
|
540
|
+
const parse = (s) => {
|
|
541
|
+
try {
|
|
542
|
+
return JSON.parse(s || "{}");
|
|
543
|
+
}
|
|
544
|
+
catch {
|
|
545
|
+
return {};
|
|
546
|
+
}
|
|
547
|
+
};
|
|
548
|
+
let text = OpenAIChatModel.contentToText(msg?.content);
|
|
549
|
+
let toolCalls = rawCalls.map((c) => ({
|
|
550
|
+
id: c.id,
|
|
551
|
+
name: c.function.name,
|
|
552
|
+
args: parse(c.function.arguments),
|
|
553
|
+
}));
|
|
554
|
+
if (format === "json") {
|
|
555
|
+
// Surface the synthetic tool's object as JSON text; hide it from `toolCalls`.
|
|
556
|
+
const jsonCall = toolCalls.find((c) => c.name === JSON_TOOL);
|
|
557
|
+
if (jsonCall)
|
|
558
|
+
text = JSON.stringify(jsonCall.args);
|
|
559
|
+
toolCalls = toolCalls.filter((c) => c.name !== JSON_TOOL);
|
|
560
|
+
}
|
|
561
|
+
return {
|
|
562
|
+
text,
|
|
563
|
+
toolCalls,
|
|
564
|
+
usage: normalizeUsage(resp.usage),
|
|
565
|
+
stopReason: choice?.finish_reason ?? null,
|
|
566
|
+
assistant: {
|
|
567
|
+
role: "assistant",
|
|
568
|
+
content: OpenAIChatModel.contentToText(msg?.content),
|
|
569
|
+
toolCalls: toolCalls.length ? toolCalls : undefined,
|
|
570
|
+
providerRaw: { provider: PROVIDER, raw: msg },
|
|
571
|
+
},
|
|
572
|
+
};
|
|
573
|
+
}
|
|
574
|
+
}
|
|
575
|
+
/**
|
|
576
|
+
* Name the tool in a system turn of its own, so an "auto" rung has something to
|
|
577
|
+
* act on. A separate message leaves every part the caller wrote — including a
|
|
578
|
+
* cache breakpoint — byte-for-byte as it was, so this costs no cache.
|
|
579
|
+
*/
|
|
580
|
+
function withToolInstruction(messages, tool) {
|
|
581
|
+
const line = {
|
|
582
|
+
role: "system",
|
|
583
|
+
content: `Answer by calling the ${tool} tool. Put your entire answer in that tool's arguments and reply with nothing else.`,
|
|
584
|
+
};
|
|
585
|
+
// After the last system turn, or first when the caller sent none.
|
|
586
|
+
const at = messages.map((m) => m.role).lastIndexOf("system") + 1;
|
|
587
|
+
return [...messages.slice(0, at), line, ...messages.slice(at)];
|
|
588
|
+
}
|
|
589
|
+
/**
|
|
590
|
+
* An accepted rung's answer, put in the shape the caller asked for. A model that
|
|
591
|
+
* ignored a forced `tool_choice` often produced the payload anyway, as text
|
|
592
|
+
* (#129) — so surface it as the JSON text a `{ kind: "json" }` caller expects,
|
|
593
|
+
* or as a call to the named tool a `{ kind: "tool" }` caller expects, rather
|
|
594
|
+
* than reporting an empty turn. A reply with no recognizable payload is passed
|
|
595
|
+
* through untouched, so the caller's own miss classification still sees exactly
|
|
596
|
+
* what the model said.
|
|
597
|
+
*/
|
|
598
|
+
function fromContentAsPayload(res, kind, tool) {
|
|
599
|
+
if (kind === "json") {
|
|
600
|
+
const value = jsonFromContent(res.text);
|
|
601
|
+
if (value === undefined)
|
|
602
|
+
return res;
|
|
603
|
+
const text = JSON.stringify(value);
|
|
604
|
+
return { ...res, text, assistant: { ...res.assistant, content: text } };
|
|
605
|
+
}
|
|
606
|
+
if (res.toolCalls.some((c) => c.name === tool))
|
|
607
|
+
return res;
|
|
608
|
+
const args = payloadFromContent(res.text, tool);
|
|
609
|
+
if (!args)
|
|
610
|
+
return res;
|
|
611
|
+
const call = { id: CONTENT_CALL_ID, name: tool, args };
|
|
612
|
+
return {
|
|
613
|
+
...res,
|
|
614
|
+
toolCalls: [...res.toolCalls, call],
|
|
615
|
+
assistant: { ...res.assistant, toolCalls: [...(res.assistant.toolCalls ?? []), call] },
|
|
616
|
+
};
|
|
617
|
+
}
|
|
618
|
+
/** Cached tokens are inside `prompt_tokens`; subtract so `input` is uncached-only. */
|
|
619
|
+
function normalizeUsage(u) {
|
|
620
|
+
const prompt = u?.prompt_tokens ?? 0;
|
|
621
|
+
const cacheRead = u?.prompt_tokens_details?.cached_tokens ?? 0;
|
|
622
|
+
return {
|
|
623
|
+
input: Math.max(0, prompt - cacheRead),
|
|
624
|
+
output: u?.completion_tokens ?? 0,
|
|
625
|
+
cacheRead,
|
|
626
|
+
cacheCreate: 0,
|
|
627
|
+
};
|
|
628
|
+
}
|
|
629
|
+
//# sourceMappingURL=openai.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openai.js","sourceRoot":"","sources":["../../../src/ai/llm/openai.ts"],"names":[],"mappings":"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"}
|