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,115 @@
|
|
|
1
|
+
import { join } from "node:path";
|
|
2
|
+
import { assertOpaqueId } from "../domain/records.js";
|
|
3
|
+
import { assertOutboxStore, } from "../outbox/store.js";
|
|
4
|
+
import { assertSchema, loadJsonSchema } from "../runtime/schema.js";
|
|
5
|
+
import { bindRuntimeComponent, createRuntimeComposition, } from "../runtime/composition.js";
|
|
6
|
+
import { OMS_EVENT_KINDS } from "./kinds.js";
|
|
7
|
+
const EVENT_BUS = Symbol("OMS runtime event bus");
|
|
8
|
+
const EVENT_BUSES = new WeakSet();
|
|
9
|
+
const TYPED_RUNTIME_EVENTS = new WeakSet();
|
|
10
|
+
export function createRuntimeEventBus(options) {
|
|
11
|
+
const outbox = options.outbox;
|
|
12
|
+
const packageRoot = options.packageRoot;
|
|
13
|
+
const composition = options.composition ?? createRuntimeComposition();
|
|
14
|
+
assertOutboxStore(outbox);
|
|
15
|
+
const schemas = new Map(OMS_EVENT_KINDS.map((kind) => [
|
|
16
|
+
kind,
|
|
17
|
+
loadJsonSchema(join(packageRoot, "schemas", "events", `${kind}.schema.json`)),
|
|
18
|
+
]));
|
|
19
|
+
function validate(event, expectedKind) {
|
|
20
|
+
if (event.event_kind !== expectedKind)
|
|
21
|
+
throw new Error(`runtime event is not ${expectedKind}`);
|
|
22
|
+
const schema = schemas.get(expectedKind);
|
|
23
|
+
if (!schema)
|
|
24
|
+
throw new Error(`runtime event schema is missing: ${expectedKind}`);
|
|
25
|
+
assertSchema(event.payload, schema, `${expectedKind} payload`);
|
|
26
|
+
const typed = deepFreeze(structuredClone(event));
|
|
27
|
+
TYPED_RUNTIME_EVENTS.add(typed);
|
|
28
|
+
return typed;
|
|
29
|
+
}
|
|
30
|
+
const bus = Object.freeze({
|
|
31
|
+
[EVENT_BUS]: true,
|
|
32
|
+
publish(kind, identity, payload) {
|
|
33
|
+
assertEventKind(kind);
|
|
34
|
+
const capturedIdentity = {
|
|
35
|
+
sourceId: identity.sourceId,
|
|
36
|
+
sourceVersion: identity.sourceVersion,
|
|
37
|
+
dedupeKey: identity.dedupeKey,
|
|
38
|
+
occurredAt: identity.occurredAt,
|
|
39
|
+
};
|
|
40
|
+
const detachedPayload = structuredClone(payload);
|
|
41
|
+
const schema = schemas.get(kind);
|
|
42
|
+
if (!schema)
|
|
43
|
+
throw new Error(`runtime event schema is missing: ${kind}`);
|
|
44
|
+
assertSchema(detachedPayload, schema, `${kind} payload before publish`);
|
|
45
|
+
const published = outbox.publish({
|
|
46
|
+
eventKind: kind,
|
|
47
|
+
sourceId: assertOpaqueId(capturedIdentity.sourceId, "event source id"),
|
|
48
|
+
sourceVersion: capturedIdentity.sourceVersion,
|
|
49
|
+
dedupeKey: assertOpaqueId(capturedIdentity.dedupeKey, "event dedupe key"),
|
|
50
|
+
occurredAt: capturedIdentity.occurredAt,
|
|
51
|
+
payload: detachedPayload,
|
|
52
|
+
});
|
|
53
|
+
return Object.freeze({ status: published.status, event: validate(published.event, kind) });
|
|
54
|
+
},
|
|
55
|
+
read(eventId, kind) {
|
|
56
|
+
assertEventKind(kind);
|
|
57
|
+
return validate(outbox.readEvent(assertOpaqueId(eventId, "runtime event id")), kind);
|
|
58
|
+
},
|
|
59
|
+
find(kind, identity) {
|
|
60
|
+
assertEventKind(kind);
|
|
61
|
+
const capturedIdentity = {
|
|
62
|
+
sourceId: assertOpaqueId(identity.sourceId, "event source id"),
|
|
63
|
+
sourceVersion: identity.sourceVersion,
|
|
64
|
+
dedupeKey: assertOpaqueId(identity.dedupeKey, "event dedupe key"),
|
|
65
|
+
occurredAt: identity.occurredAt,
|
|
66
|
+
};
|
|
67
|
+
const matches = outbox.listEvents().filter((event) => (event.event_kind === kind
|
|
68
|
+
&& event.source_id === capturedIdentity.sourceId
|
|
69
|
+
&& event.source_version === capturedIdentity.sourceVersion
|
|
70
|
+
&& event.dedupe_key === capturedIdentity.dedupeKey
|
|
71
|
+
&& event.occurred_at === capturedIdentity.occurredAt));
|
|
72
|
+
if (matches.length > 1)
|
|
73
|
+
throw new Error("runtime event identity is ambiguous");
|
|
74
|
+
return matches[0] ? validate(matches[0], kind) : undefined;
|
|
75
|
+
},
|
|
76
|
+
pending(consumerId, kind) {
|
|
77
|
+
assertEventKind(kind);
|
|
78
|
+
const pending = outbox.listPending(assertOpaqueId(consumerId, "runtime event consumer"))
|
|
79
|
+
.filter((event) => event.event_kind === kind)
|
|
80
|
+
.map((event) => validate(event, kind));
|
|
81
|
+
return Object.freeze(pending);
|
|
82
|
+
},
|
|
83
|
+
});
|
|
84
|
+
bindRuntimeComponent(bus, composition);
|
|
85
|
+
EVENT_BUSES.add(bus);
|
|
86
|
+
return bus;
|
|
87
|
+
}
|
|
88
|
+
export function assertRuntimeEventBus(value) {
|
|
89
|
+
if (typeof value !== "object" || value === null || !EVENT_BUSES.has(value)) {
|
|
90
|
+
throw new Error("event operation requires a real OMS runtime event bus");
|
|
91
|
+
}
|
|
92
|
+
if (!Object.isFrozen(value))
|
|
93
|
+
throw new Error("runtime event bus lost its authority boundary");
|
|
94
|
+
}
|
|
95
|
+
export function assertTypedRuntimeEvent(value, kind) {
|
|
96
|
+
if (typeof value !== "object" || value === null || !TYPED_RUNTIME_EVENTS.has(value)) {
|
|
97
|
+
throw new Error(`quota authority requires a real stored ${kind} event`);
|
|
98
|
+
}
|
|
99
|
+
if (!Object.isFrozen(value) || value.event_kind !== kind) {
|
|
100
|
+
throw new Error(`runtime event lost its ${kind} authority boundary`);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
function assertEventKind(value) {
|
|
104
|
+
if (!OMS_EVENT_KINDS.includes(value))
|
|
105
|
+
throw new Error("unknown OMS runtime event kind");
|
|
106
|
+
}
|
|
107
|
+
function deepFreeze(value, seen = new Set()) {
|
|
108
|
+
if (typeof value !== "object" || value === null || seen.has(value))
|
|
109
|
+
return value;
|
|
110
|
+
seen.add(value);
|
|
111
|
+
for (const child of Object.values(value))
|
|
112
|
+
deepFreeze(child, seen);
|
|
113
|
+
return Object.freeze(value);
|
|
114
|
+
}
|
|
115
|
+
//# sourceMappingURL=bus.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bus.js","sourceRoot":"","sources":["../../../src/events/bus.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
import type { QuotaObservationReference } from "../runtime/quota.js";
|
|
2
|
+
import type { ProviderObservation } from "../hooks/provider.js";
|
|
3
|
+
export interface NativeHookTicketAuthority extends Record<string, unknown> {
|
|
4
|
+
ticket_id: string;
|
|
5
|
+
ticket_version: number;
|
|
6
|
+
ticket_attempt: number;
|
|
7
|
+
ticket_actor: string;
|
|
8
|
+
lease_token: string;
|
|
9
|
+
}
|
|
10
|
+
export declare const OMS_EVENT_KINDS: readonly ["native-hook-observed", "provider-observed", "github-observed", "structured-role-completed", "dispatch-delivery-requested", "ticket-resume-due", "run-heartbeat-due", "watchdog-lease-expired", "watchdog-session-stalled", "watchdog-outbox-stalled", "slack-notification-requested"];
|
|
11
|
+
export type OmsEventKind = (typeof OMS_EVENT_KINDS)[number];
|
|
12
|
+
export interface DispatchDeliveryRequestedPayload extends Record<string, unknown> {
|
|
13
|
+
dispatch_id: string;
|
|
14
|
+
dispatch_version: 1;
|
|
15
|
+
worker_record_id: string;
|
|
16
|
+
ticket_id: string;
|
|
17
|
+
attempt: number;
|
|
18
|
+
lease_token: string;
|
|
19
|
+
requested_at: string;
|
|
20
|
+
}
|
|
21
|
+
export interface NativeHookObservedPayload extends Record<string, unknown> {
|
|
22
|
+
delivery_id: string;
|
|
23
|
+
hook_kind: "session-started" | "session-heartbeat" | "session-stopped" | "quota-exhausted" | "quota-available";
|
|
24
|
+
session_id: string;
|
|
25
|
+
session_version: number;
|
|
26
|
+
role_id: string;
|
|
27
|
+
engine: "claude" | "codex";
|
|
28
|
+
mode: "pane" | "goal" | "exec";
|
|
29
|
+
run_id: string | null;
|
|
30
|
+
ticket_id: string | null;
|
|
31
|
+
native_session_ref: string;
|
|
32
|
+
tmux_pane_id: string | null;
|
|
33
|
+
observed_at: string;
|
|
34
|
+
heartbeat_deadline_at: string | null;
|
|
35
|
+
quota_valid_until: string | null;
|
|
36
|
+
quota_resume_at: string | null;
|
|
37
|
+
source_sha256: string;
|
|
38
|
+
ticket_authority: NativeHookTicketAuthority | null;
|
|
39
|
+
}
|
|
40
|
+
export interface GithubObservedPayload extends Record<string, unknown> {
|
|
41
|
+
observation_key: string;
|
|
42
|
+
observation_kind: "issue" | "comment" | "label" | "branch" | "pull_request" | "review" | "check";
|
|
43
|
+
repository: string;
|
|
44
|
+
source_id_sha256: string;
|
|
45
|
+
source_version_sha256: string;
|
|
46
|
+
change: "present" | "removed";
|
|
47
|
+
presence_generation: number;
|
|
48
|
+
observed_at: string;
|
|
49
|
+
payload_sha256: string;
|
|
50
|
+
snapshot_file: string;
|
|
51
|
+
}
|
|
52
|
+
export interface StructuredRoleCompletedPayload extends Record<string, unknown> {
|
|
53
|
+
schema_version: 1;
|
|
54
|
+
request_id: string;
|
|
55
|
+
role_id: "oms.grader.claude" | "oms.bounded-dreamer";
|
|
56
|
+
result_gate_id: string;
|
|
57
|
+
dispatch_id: string;
|
|
58
|
+
ticket_id: string;
|
|
59
|
+
claude_session_id: string;
|
|
60
|
+
submitted_at: string;
|
|
61
|
+
result_sha256: string;
|
|
62
|
+
terminal_authority: false;
|
|
63
|
+
}
|
|
64
|
+
export interface TicketResumeDuePayload extends Record<string, unknown> {
|
|
65
|
+
ticket_id: string;
|
|
66
|
+
ticket_version: number;
|
|
67
|
+
ticket_attempt: number;
|
|
68
|
+
ticket_actor: string;
|
|
69
|
+
ticket_lease_token: string | null;
|
|
70
|
+
role_id: string | null;
|
|
71
|
+
quota_observation: QuotaObservationReference | null;
|
|
72
|
+
session_version: number | null;
|
|
73
|
+
due_at: string;
|
|
74
|
+
emitted_at: string;
|
|
75
|
+
latency_ms: number;
|
|
76
|
+
policy_digest: string;
|
|
77
|
+
}
|
|
78
|
+
export interface RunHeartbeatDuePayload extends Record<string, unknown> {
|
|
79
|
+
run_id: string;
|
|
80
|
+
expected_head_sha256: string;
|
|
81
|
+
emitted_at: string;
|
|
82
|
+
}
|
|
83
|
+
export interface WatchdogLeaseExpiredPayload extends Record<string, unknown> {
|
|
84
|
+
ticket_id: string;
|
|
85
|
+
ticket_version: number;
|
|
86
|
+
ticket_attempt: number;
|
|
87
|
+
ticket_actor: string;
|
|
88
|
+
lease_token: string;
|
|
89
|
+
lease_expires_at: string;
|
|
90
|
+
observed_at: string;
|
|
91
|
+
}
|
|
92
|
+
export interface WatchdogSessionStalledPayload extends Record<string, unknown> {
|
|
93
|
+
session_id: string;
|
|
94
|
+
session_version: number;
|
|
95
|
+
heartbeat_deadline_at: string;
|
|
96
|
+
observed_at: string;
|
|
97
|
+
}
|
|
98
|
+
export interface WatchdogOutboxStalledPayload extends Record<string, unknown> {
|
|
99
|
+
event_id: string;
|
|
100
|
+
consumer_id: string;
|
|
101
|
+
occurred_at: string;
|
|
102
|
+
observed_at: string;
|
|
103
|
+
age_ms: number;
|
|
104
|
+
}
|
|
105
|
+
export interface SlackNotificationRequestedPayload extends Record<string, unknown> {
|
|
106
|
+
subject_kind: "run" | "ticket" | "session" | "report";
|
|
107
|
+
subject_id: string;
|
|
108
|
+
source_version: number;
|
|
109
|
+
template_id: string;
|
|
110
|
+
severity: "info" | "warning" | "error";
|
|
111
|
+
artifact_ref: string;
|
|
112
|
+
channel_ref: string;
|
|
113
|
+
}
|
|
114
|
+
export interface EventPayloadMap {
|
|
115
|
+
"native-hook-observed": NativeHookObservedPayload;
|
|
116
|
+
"provider-observed": ProviderObservation;
|
|
117
|
+
"github-observed": GithubObservedPayload;
|
|
118
|
+
"structured-role-completed": StructuredRoleCompletedPayload;
|
|
119
|
+
"dispatch-delivery-requested": DispatchDeliveryRequestedPayload;
|
|
120
|
+
"ticket-resume-due": TicketResumeDuePayload;
|
|
121
|
+
"run-heartbeat-due": RunHeartbeatDuePayload;
|
|
122
|
+
"watchdog-lease-expired": WatchdogLeaseExpiredPayload;
|
|
123
|
+
"watchdog-session-stalled": WatchdogSessionStalledPayload;
|
|
124
|
+
"watchdog-outbox-stalled": WatchdogOutboxStalledPayload;
|
|
125
|
+
"slack-notification-requested": SlackNotificationRequestedPayload;
|
|
126
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export const OMS_EVENT_KINDS = [
|
|
2
|
+
"native-hook-observed",
|
|
3
|
+
"provider-observed",
|
|
4
|
+
"github-observed",
|
|
5
|
+
"structured-role-completed",
|
|
6
|
+
"dispatch-delivery-requested",
|
|
7
|
+
"ticket-resume-due",
|
|
8
|
+
"run-heartbeat-due",
|
|
9
|
+
"watchdog-lease-expired",
|
|
10
|
+
"watchdog-session-stalled",
|
|
11
|
+
"watchdog-outbox-stalled",
|
|
12
|
+
"slack-notification-requested",
|
|
13
|
+
];
|
|
14
|
+
//# sourceMappingURL=kinds.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"kinds.js","sourceRoot":"","sources":["../../../src/events/kinds.ts"],"names":[],"mappings":"AAWA,MAAM,CAAC,MAAM,eAAe,GAAG;IAC7B,sBAAsB;IACtB,mBAAmB;IACnB,iBAAiB;IACjB,2BAA2B;IAC3B,6BAA6B;IAC7B,mBAAmB;IACnB,mBAAmB;IACnB,wBAAwB;IACxB,0BAA0B;IAC1B,yBAAyB;IACzB,8BAA8B;CACtB,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export declare class ImmutableFileConflictError extends Error {
|
|
2
|
+
constructor(path: string);
|
|
3
|
+
}
|
|
4
|
+
export interface StableDirectory {
|
|
5
|
+
readonly path: string;
|
|
6
|
+
assertUnchanged(): void;
|
|
7
|
+
close(): void;
|
|
8
|
+
}
|
|
9
|
+
export declare function openStableDirectory(path: string, label: string): StableDirectory;
|
|
10
|
+
export declare function readImmutableFile(path: string, maxBytes?: number): Buffer;
|
|
11
|
+
export declare function writeImmutableFile(path: string, bytes: Buffer): "created" | "replayed";
|
|
12
|
+
export declare function assertFileInside(directory: StableDirectory, path: string): void;
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
import { chmodSync, closeSync, constants, fstatSync, fsyncSync, linkSync, lstatSync, openSync, readFileSync, unlinkSync, writeFileSync, } from "node:fs";
|
|
2
|
+
import { randomUUID } from "node:crypto";
|
|
3
|
+
import { dirname } from "node:path";
|
|
4
|
+
import { fsyncDirectory, validateExistingDirectory } from "../utils/fs.js";
|
|
5
|
+
const DEFAULT_MAX_BYTES = 4 * 1024 * 1024;
|
|
6
|
+
export class ImmutableFileConflictError extends Error {
|
|
7
|
+
constructor(path) {
|
|
8
|
+
super(`immutable file already exists with different content: ${path}`);
|
|
9
|
+
this.name = "ImmutableFileConflictError";
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
export function openStableDirectory(path, label) {
|
|
13
|
+
const stablePath = validateExistingDirectory(path, label);
|
|
14
|
+
const noFollow = typeof constants.O_NOFOLLOW === "number" ? constants.O_NOFOLLOW : 0;
|
|
15
|
+
const directoryOnly = typeof constants.O_DIRECTORY === "number" ? constants.O_DIRECTORY : 0;
|
|
16
|
+
const descriptor = openSync(stablePath, constants.O_RDONLY | noFollow | directoryOnly);
|
|
17
|
+
const opened = fstatSync(descriptor);
|
|
18
|
+
const entry = lstatSync(stablePath);
|
|
19
|
+
if (!opened.isDirectory() || opened.dev !== entry.dev || opened.ino !== entry.ino) {
|
|
20
|
+
closeSync(descriptor);
|
|
21
|
+
throw new Error(`${label} changed while opening`);
|
|
22
|
+
}
|
|
23
|
+
const device = opened.dev;
|
|
24
|
+
const inode = opened.ino;
|
|
25
|
+
let closed = false;
|
|
26
|
+
return {
|
|
27
|
+
path: stablePath,
|
|
28
|
+
assertUnchanged() {
|
|
29
|
+
if (closed)
|
|
30
|
+
throw new Error(`${label} handle is closed`);
|
|
31
|
+
const held = fstatSync(descriptor);
|
|
32
|
+
const currentPath = validateExistingDirectory(stablePath, label);
|
|
33
|
+
const current = lstatSync(currentPath);
|
|
34
|
+
if (!held.isDirectory()
|
|
35
|
+
|| held.dev !== device
|
|
36
|
+
|| held.ino !== inode
|
|
37
|
+
|| currentPath !== stablePath
|
|
38
|
+
|| current.dev !== device
|
|
39
|
+
|| current.ino !== inode) {
|
|
40
|
+
throw new Error(`${label} changed after store creation`);
|
|
41
|
+
}
|
|
42
|
+
},
|
|
43
|
+
close() {
|
|
44
|
+
if (closed)
|
|
45
|
+
return;
|
|
46
|
+
closeSync(descriptor);
|
|
47
|
+
closed = true;
|
|
48
|
+
},
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
export function readImmutableFile(path, maxBytes = DEFAULT_MAX_BYTES) {
|
|
52
|
+
assertMaxBytes(maxBytes);
|
|
53
|
+
let descriptor;
|
|
54
|
+
try {
|
|
55
|
+
const before = lstatSync(path);
|
|
56
|
+
if (before.isSymbolicLink() || !before.isFile())
|
|
57
|
+
throw new Error("path is not a regular file");
|
|
58
|
+
if (before.size > maxBytes)
|
|
59
|
+
throw new Error(`file exceeds ${maxBytes} bytes`);
|
|
60
|
+
const noFollow = typeof constants.O_NOFOLLOW === "number" ? constants.O_NOFOLLOW : 0;
|
|
61
|
+
descriptor = openSync(path, constants.O_RDONLY | noFollow);
|
|
62
|
+
const opened = fstatSync(descriptor);
|
|
63
|
+
if (!opened.isFile() || opened.dev !== before.dev || opened.ino !== before.ino) {
|
|
64
|
+
throw new Error("path changed while opening");
|
|
65
|
+
}
|
|
66
|
+
if (opened.size > maxBytes)
|
|
67
|
+
throw new Error(`file exceeds ${maxBytes} bytes`);
|
|
68
|
+
const bytes = readFileSync(descriptor);
|
|
69
|
+
if (bytes.byteLength > maxBytes)
|
|
70
|
+
throw new Error(`file exceeds ${maxBytes} bytes`);
|
|
71
|
+
closeSync(descriptor);
|
|
72
|
+
descriptor = undefined;
|
|
73
|
+
return bytes;
|
|
74
|
+
}
|
|
75
|
+
catch (error) {
|
|
76
|
+
if (descriptor !== undefined)
|
|
77
|
+
closeSync(descriptor);
|
|
78
|
+
throw new Error(`unable to safely read immutable file ${path}: ${errorMessage(error)}`);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
export function writeImmutableFile(path, bytes) {
|
|
82
|
+
const temporary = `${path}.tmp.${process.pid}.${randomUUID()}`;
|
|
83
|
+
let descriptor;
|
|
84
|
+
let linkingDestination = false;
|
|
85
|
+
try {
|
|
86
|
+
descriptor = openSync(temporary, "wx", 0o600);
|
|
87
|
+
writeFileSync(descriptor, bytes);
|
|
88
|
+
fsyncSync(descriptor);
|
|
89
|
+
closeSync(descriptor);
|
|
90
|
+
descriptor = undefined;
|
|
91
|
+
chmodSync(temporary, 0o600);
|
|
92
|
+
linkingDestination = true;
|
|
93
|
+
linkSync(temporary, path);
|
|
94
|
+
linkingDestination = false;
|
|
95
|
+
fsyncDirectory(dirname(path));
|
|
96
|
+
let removed = false;
|
|
97
|
+
try {
|
|
98
|
+
unlinkSync(temporary);
|
|
99
|
+
removed = true;
|
|
100
|
+
}
|
|
101
|
+
catch {
|
|
102
|
+
// The immutable destination is committed; a stale temp file is safe to clean later.
|
|
103
|
+
}
|
|
104
|
+
if (removed)
|
|
105
|
+
fsyncDirectory(dirname(path));
|
|
106
|
+
return "created";
|
|
107
|
+
}
|
|
108
|
+
catch (error) {
|
|
109
|
+
if (descriptor !== undefined)
|
|
110
|
+
closeSync(descriptor);
|
|
111
|
+
try {
|
|
112
|
+
unlinkSync(temporary);
|
|
113
|
+
}
|
|
114
|
+
catch {
|
|
115
|
+
// The temporary file may not have been created or may already be removed.
|
|
116
|
+
}
|
|
117
|
+
if (linkingDestination && isAlreadyExists(error)) {
|
|
118
|
+
const existing = readImmutableFile(path);
|
|
119
|
+
if (existing.equals(bytes))
|
|
120
|
+
return "replayed";
|
|
121
|
+
throw new ImmutableFileConflictError(path);
|
|
122
|
+
}
|
|
123
|
+
throw error;
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
export function assertFileInside(directory, path) {
|
|
127
|
+
directory.assertUnchanged();
|
|
128
|
+
if (dirname(path) !== directory.path)
|
|
129
|
+
throw new Error(`immutable file is outside ${directory.path}`);
|
|
130
|
+
}
|
|
131
|
+
function assertMaxBytes(value) {
|
|
132
|
+
if (!Number.isSafeInteger(value) || value < 1)
|
|
133
|
+
throw new Error("maxBytes must be a positive integer");
|
|
134
|
+
}
|
|
135
|
+
function isAlreadyExists(error) {
|
|
136
|
+
return typeof error === "object" && error !== null && "code" in error && error.code === "EEXIST";
|
|
137
|
+
}
|
|
138
|
+
function errorMessage(error) {
|
|
139
|
+
return error instanceof Error ? error.message : String(error);
|
|
140
|
+
}
|
|
141
|
+
//# sourceMappingURL=immutable-file.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"immutable-file.js","sourceRoot":"","sources":["../../../src/evidence/immutable-file.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
import { type TicketMaterializer } from "../tickets/materializer.js";
|
|
2
|
+
import { type SyncTicketResult } from "../tickets/store.js";
|
|
3
|
+
import { type ProtectedVerificationRun } from "../verification/protected-runner.js";
|
|
4
|
+
import { type ProtectedGradeSource } from "../verification/grade-source.js";
|
|
5
|
+
import { type ProtectedAdvisorProvenance } from "../dispatch/advice-source.js";
|
|
6
|
+
export type EvidenceKind = "verification-plan" | "executor-result" | "goal-executor-result" | "lease-expiry" | "deterministic-check" | "advisor-output" | "grader-output" | "live-disclosure" | "live-outcome" | "trust-run" | "reflection" | "trust-report";
|
|
7
|
+
export type Slice3EvidenceKind = EvidenceKind;
|
|
8
|
+
export type EvidenceRecord = {
|
|
9
|
+
schema_version: 1;
|
|
10
|
+
evidence_id: string;
|
|
11
|
+
evidence_kind: EvidenceKind;
|
|
12
|
+
ticket_id: string | null;
|
|
13
|
+
producer_role: string;
|
|
14
|
+
created_at: string;
|
|
15
|
+
payload: Record<string, unknown>;
|
|
16
|
+
};
|
|
17
|
+
export interface EvidenceReference {
|
|
18
|
+
evidence_id: string;
|
|
19
|
+
sha256: string;
|
|
20
|
+
file_name: string;
|
|
21
|
+
}
|
|
22
|
+
export interface EvidenceReader {
|
|
23
|
+
read(ref: EvidenceReference): EvidenceRecord;
|
|
24
|
+
references(kind?: EvidenceKind): EvidenceReference[];
|
|
25
|
+
absolutePath(ref: EvidenceReference): string;
|
|
26
|
+
}
|
|
27
|
+
export interface EvidenceStore extends EvidenceReader {
|
|
28
|
+
write(record: EvidenceRecord): EvidenceWriteResult;
|
|
29
|
+
}
|
|
30
|
+
export type EvidenceWriteResult = {
|
|
31
|
+
status: "created" | "replayed";
|
|
32
|
+
ref: EvidenceReference;
|
|
33
|
+
record: EvidenceRecord;
|
|
34
|
+
};
|
|
35
|
+
declare const PROTECTED_RESULT_GATE_WRITER: unique symbol;
|
|
36
|
+
declare const PROTECTED_ADVISOR_WRITER: unique symbol;
|
|
37
|
+
export declare function assertEvidenceStore(value: unknown): asserts value is EvidenceStore;
|
|
38
|
+
export declare function registeredEvidenceKinds(): EvidenceKind[];
|
|
39
|
+
export declare function createEvidenceStore(options: {
|
|
40
|
+
evidenceRoot: string;
|
|
41
|
+
packageRoot?: string;
|
|
42
|
+
}): EvidenceStore;
|
|
43
|
+
export interface ProtectedResultGateEvidenceWriter {
|
|
44
|
+
readonly [PROTECTED_RESULT_GATE_WRITER]: true;
|
|
45
|
+
writeDeterministic(options: {
|
|
46
|
+
evidenceId: string;
|
|
47
|
+
createdAt: string;
|
|
48
|
+
run: ProtectedVerificationRun;
|
|
49
|
+
}): EvidenceWriteResult;
|
|
50
|
+
writeGrade(record: EvidenceRecord, source: ProtectedGradeSource): EvidenceWriteResult;
|
|
51
|
+
}
|
|
52
|
+
/** Branded writer used only by the protected verification/result-gate authority. */
|
|
53
|
+
export declare function createProtectedResultGateEvidenceWriter(evidenceStore: EvidenceStore): ProtectedResultGateEvidenceWriter;
|
|
54
|
+
export declare function assertProtectedResultGateEvidenceWriter(value: unknown): asserts value is ProtectedResultGateEvidenceWriter;
|
|
55
|
+
export interface ProtectedAdvisorEvidenceWriter {
|
|
56
|
+
readonly [PROTECTED_ADVISOR_WRITER]: true;
|
|
57
|
+
writeAdvice(options: {
|
|
58
|
+
readonly createdAt: string;
|
|
59
|
+
}, provenance: ProtectedAdvisorProvenance): EvidenceWriteResult;
|
|
60
|
+
}
|
|
61
|
+
/** Branded writer used only by the protected pre-dispatch advisor authority. */
|
|
62
|
+
export declare function createProtectedAdvisorEvidenceWriter(evidenceStore: EvidenceStore): ProtectedAdvisorEvidenceWriter;
|
|
63
|
+
export declare function assertProtectedAdvisorEvidenceWriter(value: unknown): asserts value is ProtectedAdvisorEvidenceWriter;
|
|
64
|
+
export declare function writeTicketBoundEvidence(options: {
|
|
65
|
+
evidenceStore: EvidenceStore;
|
|
66
|
+
ticketMaterializer: TicketMaterializer;
|
|
67
|
+
record: EvidenceRecord;
|
|
68
|
+
}): EvidenceWriteResult;
|
|
69
|
+
export type GithubProbeCertification = "live" | "non-certifying";
|
|
70
|
+
export interface GithubQueueDisclosure {
|
|
71
|
+
schema_version: 1;
|
|
72
|
+
certification: GithubProbeCertification;
|
|
73
|
+
run_id: string;
|
|
74
|
+
contact_surface: "github-api-via-gh";
|
|
75
|
+
expected_spend: "none";
|
|
76
|
+
operation: "read-ready-issues";
|
|
77
|
+
repository: string;
|
|
78
|
+
ready_label: string;
|
|
79
|
+
issue_limit: number;
|
|
80
|
+
}
|
|
81
|
+
export interface GithubSyncedTicket {
|
|
82
|
+
ticket_id: string;
|
|
83
|
+
content_sha256: string;
|
|
84
|
+
content_file: string;
|
|
85
|
+
record_version: number;
|
|
86
|
+
sync_status: "created" | "refreshed" | "unchanged";
|
|
87
|
+
}
|
|
88
|
+
export interface GithubQueueProbeResult {
|
|
89
|
+
contacted: boolean;
|
|
90
|
+
disclosure: GithubQueueDisclosure;
|
|
91
|
+
disclosureEvidence?: EvidenceReference;
|
|
92
|
+
outcomeEvidence?: EvidenceReference;
|
|
93
|
+
syncResults: readonly SyncTicketResult[];
|
|
94
|
+
}
|
|
95
|
+
export declare class GithubQueueProbeError extends Error {
|
|
96
|
+
readonly phase: "contact" | "sync" | "evidence";
|
|
97
|
+
readonly contacted: boolean;
|
|
98
|
+
readonly outcomeEvidence?: EvidenceReference;
|
|
99
|
+
constructor(options: {
|
|
100
|
+
phase: "contact" | "sync" | "evidence";
|
|
101
|
+
contacted: boolean;
|
|
102
|
+
outcomeEvidence?: EvidenceReference;
|
|
103
|
+
cause: unknown;
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
export interface GithubQueueProbeOptions {
|
|
107
|
+
runId: string;
|
|
108
|
+
repository: string;
|
|
109
|
+
readyLabel?: string;
|
|
110
|
+
limit?: number;
|
|
111
|
+
confirmLive: boolean;
|
|
112
|
+
cwd: string;
|
|
113
|
+
evidenceStore: EvidenceStore;
|
|
114
|
+
materializer: TicketMaterializer;
|
|
115
|
+
emitDisclosure: (disclosure: Readonly<GithubQueueDisclosure>, evidence: Readonly<EvidenceReference>) => void;
|
|
116
|
+
}
|
|
117
|
+
export interface NonCertifyingGithubQueueProbeFixtureOptions extends GithubQueueProbeOptions {
|
|
118
|
+
env: NodeJS.ProcessEnv;
|
|
119
|
+
}
|
|
120
|
+
/** Certifying path: owns the canonical process, clock, materializer, and evidence writes. */
|
|
121
|
+
export declare function runGithubQueueProbe(options: GithubQueueProbeOptions): GithubQueueProbeResult;
|
|
122
|
+
/** Offline fixture path: still uses runProcess, but every record is permanently non-certifying. */
|
|
123
|
+
export declare function runNonCertifyingGithubQueueProbeFixture(options: NonCertifyingGithubQueueProbeFixtureOptions): GithubQueueProbeResult;
|
|
124
|
+
export declare function sanitizeLiveOutcomeError(value: string): string;
|
|
125
|
+
export {};
|