@cleocode/core 2026.6.12 → 2026.6.13
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/dist/conduit/local-transport.d.ts +12 -0
- package/dist/conduit/local-transport.d.ts.map +1 -1
- package/dist/conduit/local-transport.js +53 -23
- package/dist/conduit/local-transport.js.map +1 -1
- package/dist/crypto/credentials.d.ts +37 -0
- package/dist/crypto/credentials.d.ts.map +1 -1
- package/dist/crypto/credentials.js +110 -0
- package/dist/crypto/credentials.js.map +1 -1
- package/dist/dispatch/contracts/derive-output-contract.d.ts +86 -0
- package/dist/dispatch/contracts/derive-output-contract.d.ts.map +1 -0
- package/dist/dispatch/contracts/derive-output-contract.js +347 -0
- package/dist/dispatch/contracts/derive-output-contract.js.map +1 -0
- package/dist/dispatch/contracts/ensures-schema.d.ts +77 -0
- package/dist/dispatch/contracts/ensures-schema.d.ts.map +1 -0
- package/dist/dispatch/contracts/ensures-schema.js +91 -0
- package/dist/dispatch/contracts/ensures-schema.js.map +1 -0
- package/dist/dispatch/contracts/output-contracts.d.ts +27 -5
- package/dist/dispatch/contracts/output-contracts.d.ts.map +1 -1
- package/dist/dispatch/contracts/output-contracts.js +29 -6
- package/dist/dispatch/contracts/output-contracts.js.map +1 -1
- package/dist/docs/export-document.js +2294 -1250
- package/dist/docs/export-document.js.map +3 -3
- package/dist/go/driver.d.ts +132 -7
- package/dist/go/driver.d.ts.map +1 -1
- package/dist/go/driver.js +135 -10
- package/dist/go/driver.js.map +1 -1
- package/dist/go/index.d.ts +1 -1
- package/dist/go/index.d.ts.map +1 -1
- package/dist/go/index.js +1 -1
- package/dist/go/index.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -0
- package/dist/index.js.map +1 -1
- package/dist/internal.d.ts +13 -10
- package/dist/internal.d.ts.map +1 -1
- package/dist/internal.js +11 -11
- package/dist/internal.js.map +1 -1
- package/dist/lifecycle/engine-ops.d.ts.map +1 -1
- package/dist/lifecycle/engine-ops.js +7 -4
- package/dist/lifecycle/engine-ops.js.map +1 -1
- package/dist/lifecycle/ivtr-loop.d.ts +108 -183
- package/dist/lifecycle/ivtr-loop.d.ts.map +1 -1
- package/dist/lifecycle/ivtr-loop.js +207 -522
- package/dist/lifecycle/ivtr-loop.js.map +1 -1
- package/dist/llm/auxiliary-fallback.js +1 -1
- package/dist/llm/auxiliary-fallback.js.map +1 -1
- package/dist/llm/cli-ops.d.ts +14 -1
- package/dist/llm/cli-ops.d.ts.map +1 -1
- package/dist/llm/cli-ops.js +41 -12
- package/dist/llm/cli-ops.js.map +1 -1
- package/dist/llm/concrete-session.d.ts.map +1 -1
- package/dist/llm/concrete-session.js +4 -0
- package/dist/llm/concrete-session.js.map +1 -1
- package/dist/llm/credentials.d.ts +35 -0
- package/dist/llm/credentials.d.ts.map +1 -1
- package/dist/llm/credentials.js +49 -0
- package/dist/llm/credentials.js.map +1 -1
- package/dist/llm/index.d.ts +4 -0
- package/dist/llm/index.d.ts.map +1 -1
- package/dist/llm/index.js +4 -0
- package/dist/llm/index.js.map +1 -1
- package/dist/llm/pi/gondolin-loader.d.ts +241 -0
- package/dist/llm/pi/gondolin-loader.d.ts.map +1 -0
- package/dist/llm/pi/gondolin-loader.js +195 -0
- package/dist/llm/pi/gondolin-loader.js.map +1 -0
- package/dist/llm/pi/index.d.ts +28 -0
- package/dist/llm/pi/index.d.ts.map +1 -0
- package/dist/llm/pi/index.js +27 -0
- package/dist/llm/pi/index.js.map +1 -0
- package/dist/llm/pi/pi-agent-adapter.d.ts +135 -0
- package/dist/llm/pi/pi-agent-adapter.d.ts.map +1 -0
- package/dist/llm/pi/pi-agent-adapter.js +329 -0
- package/dist/llm/pi/pi-agent-adapter.js.map +1 -0
- package/dist/llm/pi/pi-errors.d.ts +161 -0
- package/dist/llm/pi/pi-errors.d.ts.map +1 -0
- package/dist/llm/pi/pi-errors.js +296 -0
- package/dist/llm/pi/pi-errors.js.map +1 -0
- package/dist/llm/pi/pi-execution-env.d.ts +286 -0
- package/dist/llm/pi/pi-execution-env.d.ts.map +1 -0
- package/dist/llm/pi/pi-execution-env.js +406 -0
- package/dist/llm/pi/pi-execution-env.js.map +1 -0
- package/dist/llm/pi/pi-gondolin-env.d.ts +227 -0
- package/dist/llm/pi/pi-gondolin-env.d.ts.map +1 -0
- package/dist/llm/pi/pi-gondolin-env.js +541 -0
- package/dist/llm/pi/pi-gondolin-env.js.map +1 -0
- package/dist/llm/pi/pi-session-storage.d.ts +154 -0
- package/dist/llm/pi/pi-session-storage.d.ts.map +1 -0
- package/dist/llm/pi/pi-session-storage.js +314 -0
- package/dist/llm/pi/pi-session-storage.js.map +1 -0
- package/dist/llm/pi/pi-stream-fn.d.ts +124 -0
- package/dist/llm/pi/pi-stream-fn.d.ts.map +1 -0
- package/dist/llm/pi/pi-stream-fn.js +504 -0
- package/dist/llm/pi/pi-stream-fn.js.map +1 -0
- package/dist/llm/pi/pi-tool-bridge.d.ts +99 -0
- package/dist/llm/pi/pi-tool-bridge.d.ts.map +1 -0
- package/dist/llm/pi/pi-tool-bridge.js +117 -0
- package/dist/llm/pi/pi-tool-bridge.js.map +1 -0
- package/dist/llm/pi/pi-types.d.ts +56 -0
- package/dist/llm/pi/pi-types.d.ts.map +1 -0
- package/dist/llm/pi/pi-types.js +16 -0
- package/dist/llm/pi/pi-types.js.map +1 -0
- package/dist/llm/pi/resolve-execution-env.d.ts +194 -0
- package/dist/llm/pi/resolve-execution-env.d.ts.map +1 -0
- package/dist/llm/pi/resolve-execution-env.js +132 -0
- package/dist/llm/pi/resolve-execution-env.js.map +1 -0
- package/dist/llm/plugin-facade.js +2253 -1151
- package/dist/llm/plugin-facade.js.map +3 -3
- package/dist/llm/role-executor.d.ts.map +1 -1
- package/dist/llm/role-executor.js +8 -5
- package/dist/llm/role-executor.js.map +1 -1
- package/dist/llm/role-resolver.d.ts +46 -14
- package/dist/llm/role-resolver.d.ts.map +1 -1
- package/dist/llm/role-resolver.js +178 -20
- package/dist/llm/role-resolver.js.map +1 -1
- package/dist/llm/sealed-credential.d.ts +125 -0
- package/dist/llm/sealed-credential.d.ts.map +1 -0
- package/dist/llm/sealed-credential.js +133 -0
- package/dist/llm/sealed-credential.js.map +1 -0
- package/dist/llm/session-factory.d.ts.map +1 -1
- package/dist/llm/session-factory.js +6 -2
- package/dist/llm/session-factory.js.map +1 -1
- package/dist/llm/system-key.d.ts +67 -0
- package/dist/llm/system-key.d.ts.map +1 -0
- package/dist/llm/system-key.js +87 -0
- package/dist/llm/system-key.js.map +1 -0
- package/dist/llm/system-of-use-registry.d.ts +119 -0
- package/dist/llm/system-of-use-registry.d.ts.map +1 -0
- package/dist/llm/system-of-use-registry.js +200 -0
- package/dist/llm/system-of-use-registry.js.map +1 -0
- package/dist/llm/system-resolver.d.ts +32 -10
- package/dist/llm/system-resolver.d.ts.map +1 -1
- package/dist/llm/system-resolver.js +70 -18
- package/dist/llm/system-resolver.js.map +1 -1
- package/dist/memory/brain-writer-thread.d.ts.map +1 -1
- package/dist/memory/brain-writer-thread.js +116 -11
- package/dist/memory/brain-writer-thread.js.map +1 -1
- package/dist/memory/claude-mem-migration.d.ts.map +1 -1
- package/dist/memory/claude-mem-migration.js +21 -0
- package/dist/memory/claude-mem-migration.js.map +1 -1
- package/dist/memory/graph-memory-bridge.d.ts.map +1 -1
- package/dist/memory/graph-memory-bridge.js +32 -25
- package/dist/memory/graph-memory-bridge.js.map +1 -1
- package/dist/memory/llm-backend-resolver.js +23 -5
- package/dist/memory/llm-backend-resolver.js.map +1 -1
- package/dist/nexus/migrations/M-split-graph.d.ts.map +1 -1
- package/dist/nexus/migrations/M-split-graph.js +60 -53
- package/dist/nexus/migrations/M-split-graph.js.map +1 -1
- package/dist/orchestrate/pivot.d.ts.map +1 -1
- package/dist/orchestrate/pivot.js +20 -2
- package/dist/orchestrate/pivot.js.map +1 -1
- package/dist/release/engine-ops.js +2 -2
- package/dist/release/engine-ops.js.map +1 -1
- package/dist/routing/capability-matrix.d.ts.map +1 -1
- package/dist/routing/capability-matrix.js +0 -57
- package/dist/routing/capability-matrix.js.map +1 -1
- package/dist/selfimprove/budget.d.ts +206 -0
- package/dist/selfimprove/budget.d.ts.map +1 -0
- package/dist/selfimprove/budget.js +203 -0
- package/dist/selfimprove/budget.js.map +1 -0
- package/dist/selfimprove/dhq-adapter.d.ts +105 -0
- package/dist/selfimprove/dhq-adapter.d.ts.map +1 -0
- package/dist/selfimprove/dhq-adapter.js +95 -0
- package/dist/selfimprove/dhq-adapter.js.map +1 -0
- package/dist/selfimprove/draft-pr.d.ts +129 -0
- package/dist/selfimprove/draft-pr.d.ts.map +1 -0
- package/dist/selfimprove/draft-pr.js +158 -0
- package/dist/selfimprove/draft-pr.js.map +1 -0
- package/dist/selfimprove/envelope-diff.d.ts +162 -0
- package/dist/selfimprove/envelope-diff.d.ts.map +1 -0
- package/dist/selfimprove/envelope-diff.js +321 -0
- package/dist/selfimprove/envelope-diff.js.map +1 -0
- package/dist/selfimprove/replay.d.ts +121 -0
- package/dist/selfimprove/replay.d.ts.map +1 -0
- package/dist/selfimprove/replay.js +109 -0
- package/dist/selfimprove/replay.js.map +1 -0
- package/dist/selfimprove/run-loop.d.ts +148 -0
- package/dist/selfimprove/run-loop.d.ts.map +1 -0
- package/dist/selfimprove/run-loop.js +240 -0
- package/dist/selfimprove/run-loop.js.map +1 -0
- package/dist/selfimprove/scenario.d.ts +145 -0
- package/dist/selfimprove/scenario.d.ts.map +1 -0
- package/dist/selfimprove/scenario.js +243 -0
- package/dist/selfimprove/scenario.js.map +1 -0
- package/dist/sentient/daemon-entry.js +5 -0
- package/dist/sentient/daemon-entry.js.map +1 -1
- package/dist/sentient/daemon.d.ts.map +1 -1
- package/dist/sentient/daemon.js +19 -0
- package/dist/sentient/daemon.js.map +1 -1
- package/dist/sentient/hygiene-scan.d.ts.map +1 -1
- package/dist/sentient/hygiene-scan.js +14 -6
- package/dist/sentient/hygiene-scan.js.map +1 -1
- package/dist/sessions/briefing.d.ts.map +1 -1
- package/dist/sessions/briefing.js +13 -9
- package/dist/sessions/briefing.js.map +1 -1
- package/dist/sessions/connection-session-handle.d.ts +161 -0
- package/dist/sessions/connection-session-handle.d.ts.map +1 -0
- package/dist/sessions/connection-session-handle.js +168 -0
- package/dist/sessions/connection-session-handle.js.map +1 -0
- package/dist/sessions/handoff.d.ts.map +1 -1
- package/dist/sessions/handoff.js +9 -0
- package/dist/sessions/handoff.js.map +1 -1
- package/dist/sessions/index.d.ts +4 -1
- package/dist/sessions/index.d.ts.map +1 -1
- package/dist/sessions/index.js +31 -1
- package/dist/sessions/index.js.map +1 -1
- package/dist/sessions/session-id.d.ts +34 -0
- package/dist/sessions/session-id.d.ts.map +1 -1
- package/dist/sessions/session-id.js +37 -0
- package/dist/sessions/session-id.js.map +1 -1
- package/dist/sessions/session-manifest-mirror.d.ts +115 -0
- package/dist/sessions/session-manifest-mirror.d.ts.map +1 -0
- package/dist/sessions/session-manifest-mirror.js +250 -0
- package/dist/sessions/session-manifest-mirror.js.map +1 -0
- package/dist/sessions/session-switch.d.ts.map +1 -1
- package/dist/sessions/session-switch.js +5 -2
- package/dist/sessions/session-switch.js.map +1 -1
- package/dist/store/converters.d.ts.map +1 -1
- package/dist/store/converters.js +2 -0
- package/dist/store/converters.js.map +1 -1
- package/dist/store/db-helpers.d.ts.map +1 -1
- package/dist/store/db-helpers.js +2 -0
- package/dist/store/db-helpers.js.map +1 -1
- package/dist/store/dual-scope-db.d.ts.map +1 -1
- package/dist/store/dual-scope-db.js +87 -47
- package/dist/store/dual-scope-db.js.map +1 -1
- package/dist/store/pi-session-store.d.ts +151 -0
- package/dist/store/pi-session-store.d.ts.map +1 -0
- package/dist/store/pi-session-store.js +166 -0
- package/dist/store/pi-session-store.js.map +1 -0
- package/dist/store/safety-data-accessor.d.ts +1 -0
- package/dist/store/safety-data-accessor.d.ts.map +1 -1
- package/dist/store/safety-data-accessor.js +5 -0
- package/dist/store/safety-data-accessor.js.map +1 -1
- package/dist/store/schema/cleo-global/accounts.d.ts +357 -0
- package/dist/store/schema/cleo-global/accounts.d.ts.map +1 -0
- package/dist/store/schema/cleo-global/accounts.js +136 -0
- package/dist/store/schema/cleo-global/accounts.js.map +1 -0
- package/dist/store/schema/cleo-global/index.d.ts +2 -0
- package/dist/store/schema/cleo-global/index.d.ts.map +1 -1
- package/dist/store/schema/cleo-global/index.js +2 -0
- package/dist/store/schema/cleo-global/index.js.map +1 -1
- package/dist/store/schema/cleo-global/session-manifest.d.ts +217 -0
- package/dist/store/schema/cleo-global/session-manifest.d.ts.map +1 -0
- package/dist/store/schema/cleo-global/session-manifest.js +99 -0
- package/dist/store/schema/cleo-global/session-manifest.js.map +1 -0
- package/dist/store/schema/cleo-project/tasks-core.d.ts +16 -0
- package/dist/store/schema/cleo-project/tasks-core.d.ts.map +1 -1
- package/dist/store/schema/cleo-project/tasks-core.js +14 -0
- package/dist/store/schema/cleo-project/tasks-core.js.map +1 -1
- package/dist/store/schema/tasks.d.ts +16 -0
- package/dist/store/schema/tasks.d.ts.map +1 -1
- package/dist/store/schema/tasks.js +10 -0
- package/dist/store/schema/tasks.js.map +1 -1
- package/dist/store/selfimprove-dhq-schema.d.ts +284 -0
- package/dist/store/selfimprove-dhq-schema.d.ts.map +1 -0
- package/dist/store/selfimprove-dhq-schema.js +128 -0
- package/dist/store/selfimprove-dhq-schema.js.map +1 -0
- package/dist/store/selfimprove-dhq-store.d.ts +175 -0
- package/dist/store/selfimprove-dhq-store.d.ts.map +1 -0
- package/dist/store/selfimprove-dhq-store.js +182 -0
- package/dist/store/selfimprove-dhq-store.js.map +1 -0
- package/dist/store/session-store.d.ts +52 -13
- package/dist/store/session-store.d.ts.map +1 -1
- package/dist/store/session-store.js +71 -13
- package/dist/store/session-store.js.map +1 -1
- package/dist/store/sqlite-data-accessor.d.ts.map +1 -1
- package/dist/store/sqlite-data-accessor.js +7 -0
- package/dist/store/sqlite-data-accessor.js.map +1 -1
- package/dist/store/umbrella-data-accessor.d.ts +1 -0
- package/dist/store/umbrella-data-accessor.d.ts.map +1 -1
- package/dist/store/umbrella-data-accessor.js +5 -0
- package/dist/store/umbrella-data-accessor.js.map +1 -1
- package/dist/store/validation-schemas.d.ts +32 -0
- package/dist/store/validation-schemas.d.ts.map +1 -1
- package/dist/store/writer-lease-schema.d.ts +392 -0
- package/dist/store/writer-lease-schema.d.ts.map +1 -0
- package/dist/store/writer-lease-schema.js +142 -0
- package/dist/store/writer-lease-schema.js.map +1 -0
- package/dist/store/writer-lease.d.ts +368 -0
- package/dist/store/writer-lease.d.ts.map +1 -0
- package/dist/store/writer-lease.js +1002 -0
- package/dist/store/writer-lease.js.map +1 -0
- package/dist/tasks/backfill-child-projections.d.ts.map +1 -1
- package/dist/tasks/backfill-child-projections.js +14 -9
- package/dist/tasks/backfill-child-projections.js.map +1 -1
- package/dist/tasks/complete.d.ts.map +1 -1
- package/dist/tasks/complete.js +7 -10
- package/dist/tasks/complete.js.map +1 -1
- package/dist/tasks/duplicate-detector.d.ts.map +1 -1
- package/dist/tasks/duplicate-detector.js +14 -7
- package/dist/tasks/duplicate-detector.js.map +1 -1
- package/dist/telemetry/index.d.ts.map +1 -1
- package/dist/telemetry/index.js +10 -4
- package/dist/telemetry/index.js.map +1 -1
- package/dist/tools/agent-registry.d.ts +250 -0
- package/dist/tools/agent-registry.d.ts.map +1 -0
- package/dist/tools/agent-registry.js +292 -0
- package/dist/tools/agent-registry.js.map +1 -0
- package/dist/tools/agent-tool-families.d.ts +107 -0
- package/dist/tools/agent-tool-families.d.ts.map +1 -0
- package/dist/tools/agent-tool-families.js +527 -0
- package/dist/tools/agent-tool-families.js.map +1 -0
- package/dist/tools/browser-driver.d.ts +183 -0
- package/dist/tools/browser-driver.d.ts.map +1 -0
- package/dist/tools/browser-driver.js +242 -0
- package/dist/tools/browser-driver.js.map +1 -0
- package/dist/tools/builtin-agent-tools.d.ts +36 -0
- package/dist/tools/builtin-agent-tools.d.ts.map +1 -0
- package/dist/tools/builtin-agent-tools.js +150 -0
- package/dist/tools/builtin-agent-tools.js.map +1 -0
- package/dist/tools/dispatch.d.ts +370 -0
- package/dist/tools/dispatch.d.ts.map +1 -0
- package/dist/tools/dispatch.js +505 -0
- package/dist/tools/dispatch.js.map +1 -0
- package/dist/tools/env-scrub.d.ts +93 -0
- package/dist/tools/env-scrub.d.ts.map +1 -0
- package/dist/tools/env-scrub.js +176 -0
- package/dist/tools/env-scrub.js.map +1 -0
- package/dist/tools/fs.d.ts +30 -0
- package/dist/tools/fs.d.ts.map +1 -1
- package/dist/tools/fs.js +55 -2
- package/dist/tools/fs.js.map +1 -1
- package/dist/tools/guard.d.ts +15 -0
- package/dist/tools/guard.d.ts.map +1 -1
- package/dist/tools/guard.js +49 -12
- package/dist/tools/guard.js.map +1 -1
- package/dist/tools/index.d.ts +10 -0
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +37 -0
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/pty.d.ts +45 -0
- package/dist/tools/pty.d.ts.map +1 -0
- package/dist/tools/pty.js +166 -0
- package/dist/tools/pty.js.map +1 -0
- package/dist/tools/schema-gen.d.ts +57 -0
- package/dist/tools/schema-gen.d.ts.map +1 -0
- package/dist/tools/schema-gen.js +52 -0
- package/dist/tools/schema-gen.js.map +1 -0
- package/dist/tools/shell.d.ts +12 -0
- package/dist/tools/shell.d.ts.map +1 -1
- package/dist/tools/shell.js +14 -1
- package/dist/tools/shell.js.map +1 -1
- package/dist/tools/web-agent-tools.d.ts +72 -0
- package/dist/tools/web-agent-tools.d.ts.map +1 -0
- package/dist/tools/web-agent-tools.js +393 -0
- package/dist/tools/web-agent-tools.js.map +1 -0
- package/dist/tools/web-search-backends.d.ts +156 -0
- package/dist/tools/web-search-backends.d.ts.map +1 -0
- package/dist/tools/web-search-backends.js +290 -0
- package/dist/tools/web-search-backends.js.map +1 -0
- package/dist/validation/ops.d.ts +1 -15
- package/dist/validation/ops.d.ts.map +1 -1
- package/dist/validation/ops.js +0 -20
- package/dist/validation/ops.js.map +1 -1
- package/migrations/drizzle-cleo-global/20260607000000_t11891-writer-leases/migration.sql +55 -0
- package/migrations/drizzle-cleo-global/20260607010000_t11639-session-manifest/migration.sql +43 -0
- package/migrations/drizzle-cleo-global/20260608000000_t11899-pi-session-tree/migration.sql +52 -0
- package/migrations/drizzle-cleo-global/20260608010000_t11709-accounts-credential-pool/migration.sql +72 -0
- package/migrations/drizzle-cleo-global/20260608020000_t11889-selfimprove-dhq/migration.sql +64 -0
- package/migrations/drizzle-cleo-project/20260607000000_t11891-writer-leases/migration.sql +55 -0
- package/migrations/drizzle-cleo-project/20260607010000_t11639-session-parent/migration.sql +22 -0
- package/migrations/drizzle-cleo-project/20260608000000_t11899-pi-session-tree/migration.sql +52 -0
- package/migrations/drizzle-cleo-project/20260608020000_t11889-selfimprove-dhq/migration.sql +64 -0
- package/package.json +15 -13
- package/dist/lifecycle/chain-composition.d.ts +0 -30
- package/dist/lifecycle/chain-composition.d.ts.map +0 -1
- package/dist/lifecycle/chain-composition.js +0 -152
- package/dist/lifecycle/chain-composition.js.map +0 -1
- package/dist/lifecycle/chain-store.d.ts +0 -70
- package/dist/lifecycle/chain-store.d.ts.map +0 -1
- package/dist/lifecycle/chain-store.js +0 -246
- package/dist/lifecycle/chain-store.js.map +0 -1
- package/dist/lifecycle/default-chain.d.ts +0 -39
- package/dist/lifecycle/default-chain.d.ts.map +0 -1
- package/dist/lifecycle/default-chain.js +0 -176
- package/dist/lifecycle/default-chain.js.map +0 -1
- package/dist/lifecycle/tessera-engine.d.ts +0 -48
- package/dist/lifecycle/tessera-engine.d.ts.map +0 -1
- package/dist/lifecycle/tessera-engine.js +0 -249
- package/dist/lifecycle/tessera-engine.js.map +0 -1
- package/dist/validation/chain-validation.d.ts +0 -43
- package/dist/validation/chain-validation.d.ts.map +0 -1
- package/dist/validation/chain-validation.js +0 -146
- package/dist/validation/chain-validation.js.map +0 -1
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pseudo-terminal (PTY) shell runner (T1741 · epic T11456 · SG-TOOLS).
|
|
3
|
+
*
|
|
4
|
+
* The `terminal` toolset's execution backend. Runs a command under a PTY when
|
|
5
|
+
* the OPTIONAL `node-pty` native dependency is loadable, otherwise transparently
|
|
6
|
+
* degrades to a plain `child_process.spawn` (the {@link defaultShellExecutor}
|
|
7
|
+
* path) so the tool ALWAYS works without a heavy native dep. `node-pty` is
|
|
8
|
+
* loaded lazily via dynamic `import()` inside the runner — NEVER at module
|
|
9
|
+
* import — so this file is import-time side-effect-free (and adds no startup
|
|
10
|
+
* cost / hard dependency).
|
|
11
|
+
*
|
|
12
|
+
* The child runs under the SCRUBBED, explicitly-constructed environment from
|
|
13
|
+
* {@link scrubSubprocessEnv} (same security posture as the non-PTY path): the
|
|
14
|
+
* daemon's secrets are never inherited and a Pi-controlled loader hook / PATH
|
|
15
|
+
* can never reach the spawned process. This runner is invoked ONLY from the
|
|
16
|
+
* guard chokepoint ({@link ./guard.js}), so the command denylist applies before
|
|
17
|
+
* any process is spawned — there is no raw bypass.
|
|
18
|
+
*
|
|
19
|
+
* @epic T11456
|
|
20
|
+
* @task T1741
|
|
21
|
+
* @see ./guard.js — the deny-first chokepoint that wraps this runner
|
|
22
|
+
*/
|
|
23
|
+
import { spawn } from 'node:child_process';
|
|
24
|
+
import { getLogger } from '../logger.js';
|
|
25
|
+
import { scrubSubprocessEnv } from './env-scrub.js';
|
|
26
|
+
const log = getLogger('tool-pty');
|
|
27
|
+
/** Default PTY geometry. */
|
|
28
|
+
const DEFAULT_COLS = 80;
|
|
29
|
+
const DEFAULT_ROWS = 24;
|
|
30
|
+
/**
|
|
31
|
+
* Attempt to lazily load `node-pty`. Returns `null` when the optional dep is not
|
|
32
|
+
* installed or fails to load (any reason), so the caller can degrade to spawn.
|
|
33
|
+
*
|
|
34
|
+
* The import specifier is held in a variable so bundlers/TS do not treat the
|
|
35
|
+
* missing optional dep as a hard, statically-resolved dependency.
|
|
36
|
+
*
|
|
37
|
+
* @returns The loaded module shape, or `null` when unavailable.
|
|
38
|
+
*/
|
|
39
|
+
async function loadNodePty() {
|
|
40
|
+
const specifier = 'node-pty';
|
|
41
|
+
try {
|
|
42
|
+
const mod = await import(specifier);
|
|
43
|
+
const candidate = mod.default ?? mod;
|
|
44
|
+
if (candidate !== null &&
|
|
45
|
+
typeof candidate === 'object' &&
|
|
46
|
+
typeof candidate.spawn === 'function') {
|
|
47
|
+
return candidate;
|
|
48
|
+
}
|
|
49
|
+
return null;
|
|
50
|
+
}
|
|
51
|
+
catch (err) {
|
|
52
|
+
log.debug({ err }, 'node-pty not loadable — falling back to non-PTY spawn');
|
|
53
|
+
return null;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Run a command under a non-PTY `spawn`, capturing stdout/stderr/exit-code.
|
|
58
|
+
* This is the always-available fallback when `node-pty` is absent or `spawn`
|
|
59
|
+
* mode was explicitly requested.
|
|
60
|
+
*
|
|
61
|
+
* @param input - {@link RunShellInput}.
|
|
62
|
+
* @param ptyFellBack - Whether this spawn is a fallback from a requested PTY.
|
|
63
|
+
* @returns The {@link RunShellResult} (`mode: 'spawn'`).
|
|
64
|
+
*/
|
|
65
|
+
function runSpawn(input, ptyFellBack) {
|
|
66
|
+
return new Promise((resolve, reject) => {
|
|
67
|
+
const child = spawn(input.command, [...(input.args ?? [])], {
|
|
68
|
+
cwd: input.cwd,
|
|
69
|
+
env: scrubSubprocessEnv({ extra: input.env }),
|
|
70
|
+
timeout: input.timeoutMs,
|
|
71
|
+
shell: false,
|
|
72
|
+
});
|
|
73
|
+
let stdout = '';
|
|
74
|
+
let stderr = '';
|
|
75
|
+
child.stdout?.on('data', (d) => {
|
|
76
|
+
stdout += d.toString('utf8');
|
|
77
|
+
});
|
|
78
|
+
child.stderr?.on('data', (d) => {
|
|
79
|
+
stderr += d.toString('utf8');
|
|
80
|
+
});
|
|
81
|
+
child.on('error', reject);
|
|
82
|
+
child.on('close', (code) => {
|
|
83
|
+
resolve({ stdout, stderr, code, mode: 'spawn', ptyFellBack });
|
|
84
|
+
});
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Run a command under a PTY via the lazily-loaded `node-pty`. The PTY interleaves
|
|
89
|
+
* stdout + stderr on a single stream (as a real terminal does), so the result's
|
|
90
|
+
* `stderr` is empty and all output lands in `stdout`.
|
|
91
|
+
*
|
|
92
|
+
* @param pty - The loaded `node-pty` module.
|
|
93
|
+
* @param input - {@link RunShellInput}.
|
|
94
|
+
* @returns The {@link RunShellResult} (`mode: 'pty'`).
|
|
95
|
+
*/
|
|
96
|
+
function runWithPty(pty, input) {
|
|
97
|
+
return new Promise((resolve, reject) => {
|
|
98
|
+
let proc;
|
|
99
|
+
try {
|
|
100
|
+
proc = pty.spawn(input.command, [...(input.args ?? [])], {
|
|
101
|
+
name: 'xterm-256color',
|
|
102
|
+
cols: input.cols ?? DEFAULT_COLS,
|
|
103
|
+
rows: input.rows ?? DEFAULT_ROWS,
|
|
104
|
+
cwd: input.cwd,
|
|
105
|
+
env: scrubSubprocessEnv({ extra: input.env }),
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
catch (err) {
|
|
109
|
+
reject(err instanceof Error ? err : new Error(String(err)));
|
|
110
|
+
return;
|
|
111
|
+
}
|
|
112
|
+
let stdout = '';
|
|
113
|
+
let timer;
|
|
114
|
+
if (typeof input.timeoutMs === 'number' && input.timeoutMs > 0) {
|
|
115
|
+
timer = setTimeout(() => {
|
|
116
|
+
proc.kill();
|
|
117
|
+
}, input.timeoutMs);
|
|
118
|
+
}
|
|
119
|
+
proc.onData((data) => {
|
|
120
|
+
stdout += data;
|
|
121
|
+
});
|
|
122
|
+
proc.onExit(({ exitCode, signal }) => {
|
|
123
|
+
if (timer)
|
|
124
|
+
clearTimeout(timer);
|
|
125
|
+
resolve({
|
|
126
|
+
stdout,
|
|
127
|
+
stderr: '',
|
|
128
|
+
code: typeof signal === 'number' && signal > 0 ? null : exitCode,
|
|
129
|
+
mode: 'pty',
|
|
130
|
+
ptyFellBack: false,
|
|
131
|
+
});
|
|
132
|
+
});
|
|
133
|
+
});
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* Run a command under a PTY when possible, else a non-PTY spawn.
|
|
137
|
+
*
|
|
138
|
+
* - `spawn` mode → always {@link runSpawn}.
|
|
139
|
+
* - `pty` / `auto` mode → attempt {@link loadNodePty}; on success {@link runWithPty},
|
|
140
|
+
* otherwise degrade to {@link runSpawn} with `ptyFellBack: true`.
|
|
141
|
+
*
|
|
142
|
+
* The actual process is always launched under the scrubbed subprocess env. This
|
|
143
|
+
* function performs NO policy decision of its own — it is the executor the guard
|
|
144
|
+
* chokepoint ({@link ./guard.js}) invokes AFTER its denylist check passes.
|
|
145
|
+
*
|
|
146
|
+
* @param input - {@link RunShellInput}.
|
|
147
|
+
* @returns The {@link RunShellResult}.
|
|
148
|
+
*
|
|
149
|
+
* @example
|
|
150
|
+
* ```ts
|
|
151
|
+
* const res = await runPty({ command: 'echo', args: ['hi'], mode: 'auto' });
|
|
152
|
+
* // res.mode === 'pty' when node-pty is installed, else 'spawn' (ptyFellBack: true)
|
|
153
|
+
* ```
|
|
154
|
+
*/
|
|
155
|
+
export async function runPty(input) {
|
|
156
|
+
const mode = input.mode ?? 'auto';
|
|
157
|
+
if (mode === 'spawn') {
|
|
158
|
+
return runSpawn(input, false);
|
|
159
|
+
}
|
|
160
|
+
const pty = await loadNodePty();
|
|
161
|
+
if (pty === null) {
|
|
162
|
+
return runSpawn(input, true);
|
|
163
|
+
}
|
|
164
|
+
return runWithPty(pty, input);
|
|
165
|
+
}
|
|
166
|
+
//# sourceMappingURL=pty.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pty.js","sourceRoot":"","sources":["../../src/tools/pty.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OpenAI-format tool-schema generation (T1739 · AC3 · epic T11456).
|
|
3
|
+
*
|
|
4
|
+
* The SINGLE generator that turns a Cleo Zod parameter schema into the
|
|
5
|
+
* OpenAI / JSON-Schema {@link TransportTool} shape the ModelRunner + transport
|
|
6
|
+
* wire layer (and the Pi adapter) consume. Both the agent-facing
|
|
7
|
+
* {@link ./agent-registry.js | AgentToolRegistry} (AC3) and the Pi streamFn
|
|
8
|
+
* bridge (`core/src/llm/pi/pi-stream-fn.ts`) call THIS function, so there is one
|
|
9
|
+
* conversion doctrine and no drift (DRY).
|
|
10
|
+
*
|
|
11
|
+
* Uses Zod v4's native `z.toJSONSchema` — NO `zod-to-json-schema` dependency and
|
|
12
|
+
* NO typebox value-import, so the cleo↔Pi tool surface carries zero typebox
|
|
13
|
+
* (Gate 10). The resulting `inputSchema` is a plain JSON-Schema object the
|
|
14
|
+
* transport passes through verbatim after any provider-specific adaptation.
|
|
15
|
+
*
|
|
16
|
+
* @task T1739
|
|
17
|
+
* @epic T11456
|
|
18
|
+
*/
|
|
19
|
+
import type { TransportTool } from '@cleocode/contracts/llm/normalized-response.js';
|
|
20
|
+
import { z } from 'zod';
|
|
21
|
+
/**
|
|
22
|
+
* A name + description + Zod-schema tool definition, in the shape the schema
|
|
23
|
+
* generator consumes. Both the agent registry's {@link
|
|
24
|
+
* ./agent-registry.js | AgentToolDescriptor} and the Pi streamFn's `PiZodTool`
|
|
25
|
+
* structurally satisfy this, so one generator serves both.
|
|
26
|
+
*/
|
|
27
|
+
export interface ZodSchemaTool {
|
|
28
|
+
/** Tool name as the provider / model will see it. */
|
|
29
|
+
readonly name: string;
|
|
30
|
+
/** Human-readable description for the model. */
|
|
31
|
+
readonly description: string;
|
|
32
|
+
/** Zod schema for the tool's input parameters. */
|
|
33
|
+
readonly parameters: z.ZodType;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Convert a Cleo Zod-schema tool into the OpenAI-format JSON-Schema
|
|
37
|
+
* {@link TransportTool}.
|
|
38
|
+
*
|
|
39
|
+
* The conversion is purely a function of its input (no I/O, no global state), so
|
|
40
|
+
* it is safe to call at any time, including during a lazy
|
|
41
|
+
* {@link ./agent-registry.js | AgentToolRegistry} discovery pass.
|
|
42
|
+
*
|
|
43
|
+
* @param tool - The Cleo Zod tool ({@link ZodSchemaTool}).
|
|
44
|
+
* @returns The transport-shaped JSON-Schema tool (OpenAI function format).
|
|
45
|
+
*
|
|
46
|
+
* @example
|
|
47
|
+
* ```ts
|
|
48
|
+
* const t = zodSchemaToOpenAITool({
|
|
49
|
+
* name: 'read_file',
|
|
50
|
+
* description: 'Read a file as text',
|
|
51
|
+
* parameters: z.object({ path: z.string() }),
|
|
52
|
+
* });
|
|
53
|
+
* // t.inputSchema === { type: 'object', properties: { path: { type: 'string' } }, ... }
|
|
54
|
+
* ```
|
|
55
|
+
*/
|
|
56
|
+
export declare function zodSchemaToOpenAITool(tool: ZodSchemaTool): TransportTool;
|
|
57
|
+
//# sourceMappingURL=schema-gen.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema-gen.d.ts","sourceRoot":"","sources":["../../src/tools/schema-gen.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gDAAgD,CAAC;AACpF,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB;;;;;GAKG;AACH,MAAM,WAAW,aAAa;IAC5B,qDAAqD;IACrD,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,gDAAgD;IAChD,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,kDAAkD;IAClD,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC,OAAO,CAAC;CAChC;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,aAAa,GAAG,aAAa,CAUxE"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OpenAI-format tool-schema generation (T1739 · AC3 · epic T11456).
|
|
3
|
+
*
|
|
4
|
+
* The SINGLE generator that turns a Cleo Zod parameter schema into the
|
|
5
|
+
* OpenAI / JSON-Schema {@link TransportTool} shape the ModelRunner + transport
|
|
6
|
+
* wire layer (and the Pi adapter) consume. Both the agent-facing
|
|
7
|
+
* {@link ./agent-registry.js | AgentToolRegistry} (AC3) and the Pi streamFn
|
|
8
|
+
* bridge (`core/src/llm/pi/pi-stream-fn.ts`) call THIS function, so there is one
|
|
9
|
+
* conversion doctrine and no drift (DRY).
|
|
10
|
+
*
|
|
11
|
+
* Uses Zod v4's native `z.toJSONSchema` — NO `zod-to-json-schema` dependency and
|
|
12
|
+
* NO typebox value-import, so the cleo↔Pi tool surface carries zero typebox
|
|
13
|
+
* (Gate 10). The resulting `inputSchema` is a plain JSON-Schema object the
|
|
14
|
+
* transport passes through verbatim after any provider-specific adaptation.
|
|
15
|
+
*
|
|
16
|
+
* @task T1739
|
|
17
|
+
* @epic T11456
|
|
18
|
+
*/
|
|
19
|
+
import { z } from 'zod';
|
|
20
|
+
/**
|
|
21
|
+
* Convert a Cleo Zod-schema tool into the OpenAI-format JSON-Schema
|
|
22
|
+
* {@link TransportTool}.
|
|
23
|
+
*
|
|
24
|
+
* The conversion is purely a function of its input (no I/O, no global state), so
|
|
25
|
+
* it is safe to call at any time, including during a lazy
|
|
26
|
+
* {@link ./agent-registry.js | AgentToolRegistry} discovery pass.
|
|
27
|
+
*
|
|
28
|
+
* @param tool - The Cleo Zod tool ({@link ZodSchemaTool}).
|
|
29
|
+
* @returns The transport-shaped JSON-Schema tool (OpenAI function format).
|
|
30
|
+
*
|
|
31
|
+
* @example
|
|
32
|
+
* ```ts
|
|
33
|
+
* const t = zodSchemaToOpenAITool({
|
|
34
|
+
* name: 'read_file',
|
|
35
|
+
* description: 'Read a file as text',
|
|
36
|
+
* parameters: z.object({ path: z.string() }),
|
|
37
|
+
* });
|
|
38
|
+
* // t.inputSchema === { type: 'object', properties: { path: { type: 'string' } }, ... }
|
|
39
|
+
* ```
|
|
40
|
+
*/
|
|
41
|
+
export function zodSchemaToOpenAITool(tool) {
|
|
42
|
+
// Zod v4's native `z.toJSONSchema` renders a plain JSON-Schema object — NO
|
|
43
|
+
// `zod-to-json-schema` dep and NO typebox value-import at this boundary, so
|
|
44
|
+
// every tool surface (registry + Pi bridge) carries zero typebox (Gate 10).
|
|
45
|
+
const inputSchema = z.toJSONSchema(tool.parameters);
|
|
46
|
+
return {
|
|
47
|
+
name: tool.name,
|
|
48
|
+
description: tool.description,
|
|
49
|
+
inputSchema,
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=schema-gen.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema-gen.js","sourceRoot":"","sources":["../../src/tools/schema-gen.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAGH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAiBxB;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,UAAU,qBAAqB,CAAC,IAAmB;IACvD,2EAA2E;IAC3E,4EAA4E;IAC5E,4EAA4E;IAC5E,MAAM,WAAW,GAAG,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC,UAAU,CAA4B,CAAC;IAC/E,OAAO;QACL,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,WAAW,EAAE,IAAI,CAAC,WAAW;QAC7B,WAAW;KACZ,CAAC;AACJ,CAAC"}
|
package/dist/tools/shell.d.ts
CHANGED
|
@@ -30,6 +30,18 @@ export type ShellExecutor = (input: ExecuteShellInput) => Promise<ExecuteShellRe
|
|
|
30
30
|
* stderr and resolving `{ stdout, stderr, code }`. A `timeoutMs` kills the
|
|
31
31
|
* process (code resolves to `null` on signal/timeout). Never rejects on a
|
|
32
32
|
* non-zero exit — the exit code is the result, not an error.
|
|
33
|
+
*
|
|
34
|
+
* ## Environment is SCRUBBED, never inherited (T11897 · security)
|
|
35
|
+
*
|
|
36
|
+
* The child runs under a MINIMAL, explicitly-constructed environment built by
|
|
37
|
+
* {@link scrubSubprocessEnv} — it does NOT inherit the parent `process.env`.
|
|
38
|
+
* This is load-bearing: the parent (the Cleo daemon) holds resolved provider
|
|
39
|
+
* credentials (`ANTHROPIC_API_KEY`, vault material, OAuth headers); blindly
|
|
40
|
+
* forwarding the full env into a child spawned on behalf of an in-process Pi
|
|
41
|
+
* loop would let a single `env`/`printenv` exfiltrate them, and would forward a
|
|
42
|
+
* Pi-poisoned `LD_PRELOAD`/`PATH`/`NODE_OPTIONS` into the loader. The
|
|
43
|
+
* caller-supplied `input.env` is merged on top but itself scrubbed (forbidden
|
|
44
|
+
* keys dropped, `PATH` pinned). Benign vars (locale/term/home) pass through.
|
|
33
45
|
*/
|
|
34
46
|
export declare const defaultShellExecutor: ShellExecutor;
|
|
35
47
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shell.d.ts","sourceRoot":"","sources":["../../src/tools/shell.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAGH,OAAO,KAAK,EACV,iBAAiB,EACjB,kBAAkB,EAClB,WAAW,EACZ,MAAM,kCAAkC,CAAC;
|
|
1
|
+
{"version":3,"file":"shell.d.ts","sourceRoot":"","sources":["../../src/tools/shell.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAGH,OAAO,KAAK,EACV,iBAAiB,EACjB,kBAAkB,EAClB,WAAW,EACZ,MAAM,kCAAkC,CAAC;AAG1C;;;;GAIG;AACH,MAAM,MAAM,aAAa,GAAG,CAAC,KAAK,EAAE,iBAAiB,KAAK,OAAO,CAAC,kBAAkB,CAAC,CAAC;AAEtF;;;;;;;;;;;;;;;;;GAiBG;AACH,eAAO,MAAM,oBAAoB,EAAE,aAoB/B,CAAC;AAEL;;;;;;;;;;;GAWG;AACH,wBAAgB,YAAY,CAC1B,KAAK,EAAE,iBAAiB,EACxB,QAAQ,GAAE,aAAoC,GAC7C,OAAO,CAAC,kBAAkB,CAAC,CAE7B;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,MAAM,CACpB,KAAK,EAAE,WAAW,EAClB,QAAQ,GAAE,aAAoC,GAC7C,OAAO,CAAC,kBAAkB,CAAC,CAK7B"}
|
package/dist/tools/shell.js
CHANGED
|
@@ -19,16 +19,29 @@
|
|
|
19
19
|
* @saga T11387
|
|
20
20
|
*/
|
|
21
21
|
import { spawn } from 'node:child_process';
|
|
22
|
+
import { scrubSubprocessEnv } from './env-scrub.js';
|
|
22
23
|
/**
|
|
23
24
|
* Default executor: `spawn(command, args)` with no shell, capturing stdout +
|
|
24
25
|
* stderr and resolving `{ stdout, stderr, code }`. A `timeoutMs` kills the
|
|
25
26
|
* process (code resolves to `null` on signal/timeout). Never rejects on a
|
|
26
27
|
* non-zero exit — the exit code is the result, not an error.
|
|
28
|
+
*
|
|
29
|
+
* ## Environment is SCRUBBED, never inherited (T11897 · security)
|
|
30
|
+
*
|
|
31
|
+
* The child runs under a MINIMAL, explicitly-constructed environment built by
|
|
32
|
+
* {@link scrubSubprocessEnv} — it does NOT inherit the parent `process.env`.
|
|
33
|
+
* This is load-bearing: the parent (the Cleo daemon) holds resolved provider
|
|
34
|
+
* credentials (`ANTHROPIC_API_KEY`, vault material, OAuth headers); blindly
|
|
35
|
+
* forwarding the full env into a child spawned on behalf of an in-process Pi
|
|
36
|
+
* loop would let a single `env`/`printenv` exfiltrate them, and would forward a
|
|
37
|
+
* Pi-poisoned `LD_PRELOAD`/`PATH`/`NODE_OPTIONS` into the loader. The
|
|
38
|
+
* caller-supplied `input.env` is merged on top but itself scrubbed (forbidden
|
|
39
|
+
* keys dropped, `PATH` pinned). Benign vars (locale/term/home) pass through.
|
|
27
40
|
*/
|
|
28
41
|
export const defaultShellExecutor = (input) => new Promise((resolve, reject) => {
|
|
29
42
|
const child = spawn(input.command, [...(input.args ?? [])], {
|
|
30
43
|
cwd: input.cwd,
|
|
31
|
-
env:
|
|
44
|
+
env: scrubSubprocessEnv({ extra: input.env }),
|
|
32
45
|
timeout: input.timeoutMs,
|
|
33
46
|
shell: false,
|
|
34
47
|
});
|
package/dist/tools/shell.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shell.js","sourceRoot":"","sources":["../../src/tools/shell.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"shell.js","sourceRoot":"","sources":["../../src/tools/shell.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAM3C,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AASpD;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAkB,CAAC,KAAK,EAAE,EAAE,CAC3D,IAAI,OAAO,CAAqB,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;IAClD,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,EAAE;QAC1D,GAAG,EAAE,KAAK,CAAC,GAAG;QACd,GAAG,EAAE,kBAAkB,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,GAAG,EAAE,CAAC;QAC7C,OAAO,EAAE,KAAK,CAAC,SAAS;QACxB,KAAK,EAAE,KAAK;KACb,CAAC,CAAC;IACH,IAAI,MAAM,GAAG,EAAE,CAAC;IAChB,IAAI,MAAM,GAAG,EAAE,CAAC;IAChB,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,CAAS,EAAE,EAAE;QACrC,MAAM,IAAI,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IAC/B,CAAC,CAAC,CAAC;IACH,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,CAAS,EAAE,EAAE;QACrC,MAAM,IAAI,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IAC/B,CAAC,CAAC,CAAC;IACH,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IAC1B,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE;QACzB,OAAO,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;IACpC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEL;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,YAAY,CAC1B,KAAwB,EACxB,WAA0B,oBAAoB;IAE9C,OAAO,QAAQ,CAAC,KAAK,CAAC,CAAC;AACzB,CAAC;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,MAAM,CACpB,KAAkB,EAClB,WAA0B,oBAAoB;IAE9C,OAAO,YAAY,CACjB,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,EAAE,SAAS,EAAE,KAAK,CAAC,SAAS,EAAE,EAChF,QAAQ,CACT,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Web + browser agent-tool FAMILY — registration (T1742 · epic T11456 · SG-TOOLS).
|
|
3
|
+
*
|
|
4
|
+
* Registers the `web` toolset into the {@link ./agent-registry.js |
|
|
5
|
+
* AgentToolRegistry}, on top of the terminal/file/search/git families
|
|
6
|
+
* ({@link ./agent-tool-families.js}):
|
|
7
|
+
*
|
|
8
|
+
* - **AC1** `web_search` — pluggable, backend-agnostic search
|
|
9
|
+
* ({@link ./web-search-backends.js}); graceful `unavailable` result when no
|
|
10
|
+
* backend can answer. NO hard paid-API dependency.
|
|
11
|
+
* - **AC2** `web_extract` — fetch a URL + convert HTML to markdown.
|
|
12
|
+
* - **AC3** `browser_navigate` — Playwright (lazily, optionally loaded).
|
|
13
|
+
* - **AC4** `browser_click` / `browser_type` / `browser_press`.
|
|
14
|
+
* - **AC5** `browser_snapshot` — accessibility tree.
|
|
15
|
+
* - **AC6** `browser_vision` — screenshot + AI analysis routed THROUGH the E9
|
|
16
|
+
* `resolveLLMForSystem` chokepoint + sealed-credential handle (never a raw
|
|
17
|
+
* provider call).
|
|
18
|
+
* - **AC7** `browser_scroll` up / down.
|
|
19
|
+
* - **AC8** all registered; the browser tools' `available()` returns `false`
|
|
20
|
+
* (with an install hint) when Playwright is absent.
|
|
21
|
+
*
|
|
22
|
+
* Browser tools share ONE lazily-launched {@link BrowserSession} per registration
|
|
23
|
+
* (a closure cell), so the optional Playwright load happens at most once per run.
|
|
24
|
+
* The web tools' network egress flows through an injectable {@link HttpFetch}; the
|
|
25
|
+
* vision AI call flows through the single E9 chokepoint — neither bypasses the
|
|
26
|
+
* resolver / credential layer. Import-time side-effect-free (NO top-level
|
|
27
|
+
* playwright import).
|
|
28
|
+
*
|
|
29
|
+
* @epic T11456
|
|
30
|
+
* @task T1742
|
|
31
|
+
* @see ./browser-driver.js — the optional-Playwright lazy-load backend
|
|
32
|
+
* @see ./web-search-backends.js — the pluggable search backends + HTML→markdown
|
|
33
|
+
*/
|
|
34
|
+
import type { AgentToolRegistry } from './agent-registry.js';
|
|
35
|
+
import { BrowserSession } from './browser-driver.js';
|
|
36
|
+
import { type HttpFetch } from './web-search-backends.js';
|
|
37
|
+
/**
|
|
38
|
+
* Options for {@link registerWebAgentTools} — all injectable so tests run with
|
|
39
|
+
* NO real network and NO real browser launch (AC9).
|
|
40
|
+
*/
|
|
41
|
+
export interface WebAgentToolOptions {
|
|
42
|
+
/** Injected HTTP fetch (defaults to the platform `fetch`). */
|
|
43
|
+
readonly http?: HttpFetch;
|
|
44
|
+
/** Injected browser session (defaults to a real lazy-Playwright session). */
|
|
45
|
+
readonly browser?: BrowserSession;
|
|
46
|
+
/**
|
|
47
|
+
* SearXNG instance URL for the `searxng` backend. When omitted, the SearXNG
|
|
48
|
+
* backend reports unconfigured and only DuckDuckGo answers — preserving the
|
|
49
|
+
* "graceful when unconfigured" contract (AC1). Read from `SEARXNG_URL` env when
|
|
50
|
+
* not supplied.
|
|
51
|
+
*/
|
|
52
|
+
readonly searxngUrl?: string;
|
|
53
|
+
/**
|
|
54
|
+
* Project root threaded into the E9 `resolveLLMForSystem` chokepoint for
|
|
55
|
+
* `browser_vision` (defaults to the resolver's own `process.cwd()` fallback).
|
|
56
|
+
*/
|
|
57
|
+
readonly projectRoot?: string;
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Register the web + browser agent-tool family into `registry`. Pure
|
|
61
|
+
* registration — no network, no browser launch, no scan; side effects happen
|
|
62
|
+
* later through the injected {@link HttpFetch} / {@link BrowserSession}.
|
|
63
|
+
*
|
|
64
|
+
* The browser tools are registered with a `playwright`-gated availability
|
|
65
|
+
* predicate (AC8): present in the registry but hidden by `available()` until a
|
|
66
|
+
* context advertises the optional Playwright capability.
|
|
67
|
+
*
|
|
68
|
+
* @param registry - The registry to populate.
|
|
69
|
+
* @param options - Injectable backends (HTTP fetch, browser session, searxng URL).
|
|
70
|
+
*/
|
|
71
|
+
export declare function registerWebAgentTools(registry: AgentToolRegistry, options?: WebAgentToolOptions): void;
|
|
72
|
+
//# sourceMappingURL=web-agent-tools.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"web-agent-tools.d.ts","sourceRoot":"","sources":["../../src/tools/web-agent-tools.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AAWH,OAAO,KAAK,EAAE,iBAAiB,EAAqB,MAAM,qBAAqB,CAAC;AAChF,OAAO,EAAE,cAAc,EAA2B,MAAM,qBAAqB,CAAC;AAC9E,OAAO,EAGL,KAAK,SAAS,EAGf,MAAM,0BAA0B,CAAC;AAuBlC;;;GAGG;AACH,MAAM,WAAW,mBAAmB;IAClC,8DAA8D;IAC9D,QAAQ,CAAC,IAAI,CAAC,EAAE,SAAS,CAAC;IAC1B,6EAA6E;IAC7E,QAAQ,CAAC,OAAO,CAAC,EAAE,cAAc,CAAC;IAClC;;;;;OAKG;IACH,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B;;;OAGG;IACH,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;CAC/B;AA0FD;;;;;;;;;;;GAWG;AACH,wBAAgB,qBAAqB,CACnC,QAAQ,EAAE,iBAAiB,EAC3B,OAAO,GAAE,mBAAwB,GAChC,IAAI,CAkRN"}
|