@ponythewhite/base-context 1.0.0 → 1.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/CHANGELOG.md +33 -0
- package/NOTICE +0 -5
- package/README.md +44 -27
- package/dist/NOTICE +0 -5
- package/dist/base-context-runtime/pyproject.toml +1 -1
- package/dist/base-context-runtime/src/rlm/__init__.py +7 -5
- package/dist/base-context-runtime/test/test_subagent_registry.py +28 -1
- package/dist/base-context-runtime/uv.lock +1 -1
- package/dist/build-info.json +1 -1
- package/dist/bundle/amazon-bedrock.js +21 -0
- package/dist/bundle/{anthropic-YY4S534V.js → anthropic-UV5GZDGU.js} +5 -5
- package/dist/bundle/{azure-openai-responses-JRP6MIM3.js → azure-openai-responses-WSNPXLYC.js} +6 -6
- package/dist/bundle/{bundled-modules-P5HARVZA.js → bundled-modules-TXUMJ2XQ.js} +71 -16
- package/dist/bundle/chunk-27QCJ2AZ.js +2578 -0
- package/dist/bundle/{chunk-MZHTNNVA.js → chunk-4GXPNXOJ.js} +8 -0
- package/dist/bundle/{chunk-SC5KG5R4.js → chunk-DGNX7HQ3.js} +1 -7
- package/dist/bundle/{chunk-A53O363M.js → chunk-GRJFXLBM.js} +0 -1
- package/dist/bundle/chunk-HKINIBP4.js +29 -0
- package/dist/bundle/{chunk-UDSW6FNG.js → chunk-KTNETTHI.js} +1 -1
- package/dist/bundle/{chunk-BYVP7LWV.js → chunk-S3INFPZZ.js} +1861 -4662
- package/dist/bundle/{chunk-73DCPU3D.js → chunk-V3L54UD6.js} +1019 -3427
- package/dist/bundle/{chunk-U7AUVG3B.js → chunk-VSIYFWYI.js} +24 -6
- package/dist/bundle/{chunk-IW77OXFS.js → chunk-W46VZFI6.js} +0 -2099
- package/dist/bundle/{cli-main-O4X7GFGY.js → cli-main-BYMSRPH6.js} +8 -6
- package/dist/bundle/cli.js +2 -2
- package/dist/bundle/{google-AUTVGDGZ.js → google-T32FMD4G.js} +6 -6
- package/dist/bundle/{google-vertex-Q75D7RKS.js → google-vertex-56KP6I3B.js} +3 -3
- package/dist/bundle/{main-XKOW2BV6.js → main-ODOYCEQC.js} +7 -5
- package/dist/bundle/{mistral-7ESB7QUD.js → mistral-WGBMYIVU.js} +5 -5
- package/dist/bundle/{openai-codex-responses-LV3QRPN4.js → openai-codex-responses-PIV2RQ3G.js} +6 -6
- package/dist/bundle/{openai-completions-OJECLPXJ.js → openai-completions-64C3JPR4.js} +11 -22
- package/dist/bundle/{openai-responses-FN6HZMBC.js → openai-responses-UI7RSTDV.js} +6 -6
- package/dist/cli/args.d.ts.map +1 -1
- package/dist/cli/args.js +108 -59
- package/dist/cli/args.js.map +1 -1
- package/dist/cli/daemon-ps.d.ts +4 -3
- package/dist/cli/daemon-ps.d.ts.map +1 -1
- package/dist/cli/daemon-ps.js +6 -1
- package/dist/cli/daemon-ps.js.map +1 -1
- package/dist/cli/product-doctor.d.ts +0 -1
- package/dist/cli/product-doctor.d.ts.map +1 -1
- package/dist/cli/product-doctor.js +6 -3
- package/dist/cli/product-doctor.js.map +1 -1
- package/dist/config.d.ts +0 -3
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +0 -8
- package/dist/config.js.map +1 -1
- package/dist/core/agent-session-config.d.ts +1 -2
- package/dist/core/agent-session-config.d.ts.map +1 -1
- package/dist/core/agent-session-config.js +0 -3
- package/dist/core/agent-session-config.js.map +1 -1
- package/dist/core/agent-session-runtime.d.ts.map +1 -1
- package/dist/core/agent-session-runtime.js +5 -4
- package/dist/core/agent-session-runtime.js.map +1 -1
- package/dist/core/agent-session-services.d.ts +5 -3
- package/dist/core/agent-session-services.d.ts.map +1 -1
- package/dist/core/agent-session-services.js +2 -27
- package/dist/core/agent-session-services.js.map +1 -1
- package/dist/core/agent-session.d.ts +10 -6
- package/dist/core/agent-session.d.ts.map +1 -1
- package/dist/core/agent-session.js +107 -107
- package/dist/core/agent-session.js.map +1 -1
- package/dist/core/auth-storage.d.ts +8 -35
- package/dist/core/auth-storage.d.ts.map +1 -1
- package/dist/core/auth-storage.js +33 -243
- package/dist/core/auth-storage.js.map +1 -1
- package/dist/core/cron-jobs.d.ts.map +1 -1
- package/dist/core/cron-jobs.js +7 -1
- package/dist/core/cron-jobs.js.map +1 -1
- package/dist/core/inference-coordinator.d.ts +6 -1
- package/dist/core/inference-coordinator.d.ts.map +1 -1
- package/dist/core/inference-coordinator.js +18 -2
- package/dist/core/inference-coordinator.js.map +1 -1
- package/dist/core/kernel/bootstrap.d.ts.map +1 -1
- package/dist/core/kernel/bootstrap.js +2 -2
- package/dist/core/kernel/bootstrap.js.map +1 -1
- package/dist/core/kernel/repl-manager.d.ts +2 -0
- package/dist/core/kernel/repl-manager.d.ts.map +1 -1
- package/dist/core/kernel/repl-manager.js +44 -1
- package/dist/core/kernel/repl-manager.js.map +1 -1
- package/dist/core/logging.d.ts +4 -3
- package/dist/core/logging.d.ts.map +1 -1
- package/dist/core/logging.js +6 -6
- package/dist/core/logging.js.map +1 -1
- package/dist/core/mcp/mcp-manager.d.ts.map +1 -1
- package/dist/core/mcp/mcp-manager.js +3 -3
- package/dist/core/mcp/mcp-manager.js.map +1 -1
- package/dist/core/model-registry.d.ts +1 -16
- package/dist/core/model-registry.d.ts.map +1 -1
- package/dist/core/model-registry.js +88 -196
- package/dist/core/model-registry.js.map +1 -1
- package/dist/core/model-resolver.d.ts +2 -19
- package/dist/core/model-resolver.d.ts.map +1 -1
- package/dist/core/model-resolver.js +36 -266
- package/dist/core/model-resolver.js.map +1 -1
- package/dist/core/provider-contracts.d.ts +5 -6
- package/dist/core/provider-contracts.d.ts.map +1 -1
- package/dist/core/provider-contracts.js +25 -36
- package/dist/core/provider-contracts.js.map +1 -1
- package/dist/core/provider-display-names.d.ts.map +1 -1
- package/dist/core/provider-display-names.js +0 -2
- package/dist/core/provider-display-names.js.map +1 -1
- package/dist/core/rlm-max-subagents.d.ts +32 -0
- package/dist/core/rlm-max-subagents.d.ts.map +1 -0
- package/dist/core/rlm-max-subagents.js +50 -0
- package/dist/core/rlm-max-subagents.js.map +1 -0
- package/dist/core/rlm-runtime.d.ts +3 -3
- package/dist/core/rlm-runtime.d.ts.map +1 -1
- package/dist/core/rlm-runtime.js.map +1 -1
- package/dist/core/sdk.d.ts +4 -3
- package/dist/core/sdk.d.ts.map +1 -1
- package/dist/core/sdk.js +27 -14
- package/dist/core/sdk.js.map +1 -1
- package/dist/core/settings-manager.d.ts +3 -16
- package/dist/core/settings-manager.d.ts.map +1 -1
- package/dist/core/settings-manager.js +12 -44
- package/dist/core/settings-manager.js.map +1 -1
- package/dist/core/slash-commands.d.ts.map +1 -1
- package/dist/core/slash-commands.js +6 -6
- package/dist/core/slash-commands.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/installer.mjs +2 -3
- package/dist/main.d.ts.map +1 -1
- package/dist/main.js +39 -34
- package/dist/main.js.map +1 -1
- package/dist/modes/acp/acp-mode.d.ts.map +1 -1
- package/dist/modes/acp/acp-mode.js +1 -1
- package/dist/modes/acp/acp-mode.js.map +1 -1
- package/dist/modes/agent-connection/daemon-agent-connection.d.ts +6 -2
- package/dist/modes/agent-connection/daemon-agent-connection.d.ts.map +1 -1
- package/dist/modes/agent-connection/daemon-agent-connection.js +13 -2
- package/dist/modes/agent-connection/daemon-agent-connection.js.map +1 -1
- package/dist/modes/agent-connection/in-process-agent-connection.d.ts +2 -0
- package/dist/modes/agent-connection/in-process-agent-connection.d.ts.map +1 -1
- package/dist/modes/agent-connection/in-process-agent-connection.js +6 -0
- package/dist/modes/agent-connection/in-process-agent-connection.js.map +1 -1
- package/dist/modes/agent-connection/types.d.ts +3 -0
- package/dist/modes/agent-connection/types.d.ts.map +1 -1
- package/dist/modes/agent-connection/types.js.map +1 -1
- package/dist/modes/agents-view/agents-view-mode.d.ts.map +1 -1
- package/dist/modes/agents-view/agents-view-mode.js +2 -19
- package/dist/modes/agents-view/agents-view-mode.js.map +1 -1
- package/dist/modes/daemon/daemon-mode.d.ts +5 -0
- package/dist/modes/daemon/daemon-mode.d.ts.map +1 -1
- package/dist/modes/daemon/daemon-mode.js +107 -12
- package/dist/modes/daemon/daemon-mode.js.map +1 -1
- package/dist/modes/daemon/daemon-protocol.d.ts +194 -165
- package/dist/modes/daemon/daemon-protocol.d.ts.map +1 -1
- package/dist/modes/daemon/daemon-protocol.js +16 -11
- package/dist/modes/daemon/daemon-protocol.js.map +1 -1
- package/dist/modes/daemon/daemon-rlm-capacity-coordinator.d.ts +19 -0
- package/dist/modes/daemon/daemon-rlm-capacity-coordinator.d.ts.map +1 -0
- package/dist/modes/daemon/daemon-rlm-capacity-coordinator.js +74 -0
- package/dist/modes/daemon/daemon-rlm-capacity-coordinator.js.map +1 -0
- package/dist/modes/daemon/daemon-rlm-capacity.d.ts +19 -0
- package/dist/modes/daemon/daemon-rlm-capacity.d.ts.map +1 -0
- package/dist/modes/daemon/daemon-rlm-capacity.js +85 -0
- package/dist/modes/daemon/daemon-rlm-capacity.js.map +1 -0
- package/dist/modes/daemon/daemon-session-summarizer.d.ts +2 -3
- package/dist/modes/daemon/daemon-session-summarizer.d.ts.map +1 -1
- package/dist/modes/daemon/daemon-session-summarizer.js +32 -23
- package/dist/modes/daemon/daemon-session-summarizer.js.map +1 -1
- package/dist/modes/daemon/daemon-state-root.d.ts +15 -0
- package/dist/modes/daemon/daemon-state-root.d.ts.map +1 -0
- package/dist/modes/daemon/daemon-state-root.js +40 -0
- package/dist/modes/daemon/daemon-state-root.js.map +1 -0
- package/dist/modes/daemon/daemon-supervisor-ownership.d.ts +2 -0
- package/dist/modes/daemon/daemon-supervisor-ownership.d.ts.map +1 -1
- package/dist/modes/daemon/daemon-supervisor-ownership.js +27 -0
- package/dist/modes/daemon/daemon-supervisor-ownership.js.map +1 -1
- package/dist/modes/daemon/daemon-supervisor.d.ts +10 -1
- package/dist/modes/daemon/daemon-supervisor.d.ts.map +1 -1
- package/dist/modes/daemon/daemon-supervisor.js +213 -20
- package/dist/modes/daemon/daemon-supervisor.js.map +1 -1
- package/dist/modes/daemon/daemon-worker-protocol.d.ts +28 -1
- package/dist/modes/daemon/daemon-worker-protocol.d.ts.map +1 -1
- package/dist/modes/daemon/daemon-worker-protocol.js +16 -2
- package/dist/modes/daemon/daemon-worker-protocol.js.map +1 -1
- package/dist/modes/daemon/saved-session-catalog.d.ts.map +1 -1
- package/dist/modes/daemon/saved-session-catalog.js +2 -0
- package/dist/modes/daemon/saved-session-catalog.js.map +1 -1
- package/dist/modes/interactive/auth-flows.d.ts +0 -6
- package/dist/modes/interactive/auth-flows.d.ts.map +1 -1
- package/dist/modes/interactive/auth-flows.js +6 -126
- package/dist/modes/interactive/auth-flows.js.map +1 -1
- package/dist/modes/interactive/components/configuration-menu.d.ts +3 -0
- package/dist/modes/interactive/components/configuration-menu.d.ts.map +1 -1
- package/dist/modes/interactive/components/configuration-menu.js +13 -2
- package/dist/modes/interactive/components/configuration-menu.js.map +1 -1
- package/dist/modes/interactive/components/footer.d.ts +1 -1
- package/dist/modes/interactive/components/footer.d.ts.map +1 -1
- package/dist/modes/interactive/components/footer.js +2 -2
- package/dist/modes/interactive/components/footer.js.map +1 -1
- package/dist/modes/interactive/components/index.d.ts +0 -1
- package/dist/modes/interactive/components/index.d.ts.map +1 -1
- package/dist/modes/interactive/components/index.js +0 -1
- package/dist/modes/interactive/components/index.js.map +1 -1
- package/dist/modes/interactive/components/login-dialog.d.ts +0 -1
- package/dist/modes/interactive/components/login-dialog.d.ts.map +1 -1
- package/dist/modes/interactive/components/login-dialog.js +3 -40
- package/dist/modes/interactive/components/login-dialog.js.map +1 -1
- package/dist/modes/interactive/components/model-selector.d.ts +2 -0
- package/dist/modes/interactive/components/model-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/model-selector.js +13 -2
- package/dist/modes/interactive/components/model-selector.js.map +1 -1
- package/dist/modes/interactive/components/oauth-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/oauth-selector.js +2 -11
- package/dist/modes/interactive/components/oauth-selector.js.map +1 -1
- package/dist/modes/interactive/feature-hints.d.ts.map +1 -1
- package/dist/modes/interactive/feature-hints.js +0 -4
- package/dist/modes/interactive/feature-hints.js.map +1 -1
- package/dist/modes/interactive/interactive-mode.d.ts +3 -12
- package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-mode.js +81 -507
- package/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/dist/modes/interactive/onboarding.d.ts +0 -3
- package/dist/modes/interactive/onboarding.d.ts.map +1 -1
- package/dist/modes/interactive/onboarding.js +0 -17
- package/dist/modes/interactive/onboarding.js.map +1 -1
- package/dist/modes/rpc/rpc-client.d.ts +2 -1
- package/dist/modes/rpc/rpc-client.d.ts.map +1 -1
- package/dist/modes/rpc/rpc-client.js +24 -11
- package/dist/modes/rpc/rpc-client.js.map +1 -1
- package/dist/node/amazon-bedrock.d.ts +2 -0
- package/dist/node/amazon-bedrock.d.ts.map +1 -0
- package/dist/node/amazon-bedrock.js +6 -0
- package/dist/node/amazon-bedrock.js.map +1 -0
- package/dist/product-identity.d.ts +0 -1
- package/dist/product-identity.d.ts.map +1 -1
- package/dist/product-identity.js +0 -1
- package/dist/product-identity.js.map +1 -1
- package/docs/development.md +1 -1
- package/docs/fork-philosophy.md +4 -8
- package/docs/installation.md +83 -62
- package/docs/providers.md +23 -25
- package/docs/quickstart.md +19 -10
- package/docs/rlm-runtime.md +13 -5
- package/docs/rpc.md +4 -4
- package/docs/sdk.md +20 -11
- package/docs/sessions.md +0 -1
- package/docs/settings.md +9 -42
- package/docs/skills.md +0 -1
- package/docs/upstream-0.9.5.md +171 -0
- package/docs/usage.md +14 -10
- package/package.json +4 -4
- package/dist/core/agent-traces.d.ts +0 -149
- package/dist/core/agent-traces.d.ts.map +0 -1
- package/dist/core/agent-traces.js +0 -904
- package/dist/core/agent-traces.js.map +0 -1
- package/dist/core/prime-inference-auth.d.ts +0 -70
- package/dist/core/prime-inference-auth.d.ts.map +0 -1
- package/dist/core/prime-inference-auth.js +0 -352
- package/dist/core/prime-inference-auth.js.map +0 -1
- package/dist/core/prime-inference-model-selection.d.ts +0 -16
- package/dist/core/prime-inference-model-selection.d.ts.map +0 -1
- package/dist/core/prime-inference-model-selection.js +0 -16
- package/dist/core/prime-inference-model-selection.js.map +0 -1
- package/dist/core/prime-inference-models.d.ts +0 -6
- package/dist/core/prime-inference-models.d.ts.map +0 -1
- package/dist/core/prime-inference-models.js +0 -62
- package/dist/core/prime-inference-models.js.map +0 -1
- package/dist/core/telemetry.d.ts +0 -95
- package/dist/core/telemetry.d.ts.map +0 -1
- package/dist/core/telemetry.js +0 -637
- package/dist/core/telemetry.js.map +0 -1
- package/dist/modes/interactive/components/prime-onboarding-splash.d.ts +0 -39
- package/dist/modes/interactive/components/prime-onboarding-splash.d.ts.map +0 -1
- package/dist/modes/interactive/components/prime-onboarding-splash.js +0 -286
- package/dist/modes/interactive/components/prime-onboarding-splash.js.map +0 -1
- package/dist/modes/interactive/components/prime-team-selector.d.ts +0 -30
- package/dist/modes/interactive/components/prime-team-selector.d.ts.map +0 -1
- package/dist/modes/interactive/components/prime-team-selector.js +0 -166
- package/dist/modes/interactive/components/prime-team-selector.js.map +0 -1
- package/dist/skills/prime-intellect/SKILL.md +0 -87
- package/dist/skills/prime-intellect/references/compute.md +0 -45
- package/dist/skills/prime-intellect/references/environments.md +0 -73
- package/dist/skills/prime-intellect/references/inference.md +0 -47
- package/dist/skills/prime-intellect/references/sandboxes.md +0 -75
- package/skills/prime-intellect/SKILL.md +0 -87
- package/skills/prime-intellect/references/compute.md +0 -45
- package/skills/prime-intellect/references/environments.md +0 -73
- package/skills/prime-intellect/references/inference.md +0 -47
- package/skills/prime-intellect/references/sandboxes.md +0 -75
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"provider-contracts.d.ts","sourceRoot":"","sources":["../../src/core/provider-contracts.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"provider-contracts.d.ts","sourceRoot":"","sources":["../../src/core/provider-contracts.ts"],"names":[],"mappings":"AAEA,0FAA0F;AAC1F,MAAM,WAAW,oBAAoB;IACpC,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,WAAW,GAAG,aAAa,CAAC;IACnC,QAAQ,EAAE,MAAM,CAAC;IACjB,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,wBAAgB,uBAAuB,CAAC,UAAU,EAAE,MAAM,GAAG,oBAAoB,CAchF;AAED,eAAO,MAAM,gCAAgC,EAAE,SAAS,oBAAoB,EAK9C,CAAC;AAE/B,yDAAyD;AACzD,wBAAgB,uBAAuB,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,CAOlG","sourcesContent":["import { getOAuthProvider } from \"@ponythewhite/base-context-ai/oauth\";\n\n/** Supported adapters, not a claim of provider endorsement or live account validation. */\nexport interface ProviderAuthContract {\n\tproviderId: string;\n\toauth: \"supported\" | \"unsupported\";\n\tguidance: string;\n\tapiKeyProviderId?: string;\n}\n\nexport function getProviderAuthContract(providerId: string): ProviderAuthContract {\n\tif (providerId === \"prime\" || providerId === \"prime-intellect\") {\n\t\treturn { providerId, oauth: \"unsupported\", guidance: \"Prime integrations are disabled in Base Context.\" };\n\t}\n\tconst provider = getOAuthProvider(providerId);\n\treturn {\n\t\tproviderId,\n\t\toauth: provider ? \"supported\" : \"unsupported\",\n\t\tguidance: provider\n\t\t\t? providerId.startsWith(\"mcp:\")\n\t\t\t\t? `Use /mcp login ${providerId.slice(4)} to connect ${provider.name}.`\n\t\t\t\t: `Use /login to authenticate with ${provider.name}, then select a model with /model.`\n\t\t\t: `No OAuth adapter is registered for ${providerId}. Configure a supported provider or register its OAuth adapter.`,\n\t};\n}\n\nexport const BUILT_IN_PROVIDER_AUTH_CONTRACTS: readonly ProviderAuthContract[] = [\n\t\"anthropic\",\n\t\"github-copilot\",\n\t\"openai-codex\",\n\t\"prime-intellect\",\n].map(getProviderAuthContract);\n\n/** Codex uses OAuth credentials, not OpenAI API keys. */\nexport function isProviderApiKeyAllowed(providerId: string, _apiKey: string, api?: string): boolean {\n\treturn (\n\t\tproviderId !== \"prime\" &&\n\t\tproviderId !== \"prime-intellect\" &&\n\t\tproviderId !== \"openai-codex\" &&\n\t\tapi !== \"openai-codex-responses\"\n\t);\n}\n"]}
|
|
@@ -1,41 +1,30 @@
|
|
|
1
|
-
|
|
2
|
-
export const BUILT_IN_PROVIDER_AUTH_CONTRACTS = [
|
|
3
|
-
{
|
|
4
|
-
providerId: "anthropic",
|
|
5
|
-
oauth: "unvalidated",
|
|
6
|
-
guidance: "Anthropic subscription OAuth is unavailable in Base Context: its client identity has not been validated for this distribution. Use Anthropic API-key login or ANTHROPIC_API_KEY instead.",
|
|
7
|
-
apiKeyProviderId: "anthropic",
|
|
8
|
-
},
|
|
9
|
-
{
|
|
10
|
-
providerId: "github-copilot",
|
|
11
|
-
oauth: "unvalidated",
|
|
12
|
-
guidance: "GitHub Copilot authentication is unavailable in Base Context: the copied client identity has not been validated for this distribution. Use an API-key provider such as openai or anthropic instead.",
|
|
13
|
-
apiKeyProviderId: "openai",
|
|
14
|
-
},
|
|
15
|
-
{
|
|
16
|
-
providerId: "openai-codex",
|
|
17
|
-
oauth: "unvalidated",
|
|
18
|
-
guidance: "OpenAI Codex subscription OAuth is unavailable in Base Context: its client identity has not been validated for this distribution. For API-key inference, select the openai provider and configure OPENAI_API_KEY.",
|
|
19
|
-
apiKeyProviderId: "openai",
|
|
20
|
-
},
|
|
21
|
-
{
|
|
22
|
-
providerId: "prime-inference",
|
|
23
|
-
oauth: "unsupported",
|
|
24
|
-
guidance: "Prime browser login is unavailable in Base Context. Use Prime Inference API-key login or PRIME_API_KEY instead.",
|
|
25
|
-
apiKeyProviderId: "prime-inference",
|
|
26
|
-
},
|
|
27
|
-
];
|
|
1
|
+
import { getOAuthProvider } from "@ponythewhite/base-context-ai/oauth";
|
|
28
2
|
export function getProviderAuthContract(providerId) {
|
|
29
|
-
|
|
3
|
+
if (providerId === "prime" || providerId === "prime-intellect") {
|
|
4
|
+
return { providerId, oauth: "unsupported", guidance: "Prime integrations are disabled in Base Context." };
|
|
5
|
+
}
|
|
6
|
+
const provider = getOAuthProvider(providerId);
|
|
7
|
+
return {
|
|
30
8
|
providerId,
|
|
31
|
-
oauth: "
|
|
32
|
-
guidance:
|
|
33
|
-
|
|
9
|
+
oauth: provider ? "supported" : "unsupported",
|
|
10
|
+
guidance: provider
|
|
11
|
+
? providerId.startsWith("mcp:")
|
|
12
|
+
? `Use /mcp login ${providerId.slice(4)} to connect ${provider.name}.`
|
|
13
|
+
: `Use /login to authenticate with ${provider.name}, then select a model with /model.`
|
|
14
|
+
: `No OAuth adapter is registered for ${providerId}. Configure a supported provider or register its OAuth adapter.`,
|
|
15
|
+
};
|
|
34
16
|
}
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
17
|
+
export const BUILT_IN_PROVIDER_AUTH_CONTRACTS = [
|
|
18
|
+
"anthropic",
|
|
19
|
+
"github-copilot",
|
|
20
|
+
"openai-codex",
|
|
21
|
+
"prime-intellect",
|
|
22
|
+
].map(getProviderAuthContract);
|
|
23
|
+
/** Codex uses OAuth credentials, not OpenAI API keys. */
|
|
24
|
+
export function isProviderApiKeyAllowed(providerId, _apiKey, api) {
|
|
25
|
+
return (providerId !== "prime" &&
|
|
26
|
+
providerId !== "prime-intellect" &&
|
|
27
|
+
providerId !== "openai-codex" &&
|
|
28
|
+
api !== "openai-codex-responses");
|
|
40
29
|
}
|
|
41
30
|
//# sourceMappingURL=provider-contracts.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"provider-contracts.js","sourceRoot":"","sources":["../../src/core/provider-contracts.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"provider-contracts.js","sourceRoot":"","sources":["../../src/core/provider-contracts.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,qCAAqC,CAAC;AAUvE,MAAM,UAAU,uBAAuB,CAAC,UAAkB,EAAwB;IACjF,IAAI,UAAU,KAAK,OAAO,IAAI,UAAU,KAAK,iBAAiB,EAAE,CAAC;QAChE,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,aAAa,EAAE,QAAQ,EAAE,kDAAkD,EAAE,CAAC;IAC3G,CAAC;IACD,MAAM,QAAQ,GAAG,gBAAgB,CAAC,UAAU,CAAC,CAAC;IAC9C,OAAO;QACN,UAAU;QACV,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,aAAa;QAC7C,QAAQ,EAAE,QAAQ;YACjB,CAAC,CAAC,UAAU,CAAC,UAAU,CAAC,MAAM,CAAC;gBAC9B,CAAC,CAAC,kBAAkB,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,eAAe,QAAQ,CAAC,IAAI,GAAG;gBACtE,CAAC,CAAC,mCAAmC,QAAQ,CAAC,IAAI,oCAAoC;YACvF,CAAC,CAAC,sCAAsC,UAAU,iEAAiE;KACpH,CAAC;AAAA,CACF;AAED,MAAM,CAAC,MAAM,gCAAgC,GAAoC;IAChF,WAAW;IACX,gBAAgB;IAChB,cAAc;IACd,iBAAiB;CACjB,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC;AAE/B,yDAAyD;AACzD,MAAM,UAAU,uBAAuB,CAAC,UAAkB,EAAE,OAAe,EAAE,GAAY,EAAW;IACnG,OAAO,CACN,UAAU,KAAK,OAAO;QACtB,UAAU,KAAK,iBAAiB;QAChC,UAAU,KAAK,cAAc;QAC7B,GAAG,KAAK,wBAAwB,CAChC,CAAC;AAAA,CACF","sourcesContent":["import { getOAuthProvider } from \"@ponythewhite/base-context-ai/oauth\";\n\n/** Supported adapters, not a claim of provider endorsement or live account validation. */\nexport interface ProviderAuthContract {\n\tproviderId: string;\n\toauth: \"supported\" | \"unsupported\";\n\tguidance: string;\n\tapiKeyProviderId?: string;\n}\n\nexport function getProviderAuthContract(providerId: string): ProviderAuthContract {\n\tif (providerId === \"prime\" || providerId === \"prime-intellect\") {\n\t\treturn { providerId, oauth: \"unsupported\", guidance: \"Prime integrations are disabled in Base Context.\" };\n\t}\n\tconst provider = getOAuthProvider(providerId);\n\treturn {\n\t\tproviderId,\n\t\toauth: provider ? \"supported\" : \"unsupported\",\n\t\tguidance: provider\n\t\t\t? providerId.startsWith(\"mcp:\")\n\t\t\t\t? `Use /mcp login ${providerId.slice(4)} to connect ${provider.name}.`\n\t\t\t\t: `Use /login to authenticate with ${provider.name}, then select a model with /model.`\n\t\t\t: `No OAuth adapter is registered for ${providerId}. Configure a supported provider or register its OAuth adapter.`,\n\t};\n}\n\nexport const BUILT_IN_PROVIDER_AUTH_CONTRACTS: readonly ProviderAuthContract[] = [\n\t\"anthropic\",\n\t\"github-copilot\",\n\t\"openai-codex\",\n\t\"prime-intellect\",\n].map(getProviderAuthContract);\n\n/** Codex uses OAuth credentials, not OpenAI API keys. */\nexport function isProviderApiKeyAllowed(providerId: string, _apiKey: string, api?: string): boolean {\n\treturn (\n\t\tproviderId !== \"prime\" &&\n\t\tproviderId !== \"prime-intellect\" &&\n\t\tproviderId !== \"openai-codex\" &&\n\t\tapi !== \"openai-codex-responses\"\n\t);\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"provider-display-names.d.ts","sourceRoot":"","sources":["../../src/core/provider-display-names.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,+BAA+B,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"provider-display-names.d.ts","sourceRoot":"","sources":["../../src/core/provider-display-names.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,+BAA+B,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CA8BlE,CAAC","sourcesContent":["export const BUILT_IN_PROVIDER_DISPLAY_NAMES: Record<string, string> = {\n\tanthropic: \"Anthropic\",\n\t\"amazon-bedrock\": \"Amazon Bedrock\",\n\t\"azure-openai-responses\": \"Azure OpenAI Responses\",\n\tcerebras: \"Cerebras\",\n\t\"cloudflare-ai-gateway\": \"Cloudflare AI Gateway\",\n\t\"cloudflare-workers-ai\": \"Cloudflare Workers AI\",\n\tdeepseek: \"DeepSeek\",\n\tfireworks: \"Fireworks\",\n\tgoogle: \"Google Gemini\",\n\t\"google-vertex\": \"Google Vertex AI\",\n\tgroq: \"Groq\",\n\thuggingface: \"Hugging Face\",\n\t\"kimi-coding\": \"Kimi For Coding\",\n\tmistral: \"Mistral\",\n\tminimax: \"MiniMax\",\n\t\"minimax-cn\": \"MiniMax (China)\",\n\tmoonshotai: \"Moonshot AI\",\n\t\"moonshotai-cn\": \"Moonshot AI (China)\",\n\topencode: \"OpenCode Zen\",\n\t\"opencode-go\": \"OpenCode Go\",\n\topenai: \"OpenAI\",\n\topenrouter: \"OpenRouter\",\n\t\"vercel-ai-gateway\": \"Vercel AI Gateway\",\n\txai: \"xAI\",\n\tzai: \"ZAI\",\n\txiaomi: \"Xiaomi MiMo\",\n\t\"xiaomi-token-plan-cn\": \"Xiaomi MiMo Token Plan (China)\",\n\t\"xiaomi-token-plan-ams\": \"Xiaomi MiMo Token Plan (Amsterdam)\",\n\t\"xiaomi-token-plan-sgp\": \"Xiaomi MiMo Token Plan (Singapore)\",\n};\n"]}
|
|
@@ -21,8 +21,6 @@ export const BUILT_IN_PROVIDER_DISPLAY_NAMES = {
|
|
|
21
21
|
"opencode-go": "OpenCode Go",
|
|
22
22
|
openai: "OpenAI",
|
|
23
23
|
openrouter: "OpenRouter",
|
|
24
|
-
"base-context-traces": "Base Context Traces",
|
|
25
|
-
"prime-inference": "Prime Inference",
|
|
26
24
|
"vercel-ai-gateway": "Vercel AI Gateway",
|
|
27
25
|
xai: "xAI",
|
|
28
26
|
zai: "ZAI",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"provider-display-names.js","sourceRoot":"","sources":["../../src/core/provider-display-names.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,+BAA+B,GAA2B;IACtE,SAAS,EAAE,WAAW;IACtB,gBAAgB,EAAE,gBAAgB;IAClC,wBAAwB,EAAE,wBAAwB;IAClD,QAAQ,EAAE,UAAU;IACpB,uBAAuB,EAAE,uBAAuB;IAChD,uBAAuB,EAAE,uBAAuB;IAChD,QAAQ,EAAE,UAAU;IACpB,SAAS,EAAE,WAAW;IACtB,MAAM,EAAE,eAAe;IACvB,eAAe,EAAE,kBAAkB;IACnC,IAAI,EAAE,MAAM;IACZ,WAAW,EAAE,cAAc;IAC3B,aAAa,EAAE,iBAAiB;IAChC,OAAO,EAAE,SAAS;IAClB,OAAO,EAAE,SAAS;IAClB,YAAY,EAAE,iBAAiB;IAC/B,UAAU,EAAE,aAAa;IACzB,eAAe,EAAE,qBAAqB;IACtC,QAAQ,EAAE,cAAc;IACxB,aAAa,EAAE,aAAa;IAC5B,MAAM,EAAE,QAAQ;IAChB,UAAU,EAAE,YAAY;IACxB,
|
|
1
|
+
{"version":3,"file":"provider-display-names.js","sourceRoot":"","sources":["../../src/core/provider-display-names.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,+BAA+B,GAA2B;IACtE,SAAS,EAAE,WAAW;IACtB,gBAAgB,EAAE,gBAAgB;IAClC,wBAAwB,EAAE,wBAAwB;IAClD,QAAQ,EAAE,UAAU;IACpB,uBAAuB,EAAE,uBAAuB;IAChD,uBAAuB,EAAE,uBAAuB;IAChD,QAAQ,EAAE,UAAU;IACpB,SAAS,EAAE,WAAW;IACtB,MAAM,EAAE,eAAe;IACvB,eAAe,EAAE,kBAAkB;IACnC,IAAI,EAAE,MAAM;IACZ,WAAW,EAAE,cAAc;IAC3B,aAAa,EAAE,iBAAiB;IAChC,OAAO,EAAE,SAAS;IAClB,OAAO,EAAE,SAAS;IAClB,YAAY,EAAE,iBAAiB;IAC/B,UAAU,EAAE,aAAa;IACzB,eAAe,EAAE,qBAAqB;IACtC,QAAQ,EAAE,cAAc;IACxB,aAAa,EAAE,aAAa;IAC5B,MAAM,EAAE,QAAQ;IAChB,UAAU,EAAE,YAAY;IACxB,mBAAmB,EAAE,mBAAmB;IACxC,GAAG,EAAE,KAAK;IACV,GAAG,EAAE,KAAK;IACV,MAAM,EAAE,aAAa;IACrB,sBAAsB,EAAE,gCAAgC;IACxD,uBAAuB,EAAE,oCAAoC;IAC7D,uBAAuB,EAAE,oCAAoC;CAC7D,CAAC","sourcesContent":["export const BUILT_IN_PROVIDER_DISPLAY_NAMES: Record<string, string> = {\n\tanthropic: \"Anthropic\",\n\t\"amazon-bedrock\": \"Amazon Bedrock\",\n\t\"azure-openai-responses\": \"Azure OpenAI Responses\",\n\tcerebras: \"Cerebras\",\n\t\"cloudflare-ai-gateway\": \"Cloudflare AI Gateway\",\n\t\"cloudflare-workers-ai\": \"Cloudflare Workers AI\",\n\tdeepseek: \"DeepSeek\",\n\tfireworks: \"Fireworks\",\n\tgoogle: \"Google Gemini\",\n\t\"google-vertex\": \"Google Vertex AI\",\n\tgroq: \"Groq\",\n\thuggingface: \"Hugging Face\",\n\t\"kimi-coding\": \"Kimi For Coding\",\n\tmistral: \"Mistral\",\n\tminimax: \"MiniMax\",\n\t\"minimax-cn\": \"MiniMax (China)\",\n\tmoonshotai: \"Moonshot AI\",\n\t\"moonshotai-cn\": \"Moonshot AI (China)\",\n\topencode: \"OpenCode Zen\",\n\t\"opencode-go\": \"OpenCode Go\",\n\topenai: \"OpenAI\",\n\topenrouter: \"OpenRouter\",\n\t\"vercel-ai-gateway\": \"Vercel AI Gateway\",\n\txai: \"xAI\",\n\tzai: \"ZAI\",\n\txiaomi: \"Xiaomi MiMo\",\n\t\"xiaomi-token-plan-cn\": \"Xiaomi MiMo Token Plan (China)\",\n\t\"xiaomi-token-plan-ams\": \"Xiaomi MiMo Token Plan (Amsterdam)\",\n\t\"xiaomi-token-plan-sgp\": \"Xiaomi MiMo Token Plan (Singapore)\",\n};\n"]}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import type { AgentSession } from "./agent-session.js";
|
|
2
|
+
import type { SettingsManager } from "./settings-manager.js";
|
|
3
|
+
export declare const DEFAULT_RLM_MAX_SUBAGENTS = 4;
|
|
4
|
+
export interface RlmMaxSubagentsStatus {
|
|
5
|
+
maxSubagents: number;
|
|
6
|
+
}
|
|
7
|
+
export declare function assertRlmMaxSubagents(value: number): void;
|
|
8
|
+
export interface RlmSubagentCapacityReservation {
|
|
9
|
+
release(): Promise<void>;
|
|
10
|
+
}
|
|
11
|
+
/** A hosted root may itself be a resumed subagent. Bind before constructor setup can fail. */
|
|
12
|
+
export interface RlmRootAdmission extends RlmSubagentCapacityReservation {
|
|
13
|
+
readonly session: AgentSession | undefined;
|
|
14
|
+
bind(session: AgentSession): void;
|
|
15
|
+
}
|
|
16
|
+
/** One shared admission authority for a root family, including pending creations. */
|
|
17
|
+
export interface RlmSubagentCapacity {
|
|
18
|
+
getStatus(): Promise<RlmMaxSubagentsStatus>;
|
|
19
|
+
setMaxSubagents(maxSubagents: number): Promise<RlmMaxSubagentsStatus>;
|
|
20
|
+
reserve(): Promise<RlmSubagentCapacityReservation>;
|
|
21
|
+
}
|
|
22
|
+
export declare class LocalRlmSubagentCapacity implements RlmSubagentCapacity {
|
|
23
|
+
private readonly settings;
|
|
24
|
+
private maxSubagents;
|
|
25
|
+
private readonly reservations;
|
|
26
|
+
private changes;
|
|
27
|
+
constructor(settings: SettingsManager);
|
|
28
|
+
getStatus(): Promise<RlmMaxSubagentsStatus>;
|
|
29
|
+
setMaxSubagents(maxSubagents: number): Promise<RlmMaxSubagentsStatus>;
|
|
30
|
+
reserve(): Promise<RlmSubagentCapacityReservation>;
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=rlm-max-subagents.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rlm-max-subagents.d.ts","sourceRoot":"","sources":["../../src/core/rlm-max-subagents.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAE7D,eAAO,MAAM,yBAAyB,IAAI,CAAC;AAE3C,MAAM,WAAW,qBAAqB;IACrC,YAAY,EAAE,MAAM,CAAC;CACrB;AAED,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAIzD;AAED,MAAM,WAAW,8BAA8B;IAC9C,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACzB;AAED,8FAA8F;AAC9F,MAAM,WAAW,gBAAiB,SAAQ,8BAA8B;IACvE,QAAQ,CAAC,OAAO,EAAE,YAAY,GAAG,SAAS,CAAC;IAC3C,IAAI,CAAC,OAAO,EAAE,YAAY,GAAG,IAAI,CAAC;CAClC;AAED,qFAAqF;AACrF,MAAM,WAAW,mBAAmB;IACnC,SAAS,IAAI,OAAO,CAAC,qBAAqB,CAAC,CAAC;IAC5C,eAAe,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,qBAAqB,CAAC,CAAC;IACtE,OAAO,IAAI,OAAO,CAAC,8BAA8B,CAAC,CAAC;CACnD;AAED,qBAAa,wBAAyB,YAAW,mBAAmB;IAKvD,OAAO,CAAC,QAAQ,CAAC,QAAQ;IAJrC,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAqB;IAClD,OAAO,CAAC,OAAO,CAAuC;IAEtD,YAA6B,QAAQ,EAAE,eAAe,EAErD;IAEK,SAAS,IAAI,OAAO,CAAC,qBAAqB,CAAC,CAEhD;IAED,eAAe,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,qBAAqB,CAAC,CAgBpE;IAEK,OAAO,IAAI,OAAO,CAAC,8BAA8B,CAAC,CAavD;CACD","sourcesContent":["import type { AgentSession } from \"./agent-session.js\";\nimport type { SettingsManager } from \"./settings-manager.js\";\n\nexport const DEFAULT_RLM_MAX_SUBAGENTS = 4;\n\nexport interface RlmMaxSubagentsStatus {\n\tmaxSubagents: number;\n}\n\nexport function assertRlmMaxSubagents(value: number): void {\n\tif (!Number.isSafeInteger(value) || value < 0) {\n\t\tthrow new Error(\"The maximum number of concurrent subagents must be a non-negative safe integer.\");\n\t}\n}\n\nexport interface RlmSubagentCapacityReservation {\n\trelease(): Promise<void>;\n}\n\n/** A hosted root may itself be a resumed subagent. Bind before constructor setup can fail. */\nexport interface RlmRootAdmission extends RlmSubagentCapacityReservation {\n\treadonly session: AgentSession | undefined;\n\tbind(session: AgentSession): void;\n}\n\n/** One shared admission authority for a root family, including pending creations. */\nexport interface RlmSubagentCapacity {\n\tgetStatus(): Promise<RlmMaxSubagentsStatus>;\n\tsetMaxSubagents(maxSubagents: number): Promise<RlmMaxSubagentsStatus>;\n\treserve(): Promise<RlmSubagentCapacityReservation>;\n}\n\nexport class LocalRlmSubagentCapacity implements RlmSubagentCapacity {\n\tprivate maxSubagents: number;\n\tprivate readonly reservations = new Set<symbol>();\n\tprivate changes: Promise<unknown> = Promise.resolve();\n\n\tconstructor(private readonly settings: SettingsManager) {\n\t\tthis.maxSubagents = settings.getRlmMaxSubagents();\n\t}\n\n\tasync getStatus(): Promise<RlmMaxSubagentsStatus> {\n\t\treturn { maxSubagents: this.maxSubagents };\n\t}\n\n\tsetMaxSubagents(maxSubagents: number): Promise<RlmMaxSubagentsStatus> {\n\t\tassertRlmMaxSubagents(maxSubagents);\n\t\tconst change = this.changes.then(async () => {\n\t\t\tawait this.settings.flush();\n\t\t\tfor (const { error } of this.settings.drainErrors(\"global\")) {\n\t\t\t\tconsole.warn(`Warning: Earlier global settings write failed: ${error.message}`);\n\t\t\t}\n\t\t\tthis.settings.setRlmMaxSubagents(maxSubagents);\n\t\t\tawait this.settings.flush();\n\t\t\tconst errors = this.settings.drainErrors(\"global\");\n\t\t\tif (errors.length > 0) throw new Error(errors.map(({ error }) => error.message).join(\"; \"));\n\t\t\tthis.maxSubagents = maxSubagents;\n\t\t\treturn this.getStatus();\n\t\t});\n\t\tthis.changes = change.catch(() => undefined);\n\t\treturn change;\n\t}\n\n\tasync reserve(): Promise<RlmSubagentCapacityReservation> {\n\t\tif (this.reservations.size >= this.maxSubagents) {\n\t\t\tthrow new Error(\n\t\t\t\t`RLM resident child limit reached (maximum ${this.maxSubagents} concurrent subagents); dispose or passivate an existing child first`,\n\t\t\t);\n\t\t}\n\t\tconst token = Symbol();\n\t\tthis.reservations.add(token);\n\t\treturn {\n\t\t\trelease: async () => {\n\t\t\t\tthis.reservations.delete(token);\n\t\t\t},\n\t\t};\n\t}\n}\n"]}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
export const DEFAULT_RLM_MAX_SUBAGENTS = 4;
|
|
2
|
+
export function assertRlmMaxSubagents(value) {
|
|
3
|
+
if (!Number.isSafeInteger(value) || value < 0) {
|
|
4
|
+
throw new Error("The maximum number of concurrent subagents must be a non-negative safe integer.");
|
|
5
|
+
}
|
|
6
|
+
}
|
|
7
|
+
export class LocalRlmSubagentCapacity {
|
|
8
|
+
settings;
|
|
9
|
+
maxSubagents;
|
|
10
|
+
reservations = new Set();
|
|
11
|
+
changes = Promise.resolve();
|
|
12
|
+
constructor(settings) {
|
|
13
|
+
this.settings = settings;
|
|
14
|
+
this.maxSubagents = settings.getRlmMaxSubagents();
|
|
15
|
+
}
|
|
16
|
+
async getStatus() {
|
|
17
|
+
return { maxSubagents: this.maxSubagents };
|
|
18
|
+
}
|
|
19
|
+
setMaxSubagents(maxSubagents) {
|
|
20
|
+
assertRlmMaxSubagents(maxSubagents);
|
|
21
|
+
const change = this.changes.then(async () => {
|
|
22
|
+
await this.settings.flush();
|
|
23
|
+
for (const { error } of this.settings.drainErrors("global")) {
|
|
24
|
+
console.warn(`Warning: Earlier global settings write failed: ${error.message}`);
|
|
25
|
+
}
|
|
26
|
+
this.settings.setRlmMaxSubagents(maxSubagents);
|
|
27
|
+
await this.settings.flush();
|
|
28
|
+
const errors = this.settings.drainErrors("global");
|
|
29
|
+
if (errors.length > 0)
|
|
30
|
+
throw new Error(errors.map(({ error }) => error.message).join("; "));
|
|
31
|
+
this.maxSubagents = maxSubagents;
|
|
32
|
+
return this.getStatus();
|
|
33
|
+
});
|
|
34
|
+
this.changes = change.catch(() => undefined);
|
|
35
|
+
return change;
|
|
36
|
+
}
|
|
37
|
+
async reserve() {
|
|
38
|
+
if (this.reservations.size >= this.maxSubagents) {
|
|
39
|
+
throw new Error(`RLM resident child limit reached (maximum ${this.maxSubagents} concurrent subagents); dispose or passivate an existing child first`);
|
|
40
|
+
}
|
|
41
|
+
const token = Symbol();
|
|
42
|
+
this.reservations.add(token);
|
|
43
|
+
return {
|
|
44
|
+
release: async () => {
|
|
45
|
+
this.reservations.delete(token);
|
|
46
|
+
},
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=rlm-max-subagents.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rlm-max-subagents.js","sourceRoot":"","sources":["../../src/core/rlm-max-subagents.ts"],"names":[],"mappings":"AAGA,MAAM,CAAC,MAAM,yBAAyB,GAAG,CAAC,CAAC;AAM3C,MAAM,UAAU,qBAAqB,CAAC,KAAa,EAAQ;IAC1D,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;QAC/C,MAAM,IAAI,KAAK,CAAC,iFAAiF,CAAC,CAAC;IACpG,CAAC;AAAA,CACD;AAmBD,MAAM,OAAO,wBAAwB;IAKP,QAAQ;IAJ7B,YAAY,CAAS;IACZ,YAAY,GAAG,IAAI,GAAG,EAAU,CAAC;IAC1C,OAAO,GAAqB,OAAO,CAAC,OAAO,EAAE,CAAC;IAEtD,YAA6B,QAAyB,EAAE;wBAA3B,QAAQ;QACpC,IAAI,CAAC,YAAY,GAAG,QAAQ,CAAC,kBAAkB,EAAE,CAAC;IAAA,CAClD;IAED,KAAK,CAAC,SAAS,GAAmC;QACjD,OAAO,EAAE,YAAY,EAAE,IAAI,CAAC,YAAY,EAAE,CAAC;IAAA,CAC3C;IAED,eAAe,CAAC,YAAoB,EAAkC;QACrE,qBAAqB,CAAC,YAAY,CAAC,CAAC;QACpC,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC;YAC5C,MAAM,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;YAC5B,KAAK,MAAM,EAAE,KAAK,EAAE,IAAI,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAC7D,OAAO,CAAC,IAAI,CAAC,kDAAkD,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;YACjF,CAAC;YACD,IAAI,CAAC,QAAQ,CAAC,kBAAkB,CAAC,YAAY,CAAC,CAAC;YAC/C,MAAM,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;YAC5B,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;YACnD,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC;gBAAE,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;YAC5F,IAAI,CAAC,YAAY,GAAG,YAAY,CAAC;YACjC,OAAO,IAAI,CAAC,SAAS,EAAE,CAAC;QAAA,CACxB,CAAC,CAAC;QACH,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;QAC7C,OAAO,MAAM,CAAC;IAAA,CACd;IAED,KAAK,CAAC,OAAO,GAA4C;QACxD,IAAI,IAAI,CAAC,YAAY,CAAC,IAAI,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;YACjD,MAAM,IAAI,KAAK,CACd,6CAA6C,IAAI,CAAC,YAAY,sEAAsE,CACpI,CAAC;QACH,CAAC;QACD,MAAM,KAAK,GAAG,MAAM,EAAE,CAAC;QACvB,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QAC7B,OAAO;YACN,OAAO,EAAE,KAAK,IAAI,EAAE,CAAC;gBACpB,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YAAA,CAChC;SACD,CAAC;IAAA,CACF;CACD","sourcesContent":["import type { AgentSession } from \"./agent-session.js\";\nimport type { SettingsManager } from \"./settings-manager.js\";\n\nexport const DEFAULT_RLM_MAX_SUBAGENTS = 4;\n\nexport interface RlmMaxSubagentsStatus {\n\tmaxSubagents: number;\n}\n\nexport function assertRlmMaxSubagents(value: number): void {\n\tif (!Number.isSafeInteger(value) || value < 0) {\n\t\tthrow new Error(\"The maximum number of concurrent subagents must be a non-negative safe integer.\");\n\t}\n}\n\nexport interface RlmSubagentCapacityReservation {\n\trelease(): Promise<void>;\n}\n\n/** A hosted root may itself be a resumed subagent. Bind before constructor setup can fail. */\nexport interface RlmRootAdmission extends RlmSubagentCapacityReservation {\n\treadonly session: AgentSession | undefined;\n\tbind(session: AgentSession): void;\n}\n\n/** One shared admission authority for a root family, including pending creations. */\nexport interface RlmSubagentCapacity {\n\tgetStatus(): Promise<RlmMaxSubagentsStatus>;\n\tsetMaxSubagents(maxSubagents: number): Promise<RlmMaxSubagentsStatus>;\n\treserve(): Promise<RlmSubagentCapacityReservation>;\n}\n\nexport class LocalRlmSubagentCapacity implements RlmSubagentCapacity {\n\tprivate maxSubagents: number;\n\tprivate readonly reservations = new Set<symbol>();\n\tprivate changes: Promise<unknown> = Promise.resolve();\n\n\tconstructor(private readonly settings: SettingsManager) {\n\t\tthis.maxSubagents = settings.getRlmMaxSubagents();\n\t}\n\n\tasync getStatus(): Promise<RlmMaxSubagentsStatus> {\n\t\treturn { maxSubagents: this.maxSubagents };\n\t}\n\n\tsetMaxSubagents(maxSubagents: number): Promise<RlmMaxSubagentsStatus> {\n\t\tassertRlmMaxSubagents(maxSubagents);\n\t\tconst change = this.changes.then(async () => {\n\t\t\tawait this.settings.flush();\n\t\t\tfor (const { error } of this.settings.drainErrors(\"global\")) {\n\t\t\t\tconsole.warn(`Warning: Earlier global settings write failed: ${error.message}`);\n\t\t\t}\n\t\t\tthis.settings.setRlmMaxSubagents(maxSubagents);\n\t\t\tawait this.settings.flush();\n\t\t\tconst errors = this.settings.drainErrors(\"global\");\n\t\t\tif (errors.length > 0) throw new Error(errors.map(({ error }) => error.message).join(\"; \"));\n\t\t\tthis.maxSubagents = maxSubagents;\n\t\t\treturn this.getStatus();\n\t\t});\n\t\tthis.changes = change.catch(() => undefined);\n\t\treturn change;\n\t}\n\n\tasync reserve(): Promise<RlmSubagentCapacityReservation> {\n\t\tif (this.reservations.size >= this.maxSubagents) {\n\t\t\tthrow new Error(\n\t\t\t\t`RLM resident child limit reached (maximum ${this.maxSubagents} concurrent subagents); dispose or passivate an existing child first`,\n\t\t\t);\n\t\t}\n\t\tconst token = Symbol();\n\t\tthis.reservations.add(token);\n\t\treturn {\n\t\t\trelease: async () => {\n\t\t\t\tthis.reservations.delete(token);\n\t\t\t},\n\t\t};\n\t}\n}\n"]}
|
|
@@ -60,7 +60,7 @@ export declare function createRlmFindModelsHostHandler(handler: RlmFindModelsHan
|
|
|
60
60
|
export declare function createRlmListSubagentsHostHandler(handler: RlmListSubagentsHandler): HostRequestHandler;
|
|
61
61
|
/** Delete one direct child selected from the current parent session's registry. */
|
|
62
62
|
export declare function createRlmDeleteSubagentHostHandler(handler: RlmDeleteSubagentHandler): HostRequestHandler;
|
|
63
|
-
/**
|
|
63
|
+
/** A parent-owned setup or resident child, charged to its root-family capacity. */
|
|
64
64
|
export interface RlmChildAdmission {
|
|
65
65
|
readonly parent: AgentSession;
|
|
66
66
|
readonly session: AgentSession | undefined;
|
|
@@ -70,8 +70,8 @@ export interface RlmChildAdmission {
|
|
|
70
70
|
bind(session: AgentSession): void;
|
|
71
71
|
beginSetup(): void;
|
|
72
72
|
claimFactory(): void;
|
|
73
|
-
confirmUnboundCleanup(): void
|
|
74
|
-
settle(): void
|
|
73
|
+
confirmUnboundCleanup(): Promise<void>;
|
|
74
|
+
settle(): Promise<void>;
|
|
75
75
|
}
|
|
76
76
|
export interface RlmSubagentRuntime {
|
|
77
77
|
session: AgentSession;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rlm-runtime.d.ts","sourceRoot":"","sources":["../../src/core/rlm-runtime.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ThinkingLevel } from \"@ponythewhite/base-context-agent\";\nimport type { Api, Model, RequestTokenBudgetOptions, ServiceTier } from \"@ponythewhite/base-context-ai\";\nimport type { AgentSession } from \"./agent-session.js\";\nimport type { ToolDefinition } from \"./extensions/index.js\";\nimport type { HostRequestHandler } from \"./kernel/index.js\";\nimport { THINKING_LEVELS } from \"./thinking-levels.js\";\n\n/** Request emitted by `rlm.run`; cellSourceCode preserves the spawning cell for display. */\nexport interface RlmRunRequest {\n\tprompt: string;\n\tkwargs: Record<string, unknown>;\n\tcellSourceCode?: string;\n}\n\nexport interface RlmSpawnHandle {\n\trlm_child_id: string;\n\tname: string;\n\tsession_dir: string;\n\tmodel: string;\n}\n\nexport type RlmSubagentRegistryStatus = \"running\" | \"completed\" | \"error\";\n\nexport interface RlmSubagentRegistryEntry {\n\trlm_child_id: string;\n\tactive_session_id: string | null;\n\tsession_id: string | null;\n\tsession_name: string;\n\tsession_dir: string;\n\tstatus: RlmSubagentRegistryStatus;\n}\n\nexport interface RlmListSubagentsResult {\n\tsubagents: RlmSubagentRegistryEntry[];\n}\n\nexport interface RlmDeleteSubagentResult {\n\tsubagent: RlmSubagentRegistryEntry;\n\toutcome?: \"deleted\" | \"skipped_running\";\n}\n\nexport interface RlmModelMatch {\n\tprovider: string;\n\tid: string;\n\tname: string;\n\tselector: string;\n}\n\nexport interface RlmFindModelsResult {\n\tmodels: RlmModelMatch[];\n}\n\nexport type RlmRunHandler = (request: RlmRunRequest) => Promise<Record<string, unknown>>;\nexport type RlmListSubagentsHandler = () => RlmListSubagentsResult | Promise<RlmListSubagentsResult>;\nexport type RlmDeleteSubagentHandler = (target: string) => Promise<RlmDeleteSubagentResult>;\nexport type RlmFindModelsHandler = (query: string, limit: number) => RlmFindModelsResult | Promise<RlmFindModelsResult>;\n\nconst RLM_SUBAGENT_SESSION_NAME_MAX_LENGTH = 64;\nexport const DEFAULT_RLM_MODEL_SEARCH_LIMIT = 8;\nexport const MAX_RLM_MODEL_SEARCH_LIMIT = 20;\n\nexport function normalizeRequestedRlmSubagentSessionName(value: unknown): string | undefined {\n\tif (value === undefined) {\n\t\treturn undefined;\n\t}\n\tif (typeof value !== \"string\") {\n\t\tthrow new Error(\"rlm.run name must be a string\");\n\t}\n\tconst name = value.trim();\n\tif (!name) {\n\t\tthrow new Error(\"rlm.run name must not be empty\");\n\t}\n\tif (name.length > RLM_SUBAGENT_SESSION_NAME_MAX_LENGTH) {\n\t\tthrow new Error(`rlm.run name must be at most ${RLM_SUBAGENT_SESSION_NAME_MAX_LENGTH} characters`);\n\t}\n\treturn name;\n}\n\nexport function normalizeRequestedRlmSubagentThinkingLevel(value: unknown): ThinkingLevel | undefined {\n\tif (value === undefined) {\n\t\treturn undefined;\n\t}\n\tif (typeof value !== \"string\") {\n\t\tthrow new Error(\"rlm.run thinking must be a string\");\n\t}\n\tconst level = value.trim().toLowerCase();\n\tif (!THINKING_LEVELS.includes(level as ThinkingLevel)) {\n\t\tthrow new Error(`rlm.run thinking must be one of: ${THINKING_LEVELS.join(\", \")}`);\n\t}\n\treturn level as ThinkingLevel;\n}\n\nexport function normalizeRequestedRlmSubagentModel(value: unknown): string | undefined {\n\tif (value === undefined) {\n\t\treturn undefined;\n\t}\n\tif (typeof value !== \"string\") {\n\t\tthrow new Error(\"rlm.run model must be a string\");\n\t}\n\tconst model = value.trim();\n\tif (!model) {\n\t\tthrow new Error(\"rlm.run model must not be empty\");\n\t}\n\treturn model;\n}\n\n/** Create a readable, collision-resistant default name usable as an agent-message selector. */\nexport function createDefaultRlmSubagentSessionName(prompt: string, childId: string): string {\n\tconst promptSlug = prompt\n\t\t.normalize(\"NFKD\")\n\t\t.replace(/[\\u0300-\\u036f]/g, \"\")\n\t\t.toLowerCase()\n\t\t.replace(/[^a-z0-9]+/g, \"-\")\n\t\t.replace(/^-+|-+$/g, \"\");\n\tconst idSuffix =\n\t\tchildId\n\t\t\t.replace(/^sub-/, \"\")\n\t\t\t.replace(/[^A-Za-z0-9]+/g, \"\")\n\t\t\t.slice(-8) || \"child\";\n\tconst fixedLength = \"subagent--\".length + idSuffix.length;\n\tconst promptPart = (promptSlug || \"worker\")\n\t\t.slice(0, Math.max(1, RLM_SUBAGENT_SESSION_NAME_MAX_LENGTH - fixedLength))\n\t\t.replace(/-+$/g, \"\");\n\treturn `subagent-${promptPart || \"worker\"}-${idSuffix}`;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n\treturn typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction normalizeModelSearchText(value: string): string {\n\treturn value.toLowerCase().replace(/[^a-z0-9]+/g, \"\");\n}\n\nexport function findRlmModelMatches(query: string, models: Model<Api>[], limit: number): RlmModelMatch[] {\n\tconst normalizedQuery = normalizeModelSearchText(query.trim());\n\treturn models\n\t\t.map((model) => {\n\t\t\tconst selector = `${model.provider}/${model.id}`;\n\t\t\tconst fields = [selector, model.id, model.name || model.id];\n\t\t\tconst normalizedFields = fields.map(normalizeModelSearchText);\n\t\t\tlet score = normalizedQuery ? Number.POSITIVE_INFINITY : 0;\n\t\t\tif (normalizedQuery) {\n\t\t\t\tconst exactIndex = normalizedFields.indexOf(normalizedQuery);\n\t\t\t\tconst prefixIndex = normalizedFields.findIndex((field) => field.startsWith(normalizedQuery));\n\t\t\t\tconst partialIndex = normalizedFields.findIndex((field) => field.includes(normalizedQuery));\n\t\t\t\tif (exactIndex >= 0) score = exactIndex;\n\t\t\t\telse if (prefixIndex >= 0) score = 3 + prefixIndex;\n\t\t\t\telse if (partialIndex >= 0) score = 6 + partialIndex;\n\t\t\t}\n\t\t\treturn { model, selector, score };\n\t\t})\n\t\t.filter((candidate) => Number.isFinite(candidate.score))\n\t\t.sort((a, b) => a.score - b.score || a.selector.localeCompare(b.selector))\n\t\t.slice(0, limit)\n\t\t.map(({ model, selector }) => ({\n\t\t\tprovider: model.provider,\n\t\t\tid: model.id,\n\t\t\tname: model.name || model.id,\n\t\t\tselector,\n\t\t}));\n}\n\n/** Adapt an RlmRunHandler into the typed `rlm.run` kernel host handler. */\nexport function createRlmRunHostHandler(handler: RlmRunHandler): HostRequestHandler {\n\treturn async (payload) => {\n\t\tif (typeof payload.prompt !== \"string\") {\n\t\t\tthrow new Error(\"rlm.run prompt must be a string\");\n\t\t}\n\t\tconst kwargs = isRecord(payload.kwargs) ? payload.kwargs : {};\n\t\tconst cellSourceCode = typeof payload.cellSourceCode === \"string\" ? payload.cellSourceCode : undefined;\n\t\tconst result = await handler({\n\t\t\tprompt: payload.prompt,\n\t\t\tkwargs,\n\t\t\tcellSourceCode,\n\t\t});\n\t\treturn result as unknown as Record<string, unknown>;\n\t};\n}\n\n/** Search a bounded authenticated model catalog without adding it to the system prompt. */\nexport function createRlmFindModelsHostHandler(handler: RlmFindModelsHandler): HostRequestHandler {\n\treturn async (payload) => {\n\t\tif (typeof payload.query !== \"string\") {\n\t\t\tthrow new Error(\"rlm.find_models query must be a string\");\n\t\t}\n\t\tconst limit = payload.limit === undefined ? DEFAULT_RLM_MODEL_SEARCH_LIMIT : payload.limit;\n\t\tif (!Number.isInteger(limit) || (limit as number) < 1 || (limit as number) > MAX_RLM_MODEL_SEARCH_LIMIT) {\n\t\t\tthrow new Error(`rlm.find_models limit must be an integer from 1 to ${MAX_RLM_MODEL_SEARCH_LIMIT}`);\n\t\t}\n\t\treturn { models: (await handler(payload.query, limit as number)).models };\n\t};\n}\n\n/** Expose the current parent session's direct RLM child registry to its kernel. */\nexport function createRlmListSubagentsHostHandler(handler: RlmListSubagentsHandler): HostRequestHandler {\n\treturn async () => {\n\t\tconst { subagents } = await handler();\n\t\treturn { subagents };\n\t};\n}\n\n/** Delete one direct child selected from the current parent session's registry. */\nexport function createRlmDeleteSubagentHostHandler(handler: RlmDeleteSubagentHandler): HostRequestHandler {\n\treturn async (payload) => {\n\t\tif (typeof payload.target !== \"string\" || !payload.target.trim()) {\n\t\t\tthrow new Error(\"rlm.delete_subagent target must be a non-empty string\");\n\t\t}\n\t\tconst { subagent, outcome } = await handler(payload.target.trim());\n\t\treturn outcome === undefined ? { subagent } : { subagent, outcome };\n\t};\n}\n\n/** One live parent's pending setup or resident child. Not a tree-wide reservation. */\nexport interface RlmChildAdmission {\n\treadonly parent: AgentSession;\n\treadonly session: AgentSession | undefined;\n\treadonly settlement: Promise<void>;\n\treadonly pending: boolean;\n\tassertCurrent(): void;\n\tbind(session: AgentSession): void;\n\tbeginSetup(): void;\n\tclaimFactory(): void;\n\tconfirmUnboundCleanup(): void;\n\tsettle(): void;\n}\n\nexport interface RlmSubagentRuntime {\n\tsession: AgentSession;\n}\n\nexport interface CreateRlmSubagentRuntimeOptions {\n\tparentSession: AgentSession;\n\t/** Defined trusted creation options override the inherited explicit parent policy. */\n\trequestTokenBudget?: RequestTokenBudgetOptions;\n\tcontextMode?: \"on\" | \"off\";\n\t/** The same live parent owns this setup. Native factories reserve it when omitted. */\n\tadmission?: RlmChildAdmission;\n\tid: string;\n\tprompt: string;\n\tsessionName: string;\n\tsessionDir: string;\n\tmodel: Model<any>;\n\tthinkingLevel: ThinkingLevel;\n\tserviceTier: ServiceTier;\n\tscopedModels: Array<{ model: Model<any>; thinkingLevel?: ThinkingLevel }>;\n\tactiveToolNames: string[];\n\tallowedToolNames?: string[];\n\tcustomTools: ToolDefinition[];\n\tincludeGoals: boolean;\n\tincludeCompactSkill: boolean;\n\trlmDepth: number;\n\trlmMaxDepth: number;\n\trlmParentNodeId: string;\n\t/** Request ID of the parent model call whose tool call caused this spawn. */\n\tspawnedByRequestId?: string;\n\t/** Source of the Python cell that spawned this subagent, for display. */\n\tspawnCode?: string;\n\t/** Publish the session to the parent before a host makes the runtime addressable. */\n\tonSessionPublished?: (session: AgentSession) => void;\n}\n\nexport interface SubagentRuntimeHost {\n\tcreateRlmSubagentRuntime(options: CreateRlmSubagentRuntimeOptions): Promise<RlmSubagentRuntime>;\n\t/** Persist host-owned completion before the child becomes passivation-eligible. */\n\tcompleteRlmSubagentRuntime?(childId: string, session: AgentSession): boolean;\n\t/** Release a host-owned child after its detached initial task settles. */\n\treleaseRlmSubagentRuntime?: (\n\t\truntime: RlmSubagentRuntime,\n\t\toptions: CreateRlmSubagentRuntimeOptions,\n\t\tstatus: \"done\" | \"error\" | \"cancelled\",\n\t) => Promise<void>;\n\t/** Close or remove the host-owned child; session is absent when a persisted child is still passive. */\n\tdeleteRlmSubagentRuntime(childId: string, session?: AgentSession): Promise<void>;\n\tdisposeRlmSubagentRuntimes?(): Promise<void>;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"rlm-runtime.d.ts","sourceRoot":"","sources":["../../src/core/rlm-runtime.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ThinkingLevel } from \"@ponythewhite/base-context-agent\";\nimport type { Api, Model, RequestTokenBudgetOptions, ServiceTier } from \"@ponythewhite/base-context-ai\";\nimport type { AgentSession } from \"./agent-session.js\";\nimport type { ToolDefinition } from \"./extensions/index.js\";\nimport type { HostRequestHandler } from \"./kernel/index.js\";\nimport { THINKING_LEVELS } from \"./thinking-levels.js\";\n\n/** Request emitted by `rlm.run`; cellSourceCode preserves the spawning cell for display. */\nexport interface RlmRunRequest {\n\tprompt: string;\n\tkwargs: Record<string, unknown>;\n\tcellSourceCode?: string;\n}\n\nexport interface RlmSpawnHandle {\n\trlm_child_id: string;\n\tname: string;\n\tsession_dir: string;\n\tmodel: string;\n}\n\nexport type RlmSubagentRegistryStatus = \"running\" | \"completed\" | \"error\";\n\nexport interface RlmSubagentRegistryEntry {\n\trlm_child_id: string;\n\tactive_session_id: string | null;\n\tsession_id: string | null;\n\tsession_name: string;\n\tsession_dir: string;\n\tstatus: RlmSubagentRegistryStatus;\n}\n\nexport interface RlmListSubagentsResult {\n\tsubagents: RlmSubagentRegistryEntry[];\n}\n\nexport interface RlmDeleteSubagentResult {\n\tsubagent: RlmSubagentRegistryEntry;\n\toutcome?: \"deleted\" | \"skipped_running\";\n}\n\nexport interface RlmModelMatch {\n\tprovider: string;\n\tid: string;\n\tname: string;\n\tselector: string;\n}\n\nexport interface RlmFindModelsResult {\n\tmodels: RlmModelMatch[];\n}\n\nexport type RlmRunHandler = (request: RlmRunRequest) => Promise<Record<string, unknown>>;\nexport type RlmListSubagentsHandler = () => RlmListSubagentsResult | Promise<RlmListSubagentsResult>;\nexport type RlmDeleteSubagentHandler = (target: string) => Promise<RlmDeleteSubagentResult>;\nexport type RlmFindModelsHandler = (query: string, limit: number) => RlmFindModelsResult | Promise<RlmFindModelsResult>;\n\nconst RLM_SUBAGENT_SESSION_NAME_MAX_LENGTH = 64;\nexport const DEFAULT_RLM_MODEL_SEARCH_LIMIT = 8;\nexport const MAX_RLM_MODEL_SEARCH_LIMIT = 20;\n\nexport function normalizeRequestedRlmSubagentSessionName(value: unknown): string | undefined {\n\tif (value === undefined) {\n\t\treturn undefined;\n\t}\n\tif (typeof value !== \"string\") {\n\t\tthrow new Error(\"rlm.run name must be a string\");\n\t}\n\tconst name = value.trim();\n\tif (!name) {\n\t\tthrow new Error(\"rlm.run name must not be empty\");\n\t}\n\tif (name.length > RLM_SUBAGENT_SESSION_NAME_MAX_LENGTH) {\n\t\tthrow new Error(`rlm.run name must be at most ${RLM_SUBAGENT_SESSION_NAME_MAX_LENGTH} characters`);\n\t}\n\treturn name;\n}\n\nexport function normalizeRequestedRlmSubagentThinkingLevel(value: unknown): ThinkingLevel | undefined {\n\tif (value === undefined) {\n\t\treturn undefined;\n\t}\n\tif (typeof value !== \"string\") {\n\t\tthrow new Error(\"rlm.run thinking must be a string\");\n\t}\n\tconst level = value.trim().toLowerCase();\n\tif (!THINKING_LEVELS.includes(level as ThinkingLevel)) {\n\t\tthrow new Error(`rlm.run thinking must be one of: ${THINKING_LEVELS.join(\", \")}`);\n\t}\n\treturn level as ThinkingLevel;\n}\n\nexport function normalizeRequestedRlmSubagentModel(value: unknown): string | undefined {\n\tif (value === undefined) {\n\t\treturn undefined;\n\t}\n\tif (typeof value !== \"string\") {\n\t\tthrow new Error(\"rlm.run model must be a string\");\n\t}\n\tconst model = value.trim();\n\tif (!model) {\n\t\tthrow new Error(\"rlm.run model must not be empty\");\n\t}\n\treturn model;\n}\n\n/** Create a readable, collision-resistant default name usable as an agent-message selector. */\nexport function createDefaultRlmSubagentSessionName(prompt: string, childId: string): string {\n\tconst promptSlug = prompt\n\t\t.normalize(\"NFKD\")\n\t\t.replace(/[\\u0300-\\u036f]/g, \"\")\n\t\t.toLowerCase()\n\t\t.replace(/[^a-z0-9]+/g, \"-\")\n\t\t.replace(/^-+|-+$/g, \"\");\n\tconst idSuffix =\n\t\tchildId\n\t\t\t.replace(/^sub-/, \"\")\n\t\t\t.replace(/[^A-Za-z0-9]+/g, \"\")\n\t\t\t.slice(-8) || \"child\";\n\tconst fixedLength = \"subagent--\".length + idSuffix.length;\n\tconst promptPart = (promptSlug || \"worker\")\n\t\t.slice(0, Math.max(1, RLM_SUBAGENT_SESSION_NAME_MAX_LENGTH - fixedLength))\n\t\t.replace(/-+$/g, \"\");\n\treturn `subagent-${promptPart || \"worker\"}-${idSuffix}`;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n\treturn typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction normalizeModelSearchText(value: string): string {\n\treturn value.toLowerCase().replace(/[^a-z0-9]+/g, \"\");\n}\n\nexport function findRlmModelMatches(query: string, models: Model<Api>[], limit: number): RlmModelMatch[] {\n\tconst normalizedQuery = normalizeModelSearchText(query.trim());\n\treturn models\n\t\t.map((model) => {\n\t\t\tconst selector = `${model.provider}/${model.id}`;\n\t\t\tconst fields = [selector, model.id, model.name || model.id];\n\t\t\tconst normalizedFields = fields.map(normalizeModelSearchText);\n\t\t\tlet score = normalizedQuery ? Number.POSITIVE_INFINITY : 0;\n\t\t\tif (normalizedQuery) {\n\t\t\t\tconst exactIndex = normalizedFields.indexOf(normalizedQuery);\n\t\t\t\tconst prefixIndex = normalizedFields.findIndex((field) => field.startsWith(normalizedQuery));\n\t\t\t\tconst partialIndex = normalizedFields.findIndex((field) => field.includes(normalizedQuery));\n\t\t\t\tif (exactIndex >= 0) score = exactIndex;\n\t\t\t\telse if (prefixIndex >= 0) score = 3 + prefixIndex;\n\t\t\t\telse if (partialIndex >= 0) score = 6 + partialIndex;\n\t\t\t}\n\t\t\treturn { model, selector, score };\n\t\t})\n\t\t.filter((candidate) => Number.isFinite(candidate.score))\n\t\t.sort((a, b) => a.score - b.score || a.selector.localeCompare(b.selector))\n\t\t.slice(0, limit)\n\t\t.map(({ model, selector }) => ({\n\t\t\tprovider: model.provider,\n\t\t\tid: model.id,\n\t\t\tname: model.name || model.id,\n\t\t\tselector,\n\t\t}));\n}\n\n/** Adapt an RlmRunHandler into the typed `rlm.run` kernel host handler. */\nexport function createRlmRunHostHandler(handler: RlmRunHandler): HostRequestHandler {\n\treturn async (payload) => {\n\t\tif (typeof payload.prompt !== \"string\") {\n\t\t\tthrow new Error(\"rlm.run prompt must be a string\");\n\t\t}\n\t\tconst kwargs = isRecord(payload.kwargs) ? payload.kwargs : {};\n\t\tconst cellSourceCode = typeof payload.cellSourceCode === \"string\" ? payload.cellSourceCode : undefined;\n\t\tconst result = await handler({\n\t\t\tprompt: payload.prompt,\n\t\t\tkwargs,\n\t\t\tcellSourceCode,\n\t\t});\n\t\treturn result as unknown as Record<string, unknown>;\n\t};\n}\n\n/** Search a bounded authenticated model catalog without adding it to the system prompt. */\nexport function createRlmFindModelsHostHandler(handler: RlmFindModelsHandler): HostRequestHandler {\n\treturn async (payload) => {\n\t\tif (typeof payload.query !== \"string\") {\n\t\t\tthrow new Error(\"rlm.find_models query must be a string\");\n\t\t}\n\t\tconst limit = payload.limit === undefined ? DEFAULT_RLM_MODEL_SEARCH_LIMIT : payload.limit;\n\t\tif (!Number.isInteger(limit) || (limit as number) < 1 || (limit as number) > MAX_RLM_MODEL_SEARCH_LIMIT) {\n\t\t\tthrow new Error(`rlm.find_models limit must be an integer from 1 to ${MAX_RLM_MODEL_SEARCH_LIMIT}`);\n\t\t}\n\t\treturn { models: (await handler(payload.query, limit as number)).models };\n\t};\n}\n\n/** Expose the current parent session's direct RLM child registry to its kernel. */\nexport function createRlmListSubagentsHostHandler(handler: RlmListSubagentsHandler): HostRequestHandler {\n\treturn async () => {\n\t\tconst { subagents } = await handler();\n\t\treturn { subagents };\n\t};\n}\n\n/** Delete one direct child selected from the current parent session's registry. */\nexport function createRlmDeleteSubagentHostHandler(handler: RlmDeleteSubagentHandler): HostRequestHandler {\n\treturn async (payload) => {\n\t\tif (typeof payload.target !== \"string\" || !payload.target.trim()) {\n\t\t\tthrow new Error(\"rlm.delete_subagent target must be a non-empty string\");\n\t\t}\n\t\tconst { subagent, outcome } = await handler(payload.target.trim());\n\t\treturn outcome === undefined ? { subagent } : { subagent, outcome };\n\t};\n}\n\n/** A parent-owned setup or resident child, charged to its root-family capacity. */\nexport interface RlmChildAdmission {\n\treadonly parent: AgentSession;\n\treadonly session: AgentSession | undefined;\n\treadonly settlement: Promise<void>;\n\treadonly pending: boolean;\n\tassertCurrent(): void;\n\tbind(session: AgentSession): void;\n\tbeginSetup(): void;\n\tclaimFactory(): void;\n\tconfirmUnboundCleanup(): Promise<void>;\n\tsettle(): Promise<void>;\n}\n\nexport interface RlmSubagentRuntime {\n\tsession: AgentSession;\n}\n\nexport interface CreateRlmSubagentRuntimeOptions {\n\tparentSession: AgentSession;\n\t/** Defined trusted creation options override the inherited explicit parent policy. */\n\trequestTokenBudget?: RequestTokenBudgetOptions;\n\tcontextMode?: \"on\" | \"off\";\n\t/** The same live parent owns this setup. Native factories reserve it when omitted. */\n\tadmission?: RlmChildAdmission;\n\tid: string;\n\tprompt: string;\n\tsessionName: string;\n\tsessionDir: string;\n\tmodel: Model<any>;\n\tthinkingLevel: ThinkingLevel;\n\tserviceTier: ServiceTier;\n\tscopedModels: Array<{ model: Model<any>; thinkingLevel?: ThinkingLevel }>;\n\tactiveToolNames: string[];\n\tallowedToolNames?: string[];\n\tcustomTools: ToolDefinition[];\n\tincludeGoals: boolean;\n\tincludeCompactSkill: boolean;\n\trlmDepth: number;\n\trlmMaxDepth: number;\n\trlmParentNodeId: string;\n\t/** Request ID of the parent model call whose tool call caused this spawn. */\n\tspawnedByRequestId?: string;\n\t/** Source of the Python cell that spawned this subagent, for display. */\n\tspawnCode?: string;\n\t/** Publish the session to the parent before a host makes the runtime addressable. */\n\tonSessionPublished?: (session: AgentSession) => void;\n}\n\nexport interface SubagentRuntimeHost {\n\tcreateRlmSubagentRuntime(options: CreateRlmSubagentRuntimeOptions): Promise<RlmSubagentRuntime>;\n\t/** Persist host-owned completion before the child becomes passivation-eligible. */\n\tcompleteRlmSubagentRuntime?(childId: string, session: AgentSession): boolean;\n\t/** Release a host-owned child after its detached initial task settles. */\n\treleaseRlmSubagentRuntime?: (\n\t\truntime: RlmSubagentRuntime,\n\t\toptions: CreateRlmSubagentRuntimeOptions,\n\t\tstatus: \"done\" | \"error\" | \"cancelled\",\n\t) => Promise<void>;\n\t/** Close or remove the host-owned child; session is absent when a persisted child is still passive. */\n\tdeleteRlmSubagentRuntime(childId: string, session?: AgentSession): Promise<void>;\n\tdisposeRlmSubagentRuntimes?(): Promise<void>;\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rlm-runtime.js","sourceRoot":"","sources":["../../src/core/rlm-runtime.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ThinkingLevel } from \"@ponythewhite/base-context-agent\";\nimport type { Api, Model, RequestTokenBudgetOptions, ServiceTier } from \"@ponythewhite/base-context-ai\";\nimport type { AgentSession } from \"./agent-session.js\";\nimport type { ToolDefinition } from \"./extensions/index.js\";\nimport type { HostRequestHandler } from \"./kernel/index.js\";\nimport { THINKING_LEVELS } from \"./thinking-levels.js\";\n\n/** Request emitted by `rlm.run`; cellSourceCode preserves the spawning cell for display. */\nexport interface RlmRunRequest {\n\tprompt: string;\n\tkwargs: Record<string, unknown>;\n\tcellSourceCode?: string;\n}\n\nexport interface RlmSpawnHandle {\n\trlm_child_id: string;\n\tname: string;\n\tsession_dir: string;\n\tmodel: string;\n}\n\nexport type RlmSubagentRegistryStatus = \"running\" | \"completed\" | \"error\";\n\nexport interface RlmSubagentRegistryEntry {\n\trlm_child_id: string;\n\tactive_session_id: string | null;\n\tsession_id: string | null;\n\tsession_name: string;\n\tsession_dir: string;\n\tstatus: RlmSubagentRegistryStatus;\n}\n\nexport interface RlmListSubagentsResult {\n\tsubagents: RlmSubagentRegistryEntry[];\n}\n\nexport interface RlmDeleteSubagentResult {\n\tsubagent: RlmSubagentRegistryEntry;\n\toutcome?: \"deleted\" | \"skipped_running\";\n}\n\nexport interface RlmModelMatch {\n\tprovider: string;\n\tid: string;\n\tname: string;\n\tselector: string;\n}\n\nexport interface RlmFindModelsResult {\n\tmodels: RlmModelMatch[];\n}\n\nexport type RlmRunHandler = (request: RlmRunRequest) => Promise<Record<string, unknown>>;\nexport type RlmListSubagentsHandler = () => RlmListSubagentsResult | Promise<RlmListSubagentsResult>;\nexport type RlmDeleteSubagentHandler = (target: string) => Promise<RlmDeleteSubagentResult>;\nexport type RlmFindModelsHandler = (query: string, limit: number) => RlmFindModelsResult | Promise<RlmFindModelsResult>;\n\nconst RLM_SUBAGENT_SESSION_NAME_MAX_LENGTH = 64;\nexport const DEFAULT_RLM_MODEL_SEARCH_LIMIT = 8;\nexport const MAX_RLM_MODEL_SEARCH_LIMIT = 20;\n\nexport function normalizeRequestedRlmSubagentSessionName(value: unknown): string | undefined {\n\tif (value === undefined) {\n\t\treturn undefined;\n\t}\n\tif (typeof value !== \"string\") {\n\t\tthrow new Error(\"rlm.run name must be a string\");\n\t}\n\tconst name = value.trim();\n\tif (!name) {\n\t\tthrow new Error(\"rlm.run name must not be empty\");\n\t}\n\tif (name.length > RLM_SUBAGENT_SESSION_NAME_MAX_LENGTH) {\n\t\tthrow new Error(`rlm.run name must be at most ${RLM_SUBAGENT_SESSION_NAME_MAX_LENGTH} characters`);\n\t}\n\treturn name;\n}\n\nexport function normalizeRequestedRlmSubagentThinkingLevel(value: unknown): ThinkingLevel | undefined {\n\tif (value === undefined) {\n\t\treturn undefined;\n\t}\n\tif (typeof value !== \"string\") {\n\t\tthrow new Error(\"rlm.run thinking must be a string\");\n\t}\n\tconst level = value.trim().toLowerCase();\n\tif (!THINKING_LEVELS.includes(level as ThinkingLevel)) {\n\t\tthrow new Error(`rlm.run thinking must be one of: ${THINKING_LEVELS.join(\", \")}`);\n\t}\n\treturn level as ThinkingLevel;\n}\n\nexport function normalizeRequestedRlmSubagentModel(value: unknown): string | undefined {\n\tif (value === undefined) {\n\t\treturn undefined;\n\t}\n\tif (typeof value !== \"string\") {\n\t\tthrow new Error(\"rlm.run model must be a string\");\n\t}\n\tconst model = value.trim();\n\tif (!model) {\n\t\tthrow new Error(\"rlm.run model must not be empty\");\n\t}\n\treturn model;\n}\n\n/** Create a readable, collision-resistant default name usable as an agent-message selector. */\nexport function createDefaultRlmSubagentSessionName(prompt: string, childId: string): string {\n\tconst promptSlug = prompt\n\t\t.normalize(\"NFKD\")\n\t\t.replace(/[\\u0300-\\u036f]/g, \"\")\n\t\t.toLowerCase()\n\t\t.replace(/[^a-z0-9]+/g, \"-\")\n\t\t.replace(/^-+|-+$/g, \"\");\n\tconst idSuffix =\n\t\tchildId\n\t\t\t.replace(/^sub-/, \"\")\n\t\t\t.replace(/[^A-Za-z0-9]+/g, \"\")\n\t\t\t.slice(-8) || \"child\";\n\tconst fixedLength = \"subagent--\".length + idSuffix.length;\n\tconst promptPart = (promptSlug || \"worker\")\n\t\t.slice(0, Math.max(1, RLM_SUBAGENT_SESSION_NAME_MAX_LENGTH - fixedLength))\n\t\t.replace(/-+$/g, \"\");\n\treturn `subagent-${promptPart || \"worker\"}-${idSuffix}`;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n\treturn typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction normalizeModelSearchText(value: string): string {\n\treturn value.toLowerCase().replace(/[^a-z0-9]+/g, \"\");\n}\n\nexport function findRlmModelMatches(query: string, models: Model<Api>[], limit: number): RlmModelMatch[] {\n\tconst normalizedQuery = normalizeModelSearchText(query.trim());\n\treturn models\n\t\t.map((model) => {\n\t\t\tconst selector = `${model.provider}/${model.id}`;\n\t\t\tconst fields = [selector, model.id, model.name || model.id];\n\t\t\tconst normalizedFields = fields.map(normalizeModelSearchText);\n\t\t\tlet score = normalizedQuery ? Number.POSITIVE_INFINITY : 0;\n\t\t\tif (normalizedQuery) {\n\t\t\t\tconst exactIndex = normalizedFields.indexOf(normalizedQuery);\n\t\t\t\tconst prefixIndex = normalizedFields.findIndex((field) => field.startsWith(normalizedQuery));\n\t\t\t\tconst partialIndex = normalizedFields.findIndex((field) => field.includes(normalizedQuery));\n\t\t\t\tif (exactIndex >= 0) score = exactIndex;\n\t\t\t\telse if (prefixIndex >= 0) score = 3 + prefixIndex;\n\t\t\t\telse if (partialIndex >= 0) score = 6 + partialIndex;\n\t\t\t}\n\t\t\treturn { model, selector, score };\n\t\t})\n\t\t.filter((candidate) => Number.isFinite(candidate.score))\n\t\t.sort((a, b) => a.score - b.score || a.selector.localeCompare(b.selector))\n\t\t.slice(0, limit)\n\t\t.map(({ model, selector }) => ({\n\t\t\tprovider: model.provider,\n\t\t\tid: model.id,\n\t\t\tname: model.name || model.id,\n\t\t\tselector,\n\t\t}));\n}\n\n/** Adapt an RlmRunHandler into the typed `rlm.run` kernel host handler. */\nexport function createRlmRunHostHandler(handler: RlmRunHandler): HostRequestHandler {\n\treturn async (payload) => {\n\t\tif (typeof payload.prompt !== \"string\") {\n\t\t\tthrow new Error(\"rlm.run prompt must be a string\");\n\t\t}\n\t\tconst kwargs = isRecord(payload.kwargs) ? payload.kwargs : {};\n\t\tconst cellSourceCode = typeof payload.cellSourceCode === \"string\" ? payload.cellSourceCode : undefined;\n\t\tconst result = await handler({\n\t\t\tprompt: payload.prompt,\n\t\t\tkwargs,\n\t\t\tcellSourceCode,\n\t\t});\n\t\treturn result as unknown as Record<string, unknown>;\n\t};\n}\n\n/** Search a bounded authenticated model catalog without adding it to the system prompt. */\nexport function createRlmFindModelsHostHandler(handler: RlmFindModelsHandler): HostRequestHandler {\n\treturn async (payload) => {\n\t\tif (typeof payload.query !== \"string\") {\n\t\t\tthrow new Error(\"rlm.find_models query must be a string\");\n\t\t}\n\t\tconst limit = payload.limit === undefined ? DEFAULT_RLM_MODEL_SEARCH_LIMIT : payload.limit;\n\t\tif (!Number.isInteger(limit) || (limit as number) < 1 || (limit as number) > MAX_RLM_MODEL_SEARCH_LIMIT) {\n\t\t\tthrow new Error(`rlm.find_models limit must be an integer from 1 to ${MAX_RLM_MODEL_SEARCH_LIMIT}`);\n\t\t}\n\t\treturn { models: (await handler(payload.query, limit as number)).models };\n\t};\n}\n\n/** Expose the current parent session's direct RLM child registry to its kernel. */\nexport function createRlmListSubagentsHostHandler(handler: RlmListSubagentsHandler): HostRequestHandler {\n\treturn async () => {\n\t\tconst { subagents } = await handler();\n\t\treturn { subagents };\n\t};\n}\n\n/** Delete one direct child selected from the current parent session's registry. */\nexport function createRlmDeleteSubagentHostHandler(handler: RlmDeleteSubagentHandler): HostRequestHandler {\n\treturn async (payload) => {\n\t\tif (typeof payload.target !== \"string\" || !payload.target.trim()) {\n\t\t\tthrow new Error(\"rlm.delete_subagent target must be a non-empty string\");\n\t\t}\n\t\tconst { subagent, outcome } = await handler(payload.target.trim());\n\t\treturn outcome === undefined ? { subagent } : { subagent, outcome };\n\t};\n}\n\n/** One live parent's pending setup or resident child. Not a tree-wide reservation. */\nexport interface RlmChildAdmission {\n\treadonly parent: AgentSession;\n\treadonly session: AgentSession | undefined;\n\treadonly settlement: Promise<void>;\n\treadonly pending: boolean;\n\tassertCurrent(): void;\n\tbind(session: AgentSession): void;\n\tbeginSetup(): void;\n\tclaimFactory(): void;\n\tconfirmUnboundCleanup(): void;\n\tsettle(): void;\n}\n\nexport interface RlmSubagentRuntime {\n\tsession: AgentSession;\n}\n\nexport interface CreateRlmSubagentRuntimeOptions {\n\tparentSession: AgentSession;\n\t/** Defined trusted creation options override the inherited explicit parent policy. */\n\trequestTokenBudget?: RequestTokenBudgetOptions;\n\tcontextMode?: \"on\" | \"off\";\n\t/** The same live parent owns this setup. Native factories reserve it when omitted. */\n\tadmission?: RlmChildAdmission;\n\tid: string;\n\tprompt: string;\n\tsessionName: string;\n\tsessionDir: string;\n\tmodel: Model<any>;\n\tthinkingLevel: ThinkingLevel;\n\tserviceTier: ServiceTier;\n\tscopedModels: Array<{ model: Model<any>; thinkingLevel?: ThinkingLevel }>;\n\tactiveToolNames: string[];\n\tallowedToolNames?: string[];\n\tcustomTools: ToolDefinition[];\n\tincludeGoals: boolean;\n\tincludeCompactSkill: boolean;\n\trlmDepth: number;\n\trlmMaxDepth: number;\n\trlmParentNodeId: string;\n\t/** Request ID of the parent model call whose tool call caused this spawn. */\n\tspawnedByRequestId?: string;\n\t/** Source of the Python cell that spawned this subagent, for display. */\n\tspawnCode?: string;\n\t/** Publish the session to the parent before a host makes the runtime addressable. */\n\tonSessionPublished?: (session: AgentSession) => void;\n}\n\nexport interface SubagentRuntimeHost {\n\tcreateRlmSubagentRuntime(options: CreateRlmSubagentRuntimeOptions): Promise<RlmSubagentRuntime>;\n\t/** Persist host-owned completion before the child becomes passivation-eligible. */\n\tcompleteRlmSubagentRuntime?(childId: string, session: AgentSession): boolean;\n\t/** Release a host-owned child after its detached initial task settles. */\n\treleaseRlmSubagentRuntime?: (\n\t\truntime: RlmSubagentRuntime,\n\t\toptions: CreateRlmSubagentRuntimeOptions,\n\t\tstatus: \"done\" | \"error\" | \"cancelled\",\n\t) => Promise<void>;\n\t/** Close or remove the host-owned child; session is absent when a persisted child is still passive. */\n\tdeleteRlmSubagentRuntime(childId: string, session?: AgentSession): Promise<void>;\n\tdisposeRlmSubagentRuntimes?(): Promise<void>;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"rlm-runtime.js","sourceRoot":"","sources":["../../src/core/rlm-runtime.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ThinkingLevel } from \"@ponythewhite/base-context-agent\";\nimport type { Api, Model, RequestTokenBudgetOptions, ServiceTier } from \"@ponythewhite/base-context-ai\";\nimport type { AgentSession } from \"./agent-session.js\";\nimport type { ToolDefinition } from \"./extensions/index.js\";\nimport type { HostRequestHandler } from \"./kernel/index.js\";\nimport { THINKING_LEVELS } from \"./thinking-levels.js\";\n\n/** Request emitted by `rlm.run`; cellSourceCode preserves the spawning cell for display. */\nexport interface RlmRunRequest {\n\tprompt: string;\n\tkwargs: Record<string, unknown>;\n\tcellSourceCode?: string;\n}\n\nexport interface RlmSpawnHandle {\n\trlm_child_id: string;\n\tname: string;\n\tsession_dir: string;\n\tmodel: string;\n}\n\nexport type RlmSubagentRegistryStatus = \"running\" | \"completed\" | \"error\";\n\nexport interface RlmSubagentRegistryEntry {\n\trlm_child_id: string;\n\tactive_session_id: string | null;\n\tsession_id: string | null;\n\tsession_name: string;\n\tsession_dir: string;\n\tstatus: RlmSubagentRegistryStatus;\n}\n\nexport interface RlmListSubagentsResult {\n\tsubagents: RlmSubagentRegistryEntry[];\n}\n\nexport interface RlmDeleteSubagentResult {\n\tsubagent: RlmSubagentRegistryEntry;\n\toutcome?: \"deleted\" | \"skipped_running\";\n}\n\nexport interface RlmModelMatch {\n\tprovider: string;\n\tid: string;\n\tname: string;\n\tselector: string;\n}\n\nexport interface RlmFindModelsResult {\n\tmodels: RlmModelMatch[];\n}\n\nexport type RlmRunHandler = (request: RlmRunRequest) => Promise<Record<string, unknown>>;\nexport type RlmListSubagentsHandler = () => RlmListSubagentsResult | Promise<RlmListSubagentsResult>;\nexport type RlmDeleteSubagentHandler = (target: string) => Promise<RlmDeleteSubagentResult>;\nexport type RlmFindModelsHandler = (query: string, limit: number) => RlmFindModelsResult | Promise<RlmFindModelsResult>;\n\nconst RLM_SUBAGENT_SESSION_NAME_MAX_LENGTH = 64;\nexport const DEFAULT_RLM_MODEL_SEARCH_LIMIT = 8;\nexport const MAX_RLM_MODEL_SEARCH_LIMIT = 20;\n\nexport function normalizeRequestedRlmSubagentSessionName(value: unknown): string | undefined {\n\tif (value === undefined) {\n\t\treturn undefined;\n\t}\n\tif (typeof value !== \"string\") {\n\t\tthrow new Error(\"rlm.run name must be a string\");\n\t}\n\tconst name = value.trim();\n\tif (!name) {\n\t\tthrow new Error(\"rlm.run name must not be empty\");\n\t}\n\tif (name.length > RLM_SUBAGENT_SESSION_NAME_MAX_LENGTH) {\n\t\tthrow new Error(`rlm.run name must be at most ${RLM_SUBAGENT_SESSION_NAME_MAX_LENGTH} characters`);\n\t}\n\treturn name;\n}\n\nexport function normalizeRequestedRlmSubagentThinkingLevel(value: unknown): ThinkingLevel | undefined {\n\tif (value === undefined) {\n\t\treturn undefined;\n\t}\n\tif (typeof value !== \"string\") {\n\t\tthrow new Error(\"rlm.run thinking must be a string\");\n\t}\n\tconst level = value.trim().toLowerCase();\n\tif (!THINKING_LEVELS.includes(level as ThinkingLevel)) {\n\t\tthrow new Error(`rlm.run thinking must be one of: ${THINKING_LEVELS.join(\", \")}`);\n\t}\n\treturn level as ThinkingLevel;\n}\n\nexport function normalizeRequestedRlmSubagentModel(value: unknown): string | undefined {\n\tif (value === undefined) {\n\t\treturn undefined;\n\t}\n\tif (typeof value !== \"string\") {\n\t\tthrow new Error(\"rlm.run model must be a string\");\n\t}\n\tconst model = value.trim();\n\tif (!model) {\n\t\tthrow new Error(\"rlm.run model must not be empty\");\n\t}\n\treturn model;\n}\n\n/** Create a readable, collision-resistant default name usable as an agent-message selector. */\nexport function createDefaultRlmSubagentSessionName(prompt: string, childId: string): string {\n\tconst promptSlug = prompt\n\t\t.normalize(\"NFKD\")\n\t\t.replace(/[\\u0300-\\u036f]/g, \"\")\n\t\t.toLowerCase()\n\t\t.replace(/[^a-z0-9]+/g, \"-\")\n\t\t.replace(/^-+|-+$/g, \"\");\n\tconst idSuffix =\n\t\tchildId\n\t\t\t.replace(/^sub-/, \"\")\n\t\t\t.replace(/[^A-Za-z0-9]+/g, \"\")\n\t\t\t.slice(-8) || \"child\";\n\tconst fixedLength = \"subagent--\".length + idSuffix.length;\n\tconst promptPart = (promptSlug || \"worker\")\n\t\t.slice(0, Math.max(1, RLM_SUBAGENT_SESSION_NAME_MAX_LENGTH - fixedLength))\n\t\t.replace(/-+$/g, \"\");\n\treturn `subagent-${promptPart || \"worker\"}-${idSuffix}`;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n\treturn typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction normalizeModelSearchText(value: string): string {\n\treturn value.toLowerCase().replace(/[^a-z0-9]+/g, \"\");\n}\n\nexport function findRlmModelMatches(query: string, models: Model<Api>[], limit: number): RlmModelMatch[] {\n\tconst normalizedQuery = normalizeModelSearchText(query.trim());\n\treturn models\n\t\t.map((model) => {\n\t\t\tconst selector = `${model.provider}/${model.id}`;\n\t\t\tconst fields = [selector, model.id, model.name || model.id];\n\t\t\tconst normalizedFields = fields.map(normalizeModelSearchText);\n\t\t\tlet score = normalizedQuery ? Number.POSITIVE_INFINITY : 0;\n\t\t\tif (normalizedQuery) {\n\t\t\t\tconst exactIndex = normalizedFields.indexOf(normalizedQuery);\n\t\t\t\tconst prefixIndex = normalizedFields.findIndex((field) => field.startsWith(normalizedQuery));\n\t\t\t\tconst partialIndex = normalizedFields.findIndex((field) => field.includes(normalizedQuery));\n\t\t\t\tif (exactIndex >= 0) score = exactIndex;\n\t\t\t\telse if (prefixIndex >= 0) score = 3 + prefixIndex;\n\t\t\t\telse if (partialIndex >= 0) score = 6 + partialIndex;\n\t\t\t}\n\t\t\treturn { model, selector, score };\n\t\t})\n\t\t.filter((candidate) => Number.isFinite(candidate.score))\n\t\t.sort((a, b) => a.score - b.score || a.selector.localeCompare(b.selector))\n\t\t.slice(0, limit)\n\t\t.map(({ model, selector }) => ({\n\t\t\tprovider: model.provider,\n\t\t\tid: model.id,\n\t\t\tname: model.name || model.id,\n\t\t\tselector,\n\t\t}));\n}\n\n/** Adapt an RlmRunHandler into the typed `rlm.run` kernel host handler. */\nexport function createRlmRunHostHandler(handler: RlmRunHandler): HostRequestHandler {\n\treturn async (payload) => {\n\t\tif (typeof payload.prompt !== \"string\") {\n\t\t\tthrow new Error(\"rlm.run prompt must be a string\");\n\t\t}\n\t\tconst kwargs = isRecord(payload.kwargs) ? payload.kwargs : {};\n\t\tconst cellSourceCode = typeof payload.cellSourceCode === \"string\" ? payload.cellSourceCode : undefined;\n\t\tconst result = await handler({\n\t\t\tprompt: payload.prompt,\n\t\t\tkwargs,\n\t\t\tcellSourceCode,\n\t\t});\n\t\treturn result as unknown as Record<string, unknown>;\n\t};\n}\n\n/** Search a bounded authenticated model catalog without adding it to the system prompt. */\nexport function createRlmFindModelsHostHandler(handler: RlmFindModelsHandler): HostRequestHandler {\n\treturn async (payload) => {\n\t\tif (typeof payload.query !== \"string\") {\n\t\t\tthrow new Error(\"rlm.find_models query must be a string\");\n\t\t}\n\t\tconst limit = payload.limit === undefined ? DEFAULT_RLM_MODEL_SEARCH_LIMIT : payload.limit;\n\t\tif (!Number.isInteger(limit) || (limit as number) < 1 || (limit as number) > MAX_RLM_MODEL_SEARCH_LIMIT) {\n\t\t\tthrow new Error(`rlm.find_models limit must be an integer from 1 to ${MAX_RLM_MODEL_SEARCH_LIMIT}`);\n\t\t}\n\t\treturn { models: (await handler(payload.query, limit as number)).models };\n\t};\n}\n\n/** Expose the current parent session's direct RLM child registry to its kernel. */\nexport function createRlmListSubagentsHostHandler(handler: RlmListSubagentsHandler): HostRequestHandler {\n\treturn async () => {\n\t\tconst { subagents } = await handler();\n\t\treturn { subagents };\n\t};\n}\n\n/** Delete one direct child selected from the current parent session's registry. */\nexport function createRlmDeleteSubagentHostHandler(handler: RlmDeleteSubagentHandler): HostRequestHandler {\n\treturn async (payload) => {\n\t\tif (typeof payload.target !== \"string\" || !payload.target.trim()) {\n\t\t\tthrow new Error(\"rlm.delete_subagent target must be a non-empty string\");\n\t\t}\n\t\tconst { subagent, outcome } = await handler(payload.target.trim());\n\t\treturn outcome === undefined ? { subagent } : { subagent, outcome };\n\t};\n}\n\n/** A parent-owned setup or resident child, charged to its root-family capacity. */\nexport interface RlmChildAdmission {\n\treadonly parent: AgentSession;\n\treadonly session: AgentSession | undefined;\n\treadonly settlement: Promise<void>;\n\treadonly pending: boolean;\n\tassertCurrent(): void;\n\tbind(session: AgentSession): void;\n\tbeginSetup(): void;\n\tclaimFactory(): void;\n\tconfirmUnboundCleanup(): Promise<void>;\n\tsettle(): Promise<void>;\n}\n\nexport interface RlmSubagentRuntime {\n\tsession: AgentSession;\n}\n\nexport interface CreateRlmSubagentRuntimeOptions {\n\tparentSession: AgentSession;\n\t/** Defined trusted creation options override the inherited explicit parent policy. */\n\trequestTokenBudget?: RequestTokenBudgetOptions;\n\tcontextMode?: \"on\" | \"off\";\n\t/** The same live parent owns this setup. Native factories reserve it when omitted. */\n\tadmission?: RlmChildAdmission;\n\tid: string;\n\tprompt: string;\n\tsessionName: string;\n\tsessionDir: string;\n\tmodel: Model<any>;\n\tthinkingLevel: ThinkingLevel;\n\tserviceTier: ServiceTier;\n\tscopedModels: Array<{ model: Model<any>; thinkingLevel?: ThinkingLevel }>;\n\tactiveToolNames: string[];\n\tallowedToolNames?: string[];\n\tcustomTools: ToolDefinition[];\n\tincludeGoals: boolean;\n\tincludeCompactSkill: boolean;\n\trlmDepth: number;\n\trlmMaxDepth: number;\n\trlmParentNodeId: string;\n\t/** Request ID of the parent model call whose tool call caused this spawn. */\n\tspawnedByRequestId?: string;\n\t/** Source of the Python cell that spawned this subagent, for display. */\n\tspawnCode?: string;\n\t/** Publish the session to the parent before a host makes the runtime addressable. */\n\tonSessionPublished?: (session: AgentSession) => void;\n}\n\nexport interface SubagentRuntimeHost {\n\tcreateRlmSubagentRuntime(options: CreateRlmSubagentRuntimeOptions): Promise<RlmSubagentRuntime>;\n\t/** Persist host-owned completion before the child becomes passivation-eligible. */\n\tcompleteRlmSubagentRuntime?(childId: string, session: AgentSession): boolean;\n\t/** Release a host-owned child after its detached initial task settles. */\n\treleaseRlmSubagentRuntime?: (\n\t\truntime: RlmSubagentRuntime,\n\t\toptions: CreateRlmSubagentRuntimeOptions,\n\t\tstatus: \"done\" | \"error\" | \"cancelled\",\n\t) => Promise<void>;\n\t/** Close or remove the host-owned child; session is absent when a persisted child is still passive. */\n\tdeleteRlmSubagentRuntime(childId: string, session?: AgentSession): Promise<void>;\n\tdisposeRlmSubagentRuntimes?(): Promise<void>;\n}\n"]}
|
package/dist/core/sdk.d.ts
CHANGED
|
@@ -24,8 +24,8 @@ export interface CreateAgentSessionOptions extends AgentSessionCreationOptions {
|
|
|
24
24
|
authStorage?: AuthStorage;
|
|
25
25
|
/** Model registry. Default: ModelRegistry.create(authStorage, agentDir/models.json) */
|
|
26
26
|
modelRegistry?: ModelRegistry;
|
|
27
|
-
/** Model to use.
|
|
28
|
-
model?: Model<any
|
|
27
|
+
/** Model to use. Undefined restores a saved explicit choice; null leaves the session unselected. */
|
|
28
|
+
model?: Model<any> | null;
|
|
29
29
|
/** Thinking level. Default: from settings, else 'medium' (clamped to model capabilities) */
|
|
30
30
|
thinkingLevel?: ThinkingLevel;
|
|
31
31
|
/** Models available for cycling (Ctrl+P in interactive mode) */
|
|
@@ -72,7 +72,7 @@ export interface CreateAgentSessionResult {
|
|
|
72
72
|
session: AgentSession;
|
|
73
73
|
/** Extensions result (for UI context setup in interactive mode) */
|
|
74
74
|
extensionsResult: LoadExtensionsResult;
|
|
75
|
-
/**
|
|
75
|
+
/** Diagnostic when the selected session or saved model cannot be used. */
|
|
76
76
|
modelFallbackMessage?: string;
|
|
77
77
|
}
|
|
78
78
|
export type { AgentSessionRuntimeConfig } from "./agent-session-config.js";
|
|
@@ -80,6 +80,7 @@ export * from "./agent-session-runtime.js";
|
|
|
80
80
|
export type { AgentSessionCreationOptions } from "./agent-session-services.js";
|
|
81
81
|
export type { ExtensionAPI, ExtensionCommandContext, ExtensionContext, ExtensionFactory, SlashCommandInfo, SlashCommandSource, ToolDefinition, } from "./extensions/index.js";
|
|
82
82
|
export type { PromptTemplate } from "./prompt-templates.js";
|
|
83
|
+
export type { RlmMaxSubagentsStatus, RlmRootAdmission, RlmSubagentCapacity, RlmSubagentCapacityReservation, } from "./rlm-max-subagents.js";
|
|
83
84
|
export type { CreateRlmSubagentRuntimeOptions, RlmChildAdmission, RlmSubagentRuntime, SubagentRuntimeHost, } from "./rlm-runtime.js";
|
|
84
85
|
export type { Skill } from "./skills.js";
|
|
85
86
|
export type { Tool } from "./tools/index.js";
|
package/dist/core/sdk.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sdk.d.ts","sourceRoot":"","sources":["../../src/core/sdk.ts"],"names":[],"mappings":"AACA,OAAO,EAA4B,KAAK,iBAAiB,EAAE,KAAK,aAAa,EAAE,MAAM,kCAAkC,CAAC;AACxH,OAAO,EAAoC,KAAK,KAAK,EAAoB,MAAM,+BAA+B,CAAC;AAE/G,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,6BAA6B,CAAC;AAE/E,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AAE7D,OAAO,KAAK,EAAmB,oBAAoB,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAEtH,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAElD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEpD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAG3D,OAAO,EAAwB,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAC5E,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAExD,OAAO,EACN,cAAc,EACd,cAAc,EACd,iBAAiB,EACjB,sBAAsB,EACtB,qBAAqB,EACrB,MAAM,kBAAkB,CAAC;AAE1B,MAAM,WAAW,yBAA0B,SAAQ,2BAA2B;IAC7E,4EAA4E;IAC5E,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,wDAAwD;IACxD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB;;;;OAIG;IACH,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,uFAAuF;IACvF,aAAa,CAAC,EAAE,aAAa,CAAC;IAE9B,iEAAiE;IACjE,KAAK,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC;IACnB,4FAA4F;IAC5F,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B,gEAAgE;IAChE,YAAY,CAAC,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC;QAAC,aAAa,CAAC,EAAE,aAAa,CAAA;KAAE,CAAC,CAAC;IAE3E;;;;;;OAMG;IACH,OAAO,CAAC,EAAE,KAAK,GAAG,SAAS,CAAC;IAC5B;;;;;;OAMG;IACH,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,gEAAgE;IAChE,WAAW,CAAC,EAAE,cAAc,EAAE,CAAC;IAE/B,oEAAoE;IACpE,cAAc,CAAC,EAAE,cAAc,CAAC;IAEhC,8EAA8E;IAC9E,UAAU,CAAC,EAAE,UAAU,CAAC;IAExB,2DAA2D;IAC3D,cAAc,CAAC,EAAE,cAAc,CAAC;IAEhC,uEAAuE;IACvE,sBAAsB,CAAC,EAAE,iBAAiB,CAAC;IAC3C,uEAAuE;IACvE,eAAe,CAAC,EAAE,eAAe,CAAC;IAClC,kEAAkE;IAClE,iBAAiB,CAAC,EAAE,iBAAiB,CAAC;IACtC,gDAAgD;IAChD,UAAU,CAAC,EAAE,qBAAqB,CAAC;CACnC;AAED,qCAAqC;AACrC,MAAM,WAAW,wBAAwB;IACxC,0BAA0B;IAC1B,OAAO,EAAE,YAAY,CAAC;IACtB,mEAAmE;IACnE,gBAAgB,EAAE,oBAAoB,CAAC;IACvC,wEAAwE;IACxE,oBAAoB,CAAC,EAAE,MAAM,CAAC;CAC9B;AAED,YAAY,EAAE,yBAAyB,EAAE,MAAM,2BAA2B,CAAC;AAC3E,cAAc,4BAA4B,CAAC;AAC3C,YAAY,EAAE,2BAA2B,EAAE,MAAM,6BAA6B,CAAC;AAC/E,YAAY,EACX,YAAY,EACZ,uBAAuB,EACvB,gBAAgB,EAChB,gBAAgB,EAChB,gBAAgB,EAChB,kBAAkB,EAClB,cAAc,GACd,MAAM,uBAAuB,CAAC;AAC/B,YAAY,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAC5D,YAAY,EACX,+BAA+B,EAC/B,iBAAiB,EACjB,kBAAkB,EAClB,mBAAmB,GACnB,MAAM,kBAAkB,CAAC;AAC1B,YAAY,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AACzC,YAAY,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAE7C,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,iBAAiB,EAAE,sBAAsB,EAAE,qBAAqB,EAAE,CAAC;AAM5G;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AACH,wBAAsB,kBAAkB,CAAC,OAAO,GAAE,yBAA8B,GAAG,OAAO,CAAC,wBAAwB,CAAC,CAwRnH","sourcesContent":["import { join } from \"node:path\";\nimport { Agent, type AgentMessage, type AgentOutputLimits, type ThinkingLevel } from \"@ponythewhite/base-context-agent\";\nimport { clampThinkingLevel, type Message, type Model, supportsFastMode } from \"@ponythewhite/base-context-ai\";\nimport { getAgentDir } from \"../config.js\";\nimport { AgentSession } from \"./agent-session.js\";\nimport type { AgentSessionCreationOptions } from \"./agent-session-services.js\";\nimport { formatNoModelsAvailableMessage } from \"./auth-guidance.js\";\nimport { AuthStorage } from \"./auth-storage.js\";\nimport type { AgentAutonomousConfig } from \"./autonomous.js\";\nimport { DEFAULT_THINKING_LEVEL } from \"./defaults.js\";\nimport type { ExtensionRunner, LoadExtensionsResult, SessionStartEvent, ToolDefinition } from \"./extensions/index.js\";\nimport { createNativeInferenceStream } from \"./inference-coordinator.js\";\nimport { McpManager } from \"./mcp/mcp-manager.js\";\nimport { convertToLlm } from \"./messages.js\";\nimport { ModelRegistry } from \"./model-registry.js\";\nimport { findInitialModel } from \"./model-resolver.js\";\nimport type { ResourceLoader } from \"./resource-loader.js\";\nimport { DefaultResourceLoader } from \"./resource-loader.js\";\nimport { readSessionBootstrap } from \"./session-bootstrap.js\";\nimport { getDefaultSessionDir, SessionManager } from \"./session-manager.js\";\nimport { SettingsManager } from \"./settings-manager.js\";\nimport { time } from \"./timings.js\";\nimport {\n\tcreateBashTool,\n\tcreateEditTool,\n\tcreateIpythonTool,\n\tcreatePrimeContextTool,\n\twithFileMutationQueue,\n} from \"./tools/index.js\";\n\nexport interface CreateAgentSessionOptions extends AgentSessionCreationOptions {\n\t/** Working directory for project-local discovery. Default: process.cwd() */\n\tcwd?: string;\n\t/** Global config directory. Default: ~/.base-context */\n\tagentDir?: string;\n\n\t/** Auth storage for credentials. Default: AuthStorage.create(agentDir/auth.json).\n\t * Existing host Codex subscriptions can be injected with\n\t * AuthStorage.fromStorage(readOnlyBackend, { existingOpenAICodexSubscription: true }).\n\t * This retains the built-in owned dispatcher; it does not enable OAuth login/refresh.\n\t */\n\tauthStorage?: AuthStorage;\n\t/** Model registry. Default: ModelRegistry.create(authStorage, agentDir/models.json) */\n\tmodelRegistry?: ModelRegistry;\n\n\t/** Model to use. Default: from settings, else first available */\n\tmodel?: Model<any>;\n\t/** Thinking level. Default: from settings, else 'medium' (clamped to model capabilities) */\n\tthinkingLevel?: ThinkingLevel;\n\t/** Models available for cycling (Ctrl+P in interactive mode) */\n\tscopedModels?: Array<{ model: Model<any>; thinkingLevel?: ThinkingLevel }>;\n\n\t/**\n\t * Optional default tool suppression mode when no explicit allowlist is provided.\n\t *\n\t * - \"all\": start with no tools enabled\n\t * - \"builtin\": disable the default built-in tools (ipython and prime_context)\n\t * but keep extension/custom tools enabled\n\t */\n\tnoTools?: \"all\" | \"builtin\";\n\t/**\n\t * Optional allowlist of tool names.\n\t *\n\t * When omitted, Base Context enables the default built-in tools (ipython and prime_context)\n\t * and leaves extension/custom tools enabled unless `noTools` changes that default.\n\t * When provided, only the listed tool names are enabled.\n\t */\n\ttools?: string[];\n\t/** Custom tools to register (in addition to built-in tools). */\n\tcustomTools?: ToolDefinition[];\n\n\t/** Resource loader. When omitted, DefaultResourceLoader is used. */\n\tresourceLoader?: ResourceLoader;\n\n\t/** MCP integration manager. When omitted, MCP host handlers are not wired. */\n\tmcpManager?: McpManager;\n\n\t/** Session manager. Default: SessionManager.create(cwd) */\n\tsessionManager?: SessionManager;\n\n\t/** Override complete native invocation output limits from settings. */\n\tinvocationOutputLimits?: AgentOutputLimits;\n\t/** Settings manager. Default: SettingsManager.create(cwd, agentDir) */\n\tsettingsManager?: SettingsManager;\n\t/** Session start event metadata for extension runtime startup. */\n\tsessionStartEvent?: SessionStartEvent;\n\t/** Host-side autonomous continuation policy. */\n\tautonomous?: AgentAutonomousConfig;\n}\n\n/** Result from createAgentSession */\nexport interface CreateAgentSessionResult {\n\t/** The created session */\n\tsession: AgentSession;\n\t/** Extensions result (for UI context setup in interactive mode) */\n\textensionsResult: LoadExtensionsResult;\n\t/** Warning if session was restored with a different model than saved */\n\tmodelFallbackMessage?: string;\n}\n\nexport type { AgentSessionRuntimeConfig } from \"./agent-session-config.js\";\nexport * from \"./agent-session-runtime.js\";\nexport type { AgentSessionCreationOptions } from \"./agent-session-services.js\";\nexport type {\n\tExtensionAPI,\n\tExtensionCommandContext,\n\tExtensionContext,\n\tExtensionFactory,\n\tSlashCommandInfo,\n\tSlashCommandSource,\n\tToolDefinition,\n} from \"./extensions/index.js\";\nexport type { PromptTemplate } from \"./prompt-templates.js\";\nexport type {\n\tCreateRlmSubagentRuntimeOptions,\n\tRlmChildAdmission,\n\tRlmSubagentRuntime,\n\tSubagentRuntimeHost,\n} from \"./rlm-runtime.js\";\nexport type { Skill } from \"./skills.js\";\nexport type { Tool } from \"./tools/index.js\";\n\nexport { createBashTool, createEditTool, createIpythonTool, createPrimeContextTool, withFileMutationQueue };\n\nfunction getDefaultAgentDir(): string {\n\treturn getAgentDir();\n}\n\n/**\n * Create an AgentSession with the specified options.\n *\n * @example\n * ```typescript\n * // Minimal - uses defaults\n * const { session } = await createAgentSession();\n *\n * // With explicit model\n * import { getModel } from '@ponythewhite/base-context-ai';\n * const { session } = await createAgentSession({\n * model: getModel('anthropic', 'claude-opus-4-5'),\n * thinkingLevel: 'high',\n * });\n *\n * // Continue previous session\n * const { session, modelFallbackMessage } = await createAgentSession({\n * continueSession: true,\n * });\n *\n * // Full control\n * const loader = new DefaultResourceLoader({\n * cwd: process.cwd(),\n * agentDir: getAgentDir(),\n * settingsManager: SettingsManager.create(),\n * });\n * await loader.reload();\n * const { session } = await createAgentSession({\n * model: myModel,\n * tools: [\"ipython\"],\n * resourceLoader: loader,\n * sessionManager: SessionManager.inMemory(),\n * });\n * ```\n */\nexport async function createAgentSession(options: CreateAgentSessionOptions = {}): Promise<CreateAgentSessionResult> {\n\tconst contextMode = options.contextMode;\n\tif (options.requestTokenBudget)\n\t\toptions = { ...options, requestTokenBudget: structuredClone(options.requestTokenBudget) };\n\tconst cwd = options.cwd ?? options.sessionManager?.getCwd() ?? process.cwd();\n\tconst agentDir = options.agentDir ?? getDefaultAgentDir();\n\tlet resourceLoader = options.resourceLoader;\n\n\tconst authPath = options.agentDir ? join(agentDir, \"auth.json\") : undefined;\n\tconst modelsPath = options.agentDir ? join(agentDir, \"models.json\") : undefined;\n\tconst authStorage = options.authStorage ?? AuthStorage.create(authPath);\n\tconst modelRegistry = options.modelRegistry ?? ModelRegistry.create(authStorage, modelsPath);\n\n\tconst settingsManager = options.settingsManager ?? SettingsManager.create(cwd, agentDir);\n\tconst sessionManager =\n\t\toptions.sessionManager ?? (await SessionManager.create(cwd, getDefaultSessionDir(cwd, agentDir)));\n\n\tlet session: AgentSession | undefined;\n\ttry {\n\t\t// Ensure MCP providers are registered and built-in MCP skills are gated by\n\t\t// auth even on the bare SDK path (not just the CLI's createAgentSessionServices).\n\t\tconst mcpManager =\n\t\t\toptions.mcpManager ??\n\t\t\tnew McpManager({ authStorage, getUserServers: () => settingsManager.getGlobalMcpServers() });\n\t\tmodelRegistry.setOnOAuthProvidersReset(() => mcpManager.registerUserProviders());\n\n\t\tif (!resourceLoader) {\n\t\t\tresourceLoader = new DefaultResourceLoader({\n\t\t\t\tcwd,\n\t\t\t\tagentDir,\n\t\t\t\tsettingsManager,\n\t\t\t\textraBuiltinSkillOverrides: () => mcpManager.getDisabledBuiltinSkillOverrides(),\n\t\t\t});\n\t\t\tawait resourceLoader.reload();\n\t\t\ttime(\"resourceLoader.reload\");\n\t\t}\n\n\t\tconst {\n\t\t\tcontext: existingSession,\n\t\t\thasExistingSession,\n\t\t\thasThinkingEntry,\n\t\t\thasServiceTierEntry,\n\t\t} = await readSessionBootstrap(sessionManager, settingsManager.getCanonicalContextLimits(), {\n\t\t\tallowPendingToolPublic: options.requestTokenBudget !== undefined,\n\t\t\tinitialContextMode: contextMode ?? settingsManager.getContextMode(),\n\t\t});\n\n\t\tlet model = options.model;\n\t\tlet modelFallbackMessage: string | undefined;\n\n\t\tif (!model && hasExistingSession && existingSession.model) {\n\t\t\tconst restoredModel = modelRegistry.find(existingSession.model.provider, existingSession.model.modelId);\n\t\t\tif (restoredModel && modelRegistry.hasConfiguredAuth(restoredModel)) {\n\t\t\t\tmodel = restoredModel;\n\t\t\t}\n\t\t\tif (!model) {\n\t\t\t\tmodelFallbackMessage = `Could not restore model ${existingSession.model.provider}/${existingSession.model.modelId}`;\n\t\t\t}\n\t\t}\n\n\t\tif (!model) {\n\t\t\tconst result = await findInitialModel({\n\t\t\t\tscopedModels: [],\n\t\t\t\tisContinuing: hasExistingSession,\n\t\t\t\tdefaultProvider: settingsManager.getDefaultProvider(),\n\t\t\t\tdefaultModelId: settingsManager.getDefaultModel(),\n\t\t\t\tdefaultThinkingLevel: settingsManager.getDefaultThinkingLevel(),\n\t\t\t\tmodelRegistry,\n\t\t\t});\n\t\t\tmodel = result.model;\n\t\t\tif (!model) {\n\t\t\t\tmodelFallbackMessage = formatNoModelsAvailableMessage();\n\t\t\t} else if (modelFallbackMessage) {\n\t\t\t\tmodelFallbackMessage += `. Using ${model.provider}/${model.id}`;\n\t\t\t}\n\t\t}\n\n\t\tlet thinkingLevel = options.thinkingLevel;\n\n\t\tif (thinkingLevel === undefined && hasExistingSession) {\n\t\t\tthinkingLevel = hasThinkingEntry\n\t\t\t\t? (existingSession.thinkingLevel as ThinkingLevel)\n\t\t\t\t: (settingsManager.getDefaultThinkingLevel() ?? DEFAULT_THINKING_LEVEL);\n\t\t}\n\n\t\tif (thinkingLevel === undefined) {\n\t\t\tthinkingLevel = settingsManager.getDefaultThinkingLevel() ?? DEFAULT_THINKING_LEVEL;\n\t\t}\n\n\t\tif (!model) {\n\t\t\tthinkingLevel = \"off\";\n\t\t} else {\n\t\t\tthinkingLevel = clampThinkingLevel(model, thinkingLevel) as ThinkingLevel;\n\t\t}\n\n\t\tconst serviceTierPreference =\n\t\t\toptions.serviceTier ??\n\t\t\t(hasServiceTierEntry ? existingSession.serviceTier : settingsManager.getDefaultServiceTier());\n\t\tconst serviceTier =\n\t\t\tserviceTierPreference === \"priority\" && (!model || !supportsFastMode(model))\n\t\t\t\t? \"default\"\n\t\t\t\t: serviceTierPreference;\n\n\t\tconst allowedToolNames =\n\t\t\toptions.allowedToolNames ?? options.tools ?? (options.noTools === \"all\" ? [] : undefined);\n\t\tconst includeGoals = options.includeGoals ?? (options.tools !== undefined || options.noTools !== \"all\");\n\t\tconst initialActiveToolNames: string[] =\n\t\t\toptions.initialActiveToolNames ??\n\t\t\t(options.tools ? [...options.tools] : options.noTools ? [] : [\"ipython\", \"prime_context\"]);\n\n\t\tlet agent: Agent;\n\n\t\tconst convertToLlmWithBlockImages = (messages: AgentMessage[]): Message[] => {\n\t\t\tconst converted = convertToLlm(messages);\n\t\t\tif (!settingsManager.getBlockImages()) {\n\t\t\t\treturn converted;\n\t\t\t}\n\t\t\treturn converted.map((msg) => {\n\t\t\t\tif (msg.role === \"user\" || msg.role === \"toolResult\") {\n\t\t\t\t\tconst content = msg.content;\n\t\t\t\t\tif (Array.isArray(content)) {\n\t\t\t\t\t\tconst hasImages = content.some((c) => c.type === \"image\");\n\t\t\t\t\t\tif (hasImages) {\n\t\t\t\t\t\t\tconst filteredContent = content\n\t\t\t\t\t\t\t\t.map((c) =>\n\t\t\t\t\t\t\t\t\tc.type === \"image\" ? { type: \"text\" as const, text: \"Image reading is disabled.\" } : c,\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t.filter(\n\t\t\t\t\t\t\t\t\t(c, i, arr) =>\n\t\t\t\t\t\t\t\t\t\t!(\n\t\t\t\t\t\t\t\t\t\t\tc.type === \"text\" &&\n\t\t\t\t\t\t\t\t\t\t\tc.text === \"Image reading is disabled.\" &&\n\t\t\t\t\t\t\t\t\t\t\ti > 0 &&\n\t\t\t\t\t\t\t\t\t\t\tarr[i - 1].type === \"text\" &&\n\t\t\t\t\t\t\t\t\t\t\t(arr[i - 1] as { type: \"text\"; text: string }).text === \"Image reading is disabled.\"\n\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\treturn { ...msg, content: filteredContent };\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn msg;\n\t\t\t});\n\t\t};\n\n\t\tconst extensionRunnerRef: { current?: ExtensionRunner } = {};\n\n\t\tagent = new Agent({\n\t\t\tinitialState: {\n\t\t\t\tsystemPrompt: \"\",\n\t\t\t\tmodel,\n\t\t\t\tthinkingLevel,\n\t\t\t\tserviceTier,\n\t\t\t\ttools: [],\n\t\t\t},\n\t\t\tconvertToLlm: convertToLlmWithBlockImages,\n\t\t\tstreamFn: createNativeInferenceStream(async (model, _context, options) => {\n\t\t\t\tconst auth = await modelRegistry.getApiKeyAndHeaders(model);\n\t\t\t\tif (!auth.ok) {\n\t\t\t\t\tthrow new Error(auth.error);\n\t\t\t\t}\n\t\t\t\tconst providerRetrySettings = settingsManager.getProviderRetrySettings();\n\t\t\t\treturn {\n\t\t\t\t\t...options,\n\t\t\t\t\tapiKey: auth.apiKey,\n\t\t\t\t\ttimeoutMs: options?.timeoutMs ?? providerRetrySettings.timeoutMs,\n\t\t\t\t\tmaxRetries: options?.maxRetries ?? providerRetrySettings.maxRetries,\n\t\t\t\t\tmaxRetryDelayMs: options?.maxRetryDelayMs ?? providerRetrySettings.maxRetryDelayMs,\n\t\t\t\t\theaders: auth.headers || options?.headers ? { ...auth.headers, ...options?.headers } : undefined,\n\t\t\t\t};\n\t\t\t}),\n\t\t\tonPayload: async (payload, _model) => {\n\t\t\t\tconst runner = extensionRunnerRef.current;\n\t\t\t\tif (!runner?.hasHandlers(\"before_provider_request\")) {\n\t\t\t\t\treturn payload;\n\t\t\t\t}\n\t\t\t\treturn runner.emitBeforeProviderRequest(payload);\n\t\t\t},\n\t\t\tonResponse: async (response, _model) => {\n\t\t\t\tconst runner = extensionRunnerRef.current;\n\t\t\t\tif (!runner?.hasHandlers(\"after_provider_response\")) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tawait runner.emit({\n\t\t\t\t\ttype: \"after_provider_response\",\n\t\t\t\t\tstatus: response.status,\n\t\t\t\t\theaders: response.headers,\n\t\t\t\t});\n\t\t\t},\n\t\t\tsessionId: sessionManager.getSessionId(),\n\t\t\ttransformContext: async (messages) => {\n\t\t\t\tconst runner = extensionRunnerRef.current;\n\t\t\t\tif (!runner) return messages;\n\t\t\t\treturn runner.emitContext(messages);\n\t\t\t},\n\t\t\tsteeringMode: settingsManager.getSteeringMode(),\n\t\t\tfollowUpMode: settingsManager.getFollowUpMode(),\n\t\t\ttransport: settingsManager.getTransport(),\n\t\t\tthinkingBudgets: settingsManager.getThinkingBudgets(),\n\t\t\tmaxRetryDelayMs: settingsManager.getProviderRetrySettings().maxRetryDelayMs,\n\t\t});\n\n\t\tif (hasExistingSession) {\n\t\t\tagent.state.messages = existingSession.messages;\n\t\t\tif (!hasThinkingEntry) {\n\t\t\t\tawait sessionManager.appendThinkingLevelChange(thinkingLevel);\n\t\t\t}\n\t\t} else {\n\t\t\tif (model) {\n\t\t\t\tawait sessionManager.appendModelChange(model.provider, model.id);\n\t\t\t}\n\t\t\tawait sessionManager.appendThinkingLevelChange(thinkingLevel);\n\t\t}\n\t\tif (!hasServiceTierEntry) {\n\t\t\tawait sessionManager.appendServiceTierChange(serviceTierPreference);\n\t\t}\n\n\t\tsession = new AgentSession({\n\t\t\tinvocationOutputLimits: options.invocationOutputLimits,\n\t\t\trequestTokenBudget: options.requestTokenBudget,\n\t\t\tcontextMode,\n\t\t\tagent,\n\t\t\tsessionManager,\n\t\t\tsettingsManager,\n\t\t\tserviceTierPreference,\n\t\t\tcwd,\n\t\t\t// Only the explicit dir — the default may not match injected custom storage.\n\t\t\tagentDir: options.agentDir,\n\t\t\tscopedModels: options.scopedModels,\n\t\t\tresourceLoader,\n\t\t\tcustomTools: options.customTools,\n\t\t\tmodelRegistry,\n\t\t\tmcpManager,\n\t\t\tinitialActiveToolNames,\n\t\t\tallowedToolNames,\n\t\t\tincludeGoals,\n\t\t\tincludeCompactSkill: options.includeCompactSkill,\n\t\t\trlmHeartbeatController: options.rlmHeartbeatController,\n\t\t\tagentMessageController: options.agentMessageController,\n\t\t\tagentObserveController: options.agentObserveController,\n\t\t\textensionRunnerRef,\n\t\t\trlmDepth: options.rlmDepth,\n\t\t\trlmMaxDepth: options.rlmMaxDepth,\n\t\t\trlmSessionDir: options.rlmSessionDir,\n\t\t\trlmParentNodeId: options.rlmParentNodeId,\n\t\t\trlmParentAgent: options.rlmParentAgent,\n\t\t\trlmChildAdmission: options.rlmChildAdmission,\n\t\t\tsemanticParentSessionId: options.semanticParentSessionId,\n\t\t\tsemanticSpawnedByRequestId: options.semanticSpawnedByRequestId,\n\t\t\tsubagentRuntimeHost: options.subagentRuntimeHost,\n\t\t\tsessionStartEvent: options.sessionStartEvent,\n\t\t\tprewarmIpythonKernel: options.prewarmIpythonKernel,\n\t\t\tautonomous: options.autonomous,\n\t\t\tserializedRefine: options.serializedRefine,\n\t\t\tinitialGoal: options.initialGoal,\n\t\t});\n\t\tawait session.initialize();\n\t\tconst extensionsResult = resourceLoader.getExtensions();\n\n\t\treturn {\n\t\t\tsession,\n\t\t\textensionsResult,\n\t\t\tmodelFallbackMessage,\n\t\t};\n\t} catch (error) {\n\t\ttry {\n\t\t\tconst admitted = options.rlmChildAdmission?.session;\n\t\t\tconst failedSession = session ?? (admitted?.sessionManager === sessionManager ? admitted : undefined);\n\t\t\tif (failedSession) await failedSession.disposeAsync();\n\t\t\telse {\n\t\t\t\tawait sessionManager.close();\n\t\t\t\toptions.rlmChildAdmission?.confirmUnboundCleanup();\n\t\t\t}\n\t\t} catch (cleanupError) {\n\t\t\tif (cleanupError === error || (error instanceof AggregateError && error.errors.includes(cleanupError)))\n\t\t\t\tthrow error;\n\t\t\tthrow new AggregateError([error, cleanupError], \"Session creation and cleanup failed\");\n\t\t}\n\t\tthrow error;\n\t}\n}\n"]}
|
|
1
|
+
{"version":3,"file":"sdk.d.ts","sourceRoot":"","sources":["../../src/core/sdk.ts"],"names":[],"mappings":"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","sourcesContent":["import { join } from \"node:path\";\nimport { Agent, type AgentMessage, type AgentOutputLimits, type ThinkingLevel } from \"@ponythewhite/base-context-agent\";\nimport { clampThinkingLevel, type Message, type Model, supportsFastMode } from \"@ponythewhite/base-context-ai\";\nimport { getAgentDir } from \"../config.js\";\nimport { AgentSession } from \"./agent-session.js\";\nimport type { AgentSessionCreationOptions } from \"./agent-session-services.js\";\nimport { formatNoModelsAvailableMessage } from \"./auth-guidance.js\";\nimport { AuthStorage } from \"./auth-storage.js\";\nimport type { AgentAutonomousConfig } from \"./autonomous.js\";\nimport { DEFAULT_THINKING_LEVEL } from \"./defaults.js\";\nimport type { ExtensionRunner, LoadExtensionsResult, SessionStartEvent, ToolDefinition } from \"./extensions/index.js\";\nimport { createNativeInferenceStream } from \"./inference-coordinator.js\";\nimport { McpManager } from \"./mcp/mcp-manager.js\";\nimport { convertToLlm } from \"./messages.js\";\nimport { ModelRegistry } from \"./model-registry.js\";\nimport { findInitialModel } from \"./model-resolver.js\";\nimport type { ResourceLoader } from \"./resource-loader.js\";\nimport { DefaultResourceLoader } from \"./resource-loader.js\";\nimport { readSessionBootstrap } from \"./session-bootstrap.js\";\nimport { getDefaultSessionDir, SessionManager } from \"./session-manager.js\";\nimport { SettingsManager } from \"./settings-manager.js\";\nimport { time } from \"./timings.js\";\nimport {\n\tcreateBashTool,\n\tcreateEditTool,\n\tcreateIpythonTool,\n\tcreatePrimeContextTool,\n\twithFileMutationQueue,\n} from \"./tools/index.js\";\n\nexport interface CreateAgentSessionOptions extends AgentSessionCreationOptions {\n\t/** Working directory for project-local discovery. Default: process.cwd() */\n\tcwd?: string;\n\t/** Global config directory. Default: ~/.base-context */\n\tagentDir?: string;\n\n\t/** Auth storage for credentials. Default: AuthStorage.create(agentDir/auth.json).\n\t * Existing host Codex subscriptions can be injected with\n\t * AuthStorage.fromStorage(readOnlyBackend, { existingOpenAICodexSubscription: true }).\n\t * This retains the built-in owned dispatcher; it does not enable OAuth login/refresh.\n\t */\n\tauthStorage?: AuthStorage;\n\t/** Model registry. Default: ModelRegistry.create(authStorage, agentDir/models.json) */\n\tmodelRegistry?: ModelRegistry;\n\n\t/** Model to use. Undefined restores a saved explicit choice; null leaves the session unselected. */\n\tmodel?: Model<any> | null;\n\t/** Thinking level. Default: from settings, else 'medium' (clamped to model capabilities) */\n\tthinkingLevel?: ThinkingLevel;\n\t/** Models available for cycling (Ctrl+P in interactive mode) */\n\tscopedModels?: Array<{ model: Model<any>; thinkingLevel?: ThinkingLevel }>;\n\n\t/**\n\t * Optional default tool suppression mode when no explicit allowlist is provided.\n\t *\n\t * - \"all\": start with no tools enabled\n\t * - \"builtin\": disable the default built-in tools (ipython and prime_context)\n\t * but keep extension/custom tools enabled\n\t */\n\tnoTools?: \"all\" | \"builtin\";\n\t/**\n\t * Optional allowlist of tool names.\n\t *\n\t * When omitted, Base Context enables the default built-in tools (ipython and prime_context)\n\t * and leaves extension/custom tools enabled unless `noTools` changes that default.\n\t * When provided, only the listed tool names are enabled.\n\t */\n\ttools?: string[];\n\t/** Custom tools to register (in addition to built-in tools). */\n\tcustomTools?: ToolDefinition[];\n\n\t/** Resource loader. When omitted, DefaultResourceLoader is used. */\n\tresourceLoader?: ResourceLoader;\n\n\t/** MCP integration manager. When omitted, MCP host handlers are not wired. */\n\tmcpManager?: McpManager;\n\n\t/** Session manager. Default: SessionManager.create(cwd) */\n\tsessionManager?: SessionManager;\n\n\t/** Override complete native invocation output limits from settings. */\n\tinvocationOutputLimits?: AgentOutputLimits;\n\t/** Settings manager. Default: SettingsManager.create(cwd, agentDir) */\n\tsettingsManager?: SettingsManager;\n\t/** Session start event metadata for extension runtime startup. */\n\tsessionStartEvent?: SessionStartEvent;\n\t/** Host-side autonomous continuation policy. */\n\tautonomous?: AgentAutonomousConfig;\n}\n\n/** Result from createAgentSession */\nexport interface CreateAgentSessionResult {\n\t/** The created session */\n\tsession: AgentSession;\n\t/** Extensions result (for UI context setup in interactive mode) */\n\textensionsResult: LoadExtensionsResult;\n\t/** Diagnostic when the selected session or saved model cannot be used. */\n\tmodelFallbackMessage?: string;\n}\n\nexport type { AgentSessionRuntimeConfig } from \"./agent-session-config.js\";\nexport * from \"./agent-session-runtime.js\";\nexport type { AgentSessionCreationOptions } from \"./agent-session-services.js\";\nexport type {\n\tExtensionAPI,\n\tExtensionCommandContext,\n\tExtensionContext,\n\tExtensionFactory,\n\tSlashCommandInfo,\n\tSlashCommandSource,\n\tToolDefinition,\n} from \"./extensions/index.js\";\nexport type { PromptTemplate } from \"./prompt-templates.js\";\nexport type {\n\tRlmMaxSubagentsStatus,\n\tRlmRootAdmission,\n\tRlmSubagentCapacity,\n\tRlmSubagentCapacityReservation,\n} from \"./rlm-max-subagents.js\";\nexport type {\n\tCreateRlmSubagentRuntimeOptions,\n\tRlmChildAdmission,\n\tRlmSubagentRuntime,\n\tSubagentRuntimeHost,\n} from \"./rlm-runtime.js\";\nexport type { Skill } from \"./skills.js\";\nexport type { Tool } from \"./tools/index.js\";\n\nexport { createBashTool, createEditTool, createIpythonTool, createPrimeContextTool, withFileMutationQueue };\n\nfunction getDefaultAgentDir(): string {\n\treturn getAgentDir();\n}\n\n/**\n * Create an AgentSession with the specified options.\n *\n * @example\n * ```typescript\n * // Minimal - uses defaults\n * const { session } = await createAgentSession();\n *\n * // With explicit model\n * import { getModel } from '@ponythewhite/base-context-ai';\n * const { session } = await createAgentSession({\n * model: getModel('anthropic', 'claude-opus-4-5'),\n * thinkingLevel: 'high',\n * });\n *\n * // Continue previous session\n * const { session, modelFallbackMessage } = await createAgentSession({\n * continueSession: true,\n * });\n *\n * // Full control\n * const loader = new DefaultResourceLoader({\n * cwd: process.cwd(),\n * agentDir: getAgentDir(),\n * settingsManager: SettingsManager.create(),\n * });\n * await loader.reload();\n * const { session } = await createAgentSession({\n * model: myModel,\n * tools: [\"ipython\"],\n * resourceLoader: loader,\n * sessionManager: SessionManager.inMemory(),\n * });\n * ```\n */\nexport async function createAgentSession(options: CreateAgentSessionOptions = {}): Promise<CreateAgentSessionResult> {\n\tconst contextMode = options.contextMode;\n\tif (options.requestTokenBudget)\n\t\toptions = { ...options, requestTokenBudget: structuredClone(options.requestTokenBudget) };\n\tconst cwd = options.cwd ?? options.sessionManager?.getCwd() ?? process.cwd();\n\tconst agentDir = options.agentDir ?? getDefaultAgentDir();\n\tlet resourceLoader = options.resourceLoader;\n\n\tconst authPath = options.agentDir ? join(agentDir, \"auth.json\") : undefined;\n\tconst modelsPath = options.agentDir ? join(agentDir, \"models.json\") : undefined;\n\tconst authStorage = options.authStorage ?? AuthStorage.create(authPath);\n\tconst modelRegistry = options.modelRegistry ?? ModelRegistry.create(authStorage, modelsPath);\n\n\tconst settingsManager = options.settingsManager ?? SettingsManager.create(cwd, agentDir);\n\tconst sessionManager =\n\t\toptions.sessionManager ?? (await SessionManager.create(cwd, getDefaultSessionDir(cwd, agentDir)));\n\n\tlet session: AgentSession | undefined;\n\ttry {\n\t\t// Ensure MCP providers are registered and built-in MCP skills are gated by\n\t\t// auth even on the bare SDK path (not just the CLI's createAgentSessionServices).\n\t\tconst mcpManager =\n\t\t\toptions.mcpManager ??\n\t\t\tnew McpManager({ authStorage, getUserServers: () => settingsManager.getGlobalMcpServers() });\n\t\tmodelRegistry.setOnOAuthProvidersReset(() => mcpManager.registerUserProviders());\n\n\t\tif (!resourceLoader) {\n\t\t\tresourceLoader = new DefaultResourceLoader({\n\t\t\t\tcwd,\n\t\t\t\tagentDir,\n\t\t\t\tsettingsManager,\n\t\t\t\textraBuiltinSkillOverrides: () => mcpManager.getDisabledBuiltinSkillOverrides(),\n\t\t\t});\n\t\t\tawait resourceLoader.reload();\n\t\t\ttime(\"resourceLoader.reload\");\n\t\t}\n\n\t\tconst {\n\t\t\tcontext: existingSession,\n\t\t\thasExistingSession,\n\t\t\thasThinkingEntry,\n\t\t\thasServiceTierEntry,\n\t\t} = await readSessionBootstrap(sessionManager, settingsManager.getCanonicalContextLimits(), {\n\t\t\tallowPendingToolPublic: options.requestTokenBudget !== undefined,\n\t\t\tinitialContextMode: contextMode ?? settingsManager.getContextMode(),\n\t\t});\n\n\t\tlet model = options.model ?? undefined;\n\t\tlet modelFallbackMessage: string | undefined;\n\n\t\tif (options.model === undefined && hasExistingSession && existingSession.model) {\n\t\t\tconst saved = existingSession.model;\n\t\t\tconst restoredModel = modelRegistry.find(saved.provider, saved.modelId);\n\t\t\tmodel = restoredModel;\n\t\t\tif (!restoredModel) {\n\t\t\t\tmodelFallbackMessage = `Could not restore model ${saved.provider}/${saved.modelId}. Use /model to select a supported model.`;\n\t\t\t} else if (!modelRegistry.hasConfiguredAuth(restoredModel)) {\n\t\t\t\tmodelFallbackMessage = `Selected model ${saved.provider}/${saved.modelId} needs authentication. Use /login to configure this provider.`;\n\t\t\t}\n\t\t} else if (options.model === undefined) {\n\t\t\tconst result = await findInitialModel({\n\t\t\t\tscopedModels: [],\n\t\t\t\tisContinuing: hasExistingSession,\n\t\t\t\tdefaultProvider: settingsManager.getDefaultProvider(),\n\t\t\t\tdefaultModelId: settingsManager.getDefaultModel(),\n\t\t\t\tdefaultThinkingLevel: settingsManager.getDefaultThinkingLevel(),\n\t\t\t\tmodelRegistry,\n\t\t\t});\n\t\t\tmodel = result.model;\n\t\t\tif (model && !modelRegistry.hasConfiguredAuth(model)) {\n\t\t\t\tmodelFallbackMessage = `Selected model ${model.provider}/${model.id} needs authentication. Use /login to configure this provider.`;\n\t\t\t} else if (!model) {\n\t\t\t\tconst provider = settingsManager.getDefaultProvider();\n\t\t\t\tconst modelId = settingsManager.getDefaultModel();\n\t\t\t\tmodelFallbackMessage =\n\t\t\t\t\tprovider && modelId\n\t\t\t\t\t\t? `Selected model ${provider}/${modelId} is unavailable. Use /model to select a supported model.`\n\t\t\t\t\t\t: formatNoModelsAvailableMessage();\n\t\t\t}\n\t\t}\n\n\t\tlet thinkingLevel = options.thinkingLevel;\n\n\t\tif (thinkingLevel === undefined && hasExistingSession) {\n\t\t\tthinkingLevel = hasThinkingEntry\n\t\t\t\t? (existingSession.thinkingLevel as ThinkingLevel)\n\t\t\t\t: (settingsManager.getDefaultThinkingLevel() ?? DEFAULT_THINKING_LEVEL);\n\t\t}\n\n\t\tif (thinkingLevel === undefined) {\n\t\t\tthinkingLevel = settingsManager.getDefaultThinkingLevel() ?? DEFAULT_THINKING_LEVEL;\n\t\t}\n\n\t\tif (!model) {\n\t\t\tthinkingLevel = \"off\";\n\t\t} else {\n\t\t\tthinkingLevel = clampThinkingLevel(model, thinkingLevel) as ThinkingLevel;\n\t\t}\n\n\t\tconst serviceTierPreference =\n\t\t\toptions.serviceTier ??\n\t\t\t(hasServiceTierEntry ? existingSession.serviceTier : settingsManager.getDefaultServiceTier());\n\t\tconst serviceTier =\n\t\t\tserviceTierPreference === \"priority\" && (!model || !supportsFastMode(model))\n\t\t\t\t? \"default\"\n\t\t\t\t: serviceTierPreference;\n\n\t\tconst allowedToolNames =\n\t\t\toptions.allowedToolNames ?? options.tools ?? (options.noTools === \"all\" ? [] : undefined);\n\t\tconst includeGoals = options.includeGoals ?? (options.tools !== undefined || options.noTools !== \"all\");\n\t\tconst initialActiveToolNames: string[] =\n\t\t\toptions.initialActiveToolNames ??\n\t\t\t(options.tools ? [...options.tools] : options.noTools ? [] : [\"ipython\", \"prime_context\"]);\n\n\t\tlet agent: Agent;\n\n\t\tconst convertToLlmWithBlockImages = (messages: AgentMessage[]): Message[] => {\n\t\t\tconst converted = convertToLlm(messages);\n\t\t\tif (!settingsManager.getBlockImages()) {\n\t\t\t\treturn converted;\n\t\t\t}\n\t\t\treturn converted.map((msg) => {\n\t\t\t\tif (msg.role === \"user\" || msg.role === \"toolResult\") {\n\t\t\t\t\tconst content = msg.content;\n\t\t\t\t\tif (Array.isArray(content)) {\n\t\t\t\t\t\tconst hasImages = content.some((c) => c.type === \"image\");\n\t\t\t\t\t\tif (hasImages) {\n\t\t\t\t\t\t\tconst filteredContent = content\n\t\t\t\t\t\t\t\t.map((c) =>\n\t\t\t\t\t\t\t\t\tc.type === \"image\" ? { type: \"text\" as const, text: \"Image reading is disabled.\" } : c,\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t.filter(\n\t\t\t\t\t\t\t\t\t(c, i, arr) =>\n\t\t\t\t\t\t\t\t\t\t!(\n\t\t\t\t\t\t\t\t\t\t\tc.type === \"text\" &&\n\t\t\t\t\t\t\t\t\t\t\tc.text === \"Image reading is disabled.\" &&\n\t\t\t\t\t\t\t\t\t\t\ti > 0 &&\n\t\t\t\t\t\t\t\t\t\t\tarr[i - 1].type === \"text\" &&\n\t\t\t\t\t\t\t\t\t\t\t(arr[i - 1] as { type: \"text\"; text: string }).text === \"Image reading is disabled.\"\n\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\treturn { ...msg, content: filteredContent };\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn msg;\n\t\t\t});\n\t\t};\n\n\t\tconst extensionRunnerRef: { current?: ExtensionRunner } = {};\n\n\t\tagent = new Agent({\n\t\t\tinitialState: {\n\t\t\t\tsystemPrompt: \"\",\n\t\t\t\tmodel,\n\t\t\t\tthinkingLevel,\n\t\t\t\tserviceTier,\n\t\t\t\ttools: [],\n\t\t\t},\n\t\t\tconvertToLlm: convertToLlmWithBlockImages,\n\t\t\tstreamFn: createNativeInferenceStream(async (model, _context, options) => {\n\t\t\t\tif (!modelRegistry.hasConfiguredAuth(model)) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`Selected model ${model.provider}/${model.id} needs authentication. Use /login to configure this provider.`,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tconst auth = await modelRegistry.getApiKeyAndHeaders(model);\n\t\t\t\tif (!auth.ok) {\n\t\t\t\t\tthrow new Error(auth.error);\n\t\t\t\t}\n\t\t\t\tconst providerRetrySettings = settingsManager.getProviderRetrySettings();\n\t\t\t\treturn {\n\t\t\t\t\t...options,\n\t\t\t\t\tapiKey: auth.apiKey,\n\t\t\t\t\tauthSourceToken: auth.sourceToken,\n\t\t\t\t\ttimeoutMs: options?.timeoutMs ?? providerRetrySettings.timeoutMs,\n\t\t\t\t\tmaxRetries: options?.maxRetries ?? providerRetrySettings.maxRetries,\n\t\t\t\t\tmaxRetryDelayMs: options?.maxRetryDelayMs ?? providerRetrySettings.maxRetryDelayMs,\n\t\t\t\t\theaders: auth.headers || options?.headers ? { ...auth.headers, ...options?.headers } : undefined,\n\t\t\t\t};\n\t\t\t}),\n\t\t\tonPayload: async (payload, _model) => {\n\t\t\t\tconst runner = extensionRunnerRef.current;\n\t\t\t\tif (!runner?.hasHandlers(\"before_provider_request\")) {\n\t\t\t\t\treturn payload;\n\t\t\t\t}\n\t\t\t\treturn runner.emitBeforeProviderRequest(payload);\n\t\t\t},\n\t\t\tonResponse: async (response, _model) => {\n\t\t\t\tconst runner = extensionRunnerRef.current;\n\t\t\t\tif (!runner?.hasHandlers(\"after_provider_response\")) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tawait runner.emit({\n\t\t\t\t\ttype: \"after_provider_response\",\n\t\t\t\t\tstatus: response.status,\n\t\t\t\t\theaders: response.headers,\n\t\t\t\t});\n\t\t\t},\n\t\t\tsessionId: sessionManager.getSessionId(),\n\t\t\ttransformContext: async (messages) => {\n\t\t\t\tconst runner = extensionRunnerRef.current;\n\t\t\t\tif (!runner) return messages;\n\t\t\t\treturn runner.emitContext(messages);\n\t\t\t},\n\t\t\tsteeringMode: settingsManager.getSteeringMode(),\n\t\t\tfollowUpMode: settingsManager.getFollowUpMode(),\n\t\t\ttransport: settingsManager.getTransport(),\n\t\t\tthinkingBudgets: settingsManager.getThinkingBudgets(),\n\t\t\tmaxRetryDelayMs: settingsManager.getProviderRetrySettings().maxRetryDelayMs,\n\t\t});\n\n\t\tif (hasExistingSession) {\n\t\t\tagent.state.messages = existingSession.messages;\n\t\t\tif (!hasThinkingEntry) {\n\t\t\t\tawait sessionManager.appendThinkingLevelChange(thinkingLevel);\n\t\t\t}\n\t\t} else {\n\t\t\tif (model) {\n\t\t\t\tawait sessionManager.appendModelChange(model.provider, model.id);\n\t\t\t}\n\t\t\tawait sessionManager.appendThinkingLevelChange(thinkingLevel);\n\t\t}\n\t\tif (!hasServiceTierEntry) {\n\t\t\tawait sessionManager.appendServiceTierChange(serviceTierPreference);\n\t\t}\n\n\t\tsession = new AgentSession({\n\t\t\tinvocationOutputLimits: options.invocationOutputLimits,\n\t\t\trequestTokenBudget: options.requestTokenBudget,\n\t\t\tcontextMode,\n\t\t\tagent,\n\t\t\tsessionManager,\n\t\t\tsettingsManager,\n\t\t\tserviceTierPreference,\n\t\t\tcwd,\n\t\t\t// Only the explicit dir — the default may not match injected custom storage.\n\t\t\tagentDir: options.agentDir,\n\t\t\tscopedModels: options.scopedModels,\n\t\t\tresourceLoader,\n\t\t\tcustomTools: options.customTools,\n\t\t\tmodelRegistry,\n\t\t\tmcpManager,\n\t\t\tinitialActiveToolNames,\n\t\t\tallowedToolNames,\n\t\t\tincludeGoals,\n\t\t\tincludeCompactSkill: options.includeCompactSkill,\n\t\t\trlmHeartbeatController: options.rlmHeartbeatController,\n\t\t\tagentMessageController: options.agentMessageController,\n\t\t\tagentObserveController: options.agentObserveController,\n\t\t\textensionRunnerRef,\n\t\t\trlmDepth: options.rlmDepth,\n\t\t\trlmMaxDepth: options.rlmMaxDepth,\n\t\t\trlmSessionDir: options.rlmSessionDir,\n\t\t\trlmParentNodeId: options.rlmParentNodeId,\n\t\t\trlmParentAgent: options.rlmParentAgent,\n\t\t\trlmChildAdmission: options.rlmChildAdmission,\n\t\t\trlmSubagentCapacity: options.rlmSubagentCapacity,\n\t\t\trlmRootAdmission: options.rlmRootAdmission,\n\t\t\tsemanticParentSessionId: options.semanticParentSessionId,\n\t\t\tsemanticSpawnedByRequestId: options.semanticSpawnedByRequestId,\n\t\t\tsubagentRuntimeHost: options.subagentRuntimeHost,\n\t\t\tsessionStartEvent: options.sessionStartEvent,\n\t\t\tprewarmIpythonKernel: options.prewarmIpythonKernel,\n\t\t\tautonomous: options.autonomous,\n\t\t\tserializedRefine: options.serializedRefine,\n\t\t\tinitialGoal: options.initialGoal,\n\t\t});\n\t\tawait session.initialize();\n\t\tconst extensionsResult = resourceLoader.getExtensions();\n\n\t\treturn {\n\t\t\tsession,\n\t\t\textensionsResult,\n\t\t\tmodelFallbackMessage,\n\t\t};\n\t} catch (error) {\n\t\ttry {\n\t\t\tconst admitted = options.rlmChildAdmission?.session ?? options.rlmRootAdmission?.session;\n\t\t\tconst failedSession = session ?? (admitted?.sessionManager === sessionManager ? admitted : undefined);\n\t\t\tif (failedSession) await failedSession.disposeAsync();\n\t\t\telse {\n\t\t\t\tawait sessionManager.close();\n\t\t\t\tawait options.rlmChildAdmission?.confirmUnboundCleanup();\n\t\t\t}\n\t\t} catch (cleanupError) {\n\t\t\tif (cleanupError === error || (error instanceof AggregateError && error.errors.includes(cleanupError)))\n\t\t\t\tthrow error;\n\t\t\tthrow new AggregateError([error, cleanupError], \"Session creation and cleanup failed\");\n\t\t}\n\t\tthrow error;\n\t}\n}\n"]}
|