@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
|
@@ -0,0 +1,196 @@
|
|
|
1
|
+
import { isDeepStrictEqual } from "node:util";
|
|
2
|
+
import { and, eq } from "drizzle-orm";
|
|
3
|
+
import { assets, documentRevisions, documents, issueAttachments, issueDocuments } from "@paperclipai/db";
|
|
4
|
+
import { MARKDOWN_REVIEW_DOCUMENT_MAX_BYTES, artifactReviewDocumentKey, getAttachmentArtifactWorkProductMetadata, isMarkdownAttachmentContent, } from "@paperclipai/shared";
|
|
5
|
+
import { HttpError, conflict, notFound, payloadTooLarge, unprocessable, unsupportedMediaType, } from "../errors.js";
|
|
6
|
+
import { documentAnnotationService } from "./document-annotations.js";
|
|
7
|
+
import { documentService, issueDocumentSelect, mapIssueDocumentRow } from "./documents.js";
|
|
8
|
+
/**
|
|
9
|
+
* Materializes the review IssueDocument for an eligible Markdown
|
|
10
|
+
* attachment-backed work product under the deterministic
|
|
11
|
+
* `artifact-review-<workProductId>` key. The operation is idempotent: repeated
|
|
12
|
+
* calls return the existing document and only write a new revision when the
|
|
13
|
+
* review content or its work-product provenance changed.
|
|
14
|
+
*/
|
|
15
|
+
export function artifactReviewDocumentService(db, storage) {
|
|
16
|
+
const documentsSvc = documentService(db);
|
|
17
|
+
const annotationsSvc = documentAnnotationService(db);
|
|
18
|
+
const getExistingByKey = async (issueId, key) => {
|
|
19
|
+
const document = await db
|
|
20
|
+
.select(issueDocumentSelect)
|
|
21
|
+
.from(issueDocuments)
|
|
22
|
+
.innerJoin(documents, eq(issueDocuments.documentId, documents.id))
|
|
23
|
+
.where(and(eq(issueDocuments.issueId, issueId), eq(issueDocuments.key, key)))
|
|
24
|
+
.then((rows) => (rows[0] ? mapIssueDocumentRow(rows[0], true) : null));
|
|
25
|
+
if (!document)
|
|
26
|
+
return null;
|
|
27
|
+
const latestRevision = document.latestRevisionId
|
|
28
|
+
? await db
|
|
29
|
+
.select({
|
|
30
|
+
createdByAgentId: documentRevisions.createdByAgentId,
|
|
31
|
+
createdByUserId: documentRevisions.createdByUserId,
|
|
32
|
+
createdByRunId: documentRevisions.createdByRunId,
|
|
33
|
+
})
|
|
34
|
+
.from(documentRevisions)
|
|
35
|
+
.where(and(eq(documentRevisions.id, document.latestRevisionId), eq(documentRevisions.documentId, document.id), eq(documentRevisions.companyId, document.companyId)))
|
|
36
|
+
.then((rows) => rows[0] ?? null)
|
|
37
|
+
: null;
|
|
38
|
+
return { document, latestRevision };
|
|
39
|
+
};
|
|
40
|
+
const readMarkdownAttachmentBody = async (issue, metadata) => {
|
|
41
|
+
const attachment = await db
|
|
42
|
+
.select({
|
|
43
|
+
id: issueAttachments.id,
|
|
44
|
+
companyId: issueAttachments.companyId,
|
|
45
|
+
issueId: issueAttachments.issueId,
|
|
46
|
+
objectKey: assets.objectKey,
|
|
47
|
+
contentType: assets.contentType,
|
|
48
|
+
byteSize: assets.byteSize,
|
|
49
|
+
originalFilename: assets.originalFilename,
|
|
50
|
+
createdByAgentId: assets.createdByAgentId,
|
|
51
|
+
createdByUserId: assets.createdByUserId,
|
|
52
|
+
})
|
|
53
|
+
.from(issueAttachments)
|
|
54
|
+
.innerJoin(assets, eq(issueAttachments.assetId, assets.id))
|
|
55
|
+
.where(eq(issueAttachments.id, metadata.attachmentId))
|
|
56
|
+
.then((rows) => rows[0] ?? null);
|
|
57
|
+
// Unknown and cross-scope attachment ids are deliberately
|
|
58
|
+
// indistinguishable: canonical metadata must reference an attachment on
|
|
59
|
+
// the same issue and company.
|
|
60
|
+
if (!attachment || attachment.companyId !== issue.companyId || attachment.issueId !== issue.id) {
|
|
61
|
+
throw unprocessable("Work product attachment must reference an attachment on the same issue", {
|
|
62
|
+
code: "invalid_attachment_artifact_metadata",
|
|
63
|
+
attachmentId: metadata.attachmentId,
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
if (!isMarkdownAttachmentContent(attachment)) {
|
|
67
|
+
throw unsupportedMediaType("Work product attachment is not Markdown", {
|
|
68
|
+
code: "unsupported_review_document_content_type",
|
|
69
|
+
contentType: attachment.contentType,
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
if (attachment.byteSize > MARKDOWN_REVIEW_DOCUMENT_MAX_BYTES) {
|
|
73
|
+
throw payloadTooLarge("Markdown attachment exceeds the review document size limit", {
|
|
74
|
+
code: "review_document_too_large",
|
|
75
|
+
byteSize: attachment.byteSize,
|
|
76
|
+
maxBytes: MARKDOWN_REVIEW_DOCUMENT_MAX_BYTES,
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
const object = await storage.getObject(attachment.companyId, attachment.objectKey);
|
|
80
|
+
const chunks = [];
|
|
81
|
+
let total = 0;
|
|
82
|
+
for await (const chunk of object.stream) {
|
|
83
|
+
const buffer = Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk);
|
|
84
|
+
total += buffer.length;
|
|
85
|
+
// Defense in depth: enforce the cap during streaming too, so a
|
|
86
|
+
// metadata/object size mismatch can never exceed the limit.
|
|
87
|
+
if (total > MARKDOWN_REVIEW_DOCUMENT_MAX_BYTES) {
|
|
88
|
+
object.stream.destroy();
|
|
89
|
+
throw payloadTooLarge("Markdown attachment exceeds the review document size limit", {
|
|
90
|
+
code: "review_document_too_large",
|
|
91
|
+
maxBytes: MARKDOWN_REVIEW_DOCUMENT_MAX_BYTES,
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
chunks.push(buffer);
|
|
95
|
+
}
|
|
96
|
+
let body;
|
|
97
|
+
try {
|
|
98
|
+
body = new TextDecoder("utf-8", { fatal: true }).decode(Buffer.concat(chunks));
|
|
99
|
+
}
|
|
100
|
+
catch {
|
|
101
|
+
throw unprocessable("Markdown attachment is not valid UTF-8", {
|
|
102
|
+
code: "invalid_review_document_encoding",
|
|
103
|
+
attachmentId: attachment.id,
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
return { attachment, body };
|
|
107
|
+
};
|
|
108
|
+
return {
|
|
109
|
+
ensureForWorkProduct: async (input) => {
|
|
110
|
+
const { issue, workProduct } = input;
|
|
111
|
+
if (workProduct.issueId !== issue.id || workProduct.companyId !== issue.companyId) {
|
|
112
|
+
throw notFound("Work product not found");
|
|
113
|
+
}
|
|
114
|
+
const metadata = getAttachmentArtifactWorkProductMetadata(workProduct);
|
|
115
|
+
if (!metadata) {
|
|
116
|
+
throw unprocessable("Work product is not an attachment-backed Paperclip artifact", {
|
|
117
|
+
code: "not_attachment_backed_artifact",
|
|
118
|
+
workProductId: workProduct.id,
|
|
119
|
+
});
|
|
120
|
+
}
|
|
121
|
+
if (!isMarkdownAttachmentContent(metadata)) {
|
|
122
|
+
throw unsupportedMediaType("Work product attachment is not Markdown", {
|
|
123
|
+
code: "unsupported_review_document_content_type",
|
|
124
|
+
contentType: metadata.contentType,
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
const { attachment, body } = await readMarkdownAttachmentBody(issue, metadata);
|
|
128
|
+
const key = artifactReviewDocumentKey(workProduct.id);
|
|
129
|
+
// The review document represents agent-authored attachment content, so
|
|
130
|
+
// attribution promotes the attachment/work-product provenance instead of
|
|
131
|
+
// the actor who triggered materialization.
|
|
132
|
+
const attribution = {
|
|
133
|
+
createdByAgentId: attachment.createdByAgentId ?? null,
|
|
134
|
+
createdByUserId: attachment.createdByUserId ?? null,
|
|
135
|
+
createdByRunId: workProduct.createdByRunId ?? null,
|
|
136
|
+
sourceTrust: workProduct.sourceTrust ?? null,
|
|
137
|
+
};
|
|
138
|
+
for (let attempt = 0; attempt < 2; attempt += 1) {
|
|
139
|
+
const existingState = await getExistingByKey(issue.id, key);
|
|
140
|
+
const existing = existingState?.document ?? null;
|
|
141
|
+
const latestRevision = existingState?.latestRevision ?? null;
|
|
142
|
+
const reviewStateMatches = existing &&
|
|
143
|
+
existing.body === body &&
|
|
144
|
+
existing.title === (workProduct.title ?? null) &&
|
|
145
|
+
existing.format === "markdown" &&
|
|
146
|
+
latestRevision?.createdByAgentId === attribution.createdByAgentId &&
|
|
147
|
+
latestRevision.createdByUserId === attribution.createdByUserId &&
|
|
148
|
+
latestRevision.createdByRunId === attribution.createdByRunId &&
|
|
149
|
+
isDeepStrictEqual(existing.sourceTrust ?? null, attribution.sourceTrust);
|
|
150
|
+
if (reviewStateMatches) {
|
|
151
|
+
return { document: existing, created: false, revisionChanged: false, remappedAnnotations: [] };
|
|
152
|
+
}
|
|
153
|
+
try {
|
|
154
|
+
const result = await documentsSvc.upsertIssueDocument({
|
|
155
|
+
issueId: issue.id,
|
|
156
|
+
key,
|
|
157
|
+
title: workProduct.title ?? null,
|
|
158
|
+
format: "markdown",
|
|
159
|
+
body,
|
|
160
|
+
changeSummary: existing
|
|
161
|
+
? "Synced from the work product attachment"
|
|
162
|
+
: "Materialized from the Markdown work product attachment",
|
|
163
|
+
baseRevisionId: existing?.latestRevisionId ?? null,
|
|
164
|
+
...attribution,
|
|
165
|
+
lockedDocumentStrategy: "conflict",
|
|
166
|
+
});
|
|
167
|
+
const remappedAnnotations = result.created
|
|
168
|
+
? []
|
|
169
|
+
: await annotationsSvc.remapOpenThreadsForDocument({
|
|
170
|
+
issueId: issue.id,
|
|
171
|
+
key: result.document.key,
|
|
172
|
+
documentId: result.document.id,
|
|
173
|
+
nextRevisionId: result.document.latestRevisionId,
|
|
174
|
+
nextRevisionNumber: result.document.latestRevisionNumber,
|
|
175
|
+
nextBody: result.document.body,
|
|
176
|
+
});
|
|
177
|
+
return {
|
|
178
|
+
document: result.document,
|
|
179
|
+
created: result.created,
|
|
180
|
+
revisionChanged: true,
|
|
181
|
+
remappedAnnotations,
|
|
182
|
+
};
|
|
183
|
+
}
|
|
184
|
+
catch (error) {
|
|
185
|
+
// A concurrent materialization or document write raced this one.
|
|
186
|
+
// Re-read once so identical content converges on the winner.
|
|
187
|
+
if (error instanceof HttpError && error.status === 409 && attempt === 0)
|
|
188
|
+
continue;
|
|
189
|
+
throw error;
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
throw conflict("Concurrent review-document updates did not converge", { key });
|
|
193
|
+
},
|
|
194
|
+
};
|
|
195
|
+
}
|
|
196
|
+
//# sourceMappingURL=artifact-review-documents.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"artifact-review-documents.js","sourceRoot":"","sources":["../../src/services/artifact-review-documents.ts"],"names":[],"mappings":"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"}
|
|
@@ -9,10 +9,10 @@ export declare function assetService(db: Db): {
|
|
|
9
9
|
createdAt: Date;
|
|
10
10
|
updatedAt: Date;
|
|
11
11
|
provider: string;
|
|
12
|
-
sha256: string;
|
|
13
12
|
contentType: string;
|
|
14
13
|
byteSize: number;
|
|
15
14
|
originalFilename: string | null;
|
|
15
|
+
sha256: string;
|
|
16
16
|
objectKey: string;
|
|
17
17
|
}>;
|
|
18
18
|
getById: (id: string) => Promise<{
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import type { Environment, EnvironmentLease } from "@paperclipai/shared";
|
|
2
|
+
import type { EnvironmentRuntimeService } from "./environment-runtime.js";
|
|
3
|
+
/**
|
|
4
|
+
* The bounded size for the credential payload. A real subscription `auth.json` is
|
|
5
|
+
* a few kilobytes. The read rejects a larger payload before it returns any bytes.
|
|
6
|
+
* The value matches the adapter export bound.
|
|
7
|
+
*/
|
|
8
|
+
export declare const MAX_AUTH_JSON_BYTES: number;
|
|
9
|
+
/** The fixed credential file name inside the session home. No caller controls it. */
|
|
10
|
+
export declare const AUTH_JSON_FILE_NAME = "auth.json";
|
|
11
|
+
/**
|
|
12
|
+
* The fixed, non-secret error the read returns on every failed path. The message
|
|
13
|
+
* carries no pathname, no byte, and no other secret detail.
|
|
14
|
+
*/
|
|
15
|
+
export declare const DEVICE_LOGIN_AUTH_READ_ERROR = "device login failed: the sandbox credential read errored.";
|
|
16
|
+
/**
|
|
17
|
+
* The fixed helper program. The server reads the helper from its own script file
|
|
18
|
+
* and runs it in the sandbox as `node -e <script> <sessionHome> <maxBytes>
|
|
19
|
+
* [<expectedUid>]`. The sandbox already runs node for the Paperclip bridge, so the
|
|
20
|
+
* helper needs no extra runtime. The helper source lives in
|
|
21
|
+
* `scripts/codex-auth-read.cjs`, so no large script stays as a string literal in
|
|
22
|
+
* this module.
|
|
23
|
+
*
|
|
24
|
+
* The helper opens the filesystem root, then opens each session-home path
|
|
25
|
+
* component in turn with a no-follow, directory-only open, relative to the
|
|
26
|
+
* previous directory descriptor, so a symlink at any component fails. It opens
|
|
27
|
+
* `auth.json` relative to the final directory descriptor with `O_NOFOLLOW`, runs
|
|
28
|
+
* `fstat` on the opened descriptor, and requires a regular file, the expected
|
|
29
|
+
* owner, exact mode `0600`, and a size at or below the bound. It reads only from
|
|
30
|
+
* that same descriptor. The `expectedUid` argument is optional; the server omits
|
|
31
|
+
* it, so the helper uses the login user's own id.
|
|
32
|
+
*/
|
|
33
|
+
export declare const DEVICE_LOGIN_AUTH_READ_SCRIPT: string;
|
|
34
|
+
/**
|
|
35
|
+
* Decodes the helper stdout to the credential bytes. It accepts only strict
|
|
36
|
+
* base64 with correct padding, so a truncated or corrupt line returns the fixed
|
|
37
|
+
* error instead of partial bytes. It rejects a decoded payload over the bound.
|
|
38
|
+
*/
|
|
39
|
+
export declare function decodeAuthReadOutput(stdout: string): Buffer;
|
|
40
|
+
/** The environment-runtime surface the descriptor-bound read needs. */
|
|
41
|
+
export interface DescriptorBoundAuthReadDeps {
|
|
42
|
+
environmentRuntime: Pick<EnvironmentRuntimeService, "execute">;
|
|
43
|
+
environment: Environment;
|
|
44
|
+
lease: EnvironmentLease;
|
|
45
|
+
/** The verified, server-controlled session home. */
|
|
46
|
+
sessionHome: string;
|
|
47
|
+
/** The host timeout for the read command. */
|
|
48
|
+
timeoutMs: number;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Runs the descriptor-bound credential read once and returns the bytes. It
|
|
52
|
+
* revalidates the session-home shape, then runs the fixed helper as a one-shot,
|
|
53
|
+
* non-session command. It converts a non-zero exit, an empty or malformed stdout,
|
|
54
|
+
* or an oversize payload to the one fixed, non-secret error. It reads no bytes on
|
|
55
|
+
* any failed path.
|
|
56
|
+
*/
|
|
57
|
+
export declare function runDescriptorBoundAuthRead(deps: DescriptorBoundAuthReadDeps): Promise<Buffer>;
|
|
58
|
+
//# sourceMappingURL=codex-device-login-credential-read.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codex-device-login-credential-read.d.ts","sourceRoot":"","sources":["../../src/services/codex-device-login-credential-read.ts"],"names":[],"mappings":"AAkCA,OAAO,KAAK,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACzE,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,0BAA0B,CAAC;AAG1E;;;;GAIG;AACH,eAAO,MAAM,mBAAmB,QAAY,CAAC;AAE7C,qFAAqF;AACrF,eAAO,MAAM,mBAAmB,cAAc,CAAC;AAE/C;;;GAGG;AACH,eAAO,MAAM,4BAA4B,8DACoB,CAAC;AAE9D;;;;;;;;;;;;;;;;GAgBG;AACH,eAAO,MAAM,6BAA6B,QAGzC,CAAC;AAOF;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAU3D;AAED,uEAAuE;AACvE,MAAM,WAAW,2BAA2B;IAC1C,kBAAkB,EAAE,IAAI,CAAC,yBAAyB,EAAE,SAAS,CAAC,CAAC;IAC/D,WAAW,EAAE,WAAW,CAAC;IACzB,KAAK,EAAE,gBAAgB,CAAC;IACxB,oDAAoD;IACpD,WAAW,EAAE,MAAM,CAAC;IACpB,6CAA6C;IAC7C,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;;;;;GAMG;AACH,wBAAsB,0BAA0B,CAC9C,IAAI,EAAE,2BAA2B,GAChC,OAAO,CAAC,MAAM,CAAC,CAwBjB"}
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
// The descriptor-bound credential read for the Codex device login.
|
|
2
|
+
//
|
|
3
|
+
// The login pseudo-terminal (PTY) runs `codex login --device-auth` and writes
|
|
4
|
+
// `auth.json` into the server-controlled session home. The service reads that
|
|
5
|
+
// file after the command exits with code zero. The read must close the
|
|
6
|
+
// time-of-check-to-time-of-use (TOCTOU) window: a pathname check and a later
|
|
7
|
+
// `cat` on the same pathname let an attacker swap the file between the two steps.
|
|
8
|
+
//
|
|
9
|
+
// This module runs one fixed, server-controlled operation inside the sandbox
|
|
10
|
+
// instead. The operation opens the filesystem root, then walks each path
|
|
11
|
+
// component of the session home with no symlink follow. `O_NOFOLLOW` protects
|
|
12
|
+
// only the final component of one open, so the operation opens every intermediate
|
|
13
|
+
// component with a separate no-follow open. A symlink at any ancestor fails the
|
|
14
|
+
// walk. The operation then opens `auth.json` relative to the final directory
|
|
15
|
+
// descriptor without a symlink follow, runs `fstat` on the opened descriptor, and
|
|
16
|
+
// reads only from that same descriptor. The `fstat` check requires a regular
|
|
17
|
+
// file, login-user ownership, exact mode `0600`, and a bounded size. A missing
|
|
18
|
+
// file, a symlink at any component, a non-regular file, a wrong owner, a wrong
|
|
19
|
+
// mode, or an oversize file returns one fixed, non-secret error.
|
|
20
|
+
//
|
|
21
|
+
// The provider exposes no descriptor application programming interface (API), so
|
|
22
|
+
// this module runs a fixed helper program in the sandbox through the environment
|
|
23
|
+
// runtime `execute` seam. The helper is node, because the sandbox already runs
|
|
24
|
+
// node for the Paperclip bridge. The helper never re-opens the pathname after the
|
|
25
|
+
// check: the `fstat` and the read bind to the one opened descriptor.
|
|
26
|
+
//
|
|
27
|
+
// Security: the helper prints only the base64 of the credential bytes on the
|
|
28
|
+
// fully validated success path. It prints one fixed error token on every failed
|
|
29
|
+
// path. It never prints the pathname, the raw bytes, or any other detail. This
|
|
30
|
+
// module converts any failure to one fixed, non-secret error and reads no bytes.
|
|
31
|
+
import { readFileSync } from "node:fs";
|
|
32
|
+
import { fileURLToPath } from "node:url";
|
|
33
|
+
import { validateLoginSessionHome } from "./login-command.js";
|
|
34
|
+
/**
|
|
35
|
+
* The bounded size for the credential payload. A real subscription `auth.json` is
|
|
36
|
+
* a few kilobytes. The read rejects a larger payload before it returns any bytes.
|
|
37
|
+
* The value matches the adapter export bound.
|
|
38
|
+
*/
|
|
39
|
+
export const MAX_AUTH_JSON_BYTES = 64 * 1024;
|
|
40
|
+
/** The fixed credential file name inside the session home. No caller controls it. */
|
|
41
|
+
export const AUTH_JSON_FILE_NAME = "auth.json";
|
|
42
|
+
/**
|
|
43
|
+
* The fixed, non-secret error the read returns on every failed path. The message
|
|
44
|
+
* carries no pathname, no byte, and no other secret detail.
|
|
45
|
+
*/
|
|
46
|
+
export const DEVICE_LOGIN_AUTH_READ_ERROR = "device login failed: the sandbox credential read errored.";
|
|
47
|
+
/**
|
|
48
|
+
* The fixed helper program. The server reads the helper from its own script file
|
|
49
|
+
* and runs it in the sandbox as `node -e <script> <sessionHome> <maxBytes>
|
|
50
|
+
* [<expectedUid>]`. The sandbox already runs node for the Paperclip bridge, so the
|
|
51
|
+
* helper needs no extra runtime. The helper source lives in
|
|
52
|
+
* `scripts/codex-auth-read.cjs`, so no large script stays as a string literal in
|
|
53
|
+
* this module.
|
|
54
|
+
*
|
|
55
|
+
* The helper opens the filesystem root, then opens each session-home path
|
|
56
|
+
* component in turn with a no-follow, directory-only open, relative to the
|
|
57
|
+
* previous directory descriptor, so a symlink at any component fails. It opens
|
|
58
|
+
* `auth.json` relative to the final directory descriptor with `O_NOFOLLOW`, runs
|
|
59
|
+
* `fstat` on the opened descriptor, and requires a regular file, the expected
|
|
60
|
+
* owner, exact mode `0600`, and a size at or below the bound. It reads only from
|
|
61
|
+
* that same descriptor. The `expectedUid` argument is optional; the server omits
|
|
62
|
+
* it, so the helper uses the login user's own id.
|
|
63
|
+
*/
|
|
64
|
+
export const DEVICE_LOGIN_AUTH_READ_SCRIPT = readFileSync(fileURLToPath(new URL("./scripts/codex-auth-read.cjs", import.meta.url)), "utf8");
|
|
65
|
+
/** A strict base64 token: standard alphabet, correct padding, length a multiple
|
|
66
|
+
* of four. The read rejects any other stdout, so malformed helper output never
|
|
67
|
+
* decodes to partial bytes. */
|
|
68
|
+
const STRICT_BASE64_RE = /^[A-Za-z0-9+/]*={0,2}$/;
|
|
69
|
+
/**
|
|
70
|
+
* Decodes the helper stdout to the credential bytes. It accepts only strict
|
|
71
|
+
* base64 with correct padding, so a truncated or corrupt line returns the fixed
|
|
72
|
+
* error instead of partial bytes. It rejects a decoded payload over the bound.
|
|
73
|
+
*/
|
|
74
|
+
export function decodeAuthReadOutput(stdout) {
|
|
75
|
+
const encoded = stdout.trim();
|
|
76
|
+
if (encoded.length % 4 !== 0 || !STRICT_BASE64_RE.test(encoded)) {
|
|
77
|
+
throw new Error(DEVICE_LOGIN_AUTH_READ_ERROR);
|
|
78
|
+
}
|
|
79
|
+
const bytes = Buffer.from(encoded, "base64");
|
|
80
|
+
if (bytes.length > MAX_AUTH_JSON_BYTES) {
|
|
81
|
+
throw new Error(DEVICE_LOGIN_AUTH_READ_ERROR);
|
|
82
|
+
}
|
|
83
|
+
return bytes;
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Runs the descriptor-bound credential read once and returns the bytes. It
|
|
87
|
+
* revalidates the session-home shape, then runs the fixed helper as a one-shot,
|
|
88
|
+
* non-session command. It converts a non-zero exit, an empty or malformed stdout,
|
|
89
|
+
* or an oversize payload to the one fixed, non-secret error. It reads no bytes on
|
|
90
|
+
* any failed path.
|
|
91
|
+
*/
|
|
92
|
+
export async function runDescriptorBoundAuthRead(deps) {
|
|
93
|
+
// Revalidate the home shape before the sandbox command. The server derived and
|
|
94
|
+
// validated it earlier; this second check keeps the helper argument fixed.
|
|
95
|
+
validateLoginSessionHome(deps.sessionHome);
|
|
96
|
+
let result;
|
|
97
|
+
try {
|
|
98
|
+
result = await deps.environmentRuntime.execute({
|
|
99
|
+
environment: deps.environment,
|
|
100
|
+
lease: deps.lease,
|
|
101
|
+
command: "node",
|
|
102
|
+
args: ["-e", DEVICE_LOGIN_AUTH_READ_SCRIPT, deps.sessionHome, String(MAX_AUTH_JSON_BYTES)],
|
|
103
|
+
timeoutMs: deps.timeoutMs,
|
|
104
|
+
// The read is one fixed, non-session operation. It must not open or reuse
|
|
105
|
+
// the login session.
|
|
106
|
+
bypassSession: true,
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
catch {
|
|
110
|
+
// A driver error may embed sandbox text. Convert it to the fixed error.
|
|
111
|
+
throw new Error(DEVICE_LOGIN_AUTH_READ_ERROR);
|
|
112
|
+
}
|
|
113
|
+
if (result.exitCode !== 0) {
|
|
114
|
+
throw new Error(DEVICE_LOGIN_AUTH_READ_ERROR);
|
|
115
|
+
}
|
|
116
|
+
return decodeAuthReadOutput(result.stdout ?? "");
|
|
117
|
+
}
|
|
118
|
+
//# sourceMappingURL=codex-device-login-credential-read.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codex-device-login-credential-read.js","sourceRoot":"","sources":["../../src/services/codex-device-login-credential-read.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"codex-device-login-reaper.d.ts","sourceRoot":"","sources":["../../src/services/codex-device-login-reaper.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,iBAAiB,CAAC;AAE1C,OAAO,
|
|
1
|
+
{"version":3,"file":"codex-device-login-reaper.d.ts","sourceRoot":"","sources":["../../src/services/codex-device-login-reaper.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,iBAAiB,CAAC;AAE1C,OAAO,EAOL,KAAK,sBAAsB,EAC3B,KAAK,mBAAmB,EACzB,MAAM,iCAAiC,CAAC;AACzC,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,0BAA0B,CAAC;AAwB1E,+DAA+D;AAC/D,MAAM,WAAW,aAAa;IAC5B,aAAa,EAAE,MAAM,CAAC;IACtB,eAAe,EAAE,MAAM,CAAC;CACzB;AAED;8DAC8D;AAC9D,MAAM,WAAW,WAAY,SAAQ,aAAa;IAChD,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;;;;GAKG;AACH,MAAM,WAAW,0BAA0B;IACzC;8CAC0C;IAC1C,aAAa,CAAC,GAAG,EAAE,aAAa,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAAC;IAChE;wBACoB;IACpB,gBAAgB,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;CAC5C;AAED,4EAA4E;AAC5E,MAAM,WAAW,iBAAiB;IAChC,sEAAsE;IACtE,eAAe,EAAE,MAAM,CAAC;IACxB,iEAAiE;IACjE,cAAc,EAAE,MAAM,CAAC;IACvB,mFAAmF;IACnF,cAAc,EAAE,MAAM,CAAC;IACvB,kDAAkD;IAClD,mBAAmB,EAAE,MAAM,CAAC;IAC5B;8CAC0C;IAC1C,uBAAuB,EAAE,MAAM,CAAC;CACjC;AAED,MAAM,WAAW,0BAA0B;IACzC,KAAK,EAAE,sBAAsB,CAAC;IAC9B,OAAO,EAAE,0BAA0B,CAAC;IACpC,GAAG,CAAC,EAAE,MAAM,IAAI,CAAC;CAClB;AAED,wBAAgB,4BAA4B,CAAC,IAAI,EAAE,0BAA0B;iBA0JnD,OAAO,CAAC,iBAAiB,CAAC;EAenD;AAED,MAAM,MAAM,sBAAsB,GAAG,UAAU,CAAC,OAAO,4BAA4B,CAAC,CAAC;AAMrF,MAAM,WAAW,uCAAuC;IACtD,EAAE,EAAE,EAAE,CAAC;IACP,kBAAkB,EAAE,yBAAyB,CAAC;CAC/C;AAED;;;;GAIG;AACH,wBAAgB,yCAAyC,CACvD,IAAI,EAAE,uCAAuC,GAC5C,0BAA0B,CAkE5B"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { inArray } from "drizzle-orm";
|
|
1
|
+
import { and, eq, inArray } from "drizzle-orm";
|
|
2
2
|
import { adapterAuthSessions } from "@paperclipai/db";
|
|
3
|
-
import { ADAPTER_AUTH_ACTIVE_STATUSES, decodePendingTerminal, LOGIN_LEASE_SESSION_TAG_KEY, observeSandboxDelete, terminalCleanupWrite, } from "./codex-device-login-service.js";
|
|
3
|
+
import { ADAPTER_AUTH_ACTIVE_STATUSES, CODEX_DEVICE_LOGIN_ADAPTER_TYPE, decodePendingTerminal, LOGIN_LEASE_SESSION_TAG_KEY, observeSandboxDelete, terminalCleanupWrite, } from "./codex-device-login-service.js";
|
|
4
4
|
import { environmentService } from "./environments.js";
|
|
5
5
|
export function createCodexDeviceLoginReaper(deps) {
|
|
6
6
|
const { store, runtime } = deps;
|
|
@@ -74,7 +74,7 @@ export function createCodexDeviceLoginReaper(deps) {
|
|
|
74
74
|
// interleaves with a live write. A crashed owner drops the lock, so the
|
|
75
75
|
// reaper still reclaims the stalled row on a later sweep.
|
|
76
76
|
const pendingWrite = terminalCleanupWrite(false, "timed_out", null);
|
|
77
|
-
const claimed = await store.withCompanyAdapterPromotionLock(row.companyId, row.adapterType, () => store.compareAndSetStatus({
|
|
77
|
+
const claimed = await store.withCompanyAdapterPromotionLock(row.companyId, row.startedByUserId, row.adapterType, () => store.compareAndSetStatus({
|
|
78
78
|
sessionId: row.id,
|
|
79
79
|
expectedStatuses: [row.status],
|
|
80
80
|
status: pendingWrite.status,
|
|
@@ -198,10 +198,13 @@ export function createProductionLoginSessionReaperRuntime(deps) {
|
|
|
198
198
|
const environmentRows = await deps.db
|
|
199
199
|
.selectDistinct({ environmentId: adapterAuthSessions.environmentId })
|
|
200
200
|
.from(adapterAuthSessions)
|
|
201
|
-
.where(
|
|
201
|
+
.where(and(
|
|
202
|
+
// The shared table also holds the setup-token rows. Filter by the
|
|
203
|
+
// device-login adapter, so the orphan sweep reads only Codex rows.
|
|
204
|
+
eq(adapterAuthSessions.adapterType, CODEX_DEVICE_LOGIN_ADAPTER_TYPE), inArray(adapterAuthSessions.status, [
|
|
202
205
|
...ADAPTER_AUTH_ACTIVE_STATUSES,
|
|
203
206
|
"cleanup_pending",
|
|
204
|
-
]));
|
|
207
|
+
])));
|
|
205
208
|
const tagged = [];
|
|
206
209
|
for (const { environmentId } of environmentRows) {
|
|
207
210
|
const leases = await environmentsSvc.listLeases(environmentId, { status: "active" });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"codex-device-login-reaper.js","sourceRoot":"","sources":["../../src/services/codex-device-login-reaper.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"codex-device-login-reaper.js","sourceRoot":"","sources":["../../src/services/codex-device-login-reaper.ts"],"names":[],"mappings":"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"}
|