@paperclipai/server 2026.817.0 → 2026.818.0-beta.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/adapters/hermes-gateway-doc.d.ts +1 -1
- package/dist/adapters/hermes-gateway-doc.d.ts.map +1 -1
- package/dist/adapters/hermes-gateway-doc.js +1 -1
- package/dist/adapters/plugin-loader.d.ts.map +1 -1
- package/dist/adapters/plugin-loader.js +3 -2
- package/dist/adapters/plugin-loader.js.map +1 -1
- package/dist/agent-auth-jwt.d.ts.map +1 -1
- package/dist/agent-auth-jwt.js +8 -2
- package/dist/agent-auth-jwt.js.map +1 -1
- package/dist/app.d.ts +5 -1
- package/dist/app.d.ts.map +1 -1
- package/dist/app.js +202 -15
- package/dist/app.js.map +1 -1
- package/dist/built-ins/agents/summarizer/AGENTS.md +2 -2
- package/dist/built-ins/agents/summarizer/routines/refresh-stale-summaries.md +1 -0
- package/dist/db-errors.d.ts +9 -0
- package/dist/db-errors.d.ts.map +1 -1
- package/dist/db-errors.js +19 -0
- package/dist/db-errors.js.map +1 -1
- package/dist/errors.d.ts +1 -1
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js +2 -2
- package/dist/errors.js.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +162 -38
- package/dist/index.js.map +1 -1
- package/dist/lib/request-promise-memo.d.ts +6 -0
- package/dist/lib/request-promise-memo.d.ts.map +1 -0
- package/dist/lib/request-promise-memo.js +25 -0
- package/dist/lib/request-promise-memo.js.map +1 -0
- package/dist/lib/request-promise-memo.test.d.ts +2 -0
- package/dist/lib/request-promise-memo.test.d.ts.map +1 -0
- package/dist/lib/request-promise-memo.test.js +74 -0
- package/dist/lib/request-promise-memo.test.js.map +1 -0
- package/dist/middleware/auth.d.ts +13 -1
- package/dist/middleware/auth.d.ts.map +1 -1
- package/dist/middleware/auth.js +92 -41
- package/dist/middleware/auth.js.map +1 -1
- package/dist/middleware/cloud-tenant-actor.test.js +26 -1
- package/dist/middleware/cloud-tenant-actor.test.js.map +1 -1
- package/dist/middleware/error-handler.d.ts.map +1 -1
- package/dist/middleware/error-handler.js +11 -2
- package/dist/middleware/error-handler.js.map +1 -1
- package/dist/middleware/logger.d.ts.map +1 -1
- package/dist/middleware/logger.js +7 -33
- package/dist/middleware/logger.js.map +1 -1
- package/dist/middleware/private-hostname-guard.d.ts.map +1 -1
- package/dist/middleware/private-hostname-guard.js +11 -6
- package/dist/middleware/private-hostname-guard.js.map +1 -1
- package/dist/middleware/private-json-etag.d.ts +3 -0
- package/dist/middleware/private-json-etag.d.ts.map +1 -0
- package/dist/middleware/private-json-etag.js +37 -0
- package/dist/middleware/private-json-etag.js.map +1 -0
- package/dist/middleware/redact-sensitive.d.ts.map +1 -1
- package/dist/middleware/redact-sensitive.js +11 -0
- package/dist/middleware/redact-sensitive.js.map +1 -1
- package/dist/realtime/live-events-ws.d.ts +12 -0
- package/dist/realtime/live-events-ws.d.ts.map +1 -1
- package/dist/realtime/live-events-ws.js +20 -0
- package/dist/realtime/live-events-ws.js.map +1 -1
- package/dist/redaction.js +1 -1
- package/dist/redaction.js.map +1 -1
- package/dist/routes/access.d.ts +2 -0
- package/dist/routes/access.d.ts.map +1 -1
- package/dist/routes/access.js +21 -10
- package/dist/routes/access.js.map +1 -1
- package/dist/routes/agents.d.ts +42 -0
- package/dist/routes/agents.d.ts.map +1 -1
- package/dist/routes/agents.js +875 -8
- package/dist/routes/agents.js.map +1 -1
- package/dist/routes/companies.d.ts +5 -1
- package/dist/routes/companies.d.ts.map +1 -1
- package/dist/routes/companies.js +467 -30
- package/dist/routes/companies.js.map +1 -1
- package/dist/routes/environments.d.ts +12 -3
- package/dist/routes/environments.d.ts.map +1 -1
- package/dist/routes/environments.js +139 -23
- package/dist/routes/environments.js.map +1 -1
- package/dist/routes/execution-workspaces.d.ts.map +1 -1
- package/dist/routes/execution-workspaces.js +240 -70
- package/dist/routes/execution-workspaces.js.map +1 -1
- package/dist/routes/file-resources.d.ts +14 -1
- package/dist/routes/file-resources.d.ts.map +1 -1
- package/dist/routes/file-resources.js +182 -3
- package/dist/routes/file-resources.js.map +1 -1
- package/dist/routes/index.d.ts +2 -1
- package/dist/routes/index.d.ts.map +1 -1
- package/dist/routes/index.js +2 -1
- package/dist/routes/index.js.map +1 -1
- package/dist/routes/instance-settings.d.ts.map +1 -1
- package/dist/routes/instance-settings.js +20 -1
- package/dist/routes/instance-settings.js.map +1 -1
- package/dist/routes/issues.d.ts.map +1 -1
- package/dist/routes/issues.js +750 -235
- package/dist/routes/issues.js.map +1 -1
- package/dist/routes/onboarding-seed.d.ts +27 -0
- package/dist/routes/onboarding-seed.d.ts.map +1 -0
- package/dist/routes/onboarding-seed.js +56 -0
- package/dist/routes/onboarding-seed.js.map +1 -0
- package/dist/routes/openapi.d.ts.map +1 -1
- package/dist/routes/openapi.js +316 -2
- package/dist/routes/openapi.js.map +1 -1
- package/dist/routes/secrets.d.ts.map +1 -1
- package/dist/routes/secrets.js +11 -1
- package/dist/routes/secrets.js.map +1 -1
- package/dist/routes/setup-token-route.test.d.ts +2 -0
- package/dist/routes/setup-token-route.test.d.ts.map +1 -0
- package/dist/routes/setup-token-route.test.js +896 -0
- package/dist/routes/setup-token-route.test.js.map +1 -0
- package/dist/routes/tool-access.d.ts.map +1 -1
- package/dist/routes/tool-access.js +87 -52
- package/dist/routes/tool-access.js.map +1 -1
- package/dist/routes/workspace-runtime-service-authz.d.ts +11 -1
- package/dist/routes/workspace-runtime-service-authz.d.ts.map +1 -1
- package/dist/routes/workspace-runtime-service-authz.js +18 -16
- package/dist/routes/workspace-runtime-service-authz.js.map +1 -1
- package/dist/services/access.d.ts.map +1 -1
- package/dist/services/activity.d.ts +1 -1
- package/dist/services/agents.d.ts +21 -0
- package/dist/services/agents.d.ts.map +1 -1
- package/dist/services/agents.js +121 -1
- package/dist/services/agents.js.map +1 -1
- package/dist/services/attention-resolver-audience.test.d.ts +2 -0
- package/dist/services/attention-resolver-audience.test.d.ts.map +1 -0
- package/dist/services/attention-resolver-audience.test.js +81 -0
- package/dist/services/attention-resolver-audience.test.js.map +1 -0
- package/dist/services/attention.d.ts +20 -1
- package/dist/services/attention.d.ts.map +1 -1
- package/dist/services/attention.js +45 -1
- package/dist/services/attention.js.map +1 -1
- package/dist/services/authorization.d.ts +2 -2
- package/dist/services/authorization.d.ts.map +1 -1
- package/dist/services/authorization.js +89 -46
- package/dist/services/authorization.js.map +1 -1
- package/dist/services/board-auth.d.ts.map +1 -1
- package/dist/services/board-auth.js +40 -1
- package/dist/services/board-auth.js.map +1 -1
- package/dist/services/board-auth.test.d.ts +2 -0
- package/dist/services/board-auth.test.d.ts.map +1 -0
- package/dist/services/board-auth.test.js +34 -0
- package/dist/services/board-auth.test.js.map +1 -0
- package/dist/services/built-in-agents.d.ts.map +1 -1
- package/dist/services/built-in-agents.js +20 -4
- package/dist/services/built-in-agents.js.map +1 -1
- package/dist/services/bundled-plugins.d.ts +11 -1
- package/dist/services/bundled-plugins.d.ts.map +1 -1
- package/dist/services/bundled-plugins.js +46 -1
- package/dist/services/bundled-plugins.js.map +1 -1
- package/dist/services/codex-device-login-reaper.d.ts +61 -0
- package/dist/services/codex-device-login-reaper.d.ts.map +1 -0
- package/dist/services/codex-device-login-reaper.js +219 -0
- package/dist/services/codex-device-login-reaper.js.map +1 -0
- package/dist/services/codex-device-login-service.d.ts +355 -0
- package/dist/services/codex-device-login-service.d.ts.map +1 -0
- package/dist/services/codex-device-login-service.js +775 -0
- package/dist/services/codex-device-login-service.js.map +1 -0
- package/dist/services/companies.d.ts.map +1 -1
- package/dist/services/companies.js +7 -0
- package/dist/services/companies.js.map +1 -1
- package/dist/services/company-export-readme.js +1 -1
- package/dist/services/company-export-readme.js.map +1 -1
- package/dist/services/company-import-transfers.d.ts +55 -0
- package/dist/services/company-import-transfers.d.ts.map +1 -0
- package/dist/services/company-import-transfers.js +151 -0
- package/dist/services/company-import-transfers.js.map +1 -0
- package/dist/services/company-portability.d.ts.map +1 -1
- package/dist/services/company-portability.js +128 -3
- package/dist/services/company-portability.js.map +1 -1
- package/dist/services/company-transfer-runs.d.ts +136 -0
- package/dist/services/company-transfer-runs.d.ts.map +1 -0
- package/dist/services/company-transfer-runs.js +243 -0
- package/dist/services/company-transfer-runs.js.map +1 -0
- package/dist/services/cross-issue-influence-limit.d.ts +7 -1
- package/dist/services/cross-issue-influence-limit.d.ts.map +1 -1
- package/dist/services/cross-issue-influence-limit.js.map +1 -1
- package/dist/services/environment-config.d.ts +15 -0
- package/dist/services/environment-config.d.ts.map +1 -1
- package/dist/services/environment-config.js +56 -10
- package/dist/services/environment-config.js.map +1 -1
- package/dist/services/environment-execution-target.d.ts.map +1 -1
- package/dist/services/environment-execution-target.js +61 -11
- package/dist/services/environment-execution-target.js.map +1 -1
- package/dist/services/environment-run-orchestrator.d.ts +16 -1
- package/dist/services/environment-run-orchestrator.d.ts.map +1 -1
- package/dist/services/environment-run-orchestrator.js +1 -1
- package/dist/services/environment-run-orchestrator.js.map +1 -1
- package/dist/services/environment-runtime.d.ts +178 -2
- package/dist/services/environment-runtime.d.ts.map +1 -1
- package/dist/services/environment-runtime.js +1035 -96
- package/dist/services/environment-runtime.js.map +1 -1
- package/dist/services/environments.d.ts +75 -0
- package/dist/services/environments.d.ts.map +1 -1
- package/dist/services/environments.js +199 -8
- package/dist/services/environments.js.map +1 -1
- package/dist/services/execution-allowlist.d.ts +16 -4
- package/dist/services/execution-allowlist.d.ts.map +1 -1
- package/dist/services/execution-allowlist.js +35 -16
- package/dist/services/execution-allowlist.js.map +1 -1
- package/dist/services/execution-allowlist.test.js +33 -0
- package/dist/services/execution-allowlist.test.js.map +1 -1
- package/dist/services/execution-workspace-policy.d.ts +14 -1
- package/dist/services/execution-workspace-policy.d.ts.map +1 -1
- package/dist/services/execution-workspace-policy.js +29 -12
- package/dist/services/execution-workspace-policy.js.map +1 -1
- package/dist/services/execution-workspaces.d.ts +89 -0
- package/dist/services/execution-workspaces.d.ts.map +1 -1
- package/dist/services/execution-workspaces.js +997 -125
- package/dist/services/execution-workspaces.js.map +1 -1
- package/dist/services/heartbeat-run-summary.d.ts +1 -0
- package/dist/services/heartbeat-run-summary.d.ts.map +1 -1
- package/dist/services/heartbeat-run-summary.js +19 -3
- package/dist/services/heartbeat-run-summary.js.map +1 -1
- package/dist/services/heartbeat.d.ts +18 -2
- package/dist/services/heartbeat.d.ts.map +1 -1
- package/dist/services/heartbeat.js +369 -16
- package/dist/services/heartbeat.js.map +1 -1
- package/dist/services/import-write-types.d.ts +12 -0
- package/dist/services/import-write-types.d.ts.map +1 -1
- package/dist/services/index.d.ts +2 -0
- package/dist/services/index.d.ts.map +1 -1
- package/dist/services/index.js +2 -0
- package/dist/services/index.js.map +1 -1
- package/dist/services/instance-settings.d.ts +10 -1
- package/dist/services/instance-settings.d.ts.map +1 -1
- package/dist/services/instance-settings.js +16 -9
- package/dist/services/instance-settings.js.map +1 -1
- package/dist/services/issue-review-policy.d.ts +4 -0
- package/dist/services/issue-review-policy.d.ts.map +1 -1
- package/dist/services/issue-review-policy.js +18 -7
- package/dist/services/issue-review-policy.js.map +1 -1
- package/dist/services/issue-thread-interaction-resolution.d.ts +92 -0
- package/dist/services/issue-thread-interaction-resolution.d.ts.map +1 -0
- package/dist/services/issue-thread-interaction-resolution.js +198 -0
- package/dist/services/issue-thread-interaction-resolution.js.map +1 -0
- package/dist/services/issue-thread-interaction-resolution.test.d.ts +2 -0
- package/dist/services/issue-thread-interaction-resolution.test.d.ts.map +1 -0
- package/dist/services/issue-thread-interaction-resolution.test.js +152 -0
- package/dist/services/issue-thread-interaction-resolution.test.js.map +1 -0
- package/dist/services/issue-thread-interactions.d.ts +24 -4
- package/dist/services/issue-thread-interactions.d.ts.map +1 -1
- package/dist/services/issue-thread-interactions.js +360 -145
- package/dist/services/issue-thread-interactions.js.map +1 -1
- package/dist/services/issue-thread-interactions.test.js +18 -11
- package/dist/services/issue-thread-interactions.test.js.map +1 -1
- package/dist/services/issues.d.ts +3 -0
- package/dist/services/issues.d.ts.map +1 -1
- package/dist/services/issues.js +157 -33
- package/dist/services/issues.js.map +1 -1
- package/dist/services/local-service-supervisor.d.ts +2 -0
- package/dist/services/local-service-supervisor.d.ts.map +1 -1
- package/dist/services/local-service-supervisor.js +53 -3
- package/dist/services/local-service-supervisor.js.map +1 -1
- package/dist/services/managed-environments.d.ts +4 -1
- package/dist/services/managed-environments.d.ts.map +1 -1
- package/dist/services/managed-environments.js +86 -2
- package/dist/services/managed-environments.js.map +1 -1
- package/dist/services/managed-environments.test.js +164 -0
- package/dist/services/managed-environments.test.js.map +1 -1
- package/dist/services/onboarding-greeting.d.ts +7 -0
- package/dist/services/onboarding-greeting.d.ts.map +1 -0
- package/dist/services/onboarding-greeting.js +27 -0
- package/dist/services/onboarding-greeting.js.map +1 -0
- package/dist/services/onboarding-greeting.test.d.ts +2 -0
- package/dist/services/onboarding-greeting.test.d.ts.map +1 -0
- package/dist/services/onboarding-greeting.test.js +32 -0
- package/dist/services/onboarding-greeting.test.js.map +1 -0
- package/dist/services/onboarding-seed.d.ts +57 -0
- package/dist/services/onboarding-seed.d.ts.map +1 -0
- package/dist/services/onboarding-seed.js +344 -0
- package/dist/services/onboarding-seed.js.map +1 -0
- package/dist/services/plan-review-context.d.ts +9 -1
- package/dist/services/plan-review-context.d.ts.map +1 -1
- package/dist/services/plan-review-context.js +192 -0
- package/dist/services/plan-review-context.js.map +1 -1
- package/dist/services/plugin-environment-driver.d.ts +46 -0
- package/dist/services/plugin-environment-driver.d.ts.map +1 -1
- package/dist/services/plugin-environment-driver.js +50 -0
- package/dist/services/plugin-environment-driver.js.map +1 -1
- package/dist/services/plugin-host-services.d.ts +1 -0
- package/dist/services/plugin-host-services.d.ts.map +1 -1
- package/dist/services/plugin-host-services.js +51 -28
- package/dist/services/plugin-host-services.js.map +1 -1
- package/dist/services/plugin-loader.d.ts +10 -1
- package/dist/services/plugin-loader.d.ts.map +1 -1
- package/dist/services/plugin-loader.js +43 -2
- package/dist/services/plugin-loader.js.map +1 -1
- package/dist/services/plugin-worker-manager.d.ts +61 -0
- package/dist/services/plugin-worker-manager.d.ts.map +1 -1
- package/dist/services/plugin-worker-manager.js +248 -1
- package/dist/services/plugin-worker-manager.js.map +1 -1
- package/dist/services/productivity-review.d.ts.map +1 -1
- package/dist/services/productivity-review.js +5 -0
- package/dist/services/productivity-review.js.map +1 -1
- package/dist/services/recovery/service.d.ts.map +1 -1
- package/dist/services/recovery/service.js +5 -1
- package/dist/services/recovery/service.js.map +1 -1
- package/dist/services/recovery/successful-run-handoff.d.ts +16 -1
- package/dist/services/recovery/successful-run-handoff.d.ts.map +1 -1
- package/dist/services/recovery/successful-run-handoff.js +32 -0
- package/dist/services/recovery/successful-run-handoff.js.map +1 -1
- package/dist/services/recovery/successful-run-handoff.test.js +51 -1
- package/dist/services/recovery/successful-run-handoff.test.js.map +1 -1
- package/dist/services/routines.d.ts.map +1 -1
- package/dist/services/routines.js +48 -4
- package/dist/services/routines.js.map +1 -1
- package/dist/services/runtime-exposure/broker-client.d.ts +88 -0
- package/dist/services/runtime-exposure/broker-client.d.ts.map +1 -0
- package/dist/services/runtime-exposure/broker-client.js +217 -0
- package/dist/services/runtime-exposure/broker-client.js.map +1 -0
- package/dist/services/runtime-exposure/broker-client.test.d.ts +2 -0
- package/dist/services/runtime-exposure/broker-client.test.d.ts.map +1 -0
- package/dist/services/runtime-exposure/broker-client.test.js +185 -0
- package/dist/services/runtime-exposure/broker-client.test.js.map +1 -0
- package/dist/services/runtime-exposure/exposure-manager.d.ts +135 -0
- package/dist/services/runtime-exposure/exposure-manager.d.ts.map +1 -0
- package/dist/services/runtime-exposure/exposure-manager.js +247 -0
- package/dist/services/runtime-exposure/exposure-manager.js.map +1 -0
- package/dist/services/runtime-exposure/exposure-manager.test.d.ts +2 -0
- package/dist/services/runtime-exposure/exposure-manager.test.d.ts.map +1 -0
- package/dist/services/runtime-exposure/exposure-manager.test.js +384 -0
- package/dist/services/runtime-exposure/exposure-manager.test.js.map +1 -0
- package/dist/services/runtime-exposure/loopback-listener.d.ts +33 -0
- package/dist/services/runtime-exposure/loopback-listener.d.ts.map +1 -0
- package/dist/services/runtime-exposure/loopback-listener.js +146 -0
- package/dist/services/runtime-exposure/loopback-listener.js.map +1 -0
- package/dist/services/runtime-exposure/loopback-listener.test.d.ts +2 -0
- package/dist/services/runtime-exposure/loopback-listener.test.d.ts.map +1 -0
- package/dist/services/runtime-exposure/loopback-listener.test.js +116 -0
- package/dist/services/runtime-exposure/loopback-listener.test.js.map +1 -0
- package/dist/services/runtime-exposure/port-pair.d.ts +47 -0
- package/dist/services/runtime-exposure/port-pair.d.ts.map +1 -0
- package/dist/services/runtime-exposure/port-pair.js +57 -0
- package/dist/services/runtime-exposure/port-pair.js.map +1 -0
- package/dist/services/runtime-exposure/port-pair.test.d.ts +2 -0
- package/dist/services/runtime-exposure/port-pair.test.d.ts.map +1 -0
- package/dist/services/runtime-exposure/port-pair.test.js +92 -0
- package/dist/services/runtime-exposure/port-pair.test.js.map +1 -0
- package/dist/services/runtime-exposure/port-reservation.d.ts +211 -0
- package/dist/services/runtime-exposure/port-reservation.d.ts.map +1 -0
- package/dist/services/runtime-exposure/port-reservation.js +380 -0
- package/dist/services/runtime-exposure/port-reservation.js.map +1 -0
- package/dist/services/runtime-exposure/port-reservation.test.d.ts +2 -0
- package/dist/services/runtime-exposure/port-reservation.test.d.ts.map +1 -0
- package/dist/services/runtime-exposure/port-reservation.test.js +456 -0
- package/dist/services/runtime-exposure/port-reservation.test.js.map +1 -0
- package/dist/services/runtime-exposure/tailscale-hostname.d.ts +11 -0
- package/dist/services/runtime-exposure/tailscale-hostname.d.ts.map +1 -0
- package/dist/services/runtime-exposure/tailscale-hostname.js +36 -0
- package/dist/services/runtime-exposure/tailscale-hostname.js.map +1 -0
- package/dist/services/runtime-exposure/tailscale-hostname.test.d.ts +2 -0
- package/dist/services/runtime-exposure/tailscale-hostname.test.d.ts.map +1 -0
- package/dist/services/runtime-exposure/tailscale-hostname.test.js +14 -0
- package/dist/services/runtime-exposure/tailscale-hostname.test.js.map +1 -0
- package/dist/services/sandbox-orphan-cleanup-spool.d.ts +64 -0
- package/dist/services/sandbox-orphan-cleanup-spool.d.ts.map +1 -0
- package/dist/services/sandbox-orphan-cleanup-spool.js +134 -0
- package/dist/services/sandbox-orphan-cleanup-spool.js.map +1 -0
- package/dist/services/sandbox-provider-runtime.d.ts +15 -0
- package/dist/services/sandbox-provider-runtime.d.ts.map +1 -1
- package/dist/services/sandbox-provider-runtime.js +1 -0
- package/dist/services/sandbox-provider-runtime.js.map +1 -1
- package/dist/services/secrets.d.ts +103 -0
- package/dist/services/secrets.d.ts.map +1 -1
- package/dist/services/secrets.js +432 -10
- package/dist/services/secrets.js.map +1 -1
- package/dist/services/setup-token-session.d.ts +630 -0
- package/dist/services/setup-token-session.d.ts.map +1 -0
- package/dist/services/setup-token-session.js +1005 -0
- package/dist/services/setup-token-session.js.map +1 -0
- package/dist/services/setup-token-session.test.d.ts +2 -0
- package/dist/services/setup-token-session.test.d.ts.map +1 -0
- package/dist/services/setup-token-session.test.js +1143 -0
- package/dist/services/setup-token-session.test.js.map +1 -0
- package/dist/services/setup-token-transport-binding.d.ts +202 -0
- package/dist/services/setup-token-transport-binding.d.ts.map +1 -0
- package/dist/services/setup-token-transport-binding.js +386 -0
- package/dist/services/setup-token-transport-binding.js.map +1 -0
- package/dist/services/setup-token-transport-binding.test.d.ts +2 -0
- package/dist/services/setup-token-transport-binding.test.d.ts.map +1 -0
- package/dist/services/setup-token-transport-binding.test.js +761 -0
- package/dist/services/setup-token-transport-binding.test.js.map +1 -0
- package/dist/services/summary-slots.d.ts.map +1 -1
- package/dist/services/summary-slots.js +40 -6
- package/dist/services/summary-slots.js.map +1 -1
- package/dist/services/task-watchdogs.js +2 -2
- package/dist/services/task-watchdogs.js.map +1 -1
- package/dist/services/tool-access-policy.d.ts +1 -1
- package/dist/services/tool-access.d.ts.map +1 -1
- package/dist/services/tool-access.js +29 -11
- package/dist/services/tool-access.js.map +1 -1
- package/dist/services/tool-gateway.d.ts +1 -1
- package/dist/services/tool-gateway.d.ts.map +1 -1
- package/dist/services/tool-gateway.js +56 -5
- package/dist/services/tool-gateway.js.map +1 -1
- package/dist/services/workspace-file-resources.d.ts +10 -1
- package/dist/services/workspace-file-resources.d.ts.map +1 -1
- package/dist/services/workspace-file-resources.js +258 -6
- package/dist/services/workspace-file-resources.js.map +1 -1
- package/dist/services/workspace-git-operation-scheduler.d.ts +135 -0
- package/dist/services/workspace-git-operation-scheduler.d.ts.map +1 -0
- package/dist/services/workspace-git-operation-scheduler.js +655 -0
- package/dist/services/workspace-git-operation-scheduler.js.map +1 -0
- package/dist/services/workspace-git-operation-scheduler.test.d.ts +2 -0
- package/dist/services/workspace-git-operation-scheduler.test.d.ts.map +1 -0
- package/dist/services/workspace-git-operation-scheduler.test.js +367 -0
- package/dist/services/workspace-git-operation-scheduler.test.js.map +1 -0
- package/dist/services/workspace-operations.d.ts +60 -0
- package/dist/services/workspace-operations.d.ts.map +1 -1
- package/dist/services/workspace-operations.js +384 -19
- package/dist/services/workspace-operations.js.map +1 -1
- package/dist/services/workspace-runtime-exposure-backfill.test.d.ts +2 -0
- package/dist/services/workspace-runtime-exposure-backfill.test.d.ts.map +1 -0
- package/dist/services/workspace-runtime-exposure-backfill.test.js +149 -0
- package/dist/services/workspace-runtime-exposure-backfill.test.js.map +1 -0
- package/dist/services/workspace-runtime-exposure.test.d.ts +2 -0
- package/dist/services/workspace-runtime-exposure.test.d.ts.map +1 -0
- package/dist/services/workspace-runtime-exposure.test.js +517 -0
- package/dist/services/workspace-runtime-exposure.test.js.map +1 -0
- package/dist/services/workspace-runtime-leases.d.ts +90 -0
- package/dist/services/workspace-runtime-leases.d.ts.map +1 -0
- package/dist/services/workspace-runtime-leases.js +252 -0
- package/dist/services/workspace-runtime-leases.js.map +1 -0
- package/dist/services/workspace-runtime-read-model.d.ts +12 -0
- package/dist/services/workspace-runtime-read-model.d.ts.map +1 -1
- package/dist/services/workspace-runtime-read-model.test.js +3 -0
- package/dist/services/workspace-runtime-read-model.test.js.map +1 -1
- package/dist/services/workspace-runtime-ready-comment.test.js +1 -0
- package/dist/services/workspace-runtime-ready-comment.test.js.map +1 -1
- package/dist/services/workspace-runtime.d.ts +160 -2
- package/dist/services/workspace-runtime.d.ts.map +1 -1
- package/dist/services/workspace-runtime.js +1693 -141
- package/dist/services/workspace-runtime.js.map +1 -1
- package/dist/shutdown.d.ts +24 -0
- package/dist/shutdown.d.ts.map +1 -1
- package/dist/shutdown.js +37 -0
- package/dist/shutdown.js.map +1 -1
- package/dist/shutdown.test.js +113 -1
- package/dist/shutdown.test.js.map +1 -1
- package/dist/startup-banner.js +1 -1
- package/dist/startup-banner.js.map +1 -1
- package/dist/url-utils.d.ts +26 -0
- package/dist/url-utils.d.ts.map +1 -0
- package/dist/url-utils.js +59 -0
- package/dist/url-utils.js.map +1 -0
- package/dist/url-utils.test.d.ts +2 -0
- package/dist/url-utils.test.d.ts.map +1 -0
- package/dist/url-utils.test.js +55 -0
- package/dist/url-utils.test.js.map +1 -0
- package/dist/worktree-config.d.ts.map +1 -1
- package/dist/worktree-config.js +3 -17
- package/dist/worktree-config.js.map +1 -1
- package/package.json +20 -20
- package/skills/paperclip/SKILL.md +16 -11
- package/skills/paperclip/references/api-reference.md +8 -5
- package/skills/paperclip-board/SKILL.md +1 -1
- package/ui-dist/assets/{abnfDiagram-VRR7QNED-wvSnvD6-.js → abnfDiagram-N423BO3Z-BvgoV-u5.js} +1 -1
- package/ui-dist/assets/{arc-Bx0V1JsN.js → arc-BInnUBUU.js} +1 -1
- package/ui-dist/assets/architectureDiagram-T3A2C74G-Dg4MziOm.js +36 -0
- package/ui-dist/assets/{blockDiagram-677ZJIJ3-BROcLaUk.js → blockDiagram-VBNYF7ZC-D9kzAkLN.js} +1 -1
- package/ui-dist/assets/{c4Diagram-LMCZKHZV-D-V3kgju.js → c4Diagram-5PPSVZJV-BwzsgV_0.js} +1 -1
- package/ui-dist/assets/channel-qoSYbCn0.js +1 -0
- package/ui-dist/assets/{chunk-32BRIVSS-qillH3H6.js → chunk-2GRJ4B5K-D2EQ9vrl.js} +1 -1
- package/ui-dist/assets/{chunk-2Q5K7J3B-D19cVnii.js → chunk-2Q5K7J3B-DOA_8fSd.js} +1 -1
- package/ui-dist/assets/{chunk-EX3LRPZG-CLUswrZg.js → chunk-5RXB4S5H-CT5ukRiT.js} +1 -1
- package/ui-dist/assets/{chunk-5VM5RSS4-Cwlp02Lx.js → chunk-5VM5RSS4-D2gOlkyB.js} +1 -1
- package/ui-dist/assets/{chunk-MOJQB5TN-yKciyq6E.js → chunk-6Q2QTUOP-DUb6aG8c.js} +1 -1
- package/ui-dist/assets/{chunk-V7JOEXUC-DjJ75g0_.js → chunk-GF5L2VYU-BPabG3Cx.js} +1 -1
- package/ui-dist/assets/{chunk-JWPE2WC7-BjepyzEb.js → chunk-JWPE2WC7-scNfhlZz.js} +1 -1
- package/ui-dist/assets/{chunk-VR4S4FIN-CiEmy8-R.js → chunk-KBJHAD2P-BcRAzRpq.js} +1 -1
- package/ui-dist/assets/{chunk-RYQCIY6F-ed7mQM9j.js → chunk-RYQCIY6F-BiZ0-EGh.js} +1 -1
- package/ui-dist/assets/{chunk-XXDRQBXY-BiI83zoO.js → chunk-XXDRQBXY-lJULxFIE.js} +1 -1
- package/ui-dist/assets/classDiagram-JCYQIIEL-B24u1REs.js +1 -0
- package/ui-dist/assets/classDiagram-v2-OCEON4UE-B24u1REs.js +1 -0
- package/ui-dist/assets/{cose-bilkent-JH36ORCC-DIdQf5ta.js → cose-bilkent-JH36ORCC-Do8pe8JB.js} +1 -1
- package/ui-dist/assets/{cynefin-VYW2F7L2-B2m9xxh8.js → cynefin-VYW2F7L2-B34jJY1x.js} +1 -1
- package/ui-dist/assets/{cynefinDiagram-TSTJHNR4-CGVdB0kX.js → cynefinDiagram-MW4NZA55-DQ8QK8JK.js} +1 -1
- package/ui-dist/assets/cytoscape.esm-DShqj__B.js +321 -0
- package/ui-dist/assets/{dagre-VKFMJZFB-CskKiZwJ.js → dagre-VZM6K2ZE-B7lSKgxH.js} +1 -1
- package/ui-dist/assets/{diagram-OA4YK3LP-D2cn5eIN.js → diagram-7IWD3JNH-B3hLAFGE.js} +1 -1
- package/ui-dist/assets/{diagram-FQU43EPY-oa5Zu0XG.js → diagram-B4RE2ZJO-CH9Ro9e0.js} +1 -1
- package/ui-dist/assets/{diagram-NH7WQ7WH-fymti5Js.js → diagram-LBJQPF4R-DdPVMii7.js} +1 -1
- package/ui-dist/assets/{diagram-G47NLZAW-BWF2ZCsw.js → diagram-Q27KOJAE-f5VXswjc.js} +1 -1
- package/ui-dist/assets/diagram-UB23O5K3-DGqxixsR.js +41 -0
- package/ui-dist/assets/{ebnfDiagram-CCIWWBDH-CJ1d3D5q.js → ebnfDiagram-BXEA7PRR-C-1klg_w.js} +1 -1
- package/ui-dist/assets/{erDiagram-Q63AITRT-BJCPa7kK.js → erDiagram-JOGREHBK-Dt4qK4gv.js} +1 -1
- package/ui-dist/assets/{flowDiagram-23GEKE2U-BWjWuz6r.js → flowDiagram-UKHOOZJN-9ZlrTuET.js} +5 -5
- package/ui-dist/assets/{ganttDiagram-NO4QXBWP-Dv1KKjoM.js → ganttDiagram-PKOTCBZU-CE3lyvFq.js} +1 -1
- package/ui-dist/assets/{gitGraphDiagram-IHSO6WYX-9X7vgL0A.js → gitGraphDiagram-DS77QQ5N-HH2fSgad.js} +1 -1
- package/ui-dist/assets/{index-CpaK48ok.js → index-B61ORkIb.js} +1 -1
- package/ui-dist/assets/index-BHiUiToL.css +1 -0
- package/ui-dist/assets/{index-D2YCrA-D.js → index-BY5ITKmG.js} +1 -1
- package/ui-dist/assets/{index-9JMDmXc5.js → index-BbAhzCq8.js} +1 -1
- package/ui-dist/assets/{index-C5qHatpp.js → index-Bc9g6q63.js} +1 -1
- package/ui-dist/assets/{index-DuI6e5mP.js → index-Bf7tyGxE.js} +1 -1
- package/ui-dist/assets/{index-BahRsj0s.js → index-BvFx-4KW.js} +1 -1
- package/ui-dist/assets/{index-DKlsEDV7.js → index-C1mpWCcn.js} +1 -1
- package/ui-dist/assets/{index-DIXaXZrW.js → index-CHXG4GPL.js} +1 -1
- package/ui-dist/assets/{index-DcfO6NoY.js → index-CLu3Tfpv.js} +1 -1
- package/ui-dist/assets/{index-Cfz6P0Qq.js → index-CQhaM6qd.js} +1 -1
- package/ui-dist/assets/{index-D9d3sl6K.js → index-CVTL3aAL.js} +1 -1
- package/ui-dist/assets/{index-BexA3NAl.js → index-CcRTJ93J.js} +1 -1
- package/ui-dist/assets/{index-CnBrDwGT.js → index-Cm6iEYPt.js} +247 -223
- package/ui-dist/assets/{index-ByGcu-MB.js → index-DQIrrn2L.js} +1 -1
- package/ui-dist/assets/{index-DKEzHO7c.js → index-DU4U1fuv.js} +1 -1
- package/ui-dist/assets/{index-pqJO8FsV.js → index-DV2FOgyD.js} +1 -1
- package/ui-dist/assets/{index-tDuieU3u.js → index-DceuCrr8.js} +1 -1
- package/ui-dist/assets/{index-CjN2lm_w.js → index-DlVBBF8o.js} +1 -1
- package/ui-dist/assets/{index-0yJtUsFh.js → index-DsdVneqe.js} +1 -1
- package/ui-dist/assets/{index-C2a4_IKU.js → index-DvFUXI-Q.js} +1 -1
- package/ui-dist/assets/{index-BTMiDMYv.js → index-FHzrJ7iQ.js} +1 -1
- package/ui-dist/assets/{index-cUQXJtLK.js → index-diFs0CNC.js} +1 -1
- package/ui-dist/assets/{index-C96LHV1A.js → index-hkanj4t6.js} +1 -1
- package/ui-dist/assets/{index-rDI1Q4r9.js → index-yRJnh4vx.js} +1 -1
- package/ui-dist/assets/{infoDiagram-FWYZ7A6U-CHIhutSb.js → infoDiagram-6WML65LV-2jai2fw-.js} +1 -1
- package/ui-dist/assets/{ishikawaDiagram-FXEZZL3T-ChaD7-5_.js → ishikawaDiagram-WSZJBQD7-CUmGhmEb.js} +1 -1
- package/ui-dist/assets/{journeyDiagram-5HDEW3XC-M5T2sMgn.js → journeyDiagram-NVQOT4AX-CGQuPDO1.js} +1 -1
- package/ui-dist/assets/{kanban-definition-HUTT4EX6-B8H6R_Wc.js → kanban-definition-27J2QSJJ-zgEPcbHl.js} +1 -1
- package/ui-dist/assets/{linear-cpPKlVCq.js → linear-BVf5VtLS.js} +1 -1
- package/ui-dist/assets/mermaid.core-D2TFkGfI.js +308 -0
- package/ui-dist/assets/{mindmap-definition-LN4V7U3C-Bf6POzvm.js → mindmap-definition-FAOFIHXS-xoAQ0Lb_.js} +1 -1
- package/ui-dist/assets/{pegDiagram-2B236MQR-BJbGktAV.js → pegDiagram-VL7TDLO6-CBR1PWLr.js} +1 -1
- package/ui-dist/assets/{pieDiagram-ENE6RG2P-BmSN9Bio.js → pieDiagram-7S7Q4E2Y-BMPnzK_e.js} +1 -1
- package/ui-dist/assets/{quadrantDiagram-ABIIQ3AL-JUpqQCx_.js → quadrantDiagram-CIZ2JOQS-CPtVUPkR.js} +1 -1
- package/ui-dist/assets/{railroadDiagram-RFXS5EU6-B8k8T4-2.js → railroadDiagram-AXF67PYL-DC0lsZV1.js} +1 -1
- package/ui-dist/assets/{requirementDiagram-TGXJPOKE-b32heq7Q.js → requirementDiagram-LRYGKXZP-BF6k05SB.js} +1 -1
- package/ui-dist/assets/{sankeyDiagram-HTMAVEWB-DC3s-xgf.js → sankeyDiagram-W5VNT64P-CRN0ibiP.js} +1 -1
- package/ui-dist/assets/{sequenceDiagram-DBY2YBRQ-BsCFyv_E.js → sequenceDiagram-SI44F4Z6-CQtTiPWm.js} +1 -1
- package/ui-dist/assets/{sizeCapture-X5ZJPWSS-S7xeCud3.js → sizeCapture-X5ZJPWSS-BdjuGZd1.js} +1 -1
- package/ui-dist/assets/{stateDiagram-2N3HPSRC-58O3ofoS.js → stateDiagram-OKZ733FA-B99onxyh.js} +1 -1
- package/ui-dist/assets/stateDiagram-v2-UEYNNEHI-bzFlYBZ1.js +1 -0
- package/ui-dist/assets/{swimlanes-5IMT3BWC-DFCVG0iF.js → swimlanes-SLNWSIFB-BIByPbrL.js} +2 -2
- package/ui-dist/assets/swimlanesDiagram-ULZ7WXOC-DgdkBnuK.js +8 -0
- package/ui-dist/assets/{timeline-definition-FHXFAJF6-C0c0SkQu.js → timeline-definition-Z64GVDOM-I1NgOcn9.js} +1 -1
- package/ui-dist/assets/{vennDiagram-L72KCM5P-B1cEx8GQ.js → vennDiagram-T6HMQDX7-D6t2Njcl.js} +1 -1
- package/ui-dist/assets/{wardleyDiagram-EHGQE667-BQhDkOx9.js → wardleyDiagram-T6FBY63Y-BiYKm9gh.js} +1 -1
- package/ui-dist/assets/{xychartDiagram-FW5EYKEG-YSQp1N0i.js → xychartDiagram-ELKLHX3M-BhwXKWIa.js} +4 -4
- package/ui-dist/index.html +3 -3
- package/ui-dist/sw.js +8 -3
- package/ui-dist/assets/architectureDiagram-ZJ3FMSHR-BcJt8Ia1.js +0 -36
- package/ui-dist/assets/channel-ZRpjyNiZ.js +0 -1
- package/ui-dist/assets/classDiagram-OUVF2IWQ-CCzzzCgk.js +0 -1
- package/ui-dist/assets/classDiagram-v2-EOCWNBFH-CCzzzCgk.js +0 -1
- package/ui-dist/assets/cytoscape.esm-D8joxN9f.js +0 -321
- package/ui-dist/assets/diagram-WEI45ONY-M3WOC2tK.js +0 -41
- package/ui-dist/assets/index-BqfqfoQX.css +0 -1
- package/ui-dist/assets/mermaid.core-MCazc_od.js +0 -308
- package/ui-dist/assets/stateDiagram-v2-6OUMAXLB-_VY5dpDG.js +0 -1
- package/ui-dist/assets/swimlanesDiagram-G3AALYLV-BJhUjfns.js +0 -8
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
import type { Db } from "@paperclipai/db";
|
|
2
|
+
export type CompanyTransferDirection = "export" | "import";
|
|
3
|
+
export type CompanyTransferRunStatus = "pending" | "running" | "applying" | "completed" | "failed" | "cancelled";
|
|
4
|
+
/**
|
|
5
|
+
* Minimal structural view of a transfer manifest's part index: the ledger only
|
|
6
|
+
* ever needs part names and counts, so it stays decoupled from any particular
|
|
7
|
+
* container format. Manifests without this shape (e.g. the chunked zip-upload
|
|
8
|
+
* manifest, which carries its own part list) pass explicit counts to
|
|
9
|
+
* `recordManifest` and track parts by their own names.
|
|
10
|
+
*/
|
|
11
|
+
export interface CompanyTransferPartsIndex {
|
|
12
|
+
chunks: Array<{
|
|
13
|
+
name: string;
|
|
14
|
+
}>;
|
|
15
|
+
blobs: Array<{
|
|
16
|
+
name: string;
|
|
17
|
+
}>;
|
|
18
|
+
}
|
|
19
|
+
export interface CompanyTransferRunRow {
|
|
20
|
+
id: string;
|
|
21
|
+
companyId: string | null;
|
|
22
|
+
direction: CompanyTransferDirection;
|
|
23
|
+
status: CompanyTransferRunStatus;
|
|
24
|
+
actorKey: string;
|
|
25
|
+
containerRef: unknown;
|
|
26
|
+
idempotencyKey: string;
|
|
27
|
+
manifestSha256: string | null;
|
|
28
|
+
manifest: unknown;
|
|
29
|
+
chunkCount: number;
|
|
30
|
+
blobCount: number;
|
|
31
|
+
completedParts: string[];
|
|
32
|
+
error: string | null;
|
|
33
|
+
startedAt: Date | null;
|
|
34
|
+
finishedAt: Date | null;
|
|
35
|
+
createdAt: Date;
|
|
36
|
+
updatedAt: Date;
|
|
37
|
+
}
|
|
38
|
+
export interface ResumeOrCreateTransferRunInput {
|
|
39
|
+
direction: CompanyTransferDirection;
|
|
40
|
+
actorKey: string;
|
|
41
|
+
idempotencyKey: string;
|
|
42
|
+
/** Credential-free container location descriptor. Never put secrets here. */
|
|
43
|
+
containerRef: unknown;
|
|
44
|
+
companyId?: string | null;
|
|
45
|
+
}
|
|
46
|
+
export interface ResumeOrCreateTransferRunResult {
|
|
47
|
+
run: CompanyTransferRunRow;
|
|
48
|
+
/** True when an existing run for the same content was picked up. */
|
|
49
|
+
resumed: boolean;
|
|
50
|
+
/** True when that existing run already finished — the caller can short-circuit. */
|
|
51
|
+
alreadyCompleted: boolean;
|
|
52
|
+
}
|
|
53
|
+
declare function getRun(db: Db, runId: string): Promise<CompanyTransferRunRow | null>;
|
|
54
|
+
export declare const companyTransferRunService: {
|
|
55
|
+
getRun: typeof getRun;
|
|
56
|
+
getRunForActor(db: Db, runId: string, actorKey: string): Promise<CompanyTransferRunRow | null>;
|
|
57
|
+
/**
|
|
58
|
+
* Find the actor's run for this exact content (same idempotency key and
|
|
59
|
+
* direction) or create a fresh one. A completed prior run is returned with
|
|
60
|
+
* `alreadyCompleted` so the caller can skip the apply outright; a pending,
|
|
61
|
+
* running, failed, or mid-apply prior run is resumed with its part progress
|
|
62
|
+
* intact (an "applying" run resumes so a concurrent re-declaration never
|
|
63
|
+
* spawns a duplicate, but `start` leaves it alone until the apply settles).
|
|
64
|
+
*/
|
|
65
|
+
resumeOrCreate(db: Db, input: ResumeOrCreateTransferRunInput): Promise<ResumeOrCreateTransferRunResult>;
|
|
66
|
+
/**
|
|
67
|
+
* Persist the parsed manifest so resume can re-verify parts without
|
|
68
|
+
* refetching it. Counts default to the manifest's chunk/blob index when it
|
|
69
|
+
* has one; manifests with a different part layout pass them explicitly.
|
|
70
|
+
*/
|
|
71
|
+
recordManifest(db: Db, runId: string, manifest: unknown, manifestSha256: string, counts?: {
|
|
72
|
+
chunkCount: number;
|
|
73
|
+
blobCount: number;
|
|
74
|
+
}): Promise<void>;
|
|
75
|
+
/**
|
|
76
|
+
* Atomically claim a run for apply. The apply itself is not idempotent, so
|
|
77
|
+
* of any overlapping apply attempts exactly one caller gets `true` here —
|
|
78
|
+
* a single guarded UPDATE moves the run to "applying" only while it is
|
|
79
|
+
* still open (pending/running/failed). The winner settles the claim with
|
|
80
|
+
* `complete` on success or `releaseApplyClaim`/`fail` on error (which makes
|
|
81
|
+
* the run retryable again); every concurrent loser gets `false` and must
|
|
82
|
+
* not run the apply.
|
|
83
|
+
*/
|
|
84
|
+
claimApply(db: Db, runId: string): Promise<boolean>;
|
|
85
|
+
start(db: Db, runId: string): Promise<void>;
|
|
86
|
+
attachCompany(db: Db, runId: string, companyId: string): Promise<void>;
|
|
87
|
+
/**
|
|
88
|
+
* Record one finished container part. Appends atomically in SQL and is
|
|
89
|
+
* idempotent: re-completing an already recorded part leaves the ledger
|
|
90
|
+
* unchanged, so a retried part never double-counts. Only open runs
|
|
91
|
+
* (pending/running) accept parts; when the run has meanwhile gone terminal
|
|
92
|
+
* (e.g. the abandoned-spool sweep cancelled it) or is mid-apply, nothing is
|
|
93
|
+
* recorded and `false` comes back so the caller can discard the part.
|
|
94
|
+
*/
|
|
95
|
+
completePart(db: Db, runId: string, partName: string): Promise<boolean>;
|
|
96
|
+
/** Container part names the run still has to process, in manifest order. */
|
|
97
|
+
remainingParts(run: CompanyTransferRunRow, manifest: CompanyTransferPartsIndex): string[];
|
|
98
|
+
complete(db: Db, runId: string): Promise<void>;
|
|
99
|
+
/**
|
|
100
|
+
* Atomically claim an abandoned open run: cancel it only while it is still
|
|
101
|
+
* open (pending/running) AND saw no activity since `idleSince` — one
|
|
102
|
+
* guarded UPDATE, so any concurrent part upload or resume that bumped
|
|
103
|
+
* `updatedAt` makes the guard miss and `false` comes back. Callers must
|
|
104
|
+
* only touch the run's spooled data after a `true` claim.
|
|
105
|
+
*
|
|
106
|
+
* The terminal state is "cancelled", not "failed", precisely because failed
|
|
107
|
+
* runs stay claimable: a failed sweep target could be claimed by an apply
|
|
108
|
+
* and assembled while its spool is being deleted underneath it. A cancelled
|
|
109
|
+
* run is unclaimable the instant this UPDATE commits — before any
|
|
110
|
+
* filesystem deletion — and `resumeOrCreate` ignores it, so redeclaring the
|
|
111
|
+
* same content afterwards starts a fresh run.
|
|
112
|
+
*/
|
|
113
|
+
cancelIfIdle(db: Db, runId: string, idleSince: Date, error: string): Promise<boolean>;
|
|
114
|
+
/**
|
|
115
|
+
* Release a held apply claim into "failed". Guarded on "applying", unlike
|
|
116
|
+
* `fail`: catch-all error paths around an apply cannot know whether the run
|
|
117
|
+
* already settled (a cleanup error thrown after `complete` reaches the same
|
|
118
|
+
* catch as a real apply failure), and an unguarded fail there would flip a
|
|
119
|
+
* completed run back to claimable and invite a duplicate import. When the
|
|
120
|
+
* run already settled this is a no-op and returns false.
|
|
121
|
+
*/
|
|
122
|
+
releaseApplyClaim(db: Db, runId: string, error: string): Promise<boolean>;
|
|
123
|
+
/**
|
|
124
|
+
* Fail every run stranded in "applying" by a dead process. Apply jobs run
|
|
125
|
+
* in-memory in this single server process, so at boot any run still
|
|
126
|
+
* "applying" belongs to an apply that died without settling its claim and
|
|
127
|
+
* would otherwise 409 every retry forever. Failing it makes it claimable
|
|
128
|
+
* again with its spooled parts intact. Startup only — running this while
|
|
129
|
+
* applies may be live (e.g. from a periodic sweep) would kill them.
|
|
130
|
+
*/
|
|
131
|
+
recoverStrandedApplyingRuns(db: Db): Promise<string[]>;
|
|
132
|
+
fail(db: Db, runId: string, error: string): Promise<void>;
|
|
133
|
+
cancel(db: Db, runId: string): Promise<void>;
|
|
134
|
+
};
|
|
135
|
+
export {};
|
|
136
|
+
//# sourceMappingURL=company-transfer-runs.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"company-transfer-runs.d.ts","sourceRoot":"","sources":["../../src/services/company-transfer-runs.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,243 @@
|
|
|
1
|
+
import { and, desc, eq, inArray, lt, sql } from "drizzle-orm";
|
|
2
|
+
import { companyTransferRuns } from "@paperclipai/db";
|
|
3
|
+
function asPartsIndex(manifest) {
|
|
4
|
+
if (typeof manifest !== "object" || manifest === null)
|
|
5
|
+
return null;
|
|
6
|
+
const { chunks, blobs } = manifest;
|
|
7
|
+
const named = (value) => Array.isArray(value) &&
|
|
8
|
+
value.every((entry) => typeof entry === "object" &&
|
|
9
|
+
entry !== null &&
|
|
10
|
+
typeof entry.name === "string");
|
|
11
|
+
if (!named(chunks) || !named(blobs))
|
|
12
|
+
return null;
|
|
13
|
+
return { chunks, blobs };
|
|
14
|
+
}
|
|
15
|
+
const RESUMABLE_STATUSES = ["pending", "running", "failed"];
|
|
16
|
+
/** Statuses under which container parts may still be recorded as completed. */
|
|
17
|
+
const PART_UPLOAD_STATUSES = ["pending", "running"];
|
|
18
|
+
function rowFromRecord(record) {
|
|
19
|
+
return {
|
|
20
|
+
...record,
|
|
21
|
+
direction: record.direction,
|
|
22
|
+
status: record.status,
|
|
23
|
+
manifest: record.manifest ?? null,
|
|
24
|
+
completedParts: Array.isArray(record.completedParts) ? record.completedParts : [],
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
async function getRun(db, runId) {
|
|
28
|
+
const [record] = await db
|
|
29
|
+
.select()
|
|
30
|
+
.from(companyTransferRuns)
|
|
31
|
+
.where(eq(companyTransferRuns.id, runId))
|
|
32
|
+
.limit(1);
|
|
33
|
+
return record ? rowFromRecord(record) : null;
|
|
34
|
+
}
|
|
35
|
+
export const companyTransferRunService = {
|
|
36
|
+
getRun,
|
|
37
|
+
async getRunForActor(db, runId, actorKey) {
|
|
38
|
+
const run = await getRun(db, runId);
|
|
39
|
+
return run && run.actorKey === actorKey ? run : null;
|
|
40
|
+
},
|
|
41
|
+
/**
|
|
42
|
+
* Find the actor's run for this exact content (same idempotency key and
|
|
43
|
+
* direction) or create a fresh one. A completed prior run is returned with
|
|
44
|
+
* `alreadyCompleted` so the caller can skip the apply outright; a pending,
|
|
45
|
+
* running, failed, or mid-apply prior run is resumed with its part progress
|
|
46
|
+
* intact (an "applying" run resumes so a concurrent re-declaration never
|
|
47
|
+
* spawns a duplicate, but `start` leaves it alone until the apply settles).
|
|
48
|
+
*/
|
|
49
|
+
async resumeOrCreate(db, input) {
|
|
50
|
+
return db.transaction(async (tx) => {
|
|
51
|
+
const txDb = tx;
|
|
52
|
+
// No unique index backs the (actor, direction, content key) lookup, so
|
|
53
|
+
// two concurrent identical declarations could both miss the lookup and
|
|
54
|
+
// both insert. Serialize them with a transaction-scoped advisory lock
|
|
55
|
+
// on the key: the second caller waits here until the first commits and
|
|
56
|
+
// then resumes the first caller's row.
|
|
57
|
+
const lockKey = `${input.actorKey}|${input.direction}|${input.idempotencyKey}`;
|
|
58
|
+
await txDb.execute(sql `select pg_advisory_xact_lock(hashtextextended(${lockKey}, 0))`);
|
|
59
|
+
const matches = await txDb
|
|
60
|
+
.select()
|
|
61
|
+
.from(companyTransferRuns)
|
|
62
|
+
.where(and(eq(companyTransferRuns.idempotencyKey, input.idempotencyKey), eq(companyTransferRuns.direction, input.direction), eq(companyTransferRuns.actorKey, input.actorKey), inArray(companyTransferRuns.status, [...RESUMABLE_STATUSES, "applying", "completed"])))
|
|
63
|
+
.orderBy(desc(companyTransferRuns.createdAt))
|
|
64
|
+
.limit(1);
|
|
65
|
+
const existing = matches[0] ? rowFromRecord(matches[0]) : null;
|
|
66
|
+
if (existing) {
|
|
67
|
+
return { run: existing, resumed: true, alreadyCompleted: existing.status === "completed" };
|
|
68
|
+
}
|
|
69
|
+
const [created] = await txDb
|
|
70
|
+
.insert(companyTransferRuns)
|
|
71
|
+
.values({
|
|
72
|
+
direction: input.direction,
|
|
73
|
+
actorKey: input.actorKey,
|
|
74
|
+
idempotencyKey: input.idempotencyKey,
|
|
75
|
+
containerRef: input.containerRef,
|
|
76
|
+
companyId: input.companyId ?? null,
|
|
77
|
+
})
|
|
78
|
+
.returning();
|
|
79
|
+
return { run: rowFromRecord(created), resumed: false, alreadyCompleted: false };
|
|
80
|
+
});
|
|
81
|
+
},
|
|
82
|
+
/**
|
|
83
|
+
* Persist the parsed manifest so resume can re-verify parts without
|
|
84
|
+
* refetching it. Counts default to the manifest's chunk/blob index when it
|
|
85
|
+
* has one; manifests with a different part layout pass them explicitly.
|
|
86
|
+
*/
|
|
87
|
+
async recordManifest(db, runId, manifest, manifestSha256, counts) {
|
|
88
|
+
const index = asPartsIndex(manifest);
|
|
89
|
+
const chunkCount = counts?.chunkCount ?? index?.chunks.length ?? 0;
|
|
90
|
+
const blobCount = counts?.blobCount ?? index?.blobs.length ?? 0;
|
|
91
|
+
await db
|
|
92
|
+
.update(companyTransferRuns)
|
|
93
|
+
.set({
|
|
94
|
+
manifest,
|
|
95
|
+
manifestSha256,
|
|
96
|
+
chunkCount,
|
|
97
|
+
blobCount,
|
|
98
|
+
updatedAt: new Date(),
|
|
99
|
+
})
|
|
100
|
+
.where(eq(companyTransferRuns.id, runId));
|
|
101
|
+
},
|
|
102
|
+
/**
|
|
103
|
+
* Atomically claim a run for apply. The apply itself is not idempotent, so
|
|
104
|
+
* of any overlapping apply attempts exactly one caller gets `true` here —
|
|
105
|
+
* a single guarded UPDATE moves the run to "applying" only while it is
|
|
106
|
+
* still open (pending/running/failed). The winner settles the claim with
|
|
107
|
+
* `complete` on success or `releaseApplyClaim`/`fail` on error (which makes
|
|
108
|
+
* the run retryable again); every concurrent loser gets `false` and must
|
|
109
|
+
* not run the apply.
|
|
110
|
+
*/
|
|
111
|
+
async claimApply(db, runId) {
|
|
112
|
+
const claimed = await db
|
|
113
|
+
.update(companyTransferRuns)
|
|
114
|
+
.set({ status: "applying", error: null, updatedAt: new Date() })
|
|
115
|
+
.where(and(eq(companyTransferRuns.id, runId), inArray(companyTransferRuns.status, RESUMABLE_STATUSES)))
|
|
116
|
+
.returning({ id: companyTransferRuns.id });
|
|
117
|
+
return claimed.length > 0;
|
|
118
|
+
},
|
|
119
|
+
async start(db, runId) {
|
|
120
|
+
await db
|
|
121
|
+
.update(companyTransferRuns)
|
|
122
|
+
.set({ status: "running", error: null, startedAt: new Date(), finishedAt: null, updatedAt: new Date() })
|
|
123
|
+
.where(and(eq(companyTransferRuns.id, runId), inArray(companyTransferRuns.status, RESUMABLE_STATUSES)));
|
|
124
|
+
},
|
|
125
|
+
async attachCompany(db, runId, companyId) {
|
|
126
|
+
await db
|
|
127
|
+
.update(companyTransferRuns)
|
|
128
|
+
.set({ companyId, updatedAt: new Date() })
|
|
129
|
+
.where(eq(companyTransferRuns.id, runId));
|
|
130
|
+
},
|
|
131
|
+
/**
|
|
132
|
+
* Record one finished container part. Appends atomically in SQL and is
|
|
133
|
+
* idempotent: re-completing an already recorded part leaves the ledger
|
|
134
|
+
* unchanged, so a retried part never double-counts. Only open runs
|
|
135
|
+
* (pending/running) accept parts; when the run has meanwhile gone terminal
|
|
136
|
+
* (e.g. the abandoned-spool sweep cancelled it) or is mid-apply, nothing is
|
|
137
|
+
* recorded and `false` comes back so the caller can discard the part.
|
|
138
|
+
*/
|
|
139
|
+
async completePart(db, runId, partName) {
|
|
140
|
+
const partJson = JSON.stringify([partName]);
|
|
141
|
+
const updated = await db
|
|
142
|
+
.update(companyTransferRuns)
|
|
143
|
+
.set({
|
|
144
|
+
completedParts: sql `case when ${companyTransferRuns.completedParts} @> ${partJson}::jsonb then ${companyTransferRuns.completedParts} else ${companyTransferRuns.completedParts} || ${partJson}::jsonb end`,
|
|
145
|
+
updatedAt: new Date(),
|
|
146
|
+
})
|
|
147
|
+
.where(and(eq(companyTransferRuns.id, runId), inArray(companyTransferRuns.status, PART_UPLOAD_STATUSES)))
|
|
148
|
+
.returning({ id: companyTransferRuns.id });
|
|
149
|
+
return updated.length > 0;
|
|
150
|
+
},
|
|
151
|
+
/** Container part names the run still has to process, in manifest order. */
|
|
152
|
+
remainingParts(run, manifest) {
|
|
153
|
+
const completed = new Set(run.completedParts);
|
|
154
|
+
const remaining = [];
|
|
155
|
+
for (const chunk of manifest.chunks) {
|
|
156
|
+
if (!completed.has(chunk.name))
|
|
157
|
+
remaining.push(chunk.name);
|
|
158
|
+
}
|
|
159
|
+
for (const blob of manifest.blobs) {
|
|
160
|
+
if (!completed.has(blob.name))
|
|
161
|
+
remaining.push(blob.name);
|
|
162
|
+
}
|
|
163
|
+
return remaining;
|
|
164
|
+
},
|
|
165
|
+
async complete(db, runId) {
|
|
166
|
+
await db
|
|
167
|
+
.update(companyTransferRuns)
|
|
168
|
+
.set({ status: "completed", error: null, finishedAt: new Date(), updatedAt: new Date() })
|
|
169
|
+
.where(eq(companyTransferRuns.id, runId));
|
|
170
|
+
},
|
|
171
|
+
/**
|
|
172
|
+
* Atomically claim an abandoned open run: cancel it only while it is still
|
|
173
|
+
* open (pending/running) AND saw no activity since `idleSince` — one
|
|
174
|
+
* guarded UPDATE, so any concurrent part upload or resume that bumped
|
|
175
|
+
* `updatedAt` makes the guard miss and `false` comes back. Callers must
|
|
176
|
+
* only touch the run's spooled data after a `true` claim.
|
|
177
|
+
*
|
|
178
|
+
* The terminal state is "cancelled", not "failed", precisely because failed
|
|
179
|
+
* runs stay claimable: a failed sweep target could be claimed by an apply
|
|
180
|
+
* and assembled while its spool is being deleted underneath it. A cancelled
|
|
181
|
+
* run is unclaimable the instant this UPDATE commits — before any
|
|
182
|
+
* filesystem deletion — and `resumeOrCreate` ignores it, so redeclaring the
|
|
183
|
+
* same content afterwards starts a fresh run.
|
|
184
|
+
*/
|
|
185
|
+
async cancelIfIdle(db, runId, idleSince, error) {
|
|
186
|
+
const claimed = await db
|
|
187
|
+
.update(companyTransferRuns)
|
|
188
|
+
.set({ status: "cancelled", error, finishedAt: new Date(), updatedAt: new Date() })
|
|
189
|
+
.where(and(eq(companyTransferRuns.id, runId), inArray(companyTransferRuns.status, PART_UPLOAD_STATUSES), lt(companyTransferRuns.updatedAt, idleSince)))
|
|
190
|
+
.returning({ id: companyTransferRuns.id });
|
|
191
|
+
return claimed.length > 0;
|
|
192
|
+
},
|
|
193
|
+
/**
|
|
194
|
+
* Release a held apply claim into "failed". Guarded on "applying", unlike
|
|
195
|
+
* `fail`: catch-all error paths around an apply cannot know whether the run
|
|
196
|
+
* already settled (a cleanup error thrown after `complete` reaches the same
|
|
197
|
+
* catch as a real apply failure), and an unguarded fail there would flip a
|
|
198
|
+
* completed run back to claimable and invite a duplicate import. When the
|
|
199
|
+
* run already settled this is a no-op and returns false.
|
|
200
|
+
*/
|
|
201
|
+
async releaseApplyClaim(db, runId, error) {
|
|
202
|
+
const released = await db
|
|
203
|
+
.update(companyTransferRuns)
|
|
204
|
+
.set({ status: "failed", error, finishedAt: new Date(), updatedAt: new Date() })
|
|
205
|
+
.where(and(eq(companyTransferRuns.id, runId), eq(companyTransferRuns.status, "applying")))
|
|
206
|
+
.returning({ id: companyTransferRuns.id });
|
|
207
|
+
return released.length > 0;
|
|
208
|
+
},
|
|
209
|
+
/**
|
|
210
|
+
* Fail every run stranded in "applying" by a dead process. Apply jobs run
|
|
211
|
+
* in-memory in this single server process, so at boot any run still
|
|
212
|
+
* "applying" belongs to an apply that died without settling its claim and
|
|
213
|
+
* would otherwise 409 every retry forever. Failing it makes it claimable
|
|
214
|
+
* again with its spooled parts intact. Startup only — running this while
|
|
215
|
+
* applies may be live (e.g. from a periodic sweep) would kill them.
|
|
216
|
+
*/
|
|
217
|
+
async recoverStrandedApplyingRuns(db) {
|
|
218
|
+
const recovered = await db
|
|
219
|
+
.update(companyTransferRuns)
|
|
220
|
+
.set({
|
|
221
|
+
status: "failed",
|
|
222
|
+
error: "apply interrupted by a restart — verify whether the import completed before retrying",
|
|
223
|
+
finishedAt: new Date(),
|
|
224
|
+
updatedAt: new Date(),
|
|
225
|
+
})
|
|
226
|
+
.where(eq(companyTransferRuns.status, "applying"))
|
|
227
|
+
.returning({ id: companyTransferRuns.id });
|
|
228
|
+
return recovered.map((row) => row.id);
|
|
229
|
+
},
|
|
230
|
+
async fail(db, runId, error) {
|
|
231
|
+
await db
|
|
232
|
+
.update(companyTransferRuns)
|
|
233
|
+
.set({ status: "failed", error, finishedAt: new Date(), updatedAt: new Date() })
|
|
234
|
+
.where(eq(companyTransferRuns.id, runId));
|
|
235
|
+
},
|
|
236
|
+
async cancel(db, runId) {
|
|
237
|
+
await db
|
|
238
|
+
.update(companyTransferRuns)
|
|
239
|
+
.set({ status: "cancelled", finishedAt: new Date(), updatedAt: new Date() })
|
|
240
|
+
.where(and(eq(companyTransferRuns.id, runId), inArray(companyTransferRuns.status, RESUMABLE_STATUSES)));
|
|
241
|
+
},
|
|
242
|
+
};
|
|
243
|
+
//# sourceMappingURL=company-transfer-runs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"company-transfer-runs.js","sourceRoot":"","sources":["../../src/services/company-transfer-runs.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,13 @@
|
|
|
1
1
|
import type { Db } from "@paperclipai/db";
|
|
2
2
|
export declare const CROSS_ISSUE_INFLUENCE_LIMIT = 20;
|
|
3
3
|
export declare const CROSS_ISSUE_INFLUENCE_ENFORCE_AT: Date;
|
|
4
|
-
|
|
4
|
+
/**
|
|
5
|
+
* Every kind shares one per-run counter. `interaction_resolution` covers the
|
|
6
|
+
* issue-thread accept/reject/respond/verdict routes: an open `anyone` resolver
|
|
7
|
+
* audience is not a licence to resolve, wake, and spawn suggested tasks across
|
|
8
|
+
* the whole company from one run.
|
|
9
|
+
*/
|
|
10
|
+
export type CrossIssueInfluenceKind = "comment" | "update" | "interaction_resolution";
|
|
5
11
|
export type CrossIssueInfluenceDecision = {
|
|
6
12
|
allowed: boolean;
|
|
7
13
|
mode: "log_only" | "enforce";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cross-issue-influence-limit.d.ts","sourceRoot":"","sources":["../../src/services/cross-issue-influence-limit.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,iBAAiB,CAAC;AAM1C,eAAO,MAAM,2BAA2B,KAAK,CAAC;AAC9C,eAAO,MAAM,gCAAgC,MAAuC,CAAC;AAKrF,MAAM,MAAM,uBAAuB,GAAG,SAAS,GAAG,QAAQ,CAAC;
|
|
1
|
+
{"version":3,"file":"cross-issue-influence-limit.d.ts","sourceRoot":"","sources":["../../src/services/cross-issue-influence-limit.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,iBAAiB,CAAC;AAM1C,eAAO,MAAM,2BAA2B,KAAK,CAAC;AAC9C,eAAO,MAAM,gCAAgC,MAAuC,CAAC;AAKrF;;;;;GAKG;AACH,MAAM,MAAM,uBAAuB,GAAG,SAAS,GAAG,QAAQ,GAAG,wBAAwB,CAAC;AAEtF,MAAM,MAAM,2BAA2B,GAAG;IACxC,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,EAAE,UAAU,GAAG,SAAS,CAAC;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,wBAAgB,kCAAkC,qCAKjD;AAWD,wBAAgB,gCAAgC,CAAC,KAAK,EAAE;IACtD,UAAU,EAAE,MAAM,CAAC;IACnB,GAAG,CAAC,EAAE,IAAI,CAAC;CACZ,GAAG,2BAA2B,CAW9B;AAED;;;;;;;GAOG;AACH,wBAAsB,0BAA0B,CAC9C,EAAE,EAAE,EAAE,EACN,KAAK,EAAE;IACL,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,iBAAiB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,aAAa,EAAE,MAAM,CAAC;IACtB,qBAAqB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtC,IAAI,EAAE,uBAAuB,CAAC;IAC9B,GAAG,CAAC,EAAE,IAAI,CAAC;CACZ,GACA,OAAO,CAAC,2BAA2B,GAAG,IAAI,CAAC,CAiG7C;AAED,wBAAgB,6BAA6B,CAC3C,QAAQ,EAAE,2BAA2B,EACrC,OAAO,GAAE;IAAE,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,eAAe,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CAAO;;;;;;;;;;;;EAoB7G"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cross-issue-influence-limit.js","sourceRoot":"","sources":["../../src/services/cross-issue-influence-limit.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,aAAa,CAAC;AAE7C,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAC7D,OAAO,EAAE,UAAU,EAAE,wBAAwB,EAAE,MAAM,qBAAqB,CAAC;AAC3E,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACzC,OAAO,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAC;AAEjD,MAAM,CAAC,MAAM,2BAA2B,GAAG,EAAE,CAAC;AAC9C,MAAM,CAAC,MAAM,gCAAgC,GAAG,IAAI,IAAI,CAAC,0BAA0B,CAAC,CAAC;AAErF,MAAM,8BAA8B,GAAG,sCAAsC,CAAC;AAC9E,MAAM,uCAAuC,GAAG,0CAA0C,CAAC;
|
|
1
|
+
{"version":3,"file":"cross-issue-influence-limit.js","sourceRoot":"","sources":["../../src/services/cross-issue-influence-limit.ts"],"names":[],"mappings":"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"}
|
|
@@ -59,6 +59,21 @@ export declare function resolveEnvironmentDriverConfigForRuntime(db: Db, company
|
|
|
59
59
|
heartbeatRunId?: string | null;
|
|
60
60
|
applyCustomImageTemplate?: boolean;
|
|
61
61
|
}): Promise<ParsedEnvironmentConfig>;
|
|
62
|
+
/**
|
|
63
|
+
* Resolve the connection secrets of a recorded sandbox config for a durable
|
|
64
|
+
* orphan-sandbox teardown. The retry reads the recorded config from the durable
|
|
65
|
+
* `pending_cleanup` lease row, not from the current environment. So this
|
|
66
|
+
* resolver must not require the environment binding: a delete removed the
|
|
67
|
+
* environment, or a provider change replaced the binding. It resolves each
|
|
68
|
+
* schema-declared secret ref by id at the latest version through
|
|
69
|
+
* `resolveSecretValueForSandboxCleanup`, which authorizes the read from the
|
|
70
|
+
* durable orphan record and skips the binding check. The resolved values are
|
|
71
|
+
* used once for the teardown RPC and never persisted.
|
|
72
|
+
*/
|
|
73
|
+
export declare function resolveSandboxCleanupConfigSecrets(db: Db, companyId: string, config: SandboxEnvironmentConfig, context?: {
|
|
74
|
+
issueId?: string | null;
|
|
75
|
+
heartbeatRunId?: string | null;
|
|
76
|
+
}): Promise<SandboxEnvironmentConfig>;
|
|
62
77
|
export declare function readSshEnvironmentPrivateKeySecretId(environment: Pick<Environment, "driver" | "config">): string | null;
|
|
63
78
|
export declare function parseEnvironmentDriverConfig(environment: Pick<Environment, "driver" | "config">): ParsedEnvironmentConfig;
|
|
64
79
|
//# sourceMappingURL=environment-config.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"environment-config.d.ts","sourceRoot":"","sources":["../../src/services/environment-config.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,iBAAiB,CAAC;AAC1C,OAAO,KAAK,EACV,WAAW,EACX,iBAAiB,EAEjB,sBAAsB,EACtB,uBAAuB,EAEvB,wBAAwB,EACxB,cAAc,EACd,qBAAqB,EACrB,oBAAoB,EACrB,MAAM,qBAAqB,CAAC;AAS7B,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;
|
|
1
|
+
{"version":3,"file":"environment-config.d.ts","sourceRoot":"","sources":["../../src/services/environment-config.ts"],"names":[],"mappings":"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"}
|
|
@@ -48,7 +48,6 @@ const fakeSandboxEnvironmentConfigSchema = z.object({
|
|
|
48
48
|
.default("ubuntu:24.04"),
|
|
49
49
|
reuseLease: z.boolean().optional().default(false),
|
|
50
50
|
streamRunLogs: z.boolean().optional(),
|
|
51
|
-
streamAgentSessionOutput: z.boolean().optional(),
|
|
52
51
|
archiveOnRelease: z.boolean().optional(),
|
|
53
52
|
}).strict();
|
|
54
53
|
const pluginSandboxProviderKeySchema = z.string()
|
|
@@ -60,7 +59,6 @@ const pluginSandboxEnvironmentConfigSchema = z.object({
|
|
|
60
59
|
timeoutMs: z.coerce.number().int().min(1).max(86_400_000).optional(),
|
|
61
60
|
reuseLease: z.boolean().optional().default(false),
|
|
62
61
|
streamRunLogs: z.boolean().optional(),
|
|
63
|
-
streamAgentSessionOutput: z.boolean().optional(),
|
|
64
62
|
archiveOnRelease: z.boolean().optional(),
|
|
65
63
|
}).catchall(z.unknown());
|
|
66
64
|
const pluginEnvironmentConfigSchema = z.object({
|
|
@@ -77,8 +75,25 @@ function toErrorMessage(error) {
|
|
|
77
75
|
function getSandboxProvider(raw) {
|
|
78
76
|
return typeof raw.provider === "string" && raw.provider.trim().length > 0 ? raw.provider.trim() : "fake";
|
|
79
77
|
}
|
|
78
|
+
// Operator flags removed when session-output streaming moved to the verified
|
|
79
|
+
// capability snapshot. A saved environment config can still carry a removed key.
|
|
80
|
+
// The server now decides session-output streaming from the effective capability
|
|
81
|
+
// snapshot alone, so no consumer reads these flags. Strip a removed key before
|
|
82
|
+
// validation so a strict schema (the fake sandbox) still loads an old config,
|
|
83
|
+
// and so the removed flag never reaches the parsed config.
|
|
84
|
+
const REMOVED_SANDBOX_CONFIG_KEYS = ["streamAgentSessionOutput"];
|
|
85
|
+
function stripRemovedSandboxConfigKeys(raw) {
|
|
86
|
+
if (!REMOVED_SANDBOX_CONFIG_KEYS.some((key) => key in raw)) {
|
|
87
|
+
return raw;
|
|
88
|
+
}
|
|
89
|
+
const next = { ...raw };
|
|
90
|
+
for (const key of REMOVED_SANDBOX_CONFIG_KEYS) {
|
|
91
|
+
delete next[key];
|
|
92
|
+
}
|
|
93
|
+
return next;
|
|
94
|
+
}
|
|
80
95
|
function parseSandboxEnvironmentConfig(input) {
|
|
81
|
-
const raw = parseObject(input);
|
|
96
|
+
const raw = stripRemovedSandboxConfigKeys(parseObject(input));
|
|
82
97
|
const provider = getSandboxProvider(raw);
|
|
83
98
|
if (provider === "fake") {
|
|
84
99
|
const parsed = fakeSandboxEnvironmentConfigSchema.safeParse(raw);
|
|
@@ -252,15 +267,14 @@ export function stripSandboxProviderEnvelope(config) {
|
|
|
252
267
|
const { provider: _provider, ...driverConfig } = config;
|
|
253
268
|
return driverConfig;
|
|
254
269
|
}
|
|
255
|
-
// The host owns
|
|
256
|
-
// host reads
|
|
257
|
-
//
|
|
258
|
-
//
|
|
259
|
-
//
|
|
260
|
-
//
|
|
270
|
+
// The host owns this sandbox run-behavior flag, not the provider plugin. The
|
|
271
|
+
// host reads it to select the run-log stream. The host passes the whole config
|
|
272
|
+
// to the plugin, so a plugin that allowlists its own driver fields drops the
|
|
273
|
+
// flag from its normalized config. Re-apply it from the parsed envelope after
|
|
274
|
+
// the plugin normalizes, or a saved environment loses the operator opt-in and
|
|
275
|
+
// the stream never starts.
|
|
261
276
|
const HOST_OWNED_SANDBOX_STREAM_FLAGS = [
|
|
262
277
|
"streamRunLogs",
|
|
263
|
-
"streamAgentSessionOutput",
|
|
264
278
|
];
|
|
265
279
|
function applyHostOwnedSandboxStreamFlags(normalizedConfig, envelope) {
|
|
266
280
|
const merged = { ...normalizedConfig };
|
|
@@ -509,6 +523,38 @@ export async function resolveEnvironmentDriverConfigForRuntime(db, companyId, en
|
|
|
509
523
|
}
|
|
510
524
|
return parsed;
|
|
511
525
|
}
|
|
526
|
+
/**
|
|
527
|
+
* Resolve the connection secrets of a recorded sandbox config for a durable
|
|
528
|
+
* orphan-sandbox teardown. The retry reads the recorded config from the durable
|
|
529
|
+
* `pending_cleanup` lease row, not from the current environment. So this
|
|
530
|
+
* resolver must not require the environment binding: a delete removed the
|
|
531
|
+
* environment, or a provider change replaced the binding. It resolves each
|
|
532
|
+
* schema-declared secret ref by id at the latest version through
|
|
533
|
+
* `resolveSecretValueForSandboxCleanup`, which authorizes the read from the
|
|
534
|
+
* durable orphan record and skips the binding check. The resolved values are
|
|
535
|
+
* used once for the teardown RPC and never persisted.
|
|
536
|
+
*/
|
|
537
|
+
export async function resolveSandboxCleanupConfigSecrets(db, companyId, config, context) {
|
|
538
|
+
if (config.provider === "fake")
|
|
539
|
+
return config;
|
|
540
|
+
const schema = await getSandboxProviderConfigSchema(db, config.provider);
|
|
541
|
+
const secrets = secretService(db);
|
|
542
|
+
let nextConfig = { ...config };
|
|
543
|
+
for (const path of collectSecretRefPaths(schema)) {
|
|
544
|
+
const current = canonicalizeSecretRefValue(readConfigValueAtPath(nextConfig, path), path);
|
|
545
|
+
if (typeof current !== "string")
|
|
546
|
+
continue;
|
|
547
|
+
const trimmed = current.trim();
|
|
548
|
+
if (!isUuidSecretRef(trimmed))
|
|
549
|
+
continue;
|
|
550
|
+
nextConfig = writeConfigValueAtPath(nextConfig, path, await secrets.resolveSecretValueForSandboxCleanup(companyId, trimmed, "latest", {
|
|
551
|
+
configPath: path,
|
|
552
|
+
issueId: context?.issueId ?? null,
|
|
553
|
+
heartbeatRunId: context?.heartbeatRunId ?? null,
|
|
554
|
+
}));
|
|
555
|
+
}
|
|
556
|
+
return nextConfig;
|
|
557
|
+
}
|
|
512
558
|
export function readSshEnvironmentPrivateKeySecretId(environment) {
|
|
513
559
|
if (environment.driver !== "ssh")
|
|
514
560
|
return null;
|