@paperclipai/server 2026.824.0 → 2026.825.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/builtin-adapter-types.d.ts.map +1 -1
- package/dist/adapters/builtin-adapter-types.js +1 -0
- package/dist/adapters/builtin-adapter-types.js.map +1 -1
- package/dist/adapters/plugin-loader.d.ts +1 -0
- package/dist/adapters/plugin-loader.d.ts.map +1 -1
- package/dist/adapters/plugin-loader.js +12 -1
- package/dist/adapters/plugin-loader.js.map +1 -1
- package/dist/adapters/plugin-loader.test.d.ts +2 -0
- package/dist/adapters/plugin-loader.test.d.ts.map +1 -0
- package/dist/adapters/plugin-loader.test.js +37 -0
- package/dist/adapters/plugin-loader.test.js.map +1 -0
- package/dist/adapters/registry.d.ts.map +1 -1
- package/dist/adapters/registry.js +68 -5
- package/dist/adapters/registry.js.map +1 -1
- package/dist/adapters/registry.test.d.ts +2 -0
- package/dist/adapters/registry.test.d.ts.map +1 -0
- package/dist/adapters/registry.test.js +35 -0
- package/dist/adapters/registry.test.js.map +1 -0
- package/dist/app.d.ts.map +1 -1
- package/dist/app.js +5 -7
- package/dist/app.js.map +1 -1
- package/dist/auth/better-auth.d.ts +10 -0
- package/dist/auth/better-auth.d.ts.map +1 -1
- package/dist/auth/better-auth.js +47 -0
- package/dist/auth/better-auth.js.map +1 -1
- package/dist/auth/workspace-login-handoff-exchange.d.ts +75 -0
- package/dist/auth/workspace-login-handoff-exchange.d.ts.map +1 -0
- package/dist/auth/workspace-login-handoff-exchange.js +73 -0
- package/dist/auth/workspace-login-handoff-exchange.js.map +1 -0
- package/dist/auth/workspace-login-handoff-plugin.d.ts +40 -0
- package/dist/auth/workspace-login-handoff-plugin.d.ts.map +1 -0
- package/dist/auth/workspace-login-handoff-plugin.js +140 -0
- package/dist/auth/workspace-login-handoff-plugin.js.map +1 -0
- package/dist/auth/workspace-login-handoff.d.ts +189 -0
- package/dist/auth/workspace-login-handoff.d.ts.map +1 -0
- package/dist/auth/workspace-login-handoff.js +319 -0
- package/dist/auth/workspace-login-handoff.js.map +1 -0
- package/dist/build-info.json +3 -0
- package/dist/config.d.ts +1 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +14 -0
- package/dist/config.js.map +1 -1
- package/dist/dev-runner-worktree.d.ts.map +1 -1
- package/dist/dev-runner-worktree.js +5 -0
- package/dist/dev-runner-worktree.js.map +1 -1
- package/dist/duplex-aggregate-ceiling-env.d.ts +21 -0
- package/dist/duplex-aggregate-ceiling-env.d.ts.map +1 -0
- package/dist/duplex-aggregate-ceiling-env.js +23 -0
- package/dist/duplex-aggregate-ceiling-env.js.map +1 -0
- package/dist/embedded-postgres-supervisor.d.ts +27 -0
- package/dist/embedded-postgres-supervisor.d.ts.map +1 -0
- package/dist/embedded-postgres-supervisor.js +72 -0
- package/dist/embedded-postgres-supervisor.js.map +1 -0
- package/dist/errors.d.ts +2 -0
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js +6 -0
- package/dist/errors.js.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +115 -7
- package/dist/index.js.map +1 -1
- package/dist/instrumentation.d.ts +33 -0
- package/dist/instrumentation.d.ts.map +1 -1
- package/dist/instrumentation.js +68 -1
- package/dist/instrumentation.js.map +1 -1
- package/dist/middleware/auth.d.ts.map +1 -1
- package/dist/middleware/auth.js +35 -10
- package/dist/middleware/auth.js.map +1 -1
- package/dist/middleware/error-handler.d.ts.map +1 -1
- package/dist/middleware/error-handler.js +8 -1
- package/dist/middleware/error-handler.js.map +1 -1
- package/dist/middleware/logger.d.ts.map +1 -1
- package/dist/middleware/logger.js +5 -2
- package/dist/middleware/logger.js.map +1 -1
- package/dist/middleware/redact-sensitive.d.ts.map +1 -1
- package/dist/middleware/redact-sensitive.js +4 -0
- package/dist/middleware/redact-sensitive.js.map +1 -1
- package/dist/middleware/validate.d.ts +3 -1
- package/dist/middleware/validate.d.ts.map +1 -1
- package/dist/middleware/validate.js +37 -0
- package/dist/middleware/validate.js.map +1 -1
- package/dist/routes/access.d.ts.map +1 -1
- package/dist/routes/access.js +20 -0
- package/dist/routes/access.js.map +1 -1
- package/dist/routes/activity.js +4 -4
- package/dist/routes/activity.js.map +1 -1
- package/dist/routes/adapter-login-route-spine.d.ts +81 -0
- package/dist/routes/adapter-login-route-spine.d.ts.map +1 -0
- package/dist/routes/adapter-login-route-spine.js +40 -0
- package/dist/routes/adapter-login-route-spine.js.map +1 -0
- package/dist/routes/adapters.d.ts +33 -0
- package/dist/routes/adapters.d.ts.map +1 -1
- package/dist/routes/adapters.js +35 -1
- package/dist/routes/adapters.js.map +1 -1
- package/dist/routes/adapters.test.d.ts +2 -0
- package/dist/routes/adapters.test.d.ts.map +1 -0
- package/dist/routes/adapters.test.js +58 -0
- package/dist/routes/adapters.test.js.map +1 -0
- package/dist/routes/agents.d.ts.map +1 -1
- package/dist/routes/agents.js +281 -91
- package/dist/routes/agents.js.map +1 -1
- package/dist/routes/cases.d.ts +11 -22
- package/dist/routes/cases.d.ts.map +1 -1
- package/dist/routes/cases.js +13 -13
- package/dist/routes/companies.js +3 -3
- package/dist/routes/decision-training.js +6 -6
- package/dist/routes/decisions.js +4 -4
- package/dist/routes/decisions.js.map +1 -1
- package/dist/routes/environments.d.ts.map +1 -1
- package/dist/routes/environments.js +79 -6
- package/dist/routes/environments.js.map +1 -1
- package/dist/routes/execution-workspaces.d.ts.map +1 -1
- package/dist/routes/execution-workspaces.js +384 -16
- package/dist/routes/execution-workspaces.js.map +1 -1
- package/dist/routes/file-resources.js +2 -2
- package/dist/routes/health.d.ts.map +1 -1
- package/dist/routes/health.js +58 -4
- package/dist/routes/health.js.map +1 -1
- package/dist/routes/instance-settings.d.ts.map +1 -1
- package/dist/routes/instance-settings.js +40 -0
- package/dist/routes/instance-settings.js.map +1 -1
- package/dist/routes/issues.d.ts +10 -0
- package/dist/routes/issues.d.ts.map +1 -1
- package/dist/routes/issues.js +495 -65
- package/dist/routes/issues.js.map +1 -1
- package/dist/routes/openapi.d.ts.map +1 -1
- package/dist/routes/openapi.js +241 -122
- package/dist/routes/openapi.js.map +1 -1
- package/dist/routes/pipelines.js +19 -19
- package/dist/routes/plugins.d.ts.map +1 -1
- package/dist/routes/plugins.js +22 -0
- package/dist/routes/plugins.js.map +1 -1
- package/dist/routes/projects.d.ts.map +1 -1
- package/dist/routes/projects.js +2 -0
- package/dist/routes/projects.js.map +1 -1
- package/dist/routes/routines.js +2 -2
- package/dist/routes/routines.js.map +1 -1
- package/dist/routes/secrets.d.ts +1 -1
- package/dist/routes/secrets.d.ts.map +1 -1
- package/dist/routes/secrets.js +39 -50
- package/dist/routes/secrets.js.map +1 -1
- package/dist/routes/setup-token-route.test.js +50 -3
- package/dist/routes/setup-token-route.test.js.map +1 -1
- package/dist/services/adapter-login-lease.d.ts +50 -0
- package/dist/services/adapter-login-lease.d.ts.map +1 -0
- package/dist/services/adapter-login-lease.js +26 -0
- package/dist/services/adapter-login-lease.js.map +1 -0
- package/dist/services/adapter-login-lease.test.d.ts +2 -0
- package/dist/services/adapter-login-lease.test.d.ts.map +1 -0
- package/dist/services/adapter-login-lease.test.js +68 -0
- package/dist/services/adapter-login-lease.test.js.map +1 -0
- package/dist/services/agent-action-audit.js +1 -1
- package/dist/services/agent-secret-bindings.d.ts +15 -0
- package/dist/services/agent-secret-bindings.d.ts.map +1 -1
- package/dist/services/agent-secret-bindings.js +2 -2
- package/dist/services/agent-secret-bindings.js.map +1 -1
- package/dist/services/agents.d.ts +13 -13
- package/dist/services/agents.d.ts.map +1 -1
- package/dist/services/agents.js +46 -5
- package/dist/services/agents.js.map +1 -1
- package/dist/services/artifact-review-documents.d.ts +34 -0
- package/dist/services/artifact-review-documents.d.ts.map +1 -0
- package/dist/services/artifact-review-documents.js +196 -0
- package/dist/services/artifact-review-documents.js.map +1 -0
- package/dist/services/assets.d.ts +1 -1
- package/dist/services/codex-device-login-credential-read.d.ts +58 -0
- package/dist/services/codex-device-login-credential-read.d.ts.map +1 -0
- package/dist/services/codex-device-login-credential-read.js +118 -0
- package/dist/services/codex-device-login-credential-read.js.map +1 -0
- package/dist/services/codex-device-login-reaper.d.ts.map +1 -1
- package/dist/services/codex-device-login-reaper.js +8 -5
- package/dist/services/codex-device-login-reaper.js.map +1 -1
- package/dist/services/codex-device-login-service.d.ts +127 -36
- package/dist/services/codex-device-login-service.d.ts.map +1 -1
- package/dist/services/codex-device-login-service.js +204 -84
- package/dist/services/codex-device-login-service.js.map +1 -1
- package/dist/services/company-portability.d.ts +3 -1
- package/dist/services/company-portability.d.ts.map +1 -1
- package/dist/services/company-portability.js +76 -20
- package/dist/services/company-portability.js.map +1 -1
- package/dist/services/company-skill-policy.d.ts +1 -1
- package/dist/services/costs.d.ts +1 -1
- package/dist/services/decisions.d.ts +6 -6
- package/dist/services/duplex-observability-recorder.d.ts +62 -0
- package/dist/services/duplex-observability-recorder.d.ts.map +1 -0
- package/dist/services/duplex-observability-recorder.js +54 -0
- package/dist/services/duplex-observability-recorder.js.map +1 -0
- package/dist/services/environment-config.js +5 -5
- package/dist/services/environment-config.js.map +1 -1
- package/dist/services/environment-custom-image-runtime.d.ts +116 -0
- package/dist/services/environment-custom-image-runtime.d.ts.map +1 -1
- package/dist/services/environment-custom-image-runtime.js +255 -1
- package/dist/services/environment-custom-image-runtime.js.map +1 -1
- package/dist/services/environment-custom-images.d.ts +39 -0
- package/dist/services/environment-custom-images.d.ts.map +1 -1
- package/dist/services/environment-custom-images.js +219 -17
- package/dist/services/environment-custom-images.js.map +1 -1
- package/dist/services/environment-driver-traits.d.ts +109 -0
- package/dist/services/environment-driver-traits.d.ts.map +1 -0
- package/dist/services/environment-driver-traits.js +102 -0
- package/dist/services/environment-driver-traits.js.map +1 -0
- package/dist/services/environment-execution-target.d.ts +4 -0
- package/dist/services/environment-execution-target.d.ts.map +1 -1
- package/dist/services/environment-execution-target.js +63 -7
- package/dist/services/environment-execution-target.js.map +1 -1
- package/dist/services/environment-run-orchestrator.d.ts +27 -1
- package/dist/services/environment-run-orchestrator.d.ts.map +1 -1
- package/dist/services/environment-run-orchestrator.js +24 -4
- package/dist/services/environment-run-orchestrator.js.map +1 -1
- package/dist/services/environment-runtime.d.ts +118 -20
- package/dist/services/environment-runtime.d.ts.map +1 -1
- package/dist/services/environment-runtime.js +436 -91
- package/dist/services/environment-runtime.js.map +1 -1
- package/dist/services/environments.d.ts.map +1 -1
- package/dist/services/environments.js +20 -2
- package/dist/services/environments.js.map +1 -1
- package/dist/services/execution-workspace-branch-ownership.d.ts +4 -0
- package/dist/services/execution-workspace-branch-ownership.d.ts.map +1 -0
- package/dist/services/execution-workspace-branch-ownership.js +9 -0
- package/dist/services/execution-workspace-branch-ownership.js.map +1 -0
- package/dist/services/execution-workspace-policy.d.ts.map +1 -1
- package/dist/services/execution-workspace-policy.js +3 -0
- package/dist/services/execution-workspace-policy.js.map +1 -1
- package/dist/services/execution-workspaces.d.ts +2 -0
- package/dist/services/execution-workspaces.d.ts.map +1 -1
- package/dist/services/execution-workspaces.js +90 -2
- package/dist/services/execution-workspaces.js.map +1 -1
- package/dist/services/external-objects.d.ts +19 -19
- package/dist/services/finance.d.ts +1 -1
- package/dist/services/goals.d.ts +2 -2
- package/dist/services/heartbeat-policy.d.ts +3 -0
- package/dist/services/heartbeat-policy.d.ts.map +1 -0
- package/dist/services/heartbeat-policy.js +10 -0
- package/dist/services/heartbeat-policy.js.map +1 -0
- package/dist/services/heartbeat-run-runtime-status.test.js +1 -1
- package/dist/services/heartbeat-run-runtime-status.test.js.map +1 -1
- package/dist/services/heartbeat.d.ts +23 -1
- package/dist/services/heartbeat.d.ts.map +1 -1
- package/dist/services/heartbeat.js +192 -11
- package/dist/services/heartbeat.js.map +1 -1
- package/dist/services/index.d.ts +1 -0
- package/dist/services/index.d.ts.map +1 -1
- package/dist/services/index.js +1 -0
- package/dist/services/index.js.map +1 -1
- package/dist/services/instance-settings.d.ts.map +1 -1
- package/dist/services/instance-settings.js +2 -0
- package/dist/services/instance-settings.js.map +1 -1
- package/dist/services/issue-dependency-wakeups.d.ts +57 -9
- package/dist/services/issue-dependency-wakeups.d.ts.map +1 -1
- package/dist/services/issue-dependency-wakeups.js +146 -14
- package/dist/services/issue-dependency-wakeups.js.map +1 -1
- package/dist/services/issue-dependency-wakeups.test.d.ts +2 -0
- package/dist/services/issue-dependency-wakeups.test.d.ts.map +1 -0
- package/dist/services/issue-dependency-wakeups.test.js +183 -0
- package/dist/services/issue-dependency-wakeups.test.js.map +1 -0
- package/dist/services/issue-recovery-actions.d.ts +6 -1
- package/dist/services/issue-recovery-actions.d.ts.map +1 -1
- package/dist/services/issue-recovery-actions.js +123 -44
- package/dist/services/issue-recovery-actions.js.map +1 -1
- package/dist/services/issue-thread-interactions.d.ts +8 -0
- package/dist/services/issue-thread-interactions.d.ts.map +1 -1
- package/dist/services/issue-thread-interactions.js +220 -10
- package/dist/services/issue-thread-interactions.js.map +1 -1
- package/dist/services/issues.d.ts +8 -7
- package/dist/services/issues.d.ts.map +1 -1
- package/dist/services/issues.js +84 -12
- package/dist/services/issues.js.map +1 -1
- package/dist/services/local-service-supervisor.d.ts +61 -1
- package/dist/services/local-service-supervisor.d.ts.map +1 -1
- package/dist/services/local-service-supervisor.js +221 -25
- package/dist/services/local-service-supervisor.js.map +1 -1
- package/dist/services/login-command.d.ts +46 -0
- package/dist/services/login-command.d.ts.map +1 -0
- package/dist/services/login-command.js +87 -0
- package/dist/services/login-command.js.map +1 -0
- package/dist/services/login-command.test.d.ts +2 -0
- package/dist/services/login-command.test.d.ts.map +1 -0
- package/dist/services/login-command.test.js +71 -0
- package/dist/services/login-command.test.js.map +1 -0
- package/dist/services/managed-workspace-identity.d.ts +140 -0
- package/dist/services/managed-workspace-identity.d.ts.map +1 -0
- package/dist/services/managed-workspace-identity.js +277 -0
- package/dist/services/managed-workspace-identity.js.map +1 -0
- package/dist/services/plugin-environment-driver.d.ts +15 -1
- package/dist/services/plugin-environment-driver.d.ts.map +1 -1
- package/dist/services/plugin-environment-driver.js +23 -1
- package/dist/services/plugin-environment-driver.js.map +1 -1
- package/dist/services/plugin-host-services.d.ts +3 -2
- package/dist/services/plugin-host-services.d.ts.map +1 -1
- package/dist/services/plugin-host-services.js +11 -2
- package/dist/services/plugin-host-services.js.map +1 -1
- package/dist/services/plugin-loader.d.ts.map +1 -1
- package/dist/services/plugin-loader.js +39 -8
- package/dist/services/plugin-loader.js.map +1 -1
- package/dist/services/plugin-managed-agents.d.ts.map +1 -1
- package/dist/services/plugin-managed-agents.js +50 -5
- package/dist/services/plugin-managed-agents.js.map +1 -1
- package/dist/services/plugin-manifest-validator.d.ts.map +1 -1
- package/dist/services/plugin-manifest-validator.js +5 -2
- package/dist/services/plugin-manifest-validator.js.map +1 -1
- package/dist/services/plugin-registry.d.ts +5 -5
- package/dist/services/plugin-worker-manager.d.ts +158 -11
- package/dist/services/plugin-worker-manager.d.ts.map +1 -1
- package/dist/services/plugin-worker-manager.js +1139 -79
- package/dist/services/plugin-worker-manager.js.map +1 -1
- package/dist/services/projects.d.ts +1 -1
- package/dist/services/recovery/disposition-repair.d.ts +24 -0
- package/dist/services/recovery/disposition-repair.d.ts.map +1 -0
- package/dist/services/recovery/disposition-repair.js +125 -0
- package/dist/services/recovery/disposition-repair.js.map +1 -0
- package/dist/services/recovery/service.d.ts +6 -6
- package/dist/services/recovery/service.d.ts.map +1 -1
- package/dist/services/recovery/service.js +856 -384
- package/dist/services/recovery/service.js.map +1 -1
- package/dist/services/recovery/stranded-notice.js +4 -4
- package/dist/services/recovery/stranded-notice.js.map +1 -1
- package/dist/services/recovery/stranded-notice.test.js +1 -1
- package/dist/services/recovery/stranded-notice.test.js.map +1 -1
- package/dist/services/recovery/successful-run-handoff.d.ts +1 -1
- package/dist/services/recovery/successful-run-handoff.d.ts.map +1 -1
- package/dist/services/recovery/successful-run-handoff.js +6 -4
- package/dist/services/recovery/successful-run-handoff.js.map +1 -1
- package/dist/services/recovery/successful-run-handoff.test.js +1 -1
- package/dist/services/recovery/successful-run-handoff.test.js.map +1 -1
- package/dist/services/recovery-observability.d.ts +1 -1
- package/dist/services/recovery-observability.d.ts.map +1 -1
- package/dist/services/recovery-observability.js +4 -1
- package/dist/services/recovery-observability.js.map +1 -1
- package/dist/services/routines.d.ts.map +1 -1
- package/dist/services/routines.js +86 -1
- package/dist/services/routines.js.map +1 -1
- package/dist/services/runtime-exposure/loopback-listener.js +1 -1
- package/dist/services/runtime-exposure/loopback-listener.js.map +1 -1
- package/dist/services/runtime-exposure/loopback-listener.test.js +1 -1
- package/dist/services/runtime-exposure/loopback-listener.test.js.map +1 -1
- package/dist/services/scripts/codex-auth-read.cjs +93 -0
- package/dist/services/secret-proposal-authorization.d.ts +15 -0
- package/dist/services/secret-proposal-authorization.d.ts.map +1 -0
- package/dist/services/secret-proposal-authorization.js +29 -0
- package/dist/services/secret-proposal-authorization.js.map +1 -0
- package/dist/services/secret-proposal-notifications.d.ts +18 -0
- package/dist/services/secret-proposal-notifications.d.ts.map +1 -0
- package/dist/services/secret-proposal-notifications.js +37 -0
- package/dist/services/secret-proposal-notifications.js.map +1 -0
- package/dist/services/secret-proposals.d.ts +20 -10
- package/dist/services/secret-proposals.d.ts.map +1 -1
- package/dist/services/secret-proposals.js +205 -14
- package/dist/services/secret-proposals.js.map +1 -1
- package/dist/services/secrets.d.ts +3 -3
- package/dist/services/settings-visibility.d.ts +17 -0
- package/dist/services/settings-visibility.d.ts.map +1 -0
- package/dist/services/settings-visibility.js +29 -0
- package/dist/services/settings-visibility.js.map +1 -0
- package/dist/services/setup-token-reaper.d.ts +36 -0
- package/dist/services/setup-token-reaper.d.ts.map +1 -0
- package/dist/services/setup-token-reaper.js +38 -0
- package/dist/services/setup-token-reaper.js.map +1 -0
- package/dist/services/setup-token-reaper.test.d.ts +2 -0
- package/dist/services/setup-token-reaper.test.d.ts.map +1 -0
- package/dist/services/setup-token-reaper.test.js +123 -0
- package/dist/services/setup-token-reaper.test.js.map +1 -0
- package/dist/services/setup-token-session.d.ts +57 -45
- package/dist/services/setup-token-session.d.ts.map +1 -1
- package/dist/services/setup-token-session.js +118 -110
- package/dist/services/setup-token-session.js.map +1 -1
- package/dist/services/setup-token-session.test.js +88 -47
- package/dist/services/setup-token-session.test.js.map +1 -1
- package/dist/services/setup-token-transport-binding.d.ts +20 -12
- package/dist/services/setup-token-transport-binding.d.ts.map +1 -1
- package/dist/services/setup-token-transport-binding.js +59 -32
- package/dist/services/setup-token-transport-binding.js.map +1 -1
- package/dist/services/setup-token-transport-binding.test.js +50 -17
- package/dist/services/setup-token-transport-binding.test.js.map +1 -1
- package/dist/services/smoke-lab.d.ts +1 -1
- package/dist/services/stalled-review-decisions.d.ts +1 -1
- package/dist/services/status-cards.d.ts +168 -168
- package/dist/services/tool-access-policy.d.ts +2 -2
- package/dist/services/tool-gateway.d.ts +1 -1
- package/dist/services/work-products.d.ts +19 -0
- package/dist/services/work-products.d.ts.map +1 -1
- package/dist/services/work-products.js +50 -3
- package/dist/services/work-products.js.map +1 -1
- package/dist/services/workspace-git-operation-scheduler.test.js +10 -3
- package/dist/services/workspace-git-operation-scheduler.test.js.map +1 -1
- package/dist/services/workspace-instance-cleanup.d.ts +9 -0
- package/dist/services/workspace-instance-cleanup.d.ts.map +1 -1
- package/dist/services/workspace-instance-cleanup.js +29 -3
- package/dist/services/workspace-instance-cleanup.js.map +1 -1
- package/dist/services/workspace-login-handoff-issuer.d.ts +95 -0
- package/dist/services/workspace-login-handoff-issuer.d.ts.map +1 -0
- package/dist/services/workspace-login-handoff-issuer.js +147 -0
- package/dist/services/workspace-login-handoff-issuer.js.map +1 -0
- package/dist/services/workspace-operations.d.ts +4 -1
- package/dist/services/workspace-operations.d.ts.map +1 -1
- package/dist/services/workspace-operations.js +29 -15
- package/dist/services/workspace-operations.js.map +1 -1
- package/dist/services/workspace-readiness.d.ts +56 -0
- package/dist/services/workspace-readiness.d.ts.map +1 -0
- package/dist/services/workspace-readiness.js +250 -0
- package/dist/services/workspace-readiness.js.map +1 -0
- package/dist/services/workspace-realization.d.ts.map +1 -1
- package/dist/services/workspace-realization.js +5 -33
- package/dist/services/workspace-realization.js.map +1 -1
- package/dist/services/workspace-runtime-exposure.test.js +321 -12
- package/dist/services/workspace-runtime-exposure.test.js.map +1 -1
- package/dist/services/workspace-runtime-leases.d.ts.map +1 -1
- package/dist/services/workspace-runtime-leases.js +1 -1
- package/dist/services/workspace-runtime-leases.js.map +1 -1
- package/dist/services/workspace-runtime-read-model.d.ts +8 -8
- package/dist/services/workspace-runtime-read-model.test.js +20 -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 +77 -4
- package/dist/services/workspace-runtime.d.ts.map +1 -1
- package/dist/services/workspace-runtime.js +1020 -126
- package/dist/services/workspace-runtime.js.map +1 -1
- package/dist/worktree-config.d.ts.map +1 -1
- package/dist/worktree-config.js +3 -76
- package/dist/worktree-config.js.map +1 -1
- package/dist/worktree-seed-manifest.d.ts +8 -0
- package/dist/worktree-seed-manifest.d.ts.map +1 -0
- package/dist/worktree-seed-manifest.js +47 -0
- package/dist/worktree-seed-manifest.js.map +1 -0
- package/package.json +34 -30
- package/skills/paperclip/SKILL.md +2 -0
- package/skills/paperclip/references/api-reference.md +44 -2
- package/ui-dist/assets/CompanyExport-DnEsO-St.js +4 -0
- package/ui-dist/assets/{abnfDiagram-N423BO3Z-BvgoV-u5.js → abnfDiagram-N423BO3Z-2ff8TsQ0.js} +1 -1
- package/ui-dist/assets/{arc-BInnUBUU.js → arc-B2AXsH34.js} +1 -1
- package/ui-dist/assets/architectureDiagram-T3A2C74G-BDxtKMxk.js +36 -0
- package/ui-dist/assets/{blockDiagram-VBNYF7ZC-D9kzAkLN.js → blockDiagram-VBNYF7ZC-BB8T5Mj5.js} +1 -1
- package/ui-dist/assets/{c4Diagram-5PPSVZJV-BwzsgV_0.js → c4Diagram-5PPSVZJV-lMo8qk-x.js} +1 -1
- package/ui-dist/assets/channel-DCTVZpyq.js +1 -0
- package/ui-dist/assets/{chunk-2GRJ4B5K-D2EQ9vrl.js → chunk-2GRJ4B5K-CsS7EB3G.js} +1 -1
- package/ui-dist/assets/{chunk-2Q5K7J3B-DOA_8fSd.js → chunk-2Q5K7J3B-DFyQPjoR.js} +1 -1
- package/ui-dist/assets/{chunk-5RXB4S5H-CT5ukRiT.js → chunk-5RXB4S5H-No2SHOQR.js} +1 -1
- package/ui-dist/assets/{chunk-5VM5RSS4-D2gOlkyB.js → chunk-5VM5RSS4-DdxQO7V9.js} +1 -1
- package/ui-dist/assets/{chunk-6Q2QTUOP-DUb6aG8c.js → chunk-6Q2QTUOP-gbHjh-aK.js} +1 -1
- package/ui-dist/assets/{chunk-GF5L2VYU-BPabG3Cx.js → chunk-GF5L2VYU-h-BBl6NY.js} +1 -1
- package/ui-dist/assets/{chunk-JWPE2WC7-scNfhlZz.js → chunk-JWPE2WC7-Q3pJdTz5.js} +1 -1
- package/ui-dist/assets/{chunk-KBJHAD2P-BcRAzRpq.js → chunk-KBJHAD2P-Ba8LGLSx.js} +1 -1
- package/ui-dist/assets/{chunk-RYQCIY6F-BiZ0-EGh.js → chunk-RYQCIY6F-9VcvykBo.js} +1 -1
- package/ui-dist/assets/{chunk-XXDRQBXY-lJULxFIE.js → chunk-XXDRQBXY-NVbjDH4W.js} +1 -1
- package/ui-dist/assets/classDiagram-JCYQIIEL-CzJ88u6h.js +1 -0
- package/ui-dist/assets/classDiagram-v2-OCEON4UE-CzJ88u6h.js +1 -0
- package/ui-dist/assets/cose-bilkent-JH36ORCC-Cdz4wtUh.js +1 -0
- package/ui-dist/assets/{cynefin-VYW2F7L2-B34jJY1x.js → cynefin-VYW2F7L2-MpzJkW5s.js} +1 -1
- package/ui-dist/assets/{cynefinDiagram-MW4NZA55-DQ8QK8JK.js → cynefinDiagram-MW4NZA55-_Nx8av7i.js} +1 -1
- package/ui-dist/assets/{dagre-VZM6K2ZE-B7lSKgxH.js → dagre-VZM6K2ZE-DcZTQ4Oh.js} +1 -1
- package/ui-dist/assets/{diagram-7IWD3JNH-B3hLAFGE.js → diagram-7IWD3JNH-UyLi2mee.js} +1 -1
- package/ui-dist/assets/{diagram-B4RE2ZJO-CH9Ro9e0.js → diagram-B4RE2ZJO-B6p0Ivqg.js} +1 -1
- package/ui-dist/assets/{diagram-LBJQPF4R-DdPVMii7.js → diagram-LBJQPF4R-C8u6pa97.js} +1 -1
- package/ui-dist/assets/{diagram-Q27KOJAE-f5VXswjc.js → diagram-Q27KOJAE-DbwyagW0.js} +1 -1
- package/ui-dist/assets/{diagram-UB23O5K3-DGqxixsR.js → diagram-UB23O5K3-Cn5BMEH7.js} +1 -1
- package/ui-dist/assets/{ebnfDiagram-BXEA7PRR-C-1klg_w.js → ebnfDiagram-BXEA7PRR-vE0IZma9.js} +1 -1
- package/ui-dist/assets/{erDiagram-JOGREHBK-Dt4qK4gv.js → erDiagram-JOGREHBK-3OZVIlVG.js} +1 -1
- package/ui-dist/assets/{flowDiagram-UKHOOZJN-9ZlrTuET.js → flowDiagram-UKHOOZJN-C94FiPyr.js} +1 -1
- package/ui-dist/assets/ganttDiagram-PKOTCBZU-DMVaPmF-.js +292 -0
- package/ui-dist/assets/{gitGraphDiagram-DS77QQ5N-HH2fSgad.js → gitGraphDiagram-DS77QQ5N-yeFtJ689.js} +1 -1
- package/ui-dist/assets/{index-Cm6iEYPt.js → index-B4ZF3vY8.js} +288 -224
- package/ui-dist/assets/{index-CHXG4GPL.js → index-Bi_vqkcQ.js} +1 -1
- package/ui-dist/assets/{index-Bc9g6q63.js → index-BjDGQg9-.js} +1 -1
- package/ui-dist/assets/{index-FHzrJ7iQ.js → index-BnpyUMTb.js} +1 -1
- package/ui-dist/assets/{index-C1mpWCcn.js → index-BoqQTVMA.js} +1 -1
- package/ui-dist/assets/index-Bq-Mr-4x.js +1 -0
- package/ui-dist/assets/{index-DceuCrr8.js → index-Brb2U7N4.js} +1 -1
- package/ui-dist/assets/{index-DQIrrn2L.js → index-BsBybVwH.js} +1 -1
- package/ui-dist/assets/{index-CQhaM6qd.js → index-C2iv4Wgu.js} +1 -1
- package/ui-dist/assets/{index-DV2FOgyD.js → index-CKxIu7uO.js} +1 -1
- package/ui-dist/assets/{index-DU4U1fuv.js → index-Cb4VGIwp.js} +1 -1
- package/ui-dist/assets/{index-B61ORkIb.js → index-ChpszwcO.js} +1 -1
- package/ui-dist/assets/{index-DlVBBF8o.js → index-CoQFdT8N.js} +1 -1
- package/ui-dist/assets/index-D6P8_f0W.css +1 -0
- package/ui-dist/assets/index-DKdmghUG.js +1 -0
- package/ui-dist/assets/{index-CVTL3aAL.js → index-DaBci7Bx.js} +1 -1
- package/ui-dist/assets/{index-diFs0CNC.js → index-DjYaNiXZ.js} +1 -1
- package/ui-dist/assets/{index-Bf7tyGxE.js → index-DxTBJl4h.js} +1 -1
- package/ui-dist/assets/{index-DsdVneqe.js → index-Dz3E8nn0.js} +1 -1
- package/ui-dist/assets/{index-DvFUXI-Q.js → index-J7dz_hap.js} +1 -1
- package/ui-dist/assets/{index-CLu3Tfpv.js → index-JMp2Gpnz.js} +1 -1
- package/ui-dist/assets/{index-CcRTJ93J.js → index-Kp6wavQt.js} +1 -1
- package/ui-dist/assets/{index-BvFx-4KW.js → index-LBhYZ0L4.js} +1 -1
- package/ui-dist/assets/{index-BbAhzCq8.js → index-c3C0P6l8.js} +4 -4
- package/ui-dist/assets/{index-BY5ITKmG.js → index-pBEPheTW.js} +1 -1
- package/ui-dist/assets/{infoDiagram-6WML65LV-2jai2fw-.js → infoDiagram-6WML65LV-BiL7jKLA.js} +1 -1
- package/ui-dist/assets/{ishikawaDiagram-WSZJBQD7-CUmGhmEb.js → ishikawaDiagram-WSZJBQD7-DYcQy41D.js} +1 -1
- package/ui-dist/assets/{journeyDiagram-NVQOT4AX-CGQuPDO1.js → journeyDiagram-NVQOT4AX-Bxva6JgA.js} +1 -1
- package/ui-dist/assets/{kanban-definition-27J2QSJJ-zgEPcbHl.js → kanban-definition-27J2QSJJ-B2HpN34Q.js} +1 -1
- package/ui-dist/assets/{linear-BVf5VtLS.js → linear-Dq8qSESw.js} +1 -1
- package/ui-dist/assets/{mermaid.core-D2TFkGfI.js → mermaid.core-Ikay8Cpl.js} +35 -35
- package/ui-dist/assets/{mindmap-definition-FAOFIHXS-xoAQ0Lb_.js → mindmap-definition-FAOFIHXS-C-SIdYSY.js} +1 -1
- package/ui-dist/assets/{pegDiagram-VL7TDLO6-CBR1PWLr.js → pegDiagram-VL7TDLO6-C7rIJ_13.js} +1 -1
- package/ui-dist/assets/{pieDiagram-7S7Q4E2Y-BMPnzK_e.js → pieDiagram-7S7Q4E2Y-3gx0a0ve.js} +1 -1
- package/ui-dist/assets/{quadrantDiagram-CIZ2JOQS-CPtVUPkR.js → quadrantDiagram-CIZ2JOQS-BiwM9QGv.js} +1 -1
- package/ui-dist/assets/{railroadDiagram-AXF67PYL-DC0lsZV1.js → railroadDiagram-AXF67PYL-rFS8XcFA.js} +1 -1
- package/ui-dist/assets/{requirementDiagram-LRYGKXZP-BF6k05SB.js → requirementDiagram-LRYGKXZP-CEAUDUTQ.js} +1 -1
- package/ui-dist/assets/{sankeyDiagram-W5VNT64P-CRN0ibiP.js → sankeyDiagram-W5VNT64P-B7anpjlM.js} +1 -1
- package/ui-dist/assets/{sequenceDiagram-SI44F4Z6-CQtTiPWm.js → sequenceDiagram-SI44F4Z6-CJEdJvm_.js} +1 -1
- package/ui-dist/assets/{sizeCapture-X5ZJPWSS-BdjuGZd1.js → sizeCapture-X5ZJPWSS-CU1Vm6c1.js} +1 -1
- package/ui-dist/assets/{stateDiagram-OKZ733FA-B99onxyh.js → stateDiagram-OKZ733FA-wxVV9WIi.js} +1 -1
- package/ui-dist/assets/stateDiagram-v2-UEYNNEHI-BIFLqlqR.js +1 -0
- package/ui-dist/assets/{swimlanes-SLNWSIFB-BIByPbrL.js → swimlanes-SLNWSIFB-Cd-C1Z_k.js} +2 -2
- package/ui-dist/assets/swimlanesDiagram-ULZ7WXOC-CoBROkkd.js +8 -0
- package/ui-dist/assets/{timeline-definition-Z64GVDOM-I1NgOcn9.js → timeline-definition-Z64GVDOM-SWngk4aR.js} +1 -1
- package/ui-dist/assets/{vennDiagram-T6HMQDX7-D6t2Njcl.js → vennDiagram-T6HMQDX7-DFdPUr36.js} +1 -1
- package/ui-dist/assets/{wardleyDiagram-T6FBY63Y-BiYKm9gh.js → wardleyDiagram-T6FBY63Y-C6IlrZ7t.js} +1 -1
- package/ui-dist/assets/{xychartDiagram-ELKLHX3M-BhwXKWIa.js → xychartDiagram-ELKLHX3M-BNm6hHGl.js} +1 -1
- package/ui-dist/index.html +2 -2
- package/ui-dist/assets/architectureDiagram-T3A2C74G-Dg4MziOm.js +0 -36
- package/ui-dist/assets/channel-qoSYbCn0.js +0 -1
- package/ui-dist/assets/classDiagram-JCYQIIEL-B24u1REs.js +0 -1
- package/ui-dist/assets/classDiagram-v2-OCEON4UE-B24u1REs.js +0 -1
- package/ui-dist/assets/cose-bilkent-JH36ORCC-Do8pe8JB.js +0 -1
- package/ui-dist/assets/ganttDiagram-PKOTCBZU-CE3lyvFq.js +0 -292
- package/ui-dist/assets/index-BHiUiToL.css +0 -1
- package/ui-dist/assets/index-hkanj4t6.js +0 -1
- package/ui-dist/assets/index-yRJnh4vx.js +0 -1
- package/ui-dist/assets/stateDiagram-v2-UEYNNEHI-bzFlYBZ1.js +0 -1
- package/ui-dist/assets/swimlanesDiagram-ULZ7WXOC-DgdkBnuK.js +0 -8
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { isDeepStrictEqual } from "node:util";
|
|
2
2
|
import { and, asc, desc, eq, inArray, isNotNull, isNull, ne } from "drizzle-orm";
|
|
3
|
-
import { agents, companies, documents, heartbeatRuns, issueComments, issueDocuments, issueThreadInteractions, issues, toolActionRequests, } from "@paperclipai/db";
|
|
3
|
+
import { agents, companySecretProposals, companies, documents, heartbeatRuns, issueComments, issueDocuments, issueThreadInteractions, issues, toolActionRequests, } from "@paperclipai/db";
|
|
4
4
|
import { trackInteractionCreated, trackInteractionResolved } from "@paperclipai/shared/telemetry";
|
|
5
5
|
import { acceptIssueThreadInteractionSchema, askUserQuestionsPayloadSchema, askUserQuestionsResultSchema, cancelIssueThreadInteractionSchema, createIssueThreadInteractionSchema, legacyIssueThreadInteractionResolverPolicyAlias, normalizeIssueThreadInteractionResolverPolicy, rejectIssueThreadInteractionSchema, requestCheckboxConfirmationPayloadSchema, requestCheckboxConfirmationResultSchema, requestConfirmationPayloadSchema, requestConfirmationResultSchema, requestItemVerdictsPayloadSchema, requestItemVerdictsResultSchema, suggestTasksPayloadSchema, suggestTasksResultSchema, submitIssueThreadInteractionVerdictsSchema, withdrawIssueThreadInteractionSchema, } from "@paperclipai/shared";
|
|
6
6
|
import { conflict, forbidden, notFound, unprocessable } from "../errors.js";
|
|
@@ -78,7 +78,7 @@ export function getMergeConfirmationPullRequestReferences(row) {
|
|
|
78
78
|
const payload = row.payload && typeof row.payload === "object" && !Array.isArray(row.payload)
|
|
79
79
|
? row.payload
|
|
80
80
|
: null;
|
|
81
|
-
if (!payload || payload.toolAction !== undefined)
|
|
81
|
+
if (!payload || payload.toolAction !== undefined || payload.secretProposal !== undefined)
|
|
82
82
|
return [];
|
|
83
83
|
const target = payload.target && typeof payload.target === "object" && !Array.isArray(payload.target)
|
|
84
84
|
? payload.target
|
|
@@ -129,7 +129,7 @@ export function resolveInteractionPolicy(args) {
|
|
|
129
129
|
const resolverPolicyProvenance = args.requested === undefined ? "inherited" : "explicit";
|
|
130
130
|
let effectiveResolverPolicy = requestedResolverPolicy;
|
|
131
131
|
let effectiveResolverPolicySource = "requested";
|
|
132
|
-
if (args.hasToolAction) {
|
|
132
|
+
if (args.hasToolAction || args.hasSecretProposal) {
|
|
133
133
|
effectiveResolverPolicy = "human_only";
|
|
134
134
|
effectiveResolverPolicySource = "governed_action";
|
|
135
135
|
}
|
|
@@ -167,8 +167,8 @@ function assertInteractionResolutionAllowed(current, actor) {
|
|
|
167
167
|
governedAction: current.kind === "request_confirmation"
|
|
168
168
|
&& current.payload !== null
|
|
169
169
|
&& typeof current.payload === "object"
|
|
170
|
-
&& "toolAction" in current.payload
|
|
171
|
-
|
|
170
|
+
&& (("toolAction" in current.payload && current.payload.toolAction !== undefined)
|
|
171
|
+
|| ("secretProposal" in current.payload && current.payload.secretProposal !== undefined)),
|
|
172
172
|
});
|
|
173
173
|
}
|
|
174
174
|
async function assertRequestConfirmationResolutionAllowedUnderLock(tx, issue, interaction, actor) {
|
|
@@ -488,7 +488,20 @@ function buildAdministrativeOutcomeResult(row, outcome, reason = null) {
|
|
|
488
488
|
items: interaction.result?.items ?? [],
|
|
489
489
|
};
|
|
490
490
|
}
|
|
491
|
-
return {
|
|
491
|
+
return {
|
|
492
|
+
version: 1,
|
|
493
|
+
outcome,
|
|
494
|
+
reason,
|
|
495
|
+
...(linkedSecretProposalId(row)
|
|
496
|
+
? {
|
|
497
|
+
secretProposal: {
|
|
498
|
+
version: 1,
|
|
499
|
+
status: outcome === "withdrawn" ? "withdrawn" : "expired",
|
|
500
|
+
updatedAt: new Date().toISOString(),
|
|
501
|
+
},
|
|
502
|
+
}
|
|
503
|
+
: {}),
|
|
504
|
+
};
|
|
492
505
|
}
|
|
493
506
|
// Rollback sentinel: the interaction was resolved by another actor between the
|
|
494
507
|
// pending-rows read and the conditional update, so the enclosing transaction's
|
|
@@ -516,6 +529,65 @@ async function resolveLinkedToolActionRequests(db, interaction, outcome) {
|
|
|
516
529
|
})
|
|
517
530
|
.where(and(eq(toolActionRequests.companyId, interaction.companyId), eq(toolActionRequests.interactionId, interaction.id), inArray(toolActionRequests.status, outcome.fromStatuses)));
|
|
518
531
|
}
|
|
532
|
+
function linkedSecretProposalId(interaction) {
|
|
533
|
+
if (interaction.kind !== "request_confirmation")
|
|
534
|
+
return null;
|
|
535
|
+
const payload = interaction.payload && typeof interaction.payload === "object" && !Array.isArray(interaction.payload)
|
|
536
|
+
? interaction.payload
|
|
537
|
+
: null;
|
|
538
|
+
const secretProposal = payload?.secretProposal && typeof payload.secretProposal === "object" && !Array.isArray(payload.secretProposal)
|
|
539
|
+
? payload.secretProposal
|
|
540
|
+
: null;
|
|
541
|
+
return typeof secretProposal?.proposalId === "string" ? secretProposal.proposalId : null;
|
|
542
|
+
}
|
|
543
|
+
async function lockLinkedSecretProposal(db, interaction) {
|
|
544
|
+
const proposalId = linkedSecretProposalId(interaction);
|
|
545
|
+
if (!proposalId)
|
|
546
|
+
return;
|
|
547
|
+
await db
|
|
548
|
+
.select({ id: companySecretProposals.id })
|
|
549
|
+
.from(companySecretProposals)
|
|
550
|
+
.where(and(eq(companySecretProposals.id, proposalId), eq(companySecretProposals.companyId, interaction.companyId), eq(companySecretProposals.interactionId, interaction.id)))
|
|
551
|
+
.for("update");
|
|
552
|
+
}
|
|
553
|
+
async function resolveLinkedSecretProposal(db, interaction, outcome) {
|
|
554
|
+
const proposalId = linkedSecretProposalId(interaction);
|
|
555
|
+
if (!proposalId)
|
|
556
|
+
return;
|
|
557
|
+
const [proposal] = await db
|
|
558
|
+
.update(companySecretProposals)
|
|
559
|
+
.set({
|
|
560
|
+
status: outcome.status,
|
|
561
|
+
resolvedByUserId: outcome.actor.userId ?? null,
|
|
562
|
+
resolvedAt: outcome.now,
|
|
563
|
+
resolutionReason: outcome.reason ?? null,
|
|
564
|
+
valueCiphertext: null,
|
|
565
|
+
ciphertextScrubbedAt: outcome.now,
|
|
566
|
+
updatedAt: outcome.now,
|
|
567
|
+
})
|
|
568
|
+
.where(and(eq(companySecretProposals.id, proposalId), eq(companySecretProposals.companyId, interaction.companyId), eq(companySecretProposals.interactionId, interaction.id), eq(companySecretProposals.status, "pending")))
|
|
569
|
+
.returning();
|
|
570
|
+
if (!proposal)
|
|
571
|
+
throw conflict("Linked secret proposal is no longer pending");
|
|
572
|
+
const actorType = outcome.actor.userId ? "user" : outcome.actor.agentId ? "agent" : "system";
|
|
573
|
+
const actorId = outcome.actor.userId ?? outcome.actor.agentId ?? outcome.actor.systemId ?? "system";
|
|
574
|
+
await logActivity(db, {
|
|
575
|
+
companyId: interaction.companyId,
|
|
576
|
+
actorType,
|
|
577
|
+
actorId,
|
|
578
|
+
action: `secret.proposal.${outcome.status}`,
|
|
579
|
+
entityType: "company_secret_proposal",
|
|
580
|
+
entityId: proposal.id,
|
|
581
|
+
agentId: proposal.proposedByAgentId,
|
|
582
|
+
runId: proposal.originRunId,
|
|
583
|
+
details: {
|
|
584
|
+
ciphertextScrubbed: true,
|
|
585
|
+
issueId: proposal.originIssueId,
|
|
586
|
+
interactionId: interaction.id,
|
|
587
|
+
reason: outcome.reason ?? null,
|
|
588
|
+
},
|
|
589
|
+
});
|
|
590
|
+
}
|
|
519
591
|
function resolveActorKind(interaction) {
|
|
520
592
|
if (interaction.resolvedByAgentId)
|
|
521
593
|
return "agent";
|
|
@@ -1066,9 +1138,11 @@ export function issueThreadInteractionService(db, opts = {}) {
|
|
|
1066
1138
|
throw interactionTerminalError({ status: expired.status, result: expired.result });
|
|
1067
1139
|
const now = new Date();
|
|
1068
1140
|
const result = await db.transaction(async (tx) => {
|
|
1069
|
-
//
|
|
1070
|
-
//
|
|
1071
|
-
//
|
|
1141
|
+
// Policy mutations and review transitions use the same issue-row lock,
|
|
1142
|
+
// so the authoritative review policy and requester are stable through
|
|
1143
|
+
// the verdict write. Terminal issue transitions also lock the issue
|
|
1144
|
+
// before expiring linked proposals, so keep issue -> proposal ->
|
|
1145
|
+
// interaction as the shared lifecycle order.
|
|
1072
1146
|
const issueContext = await tx
|
|
1073
1147
|
.select({
|
|
1074
1148
|
id: issues.id,
|
|
@@ -1087,6 +1161,7 @@ export function issueThreadInteractionService(db, opts = {}) {
|
|
|
1087
1161
|
if (!issueContext || issueContext.companyId !== args.issue.companyId) {
|
|
1088
1162
|
throw notFound("Issue not found");
|
|
1089
1163
|
}
|
|
1164
|
+
await lockLinkedSecretProposal(tx, args.current);
|
|
1090
1165
|
const lockedCurrent = await tx
|
|
1091
1166
|
.select()
|
|
1092
1167
|
.from(issueThreadInteractions)
|
|
@@ -1216,6 +1291,10 @@ export function issueThreadInteractionService(db, opts = {}) {
|
|
|
1216
1291
|
if (!issueContext || issueContext.companyId !== args.issue.companyId) {
|
|
1217
1292
|
throw notFound("Issue not found");
|
|
1218
1293
|
}
|
|
1294
|
+
// Terminal issue transitions expire linked proposals while holding this
|
|
1295
|
+
// issue row. Match their issue -> proposal -> interaction order so a
|
|
1296
|
+
// close/cancel race cannot invert the first two locks.
|
|
1297
|
+
await lockLinkedSecretProposal(tx, args.current);
|
|
1219
1298
|
const lockedCurrent = await tx
|
|
1220
1299
|
.select()
|
|
1221
1300
|
.from(issueThreadInteractions)
|
|
@@ -1231,6 +1310,12 @@ export function issueThreadInteractionService(db, opts = {}) {
|
|
|
1231
1310
|
throw issueThreadInteractionResolutionError(409, "interaction_already_resolved", "Interaction has already been resolved");
|
|
1232
1311
|
}
|
|
1233
1312
|
await assertRequestConfirmationResolutionAllowedUnderLock(tx, issueContext, lockedCurrent, args.actor);
|
|
1313
|
+
await resolveLinkedSecretProposal(tx, lockedCurrent, {
|
|
1314
|
+
status: "rejected",
|
|
1315
|
+
actor: args.actor,
|
|
1316
|
+
reason: reason || null,
|
|
1317
|
+
now,
|
|
1318
|
+
});
|
|
1234
1319
|
const [resolved] = await tx
|
|
1235
1320
|
.update(issueThreadInteractions)
|
|
1236
1321
|
.set({
|
|
@@ -1239,6 +1324,9 @@ export function issueThreadInteractionService(db, opts = {}) {
|
|
|
1239
1324
|
version: 1,
|
|
1240
1325
|
outcome: "rejected",
|
|
1241
1326
|
reason: reason || null,
|
|
1327
|
+
...(linkedSecretProposalId(lockedCurrent)
|
|
1328
|
+
? { secretProposal: { version: 1, status: "rejected", updatedAt: now.toISOString() } }
|
|
1329
|
+
: {}),
|
|
1242
1330
|
},
|
|
1243
1331
|
resolvedByAgentId: args.actor.agentId ?? null,
|
|
1244
1332
|
resolvedByRunId: args.actor.runId ?? null,
|
|
@@ -1407,6 +1495,109 @@ export function issueThreadInteractionService(db, opts = {}) {
|
|
|
1407
1495
|
.then((rows) => rows[0] ?? null);
|
|
1408
1496
|
return row ? hydrateInteraction(row) : null;
|
|
1409
1497
|
},
|
|
1498
|
+
recordSecretProposalExecutionResult: async (issue, interactionId, proposalId, execution) => {
|
|
1499
|
+
const updated = await db.transaction(async (tx) => {
|
|
1500
|
+
// Verdict and terminal-transition paths lock issue -> proposal ->
|
|
1501
|
+
// interaction. Take the same order before recording the receipt so a
|
|
1502
|
+
// concurrent rejection or issue close cannot deadlock here.
|
|
1503
|
+
const lockedIssue = await tx
|
|
1504
|
+
.select({ id: issues.id })
|
|
1505
|
+
.from(issues)
|
|
1506
|
+
.where(and(eq(issues.id, issue.id), eq(issues.companyId, issue.companyId)))
|
|
1507
|
+
.for("update")
|
|
1508
|
+
.then((rows) => rows[0] ?? null);
|
|
1509
|
+
if (!lockedIssue)
|
|
1510
|
+
throw notFound("Issue not found");
|
|
1511
|
+
const proposal = await tx
|
|
1512
|
+
.select()
|
|
1513
|
+
.from(companySecretProposals)
|
|
1514
|
+
.where(and(eq(companySecretProposals.id, proposalId), eq(companySecretProposals.companyId, issue.companyId)))
|
|
1515
|
+
.for("update")
|
|
1516
|
+
.then((rows) => rows[0] ?? null);
|
|
1517
|
+
const current = await tx
|
|
1518
|
+
.select()
|
|
1519
|
+
.from(issueThreadInteractions)
|
|
1520
|
+
.where(eq(issueThreadInteractions.id, interactionId))
|
|
1521
|
+
.for("update")
|
|
1522
|
+
.then((rows) => rows[0] ?? null);
|
|
1523
|
+
if (!current || current.companyId !== issue.companyId || current.issueId !== issue.id) {
|
|
1524
|
+
throw notFound("Interaction not found");
|
|
1525
|
+
}
|
|
1526
|
+
if (!proposal
|
|
1527
|
+
|| proposal.interactionId !== interactionId
|
|
1528
|
+
|| current.status !== "accepted"
|
|
1529
|
+
|| linkedSecretProposalId(current) !== proposalId) {
|
|
1530
|
+
throw conflict("Secret proposal interaction is not awaiting an execution result");
|
|
1531
|
+
}
|
|
1532
|
+
const now = new Date();
|
|
1533
|
+
const payload = current.payload && typeof current.payload === "object" && !Array.isArray(current.payload)
|
|
1534
|
+
? current.payload
|
|
1535
|
+
: {};
|
|
1536
|
+
const secretProposalPayload = payload.secretProposal && typeof payload.secretProposal === "object"
|
|
1537
|
+
&& !Array.isArray(payload.secretProposal)
|
|
1538
|
+
? payload.secretProposal
|
|
1539
|
+
: {};
|
|
1540
|
+
const proposalAlreadyExecuted = proposal.status === "approved"
|
|
1541
|
+
&& proposal.appliedBindingConfigPath === secretProposalPayload.configPath;
|
|
1542
|
+
const executionStatus = proposalAlreadyExecuted ? "executed" : execution.status;
|
|
1543
|
+
if (executionStatus === "failed" && proposal.status === "pending") {
|
|
1544
|
+
const resolutionReason = `Interaction acceptance failed: ${execution.errorCode ?? "secret_proposal_execution_failed"}`;
|
|
1545
|
+
await tx
|
|
1546
|
+
.update(companySecretProposals)
|
|
1547
|
+
.set({
|
|
1548
|
+
status: "rejected",
|
|
1549
|
+
resolvedByUserId: current.resolvedByUserId ?? null,
|
|
1550
|
+
resolvedAt: now,
|
|
1551
|
+
resolutionReason,
|
|
1552
|
+
valueCiphertext: null,
|
|
1553
|
+
ciphertextScrubbedAt: now,
|
|
1554
|
+
updatedAt: now,
|
|
1555
|
+
})
|
|
1556
|
+
.where(and(eq(companySecretProposals.id, proposal.id), eq(companySecretProposals.status, "pending")));
|
|
1557
|
+
await logActivity(tx, {
|
|
1558
|
+
companyId: issue.companyId,
|
|
1559
|
+
actorType: current.resolvedByUserId ? "user" : "system",
|
|
1560
|
+
actorId: current.resolvedByUserId ?? "system",
|
|
1561
|
+
action: "secret.proposal.rejected",
|
|
1562
|
+
entityType: "company_secret_proposal",
|
|
1563
|
+
entityId: proposal.id,
|
|
1564
|
+
agentId: proposal.proposedByAgentId,
|
|
1565
|
+
runId: proposal.originRunId,
|
|
1566
|
+
details: {
|
|
1567
|
+
ciphertextScrubbed: true,
|
|
1568
|
+
issueId: proposal.originIssueId,
|
|
1569
|
+
interactionId: current.id,
|
|
1570
|
+
reason: resolutionReason,
|
|
1571
|
+
executionFailed: true,
|
|
1572
|
+
},
|
|
1573
|
+
});
|
|
1574
|
+
}
|
|
1575
|
+
const result = current.result && typeof current.result === "object" && !Array.isArray(current.result)
|
|
1576
|
+
? current.result
|
|
1577
|
+
: {};
|
|
1578
|
+
const [row] = await tx
|
|
1579
|
+
.update(issueThreadInteractions)
|
|
1580
|
+
.set({
|
|
1581
|
+
result: {
|
|
1582
|
+
...result,
|
|
1583
|
+
version: 1,
|
|
1584
|
+
outcome: "accepted",
|
|
1585
|
+
secretProposal: {
|
|
1586
|
+
version: 1,
|
|
1587
|
+
status: executionStatus,
|
|
1588
|
+
errorCode: executionStatus === "failed" ? execution.errorCode ?? null : null,
|
|
1589
|
+
updatedAt: now.toISOString(),
|
|
1590
|
+
},
|
|
1591
|
+
},
|
|
1592
|
+
updatedAt: now,
|
|
1593
|
+
})
|
|
1594
|
+
.where(eq(issueThreadInteractions.id, current.id))
|
|
1595
|
+
.returning();
|
|
1596
|
+
await touchIssue(tx, issue.id);
|
|
1597
|
+
return row;
|
|
1598
|
+
});
|
|
1599
|
+
return hydrateInteraction(updated);
|
|
1600
|
+
},
|
|
1410
1601
|
cancelPendingForDeletedAddressee: async (companyId, addresseeAgentId) => {
|
|
1411
1602
|
const rows = await db
|
|
1412
1603
|
.select()
|
|
@@ -1511,6 +1702,7 @@ export function issueThreadInteractionService(db, opts = {}) {
|
|
|
1511
1702
|
requested: data.resolverPolicy,
|
|
1512
1703
|
governance,
|
|
1513
1704
|
hasToolAction: data.kind === "request_confirmation" && data.payload.toolAction !== undefined,
|
|
1705
|
+
hasSecretProposal: data.kind === "request_confirmation" && data.payload.secretProposal !== undefined,
|
|
1514
1706
|
});
|
|
1515
1707
|
const normalizedData = { ...data, resolverPolicy: policy.requestedResolverPolicy };
|
|
1516
1708
|
if (normalizedData.addresseeAgentId) {
|
|
@@ -1520,6 +1712,9 @@ export function issueThreadInteractionService(db, opts = {}) {
|
|
|
1520
1712
|
if (normalizedData.kind === "request_confirmation" && normalizedData.payload.toolAction !== undefined) {
|
|
1521
1713
|
throw unprocessable("Tool-action confirmations cannot be addressed to agents");
|
|
1522
1714
|
}
|
|
1715
|
+
if (normalizedData.kind === "request_confirmation" && normalizedData.payload.secretProposal !== undefined) {
|
|
1716
|
+
throw unprocessable("Secret-proposal confirmations cannot be addressed to agents");
|
|
1717
|
+
}
|
|
1523
1718
|
const addressee = await db
|
|
1524
1719
|
.select({
|
|
1525
1720
|
id: agents.id,
|
|
@@ -1644,7 +1839,10 @@ export function issueThreadInteractionService(db, opts = {}) {
|
|
|
1644
1839
|
// question cards that agents never withdrew). Each kind keeps its own
|
|
1645
1840
|
// result shape. Scoped strictly to the same agent + issue + kind, so
|
|
1646
1841
|
// other agents' or other kinds' pending cards are untouched.
|
|
1647
|
-
const canSupersedeSiblingCards = data.kind === "request_confirmation"
|
|
1842
|
+
const canSupersedeSiblingCards = (data.kind === "request_confirmation"
|
|
1843
|
+
&& data.payload.toolAction === undefined
|
|
1844
|
+
&& data.payload.secretProposal === undefined)
|
|
1845
|
+
|| data.kind === "ask_user_questions";
|
|
1648
1846
|
if (!actor.agentId || !canSupersedeSiblingCards) {
|
|
1649
1847
|
return { row, supersededRows: [] };
|
|
1650
1848
|
}
|
|
@@ -2281,6 +2479,12 @@ export function issueThreadInteractionService(db, opts = {}) {
|
|
|
2281
2479
|
actor,
|
|
2282
2480
|
now,
|
|
2283
2481
|
});
|
|
2482
|
+
await resolveLinkedSecretProposal(tx, row, {
|
|
2483
|
+
status: "expired",
|
|
2484
|
+
actor,
|
|
2485
|
+
reason: "Issue closed before the secret proposal was resolved",
|
|
2486
|
+
now,
|
|
2487
|
+
});
|
|
2284
2488
|
const [resolved] = await tx
|
|
2285
2489
|
.update(issueThreadInteractions)
|
|
2286
2490
|
.set({
|
|
@@ -2340,6 +2544,12 @@ export function issueThreadInteractionService(db, opts = {}) {
|
|
|
2340
2544
|
actor,
|
|
2341
2545
|
now,
|
|
2342
2546
|
});
|
|
2547
|
+
await resolveLinkedSecretProposal(tx, current, {
|
|
2548
|
+
status: "withdrawn",
|
|
2549
|
+
actor,
|
|
2550
|
+
reason,
|
|
2551
|
+
now,
|
|
2552
|
+
});
|
|
2343
2553
|
if (current.kind === "request_confirmation") {
|
|
2344
2554
|
const active = await tx
|
|
2345
2555
|
.select({ id: toolActionRequests.id })
|