oh-my-super-agent 0.1.0
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/.agents/agents/advisor.md +15 -0
- package/.agents/agents/conductor.md +32 -0
- package/.agents/agents/dreamer.md +13 -0
- package/.agents/agents/executor.md +17 -0
- package/.agents/agents/grader.md +15 -0
- package/.agents/config/endurance-policy.json +8 -0
- package/.agents/config/oms-config.json +119 -0
- package/.agents/config/release-policy.json +12 -0
- package/.agents/config/secret-scan-policy.json +7 -0
- package/.agents/config/verification-plan.json +33 -0
- package/.agents/registry.json +11 -0
- package/.agents/rules/constitution.md +7 -0
- package/.agents/skills/conductor/SKILL.md +23 -0
- package/.agents/skills/dream/SKILL.md +14 -0
- package/.agents/skills/executor/SKILL.md +13 -0
- package/.agents/skills/oms/SKILL.md +52 -0
- package/.agents/skills/quota-aware/SKILL.md +12 -0
- package/.agents/skills/schedule/SKILL.md +13 -0
- package/.agents/skills/team-protocol/SKILL.md +20 -0
- package/LICENSE +21 -0
- package/README.md +146 -0
- package/dist/src/audit/run-ledger.d.ts +183 -0
- package/dist/src/audit/run-ledger.js +1655 -0
- package/dist/src/audit/run-ledger.js.map +1 -0
- package/dist/src/cli.d.ts +61 -0
- package/dist/src/cli.js +2096 -0
- package/dist/src/cli.js.map +1 -0
- package/dist/src/commands/github-queue-probe.d.ts +26 -0
- package/dist/src/commands/github-queue-probe.js +51 -0
- package/dist/src/commands/github-queue-probe.js.map +1 -0
- package/dist/src/commands/trace-fixture.d.ts +20 -0
- package/dist/src/commands/trace-fixture.js +72 -0
- package/dist/src/commands/trace-fixture.js.map +1 -0
- package/dist/src/conductor/activity.d.ts +46 -0
- package/dist/src/conductor/activity.js +224 -0
- package/dist/src/conductor/activity.js.map +1 -0
- package/dist/src/conductor/bridge.d.ts +53 -0
- package/dist/src/conductor/bridge.js +652 -0
- package/dist/src/conductor/bridge.js.map +1 -0
- package/dist/src/conductor/notifications.d.ts +59 -0
- package/dist/src/conductor/notifications.js +381 -0
- package/dist/src/conductor/notifications.js.map +1 -0
- package/dist/src/conductor/recovery.d.ts +29 -0
- package/dist/src/conductor/recovery.js +198 -0
- package/dist/src/conductor/recovery.js.map +1 -0
- package/dist/src/conductor/start.d.ts +73 -0
- package/dist/src/conductor/start.js +519 -0
- package/dist/src/conductor/start.js.map +1 -0
- package/dist/src/conductor/waiter.d.ts +88 -0
- package/dist/src/conductor/waiter.js +427 -0
- package/dist/src/conductor/waiter.js.map +1 -0
- package/dist/src/config.d.ts +9 -0
- package/dist/src/config.js +40 -0
- package/dist/src/config.js.map +1 -0
- package/dist/src/dispatch/advice-source.d.ts +61 -0
- package/dist/src/dispatch/advice-source.js +198 -0
- package/dist/src/dispatch/advice-source.js.map +1 -0
- package/dist/src/dispatch/advice-store.d.ts +41 -0
- package/dist/src/dispatch/advice-store.js +201 -0
- package/dist/src/dispatch/advice-store.js.map +1 -0
- package/dist/src/dispatch/advice.d.ts +34 -0
- package/dist/src/dispatch/advice.js +371 -0
- package/dist/src/dispatch/advice.js.map +1 -0
- package/dist/src/dispatch/authority.d.ts +124 -0
- package/dist/src/dispatch/authority.js +1202 -0
- package/dist/src/dispatch/authority.js.map +1 -0
- package/dist/src/dispatch/intent.d.ts +66 -0
- package/dist/src/dispatch/intent.js +71 -0
- package/dist/src/dispatch/intent.js.map +1 -0
- package/dist/src/dispatch/runtime-authority.d.ts +42 -0
- package/dist/src/dispatch/runtime-authority.js +52 -0
- package/dist/src/dispatch/runtime-authority.js.map +1 -0
- package/dist/src/doctor.d.ts +20 -0
- package/dist/src/doctor.js +85 -0
- package/dist/src/doctor.js.map +1 -0
- package/dist/src/domain/records.d.ts +44 -0
- package/dist/src/domain/records.js +138 -0
- package/dist/src/domain/records.js.map +1 -0
- package/dist/src/domain/role-policy.d.ts +67 -0
- package/dist/src/domain/role-policy.js +547 -0
- package/dist/src/domain/role-policy.js.map +1 -0
- package/dist/src/events/bus.d.ts +32 -0
- package/dist/src/events/bus.js +115 -0
- package/dist/src/events/bus.js.map +1 -0
- package/dist/src/events/kinds.d.ts +126 -0
- package/dist/src/events/kinds.js +14 -0
- package/dist/src/events/kinds.js.map +1 -0
- package/dist/src/evidence/immutable-file.d.ts +12 -0
- package/dist/src/evidence/immutable-file.js +141 -0
- package/dist/src/evidence/immutable-file.js.map +1 -0
- package/dist/src/evidence/store.d.ts +125 -0
- package/dist/src/evidence/store.js +1189 -0
- package/dist/src/evidence/store.js.map +1 -0
- package/dist/src/evidence/verdict.d.ts +17 -0
- package/dist/src/evidence/verdict.js +23 -0
- package/dist/src/evidence/verdict.js.map +1 -0
- package/dist/src/generation/agent.d.ts +5 -0
- package/dist/src/generation/agent.js +34 -0
- package/dist/src/generation/agent.js.map +1 -0
- package/dist/src/generation/frontmatter.d.ts +7 -0
- package/dist/src/generation/frontmatter.js +33 -0
- package/dist/src/generation/frontmatter.js.map +1 -0
- package/dist/src/github/adapter.d.ts +44 -0
- package/dist/src/github/adapter.js +592 -0
- package/dist/src/github/adapter.js.map +1 -0
- package/dist/src/github/dispatch-eligibility.d.ts +9 -0
- package/dist/src/github/dispatch-eligibility.js +94 -0
- package/dist/src/github/dispatch-eligibility.js.map +1 -0
- package/dist/src/github/projector.d.ts +23 -0
- package/dist/src/github/projector.js +181 -0
- package/dist/src/github/projector.js.map +1 -0
- package/dist/src/github/review.d.ts +39 -0
- package/dist/src/github/review.js +1450 -0
- package/dist/src/github/review.js.map +1 -0
- package/dist/src/github/sync.d.ts +21 -0
- package/dist/src/github/sync.js +518 -0
- package/dist/src/github/sync.js.map +1 -0
- package/dist/src/github/types.d.ts +134 -0
- package/dist/src/github/types.js +11 -0
- package/dist/src/github/types.js.map +1 -0
- package/dist/src/goals/artifact-store.d.ts +31 -0
- package/dist/src/goals/artifact-store.js +241 -0
- package/dist/src/goals/artifact-store.js.map +1 -0
- package/dist/src/goals/authority.d.ts +112 -0
- package/dist/src/goals/authority.js +621 -0
- package/dist/src/goals/authority.js.map +1 -0
- package/dist/src/goals/native-snapshot.d.ts +12 -0
- package/dist/src/goals/native-snapshot.js +53 -0
- package/dist/src/goals/native-snapshot.js.map +1 -0
- package/dist/src/goals/runtime-authority.d.ts +7 -0
- package/dist/src/goals/runtime-authority.js +20 -0
- package/dist/src/goals/runtime-authority.js.map +1 -0
- package/dist/src/health/release-assessment.d.ts +11 -0
- package/dist/src/health/release-assessment.js +83 -0
- package/dist/src/health/release-assessment.js.map +1 -0
- package/dist/src/health/release-policy.d.ts +16 -0
- package/dist/src/health/release-policy.js +40 -0
- package/dist/src/health/release-policy.js.map +1 -0
- package/dist/src/hooks/native.d.ts +30 -0
- package/dist/src/hooks/native.js +495 -0
- package/dist/src/hooks/native.js.map +1 -0
- package/dist/src/hooks/provider-runtime.d.ts +55 -0
- package/dist/src/hooks/provider-runtime.js +479 -0
- package/dist/src/hooks/provider-runtime.js.map +1 -0
- package/dist/src/hooks/provider.d.ts +102 -0
- package/dist/src/hooks/provider.js +358 -0
- package/dist/src/hooks/provider.js.map +1 -0
- package/dist/src/live/contact-journal.d.ts +73 -0
- package/dist/src/live/contact-journal.js +439 -0
- package/dist/src/live/contact-journal.js.map +1 -0
- package/dist/src/live-probes/gh-adapter.d.ts +28 -0
- package/dist/src/live-probes/gh-adapter.js +188 -0
- package/dist/src/live-probes/gh-adapter.js.map +1 -0
- package/dist/src/live-probes/github-queue.d.ts +1 -0
- package/dist/src/live-probes/github-queue.js +2 -0
- package/dist/src/live-probes/github-queue.js.map +1 -0
- package/dist/src/notifications/slack-request.d.ts +13 -0
- package/dist/src/notifications/slack-request.js +40 -0
- package/dist/src/notifications/slack-request.js.map +1 -0
- package/dist/src/outbox/processor.d.ts +27 -0
- package/dist/src/outbox/processor.js +63 -0
- package/dist/src/outbox/processor.js.map +1 -0
- package/dist/src/outbox/store.d.ts +158 -0
- package/dist/src/outbox/store.js +834 -0
- package/dist/src/outbox/store.js.map +1 -0
- package/dist/src/package-root.d.ts +1 -0
- package/dist/src/package-root.js +26 -0
- package/dist/src/package-root.js.map +1 -0
- package/dist/src/project.d.ts +12 -0
- package/dist/src/project.js +60 -0
- package/dist/src/project.js.map +1 -0
- package/dist/src/projection/generated-file.d.ts +15 -0
- package/dist/src/projection/generated-file.js +72 -0
- package/dist/src/projection/generated-file.js.map +1 -0
- package/dist/src/projection/project-workspace.d.ts +11 -0
- package/dist/src/projection/project-workspace.js +94 -0
- package/dist/src/projection/project-workspace.js.map +1 -0
- package/dist/src/projection/registry.d.ts +15 -0
- package/dist/src/projection/registry.js +59 -0
- package/dist/src/projection/registry.js.map +1 -0
- package/dist/src/projection/safe-path.d.ts +4 -0
- package/dist/src/projection/safe-path.js +106 -0
- package/dist/src/projection/safe-path.js.map +1 -0
- package/dist/src/providers/claude-interactive.d.ts +38 -0
- package/dist/src/providers/claude-interactive.js +287 -0
- package/dist/src/providers/claude-interactive.js.map +1 -0
- package/dist/src/providers/claude-structured-bridge.d.ts +32 -0
- package/dist/src/providers/claude-structured-bridge.js +215 -0
- package/dist/src/providers/claude-structured-bridge.js.map +1 -0
- package/dist/src/providers/claude-structured-completion.d.ts +23 -0
- package/dist/src/providers/claude-structured-completion.js +229 -0
- package/dist/src/providers/claude-structured-completion.js.map +1 -0
- package/dist/src/providers/claude-structured-pane.d.ts +23 -0
- package/dist/src/providers/claude-structured-pane.js +156 -0
- package/dist/src/providers/claude-structured-pane.js.map +1 -0
- package/dist/src/providers/claude-structured-store.d.ts +48 -0
- package/dist/src/providers/claude-structured-store.js +212 -0
- package/dist/src/providers/claude-structured-store.js.map +1 -0
- package/dist/src/providers/claude-structured.d.ts +56 -0
- package/dist/src/providers/claude-structured.js +250 -0
- package/dist/src/providers/claude-structured.js.map +1 -0
- package/dist/src/providers/codex-exec.d.ts +29 -0
- package/dist/src/providers/codex-exec.js +127 -0
- package/dist/src/providers/codex-exec.js.map +1 -0
- package/dist/src/providers/grading.d.ts +2 -0
- package/dist/src/providers/grading.js +20 -0
- package/dist/src/providers/grading.js.map +1 -0
- package/dist/src/providers/native-dispatch.d.ts +24 -0
- package/dist/src/providers/native-dispatch.js +34 -0
- package/dist/src/providers/native-dispatch.js.map +1 -0
- package/dist/src/providers/preflight.d.ts +65 -0
- package/dist/src/providers/preflight.js +256 -0
- package/dist/src/providers/preflight.js.map +1 -0
- package/dist/src/providers/process.d.ts +18 -0
- package/dist/src/providers/process.js +21 -0
- package/dist/src/providers/process.js.map +1 -0
- package/dist/src/queue/model.d.ts +37 -0
- package/dist/src/queue/model.js +51 -0
- package/dist/src/queue/model.js.map +1 -0
- package/dist/src/queue/service.d.ts +1 -0
- package/dist/src/queue/service.js +2 -0
- package/dist/src/queue/service.js.map +1 -0
- package/dist/src/reflections/store.d.ts +21 -0
- package/dist/src/reflections/store.js +60 -0
- package/dist/src/reflections/store.js.map +1 -0
- package/dist/src/reports/daily-trust.d.ts +11 -0
- package/dist/src/reports/daily-trust.js +98 -0
- package/dist/src/reports/daily-trust.js.map +1 -0
- package/dist/src/runs/controller.d.ts +187 -0
- package/dist/src/runs/controller.js +1182 -0
- package/dist/src/runs/controller.js.map +1 -0
- package/dist/src/runtime/composition.d.ts +9 -0
- package/dist/src/runtime/composition.js +35 -0
- package/dist/src/runtime/composition.js.map +1 -0
- package/dist/src/runtime/endurance-authorities.d.ts +44 -0
- package/dist/src/runtime/endurance-authorities.js +101 -0
- package/dist/src/runtime/endurance-authorities.js.map +1 -0
- package/dist/src/runtime/endurance-policy.d.ts +12 -0
- package/dist/src/runtime/endurance-policy.js +13 -0
- package/dist/src/runtime/endurance-policy.js.map +1 -0
- package/dist/src/runtime/lock.d.ts +63 -0
- package/dist/src/runtime/lock.js +577 -0
- package/dist/src/runtime/lock.js.map +1 -0
- package/dist/src/runtime/process-identity.d.ts +10 -0
- package/dist/src/runtime/process-identity.js +43 -0
- package/dist/src/runtime/process-identity.js.map +1 -0
- package/dist/src/runtime/quota.d.ts +130 -0
- package/dist/src/runtime/quota.js +590 -0
- package/dist/src/runtime/quota.js.map +1 -0
- package/dist/src/runtime/record-store.d.ts +45 -0
- package/dist/src/runtime/record-store.js +272 -0
- package/dist/src/runtime/record-store.js.map +1 -0
- package/dist/src/runtime/schema.d.ts +28 -0
- package/dist/src/runtime/schema.js +194 -0
- package/dist/src/runtime/schema.js.map +1 -0
- package/dist/src/runtime/stable-id.d.ts +3 -0
- package/dist/src/runtime/stable-id.js +27 -0
- package/dist/src/runtime/stable-id.js.map +1 -0
- package/dist/src/runtime/system-clock.d.ts +8 -0
- package/dist/src/runtime/system-clock.js +35 -0
- package/dist/src/runtime/system-clock.js.map +1 -0
- package/dist/src/schedule/service-plan.d.ts +58 -0
- package/dist/src/schedule/service-plan.js +327 -0
- package/dist/src/schedule/service-plan.js.map +1 -0
- package/dist/src/schedule/user-installation.d.ts +62 -0
- package/dist/src/schedule/user-installation.js +701 -0
- package/dist/src/schedule/user-installation.js.map +1 -0
- package/dist/src/schedule/user-plan.d.ts +47 -0
- package/dist/src/schedule/user-plan.js +286 -0
- package/dist/src/schedule/user-plan.js.map +1 -0
- package/dist/src/scheduler/minute.d.ts +31 -0
- package/dist/src/scheduler/minute.js +441 -0
- package/dist/src/scheduler/minute.js.map +1 -0
- package/dist/src/schemas/registry.d.ts +10 -0
- package/dist/src/schemas/registry.js +36 -0
- package/dist/src/schemas/registry.js.map +1 -0
- package/dist/src/security/secret-scan.d.ts +50 -0
- package/dist/src/security/secret-scan.js +384 -0
- package/dist/src/security/secret-scan.js.map +1 -0
- package/dist/src/sessions/registry.d.ts +89 -0
- package/dist/src/sessions/registry.js +443 -0
- package/dist/src/sessions/registry.js.map +1 -0
- package/dist/src/state.d.ts +27 -0
- package/dist/src/state.js +235 -0
- package/dist/src/state.js.map +1 -0
- package/dist/src/status/hud.d.ts +37 -0
- package/dist/src/status/hud.js +88 -0
- package/dist/src/status/hud.js.map +1 -0
- package/dist/src/team/plan.d.ts +31 -0
- package/dist/src/team/plan.js +184 -0
- package/dist/src/team/plan.js.map +1 -0
- package/dist/src/team/projection.d.ts +24 -0
- package/dist/src/team/projection.js +79 -0
- package/dist/src/team/projection.js.map +1 -0
- package/dist/src/tickets/admission.d.ts +34 -0
- package/dist/src/tickets/admission.js +169 -0
- package/dist/src/tickets/admission.js.map +1 -0
- package/dist/src/tickets/materializer.d.ts +1 -0
- package/dist/src/tickets/materializer.js +2 -0
- package/dist/src/tickets/materializer.js.map +1 -0
- package/dist/src/tickets/runtime-authority.d.ts +32 -0
- package/dist/src/tickets/runtime-authority.js +46 -0
- package/dist/src/tickets/runtime-authority.js.map +1 -0
- package/dist/src/tickets/store.d.ts +221 -0
- package/dist/src/tickets/store.js +2025 -0
- package/dist/src/tickets/store.js.map +1 -0
- package/dist/src/tracer/one-ticket.d.ts +58 -0
- package/dist/src/tracer/one-ticket.js +578 -0
- package/dist/src/tracer/one-ticket.js.map +1 -0
- package/dist/src/trust/assessment.d.ts +24 -0
- package/dist/src/trust/assessment.js +124 -0
- package/dist/src/trust/assessment.js.map +1 -0
- package/dist/src/trust/runs.d.ts +13 -0
- package/dist/src/trust/runs.js +46 -0
- package/dist/src/trust/runs.js.map +1 -0
- package/dist/src/types.d.ts +6 -0
- package/dist/src/types.js +2 -0
- package/dist/src/types.js.map +1 -0
- package/dist/src/utils/fs.d.ts +13 -0
- package/dist/src/utils/fs.js +188 -0
- package/dist/src/utils/fs.js.map +1 -0
- package/dist/src/verification/authority.d.ts +28 -0
- package/dist/src/verification/authority.js +153 -0
- package/dist/src/verification/authority.js.map +1 -0
- package/dist/src/verification/grade-source.d.ts +17 -0
- package/dist/src/verification/grade-source.js +30 -0
- package/dist/src/verification/grade-source.js.map +1 -0
- package/dist/src/verification/plan.d.ts +20 -0
- package/dist/src/verification/plan.js +128 -0
- package/dist/src/verification/plan.js.map +1 -0
- package/dist/src/verification/protected-runner.d.ts +50 -0
- package/dist/src/verification/protected-runner.js +171 -0
- package/dist/src/verification/protected-runner.js.map +1 -0
- package/dist/src/verification/result-gate-store.d.ts +72 -0
- package/dist/src/verification/result-gate-store.js +193 -0
- package/dist/src/verification/result-gate-store.js.map +1 -0
- package/dist/src/verification/result-gate.d.ts +41 -0
- package/dist/src/verification/result-gate.js +731 -0
- package/dist/src/verification/result-gate.js.map +1 -0
- package/dist/src/verification/runner.d.ts +38 -0
- package/dist/src/verification/runner.js +143 -0
- package/dist/src/verification/runner.js.map +1 -0
- package/dist/src/verification/sandbox.d.ts +16 -0
- package/dist/src/verification/sandbox.js +199 -0
- package/dist/src/verification/sandbox.js.map +1 -0
- package/dist/src/verify.d.ts +8 -0
- package/dist/src/verify.js +35 -0
- package/dist/src/verify.js.map +1 -0
- package/dist/src/watchdog/reconcile.d.ts +42 -0
- package/dist/src/watchdog/reconcile.js +440 -0
- package/dist/src/watchdog/reconcile.js.map +1 -0
- package/dist/src/workers/bridge.d.ts +35 -0
- package/dist/src/workers/bridge.js +426 -0
- package/dist/src/workers/bridge.js.map +1 -0
- package/dist/src/workers/delivery.d.ts +31 -0
- package/dist/src/workers/delivery.js +876 -0
- package/dist/src/workers/delivery.js.map +1 -0
- package/dist/src/workers/panes.d.ts +32 -0
- package/dist/src/workers/panes.js +212 -0
- package/dist/src/workers/panes.js.map +1 -0
- package/dist/src/workers/registry.d.ts +80 -0
- package/dist/src/workers/registry.js +351 -0
- package/dist/src/workers/registry.js.map +1 -0
- package/dist/src/workers/runtime.d.ts +44 -0
- package/dist/src/workers/runtime.js +21 -0
- package/dist/src/workers/runtime.js.map +1 -0
- package/dist/src/worktrees/manager.d.ts +35 -0
- package/dist/src/worktrees/manager.js +315 -0
- package/dist/src/worktrees/manager.js.map +1 -0
- package/docs/ARCHITECTURE.md +323 -0
- package/docs/PLAN.md +216 -0
- package/docs/REFERENCES.md +42 -0
- package/docs/ROADMAP.md +327 -0
- package/docs/SECURITY.md +242 -0
- package/docs/adr/0001-tracer-first-file-backed-certification.md +41 -0
- package/docs/adr/0002-conductor-first-typed-dispatch.md +102 -0
- package/docs/adr/0003-mandatory-pre-dispatch-advice.md +59 -0
- package/docs/compatibility/claude-code-2.1.207.md +25 -0
- package/loop/contract.md +102 -0
- package/package.json +54 -0
- package/schemas/advisor-evidence.schema.json +54 -0
- package/schemas/advisor-output.schema.json +31 -0
- package/schemas/conductor-activity-payload.schema.json +38 -0
- package/schemas/conductor-decision.schema.json +29 -0
- package/schemas/conductor-dispatch-intent.schema.json +71 -0
- package/schemas/conductor-dispatch-preparation.schema.json +46 -0
- package/schemas/conductor-dispatch-proposal.schema.json +82 -0
- package/schemas/conductor-goal-proposal.schema.json +30 -0
- package/schemas/conductor-manage-worker.schema.json +17 -0
- package/schemas/conductor-notification-payload.schema.json +39 -0
- package/schemas/conductor-process-result.schema.json +14 -0
- package/schemas/conductor-route.schema.json +51 -0
- package/schemas/conductor-start-team.schema.json +16 -0
- package/schemas/conductor-waiter-payload.schema.json +68 -0
- package/schemas/deterministic-check.schema.json +107 -0
- package/schemas/dispatch-acknowledgement.schema.json +15 -0
- package/schemas/dispatch-advice-payload.schema.json +64 -0
- package/schemas/dispatch-payload.schema.json +131 -0
- package/schemas/dispatch-result.schema.json +28 -0
- package/schemas/endurance-policy.schema.json +16 -0
- package/schemas/events/dispatch-delivery-requested.schema.json +17 -0
- package/schemas/events/github-observed.schema.json +28 -0
- package/schemas/events/native-hook-observed.schema.json +35 -0
- package/schemas/events/provider-observed.schema.json +64 -0
- package/schemas/events/run-heartbeat-due.schema.json +10 -0
- package/schemas/events/slack-notification-requested.schema.json +14 -0
- package/schemas/events/structured-role-completed.schema.json +54 -0
- package/schemas/events/ticket-resume-due.schema.json +28 -0
- package/schemas/events/watchdog-lease-expired.schema.json +14 -0
- package/schemas/events/watchdog-outbox-stalled.schema.json +12 -0
- package/schemas/events/watchdog-session-stalled.schema.json +11 -0
- package/schemas/evidence-record.schema.json +37 -0
- package/schemas/executor-result.schema.json +17 -0
- package/schemas/github-observation.schema.json +33 -0
- package/schemas/github-watermark.schema.json +66 -0
- package/schemas/goal-artifact.schema.json +19 -0
- package/schemas/goal-create-input.schema.json +14 -0
- package/schemas/goal-executor-result.schema.json +18 -0
- package/schemas/goal-payload.schema.json +95 -0
- package/schemas/grader-output.schema.json +33 -0
- package/schemas/lease-expiry.schema.json +19 -0
- package/schemas/live-disclosure.schema.json +16 -0
- package/schemas/live-outcome.schema.json +52 -0
- package/schemas/native-goal-snapshot.schema.json +27 -0
- package/schemas/provider-observed.schema.json +64 -0
- package/schemas/quota-observation.schema.json +72 -0
- package/schemas/reflection-evidence.schema.json +61 -0
- package/schemas/reflection.schema.json +13 -0
- package/schemas/regression-request.schema.json +54 -0
- package/schemas/release-assessment.schema.json +34 -0
- package/schemas/release-policy.schema.json +30 -0
- package/schemas/result-gate-payload.schema.json +244 -0
- package/schemas/review-delivery-payload.schema.json +42 -0
- package/schemas/role-policy.schema.json +111 -0
- package/schemas/run-abort-input.schema.json +11 -0
- package/schemas/run-completion-proof.schema.json +62 -0
- package/schemas/run-ledger-entry.schema.json +78 -0
- package/schemas/run-manifest.schema.json +74 -0
- package/schemas/run-start-intent.schema.json +74 -0
- package/schemas/runtime-record.schema.json +111 -0
- package/schemas/service-plan.schema.json +35 -0
- package/schemas/session-payload.schema.json +80 -0
- package/schemas/structured-role-read-request.schema.json +14 -0
- package/schemas/structured-role-request.schema.json +44 -0
- package/schemas/structured-role-result.schema.json +38 -0
- package/schemas/structured-role-submit-result.schema.json +15 -0
- package/schemas/team-checkpoint.schema.json +42 -0
- package/schemas/team-plan.schema.json +30 -0
- package/schemas/ticket-content.schema.json +38 -0
- package/schemas/ticket-queue-payload.schema.json +191 -0
- package/schemas/trust-report.schema.json +68 -0
- package/schemas/trust-run.schema.json +47 -0
- package/schemas/ultragoal-checkpoint.schema.json +49 -0
- package/schemas/user-schedule-installation-v1.schema.json +32 -0
- package/schemas/user-schedule-installation.schema.json +38 -0
- package/schemas/user-schedule-plan.schema.json +39 -0
- package/schemas/verification-plan-evidence.schema.json +37 -0
- package/schemas/worker-acknowledge-dispatch.schema.json +12 -0
- package/schemas/worker-payload.schema.json +47 -0
- package/schemas/worker-read-dispatch.schema.json +11 -0
- package/schemas/worker-record-dispatch-result.schema.json +14 -0
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
import { isRecord, validateExistingDirectory } from "../utils/fs.js";
|
|
2
|
+
export const MAX_GH_OUTPUT_BYTES = 1024 * 1024;
|
|
3
|
+
const MAX_ISSUE_BODY_BYTES = 256 * 1024;
|
|
4
|
+
const GITHUB_ISSUE_TARGETS = new WeakSet();
|
|
5
|
+
export function normalizeGithubIssueTarget(input) {
|
|
6
|
+
const target = Object.freeze({
|
|
7
|
+
repository: validateRepository(input.repository),
|
|
8
|
+
readyLabel: validateLabel(input.readyLabel ?? "oms:ready"),
|
|
9
|
+
limit: validateLimit(input.limit ?? 1),
|
|
10
|
+
});
|
|
11
|
+
GITHUB_ISSUE_TARGETS.add(target);
|
|
12
|
+
return target;
|
|
13
|
+
}
|
|
14
|
+
/** Pure request construction. Contact is owned exclusively by runGithubQueueProbe. */
|
|
15
|
+
export function buildGithubIssueListRequest(options) {
|
|
16
|
+
assertGithubIssueTarget(options.target);
|
|
17
|
+
const cwd = validateExistingDirectory(options.cwd, "GitHub probe working directory");
|
|
18
|
+
return Object.freeze({
|
|
19
|
+
command: "gh",
|
|
20
|
+
args: Object.freeze([
|
|
21
|
+
"issue",
|
|
22
|
+
"list",
|
|
23
|
+
"--repo",
|
|
24
|
+
options.target.repository,
|
|
25
|
+
"--state",
|
|
26
|
+
"open",
|
|
27
|
+
"--label",
|
|
28
|
+
options.target.readyLabel,
|
|
29
|
+
"--limit",
|
|
30
|
+
String(options.target.limit),
|
|
31
|
+
"--json",
|
|
32
|
+
"id,number,title,body,labels,url,updatedAt",
|
|
33
|
+
]),
|
|
34
|
+
cwd,
|
|
35
|
+
env: Object.freeze(githubEnvironment(options.env ?? process.env)),
|
|
36
|
+
timeoutMs: 30_000,
|
|
37
|
+
maxBufferBytes: MAX_GH_OUTPUT_BYTES,
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
export function parseGithubIssueListResult(result, target) {
|
|
41
|
+
assertGithubIssueTarget(target);
|
|
42
|
+
if (result.error)
|
|
43
|
+
throw new Error("GitHub probe failed to start gh");
|
|
44
|
+
if (result.status !== 0 || result.signal !== null) {
|
|
45
|
+
throw new Error(`GitHub probe gh exited ${result.status ?? "without status"}`);
|
|
46
|
+
}
|
|
47
|
+
if (Buffer.byteLength(result.stdout, "utf8") > MAX_GH_OUTPUT_BYTES) {
|
|
48
|
+
throw new Error("GitHub probe output exceeds limit");
|
|
49
|
+
}
|
|
50
|
+
let value;
|
|
51
|
+
try {
|
|
52
|
+
value = JSON.parse(result.stdout);
|
|
53
|
+
}
|
|
54
|
+
catch {
|
|
55
|
+
throw new Error("GitHub probe returned malformed JSON");
|
|
56
|
+
}
|
|
57
|
+
if (!Array.isArray(value) || value.length > target.limit) {
|
|
58
|
+
throw new Error("GitHub probe returned an invalid issue list");
|
|
59
|
+
}
|
|
60
|
+
const issues = value.map((issue, index) => parseIssue(issue, index, target));
|
|
61
|
+
assertUniqueIssues(issues);
|
|
62
|
+
return issues;
|
|
63
|
+
}
|
|
64
|
+
function assertGithubIssueTarget(value) {
|
|
65
|
+
if (typeof value !== "object"
|
|
66
|
+
|| value === null
|
|
67
|
+
|| !GITHUB_ISSUE_TARGETS.has(value)
|
|
68
|
+
|| !Object.isFrozen(value)) {
|
|
69
|
+
throw new Error("GitHub issue target was not created by the trusted normalization boundary");
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
function parseIssue(value, index, target) {
|
|
73
|
+
if (!isRecord(value))
|
|
74
|
+
throw new Error(`GitHub issue ${index} must be an object`);
|
|
75
|
+
const expected = ["body", "id", "labels", "number", "title", "updatedAt", "url"];
|
|
76
|
+
if (Object.keys(value).sort().join(",") !== expected.join(",")) {
|
|
77
|
+
throw new Error(`GitHub issue ${index} has unexpected fields`);
|
|
78
|
+
}
|
|
79
|
+
if (typeof value.id !== "string" || !/^[A-Za-z0-9_=-]{1,512}$/.test(value.id)) {
|
|
80
|
+
throw new Error(`GitHub issue ${index} has invalid id`);
|
|
81
|
+
}
|
|
82
|
+
if (typeof value.number !== "number" || !Number.isSafeInteger(value.number) || value.number < 1) {
|
|
83
|
+
throw new Error(`GitHub issue ${index} has invalid number`);
|
|
84
|
+
}
|
|
85
|
+
if (typeof value.title !== "string" || value.title.length < 1 || Buffer.byteLength(value.title, "utf8") > 16 * 1024) {
|
|
86
|
+
throw new Error(`GitHub issue ${index} has invalid title`);
|
|
87
|
+
}
|
|
88
|
+
if (typeof value.body !== "string" || Buffer.byteLength(value.body, "utf8") > MAX_ISSUE_BODY_BYTES) {
|
|
89
|
+
throw new Error(`GitHub issue ${index} has invalid body`);
|
|
90
|
+
}
|
|
91
|
+
if (!Array.isArray(value.labels) || value.labels.length > 100) {
|
|
92
|
+
throw new Error(`GitHub issue ${index} has invalid labels`);
|
|
93
|
+
}
|
|
94
|
+
const labels = [...new Set(value.labels.map((label, labelIndex) => {
|
|
95
|
+
if (!isRecord(label) || typeof label.name !== "string") {
|
|
96
|
+
throw new Error(`GitHub issue ${index} label ${labelIndex} is invalid`);
|
|
97
|
+
}
|
|
98
|
+
return validateLabel(label.name);
|
|
99
|
+
}))].sort();
|
|
100
|
+
if (!labels.includes(target.readyLabel)) {
|
|
101
|
+
throw new Error(`GitHub issue ${index} is missing ready label ${target.readyLabel}`);
|
|
102
|
+
}
|
|
103
|
+
if (typeof value.url !== "string")
|
|
104
|
+
throw new Error(`GitHub issue ${index} has invalid url`);
|
|
105
|
+
const urlValue = value.url;
|
|
106
|
+
const url = parseIssueUrl(urlValue, index);
|
|
107
|
+
if (url.repository.toLowerCase() !== target.repository.toLowerCase() || url.number !== value.number) {
|
|
108
|
+
throw new Error(`GitHub issue ${index} does not match the requested target`);
|
|
109
|
+
}
|
|
110
|
+
if (typeof value.updatedAt !== "string" || !isFiniteTimestamp(value.updatedAt)) {
|
|
111
|
+
throw new Error(`GitHub issue ${index} has invalid updatedAt`);
|
|
112
|
+
}
|
|
113
|
+
return {
|
|
114
|
+
id: value.id,
|
|
115
|
+
number: value.number,
|
|
116
|
+
title: value.title,
|
|
117
|
+
body: value.body,
|
|
118
|
+
labels,
|
|
119
|
+
url: urlValue,
|
|
120
|
+
updatedAt: value.updatedAt,
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
function assertUniqueIssues(issues) {
|
|
124
|
+
const ids = new Set();
|
|
125
|
+
const numbers = new Set();
|
|
126
|
+
const urls = new Set();
|
|
127
|
+
for (const issue of issues) {
|
|
128
|
+
if (ids.has(issue.id) || numbers.has(issue.number) || urls.has(issue.url)) {
|
|
129
|
+
throw new Error("GitHub probe returned duplicate or conflicting issues");
|
|
130
|
+
}
|
|
131
|
+
ids.add(issue.id);
|
|
132
|
+
numbers.add(issue.number);
|
|
133
|
+
urls.add(issue.url);
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
function parseIssueUrl(value, index) {
|
|
137
|
+
if (typeof value !== "string")
|
|
138
|
+
throw new Error(`GitHub issue ${index} has invalid url`);
|
|
139
|
+
const match = /^https:\/\/github\.com\/([A-Za-z0-9_.-]+)\/([A-Za-z0-9_.-]+)\/issues\/([1-9][0-9]*)$/.exec(value);
|
|
140
|
+
if (!match?.[1] || !match[2] || !match[3])
|
|
141
|
+
throw new Error(`GitHub issue ${index} has invalid url`);
|
|
142
|
+
return { repository: `${match[1]}/${match[2]}`, number: Number(match[3]) };
|
|
143
|
+
}
|
|
144
|
+
function validateRepository(value) {
|
|
145
|
+
const [owner, name, extra] = value.split("/");
|
|
146
|
+
if (extra !== undefined
|
|
147
|
+
|| !owner
|
|
148
|
+
|| !name
|
|
149
|
+
|| !/^[A-Za-z0-9][A-Za-z0-9-]{0,38}$/.test(owner)
|
|
150
|
+
|| !/^[A-Za-z0-9._-]{1,100}$/.test(name)
|
|
151
|
+
|| name === "."
|
|
152
|
+
|| name === "..")
|
|
153
|
+
throw new Error("invalid GitHub repository");
|
|
154
|
+
return value;
|
|
155
|
+
}
|
|
156
|
+
function validateLabel(value) {
|
|
157
|
+
if (!/^[A-Za-z0-9][A-Za-z0-9:._ -]{0,99}$/.test(value))
|
|
158
|
+
throw new Error("invalid GitHub label");
|
|
159
|
+
return value;
|
|
160
|
+
}
|
|
161
|
+
function validateLimit(value) {
|
|
162
|
+
if (!Number.isSafeInteger(value) || value < 1 || value > 100) {
|
|
163
|
+
throw new Error("GitHub issue limit must be between 1 and 100");
|
|
164
|
+
}
|
|
165
|
+
return value;
|
|
166
|
+
}
|
|
167
|
+
function githubEnvironment(input) {
|
|
168
|
+
if (input.GH_HOST && input.GH_HOST !== "github.com")
|
|
169
|
+
throw new Error("GitHub probe supports github.com only");
|
|
170
|
+
const env = {};
|
|
171
|
+
for (const key of ["PATH", "HOME", "GH_TOKEN", "GITHUB_TOKEN", "GH_HOST", "NO_COLOR"]) {
|
|
172
|
+
if (input[key] !== undefined)
|
|
173
|
+
env[key] = input[key];
|
|
174
|
+
}
|
|
175
|
+
return env;
|
|
176
|
+
}
|
|
177
|
+
function isFiniteTimestamp(value) {
|
|
178
|
+
if (!/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:\.\d{1,3})?Z$/.test(value))
|
|
179
|
+
return false;
|
|
180
|
+
const epoch = Date.parse(value);
|
|
181
|
+
if (!Number.isFinite(epoch))
|
|
182
|
+
return false;
|
|
183
|
+
const normalized = value.includes(".")
|
|
184
|
+
? value.replace(/\.(\d{1,3})Z$/u, (_match, fraction) => `.${fraction.padEnd(3, "0")}Z`)
|
|
185
|
+
: value.replace(/Z$/u, ".000Z");
|
|
186
|
+
return new Date(epoch).toISOString() === normalized;
|
|
187
|
+
}
|
|
188
|
+
//# sourceMappingURL=gh-adapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gh-adapter.js","sourceRoot":"","sources":["../../../src/live-probes/gh-adapter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { GithubQueueProbeError, runGithubQueueProbe, runNonCertifyingGithubQueueProbeFixture, type GithubProbeCertification, type GithubQueueDisclosure, type GithubQueueProbeOptions, type GithubQueueProbeResult, type GithubSyncedTicket, type NonCertifyingGithubQueueProbeFixtureOptions, } from "../evidence/store.js";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"github-queue.js","sourceRoot":"","sources":["../../../src/live-probes/github-queue.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,qBAAqB,EACrB,mBAAmB,EACnB,uCAAuC,GAOxC,MAAM,sBAAsB,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { type RuntimeEventBus, type TypedOutboxEvent } from "../events/bus.js";
|
|
2
|
+
import type { SlackNotificationRequestedPayload } from "../events/kinds.js";
|
|
3
|
+
export interface SlackNotificationRequestInput extends SlackNotificationRequestedPayload {
|
|
4
|
+
readonly occurredAt: string;
|
|
5
|
+
}
|
|
6
|
+
/** Records delivery intent only. OMS v1 deliberately has no Slack sender. */
|
|
7
|
+
export declare function requestSlackNotification(options: {
|
|
8
|
+
bus: RuntimeEventBus;
|
|
9
|
+
input: SlackNotificationRequestInput;
|
|
10
|
+
}): Readonly<{
|
|
11
|
+
status: "created" | "replayed";
|
|
12
|
+
event: TypedOutboxEvent<"slack-notification-requested">;
|
|
13
|
+
}>;
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { assertOpaqueId } from "../domain/records.js";
|
|
2
|
+
import { assertRuntimeEventBus, } from "../events/bus.js";
|
|
3
|
+
import { canonicalTimestamp } from "../queue/model.js";
|
|
4
|
+
import { createStableId } from "../runtime/stable-id.js";
|
|
5
|
+
/** Records delivery intent only. OMS v1 deliberately has no Slack sender. */
|
|
6
|
+
export function requestSlackNotification(options) {
|
|
7
|
+
const bus = options.bus;
|
|
8
|
+
assertRuntimeEventBus(bus);
|
|
9
|
+
const input = captureInput(options.input);
|
|
10
|
+
const occurredAt = canonicalTimestamp(input.occurredAt, "Slack request timestamp");
|
|
11
|
+
const subjectId = assertOpaqueId(input.subject_id, "Slack request subject id");
|
|
12
|
+
const payload = {
|
|
13
|
+
subject_kind: input.subject_kind,
|
|
14
|
+
subject_id: subjectId,
|
|
15
|
+
source_version: input.source_version,
|
|
16
|
+
template_id: assertOpaqueId(input.template_id, "Slack template id"),
|
|
17
|
+
severity: input.severity,
|
|
18
|
+
artifact_ref: assertOpaqueId(input.artifact_ref, "Slack artifact reference"),
|
|
19
|
+
channel_ref: assertOpaqueId(input.channel_ref, "Slack channel reference"),
|
|
20
|
+
};
|
|
21
|
+
return bus.publish("slack-notification-requested", {
|
|
22
|
+
sourceId: subjectId,
|
|
23
|
+
sourceVersion: input.source_version,
|
|
24
|
+
dedupeKey: createStableId("slack-request", input.subject_kind, subjectId, String(input.source_version), input.template_id, input.severity, input.artifact_ref, input.channel_ref),
|
|
25
|
+
occurredAt,
|
|
26
|
+
}, payload);
|
|
27
|
+
}
|
|
28
|
+
function captureInput(input) {
|
|
29
|
+
return {
|
|
30
|
+
subject_kind: input.subject_kind,
|
|
31
|
+
subject_id: input.subject_id,
|
|
32
|
+
source_version: input.source_version,
|
|
33
|
+
template_id: input.template_id,
|
|
34
|
+
severity: input.severity,
|
|
35
|
+
artifact_ref: input.artifact_ref,
|
|
36
|
+
channel_ref: input.channel_ref,
|
|
37
|
+
occurredAt: input.occurredAt,
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=slack-request.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"slack-request.js","sourceRoot":"","sources":["../../../src/notifications/slack-request.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EACL,qBAAqB,GAGtB,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAMzD,6EAA6E;AAC7E,MAAM,UAAU,wBAAwB,CAAC,OAGxC;IAIC,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC;IACxB,qBAAqB,CAAC,GAAG,CAAC,CAAC;IAC3B,MAAM,KAAK,GAAG,YAAY,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IAC1C,MAAM,UAAU,GAAG,kBAAkB,CAAC,KAAK,CAAC,UAAU,EAAE,yBAAyB,CAAC,CAAC;IACnF,MAAM,SAAS,GAAG,cAAc,CAAC,KAAK,CAAC,UAAU,EAAE,0BAA0B,CAAC,CAAC;IAC/E,MAAM,OAAO,GAAsC;QACjD,YAAY,EAAE,KAAK,CAAC,YAAY;QAChC,UAAU,EAAE,SAAS;QACrB,cAAc,EAAE,KAAK,CAAC,cAAc;QACpC,WAAW,EAAE,cAAc,CAAC,KAAK,CAAC,WAAW,EAAE,mBAAmB,CAAC;QACnE,QAAQ,EAAE,KAAK,CAAC,QAAQ;QACxB,YAAY,EAAE,cAAc,CAAC,KAAK,CAAC,YAAY,EAAE,0BAA0B,CAAC;QAC5E,WAAW,EAAE,cAAc,CAAC,KAAK,CAAC,WAAW,EAAE,yBAAyB,CAAC;KAC1E,CAAC;IACF,OAAO,GAAG,CAAC,OAAO,CAAC,8BAA8B,EAAE;QACjD,QAAQ,EAAE,SAAS;QACnB,aAAa,EAAE,KAAK,CAAC,cAAc;QACnC,SAAS,EAAE,cAAc,CACvB,eAAe,EACf,KAAK,CAAC,YAAY,EAClB,SAAS,EACT,MAAM,CAAC,KAAK,CAAC,cAAc,CAAC,EAC5B,KAAK,CAAC,WAAW,EACjB,KAAK,CAAC,QAAQ,EACd,KAAK,CAAC,YAAY,EAClB,KAAK,CAAC,WAAW,CAClB;QACD,UAAU;KACX,EAAE,OAAO,CAAC,CAAC;AACd,CAAC;AAED,SAAS,YAAY,CAAC,KAAoC;IACxD,OAAO;QACL,YAAY,EAAE,KAAK,CAAC,YAAY;QAChC,UAAU,EAAE,KAAK,CAAC,UAAU;QAC5B,cAAc,EAAE,KAAK,CAAC,cAAc;QACpC,WAAW,EAAE,KAAK,CAAC,WAAW;QAC9B,QAAQ,EAAE,KAAK,CAAC,QAAQ;QACxB,YAAY,EAAE,KAAK,CAAC,YAAY;QAChC,WAAW,EAAE,KAAK,CAAC,WAAW;QAC9B,UAAU,EAAE,KAAK,CAAC,UAAU;KAC7B,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import type { OutboxEvent, OutboxReceipt, OutboxStore } from "./store.js";
|
|
2
|
+
declare const OUTBOX_PROCESSOR: unique symbol;
|
|
3
|
+
export interface OutboxHandlerContext {
|
|
4
|
+
operationNonce: string;
|
|
5
|
+
}
|
|
6
|
+
export type OutboxHandler = (event: Readonly<OutboxEvent>, context: Readonly<OutboxHandlerContext>) => Record<string, unknown> | Promise<Record<string, unknown>>;
|
|
7
|
+
export interface ProcessOutboxEventInput {
|
|
8
|
+
eventId: string;
|
|
9
|
+
consumerId: string;
|
|
10
|
+
processedAt: string;
|
|
11
|
+
}
|
|
12
|
+
export type ProcessOutboxEventResult = {
|
|
13
|
+
status: "processed";
|
|
14
|
+
event: OutboxEvent;
|
|
15
|
+
receipt: OutboxReceipt;
|
|
16
|
+
} | {
|
|
17
|
+
status: "replayed";
|
|
18
|
+
event: OutboxEvent;
|
|
19
|
+
receipt: OutboxReceipt;
|
|
20
|
+
};
|
|
21
|
+
export interface OutboxProcessor {
|
|
22
|
+
readonly [OUTBOX_PROCESSOR]: true;
|
|
23
|
+
processOne(input: ProcessOutboxEventInput, handler: OutboxHandler): Promise<ProcessOutboxEventResult>;
|
|
24
|
+
}
|
|
25
|
+
export declare function createOutboxProcessor(store: OutboxStore): OutboxProcessor;
|
|
26
|
+
export declare function assertOutboxProcessor(value: unknown): asserts value is OutboxProcessor;
|
|
27
|
+
export {};
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { assertActorId, assertOpaqueId } from "../domain/records.js";
|
|
2
|
+
import { assertOutboxStore, assertOutboxTimestamp, deriveOperationNonce } from "./store.js";
|
|
3
|
+
const OUTBOX_PROCESSOR = Symbol("OMS outbox processor");
|
|
4
|
+
const OUTBOX_PROCESSORS = new WeakSet();
|
|
5
|
+
export function createOutboxProcessor(store) {
|
|
6
|
+
assertOutboxStore(store);
|
|
7
|
+
const capturedStore = store;
|
|
8
|
+
const processor = Object.freeze({
|
|
9
|
+
[OUTBOX_PROCESSOR]: true,
|
|
10
|
+
async processOne(input, handler) {
|
|
11
|
+
const eventId = assertOpaqueId(input.eventId, "event id");
|
|
12
|
+
const consumerId = assertActorId(input.consumerId, "consumer id");
|
|
13
|
+
const processedAt = assertOutboxTimestamp(input.processedAt, "receipt timestamp");
|
|
14
|
+
const capturedHandler = handler;
|
|
15
|
+
if (typeof capturedHandler !== "function")
|
|
16
|
+
throw new Error("outbox handler must be a function");
|
|
17
|
+
const event = capturedStore.readEvent(eventId);
|
|
18
|
+
const replay = capturedStore.readReceipt(eventId, consumerId);
|
|
19
|
+
if (replay)
|
|
20
|
+
return deepFreeze({ status: "replayed", event, receipt: replay });
|
|
21
|
+
const lock = capturedStore.acquireProcessingLock(eventId, consumerId);
|
|
22
|
+
try {
|
|
23
|
+
const existing = capturedStore.readReceipt(eventId, consumerId);
|
|
24
|
+
if (existing)
|
|
25
|
+
return deepFreeze({ status: "replayed", event, receipt: existing });
|
|
26
|
+
const operationNonce = deriveOperationNonce(eventId, consumerId);
|
|
27
|
+
const result = await capturedHandler(deepFreeze(structuredClone(event)), deepFreeze({ operationNonce }));
|
|
28
|
+
const committed = capturedStore.commitReceipt({
|
|
29
|
+
eventId,
|
|
30
|
+
consumerId,
|
|
31
|
+
processedAt,
|
|
32
|
+
result,
|
|
33
|
+
});
|
|
34
|
+
return deepFreeze({
|
|
35
|
+
status: committed.status === "created" ? "processed" : "replayed",
|
|
36
|
+
event,
|
|
37
|
+
receipt: committed.receipt,
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
finally {
|
|
41
|
+
lock.release();
|
|
42
|
+
}
|
|
43
|
+
},
|
|
44
|
+
});
|
|
45
|
+
OUTBOX_PROCESSORS.add(processor);
|
|
46
|
+
return processor;
|
|
47
|
+
}
|
|
48
|
+
export function assertOutboxProcessor(value) {
|
|
49
|
+
if (typeof value !== "object" || value === null || !OUTBOX_PROCESSORS.has(value)) {
|
|
50
|
+
throw new Error("outbox operation requires a real OMS OutboxProcessor");
|
|
51
|
+
}
|
|
52
|
+
if (!Object.isFrozen(value))
|
|
53
|
+
throw new Error("outbox processor lost its frozen authority boundary");
|
|
54
|
+
}
|
|
55
|
+
function deepFreeze(value, seen = new Set()) {
|
|
56
|
+
if (typeof value !== "object" || value === null || seen.has(value))
|
|
57
|
+
return value;
|
|
58
|
+
seen.add(value);
|
|
59
|
+
for (const child of Object.values(value))
|
|
60
|
+
deepFreeze(child, seen);
|
|
61
|
+
return Object.freeze(value);
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=processor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"processor.js","sourceRoot":"","sources":["../../../src/outbox/processor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
import { type AcquiredLock, type RecoveredLock } from "../runtime/lock.js";
|
|
2
|
+
declare const OUTBOX_STORE: unique symbol;
|
|
3
|
+
declare const CERTIFICATION_WRITER: unique symbol;
|
|
4
|
+
declare const CERTIFICATION_RESOLVER: unique symbol;
|
|
5
|
+
declare const CERTIFICATION_REFERENCE: unique symbol;
|
|
6
|
+
declare const CERTIFICATION_CONSUMER_ID = "run-ledger-authority";
|
|
7
|
+
export interface OutboxEvent {
|
|
8
|
+
schema_version: 1;
|
|
9
|
+
event_id: string;
|
|
10
|
+
event_kind: string;
|
|
11
|
+
source_id: string;
|
|
12
|
+
source_version: number;
|
|
13
|
+
dedupe_key: string;
|
|
14
|
+
occurred_at: string;
|
|
15
|
+
payload: Record<string, unknown>;
|
|
16
|
+
}
|
|
17
|
+
export interface OutboxReceipt {
|
|
18
|
+
schema_version: 1;
|
|
19
|
+
receipt_id: string;
|
|
20
|
+
event_id: string;
|
|
21
|
+
consumer_id: string;
|
|
22
|
+
operation_nonce: string;
|
|
23
|
+
processed_at: string;
|
|
24
|
+
result: Record<string, unknown>;
|
|
25
|
+
}
|
|
26
|
+
export interface PublishOutboxEventInput {
|
|
27
|
+
eventKind: string;
|
|
28
|
+
sourceId: string;
|
|
29
|
+
sourceVersion: number;
|
|
30
|
+
dedupeKey: string;
|
|
31
|
+
occurredAt: string;
|
|
32
|
+
payload: Record<string, unknown>;
|
|
33
|
+
}
|
|
34
|
+
export interface CommitOutboxReceiptInput {
|
|
35
|
+
eventId: string;
|
|
36
|
+
consumerId: string;
|
|
37
|
+
processedAt: string;
|
|
38
|
+
result: Record<string, unknown>;
|
|
39
|
+
}
|
|
40
|
+
export interface OutboxStore {
|
|
41
|
+
readonly [OUTBOX_STORE]: true;
|
|
42
|
+
publish(input: PublishOutboxEventInput): Readonly<{
|
|
43
|
+
status: "created" | "replayed";
|
|
44
|
+
event: OutboxEvent;
|
|
45
|
+
}>;
|
|
46
|
+
readEvent(eventId: string): OutboxEvent;
|
|
47
|
+
readReceipt(eventId: string, consumerId: string): OutboxReceipt | undefined;
|
|
48
|
+
listEvents(): readonly OutboxEvent[];
|
|
49
|
+
listPending(consumerId: string): readonly OutboxEvent[];
|
|
50
|
+
acquireProcessingLock(eventId: string, consumerId: string): AcquiredLock;
|
|
51
|
+
recoverProcessingLock(input: {
|
|
52
|
+
eventId: string;
|
|
53
|
+
consumerId: string;
|
|
54
|
+
recoveredBy: string;
|
|
55
|
+
reason: string;
|
|
56
|
+
expectedGenerationId: string;
|
|
57
|
+
}): RecoveredLock;
|
|
58
|
+
commitReceipt(input: CommitOutboxReceiptInput): Readonly<{
|
|
59
|
+
status: "created" | "replayed";
|
|
60
|
+
receipt: OutboxReceipt;
|
|
61
|
+
}>;
|
|
62
|
+
}
|
|
63
|
+
export interface CanonicalRunHeadReference {
|
|
64
|
+
readonly entry_id: string;
|
|
65
|
+
readonly run_id: string;
|
|
66
|
+
readonly sequence: number;
|
|
67
|
+
readonly sha256: string;
|
|
68
|
+
readonly file_name: string;
|
|
69
|
+
}
|
|
70
|
+
export interface CanonicalRunCertificationReference {
|
|
71
|
+
readonly run_id: string;
|
|
72
|
+
readonly head: CanonicalRunHeadReference;
|
|
73
|
+
readonly metrics_sha256: string;
|
|
74
|
+
}
|
|
75
|
+
export type RunCertificationAuthorityAction = "start" | "heartbeat" | "process-restart" | "complete";
|
|
76
|
+
export interface RunCertificationAuthorityBinding {
|
|
77
|
+
readonly schema_version: 1;
|
|
78
|
+
readonly action: RunCertificationAuthorityAction;
|
|
79
|
+
readonly completion_semantics: "begin-run" | "append-heartbeat" | "record-process-restart" | "terminal-run-completed";
|
|
80
|
+
readonly run_id: string;
|
|
81
|
+
readonly operation_id: string;
|
|
82
|
+
readonly run_kind: "12h" | "24h";
|
|
83
|
+
readonly policy_sha256: string;
|
|
84
|
+
readonly ticket_set_digest: string;
|
|
85
|
+
readonly service_plan_digest: string;
|
|
86
|
+
readonly expected_head: CanonicalRunHeadReference | null;
|
|
87
|
+
readonly previous_canary: CanonicalRunCertificationReference | null;
|
|
88
|
+
}
|
|
89
|
+
export interface AuthorizeRunCertificationInput {
|
|
90
|
+
readonly action: RunCertificationAuthorityAction;
|
|
91
|
+
readonly decisionId: string;
|
|
92
|
+
readonly authorizedBy: string;
|
|
93
|
+
readonly runId: string;
|
|
94
|
+
readonly operationId: string;
|
|
95
|
+
readonly runKind: "12h" | "24h";
|
|
96
|
+
readonly policyDigest: string;
|
|
97
|
+
readonly ticketSetDigest: string;
|
|
98
|
+
readonly servicePlanDigest: string;
|
|
99
|
+
readonly expectedHead: CanonicalRunHeadReference | null;
|
|
100
|
+
readonly previousCanary: CanonicalRunCertificationReference | null;
|
|
101
|
+
}
|
|
102
|
+
export interface RunCertificationAuthorityReference {
|
|
103
|
+
readonly [CERTIFICATION_REFERENCE]: true;
|
|
104
|
+
readonly eventId: string;
|
|
105
|
+
readonly consumerId: typeof CERTIFICATION_CONSUMER_ID;
|
|
106
|
+
}
|
|
107
|
+
export interface ResolvedRunCertificationAuthority {
|
|
108
|
+
readonly reference: {
|
|
109
|
+
readonly event_id: string;
|
|
110
|
+
readonly consumer_id: typeof CERTIFICATION_CONSUMER_ID;
|
|
111
|
+
};
|
|
112
|
+
readonly binding: RunCertificationAuthorityBinding;
|
|
113
|
+
readonly decision_id: string;
|
|
114
|
+
readonly authorized_by: string;
|
|
115
|
+
readonly event_sha256: string;
|
|
116
|
+
readonly receipt_sha256: string;
|
|
117
|
+
readonly occurred_at: string;
|
|
118
|
+
readonly processed_at: string;
|
|
119
|
+
}
|
|
120
|
+
export interface RunCertificationAuthorityWriter {
|
|
121
|
+
readonly [CERTIFICATION_WRITER]: true;
|
|
122
|
+
authorize(input: AuthorizeRunCertificationInput): RunCertificationAuthorityReference;
|
|
123
|
+
}
|
|
124
|
+
export interface RunCertificationAuthorityResolver {
|
|
125
|
+
readonly [CERTIFICATION_RESOLVER]: true;
|
|
126
|
+
resolve(reference: RunCertificationAuthorityReference): ResolvedRunCertificationAuthority;
|
|
127
|
+
hydrate(reference: {
|
|
128
|
+
readonly eventId: string;
|
|
129
|
+
readonly consumerId: string;
|
|
130
|
+
}): RunCertificationAuthorityReference;
|
|
131
|
+
resolveStored(reference: {
|
|
132
|
+
readonly event_id: string;
|
|
133
|
+
readonly consumer_id: string;
|
|
134
|
+
}): ResolvedRunCertificationAuthority;
|
|
135
|
+
}
|
|
136
|
+
export interface RunCertificationAuthority {
|
|
137
|
+
readonly writer: RunCertificationAuthorityWriter;
|
|
138
|
+
readonly resolver: RunCertificationAuthorityResolver;
|
|
139
|
+
}
|
|
140
|
+
export declare class ImmutableOutboxConflictError extends Error {
|
|
141
|
+
constructor(kind: "event" | "receipt", id: string);
|
|
142
|
+
}
|
|
143
|
+
export declare function createOutboxStore(options: {
|
|
144
|
+
eventsRoot: string;
|
|
145
|
+
receiptsRoot: string;
|
|
146
|
+
locksRoot: string;
|
|
147
|
+
}): OutboxStore;
|
|
148
|
+
export declare function assertOutboxStore(value: unknown): asserts value is OutboxStore;
|
|
149
|
+
export declare function createRunCertificationAuthority(outbox: OutboxStore): RunCertificationAuthority;
|
|
150
|
+
export declare function assertRunCertificationAuthorityWriter(value: unknown): asserts value is RunCertificationAuthorityWriter;
|
|
151
|
+
export declare function assertRunCertificationAuthorityResolver(value: unknown): asserts value is RunCertificationAuthorityResolver;
|
|
152
|
+
export declare function assertRunCertificationAuthorityReference(value: unknown): asserts value is RunCertificationAuthorityReference;
|
|
153
|
+
export declare function deriveEventId(input: Pick<PublishOutboxEventInput, "eventKind" | "sourceId" | "sourceVersion" | "dedupeKey">): string;
|
|
154
|
+
export declare function deriveReceiptId(eventId: string, consumerId: string): string;
|
|
155
|
+
export declare function deriveOperationNonce(eventId: string, consumerId: string): string;
|
|
156
|
+
export declare function deriveProcessingLockId(eventId: string, consumerId: string): string;
|
|
157
|
+
export declare function assertOutboxTimestamp(value: string, label: string): string;
|
|
158
|
+
export {};
|