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,35 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
import { readFileSync } from "node:fs";
|
|
3
|
+
import { hostname, platform, uptime } from "node:os";
|
|
4
|
+
import { assertOpaqueId } from "../domain/records.js";
|
|
5
|
+
const NativeDate = Date;
|
|
6
|
+
const nativeDateNow = Date.now.bind(Date);
|
|
7
|
+
const nativeHrtimeBigint = process.hrtime.bigint.bind(process.hrtime);
|
|
8
|
+
const BOOT_ID = readBootIdentity();
|
|
9
|
+
export function systemClockSample() {
|
|
10
|
+
return Object.freeze({
|
|
11
|
+
wallTime: new NativeDate(nativeDateNow()).toISOString(),
|
|
12
|
+
monotonicNs: nativeHrtimeBigint(),
|
|
13
|
+
bootId: BOOT_ID,
|
|
14
|
+
});
|
|
15
|
+
}
|
|
16
|
+
export function systemBootId() {
|
|
17
|
+
return BOOT_ID;
|
|
18
|
+
}
|
|
19
|
+
function readBootIdentity() {
|
|
20
|
+
let material;
|
|
21
|
+
try {
|
|
22
|
+
const linuxBootId = readFileSync("/proc/sys/kernel/random/boot_id", "utf8").trim().toLowerCase();
|
|
23
|
+
if (!/^[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}$/.test(linuxBootId)) {
|
|
24
|
+
throw new Error("invalid Linux boot id");
|
|
25
|
+
}
|
|
26
|
+
material = `linux:${linuxBootId}`;
|
|
27
|
+
}
|
|
28
|
+
catch {
|
|
29
|
+
const bootEpochSeconds = Math.round((nativeDateNow() - uptime() * 1000) / 1000);
|
|
30
|
+
material = `${platform()}:${hostname()}:${bootEpochSeconds}`;
|
|
31
|
+
}
|
|
32
|
+
const digest = createHash("sha256").update(material, "utf8").digest("hex").slice(0, 48);
|
|
33
|
+
return assertOpaqueId(`boot-${digest}`, "system boot id");
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=system-clock.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"system-clock.js","sourceRoot":"","sources":["../../../src/runtime/system-clock.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACrD,OAAO,EAAE,cAAc,EAAiB,MAAM,sBAAsB,CAAC;AAErE,MAAM,UAAU,GAAG,IAAI,CAAC;AACxB,MAAM,aAAa,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1C,MAAM,kBAAkB,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;AACtE,MAAM,OAAO,GAAG,gBAAgB,EAAE,CAAC;AAQnC,MAAM,UAAU,iBAAiB;IAC/B,OAAO,MAAM,CAAC,MAAM,CAAC;QACnB,QAAQ,EAAE,IAAI,UAAU,CAAC,aAAa,EAAE,CAAC,CAAC,WAAW,EAAE;QACvD,WAAW,EAAE,kBAAkB,EAAE;QACjC,MAAM,EAAE,OAAO;KAChB,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,YAAY;IAC1B,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,SAAS,gBAAgB;IACvB,IAAI,QAAgB,CAAC;IACrB,IAAI,CAAC;QACH,MAAM,WAAW,GAAG,YAAY,CAAC,iCAAiC,EAAE,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QACjG,IAAI,CAAC,gEAAgE,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC;YACxF,MAAM,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAC;QAC3C,CAAC;QACD,QAAQ,GAAG,SAAS,WAAW,EAAE,CAAC;IACpC,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,gBAAgB,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,aAAa,EAAE,GAAG,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC;QAChF,QAAQ,GAAG,GAAG,QAAQ,EAAE,IAAI,QAAQ,EAAE,IAAI,gBAAgB,EAAE,CAAC;IAC/D,CAAC;IACD,MAAM,MAAM,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IACxF,OAAO,cAAc,CAAC,QAAQ,MAAM,EAAE,EAAE,gBAAgB,CAAC,CAAC;AAC5D,CAAC"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
export type ServiceManager = "cron" | "systemd" | "launchd";
|
|
2
|
+
export interface ServicePlanJob {
|
|
3
|
+
readonly id: "minute" | "watchdog";
|
|
4
|
+
readonly interval_seconds: 60 | 900;
|
|
5
|
+
readonly argv: readonly string[];
|
|
6
|
+
}
|
|
7
|
+
export interface ServicePlan {
|
|
8
|
+
readonly schema_version: 1;
|
|
9
|
+
readonly manager: ServiceManager;
|
|
10
|
+
readonly executable_path: string;
|
|
11
|
+
readonly state_root: string;
|
|
12
|
+
readonly workspace_root: string;
|
|
13
|
+
readonly jobs: readonly ServicePlanJob[];
|
|
14
|
+
}
|
|
15
|
+
export interface ServicePlanArtifact {
|
|
16
|
+
readonly relative_path: string;
|
|
17
|
+
readonly bytes: string;
|
|
18
|
+
readonly sha256: string;
|
|
19
|
+
}
|
|
20
|
+
declare const GENERATED_SERVICE_PLAN: unique symbol;
|
|
21
|
+
export interface GeneratedServicePlan {
|
|
22
|
+
readonly [GENERATED_SERVICE_PLAN]: true;
|
|
23
|
+
readonly plan: ServicePlan;
|
|
24
|
+
readonly digest: string;
|
|
25
|
+
readonly artifacts: readonly ServicePlanArtifact[];
|
|
26
|
+
}
|
|
27
|
+
export interface PersistedServicePlanVerification {
|
|
28
|
+
readonly verified: true;
|
|
29
|
+
readonly directory: string;
|
|
30
|
+
readonly digest: string;
|
|
31
|
+
readonly manager: ServiceManager;
|
|
32
|
+
readonly artifacts: readonly Readonly<Pick<ServicePlanArtifact, "relative_path" | "sha256">>[];
|
|
33
|
+
}
|
|
34
|
+
export declare function generateServicePlan(options: {
|
|
35
|
+
manager: ServiceManager;
|
|
36
|
+
executablePath: string;
|
|
37
|
+
stateRoot: string;
|
|
38
|
+
workspaceRoot: string;
|
|
39
|
+
packageRoot: string;
|
|
40
|
+
}): GeneratedServicePlan;
|
|
41
|
+
export declare function persistServicePlan(options: {
|
|
42
|
+
generated: GeneratedServicePlan;
|
|
43
|
+
outputRoot: string;
|
|
44
|
+
}): Readonly<{
|
|
45
|
+
directory: string;
|
|
46
|
+
statuses: readonly ("created" | "replayed")[];
|
|
47
|
+
}>;
|
|
48
|
+
export declare function verifyPersistedServicePlan(options: {
|
|
49
|
+
packageRoot: string;
|
|
50
|
+
directory: string;
|
|
51
|
+
expectedDigest: string;
|
|
52
|
+
stateRoot: string;
|
|
53
|
+
workspaceRoot: string;
|
|
54
|
+
executablePath: string;
|
|
55
|
+
manager: ServiceManager;
|
|
56
|
+
}): PersistedServicePlanVerification;
|
|
57
|
+
export declare function assertGeneratedServicePlan(value: unknown): asserts value is GeneratedServicePlan;
|
|
58
|
+
export {};
|
|
@@ -0,0 +1,327 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
import { lstatSync, mkdirSync, readdirSync } from "node:fs";
|
|
3
|
+
import { basename, dirname, isAbsolute, join } from "node:path";
|
|
4
|
+
import { assertFileInside, openStableDirectory, readImmutableFile, writeImmutableFile, } from "../evidence/immutable-file.js";
|
|
5
|
+
import { assertSchema, loadJsonSchema } from "../runtime/schema.js";
|
|
6
|
+
import { errorMessage, validateExistingDirectory } from "../utils/fs.js";
|
|
7
|
+
const GENERATED_SERVICE_PLAN = Symbol("OMS generated service plan");
|
|
8
|
+
const GENERATED_SERVICE_PLANS = new WeakSet();
|
|
9
|
+
const GENERATED_SERVICE_PLAN_METADATA = new WeakMap();
|
|
10
|
+
export function generateServicePlan(options) {
|
|
11
|
+
const captured = {
|
|
12
|
+
manager: options.manager,
|
|
13
|
+
executablePath: options.executablePath,
|
|
14
|
+
stateRoot: options.stateRoot,
|
|
15
|
+
workspaceRoot: options.workspaceRoot,
|
|
16
|
+
packageRoot: options.packageRoot,
|
|
17
|
+
};
|
|
18
|
+
if (captured.manager !== "cron" && captured.manager !== "systemd" && captured.manager !== "launchd") {
|
|
19
|
+
throw new Error("unsupported service manager");
|
|
20
|
+
}
|
|
21
|
+
const executablePath = safeAbsolutePath(captured.executablePath, "OMS executable");
|
|
22
|
+
const stateRoot = safeAbsolutePath(captured.stateRoot, "state root");
|
|
23
|
+
const workspaceRoot = safeAbsolutePath(captured.workspaceRoot, "workspace root");
|
|
24
|
+
const jobs = Object.freeze([
|
|
25
|
+
job("minute", 60, executablePath, stateRoot, workspaceRoot),
|
|
26
|
+
job("watchdog", 900, executablePath, stateRoot, workspaceRoot),
|
|
27
|
+
]);
|
|
28
|
+
const plan = deepFreeze({
|
|
29
|
+
schema_version: 1,
|
|
30
|
+
manager: captured.manager,
|
|
31
|
+
executable_path: executablePath,
|
|
32
|
+
state_root: stateRoot,
|
|
33
|
+
workspace_root: workspaceRoot,
|
|
34
|
+
jobs,
|
|
35
|
+
});
|
|
36
|
+
assertSchema(plan, loadJsonSchema(join(captured.packageRoot, "schemas", "service-plan.schema.json")), "service plan");
|
|
37
|
+
const digest = sha256(canonicalBytes(plan));
|
|
38
|
+
const artifacts = renderArtifacts(plan).map((artifact) => Object.freeze({
|
|
39
|
+
...artifact,
|
|
40
|
+
sha256: sha256(artifact.bytes),
|
|
41
|
+
}));
|
|
42
|
+
const generated = Object.freeze({
|
|
43
|
+
[GENERATED_SERVICE_PLAN]: true,
|
|
44
|
+
plan,
|
|
45
|
+
digest,
|
|
46
|
+
artifacts: Object.freeze(artifacts),
|
|
47
|
+
});
|
|
48
|
+
GENERATED_SERVICE_PLANS.add(generated);
|
|
49
|
+
GENERATED_SERVICE_PLAN_METADATA.set(generated, Object.freeze({ packageRoot: captured.packageRoot }));
|
|
50
|
+
return generated;
|
|
51
|
+
}
|
|
52
|
+
export function persistServicePlan(options) {
|
|
53
|
+
const captured = { generated: options.generated, outputRoot: options.outputRoot };
|
|
54
|
+
assertGeneratedServicePlan(captured.generated);
|
|
55
|
+
const metadata = GENERATED_SERVICE_PLAN_METADATA.get(captured.generated);
|
|
56
|
+
if (!metadata)
|
|
57
|
+
throw new Error("generated service plan metadata is unavailable");
|
|
58
|
+
assertSchema(captured.generated.plan, loadJsonSchema(join(metadata.packageRoot, "schemas", "service-plan.schema.json")), "service plan before persistence");
|
|
59
|
+
if (sha256(canonicalBytes(captured.generated.plan)) !== captured.generated.digest) {
|
|
60
|
+
throw new Error("generated service plan digest changed before persistence");
|
|
61
|
+
}
|
|
62
|
+
const rendered = renderArtifacts(captured.generated.plan).map((artifact) => ({
|
|
63
|
+
...artifact,
|
|
64
|
+
sha256: sha256(artifact.bytes),
|
|
65
|
+
}));
|
|
66
|
+
if (JSON.stringify(rendered) !== JSON.stringify(captured.generated.artifacts)) {
|
|
67
|
+
throw new Error("generated service plan artifacts changed before persistence");
|
|
68
|
+
}
|
|
69
|
+
const outputRoot = validateExistingDirectory(captured.outputRoot, "service plan output root");
|
|
70
|
+
const directory = join(outputRoot, captured.generated.digest);
|
|
71
|
+
if (dirname(directory) !== outputRoot)
|
|
72
|
+
throw new Error("service plan digest escaped its output root");
|
|
73
|
+
try {
|
|
74
|
+
mkdirSync(directory, { mode: 0o700 });
|
|
75
|
+
}
|
|
76
|
+
catch (error) {
|
|
77
|
+
if (!isErrorCode(error, "EEXIST"))
|
|
78
|
+
throw error;
|
|
79
|
+
}
|
|
80
|
+
const stable = openStableDirectory(directory, "service plan digest directory");
|
|
81
|
+
try {
|
|
82
|
+
const entries = [
|
|
83
|
+
{ relative_path: "plan.json", bytes: canonicalBytes(captured.generated.plan) },
|
|
84
|
+
...captured.generated.artifacts.map((artifact) => ({
|
|
85
|
+
relative_path: artifact.relative_path,
|
|
86
|
+
bytes: Buffer.from(artifact.bytes, "utf8"),
|
|
87
|
+
})),
|
|
88
|
+
];
|
|
89
|
+
const statuses = entries.map((entry) => {
|
|
90
|
+
if (!/^[a-z0-9][a-z0-9.-]{0,127}$/.test(entry.relative_path))
|
|
91
|
+
throw new Error("unsafe service artifact name");
|
|
92
|
+
const path = join(stable.path, entry.relative_path);
|
|
93
|
+
assertFileInside(stable, path);
|
|
94
|
+
return writeImmutableFile(path, entry.bytes);
|
|
95
|
+
});
|
|
96
|
+
stable.assertUnchanged();
|
|
97
|
+
return Object.freeze({ directory, statuses: Object.freeze(statuses) });
|
|
98
|
+
}
|
|
99
|
+
finally {
|
|
100
|
+
stable.close();
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
export function verifyPersistedServicePlan(options) {
|
|
104
|
+
const captured = {
|
|
105
|
+
packageRoot: options.packageRoot,
|
|
106
|
+
directory: options.directory,
|
|
107
|
+
expectedDigest: options.expectedDigest,
|
|
108
|
+
stateRoot: options.stateRoot,
|
|
109
|
+
workspaceRoot: options.workspaceRoot,
|
|
110
|
+
executablePath: options.executablePath,
|
|
111
|
+
manager: options.manager,
|
|
112
|
+
};
|
|
113
|
+
if (!/^[a-f0-9]{64}$/.test(captured.expectedDigest))
|
|
114
|
+
throw new Error("invalid expected service plan digest");
|
|
115
|
+
const expected = generateServicePlan({
|
|
116
|
+
manager: captured.manager,
|
|
117
|
+
executablePath: captured.executablePath,
|
|
118
|
+
stateRoot: captured.stateRoot,
|
|
119
|
+
workspaceRoot: captured.workspaceRoot,
|
|
120
|
+
packageRoot: captured.packageRoot,
|
|
121
|
+
});
|
|
122
|
+
if (expected.digest !== captured.expectedDigest) {
|
|
123
|
+
throw new Error("expected service plan digest does not match the supplied bindings");
|
|
124
|
+
}
|
|
125
|
+
const directory = validateExistingDirectory(captured.directory, "persisted service plan directory");
|
|
126
|
+
const expectedRoot = validateExistingDirectory(join(captured.stateRoot, "service-plans"), "service plans root");
|
|
127
|
+
if (dirname(directory) !== expectedRoot) {
|
|
128
|
+
throw new Error("persisted service plan directory escaped the runtime service-plans root");
|
|
129
|
+
}
|
|
130
|
+
if (basename(directory) !== captured.expectedDigest) {
|
|
131
|
+
throw new Error("persisted service plan directory identity does not match its expected digest");
|
|
132
|
+
}
|
|
133
|
+
const stable = openStableDirectory(directory, "persisted service plan directory");
|
|
134
|
+
try {
|
|
135
|
+
const expectedNames = Object.freeze(["plan.json", ...expected.artifacts.map((artifact) => artifact.relative_path)].sort());
|
|
136
|
+
const initialEntries = inspectExactServicePlanEntries(stable.path, expectedNames);
|
|
137
|
+
const planPath = join(stable.path, "plan.json");
|
|
138
|
+
assertFileInside(stable, planPath);
|
|
139
|
+
const storedPlanBytes = readImmutableFile(planPath, 256 * 1024);
|
|
140
|
+
let storedPlan;
|
|
141
|
+
try {
|
|
142
|
+
storedPlan = JSON.parse(storedPlanBytes.toString("utf8"));
|
|
143
|
+
}
|
|
144
|
+
catch (error) {
|
|
145
|
+
throw new Error(`persisted service plan JSON is invalid: ${errorMessage(error)}`);
|
|
146
|
+
}
|
|
147
|
+
assertSchema(storedPlan, loadJsonSchema(join(captured.packageRoot, "schemas", "service-plan.schema.json")), "persisted service plan");
|
|
148
|
+
const canonicalPlanBytes = canonicalBytes(storedPlan);
|
|
149
|
+
if (!storedPlanBytes.equals(canonicalPlanBytes))
|
|
150
|
+
throw new Error("persisted service plan is not canonical JSON");
|
|
151
|
+
if (sha256(canonicalPlanBytes) !== captured.expectedDigest) {
|
|
152
|
+
throw new Error("persisted service plan digest does not match its directory identity");
|
|
153
|
+
}
|
|
154
|
+
if (!canonicalPlanBytes.equals(canonicalBytes(expected.plan))) {
|
|
155
|
+
throw new Error("persisted service plan does not match the expected bindings");
|
|
156
|
+
}
|
|
157
|
+
const rerendered = renderArtifacts(storedPlan).map((artifact) => Object.freeze({
|
|
158
|
+
...artifact,
|
|
159
|
+
sha256: sha256(artifact.bytes),
|
|
160
|
+
}));
|
|
161
|
+
if (JSON.stringify(rerendered) !== JSON.stringify(expected.artifacts)) {
|
|
162
|
+
throw new Error("persisted service plan rerender does not match the expected artifacts");
|
|
163
|
+
}
|
|
164
|
+
for (const artifact of rerendered) {
|
|
165
|
+
const artifactPath = join(stable.path, artifact.relative_path);
|
|
166
|
+
assertFileInside(stable, artifactPath);
|
|
167
|
+
const storedBytes = readImmutableFile(artifactPath, 1024 * 1024);
|
|
168
|
+
const renderedBytes = Buffer.from(artifact.bytes, "utf8");
|
|
169
|
+
if (!storedBytes.equals(renderedBytes) || sha256(storedBytes) !== artifact.sha256) {
|
|
170
|
+
throw new Error(`persisted service artifact changed: ${artifact.relative_path}`);
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
const finalEntries = inspectExactServicePlanEntries(stable.path, expectedNames);
|
|
174
|
+
if (JSON.stringify(finalEntries) !== JSON.stringify(initialEntries)) {
|
|
175
|
+
throw new Error("persisted service plan entries changed during verification");
|
|
176
|
+
}
|
|
177
|
+
stable.assertUnchanged();
|
|
178
|
+
return Object.freeze({
|
|
179
|
+
verified: true,
|
|
180
|
+
directory: stable.path,
|
|
181
|
+
digest: captured.expectedDigest,
|
|
182
|
+
manager: captured.manager,
|
|
183
|
+
artifacts: Object.freeze(rerendered.map((artifact) => Object.freeze({
|
|
184
|
+
relative_path: artifact.relative_path,
|
|
185
|
+
sha256: artifact.sha256,
|
|
186
|
+
}))),
|
|
187
|
+
});
|
|
188
|
+
}
|
|
189
|
+
finally {
|
|
190
|
+
stable.close();
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
export function assertGeneratedServicePlan(value) {
|
|
194
|
+
if (typeof value !== "object" || value === null || !GENERATED_SERVICE_PLANS.has(value)) {
|
|
195
|
+
throw new Error("service plan persistence requires a real OMS generated plan");
|
|
196
|
+
}
|
|
197
|
+
if (!Object.isFrozen(value))
|
|
198
|
+
throw new Error("generated service plan lost its frozen authority boundary");
|
|
199
|
+
}
|
|
200
|
+
function job(id, interval, executablePath, stateRoot, workspaceRoot) {
|
|
201
|
+
return Object.freeze({
|
|
202
|
+
id,
|
|
203
|
+
interval_seconds: interval,
|
|
204
|
+
argv: Object.freeze([
|
|
205
|
+
executablePath,
|
|
206
|
+
"reconcile",
|
|
207
|
+
id,
|
|
208
|
+
"--state-root",
|
|
209
|
+
stateRoot,
|
|
210
|
+
"--workspace-root",
|
|
211
|
+
workspaceRoot,
|
|
212
|
+
"--scheduled",
|
|
213
|
+
]),
|
|
214
|
+
});
|
|
215
|
+
}
|
|
216
|
+
function renderArtifacts(plan) {
|
|
217
|
+
if (plan.manager === "cron") {
|
|
218
|
+
const minute = plan.jobs[0];
|
|
219
|
+
const watchdog = plan.jobs[1];
|
|
220
|
+
return [{
|
|
221
|
+
relative_path: "oms.crontab",
|
|
222
|
+
bytes: [
|
|
223
|
+
`* * * * * ${cronCommand(plan, minute)}`,
|
|
224
|
+
`*/15 * * * * ${cronCommand(plan, watchdog)}`,
|
|
225
|
+
"",
|
|
226
|
+
].join("\n"),
|
|
227
|
+
}];
|
|
228
|
+
}
|
|
229
|
+
if (plan.manager === "systemd") {
|
|
230
|
+
return plan.jobs.flatMap((item) => [
|
|
231
|
+
{
|
|
232
|
+
relative_path: `oms-${item.id}.service`,
|
|
233
|
+
bytes: `[Unit]\nDescription=OMS ${item.id} reconciliation\n[Service]\nType=oneshot\nExecStart=${item.argv.map(systemdQuote).join(" ")}\n`,
|
|
234
|
+
},
|
|
235
|
+
{
|
|
236
|
+
relative_path: `oms-${item.id}.timer`,
|
|
237
|
+
bytes: `[Unit]\nDescription=OMS ${item.id} timer\n[Timer]\nOnBootSec=${item.interval_seconds}s\nOnUnitActiveSec=${item.interval_seconds}s\nAccuracySec=1s\n`,
|
|
238
|
+
},
|
|
239
|
+
]);
|
|
240
|
+
}
|
|
241
|
+
return plan.jobs.map((item) => ({
|
|
242
|
+
relative_path: `oms-${item.id}.plist`,
|
|
243
|
+
bytes: [
|
|
244
|
+
"<?xml version=\"1.0\" encoding=\"UTF-8\"?>",
|
|
245
|
+
"<plist version=\"1.0\"><dict>",
|
|
246
|
+
`<key>Label</key><string>local.oms.${item.id}</string>`,
|
|
247
|
+
`<key>ProgramArguments</key><array>${item.argv.map((arg) => `<string>${xmlEscape(arg)}</string>`).join("")}</array>`,
|
|
248
|
+
`<key>StartInterval</key><integer>${item.interval_seconds}</integer>`,
|
|
249
|
+
"</dict></plist>",
|
|
250
|
+
"",
|
|
251
|
+
].join("\n"),
|
|
252
|
+
}));
|
|
253
|
+
}
|
|
254
|
+
function cronCommand(plan, item) {
|
|
255
|
+
const lockPath = join(plan.state_root, "locks", `cron-${item.id}.lock`);
|
|
256
|
+
return ["flock", "-n", "--", lockPath, ...item.argv].map(cronQuote).join(" ");
|
|
257
|
+
}
|
|
258
|
+
function safeAbsolutePath(value, label) {
|
|
259
|
+
if (typeof value !== "string" || !isAbsolute(value) || /[\0\r\n]/u.test(value)) {
|
|
260
|
+
throw new Error(`${label} must be an absolute path without control characters`);
|
|
261
|
+
}
|
|
262
|
+
if (/(?:token|secret|password|api[_-]?key)=/iu.test(value))
|
|
263
|
+
throw new Error(`${label} appears to contain a secret`);
|
|
264
|
+
return value;
|
|
265
|
+
}
|
|
266
|
+
function shellQuote(value) {
|
|
267
|
+
return `'${value.replaceAll("'", `'"'"'`)}'`;
|
|
268
|
+
}
|
|
269
|
+
function cronQuote(value) {
|
|
270
|
+
return shellQuote(value).replaceAll("%", "\\%");
|
|
271
|
+
}
|
|
272
|
+
function systemdQuote(value) {
|
|
273
|
+
return `"${value
|
|
274
|
+
.replaceAll("\\", "\\\\")
|
|
275
|
+
.replaceAll("\"", "\\\"")
|
|
276
|
+
.replaceAll("%", "%%")
|
|
277
|
+
.replaceAll("$", () => "$$")}"`;
|
|
278
|
+
}
|
|
279
|
+
function xmlEscape(value) {
|
|
280
|
+
return value.replaceAll("&", "&").replaceAll("<", "<").replaceAll(">", ">").replaceAll("\"", """);
|
|
281
|
+
}
|
|
282
|
+
function canonicalBytes(value) {
|
|
283
|
+
return Buffer.from(`${JSON.stringify(value, null, 2)}\n`, "utf8");
|
|
284
|
+
}
|
|
285
|
+
function sha256(value) {
|
|
286
|
+
return createHash("sha256").update(value).digest("hex");
|
|
287
|
+
}
|
|
288
|
+
function isErrorCode(error, code) {
|
|
289
|
+
return typeof error === "object" && error !== null && "code" in error && error.code === code;
|
|
290
|
+
}
|
|
291
|
+
function inspectExactServicePlanEntries(directory, expectedNames) {
|
|
292
|
+
const entries = readdirSync(directory, { withFileTypes: true })
|
|
293
|
+
.sort((left, right) => left.name < right.name ? -1 : left.name > right.name ? 1 : 0);
|
|
294
|
+
for (const entry of entries) {
|
|
295
|
+
if (!/^[a-z0-9][a-z0-9.-]{0,127}$/.test(entry.name)) {
|
|
296
|
+
throw new Error(`unsafe persisted service plan entry: ${entry.name}`);
|
|
297
|
+
}
|
|
298
|
+
if (!entry.isFile())
|
|
299
|
+
throw new Error(`persisted service plan entry is not a regular file: ${entry.name}`);
|
|
300
|
+
}
|
|
301
|
+
const names = entries.map((entry) => entry.name);
|
|
302
|
+
if (JSON.stringify(names) !== JSON.stringify(expectedNames)) {
|
|
303
|
+
throw new Error("persisted service plan entries are missing or unexpected");
|
|
304
|
+
}
|
|
305
|
+
return Object.freeze(entries.map((entry) => {
|
|
306
|
+
const status = lstatSync(join(directory, entry.name));
|
|
307
|
+
if (!status.isFile())
|
|
308
|
+
throw new Error(`persisted service plan entry changed type: ${entry.name}`);
|
|
309
|
+
return Object.freeze({
|
|
310
|
+
name: entry.name,
|
|
311
|
+
device: status.dev,
|
|
312
|
+
inode: status.ino,
|
|
313
|
+
size: status.size,
|
|
314
|
+
mtime_ms: status.mtimeMs,
|
|
315
|
+
ctime_ms: status.ctimeMs,
|
|
316
|
+
});
|
|
317
|
+
}));
|
|
318
|
+
}
|
|
319
|
+
function deepFreeze(value, seen = new Set()) {
|
|
320
|
+
if (typeof value !== "object" || value === null || seen.has(value))
|
|
321
|
+
return value;
|
|
322
|
+
seen.add(value);
|
|
323
|
+
for (const child of Object.values(value))
|
|
324
|
+
deepFreeze(child, seen);
|
|
325
|
+
return Object.freeze(value);
|
|
326
|
+
}
|
|
327
|
+
//# sourceMappingURL=service-plan.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"service-plan.js","sourceRoot":"","sources":["../../../src/schedule/service-plan.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import type { ProcessRunner } from "../providers/process.js";
|
|
2
|
+
import type { ServiceManager } from "./service-plan.js";
|
|
3
|
+
import { type GeneratedUserSchedule } from "./user-plan.js";
|
|
4
|
+
export interface UserScheduleInstallationArtifact {
|
|
5
|
+
readonly relative_path: string;
|
|
6
|
+
readonly installed_path: string | null;
|
|
7
|
+
readonly sha256: string;
|
|
8
|
+
}
|
|
9
|
+
interface UserScheduleInstallationRecordBase {
|
|
10
|
+
readonly manager: ServiceManager;
|
|
11
|
+
readonly plan_sha256: string;
|
|
12
|
+
readonly manager_executable_path: string;
|
|
13
|
+
readonly home_directory: string;
|
|
14
|
+
readonly user_id: number | null;
|
|
15
|
+
readonly installed_at: string;
|
|
16
|
+
readonly artifacts: readonly UserScheduleInstallationArtifact[];
|
|
17
|
+
}
|
|
18
|
+
export interface UserScheduleInstallationRecord extends UserScheduleInstallationRecordBase {
|
|
19
|
+
readonly schema_version: 2;
|
|
20
|
+
readonly executable_path: string;
|
|
21
|
+
readonly environment_path: string;
|
|
22
|
+
readonly state_root: string;
|
|
23
|
+
readonly workspace_root: string;
|
|
24
|
+
readonly repository: string;
|
|
25
|
+
readonly github_poll_seconds: number;
|
|
26
|
+
}
|
|
27
|
+
export type InstalledUserSchedulePlanBinding = Readonly<{
|
|
28
|
+
schema_version: 1;
|
|
29
|
+
manager: ServiceManager;
|
|
30
|
+
}> | Readonly<Pick<UserScheduleInstallationRecord, "schema_version" | "manager" | "executable_path" | "environment_path" | "state_root" | "workspace_root" | "repository" | "github_poll_seconds">>;
|
|
31
|
+
export interface UserScheduleLifecycleOptions {
|
|
32
|
+
readonly generated: GeneratedUserSchedule;
|
|
33
|
+
readonly packageRoot: string;
|
|
34
|
+
readonly homeDirectory: string;
|
|
35
|
+
readonly installationsRoot: string;
|
|
36
|
+
readonly managerExecutablePath: string;
|
|
37
|
+
readonly runner?: ProcessRunner;
|
|
38
|
+
readonly env?: NodeJS.ProcessEnv;
|
|
39
|
+
}
|
|
40
|
+
export interface UserScheduleStatus {
|
|
41
|
+
readonly state: "absent" | "installed" | "drifted";
|
|
42
|
+
readonly manager: ServiceManager;
|
|
43
|
+
readonly plan_sha256: string;
|
|
44
|
+
readonly recorded: boolean;
|
|
45
|
+
readonly artifacts_exact: boolean;
|
|
46
|
+
readonly active: boolean;
|
|
47
|
+
}
|
|
48
|
+
export declare function readInstalledUserSchedulePlanBinding(options: {
|
|
49
|
+
readonly installationsRoot: string;
|
|
50
|
+
readonly packageRoot: string;
|
|
51
|
+
}): InstalledUserSchedulePlanBinding | undefined;
|
|
52
|
+
export declare function installUserSchedule(options: UserScheduleLifecycleOptions & {
|
|
53
|
+
readonly clock?: () => string;
|
|
54
|
+
}): Readonly<{
|
|
55
|
+
status: "installed" | "replayed";
|
|
56
|
+
record: UserScheduleInstallationRecord;
|
|
57
|
+
}>;
|
|
58
|
+
export declare function statusUserSchedule(options: UserScheduleLifecycleOptions): UserScheduleStatus;
|
|
59
|
+
export declare function removeUserSchedule(options: UserScheduleLifecycleOptions): Readonly<{
|
|
60
|
+
removed: boolean;
|
|
61
|
+
}>;
|
|
62
|
+
export {};
|