@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
package/dist/work/ask.js
ADDED
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Turning a loose ask into a tree request, or a sentence saying
|
|
3
|
+
* why not.
|
|
4
|
+
*
|
|
5
|
+
* The broker takes a `TreeRequest` whose two shapes need
|
|
6
|
+
* different fields, and a tool surface takes whatever the caller
|
|
7
|
+
* sent. Somewhere in between, a caller who sent a commit where a
|
|
8
|
+
* branch belonged has to be told that specifically, rather than
|
|
9
|
+
* being handed a generic complaint or, worse, having the provider
|
|
10
|
+
* fail somewhere further from the cause.
|
|
11
|
+
*
|
|
12
|
+
* This is where. It is pure, so the refusals can be read as a set
|
|
13
|
+
* rather than discovered one live call at a time.
|
|
14
|
+
*/
|
|
15
|
+
/** Build a tree request, or refuse with the missing part named. */
|
|
16
|
+
export function treeRequestFrom(ask) {
|
|
17
|
+
const purpose = ask.purpose?.trim();
|
|
18
|
+
if (!purpose) {
|
|
19
|
+
return {
|
|
20
|
+
refusal: "Say what the tree is for: the purpose names it, so without " +
|
|
21
|
+
"one there is nothing to call it or to recognise it by later.",
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
// Where a tree can be cut from is deliberately not asked here.
|
|
25
|
+
// It reads like the same kind of question as the rest, and it is
|
|
26
|
+
// not: the others are about whether the caller's own words hang
|
|
27
|
+
// together, which is knowable from the words. This one is about
|
|
28
|
+
// the world, and the answer belongs to whichever provider is
|
|
29
|
+
// about to be chosen.
|
|
30
|
+
//
|
|
31
|
+
// Answering it here answered it for the git provider, which does
|
|
32
|
+
// need a checkout or a remote, and imposed that on every other
|
|
33
|
+
// provider before one was picked. A provider needing neither
|
|
34
|
+
// could not be reached at all: `dev tree` knows where World
|
|
35
|
+
// lives, so a World snapshot could only be cut by naming a
|
|
36
|
+
// checkout the provider then ignored, and a World review round
|
|
37
|
+
// with nothing configured degraded to reading the caller's own
|
|
38
|
+
// tree while the right tree sat there waiting to be used.
|
|
39
|
+
//
|
|
40
|
+
// The git provider refuses it for itself, closer to the cause
|
|
41
|
+
// and with more to say: nothing known at all is a different
|
|
42
|
+
// answer from known only as a remote it will not clone unasked.
|
|
43
|
+
if (ask.intent === "worktree") {
|
|
44
|
+
if (!ask.branch) {
|
|
45
|
+
// Having been sent a commit is a different mistake from
|
|
46
|
+
// having sent nothing, and worth separating: one caller
|
|
47
|
+
// forgot a field, the other chose the wrong one.
|
|
48
|
+
const instead = ask.commit
|
|
49
|
+
? ` A commit (${ask.commit}) was given instead; a worktree ` +
|
|
50
|
+
"is checked out at a branch, so ask for a snapshot if you " +
|
|
51
|
+
"meant to pin that commit."
|
|
52
|
+
: "";
|
|
53
|
+
return {
|
|
54
|
+
refusal: `A worktree needs a branch to check out.${instead}`,
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
return {
|
|
58
|
+
request: {
|
|
59
|
+
intent: "worktree",
|
|
60
|
+
repo: ask.repo,
|
|
61
|
+
purpose,
|
|
62
|
+
branch: ask.branch,
|
|
63
|
+
},
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
if (!ask.commit) {
|
|
67
|
+
const instead = ask.branch
|
|
68
|
+
? ` A branch (${ask.branch}) was given instead; a snapshot is ` +
|
|
69
|
+
"pinned to one commit, so ask for a worktree if you meant to " +
|
|
70
|
+
"work on that branch."
|
|
71
|
+
: "";
|
|
72
|
+
return {
|
|
73
|
+
refusal: `A snapshot needs a commit to pin.${instead}`,
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
return {
|
|
77
|
+
request: {
|
|
78
|
+
intent: "snapshot",
|
|
79
|
+
repo: ask.repo,
|
|
80
|
+
purpose,
|
|
81
|
+
commit: ask.commit,
|
|
82
|
+
...(ask.paths ? { paths: ask.paths } : {}),
|
|
83
|
+
},
|
|
84
|
+
};
|
|
85
|
+
}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Recording work: staging, committing, and moving onto a branch.
|
|
3
|
+
*
|
|
4
|
+
* The history facet reads a tree and this one writes to it, kept
|
|
5
|
+
* apart because reading is safe and writing is not. A consumer
|
|
6
|
+
* that only wants to know whether a tree is dirty should not be
|
|
7
|
+
* handed the ability to commit in it.
|
|
8
|
+
*
|
|
9
|
+
* Names are checked here rather than left to git, and not only for
|
|
10
|
+
* the names git would reject anyway. The dangerous ones are the
|
|
11
|
+
* names git accepts: a branch called `-rf` is a valid ref and a
|
|
12
|
+
* flag to every command that later takes it, so it has to be
|
|
13
|
+
* refused before it reaches a command line rather than after.
|
|
14
|
+
*/
|
|
15
|
+
import { type Exec } from "../exec/index.js";
|
|
16
|
+
/** What a commit says. */
|
|
17
|
+
export interface CommitMessage {
|
|
18
|
+
subject: string;
|
|
19
|
+
body?: string;
|
|
20
|
+
}
|
|
21
|
+
/** Where a new branch starts. */
|
|
22
|
+
export interface BranchOptions {
|
|
23
|
+
from?: string;
|
|
24
|
+
}
|
|
25
|
+
/** Writing to a tree. */
|
|
26
|
+
export interface WorkAuthor {
|
|
27
|
+
/** Stage these paths, or everything when none are named. */
|
|
28
|
+
stage(treePath: string, paths?: readonly string[]): Promise<void>;
|
|
29
|
+
/** Record what is staged. */
|
|
30
|
+
commit(treePath: string, message: CommitMessage): Promise<void>;
|
|
31
|
+
/** Create a branch and check it out. */
|
|
32
|
+
branch(treePath: string, name: string, options?: BranchOptions): Promise<void>;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* A ref name, trimmed, or nothing when it is not safe to use.
|
|
36
|
+
*
|
|
37
|
+
* Returns the name rather than a boolean so a caller cannot check
|
|
38
|
+
* one string and then pass a different one, which is the shape of
|
|
39
|
+
* mistake that makes a validator decorative.
|
|
40
|
+
*/
|
|
41
|
+
export declare function safeBranchName(name: string): string | undefined;
|
|
42
|
+
/**
|
|
43
|
+
* Where a branch name departs from the house convention.
|
|
44
|
+
*
|
|
45
|
+
* Advice, not a verdict. {@link safeBranchName} decides what git will
|
|
46
|
+
* accept and this decides what the convention prefers, and the two
|
|
47
|
+
* must not be confused: a name git accepts is workable, and a repo
|
|
48
|
+
* with its own conventions is entitled to it. So this decorates the
|
|
49
|
+
* answer rather than blocking the branch, which is the same shape as
|
|
50
|
+
* every other caution here.
|
|
51
|
+
*
|
|
52
|
+
* The `username/` prefix is checked for shape and not for identity.
|
|
53
|
+
* Who the authenticated user is belongs to whatever hosts the repo,
|
|
54
|
+
* and this layer speaks git; asking a forge would put a network call
|
|
55
|
+
* behind making a branch.
|
|
56
|
+
*/
|
|
57
|
+
export declare function namingComplaints(name: string): string[];
|
|
58
|
+
/** Write to a tree with plain git. */
|
|
59
|
+
export declare function createGitAuthor(deps: {
|
|
60
|
+
exec: Exec;
|
|
61
|
+
}): WorkAuthor;
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Recording work: staging, committing, and moving onto a branch.
|
|
3
|
+
*
|
|
4
|
+
* The history facet reads a tree and this one writes to it, kept
|
|
5
|
+
* apart because reading is safe and writing is not. A consumer
|
|
6
|
+
* that only wants to know whether a tree is dirty should not be
|
|
7
|
+
* handed the ability to commit in it.
|
|
8
|
+
*
|
|
9
|
+
* Names are checked here rather than left to git, and not only for
|
|
10
|
+
* the names git would reject anyway. The dangerous ones are the
|
|
11
|
+
* names git accepts: a branch called `-rf` is a valid ref and a
|
|
12
|
+
* flag to every command that later takes it, so it has to be
|
|
13
|
+
* refused before it reaches a command line rather than after.
|
|
14
|
+
*/
|
|
15
|
+
import { run } from "../exec/index.js";
|
|
16
|
+
// The leaf rather than the barrel, so a working layer that never draws anything
|
|
17
|
+
// does not pull the TUI in behind one string helper.
|
|
18
|
+
import { displayPath } from "../ui/path.js";
|
|
19
|
+
/**
|
|
20
|
+
* Characters and shapes a ref may not carry.
|
|
21
|
+
*
|
|
22
|
+
* This is git's own `check-ref-format` rule set, minus the parts
|
|
23
|
+
* that need a repo to answer, plus the leading dash. Doing it as a
|
|
24
|
+
* deny list rather than an allow list is deliberate: branch names
|
|
25
|
+
* legitimately carry slashes, dots and unicode, and an allow list
|
|
26
|
+
* narrow enough to be safe would refuse names people already use.
|
|
27
|
+
*/
|
|
28
|
+
const UNSAFE_IN_REF = /[\s~^:?*[\\]|\.\.|^-|^\/|\/$|\.lock$|^$/;
|
|
29
|
+
/**
|
|
30
|
+
* Highest code point that is a control character, plus delete.
|
|
31
|
+
*
|
|
32
|
+
* Tested by code point rather than folded into the pattern above,
|
|
33
|
+
* because a regex holding literal control characters is
|
|
34
|
+
* unreadable and reads to a linter as a mistake. The intent is the
|
|
35
|
+
* same and the check is easier to be sure of.
|
|
36
|
+
*/
|
|
37
|
+
function hasControlCharacter(name) {
|
|
38
|
+
for (const character of name) {
|
|
39
|
+
const code = character.codePointAt(0);
|
|
40
|
+
if (code === undefined)
|
|
41
|
+
continue;
|
|
42
|
+
if (code <= 0x1f || code === 0x7f)
|
|
43
|
+
return true;
|
|
44
|
+
}
|
|
45
|
+
return false;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* A ref name, trimmed, or nothing when it is not safe to use.
|
|
49
|
+
*
|
|
50
|
+
* Returns the name rather than a boolean so a caller cannot check
|
|
51
|
+
* one string and then pass a different one, which is the shape of
|
|
52
|
+
* mistake that makes a validator decorative.
|
|
53
|
+
*/
|
|
54
|
+
export function safeBranchName(name) {
|
|
55
|
+
const trimmed = name?.trim() ?? "";
|
|
56
|
+
if (trimmed === "")
|
|
57
|
+
return undefined;
|
|
58
|
+
if (hasControlCharacter(trimmed))
|
|
59
|
+
return undefined;
|
|
60
|
+
if (UNSAFE_IN_REF.test(trimmed))
|
|
61
|
+
return undefined;
|
|
62
|
+
return trimmed;
|
|
63
|
+
}
|
|
64
|
+
/** How long a whole branch name should stay under, by convention. */
|
|
65
|
+
const BRANCH_NAME_BUDGET = 40;
|
|
66
|
+
/**
|
|
67
|
+
* Where a branch name departs from the house convention.
|
|
68
|
+
*
|
|
69
|
+
* Advice, not a verdict. {@link safeBranchName} decides what git will
|
|
70
|
+
* accept and this decides what the convention prefers, and the two
|
|
71
|
+
* must not be confused: a name git accepts is workable, and a repo
|
|
72
|
+
* with its own conventions is entitled to it. So this decorates the
|
|
73
|
+
* answer rather than blocking the branch, which is the same shape as
|
|
74
|
+
* every other caution here.
|
|
75
|
+
*
|
|
76
|
+
* The `username/` prefix is checked for shape and not for identity.
|
|
77
|
+
* Who the authenticated user is belongs to whatever hosts the repo,
|
|
78
|
+
* and this layer speaks git; asking a forge would put a network call
|
|
79
|
+
* behind making a branch.
|
|
80
|
+
*/
|
|
81
|
+
export function namingComplaints(name) {
|
|
82
|
+
const said = [];
|
|
83
|
+
if (!name.includes("/")) {
|
|
84
|
+
said.push("it has no username prefix, and the form is username/what-it-does");
|
|
85
|
+
}
|
|
86
|
+
if (name.length > BRANCH_NAME_BUDGET) {
|
|
87
|
+
said.push(`it is ${name.length} characters and the convention keeps them under ${BRANCH_NAME_BUDGET}`);
|
|
88
|
+
}
|
|
89
|
+
if (name !== name.toLowerCase()) {
|
|
90
|
+
said.push("it has capitals, and these are lower case with hyphens");
|
|
91
|
+
}
|
|
92
|
+
if (name.includes("_")) {
|
|
93
|
+
said.push("it separates words with underscores rather than hyphens");
|
|
94
|
+
}
|
|
95
|
+
return said;
|
|
96
|
+
}
|
|
97
|
+
/** Write to a tree with plain git. */
|
|
98
|
+
export function createGitAuthor(deps) {
|
|
99
|
+
return {
|
|
100
|
+
async stage(treePath, paths) {
|
|
101
|
+
// A bare `git add` stages nothing and reports success, so
|
|
102
|
+
// everything has to be asked for by name.
|
|
103
|
+
const args = paths && paths.length > 0 ? ["add", "--", ...paths] : ["add", "--all"];
|
|
104
|
+
await run(deps.exec, "git", ["-C", treePath, ...args], `Staging work in ${displayPath(treePath)}`);
|
|
105
|
+
},
|
|
106
|
+
async commit(treePath, message) {
|
|
107
|
+
const subject = message.subject?.trim() ?? "";
|
|
108
|
+
if (subject === "") {
|
|
109
|
+
throw new Error("A commit needs a subject: it is the line everybody reads " +
|
|
110
|
+
"when deciding whether to read the rest.");
|
|
111
|
+
}
|
|
112
|
+
const body = message.body?.trim();
|
|
113
|
+
await run(deps.exec, "git", [
|
|
114
|
+
"-C",
|
|
115
|
+
treePath,
|
|
116
|
+
"commit",
|
|
117
|
+
"-m",
|
|
118
|
+
subject,
|
|
119
|
+
// Git knows how a body is separated from a subject.
|
|
120
|
+
// Splicing a blank line in by hand is how that gets
|
|
121
|
+
// done differently in two places.
|
|
122
|
+
...(body ? ["-m", body] : []),
|
|
123
|
+
], `Recording work in ${displayPath(treePath)}`);
|
|
124
|
+
},
|
|
125
|
+
async branch(treePath, name, options) {
|
|
126
|
+
const safe = safeBranchName(name);
|
|
127
|
+
if (!safe) {
|
|
128
|
+
throw new Error(`Not a usable branch name: ${JSON.stringify(name)}. Names ` +
|
|
129
|
+
"carrying spaces, a leading dash, or git's reserved " +
|
|
130
|
+
"shapes are refused rather than corrected, since " +
|
|
131
|
+
"quietly renaming somebody's branch is worse than " +
|
|
132
|
+
"declining to make it.");
|
|
133
|
+
}
|
|
134
|
+
let from;
|
|
135
|
+
if (options?.from !== undefined) {
|
|
136
|
+
from = safeBranchName(options.from);
|
|
137
|
+
if (!from) {
|
|
138
|
+
throw new Error(`Not a usable start point: ${JSON.stringify(options.from)}.`);
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
await run(deps.exec, "git", ["-C", treePath, "checkout", "-b", safe, ...(from ? [from] : [])], `Making ${safe} in ${displayPath(treePath)}`);
|
|
142
|
+
},
|
|
143
|
+
};
|
|
144
|
+
}
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Handing out trees and taking them back.
|
|
3
|
+
*
|
|
4
|
+
* The broker is the piece that made three tree contracts look like
|
|
5
|
+
* three problems. Each one held its own trees, keyed them its own
|
|
6
|
+
* way, and reimplemented the same two questions: does one of these
|
|
7
|
+
* already answer the request, and who serves this repo. Both
|
|
8
|
+
* questions now have one answer each, in `tree.ts` and
|
|
9
|
+
* `provider.ts`, so what is left here is genuinely just custody.
|
|
10
|
+
*/
|
|
11
|
+
import type { Owner } from "../process/index.js";
|
|
12
|
+
import type { TreeMemory } from "./memory.js";
|
|
13
|
+
import { type TreeProviderInfo } from "./provider.js";
|
|
14
|
+
import { type TreeIdentity, type TreeRequest } from "./tree.js";
|
|
15
|
+
/** A tree the broker is holding on somebody's behalf. */
|
|
16
|
+
export interface HeldTree {
|
|
17
|
+
/** What this tree is, which is what makes it reusable. */
|
|
18
|
+
identity: TreeIdentity;
|
|
19
|
+
/** Absolute path to the working directory. */
|
|
20
|
+
path: string;
|
|
21
|
+
/**
|
|
22
|
+
* Who cut it. Recorded because the chosen provider can change
|
|
23
|
+
* between cutting and releasing, since registration is
|
|
24
|
+
* dynamic, and a tree has to go back to whoever made it.
|
|
25
|
+
*/
|
|
26
|
+
providerId: string;
|
|
27
|
+
/**
|
|
28
|
+
* The sessions holding it, which is a list because a snapshot is
|
|
29
|
+
* shareable and two of them can want the same commit at once.
|
|
30
|
+
*
|
|
31
|
+
* One field would mean the second session to take a shared tree
|
|
32
|
+
* erased the first, and the first is still working in it: a single
|
|
33
|
+
* owner is only correct for a tree nobody may share, and the
|
|
34
|
+
* shareable kind is the kind this leaks most of.
|
|
35
|
+
*
|
|
36
|
+
* Optional because a record written before this existed has none,
|
|
37
|
+
* and because a machine that will not report a start time gives
|
|
38
|
+
* half an identity, which is worse than none: a pid alone reads as
|
|
39
|
+
* whoever holds that number next. Absent means "nobody can say",
|
|
40
|
+
* which every reader here treats as still held.
|
|
41
|
+
*/
|
|
42
|
+
owners?: Owner[];
|
|
43
|
+
}
|
|
44
|
+
/** Something that can cut a tree and take it back. */
|
|
45
|
+
export interface TreeProvider extends TreeProviderInfo {
|
|
46
|
+
/**
|
|
47
|
+
* Cut a tree for this request. The broker has already decided
|
|
48
|
+
* that no held tree answers it, so a provider does not need to
|
|
49
|
+
* dedupe.
|
|
50
|
+
*/
|
|
51
|
+
ensure(request: TreeRequest): Promise<{
|
|
52
|
+
path: string;
|
|
53
|
+
}>;
|
|
54
|
+
/**
|
|
55
|
+
* Give up whatever backs this tree. Providers decide whether
|
|
56
|
+
* that means deleting it, leaving it, or nothing at all.
|
|
57
|
+
*/
|
|
58
|
+
release(held: HeldTree): Promise<void>;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* What became of a release.
|
|
62
|
+
*
|
|
63
|
+
* A discriminated answer rather than nothing, because the interesting case is
|
|
64
|
+
* the one that used to be silent: no provider registered under the id the tree
|
|
65
|
+
* was cut by, so there is nothing to remove it through. That used to drop the
|
|
66
|
+
* record and return, and the tool said "Released" about a directory still on
|
|
67
|
+
* disk and still tracked by git, now with no record pointing at it. Reporting
|
|
68
|
+
* success for doing nothing is the one outcome nobody can detect.
|
|
69
|
+
*/
|
|
70
|
+
export type ReleaseOutcome = {
|
|
71
|
+
kind: "released";
|
|
72
|
+
/**
|
|
73
|
+
* How many other sessions are still standing in it, when the
|
|
74
|
+
* directory was therefore left where it is.
|
|
75
|
+
*
|
|
76
|
+
* Absent means it was taken down. A caller that tells somebody
|
|
77
|
+
* the tree is gone would otherwise be wrong for a shared
|
|
78
|
+
* snapshot, which is the kind two sessions hold at once.
|
|
79
|
+
*/
|
|
80
|
+
kept?: number;
|
|
81
|
+
}
|
|
82
|
+
/** Nothing here can remove it, so it is still there and still recorded. */
|
|
83
|
+
| {
|
|
84
|
+
kind: "no-provider";
|
|
85
|
+
/** Who cut it, which is who is missing. */
|
|
86
|
+
wanted: string;
|
|
87
|
+
/** Who is registered, so a mismatch reads as a correction. */
|
|
88
|
+
registered: readonly string[];
|
|
89
|
+
path: string;
|
|
90
|
+
};
|
|
91
|
+
/** Custody of the trees a session is using. */
|
|
92
|
+
export interface TreeBroker {
|
|
93
|
+
/** Get a tree for this request, reusing one where possible. */
|
|
94
|
+
ensure(request: TreeRequest): Promise<HeldTree>;
|
|
95
|
+
/** Hand a tree back to the provider that cut it, and say what happened. */
|
|
96
|
+
release(held: HeldTree): Promise<ReleaseOutcome>;
|
|
97
|
+
/**
|
|
98
|
+
* Every tree held, this session's first and then any left behind by an
|
|
99
|
+
* earlier one.
|
|
100
|
+
*
|
|
101
|
+
* A tree outlives the process that cut it, so "held" cannot mean "cut by
|
|
102
|
+
* me". It used to, and the result was every verb refusing on a tree that
|
|
103
|
+
* plainly existed, with commits inside it and no way back to them.
|
|
104
|
+
*/
|
|
105
|
+
held(): readonly HeldTree[];
|
|
106
|
+
/**
|
|
107
|
+
* Those a running session would miss, which is a narrower set.
|
|
108
|
+
*
|
|
109
|
+
* `held` answers what is reachable, and that has to include a dead
|
|
110
|
+
* session's trees: finding them is the whole reason the record
|
|
111
|
+
* exists. This answers what is claimed, which is the only question
|
|
112
|
+
* worth asking before taking a directory away, and the two were
|
|
113
|
+
* the same set for as long as nothing recorded who cut anything.
|
|
114
|
+
* Every tree ever cut therefore read as claimed, so nothing was
|
|
115
|
+
* ever reclaimable: 59 records and 649MB on the machine where
|
|
116
|
+
* this was found.
|
|
117
|
+
*/
|
|
118
|
+
stillHeld(): Promise<readonly HeldTree[]>;
|
|
119
|
+
/** Those held only because nothing recorded who cut them. */
|
|
120
|
+
unattributed(): readonly HeldTree[];
|
|
121
|
+
/** Whether this session is the one that cut a tree, for a listing to say so. */
|
|
122
|
+
cutHere(path: string): boolean;
|
|
123
|
+
}
|
|
124
|
+
/** What a broker needs beyond its providers. */
|
|
125
|
+
export interface BrokerDeps {
|
|
126
|
+
providers: readonly TreeProvider[] | (() => readonly TreeProvider[]);
|
|
127
|
+
/**
|
|
128
|
+
* Where to write down what was cut, so the next session can find it.
|
|
129
|
+
*
|
|
130
|
+
* Optional because a caller with no interest in outliving itself, which
|
|
131
|
+
* means every test, should not have to supply a directory to get a broker.
|
|
132
|
+
*/
|
|
133
|
+
memory?: TreeMemory;
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* Hold the trees a session is using.
|
|
137
|
+
*
|
|
138
|
+
* Refuses rather than guessing when the provider choice is not
|
|
139
|
+
* clear. Cutting a tree from a provider nobody chose is the failure
|
|
140
|
+
* this is built to avoid: it succeeds, so nothing draws attention
|
|
141
|
+
* to it, and the tree is merely wrong rather than missing.
|
|
142
|
+
*
|
|
143
|
+
* The roster may be a function rather than an array, and usually
|
|
144
|
+
* should be. Providers arrive over the bus from other packages, and
|
|
145
|
+
* load order between extensions is not something either one
|
|
146
|
+
* chooses, so a broker that snapshotted its roster at construction
|
|
147
|
+
* would be permanently blind to whichever provider happened to load
|
|
148
|
+
* second. An array stays accepted for a caller that genuinely has a
|
|
149
|
+
* fixed set, such as a test.
|
|
150
|
+
*/
|
|
151
|
+
export declare function createTreeBroker(said: readonly TreeProvider[] | (() => readonly TreeProvider[]) | BrokerDeps): TreeBroker;
|
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Handing out trees and taking them back.
|
|
3
|
+
*
|
|
4
|
+
* The broker is the piece that made three tree contracts look like
|
|
5
|
+
* three problems. Each one held its own trees, keyed them its own
|
|
6
|
+
* way, and reimplemented the same two questions: does one of these
|
|
7
|
+
* already answer the request, and who serves this repo. Both
|
|
8
|
+
* questions now have one answer each, in `tree.ts` and
|
|
9
|
+
* `provider.ts`, so what is left here is genuinely just custody.
|
|
10
|
+
*/
|
|
11
|
+
import { chooseTreeProvider } from "./provider.js";
|
|
12
|
+
import { satisfies, treeIdentity, } from "./tree.js";
|
|
13
|
+
/**
|
|
14
|
+
* Hold the trees a session is using.
|
|
15
|
+
*
|
|
16
|
+
* Refuses rather than guessing when the provider choice is not
|
|
17
|
+
* clear. Cutting a tree from a provider nobody chose is the failure
|
|
18
|
+
* this is built to avoid: it succeeds, so nothing draws attention
|
|
19
|
+
* to it, and the tree is merely wrong rather than missing.
|
|
20
|
+
*
|
|
21
|
+
* The roster may be a function rather than an array, and usually
|
|
22
|
+
* should be. Providers arrive over the bus from other packages, and
|
|
23
|
+
* load order between extensions is not something either one
|
|
24
|
+
* chooses, so a broker that snapshotted its roster at construction
|
|
25
|
+
* would be permanently blind to whichever provider happened to load
|
|
26
|
+
* second. An array stays accepted for a caller that genuinely has a
|
|
27
|
+
* fixed set, such as a test.
|
|
28
|
+
*/
|
|
29
|
+
export function createTreeBroker(said) {
|
|
30
|
+
const deps = Array.isArray(said) || typeof said === "function"
|
|
31
|
+
? { providers: said }
|
|
32
|
+
: said;
|
|
33
|
+
const { providers, memory } = deps;
|
|
34
|
+
const trees = [];
|
|
35
|
+
const roster = () => typeof providers === "function" ? providers() : providers;
|
|
36
|
+
/**
|
|
37
|
+
* This session's trees, then remembered ones it does not already hold.
|
|
38
|
+
*
|
|
39
|
+
* Ordered that way deliberately: a tree cut here is the one the caller just
|
|
40
|
+
* asked about, and deduping by path keeps a remembered copy of it from
|
|
41
|
+
* appearing twice under two names for the same directory.
|
|
42
|
+
*/
|
|
43
|
+
const everything = () => {
|
|
44
|
+
const mine = new Set(trees.map((tree) => tree.path));
|
|
45
|
+
const earlier = (memory?.recall() ?? []).filter((tree) => !mine.has(tree.path));
|
|
46
|
+
return [...trees, ...earlier];
|
|
47
|
+
};
|
|
48
|
+
return {
|
|
49
|
+
unattributed() {
|
|
50
|
+
// Never this session's. Ours were stamped as they were cut, so
|
|
51
|
+
// anything unattributable came from a record on disk.
|
|
52
|
+
const mine = new Set(trees.map((tree) => tree.path));
|
|
53
|
+
return (memory?.unattributed() ?? []).filter((tree) => !mine.has(tree.path));
|
|
54
|
+
},
|
|
55
|
+
async stillHeld() {
|
|
56
|
+
const mine = new Set(trees.map((tree) => tree.path));
|
|
57
|
+
// Ours are held by definition, whatever a record says: this
|
|
58
|
+
// process is running, since it is the one asking.
|
|
59
|
+
const earlier = (await memory?.heldNow())?.filter((tree) => !mine.has(tree.path));
|
|
60
|
+
return [...trees, ...(earlier ?? [])];
|
|
61
|
+
},
|
|
62
|
+
async ensure(request) {
|
|
63
|
+
// Searches remembered trees too, so a second session reuses what the
|
|
64
|
+
// first cut instead of cutting a second tree for the same thing.
|
|
65
|
+
//
|
|
66
|
+
// A record is not the directory, which is this module's own rule
|
|
67
|
+
// and was broken here. Returning on a record alone meant the
|
|
68
|
+
// provider was never asked about any tree already written down,
|
|
69
|
+
// so a tree standing somewhere other than where it was asked to
|
|
70
|
+
// stand stayed there for good: a World snapshot left on main by
|
|
71
|
+
// an older version of its provider could never be pinned,
|
|
72
|
+
// because the code that pins it was unreachable for exactly the
|
|
73
|
+
// trees that needed it. The provider is asked either way, and
|
|
74
|
+
// every provider treats already-there as the ordinary case,
|
|
75
|
+
// which is what makes `ensure` mean what the word says.
|
|
76
|
+
const reusable = everything().find((tree) => satisfies(tree.identity, request));
|
|
77
|
+
if (reusable) {
|
|
78
|
+
const by = roster().find((provider) => provider.id === reusable.providerId);
|
|
79
|
+
// Nothing to ask when whoever cut it is not loaded. The
|
|
80
|
+
// directory is still there and still the right one to hand
|
|
81
|
+
// back; only the check goes missing, which is where this
|
|
82
|
+
// stood for every tree until now.
|
|
83
|
+
if (by !== undefined)
|
|
84
|
+
await by.ensure(request);
|
|
85
|
+
// Taking a tree is holding it, however it was obtained. A
|
|
86
|
+
// reused tree still carries whoever cut it, and that session
|
|
87
|
+
// is usually gone: without this, the tree this session is
|
|
88
|
+
// working in reads as nobody's, and reclaiming it is exactly
|
|
89
|
+
// the thing that must never happen. Held locally as well,
|
|
90
|
+
// since our own list is what makes this session's answer true
|
|
91
|
+
// whatever the record on disk says.
|
|
92
|
+
if (!trees.some((tree) => tree.path === reusable.path)) {
|
|
93
|
+
trees.push(reusable);
|
|
94
|
+
}
|
|
95
|
+
await memory?.rememberHeldByUs(reusable);
|
|
96
|
+
return reusable;
|
|
97
|
+
}
|
|
98
|
+
const choice = chooseTreeProvider(roster(), request.repo);
|
|
99
|
+
if (choice.kind === "none") {
|
|
100
|
+
throw new Error(`No provider serves ${request.repo.key}, so there is nowhere to cut a tree from.`);
|
|
101
|
+
}
|
|
102
|
+
if (choice.kind === "ambiguous") {
|
|
103
|
+
const names = choice.providers.map((p) => p.id).join(" and ");
|
|
104
|
+
throw new Error(`Both ${names} are configured to serve ${request.repo.key}, so which cuts the tree would be arbitrary. Leave one of them out.`);
|
|
105
|
+
}
|
|
106
|
+
const { path } = await choice.provider.ensure(request);
|
|
107
|
+
const held = {
|
|
108
|
+
identity: treeIdentity(request),
|
|
109
|
+
path,
|
|
110
|
+
providerId: choice.provider.id,
|
|
111
|
+
};
|
|
112
|
+
trees.push(held);
|
|
113
|
+
// Awaited, though it costs a `ps` on the way out of every cut.
|
|
114
|
+
// Left running in the background it is a write that may not
|
|
115
|
+
// have happened when the caller gets the tree, and a one-shot
|
|
116
|
+
// session can be gone by then: the record exists precisely so
|
|
117
|
+
// the next session finds the tree, so losing the race loses
|
|
118
|
+
// the tree, which is the fault this whole module was written
|
|
119
|
+
// for. A few milliseconds against cutting a worktree is not a
|
|
120
|
+
// cost worth that.
|
|
121
|
+
await memory?.rememberHeldByUs(held);
|
|
122
|
+
return held;
|
|
123
|
+
},
|
|
124
|
+
async release(held) {
|
|
125
|
+
const all = roster();
|
|
126
|
+
const owner = all.find((provider) => provider.id === held.providerId);
|
|
127
|
+
// Nothing to release through, so nothing is released. The record
|
|
128
|
+
// stays, because it is the only pointer at a directory that is still
|
|
129
|
+
// there: dropping it is how a tree becomes garbage nothing can name.
|
|
130
|
+
// A tree that keeps appearing in a listing is recoverable once the
|
|
131
|
+
// provider loads; one nobody has a record of is not.
|
|
132
|
+
if (!owner) {
|
|
133
|
+
return {
|
|
134
|
+
kind: "no-provider",
|
|
135
|
+
wanted: held.providerId,
|
|
136
|
+
registered: all.map((provider) => provider.id),
|
|
137
|
+
path: held.path,
|
|
138
|
+
};
|
|
139
|
+
}
|
|
140
|
+
const at = trees.findIndex((tree) => tree.path === held.path);
|
|
141
|
+
if (at >= 0)
|
|
142
|
+
trees.splice(at, 1);
|
|
143
|
+
// Giving up our share of a shared tree is not taking it away.
|
|
144
|
+
// A snapshot can be held by two sessions, and once this change
|
|
145
|
+
// started writing that down, releasing had to read it: taking
|
|
146
|
+
// the directory while somebody else is standing in it is the
|
|
147
|
+
// failure this whole change is about, arriving through the one
|
|
148
|
+
// door that always could remove a tree.
|
|
149
|
+
const others = await memory?.otherHolders(held.path);
|
|
150
|
+
if (others !== undefined && others.length > 0) {
|
|
151
|
+
await memory?.forgetUsAsHolder(held.path);
|
|
152
|
+
return { kind: "released", kept: others.length };
|
|
153
|
+
}
|
|
154
|
+
// Forgotten before the provider acts, so a provider that throws
|
|
155
|
+
// halfway does not leave a record claiming a tree that is now
|
|
156
|
+
// half-gone. A record for a tree still on disk is recoverable on the
|
|
157
|
+
// next cut; a record for a broken one is a trap.
|
|
158
|
+
memory?.forget(held.path);
|
|
159
|
+
await owner.release(held);
|
|
160
|
+
return { kind: "released" };
|
|
161
|
+
},
|
|
162
|
+
held: () => everything(),
|
|
163
|
+
cutHere: (path) => trees.some((tree) => tree.path === path),
|
|
164
|
+
};
|
|
165
|
+
}
|