atabey 0.0.23 → 0.0.26
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/ATABEY.md +5 -0
- package/dist/atabey/src/cli/commands/dashboard.js +20 -19
- package/dist/atabey/src/cli/commands/dashboard.js.map +1 -1
- package/dist/atabey/src/cli/commands/init/scaffold-core.js +10 -1
- package/dist/atabey/src/cli/commands/init/scaffold-core.js.map +1 -1
- package/dist/atabey/src/cli/commands/init/scaffold-docs.js +2 -2
- package/dist/atabey/src/cli/commands/init/scaffold-docs.js.map +1 -1
- package/dist/atabey/src/cli/commands/init/scaffold-standards.js +1 -1
- package/dist/atabey/src/cli/commands/init.js +12 -18
- package/dist/atabey/src/cli/commands/init.js.map +1 -1
- package/dist/atabey/src/cli/commands/mcp.js +1 -1
- package/dist/atabey/src/cli/commands/mcp.js.map +1 -1
- package/dist/atabey/src/cli/commands/orchestrate.d.ts +8 -8
- package/dist/atabey/src/cli/index.js +50 -3
- package/dist/atabey/src/cli/index.js.map +1 -1
- package/dist/atabey/src/cli/utils/config-schema.d.ts +19 -19
- package/dist/atabey/src/cli/utils/i18n.d.ts +9 -4
- package/dist/atabey/src/cli/utils/i18n.js +26 -31
- package/dist/atabey/src/cli/utils/i18n.js.map +1 -1
- package/dist/atabey/src/cli/utils/pkg.js +1 -0
- package/dist/atabey/src/cli/utils/pkg.js.map +1 -1
- package/dist/atabey/src/cli/utils/schemas.d.ts +6 -6
- package/dist/atabey/src/cli/utils/validate-registry.js +5 -4
- package/dist/atabey/src/cli/utils/validate-registry.js.map +1 -1
- package/dist/atabey/src/contracts/tasks.d.ts +4 -4
- package/dist/atabey/src/modules/agents/registry/manager.js +1 -1
- package/dist/atabey/src/modules/agents/registry/security.js +1 -1
- package/dist/atabey/src/modules/agents/registry/security.js.map +1 -1
- package/dist/atabey/src/modules/contracts/api.d.ts +6 -6
- package/dist/atabey/src/modules/engines/agent-executor.js +82 -47
- package/dist/atabey/src/modules/engines/agent-executor.js.map +1 -1
- package/dist/atabey/src/modules/engines/agent-loop.d.ts +5 -2
- package/dist/atabey/src/modules/engines/agent-loop.js +39 -13
- package/dist/atabey/src/modules/engines/agent-loop.js.map +1 -1
- package/dist/atabey/src/modules/engines/file-lock.d.ts +18 -8
- package/dist/atabey/src/modules/engines/file-lock.js +95 -101
- package/dist/atabey/src/modules/engines/file-lock.js.map +1 -1
- package/dist/atabey/src/modules/engines/policy-engine.js +5 -3
- package/dist/atabey/src/modules/engines/policy-engine.js.map +1 -1
- package/dist/atabey/src/modules/engines/routing-engine.d.ts +3 -0
- package/dist/atabey/src/modules/engines/routing-engine.js +14 -4
- package/dist/atabey/src/modules/engines/routing-engine.js.map +1 -1
- package/dist/atabey/src/modules/engines/sandbox.d.ts +31 -0
- package/dist/atabey/src/modules/engines/sandbox.js +57 -0
- package/dist/atabey/src/modules/engines/sandbox.js.map +1 -0
- package/dist/atabey/src/modules/engines/worker-pool.d.ts +8 -0
- package/dist/atabey/src/modules/engines/worker-pool.js +9 -0
- package/dist/atabey/src/modules/engines/worker-pool.js.map +1 -0
- package/dist/atabey/src/modules/engines/worker-script.d.ts +8 -0
- package/dist/atabey/src/modules/engines/worker-script.js +99 -0
- package/dist/atabey/src/modules/engines/worker-script.js.map +1 -0
- package/dist/atabey/src/modules/memory/core.js +1 -1
- package/dist/atabey/src/modules/memory/core.js.map +1 -1
- package/dist/atabey/src/shared/file-lock.d.ts +1 -0
- package/dist/atabey/src/shared/file-lock.js +2 -0
- package/dist/atabey/src/shared/file-lock.js.map +1 -0
- package/dist/atabey/src/shared/job-queue.d.ts +1 -0
- package/dist/atabey/src/shared/job-queue.js +2 -0
- package/dist/atabey/src/shared/job-queue.js.map +1 -0
- package/dist/atabey/src/shared/resilience.d.ts +1 -0
- package/dist/atabey/src/shared/resilience.js +2 -0
- package/dist/atabey/src/shared/resilience.js.map +1 -0
- package/dist/atabey/src/shared/sandbox-runtime.d.ts +1 -0
- package/dist/atabey/src/shared/sandbox-runtime.js +2 -0
- package/dist/atabey/src/shared/sandbox-runtime.js.map +1 -0
- package/dist/atabey/src/shared/sandbox.d.ts +1 -0
- package/dist/atabey/src/shared/sandbox.js +2 -0
- package/dist/atabey/src/shared/sandbox.js.map +1 -0
- package/dist/atabey/src/shared/storage.d.ts +8 -0
- package/dist/atabey/src/shared/storage.js +51 -40
- package/dist/atabey/src/shared/storage.js.map +1 -1
- package/dist/atabey/src/shared/worker-pool.d.ts +1 -0
- package/dist/atabey/src/shared/worker-pool.js +2 -0
- package/dist/atabey/src/shared/worker-pool.js.map +1 -0
- package/dist/atabey-mcp/src/mcp/utils/auto-rollback.js +114 -5
- package/dist/atabey-mcp/src/mcp/utils/auto-rollback.js.map +1 -1
- package/dist/atabey-mcp/src/mcp/utils/loop-detector.d.ts +1 -0
- package/dist/atabey-mcp/src/mcp/utils/loop-detector.js +57 -6
- package/dist/atabey-mcp/src/mcp/utils/loop-detector.js.map +1 -1
- package/dist/atabey-mcp/src/shared/storage.d.ts +9 -0
- package/dist/atabey-mcp/src/shared/storage.js +51 -0
- package/dist/atabey-mcp/src/shared/storage.js.map +1 -1
- package/dist/shared/src/audit-chain.d.ts +51 -0
- package/dist/shared/src/audit-chain.js +85 -0
- package/dist/shared/src/audit-chain.js.map +1 -0
- package/dist/shared/src/audit.d.ts +8 -0
- package/dist/shared/src/audit.js +82 -18
- package/dist/shared/src/audit.js.map +1 -1
- package/dist/shared/src/file-lock.d.ts +85 -0
- package/dist/shared/src/file-lock.js +246 -0
- package/dist/shared/src/file-lock.js.map +1 -0
- package/dist/shared/src/index.d.ts +9 -0
- package/dist/shared/src/index.js +9 -0
- package/dist/shared/src/index.js.map +1 -1
- package/dist/shared/src/job-queue.d.ts +53 -0
- package/dist/shared/src/job-queue.js +127 -0
- package/dist/shared/src/job-queue.js.map +1 -0
- package/dist/shared/src/policy-gate.d.ts +42 -0
- package/dist/shared/src/policy-gate.js +148 -0
- package/dist/shared/src/policy-gate.js.map +1 -0
- package/dist/shared/src/resilience.d.ts +84 -0
- package/dist/shared/src/resilience.js +217 -0
- package/dist/shared/src/resilience.js.map +1 -0
- package/dist/shared/src/sandbox-fs.d.ts +28 -0
- package/dist/shared/src/sandbox-fs.js +148 -0
- package/dist/shared/src/sandbox-fs.js.map +1 -0
- package/dist/shared/src/sandbox-runtime.d.ts +85 -0
- package/dist/shared/src/sandbox-runtime.js +250 -0
- package/dist/shared/src/sandbox-runtime.js.map +1 -0
- package/dist/shared/src/sandbox.d.ts +54 -0
- package/dist/shared/src/sandbox.js +179 -0
- package/dist/shared/src/sandbox.js.map +1 -0
- package/dist/shared/src/worker-pool.d.ts +52 -0
- package/dist/shared/src/worker-pool.js +210 -0
- package/dist/shared/src/worker-pool.js.map +1 -0
- package/dist/shared/src/worker-thread.d.ts +21 -0
- package/dist/shared/src/worker-thread.js +67 -0
- package/dist/shared/src/worker-thread.js.map +1 -0
- package/dist/src/cli/commands/approve.d.ts +1 -0
- package/dist/src/cli/commands/approve.js +64 -0
- package/dist/src/cli/commands/approve.js.map +1 -0
- package/dist/src/cli/commands/check.d.ts +1 -0
- package/dist/src/cli/commands/check.js +339 -0
- package/dist/src/cli/commands/check.js.map +1 -0
- package/dist/src/cli/commands/compliance.d.ts +5 -0
- package/dist/src/cli/commands/compliance.js +43 -0
- package/dist/src/cli/commands/compliance.js.map +1 -0
- package/dist/src/cli/commands/contract.d.ts +10 -0
- package/dist/src/cli/commands/contract.js +52 -0
- package/dist/src/cli/commands/contract.js.map +1 -0
- package/dist/src/cli/commands/coverage.d.ts +1 -0
- package/dist/src/cli/commands/coverage.js +121 -0
- package/dist/src/cli/commands/coverage.js.map +1 -0
- package/dist/src/cli/commands/dashboard.d.ts +5 -0
- package/dist/src/cli/commands/dashboard.js +753 -0
- package/dist/src/cli/commands/dashboard.js.map +1 -0
- package/dist/src/cli/commands/explorer.d.ts +2 -0
- package/dist/src/cli/commands/explorer.js +44 -0
- package/dist/src/cli/commands/explorer.js.map +1 -0
- package/dist/src/cli/commands/git.d.ts +2 -0
- package/dist/src/cli/commands/git.js +40 -0
- package/dist/src/cli/commands/git.js.map +1 -0
- package/dist/src/cli/commands/index-codebase.d.ts +4 -0
- package/dist/src/cli/commands/index-codebase.js +63 -0
- package/dist/src/cli/commands/index-codebase.js.map +1 -0
- package/dist/src/cli/commands/init/create-agent.d.ts +4 -0
- package/dist/src/cli/commands/init/create-agent.js +59 -0
- package/dist/src/cli/commands/init/create-agent.js.map +1 -0
- package/dist/src/cli/commands/init/scaffold-core.d.ts +13 -0
- package/dist/src/cli/commands/init/scaffold-core.js +188 -0
- package/dist/src/cli/commands/init/scaffold-core.js.map +1 -0
- package/dist/src/cli/commands/init/scaffold-docs.d.ts +4 -0
- package/dist/src/cli/commands/init/scaffold-docs.js +36 -0
- package/dist/src/cli/commands/init/scaffold-docs.js.map +1 -0
- package/dist/src/cli/commands/init/scaffold-ops.d.ts +1 -0
- package/dist/src/cli/commands/init/scaffold-ops.js +81 -0
- package/dist/src/cli/commands/init/scaffold-ops.js.map +1 -0
- package/dist/src/cli/commands/init/scaffold-standards.d.ts +2 -0
- package/dist/src/cli/commands/init/scaffold-standards.js +84 -0
- package/dist/src/cli/commands/init/scaffold-standards.js.map +1 -0
- package/dist/src/cli/commands/init.d.ts +11 -0
- package/dist/src/cli/commands/init.js +371 -0
- package/dist/src/cli/commands/init.js.map +1 -0
- package/dist/src/cli/commands/knowledge.d.ts +2 -0
- package/dist/src/cli/commands/knowledge.js +16 -0
- package/dist/src/cli/commands/knowledge.js.map +1 -0
- package/dist/src/cli/commands/lint.d.ts +4 -0
- package/dist/src/cli/commands/lint.js +24 -0
- package/dist/src/cli/commands/lint.js.map +1 -0
- package/dist/src/cli/commands/log.d.ts +10 -0
- package/dist/src/cli/commands/log.js +14 -0
- package/dist/src/cli/commands/log.js.map +1 -0
- package/dist/src/cli/commands/mcp.d.ts +11 -0
- package/dist/src/cli/commands/mcp.js +128 -0
- package/dist/src/cli/commands/mcp.js.map +1 -0
- package/dist/src/cli/commands/memory.d.ts +1 -0
- package/dist/src/cli/commands/memory.js +5 -0
- package/dist/src/cli/commands/memory.js.map +1 -0
- package/dist/src/cli/commands/orchestrate.d.ts +62 -0
- package/dist/src/cli/commands/orchestrate.js +263 -0
- package/dist/src/cli/commands/orchestrate.js.map +1 -0
- package/dist/src/cli/commands/plan.d.ts +11 -0
- package/dist/src/cli/commands/plan.js +120 -0
- package/dist/src/cli/commands/plan.js.map +1 -0
- package/dist/src/cli/commands/quickstart.d.ts +9 -0
- package/dist/src/cli/commands/quickstart.js +60 -0
- package/dist/src/cli/commands/quickstart.js.map +1 -0
- package/dist/src/cli/commands/script.d.ts +1 -0
- package/dist/src/cli/commands/script.js +28 -0
- package/dist/src/cli/commands/script.js.map +1 -0
- package/dist/src/cli/commands/security.d.ts +1 -0
- package/dist/src/cli/commands/security.js +34 -0
- package/dist/src/cli/commands/security.js.map +1 -0
- package/dist/src/cli/commands/status.d.ts +4 -0
- package/dist/src/cli/commands/status.js +122 -0
- package/dist/src/cli/commands/status.js.map +1 -0
- package/dist/src/cli/commands/trace.d.ts +10 -0
- package/dist/src/cli/commands/trace.js +108 -0
- package/dist/src/cli/commands/trace.js.map +1 -0
- package/dist/src/cli/index.d.ts +2 -0
- package/dist/src/cli/index.js +289 -0
- package/dist/src/cli/index.js.map +1 -0
- package/dist/src/cli/platforms/core.d.ts +16 -0
- package/dist/src/cli/platforms/core.js +77 -0
- package/dist/src/cli/platforms/core.js.map +1 -0
- package/dist/src/cli/platforms/index.d.ts +5 -0
- package/dist/src/cli/platforms/index.js +6 -0
- package/dist/src/cli/platforms/index.js.map +1 -0
- package/dist/src/cli/platforms/paths.d.ts +15 -0
- package/dist/src/cli/platforms/paths.js +102 -0
- package/dist/src/cli/platforms/paths.js.map +1 -0
- package/dist/src/cli/platforms/scaffold.d.ts +2 -0
- package/dist/src/cli/platforms/scaffold.js +73 -0
- package/dist/src/cli/platforms/scaffold.js.map +1 -0
- package/dist/src/cli/platforms/utils.d.ts +4 -0
- package/dist/src/cli/platforms/utils.js +76 -0
- package/dist/src/cli/platforms/utils.js.map +1 -0
- package/dist/src/cli/shims.d.ts +1 -0
- package/dist/src/cli/shims.js +67 -0
- package/dist/src/cli/shims.js.map +1 -0
- package/dist/src/cli/utils/claude.d.ts +8 -0
- package/dist/src/cli/utils/claude.js +58 -0
- package/dist/src/cli/utils/claude.js.map +1 -0
- package/dist/src/cli/utils/compliance.d.ts +42 -0
- package/dist/src/cli/utils/compliance.js +150 -0
- package/dist/src/cli/utils/compliance.js.map +1 -0
- package/dist/src/cli/utils/config-schema.d.ts +256 -0
- package/dist/src/cli/utils/config-schema.js +67 -0
- package/dist/src/cli/utils/config-schema.js.map +1 -0
- package/dist/src/cli/utils/fs.d.ts +10 -0
- package/dist/src/cli/utils/fs.js +139 -0
- package/dist/src/cli/utils/fs.js.map +1 -0
- package/dist/src/cli/utils/i18n.d.ts +21 -0
- package/dist/src/cli/utils/i18n.js +36 -0
- package/dist/src/cli/utils/i18n.js.map +1 -0
- package/dist/src/cli/utils/memory.d.ts +45 -0
- package/dist/src/cli/utils/memory.js +339 -0
- package/dist/src/cli/utils/memory.js.map +1 -0
- package/dist/src/cli/utils/pkg.d.ts +42 -0
- package/dist/src/cli/utils/pkg.js +281 -0
- package/dist/src/cli/utils/pkg.js.map +1 -0
- package/dist/src/cli/utils/quality.d.ts +25 -0
- package/dist/src/cli/utils/quality.js +61 -0
- package/dist/src/cli/utils/quality.js.map +1 -0
- package/dist/src/cli/utils/schemas.d.ts +49 -0
- package/dist/src/cli/utils/schemas.js +20 -0
- package/dist/src/cli/utils/schemas.js.map +1 -0
- package/dist/src/cli/utils/string.d.ts +7 -0
- package/dist/src/cli/utils/string.js +50 -0
- package/dist/src/cli/utils/string.js.map +1 -0
- package/dist/src/cli/utils/time.d.ts +2 -0
- package/dist/src/cli/utils/time.js +28 -0
- package/dist/src/cli/utils/time.js.map +1 -0
- package/dist/src/cli/utils/ui.d.ts +53 -0
- package/dist/src/cli/utils/ui.js +101 -0
- package/dist/src/cli/utils/ui.js.map +1 -0
- package/dist/src/cli/utils/validate-registry.d.ts +4 -0
- package/dist/src/cli/utils/validate-registry.js +130 -0
- package/dist/src/cli/utils/validate-registry.js.map +1 -0
- package/dist/src/contracts/index.d.ts +1 -0
- package/dist/src/contracts/index.js +2 -0
- package/dist/src/contracts/index.js.map +1 -0
- package/dist/src/contracts/tasks.d.ts +44 -0
- package/dist/src/contracts/tasks.js +21 -0
- package/dist/src/contracts/tasks.js.map +1 -0
- package/dist/src/modules/agents/definitions.d.ts +26 -0
- package/dist/src/modules/agents/definitions.js +559 -0
- package/dist/src/modules/agents/definitions.js.map +1 -0
- package/dist/src/modules/agents/registry/analyst.d.ts +2 -0
- package/dist/src/modules/agents/registry/analyst.js +40 -0
- package/dist/src/modules/agents/registry/analyst.js.map +1 -0
- package/dist/src/modules/agents/registry/architect.d.ts +2 -0
- package/dist/src/modules/agents/registry/architect.js +43 -0
- package/dist/src/modules/agents/registry/architect.js.map +1 -0
- package/dist/src/modules/agents/registry/backend.d.ts +2 -0
- package/dist/src/modules/agents/registry/backend.js +51 -0
- package/dist/src/modules/agents/registry/backend.js.map +1 -0
- package/dist/src/modules/agents/registry/database.d.ts +2 -0
- package/dist/src/modules/agents/registry/database.js +46 -0
- package/dist/src/modules/agents/registry/database.js.map +1 -0
- package/dist/src/modules/agents/registry/devops.d.ts +2 -0
- package/dist/src/modules/agents/registry/devops.js +46 -0
- package/dist/src/modules/agents/registry/devops.js.map +1 -0
- package/dist/src/modules/agents/registry/explorer.d.ts +2 -0
- package/dist/src/modules/agents/registry/explorer.js +38 -0
- package/dist/src/modules/agents/registry/explorer.js.map +1 -0
- package/dist/src/modules/agents/registry/frontend.d.ts +2 -0
- package/dist/src/modules/agents/registry/frontend.js +53 -0
- package/dist/src/modules/agents/registry/frontend.js.map +1 -0
- package/dist/src/modules/agents/registry/git.d.ts +2 -0
- package/dist/src/modules/agents/registry/git.js +37 -0
- package/dist/src/modules/agents/registry/git.js.map +1 -0
- package/dist/src/modules/agents/registry/manager.d.ts +2 -0
- package/dist/src/modules/agents/registry/manager.js +65 -0
- package/dist/src/modules/agents/registry/manager.js.map +1 -0
- package/dist/src/modules/agents/registry/mobile.d.ts +2 -0
- package/dist/src/modules/agents/registry/mobile.js +42 -0
- package/dist/src/modules/agents/registry/mobile.js.map +1 -0
- package/dist/src/modules/agents/registry/native.d.ts +2 -0
- package/dist/src/modules/agents/registry/native.js +42 -0
- package/dist/src/modules/agents/registry/native.js.map +1 -0
- package/dist/src/modules/agents/registry/quality.d.ts +2 -0
- package/dist/src/modules/agents/registry/quality.js +44 -0
- package/dist/src/modules/agents/registry/quality.js.map +1 -0
- package/dist/src/modules/agents/registry/security.d.ts +2 -0
- package/dist/src/modules/agents/registry/security.js +43 -0
- package/dist/src/modules/agents/registry/security.js.map +1 -0
- package/dist/src/modules/agents/types.d.ts +33 -0
- package/dist/src/modules/agents/types.js +2 -0
- package/dist/src/modules/agents/types.js.map +1 -0
- package/dist/src/modules/contracts/api.d.ts +178 -0
- package/dist/src/modules/contracts/api.js +56 -0
- package/dist/src/modules/contracts/api.js.map +1 -0
- package/dist/src/modules/contracts/index.d.ts +5 -0
- package/dist/src/modules/contracts/index.js +6 -0
- package/dist/src/modules/contracts/index.js.map +1 -0
- package/dist/src/modules/engines/agent-executor.d.ts +46 -0
- package/dist/src/modules/engines/agent-executor.js +241 -0
- package/dist/src/modules/engines/agent-executor.js.map +1 -0
- package/dist/src/modules/engines/agent-loop.d.ts +34 -0
- package/dist/src/modules/engines/agent-loop.js +102 -0
- package/dist/src/modules/engines/agent-loop.js.map +1 -0
- package/dist/src/modules/engines/contract-engine.d.ts +46 -0
- package/dist/src/modules/engines/contract-engine.js +116 -0
- package/dist/src/modules/engines/contract-engine.js.map +1 -0
- package/dist/src/modules/engines/crud-governance.d.ts +66 -0
- package/dist/src/modules/engines/crud-governance.js +219 -0
- package/dist/src/modules/engines/crud-governance.js.map +1 -0
- package/dist/src/modules/engines/discovery-engine.d.ts +42 -0
- package/dist/src/modules/engines/discovery-engine.js +161 -0
- package/dist/src/modules/engines/discovery-engine.js.map +1 -0
- package/dist/src/modules/engines/evaluation-engine.d.ts +18 -0
- package/dist/src/modules/engines/evaluation-engine.js +171 -0
- package/dist/src/modules/engines/evaluation-engine.js.map +1 -0
- package/dist/src/modules/engines/file-lock.d.ts +41 -0
- package/dist/src/modules/engines/file-lock.js +168 -0
- package/dist/src/modules/engines/file-lock.js.map +1 -0
- package/dist/src/modules/engines/health-engine.d.ts +22 -0
- package/dist/src/modules/engines/health-engine.js +127 -0
- package/dist/src/modules/engines/health-engine.js.map +1 -0
- package/dist/src/modules/engines/phase-engine.d.ts +82 -0
- package/dist/src/modules/engines/phase-engine.js +211 -0
- package/dist/src/modules/engines/phase-engine.js.map +1 -0
- package/dist/src/modules/engines/planning-engine.d.ts +25 -0
- package/dist/src/modules/engines/planning-engine.js +80 -0
- package/dist/src/modules/engines/planning-engine.js.map +1 -0
- package/dist/src/modules/engines/policy-engine.d.ts +63 -0
- package/dist/src/modules/engines/policy-engine.js +186 -0
- package/dist/src/modules/engines/policy-engine.js.map +1 -0
- package/dist/src/modules/engines/quality-gate.d.ts +31 -0
- package/dist/src/modules/engines/quality-gate.js +95 -0
- package/dist/src/modules/engines/quality-gate.js.map +1 -0
- package/dist/src/modules/engines/risk-engine.d.ts +34 -0
- package/dist/src/modules/engines/risk-engine.js +201 -0
- package/dist/src/modules/engines/risk-engine.js.map +1 -0
- package/dist/src/modules/engines/routing-engine.d.ts +96 -0
- package/dist/src/modules/engines/routing-engine.js +505 -0
- package/dist/src/modules/engines/routing-engine.js.map +1 -0
- package/dist/src/modules/engines/session-engine.d.ts +68 -0
- package/dist/src/modules/engines/session-engine.js +141 -0
- package/dist/src/modules/engines/session-engine.js.map +1 -0
- package/dist/src/modules/engines/types.d.ts +51 -0
- package/dist/src/modules/engines/types.js +2 -0
- package/dist/src/modules/engines/types.js.map +1 -0
- package/dist/src/modules/memory/core.d.ts +42 -0
- package/dist/src/modules/memory/core.js +100 -0
- package/dist/src/modules/memory/core.js.map +1 -0
- package/dist/src/modules/memory/embedding.d.ts +28 -0
- package/dist/src/modules/memory/embedding.js +131 -0
- package/dist/src/modules/memory/embedding.js.map +1 -0
- package/dist/src/modules/memory/types.d.ts +18 -0
- package/dist/src/modules/memory/types.js +2 -0
- package/dist/src/modules/memory/types.js.map +1 -0
- package/dist/src/modules/memory/vector-store.d.ts +13 -0
- package/dist/src/modules/memory/vector-store.js +75 -0
- package/dist/src/modules/memory/vector-store.js.map +1 -0
- package/dist/src/modules/providers/definitions.d.ts +9 -0
- package/dist/src/modules/providers/definitions.js +141 -0
- package/dist/src/modules/providers/definitions.js.map +1 -0
- package/dist/src/modules/providers/llm-provider.d.ts +87 -0
- package/dist/src/modules/providers/llm-provider.js +242 -0
- package/dist/src/modules/providers/llm-provider.js.map +1 -0
- package/dist/src/modules/providers/registry.d.ts +12 -0
- package/dist/src/modules/providers/registry.js +19 -0
- package/dist/src/modules/providers/registry.js.map +1 -0
- package/dist/src/modules/providers/shared.d.ts +1 -0
- package/dist/src/modules/providers/shared.js +104 -0
- package/dist/src/modules/providers/shared.js.map +1 -0
- package/dist/src/modules/providers/types.d.ts +14 -0
- package/dist/src/modules/providers/types.js +2 -0
- package/dist/src/modules/providers/types.js.map +1 -0
- package/dist/src/modules/skills/adapter-skills.d.ts +70 -0
- package/dist/src/modules/skills/adapter-skills.js +450 -0
- package/dist/src/modules/skills/adapter-skills.js.map +1 -0
- package/dist/src/modules/skills/definitions.d.ts +48 -0
- package/dist/src/modules/skills/definitions.js +71 -0
- package/dist/src/modules/skills/definitions.js.map +1 -0
- package/dist/src/shared/audit.d.ts +1 -0
- package/dist/src/shared/audit.js +2 -0
- package/dist/src/shared/audit.js.map +1 -0
- package/dist/src/shared/constants.d.ts +1 -0
- package/dist/src/shared/constants.js +2 -0
- package/dist/src/shared/constants.js.map +1 -0
- package/dist/src/shared/errors.d.ts +1 -0
- package/dist/src/shared/errors.js +2 -0
- package/dist/src/shared/errors.js.map +1 -0
- package/dist/src/shared/fs.d.ts +1 -0
- package/dist/src/shared/fs.js +2 -0
- package/dist/src/shared/fs.js.map +1 -0
- package/dist/src/shared/lock.d.ts +1 -0
- package/dist/src/shared/lock.js +2 -0
- package/dist/src/shared/lock.js.map +1 -0
- package/dist/src/shared/logger.d.ts +1 -0
- package/dist/src/shared/logger.js +2 -0
- package/dist/src/shared/logger.js.map +1 -0
- package/dist/src/shared/pii.d.ts +1 -0
- package/dist/src/shared/pii.js +2 -0
- package/dist/src/shared/pii.js.map +1 -0
- package/dist/src/shared/retention.d.ts +1 -0
- package/dist/src/shared/retention.js +2 -0
- package/dist/src/shared/retention.js.map +1 -0
- package/dist/src/shared/storage.d.ts +141 -0
- package/dist/src/shared/storage.js +332 -0
- package/dist/src/shared/storage.js.map +1 -0
- package/dist/src/shared/string.d.ts +1 -0
- package/dist/src/shared/string.js +2 -0
- package/dist/src/shared/string.js.map +1 -0
- package/dist/src/shared/types.d.ts +1 -0
- package/dist/src/shared/types.js +2 -0
- package/dist/src/shared/types.js.map +1 -0
- package/package.json +4 -6
- package/templates/full/ATABEY_FULL.md +2 -0
- package/templates/prompts/new-feature-recipe.md +1 -1
- package/templates/standards/architecture-standards.md +1 -1
- package/templates/standards/governance-standards.md +3 -3
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Sandbox Runtime — Phase 1.1 execution isolation for agent shell commands.
|
|
3
|
+
*
|
|
4
|
+
* Modes (ATABEY_SANDBOX_RUNTIME):
|
|
5
|
+
* none — host spawn (legacy; allow-list only)
|
|
6
|
+
* uid — host spawn with uid/gid drop (see sandbox.ts)
|
|
7
|
+
* container — Docker/Podman run with network=none, resource limits, project mount
|
|
8
|
+
* auto — container if engine available, else uid if configured, else none
|
|
9
|
+
*
|
|
10
|
+
* Enterprise hardening:
|
|
11
|
+
* ATABEY_SANDBOX_REQUIRED=true → deny execution when isolation is effectively "none"
|
|
12
|
+
*
|
|
13
|
+
* Container defaults:
|
|
14
|
+
* ATABEY_SANDBOX_ENGINE=podman|docker|auto (prefer podman, then docker)
|
|
15
|
+
* ATABEY_SANDBOX_IMAGE=node:20-bookworm-slim
|
|
16
|
+
* ATABEY_SANDBOX_MEMORY=512m
|
|
17
|
+
* ATABEY_SANDBOX_CPUS=1
|
|
18
|
+
* ATABEY_SANDBOX_PIDS=256
|
|
19
|
+
* ATABEY_SANDBOX_NETWORK=none
|
|
20
|
+
*/
|
|
21
|
+
import { resolveSandboxIdentity } from "./sandbox.js";
|
|
22
|
+
export type SandboxRuntimeMode = "none" | "uid" | "container" | "auto";
|
|
23
|
+
export type SandboxEngine = "podman" | "docker" | "none";
|
|
24
|
+
export interface SandboxRuntimeConfig {
|
|
25
|
+
mode: SandboxRuntimeMode;
|
|
26
|
+
/** Resolved effective mode after auto detection. */
|
|
27
|
+
effectiveMode: "none" | "uid" | "container";
|
|
28
|
+
engine: SandboxEngine;
|
|
29
|
+
image: string;
|
|
30
|
+
memory: string;
|
|
31
|
+
cpus: string;
|
|
32
|
+
pidsLimit: number;
|
|
33
|
+
network: string;
|
|
34
|
+
required: boolean;
|
|
35
|
+
projectRoot: string;
|
|
36
|
+
timeoutMs: number;
|
|
37
|
+
}
|
|
38
|
+
export interface RunInSandboxRequest {
|
|
39
|
+
command: string;
|
|
40
|
+
args: string[];
|
|
41
|
+
projectRoot: string;
|
|
42
|
+
timeoutMs?: number;
|
|
43
|
+
env?: NodeJS.ProcessEnv;
|
|
44
|
+
/** Optional stdin payload (e.g. file content for container-mediated writes). */
|
|
45
|
+
stdin?: string | Buffer;
|
|
46
|
+
}
|
|
47
|
+
export interface RunInSandboxResult {
|
|
48
|
+
code: number | null;
|
|
49
|
+
stdout: string;
|
|
50
|
+
stderr: string;
|
|
51
|
+
runtime: SandboxRuntimeConfig["effectiveMode"];
|
|
52
|
+
engine: SandboxEngine;
|
|
53
|
+
/** Human-readable isolation description for logs/errors. */
|
|
54
|
+
isolationLabel: string;
|
|
55
|
+
}
|
|
56
|
+
export declare class SandboxRequiredError extends Error {
|
|
57
|
+
constructor(message: string);
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Detect available container engine (cached).
|
|
61
|
+
*/
|
|
62
|
+
export declare function detectContainerEngine(): SandboxEngine;
|
|
63
|
+
/** Test helper */
|
|
64
|
+
export declare function clearSandboxRuntimeCache(): void;
|
|
65
|
+
/**
|
|
66
|
+
* Resolve full runtime configuration for a project.
|
|
67
|
+
*/
|
|
68
|
+
export declare function resolveSandboxRuntimeConfig(projectRoot: string, timeoutMs?: number): SandboxRuntimeConfig;
|
|
69
|
+
/**
|
|
70
|
+
* Build docker/podman argv for an isolated run.
|
|
71
|
+
* Project is mounted at /workspace; command runs with -w /workspace.
|
|
72
|
+
*/
|
|
73
|
+
export declare function buildContainerArgs(cfg: SandboxRuntimeConfig, command: string, args: string[]): string[];
|
|
74
|
+
/**
|
|
75
|
+
* Run a command under the configured sandbox runtime.
|
|
76
|
+
*/
|
|
77
|
+
export declare function runInSandbox(req: RunInSandboxRequest): Promise<RunInSandboxResult>;
|
|
78
|
+
/**
|
|
79
|
+
* Diagnostic snapshot for dashboard / CLI.
|
|
80
|
+
*/
|
|
81
|
+
export declare function getSandboxRuntimeStatus(projectRoot?: string): {
|
|
82
|
+
config: SandboxRuntimeConfig;
|
|
83
|
+
isolationLabel: string;
|
|
84
|
+
identity: ReturnType<typeof resolveSandboxIdentity>;
|
|
85
|
+
};
|
|
@@ -0,0 +1,250 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Sandbox Runtime — Phase 1.1 execution isolation for agent shell commands.
|
|
3
|
+
*
|
|
4
|
+
* Modes (ATABEY_SANDBOX_RUNTIME):
|
|
5
|
+
* none — host spawn (legacy; allow-list only)
|
|
6
|
+
* uid — host spawn with uid/gid drop (see sandbox.ts)
|
|
7
|
+
* container — Docker/Podman run with network=none, resource limits, project mount
|
|
8
|
+
* auto — container if engine available, else uid if configured, else none
|
|
9
|
+
*
|
|
10
|
+
* Enterprise hardening:
|
|
11
|
+
* ATABEY_SANDBOX_REQUIRED=true → deny execution when isolation is effectively "none"
|
|
12
|
+
*
|
|
13
|
+
* Container defaults:
|
|
14
|
+
* ATABEY_SANDBOX_ENGINE=podman|docker|auto (prefer podman, then docker)
|
|
15
|
+
* ATABEY_SANDBOX_IMAGE=node:20-bookworm-slim
|
|
16
|
+
* ATABEY_SANDBOX_MEMORY=512m
|
|
17
|
+
* ATABEY_SANDBOX_CPUS=1
|
|
18
|
+
* ATABEY_SANDBOX_PIDS=256
|
|
19
|
+
* ATABEY_SANDBOX_NETWORK=none
|
|
20
|
+
*/
|
|
21
|
+
import { spawn, execFileSync } from "child_process";
|
|
22
|
+
import fs from "fs";
|
|
23
|
+
import path from "path";
|
|
24
|
+
import { applySandboxToSpawnOptions, resolveSandboxIdentity, sandboxSpawn, } from "./sandbox.js";
|
|
25
|
+
export class SandboxRequiredError extends Error {
|
|
26
|
+
constructor(message) {
|
|
27
|
+
super(message);
|
|
28
|
+
this.name = "SandboxRequiredError";
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
let cachedEngine = null;
|
|
32
|
+
function envStr(key, fallback) {
|
|
33
|
+
const v = process.env[key];
|
|
34
|
+
return v && v.trim() ? v.trim() : fallback;
|
|
35
|
+
}
|
|
36
|
+
function envBool(key, fallback = false) {
|
|
37
|
+
const v = process.env[key];
|
|
38
|
+
if (v === undefined)
|
|
39
|
+
return fallback;
|
|
40
|
+
return v === "true" || v === "1" || v === "yes";
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Detect available container engine (cached).
|
|
44
|
+
*/
|
|
45
|
+
export function detectContainerEngine() {
|
|
46
|
+
if (cachedEngine)
|
|
47
|
+
return cachedEngine;
|
|
48
|
+
const prefer = envStr("ATABEY_SANDBOX_ENGINE", "auto").toLowerCase();
|
|
49
|
+
const tryEngine = (name) => {
|
|
50
|
+
try {
|
|
51
|
+
execFileSync(name, ["--version"], {
|
|
52
|
+
encoding: "utf8",
|
|
53
|
+
timeout: 3000,
|
|
54
|
+
stdio: ["ignore", "pipe", "ignore"],
|
|
55
|
+
});
|
|
56
|
+
return true;
|
|
57
|
+
}
|
|
58
|
+
catch {
|
|
59
|
+
return false;
|
|
60
|
+
}
|
|
61
|
+
};
|
|
62
|
+
if (prefer === "podman" || prefer === "docker") {
|
|
63
|
+
cachedEngine = tryEngine(prefer) ? prefer : "none";
|
|
64
|
+
return cachedEngine;
|
|
65
|
+
}
|
|
66
|
+
if (tryEngine("podman")) {
|
|
67
|
+
cachedEngine = "podman";
|
|
68
|
+
return cachedEngine;
|
|
69
|
+
}
|
|
70
|
+
if (tryEngine("docker")) {
|
|
71
|
+
cachedEngine = "docker";
|
|
72
|
+
return cachedEngine;
|
|
73
|
+
}
|
|
74
|
+
cachedEngine = "none";
|
|
75
|
+
return cachedEngine;
|
|
76
|
+
}
|
|
77
|
+
/** Test helper */
|
|
78
|
+
export function clearSandboxRuntimeCache() {
|
|
79
|
+
cachedEngine = null;
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Resolve full runtime configuration for a project.
|
|
83
|
+
*/
|
|
84
|
+
export function resolveSandboxRuntimeConfig(projectRoot, timeoutMs) {
|
|
85
|
+
const mode = (envStr("ATABEY_SANDBOX_RUNTIME", "auto").toLowerCase() || "auto");
|
|
86
|
+
const engine = detectContainerEngine();
|
|
87
|
+
const identity = resolveSandboxIdentity();
|
|
88
|
+
const required = envBool("ATABEY_SANDBOX_REQUIRED", false);
|
|
89
|
+
let effectiveMode = "none";
|
|
90
|
+
if (mode === "none") {
|
|
91
|
+
effectiveMode = "none";
|
|
92
|
+
}
|
|
93
|
+
else if (mode === "uid") {
|
|
94
|
+
effectiveMode = identity.enabled ? "uid" : "none";
|
|
95
|
+
}
|
|
96
|
+
else if (mode === "container") {
|
|
97
|
+
effectiveMode = engine !== "none" ? "container" : "none";
|
|
98
|
+
}
|
|
99
|
+
else {
|
|
100
|
+
// auto
|
|
101
|
+
if (engine !== "none")
|
|
102
|
+
effectiveMode = "container";
|
|
103
|
+
else if (identity.enabled)
|
|
104
|
+
effectiveMode = "uid";
|
|
105
|
+
else
|
|
106
|
+
effectiveMode = "none";
|
|
107
|
+
}
|
|
108
|
+
return {
|
|
109
|
+
mode: ["none", "uid", "container", "auto"].includes(mode) ? mode : "auto",
|
|
110
|
+
effectiveMode,
|
|
111
|
+
engine,
|
|
112
|
+
image: envStr("ATABEY_SANDBOX_IMAGE", "node:20-bookworm-slim"),
|
|
113
|
+
memory: envStr("ATABEY_SANDBOX_MEMORY", "512m"),
|
|
114
|
+
cpus: envStr("ATABEY_SANDBOX_CPUS", "1"),
|
|
115
|
+
pidsLimit: parseInt(envStr("ATABEY_SANDBOX_PIDS", "256"), 10) || 256,
|
|
116
|
+
network: envStr("ATABEY_SANDBOX_NETWORK", "none"),
|
|
117
|
+
required,
|
|
118
|
+
projectRoot: path.resolve(projectRoot),
|
|
119
|
+
timeoutMs: timeoutMs ?? parseInt(process.env.MCP_COMMAND_TIMEOUT_MS || "30000", 10),
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
function isolationLabel(cfg) {
|
|
123
|
+
if (cfg.effectiveMode === "container") {
|
|
124
|
+
return `container/${cfg.engine} image=${cfg.image} network=${cfg.network} mem=${cfg.memory}`;
|
|
125
|
+
}
|
|
126
|
+
if (cfg.effectiveMode === "uid") {
|
|
127
|
+
const id = resolveSandboxIdentity();
|
|
128
|
+
return `uid=${id.uid}${id.gid !== undefined ? ` gid=${id.gid}` : ""}`;
|
|
129
|
+
}
|
|
130
|
+
return "none (host process)";
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Build docker/podman argv for an isolated run.
|
|
134
|
+
* Project is mounted at /workspace; command runs with -w /workspace.
|
|
135
|
+
*/
|
|
136
|
+
export function buildContainerArgs(cfg, command, args) {
|
|
137
|
+
const root = cfg.projectRoot;
|
|
138
|
+
// Prefer :rw so installs/builds work; network still none by default
|
|
139
|
+
const mount = `${root}:/workspace:rw`;
|
|
140
|
+
const argv = [
|
|
141
|
+
"run",
|
|
142
|
+
"--rm",
|
|
143
|
+
"--network", cfg.network,
|
|
144
|
+
"--memory", cfg.memory,
|
|
145
|
+
"--cpus", cfg.cpus,
|
|
146
|
+
"--pids-limit", String(cfg.pidsLimit),
|
|
147
|
+
"-v", mount,
|
|
148
|
+
"-w", "/workspace",
|
|
149
|
+
// Drop ambient capabilities when supported (docker/podman)
|
|
150
|
+
"--security-opt", "no-new-privileges",
|
|
151
|
+
];
|
|
152
|
+
// Optional: read-only root FS with writable tmp (stronger isolation)
|
|
153
|
+
if (envBool("ATABEY_SANDBOX_READ_ONLY_ROOT", false)) {
|
|
154
|
+
argv.push("--read-only", "--tmpfs", "/tmp:rw,noexec,nosuid,size=64m");
|
|
155
|
+
}
|
|
156
|
+
// Do not pass host secrets by default — empty env except PATH-ish via image
|
|
157
|
+
if (!envBool("ATABEY_SANDBOX_PASS_ENV", false)) {
|
|
158
|
+
argv.push("--env", "HOME=/tmp", "--env", "NPM_CONFIG_UPDATE_NOTIFIER=false");
|
|
159
|
+
}
|
|
160
|
+
argv.push(cfg.image, command, ...args);
|
|
161
|
+
return argv;
|
|
162
|
+
}
|
|
163
|
+
function collectOutput(child, stdin) {
|
|
164
|
+
return new Promise((resolve) => {
|
|
165
|
+
let stdout = "";
|
|
166
|
+
let stderr = "";
|
|
167
|
+
child.stdout?.on("data", (d) => { stdout += d.toString(); });
|
|
168
|
+
child.stderr?.on("data", (d) => { stderr += d.toString(); });
|
|
169
|
+
child.on("error", (err) => {
|
|
170
|
+
stderr += err.message;
|
|
171
|
+
resolve({ code: 1, stdout, stderr });
|
|
172
|
+
});
|
|
173
|
+
child.on("close", (code) => {
|
|
174
|
+
resolve({ code, stdout, stderr });
|
|
175
|
+
});
|
|
176
|
+
if (stdin !== undefined && child.stdin) {
|
|
177
|
+
child.stdin.end(stdin);
|
|
178
|
+
}
|
|
179
|
+
else if (child.stdin) {
|
|
180
|
+
child.stdin.end();
|
|
181
|
+
}
|
|
182
|
+
});
|
|
183
|
+
}
|
|
184
|
+
/**
|
|
185
|
+
* Run a command under the configured sandbox runtime.
|
|
186
|
+
*/
|
|
187
|
+
export async function runInSandbox(req) {
|
|
188
|
+
const cfg = resolveSandboxRuntimeConfig(req.projectRoot, req.timeoutMs);
|
|
189
|
+
const label = isolationLabel(cfg);
|
|
190
|
+
if (cfg.required && cfg.effectiveMode === "none") {
|
|
191
|
+
throw new SandboxRequiredError("[SANDBOX_REQUIRED] ATABEY_SANDBOX_REQUIRED=true but no isolation is available. " +
|
|
192
|
+
"Install Podman/Docker (ATABEY_SANDBOX_RUNTIME=container) or configure ATABEY_SANDBOX_UID/USER " +
|
|
193
|
+
"(ATABEY_SANDBOX_RUNTIME=uid), or set ATABEY_SANDBOX_REQUIRED=false for local dev.");
|
|
194
|
+
}
|
|
195
|
+
if (!fs.existsSync(cfg.projectRoot)) {
|
|
196
|
+
throw new Error(`[SANDBOX] Project root does not exist: ${cfg.projectRoot}`);
|
|
197
|
+
}
|
|
198
|
+
const stdio = [
|
|
199
|
+
req.stdin !== undefined ? "pipe" : "ignore",
|
|
200
|
+
"pipe",
|
|
201
|
+
"pipe",
|
|
202
|
+
];
|
|
203
|
+
if (cfg.effectiveMode === "container" && cfg.engine !== "none") {
|
|
204
|
+
const containerArgs = buildContainerArgs(cfg, req.command, req.args);
|
|
205
|
+
const child = spawn(cfg.engine, containerArgs, {
|
|
206
|
+
cwd: cfg.projectRoot,
|
|
207
|
+
timeout: cfg.timeoutMs,
|
|
208
|
+
shell: false,
|
|
209
|
+
stdio,
|
|
210
|
+
env: req.env ?? process.env,
|
|
211
|
+
});
|
|
212
|
+
const result = await collectOutput(child, req.stdin);
|
|
213
|
+
return {
|
|
214
|
+
...result,
|
|
215
|
+
runtime: "container",
|
|
216
|
+
engine: cfg.engine,
|
|
217
|
+
isolationLabel: label,
|
|
218
|
+
};
|
|
219
|
+
}
|
|
220
|
+
// uid or none — host spawn (uid options applied when available)
|
|
221
|
+
const spawnOpts = {
|
|
222
|
+
cwd: cfg.projectRoot,
|
|
223
|
+
timeout: cfg.timeoutMs,
|
|
224
|
+
shell: false,
|
|
225
|
+
stdio,
|
|
226
|
+
env: req.env ?? process.env,
|
|
227
|
+
};
|
|
228
|
+
const child = cfg.effectiveMode === "uid"
|
|
229
|
+
? sandboxSpawn(req.command, req.args, spawnOpts)
|
|
230
|
+
: spawn(req.command, req.args, applySandboxToSpawnOptions({ ...spawnOpts, disableSandbox: true }));
|
|
231
|
+
const result = await collectOutput(child, req.stdin);
|
|
232
|
+
return {
|
|
233
|
+
...result,
|
|
234
|
+
runtime: cfg.effectiveMode,
|
|
235
|
+
engine: "none",
|
|
236
|
+
isolationLabel: label,
|
|
237
|
+
};
|
|
238
|
+
}
|
|
239
|
+
/**
|
|
240
|
+
* Diagnostic snapshot for dashboard / CLI.
|
|
241
|
+
*/
|
|
242
|
+
export function getSandboxRuntimeStatus(projectRoot = process.cwd()) {
|
|
243
|
+
const config = resolveSandboxRuntimeConfig(projectRoot);
|
|
244
|
+
return {
|
|
245
|
+
config,
|
|
246
|
+
isolationLabel: isolationLabel(config),
|
|
247
|
+
identity: resolveSandboxIdentity(),
|
|
248
|
+
};
|
|
249
|
+
}
|
|
250
|
+
//# sourceMappingURL=sandbox-runtime.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sandbox-runtime.js","sourceRoot":"","sources":["../../../../shared/src/sandbox-runtime.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OS-level subprocess isolation via uid/gid (no Docker required).
|
|
3
|
+
*
|
|
4
|
+
* On Unix, child_process.spawn accepts `uid` and `gid`. When configured,
|
|
5
|
+
* agent-triggered shell commands run as a restricted system user so that
|
|
6
|
+
* even a hallucinated destructive command hits EACCES / Permission Denied
|
|
7
|
+
* on protected paths.
|
|
8
|
+
*
|
|
9
|
+
* Windows: uid/gid are ignored; isolation is a no-op (allow-list still applies).
|
|
10
|
+
*
|
|
11
|
+
* Configuration (any of):
|
|
12
|
+
* ATABEY_SANDBOX_UID=501
|
|
13
|
+
* ATABEY_SANDBOX_GID=20
|
|
14
|
+
* ATABEY_SANDBOX_USER=atabey-sandbox (resolved via `id -u` / `id -g` when possible)
|
|
15
|
+
* ATABEY_SANDBOX_ENABLED=true|false (default: true when uid/gid resolvable)
|
|
16
|
+
*/
|
|
17
|
+
import { SpawnOptions, ChildProcess } from "child_process";
|
|
18
|
+
export interface SandboxIdentity {
|
|
19
|
+
uid?: number;
|
|
20
|
+
gid?: number;
|
|
21
|
+
user?: string;
|
|
22
|
+
enabled: boolean;
|
|
23
|
+
/** Why sandbox is off (for diagnostics). */
|
|
24
|
+
reason?: string;
|
|
25
|
+
}
|
|
26
|
+
export interface SandboxSpawnOptions extends SpawnOptions {
|
|
27
|
+
/** Force-disable sandbox for this call. */
|
|
28
|
+
disableSandbox?: boolean;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Resolve sandbox identity from env (cached).
|
|
32
|
+
* Call `clearSandboxIdentityCache()` in tests after env changes.
|
|
33
|
+
*/
|
|
34
|
+
export declare function resolveSandboxIdentity(): SandboxIdentity;
|
|
35
|
+
export declare function clearSandboxIdentityCache(): void;
|
|
36
|
+
/**
|
|
37
|
+
* Build spawn options with uid/gid when sandbox is active.
|
|
38
|
+
*/
|
|
39
|
+
export declare function applySandboxToSpawnOptions(options?: SandboxSpawnOptions): SpawnOptions;
|
|
40
|
+
/**
|
|
41
|
+
* spawn() wrapper that applies OS sandbox identity when configured.
|
|
42
|
+
*/
|
|
43
|
+
export declare function sandboxSpawn(command: string, args: readonly string[], options?: SandboxSpawnOptions): ChildProcess;
|
|
44
|
+
/**
|
|
45
|
+
* Human-readable status for dashboard / CLI diagnostics.
|
|
46
|
+
*/
|
|
47
|
+
export declare function getSandboxStatus(): {
|
|
48
|
+
platform: string;
|
|
49
|
+
identity: SandboxIdentity;
|
|
50
|
+
processUid: number | null;
|
|
51
|
+
processGid: number | null;
|
|
52
|
+
};
|
|
53
|
+
/** Default restricted paths agents should not touch even with shell allow-list. */
|
|
54
|
+
export declare const SANDBOX_PROTECTED_HINTS: readonly ["/etc", "/usr", "/bin", "/sbin", "/System", string];
|
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OS-level subprocess isolation via uid/gid (no Docker required).
|
|
3
|
+
*
|
|
4
|
+
* On Unix, child_process.spawn accepts `uid` and `gid`. When configured,
|
|
5
|
+
* agent-triggered shell commands run as a restricted system user so that
|
|
6
|
+
* even a hallucinated destructive command hits EACCES / Permission Denied
|
|
7
|
+
* on protected paths.
|
|
8
|
+
*
|
|
9
|
+
* Windows: uid/gid are ignored; isolation is a no-op (allow-list still applies).
|
|
10
|
+
*
|
|
11
|
+
* Configuration (any of):
|
|
12
|
+
* ATABEY_SANDBOX_UID=501
|
|
13
|
+
* ATABEY_SANDBOX_GID=20
|
|
14
|
+
* ATABEY_SANDBOX_USER=atabey-sandbox (resolved via `id -u` / `id -g` when possible)
|
|
15
|
+
* ATABEY_SANDBOX_ENABLED=true|false (default: true when uid/gid resolvable)
|
|
16
|
+
*/
|
|
17
|
+
import { spawn } from "child_process";
|
|
18
|
+
import { execFileSync } from "child_process";
|
|
19
|
+
import os from "os";
|
|
20
|
+
let cachedIdentity = null;
|
|
21
|
+
function parseUint(value) {
|
|
22
|
+
if (value === undefined || value === "")
|
|
23
|
+
return undefined;
|
|
24
|
+
const n = Number.parseInt(value, 10);
|
|
25
|
+
if (!Number.isFinite(n) || n < 0)
|
|
26
|
+
return undefined;
|
|
27
|
+
return n;
|
|
28
|
+
}
|
|
29
|
+
function resolveUserIds(username) {
|
|
30
|
+
if (process.platform === "win32")
|
|
31
|
+
return {};
|
|
32
|
+
try {
|
|
33
|
+
const uidRaw = execFileSync("id", ["-u", username], {
|
|
34
|
+
encoding: "utf8",
|
|
35
|
+
timeout: 2000,
|
|
36
|
+
stdio: ["ignore", "pipe", "ignore"],
|
|
37
|
+
}).trim();
|
|
38
|
+
const gidRaw = execFileSync("id", ["-g", username], {
|
|
39
|
+
encoding: "utf8",
|
|
40
|
+
timeout: 2000,
|
|
41
|
+
stdio: ["ignore", "pipe", "ignore"],
|
|
42
|
+
}).trim();
|
|
43
|
+
return {
|
|
44
|
+
uid: parseUint(uidRaw),
|
|
45
|
+
gid: parseUint(gidRaw),
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
catch {
|
|
49
|
+
return {};
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Resolve sandbox identity from env (cached).
|
|
54
|
+
* Call `clearSandboxIdentityCache()` in tests after env changes.
|
|
55
|
+
*/
|
|
56
|
+
export function resolveSandboxIdentity() {
|
|
57
|
+
if (cachedIdentity)
|
|
58
|
+
return cachedIdentity;
|
|
59
|
+
if (process.platform === "win32") {
|
|
60
|
+
cachedIdentity = {
|
|
61
|
+
enabled: false,
|
|
62
|
+
reason: "uid/gid isolation is not available on Windows",
|
|
63
|
+
};
|
|
64
|
+
return cachedIdentity;
|
|
65
|
+
}
|
|
66
|
+
const explicitOff = process.env.ATABEY_SANDBOX_ENABLED === "false" ||
|
|
67
|
+
process.env.ATABEY_SANDBOX_ENABLED === "0";
|
|
68
|
+
if (explicitOff) {
|
|
69
|
+
cachedIdentity = { enabled: false, reason: "ATABEY_SANDBOX_ENABLED=false" };
|
|
70
|
+
return cachedIdentity;
|
|
71
|
+
}
|
|
72
|
+
let uid = parseUint(process.env.ATABEY_SANDBOX_UID);
|
|
73
|
+
let gid = parseUint(process.env.ATABEY_SANDBOX_GID);
|
|
74
|
+
const user = process.env.ATABEY_SANDBOX_USER?.trim() || undefined;
|
|
75
|
+
if (user && (uid === undefined || gid === undefined)) {
|
|
76
|
+
const resolved = resolveUserIds(user);
|
|
77
|
+
uid = uid ?? resolved.uid;
|
|
78
|
+
gid = gid ?? resolved.gid;
|
|
79
|
+
}
|
|
80
|
+
// Never drop privileges to root (0) — that would be a no-op or worse
|
|
81
|
+
if (uid === 0) {
|
|
82
|
+
cachedIdentity = {
|
|
83
|
+
enabled: false,
|
|
84
|
+
reason: "ATABEY_SANDBOX_UID=0 (root) is refused",
|
|
85
|
+
uid,
|
|
86
|
+
gid,
|
|
87
|
+
user,
|
|
88
|
+
};
|
|
89
|
+
return cachedIdentity;
|
|
90
|
+
}
|
|
91
|
+
if (uid === undefined) {
|
|
92
|
+
// Optional: if current process is already non-root and no sandbox user
|
|
93
|
+
// configured, we leave sandbox disabled rather than inventing a user.
|
|
94
|
+
cachedIdentity = {
|
|
95
|
+
enabled: false,
|
|
96
|
+
reason: "No ATABEY_SANDBOX_UID / ATABEY_SANDBOX_USER configured — shell runs as current user",
|
|
97
|
+
user,
|
|
98
|
+
};
|
|
99
|
+
return cachedIdentity;
|
|
100
|
+
}
|
|
101
|
+
// Dropping privileges only works if we are root (or have CAP_SETUID).
|
|
102
|
+
// If we are a normal user with a different target uid, spawn will fail —
|
|
103
|
+
// detect and warn via reason, still pass options (caller sees Permission error).
|
|
104
|
+
const canSetUid = typeof process.getuid === "function" && process.getuid() === 0;
|
|
105
|
+
if (!canSetUid && typeof process.getuid === "function" && process.getuid() !== uid) {
|
|
106
|
+
cachedIdentity = {
|
|
107
|
+
enabled: false,
|
|
108
|
+
uid,
|
|
109
|
+
gid,
|
|
110
|
+
user,
|
|
111
|
+
reason: `Sandbox uid=${uid} requested but process uid=${process.getuid()} is not root; ` +
|
|
112
|
+
`setuid will fail. Run MCP as root with a dedicated sandbox user, or unset sandbox env.`,
|
|
113
|
+
};
|
|
114
|
+
return cachedIdentity;
|
|
115
|
+
}
|
|
116
|
+
cachedIdentity = {
|
|
117
|
+
enabled: true,
|
|
118
|
+
uid,
|
|
119
|
+
gid,
|
|
120
|
+
user,
|
|
121
|
+
};
|
|
122
|
+
return cachedIdentity;
|
|
123
|
+
}
|
|
124
|
+
export function clearSandboxIdentityCache() {
|
|
125
|
+
cachedIdentity = null;
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Build spawn options with uid/gid when sandbox is active.
|
|
129
|
+
*/
|
|
130
|
+
export function applySandboxToSpawnOptions(options = {}) {
|
|
131
|
+
const { disableSandbox, ...rest } = options;
|
|
132
|
+
if (disableSandbox)
|
|
133
|
+
return { ...rest };
|
|
134
|
+
const identity = resolveSandboxIdentity();
|
|
135
|
+
if (!identity.enabled || identity.uid === undefined) {
|
|
136
|
+
return { ...rest };
|
|
137
|
+
}
|
|
138
|
+
return {
|
|
139
|
+
...rest,
|
|
140
|
+
uid: identity.uid,
|
|
141
|
+
...(identity.gid !== undefined ? { gid: identity.gid } : {}),
|
|
142
|
+
};
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* spawn() wrapper that applies OS sandbox identity when configured.
|
|
146
|
+
*/
|
|
147
|
+
export function sandboxSpawn(command, args, options = {}) {
|
|
148
|
+
const opts = applySandboxToSpawnOptions(options);
|
|
149
|
+
return spawn(command, args, opts);
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* Human-readable status for dashboard / CLI diagnostics.
|
|
153
|
+
*/
|
|
154
|
+
export function getSandboxStatus() {
|
|
155
|
+
return {
|
|
156
|
+
platform: process.platform,
|
|
157
|
+
identity: resolveSandboxIdentity(),
|
|
158
|
+
processUid: typeof process.getuid === "function" ? process.getuid() : null,
|
|
159
|
+
processGid: typeof process.getgid === "function" ? process.getgid() : null,
|
|
160
|
+
};
|
|
161
|
+
}
|
|
162
|
+
/** Default restricted paths agents should not touch even with shell allow-list. */
|
|
163
|
+
export const SANDBOX_PROTECTED_HINTS = [
|
|
164
|
+
"/etc",
|
|
165
|
+
"/usr",
|
|
166
|
+
"/bin",
|
|
167
|
+
"/sbin",
|
|
168
|
+
"/System",
|
|
169
|
+
pathHomeDotSsh(),
|
|
170
|
+
];
|
|
171
|
+
function pathHomeDotSsh() {
|
|
172
|
+
try {
|
|
173
|
+
return `${os.homedir()}/.ssh`;
|
|
174
|
+
}
|
|
175
|
+
catch {
|
|
176
|
+
return "~/.ssh";
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
//# sourceMappingURL=sandbox.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sandbox.js","sourceRoot":"","sources":["../../../../shared/src/sandbox.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,EAAE,KAAK,EAA8B,MAAM,eAAe,CAAC;AAClE,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EAAE,MAAM,IAAI,CAAC;AAgBpB,IAAI,cAAc,GAA2B,IAAI,CAAC;AAElD,SAAS,SAAS,CAAC,KAAyB;IACxC,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,EAAE;QAAE,OAAO,SAAS,CAAC;IAC1D,MAAM,CAAC,GAAG,MAAM,CAAC,QAAQ,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IACrC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;QAAE,OAAO,SAAS,CAAC;IACnD,OAAO,CAAC,CAAC;AACb,CAAC;AAED,SAAS,cAAc,CAAC,QAAgB;IACpC,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO;QAAE,OAAO,EAAE,CAAC;IAC5C,IAAI,CAAC;QACD,MAAM,MAAM,GAAG,YAAY,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,QAAQ,CAAC,EAAE;YAChD,QAAQ,EAAE,MAAM;YAChB,OAAO,EAAE,IAAI;YACb,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,CAAC;SACtC,CAAC,CAAC,IAAI,EAAE,CAAC;QACV,MAAM,MAAM,GAAG,YAAY,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,QAAQ,CAAC,EAAE;YAChD,QAAQ,EAAE,MAAM;YAChB,OAAO,EAAE,IAAI;YACb,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,CAAC;SACtC,CAAC,CAAC,IAAI,EAAE,CAAC;QACV,OAAO;YACH,GAAG,EAAE,SAAS,CAAC,MAAM,CAAC;YACtB,GAAG,EAAE,SAAS,CAAC,MAAM,CAAC;SACzB,CAAC;IACN,CAAC;IAAC,MAAM,CAAC;QACL,OAAO,EAAE,CAAC;IACd,CAAC;AACL,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,sBAAsB;IAClC,IAAI,cAAc;QAAE,OAAO,cAAc,CAAC;IAE1C,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;QAC/B,cAAc,GAAG;YACb,OAAO,EAAE,KAAK;YACd,MAAM,EAAE,+CAA+C;SAC1D,CAAC;QACF,OAAO,cAAc,CAAC;IAC1B,CAAC;IAED,MAAM,WAAW,GACb,OAAO,CAAC,GAAG,CAAC,sBAAsB,KAAK,OAAO;QAC9C,OAAO,CAAC,GAAG,CAAC,sBAAsB,KAAK,GAAG,CAAC;IAC/C,IAAI,WAAW,EAAE,CAAC;QACd,cAAc,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,8BAA8B,EAAE,CAAC;QAC5E,OAAO,cAAc,CAAC;IAC1B,CAAC;IAED,IAAI,GAAG,GAAG,SAAS,CAAC,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC;IACpD,IAAI,GAAG,GAAG,SAAS,CAAC,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC;IACpD,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,mBAAmB,EAAE,IAAI,EAAE,IAAI,SAAS,CAAC;IAElE,IAAI,IAAI,IAAI,CAAC,GAAG,KAAK,SAAS,IAAI,GAAG,KAAK,SAAS,CAAC,EAAE,CAAC;QACnD,MAAM,QAAQ,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC;QACtC,GAAG,GAAG,GAAG,IAAI,QAAQ,CAAC,GAAG,CAAC;QAC1B,GAAG,GAAG,GAAG,IAAI,QAAQ,CAAC,GAAG,CAAC;IAC9B,CAAC;IAED,qEAAqE;IACrE,IAAI,GAAG,KAAK,CAAC,EAAE,CAAC;QACZ,cAAc,GAAG;YACb,OAAO,EAAE,KAAK;YACd,MAAM,EAAE,wCAAwC;YAChD,GAAG;YACH,GAAG;YACH,IAAI;SACP,CAAC;QACF,OAAO,cAAc,CAAC;IAC1B,CAAC;IAED,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;QACpB,uEAAuE;QACvE,sEAAsE;QACtE,cAAc,GAAG;YACb,OAAO,EAAE,KAAK;YACd,MAAM,EACF,qFAAqF;YACzF,IAAI;SACP,CAAC;QACF,OAAO,cAAc,CAAC;IAC1B,CAAC;IAED,sEAAsE;IACtE,yEAAyE;IACzE,iFAAiF;IACjF,MAAM,SAAS,GAAG,OAAO,OAAO,CAAC,MAAM,KAAK,UAAU,IAAI,OAAO,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IACjF,IAAI,CAAC,SAAS,IAAI,OAAO,OAAO,CAAC,MAAM,KAAK,UAAU,IAAI,OAAO,CAAC,MAAM,EAAE,KAAK,GAAG,EAAE,CAAC;QACjF,cAAc,GAAG;YACb,OAAO,EAAE,KAAK;YACd,GAAG;YACH,GAAG;YACH,IAAI;YACJ,MAAM,EACF,eAAe,GAAG,8BAA8B,OAAO,CAAC,MAAM,EAAE,gBAAgB;gBAChF,wFAAwF;SAC/F,CAAC;QACF,OAAO,cAAc,CAAC;IAC1B,CAAC;IAED,cAAc,GAAG;QACb,OAAO,EAAE,IAAI;QACb,GAAG;QACH,GAAG;QACH,IAAI;KACP,CAAC;IACF,OAAO,cAAc,CAAC;AAC1B,CAAC;AAED,MAAM,UAAU,yBAAyB;IACrC,cAAc,GAAG,IAAI,CAAC;AAC1B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,0BAA0B,CAAC,UAA+B,EAAE;IACxE,MAAM,EAAE,cAAc,EAAE,GAAG,IAAI,EAAE,GAAG,OAAO,CAAC;IAC5C,IAAI,cAAc;QAAE,OAAO,EAAE,GAAG,IAAI,EAAE,CAAC;IAEvC,MAAM,QAAQ,GAAG,sBAAsB,EAAE,CAAC;IAC1C,IAAI,CAAC,QAAQ,CAAC,OAAO,IAAI,QAAQ,CAAC,GAAG,KAAK,SAAS,EAAE,CAAC;QAClD,OAAO,EAAE,GAAG,IAAI,EAAE,CAAC;IACvB,CAAC;IAED,OAAO;QACH,GAAG,IAAI;QACP,GAAG,EAAE,QAAQ,CAAC,GAAG;QACjB,GAAG,CAAC,QAAQ,CAAC,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,QAAQ,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC/D,CAAC;AACN,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,YAAY,CACxB,OAAe,EACf,IAAuB,EACvB,UAA+B,EAAE;IAEjC,MAAM,IAAI,GAAG,0BAA0B,CAAC,OAAO,CAAC,CAAC;IACjD,OAAO,KAAK,CAAC,OAAO,EAAE,IAAgB,EAAE,IAAI,CAAC,CAAC;AAClD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB;IAM5B,OAAO;QACH,QAAQ,EAAE,OAAO,CAAC,QAAQ;QAC1B,QAAQ,EAAE,sBAAsB,EAAE;QAClC,UAAU,EAAE,OAAO,OAAO,CAAC,MAAM,KAAK,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,IAAI;QAC1E,UAAU,EAAE,OAAO,OAAO,CAAC,MAAM,KAAK,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,IAAI;KAC7E,CAAC;AACN,CAAC;AAED,mFAAmF;AACnF,MAAM,CAAC,MAAM,uBAAuB,GAAG;IACnC,MAAM;IACN,MAAM;IACN,MAAM;IACN,OAAO;IACP,SAAS;IACT,cAAc,EAAE;CACV,CAAC;AAEX,SAAS,cAAc;IACnB,IAAI,CAAC;QACD,OAAO,GAAG,EAAE,CAAC,OAAO,EAAE,OAAO,CAAC;IAClC,CAAC;IAAC,MAAM,CAAC;QACL,OAAO,QAAQ,CAAC;IACpB,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* In-Memory Worker Pool — worker_threads based, no Redis/BullMQ.
|
|
3
|
+
*
|
|
4
|
+
* Heavy / isolable work runs off the main thread. Concurrency is capped
|
|
5
|
+
* (default os.cpus().length) via an internal queue so RAM/CPU stay bounded.
|
|
6
|
+
*
|
|
7
|
+
* Thread-safety note: SQLite (better-sqlite3) bindings are NOT thread-safe.
|
|
8
|
+
* Worker threads MUST NOT access AtabeyStorage or any SQLite connection.
|
|
9
|
+
* Only CPU-bound isolable work (hash, tokenize, etc.) should be dispatched
|
|
10
|
+
* to the worker pool.
|
|
11
|
+
*/
|
|
12
|
+
export interface WorkerPoolOptions {
|
|
13
|
+
/** Max concurrent worker jobs. Default: os.cpus().length (clamped 1–16). */
|
|
14
|
+
maxConcurrency?: number;
|
|
15
|
+
/** Idle workers retained in the pool. Default: min(2, maxConcurrency). */
|
|
16
|
+
minWorkers?: number;
|
|
17
|
+
/** Per-job timeout in ms. Default: 30_000. */
|
|
18
|
+
jobTimeoutMs?: number;
|
|
19
|
+
/** Optional absolute path to worker script (tests / monorepo layouts). */
|
|
20
|
+
workerScript?: string;
|
|
21
|
+
}
|
|
22
|
+
export declare class WorkerPool {
|
|
23
|
+
private readonly maxConcurrency;
|
|
24
|
+
private readonly minWorkers;
|
|
25
|
+
private readonly jobTimeoutMs;
|
|
26
|
+
private readonly workerScript;
|
|
27
|
+
private readonly workers;
|
|
28
|
+
private readonly queue;
|
|
29
|
+
private readonly inflight;
|
|
30
|
+
private jobSeq;
|
|
31
|
+
private closed;
|
|
32
|
+
constructor(options?: WorkerPoolOptions);
|
|
33
|
+
/**
|
|
34
|
+
* Run a named job type on a worker thread.
|
|
35
|
+
* Returns when the worker posts a result (or on timeout/error).
|
|
36
|
+
*/
|
|
37
|
+
run<T = unknown>(type: string, payload?: unknown): Promise<T>;
|
|
38
|
+
getStats(): {
|
|
39
|
+
maxConcurrency: number;
|
|
40
|
+
workers: number;
|
|
41
|
+
busy: number;
|
|
42
|
+
pending: number;
|
|
43
|
+
inflight: number;
|
|
44
|
+
};
|
|
45
|
+
close(): Promise<void>;
|
|
46
|
+
private failWorkerJob;
|
|
47
|
+
private spawnWorker;
|
|
48
|
+
private removeWorker;
|
|
49
|
+
private dispatch;
|
|
50
|
+
}
|
|
51
|
+
export declare function getDefaultWorkerPool(options?: WorkerPoolOptions): WorkerPool;
|
|
52
|
+
export declare function resetDefaultWorkerPool(): Promise<void>;
|