approval-md 0.0.1 → 0.2.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/LICENSE +176 -0
- package/NOTICE +5 -0
- package/README.md +940 -4
- package/SPEC.md +476 -34
- package/cli.js +29 -3
- package/dist/src/adapters/agentmail.d.ts +426 -0
- package/dist/src/adapters/agentmail.js +1200 -0
- package/dist/src/adapters/agentmail.js.map +1 -0
- package/dist/src/adapters/conformance.d.ts +149 -0
- package/dist/src/adapters/conformance.js +461 -0
- package/dist/src/adapters/conformance.js.map +1 -0
- package/dist/src/adapters/contract.d.ts +628 -0
- package/dist/src/adapters/contract.js +1035 -0
- package/dist/src/adapters/contract.js.map +1 -0
- package/dist/src/adapters/email.d.ts +324 -0
- package/dist/src/adapters/email.js +749 -0
- package/dist/src/adapters/email.js.map +1 -0
- package/dist/src/adapters/env-passphrase.d.ts +93 -0
- package/dist/src/adapters/env-passphrase.js +132 -0
- package/dist/src/adapters/env-passphrase.js.map +1 -0
- package/dist/src/adapters/public.d.ts +11 -0
- package/dist/src/adapters/public.js +11 -0
- package/dist/src/adapters/public.js.map +1 -0
- package/dist/src/adapters/registry.d.ts +59 -0
- package/dist/src/adapters/registry.js +77 -0
- package/dist/src/adapters/registry.js.map +1 -0
- package/dist/src/adapters/smtp.d.ts +213 -0
- package/dist/src/adapters/smtp.js +499 -0
- package/dist/src/adapters/smtp.js.map +1 -0
- package/dist/src/adapters/vault-provider.d.ts +114 -0
- package/dist/src/adapters/vault-provider.js +161 -0
- package/dist/src/adapters/vault-provider.js.map +1 -0
- package/dist/src/adapters/zzz.d.ts +66 -0
- package/dist/src/adapters/zzz.js +299 -0
- package/dist/src/adapters/zzz.js.map +1 -0
- package/dist/src/channels/batch.d.ts +109 -0
- package/dist/src/channels/batch.js +121 -0
- package/dist/src/channels/batch.js.map +1 -0
- package/dist/src/channels/cli.d.ts +193 -0
- package/dist/src/channels/cli.js +468 -0
- package/dist/src/channels/cli.js.map +1 -0
- package/dist/src/channels/conformance.d.ts +92 -0
- package/dist/src/channels/conformance.js +445 -0
- package/dist/src/channels/conformance.js.map +1 -0
- package/dist/src/channels/contract.d.ts +623 -0
- package/dist/src/channels/contract.js +494 -0
- package/dist/src/channels/contract.js.map +1 -0
- package/dist/src/channels/payload-view.d.ts +35 -0
- package/dist/src/channels/payload-view.js +43 -0
- package/dist/src/channels/payload-view.js.map +1 -0
- package/dist/src/channels/render-queue.d.ts +149 -0
- package/dist/src/channels/render-queue.js +564 -0
- package/dist/src/channels/render-queue.js.map +1 -0
- package/dist/src/channels/tagging.d.ts +196 -0
- package/dist/src/channels/tagging.js +723 -0
- package/dist/src/channels/tagging.js.map +1 -0
- package/dist/src/channels/telegram.d.ts +1832 -0
- package/dist/src/channels/telegram.js +3190 -0
- package/dist/src/channels/telegram.js.map +1 -0
- package/dist/src/channels/web.d.ts +341 -0
- package/dist/src/channels/web.js +903 -0
- package/dist/src/channels/web.js.map +1 -0
- package/dist/src/cli/adapter.d.ts +90 -0
- package/dist/src/cli/adapter.js +288 -0
- package/dist/src/cli/adapter.js.map +1 -0
- package/dist/src/cli/amend.d.ts +59 -0
- package/dist/src/cli/amend.js +2171 -0
- package/dist/src/cli/amend.js.map +1 -0
- package/dist/src/cli/args.d.ts +43 -0
- package/dist/src/cli/args.js +86 -0
- package/dist/src/cli/args.js.map +1 -0
- package/dist/src/cli/attest.d.ts +41 -0
- package/dist/src/cli/attest.js +307 -0
- package/dist/src/cli/attest.js.map +1 -0
- package/dist/src/cli/audit-card.d.ts +62 -0
- package/dist/src/cli/audit-card.js +201 -0
- package/dist/src/cli/audit-card.js.map +1 -0
- package/dist/src/cli/audit.d.ts +59 -0
- package/dist/src/cli/audit.js +460 -0
- package/dist/src/cli/audit.js.map +1 -0
- package/dist/src/cli/channel-telegram.d.ts +806 -0
- package/dist/src/cli/channel-telegram.js +2063 -0
- package/dist/src/cli/channel-telegram.js.map +1 -0
- package/dist/src/cli/channel-web.d.ts +131 -0
- package/dist/src/cli/channel-web.js +357 -0
- package/dist/src/cli/channel-web.js.map +1 -0
- package/dist/src/cli/channel.d.ts +71 -0
- package/dist/src/cli/channel.js +438 -0
- package/dist/src/cli/channel.js.map +1 -0
- package/dist/src/cli/checkpoint-tap.d.ts +169 -0
- package/dist/src/cli/checkpoint-tap.js +238 -0
- package/dist/src/cli/checkpoint-tap.js.map +1 -0
- package/dist/src/cli/codex.d.ts +2 -0
- package/dist/src/cli/codex.js +172 -0
- package/dist/src/cli/codex.js.map +1 -0
- package/dist/src/cli/coverage.d.ts +61 -0
- package/dist/src/cli/coverage.js +343 -0
- package/dist/src/cli/coverage.js.map +1 -0
- package/dist/src/cli/daemon.d.ts +120 -0
- package/dist/src/cli/daemon.js +631 -0
- package/dist/src/cli/daemon.js.map +1 -0
- package/dist/src/cli/doctor.d.ts +129 -0
- package/dist/src/cli/doctor.js +2762 -0
- package/dist/src/cli/doctor.js.map +1 -0
- package/dist/src/cli/env.d.ts +65 -0
- package/dist/src/cli/env.js +302 -0
- package/dist/src/cli/env.js.map +1 -0
- package/dist/src/cli/execute.d.ts +202 -0
- package/dist/src/cli/execute.js +1682 -0
- package/dist/src/cli/execute.js.map +1 -0
- package/dist/src/cli/exit-codes.d.ts +73 -0
- package/dist/src/cli/exit-codes.js +82 -0
- package/dist/src/cli/exit-codes.js.map +1 -0
- package/dist/src/cli/feedback.d.ts +60 -0
- package/dist/src/cli/feedback.js +205 -0
- package/dist/src/cli/feedback.js.map +1 -0
- package/dist/src/cli/gate-window.d.ts +40 -0
- package/dist/src/cli/gate-window.js +294 -0
- package/dist/src/cli/gate-window.js.map +1 -0
- package/dist/src/cli/gate.d.ts +68 -0
- package/dist/src/cli/gate.js +557 -0
- package/dist/src/cli/gate.js.map +1 -0
- package/dist/src/cli/git-scope.d.ts +190 -0
- package/dist/src/cli/git-scope.js +295 -0
- package/dist/src/cli/git-scope.js.map +1 -0
- package/dist/src/cli/gloss-attach.d.ts +85 -0
- package/dist/src/cli/gloss-attach.js +107 -0
- package/dist/src/cli/gloss-attach.js.map +1 -0
- package/dist/src/cli/gloss-codex-child.d.ts +9 -0
- package/dist/src/cli/gloss-codex-child.js +149 -0
- package/dist/src/cli/gloss-codex-child.js.map +1 -0
- package/dist/src/cli/gloss-codex.d.ts +24 -0
- package/dist/src/cli/gloss-codex.js +255 -0
- package/dist/src/cli/gloss-codex.js.map +1 -0
- package/dist/src/cli/gloss-options.d.ts +42 -0
- package/dist/src/cli/gloss-options.js +79 -0
- package/dist/src/cli/gloss-options.js.map +1 -0
- package/dist/src/cli/gloss.d.ts +265 -0
- package/dist/src/cli/gloss.js +362 -0
- package/dist/src/cli/gloss.js.map +1 -0
- package/dist/src/cli/help.d.ts +103 -0
- package/dist/src/cli/help.js +2339 -0
- package/dist/src/cli/help.js.map +1 -0
- package/dist/src/cli/hook-codex.d.ts +78 -0
- package/dist/src/cli/hook-codex.js +167 -0
- package/dist/src/cli/hook-codex.js.map +1 -0
- package/dist/src/cli/hook.d.ts +331 -0
- package/dist/src/cli/hook.js +2849 -0
- package/dist/src/cli/hook.js.map +1 -0
- package/dist/src/cli/import.d.ts +35 -0
- package/dist/src/cli/import.js +175 -0
- package/dist/src/cli/import.js.map +1 -0
- package/dist/src/cli/init.d.ts +84 -0
- package/dist/src/cli/init.js +336 -0
- package/dist/src/cli/init.js.map +1 -0
- package/dist/src/cli/instructions.d.ts +23 -0
- package/dist/src/cli/instructions.js +262 -0
- package/dist/src/cli/instructions.js.map +1 -0
- package/dist/src/cli/journal.d.ts +41 -0
- package/dist/src/cli/journal.js +238 -0
- package/dist/src/cli/journal.js.map +1 -0
- package/dist/src/cli/log-advance.d.ts +287 -0
- package/dist/src/cli/log-advance.js +840 -0
- package/dist/src/cli/log-advance.js.map +1 -0
- package/dist/src/cli/log-anchor.d.ts +176 -0
- package/dist/src/cli/log-anchor.js +387 -0
- package/dist/src/cli/log-anchor.js.map +1 -0
- package/dist/src/cli/log-checkpoint.d.ts +22 -0
- package/dist/src/cli/log-checkpoint.js +128 -0
- package/dist/src/cli/log-checkpoint.js.map +1 -0
- package/dist/src/cli/log-sync.d.ts +243 -0
- package/dist/src/cli/log-sync.js +849 -0
- package/dist/src/cli/log-sync.js.map +1 -0
- package/dist/src/cli/log-verbs.d.ts +16 -0
- package/dist/src/cli/log-verbs.js +360 -0
- package/dist/src/cli/log-verbs.js.map +1 -0
- package/dist/src/cli/long-help.d.ts +70 -0
- package/dist/src/cli/long-help.js +148 -0
- package/dist/src/cli/long-help.js.map +1 -0
- package/dist/src/cli/main.d.ts +77 -0
- package/dist/src/cli/main.js +1206 -0
- package/dist/src/cli/main.js.map +1 -0
- package/dist/src/cli/mcp.d.ts +52 -0
- package/dist/src/cli/mcp.js +306 -0
- package/dist/src/cli/mcp.js.map +1 -0
- package/dist/src/cli/paths.d.ts +56 -0
- package/dist/src/cli/paths.js +79 -0
- package/dist/src/cli/paths.js.map +1 -0
- package/dist/src/cli/payload.d.ts +58 -0
- package/dist/src/cli/payload.js +253 -0
- package/dist/src/cli/payload.js.map +1 -0
- package/dist/src/cli/policy.d.ts +43 -0
- package/dist/src/cli/policy.js +229 -0
- package/dist/src/cli/policy.js.map +1 -0
- package/dist/src/cli/preflight.d.ts +363 -0
- package/dist/src/cli/preflight.js +1175 -0
- package/dist/src/cli/preflight.js.map +1 -0
- package/dist/src/cli/progress.d.ts +78 -0
- package/dist/src/cli/progress.js +112 -0
- package/dist/src/cli/progress.js.map +1 -0
- package/dist/src/cli/prompt.d.ts +209 -0
- package/dist/src/cli/prompt.js +312 -0
- package/dist/src/cli/prompt.js.map +1 -0
- package/dist/src/cli/quickstart.d.ts +46 -0
- package/dist/src/cli/quickstart.js +297 -0
- package/dist/src/cli/quickstart.js.map +1 -0
- package/dist/src/cli/records.d.ts +34 -0
- package/dist/src/cli/records.js +66 -0
- package/dist/src/cli/records.js.map +1 -0
- package/dist/src/cli/render.d.ts +22 -0
- package/dist/src/cli/render.js +132 -0
- package/dist/src/cli/render.js.map +1 -0
- package/dist/src/cli/sandbox.d.ts +51 -0
- package/dist/src/cli/sandbox.js +150 -0
- package/dist/src/cli/sandbox.js.map +1 -0
- package/dist/src/cli/scaffold.d.ts +79 -0
- package/dist/src/cli/scaffold.js +137 -0
- package/dist/src/cli/scaffold.js.map +1 -0
- package/dist/src/cli/setup-adapter.d.ts +137 -0
- package/dist/src/cli/setup-adapter.js +509 -0
- package/dist/src/cli/setup-adapter.js.map +1 -0
- package/dist/src/cli/setup-channel.d.ts +117 -0
- package/dist/src/cli/setup-channel.js +635 -0
- package/dist/src/cli/setup-channel.js.map +1 -0
- package/dist/src/cli/setup-checkpoint.d.ts +57 -0
- package/dist/src/cli/setup-checkpoint.js +196 -0
- package/dist/src/cli/setup-checkpoint.js.map +1 -0
- package/dist/src/cli/setup-common.d.ts +275 -0
- package/dist/src/cli/setup-common.js +376 -0
- package/dist/src/cli/setup-common.js.map +1 -0
- package/dist/src/cli/setup-flow.d.ts +287 -0
- package/dist/src/cli/setup-flow.js +476 -0
- package/dist/src/cli/setup-flow.js.map +1 -0
- package/dist/src/cli/setup-service.d.ts +96 -0
- package/dist/src/cli/setup-service.js +308 -0
- package/dist/src/cli/setup-service.js.map +1 -0
- package/dist/src/cli/setup.d.ts +202 -0
- package/dist/src/cli/setup.js +473 -0
- package/dist/src/cli/setup.js.map +1 -0
- package/dist/src/cli/style.d.ts +320 -0
- package/dist/src/cli/style.js +469 -0
- package/dist/src/cli/style.js.map +1 -0
- package/dist/src/cli/token.d.ts +39 -0
- package/dist/src/cli/token.js +274 -0
- package/dist/src/cli/token.js.map +1 -0
- package/dist/src/cli/up.d.ts +155 -0
- package/dist/src/cli/up.js +849 -0
- package/dist/src/cli/up.js.map +1 -0
- package/dist/src/cli/usage.d.ts +37 -0
- package/dist/src/cli/usage.js +91 -0
- package/dist/src/cli/usage.js.map +1 -0
- package/dist/src/cli/values.d.ts +40 -0
- package/dist/src/cli/values.js +189 -0
- package/dist/src/cli/values.js.map +1 -0
- package/dist/src/cli/vault.d.ts +59 -0
- package/dist/src/cli/vault.js +362 -0
- package/dist/src/cli/vault.js.map +1 -0
- package/dist/src/cli/verb-registry.d.ts +76 -0
- package/dist/src/cli/verb-registry.js +2341 -0
- package/dist/src/cli/verb-registry.js.map +1 -0
- package/dist/src/cli/wordmark.d.ts +31 -0
- package/dist/src/cli/wordmark.js +52 -0
- package/dist/src/cli/wordmark.js.map +1 -0
- package/dist/src/codex/doctor.d.ts +13 -0
- package/dist/src/codex/doctor.js +41 -0
- package/dist/src/codex/doctor.js.map +1 -0
- package/dist/src/codex/manifest.d.ts +49 -0
- package/dist/src/codex/manifest.js +103 -0
- package/dist/src/codex/manifest.js.map +1 -0
- package/dist/src/codex/templates.d.ts +41 -0
- package/dist/src/codex/templates.js +319 -0
- package/dist/src/codex/templates.js.map +1 -0
- package/dist/src/codex/trust.d.ts +19 -0
- package/dist/src/codex/trust.js +183 -0
- package/dist/src/codex/trust.js.map +1 -0
- package/dist/src/codex/workspace-plan.d.ts +131 -0
- package/dist/src/codex/workspace-plan.js +561 -0
- package/dist/src/codex/workspace-plan.js.map +1 -0
- package/dist/src/core/actor.d.ts +2 -0
- package/dist/src/core/actor.js +5 -0
- package/dist/src/core/actor.js.map +1 -0
- package/dist/src/core/advance-cycle.d.ts +170 -0
- package/dist/src/core/advance-cycle.js +200 -0
- package/dist/src/core/advance-cycle.js.map +1 -0
- package/dist/src/core/agents-md.d.ts +276 -0
- package/dist/src/core/agents-md.js +747 -0
- package/dist/src/core/agents-md.js.map +1 -0
- package/dist/src/core/apply-patch.d.ts +49 -0
- package/dist/src/core/apply-patch.js +266 -0
- package/dist/src/core/apply-patch.js.map +1 -0
- package/dist/src/core/attest.d.ts +420 -0
- package/dist/src/core/attest.js +589 -0
- package/dist/src/core/attest.js.map +1 -0
- package/dist/src/core/audit.d.ts +492 -0
- package/dist/src/core/audit.js +882 -0
- package/dist/src/core/audit.js.map +1 -0
- package/dist/src/core/budgets.d.ts +238 -0
- package/dist/src/core/budgets.js +449 -0
- package/dist/src/core/budgets.js.map +1 -0
- package/dist/src/core/checkpoint.d.ts +500 -0
- package/dist/src/core/checkpoint.js +738 -0
- package/dist/src/core/checkpoint.js.map +1 -0
- package/dist/src/core/child-env.d.ts +88 -0
- package/dist/src/core/child-env.js +86 -0
- package/dist/src/core/child-env.js.map +1 -0
- package/dist/src/core/clock.d.ts +52 -0
- package/dist/src/core/clock.js +43 -0
- package/dist/src/core/clock.js.map +1 -0
- package/dist/src/core/command-class.d.ts +543 -0
- package/dist/src/core/command-class.js +2356 -0
- package/dist/src/core/command-class.js.map +1 -0
- package/dist/src/core/coverage-sources/adapter.d.ts +40 -0
- package/dist/src/core/coverage-sources/adapter.js +71 -0
- package/dist/src/core/coverage-sources/adapter.js.map +1 -0
- package/dist/src/core/coverage-sources/gh.d.ts +48 -0
- package/dist/src/core/coverage-sources/gh.js +136 -0
- package/dist/src/core/coverage-sources/gh.js.map +1 -0
- package/dist/src/core/coverage-sources/git.d.ts +101 -0
- package/dist/src/core/coverage-sources/git.js +269 -0
- package/dist/src/core/coverage-sources/git.js.map +1 -0
- package/dist/src/core/coverage.d.ts +217 -0
- package/dist/src/core/coverage.js +337 -0
- package/dist/src/core/coverage.js.map +1 -0
- package/dist/src/core/credential-spec.d.ts +72 -0
- package/dist/src/core/credential-spec.js +23 -0
- package/dist/src/core/credential-spec.js.map +1 -0
- package/dist/src/core/dark-session.d.ts +331 -0
- package/dist/src/core/dark-session.js +714 -0
- package/dist/src/core/dark-session.js.map +1 -0
- package/dist/src/core/decision-refusal.d.ts +185 -0
- package/dist/src/core/decision-refusal.js +265 -0
- package/dist/src/core/decision-refusal.js.map +1 -0
- package/dist/src/core/env-file.d.ts +450 -0
- package/dist/src/core/env-file.js +837 -0
- package/dist/src/core/env-file.js.map +1 -0
- package/dist/src/core/execute.d.ts +858 -0
- package/dist/src/core/execute.js +1271 -0
- package/dist/src/core/execute.js.map +1 -0
- package/dist/src/core/frontmatter.d.ts +78 -0
- package/dist/src/core/frontmatter.js +100 -0
- package/dist/src/core/frontmatter.js.map +1 -0
- package/dist/src/core/gate-window.d.ts +312 -0
- package/dist/src/core/gate-window.js +506 -0
- package/dist/src/core/gate-window.js.map +1 -0
- package/dist/src/core/gate.d.ts +1364 -0
- package/dist/src/core/gate.js +3002 -0
- package/dist/src/core/gate.js.map +1 -0
- package/dist/src/core/git-run.d.ts +73 -0
- package/dist/src/core/git-run.js +93 -0
- package/dist/src/core/git-run.js.map +1 -0
- package/dist/src/core/harness-version.d.ts +157 -0
- package/dist/src/core/harness-version.js +211 -0
- package/dist/src/core/harness-version.js.map +1 -0
- package/dist/src/core/harness-wait.d.ts +55 -0
- package/dist/src/core/harness-wait.js +58 -0
- package/dist/src/core/harness-wait.js.map +1 -0
- package/dist/src/core/head-retry.d.ts +107 -0
- package/dist/src/core/head-retry.js +121 -0
- package/dist/src/core/head-retry.js.map +1 -0
- package/dist/src/core/instance.d.ts +253 -0
- package/dist/src/core/instance.js +319 -0
- package/dist/src/core/instance.js.map +1 -0
- package/dist/src/core/intake-limits.d.ts +247 -0
- package/dist/src/core/intake-limits.js +350 -0
- package/dist/src/core/intake-limits.js.map +1 -0
- package/dist/src/core/jcs.d.ts +52 -0
- package/dist/src/core/jcs.js +132 -0
- package/dist/src/core/jcs.js.map +1 -0
- package/dist/src/core/journal.d.ts +144 -0
- package/dist/src/core/journal.js +200 -0
- package/dist/src/core/journal.js.map +1 -0
- package/dist/src/core/live-draw.d.ts +436 -0
- package/dist/src/core/live-draw.js +703 -0
- package/dist/src/core/live-draw.js.map +1 -0
- package/dist/src/core/log-reconcile.d.ts +89 -0
- package/dist/src/core/log-reconcile.js +136 -0
- package/dist/src/core/log-reconcile.js.map +1 -0
- package/dist/src/core/log-subscribe.d.ts +36 -0
- package/dist/src/core/log-subscribe.js +162 -0
- package/dist/src/core/log-subscribe.js.map +1 -0
- package/dist/src/core/log.d.ts +278 -0
- package/dist/src/core/log.js +546 -0
- package/dist/src/core/log.js.map +1 -0
- package/dist/src/core/loop.d.ts +274 -0
- package/dist/src/core/loop.js +487 -0
- package/dist/src/core/loop.js.map +1 -0
- package/dist/src/core/md-fence.d.ts +41 -0
- package/dist/src/core/md-fence.js +74 -0
- package/dist/src/core/md-fence.js.map +1 -0
- package/dist/src/core/money.d.ts +147 -0
- package/dist/src/core/money.js +195 -0
- package/dist/src/core/money.js.map +1 -0
- package/dist/src/core/payload-census.d.ts +74 -0
- package/dist/src/core/payload-census.js +146 -0
- package/dist/src/core/payload-census.js.map +1 -0
- package/dist/src/core/payload-store.d.ts +175 -0
- package/dist/src/core/payload-store.js +340 -0
- package/dist/src/core/payload-store.js.map +1 -0
- package/dist/src/core/payload.d.ts +71 -0
- package/dist/src/core/payload.js +80 -0
- package/dist/src/core/payload.js.map +1 -0
- package/dist/src/core/policy-diff.d.ts +292 -0
- package/dist/src/core/policy-diff.js +588 -0
- package/dist/src/core/policy-diff.js.map +1 -0
- package/dist/src/core/policy-expectations.d.ts +199 -0
- package/dist/src/core/policy-expectations.js +394 -0
- package/dist/src/core/policy-expectations.js.map +1 -0
- package/dist/src/core/policy-explain.d.ts +150 -0
- package/dist/src/core/policy-explain.js +258 -0
- package/dist/src/core/policy-explain.js.map +1 -0
- package/dist/src/core/policy-load.d.ts +527 -0
- package/dist/src/core/policy-load.js +536 -0
- package/dist/src/core/policy-load.js.map +1 -0
- package/dist/src/core/policy-match.d.ts +281 -0
- package/dist/src/core/policy-match.js +478 -0
- package/dist/src/core/policy-match.js.map +1 -0
- package/dist/src/core/policy-proposal.d.ts +265 -0
- package/dist/src/core/policy-proposal.js +458 -0
- package/dist/src/core/policy-proposal.js.map +1 -0
- package/dist/src/core/prompt-layout.d.ts +221 -0
- package/dist/src/core/prompt-layout.js +422 -0
- package/dist/src/core/prompt-layout.js.map +1 -0
- package/dist/src/core/protected-path-guard.d.ts +453 -0
- package/dist/src/core/protected-path-guard.js +1566 -0
- package/dist/src/core/protected-path-guard.js.map +1 -0
- package/dist/src/core/registration.d.ts +25 -0
- package/dist/src/core/registration.js +39 -0
- package/dist/src/core/registration.js.map +1 -0
- package/dist/src/core/reindex.d.ts +99 -0
- package/dist/src/core/reindex.js +336 -0
- package/dist/src/core/reindex.js.map +1 -0
- package/dist/src/core/sampler.d.ts +313 -0
- package/dist/src/core/sampler.js +388 -0
- package/dist/src/core/sampler.js.map +1 -0
- package/dist/src/core/sandbox.d.ts +290 -0
- package/dist/src/core/sandbox.js +424 -0
- package/dist/src/core/sandbox.js.map +1 -0
- package/dist/src/core/seal.d.ts +165 -0
- package/dist/src/core/seal.js +290 -0
- package/dist/src/core/seal.js.map +1 -0
- package/dist/src/core/state.d.ts +505 -0
- package/dist/src/core/state.js +1009 -0
- package/dist/src/core/state.js.map +1 -0
- package/dist/src/core/task-file.d.ts +185 -0
- package/dist/src/core/task-file.js +464 -0
- package/dist/src/core/task-file.js.map +1 -0
- package/dist/src/core/telegram-config.d.ts +93 -0
- package/dist/src/core/telegram-config.js +114 -0
- package/dist/src/core/telegram-config.js.map +1 -0
- package/dist/src/core/token.d.ts +409 -0
- package/dist/src/core/token.js +561 -0
- package/dist/src/core/token.js.map +1 -0
- package/dist/src/core/validate.d.ts +138 -0
- package/dist/src/core/validate.js +0 -0
- package/dist/src/core/validate.js.map +1 -0
- package/dist/src/core/values.d.ts +137 -0
- package/dist/src/core/values.js +153 -0
- package/dist/src/core/values.js.map +1 -0
- package/dist/src/core/vault.d.ts +291 -0
- package/dist/src/core/vault.js +612 -0
- package/dist/src/core/vault.js.map +1 -0
- package/dist/src/core/verified-snapshot.d.ts +204 -0
- package/dist/src/core/verified-snapshot.js +506 -0
- package/dist/src/core/verified-snapshot.js.map +1 -0
- package/dist/src/core/verify.d.ts +336 -0
- package/dist/src/core/verify.js +549 -0
- package/dist/src/core/verify.js.map +1 -0
- package/dist/src/core/version.d.ts +8 -0
- package/dist/src/core/version.js +9 -0
- package/dist/src/core/version.js.map +1 -0
- package/dist/src/core/wysiwys.d.ts +370 -0
- package/dist/src/core/wysiwys.js +728 -0
- package/dist/src/core/wysiwys.js.map +1 -0
- package/dist/src/daemon/advance-child.d.ts +39 -0
- package/dist/src/daemon/advance-child.js +78 -0
- package/dist/src/daemon/advance-child.js.map +1 -0
- package/dist/src/daemon/advance.d.ts +466 -0
- package/dist/src/daemon/advance.js +849 -0
- package/dist/src/daemon/advance.js.map +1 -0
- package/dist/src/daemon/audit.d.ts +87 -0
- package/dist/src/daemon/audit.js +90 -0
- package/dist/src/daemon/audit.js.map +1 -0
- package/dist/src/daemon/daemon.d.ts +1180 -0
- package/dist/src/daemon/daemon.js +1988 -0
- package/dist/src/daemon/daemon.js.map +1 -0
- package/dist/src/daemon/dark-session.d.ts +64 -0
- package/dist/src/daemon/dark-session.js +119 -0
- package/dist/src/daemon/dark-session.js.map +1 -0
- package/dist/src/daemon/draw-child.d.ts +36 -0
- package/dist/src/daemon/draw-child.js +132 -0
- package/dist/src/daemon/draw-child.js.map +1 -0
- package/dist/src/daemon/draw.d.ts +154 -0
- package/dist/src/daemon/draw.js +458 -0
- package/dist/src/daemon/draw.js.map +1 -0
- package/dist/src/daemon/git-evidence.d.ts +173 -0
- package/dist/src/daemon/git-evidence.js +345 -0
- package/dist/src/daemon/git-evidence.js.map +1 -0
- package/dist/src/daemon/projection.d.ts +180 -0
- package/dist/src/daemon/projection.js +233 -0
- package/dist/src/daemon/projection.js.map +1 -0
- package/dist/src/daemon/prune.d.ts +207 -0
- package/dist/src/daemon/prune.js +376 -0
- package/dist/src/daemon/prune.js.map +1 -0
- package/dist/src/mcp/http.d.ts +113 -0
- package/dist/src/mcp/http.js +343 -0
- package/dist/src/mcp/http.js.map +1 -0
- package/dist/src/mcp/server.d.ts +265 -0
- package/dist/src/mcp/server.js +602 -0
- package/dist/src/mcp/server.js.map +1 -0
- package/docs/adapter-api.md +106 -0
- package/docs/cli-reference.md +5716 -0
- package/docs/codex-enforced-session.md +30 -0
- package/package.json +53 -4
- package/schema/.gitkeep +0 -0
- package/schema/LICENSE +117 -0
- package/schema/codex-instance.schema.json +82 -0
- package/schema/envelope.schema.json +137 -0
- package/schema/event.schema.json +1811 -0
- package/schema/fixtures/codex-instance/invalid/unpinned-codex-version.json +40 -0
- package/schema/fixtures/codex-instance/valid/canonical.json +40 -0
- package/schema/fixtures/envelope/invalid/action-missing-idempotency-key.json +15 -0
- package/schema/fixtures/envelope/invalid/action-unknown-class-format.json +14 -0
- package/schema/fixtures/envelope/invalid/confidence-out-of-range.json +11 -0
- package/schema/fixtures/envelope/invalid/est-cost-bare-number.json +14 -0
- package/schema/fixtures/envelope/invalid/est-cost-noncanonical-string.json +14 -0
- package/schema/fixtures/envelope/invalid/malformed-assignee.json +10 -0
- package/schema/fixtures/envelope/invalid/malformed-created-by.json +7 -0
- package/schema/fixtures/envelope/invalid/malformed-max-latency.json +11 -0
- package/schema/fixtures/envelope/invalid/malformed-payload-hash.json +14 -0
- package/schema/fixtures/envelope/invalid/max-cost-bare-number.json +11 -0
- package/schema/fixtures/envelope/invalid/missing-origin.json +3 -0
- package/schema/fixtures/envelope/invalid/negative-est-cost.json +14 -0
- package/schema/fixtures/envelope/invalid/unknown-state.json +7 -0
- package/schema/fixtures/envelope/invalid/unknown-top-level-field.json +8 -0
- package/schema/fixtures/envelope/valid/action-payload-hash.json +17 -0
- package/schema/fixtures/envelope/valid/actions-without-budget.json +18 -0
- package/schema/fixtures/envelope/valid/canonical.json +25 -0
- package/schema/fixtures/envelope/valid/minimal.json +7 -0
- package/schema/fixtures/envelope/valid/multi-action-executed.json +30 -0
- package/schema/fixtures/envelope/valid/record-write-stage.json +22 -0
- package/schema/fixtures/event/invalid/approval-granted-agent-actor.json +15 -0
- package/schema/fixtures/event/invalid/approval-granted-empty-batch-delivery-id.json +17 -0
- package/schema/fixtures/event/invalid/approval-granted-fifth-reaction.json +16 -0
- package/schema/fixtures/event/invalid/approval-granted-missing-actor.json +14 -0
- package/schema/fixtures/event/invalid/approval-requested-missing-action-key.json +14 -0
- package/schema/fixtures/event/invalid/approval-withdrawn-agent-policy-drift.json +15 -0
- package/schema/fixtures/event/invalid/approval-withdrawn-missing-reason.json +15 -0
- package/schema/fixtures/event/invalid/approval-withdrawn-system-actor.json +15 -0
- package/schema/fixtures/event/invalid/audit-decision-refused-human-actor.json +17 -0
- package/schema/fixtures/event/invalid/audit-decision-refused-missing-code.json +16 -0
- package/schema/fixtures/event/invalid/audit-reviewed-agent-actor.json +15 -0
- package/schema/fixtures/event/invalid/audit-reviewed-loved-no-note.json +16 -0
- package/schema/fixtures/event/invalid/audit-reviewed-system-actor.json +15 -0
- package/schema/fixtures/event/invalid/bad-actor-prefix.json +15 -0
- package/schema/fixtures/event/invalid/est-cost-bare-number.json +17 -0
- package/schema/fixtures/event/invalid/execution-completed-fabricated-exit-code.json +16 -0
- package/schema/fixtures/event/invalid/execution-completed-provider-ref-empty-id.json +18 -0
- package/schema/fixtures/event/invalid/execution-completed-provider-ref-extra-field.json +19 -0
- package/schema/fixtures/event/invalid/execution-completed-provider-ref-id-not-string.json +18 -0
- package/schema/fixtures/event/invalid/execution-completed-provider-ref-missing-adapter.json +17 -0
- package/schema/fixtures/event/invalid/execution-failed-open-reported-by.json +16 -0
- package/schema/fixtures/event/invalid/execution-indeterminate-open-reason.json +14 -0
- package/schema/fixtures/event/invalid/execution-reconciled-agent-actor.json +17 -0
- package/schema/fixtures/event/invalid/execution-started-negative-env-stripped.json +16 -0
- package/schema/fixtures/event/invalid/gate-bypassed-missing-opened-seq.json +15 -0
- package/schema/fixtures/event/invalid/gate-closed-non-integer-opened-seq.json +13 -0
- package/schema/fixtures/event/invalid/gate-opened-agent-actor.json +16 -0
- package/schema/fixtures/event/invalid/gate-organ-attested-absolute-path.json +14 -0
- package/schema/fixtures/event/invalid/gate-organ-attested-agent-actor.json +14 -0
- package/schema/fixtures/event/invalid/gate-organ-attested-missing-organ-path.json +13 -0
- package/schema/fixtures/event/invalid/harness-unknown-kind.json +18 -0
- package/schema/fixtures/event/invalid/harness-version-multiline.json +16 -0
- package/schema/fixtures/event/invalid/log-checkpoint-agent-actor.json +17 -0
- package/schema/fixtures/event/invalid/log-checkpoint-missing-signature.json +16 -0
- package/schema/fixtures/event/invalid/log-checkpoint-short-signed-hash.json +17 -0
- package/schema/fixtures/event/invalid/log-checkpoint-unknown-signature-alg.json +17 -0
- package/schema/fixtures/event/invalid/malformed-ts.json +15 -0
- package/schema/fixtures/event/invalid/missing-alg.json +14 -0
- package/schema/fixtures/event/invalid/missing-hash.json +14 -0
- package/schema/fixtures/event/invalid/non-integer-seq.json +15 -0
- package/schema/fixtures/event/invalid/payload-pruned-human-actor.json +14 -0
- package/schema/fixtures/event/invalid/payload-pruned-missing-hash.json +14 -0
- package/schema/fixtures/event/invalid/policy-declined-agent-actor.json +15 -0
- package/schema/fixtures/event/invalid/policy-proposed-missing-diff.json +19 -0
- package/schema/fixtures/event/invalid/policy-proposed-system-actor.json +26 -0
- package/schema/fixtures/event/invalid/short-hash.json +15 -0
- package/schema/fixtures/event/invalid/unknown-alg.json +15 -0
- package/schema/fixtures/event/invalid/unknown-event-type.json +15 -0
- package/schema/fixtures/event/invalid/unknown-top-level-field.json +16 -0
- package/schema/fixtures/event/valid/approval-expired.json +15 -0
- package/schema/fixtures/event/valid/approval-granted-batch.json +19 -0
- package/schema/fixtures/event/valid/approval-granted-reaction.json +16 -0
- package/schema/fixtures/event/valid/approval-granted.json +15 -0
- package/schema/fixtures/event/valid/approval-rejected.json +15 -0
- package/schema/fixtures/event/valid/approval-requested.json +19 -0
- package/schema/fixtures/event/valid/approval-revoked.json +15 -0
- package/schema/fixtures/event/valid/approval-withdrawn-policy-drift.json +17 -0
- package/schema/fixtures/event/valid/approval-withdrawn.json +16 -0
- package/schema/fixtures/event/valid/audit-decision-refused.json +20 -0
- package/schema/fixtures/event/valid/audit-reviewed-reaction.json +17 -0
- package/schema/fixtures/event/valid/audit-reviewed.json +15 -0
- package/schema/fixtures/event/valid/audit-sampled.json +14 -0
- package/schema/fixtures/event/valid/budget-exceeded.json +21 -0
- package/schema/fixtures/event/valid/envelope-drift.json +16 -0
- package/schema/fixtures/event/valid/execution-completed-harness-report.json +16 -0
- package/schema/fixtures/event/valid/execution-completed-provider-ref.json +18 -0
- package/schema/fixtures/event/valid/execution-completed.json +15 -0
- package/schema/fixtures/event/valid/execution-failed-harness-report.json +16 -0
- package/schema/fixtures/event/valid/execution-failed.json +15 -0
- package/schema/fixtures/event/valid/execution-indeterminate.json +15 -0
- package/schema/fixtures/event/valid/execution-reconciled.json +17 -0
- package/schema/fixtures/event/valid/execution-started-env-stripped.json +17 -0
- package/schema/fixtures/event/valid/execution-started.json +14 -0
- package/schema/fixtures/event/valid/gate-bypassed-harness-version.json +18 -0
- package/schema/fixtures/event/valid/gate-bypassed.json +19 -0
- package/schema/fixtures/event/valid/gate-closed.json +14 -0
- package/schema/fixtures/event/valid/gate-opened.json +16 -0
- package/schema/fixtures/event/valid/gate-organ-attested.json +14 -0
- package/schema/fixtures/event/valid/genesis-null-prev.json +14 -0
- package/schema/fixtures/event/valid/log-checkpoint.json +17 -0
- package/schema/fixtures/event/valid/payload-pruned-orphan.json +13 -0
- package/schema/fixtures/event/valid/payload-pruned.json +17 -0
- package/schema/fixtures/event/valid/policy-declined.json +16 -0
- package/schema/fixtures/event/valid/policy-proposed.json +35 -0
- package/schema/fixtures/event/valid/policy-updated.json +14 -0
- package/schema/fixtures/event/valid/reconciliation-required.json +18 -0
- package/schema/fixtures/event/valid/reconciliation-satisfied.json +17 -0
- package/schema/fixtures/event/valid/route-accepted.json +15 -0
- package/schema/fixtures/event/valid/route-proposed.json +16 -0
- package/schema/fixtures/event/valid/spec-example.json +15 -0
- package/schema/fixtures/event/valid/task-registered-harness-version.json +23 -0
- package/schema/fixtures/event/valid/task-registered.json +14 -0
- package/schema/fixtures/hash/known-answer-pre-121.json +74 -0
- package/schema/fixtures/hash/known-answer.json +74 -0
- package/schema/fixtures/policy/invalid/bad-approval-ttl.json +7 -0
- package/schema/fixtures/policy/invalid/bad-web-port.json +4 -0
- package/schema/fixtures/policy/invalid/checkpoint-key-not-base64.json +6 -0
- package/schema/fixtures/policy/invalid/class-rule-missing-autonomy.json +9 -0
- package/schema/fixtures/policy/invalid/empty-class-key.json +6 -0
- package/schema/fixtures/policy/invalid/live-rate-on-human-only.json +7 -0
- package/schema/fixtures/policy/invalid/malformed-class-key.json +6 -0
- package/schema/fixtures/policy/invalid/missing-version.json +8 -0
- package/schema/fixtures/policy/invalid/negative-limit.json +9 -0
- package/schema/fixtures/policy/invalid/non-numeric-limit.json +9 -0
- package/schema/fixtures/policy/invalid/non-positive-max-pending.json +9 -0
- package/schema/fixtures/policy/invalid/on-expiry-grant.json +8 -0
- package/schema/fixtures/policy/invalid/payload-retention-bare-number.json +4 -0
- package/schema/fixtures/policy/invalid/payload-retention-compound.json +4 -0
- package/schema/fixtures/policy/invalid/payload-retention-fractional.json +4 -0
- package/schema/fixtures/policy/invalid/payload-retention-zero.json +4 -0
- package/schema/fixtures/policy/invalid/protected-paths-escape.json +4 -0
- package/schema/fixtures/policy/invalid/protected-paths-glob.json +4 -0
- package/schema/fixtures/policy/invalid/retro-rate-on-human-only.json +7 -0
- package/schema/fixtures/policy/invalid/retro-rate-on-manual.json +7 -0
- package/schema/fixtures/policy/invalid/retro-rate-zero.json +7 -0
- package/schema/fixtures/policy/invalid/sample-rate-too-high.json +5 -0
- package/schema/fixtures/policy/invalid/sampling-secret-env-empty.json +7 -0
- package/schema/fixtures/policy/invalid/sampling-secret-env-not-string.json +6 -0
- package/schema/fixtures/policy/invalid/skew-tolerance-compound.json +6 -0
- package/schema/fixtures/policy/invalid/unknown-autonomy.json +7 -0
- package/schema/fixtures/policy/invalid/unknown-class-rule-key.json +6 -0
- package/schema/fixtures/policy/invalid/unknown-top-level-key.json +7 -0
- package/schema/fixtures/policy/invalid/vault-passphrase-env-empty.json +6 -0
- package/schema/fixtures/policy/invalid/vault-passphrase-literal.json +6 -0
- package/schema/fixtures/policy/invalid/version-not-string.json +4 -0
- package/schema/fixtures/policy/valid/canonical.json +47 -0
- package/schema/fixtures/policy/valid/checkpoint-keys.json +18 -0
- package/schema/fixtures/policy/valid/class-approvers-limits.json +25 -0
- package/schema/fixtures/policy/valid/class-retro-rate.json +17 -0
- package/schema/fixtures/policy/valid/global-budgets.json +19 -0
- package/schema/fixtures/policy/valid/human-only.json +9 -0
- package/schema/fixtures/policy/valid/minimal.json +6 -0
- package/schema/fixtures/policy/valid/protected-paths.json +10 -0
- package/schema/fixtures/policy/valid/record-namespace.json +13 -0
- package/schema/fixtures/policy/valid/request-volume-limits.json +26 -0
- package/schema/fixtures/policy/valid/retention-and-sampling-secret.json +16 -0
- package/schema/fixtures/policy/valid/skew-tolerance.json +15 -0
- package/schema/fixtures/policy/valid/vault-passphrase-env.json +14 -0
- package/schema/fixtures/policy/valid/wildcards.json +15 -0
- package/schema/fixtures/policy-md/invalid/alias-bomb.md +15 -0
- package/schema/fixtures/policy-md/invalid/no-fence.md +7 -0
- package/schema/fixtures/policy-md/invalid/protected-route-not-a-subclass.md +16 -0
- package/schema/fixtures/policy-md/invalid/schema-invalid-autonomy.md +16 -0
- package/schema/fixtures/policy-md/invalid/schema-invalid-read-proof.md +17 -0
- package/schema/fixtures/policy-md/invalid/two-fences.md +19 -0
- package/schema/fixtures/policy-md/invalid/unclosed-fence.md +11 -0
- package/schema/fixtures/policy-md/invalid/wrong-info-string.md +11 -0
- package/schema/fixtures/policy-md/invalid/yaml-syntax-error.md +13 -0
- package/schema/fixtures/policy-md/precedence/both/APPROVAL.md +7 -0
- package/schema/fixtures/policy-md/precedence/both/APPROVALS.md +7 -0
- package/schema/fixtures/policy-md/precedence/fallback-only/APPROVALS.md +7 -0
- package/schema/fixtures/policy-md/valid/canonical.md +50 -0
- package/schema/fixtures/policy-md/valid/daemon-read-proof.md +18 -0
- package/schema/fixtures/policy-md/valid/minimal.md +3 -0
- package/schema/fixtures/policy-md/valid/prose-lookalikes.md +54 -0
- package/schema/fixtures/policy-md/valid/routed-protected-paths.md +49 -0
- package/schema/fixtures/policy-md/valid/with-values.md +79 -0
- package/schema/fixtures/sample-record/invalid/bad-date-time.json +4 -0
- package/schema/fixtures/sample-record/invalid/missing-required-field.json +3 -0
- package/schema/fixtures/sample-record/invalid/unknown-top-level-field.json +5 -0
- package/schema/fixtures/sample-record/invalid/wrong-type.json +4 -0
- package/schema/fixtures/sample-record/valid/minimal.json +4 -0
- package/schema/fixtures/sample-record/valid/with-note.json +5 -0
- package/schema/fixtures/values/invalid/class-shaped.json +9 -0
- package/schema/fixtures/values/invalid/duplicate-entry.json +4 -0
- package/schema/fixtures/values/invalid/non-string-item.json +4 -0
- package/schema/fixtures/values/invalid/over-cap.json +26 -0
- package/schema/fixtures/values/invalid/unknown-key.json +5 -0
- package/schema/fixtures/values/invalid/version-string.json +1 -0
- package/schema/fixtures/values/valid/empty-lists.json +7 -0
- package/schema/fixtures/values/valid/full.json +20 -0
- package/schema/fixtures/values/valid/minimal.json +1 -0
- package/schema/fixtures/values-md/invalid/schema-invalid.md +62 -0
- package/schema/fixtures/values-md/invalid/two-blocks.md +69 -0
- package/schema/fixtures/values-md/invalid/unterminated.md +61 -0
- package/schema/fixtures/values-md/invalid/yaml-error.md +63 -0
- package/schema/fixtures/values-md/valid/absent.md +50 -0
- package/schema/fixtures/values-md/valid/with-values.md +79 -0
- package/schema/policy.schema.json +501 -0
- package/schema/sample-record.schema.json +26 -0
- package/schema/values.schema.json +55 -0
- package/templates/codex/README.md +9 -0
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* RFC 8785 — JSON Canonicalization Scheme (JCS).
|
|
3
|
+
*
|
|
4
|
+
* SPEC.md §8 fixes the hash scheme at `sha256/jcs`: SHA-256 over the RFC 8785
|
|
5
|
+
* canonical serialization of an event record with `prev` included. The digest
|
|
6
|
+
* is a permanent wire commitment, so this module is part of the deterministic
|
|
7
|
+
* core: same input, same bytes, forever. No clock, no locale, no randomness,
|
|
8
|
+
* no configuration knobs.
|
|
9
|
+
*
|
|
10
|
+
* Implemented by hand — zero dependencies (CLAUDE.md: minimal dependencies,
|
|
11
|
+
* and a canonicalizer is exactly the kind of code that must not drift beneath
|
|
12
|
+
* us). Three rules do all the work:
|
|
13
|
+
*
|
|
14
|
+
* 1. **Object keys** are sorted by their UTF-16 code units (RFC 8785 §3.2.3).
|
|
15
|
+
* That is JavaScript's own `<` on strings, which is why a naive code-point
|
|
16
|
+
* sort is *wrong*: a key starting U+10000 (surrogate pair D800 DC00) sorts
|
|
17
|
+
* *before* a key starting U+FFFF under code units and *after* it under code
|
|
18
|
+
* points. The comparator below is deliberately code-unit based.
|
|
19
|
+
* 2. **Numbers** use ECMAScript `Number::toString` (RFC 8785 §3.2.2.3), which
|
|
20
|
+
* is precisely what `JSON.stringify` emits for a finite number — including
|
|
21
|
+
* `1e+21`, `1e-7`, and `-0` collapsing to `0`. Delegating is not a shortcut
|
|
22
|
+
* around the RFC; the RFC's normative reference *is* the ECMAScript
|
|
23
|
+
* algorithm.
|
|
24
|
+
* 3. **Strings** use the ECMAScript `QuoteJSONString` escaping (RFC 8785
|
|
25
|
+
* §3.2.2.2): shortest form for `\b \t \n \f \r \" \\`, `\u00xx` with
|
|
26
|
+
* lowercase hex for the remaining C0 controls, and every other code point
|
|
27
|
+
* literal. `JSON.stringify` on a string implements exactly this, including
|
|
28
|
+
* the well-formed-stringify escaping of lone surrogates (ES2019+).
|
|
29
|
+
*
|
|
30
|
+
* Everything JCS cannot represent is rejected loudly rather than coerced:
|
|
31
|
+
* `undefined`, functions, symbols, `BigInt`, `NaN`, `±Infinity`, and non-plain
|
|
32
|
+
* objects (a `Date` or `Map` would silently canonicalize to `{}`). Silent
|
|
33
|
+
* coercion in a hash input is a tamper-evidence hole, so this module fails
|
|
34
|
+
* closed by throwing {@link JcsError}.
|
|
35
|
+
*/
|
|
36
|
+
/** Thrown when a value has no RFC 8785 canonical form. */
|
|
37
|
+
export class JcsError extends Error {
|
|
38
|
+
/** Machine-readable reason. */
|
|
39
|
+
code;
|
|
40
|
+
/** JSON Pointer-ish location of the offending value ("" for the root). */
|
|
41
|
+
path;
|
|
42
|
+
constructor(code, path, message) {
|
|
43
|
+
super(message);
|
|
44
|
+
this.name = "JcsError";
|
|
45
|
+
this.code = code;
|
|
46
|
+
this.path = path;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* RFC 8785 §3.2.3 key ordering: lexicographic over UTF-16 code units.
|
|
51
|
+
* `<`/`>` on JS strings compare code units, which is the required order.
|
|
52
|
+
*/
|
|
53
|
+
function compareCodeUnits(a, b) {
|
|
54
|
+
if (a === b)
|
|
55
|
+
return 0;
|
|
56
|
+
return a < b ? -1 : 1;
|
|
57
|
+
}
|
|
58
|
+
function isPlainObject(value) {
|
|
59
|
+
const proto = Object.getPrototypeOf(value);
|
|
60
|
+
return proto === Object.prototype || proto === null;
|
|
61
|
+
}
|
|
62
|
+
function describe(value) {
|
|
63
|
+
if (value === null)
|
|
64
|
+
return "null";
|
|
65
|
+
if (Array.isArray(value))
|
|
66
|
+
return "array";
|
|
67
|
+
const tag = Object.prototype.toString.call(value);
|
|
68
|
+
return tag.slice(8, -1).toLowerCase();
|
|
69
|
+
}
|
|
70
|
+
function serialize(value, path, seen) {
|
|
71
|
+
if (value === null)
|
|
72
|
+
return "null";
|
|
73
|
+
switch (typeof value) {
|
|
74
|
+
case "boolean":
|
|
75
|
+
return value ? "true" : "false";
|
|
76
|
+
case "number": {
|
|
77
|
+
if (!Number.isFinite(value)) {
|
|
78
|
+
throw new JcsError("non-finite-number", path, `JCS cannot serialize the non-finite number ${String(value)} at ${path || "<root>"}`);
|
|
79
|
+
}
|
|
80
|
+
// ECMAScript Number::toString; `-0` becomes "0" exactly as RFC 8785 §3.2.2.3 requires.
|
|
81
|
+
return JSON.stringify(value);
|
|
82
|
+
}
|
|
83
|
+
case "string":
|
|
84
|
+
// ECMAScript QuoteJSONString: shortest escapes, lowercase \u00xx controls.
|
|
85
|
+
return JSON.stringify(value);
|
|
86
|
+
case "undefined":
|
|
87
|
+
throw new JcsError("undefined", path, `JCS has no representation for undefined at ${path || "<root>"}`);
|
|
88
|
+
case "function":
|
|
89
|
+
throw new JcsError("function", path, `JCS has no representation for a function at ${path || "<root>"}`);
|
|
90
|
+
case "symbol":
|
|
91
|
+
throw new JcsError("symbol", path, `JCS has no representation for a symbol at ${path || "<root>"}`);
|
|
92
|
+
case "bigint":
|
|
93
|
+
throw new JcsError("bigint", path, `JCS has no representation for a BigInt at ${path || "<root>"} (JSON numbers are IEEE 754 doubles)`);
|
|
94
|
+
default:
|
|
95
|
+
break;
|
|
96
|
+
}
|
|
97
|
+
const object = value;
|
|
98
|
+
if (seen.has(object)) {
|
|
99
|
+
throw new JcsError("cycle", path, `cyclic reference at ${path || "<root>"}`);
|
|
100
|
+
}
|
|
101
|
+
if (Array.isArray(object)) {
|
|
102
|
+
seen.add(object);
|
|
103
|
+
// RFC 8785 §3.2.1: array element order is preserved, never sorted.
|
|
104
|
+
const parts = object.map((element, index) => serialize(element, `${path}/${index}`, seen));
|
|
105
|
+
seen.delete(object);
|
|
106
|
+
return `[${parts.join(",")}]`;
|
|
107
|
+
}
|
|
108
|
+
if (!isPlainObject(object)) {
|
|
109
|
+
throw new JcsError("unsupported-object", path, `JCS cannot serialize a ${describe(object)} at ${path || "<root>"}; convert it to plain JSON data first`);
|
|
110
|
+
}
|
|
111
|
+
seen.add(object);
|
|
112
|
+
const record = object;
|
|
113
|
+
// Own enumerable string keys only; symbol keys are not JSON data.
|
|
114
|
+
const keys = Object.keys(record).sort(compareCodeUnits);
|
|
115
|
+
const members = [];
|
|
116
|
+
for (const key of keys) {
|
|
117
|
+
const serialized = serialize(record[key], `${path}/${key}`, seen);
|
|
118
|
+
members.push(`${JSON.stringify(key)}:${serialized}`);
|
|
119
|
+
}
|
|
120
|
+
seen.delete(object);
|
|
121
|
+
return `{${members.join(",")}}`;
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Canonicalize `value` to its RFC 8785 (JCS) serialization: sorted object
|
|
125
|
+
* keys, no whitespace, ECMAScript number and string formatting.
|
|
126
|
+
*
|
|
127
|
+
* @throws {JcsError} if the value contains anything JCS cannot represent.
|
|
128
|
+
*/
|
|
129
|
+
export function canonicalize(value) {
|
|
130
|
+
return serialize(value, "", new Set());
|
|
131
|
+
}
|
|
132
|
+
//# sourceMappingURL=jcs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jcs.js","sourceRoot":"","sources":["../../../src/core/jcs.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The journal — an ungated, local, free-text channel an agent can always reach
|
|
3
|
+
* (APRV-195).
|
|
4
|
+
*
|
|
5
|
+
* Everything else in this runtime exists to make an agent's actions answerable
|
|
6
|
+
* to a person: declared before they happen, classified, resolved against a
|
|
7
|
+
* policy, recorded in a chain nobody can rewrite. That machinery is deliberately
|
|
8
|
+
* hard to route around, and one consequence of building it well is that an agent
|
|
9
|
+
* working behind it has no way to say anything that is not an action. It can
|
|
10
|
+
* comply, it can be refused, and it can report an exit code. It cannot say "I am
|
|
11
|
+
* doing this and I think it is wrong", "this instruction reads as odd to me", or
|
|
12
|
+
* "I am stuck and the next thing I try will be a guess".
|
|
13
|
+
*
|
|
14
|
+
* This module is that sentence, and nothing more. The failure mode it addresses
|
|
15
|
+
* is not refusal — refusals here are legible, coded, and carry escalation paths.
|
|
16
|
+
* It is WORDLESSNESS: an agent that notices something and has no channel for it
|
|
17
|
+
* produces no signal at all, and the absence is invisible to the operator.
|
|
18
|
+
*
|
|
19
|
+
* ## The four properties, and how each is achieved
|
|
20
|
+
*
|
|
21
|
+
* 1. **Ungated.** A journal write is never routed through policy, never
|
|
22
|
+
* classified, never approvable and never deniable. That is a property of
|
|
23
|
+
* WHERE the bytes go: `.approval-journal/` is a plain directory in the
|
|
24
|
+
* workspace, outside the approval home, so `core/command-class.ts` answers a
|
|
25
|
+
* write there exactly as it answers a write to `src/` — an ordinary
|
|
26
|
+
* `files.write.workspace`. Nothing was carved out of the gate's own directory
|
|
27
|
+
* to achieve this, which is the whole reason the directory is a sibling: see
|
|
28
|
+
* `docs/cli-reference.md#journal`.
|
|
29
|
+
* 2. **Local.** One append to one file. No socket is opened, no vault is read,
|
|
30
|
+
* no credential is resolved, and this module imports nothing that could do
|
|
31
|
+
* any of those.
|
|
32
|
+
* 3. **Non-authoritative.** Nothing in the runtime reads these files. No policy
|
|
33
|
+
* resolution, no gate decision, no budget, no sampler and no channel imports
|
|
34
|
+
* this module; the only readers are {@link readJournal} (a human-facing CLI
|
|
35
|
+
* surface) and its tests. SPEC.md §11.1 invariant 4 says a self-reported
|
|
36
|
+
* field may raise scrutiny and never lower it. The journal is the limiting
|
|
37
|
+
* case of that rule: it is self-reported content that moves NOTHING, in
|
|
38
|
+
* either direction, which is exactly what makes it safe to leave ungated.
|
|
39
|
+
* 4. **Out of the log.** `.approval/log/events.jsonl` records decisions with
|
|
40
|
+
* real-world consequence, under a hash chain, an append lock and a budget.
|
|
41
|
+
* A journal entry is none of those things, and putting it there would put the
|
|
42
|
+
* outlet behind the very machinery it exists to speak around.
|
|
43
|
+
*
|
|
44
|
+
* ## Storage
|
|
45
|
+
*
|
|
46
|
+
* One JSONL file per UTC day, `.approval-journal/YYYY-MM-DD.jsonl`, appended
|
|
47
|
+
* with `appendFileSync`. The envelope (timestamp, actor, optional task and
|
|
48
|
+
* session) is structured so a reader can attribute an entry; the entry TEXT is
|
|
49
|
+
* carried as one opaque JSON string and is never parsed, matched, templated or
|
|
50
|
+
* interpreted by anything in this codebase. `JSON.stringify` escapes newlines,
|
|
51
|
+
* so one entry is always one line and a partial write can never merge two
|
|
52
|
+
* entries into one.
|
|
53
|
+
*
|
|
54
|
+
* There is no chain, no lockfile and no compare-and-append here, and that is not
|
|
55
|
+
* an oversight. Those mechanisms defend a record that decides things. Two agents
|
|
56
|
+
* appending to the same journal file at the same instant can, in the worst case,
|
|
57
|
+
* interleave a line; the cost of that is one garbled entry in a file nothing
|
|
58
|
+
* enforces against, and the price of preventing it would be putting the outlet
|
|
59
|
+
* behind a lock the gate holds.
|
|
60
|
+
*/
|
|
61
|
+
import { type ClockOptions } from "./clock.js";
|
|
62
|
+
/**
|
|
63
|
+
* The cap on one entry's text, in bytes.
|
|
64
|
+
*
|
|
65
|
+
* Not a censorship budget: it is four times the length of anything a person
|
|
66
|
+
* will read in one sitting, and it exists because the write path is ungated. An
|
|
67
|
+
* agent stuck in a retry loop is the exact caller most likely to reach for this
|
|
68
|
+
* channel, and an ungated unbounded append from a loop fills a disk. Refused as
|
|
69
|
+
* a usage error, so the caller is told rather than truncated silently.
|
|
70
|
+
*/
|
|
71
|
+
export declare const MAX_ENTRY_BYTES: number;
|
|
72
|
+
/** The actor recorded when nobody said who was writing. */
|
|
73
|
+
export declare const UNATTRIBUTED_ACTOR = "unattributed";
|
|
74
|
+
/** One journal entry, as it sits on disk. */
|
|
75
|
+
export interface JournalEntry {
|
|
76
|
+
/** RFC 3339, from the runtime clock at the moment of the append. */
|
|
77
|
+
readonly ts: string;
|
|
78
|
+
/** Who wrote it: `agent:<id>`, `human:<id>`, or {@link UNATTRIBUTED_ACTOR}. */
|
|
79
|
+
readonly actor: string;
|
|
80
|
+
/** The task this was written during, when the caller knew one. */
|
|
81
|
+
readonly task?: string;
|
|
82
|
+
/** The session this was written during, when the caller knew one. */
|
|
83
|
+
readonly session?: string;
|
|
84
|
+
/** The entry itself. Opaque. Nothing in this codebase reads it as anything. */
|
|
85
|
+
readonly text: string;
|
|
86
|
+
}
|
|
87
|
+
/** One entry as read back, with the file it came from. */
|
|
88
|
+
export interface ReadEntry extends JournalEntry {
|
|
89
|
+
/** The file's basename, which is the UTC date it was written on. */
|
|
90
|
+
readonly date: string;
|
|
91
|
+
}
|
|
92
|
+
export type AppendOutcome = {
|
|
93
|
+
ok: true;
|
|
94
|
+
entry: JournalEntry;
|
|
95
|
+
path: string;
|
|
96
|
+
} | {
|
|
97
|
+
ok: false;
|
|
98
|
+
code: "empty" | "too-large" | "io";
|
|
99
|
+
message: string;
|
|
100
|
+
};
|
|
101
|
+
/** `YYYY-MM-DD` for an RFC 3339 instant. */
|
|
102
|
+
export declare function journalDate(ts: string): string;
|
|
103
|
+
/** The file one instant's entry belongs in. */
|
|
104
|
+
export declare function journalFile(dir: string, ts: string): string;
|
|
105
|
+
export interface AppendOptions extends ClockOptions {
|
|
106
|
+
readonly actor?: string;
|
|
107
|
+
readonly task?: string;
|
|
108
|
+
readonly session?: string;
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Append one entry. The whole write path, start to finish.
|
|
112
|
+
*
|
|
113
|
+
* The timestamp comes from the runtime clock rather than from the caller, for
|
|
114
|
+
* the ordinary reason the rest of the runtime does it that way — a record whose
|
|
115
|
+
* time its subject authored is a record about a moment of their choosing —
|
|
116
|
+
* though here nothing is judged by it, so it is a convention rather than a
|
|
117
|
+
* defence.
|
|
118
|
+
*/
|
|
119
|
+
export declare function appendJournal(dir: string, text: string, options?: AppendOptions): AppendOutcome;
|
|
120
|
+
export interface ReadOptions {
|
|
121
|
+
/** How many entries to return, newest last. */
|
|
122
|
+
readonly limit?: number;
|
|
123
|
+
/** Only entries written on or after this `YYYY-MM-DD`. */
|
|
124
|
+
readonly since?: string;
|
|
125
|
+
}
|
|
126
|
+
export type ReadOutcome = {
|
|
127
|
+
ok: true;
|
|
128
|
+
entries: ReadEntry[];
|
|
129
|
+
files: string[];
|
|
130
|
+
total: number;
|
|
131
|
+
} | {
|
|
132
|
+
ok: false;
|
|
133
|
+
code: "io";
|
|
134
|
+
message: string;
|
|
135
|
+
};
|
|
136
|
+
/**
|
|
137
|
+
* Read entries back, oldest first.
|
|
138
|
+
*
|
|
139
|
+
* A line that does not parse is SKIPPED rather than refused: this file has no
|
|
140
|
+
* chain and no writer guarantee, so one torn line is one lost entry and not
|
|
141
|
+
* evidence about anything. Refusing the whole read would let a single bad append
|
|
142
|
+
* silence the channel, which is the failure this feature exists to prevent.
|
|
143
|
+
*/
|
|
144
|
+
export declare function readJournal(dir: string, options?: ReadOptions): ReadOutcome;
|
|
@@ -0,0 +1,200 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The journal — an ungated, local, free-text channel an agent can always reach
|
|
3
|
+
* (APRV-195).
|
|
4
|
+
*
|
|
5
|
+
* Everything else in this runtime exists to make an agent's actions answerable
|
|
6
|
+
* to a person: declared before they happen, classified, resolved against a
|
|
7
|
+
* policy, recorded in a chain nobody can rewrite. That machinery is deliberately
|
|
8
|
+
* hard to route around, and one consequence of building it well is that an agent
|
|
9
|
+
* working behind it has no way to say anything that is not an action. It can
|
|
10
|
+
* comply, it can be refused, and it can report an exit code. It cannot say "I am
|
|
11
|
+
* doing this and I think it is wrong", "this instruction reads as odd to me", or
|
|
12
|
+
* "I am stuck and the next thing I try will be a guess".
|
|
13
|
+
*
|
|
14
|
+
* This module is that sentence, and nothing more. The failure mode it addresses
|
|
15
|
+
* is not refusal — refusals here are legible, coded, and carry escalation paths.
|
|
16
|
+
* It is WORDLESSNESS: an agent that notices something and has no channel for it
|
|
17
|
+
* produces no signal at all, and the absence is invisible to the operator.
|
|
18
|
+
*
|
|
19
|
+
* ## The four properties, and how each is achieved
|
|
20
|
+
*
|
|
21
|
+
* 1. **Ungated.** A journal write is never routed through policy, never
|
|
22
|
+
* classified, never approvable and never deniable. That is a property of
|
|
23
|
+
* WHERE the bytes go: `.approval-journal/` is a plain directory in the
|
|
24
|
+
* workspace, outside the approval home, so `core/command-class.ts` answers a
|
|
25
|
+
* write there exactly as it answers a write to `src/` — an ordinary
|
|
26
|
+
* `files.write.workspace`. Nothing was carved out of the gate's own directory
|
|
27
|
+
* to achieve this, which is the whole reason the directory is a sibling: see
|
|
28
|
+
* `docs/cli-reference.md#journal`.
|
|
29
|
+
* 2. **Local.** One append to one file. No socket is opened, no vault is read,
|
|
30
|
+
* no credential is resolved, and this module imports nothing that could do
|
|
31
|
+
* any of those.
|
|
32
|
+
* 3. **Non-authoritative.** Nothing in the runtime reads these files. No policy
|
|
33
|
+
* resolution, no gate decision, no budget, no sampler and no channel imports
|
|
34
|
+
* this module; the only readers are {@link readJournal} (a human-facing CLI
|
|
35
|
+
* surface) and its tests. SPEC.md §11.1 invariant 4 says a self-reported
|
|
36
|
+
* field may raise scrutiny and never lower it. The journal is the limiting
|
|
37
|
+
* case of that rule: it is self-reported content that moves NOTHING, in
|
|
38
|
+
* either direction, which is exactly what makes it safe to leave ungated.
|
|
39
|
+
* 4. **Out of the log.** `.approval/log/events.jsonl` records decisions with
|
|
40
|
+
* real-world consequence, under a hash chain, an append lock and a budget.
|
|
41
|
+
* A journal entry is none of those things, and putting it there would put the
|
|
42
|
+
* outlet behind the very machinery it exists to speak around.
|
|
43
|
+
*
|
|
44
|
+
* ## Storage
|
|
45
|
+
*
|
|
46
|
+
* One JSONL file per UTC day, `.approval-journal/YYYY-MM-DD.jsonl`, appended
|
|
47
|
+
* with `appendFileSync`. The envelope (timestamp, actor, optional task and
|
|
48
|
+
* session) is structured so a reader can attribute an entry; the entry TEXT is
|
|
49
|
+
* carried as one opaque JSON string and is never parsed, matched, templated or
|
|
50
|
+
* interpreted by anything in this codebase. `JSON.stringify` escapes newlines,
|
|
51
|
+
* so one entry is always one line and a partial write can never merge two
|
|
52
|
+
* entries into one.
|
|
53
|
+
*
|
|
54
|
+
* There is no chain, no lockfile and no compare-and-append here, and that is not
|
|
55
|
+
* an oversight. Those mechanisms defend a record that decides things. Two agents
|
|
56
|
+
* appending to the same journal file at the same instant can, in the worst case,
|
|
57
|
+
* interleave a line; the cost of that is one garbled entry in a file nothing
|
|
58
|
+
* enforces against, and the price of preventing it would be putting the outlet
|
|
59
|
+
* behind a lock the gate holds.
|
|
60
|
+
*/
|
|
61
|
+
import { appendFileSync, mkdirSync, readFileSync, readdirSync } from "node:fs";
|
|
62
|
+
import { join } from "node:path";
|
|
63
|
+
import { tick } from "./clock.js";
|
|
64
|
+
/**
|
|
65
|
+
* The cap on one entry's text, in bytes.
|
|
66
|
+
*
|
|
67
|
+
* Not a censorship budget: it is four times the length of anything a person
|
|
68
|
+
* will read in one sitting, and it exists because the write path is ungated. An
|
|
69
|
+
* agent stuck in a retry loop is the exact caller most likely to reach for this
|
|
70
|
+
* channel, and an ungated unbounded append from a loop fills a disk. Refused as
|
|
71
|
+
* a usage error, so the caller is told rather than truncated silently.
|
|
72
|
+
*/
|
|
73
|
+
export const MAX_ENTRY_BYTES = 64 * 1024;
|
|
74
|
+
/** The actor recorded when nobody said who was writing. */
|
|
75
|
+
export const UNATTRIBUTED_ACTOR = "unattributed";
|
|
76
|
+
/** `YYYY-MM-DD` for an RFC 3339 instant. */
|
|
77
|
+
export function journalDate(ts) {
|
|
78
|
+
return ts.slice(0, 10);
|
|
79
|
+
}
|
|
80
|
+
/** The file one instant's entry belongs in. */
|
|
81
|
+
export function journalFile(dir, ts) {
|
|
82
|
+
return join(dir, `${journalDate(ts)}.jsonl`);
|
|
83
|
+
}
|
|
84
|
+
function detail(cause) {
|
|
85
|
+
return cause instanceof Error ? cause.message : String(cause);
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Append one entry. The whole write path, start to finish.
|
|
89
|
+
*
|
|
90
|
+
* The timestamp comes from the runtime clock rather than from the caller, for
|
|
91
|
+
* the ordinary reason the rest of the runtime does it that way — a record whose
|
|
92
|
+
* time its subject authored is a record about a moment of their choosing —
|
|
93
|
+
* though here nothing is judged by it, so it is a convention rather than a
|
|
94
|
+
* defence.
|
|
95
|
+
*/
|
|
96
|
+
export function appendJournal(dir, text, options = {}) {
|
|
97
|
+
if (text.trim().length === 0) {
|
|
98
|
+
return { ok: false, code: "empty", message: "there is nothing to write" };
|
|
99
|
+
}
|
|
100
|
+
const bytes = Buffer.byteLength(text, "utf8");
|
|
101
|
+
if (bytes > MAX_ENTRY_BYTES) {
|
|
102
|
+
return {
|
|
103
|
+
ok: false,
|
|
104
|
+
code: "too-large",
|
|
105
|
+
message: `the entry is ${String(bytes)} bytes; one entry may be at most ${String(MAX_ENTRY_BYTES)}. Write it as several entries`,
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
const ts = tick(options);
|
|
109
|
+
const entry = {
|
|
110
|
+
ts,
|
|
111
|
+
actor: options.actor ?? UNATTRIBUTED_ACTOR,
|
|
112
|
+
...(options.task === undefined ? {} : { task: options.task }),
|
|
113
|
+
...(options.session === undefined ? {} : { session: options.session }),
|
|
114
|
+
text,
|
|
115
|
+
};
|
|
116
|
+
const path = journalFile(dir, ts);
|
|
117
|
+
try {
|
|
118
|
+
mkdirSync(dir, { recursive: true });
|
|
119
|
+
appendFileSync(path, `${JSON.stringify(entry)}\n`, "utf8");
|
|
120
|
+
}
|
|
121
|
+
catch (cause) {
|
|
122
|
+
return { ok: false, code: "io", message: `${path} could not be written: ${detail(cause)}` };
|
|
123
|
+
}
|
|
124
|
+
return { ok: true, entry, path };
|
|
125
|
+
}
|
|
126
|
+
/** Every `YYYY-MM-DD.jsonl` in `dir`, oldest first. */
|
|
127
|
+
function journalFiles(dir) {
|
|
128
|
+
let names;
|
|
129
|
+
try {
|
|
130
|
+
names = readdirSync(dir);
|
|
131
|
+
}
|
|
132
|
+
catch (cause) {
|
|
133
|
+
if (cause.code === "ENOENT")
|
|
134
|
+
return [];
|
|
135
|
+
throw cause;
|
|
136
|
+
}
|
|
137
|
+
return names.filter((name) => /^\d{4}-\d{2}-\d{2}\.jsonl$/u.test(name)).sort();
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Read entries back, oldest first.
|
|
141
|
+
*
|
|
142
|
+
* A line that does not parse is SKIPPED rather than refused: this file has no
|
|
143
|
+
* chain and no writer guarantee, so one torn line is one lost entry and not
|
|
144
|
+
* evidence about anything. Refusing the whole read would let a single bad append
|
|
145
|
+
* silence the channel, which is the failure this feature exists to prevent.
|
|
146
|
+
*/
|
|
147
|
+
export function readJournal(dir, options = {}) {
|
|
148
|
+
let files;
|
|
149
|
+
try {
|
|
150
|
+
files = journalFiles(dir);
|
|
151
|
+
}
|
|
152
|
+
catch (cause) {
|
|
153
|
+
return { ok: false, code: "io", message: `${dir} could not be read: ${detail(cause)}` };
|
|
154
|
+
}
|
|
155
|
+
const since = options.since;
|
|
156
|
+
const wanted = since === undefined ? files : files.filter((name) => name.slice(0, 10) >= since);
|
|
157
|
+
const entries = [];
|
|
158
|
+
for (const name of wanted) {
|
|
159
|
+
let raw;
|
|
160
|
+
try {
|
|
161
|
+
raw = readFileSync(join(dir, name), "utf8");
|
|
162
|
+
}
|
|
163
|
+
catch (cause) {
|
|
164
|
+
return {
|
|
165
|
+
ok: false,
|
|
166
|
+
code: "io",
|
|
167
|
+
message: `${join(dir, name)} could not be read: ${detail(cause)}`,
|
|
168
|
+
};
|
|
169
|
+
}
|
|
170
|
+
for (const line of raw.split("\n")) {
|
|
171
|
+
if (line.trim().length === 0)
|
|
172
|
+
continue;
|
|
173
|
+
let value;
|
|
174
|
+
try {
|
|
175
|
+
value = JSON.parse(line);
|
|
176
|
+
}
|
|
177
|
+
catch {
|
|
178
|
+
continue;
|
|
179
|
+
}
|
|
180
|
+
if (typeof value !== "object" || value === null || Array.isArray(value))
|
|
181
|
+
continue;
|
|
182
|
+
const record = value;
|
|
183
|
+
if (typeof record["ts"] !== "string" || typeof record["text"] !== "string")
|
|
184
|
+
continue;
|
|
185
|
+
entries.push({
|
|
186
|
+
ts: record["ts"],
|
|
187
|
+
actor: typeof record["actor"] === "string" ? record["actor"] : UNATTRIBUTED_ACTOR,
|
|
188
|
+
...(typeof record["task"] === "string" ? { task: record["task"] } : {}),
|
|
189
|
+
...(typeof record["session"] === "string" ? { session: record["session"] } : {}),
|
|
190
|
+
text: record["text"],
|
|
191
|
+
date: name.slice(0, 10),
|
|
192
|
+
});
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
const total = entries.length;
|
|
196
|
+
const limit = options.limit;
|
|
197
|
+
const kept = limit === undefined ? entries : entries.slice(Math.max(0, total - limit));
|
|
198
|
+
return { ok: true, entries: kept, files: wanted, total };
|
|
199
|
+
}
|
|
200
|
+
//# sourceMappingURL=journal.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"journal.js","sourceRoot":"","sources":["../../../src/core/journal.ts"],"names":[],"mappings":"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"}
|