apex-code 0.0.1-alpha.9 → 0.0.4
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 +150 -2
- package/README.md +9 -8
- package/dist/cli/args.d.ts +25 -1
- package/dist/cli/args.d.ts.map +1 -1
- package/dist/cli/args.js +43 -1
- package/dist/cli/args.js.map +1 -1
- package/dist/cli/mcp-command.d.ts +9 -0
- package/dist/cli/mcp-command.d.ts.map +1 -0
- package/dist/cli/mcp-command.js +53 -0
- package/dist/cli/mcp-command.js.map +1 -0
- package/dist/cli/project-trust.d.ts.map +1 -1
- package/dist/cli/project-trust.js +3 -1
- package/dist/cli/project-trust.js.map +1 -1
- package/dist/cli/startup-ui.d.ts.map +1 -1
- package/dist/cli/startup-ui.js +2 -1
- package/dist/cli/startup-ui.js.map +1 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +94 -5
- package/dist/cli.js.map +1 -1
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +24 -5
- package/dist/config.js.map +1 -1
- package/dist/core/agent-session-services.d.ts +3 -0
- package/dist/core/agent-session-services.d.ts.map +1 -1
- package/dist/core/agent-session-services.js +1 -0
- package/dist/core/agent-session-services.js.map +1 -1
- package/dist/core/agent-session.d.ts +157 -8
- package/dist/core/agent-session.d.ts.map +1 -1
- package/dist/core/agent-session.js +565 -22
- package/dist/core/agent-session.js.map +1 -1
- package/dist/core/bash-executor.d.ts.map +1 -1
- package/dist/core/bash-executor.js +7 -0
- package/dist/core/bash-executor.js.map +1 -1
- package/dist/core/checkpoints/git-checkpoints.d.ts +39 -0
- package/dist/core/checkpoints/git-checkpoints.d.ts.map +1 -0
- package/dist/core/checkpoints/git-checkpoints.js +251 -0
- package/dist/core/checkpoints/git-checkpoints.js.map +1 -0
- package/dist/core/checkpoints/session-checkpoints.d.ts +23 -0
- package/dist/core/checkpoints/session-checkpoints.d.ts.map +1 -0
- package/dist/core/checkpoints/session-checkpoints.js +36 -0
- package/dist/core/checkpoints/session-checkpoints.js.map +1 -0
- package/dist/core/compaction/branch-summarization.d.ts.map +1 -1
- package/dist/core/compaction/branch-summarization.js +4 -3
- package/dist/core/compaction/branch-summarization.js.map +1 -1
- package/dist/core/compaction/compaction.d.ts +5 -0
- package/dist/core/compaction/compaction.d.ts.map +1 -1
- package/dist/core/compaction/compaction.js +19 -5
- package/dist/core/compaction/compaction.js.map +1 -1
- package/dist/core/delegation/runtime.d.ts +6 -5
- package/dist/core/delegation/runtime.d.ts.map +1 -1
- package/dist/core/delegation/runtime.js +4 -3
- package/dist/core/delegation/runtime.js.map +1 -1
- package/dist/core/exec.d.ts.map +1 -1
- package/dist/core/exec.js +5 -2
- package/dist/core/exec.js.map +1 -1
- package/dist/core/extensions/index.d.ts +1 -1
- package/dist/core/extensions/index.d.ts.map +1 -1
- package/dist/core/extensions/index.js.map +1 -1
- package/dist/core/extensions/loader.d.ts.map +1 -1
- package/dist/core/extensions/loader.js +8 -2
- package/dist/core/extensions/loader.js.map +1 -1
- package/dist/core/extensions/runner.d.ts +5 -0
- package/dist/core/extensions/runner.d.ts.map +1 -1
- package/dist/core/extensions/runner.js +45 -1
- package/dist/core/extensions/runner.js.map +1 -1
- package/dist/core/extensions/source-runtime.d.ts +14 -0
- package/dist/core/extensions/source-runtime.d.ts.map +1 -0
- package/dist/core/extensions/source-runtime.js +56 -0
- package/dist/core/extensions/source-runtime.js.map +1 -0
- package/dist/core/extensions/types.d.ts +22 -2
- package/dist/core/extensions/types.d.ts.map +1 -1
- package/dist/core/extensions/types.js.map +1 -1
- package/dist/core/formatter-lifecycle.d.ts +69 -0
- package/dist/core/formatter-lifecycle.d.ts.map +1 -0
- package/dist/core/formatter-lifecycle.js +360 -0
- package/dist/core/formatter-lifecycle.js.map +1 -0
- package/dist/core/hooks/command-handler.d.ts +19 -0
- package/dist/core/hooks/command-handler.d.ts.map +1 -0
- package/dist/core/hooks/command-handler.js +112 -0
- package/dist/core/hooks/command-handler.js.map +1 -0
- package/dist/core/hooks/http-handler.d.ts +10 -0
- package/dist/core/hooks/http-handler.d.ts.map +1 -0
- package/dist/core/hooks/http-handler.js +36 -0
- package/dist/core/hooks/http-handler.js.map +1 -0
- package/dist/core/hooks/loader.d.ts +29 -0
- package/dist/core/hooks/loader.d.ts.map +1 -0
- package/dist/core/hooks/loader.js +139 -0
- package/dist/core/hooks/loader.js.map +1 -0
- package/dist/core/hooks/runtime.d.ts +13 -0
- package/dist/core/hooks/runtime.d.ts.map +1 -0
- package/dist/core/hooks/runtime.js +63 -0
- package/dist/core/hooks/runtime.js.map +1 -0
- package/dist/core/hooks/types.d.ts +83 -0
- package/dist/core/hooks/types.d.ts.map +1 -0
- package/dist/core/hooks/types.js +24 -0
- package/dist/core/hooks/types.js.map +1 -0
- package/dist/core/mcp/config.d.ts +16 -0
- package/dist/core/mcp/config.d.ts.map +1 -0
- package/dist/core/mcp/config.js +166 -0
- package/dist/core/mcp/config.js.map +1 -0
- package/dist/core/mcp/connector.d.ts +35 -0
- package/dist/core/mcp/connector.d.ts.map +1 -0
- package/dist/core/mcp/connector.js +105 -0
- package/dist/core/mcp/connector.js.map +1 -0
- package/dist/core/mcp/contract.d.ts +19 -0
- package/dist/core/mcp/contract.d.ts.map +1 -0
- package/dist/core/mcp/contract.js +89 -0
- package/dist/core/mcp/contract.js.map +1 -0
- package/dist/core/mcp/mcp-tool.d.ts +32 -0
- package/dist/core/mcp/mcp-tool.d.ts.map +1 -0
- package/dist/core/mcp/mcp-tool.js +171 -0
- package/dist/core/mcp/mcp-tool.js.map +1 -0
- package/dist/core/mcp/metadata-cache.d.ts +29 -0
- package/dist/core/mcp/metadata-cache.d.ts.map +1 -0
- package/dist/core/mcp/metadata-cache.js +99 -0
- package/dist/core/mcp/metadata-cache.js.map +1 -0
- package/dist/core/mcp/oauth/authorize.d.ts +21 -0
- package/dist/core/mcp/oauth/authorize.d.ts.map +1 -0
- package/dist/core/mcp/oauth/authorize.js +32 -0
- package/dist/core/mcp/oauth/authorize.js.map +1 -0
- package/dist/core/mcp/oauth/discover.d.ts +27 -0
- package/dist/core/mcp/oauth/discover.d.ts.map +1 -0
- package/dist/core/mcp/oauth/discover.js +116 -0
- package/dist/core/mcp/oauth/discover.js.map +1 -0
- package/dist/core/mcp/oauth/flow.d.ts +31 -0
- package/dist/core/mcp/oauth/flow.d.ts.map +1 -0
- package/dist/core/mcp/oauth/flow.js +175 -0
- package/dist/core/mcp/oauth/flow.js.map +1 -0
- package/dist/core/mcp/oauth/mcp-token.d.ts +51 -0
- package/dist/core/mcp/oauth/mcp-token.d.ts.map +1 -0
- package/dist/core/mcp/oauth/mcp-token.js +129 -0
- package/dist/core/mcp/oauth/mcp-token.js.map +1 -0
- package/dist/core/mcp/oauth/pkce.d.ts +12 -0
- package/dist/core/mcp/oauth/pkce.d.ts.map +1 -0
- package/dist/core/mcp/oauth/pkce.js +11 -0
- package/dist/core/mcp/oauth/pkce.js.map +1 -0
- package/dist/core/mcp/oauth/register.d.ts +16 -0
- package/dist/core/mcp/oauth/register.d.ts.map +1 -0
- package/dist/core/mcp/oauth/register.js +42 -0
- package/dist/core/mcp/oauth/register.js.map +1 -0
- package/dist/core/mcp/oauth/token-client.d.ts +33 -0
- package/dist/core/mcp/oauth/token-client.d.ts.map +1 -0
- package/dist/core/mcp/oauth/token-client.js +65 -0
- package/dist/core/mcp/oauth/token-client.js.map +1 -0
- package/dist/core/mcp/runtime.d.ts +20 -0
- package/dist/core/mcp/runtime.d.ts.map +1 -0
- package/dist/core/mcp/runtime.js +37 -0
- package/dist/core/mcp/runtime.js.map +1 -0
- package/dist/core/mcp/schema.d.ts +22 -0
- package/dist/core/mcp/schema.d.ts.map +1 -0
- package/dist/core/mcp/schema.js +20 -0
- package/dist/core/mcp/schema.js.map +1 -0
- package/dist/core/mcp/server-manager.d.ts +43 -0
- package/dist/core/mcp/server-manager.d.ts.map +1 -0
- package/dist/core/mcp/server-manager.js +142 -0
- package/dist/core/mcp/server-manager.js.map +1 -0
- package/dist/core/mcp/types.d.ts +100 -0
- package/dist/core/mcp/types.d.ts.map +1 -0
- package/dist/core/mcp/types.js +8 -0
- package/dist/core/mcp/types.js.map +1 -0
- package/dist/core/permissions/gate.d.ts.map +1 -1
- package/dist/core/permissions/gate.js +45 -4
- package/dist/core/permissions/gate.js.map +1 -1
- package/dist/core/permissions/operations.d.ts +20 -0
- package/dist/core/permissions/operations.d.ts.map +1 -0
- package/dist/core/permissions/operations.js +9 -0
- package/dist/core/permissions/operations.js.map +1 -0
- package/dist/core/permissions/policy-command.d.ts +42 -0
- package/dist/core/permissions/policy-command.d.ts.map +1 -0
- package/dist/core/permissions/policy-command.js +44 -0
- package/dist/core/permissions/policy-command.js.map +1 -0
- package/dist/core/permissions/responder.d.ts +49 -2
- package/dist/core/permissions/responder.d.ts.map +1 -1
- package/dist/core/permissions/responder.js +20 -8
- package/dist/core/permissions/responder.js.map +1 -1
- package/dist/core/permissions/rules.d.ts.map +1 -1
- package/dist/core/permissions/rules.js +11 -1
- package/dist/core/permissions/rules.js.map +1 -1
- package/dist/core/permissions/store.d.ts +18 -0
- package/dist/core/permissions/store.d.ts.map +1 -1
- package/dist/core/permissions/store.js +89 -8
- package/dist/core/permissions/store.js.map +1 -1
- package/dist/core/policy-executor.d.ts +47 -0
- package/dist/core/policy-executor.d.ts.map +1 -0
- package/dist/core/policy-executor.js +228 -0
- package/dist/core/policy-executor.js.map +1 -0
- package/dist/core/policy-loader.d.ts +72 -0
- package/dist/core/policy-loader.d.ts.map +1 -0
- package/dist/core/policy-loader.js +195 -0
- package/dist/core/policy-loader.js.map +1 -0
- package/dist/core/project-trust.d.ts +1 -1
- package/dist/core/project-trust.d.ts.map +1 -1
- package/dist/core/project-trust.js.map +1 -1
- package/dist/core/sandbox/bwrap-arguments.d.ts +41 -0
- package/dist/core/sandbox/bwrap-arguments.d.ts.map +1 -0
- package/dist/core/sandbox/bwrap-arguments.js +136 -0
- package/dist/core/sandbox/bwrap-arguments.js.map +1 -0
- package/dist/core/sandbox/child-entry.d.ts.map +1 -1
- package/dist/core/sandbox/child-entry.js +3 -1
- package/dist/core/sandbox/child-entry.js.map +1 -1
- package/dist/core/sandbox/cli-launch.d.ts +84 -4
- package/dist/core/sandbox/cli-launch.d.ts.map +1 -1
- package/dist/core/sandbox/cli-launch.js +115 -16
- package/dist/core/sandbox/cli-launch.js.map +1 -1
- package/dist/core/sandbox/cli-supervisor.d.ts +2 -0
- package/dist/core/sandbox/cli-supervisor.d.ts.map +1 -1
- package/dist/core/sandbox/cli-supervisor.js +50 -2
- package/dist/core/sandbox/cli-supervisor.js.map +1 -1
- package/dist/core/sandbox/full-access.d.ts +28 -0
- package/dist/core/sandbox/full-access.d.ts.map +1 -0
- package/dist/core/sandbox/full-access.js +63 -0
- package/dist/core/sandbox/full-access.js.map +1 -0
- package/dist/core/sandbox/git-identity.d.ts +57 -0
- package/dist/core/sandbox/git-identity.d.ts.map +1 -0
- package/dist/core/sandbox/git-identity.js +78 -0
- package/dist/core/sandbox/git-identity.js.map +1 -0
- package/dist/core/sandbox/host-approval.d.ts +42 -0
- package/dist/core/sandbox/host-approval.d.ts.map +1 -0
- package/dist/core/sandbox/host-approval.js +99 -0
- package/dist/core/sandbox/host-approval.js.map +1 -0
- package/dist/core/sandbox/linux-backend.d.ts +14 -0
- package/dist/core/sandbox/linux-backend.d.ts.map +1 -1
- package/dist/core/sandbox/linux-backend.js +158 -80
- package/dist/core/sandbox/linux-backend.js.map +1 -1
- package/dist/core/sandbox/macos-backend.d.ts +5 -0
- package/dist/core/sandbox/macos-backend.d.ts.map +1 -1
- package/dist/core/sandbox/macos-backend.js +164 -5
- package/dist/core/sandbox/macos-backend.js.map +1 -1
- package/dist/core/sandbox/network-proxy.d.ts +19 -0
- package/dist/core/sandbox/network-proxy.d.ts.map +1 -1
- package/dist/core/sandbox/network-proxy.js +93 -19
- package/dist/core/sandbox/network-proxy.js.map +1 -1
- package/dist/core/sandbox/policy.d.ts +8 -0
- package/dist/core/sandbox/policy.d.ts.map +1 -1
- package/dist/core/sandbox/policy.js +29 -12
- package/dist/core/sandbox/policy.js.map +1 -1
- package/dist/core/sandbox/profiles.d.ts +25 -0
- package/dist/core/sandbox/profiles.d.ts.map +1 -0
- package/dist/core/sandbox/profiles.js +23 -0
- package/dist/core/sandbox/profiles.js.map +1 -0
- package/dist/core/sandbox/rpc/command-client.d.ts +28 -0
- package/dist/core/sandbox/rpc/command-client.d.ts.map +1 -0
- package/dist/core/sandbox/rpc/command-client.js +86 -0
- package/dist/core/sandbox/rpc/command-client.js.map +1 -0
- package/dist/core/sandbox/rpc/command-proxy.d.ts +48 -0
- package/dist/core/sandbox/rpc/command-proxy.d.ts.map +1 -0
- package/dist/core/sandbox/rpc/command-proxy.js +120 -0
- package/dist/core/sandbox/rpc/command-proxy.js.map +1 -0
- package/dist/core/sandbox/rpc/credential-proxy.d.ts.map +1 -1
- package/dist/core/sandbox/rpc/credential-proxy.js +2 -96
- package/dist/core/sandbox/rpc/credential-proxy.js.map +1 -1
- package/dist/core/sandbox/rpc/framing.d.ts +35 -0
- package/dist/core/sandbox/rpc/framing.d.ts.map +1 -0
- package/dist/core/sandbox/rpc/framing.js +114 -0
- package/dist/core/sandbox/rpc/framing.js.map +1 -0
- package/dist/core/sandbox/rpc/git-credential-helper.d.ts +47 -0
- package/dist/core/sandbox/rpc/git-credential-helper.d.ts.map +1 -0
- package/dist/core/sandbox/rpc/git-credential-helper.js +222 -0
- package/dist/core/sandbox/rpc/git-credential-helper.js.map +1 -0
- package/dist/core/sandbox/rpc/git-credential-proxy.d.ts +66 -0
- package/dist/core/sandbox/rpc/git-credential-proxy.d.ts.map +1 -0
- package/dist/core/sandbox/rpc/git-credential-proxy.js +209 -0
- package/dist/core/sandbox/rpc/git-credential-proxy.js.map +1 -0
- package/dist/core/sandbox/supervisor-temp.d.ts +18 -0
- package/dist/core/sandbox/supervisor-temp.d.ts.map +1 -0
- package/dist/core/sandbox/supervisor-temp.js +21 -0
- package/dist/core/sandbox/supervisor-temp.js.map +1 -0
- package/dist/core/sandbox/supervisor.d.ts +12 -1
- package/dist/core/sandbox/supervisor.d.ts.map +1 -1
- package/dist/core/sandbox/supervisor.js +15 -1
- package/dist/core/sandbox/supervisor.js.map +1 -1
- package/dist/core/sandbox/terminal-handoff.d.ts +68 -0
- package/dist/core/sandbox/terminal-handoff.d.ts.map +1 -0
- package/dist/core/sandbox/terminal-handoff.js +221 -0
- package/dist/core/sandbox/terminal-handoff.js.map +1 -0
- package/dist/core/sandbox/terminal-size.d.ts +13 -0
- package/dist/core/sandbox/terminal-size.d.ts.map +1 -1
- package/dist/core/sandbox/terminal-size.js +23 -2
- package/dist/core/sandbox/terminal-size.js.map +1 -1
- package/dist/core/sdk.d.ts +22 -0
- package/dist/core/sdk.d.ts.map +1 -1
- package/dist/core/sdk.js +53 -1
- package/dist/core/sdk.js.map +1 -1
- package/dist/core/session-manager.d.ts +13 -1
- package/dist/core/session-manager.d.ts.map +1 -1
- package/dist/core/session-manager.js +32 -5
- package/dist/core/session-manager.js.map +1 -1
- package/dist/core/settings-manager.d.ts +163 -1
- package/dist/core/settings-manager.d.ts.map +1 -1
- package/dist/core/settings-manager.js +107 -0
- 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 +2 -0
- package/dist/core/slash-commands.js.map +1 -1
- package/dist/core/tools/background-shell.d.ts +39 -0
- package/dist/core/tools/background-shell.d.ts.map +1 -0
- package/dist/core/tools/background-shell.js +81 -0
- package/dist/core/tools/background-shell.js.map +1 -0
- package/dist/core/tools/bash-command-segments.d.ts.map +1 -1
- package/dist/core/tools/bash-command-segments.js +2 -0
- package/dist/core/tools/bash-command-segments.js.map +1 -1
- package/dist/core/tools/bash.d.ts +30 -15
- package/dist/core/tools/bash.d.ts.map +1 -1
- package/dist/core/tools/bash.js +228 -12
- package/dist/core/tools/bash.js.map +1 -1
- package/dist/core/tools/contract-snapshot.d.ts +58 -0
- package/dist/core/tools/contract-snapshot.d.ts.map +1 -0
- package/dist/core/tools/contract-snapshot.js +51 -0
- package/dist/core/tools/contract-snapshot.js.map +1 -0
- package/dist/core/tools/contract.d.ts +53 -5
- package/dist/core/tools/contract.d.ts.map +1 -1
- package/dist/core/tools/contract.js +22 -2
- package/dist/core/tools/contract.js.map +1 -1
- package/dist/core/tools/delegate.d.ts +6 -4
- package/dist/core/tools/delegate.d.ts.map +1 -1
- package/dist/core/tools/delegate.js +21 -11
- package/dist/core/tools/delegate.js.map +1 -1
- package/dist/core/tools/edit-diff.d.ts +48 -0
- package/dist/core/tools/edit-diff.d.ts.map +1 -1
- package/dist/core/tools/edit-diff.js +215 -3
- package/dist/core/tools/edit-diff.js.map +1 -1
- package/dist/core/tools/edit.d.ts +8 -0
- package/dist/core/tools/edit.d.ts.map +1 -1
- package/dist/core/tools/edit.js +53 -7
- package/dist/core/tools/edit.js.map +1 -1
- package/dist/core/tools/find.d.ts.map +1 -1
- package/dist/core/tools/find.js +5 -2
- package/dist/core/tools/find.js.map +1 -1
- package/dist/core/tools/grep.d.ts.map +1 -1
- package/dist/core/tools/grep.js +5 -2
- package/dist/core/tools/grep.js.map +1 -1
- package/dist/core/tools/index.d.ts +10 -1
- package/dist/core/tools/index.d.ts.map +1 -1
- package/dist/core/tools/index.js +3 -0
- package/dist/core/tools/index.js.map +1 -1
- package/dist/core/tools/ls.d.ts.map +1 -1
- package/dist/core/tools/ls.js +5 -2
- package/dist/core/tools/ls.js.map +1 -1
- package/dist/core/tools/lsp.d.ts +19 -1
- package/dist/core/tools/lsp.d.ts.map +1 -1
- package/dist/core/tools/lsp.js +163 -10
- package/dist/core/tools/lsp.js.map +1 -1
- package/dist/core/tools/path-permission.d.ts +3 -0
- package/dist/core/tools/path-permission.d.ts.map +1 -1
- package/dist/core/tools/path-permission.js +16 -4
- package/dist/core/tools/path-permission.js.map +1 -1
- package/dist/core/tools/path-utils.d.ts +27 -2
- package/dist/core/tools/path-utils.d.ts.map +1 -1
- package/dist/core/tools/path-utils.js +221 -4
- package/dist/core/tools/path-utils.js.map +1 -1
- package/dist/core/tools/read.d.ts.map +1 -1
- package/dist/core/tools/read.js +20 -11
- package/dist/core/tools/read.js.map +1 -1
- package/dist/core/tools/test.d.ts +54 -9
- package/dist/core/tools/test.d.ts.map +1 -1
- package/dist/core/tools/test.js +239 -19
- package/dist/core/tools/test.js.map +1 -1
- package/dist/core/tools/write.d.ts +7 -0
- package/dist/core/tools/write.d.ts.map +1 -1
- package/dist/core/tools/write.js +64 -9
- package/dist/core/tools/write.js.map +1 -1
- package/dist/core/verification-lifecycle.d.ts +77 -0
- package/dist/core/verification-lifecycle.d.ts.map +1 -0
- package/dist/core/verification-lifecycle.js +146 -0
- package/dist/core/verification-lifecycle.js.map +1 -0
- package/dist/core/workspace/artifacts.d.ts +45 -0
- package/dist/core/workspace/artifacts.d.ts.map +1 -0
- package/dist/core/workspace/artifacts.js +165 -0
- package/dist/core/workspace/artifacts.js.map +1 -0
- package/dist/core/workspace/comparison.d.ts +27 -0
- package/dist/core/workspace/comparison.d.ts.map +1 -0
- package/dist/core/workspace/comparison.js +94 -0
- package/dist/core/workspace/comparison.js.map +1 -0
- package/dist/core/workspace/git-observer.d.ts +48 -0
- package/dist/core/workspace/git-observer.d.ts.map +1 -0
- package/dist/core/workspace/git-observer.js +346 -0
- package/dist/core/workspace/git-observer.js.map +1 -0
- package/dist/core/workspace/projection.d.ts +3 -0
- package/dist/core/workspace/projection.d.ts.map +1 -0
- package/dist/core/workspace/projection.js +56 -0
- package/dist/core/workspace/projection.js.map +1 -0
- package/dist/core/workspace/state.d.ts +133 -0
- package/dist/core/workspace/state.d.ts.map +1 -0
- package/dist/core/workspace/state.js +96 -0
- package/dist/core/workspace/state.js.map +1 -0
- package/dist/extensions/llama/client.d.ts +6 -0
- package/dist/extensions/llama/client.d.ts.map +1 -1
- package/dist/extensions/llama/client.js +7 -0
- package/dist/extensions/llama/client.js.map +1 -1
- package/dist/extensions/llama/provider.d.ts +3 -1
- package/dist/extensions/llama/provider.d.ts.map +1 -1
- package/dist/extensions/llama/provider.js +27 -6
- package/dist/extensions/llama/provider.js.map +1 -1
- package/dist/index.d.ts +4 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -1
- package/dist/main.d.ts +3 -1
- package/dist/main.d.ts.map +1 -1
- package/dist/main.js +41 -9
- package/dist/main.js.map +1 -1
- package/dist/modes/acp/server.d.ts +55 -0
- package/dist/modes/acp/server.d.ts.map +1 -0
- package/dist/modes/acp/server.js +244 -0
- package/dist/modes/acp/server.js.map +1 -0
- package/dist/modes/acp/translate.d.ts +37 -0
- package/dist/modes/acp/translate.d.ts.map +1 -0
- package/dist/modes/acp/translate.js +50 -0
- package/dist/modes/acp/translate.js.map +1 -0
- package/dist/modes/index.d.ts +1 -0
- package/dist/modes/index.d.ts.map +1 -1
- package/dist/modes/index.js +1 -0
- package/dist/modes/index.js.map +1 -1
- package/dist/modes/interactive/components/assistant-message.d.ts +29 -0
- package/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
- package/dist/modes/interactive/components/assistant-message.js +182 -23
- package/dist/modes/interactive/components/assistant-message.js.map +1 -1
- package/dist/modes/interactive/components/bash-execution.d.ts +7 -0
- package/dist/modes/interactive/components/bash-execution.d.ts.map +1 -1
- package/dist/modes/interactive/components/bash-execution.js +20 -0
- package/dist/modes/interactive/components/bash-execution.js.map +1 -1
- package/dist/modes/interactive/components/custom-editor.d.ts +9 -4
- package/dist/modes/interactive/components/custom-editor.d.ts.map +1 -1
- package/dist/modes/interactive/components/custom-editor.js +20 -9
- package/dist/modes/interactive/components/custom-editor.js.map +1 -1
- package/dist/modes/interactive/components/extension-selector.d.ts +7 -1
- package/dist/modes/interactive/components/extension-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/extension-selector.js +7 -3
- package/dist/modes/interactive/components/extension-selector.js.map +1 -1
- package/dist/modes/interactive/components/footer.d.ts +19 -0
- package/dist/modes/interactive/components/footer.d.ts.map +1 -1
- package/dist/modes/interactive/components/footer.js +70 -10
- package/dist/modes/interactive/components/footer.js.map +1 -1
- package/dist/modes/interactive/components/model-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/model-selector.js +6 -6
- package/dist/modes/interactive/components/model-selector.js.map +1 -1
- package/dist/modes/interactive/components/permission-preview.d.ts +15 -0
- package/dist/modes/interactive/components/permission-preview.d.ts.map +1 -0
- package/dist/modes/interactive/components/permission-preview.js +33 -0
- package/dist/modes/interactive/components/permission-preview.js.map +1 -0
- package/dist/modes/interactive/components/session-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/session-selector.js +2 -2
- package/dist/modes/interactive/components/session-selector.js.map +1 -1
- package/dist/modes/interactive/components/settings-selector.d.ts +2 -0
- package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/settings-selector.js +10 -0
- package/dist/modes/interactive/components/settings-selector.js.map +1 -1
- package/dist/modes/interactive/components/tool-execution.d.ts +23 -1
- package/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
- package/dist/modes/interactive/components/tool-execution.js +64 -10
- package/dist/modes/interactive/components/tool-execution.js.map +1 -1
- package/dist/modes/interactive/interactive-mode.d.ts +34 -0
- package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-mode.js +231 -26
- package/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/dist/modes/interactive/theme/theme.d.ts +12 -0
- package/dist/modes/interactive/theme/theme.d.ts.map +1 -1
- package/dist/modes/interactive/theme/theme.js +15 -5
- package/dist/modes/interactive/theme/theme.js.map +1 -1
- package/dist/modes/print-mode.d.ts.map +1 -1
- package/dist/modes/print-mode.js +27 -12
- package/dist/modes/print-mode.js.map +1 -1
- package/dist/modes/rpc/rpc-client.d.ts +7 -0
- package/dist/modes/rpc/rpc-client.d.ts.map +1 -1
- package/dist/modes/rpc/rpc-client.js +7 -0
- package/dist/modes/rpc/rpc-client.js.map +1 -1
- package/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
- package/dist/modes/rpc/rpc-mode.js +3 -0
- package/dist/modes/rpc/rpc-mode.js.map +1 -1
- package/dist/modes/rpc/rpc-types.d.ts +12 -0
- package/dist/modes/rpc/rpc-types.d.ts.map +1 -1
- package/dist/modes/rpc/rpc-types.js.map +1 -1
- package/dist/package-manager-cli.d.ts.map +1 -1
- package/dist/package-manager-cli.js +0 -6
- package/dist/package-manager-cli.js.map +1 -1
- package/dist/utils/shell.d.ts.map +1 -1
- package/dist/utils/shell.js +6 -4
- package/dist/utils/shell.js.map +1 -1
- package/dist/utils/version-check.d.ts.map +1 -1
- package/dist/utils/version-check.js +6 -4
- package/dist/utils/version-check.js.map +1 -1
- package/docs/compaction.md +4 -0
- package/docs/custom-provider.md +7 -7
- package/docs/environment-variables.md +1 -1
- package/docs/extensions.md +18 -0
- package/docs/keybindings.md +1 -1
- package/docs/quickstart.md +1 -1
- package/docs/rpc.md +23 -0
- package/docs/sdk.md +25 -0
- package/docs/settings.md +12 -4
- package/docs/terminal-setup.md +12 -0
- package/docs/usage.md +4 -3
- package/examples/extensions/built-in-tool-renderer.ts +8 -4
- package/examples/extensions/custom-provider-anthropic/package-lock.json +2 -2
- package/examples/extensions/custom-provider-anthropic/package.json +1 -1
- package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
- package/examples/extensions/git-checkpoint.ts +24 -36
- package/examples/extensions/gondolin/package-lock.json +2 -2
- package/examples/extensions/gondolin/package.json +1 -1
- package/examples/extensions/minimal-mode.ts +2 -2
- package/examples/extensions/permission-gate.ts +1 -1
- package/examples/extensions/plan-mode/index.ts +1 -1
- package/examples/extensions/rpc-demo.ts +1 -1
- package/examples/extensions/sandbox/package-lock.json +2 -2
- package/examples/extensions/sandbox/package.json +1 -1
- package/examples/extensions/with-deps/package-lock.json +2 -2
- package/examples/extensions/with-deps/package.json +1 -1
- package/npm-shrinkwrap.json +194 -46
- package/package.json +14 -12
- package/dist/server/create-harness.d.ts +0 -26
- package/dist/server/create-harness.d.ts.map +0 -1
- package/dist/server/create-harness.js +0 -107
- package/dist/server/create-harness.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent-session-services.d.ts","sourceRoot":"","sources":["../../src/core/agent-session-services.ts"],"names":[],"mappings":"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","sourcesContent":["import { join } from \"node:path\";\nimport type { Model } from \"@earendil-works/pi-ai\";\nimport type { ThinkingLevel } from \"apex-code-agent-core\";\nimport { getAgentDir, getAuthPath } from \"../config.ts\";\nimport { resolvePath } from \"../utils/paths.ts\";\nimport type { SessionStartEvent, ToolDefinition } from \"./extensions/index.ts\";\nimport { LspDiagnostics } from \"./lsp/diagnostics.ts\";\nimport { LspPool } from \"./lsp/pool.ts\";\nimport { resolveLspRegistry } from \"./lsp/registry.ts\";\nimport { LspStatusStore } from \"./lsp/status.ts\";\nimport { ModelRuntime } from \"./model-runtime.ts\";\nimport type { PermissionGateOptions } from \"./permissions/gate.ts\";\nimport {\n\tDefaultResourceLoader,\n\ttype DefaultResourceLoaderOptions,\n\ttype ResourceLoader,\n\ttype ResourceLoaderReloadOptions,\n} from \"./resource-loader.ts\";\nimport { createSandboxCredentialStore } from \"./sandbox/rpc/credential-client.ts\";\nimport { type CreateAgentSessionOptions, type CreateAgentSessionResult, createAgentSession } from \"./sdk.ts\";\nimport type { SessionManager } from \"./session-manager.ts\";\nimport { SettingsManager } from \"./settings-manager.ts\";\nimport type { LspOperations } from \"./tools/lsp.ts\";\nimport { SqliteUsagePerformanceStore } from \"./usage-performance-store.ts\";\nimport { createDeferredWebSearchOperations, resolveWebSearchOperations } from \"./web-search-provider.ts\";\n\n/** Filename of the shared durable-state database within an agent directory (roadmap Phase 8). */\nconst DURABLE_STATE_DATABASE_FILENAME = \"state.sqlite\";\n\n/**\n * Non-fatal issues collected while creating services or sessions.\n *\n * Runtime creation returns diagnostics to the caller instead of printing or\n * exiting. The app layer decides whether warnings should be shown and whether\n * errors should abort startup.\n */\nexport interface AgentSessionRuntimeDiagnostic {\n\ttype: \"info\" | \"warning\" | \"error\";\n\tmessage: string;\n}\n\n/**\n * Inputs for creating cwd-bound runtime services.\n *\n * These services are recreated whenever the effective session cwd changes.\n * CLI-provided resource paths should be resolved to absolute paths before they\n * reach this function, so later cwd switches do not reinterpret them.\n */\nexport interface CreateAgentSessionServicesOptions {\n\tcwd: string;\n\tagentDir?: string;\n\t/**\n\t * Session id to stamp on every usage-performance sample this runtime records.\n\t * Only observed when `modelRuntime` is not already provided — a caller-supplied\n\t * runtime owns its own store, if any.\n\t */\n\tsessionId?: string;\n\tsettingsManager?: SettingsManager;\n\tmodelRuntime?: ModelRuntime;\n\tmodelRuntimeSignal?: AbortSignal;\n\textensionFlagValues?: Map<string, boolean | string>;\n\tresourceLoaderOptions?: Omit<DefaultResourceLoaderOptions, \"cwd\" | \"agentDir\" | \"settingsManager\">;\n\tresourceLoaderReloadOptions?: ResourceLoaderReloadOptions;\n}\n\n/**\n * Inputs for creating an AgentSession from already-created services.\n *\n * Use this after services exist and any cwd-bound model/tool/session options\n * have been resolved against those services.\n */\nexport interface CreateAgentSessionFromServicesOptions {\n\tservices: AgentSessionServices;\n\tsessionManager: SessionManager;\n\tsessionStartEvent?: SessionStartEvent;\n\tmodel?: Model<any>;\n\tthinkingLevel?: ThinkingLevel;\n\tscopedModels?: Array<{ model: Model<any>; thinkingLevel?: ThinkingLevel }>;\n\ttools?: string[];\n\texcludeTools?: CreateAgentSessionOptions[\"excludeTools\"];\n\tnoTools?: CreateAgentSessionOptions[\"noTools\"];\n\tcustomTools?: ToolDefinition[];\n\tpermissionGate?: Omit<PermissionGateOptions, \"getContract\">;\n}\n\n/**\n * Coherent cwd-bound runtime services for one effective session cwd.\n *\n * This is infrastructure only. The AgentSession itself is created separately so\n * session options can be resolved against these services first.\n */\nexport interface AgentSessionServices {\n\tcwd: string;\n\tagentDir: string;\n\tmodelRuntime: ModelRuntime;\n\tsettingsManager: SettingsManager;\n\tresourceLoader: ResourceLoader;\n\tlspPool: LspPool;\n\t/**\n\t * Wraps `lspPool` for `DiagnosticsOperations.afterMutation` (LSP.4). Structurally\n\t * compatible with `core/tools/diagnostics.ts`'s `DiagnosticsOperations` -- callers\n\t * pass this value directly, never importing `core/lsp/*` themselves.\n\t */\n\tlspDiagnostics: LspDiagnostics;\n\t/** True when at least one LSP server resolved -- gates registering the `lsp` tool (LSP.5). */\n\tlspConfigured: boolean;\n\t/**\n\t * Chronological, bounded record of every server-root state transition observed by\n\t * `lspPool` for this services lifetime (LSP.2). Inspectable structured state -- not\n\t * wired to any user-facing surface by this plan (see `docs/plans/2026-08-18-lsp.md`,\n\t * Task LSP.2: this is not a `/doctor` task).\n\t */\n\tlspStatus: LspStatusStore;\n\tdiagnostics: AgentSessionRuntimeDiagnostic[];\n\tclose(): Promise<void>;\n}\n\nfunction applyExtensionFlagValues(\n\tresourceLoader: ResourceLoader,\n\textensionFlagValues: Map<string, boolean | string> | undefined,\n): AgentSessionRuntimeDiagnostic[] {\n\tif (!extensionFlagValues) {\n\t\treturn [];\n\t}\n\n\tconst diagnostics: AgentSessionRuntimeDiagnostic[] = [];\n\tconst extensionsResult = resourceLoader.getExtensions();\n\tconst registeredFlags = new Map<string, { type: \"boolean\" | \"string\" }>();\n\tfor (const extension of extensionsResult.extensions) {\n\t\tfor (const [name, flag] of extension.flags) {\n\t\t\tregisteredFlags.set(name, { type: flag.type });\n\t\t}\n\t}\n\n\tconst unknownFlags: string[] = [];\n\tfor (const [name, value] of extensionFlagValues) {\n\t\tconst flag = registeredFlags.get(name);\n\t\tif (!flag) {\n\t\t\tunknownFlags.push(name);\n\t\t\tcontinue;\n\t\t}\n\t\tif (flag.type === \"boolean\") {\n\t\t\textensionsResult.runtime.flagValues.set(name, true);\n\t\t\tcontinue;\n\t\t}\n\t\tif (typeof value === \"string\") {\n\t\t\textensionsResult.runtime.flagValues.set(name, value);\n\t\t\tcontinue;\n\t\t}\n\t\tdiagnostics.push({\n\t\t\ttype: \"error\",\n\t\t\tmessage: `Extension flag \"--${name}\" requires a value`,\n\t\t});\n\t}\n\n\tif (unknownFlags.length > 0) {\n\t\tdiagnostics.push({\n\t\t\ttype: \"error\",\n\t\t\tmessage: `Unknown option${unknownFlags.length === 1 ? \"\" : \"s\"}: ${unknownFlags.map((name) => `--${name}`).join(\", \")}`,\n\t\t});\n\t}\n\n\treturn diagnostics;\n}\n\n/**\n * Create cwd-bound runtime services.\n *\n * Returns services plus diagnostics. It does not create an AgentSession.\n */\nexport async function createAgentSessionServices(\n\toptions: CreateAgentSessionServicesOptions,\n): Promise<AgentSessionServices> {\n\tconst cwd = resolvePath(options.cwd);\n\tconst agentDir = options.agentDir ? resolvePath(options.agentDir) : getAgentDir();\n\tconst diagnostics: AgentSessionRuntimeDiagnostic[] = [];\n\n\t// A ledger failure must never block session creation or a turn — open it\n\t// best-effort and degrade to a diagnostic, never a thrown error.\n\tlet usagePerformanceStore: SqliteUsagePerformanceStore | undefined;\n\tif (!options.modelRuntime) {\n\t\ttry {\n\t\t\tusagePerformanceStore = new SqliteUsagePerformanceStore(\n\t\t\t\tjoin(agentDir, DURABLE_STATE_DATABASE_FILENAME),\n\t\t\t\toptions.sessionId,\n\t\t\t);\n\t\t} catch (error) {\n\t\t\tconst message = error instanceof Error ? error.message : String(error);\n\t\t\tdiagnostics.push({ type: \"warning\", message: `Usage/cost recording unavailable: ${message}` });\n\t\t}\n\t}\n\n\tconst settingsManager = options.settingsManager ?? SettingsManager.create(cwd, agentDir);\n\tconst otlpEndpoint = settingsManager.getObservabilitySettings().otlpEndpoint;\n\tconst otlpExportConfig = otlpEndpoint\n\t\t? { endpoint: otlpEndpoint, headers: settingsManager.getObservabilitySettings().otlpHeaders }\n\t\t: undefined;\n\n\t// Inside a sandboxed session the supervisor advertises a credential write channel\n\t// (spec: 2026-08-22-supervisor-mediated-credential-writes). Reads are unchanged --\n\t// still the read-only projection of the host credential file -- while writes and\n\t// deletes travel the supervisor-owned socket instead of failing on the read-only\n\t// mount. Outside a sandbox this resolves to undefined and the default store applies.\n\tconst sandboxCredentialStore = createSandboxCredentialStore();\n\tconst modelRuntime =\n\t\toptions.modelRuntime ??\n\t\t(await ModelRuntime.create({\n\t\t\tauthPath: process.env.APEX_CODE_AUTH_PATH ?? (options.agentDir ? join(agentDir, \"auth.json\") : getAuthPath()),\n\t\t\tcredentials: sandboxCredentialStore,\n\t\t\tmodelsPath: join(agentDir, \"models.json\"),\n\t\t\tsignal: options.modelRuntimeSignal,\n\t\t\tusagePerformanceStore,\n\t\t\totlpExportConfig,\n\t\t}));\n\tconst resourceLoader = new DefaultResourceLoader({\n\t\t...(options.resourceLoaderOptions ?? {}),\n\t\tcwd,\n\t\tagentDir,\n\t\tsettingsManager,\n\t});\n\tawait resourceLoader.reload(options.resourceLoaderReloadOptions);\n\n\tconst extensionsResult = resourceLoader.getExtensions();\n\tfor (const { name, config, extensionPath } of extensionsResult.runtime.pendingProviderRegistrations) {\n\t\ttry {\n\t\t\tmodelRuntime.registerProvider(name, config);\n\t\t} catch (error) {\n\t\t\tconst message = error instanceof Error ? error.message : String(error);\n\t\t\tdiagnostics.push({\n\t\t\t\ttype: \"error\",\n\t\t\t\tmessage: `Extension \"${extensionPath}\" error: ${message}`,\n\t\t\t});\n\t\t}\n\t}\n\textensionsResult.runtime.pendingProviderRegistrations = [];\n\tfor (const { provider, extensionPath } of extensionsResult.runtime.pendingNativeProviderRegistrations) {\n\t\ttry {\n\t\t\tmodelRuntime.registerNativeProvider(provider);\n\t\t} catch (error) {\n\t\t\tconst message = error instanceof Error ? error.message : String(error);\n\t\t\tdiagnostics.push({\n\t\t\t\ttype: \"error\",\n\t\t\t\tmessage: `Extension \"${extensionPath}\" error: ${message}`,\n\t\t\t});\n\t\t}\n\t}\n\textensionsResult.runtime.pendingNativeProviderRegistrations = [];\n\tawait modelRuntime.refresh({ allowNetwork: false });\n\tdiagnostics.push(...applyExtensionFlagValues(resourceLoader, options.extensionFlagValues));\n\n\t// `lspStatus` is constructed unconditionally (and outside the try) so it always\n\t// records real state transitions the pool experiences below, including the\n\t// eager-start failure the catch block handles -- not just a snapshot taken at one\n\t// fixed point in time.\n\tconst lspStatus = new LspStatusStore();\n\tlet lspPool: LspPool | undefined;\n\tlet registry: ReturnType<typeof resolveLspRegistry> | undefined;\n\tlet lspConfigured = false;\n\ttry {\n\t\tregistry = resolveLspRegistry(settingsManager.getLspSettings(), { workspace: cwd });\n\t\tlspPool = new LspPool(registry, {\n\t\t\tonStatusChange: (status) =>\n\t\t\t\tlspStatus.record({\n\t\t\t\t\tserverId: status.serverId,\n\t\t\t\t\troot: status.root,\n\t\t\t\t\tstate: status.state,\n\t\t\t\t\tattempt: status.attempts,\n\t\t\t\t\t...(status.reason === undefined ? {} : { reason: status.reason }),\n\t\t\t\t}),\n\t\t});\n\t\tlspConfigured = registry.servers.length > 0;\n\t\t// Per the spec's \"Resolved configuration, ownership, and lifecycle\": any\n\t\t// configured entry that cannot resolve, spawn, or initialize its cwd-root\n\t\t// process within its timeout is a startup misconfiguration -- fail fast here,\n\t\t// following core/permissions/startup.ts's precedent, rather than let a broken\n\t\t// server surface only when a tool call needs it mid-run.\n\t\tif (lspConfigured) await lspPool.start();\n\t} catch (error) {\n\t\t// Name the failing binary(ies), not just the raw client/registry error: the\n\t\t// registry itself already does this for a resolution failure (missing/\n\t\t// un-spawnable binary names the command and lookup path), but a `pool.start()`\n\t\t// rejection surfaces only the first client's bare error (e.g. \"initialize timed\n\t\t// out\"), with no server id attached. `registry.servers` (resolved commands) and\n\t\t// `lspPool.status()` (which entries actually failed) are both in scope here, so\n\t\t// build the richer message without changing `LspPoolStatus`'s shape or the\n\t\t// pool's own error-propagation wire format.\n\t\tconst commandById = new Map(registry?.servers.map((server) => [server.id, server.command]) ?? []);\n\t\tconst failedEntries = (lspPool?.status() ?? []).filter(\n\t\t\t(status) => status.state === \"degraded\" || status.state === \"disabled\",\n\t\t);\n\t\tconst message =\n\t\t\tfailedEntries.length > 0\n\t\t\t\t? failedEntries\n\t\t\t\t\t\t.map(\n\t\t\t\t\t\t\t(status) =>\n\t\t\t\t\t\t\t\t`${status.serverId} (${commandById.get(status.serverId) ?? \"?\"}) at ${status.root}: ${status.reason ?? \"unknown error\"}`,\n\t\t\t\t\t\t)\n\t\t\t\t\t\t.join(\"; \")\n\t\t\t\t: error instanceof Error\n\t\t\t\t\t? error.message\n\t\t\t\t\t: String(error);\n\t\tdiagnostics.push({ type: \"error\", message: `LSP startup failed: ${message}` });\n\t\t// A pool that got partway through eager start may already have spawned and\n\t\t// initialized sibling servers successfully; discarding it without disposing\n\t\t// would orphan those child processes rather than tearing them down cleanly.\n\t\tawait lspPool?.dispose().catch(() => {});\n\t\tlspConfigured = false;\n\t\tlspPool = new LspPool({ workspace: cwd, servers: [], platform: process.platform });\n\t}\n\tconst lspDiagnostics = new LspDiagnostics(lspPool);\n\n\treturn {\n\t\tcwd,\n\t\tagentDir,\n\t\tmodelRuntime,\n\t\tsettingsManager,\n\t\tresourceLoader,\n\t\tlspPool,\n\t\tlspDiagnostics,\n\t\tlspConfigured,\n\t\tlspStatus,\n\t\tdiagnostics,\n\t\tclose: async () => {\n\t\t\t// Diagnostics first: it still needs live LSP clients to send didClose\n\t\t\t// during its own teardown, so it must not outlive the pool it wraps.\n\t\t\tawait lspDiagnostics.dispose();\n\t\t\tawait lspPool.dispose();\n\t\t\tif (!options.modelRuntime) modelRuntime.close();\n\t\t},\n\t};\n}\n\n/**\n * Create an AgentSession from previously created services.\n *\n * This keeps session creation separate from service creation so callers can\n * resolve model, thinking, tools, and other session inputs against the target\n * cwd before constructing the session.\n */\nexport async function createAgentSessionFromServices(\n\toptions: CreateAgentSessionFromServicesOptions,\n): Promise<CreateAgentSessionResult> {\n\tconst { lspPool, lspDiagnostics, lspConfigured } = options.services;\n\t// Both gated on `lspConfigured` (at least one server resolved), not per-path:\n\t// the spec's \"no diagnostics injection or result change whatsoever when `lsp` is\n\t// unconfigured\" is a session-level guarantee. A session with servers configured\n\t// for *some* languages still injects diagnosticsOperations -- a mutated path with\n\t// no matching server correctly resolves to the explicit `unavailable` outcome via\n\t// `LspDiagnostics.afterMutation`'s own per-path `pool.acquire`, it is simply never\n\t// asked at all when the session has no servers whatsoever. `lspDiagnostics`\n\t// already matches `DiagnosticsOperations` structurally, so it is passed directly\n\t// rather than wrapped.\n\tconst diagnosticsOperations = lspConfigured ? lspDiagnostics : undefined;\n\tconst lspOperations: LspOperations | undefined = lspConfigured\n\t\t? {\n\t\t\t\trequest: async (absolutePath, method, params, signal) => {\n\t\t\t\t\tconst connection = await lspPool.acquire(absolutePath);\n\t\t\t\t\tif (!connection) return undefined;\n\t\t\t\t\treturn connection.client.request(method, params, signal);\n\t\t\t\t},\n\t\t\t}\n\t\t: undefined;\n\n\t// Read per call rather than captured here. The tool registry is built once at\n\t// session construction, so a key saved from the settings panel mid-session would\n\t// otherwise not take effect until restart.\n\t// Two different questions. Whether a credential resolves *now* decides whether the\n\t// tool is active, because activation happens once at construction. Resolution then\n\t// stays deferred so a key changed mid-session is picked up without a restart.\n\tconst settingsManager = options.services.settingsManager;\n\tconst webSearchOperations = resolveWebSearchOperations(settingsManager.getWebSearchSettings())\n\t\t? createDeferredWebSearchOperations(() => settingsManager.getWebSearchSettings())\n\t\t: undefined;\n\n\treturn createAgentSession({\n\t\tcwd: options.services.cwd,\n\t\tagentDir: options.services.agentDir,\n\t\tmodelRuntime: options.services.modelRuntime,\n\t\tsettingsManager: options.services.settingsManager,\n\t\tresourceLoader: options.services.resourceLoader,\n\t\tsessionManager: options.sessionManager,\n\t\tmodel: options.model,\n\t\tthinkingLevel: options.thinkingLevel,\n\t\tscopedModels: options.scopedModels,\n\t\ttools: options.tools,\n\t\texcludeTools: options.excludeTools,\n\t\tnoTools: options.noTools,\n\t\tcustomTools: options.customTools,\n\t\tsessionStartEvent: options.sessionStartEvent,\n\t\tpermissionGate: options.permissionGate,\n\t\tdiagnosticsOperations,\n\t\tlspOperations,\n\t\twebSearchOperations,\n\t});\n}\n"]}
|
|
1
|
+
{"version":3,"file":"agent-session-services.d.ts","sourceRoot":"","sources":["../../src/core/agent-session-services.ts"],"names":[],"mappings":"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","sourcesContent":["import { join } from \"node:path\";\nimport type { Model } from \"@earendil-works/pi-ai\";\nimport type { ThinkingLevel } from \"apex-code-agent-core\";\nimport { getAgentDir, getAuthPath } from \"../config.ts\";\nimport { resolvePath } from \"../utils/paths.ts\";\nimport type { SessionStartEvent, ToolDefinition } from \"./extensions/index.ts\";\nimport { LspDiagnostics } from \"./lsp/diagnostics.ts\";\nimport { LspPool } from \"./lsp/pool.ts\";\nimport { resolveLspRegistry } from \"./lsp/registry.ts\";\nimport { LspStatusStore } from \"./lsp/status.ts\";\nimport { ModelRuntime } from \"./model-runtime.ts\";\nimport type { PermissionGateOptions } from \"./permissions/gate.ts\";\nimport type { PermissionResponder } from \"./permissions/responder.ts\";\nimport {\n\tDefaultResourceLoader,\n\ttype DefaultResourceLoaderOptions,\n\ttype ResourceLoader,\n\ttype ResourceLoaderReloadOptions,\n} from \"./resource-loader.ts\";\nimport { createSandboxCredentialStore } from \"./sandbox/rpc/credential-client.ts\";\nimport { type CreateAgentSessionOptions, type CreateAgentSessionResult, createAgentSession } from \"./sdk.ts\";\nimport type { SessionManager } from \"./session-manager.ts\";\nimport { SettingsManager } from \"./settings-manager.ts\";\nimport type { LspOperations } from \"./tools/lsp.ts\";\nimport { SqliteUsagePerformanceStore } from \"./usage-performance-store.ts\";\nimport { createDeferredWebSearchOperations, resolveWebSearchOperations } from \"./web-search-provider.ts\";\n\n/** Filename of the shared durable-state database within an agent directory (roadmap Phase 8). */\nconst DURABLE_STATE_DATABASE_FILENAME = \"state.sqlite\";\n\n/**\n * Non-fatal issues collected while creating services or sessions.\n *\n * Runtime creation returns diagnostics to the caller instead of printing or\n * exiting. The app layer decides whether warnings should be shown and whether\n * errors should abort startup.\n */\nexport interface AgentSessionRuntimeDiagnostic {\n\ttype: \"info\" | \"warning\" | \"error\";\n\tmessage: string;\n}\n\n/**\n * Inputs for creating cwd-bound runtime services.\n *\n * These services are recreated whenever the effective session cwd changes.\n * CLI-provided resource paths should be resolved to absolute paths before they\n * reach this function, so later cwd switches do not reinterpret them.\n */\nexport interface CreateAgentSessionServicesOptions {\n\tcwd: string;\n\tagentDir?: string;\n\t/**\n\t * Session id to stamp on every usage-performance sample this runtime records.\n\t * Only observed when `modelRuntime` is not already provided — a caller-supplied\n\t * runtime owns its own store, if any.\n\t */\n\tsessionId?: string;\n\tsettingsManager?: SettingsManager;\n\tmodelRuntime?: ModelRuntime;\n\tmodelRuntimeSignal?: AbortSignal;\n\textensionFlagValues?: Map<string, boolean | string>;\n\tresourceLoaderOptions?: Omit<DefaultResourceLoaderOptions, \"cwd\" | \"agentDir\" | \"settingsManager\">;\n\tresourceLoaderReloadOptions?: ResourceLoaderReloadOptions;\n}\n\n/**\n * Inputs for creating an AgentSession from already-created services.\n *\n * Use this after services exist and any cwd-bound model/tool/session options\n * have been resolved against those services.\n */\nexport interface CreateAgentSessionFromServicesOptions {\n\tservices: AgentSessionServices;\n\tsessionManager: SessionManager;\n\tsessionStartEvent?: SessionStartEvent;\n\tmodel?: Model<any>;\n\tthinkingLevel?: ThinkingLevel;\n\tscopedModels?: Array<{ model: Model<any>; thinkingLevel?: ThinkingLevel }>;\n\ttools?: string[];\n\texcludeTools?: CreateAgentSessionOptions[\"excludeTools\"];\n\tnoTools?: CreateAgentSessionOptions[\"noTools\"];\n\tcustomTools?: ToolDefinition[];\n\tpermissionGate?: Omit<PermissionGateOptions, \"getContract\">;\n\t/** Optional headless permission bridge (ACP, spec 2026-08-31-acp-adapter.md). */\n\tpermissionResponderFactory?: () => PermissionResponder | undefined;\n}\n\n/**\n * Coherent cwd-bound runtime services for one effective session cwd.\n *\n * This is infrastructure only. The AgentSession itself is created separately so\n * session options can be resolved against these services first.\n */\nexport interface AgentSessionServices {\n\tcwd: string;\n\tagentDir: string;\n\tmodelRuntime: ModelRuntime;\n\tsettingsManager: SettingsManager;\n\tresourceLoader: ResourceLoader;\n\tlspPool: LspPool;\n\t/**\n\t * Wraps `lspPool` for `DiagnosticsOperations.afterMutation` (LSP.4). Structurally\n\t * compatible with `core/tools/diagnostics.ts`'s `DiagnosticsOperations` -- callers\n\t * pass this value directly, never importing `core/lsp/*` themselves.\n\t */\n\tlspDiagnostics: LspDiagnostics;\n\t/** True when at least one LSP server resolved -- gates registering the `lsp` tool (LSP.5). */\n\tlspConfigured: boolean;\n\t/**\n\t * Chronological, bounded record of every server-root state transition observed by\n\t * `lspPool` for this services lifetime (LSP.2). Inspectable structured state -- not\n\t * wired to any user-facing surface by this plan (see `docs/plans/2026-08-18-lsp.md`,\n\t * Task LSP.2: this is not a `/doctor` task).\n\t */\n\tlspStatus: LspStatusStore;\n\tdiagnostics: AgentSessionRuntimeDiagnostic[];\n\tclose(): Promise<void>;\n}\n\nfunction applyExtensionFlagValues(\n\tresourceLoader: ResourceLoader,\n\textensionFlagValues: Map<string, boolean | string> | undefined,\n): AgentSessionRuntimeDiagnostic[] {\n\tif (!extensionFlagValues) {\n\t\treturn [];\n\t}\n\n\tconst diagnostics: AgentSessionRuntimeDiagnostic[] = [];\n\tconst extensionsResult = resourceLoader.getExtensions();\n\tconst registeredFlags = new Map<string, { type: \"boolean\" | \"string\" }>();\n\tfor (const extension of extensionsResult.extensions) {\n\t\tfor (const [name, flag] of extension.flags) {\n\t\t\tregisteredFlags.set(name, { type: flag.type });\n\t\t}\n\t}\n\n\tconst unknownFlags: string[] = [];\n\tfor (const [name, value] of extensionFlagValues) {\n\t\tconst flag = registeredFlags.get(name);\n\t\tif (!flag) {\n\t\t\tunknownFlags.push(name);\n\t\t\tcontinue;\n\t\t}\n\t\tif (flag.type === \"boolean\") {\n\t\t\textensionsResult.runtime.flagValues.set(name, true);\n\t\t\tcontinue;\n\t\t}\n\t\tif (typeof value === \"string\") {\n\t\t\textensionsResult.runtime.flagValues.set(name, value);\n\t\t\tcontinue;\n\t\t}\n\t\tdiagnostics.push({\n\t\t\ttype: \"error\",\n\t\t\tmessage: `Extension flag \"--${name}\" requires a value`,\n\t\t});\n\t}\n\n\tif (unknownFlags.length > 0) {\n\t\tdiagnostics.push({\n\t\t\ttype: \"error\",\n\t\t\tmessage: `Unknown option${unknownFlags.length === 1 ? \"\" : \"s\"}: ${unknownFlags.map((name) => `--${name}`).join(\", \")}`,\n\t\t});\n\t}\n\n\treturn diagnostics;\n}\n\n/**\n * Create cwd-bound runtime services.\n *\n * Returns services plus diagnostics. It does not create an AgentSession.\n */\nexport async function createAgentSessionServices(\n\toptions: CreateAgentSessionServicesOptions,\n): Promise<AgentSessionServices> {\n\tconst cwd = resolvePath(options.cwd);\n\tconst agentDir = options.agentDir ? resolvePath(options.agentDir) : getAgentDir();\n\tconst diagnostics: AgentSessionRuntimeDiagnostic[] = [];\n\n\t// A ledger failure must never block session creation or a turn — open it\n\t// best-effort and degrade to a diagnostic, never a thrown error.\n\tlet usagePerformanceStore: SqliteUsagePerformanceStore | undefined;\n\tif (!options.modelRuntime) {\n\t\ttry {\n\t\t\tusagePerformanceStore = new SqliteUsagePerformanceStore(\n\t\t\t\tjoin(agentDir, DURABLE_STATE_DATABASE_FILENAME),\n\t\t\t\toptions.sessionId,\n\t\t\t);\n\t\t} catch (error) {\n\t\t\tconst message = error instanceof Error ? error.message : String(error);\n\t\t\tdiagnostics.push({ type: \"warning\", message: `Usage/cost recording unavailable: ${message}` });\n\t\t}\n\t}\n\n\tconst settingsManager = options.settingsManager ?? SettingsManager.create(cwd, agentDir);\n\tconst otlpEndpoint = settingsManager.getObservabilitySettings().otlpEndpoint;\n\tconst otlpExportConfig = otlpEndpoint\n\t\t? { endpoint: otlpEndpoint, headers: settingsManager.getObservabilitySettings().otlpHeaders }\n\t\t: undefined;\n\n\t// Inside a sandboxed session the supervisor advertises a credential write channel\n\t// (spec: 2026-08-22-supervisor-mediated-credential-writes). Reads are unchanged --\n\t// still the read-only projection of the host credential file -- while writes and\n\t// deletes travel the supervisor-owned socket instead of failing on the read-only\n\t// mount. Outside a sandbox this resolves to undefined and the default store applies.\n\tconst sandboxCredentialStore = createSandboxCredentialStore();\n\tconst modelRuntime =\n\t\toptions.modelRuntime ??\n\t\t(await ModelRuntime.create({\n\t\t\tauthPath: process.env.APEX_CODE_AUTH_PATH ?? (options.agentDir ? join(agentDir, \"auth.json\") : getAuthPath()),\n\t\t\tcredentials: sandboxCredentialStore,\n\t\t\tmodelsPath: join(agentDir, \"models.json\"),\n\t\t\tsignal: options.modelRuntimeSignal,\n\t\t\tusagePerformanceStore,\n\t\t\totlpExportConfig,\n\t\t}));\n\tconst resourceLoader = new DefaultResourceLoader({\n\t\t...(options.resourceLoaderOptions ?? {}),\n\t\tcwd,\n\t\tagentDir,\n\t\tsettingsManager,\n\t});\n\tawait resourceLoader.reload(options.resourceLoaderReloadOptions);\n\n\tconst extensionsResult = resourceLoader.getExtensions();\n\tfor (const { name, config, extensionPath } of extensionsResult.runtime.pendingProviderRegistrations) {\n\t\ttry {\n\t\t\tmodelRuntime.registerProvider(name, config);\n\t\t} catch (error) {\n\t\t\tconst message = error instanceof Error ? error.message : String(error);\n\t\t\tdiagnostics.push({\n\t\t\t\ttype: \"error\",\n\t\t\t\tmessage: `Extension \"${extensionPath}\" error: ${message}`,\n\t\t\t});\n\t\t}\n\t}\n\textensionsResult.runtime.pendingProviderRegistrations = [];\n\tfor (const { provider, extensionPath } of extensionsResult.runtime.pendingNativeProviderRegistrations) {\n\t\ttry {\n\t\t\tmodelRuntime.registerNativeProvider(provider);\n\t\t} catch (error) {\n\t\t\tconst message = error instanceof Error ? error.message : String(error);\n\t\t\tdiagnostics.push({\n\t\t\t\ttype: \"error\",\n\t\t\t\tmessage: `Extension \"${extensionPath}\" error: ${message}`,\n\t\t\t});\n\t\t}\n\t}\n\textensionsResult.runtime.pendingNativeProviderRegistrations = [];\n\tawait modelRuntime.refresh({ allowNetwork: false });\n\tdiagnostics.push(...applyExtensionFlagValues(resourceLoader, options.extensionFlagValues));\n\n\t// `lspStatus` is constructed unconditionally (and outside the try) so it always\n\t// records real state transitions the pool experiences below, including the\n\t// eager-start failure the catch block handles -- not just a snapshot taken at one\n\t// fixed point in time.\n\tconst lspStatus = new LspStatusStore();\n\tlet lspPool: LspPool | undefined;\n\tlet registry: ReturnType<typeof resolveLspRegistry> | undefined;\n\tlet lspConfigured = false;\n\ttry {\n\t\tregistry = resolveLspRegistry(settingsManager.getLspSettings(), { workspace: cwd });\n\t\tlspPool = new LspPool(registry, {\n\t\t\tonStatusChange: (status) =>\n\t\t\t\tlspStatus.record({\n\t\t\t\t\tserverId: status.serverId,\n\t\t\t\t\troot: status.root,\n\t\t\t\t\tstate: status.state,\n\t\t\t\t\tattempt: status.attempts,\n\t\t\t\t\t...(status.reason === undefined ? {} : { reason: status.reason }),\n\t\t\t\t}),\n\t\t});\n\t\tlspConfigured = registry.servers.length > 0;\n\t\t// Per the spec's \"Resolved configuration, ownership, and lifecycle\": any\n\t\t// configured entry that cannot resolve, spawn, or initialize its cwd-root\n\t\t// process within its timeout is a startup misconfiguration -- fail fast here,\n\t\t// following core/permissions/startup.ts's precedent, rather than let a broken\n\t\t// server surface only when a tool call needs it mid-run.\n\t\tif (lspConfigured) await lspPool.start();\n\t} catch (error) {\n\t\t// Name the failing binary(ies), not just the raw client/registry error: the\n\t\t// registry itself already does this for a resolution failure (missing/\n\t\t// un-spawnable binary names the command and lookup path), but a `pool.start()`\n\t\t// rejection surfaces only the first client's bare error (e.g. \"initialize timed\n\t\t// out\"), with no server id attached. `registry.servers` (resolved commands) and\n\t\t// `lspPool.status()` (which entries actually failed) are both in scope here, so\n\t\t// build the richer message without changing `LspPoolStatus`'s shape or the\n\t\t// pool's own error-propagation wire format.\n\t\tconst commandById = new Map(registry?.servers.map((server) => [server.id, server.command]) ?? []);\n\t\tconst failedEntries = (lspPool?.status() ?? []).filter(\n\t\t\t(status) => status.state === \"degraded\" || status.state === \"disabled\",\n\t\t);\n\t\tconst message =\n\t\t\tfailedEntries.length > 0\n\t\t\t\t? failedEntries\n\t\t\t\t\t\t.map(\n\t\t\t\t\t\t\t(status) =>\n\t\t\t\t\t\t\t\t`${status.serverId} (${commandById.get(status.serverId) ?? \"?\"}) at ${status.root}: ${status.reason ?? \"unknown error\"}`,\n\t\t\t\t\t\t)\n\t\t\t\t\t\t.join(\"; \")\n\t\t\t\t: error instanceof Error\n\t\t\t\t\t? error.message\n\t\t\t\t\t: String(error);\n\t\tdiagnostics.push({ type: \"error\", message: `LSP startup failed: ${message}` });\n\t\t// A pool that got partway through eager start may already have spawned and\n\t\t// initialized sibling servers successfully; discarding it without disposing\n\t\t// would orphan those child processes rather than tearing them down cleanly.\n\t\tawait lspPool?.dispose().catch(() => {});\n\t\tlspConfigured = false;\n\t\tlspPool = new LspPool({ workspace: cwd, servers: [], platform: process.platform });\n\t}\n\tconst lspDiagnostics = new LspDiagnostics(lspPool);\n\n\treturn {\n\t\tcwd,\n\t\tagentDir,\n\t\tmodelRuntime,\n\t\tsettingsManager,\n\t\tresourceLoader,\n\t\tlspPool,\n\t\tlspDiagnostics,\n\t\tlspConfigured,\n\t\tlspStatus,\n\t\tdiagnostics,\n\t\tclose: async () => {\n\t\t\t// Diagnostics first: it still needs live LSP clients to send didClose\n\t\t\t// during its own teardown, so it must not outlive the pool it wraps.\n\t\t\tawait lspDiagnostics.dispose();\n\t\t\tawait lspPool.dispose();\n\t\t\tif (!options.modelRuntime) modelRuntime.close();\n\t\t},\n\t};\n}\n\n/**\n * Create an AgentSession from previously created services.\n *\n * This keeps session creation separate from service creation so callers can\n * resolve model, thinking, tools, and other session inputs against the target\n * cwd before constructing the session.\n */\nexport async function createAgentSessionFromServices(\n\toptions: CreateAgentSessionFromServicesOptions,\n): Promise<CreateAgentSessionResult> {\n\tconst { lspPool, lspDiagnostics, lspConfigured } = options.services;\n\t// Both gated on `lspConfigured` (at least one server resolved), not per-path:\n\t// the spec's \"no diagnostics injection or result change whatsoever when `lsp` is\n\t// unconfigured\" is a session-level guarantee. A session with servers configured\n\t// for *some* languages still injects diagnosticsOperations -- a mutated path with\n\t// no matching server correctly resolves to the explicit `unavailable` outcome via\n\t// `LspDiagnostics.afterMutation`'s own per-path `pool.acquire`, it is simply never\n\t// asked at all when the session has no servers whatsoever. `lspDiagnostics`\n\t// already matches `DiagnosticsOperations` structurally, so it is passed directly\n\t// rather than wrapped.\n\tconst diagnosticsOperations = lspConfigured ? lspDiagnostics : undefined;\n\tconst lspOperations: LspOperations | undefined = lspConfigured\n\t\t? {\n\t\t\t\trequest: async (absolutePath, method, params, signal) => {\n\t\t\t\t\tconst connection = await lspPool.acquire(absolutePath);\n\t\t\t\t\tif (!connection) return undefined;\n\t\t\t\t\treturn connection.client.request(method, params, signal);\n\t\t\t\t},\n\t\t\t}\n\t\t: undefined;\n\n\t// Read per call rather than captured here. The tool registry is built once at\n\t// session construction, so a key saved from the settings panel mid-session would\n\t// otherwise not take effect until restart.\n\t// Two different questions. Whether a credential resolves *now* decides whether the\n\t// tool is active, because activation happens once at construction. Resolution then\n\t// stays deferred so a key changed mid-session is picked up without a restart.\n\tconst settingsManager = options.services.settingsManager;\n\tconst webSearchOperations = resolveWebSearchOperations(settingsManager.getWebSearchSettings())\n\t\t? createDeferredWebSearchOperations(() => settingsManager.getWebSearchSettings())\n\t\t: undefined;\n\n\treturn createAgentSession({\n\t\tcwd: options.services.cwd,\n\t\tagentDir: options.services.agentDir,\n\t\tmodelRuntime: options.services.modelRuntime,\n\t\tsettingsManager: options.services.settingsManager,\n\t\tresourceLoader: options.services.resourceLoader,\n\t\tsessionManager: options.sessionManager,\n\t\tmodel: options.model,\n\t\tthinkingLevel: options.thinkingLevel,\n\t\tscopedModels: options.scopedModels,\n\t\ttools: options.tools,\n\t\texcludeTools: options.excludeTools,\n\t\tnoTools: options.noTools,\n\t\tcustomTools: options.customTools,\n\t\tsessionStartEvent: options.sessionStartEvent,\n\t\tpermissionGate: options.permissionGate,\n\t\tpermissionResponderFactory: options.permissionResponderFactory,\n\t\tdiagnosticsOperations,\n\t\tlspOperations,\n\t\twebSearchOperations,\n\t});\n}\n"]}
|
|
@@ -262,6 +262,7 @@ export async function createAgentSessionFromServices(options) {
|
|
|
262
262
|
customTools: options.customTools,
|
|
263
263
|
sessionStartEvent: options.sessionStartEvent,
|
|
264
264
|
permissionGate: options.permissionGate,
|
|
265
|
+
permissionResponderFactory: options.permissionResponderFactory,
|
|
265
266
|
diagnosticsOperations,
|
|
266
267
|
lspOperations,
|
|
267
268
|
webSearchOperations,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent-session-services.js","sourceRoot":"","sources":["../../src/core/agent-session-services.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAGjC,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AACxD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEhD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AACxC,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAElD,OAAO,EACN,qBAAqB,GAIrB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,4BAA4B,EAAE,MAAM,oCAAoC,CAAC;AAClF,OAAO,EAAiE,kBAAkB,EAAE,MAAM,UAAU,CAAC;AAE7G,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAExD,OAAO,EAAE,2BAA2B,EAAE,MAAM,8BAA8B,CAAC;AAC3E,OAAO,EAAE,iCAAiC,EAAE,0BAA0B,EAAE,MAAM,0BAA0B,CAAC;AAEzG,iGAAiG;AACjG,MAAM,+BAA+B,GAAG,cAAc,CAAC;AA0FvD,SAAS,wBAAwB,CAChC,cAA8B,EAC9B,mBAA8D,EAC5B;IAClC,IAAI,CAAC,mBAAmB,EAAE,CAAC;QAC1B,OAAO,EAAE,CAAC;IACX,CAAC;IAED,MAAM,WAAW,GAAoC,EAAE,CAAC;IACxD,MAAM,gBAAgB,GAAG,cAAc,CAAC,aAAa,EAAE,CAAC;IACxD,MAAM,eAAe,GAAG,IAAI,GAAG,EAA0C,CAAC;IAC1E,KAAK,MAAM,SAAS,IAAI,gBAAgB,CAAC,UAAU,EAAE,CAAC;QACrD,KAAK,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,SAAS,CAAC,KAAK,EAAE,CAAC;YAC5C,eAAe,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;QAChD,CAAC;IACF,CAAC;IAED,MAAM,YAAY,GAAa,EAAE,CAAC;IAClC,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,mBAAmB,EAAE,CAAC;QACjD,MAAM,IAAI,GAAG,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACvC,IAAI,CAAC,IAAI,EAAE,CAAC;YACX,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACxB,SAAS;QACV,CAAC;QACD,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;YAC7B,gBAAgB,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;YACpD,SAAS;QACV,CAAC;QACD,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC/B,gBAAgB,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;YACrD,SAAS;QACV,CAAC;QACD,WAAW,CAAC,IAAI,CAAC;YAChB,IAAI,EAAE,OAAO;YACb,OAAO,EAAE,qBAAqB,IAAI,oBAAoB;SACtD,CAAC,CAAC;IACJ,CAAC;IAED,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC7B,WAAW,CAAC,IAAI,CAAC;YAChB,IAAI,EAAE,OAAO;YACb,OAAO,EAAE,iBAAiB,YAAY,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,YAAY,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;SACvH,CAAC,CAAC;IACJ,CAAC;IAED,OAAO,WAAW,CAAC;AAAA,CACnB;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,0BAA0B,CAC/C,OAA0C,EACV;IAChC,MAAM,GAAG,GAAG,WAAW,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IACrC,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,WAAW,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;IAClF,MAAM,WAAW,GAAoC,EAAE,CAAC;IAExD,2EAAyE;IACzE,iEAAiE;IACjE,IAAI,qBAA8D,CAAC;IACnE,IAAI,CAAC,OAAO,CAAC,YAAY,EAAE,CAAC;QAC3B,IAAI,CAAC;YACJ,qBAAqB,GAAG,IAAI,2BAA2B,CACtD,IAAI,CAAC,QAAQ,EAAE,+BAA+B,CAAC,EAC/C,OAAO,CAAC,SAAS,CACjB,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAChB,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACvE,WAAW,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,qCAAqC,OAAO,EAAE,EAAE,CAAC,CAAC;QAChG,CAAC;IACF,CAAC;IAED,MAAM,eAAe,GAAG,OAAO,CAAC,eAAe,IAAI,eAAe,CAAC,MAAM,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;IACzF,MAAM,YAAY,GAAG,eAAe,CAAC,wBAAwB,EAAE,CAAC,YAAY,CAAC;IAC7E,MAAM,gBAAgB,GAAG,YAAY;QACpC,CAAC,CAAC,EAAE,QAAQ,EAAE,YAAY,EAAE,OAAO,EAAE,eAAe,CAAC,wBAAwB,EAAE,CAAC,WAAW,EAAE;QAC7F,CAAC,CAAC,SAAS,CAAC;IAEb,kFAAkF;IAClF,mFAAmF;IACnF,iFAAiF;IACjF,iFAAiF;IACjF,qFAAqF;IACrF,MAAM,sBAAsB,GAAG,4BAA4B,EAAE,CAAC;IAC9D,MAAM,YAAY,GACjB,OAAO,CAAC,YAAY;QACpB,CAAC,MAAM,YAAY,CAAC,MAAM,CAAC;YAC1B,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,mBAAmB,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;YAC7G,WAAW,EAAE,sBAAsB;YACnC,UAAU,EAAE,IAAI,CAAC,QAAQ,EAAE,aAAa,CAAC;YACzC,MAAM,EAAE,OAAO,CAAC,kBAAkB;YAClC,qBAAqB;YACrB,gBAAgB;SAChB,CAAC,CAAC,CAAC;IACL,MAAM,cAAc,GAAG,IAAI,qBAAqB,CAAC;QAChD,GAAG,CAAC,OAAO,CAAC,qBAAqB,IAAI,EAAE,CAAC;QACxC,GAAG;QACH,QAAQ;QACR,eAAe;KACf,CAAC,CAAC;IACH,MAAM,cAAc,CAAC,MAAM,CAAC,OAAO,CAAC,2BAA2B,CAAC,CAAC;IAEjE,MAAM,gBAAgB,GAAG,cAAc,CAAC,aAAa,EAAE,CAAC;IACxD,KAAK,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,aAAa,EAAE,IAAI,gBAAgB,CAAC,OAAO,CAAC,4BAA4B,EAAE,CAAC;QACrG,IAAI,CAAC;YACJ,YAAY,CAAC,gBAAgB,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QAC7C,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAChB,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACvE,WAAW,CAAC,IAAI,CAAC;gBAChB,IAAI,EAAE,OAAO;gBACb,OAAO,EAAE,cAAc,aAAa,YAAY,OAAO,EAAE;aACzD,CAAC,CAAC;QACJ,CAAC;IACF,CAAC;IACD,gBAAgB,CAAC,OAAO,CAAC,4BAA4B,GAAG,EAAE,CAAC;IAC3D,KAAK,MAAM,EAAE,QAAQ,EAAE,aAAa,EAAE,IAAI,gBAAgB,CAAC,OAAO,CAAC,kCAAkC,EAAE,CAAC;QACvG,IAAI,CAAC;YACJ,YAAY,CAAC,sBAAsB,CAAC,QAAQ,CAAC,CAAC;QAC/C,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAChB,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACvE,WAAW,CAAC,IAAI,CAAC;gBAChB,IAAI,EAAE,OAAO;gBACb,OAAO,EAAE,cAAc,aAAa,YAAY,OAAO,EAAE;aACzD,CAAC,CAAC;QACJ,CAAC;IACF,CAAC;IACD,gBAAgB,CAAC,OAAO,CAAC,kCAAkC,GAAG,EAAE,CAAC;IACjE,MAAM,YAAY,CAAC,OAAO,CAAC,EAAE,YAAY,EAAE,KAAK,EAAE,CAAC,CAAC;IACpD,WAAW,CAAC,IAAI,CAAC,GAAG,wBAAwB,CAAC,cAAc,EAAE,OAAO,CAAC,mBAAmB,CAAC,CAAC,CAAC;IAE3F,gFAAgF;IAChF,2EAA2E;IAC3E,kFAAkF;IAClF,uBAAuB;IACvB,MAAM,SAAS,GAAG,IAAI,cAAc,EAAE,CAAC;IACvC,IAAI,OAA4B,CAAC;IACjC,IAAI,QAA2D,CAAC;IAChE,IAAI,aAAa,GAAG,KAAK,CAAC;IAC1B,IAAI,CAAC;QACJ,QAAQ,GAAG,kBAAkB,CAAC,eAAe,CAAC,cAAc,EAAE,EAAE,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC,CAAC;QACpF,OAAO,GAAG,IAAI,OAAO,CAAC,QAAQ,EAAE;YAC/B,cAAc,EAAE,CAAC,MAAM,EAAE,EAAE,CAC1B,SAAS,CAAC,MAAM,CAAC;gBAChB,QAAQ,EAAE,MAAM,CAAC,QAAQ;gBACzB,IAAI,EAAE,MAAM,CAAC,IAAI;gBACjB,KAAK,EAAE,MAAM,CAAC,KAAK;gBACnB,OAAO,EAAE,MAAM,CAAC,QAAQ;gBACxB,GAAG,CAAC,MAAM,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC;aACjE,CAAC;SACH,CAAC,CAAC;QACH,aAAa,GAAG,QAAQ,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC;QAC5C,yEAAyE;QACzE,0EAA0E;QAC1E,8EAA8E;QAC9E,8EAA8E;QAC9E,yDAAyD;QACzD,IAAI,aAAa;YAAE,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC;IAC1C,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QAChB,4EAA4E;QAC5E,uEAAuE;QACvE,+EAA+E;QAC/E,gFAAgF;QAChF,gFAAgF;QAChF,gFAAgF;QAChF,2EAA2E;QAC3E,4CAA4C;QAC5C,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;QAClG,MAAM,aAAa,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,CACrD,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,KAAK,UAAU,IAAI,MAAM,CAAC,KAAK,KAAK,UAAU,CACtE,CAAC;QACF,MAAM,OAAO,GACZ,aAAa,CAAC,MAAM,GAAG,CAAC;YACvB,CAAC,CAAC,aAAa;iBACZ,GAAG,CACH,CAAC,MAAM,EAAE,EAAE,CACV,GAAG,MAAM,CAAC,QAAQ,KAAK,WAAW,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,GAAG,QAAQ,MAAM,CAAC,IAAI,KAAK,MAAM,CAAC,MAAM,IAAI,eAAe,EAAE,CACzH;iBACA,IAAI,CAAC,IAAI,CAAC;YACb,CAAC,CAAC,KAAK,YAAY,KAAK;gBACvB,CAAC,CAAC,KAAK,CAAC,OAAO;gBACf,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACnB,WAAW,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,uBAAuB,OAAO,EAAE,EAAE,CAAC,CAAC;QAC/E,2EAA2E;QAC3E,4EAA4E;QAC5E,4EAA4E;QAC5E,MAAM,OAAO,EAAE,OAAO,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAC,CAAC,CAAC,CAAC;QACzC,aAAa,GAAG,KAAK,CAAC;QACtB,OAAO,GAAG,IAAI,OAAO,CAAC,EAAE,SAAS,EAAE,GAAG,EAAE,OAAO,EAAE,EAAE,EAAE,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC;IACpF,CAAC;IACD,MAAM,cAAc,GAAG,IAAI,cAAc,CAAC,OAAO,CAAC,CAAC;IAEnD,OAAO;QACN,GAAG;QACH,QAAQ;QACR,YAAY;QACZ,eAAe;QACf,cAAc;QACd,OAAO;QACP,cAAc;QACd,aAAa;QACb,SAAS;QACT,WAAW;QACX,KAAK,EAAE,KAAK,IAAI,EAAE,CAAC;YAClB,sEAAsE;YACtE,qEAAqE;YACrE,MAAM,cAAc,CAAC,OAAO,EAAE,CAAC;YAC/B,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC;YACxB,IAAI,CAAC,OAAO,CAAC,YAAY;gBAAE,YAAY,CAAC,KAAK,EAAE,CAAC;QAAA,CAChD;KACD,CAAC;AAAA,CACF;AAED;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,8BAA8B,CACnD,OAA8C,EACV;IACpC,MAAM,EAAE,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,GAAG,OAAO,CAAC,QAAQ,CAAC;IACpE,8EAA8E;IAC9E,iFAAiF;IACjF,gFAAgF;IAChF,kFAAkF;IAClF,kFAAkF;IAClF,mFAAmF;IACnF,4EAA4E;IAC5E,iFAAiF;IACjF,uBAAuB;IACvB,MAAM,qBAAqB,GAAG,aAAa,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,SAAS,CAAC;IACzE,MAAM,aAAa,GAA8B,aAAa;QAC7D,CAAC,CAAC;YACA,OAAO,EAAE,KAAK,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,CAAC;gBACxD,MAAM,UAAU,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;gBACvD,IAAI,CAAC,UAAU;oBAAE,OAAO,SAAS,CAAC;gBAClC,OAAO,UAAU,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;YAAA,CACzD;SACD;QACF,CAAC,CAAC,SAAS,CAAC;IAEb,8EAA8E;IAC9E,iFAAiF;IACjF,2CAA2C;IAC3C,mFAAmF;IACnF,mFAAmF;IACnF,8EAA8E;IAC9E,MAAM,eAAe,GAAG,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAC;IACzD,MAAM,mBAAmB,GAAG,0BAA0B,CAAC,eAAe,CAAC,oBAAoB,EAAE,CAAC;QAC7F,CAAC,CAAC,iCAAiC,CAAC,GAAG,EAAE,CAAC,eAAe,CAAC,oBAAoB,EAAE,CAAC;QACjF,CAAC,CAAC,SAAS,CAAC;IAEb,OAAO,kBAAkB,CAAC;QACzB,GAAG,EAAE,OAAO,CAAC,QAAQ,CAAC,GAAG;QACzB,QAAQ,EAAE,OAAO,CAAC,QAAQ,CAAC,QAAQ;QACnC,YAAY,EAAE,OAAO,CAAC,QAAQ,CAAC,YAAY;QAC3C,eAAe,EAAE,OAAO,CAAC,QAAQ,CAAC,eAAe;QACjD,cAAc,EAAE,OAAO,CAAC,QAAQ,CAAC,cAAc;QAC/C,cAAc,EAAE,OAAO,CAAC,cAAc;QACtC,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,aAAa,EAAE,OAAO,CAAC,aAAa;QACpC,YAAY,EAAE,OAAO,CAAC,YAAY;QAClC,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,YAAY,EAAE,OAAO,CAAC,YAAY;QAClC,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,WAAW,EAAE,OAAO,CAAC,WAAW;QAChC,iBAAiB,EAAE,OAAO,CAAC,iBAAiB;QAC5C,cAAc,EAAE,OAAO,CAAC,cAAc;QACtC,qBAAqB;QACrB,aAAa;QACb,mBAAmB;KACnB,CAAC,CAAC;AAAA,CACH","sourcesContent":["import { join } from \"node:path\";\nimport type { Model } from \"@earendil-works/pi-ai\";\nimport type { ThinkingLevel } from \"apex-code-agent-core\";\nimport { getAgentDir, getAuthPath } from \"../config.ts\";\nimport { resolvePath } from \"../utils/paths.ts\";\nimport type { SessionStartEvent, ToolDefinition } from \"./extensions/index.ts\";\nimport { LspDiagnostics } from \"./lsp/diagnostics.ts\";\nimport { LspPool } from \"./lsp/pool.ts\";\nimport { resolveLspRegistry } from \"./lsp/registry.ts\";\nimport { LspStatusStore } from \"./lsp/status.ts\";\nimport { ModelRuntime } from \"./model-runtime.ts\";\nimport type { PermissionGateOptions } from \"./permissions/gate.ts\";\nimport {\n\tDefaultResourceLoader,\n\ttype DefaultResourceLoaderOptions,\n\ttype ResourceLoader,\n\ttype ResourceLoaderReloadOptions,\n} from \"./resource-loader.ts\";\nimport { createSandboxCredentialStore } from \"./sandbox/rpc/credential-client.ts\";\nimport { type CreateAgentSessionOptions, type CreateAgentSessionResult, createAgentSession } from \"./sdk.ts\";\nimport type { SessionManager } from \"./session-manager.ts\";\nimport { SettingsManager } from \"./settings-manager.ts\";\nimport type { LspOperations } from \"./tools/lsp.ts\";\nimport { SqliteUsagePerformanceStore } from \"./usage-performance-store.ts\";\nimport { createDeferredWebSearchOperations, resolveWebSearchOperations } from \"./web-search-provider.ts\";\n\n/** Filename of the shared durable-state database within an agent directory (roadmap Phase 8). */\nconst DURABLE_STATE_DATABASE_FILENAME = \"state.sqlite\";\n\n/**\n * Non-fatal issues collected while creating services or sessions.\n *\n * Runtime creation returns diagnostics to the caller instead of printing or\n * exiting. The app layer decides whether warnings should be shown and whether\n * errors should abort startup.\n */\nexport interface AgentSessionRuntimeDiagnostic {\n\ttype: \"info\" | \"warning\" | \"error\";\n\tmessage: string;\n}\n\n/**\n * Inputs for creating cwd-bound runtime services.\n *\n * These services are recreated whenever the effective session cwd changes.\n * CLI-provided resource paths should be resolved to absolute paths before they\n * reach this function, so later cwd switches do not reinterpret them.\n */\nexport interface CreateAgentSessionServicesOptions {\n\tcwd: string;\n\tagentDir?: string;\n\t/**\n\t * Session id to stamp on every usage-performance sample this runtime records.\n\t * Only observed when `modelRuntime` is not already provided — a caller-supplied\n\t * runtime owns its own store, if any.\n\t */\n\tsessionId?: string;\n\tsettingsManager?: SettingsManager;\n\tmodelRuntime?: ModelRuntime;\n\tmodelRuntimeSignal?: AbortSignal;\n\textensionFlagValues?: Map<string, boolean | string>;\n\tresourceLoaderOptions?: Omit<DefaultResourceLoaderOptions, \"cwd\" | \"agentDir\" | \"settingsManager\">;\n\tresourceLoaderReloadOptions?: ResourceLoaderReloadOptions;\n}\n\n/**\n * Inputs for creating an AgentSession from already-created services.\n *\n * Use this after services exist and any cwd-bound model/tool/session options\n * have been resolved against those services.\n */\nexport interface CreateAgentSessionFromServicesOptions {\n\tservices: AgentSessionServices;\n\tsessionManager: SessionManager;\n\tsessionStartEvent?: SessionStartEvent;\n\tmodel?: Model<any>;\n\tthinkingLevel?: ThinkingLevel;\n\tscopedModels?: Array<{ model: Model<any>; thinkingLevel?: ThinkingLevel }>;\n\ttools?: string[];\n\texcludeTools?: CreateAgentSessionOptions[\"excludeTools\"];\n\tnoTools?: CreateAgentSessionOptions[\"noTools\"];\n\tcustomTools?: ToolDefinition[];\n\tpermissionGate?: Omit<PermissionGateOptions, \"getContract\">;\n}\n\n/**\n * Coherent cwd-bound runtime services for one effective session cwd.\n *\n * This is infrastructure only. The AgentSession itself is created separately so\n * session options can be resolved against these services first.\n */\nexport interface AgentSessionServices {\n\tcwd: string;\n\tagentDir: string;\n\tmodelRuntime: ModelRuntime;\n\tsettingsManager: SettingsManager;\n\tresourceLoader: ResourceLoader;\n\tlspPool: LspPool;\n\t/**\n\t * Wraps `lspPool` for `DiagnosticsOperations.afterMutation` (LSP.4). Structurally\n\t * compatible with `core/tools/diagnostics.ts`'s `DiagnosticsOperations` -- callers\n\t * pass this value directly, never importing `core/lsp/*` themselves.\n\t */\n\tlspDiagnostics: LspDiagnostics;\n\t/** True when at least one LSP server resolved -- gates registering the `lsp` tool (LSP.5). */\n\tlspConfigured: boolean;\n\t/**\n\t * Chronological, bounded record of every server-root state transition observed by\n\t * `lspPool` for this services lifetime (LSP.2). Inspectable structured state -- not\n\t * wired to any user-facing surface by this plan (see `docs/plans/2026-08-18-lsp.md`,\n\t * Task LSP.2: this is not a `/doctor` task).\n\t */\n\tlspStatus: LspStatusStore;\n\tdiagnostics: AgentSessionRuntimeDiagnostic[];\n\tclose(): Promise<void>;\n}\n\nfunction applyExtensionFlagValues(\n\tresourceLoader: ResourceLoader,\n\textensionFlagValues: Map<string, boolean | string> | undefined,\n): AgentSessionRuntimeDiagnostic[] {\n\tif (!extensionFlagValues) {\n\t\treturn [];\n\t}\n\n\tconst diagnostics: AgentSessionRuntimeDiagnostic[] = [];\n\tconst extensionsResult = resourceLoader.getExtensions();\n\tconst registeredFlags = new Map<string, { type: \"boolean\" | \"string\" }>();\n\tfor (const extension of extensionsResult.extensions) {\n\t\tfor (const [name, flag] of extension.flags) {\n\t\t\tregisteredFlags.set(name, { type: flag.type });\n\t\t}\n\t}\n\n\tconst unknownFlags: string[] = [];\n\tfor (const [name, value] of extensionFlagValues) {\n\t\tconst flag = registeredFlags.get(name);\n\t\tif (!flag) {\n\t\t\tunknownFlags.push(name);\n\t\t\tcontinue;\n\t\t}\n\t\tif (flag.type === \"boolean\") {\n\t\t\textensionsResult.runtime.flagValues.set(name, true);\n\t\t\tcontinue;\n\t\t}\n\t\tif (typeof value === \"string\") {\n\t\t\textensionsResult.runtime.flagValues.set(name, value);\n\t\t\tcontinue;\n\t\t}\n\t\tdiagnostics.push({\n\t\t\ttype: \"error\",\n\t\t\tmessage: `Extension flag \"--${name}\" requires a value`,\n\t\t});\n\t}\n\n\tif (unknownFlags.length > 0) {\n\t\tdiagnostics.push({\n\t\t\ttype: \"error\",\n\t\t\tmessage: `Unknown option${unknownFlags.length === 1 ? \"\" : \"s\"}: ${unknownFlags.map((name) => `--${name}`).join(\", \")}`,\n\t\t});\n\t}\n\n\treturn diagnostics;\n}\n\n/**\n * Create cwd-bound runtime services.\n *\n * Returns services plus diagnostics. It does not create an AgentSession.\n */\nexport async function createAgentSessionServices(\n\toptions: CreateAgentSessionServicesOptions,\n): Promise<AgentSessionServices> {\n\tconst cwd = resolvePath(options.cwd);\n\tconst agentDir = options.agentDir ? resolvePath(options.agentDir) : getAgentDir();\n\tconst diagnostics: AgentSessionRuntimeDiagnostic[] = [];\n\n\t// A ledger failure must never block session creation or a turn — open it\n\t// best-effort and degrade to a diagnostic, never a thrown error.\n\tlet usagePerformanceStore: SqliteUsagePerformanceStore | undefined;\n\tif (!options.modelRuntime) {\n\t\ttry {\n\t\t\tusagePerformanceStore = new SqliteUsagePerformanceStore(\n\t\t\t\tjoin(agentDir, DURABLE_STATE_DATABASE_FILENAME),\n\t\t\t\toptions.sessionId,\n\t\t\t);\n\t\t} catch (error) {\n\t\t\tconst message = error instanceof Error ? error.message : String(error);\n\t\t\tdiagnostics.push({ type: \"warning\", message: `Usage/cost recording unavailable: ${message}` });\n\t\t}\n\t}\n\n\tconst settingsManager = options.settingsManager ?? SettingsManager.create(cwd, agentDir);\n\tconst otlpEndpoint = settingsManager.getObservabilitySettings().otlpEndpoint;\n\tconst otlpExportConfig = otlpEndpoint\n\t\t? { endpoint: otlpEndpoint, headers: settingsManager.getObservabilitySettings().otlpHeaders }\n\t\t: undefined;\n\n\t// Inside a sandboxed session the supervisor advertises a credential write channel\n\t// (spec: 2026-08-22-supervisor-mediated-credential-writes). Reads are unchanged --\n\t// still the read-only projection of the host credential file -- while writes and\n\t// deletes travel the supervisor-owned socket instead of failing on the read-only\n\t// mount. Outside a sandbox this resolves to undefined and the default store applies.\n\tconst sandboxCredentialStore = createSandboxCredentialStore();\n\tconst modelRuntime =\n\t\toptions.modelRuntime ??\n\t\t(await ModelRuntime.create({\n\t\t\tauthPath: process.env.APEX_CODE_AUTH_PATH ?? (options.agentDir ? join(agentDir, \"auth.json\") : getAuthPath()),\n\t\t\tcredentials: sandboxCredentialStore,\n\t\t\tmodelsPath: join(agentDir, \"models.json\"),\n\t\t\tsignal: options.modelRuntimeSignal,\n\t\t\tusagePerformanceStore,\n\t\t\totlpExportConfig,\n\t\t}));\n\tconst resourceLoader = new DefaultResourceLoader({\n\t\t...(options.resourceLoaderOptions ?? {}),\n\t\tcwd,\n\t\tagentDir,\n\t\tsettingsManager,\n\t});\n\tawait resourceLoader.reload(options.resourceLoaderReloadOptions);\n\n\tconst extensionsResult = resourceLoader.getExtensions();\n\tfor (const { name, config, extensionPath } of extensionsResult.runtime.pendingProviderRegistrations) {\n\t\ttry {\n\t\t\tmodelRuntime.registerProvider(name, config);\n\t\t} catch (error) {\n\t\t\tconst message = error instanceof Error ? error.message : String(error);\n\t\t\tdiagnostics.push({\n\t\t\t\ttype: \"error\",\n\t\t\t\tmessage: `Extension \"${extensionPath}\" error: ${message}`,\n\t\t\t});\n\t\t}\n\t}\n\textensionsResult.runtime.pendingProviderRegistrations = [];\n\tfor (const { provider, extensionPath } of extensionsResult.runtime.pendingNativeProviderRegistrations) {\n\t\ttry {\n\t\t\tmodelRuntime.registerNativeProvider(provider);\n\t\t} catch (error) {\n\t\t\tconst message = error instanceof Error ? error.message : String(error);\n\t\t\tdiagnostics.push({\n\t\t\t\ttype: \"error\",\n\t\t\t\tmessage: `Extension \"${extensionPath}\" error: ${message}`,\n\t\t\t});\n\t\t}\n\t}\n\textensionsResult.runtime.pendingNativeProviderRegistrations = [];\n\tawait modelRuntime.refresh({ allowNetwork: false });\n\tdiagnostics.push(...applyExtensionFlagValues(resourceLoader, options.extensionFlagValues));\n\n\t// `lspStatus` is constructed unconditionally (and outside the try) so it always\n\t// records real state transitions the pool experiences below, including the\n\t// eager-start failure the catch block handles -- not just a snapshot taken at one\n\t// fixed point in time.\n\tconst lspStatus = new LspStatusStore();\n\tlet lspPool: LspPool | undefined;\n\tlet registry: ReturnType<typeof resolveLspRegistry> | undefined;\n\tlet lspConfigured = false;\n\ttry {\n\t\tregistry = resolveLspRegistry(settingsManager.getLspSettings(), { workspace: cwd });\n\t\tlspPool = new LspPool(registry, {\n\t\t\tonStatusChange: (status) =>\n\t\t\t\tlspStatus.record({\n\t\t\t\t\tserverId: status.serverId,\n\t\t\t\t\troot: status.root,\n\t\t\t\t\tstate: status.state,\n\t\t\t\t\tattempt: status.attempts,\n\t\t\t\t\t...(status.reason === undefined ? {} : { reason: status.reason }),\n\t\t\t\t}),\n\t\t});\n\t\tlspConfigured = registry.servers.length > 0;\n\t\t// Per the spec's \"Resolved configuration, ownership, and lifecycle\": any\n\t\t// configured entry that cannot resolve, spawn, or initialize its cwd-root\n\t\t// process within its timeout is a startup misconfiguration -- fail fast here,\n\t\t// following core/permissions/startup.ts's precedent, rather than let a broken\n\t\t// server surface only when a tool call needs it mid-run.\n\t\tif (lspConfigured) await lspPool.start();\n\t} catch (error) {\n\t\t// Name the failing binary(ies), not just the raw client/registry error: the\n\t\t// registry itself already does this for a resolution failure (missing/\n\t\t// un-spawnable binary names the command and lookup path), but a `pool.start()`\n\t\t// rejection surfaces only the first client's bare error (e.g. \"initialize timed\n\t\t// out\"), with no server id attached. `registry.servers` (resolved commands) and\n\t\t// `lspPool.status()` (which entries actually failed) are both in scope here, so\n\t\t// build the richer message without changing `LspPoolStatus`'s shape or the\n\t\t// pool's own error-propagation wire format.\n\t\tconst commandById = new Map(registry?.servers.map((server) => [server.id, server.command]) ?? []);\n\t\tconst failedEntries = (lspPool?.status() ?? []).filter(\n\t\t\t(status) => status.state === \"degraded\" || status.state === \"disabled\",\n\t\t);\n\t\tconst message =\n\t\t\tfailedEntries.length > 0\n\t\t\t\t? failedEntries\n\t\t\t\t\t\t.map(\n\t\t\t\t\t\t\t(status) =>\n\t\t\t\t\t\t\t\t`${status.serverId} (${commandById.get(status.serverId) ?? \"?\"}) at ${status.root}: ${status.reason ?? \"unknown error\"}`,\n\t\t\t\t\t\t)\n\t\t\t\t\t\t.join(\"; \")\n\t\t\t\t: error instanceof Error\n\t\t\t\t\t? error.message\n\t\t\t\t\t: String(error);\n\t\tdiagnostics.push({ type: \"error\", message: `LSP startup failed: ${message}` });\n\t\t// A pool that got partway through eager start may already have spawned and\n\t\t// initialized sibling servers successfully; discarding it without disposing\n\t\t// would orphan those child processes rather than tearing them down cleanly.\n\t\tawait lspPool?.dispose().catch(() => {});\n\t\tlspConfigured = false;\n\t\tlspPool = new LspPool({ workspace: cwd, servers: [], platform: process.platform });\n\t}\n\tconst lspDiagnostics = new LspDiagnostics(lspPool);\n\n\treturn {\n\t\tcwd,\n\t\tagentDir,\n\t\tmodelRuntime,\n\t\tsettingsManager,\n\t\tresourceLoader,\n\t\tlspPool,\n\t\tlspDiagnostics,\n\t\tlspConfigured,\n\t\tlspStatus,\n\t\tdiagnostics,\n\t\tclose: async () => {\n\t\t\t// Diagnostics first: it still needs live LSP clients to send didClose\n\t\t\t// during its own teardown, so it must not outlive the pool it wraps.\n\t\t\tawait lspDiagnostics.dispose();\n\t\t\tawait lspPool.dispose();\n\t\t\tif (!options.modelRuntime) modelRuntime.close();\n\t\t},\n\t};\n}\n\n/**\n * Create an AgentSession from previously created services.\n *\n * This keeps session creation separate from service creation so callers can\n * resolve model, thinking, tools, and other session inputs against the target\n * cwd before constructing the session.\n */\nexport async function createAgentSessionFromServices(\n\toptions: CreateAgentSessionFromServicesOptions,\n): Promise<CreateAgentSessionResult> {\n\tconst { lspPool, lspDiagnostics, lspConfigured } = options.services;\n\t// Both gated on `lspConfigured` (at least one server resolved), not per-path:\n\t// the spec's \"no diagnostics injection or result change whatsoever when `lsp` is\n\t// unconfigured\" is a session-level guarantee. A session with servers configured\n\t// for *some* languages still injects diagnosticsOperations -- a mutated path with\n\t// no matching server correctly resolves to the explicit `unavailable` outcome via\n\t// `LspDiagnostics.afterMutation`'s own per-path `pool.acquire`, it is simply never\n\t// asked at all when the session has no servers whatsoever. `lspDiagnostics`\n\t// already matches `DiagnosticsOperations` structurally, so it is passed directly\n\t// rather than wrapped.\n\tconst diagnosticsOperations = lspConfigured ? lspDiagnostics : undefined;\n\tconst lspOperations: LspOperations | undefined = lspConfigured\n\t\t? {\n\t\t\t\trequest: async (absolutePath, method, params, signal) => {\n\t\t\t\t\tconst connection = await lspPool.acquire(absolutePath);\n\t\t\t\t\tif (!connection) return undefined;\n\t\t\t\t\treturn connection.client.request(method, params, signal);\n\t\t\t\t},\n\t\t\t}\n\t\t: undefined;\n\n\t// Read per call rather than captured here. The tool registry is built once at\n\t// session construction, so a key saved from the settings panel mid-session would\n\t// otherwise not take effect until restart.\n\t// Two different questions. Whether a credential resolves *now* decides whether the\n\t// tool is active, because activation happens once at construction. Resolution then\n\t// stays deferred so a key changed mid-session is picked up without a restart.\n\tconst settingsManager = options.services.settingsManager;\n\tconst webSearchOperations = resolveWebSearchOperations(settingsManager.getWebSearchSettings())\n\t\t? createDeferredWebSearchOperations(() => settingsManager.getWebSearchSettings())\n\t\t: undefined;\n\n\treturn createAgentSession({\n\t\tcwd: options.services.cwd,\n\t\tagentDir: options.services.agentDir,\n\t\tmodelRuntime: options.services.modelRuntime,\n\t\tsettingsManager: options.services.settingsManager,\n\t\tresourceLoader: options.services.resourceLoader,\n\t\tsessionManager: options.sessionManager,\n\t\tmodel: options.model,\n\t\tthinkingLevel: options.thinkingLevel,\n\t\tscopedModels: options.scopedModels,\n\t\ttools: options.tools,\n\t\texcludeTools: options.excludeTools,\n\t\tnoTools: options.noTools,\n\t\tcustomTools: options.customTools,\n\t\tsessionStartEvent: options.sessionStartEvent,\n\t\tpermissionGate: options.permissionGate,\n\t\tdiagnosticsOperations,\n\t\tlspOperations,\n\t\twebSearchOperations,\n\t});\n}\n"]}
|
|
1
|
+
{"version":3,"file":"agent-session-services.js","sourceRoot":"","sources":["../../src/core/agent-session-services.ts"],"names":[],"mappings":"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","sourcesContent":["import { join } from \"node:path\";\nimport type { Model } from \"@earendil-works/pi-ai\";\nimport type { ThinkingLevel } from \"apex-code-agent-core\";\nimport { getAgentDir, getAuthPath } from \"../config.ts\";\nimport { resolvePath } from \"../utils/paths.ts\";\nimport type { SessionStartEvent, ToolDefinition } from \"./extensions/index.ts\";\nimport { LspDiagnostics } from \"./lsp/diagnostics.ts\";\nimport { LspPool } from \"./lsp/pool.ts\";\nimport { resolveLspRegistry } from \"./lsp/registry.ts\";\nimport { LspStatusStore } from \"./lsp/status.ts\";\nimport { ModelRuntime } from \"./model-runtime.ts\";\nimport type { PermissionGateOptions } from \"./permissions/gate.ts\";\nimport type { PermissionResponder } from \"./permissions/responder.ts\";\nimport {\n\tDefaultResourceLoader,\n\ttype DefaultResourceLoaderOptions,\n\ttype ResourceLoader,\n\ttype ResourceLoaderReloadOptions,\n} from \"./resource-loader.ts\";\nimport { createSandboxCredentialStore } from \"./sandbox/rpc/credential-client.ts\";\nimport { type CreateAgentSessionOptions, type CreateAgentSessionResult, createAgentSession } from \"./sdk.ts\";\nimport type { SessionManager } from \"./session-manager.ts\";\nimport { SettingsManager } from \"./settings-manager.ts\";\nimport type { LspOperations } from \"./tools/lsp.ts\";\nimport { SqliteUsagePerformanceStore } from \"./usage-performance-store.ts\";\nimport { createDeferredWebSearchOperations, resolveWebSearchOperations } from \"./web-search-provider.ts\";\n\n/** Filename of the shared durable-state database within an agent directory (roadmap Phase 8). */\nconst DURABLE_STATE_DATABASE_FILENAME = \"state.sqlite\";\n\n/**\n * Non-fatal issues collected while creating services or sessions.\n *\n * Runtime creation returns diagnostics to the caller instead of printing or\n * exiting. The app layer decides whether warnings should be shown and whether\n * errors should abort startup.\n */\nexport interface AgentSessionRuntimeDiagnostic {\n\ttype: \"info\" | \"warning\" | \"error\";\n\tmessage: string;\n}\n\n/**\n * Inputs for creating cwd-bound runtime services.\n *\n * These services are recreated whenever the effective session cwd changes.\n * CLI-provided resource paths should be resolved to absolute paths before they\n * reach this function, so later cwd switches do not reinterpret them.\n */\nexport interface CreateAgentSessionServicesOptions {\n\tcwd: string;\n\tagentDir?: string;\n\t/**\n\t * Session id to stamp on every usage-performance sample this runtime records.\n\t * Only observed when `modelRuntime` is not already provided — a caller-supplied\n\t * runtime owns its own store, if any.\n\t */\n\tsessionId?: string;\n\tsettingsManager?: SettingsManager;\n\tmodelRuntime?: ModelRuntime;\n\tmodelRuntimeSignal?: AbortSignal;\n\textensionFlagValues?: Map<string, boolean | string>;\n\tresourceLoaderOptions?: Omit<DefaultResourceLoaderOptions, \"cwd\" | \"agentDir\" | \"settingsManager\">;\n\tresourceLoaderReloadOptions?: ResourceLoaderReloadOptions;\n}\n\n/**\n * Inputs for creating an AgentSession from already-created services.\n *\n * Use this after services exist and any cwd-bound model/tool/session options\n * have been resolved against those services.\n */\nexport interface CreateAgentSessionFromServicesOptions {\n\tservices: AgentSessionServices;\n\tsessionManager: SessionManager;\n\tsessionStartEvent?: SessionStartEvent;\n\tmodel?: Model<any>;\n\tthinkingLevel?: ThinkingLevel;\n\tscopedModels?: Array<{ model: Model<any>; thinkingLevel?: ThinkingLevel }>;\n\ttools?: string[];\n\texcludeTools?: CreateAgentSessionOptions[\"excludeTools\"];\n\tnoTools?: CreateAgentSessionOptions[\"noTools\"];\n\tcustomTools?: ToolDefinition[];\n\tpermissionGate?: Omit<PermissionGateOptions, \"getContract\">;\n\t/** Optional headless permission bridge (ACP, spec 2026-08-31-acp-adapter.md). */\n\tpermissionResponderFactory?: () => PermissionResponder | undefined;\n}\n\n/**\n * Coherent cwd-bound runtime services for one effective session cwd.\n *\n * This is infrastructure only. The AgentSession itself is created separately so\n * session options can be resolved against these services first.\n */\nexport interface AgentSessionServices {\n\tcwd: string;\n\tagentDir: string;\n\tmodelRuntime: ModelRuntime;\n\tsettingsManager: SettingsManager;\n\tresourceLoader: ResourceLoader;\n\tlspPool: LspPool;\n\t/**\n\t * Wraps `lspPool` for `DiagnosticsOperations.afterMutation` (LSP.4). Structurally\n\t * compatible with `core/tools/diagnostics.ts`'s `DiagnosticsOperations` -- callers\n\t * pass this value directly, never importing `core/lsp/*` themselves.\n\t */\n\tlspDiagnostics: LspDiagnostics;\n\t/** True when at least one LSP server resolved -- gates registering the `lsp` tool (LSP.5). */\n\tlspConfigured: boolean;\n\t/**\n\t * Chronological, bounded record of every server-root state transition observed by\n\t * `lspPool` for this services lifetime (LSP.2). Inspectable structured state -- not\n\t * wired to any user-facing surface by this plan (see `docs/plans/2026-08-18-lsp.md`,\n\t * Task LSP.2: this is not a `/doctor` task).\n\t */\n\tlspStatus: LspStatusStore;\n\tdiagnostics: AgentSessionRuntimeDiagnostic[];\n\tclose(): Promise<void>;\n}\n\nfunction applyExtensionFlagValues(\n\tresourceLoader: ResourceLoader,\n\textensionFlagValues: Map<string, boolean | string> | undefined,\n): AgentSessionRuntimeDiagnostic[] {\n\tif (!extensionFlagValues) {\n\t\treturn [];\n\t}\n\n\tconst diagnostics: AgentSessionRuntimeDiagnostic[] = [];\n\tconst extensionsResult = resourceLoader.getExtensions();\n\tconst registeredFlags = new Map<string, { type: \"boolean\" | \"string\" }>();\n\tfor (const extension of extensionsResult.extensions) {\n\t\tfor (const [name, flag] of extension.flags) {\n\t\t\tregisteredFlags.set(name, { type: flag.type });\n\t\t}\n\t}\n\n\tconst unknownFlags: string[] = [];\n\tfor (const [name, value] of extensionFlagValues) {\n\t\tconst flag = registeredFlags.get(name);\n\t\tif (!flag) {\n\t\t\tunknownFlags.push(name);\n\t\t\tcontinue;\n\t\t}\n\t\tif (flag.type === \"boolean\") {\n\t\t\textensionsResult.runtime.flagValues.set(name, true);\n\t\t\tcontinue;\n\t\t}\n\t\tif (typeof value === \"string\") {\n\t\t\textensionsResult.runtime.flagValues.set(name, value);\n\t\t\tcontinue;\n\t\t}\n\t\tdiagnostics.push({\n\t\t\ttype: \"error\",\n\t\t\tmessage: `Extension flag \"--${name}\" requires a value`,\n\t\t});\n\t}\n\n\tif (unknownFlags.length > 0) {\n\t\tdiagnostics.push({\n\t\t\ttype: \"error\",\n\t\t\tmessage: `Unknown option${unknownFlags.length === 1 ? \"\" : \"s\"}: ${unknownFlags.map((name) => `--${name}`).join(\", \")}`,\n\t\t});\n\t}\n\n\treturn diagnostics;\n}\n\n/**\n * Create cwd-bound runtime services.\n *\n * Returns services plus diagnostics. It does not create an AgentSession.\n */\nexport async function createAgentSessionServices(\n\toptions: CreateAgentSessionServicesOptions,\n): Promise<AgentSessionServices> {\n\tconst cwd = resolvePath(options.cwd);\n\tconst agentDir = options.agentDir ? resolvePath(options.agentDir) : getAgentDir();\n\tconst diagnostics: AgentSessionRuntimeDiagnostic[] = [];\n\n\t// A ledger failure must never block session creation or a turn — open it\n\t// best-effort and degrade to a diagnostic, never a thrown error.\n\tlet usagePerformanceStore: SqliteUsagePerformanceStore | undefined;\n\tif (!options.modelRuntime) {\n\t\ttry {\n\t\t\tusagePerformanceStore = new SqliteUsagePerformanceStore(\n\t\t\t\tjoin(agentDir, DURABLE_STATE_DATABASE_FILENAME),\n\t\t\t\toptions.sessionId,\n\t\t\t);\n\t\t} catch (error) {\n\t\t\tconst message = error instanceof Error ? error.message : String(error);\n\t\t\tdiagnostics.push({ type: \"warning\", message: `Usage/cost recording unavailable: ${message}` });\n\t\t}\n\t}\n\n\tconst settingsManager = options.settingsManager ?? SettingsManager.create(cwd, agentDir);\n\tconst otlpEndpoint = settingsManager.getObservabilitySettings().otlpEndpoint;\n\tconst otlpExportConfig = otlpEndpoint\n\t\t? { endpoint: otlpEndpoint, headers: settingsManager.getObservabilitySettings().otlpHeaders }\n\t\t: undefined;\n\n\t// Inside a sandboxed session the supervisor advertises a credential write channel\n\t// (spec: 2026-08-22-supervisor-mediated-credential-writes). Reads are unchanged --\n\t// still the read-only projection of the host credential file -- while writes and\n\t// deletes travel the supervisor-owned socket instead of failing on the read-only\n\t// mount. Outside a sandbox this resolves to undefined and the default store applies.\n\tconst sandboxCredentialStore = createSandboxCredentialStore();\n\tconst modelRuntime =\n\t\toptions.modelRuntime ??\n\t\t(await ModelRuntime.create({\n\t\t\tauthPath: process.env.APEX_CODE_AUTH_PATH ?? (options.agentDir ? join(agentDir, \"auth.json\") : getAuthPath()),\n\t\t\tcredentials: sandboxCredentialStore,\n\t\t\tmodelsPath: join(agentDir, \"models.json\"),\n\t\t\tsignal: options.modelRuntimeSignal,\n\t\t\tusagePerformanceStore,\n\t\t\totlpExportConfig,\n\t\t}));\n\tconst resourceLoader = new DefaultResourceLoader({\n\t\t...(options.resourceLoaderOptions ?? {}),\n\t\tcwd,\n\t\tagentDir,\n\t\tsettingsManager,\n\t});\n\tawait resourceLoader.reload(options.resourceLoaderReloadOptions);\n\n\tconst extensionsResult = resourceLoader.getExtensions();\n\tfor (const { name, config, extensionPath } of extensionsResult.runtime.pendingProviderRegistrations) {\n\t\ttry {\n\t\t\tmodelRuntime.registerProvider(name, config);\n\t\t} catch (error) {\n\t\t\tconst message = error instanceof Error ? error.message : String(error);\n\t\t\tdiagnostics.push({\n\t\t\t\ttype: \"error\",\n\t\t\t\tmessage: `Extension \"${extensionPath}\" error: ${message}`,\n\t\t\t});\n\t\t}\n\t}\n\textensionsResult.runtime.pendingProviderRegistrations = [];\n\tfor (const { provider, extensionPath } of extensionsResult.runtime.pendingNativeProviderRegistrations) {\n\t\ttry {\n\t\t\tmodelRuntime.registerNativeProvider(provider);\n\t\t} catch (error) {\n\t\t\tconst message = error instanceof Error ? error.message : String(error);\n\t\t\tdiagnostics.push({\n\t\t\t\ttype: \"error\",\n\t\t\t\tmessage: `Extension \"${extensionPath}\" error: ${message}`,\n\t\t\t});\n\t\t}\n\t}\n\textensionsResult.runtime.pendingNativeProviderRegistrations = [];\n\tawait modelRuntime.refresh({ allowNetwork: false });\n\tdiagnostics.push(...applyExtensionFlagValues(resourceLoader, options.extensionFlagValues));\n\n\t// `lspStatus` is constructed unconditionally (and outside the try) so it always\n\t// records real state transitions the pool experiences below, including the\n\t// eager-start failure the catch block handles -- not just a snapshot taken at one\n\t// fixed point in time.\n\tconst lspStatus = new LspStatusStore();\n\tlet lspPool: LspPool | undefined;\n\tlet registry: ReturnType<typeof resolveLspRegistry> | undefined;\n\tlet lspConfigured = false;\n\ttry {\n\t\tregistry = resolveLspRegistry(settingsManager.getLspSettings(), { workspace: cwd });\n\t\tlspPool = new LspPool(registry, {\n\t\t\tonStatusChange: (status) =>\n\t\t\t\tlspStatus.record({\n\t\t\t\t\tserverId: status.serverId,\n\t\t\t\t\troot: status.root,\n\t\t\t\t\tstate: status.state,\n\t\t\t\t\tattempt: status.attempts,\n\t\t\t\t\t...(status.reason === undefined ? {} : { reason: status.reason }),\n\t\t\t\t}),\n\t\t});\n\t\tlspConfigured = registry.servers.length > 0;\n\t\t// Per the spec's \"Resolved configuration, ownership, and lifecycle\": any\n\t\t// configured entry that cannot resolve, spawn, or initialize its cwd-root\n\t\t// process within its timeout is a startup misconfiguration -- fail fast here,\n\t\t// following core/permissions/startup.ts's precedent, rather than let a broken\n\t\t// server surface only when a tool call needs it mid-run.\n\t\tif (lspConfigured) await lspPool.start();\n\t} catch (error) {\n\t\t// Name the failing binary(ies), not just the raw client/registry error: the\n\t\t// registry itself already does this for a resolution failure (missing/\n\t\t// un-spawnable binary names the command and lookup path), but a `pool.start()`\n\t\t// rejection surfaces only the first client's bare error (e.g. \"initialize timed\n\t\t// out\"), with no server id attached. `registry.servers` (resolved commands) and\n\t\t// `lspPool.status()` (which entries actually failed) are both in scope here, so\n\t\t// build the richer message without changing `LspPoolStatus`'s shape or the\n\t\t// pool's own error-propagation wire format.\n\t\tconst commandById = new Map(registry?.servers.map((server) => [server.id, server.command]) ?? []);\n\t\tconst failedEntries = (lspPool?.status() ?? []).filter(\n\t\t\t(status) => status.state === \"degraded\" || status.state === \"disabled\",\n\t\t);\n\t\tconst message =\n\t\t\tfailedEntries.length > 0\n\t\t\t\t? failedEntries\n\t\t\t\t\t\t.map(\n\t\t\t\t\t\t\t(status) =>\n\t\t\t\t\t\t\t\t`${status.serverId} (${commandById.get(status.serverId) ?? \"?\"}) at ${status.root}: ${status.reason ?? \"unknown error\"}`,\n\t\t\t\t\t\t)\n\t\t\t\t\t\t.join(\"; \")\n\t\t\t\t: error instanceof Error\n\t\t\t\t\t? error.message\n\t\t\t\t\t: String(error);\n\t\tdiagnostics.push({ type: \"error\", message: `LSP startup failed: ${message}` });\n\t\t// A pool that got partway through eager start may already have spawned and\n\t\t// initialized sibling servers successfully; discarding it without disposing\n\t\t// would orphan those child processes rather than tearing them down cleanly.\n\t\tawait lspPool?.dispose().catch(() => {});\n\t\tlspConfigured = false;\n\t\tlspPool = new LspPool({ workspace: cwd, servers: [], platform: process.platform });\n\t}\n\tconst lspDiagnostics = new LspDiagnostics(lspPool);\n\n\treturn {\n\t\tcwd,\n\t\tagentDir,\n\t\tmodelRuntime,\n\t\tsettingsManager,\n\t\tresourceLoader,\n\t\tlspPool,\n\t\tlspDiagnostics,\n\t\tlspConfigured,\n\t\tlspStatus,\n\t\tdiagnostics,\n\t\tclose: async () => {\n\t\t\t// Diagnostics first: it still needs live LSP clients to send didClose\n\t\t\t// during its own teardown, so it must not outlive the pool it wraps.\n\t\t\tawait lspDiagnostics.dispose();\n\t\t\tawait lspPool.dispose();\n\t\t\tif (!options.modelRuntime) modelRuntime.close();\n\t\t},\n\t};\n}\n\n/**\n * Create an AgentSession from previously created services.\n *\n * This keeps session creation separate from service creation so callers can\n * resolve model, thinking, tools, and other session inputs against the target\n * cwd before constructing the session.\n */\nexport async function createAgentSessionFromServices(\n\toptions: CreateAgentSessionFromServicesOptions,\n): Promise<CreateAgentSessionResult> {\n\tconst { lspPool, lspDiagnostics, lspConfigured } = options.services;\n\t// Both gated on `lspConfigured` (at least one server resolved), not per-path:\n\t// the spec's \"no diagnostics injection or result change whatsoever when `lsp` is\n\t// unconfigured\" is a session-level guarantee. A session with servers configured\n\t// for *some* languages still injects diagnosticsOperations -- a mutated path with\n\t// no matching server correctly resolves to the explicit `unavailable` outcome via\n\t// `LspDiagnostics.afterMutation`'s own per-path `pool.acquire`, it is simply never\n\t// asked at all when the session has no servers whatsoever. `lspDiagnostics`\n\t// already matches `DiagnosticsOperations` structurally, so it is passed directly\n\t// rather than wrapped.\n\tconst diagnosticsOperations = lspConfigured ? lspDiagnostics : undefined;\n\tconst lspOperations: LspOperations | undefined = lspConfigured\n\t\t? {\n\t\t\t\trequest: async (absolutePath, method, params, signal) => {\n\t\t\t\t\tconst connection = await lspPool.acquire(absolutePath);\n\t\t\t\t\tif (!connection) return undefined;\n\t\t\t\t\treturn connection.client.request(method, params, signal);\n\t\t\t\t},\n\t\t\t}\n\t\t: undefined;\n\n\t// Read per call rather than captured here. The tool registry is built once at\n\t// session construction, so a key saved from the settings panel mid-session would\n\t// otherwise not take effect until restart.\n\t// Two different questions. Whether a credential resolves *now* decides whether the\n\t// tool is active, because activation happens once at construction. Resolution then\n\t// stays deferred so a key changed mid-session is picked up without a restart.\n\tconst settingsManager = options.services.settingsManager;\n\tconst webSearchOperations = resolveWebSearchOperations(settingsManager.getWebSearchSettings())\n\t\t? createDeferredWebSearchOperations(() => settingsManager.getWebSearchSettings())\n\t\t: undefined;\n\n\treturn createAgentSession({\n\t\tcwd: options.services.cwd,\n\t\tagentDir: options.services.agentDir,\n\t\tmodelRuntime: options.services.modelRuntime,\n\t\tsettingsManager: options.services.settingsManager,\n\t\tresourceLoader: options.services.resourceLoader,\n\t\tsessionManager: options.sessionManager,\n\t\tmodel: options.model,\n\t\tthinkingLevel: options.thinkingLevel,\n\t\tscopedModels: options.scopedModels,\n\t\ttools: options.tools,\n\t\texcludeTools: options.excludeTools,\n\t\tnoTools: options.noTools,\n\t\tcustomTools: options.customTools,\n\t\tsessionStartEvent: options.sessionStartEvent,\n\t\tpermissionGate: options.permissionGate,\n\t\tpermissionResponderFactory: options.permissionResponderFactory,\n\t\tdiagnosticsOperations,\n\t\tlspOperations,\n\t\twebSearchOperations,\n\t});\n}\n"]}
|
|
@@ -13,24 +13,35 @@
|
|
|
13
13
|
* Modes use this class and add their own I/O layer on top.
|
|
14
14
|
*/
|
|
15
15
|
import type { ImageContent, Model, TextContent } from "@earendil-works/pi-ai/compat";
|
|
16
|
-
import type { Agent, AgentEvent, AgentMessage, AgentState, AgentTool, ThinkingLevel } from "apex-code-agent-core";
|
|
16
|
+
import type { Agent, AgentEvent, AgentMessage, AgentState, AgentStopReason, AgentTool, ThinkingLevel } from "apex-code-agent-core";
|
|
17
17
|
import { type BashResult } from "./bash-executor.ts";
|
|
18
|
+
import type { CheckpointSettings } from "./checkpoints/git-checkpoints.ts";
|
|
19
|
+
import { type SessionCheckpoints } from "./checkpoints/session-checkpoints.ts";
|
|
18
20
|
import { type CompactionResult } from "./compaction/index.ts";
|
|
19
21
|
import { type ContextUsage, type ExtensionCommandContextActions, type ExtensionErrorListener, type ExtensionMode, ExtensionRunner, type ExtensionUIContext, type InputSource, type ReplacedSessionContext, type SessionStartEvent, type ShutdownHandler, type ToolDefinition, type ToolInfo } from "./extensions/index.ts";
|
|
22
|
+
import { type FormatterRunOutcome } from "./formatter-lifecycle.ts";
|
|
23
|
+
import type { HookRuntime } from "./hooks/types.ts";
|
|
24
|
+
import type { McpRuntime } from "./mcp/runtime.ts";
|
|
20
25
|
import type { CustomMessage } from "./messages.ts";
|
|
21
26
|
import type { ModelRuntime } from "./model-runtime.ts";
|
|
22
27
|
import { type PermissionGateOptions } from "./permissions/gate.ts";
|
|
28
|
+
import type { PermissionResponder } from "./permissions/responder.ts";
|
|
23
29
|
import { type EffectiveModeResolution } from "./permissions/startup.ts";
|
|
24
30
|
import type { PermissionMode } from "./permissions/store.ts";
|
|
25
31
|
import { type PromptTemplate } from "./prompt-templates.ts";
|
|
26
32
|
import type { ResourceLoader } from "./resource-loader.ts";
|
|
27
33
|
import type { BranchSummaryEntry, SessionEntry, SessionManager } from "./session-manager.ts";
|
|
28
34
|
import type { SettingsManager } from "./settings-manager.ts";
|
|
35
|
+
import type { BackgroundShellRegistry } from "./tools/background-shell.ts";
|
|
29
36
|
import { type BashOperations } from "./tools/bash.ts";
|
|
30
37
|
import type { EvidenceSink } from "./tools/contract.ts";
|
|
38
|
+
import { type ToolContractSnapshotEntry } from "./tools/contract-snapshot.ts";
|
|
31
39
|
import type { DiagnosticsOperations } from "./tools/diagnostics.ts";
|
|
32
40
|
import type { LspOperations } from "./tools/lsp.ts";
|
|
33
41
|
import type { WebSearchOperations } from "./tools/web-search.ts";
|
|
42
|
+
import { type VerificationCompletionStatus, type VerificationRecord } from "./verification-lifecycle.ts";
|
|
43
|
+
import { type GitObserveOptions } from "./workspace/git-observer.ts";
|
|
44
|
+
import { type WorkspaceStateRecord } from "./workspace/state.ts";
|
|
34
45
|
/** Parsed skill block from a user message */
|
|
35
46
|
export interface ParsedSkillBlock {
|
|
36
47
|
name: string;
|
|
@@ -50,6 +61,8 @@ export type AgentSessionEvent = Exclude<AgentEvent, {
|
|
|
50
61
|
type: "agent_end";
|
|
51
62
|
messages: AgentMessage[];
|
|
52
63
|
willRetry: boolean;
|
|
64
|
+
/** Structured terminal outcome of the run (budget exhaustion, abort, error, completion). */
|
|
65
|
+
stopReason?: AgentStopReason;
|
|
53
66
|
} | {
|
|
54
67
|
type: "agent_settled";
|
|
55
68
|
} | {
|
|
@@ -172,12 +185,38 @@ export interface AgentSessionConfig {
|
|
|
172
185
|
* `baseToolsOverride` is set.
|
|
173
186
|
*/
|
|
174
187
|
lspOperations?: LspOperations;
|
|
188
|
+
/** Assembled MCP subsystem, present only when at least one server is configured. */
|
|
189
|
+
mcpRuntime?: McpRuntime;
|
|
175
190
|
/**
|
|
176
191
|
* Optional `web_search` backend. Absent leaves the tool on its unconfigured
|
|
177
192
|
* operations, which throw a model-readable "not configured" error rather than
|
|
178
193
|
* returning zero results. Ignored when `baseToolsOverride` is set.
|
|
179
194
|
*/
|
|
180
195
|
webSearchOperations?: WebSearchOperations;
|
|
196
|
+
/**
|
|
197
|
+
* Git-backed worktree checkpoints. Absent, or present with `enabled` unset, captures
|
|
198
|
+
* nothing and runs no `git` subprocess.
|
|
199
|
+
*/
|
|
200
|
+
checkpointSettings?: CheckpointSettings;
|
|
201
|
+
/**
|
|
202
|
+
* Declarative hooks (spec 2026-08-31-declarative-hooks). Absent constructs
|
|
203
|
+
* nothing: no subprocess, no behavior change. Assembled by `createAgentSession`
|
|
204
|
+
* from the merged settings -- project-scope entries only appear once trusted,
|
|
205
|
+
* because untrusted project settings are not loaded at all.
|
|
206
|
+
*/
|
|
207
|
+
hookRuntime?: HookRuntime;
|
|
208
|
+
/**
|
|
209
|
+
* Background-shell registry (spec 2026-08-31-background-shell.md). Absent
|
|
210
|
+
* constructs nothing. Created by `createAgentSession` when not supplied and
|
|
211
|
+
* disposed with the session, so background children never outlive it.
|
|
212
|
+
*/
|
|
213
|
+
backgroundShellRegistry?: BackgroundShellRegistry;
|
|
214
|
+
/**
|
|
215
|
+
* Optional headless permission bridge (ACP, spec 2026-08-31-acp-adapter.md):
|
|
216
|
+
* consulted before the interactive TUI responder. Absent keeps today's
|
|
217
|
+
* behavior -- asks without a responder fail closed.
|
|
218
|
+
*/
|
|
219
|
+
permissionResponderFactory?: () => PermissionResponder | undefined;
|
|
181
220
|
}
|
|
182
221
|
export interface ExtensionBindings {
|
|
183
222
|
uiContext?: ExtensionUIContext;
|
|
@@ -231,6 +270,26 @@ export interface SessionStats {
|
|
|
231
270
|
cost: number;
|
|
232
271
|
contextUsage?: ContextUsage;
|
|
233
272
|
}
|
|
273
|
+
/** Explicit workspace policy for `/tree` and `/fork`-family navigation (spec § 4). */
|
|
274
|
+
export type TreeWorkspacePolicy = "keep" | "restore" | "fail-if-drifted" | "cancel";
|
|
275
|
+
/** What the navigation did to the workspace, reported separately from the conversation move. */
|
|
276
|
+
export interface TreeWorkspaceOutcome {
|
|
277
|
+
policy: TreeWorkspacePolicy;
|
|
278
|
+
outcome: "unchanged" | "restored" | "refused-drifted" | "missing-checkpoint" | "failed";
|
|
279
|
+
/** Checkpoint of the pre-restore state; present when a restore overwrote anything. */
|
|
280
|
+
preRestoreCheckpoint?: {
|
|
281
|
+
entryId: string;
|
|
282
|
+
commit: string;
|
|
283
|
+
};
|
|
284
|
+
warnings: string[];
|
|
285
|
+
}
|
|
286
|
+
export interface TreeNavigationResult {
|
|
287
|
+
editorText?: string;
|
|
288
|
+
cancelled: boolean;
|
|
289
|
+
aborted?: boolean;
|
|
290
|
+
summaryEntry?: BranchSummaryEntry;
|
|
291
|
+
workspace?: TreeWorkspaceOutcome;
|
|
292
|
+
}
|
|
234
293
|
export declare class AgentSession {
|
|
235
294
|
readonly agent: Agent;
|
|
236
295
|
readonly sessionManager: SessionManager;
|
|
@@ -247,9 +306,12 @@ export declare class AgentSession {
|
|
|
247
306
|
private _followUpMessages;
|
|
248
307
|
/** Messages queued to be included with the next user prompt as context ("asides"). */
|
|
249
308
|
private _pendingNextTurnMessages;
|
|
309
|
+
/** Context-only custom messages queued during a run, flushed once the current turn's tool results are in. */
|
|
310
|
+
private _pendingCustomMessages;
|
|
250
311
|
private _compactionAbortController;
|
|
251
312
|
private _autoCompactionAbortController;
|
|
252
313
|
private _overflowRecoveryAttempted;
|
|
314
|
+
private _midRunCompactionNeeded;
|
|
253
315
|
private _branchSummaryAbortController;
|
|
254
316
|
private _retryAbortController;
|
|
255
317
|
private _retryAttempt;
|
|
@@ -261,6 +323,21 @@ export declare class AgentSession {
|
|
|
261
323
|
private _customTools;
|
|
262
324
|
private _baseToolDefinitions;
|
|
263
325
|
private _cwd;
|
|
326
|
+
/**
|
|
327
|
+
* Workspace observation adapter for compaction capture (WS.4). Injectable
|
|
328
|
+
* so tests can force capture outcomes without a real repository.
|
|
329
|
+
*/
|
|
330
|
+
_workspaceObserver: (root: string, options?: GitObserveOptions) => Promise<WorkspaceStateRecord>;
|
|
331
|
+
/**
|
|
332
|
+
* WS.5: one workspace comparison is due at the next model-turn boundary.
|
|
333
|
+
* Set after a compaction stored an observation, or on construction when
|
|
334
|
+
* the session's latest observation has no later comparison (resume).
|
|
335
|
+
*/
|
|
336
|
+
private _workspaceComparePending;
|
|
337
|
+
/** VF.4: verification lifecycle state, built lazily from policy settings. */
|
|
338
|
+
private _verificationTracker;
|
|
339
|
+
/** The workspace observation a verification result described, for staleness. */
|
|
340
|
+
private _verificationBaseline;
|
|
264
341
|
private _extensionRunnerRef?;
|
|
265
342
|
private _initialActiveToolNames?;
|
|
266
343
|
private _allowedToolNames?;
|
|
@@ -271,6 +348,15 @@ export declare class AgentSession {
|
|
|
271
348
|
private _evidenceSink?;
|
|
272
349
|
private _diagnosticsOperations?;
|
|
273
350
|
private _lspOperations?;
|
|
351
|
+
private _mcpRuntime?;
|
|
352
|
+
/** Configured MCP subsystem, or undefined when no server is configured. */
|
|
353
|
+
get mcpRuntime(): McpRuntime | undefined;
|
|
354
|
+
private readonly _checkpoints;
|
|
355
|
+
private readonly _hookRuntime;
|
|
356
|
+
private readonly _backgroundShellRegistry;
|
|
357
|
+
private readonly _permissionResponderFactory;
|
|
358
|
+
/** Worktree checkpoints for this session. Inert unless `checkpoints.enabled` is set. */
|
|
359
|
+
get checkpoints(): SessionCheckpoints;
|
|
274
360
|
private _webSearchOperations?;
|
|
275
361
|
private _extensionUIContext?;
|
|
276
362
|
private _extensionMode;
|
|
@@ -301,7 +387,11 @@ export declare class AgentSession {
|
|
|
301
387
|
* happens here instead of in wrappers.
|
|
302
388
|
*/
|
|
303
389
|
private _installAgentToolHooks;
|
|
390
|
+
private _compactBeforeNextAssistantResponse;
|
|
304
391
|
private _installAgentNextTurnRefresh;
|
|
392
|
+
/** Stop an over-threshold tool loop before it sends another provider request. */
|
|
393
|
+
private _installMidRunCompactionHook;
|
|
394
|
+
private _shouldStopForMidRunCompaction;
|
|
305
395
|
/**
|
|
306
396
|
* Installs the context pipeline settled in `docs/architecture/contracts.md` § 2:
|
|
307
397
|
* deferred-schema resolution → tool-result eviction → compaction. Compaction
|
|
@@ -382,6 +472,11 @@ export declare class AgentSession {
|
|
|
382
472
|
/**
|
|
383
473
|
* Get all configured tools with name, description, parameter schema, prompt guidelines, and source metadata.
|
|
384
474
|
*/
|
|
475
|
+
/**
|
|
476
|
+
* The ADR 0010 projection over this session's registry: the one read every surface
|
|
477
|
+
* that *describes* the tool set consumes. Never an authorization input.
|
|
478
|
+
*/
|
|
479
|
+
getToolContractSnapshot(): ToolContractSnapshotEntry[];
|
|
385
480
|
getAllTools(): ToolInfo[];
|
|
386
481
|
getToolDefinition(name: string): ToolDefinition | undefined;
|
|
387
482
|
/**
|
|
@@ -465,8 +560,9 @@ export declare class AgentSession {
|
|
|
465
560
|
/**
|
|
466
561
|
* Send a custom message to the session. Creates a CustomMessageEntry.
|
|
467
562
|
*
|
|
468
|
-
* Handles
|
|
563
|
+
* Handles four cases:
|
|
469
564
|
* - Streaming: queues message, processed when loop pulls from queue
|
|
565
|
+
* - Streaming + triggerTurn false: appended to state/session once the current turn ends
|
|
470
566
|
* - Not streaming + triggerTurn: appends to state/session, starts new turn
|
|
471
567
|
* - Not streaming + no trigger: appends to state/session, no turn
|
|
472
568
|
*
|
|
@@ -478,6 +574,12 @@ export declare class AgentSession {
|
|
|
478
574
|
triggerTurn?: boolean;
|
|
479
575
|
deliverAs?: "steer" | "followUp" | "nextTurn";
|
|
480
576
|
}): Promise<void>;
|
|
577
|
+
private _appendCustomMessage;
|
|
578
|
+
/**
|
|
579
|
+
* Append custom messages queued while the agent was running.
|
|
580
|
+
* Called once the current turn's tool results are in agent state and session history.
|
|
581
|
+
*/
|
|
582
|
+
private _flushPendingCustomMessages;
|
|
481
583
|
/**
|
|
482
584
|
* Send a user message to the agent. Always triggers a turn.
|
|
483
585
|
* When the agent is streaming, use deliverAs to specify how to queue the message.
|
|
@@ -534,6 +636,7 @@ export declare class AgentSession {
|
|
|
534
636
|
* @throws Error if no auth is configured for the model
|
|
535
637
|
*/
|
|
536
638
|
setModel(model: Model<any>, options?: ModelMutationOptions): Promise<void>;
|
|
639
|
+
private _addPersistedDefaultToNonEmptyScope;
|
|
537
640
|
/**
|
|
538
641
|
* Cycle to next/previous model.
|
|
539
642
|
* Uses scoped models (from --models flag) if available, otherwise all available models.
|
|
@@ -577,6 +680,55 @@ export declare class AgentSession {
|
|
|
577
680
|
* Saves to settings.
|
|
578
681
|
*/
|
|
579
682
|
setFollowUpMode(mode: "all" | "one-at-a-time"): void;
|
|
683
|
+
/** Generate Pi's built-in compaction summary for manual and automatic compaction. */
|
|
684
|
+
/**
|
|
685
|
+
* Attempt exactly one workspace observation for a compaction (spec
|
|
686
|
+
* 2026-09-01-harness-correctness-and-workspace-state.md § 3 step 1).
|
|
687
|
+
* Returns undefined when observation is impossible; never throws and
|
|
688
|
+
* never fails the surrounding compaction.
|
|
689
|
+
*/
|
|
690
|
+
_captureWorkspaceObservation(signal: AbortSignal | undefined): Promise<WorkspaceStateRecord | undefined>;
|
|
691
|
+
/** Session/artifact directories inside the workspace, relative paths. */
|
|
692
|
+
private _sessionExclusionPaths;
|
|
693
|
+
/**
|
|
694
|
+
* Build (once) and refresh the tracker from the raw per-source policy
|
|
695
|
+
* settings. ADR 0028: the loader consumes the sources separately and the
|
|
696
|
+
* trust gate decides whether the project source exists at all.
|
|
697
|
+
*/
|
|
698
|
+
/**
|
|
699
|
+
* PS.1. Configured commands reach the same permission authority tool calls
|
|
700
|
+
* use. Undefined only when the session has no gate at all, which is the
|
|
701
|
+
* documented SDK default; a gated session always authorizes.
|
|
702
|
+
*/
|
|
703
|
+
private _authorizeConfiguredCommand;
|
|
704
|
+
private _ensureVerificationTracker;
|
|
705
|
+
/**
|
|
706
|
+
* Run one configured verification policy now and report the resulting
|
|
707
|
+
* completion status. Unavailable when nothing is configured; the
|
|
708
|
+
* workspace observation after the run becomes the staleness baseline.
|
|
709
|
+
*/
|
|
710
|
+
requestVerification(options?: {
|
|
711
|
+
policyId?: string;
|
|
712
|
+
signal?: AbortSignal;
|
|
713
|
+
}): Promise<VerificationCompletionStatus>;
|
|
714
|
+
/**
|
|
715
|
+
* VF.5: run one configured formatter policy now and report what it
|
|
716
|
+
* actually mutated. Undefined when no formatter policy matches. Any real
|
|
717
|
+
* mutation retires a prior verification record: the workspace the
|
|
718
|
+
* verification described no longer exists.
|
|
719
|
+
*/
|
|
720
|
+
runConfiguredFormatter(options?: {
|
|
721
|
+
policyId?: string;
|
|
722
|
+
signal?: AbortSignal;
|
|
723
|
+
}): Promise<FormatterRunOutcome | undefined>;
|
|
724
|
+
/** The current completion status: verified, failed, unavailable, interrupted, or continued-unverified. */
|
|
725
|
+
verificationStatus(): VerificationCompletionStatus;
|
|
726
|
+
/** The live verification record with its bounded evidence, if any. */
|
|
727
|
+
verificationRecord(): VerificationRecord | undefined;
|
|
728
|
+
/** Record that the user chose to finish without verification. */
|
|
729
|
+
continueWithoutVerification(): void;
|
|
730
|
+
private _runVerificationTurnBoundary;
|
|
731
|
+
private _runWorkspaceComparisonBoundary;
|
|
580
732
|
private _runDefaultCompaction;
|
|
581
733
|
/**
|
|
582
734
|
* Manually compact the session context.
|
|
@@ -701,12 +853,9 @@ export declare class AgentSession {
|
|
|
701
853
|
customInstructions?: string;
|
|
702
854
|
replaceInstructions?: boolean;
|
|
703
855
|
label?: string;
|
|
704
|
-
|
|
705
|
-
|
|
706
|
-
|
|
707
|
-
aborted?: boolean;
|
|
708
|
-
summaryEntry?: BranchSummaryEntry;
|
|
709
|
-
}>;
|
|
856
|
+
workspacePolicy?: TreeWorkspacePolicy;
|
|
857
|
+
}): Promise<TreeNavigationResult>;
|
|
858
|
+
private _resolveTreeWorkspaceStep;
|
|
710
859
|
/**
|
|
711
860
|
* Get all user messages from session for fork selector.
|
|
712
861
|
*/
|