@jitsusama/agentic-harness.core 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/README.md +52 -0
- package/dist/advisor/charter.d.ts +14 -0
- package/dist/advisor/charter.js +48 -0
- package/dist/advisor/findings.d.ts +43 -0
- package/dist/advisor/findings.js +82 -0
- package/dist/advisor/index.d.ts +24 -0
- package/dist/advisor/index.js +23 -0
- package/dist/advisor/settings.d.ts +16 -0
- package/dist/advisor/settings.js +30 -0
- package/dist/advisor/substantive.d.ts +14 -0
- package/dist/advisor/substantive.js +33 -0
- package/dist/advisor/tools.d.ts +38 -0
- package/dist/advisor/tools.js +202 -0
- package/dist/attribution/commit-hook.d.ts +53 -0
- package/dist/attribution/commit-hook.js +133 -0
- package/dist/attribution/gh-footer.d.ts +27 -0
- package/dist/attribution/gh-footer.js +80 -0
- package/dist/attribution/index.d.ts +11 -0
- package/dist/attribution/index.js +11 -0
- package/dist/attribution/model-name.d.ts +11 -0
- package/dist/attribution/model-name.js +26 -0
- package/dist/bin/attribution.d.ts +36 -0
- package/dist/bin/attribution.js +82 -0
- package/dist/bin/cli.d.ts +14 -0
- package/dist/bin/cli.js +236 -0
- package/dist/bin/gate-deps.d.ts +23 -0
- package/dist/bin/gate-deps.js +61 -0
- package/dist/bin/guardians.d.ts +51 -0
- package/dist/bin/guardians.js +174 -0
- package/dist/bin/memory.d.ts +16 -0
- package/dist/bin/memory.js +81 -0
- package/dist/bin/notes.d.ts +30 -0
- package/dist/bin/notes.js +67 -0
- package/dist/bin/process-exec.d.ts +14 -0
- package/dist/bin/process-exec.js +31 -0
- package/dist/bin/quest.d.ts +38 -0
- package/dist/bin/quest.js +187 -0
- package/dist/bin/slack-auth.d.ts +49 -0
- package/dist/bin/slack-auth.js +107 -0
- package/dist/clock/index.d.ts +46 -0
- package/dist/clock/index.js +72 -0
- package/dist/command/cwd.d.ts +21 -0
- package/dist/command/cwd.js +60 -0
- package/dist/command/edit.d.ts +14 -0
- package/dist/command/edit.js +22 -0
- package/dist/command/flags.d.ts +29 -0
- package/dist/command/flags.js +111 -0
- package/dist/command/index.d.ts +16 -0
- package/dist/command/index.js +12 -0
- package/dist/command/tokenize.d.ts +7 -0
- package/dist/command/tokenize.js +315 -0
- package/dist/command/types.d.ts +66 -0
- package/dist/command/types.js +9 -0
- package/dist/completion/index.d.ts +17 -0
- package/dist/completion/index.js +16 -0
- package/dist/completion/investigate.d.ts +63 -0
- package/dist/completion/investigate.js +198 -0
- package/dist/completion/resolve.d.ts +29 -0
- package/dist/completion/resolve.js +42 -0
- package/dist/completion/side.d.ts +51 -0
- package/dist/completion/side.js +93 -0
- package/dist/completion/types.d.ts +84 -0
- package/dist/completion/types.js +14 -0
- package/dist/exec/exec.d.ts +38 -0
- package/dist/exec/exec.js +51 -0
- package/dist/exec/index.d.ts +8 -0
- package/dist/exec/index.js +8 -0
- package/dist/gate/decision.d.ts +52 -0
- package/dist/gate/decision.js +68 -0
- package/dist/gate/deps.d.ts +14 -0
- package/dist/gate/deps.js +1 -0
- package/dist/gate/index.d.ts +2 -0
- package/dist/gate/index.js +1 -0
- package/dist/git-cli/index.d.ts +47 -0
- package/dist/git-cli/index.js +127 -0
- package/dist/github-cli/command-spec.d.ts +14 -0
- package/dist/github-cli/command-spec.js +18 -0
- package/dist/github-cli/index.d.ts +71 -0
- package/dist/github-cli/index.js +188 -0
- package/dist/google/apis/calendar.d.ts +64 -0
- package/dist/google/apis/calendar.js +297 -0
- package/dist/google/apis/docs.d.ts +29 -0
- package/dist/google/apis/docs.js +154 -0
- package/dist/google/apis/drive.d.ts +46 -0
- package/dist/google/apis/drive.js +189 -0
- package/dist/google/apis/gmail.d.ts +67 -0
- package/dist/google/apis/gmail.js +374 -0
- package/dist/google/apis/index.d.ts +10 -0
- package/dist/google/apis/index.js +10 -0
- package/dist/google/apis/sheets.d.ts +16 -0
- package/dist/google/apis/sheets.js +54 -0
- package/dist/google/apis/slides.d.ts +16 -0
- package/dist/google/apis/slides.js +40 -0
- package/dist/google/auth/browser.d.ts +5 -0
- package/dist/google/auth/browser.js +27 -0
- package/dist/google/auth/credentials.d.ts +26 -0
- package/dist/google/auth/credentials.js +69 -0
- package/dist/google/auth/errors.d.ts +15 -0
- package/dist/google/auth/errors.js +26 -0
- package/dist/google/auth/index.d.ts +12 -0
- package/dist/google/auth/index.js +12 -0
- package/dist/google/auth/oauth-app.d.ts +15 -0
- package/dist/google/auth/oauth-app.js +20 -0
- package/dist/google/auth/oauth.d.ts +46 -0
- package/dist/google/auth/oauth.js +146 -0
- package/dist/google/auth/server.d.ts +13 -0
- package/dist/google/auth/server.js +70 -0
- package/dist/google/auth/setup-instructions.d.ts +16 -0
- package/dist/google/auth/setup-instructions.js +24 -0
- package/dist/google/auth/store.d.ts +19 -0
- package/dist/google/auth/store.js +27 -0
- package/dist/google/index.d.ts +13 -0
- package/dist/google/index.js +12 -0
- package/dist/google/paths.d.ts +17 -0
- package/dist/google/paths.js +28 -0
- package/dist/google/renderers/calendar.d.ts +23 -0
- package/dist/google/renderers/calendar.js +312 -0
- package/dist/google/renderers/drive.d.ts +31 -0
- package/dist/google/renderers/drive.js +214 -0
- package/dist/google/renderers/email.d.ts +16 -0
- package/dist/google/renderers/email.js +130 -0
- package/dist/google/renderers/index.d.ts +8 -0
- package/dist/google/renderers/index.js +8 -0
- package/dist/google/types.d.ts +143 -0
- package/dist/google/types.js +27 -0
- package/dist/governance/distill.d.ts +31 -0
- package/dist/governance/distill.js +78 -0
- package/dist/governance/index.d.ts +11 -0
- package/dist/governance/index.js +10 -0
- package/dist/governance/render.d.ts +13 -0
- package/dist/governance/render.js +23 -0
- package/dist/governance/store.d.ts +32 -0
- package/dist/governance/store.js +102 -0
- package/dist/governance/types.d.ts +19 -0
- package/dist/governance/types.js +9 -0
- package/dist/guardian/index.d.ts +7 -0
- package/dist/guardian/index.js +7 -0
- package/dist/guardian/types.d.ts +37 -0
- package/dist/guardian/types.js +12 -0
- package/dist/internal/github/cli.d.ts +40 -0
- package/dist/internal/github/cli.js +102 -0
- package/dist/internal/guardian/commit-file.d.ts +7 -0
- package/dist/internal/guardian/commit-file.js +36 -0
- package/dist/internal/guardian/commit-format.d.ts +35 -0
- package/dist/internal/guardian/commit-format.js +63 -0
- package/dist/internal/guardian/commit-shell.d.ts +38 -0
- package/dist/internal/guardian/commit-shell.js +134 -0
- package/dist/internal/guardian/history-gate.d.ts +41 -0
- package/dist/internal/guardian/history-gate.js +76 -0
- package/dist/internal/guardian/prose-gate.d.ts +31 -0
- package/dist/internal/guardian/prose-gate.js +50 -0
- package/dist/internal/guardian/redirect-gate.d.ts +41 -0
- package/dist/internal/guardian/redirect-gate.js +114 -0
- package/dist/internal/guardian/section-gate.d.ts +20 -0
- package/dist/internal/guardian/section-gate.js +36 -0
- package/dist/internal/guardian/title-gate.d.ts +20 -0
- package/dist/internal/guardian/title-gate.js +36 -0
- package/dist/internal/json-array.d.ts +11 -0
- package/dist/internal/json-array.js +40 -0
- package/dist/internal/lsp/registry.d.ts +12 -0
- package/dist/internal/lsp/registry.js +16 -0
- package/dist/internal/notes/discovery.d.ts +59 -0
- package/dist/internal/notes/discovery.js +91 -0
- package/dist/internal/notes/frontmatter.d.ts +52 -0
- package/dist/internal/notes/frontmatter.js +163 -0
- package/dist/internal/notes/id.d.ts +42 -0
- package/dist/internal/notes/id.js +80 -0
- package/dist/internal/notes/io.d.ts +25 -0
- package/dist/internal/notes/io.js +51 -0
- package/dist/internal/notes/sanitize.d.ts +19 -0
- package/dist/internal/notes/sanitize.js +35 -0
- package/dist/internal/process-global.d.ts +20 -0
- package/dist/internal/process-global.js +28 -0
- package/dist/internal/quest/alias-index.d.ts +61 -0
- package/dist/internal/quest/alias-index.js +69 -0
- package/dist/internal/quest/append-journey.d.ts +22 -0
- package/dist/internal/quest/append-journey.js +63 -0
- package/dist/internal/quest/bash-write.d.ts +49 -0
- package/dist/internal/quest/bash-write.js +208 -0
- package/dist/internal/quest/dates.d.ts +14 -0
- package/dist/internal/quest/dates.js +20 -0
- package/dist/internal/quest/discovery.d.ts +96 -0
- package/dist/internal/quest/discovery.js +354 -0
- package/dist/internal/quest/fields.d.ts +37 -0
- package/dist/internal/quest/fields.js +94 -0
- package/dist/internal/quest/frontmatter.d.ts +88 -0
- package/dist/internal/quest/frontmatter.js +630 -0
- package/dist/internal/quest/git-signals.d.ts +53 -0
- package/dist/internal/quest/git-signals.js +192 -0
- package/dist/internal/quest/id.d.ts +50 -0
- package/dist/internal/quest/id.js +116 -0
- package/dist/internal/quest/io.d.ts +54 -0
- package/dist/internal/quest/io.js +233 -0
- package/dist/internal/quest/mentions.d.ts +45 -0
- package/dist/internal/quest/mentions.js +70 -0
- package/dist/internal/quest/mutate.d.ts +38 -0
- package/dist/internal/quest/mutate.js +83 -0
- package/dist/internal/quest/process-liveness.d.ts +98 -0
- package/dist/internal/quest/process-liveness.js +216 -0
- package/dist/internal/quest/quest-doc.d.ts +116 -0
- package/dist/internal/quest/quest-doc.js +239 -0
- package/dist/internal/quest/ranking.d.ts +48 -0
- package/dist/internal/quest/ranking.js +114 -0
- package/dist/internal/quest/reopen.d.ts +65 -0
- package/dist/internal/quest/reopen.js +113 -0
- package/dist/internal/quest/resolve-cwd.d.ts +32 -0
- package/dist/internal/quest/resolve-cwd.js +89 -0
- package/dist/internal/quest/sanitize.d.ts +42 -0
- package/dist/internal/quest/sanitize.js +69 -0
- package/dist/internal/quest/scaffold.d.ts +59 -0
- package/dist/internal/quest/scaffold.js +169 -0
- package/dist/internal/quest/scratch.d.ts +27 -0
- package/dist/internal/quest/scratch.js +106 -0
- package/dist/internal/quest/session-liveness.d.ts +125 -0
- package/dist/internal/quest/session-liveness.js +386 -0
- package/dist/internal/quest/session-ownership.d.ts +22 -0
- package/dist/internal/quest/session-ownership.js +100 -0
- package/dist/internal/quest/session-registry.d.ts +221 -0
- package/dist/internal/quest/session-registry.js +266 -0
- package/dist/internal/quest/status.d.ts +10 -0
- package/dist/internal/quest/status.js +15 -0
- package/dist/internal/quest/structural-journal.d.ts +41 -0
- package/dist/internal/quest/structural-journal.js +67 -0
- package/dist/internal/quest/structural.d.ts +43 -0
- package/dist/internal/quest/structural.js +77 -0
- package/dist/internal/quest/toc.d.ts +28 -0
- package/dist/internal/quest/toc.js +90 -0
- package/dist/internal/quest/trees.d.ts +53 -0
- package/dist/internal/quest/trees.js +145 -0
- package/dist/internal/quest/url-fetchers.d.ts +50 -0
- package/dist/internal/quest/url-fetchers.js +97 -0
- package/dist/internal/quest/write-classifier.d.ts +46 -0
- package/dist/internal/quest/write-classifier.js +59 -0
- package/dist/internal/refs/builtins.d.ts +32 -0
- package/dist/internal/refs/builtins.js +179 -0
- package/dist/internal/refs/registry.d.ts +25 -0
- package/dist/internal/refs/registry.js +42 -0
- package/dist/internal/registry/global-symbol-registry.d.ts +37 -0
- package/dist/internal/registry/global-symbol-registry.js +55 -0
- package/dist/internal/review/registry.d.ts +12 -0
- package/dist/internal/review/registry.js +16 -0
- package/dist/internal/sqlite/db.d.ts +16 -0
- package/dist/internal/sqlite/db.js +26 -0
- package/dist/internal/terminal/builtins.d.ts +8 -0
- package/dist/internal/terminal/builtins.js +14 -0
- package/dist/internal/terminal/drivers/fallback.d.ts +8 -0
- package/dist/internal/terminal/drivers/fallback.js +31 -0
- package/dist/internal/terminal/drivers/shared.d.ts +39 -0
- package/dist/internal/terminal/drivers/shared.js +51 -0
- package/dist/internal/terminal/drivers/tmux.d.ts +14 -0
- package/dist/internal/terminal/drivers/tmux.js +88 -0
- package/dist/internal/terminal/drivers/wezterm.d.ts +35 -0
- package/dist/internal/terminal/drivers/wezterm.js +175 -0
- package/dist/internal/terminal/registry.d.ts +12 -0
- package/dist/internal/terminal/registry.js +16 -0
- package/dist/internal/tree/builtins.d.ts +8 -0
- package/dist/internal/tree/builtins.js +10 -0
- package/dist/internal/tree/providers/git-worktree.d.ts +20 -0
- package/dist/internal/tree/providers/git-worktree.js +279 -0
- package/dist/internal/tree/registry.d.ts +12 -0
- package/dist/internal/tree/registry.js +16 -0
- package/dist/lsp/config.d.ts +77 -0
- package/dist/lsp/config.js +154 -0
- package/dist/lsp/external.d.ts +13 -0
- package/dist/lsp/external.js +52 -0
- package/dist/lsp/format.d.ts +11 -0
- package/dist/lsp/format.js +54 -0
- package/dist/lsp/index.d.ts +17 -0
- package/dist/lsp/index.js +16 -0
- package/dist/lsp/offsets.d.ts +22 -0
- package/dist/lsp/offsets.js +51 -0
- package/dist/lsp/registry.d.ts +28 -0
- package/dist/lsp/registry.js +45 -0
- package/dist/lsp/standalone/backend.d.ts +42 -0
- package/dist/lsp/standalone/backend.js +150 -0
- package/dist/lsp/standalone/document.d.ts +45 -0
- package/dist/lsp/standalone/document.js +81 -0
- package/dist/lsp/standalone/server.d.ts +84 -0
- package/dist/lsp/standalone/server.js +521 -0
- package/dist/lsp/types.d.ts +119 -0
- package/dist/lsp/types.js +13 -0
- package/dist/memory/db.d.ts +15 -0
- package/dist/memory/db.js +25 -0
- package/dist/memory/index.d.ts +12 -0
- package/dist/memory/index.js +11 -0
- package/dist/memory/paths.d.ts +19 -0
- package/dist/memory/paths.js +33 -0
- package/dist/memory/scope.d.ts +14 -0
- package/dist/memory/scope.js +22 -0
- package/dist/memory/store.d.ts +12 -0
- package/dist/memory/store.js +146 -0
- package/dist/memory/types.d.ts +80 -0
- package/dist/memory/types.js +6 -0
- package/dist/notes/types.d.ts +50 -0
- package/dist/notes/types.js +23 -0
- package/dist/notes/verbs/create.d.ts +5 -0
- package/dist/notes/verbs/create.js +55 -0
- package/dist/notes/verbs/mutate.d.ts +8 -0
- package/dist/notes/verbs/mutate.js +152 -0
- package/dist/notes/verbs/queries.d.ts +15 -0
- package/dist/notes/verbs/queries.js +116 -0
- package/dist/notes/verbs/reindex.d.ts +12 -0
- package/dist/notes/verbs/reindex.js +35 -0
- package/dist/notes/verbs/shared.d.ts +37 -0
- package/dist/notes/verbs/shared.js +29 -0
- package/dist/observability/index.d.ts +13 -0
- package/dist/observability/index.js +12 -0
- package/dist/observability/recorder.d.ts +50 -0
- package/dist/observability/recorder.js +77 -0
- package/dist/observability/store.d.ts +22 -0
- package/dist/observability/store.js +213 -0
- package/dist/observability/types.d.ts +82 -0
- package/dist/observability/types.js +1 -0
- package/dist/process/index.d.ts +9 -0
- package/dist/process/index.js +9 -0
- package/dist/process/process.d.ts +95 -0
- package/dist/process/process.js +153 -0
- package/dist/prose/block.d.ts +9 -0
- package/dist/prose/block.js +43 -0
- package/dist/prose/detect.d.ts +50 -0
- package/dist/prose/detect.js +217 -0
- package/dist/prose/gate.d.ts +14 -0
- package/dist/prose/gate.js +21 -0
- package/dist/prose/index.d.ts +4 -0
- package/dist/prose/index.js +4 -0
- package/dist/prose/wrap.d.ts +9 -0
- package/dist/prose/wrap.js +47 -0
- package/dist/quest/actions.d.ts +20 -0
- package/dist/quest/actions.js +107 -0
- package/dist/quest/config.d.ts +79 -0
- package/dist/quest/config.js +83 -0
- package/dist/quest/index.d.ts +29 -0
- package/dist/quest/index.js +28 -0
- package/dist/quest/lifecycle.d.ts +365 -0
- package/dist/quest/lifecycle.js +900 -0
- package/dist/quest/lookup.d.ts +243 -0
- package/dist/quest/lookup.js +496 -0
- package/dist/quest/machine.d.ts +48 -0
- package/dist/quest/machine.js +96 -0
- package/dist/quest/render-rows.d.ts +166 -0
- package/dist/quest/render-rows.js +214 -0
- package/dist/quest/state.d.ts +111 -0
- package/dist/quest/state.js +46 -0
- package/dist/quest/types.d.ts +224 -0
- package/dist/quest/types.js +10 -0
- package/dist/quest/verbs/alias.d.ts +9 -0
- package/dist/quest/verbs/alias.js +129 -0
- package/dist/quest/verbs/lifecycle.d.ts +36 -0
- package/dist/quest/verbs/lifecycle.js +407 -0
- package/dist/quest/verbs/queries.d.ts +24 -0
- package/dist/quest/verbs/queries.js +241 -0
- package/dist/quest/verbs/reorder.d.ts +15 -0
- package/dist/quest/verbs/reorder.js +85 -0
- package/dist/quest/verbs/shared.d.ts +63 -0
- package/dist/quest/verbs/shared.js +35 -0
- package/dist/quest/verbs/stage.d.ts +39 -0
- package/dist/quest/verbs/stage.js +506 -0
- package/dist/quest/verbs/structural.d.ts +23 -0
- package/dist/quest/verbs/structural.js +310 -0
- package/dist/quest/verbs/tree-ops.d.ts +20 -0
- package/dist/quest/verbs/tree-ops.js +289 -0
- package/dist/refs/index.d.ts +13 -0
- package/dist/refs/index.js +12 -0
- package/dist/refs/lookup.d.ts +53 -0
- package/dist/refs/lookup.js +102 -0
- package/dist/refs/register.d.ts +34 -0
- package/dist/refs/register.js +44 -0
- package/dist/refs/types.d.ts +81 -0
- package/dist/refs/types.js +17 -0
- package/dist/remote/index.d.ts +9 -0
- package/dist/remote/index.js +9 -0
- package/dist/remote/name.d.ts +22 -0
- package/dist/remote/name.js +30 -0
- package/dist/result/cite.d.ts +84 -0
- package/dist/result/cite.js +127 -0
- package/dist/result/counts.d.ts +15 -0
- package/dist/result/counts.js +17 -0
- package/dist/result/details.d.ts +61 -0
- package/dist/result/details.js +121 -0
- package/dist/result/digest.d.ts +37 -0
- package/dist/result/digest.js +227 -0
- package/dist/result/follow.d.ts +29 -0
- package/dist/result/follow.js +37 -0
- package/dist/result/index.d.ts +26 -0
- package/dist/result/index.js +26 -0
- package/dist/result/listing.d.ts +62 -0
- package/dist/result/listing.js +72 -0
- package/dist/result/location.d.ts +67 -0
- package/dist/result/location.js +125 -0
- package/dist/result/query.d.ts +67 -0
- package/dist/result/query.js +144 -0
- package/dist/result/spill.d.ts +41 -0
- package/dist/result/spill.js +121 -0
- package/dist/result/store.d.ts +83 -0
- package/dist/result/store.js +214 -0
- package/dist/result/view.d.ts +31 -0
- package/dist/result/view.js +38 -0
- package/dist/review/anchor.d.ts +84 -0
- package/dist/review/anchor.js +89 -0
- package/dist/review/ask/agents.d.ts +80 -0
- package/dist/review/ask/agents.js +296 -0
- package/dist/review/ask/anchorable.d.ts +35 -0
- package/dist/review/ask/anchorable.js +76 -0
- package/dist/review/ask/answer.d.ts +54 -0
- package/dist/review/ask/answer.js +209 -0
- package/dist/review/ask/audit.d.ts +71 -0
- package/dist/review/ask/audit.js +158 -0
- package/dist/review/ask/collect.d.ts +41 -0
- package/dist/review/ask/collect.js +82 -0
- package/dist/review/ask/council.d.ts +290 -0
- package/dist/review/ask/council.js +386 -0
- package/dist/review/ask/critique.d.ts +69 -0
- package/dist/review/ask/critique.js +157 -0
- package/dist/review/ask/harvest.d.ts +119 -0
- package/dist/review/ask/harvest.js +409 -0
- package/dist/review/ask/identity.d.ts +93 -0
- package/dist/review/ask/identity.js +134 -0
- package/dist/review/ask/judge.d.ts +37 -0
- package/dist/review/ask/judge.js +140 -0
- package/dist/review/ask/persona.d.ts +84 -0
- package/dist/review/ask/persona.js +127 -0
- package/dist/review/ask/progress.d.ts +117 -0
- package/dist/review/ask/progress.js +137 -0
- package/dist/review/ask/prompt.d.ts +131 -0
- package/dist/review/ask/prompt.js +242 -0
- package/dist/review/ask/roster.d.ts +94 -0
- package/dist/review/ask/roster.js +338 -0
- package/dist/review/ask/run.d.ts +435 -0
- package/dist/review/ask/run.js +340 -0
- package/dist/review/ask/span.d.ts +70 -0
- package/dist/review/ask/span.js +166 -0
- package/dist/review/ask/stack-round.d.ts +66 -0
- package/dist/review/ask/stack-round.js +125 -0
- package/dist/review/ask/start.d.ts +48 -0
- package/dist/review/ask/start.js +118 -0
- package/dist/review/ask/store.d.ts +83 -0
- package/dist/review/ask/store.js +226 -0
- package/dist/review/ask/wire.d.ts +89 -0
- package/dist/review/ask/wire.js +204 -0
- package/dist/review/attach.d.ts +161 -0
- package/dist/review/attach.js +357 -0
- package/dist/review/authoring.d.ts +84 -0
- package/dist/review/authoring.js +203 -0
- package/dist/review/backed.d.ts +90 -0
- package/dist/review/backed.js +168 -0
- package/dist/review/bind.d.ts +75 -0
- package/dist/review/bind.js +223 -0
- package/dist/review/budget.d.ts +133 -0
- package/dist/review/budget.js +278 -0
- package/dist/review/capabilities.d.ts +217 -0
- package/dist/review/capabilities.js +46 -0
- package/dist/review/change.d.ts +155 -0
- package/dist/review/change.js +15 -0
- package/dist/review/checks.d.ts +56 -0
- package/dist/review/checks.js +11 -0
- package/dist/review/config.d.ts +71 -0
- package/dist/review/config.js +125 -0
- package/dist/review/conventions.d.ts +35 -0
- package/dist/review/conventions.js +58 -0
- package/dist/review/conversation.d.ts +98 -0
- package/dist/review/conversation.js +16 -0
- package/dist/review/decided.d.ts +58 -0
- package/dist/review/decided.js +67 -0
- package/dist/review/diff.d.ts +116 -0
- package/dist/review/diff.js +237 -0
- package/dist/review/draft/continuation.d.ts +23 -0
- package/dist/review/draft/continuation.js +32 -0
- package/dist/review/draft/fanout.d.ts +57 -0
- package/dist/review/draft/fanout.js +46 -0
- package/dist/review/draft/handle.d.ts +55 -0
- package/dist/review/draft/handle.js +110 -0
- package/dist/review/draft/plan.d.ts +112 -0
- package/dist/review/draft/plan.js +343 -0
- package/dist/review/draft/publish.d.ts +38 -0
- package/dist/review/draft/publish.js +118 -0
- package/dist/review/draft/render.d.ts +32 -0
- package/dist/review/draft/render.js +100 -0
- package/dist/review/draft/state.d.ts +98 -0
- package/dist/review/draft/state.js +83 -0
- package/dist/review/draft/store.d.ts +33 -0
- package/dist/review/draft/store.js +100 -0
- package/dist/review/elsewhere.d.ts +27 -0
- package/dist/review/elsewhere.js +39 -0
- package/dist/review/engine.d.ts +106 -0
- package/dist/review/engine.js +243 -0
- package/dist/review/events.d.ts +59 -0
- package/dist/review/events.js +35 -0
- package/dist/review/failed.d.ts +46 -0
- package/dist/review/failed.js +56 -0
- package/dist/review/finding.d.ts +81 -0
- package/dist/review/finding.js +85 -0
- package/dist/review/fix.d.ts +147 -0
- package/dist/review/fix.js +175 -0
- package/dist/review/followup.d.ts +84 -0
- package/dist/review/followup.js +123 -0
- package/dist/review/index.d.ts +134 -0
- package/dist/review/index.js +80 -0
- package/dist/review/keys.d.ts +23 -0
- package/dist/review/keys.js +40 -0
- package/dist/review/landing.d.ts +37 -0
- package/dist/review/landing.js +68 -0
- package/dist/review/lenses.d.ts +132 -0
- package/dist/review/lenses.js +430 -0
- package/dist/review/propose-from.d.ts +76 -0
- package/dist/review/propose-from.js +86 -0
- package/dist/review/provider.d.ts +306 -0
- package/dist/review/provider.js +16 -0
- package/dist/review/providers/git/index.d.ts +23 -0
- package/dist/review/providers/git/index.js +214 -0
- package/dist/review/providers/github/authoring.d.ts +22 -0
- package/dist/review/providers/github/authoring.js +350 -0
- package/dist/review/providers/github/claims.d.ts +49 -0
- package/dist/review/providers/github/claims.js +136 -0
- package/dist/review/providers/github/conversation.d.ts +18 -0
- package/dist/review/providers/github/conversation.js +455 -0
- package/dist/review/providers/github/fields.d.ts +30 -0
- package/dist/review/providers/github/fields.js +47 -0
- package/dist/review/providers/github/index.d.ts +15 -0
- package/dist/review/providers/github/index.js +110 -0
- package/dist/review/providers/github/proposals.d.ts +14 -0
- package/dist/review/providers/github/proposals.js +298 -0
- package/dist/review/providers/github/queue.d.ts +46 -0
- package/dist/review/providers/github/queue.js +122 -0
- package/dist/review/providers/github/stacking.d.ts +20 -0
- package/dist/review/providers/github/stacking.js +107 -0
- package/dist/review/queue.d.ts +43 -0
- package/dist/review/queue.js +56 -0
- package/dist/review/reactable.d.ts +93 -0
- package/dist/review/reactable.js +140 -0
- package/dist/review/register.d.ts +52 -0
- package/dist/review/register.js +53 -0
- package/dist/review/resolve.d.ts +58 -0
- package/dist/review/resolve.js +150 -0
- package/dist/review/retarget.d.ts +73 -0
- package/dist/review/retarget.js +82 -0
- package/dist/review/revisited.d.ts +77 -0
- package/dist/review/revisited.js +121 -0
- package/dist/review/stack.d.ts +110 -0
- package/dist/review/stack.js +52 -0
- package/dist/sections/block.d.ts +9 -0
- package/dist/sections/block.js +42 -0
- package/dist/sections/detect.d.ts +31 -0
- package/dist/sections/detect.js +67 -0
- package/dist/sections/gate.d.ts +21 -0
- package/dist/sections/gate.js +22 -0
- package/dist/sections/index.d.ts +5 -0
- package/dist/sections/index.js +5 -0
- package/dist/sections/sanctioned.d.ts +13 -0
- package/dist/sections/sanctioned.js +21 -0
- package/dist/shell/index.d.ts +8 -0
- package/dist/shell/index.js +8 -0
- package/dist/shell/parse.d.ts +125 -0
- package/dist/shell/parse.js +298 -0
- package/dist/slack/api/channels.d.ts +12 -0
- package/dist/slack/api/channels.js +28 -0
- package/dist/slack/api/client.d.ts +94 -0
- package/dist/slack/api/client.js +272 -0
- package/dist/slack/api/files.d.ts +95 -0
- package/dist/slack/api/files.js +223 -0
- package/dist/slack/api/index.d.ts +11 -0
- package/dist/slack/api/index.js +11 -0
- package/dist/slack/api/messages.d.ts +98 -0
- package/dist/slack/api/messages.js +292 -0
- package/dist/slack/api/reactions.d.ts +47 -0
- package/dist/slack/api/reactions.js +50 -0
- package/dist/slack/api/resolve-conversations.d.ts +43 -0
- package/dist/slack/api/resolve-conversations.js +130 -0
- package/dist/slack/api/resolve-messages.d.ts +29 -0
- package/dist/slack/api/resolve-messages.js +93 -0
- package/dist/slack/api/resolve-users.d.ts +27 -0
- package/dist/slack/api/resolve-users.js +73 -0
- package/dist/slack/api/search.d.ts +86 -0
- package/dist/slack/api/search.js +186 -0
- package/dist/slack/api/users.d.ts +12 -0
- package/dist/slack/api/users.js +33 -0
- package/dist/slack/auth/browser-extract.d.ts +33 -0
- package/dist/slack/auth/browser-extract.js +201 -0
- package/dist/slack/auth/browser.d.ts +5 -0
- package/dist/slack/auth/browser.js +25 -0
- package/dist/slack/auth/credentials.d.ts +14 -0
- package/dist/slack/auth/credentials.js +24 -0
- package/dist/slack/auth/errors.d.ts +9 -0
- package/dist/slack/auth/errors.js +19 -0
- package/dist/slack/auth/extract.d.ts +23 -0
- package/dist/slack/auth/extract.js +44 -0
- package/dist/slack/auth/index.d.ts +12 -0
- package/dist/slack/auth/index.js +11 -0
- package/dist/slack/auth/oauth-app.d.ts +11 -0
- package/dist/slack/auth/oauth-app.js +20 -0
- package/dist/slack/auth/oauth.d.ts +31 -0
- package/dist/slack/auth/oauth.js +82 -0
- package/dist/slack/auth/server.d.ts +14 -0
- package/dist/slack/auth/server.js +75 -0
- package/dist/slack/auth/store.d.ts +17 -0
- package/dist/slack/auth/store.js +27 -0
- package/dist/slack/block-message.d.ts +9 -0
- package/dist/slack/block-message.js +30 -0
- package/dist/slack/blocks.d.ts +94 -0
- package/dist/slack/blocks.js +765 -0
- package/dist/slack/content-gate.d.ts +12 -0
- package/dist/slack/content-gate.js +22 -0
- package/dist/slack/detect.d.ts +31 -0
- package/dist/slack/detect.js +125 -0
- package/dist/slack/index.d.ts +18 -0
- package/dist/slack/index.js +17 -0
- package/dist/slack/paths.d.ts +28 -0
- package/dist/slack/paths.js +46 -0
- package/dist/slack/renderers/channel.d.ts +6 -0
- package/dist/slack/renderers/channel.js +27 -0
- package/dist/slack/renderers/index.d.ts +9 -0
- package/dist/slack/renderers/index.js +9 -0
- package/dist/slack/renderers/message.d.ts +21 -0
- package/dist/slack/renderers/message.js +214 -0
- package/dist/slack/renderers/reactions.d.ts +8 -0
- package/dist/slack/renderers/reactions.js +43 -0
- package/dist/slack/renderers/search.d.ts +6 -0
- package/dist/slack/renderers/search.js +39 -0
- package/dist/slack/renderers/user.d.ts +6 -0
- package/dist/slack/renderers/user.js +32 -0
- package/dist/slack/resolvers/cache.d.ts +29 -0
- package/dist/slack/resolvers/cache.js +70 -0
- package/dist/slack/resolvers/conversation-cache.d.ts +42 -0
- package/dist/slack/resolvers/conversation-cache.js +128 -0
- package/dist/slack/resolvers/conversation.d.ts +44 -0
- package/dist/slack/resolvers/conversation.js +229 -0
- package/dist/slack/resolvers/index.d.ts +8 -0
- package/dist/slack/resolvers/index.js +8 -0
- package/dist/slack/resolvers/target.d.ts +19 -0
- package/dist/slack/resolvers/target.js +45 -0
- package/dist/slack/resolvers/url.d.ts +20 -0
- package/dist/slack/resolvers/url.js +22 -0
- package/dist/slack/resolvers/user.d.ts +54 -0
- package/dist/slack/resolvers/user.js +134 -0
- package/dist/slack/types.d.ts +180 -0
- package/dist/slack/types.js +13 -0
- package/dist/tdd/attest.d.ts +21 -0
- package/dist/tdd/attest.js +21 -0
- package/dist/tdd/discipline.d.ts +11 -0
- package/dist/tdd/discipline.js +28 -0
- package/dist/tdd/index.d.ts +14 -0
- package/dist/tdd/index.js +13 -0
- package/dist/tdd/machine.d.ts +48 -0
- package/dist/tdd/machine.js +139 -0
- package/dist/tdd/presentation.d.ts +34 -0
- package/dist/tdd/presentation.js +38 -0
- package/dist/tdd/queries.d.ts +10 -0
- package/dist/tdd/queries.js +22 -0
- package/dist/terminal/index.d.ts +12 -0
- package/dist/terminal/index.js +11 -0
- package/dist/terminal/register.d.ts +21 -0
- package/dist/terminal/register.js +31 -0
- package/dist/terminal/resolve.d.ts +63 -0
- package/dist/terminal/resolve.js +117 -0
- package/dist/terminal/types.d.ts +134 -0
- package/dist/terminal/types.js +19 -0
- package/dist/thinking/index.d.ts +20 -0
- package/dist/thinking/index.js +27 -0
- package/dist/title/block.d.ts +9 -0
- package/dist/title/block.js +32 -0
- package/dist/title/detect.d.ts +25 -0
- package/dist/title/detect.js +154 -0
- package/dist/title/gate.d.ts +19 -0
- package/dist/title/gate.js +21 -0
- package/dist/title/index.d.ts +3 -0
- package/dist/title/index.js +3 -0
- package/dist/tree/index.d.ts +18 -0
- package/dist/tree/index.js +17 -0
- package/dist/tree/register.d.ts +21 -0
- package/dist/tree/register.js +31 -0
- package/dist/tree/resolve.d.ts +20 -0
- package/dist/tree/resolve.js +31 -0
- package/dist/tree/types.d.ts +83 -0
- package/dist/tree/types.js +12 -0
- package/dist/ui/count.d.ts +29 -0
- package/dist/ui/count.js +35 -0
- package/dist/ui/path.d.ts +25 -0
- package/dist/ui/path.js +40 -0
- package/dist/verify/index.d.ts +17 -0
- package/dist/verify/index.js +14 -0
- package/dist/verify/project.d.ts +21 -0
- package/dist/verify/project.js +49 -0
- package/dist/verify/resolve.d.ts +26 -0
- package/dist/verify/resolve.js +27 -0
- package/dist/verify/run.d.ts +31 -0
- package/dist/verify/run.js +145 -0
- package/dist/web/a11y/announcements.d.ts +67 -0
- package/dist/web/a11y/announcements.js +116 -0
- package/dist/web/a11y/budget.d.ts +75 -0
- package/dist/web/a11y/budget.js +97 -0
- package/dist/web/a11y/focus.d.ts +37 -0
- package/dist/web/a11y/focus.js +106 -0
- package/dist/web/a11y/index.d.ts +19 -0
- package/dist/web/a11y/index.js +25 -0
- package/dist/web/a11y/naming.d.ts +23 -0
- package/dist/web/a11y/naming.js +55 -0
- package/dist/web/a11y/outline.d.ts +23 -0
- package/dist/web/a11y/outline.js +42 -0
- package/dist/web/a11y/reading.d.ts +12 -0
- package/dist/web/a11y/reading.js +101 -0
- package/dist/web/a11y/scope.d.ts +23 -0
- package/dist/web/a11y/scope.js +99 -0
- package/dist/web/a11y/states.d.ts +22 -0
- package/dist/web/a11y/states.js +53 -0
- package/dist/web/a11y/tree.d.ts +124 -0
- package/dist/web/a11y/tree.js +269 -0
- package/dist/web/a11y/walk.d.ts +225 -0
- package/dist/web/a11y/walk.js +568 -0
- package/dist/web/a11y/walkprobe.d.ts +44 -0
- package/dist/web/a11y/walkprobe.js +365 -0
- package/dist/web/audit/axe.d.ts +219 -0
- package/dist/web/audit/axe.js +322 -0
- package/dist/web/audit/behind.d.ts +63 -0
- package/dist/web/audit/behind.js +142 -0
- package/dist/web/audit/capture.d.ts +43 -0
- package/dist/web/audit/capture.js +185 -0
- package/dist/web/audit/colour.d.ts +85 -0
- package/dist/web/audit/colour.js +189 -0
- package/dist/web/audit/contrast.d.ts +74 -0
- package/dist/web/audit/contrast.js +104 -0
- package/dist/web/audit/health.d.ts +27 -0
- package/dist/web/audit/health.js +57 -0
- package/dist/web/audit/index.d.ts +22 -0
- package/dist/web/audit/index.js +22 -0
- package/dist/web/audit/pair.d.ts +55 -0
- package/dist/web/audit/pair.js +157 -0
- package/dist/web/audit/probe.d.ts +31 -0
- package/dist/web/audit/probe.js +189 -0
- package/dist/web/audit/report.d.ts +22 -0
- package/dist/web/audit/report.js +250 -0
- package/dist/web/audit/structure.d.ts +126 -0
- package/dist/web/audit/structure.js +595 -0
- package/dist/web/audit/sweep.d.ts +66 -0
- package/dist/web/audit/sweep.js +117 -0
- package/dist/web/audit/target.d.ts +89 -0
- package/dist/web/audit/target.js +168 -0
- package/dist/web/audit/verdict.d.ts +48 -0
- package/dist/web/audit/verdict.js +52 -0
- package/dist/web/audit/visual.d.ts +161 -0
- package/dist/web/audit/visual.js +297 -0
- package/dist/web/browser.d.ts +213 -0
- package/dist/web/browser.js +927 -0
- package/dist/web/compare/images.d.ts +45 -0
- package/dist/web/compare/images.js +101 -0
- package/dist/web/compare/index.d.ts +15 -0
- package/dist/web/compare/index.js +15 -0
- package/dist/web/compare/provenance.d.ts +48 -0
- package/dist/web/compare/provenance.js +86 -0
- package/dist/web/compare/regions.d.ts +78 -0
- package/dist/web/compare/regions.js +211 -0
- package/dist/web/cookies/extract.d.ts +26 -0
- package/dist/web/cookies/extract.js +167 -0
- package/dist/web/cookies/index.d.ts +8 -0
- package/dist/web/cookies/index.js +7 -0
- package/dist/web/cookies/inject.d.ts +13 -0
- package/dist/web/cookies/inject.js +27 -0
- package/dist/web/cookies/setup.d.ts +31 -0
- package/dist/web/cookies/setup.js +94 -0
- package/dist/web/design/index.d.ts +9 -0
- package/dist/web/design/index.js +9 -0
- package/dist/web/design/inventory.d.ts +126 -0
- package/dist/web/design/inventory.js +324 -0
- package/dist/web/design/probe.d.ts +24 -0
- package/dist/web/design/probe.js +88 -0
- package/dist/web/element/actionable.d.ts +34 -0
- package/dist/web/element/actionable.js +48 -0
- package/dist/web/element/animations.d.ts +48 -0
- package/dist/web/element/animations.js +74 -0
- package/dist/web/element/box.d.ts +53 -0
- package/dist/web/element/box.js +58 -0
- package/dist/web/element/hover.d.ts +75 -0
- package/dist/web/element/hover.js +172 -0
- package/dist/web/element/index.d.ts +17 -0
- package/dist/web/element/index.js +17 -0
- package/dist/web/element/listeners.d.ts +72 -0
- package/dist/web/element/listeners.js +98 -0
- package/dist/web/element/measure.d.ts +40 -0
- package/dist/web/element/measure.js +118 -0
- package/dist/web/element/probes.d.ts +108 -0
- package/dist/web/element/probes.js +195 -0
- package/dist/web/element/pseudo.d.ts +51 -0
- package/dist/web/element/pseudo.js +96 -0
- package/dist/web/element/view.d.ts +30 -0
- package/dist/web/element/view.js +117 -0
- package/dist/web/element/visibility.d.ts +42 -0
- package/dist/web/element/visibility.js +67 -0
- package/dist/web/envelope/artifacts.d.ts +23 -0
- package/dist/web/envelope/artifacts.js +45 -0
- package/dist/web/envelope/index.d.ts +9 -0
- package/dist/web/envelope/index.js +9 -0
- package/dist/web/envelope/naming.d.ts +23 -0
- package/dist/web/envelope/naming.js +43 -0
- package/dist/web/envelope/paged.d.ts +42 -0
- package/dist/web/envelope/paged.js +99 -0
- package/dist/web/envelope/sink.d.ts +43 -0
- package/dist/web/envelope/sink.js +67 -0
- package/dist/web/environment/devices.d.ts +65 -0
- package/dist/web/environment/devices.js +82 -0
- package/dist/web/environment/emulation.d.ts +124 -0
- package/dist/web/environment/emulation.js +258 -0
- package/dist/web/environment/index.d.ts +15 -0
- package/dist/web/environment/index.js +15 -0
- package/dist/web/environment/probes.d.ts +18 -0
- package/dist/web/environment/probes.js +40 -0
- package/dist/web/environment/shaping.d.ts +90 -0
- package/dist/web/environment/shaping.js +141 -0
- package/dist/web/environment/status.d.ts +51 -0
- package/dist/web/environment/status.js +109 -0
- package/dist/web/environment/storage.d.ts +55 -0
- package/dist/web/environment/storage.js +142 -0
- package/dist/web/environment/tabs.d.ts +32 -0
- package/dist/web/environment/tabs.js +47 -0
- package/dist/web/environment/view.d.ts +10 -0
- package/dist/web/environment/view.js +42 -0
- package/dist/web/evaluate/index.d.ts +6 -0
- package/dist/web/evaluate/index.js +6 -0
- package/dist/web/evaluate/outcome.d.ts +74 -0
- package/dist/web/evaluate/outcome.js +91 -0
- package/dist/web/evaluate/probe.d.ts +31 -0
- package/dist/web/evaluate/probe.js +303 -0
- package/dist/web/index.d.ts +47 -0
- package/dist/web/index.js +47 -0
- package/dist/web/input/index.d.ts +11 -0
- package/dist/web/input/index.js +11 -0
- package/dist/web/input/keys.d.ts +48 -0
- package/dist/web/input/keys.js +189 -0
- package/dist/web/input/pointer.d.ts +56 -0
- package/dist/web/input/pointer.js +77 -0
- package/dist/web/input/touch.d.ts +61 -0
- package/dist/web/input/touch.js +83 -0
- package/dist/web/mermaid.d.ts +69 -0
- package/dist/web/mermaid.js +223 -0
- package/dist/web/paths.d.ts +16 -0
- package/dist/web/paths.js +27 -0
- package/dist/web/perf/heap.d.ts +42 -0
- package/dist/web/perf/heap.js +73 -0
- package/dist/web/perf/index.d.ts +14 -0
- package/dist/web/perf/index.js +14 -0
- package/dist/web/perf/layers.d.ts +98 -0
- package/dist/web/perf/layers.js +165 -0
- package/dist/web/perf/probe.d.ts +26 -0
- package/dist/web/perf/probe.js +123 -0
- package/dist/web/perf/profile.d.ts +53 -0
- package/dist/web/perf/profile.js +97 -0
- package/dist/web/perf/trace.d.ts +152 -0
- package/dist/web/perf/trace.js +429 -0
- package/dist/web/perf/view.d.ts +6 -0
- package/dist/web/perf/view.js +86 -0
- package/dist/web/perf/vitals.d.ts +141 -0
- package/dist/web/perf/vitals.js +175 -0
- package/dist/web/reader.d.ts +131 -0
- package/dist/web/reader.js +340 -0
- package/dist/web/screenshot.d.ts +50 -0
- package/dist/web/screenshot.js +108 -0
- package/dist/web/search.d.ts +49 -0
- package/dist/web/search.js +137 -0
- package/dist/web/session/artifacts.d.ts +32 -0
- package/dist/web/session/artifacts.js +47 -0
- package/dist/web/session/emulation.d.ts +118 -0
- package/dist/web/session/emulation.js +307 -0
- package/dist/web/session/recording.d.ts +51 -0
- package/dist/web/session/recording.js +64 -0
- package/dist/web/session/settling.d.ts +42 -0
- package/dist/web/session/settling.js +104 -0
- package/dist/web/session/shaping.d.ts +48 -0
- package/dist/web/session/shaping.js +113 -0
- package/dist/web/session/sourcemaps.d.ts +64 -0
- package/dist/web/session/sourcemaps.js +135 -0
- package/dist/web/session/telemetry.d.ts +219 -0
- package/dist/web/session/telemetry.js +486 -0
- package/dist/web/session/wires.d.ts +22 -0
- package/dist/web/session/wires.js +11 -0
- package/dist/web/session.d.ts +1153 -0
- package/dist/web/session.js +3400 -0
- package/dist/web/snapshot/deep.d.ts +36 -0
- package/dist/web/snapshot/deep.js +91 -0
- package/dist/web/snapshot/flatten.d.ts +101 -0
- package/dist/web/snapshot/flatten.js +131 -0
- package/dist/web/snapshot/index.d.ts +8 -0
- package/dist/web/snapshot/index.js +10 -0
- package/dist/web/snapshot/presented.d.ts +32 -0
- package/dist/web/snapshot/presented.js +74 -0
- package/dist/web/snapshot/query.d.ts +67 -0
- package/dist/web/snapshot/query.js +136 -0
- package/dist/web/sourcemap/index.d.ts +9 -0
- package/dist/web/sourcemap/index.js +9 -0
- package/dist/web/sourcemap/mappings.d.ts +111 -0
- package/dist/web/sourcemap/mappings.js +218 -0
- package/dist/web/styles/capture.d.ts +49 -0
- package/dist/web/styles/capture.js +85 -0
- package/dist/web/styles/cascade.d.ts +107 -0
- package/dist/web/styles/cascade.js +275 -0
- package/dist/web/styles/curation.d.ts +45 -0
- package/dist/web/styles/curation.js +282 -0
- package/dist/web/styles/index.d.ts +10 -0
- package/dist/web/styles/index.js +10 -0
- package/dist/web/target/index.d.ts +7 -0
- package/dist/web/target/index.js +7 -0
- package/dist/web/target/refusals.d.ts +59 -0
- package/dist/web/target/refusals.js +305 -0
- package/dist/web/target/target.d.ts +59 -0
- package/dist/web/target/target.js +94 -0
- package/dist/web/telemetry/buffer.d.ts +35 -0
- package/dist/web/telemetry/buffer.js +72 -0
- package/dist/web/telemetry/console.d.ts +127 -0
- package/dist/web/telemetry/console.js +217 -0
- package/dist/web/telemetry/dialogs.d.ts +41 -0
- package/dist/web/telemetry/dialogs.js +38 -0
- package/dist/web/telemetry/downloads.d.ts +42 -0
- package/dist/web/telemetry/downloads.js +65 -0
- package/dist/web/telemetry/failure.d.ts +31 -0
- package/dist/web/telemetry/failure.js +72 -0
- package/dist/web/telemetry/har.d.ts +97 -0
- package/dist/web/telemetry/har.js +227 -0
- package/dist/web/telemetry/index.d.ts +18 -0
- package/dist/web/telemetry/index.js +18 -0
- package/dist/web/telemetry/lifecycle.d.ts +69 -0
- package/dist/web/telemetry/lifecycle.js +120 -0
- package/dist/web/telemetry/network.d.ts +152 -0
- package/dist/web/telemetry/network.js +130 -0
- package/dist/web/telemetry/requests.d.ts +31 -0
- package/dist/web/telemetry/requests.js +119 -0
- package/dist/web/telemetry/sockets.d.ts +56 -0
- package/dist/web/telemetry/sockets.js +101 -0
- package/dist/web/telemetry/view.d.ts +16 -0
- package/dist/web/telemetry/view.js +125 -0
- package/dist/web/wait/conditions.d.ts +87 -0
- package/dist/web/wait/conditions.js +100 -0
- package/dist/web/wait/index.d.ts +6 -0
- package/dist/web/wait/index.js +6 -0
- package/dist/web/wait/settle.d.ts +54 -0
- package/dist/web/wait/settle.js +84 -0
- package/dist/work/ask.d.ts +45 -0
- package/dist/work/ask.js +85 -0
- package/dist/work/author.d.ts +61 -0
- package/dist/work/author.js +144 -0
- package/dist/work/broker.d.ts +151 -0
- package/dist/work/broker.js +165 -0
- package/dist/work/events.d.ts +98 -0
- package/dist/work/events.js +57 -0
- package/dist/work/history.d.ts +69 -0
- package/dist/work/history.js +174 -0
- package/dist/work/index.d.ts +49 -0
- package/dist/work/index.js +33 -0
- package/dist/work/inplay.d.ts +43 -0
- package/dist/work/inplay.js +42 -0
- package/dist/work/memory.d.ts +84 -0
- package/dist/work/memory.js +203 -0
- package/dist/work/objection.d.ts +92 -0
- package/dist/work/objection.js +72 -0
- package/dist/work/provider.d.ts +79 -0
- package/dist/work/provider.js +45 -0
- package/dist/work/providers/git.d.ts +29 -0
- package/dist/work/providers/git.js +87 -0
- package/dist/work/publish.d.ts +53 -0
- package/dist/work/publish.js +139 -0
- package/dist/work/rebase.d.ts +78 -0
- package/dist/work/rebase.js +261 -0
- package/dist/work/reclaim.d.ts +56 -0
- package/dist/work/reclaim.js +52 -0
- package/dist/work/register.d.ts +29 -0
- package/dist/work/register.js +41 -0
- package/dist/work/stack.d.ts +126 -0
- package/dist/work/stack.js +243 -0
- package/dist/work/stacks.d.ts +156 -0
- package/dist/work/stacks.js +524 -0
- package/dist/work/survey.d.ts +52 -0
- package/dist/work/survey.js +58 -0
- package/dist/work/tidy.d.ts +147 -0
- package/dist/work/tidy.js +136 -0
- package/dist/work/tree.d.ts +120 -0
- package/dist/work/tree.js +69 -0
- package/dist/work/unattended.d.ts +40 -0
- package/dist/work/unattended.js +57 -0
- package/package.json +145 -0
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Asking a roster about a whole stack at once.
|
|
3
|
+
*
|
|
4
|
+
* The fan-out is the council's, reused rather than rewritten: the
|
|
5
|
+
* rules worth getting right, that participants are asked concurrently,
|
|
6
|
+
* that a thrown error and a reported one are the same event, and that
|
|
7
|
+
* findings are numbered in roster order, are the same rules here and
|
|
8
|
+
* would have to change together. What differs is what a reply means. A
|
|
9
|
+
* council reply is findings about one change; a stack reply is
|
|
10
|
+
* findings about a stack, each naming the changes it is about.
|
|
11
|
+
*
|
|
12
|
+
* Which is why `record` takes a ref. A stack round produces findings
|
|
13
|
+
* for several changes at once, and the store needs to know which
|
|
14
|
+
* change each belongs to. A spanning finding is filed once, at its
|
|
15
|
+
* earliest change, because filing it on every change it touches makes
|
|
16
|
+
* a reader answer one observation three times.
|
|
17
|
+
*/
|
|
18
|
+
import { askRoster, stopWarning, } from "./council.js";
|
|
19
|
+
import { participantIdentity } from "./identity.js";
|
|
20
|
+
import { settleReplies } from "./progress.js";
|
|
21
|
+
import { newRunId, whatItGave, whatItRead, } from "./run.js";
|
|
22
|
+
import { alsoRecordedInStack, harvestStackFindings, saidAt } from "./span.js";
|
|
23
|
+
/** Ask a roster about a stack and file what it says. */
|
|
24
|
+
export async function runStackCouncil(request, deps) {
|
|
25
|
+
const startedAt = deps.now();
|
|
26
|
+
const id = newRunId("stack", startedAt, request.seq);
|
|
27
|
+
const replies = await askRoster(request.roster, request.prompt, id, deps);
|
|
28
|
+
const warnings = [];
|
|
29
|
+
const outcomes = await settleReplies(replies, (reply) => fileReply(reply, id, request, deps, warnings), (outcome) => ({
|
|
30
|
+
participantId: outcome.participantId,
|
|
31
|
+
findings: outcome.findingIds.length,
|
|
32
|
+
}), deps.progress);
|
|
33
|
+
const participants = request.roster.reviewers.map((participant) => participantIdentity("reviewer", participant));
|
|
34
|
+
return {
|
|
35
|
+
run: {
|
|
36
|
+
id,
|
|
37
|
+
round: "stack",
|
|
38
|
+
startedAt: startedAt.toISOString(),
|
|
39
|
+
participants,
|
|
40
|
+
outcomes,
|
|
41
|
+
// The witness cannot be one commit here, which is why this
|
|
42
|
+
// round carries one per change. The caveat can: a stack is
|
|
43
|
+
// read in a single tree like everything else, so a fallback
|
|
44
|
+
// is a fact about the whole round. The exemption was written
|
|
45
|
+
// about the witness and does not reach this.
|
|
46
|
+
...whatItRead({
|
|
47
|
+
...(request.unpinned === undefined
|
|
48
|
+
? {}
|
|
49
|
+
: { unpinned: request.unpinned }),
|
|
50
|
+
}),
|
|
51
|
+
...whatItGave(request),
|
|
52
|
+
},
|
|
53
|
+
warnings,
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
/** Read one reply, file it change by change, and say how it went. */
|
|
57
|
+
async function fileReply(reply, runId, request, deps, warnings) {
|
|
58
|
+
const { participant, answer } = reply;
|
|
59
|
+
if ("failure" in answer) {
|
|
60
|
+
return {
|
|
61
|
+
participantId: participant.id,
|
|
62
|
+
findingIds: [],
|
|
63
|
+
failure: answer.failure,
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
const origin = {
|
|
67
|
+
kind: "reviewer",
|
|
68
|
+
runId,
|
|
69
|
+
reviewerId: participant.id,
|
|
70
|
+
};
|
|
71
|
+
// The same rule as everywhere else, in this round's shape: an
|
|
72
|
+
// anchor may claim a commit only if the reviewer read it. The
|
|
73
|
+
// witnesses here are per change, and a fallback tree misses all of
|
|
74
|
+
// them at once, so the whole lookup goes rather than each answer.
|
|
75
|
+
const formedAt = request.unpinned === undefined ? request.witnessFor : undefined;
|
|
76
|
+
const harvest = alsoRecordedInStack(harvestStackFindings(answer.text, origin, request.stackRefs, formedAt), answer.recorded, origin, request.stackRefs, formedAt);
|
|
77
|
+
// The same rule the single-change round follows, and this round
|
|
78
|
+
// needs it most: it holds every change at once, so it is the one
|
|
79
|
+
// most likely to be interrupted, and it was passing the harvest's
|
|
80
|
+
// own complaints straight through. A reviewer we stopped was being
|
|
81
|
+
// reported as one that wrote a malformed answer.
|
|
82
|
+
const said = [
|
|
83
|
+
...(answer.stopped === undefined
|
|
84
|
+
? harvest.warnings
|
|
85
|
+
: [
|
|
86
|
+
stopWarning(answer.stopped, harvest.findings.length, answer.text.trim() !== "" && harvest.findings.length === 0),
|
|
87
|
+
...(harvest.recordedWarnings ?? []),
|
|
88
|
+
]),
|
|
89
|
+
...(answer.notes ?? []),
|
|
90
|
+
];
|
|
91
|
+
for (const warning of said) {
|
|
92
|
+
warnings.push(`${participant.id}: ${warning}`);
|
|
93
|
+
}
|
|
94
|
+
// Grouped by where each finding is said, and filed in stack order
|
|
95
|
+
// so ids run the way a reader walks the stack.
|
|
96
|
+
const byRef = new Map();
|
|
97
|
+
for (const { span, finding } of harvest.findings) {
|
|
98
|
+
const ref = saidAt(span, request.stackRefs);
|
|
99
|
+
const held = byRef.get(ref);
|
|
100
|
+
if (held === undefined)
|
|
101
|
+
byRef.set(ref, [finding]);
|
|
102
|
+
else
|
|
103
|
+
held.push(finding);
|
|
104
|
+
}
|
|
105
|
+
const findingIds = [];
|
|
106
|
+
for (const ref of request.stackRefs) {
|
|
107
|
+
const held = byRef.get(ref);
|
|
108
|
+
if (held === undefined)
|
|
109
|
+
continue;
|
|
110
|
+
const recorded = await deps.record(ref, held);
|
|
111
|
+
findingIds.push(...recorded.map((finding) => finding.id));
|
|
112
|
+
}
|
|
113
|
+
return {
|
|
114
|
+
participantId: participant.id,
|
|
115
|
+
findingIds,
|
|
116
|
+
// The round most likely to be stopped, since it is the one asked
|
|
117
|
+
// to hold every change at once, was the one throwing the stop
|
|
118
|
+
// away.
|
|
119
|
+
...(answer.stopped === undefined ? {} : { stopped: answer.stopped }),
|
|
120
|
+
...(answer.answerPath === undefined
|
|
121
|
+
? {}
|
|
122
|
+
: { answerPath: answer.answerPath }),
|
|
123
|
+
...(answer.usage === undefined ? {} : { usage: answer.usage }),
|
|
124
|
+
};
|
|
125
|
+
}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Starting a round and walking away from it.
|
|
3
|
+
*
|
|
4
|
+
* A council holds the session for as long as it runs, which for the
|
|
5
|
+
* models worth asking is tens of minutes. That is the cost the whole
|
|
6
|
+
* of this plan has been circling: not that a round can be lost, but
|
|
7
|
+
* that waiting for one is the only way to have one.
|
|
8
|
+
*
|
|
9
|
+
* Nothing about a reviewer actually needs the session. The supervisor
|
|
10
|
+
* is its own process, it writes its answer to disk, and since #455 a
|
|
11
|
+
* round can be finished from what it left there. So a round can be
|
|
12
|
+
* started and abandoned on purpose: the ledger entry says it exists,
|
|
13
|
+
* the reviewer directories fill up in their own time, and `collect`
|
|
14
|
+
* turns them back into findings whenever somebody asks.
|
|
15
|
+
*
|
|
16
|
+
* What is given up is real and worth saying plainly. Nobody is
|
|
17
|
+
* watching, so there is no progress to report, no wrap-up when a
|
|
18
|
+
* reviewer runs long, and no retry of a model that failed to start.
|
|
19
|
+
* The backstop timers inside each supervisor are the only thing
|
|
20
|
+
* keeping a detached round from running until the machine is
|
|
21
|
+
* rebooted, which is exactly why they were made to work first.
|
|
22
|
+
*/
|
|
23
|
+
import { type CouncilRequest, type CouncilResult } from "./council.js";
|
|
24
|
+
import type { Participant } from "./identity.js";
|
|
25
|
+
import type { AskRun } from "./run.js";
|
|
26
|
+
/** What starting a round needs, which is much less than running one. */
|
|
27
|
+
export interface StartDeps {
|
|
28
|
+
/** Dispatch one reviewer and return once it is running. */
|
|
29
|
+
start(participant: Participant, prompt: string, runId: string): Promise<void>;
|
|
30
|
+
now(): Date;
|
|
31
|
+
/** The round exists and nobody has answered. See `CouncilDeps`. */
|
|
32
|
+
opened?(run: AskRun): Promise<void>;
|
|
33
|
+
}
|
|
34
|
+
/** What starting a round came to. */
|
|
35
|
+
export interface StartResult extends CouncilResult {
|
|
36
|
+
/**
|
|
37
|
+
* How many reviewers are actually running.
|
|
38
|
+
*
|
|
39
|
+
* Said rather than left to be worked out. The caller used to
|
|
40
|
+
* subtract the warnings from the roster, which assumes one warning
|
|
41
|
+
* per reviewer, and two of the warnings here are about the round
|
|
42
|
+
* rather than about anybody on it: a round that started nobody
|
|
43
|
+
* because its ledger write failed reported six running.
|
|
44
|
+
*/
|
|
45
|
+
started: number;
|
|
46
|
+
}
|
|
47
|
+
/** Start every reviewer on the roster and hand back the open round. */
|
|
48
|
+
export declare function startCouncil(request: CouncilRequest, deps: StartDeps): Promise<StartResult>;
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Starting a round and walking away from it.
|
|
3
|
+
*
|
|
4
|
+
* A council holds the session for as long as it runs, which for the
|
|
5
|
+
* models worth asking is tens of minutes. That is the cost the whole
|
|
6
|
+
* of this plan has been circling: not that a round can be lost, but
|
|
7
|
+
* that waiting for one is the only way to have one.
|
|
8
|
+
*
|
|
9
|
+
* Nothing about a reviewer actually needs the session. The supervisor
|
|
10
|
+
* is its own process, it writes its answer to disk, and since #455 a
|
|
11
|
+
* round can be finished from what it left there. So a round can be
|
|
12
|
+
* started and abandoned on purpose: the ledger entry says it exists,
|
|
13
|
+
* the reviewer directories fill up in their own time, and `collect`
|
|
14
|
+
* turns them back into findings whenever somebody asks.
|
|
15
|
+
*
|
|
16
|
+
* What is given up is real and worth saying plainly. Nobody is
|
|
17
|
+
* watching, so there is no progress to report, no wrap-up when a
|
|
18
|
+
* reviewer runs long, and no retry of a model that failed to start.
|
|
19
|
+
* The backstop timers inside each supervisor are the only thing
|
|
20
|
+
* keeping a detached round from running until the machine is
|
|
21
|
+
* rebooted, which is exactly why they were made to work first.
|
|
22
|
+
*/
|
|
23
|
+
import { openingRun, thrownAt, } from "./council.js";
|
|
24
|
+
/** Start every reviewer on the roster and hand back the open round. */
|
|
25
|
+
export async function startCouncil(request, deps) {
|
|
26
|
+
const run = openingRun(request, deps.now());
|
|
27
|
+
const id = run.id;
|
|
28
|
+
// Before anybody is started, and here it is load-bearing rather
|
|
29
|
+
// than prudent. A live council can still report what it found if
|
|
30
|
+
// the ledger write fails; this one cannot. Nothing is waiting for
|
|
31
|
+
// these reviewers, so the entry is the only thing that will ever
|
|
32
|
+
// say they were a round rather than seven directories.
|
|
33
|
+
try {
|
|
34
|
+
await deps.opened?.(run);
|
|
35
|
+
}
|
|
36
|
+
catch (error) {
|
|
37
|
+
// Every reviewer gets the outcome it actually had, which is that
|
|
38
|
+
// it was never asked. Handing back a settled round with an empty
|
|
39
|
+
// outcome list instead makes the summary read the silence as
|
|
40
|
+
// seven reviewers who dropped, and a round that asked nobody
|
|
41
|
+
// anything then accuses the whole roster of failing.
|
|
42
|
+
//
|
|
43
|
+
// The reason is the same for all of them and belongs to the
|
|
44
|
+
// round rather than to any one of them, which is exactly what an
|
|
45
|
+
// advisory is, so it is hoisted once and the roll call says so.
|
|
46
|
+
const notWritten = `${id} was not started: the round could not be written down first (${why(error)}), and a detached round nothing has recorded cannot be collected.`;
|
|
47
|
+
return {
|
|
48
|
+
run: settled({ ...run, outcomes: everyoneMissed(request, notWritten) }),
|
|
49
|
+
warnings: [notWritten],
|
|
50
|
+
started: 0,
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
// In roster order and one at a time. They overlap anyway, since
|
|
54
|
+
// starting one only waits for a process to exist, and doing it in
|
|
55
|
+
// order means a spawn storm of seven models hits the machine as a
|
|
56
|
+
// queue rather than all at once.
|
|
57
|
+
const warnings = [];
|
|
58
|
+
const missed = [];
|
|
59
|
+
let running = 0;
|
|
60
|
+
for (const participant of request.roster.reviewers) {
|
|
61
|
+
try {
|
|
62
|
+
await deps.start(participant, request.prompt, id);
|
|
63
|
+
running += 1;
|
|
64
|
+
}
|
|
65
|
+
catch (error) {
|
|
66
|
+
// One model that will not start must not cost the others
|
|
67
|
+
// their round. Recorded as an outcome as well as a warning:
|
|
68
|
+
// a reviewer that never started is a reviewer that failed,
|
|
69
|
+
// and leaving it silent means the collect that finishes this
|
|
70
|
+
// round has to rediscover from an empty directory something
|
|
71
|
+
// that was known here, with the reason no longer to hand.
|
|
72
|
+
const failure = `${participant.id} could not be started: ${why(error)}.`;
|
|
73
|
+
warnings.push(failure);
|
|
74
|
+
missed.push({
|
|
75
|
+
participantId: participant.id,
|
|
76
|
+
findingIds: [],
|
|
77
|
+
failure,
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
if (running === 0) {
|
|
82
|
+
// An open round with nobody behind it is an alarm that can never
|
|
83
|
+
// be answered: every collect would find nothing, forever, and
|
|
84
|
+
// leaving it open is how a listing fills with rounds nobody can
|
|
85
|
+
// do anything about.
|
|
86
|
+
return {
|
|
87
|
+
run: settled({ ...run, outcomes: missed }),
|
|
88
|
+
warnings: [
|
|
89
|
+
...warnings,
|
|
90
|
+
`${id} was closed straight away: nobody could be started, so there will never be anything to collect.`,
|
|
91
|
+
],
|
|
92
|
+
started: 0,
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
return { run: { ...run, outcomes: missed }, warnings, started: running };
|
|
96
|
+
}
|
|
97
|
+
/** The outcome every reviewer had when none of them was asked. */
|
|
98
|
+
function everyoneMissed(request, reason) {
|
|
99
|
+
return request.roster.reviewers.map((participant) => ({
|
|
100
|
+
participantId: participant.id,
|
|
101
|
+
findingIds: [],
|
|
102
|
+
failure: reason,
|
|
103
|
+
advisory: reason,
|
|
104
|
+
}));
|
|
105
|
+
}
|
|
106
|
+
/** The same round, marked as having nothing left to wait for. */
|
|
107
|
+
function settled(run) {
|
|
108
|
+
const { open: _open, ...rest } = run;
|
|
109
|
+
return rest;
|
|
110
|
+
}
|
|
111
|
+
/** What went wrong, in whatever words the thrower used. */
|
|
112
|
+
function why(error) {
|
|
113
|
+
// The same reading a waiting round gives. A detached round is the
|
|
114
|
+
// one whose diagnosis is hardest to come by, since nobody watched
|
|
115
|
+
// it fail and the warning is all there is, so it is the last place
|
|
116
|
+
// that should say less.
|
|
117
|
+
return thrownAt(error);
|
|
118
|
+
}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Rounds kept per change, outliving the session that ran them.
|
|
3
|
+
*
|
|
4
|
+
* A judge consolidates a council, a critique pushes back on a judge,
|
|
5
|
+
* and a retry substitutes into a round that already happened. All
|
|
6
|
+
* three need to find a round somebody else ran, possibly in a
|
|
7
|
+
* different session, so rounds live on disk beside the findings
|
|
8
|
+
* rather than in session state.
|
|
9
|
+
*
|
|
10
|
+
* Every round is kept, not just the last. A judge that consolidated a
|
|
11
|
+
* council needs that council still to be there, or nothing can say
|
|
12
|
+
* what it consolidated.
|
|
13
|
+
*/
|
|
14
|
+
import type { ChangeRef } from "../change.js";
|
|
15
|
+
import type { AskRound, AskRun } from "./run.js";
|
|
16
|
+
/** Rounds held against a change. */
|
|
17
|
+
export interface RunStore {
|
|
18
|
+
/** Add a round, after the ones already held. */
|
|
19
|
+
record(change: ChangeRef, run: AskRun): Promise<void>;
|
|
20
|
+
/** Every round on a change, in the order they ran. */
|
|
21
|
+
list(change: ChangeRef): Promise<AskRun[]>;
|
|
22
|
+
/** The most recent finished round of one kind, if there was one. */
|
|
23
|
+
latest(change: ChangeRef, round: AskRound): Promise<AskRun | undefined>;
|
|
24
|
+
/** One round by its id. */
|
|
25
|
+
byId(change: ChangeRef, runId: string): Promise<AskRun | undefined>;
|
|
26
|
+
/** Swap a round for a new version of itself, in place. */
|
|
27
|
+
replace(change: ChangeRef, run: AskRun): Promise<void>;
|
|
28
|
+
/**
|
|
29
|
+
* Hold this version of a round, whether or not one is held.
|
|
30
|
+
*
|
|
31
|
+
* A round is written down twice: once when it opens, before it has
|
|
32
|
+
* asked anybody, and once when it settles. Both are this call,
|
|
33
|
+
* rather than a record and then a replace, so neither site has to
|
|
34
|
+
* know whether the other one happened. It matters because the
|
|
35
|
+
* opening write is best-effort: bookkeeping must not cost a round,
|
|
36
|
+
* and if settling were a replace, an opening write that failed
|
|
37
|
+
* would turn the end of a long council into an exception and throw
|
|
38
|
+
* away everything it found.
|
|
39
|
+
*
|
|
40
|
+
* Distinct from `replace`, which refuses a round it has never seen
|
|
41
|
+
* on purpose: a retry patching a round that does not exist has
|
|
42
|
+
* invented one, and should say so rather than quietly adding it.
|
|
43
|
+
*/
|
|
44
|
+
keep(change: ChangeRef, run: AskRun): Promise<void>;
|
|
45
|
+
/**
|
|
46
|
+
* Every round still open, across every change.
|
|
47
|
+
*
|
|
48
|
+
* The one question here that is not about a change, and it exists
|
|
49
|
+
* for the retention sweep. A detached round finishes on disk and
|
|
50
|
+
* stays open on the ledger until somebody collects it, so a sweep
|
|
51
|
+
* that judges a run by whether it is terminal will happily delete
|
|
52
|
+
* the answers a round is still waiting to be asked for. Before
|
|
53
|
+
* rounds outlived their sessions the two could not disagree.
|
|
54
|
+
*
|
|
55
|
+
* What could not be read is answered beside what could, rather
|
|
56
|
+
* than thrown or quietly skipped. Skipping was wrong in the one
|
|
57
|
+
* direction that costs something: a torn file drops protection
|
|
58
|
+
* from every round it held, silently and only for that change,
|
|
59
|
+
* which is a sweep deleting paid-for reviews and reporting a clean
|
|
60
|
+
* run. Throwing would be no better, since the answer for every
|
|
61
|
+
* other change is perfectly good and a sweep that ran would
|
|
62
|
+
* reclaim real disk. The caller decides, and it has what it needs
|
|
63
|
+
* to decide with.
|
|
64
|
+
*/
|
|
65
|
+
openRunIds(): Promise<OpenRuns>;
|
|
66
|
+
}
|
|
67
|
+
/** Which rounds are open, and what could not be asked. */
|
|
68
|
+
export interface OpenRuns {
|
|
69
|
+
readonly open: ReadonlySet<string>;
|
|
70
|
+
/**
|
|
71
|
+
* What exists and would not read, said the way a person can act on
|
|
72
|
+
* it: a full path, since a caller that declines over this has to
|
|
73
|
+
* tell somebody which file to go and deal with, and a bare name is
|
|
74
|
+
* not enough to find one under a state directory nobody memorized.
|
|
75
|
+
*
|
|
76
|
+
* Non-empty means the open set is incomplete and there is no way
|
|
77
|
+
* to tell which rounds are missing from it, so a caller deciding
|
|
78
|
+
* what to delete has to decline rather than read it as "none".
|
|
79
|
+
*/
|
|
80
|
+
readonly unreadable: readonly string[];
|
|
81
|
+
}
|
|
82
|
+
/** Runs on disk, one file per change. */
|
|
83
|
+
export declare function createRunStore(root: string): RunStore;
|
|
@@ -0,0 +1,226 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Rounds kept per change, outliving the session that ran them.
|
|
3
|
+
*
|
|
4
|
+
* A judge consolidates a council, a critique pushes back on a judge,
|
|
5
|
+
* and a retry substitutes into a round that already happened. All
|
|
6
|
+
* three need to find a round somebody else ran, possibly in a
|
|
7
|
+
* different session, so rounds live on disk beside the findings
|
|
8
|
+
* rather than in session state.
|
|
9
|
+
*
|
|
10
|
+
* Every round is kept, not just the last. A judge that consolidated a
|
|
11
|
+
* council needs that council still to be there, or nothing can say
|
|
12
|
+
* what it consolidated.
|
|
13
|
+
*/
|
|
14
|
+
import { mkdir, readdir, readFile, rename, writeFile } from "node:fs/promises";
|
|
15
|
+
import { join } from "node:path";
|
|
16
|
+
import { changeKey } from "../keys.js";
|
|
17
|
+
/** Runs on disk, one file per change. */
|
|
18
|
+
export function createRunStore(root) {
|
|
19
|
+
async function read(change) {
|
|
20
|
+
let raw;
|
|
21
|
+
const path = join(root, fileFor(change));
|
|
22
|
+
try {
|
|
23
|
+
raw = await readFile(path, "utf8");
|
|
24
|
+
}
|
|
25
|
+
catch (error) {
|
|
26
|
+
// No file. This change has no rounds behind it, which is an
|
|
27
|
+
// answer rather than a failure: most changes have never been
|
|
28
|
+
// reviewed.
|
|
29
|
+
//
|
|
30
|
+
// Only ENOENT, though. Every other errno says the history is
|
|
31
|
+
// there and could not be reached, and answering "no rounds" to
|
|
32
|
+
// those is worse here than in the sweep: the next write lays a
|
|
33
|
+
// one-round ledger over whatever was behind it. The reasoning
|
|
34
|
+
// twenty lines down, about a file that will not parse, applies
|
|
35
|
+
// exactly as well to a file that will not open.
|
|
36
|
+
if (!isMissing(error)) {
|
|
37
|
+
throw new Error(`The rounds held against ${change.label} could not be read from ${path}: ${error instanceof Error ? error.message : String(error)}. Fix or move that file: answering "no rounds" for it would let the next round overwrite the history behind it.`);
|
|
38
|
+
}
|
|
39
|
+
return { runs: [] };
|
|
40
|
+
}
|
|
41
|
+
// A file that will not parse is a different thing entirely, and
|
|
42
|
+
// answering "no rounds" for it is how a history disappears
|
|
43
|
+
// quietly: the caller is told the change is fresh, and the next
|
|
44
|
+
// write lays a one-round ledger over whatever was there. Said
|
|
45
|
+
// out loud instead, so a torn file is a problem somebody can
|
|
46
|
+
// see rather than a change that looks new.
|
|
47
|
+
let parsed;
|
|
48
|
+
try {
|
|
49
|
+
parsed = JSON.parse(raw);
|
|
50
|
+
}
|
|
51
|
+
catch {
|
|
52
|
+
// Falls through to the sentence below, which says where the
|
|
53
|
+
// file is and what to do. A parser's own message names a
|
|
54
|
+
// character offset in a file the reader has not been told
|
|
55
|
+
// about.
|
|
56
|
+
}
|
|
57
|
+
if (typeof parsed === "object" &&
|
|
58
|
+
parsed !== null &&
|
|
59
|
+
"runs" in parsed &&
|
|
60
|
+
Array.isArray(parsed.runs)) {
|
|
61
|
+
return { runs: parsed.runs };
|
|
62
|
+
}
|
|
63
|
+
throw new Error(`The rounds held against ${change.label} are at ${join(root, fileFor(change))} and could not be read as a ledger. Nothing was changed. Move that file aside to start a fresh one, keeping it if the rounds in it still matter.`);
|
|
64
|
+
}
|
|
65
|
+
async function write(change, ledger) {
|
|
66
|
+
await mkdir(root, { recursive: true });
|
|
67
|
+
const path = join(root, fileFor(change));
|
|
68
|
+
// Written beside and renamed over, because a plain write
|
|
69
|
+
// truncates in place and a process killed midway leaves half a
|
|
70
|
+
// document. This change writes at the start of an operation
|
|
71
|
+
// whose whole premise is that the session may not survive it,
|
|
72
|
+
// so the window stopped being theoretical. A rename within one
|
|
73
|
+
// directory is atomic: a reader sees the old ledger or the new
|
|
74
|
+
// one.
|
|
75
|
+
const pending = `${path}.${process.pid}.tmp`;
|
|
76
|
+
await writeFile(pending, JSON.stringify(ledger, null, 2), "utf8");
|
|
77
|
+
await rename(pending, path);
|
|
78
|
+
}
|
|
79
|
+
return {
|
|
80
|
+
async record(change, run) {
|
|
81
|
+
const ledger = await read(change);
|
|
82
|
+
await write(change, { runs: [...ledger.runs, run] });
|
|
83
|
+
},
|
|
84
|
+
async list(change) {
|
|
85
|
+
return (await read(change)).runs;
|
|
86
|
+
},
|
|
87
|
+
async openRunIds() {
|
|
88
|
+
const open = new Set();
|
|
89
|
+
const unreadable = [];
|
|
90
|
+
let files;
|
|
91
|
+
try {
|
|
92
|
+
files = await readdir(root);
|
|
93
|
+
}
|
|
94
|
+
catch (error) {
|
|
95
|
+
// No ledger directory at all, so no rounds are open. The
|
|
96
|
+
// caller is a sweep, and answering "none" is the honest
|
|
97
|
+
// reading of an empty history.
|
|
98
|
+
//
|
|
99
|
+
// Only for that reading, though. Every other errno says the
|
|
100
|
+
// history is there and cannot be seen, and answering "none"
|
|
101
|
+
// to those tells a sweep every round is collectable rubbish.
|
|
102
|
+
// The catch used to be untyped, so a permissions problem on
|
|
103
|
+
// this directory read as an empty history.
|
|
104
|
+
if (!isMissing(error)) {
|
|
105
|
+
return { open, unreadable: [`${root} (the whole ledger)`] };
|
|
106
|
+
}
|
|
107
|
+
return { open, unreadable };
|
|
108
|
+
}
|
|
109
|
+
for (const file of files) {
|
|
110
|
+
if (!file.endsWith(".json"))
|
|
111
|
+
continue;
|
|
112
|
+
const path = join(root, file);
|
|
113
|
+
let parsed;
|
|
114
|
+
try {
|
|
115
|
+
parsed = JSON.parse(await readFile(path, "utf8"));
|
|
116
|
+
}
|
|
117
|
+
catch (error) {
|
|
118
|
+
// A file that has gone since the listing is not a file
|
|
119
|
+
// that will not read. Another session settling a round
|
|
120
|
+
// deletes nothing, but a person tidying up does, and
|
|
121
|
+
// treating that as a torn ledger stops the sweep on this
|
|
122
|
+
// machine for good over a file nobody has any more.
|
|
123
|
+
//
|
|
124
|
+
// Nothing covers this branch, and the same is true of the
|
|
125
|
+
// matching one in the artifact sweep's stat. Both windows
|
|
126
|
+
// are between a listing and a read inside one call, with
|
|
127
|
+
// no seam to hold open from outside, and a case that raced
|
|
128
|
+
// for one would be a case that fails sometimes. Two
|
|
129
|
+
// attempts at a test for this deleted the file before the
|
|
130
|
+
// listing, which exercises nothing and passes.
|
|
131
|
+
if (isMissing(error))
|
|
132
|
+
continue;
|
|
133
|
+
// Said, not skipped. Skipping used to be justified on the
|
|
134
|
+
// grounds that the sweep errs towards deleting nothing it
|
|
135
|
+
// was unsure about, and it does not: a run it is unsure
|
|
136
|
+
// about is a run nothing protects, which is the ordinary
|
|
137
|
+
// window. One torn file among twenty took protection off
|
|
138
|
+
// that change's rounds with no error anywhere.
|
|
139
|
+
unreadable.push(path);
|
|
140
|
+
continue;
|
|
141
|
+
}
|
|
142
|
+
if (typeof parsed !== "object" ||
|
|
143
|
+
parsed === null ||
|
|
144
|
+
!("runs" in parsed) ||
|
|
145
|
+
!Array.isArray(parsed.runs)) {
|
|
146
|
+
// A file that parses into the wrong shape is no more
|
|
147
|
+
// readable than one that does not parse at all.
|
|
148
|
+
unreadable.push(path);
|
|
149
|
+
continue;
|
|
150
|
+
}
|
|
151
|
+
for (const run of parsed.runs) {
|
|
152
|
+
if (run?.open === true && typeof run.id === "string") {
|
|
153
|
+
open.add(run.id);
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
return { open, unreadable };
|
|
158
|
+
},
|
|
159
|
+
async latest(change, round) {
|
|
160
|
+
// Finished rounds only. A round is now on the ledger from the
|
|
161
|
+
// moment it opens, so the newest entry is routinely one that
|
|
162
|
+
// has answered nothing: a judge asked while a council was
|
|
163
|
+
// still running, or after one was interrupted, would have
|
|
164
|
+
// consolidated its empty outcomes and reported that the
|
|
165
|
+
// council found nothing.
|
|
166
|
+
const held = (await read(change)).runs.filter(
|
|
167
|
+
// Nor one a person gave up on, which is neither open nor
|
|
168
|
+
// finished. It has no outcomes, so handing it back here
|
|
169
|
+
// would have a judge consolidate nothing and report that
|
|
170
|
+
// the council found nothing, with the real council one
|
|
171
|
+
// entry behind and unreachable.
|
|
172
|
+
(r) => r.round === round && r.open !== true && r.closed !== true);
|
|
173
|
+
return held.at(-1);
|
|
174
|
+
},
|
|
175
|
+
async byId(change, runId) {
|
|
176
|
+
return (await read(change)).runs.find((r) => r.id === runId);
|
|
177
|
+
},
|
|
178
|
+
async keep(change, run) {
|
|
179
|
+
const ledger = await read(change);
|
|
180
|
+
const at = ledger.runs.findIndex((held) => held.id === run.id);
|
|
181
|
+
await write(change, {
|
|
182
|
+
runs: at === -1
|
|
183
|
+
? [...ledger.runs, run]
|
|
184
|
+
: ledger.runs.map((held, index) => (index === at ? run : held)),
|
|
185
|
+
});
|
|
186
|
+
},
|
|
187
|
+
async replace(change, run) {
|
|
188
|
+
const ledger = await read(change);
|
|
189
|
+
const at = ledger.runs.findIndex((held) => held.id === run.id);
|
|
190
|
+
if (at === -1) {
|
|
191
|
+
// Adding it silently would make a retry look like it
|
|
192
|
+
// patched something when it invented a round instead.
|
|
193
|
+
throw new Error(`No run "${run.id}" is held against this change, so there is nothing to replace. Record it first, or check the id.`);
|
|
194
|
+
}
|
|
195
|
+
await write(change, {
|
|
196
|
+
runs: ledger.runs.map((held, index) => (index === at ? run : held)),
|
|
197
|
+
});
|
|
198
|
+
},
|
|
199
|
+
};
|
|
200
|
+
}
|
|
201
|
+
/**
|
|
202
|
+
* Whether a filesystem error means the thing is simply not there.
|
|
203
|
+
*
|
|
204
|
+
* The distinction matters wherever absence is an answer, because
|
|
205
|
+
* every other errno means the thing exists and could not be reached,
|
|
206
|
+
* and reporting that as absence is how a sweep concludes a full
|
|
207
|
+
* history is an empty one.
|
|
208
|
+
*/
|
|
209
|
+
function isMissing(error) {
|
|
210
|
+
return (typeof error === "object" &&
|
|
211
|
+
error !== null &&
|
|
212
|
+
"code" in error &&
|
|
213
|
+
error.code === "ENOENT");
|
|
214
|
+
}
|
|
215
|
+
/**
|
|
216
|
+
* The file a change's rounds live in.
|
|
217
|
+
*
|
|
218
|
+
* Slugged because the key names a file: a change id is somebody
|
|
219
|
+
* else's string and may hold a separator.
|
|
220
|
+
*/
|
|
221
|
+
function fileFor(change) {
|
|
222
|
+
const safe = changeKey(change)
|
|
223
|
+
.replace(/[^A-Za-z0-9._-]/g, "_")
|
|
224
|
+
.replace(/^\.+/, "_");
|
|
225
|
+
return `${safe}.json`;
|
|
226
|
+
}
|