@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,192 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Production git predicates for the write classifier. Each shells
|
|
3
|
+
* out to git from the directory enclosing the target, so a target
|
|
4
|
+
* in a different repository than the session cwd is judged against
|
|
5
|
+
* its own repository. Every call fails closed to the safe answer
|
|
6
|
+
* when git is absent, the path is outside a repository, or the
|
|
7
|
+
* subprocess errors: no tree root, not ignored, not tracked.
|
|
8
|
+
*
|
|
9
|
+
* The pure classifier takes these as injected predicates; this
|
|
10
|
+
* module is the real implementation it composes in production.
|
|
11
|
+
*/
|
|
12
|
+
import { execFileSync } from "node:child_process";
|
|
13
|
+
import { existsSync, realpathSync, statSync } from "node:fs";
|
|
14
|
+
import * as path from "node:path";
|
|
15
|
+
/**
|
|
16
|
+
* Wall-clock ceiling for a single git invocation. The classifier
|
|
17
|
+
* runs on the synchronous tool_call path, so a wedged git must not
|
|
18
|
+
* hang the event loop with no operator lever; a timeout throws,
|
|
19
|
+
* which every caller already treats as the safe answer.
|
|
20
|
+
*/
|
|
21
|
+
const GIT_TIMEOUT_MS = 5000;
|
|
22
|
+
/** Run git in `cwd`, returning trimmed stdout, or null on any failure. */
|
|
23
|
+
function git(cwd, args) {
|
|
24
|
+
try {
|
|
25
|
+
return execFileSync("git", args, {
|
|
26
|
+
cwd,
|
|
27
|
+
encoding: "utf8",
|
|
28
|
+
stdio: ["ignore", "pipe", "ignore"],
|
|
29
|
+
timeout: GIT_TIMEOUT_MS,
|
|
30
|
+
}).trim();
|
|
31
|
+
}
|
|
32
|
+
catch {
|
|
33
|
+
// git missing, non-zero exit (e.g. not a repo, not ignored,
|
|
34
|
+
// not tracked) or any spawn error: the caller's safe answer.
|
|
35
|
+
return null;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* The canonical directory to run git from and the canonical target
|
|
40
|
+
* path, for a target that may not exist yet. Walks up to the
|
|
41
|
+
* nearest existing ancestor (so git runs from a real directory
|
|
42
|
+
* even when several leading path segments are missing) and
|
|
43
|
+
* realpath's it, so a /var versus /private/var spelling does not
|
|
44
|
+
* read as outside the repository. The missing tail is re-appended
|
|
45
|
+
* to form the full canonical target.
|
|
46
|
+
*/
|
|
47
|
+
function located(absPath) {
|
|
48
|
+
const resolved = path.resolve(absPath);
|
|
49
|
+
const tail = [];
|
|
50
|
+
let prefix = path.dirname(resolved);
|
|
51
|
+
tail.unshift(path.basename(resolved));
|
|
52
|
+
while (true) {
|
|
53
|
+
try {
|
|
54
|
+
const dir = realpathSync(prefix);
|
|
55
|
+
return { dir, target: path.join(dir, ...tail) };
|
|
56
|
+
}
|
|
57
|
+
catch {
|
|
58
|
+
// prefix does not exist; step up and try its parent.
|
|
59
|
+
}
|
|
60
|
+
const parent = path.dirname(prefix);
|
|
61
|
+
if (parent === prefix)
|
|
62
|
+
return { dir: prefix, target: resolved };
|
|
63
|
+
tail.unshift(path.basename(prefix));
|
|
64
|
+
prefix = parent;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* The git working tree root containing the target, or null when the
|
|
69
|
+
* target is not inside any repository. Resolves through `.git` files
|
|
70
|
+
* (worktrees) natively via rev-parse.
|
|
71
|
+
*
|
|
72
|
+
* Accepts a directory as readily as a file. It did not always: it ran
|
|
73
|
+
* git from `located().dir`, which resolves an existing directory to
|
|
74
|
+
* its parent, and the parent of a repository root is outside the
|
|
75
|
+
* repository. So the one input a caller is most likely to hold, the
|
|
76
|
+
* root of the checkout they are standing in, answered null. Two
|
|
77
|
+
* callers knew and worked around it by appending a filename they
|
|
78
|
+
* invented; the third did not, and shipped a verb that refused in the
|
|
79
|
+
* only place it was meant to work.
|
|
80
|
+
*/
|
|
81
|
+
export function gitTreeRootOf(absPath) {
|
|
82
|
+
const root = git(fromInside(absPath), ["rev-parse", "--show-toplevel"]);
|
|
83
|
+
return root && root.length > 0 ? root : null;
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* The directory to run git from for a target: the target itself when
|
|
87
|
+
* it is a directory, and otherwise the nearest existing ancestor.
|
|
88
|
+
*/
|
|
89
|
+
function fromInside(absPath) {
|
|
90
|
+
try {
|
|
91
|
+
if (statSync(absPath).isDirectory())
|
|
92
|
+
return realpathSync(absPath);
|
|
93
|
+
}
|
|
94
|
+
catch {
|
|
95
|
+
// Does not exist, so it is a path a caller invented to probe with.
|
|
96
|
+
// located() walks up to the nearest real ancestor, which is what
|
|
97
|
+
// those callers were relying on and what still happens below.
|
|
98
|
+
}
|
|
99
|
+
return located(absPath).dir;
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Whether the target sits in a repository's primary checkout, as
|
|
103
|
+
* opposed to a linked worktree. The main tree's git-dir equals its
|
|
104
|
+
* git-common-dir; a linked worktree's git-dir is under
|
|
105
|
+
* `.git/worktrees/`, so the two differ. False when git cannot answer
|
|
106
|
+
* or the path is outside any repository, so a doubtful case never
|
|
107
|
+
* reads as the shared main tree by accident.
|
|
108
|
+
*/
|
|
109
|
+
export function isMainWorkingTree(absPath) {
|
|
110
|
+
// Probe a child path so git runs from the directory itself, the
|
|
111
|
+
// same trick gitTreeRootOf uses; located() otherwise resolves to
|
|
112
|
+
// the parent of an existing directory.
|
|
113
|
+
const { dir } = located(path.join(absPath, ".quest-tree-probe"));
|
|
114
|
+
const gitDir = git(dir, ["rev-parse", "--path-format=absolute", "--git-dir"]);
|
|
115
|
+
const commonDir = git(dir, [
|
|
116
|
+
"rev-parse",
|
|
117
|
+
"--path-format=absolute",
|
|
118
|
+
"--git-common-dir",
|
|
119
|
+
]);
|
|
120
|
+
if (!gitDir || !commonDir)
|
|
121
|
+
return false;
|
|
122
|
+
return canonicalPath(gitDir) === canonicalPath(commonDir);
|
|
123
|
+
}
|
|
124
|
+
/** Whether the target is gitignored at its destination. */
|
|
125
|
+
export function isGitignored(absPath) {
|
|
126
|
+
const { dir, target } = located(absPath);
|
|
127
|
+
try {
|
|
128
|
+
execFileSync("git", ["check-ignore", "-q", "--", target], {
|
|
129
|
+
cwd: dir,
|
|
130
|
+
stdio: "ignore",
|
|
131
|
+
timeout: GIT_TIMEOUT_MS,
|
|
132
|
+
});
|
|
133
|
+
return true;
|
|
134
|
+
}
|
|
135
|
+
catch {
|
|
136
|
+
// Exit 1 (not ignored) and 128 (not a repo) both land here as
|
|
137
|
+
// "not ignored," which is the safe answer for the classifier.
|
|
138
|
+
return false;
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* Canonicalize a path for comparison, tolerating a path that does
|
|
143
|
+
* not exist yet. Resolves the longest existing ancestor (which
|
|
144
|
+
* turns /var into /private/var on macOS) and re-appends the missing
|
|
145
|
+
* tail. The literal path survives a total failure.
|
|
146
|
+
*/
|
|
147
|
+
export function canonicalPath(p) {
|
|
148
|
+
const tail = [];
|
|
149
|
+
let prefix = p;
|
|
150
|
+
while (!existsSync(prefix)) {
|
|
151
|
+
const parent = path.dirname(prefix);
|
|
152
|
+
if (parent === prefix)
|
|
153
|
+
return p;
|
|
154
|
+
tail.unshift(path.basename(prefix));
|
|
155
|
+
prefix = parent;
|
|
156
|
+
}
|
|
157
|
+
try {
|
|
158
|
+
const real = realpathSync(prefix);
|
|
159
|
+
return tail.length > 0 ? path.join(real, ...tail) : real;
|
|
160
|
+
}
|
|
161
|
+
catch {
|
|
162
|
+
// realpath can fail on a broken symlink; the literal path is best.
|
|
163
|
+
return p;
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* Whether `child` is `parent` or lives beneath it, comparing
|
|
168
|
+
* canonicalized paths with a separator boundary so a /var versus
|
|
169
|
+
* /private/var spelling still matches and a sibling whose name
|
|
170
|
+
* merely shares a prefix (feature-2 against feat) does not.
|
|
171
|
+
*/
|
|
172
|
+
export function isWithin(child, parent) {
|
|
173
|
+
const c = canonicalPath(child);
|
|
174
|
+
const p = canonicalPath(parent);
|
|
175
|
+
return c === p || c.startsWith(p + path.sep);
|
|
176
|
+
}
|
|
177
|
+
/** Whether the target is tracked in its repository's index. */
|
|
178
|
+
export function isTracked(absPath) {
|
|
179
|
+
const { dir, target } = located(absPath);
|
|
180
|
+
try {
|
|
181
|
+
execFileSync("git", ["ls-files", "--error-unmatch", "--", target], {
|
|
182
|
+
cwd: dir,
|
|
183
|
+
stdio: "ignore",
|
|
184
|
+
timeout: GIT_TIMEOUT_MS,
|
|
185
|
+
});
|
|
186
|
+
return true;
|
|
187
|
+
}
|
|
188
|
+
catch {
|
|
189
|
+
// Non-zero exit (untracked or not a repo): not tracked.
|
|
190
|
+
return false;
|
|
191
|
+
}
|
|
192
|
+
}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Quest and document ID minting.
|
|
3
|
+
*
|
|
4
|
+
* IDs are deterministic in shape, random in suffix:
|
|
5
|
+
*
|
|
6
|
+
* PREFIX-YYYYMMDD-XXXXXX
|
|
7
|
+
*
|
|
8
|
+
* `PREFIX` is one of the four-character codes for our
|
|
9
|
+
* document kinds. `YYYYMMDD` is the creation date in the
|
|
10
|
+
* local timezone (we never coordinate IDs across timezones,
|
|
11
|
+
* so local is what the user expects to see). `XXXXXX` is a
|
|
12
|
+
* six-character base-36 (upper) random suffix giving roughly
|
|
13
|
+
* 2.18 billion distinct IDs per kind per day.
|
|
14
|
+
*/
|
|
15
|
+
/** Recognised ID prefixes for the four document kinds plus quests. */
|
|
16
|
+
export declare const ID_PREFIXES: readonly ["QEST", "PLAN", "RSCH", "BRIF", "RPRT"];
|
|
17
|
+
export type IdPrefix = (typeof ID_PREFIXES)[number];
|
|
18
|
+
/**
|
|
19
|
+
* Mint a fresh ID. The date defaults to `new Date()`; tests
|
|
20
|
+
* pass a fixed date for stable output.
|
|
21
|
+
*/
|
|
22
|
+
export declare function mintId(prefix: IdPrefix, date?: Date): string;
|
|
23
|
+
/** Quick validation: is this string a valid ID? */
|
|
24
|
+
export declare function isId(text: string): boolean;
|
|
25
|
+
/** Extract the prefix from an ID, or `undefined` for an invalid ID. */
|
|
26
|
+
export declare function prefixOf(id: string): IdPrefix | undefined;
|
|
27
|
+
/** Extract the date portion (YYYYMMDD) from an ID, or `undefined`. */
|
|
28
|
+
export declare function dateOf(id: string): string | undefined;
|
|
29
|
+
/** Find every valid ID in a body of text. */
|
|
30
|
+
export declare function findIds(text: string): string[];
|
|
31
|
+
/**
|
|
32
|
+
* How an inline ID mention reads. A bare `QEST-...` reads
|
|
33
|
+
* as a `reference`. An id preceded by the `→` sigil
|
|
34
|
+
* (after optional whitespace) reads as `produced`: the
|
|
35
|
+
* containing document is the work that produced the
|
|
36
|
+
* mentioned id.
|
|
37
|
+
*/
|
|
38
|
+
export type IdMentionRelation = "produced" | "reference";
|
|
39
|
+
export interface IdMention {
|
|
40
|
+
id: string;
|
|
41
|
+
relation: IdMentionRelation;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Find every ID in a body of text and classify each
|
|
45
|
+
* mention as a bare reference or a produced-by sigil hit.
|
|
46
|
+
* When the same id appears more than once, the strongest
|
|
47
|
+
* relation wins: a single `→ ID` anywhere upgrades the
|
|
48
|
+
* record from `reference` to `produced`.
|
|
49
|
+
*/
|
|
50
|
+
export declare function findIdsWithRelation(text: string): IdMention[];
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Quest and document ID minting.
|
|
3
|
+
*
|
|
4
|
+
* IDs are deterministic in shape, random in suffix:
|
|
5
|
+
*
|
|
6
|
+
* PREFIX-YYYYMMDD-XXXXXX
|
|
7
|
+
*
|
|
8
|
+
* `PREFIX` is one of the four-character codes for our
|
|
9
|
+
* document kinds. `YYYYMMDD` is the creation date in the
|
|
10
|
+
* local timezone (we never coordinate IDs across timezones,
|
|
11
|
+
* so local is what the user expects to see). `XXXXXX` is a
|
|
12
|
+
* six-character base-36 (upper) random suffix giving roughly
|
|
13
|
+
* 2.18 billion distinct IDs per kind per day.
|
|
14
|
+
*/
|
|
15
|
+
import { randomBytes } from "node:crypto";
|
|
16
|
+
/** Recognised ID prefixes for the four document kinds plus quests. */
|
|
17
|
+
export const ID_PREFIXES = ["QEST", "PLAN", "RSCH", "BRIF", "RPRT"];
|
|
18
|
+
// YYYY: 1900-2999. MM: 01-12. DD: 01-31. This is a
|
|
19
|
+
// shape check, not a perfect calendar validator: it
|
|
20
|
+
// rejects the obvious garbage (00000000, 20261345) the
|
|
21
|
+
// old `\d{8}` accepted while staying cheap.
|
|
22
|
+
const DATE_PATTERN = "(?:19|2[0-9])\\d{2}(?:0[1-9]|1[0-2])(?:0[1-9]|[12]\\d|3[01])";
|
|
23
|
+
const ID_REGEX = new RegExp(`^(${ID_PREFIXES.join("|")})-(${DATE_PATTERN})-([0-9A-Z]{6})$`);
|
|
24
|
+
const ID_REGEX_BODY = `(${ID_PREFIXES.join("|")})-(${DATE_PATTERN})-([0-9A-Z]{6})`;
|
|
25
|
+
function pad(n) {
|
|
26
|
+
return String(n).padStart(2, "0");
|
|
27
|
+
}
|
|
28
|
+
function ymd(date) {
|
|
29
|
+
return `${date.getFullYear()}${pad(date.getMonth() + 1)}${pad(date.getDate())}`;
|
|
30
|
+
}
|
|
31
|
+
/** Build a six-character base-36 uppercase random suffix. */
|
|
32
|
+
function randomSuffix() {
|
|
33
|
+
const bytes = randomBytes(6);
|
|
34
|
+
const out = [];
|
|
35
|
+
for (let i = 0; i < 6; i++) {
|
|
36
|
+
out.push((bytes[i] % 36).toString(36).toUpperCase());
|
|
37
|
+
}
|
|
38
|
+
return out.join("");
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Mint a fresh ID. The date defaults to `new Date()`; tests
|
|
42
|
+
* pass a fixed date for stable output.
|
|
43
|
+
*/
|
|
44
|
+
export function mintId(prefix, date = new Date()) {
|
|
45
|
+
return `${prefix}-${ymd(date)}-${randomSuffix()}`;
|
|
46
|
+
}
|
|
47
|
+
/** Quick validation: is this string a valid ID? */
|
|
48
|
+
export function isId(text) {
|
|
49
|
+
return ID_REGEX.test(text);
|
|
50
|
+
}
|
|
51
|
+
/** Extract the prefix from an ID, or `undefined` for an invalid ID. */
|
|
52
|
+
export function prefixOf(id) {
|
|
53
|
+
const match = ID_REGEX.exec(id);
|
|
54
|
+
return match ? match[1] : undefined;
|
|
55
|
+
}
|
|
56
|
+
/** Extract the date portion (YYYYMMDD) from an ID, or `undefined`. */
|
|
57
|
+
export function dateOf(id) {
|
|
58
|
+
const match = ID_REGEX.exec(id);
|
|
59
|
+
return match ? match[2] : undefined;
|
|
60
|
+
}
|
|
61
|
+
/** Find every valid ID in a body of text. */
|
|
62
|
+
export function findIds(text) {
|
|
63
|
+
// We need a no-anchor flavour of the regex so it can
|
|
64
|
+
// scan the middle of a string. The `\b` boundary keeps
|
|
65
|
+
// us from matching IDs embedded inside longer tokens.
|
|
66
|
+
const scan = new RegExp(`\\b${ID_REGEX_BODY}\\b`, "g");
|
|
67
|
+
const out = [];
|
|
68
|
+
const seen = new Set();
|
|
69
|
+
for (const m of text.matchAll(scan)) {
|
|
70
|
+
if (!seen.has(m[0])) {
|
|
71
|
+
seen.add(m[0]);
|
|
72
|
+
out.push(m[0]);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
return out;
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Find every ID in a body of text and classify each
|
|
79
|
+
* mention as a bare reference or a produced-by sigil hit.
|
|
80
|
+
* When the same id appears more than once, the strongest
|
|
81
|
+
* relation wins: a single `→ ID` anywhere upgrades the
|
|
82
|
+
* record from `reference` to `produced`.
|
|
83
|
+
*/
|
|
84
|
+
export function findIdsWithRelation(text) {
|
|
85
|
+
const scan = new RegExp(`\\b${ID_REGEX_BODY}\\b`, "g");
|
|
86
|
+
const seen = new Map();
|
|
87
|
+
const order = [];
|
|
88
|
+
for (const m of text.matchAll(scan)) {
|
|
89
|
+
const id = m[0];
|
|
90
|
+
const start = m.index ?? 0;
|
|
91
|
+
const relation = sigilBefore(text, start) ? "produced" : "reference";
|
|
92
|
+
const prev = seen.get(id);
|
|
93
|
+
if (prev === undefined) {
|
|
94
|
+
order.push(id);
|
|
95
|
+
seen.set(id, relation);
|
|
96
|
+
continue;
|
|
97
|
+
}
|
|
98
|
+
if (prev === "reference" && relation === "produced") {
|
|
99
|
+
seen.set(id, relation);
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
return order.map((id) => ({
|
|
103
|
+
id,
|
|
104
|
+
relation: seen.get(id) ?? "reference",
|
|
105
|
+
}));
|
|
106
|
+
}
|
|
107
|
+
function sigilBefore(text, idStart) {
|
|
108
|
+
// Walk backwards past whitespace; if we hit a → with
|
|
109
|
+
// nothing but whitespace in between, the id reads as
|
|
110
|
+
// `produced`. Anything else (text, punctuation, line
|
|
111
|
+
// boundary) means bare reference.
|
|
112
|
+
let i = idStart - 1;
|
|
113
|
+
while (i >= 0 && /\s/.test(text[i]))
|
|
114
|
+
i--;
|
|
115
|
+
return i >= 0 && text[i] === "\u2192";
|
|
116
|
+
}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Atomic file IO and per-quest advisory locks.
|
|
3
|
+
*
|
|
4
|
+
* Quest READMEs are read-modify-write at every action,
|
|
5
|
+
* potentially from two pi sessions attached to the same
|
|
6
|
+
* quest at the same time. Two concerns:
|
|
7
|
+
*
|
|
8
|
+
* 1. Torn reads. The "read text, parse, mutate, write
|
|
9
|
+
* text" sequence is not atomic against a concurrent
|
|
10
|
+
* reader; on a slow disk a reader sees half a file.
|
|
11
|
+
* We write to a sibling temp file, fsync, then rename
|
|
12
|
+
* over the target so observers always see the old or
|
|
13
|
+
* new file in full.
|
|
14
|
+
*
|
|
15
|
+
* 2. Lost updates. Two pi sessions running in parallel
|
|
16
|
+
* both load the README, both mutate frontmatter
|
|
17
|
+
* in-memory, both write back: the second overwrites
|
|
18
|
+
* the first. We take a coarse per-quest lock around
|
|
19
|
+
* the read-modify-write so the second waits.
|
|
20
|
+
*
|
|
21
|
+
* The lock is file-creation with `O_EXCL`. A short retry
|
|
22
|
+
* loop covers the normal contention case; a stale-lock
|
|
23
|
+
* sweep kicks in when the lock is older than
|
|
24
|
+
* `STALE_LOCK_MS` so a crashed pi cannot wedge the quest
|
|
25
|
+
* for the rest of time. The lock is advisory: a process
|
|
26
|
+
* that bypasses it can still write through. We rely on
|
|
27
|
+
* every README write going through `withQuestLock`.
|
|
28
|
+
*/
|
|
29
|
+
/**
|
|
30
|
+
* Write `data` to `path` atomically: write to a sibling
|
|
31
|
+
* temp file in the same directory, fsync, then rename
|
|
32
|
+
* over the target. The rename is atomic on POSIX
|
|
33
|
+
* filesystems for files on the same volume.
|
|
34
|
+
*/
|
|
35
|
+
export declare function atomicWriteFile(path: string, data: string): void;
|
|
36
|
+
/**
|
|
37
|
+
* Run `fn` under an advisory lock on the given quest dir.
|
|
38
|
+
* Acquires `<questDir>/.quest.lock`, runs fn, releases.
|
|
39
|
+
* Steals locks older than `STALE_LOCK_MS` whose owner is
|
|
40
|
+
* no longer alive.
|
|
41
|
+
*/
|
|
42
|
+
export declare function withQuestLock<T>(questDir: string, fn: () => T): T;
|
|
43
|
+
/**
|
|
44
|
+
* Convenience helper: lock the quest, write the README
|
|
45
|
+
* atomically, release. Most call sites use this directly.
|
|
46
|
+
*/
|
|
47
|
+
export declare function writeQuestReadmeAtomic(questDir: string, contents: string): void;
|
|
48
|
+
/** Fallback when we have a path but no enclosing quest dir. */
|
|
49
|
+
export declare function atomicWriteUnderLock(questDir: string, path: string, contents: string): void;
|
|
50
|
+
/** Synchronous sleep used in tests when emulating contention. */
|
|
51
|
+
export declare const __testing: {
|
|
52
|
+
LOCK_TIMEOUT_MS: number;
|
|
53
|
+
STALE_LOCK_MS: number;
|
|
54
|
+
};
|
|
@@ -0,0 +1,233 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Atomic file IO and per-quest advisory locks.
|
|
3
|
+
*
|
|
4
|
+
* Quest READMEs are read-modify-write at every action,
|
|
5
|
+
* potentially from two pi sessions attached to the same
|
|
6
|
+
* quest at the same time. Two concerns:
|
|
7
|
+
*
|
|
8
|
+
* 1. Torn reads. The "read text, parse, mutate, write
|
|
9
|
+
* text" sequence is not atomic against a concurrent
|
|
10
|
+
* reader; on a slow disk a reader sees half a file.
|
|
11
|
+
* We write to a sibling temp file, fsync, then rename
|
|
12
|
+
* over the target so observers always see the old or
|
|
13
|
+
* new file in full.
|
|
14
|
+
*
|
|
15
|
+
* 2. Lost updates. Two pi sessions running in parallel
|
|
16
|
+
* both load the README, both mutate frontmatter
|
|
17
|
+
* in-memory, both write back: the second overwrites
|
|
18
|
+
* the first. We take a coarse per-quest lock around
|
|
19
|
+
* the read-modify-write so the second waits.
|
|
20
|
+
*
|
|
21
|
+
* The lock is file-creation with `O_EXCL`. A short retry
|
|
22
|
+
* loop covers the normal contention case; a stale-lock
|
|
23
|
+
* sweep kicks in when the lock is older than
|
|
24
|
+
* `STALE_LOCK_MS` so a crashed pi cannot wedge the quest
|
|
25
|
+
* for the rest of time. The lock is advisory: a process
|
|
26
|
+
* that bypasses it can still write through. We rely on
|
|
27
|
+
* every README write going through `withQuestLock`.
|
|
28
|
+
*/
|
|
29
|
+
import { closeSync, existsSync, fsyncSync, openSync, readFileSync, renameSync, statSync, unlinkSync, writeSync, } from "node:fs";
|
|
30
|
+
import { dirname, join } from "node:path";
|
|
31
|
+
/** Lock-acquire retry budget per call. */
|
|
32
|
+
const LOCK_TIMEOUT_MS = 5000;
|
|
33
|
+
/** Sleep between retries. */
|
|
34
|
+
const LOCK_RETRY_MS = 25;
|
|
35
|
+
/** A lock older than this is considered stale and stolen. */
|
|
36
|
+
const STALE_LOCK_MS = 30_000;
|
|
37
|
+
const LOCK_NAME = ".quest.lock";
|
|
38
|
+
/**
|
|
39
|
+
* Write `data` to `path` atomically: write to a sibling
|
|
40
|
+
* temp file in the same directory, fsync, then rename
|
|
41
|
+
* over the target. The rename is atomic on POSIX
|
|
42
|
+
* filesystems for files on the same volume.
|
|
43
|
+
*/
|
|
44
|
+
export function atomicWriteFile(path, data) {
|
|
45
|
+
const dir = dirname(path);
|
|
46
|
+
const tmp = join(dir, `.${path.split("/").pop()}.tmp-${process.pid}-${Math.random()
|
|
47
|
+
.toString(36)
|
|
48
|
+
.slice(2, 10)}`);
|
|
49
|
+
const fd = openSync(tmp, "w");
|
|
50
|
+
try {
|
|
51
|
+
writeSync(fd, data);
|
|
52
|
+
fsyncSync(fd);
|
|
53
|
+
}
|
|
54
|
+
finally {
|
|
55
|
+
closeSync(fd);
|
|
56
|
+
}
|
|
57
|
+
try {
|
|
58
|
+
renameSync(tmp, path);
|
|
59
|
+
}
|
|
60
|
+
catch (err) {
|
|
61
|
+
try {
|
|
62
|
+
unlinkSync(tmp);
|
|
63
|
+
}
|
|
64
|
+
catch {
|
|
65
|
+
// Best-effort cleanup; the temp's leftover state is
|
|
66
|
+
// safe to leave in place and is not user-visible.
|
|
67
|
+
}
|
|
68
|
+
throw err;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
function readLockRecord(lockPath) {
|
|
72
|
+
try {
|
|
73
|
+
const text = readFileSync(lockPath, "utf8");
|
|
74
|
+
const parsed = JSON.parse(text);
|
|
75
|
+
const pid = typeof parsed.pid === "number" && Number.isFinite(parsed.pid)
|
|
76
|
+
? parsed.pid
|
|
77
|
+
: undefined;
|
|
78
|
+
const startedAt = typeof parsed.startedAt === "number" && Number.isFinite(parsed.startedAt)
|
|
79
|
+
? parsed.startedAt
|
|
80
|
+
: undefined;
|
|
81
|
+
if (pid === undefined || startedAt === undefined)
|
|
82
|
+
return undefined;
|
|
83
|
+
return { pid, startedAt };
|
|
84
|
+
}
|
|
85
|
+
catch {
|
|
86
|
+
// Lock file is malformed or unreadable. Treat as stale
|
|
87
|
+
// so the steal loop can recover instead of wedging.
|
|
88
|
+
return undefined;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
function isProcessAlive(pid) {
|
|
92
|
+
if (pid <= 0 || pid === process.pid)
|
|
93
|
+
return false;
|
|
94
|
+
try {
|
|
95
|
+
// kill(pid, 0) probes whether the pid exists; throws
|
|
96
|
+
// ESRCH when it doesn't and EPERM when it does but we
|
|
97
|
+
// can't signal it. Either non-throw is "alive enough".
|
|
98
|
+
process.kill(pid, 0);
|
|
99
|
+
return true;
|
|
100
|
+
}
|
|
101
|
+
catch (err) {
|
|
102
|
+
return err.code === "EPERM";
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
function tryStealStaleLock(lockPath, now) {
|
|
106
|
+
const record = readLockRecord(lockPath);
|
|
107
|
+
if (!record) {
|
|
108
|
+
// Malformed lock file; remove and retry.
|
|
109
|
+
try {
|
|
110
|
+
unlinkSync(lockPath);
|
|
111
|
+
}
|
|
112
|
+
catch {
|
|
113
|
+
// Another process beat us to the cleanup; that's fine.
|
|
114
|
+
}
|
|
115
|
+
return true;
|
|
116
|
+
}
|
|
117
|
+
const age = now - record.startedAt;
|
|
118
|
+
if (age < STALE_LOCK_MS && isProcessAlive(record.pid))
|
|
119
|
+
return false;
|
|
120
|
+
try {
|
|
121
|
+
unlinkSync(lockPath);
|
|
122
|
+
return true;
|
|
123
|
+
}
|
|
124
|
+
catch {
|
|
125
|
+
// Another process beat us to the cleanup; let the
|
|
126
|
+
// next loop iteration retry the acquire.
|
|
127
|
+
return false;
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
function acquireLock(lockPath) {
|
|
131
|
+
const deadline = Date.now() + LOCK_TIMEOUT_MS;
|
|
132
|
+
let lastStealCheck = 0;
|
|
133
|
+
while (true) {
|
|
134
|
+
try {
|
|
135
|
+
const fd = openSync(lockPath, "wx");
|
|
136
|
+
const payload = {
|
|
137
|
+
pid: process.pid,
|
|
138
|
+
startedAt: Date.now(),
|
|
139
|
+
};
|
|
140
|
+
writeSync(fd, JSON.stringify(payload));
|
|
141
|
+
fsyncSync(fd);
|
|
142
|
+
return fd;
|
|
143
|
+
}
|
|
144
|
+
catch (err) {
|
|
145
|
+
const code = err.code;
|
|
146
|
+
if (code !== "EEXIST")
|
|
147
|
+
throw err;
|
|
148
|
+
}
|
|
149
|
+
const now = Date.now();
|
|
150
|
+
if (now >= deadline) {
|
|
151
|
+
throw new Error(`Timed out acquiring quest lock at ${lockPath} after ${LOCK_TIMEOUT_MS}ms.`);
|
|
152
|
+
}
|
|
153
|
+
// Probe for staleness every couple of retries so a
|
|
154
|
+
// crashed holder doesn't keep us spinning.
|
|
155
|
+
if (now - lastStealCheck > LOCK_RETRY_MS * 4) {
|
|
156
|
+
tryStealStaleLock(lockPath, now);
|
|
157
|
+
lastStealCheck = now;
|
|
158
|
+
}
|
|
159
|
+
// Busy-wait inside the retry budget. Node has no
|
|
160
|
+
// blocking sleep without async, and the caller is
|
|
161
|
+
// already running a synchronous read-modify-write.
|
|
162
|
+
const sleepUntil = Date.now() + LOCK_RETRY_MS;
|
|
163
|
+
while (Date.now() < sleepUntil) {
|
|
164
|
+
// spin
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
function releaseLock(lockPath, fd) {
|
|
169
|
+
try {
|
|
170
|
+
closeSync(fd);
|
|
171
|
+
}
|
|
172
|
+
catch {
|
|
173
|
+
// Already closed; cleanup of the path below still runs.
|
|
174
|
+
}
|
|
175
|
+
try {
|
|
176
|
+
unlinkSync(lockPath);
|
|
177
|
+
}
|
|
178
|
+
catch {
|
|
179
|
+
// Lock file was stolen out from under us or never
|
|
180
|
+
// committed; nothing more we can do.
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* Run `fn` under an advisory lock on the given quest dir.
|
|
185
|
+
* Acquires `<questDir>/.quest.lock`, runs fn, releases.
|
|
186
|
+
* Steals locks older than `STALE_LOCK_MS` whose owner is
|
|
187
|
+
* no longer alive.
|
|
188
|
+
*/
|
|
189
|
+
export function withQuestLock(questDir, fn) {
|
|
190
|
+
if (!existsSync(questDir)) {
|
|
191
|
+
throw new Error(`Quest directory ${questDir} does not exist.`);
|
|
192
|
+
}
|
|
193
|
+
const lockPath = join(questDir, LOCK_NAME);
|
|
194
|
+
// Probe once before the loop so we don't wait the full
|
|
195
|
+
// retry budget on a clearly-stale lock.
|
|
196
|
+
if (existsSync(lockPath)) {
|
|
197
|
+
try {
|
|
198
|
+
const age = Date.now() - statSync(lockPath).mtimeMs;
|
|
199
|
+
if (age > STALE_LOCK_MS)
|
|
200
|
+
tryStealStaleLock(lockPath, Date.now());
|
|
201
|
+
}
|
|
202
|
+
catch {
|
|
203
|
+
// Stat failed; the acquire loop handles it.
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
const fd = acquireLock(lockPath);
|
|
207
|
+
try {
|
|
208
|
+
return fn();
|
|
209
|
+
}
|
|
210
|
+
finally {
|
|
211
|
+
releaseLock(lockPath, fd);
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
/**
|
|
215
|
+
* Convenience helper: lock the quest, write the README
|
|
216
|
+
* atomically, release. Most call sites use this directly.
|
|
217
|
+
*/
|
|
218
|
+
export function writeQuestReadmeAtomic(questDir, contents) {
|
|
219
|
+
withQuestLock(questDir, () => {
|
|
220
|
+
atomicWriteFile(join(questDir, "README.md"), contents);
|
|
221
|
+
});
|
|
222
|
+
}
|
|
223
|
+
/** Fallback when we have a path but no enclosing quest dir. */
|
|
224
|
+
export function atomicWriteUnderLock(questDir, path, contents) {
|
|
225
|
+
withQuestLock(questDir, () => {
|
|
226
|
+
atomicWriteFile(path, contents);
|
|
227
|
+
});
|
|
228
|
+
}
|
|
229
|
+
/** Synchronous sleep used in tests when emulating contention. */
|
|
230
|
+
export const __testing = {
|
|
231
|
+
LOCK_TIMEOUT_MS,
|
|
232
|
+
STALE_LOCK_MS,
|
|
233
|
+
};
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Reverse-mention index: for each quest in the index, find
|
|
3
|
+
* every other quest whose body or documents mention it.
|
|
4
|
+
*
|
|
5
|
+
* Two kinds of mentions:
|
|
6
|
+
*
|
|
7
|
+
* - Bare IDs in prose: `QEST-...`, `PLAN-...`, etc.
|
|
8
|
+
* - Refs: anything the registered ref types extract.
|
|
9
|
+
*
|
|
10
|
+
* For Echoes rendering on `quest show`, we care about
|
|
11
|
+
* inbound mentions: "who has mentioned QEST-X". The reverse
|
|
12
|
+
* map is keyed by the target id (or ref canonical) and
|
|
13
|
+
* values are the source quests.
|
|
14
|
+
*/
|
|
15
|
+
import type { QuestIndex } from "./discovery.js";
|
|
16
|
+
import type { IdMentionRelation } from "./id.js";
|
|
17
|
+
/** One inbound mention. */
|
|
18
|
+
export interface MentionEdge {
|
|
19
|
+
/** The quest the mention came from. */
|
|
20
|
+
from: string;
|
|
21
|
+
/** Short snippet of context around the mention. */
|
|
22
|
+
snippet: string;
|
|
23
|
+
/**
|
|
24
|
+
* How the source document referred to this id. `produced`
|
|
25
|
+
* when the mention was preceded by the → sigil; a bare
|
|
26
|
+
* reference otherwise. Refs carry `reference` since the
|
|
27
|
+
* sigil applies to ids only.
|
|
28
|
+
*/
|
|
29
|
+
relation: IdMentionRelation;
|
|
30
|
+
}
|
|
31
|
+
/** Snapshot of mentions for the whole index. */
|
|
32
|
+
export interface MentionIndex {
|
|
33
|
+
/** Inbound mentions keyed by target quest/document id. */
|
|
34
|
+
byId: Map<string, MentionEdge[]>;
|
|
35
|
+
/** Inbound mentions keyed by `${type}:${value}` for refs. */
|
|
36
|
+
byRef: Map<string, MentionEdge[]>;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Build a reverse-mention index over every quest in the
|
|
40
|
+
* input. Each quest contributes both its README body and
|
|
41
|
+
* its documents' bodies to the mention pool.
|
|
42
|
+
*/
|
|
43
|
+
export declare function buildMentionIndex(index: QuestIndex): MentionIndex;
|
|
44
|
+
/** Convenience: lookup inbound mentions for one target quest id. */
|
|
45
|
+
export declare function mentionsOf(index: MentionIndex, targetId: string): MentionEdge[];
|