@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,72 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A rendered listing, bounded for reading and stored for querying.
|
|
3
|
+
*
|
|
4
|
+
* Families render their own listings, and they should: a renderer
|
|
5
|
+
* that silently dropped rows would be lying in its own way.
|
|
6
|
+
* Bounding belongs here instead, at the point where the records
|
|
7
|
+
* are still to hand and can be kept.
|
|
8
|
+
*
|
|
9
|
+
* The counts in the citation are lines, because lines are what a
|
|
10
|
+
* reader can see and count for themselves. How many records those
|
|
11
|
+
* lines covered is not knowable from the text, and a citation
|
|
12
|
+
* nobody can check is a citation nobody should trust. What the
|
|
13
|
+
* payload actually holds is named separately, since a caller
|
|
14
|
+
* writing their first expression against lines when the payload
|
|
15
|
+
* holds records gets nothing back and no clue why.
|
|
16
|
+
*/
|
|
17
|
+
import { cite } from "./cite.js";
|
|
18
|
+
import { count } from "./counts.js";
|
|
19
|
+
import { withinLineBudget } from "./view.js";
|
|
20
|
+
/** What a rendered listing spends before the rest is stored. */
|
|
21
|
+
export const LISTING_BUDGET_BYTES = 8_192;
|
|
22
|
+
/**
|
|
23
|
+
* Bound a listing and cite its records when the view was cut.
|
|
24
|
+
*
|
|
25
|
+
* A listing that fits is returned untouched, with no citation and
|
|
26
|
+
* no advice: the view is the whole truth and saying more would be
|
|
27
|
+
* noise.
|
|
28
|
+
*/
|
|
29
|
+
export function citeListing(store, listing) {
|
|
30
|
+
const budget = listing.budget ?? LISTING_BUDGET_BYTES;
|
|
31
|
+
const bounded = withinLineBudget(listing.view, budget);
|
|
32
|
+
const trailer = listing.trailer ? `\n\n${listing.trailer}` : "";
|
|
33
|
+
if (bounded.cut === 0 && !listing.elided) {
|
|
34
|
+
return `${bounded.text}${trailer}`;
|
|
35
|
+
}
|
|
36
|
+
if (listing.records.length === 0) {
|
|
37
|
+
// A caller whose view was cut needs the rest of it, and an empty
|
|
38
|
+
// array is not the rest of it. "All 0 findings are stored under
|
|
39
|
+
// handle X" invites a query that can only come back empty, and
|
|
40
|
+
// reads as though the answer were empty rather than the payload
|
|
41
|
+
// being the wrong thing to have kept.
|
|
42
|
+
return cite(store, {
|
|
43
|
+
payload: listing.view,
|
|
44
|
+
view: `${bounded.text}${trailer}\n\n` +
|
|
45
|
+
`Cut ${count(bounded.cut)} of ${count(bounded.total)} lines ` +
|
|
46
|
+
`to fit the ${count(budget)} byte budget. ${listing.narrowing}`,
|
|
47
|
+
shown: bounded.shown,
|
|
48
|
+
total: bounded.total,
|
|
49
|
+
unit: "lines",
|
|
50
|
+
stored: { unit: "rendered answer" },
|
|
51
|
+
}).text;
|
|
52
|
+
}
|
|
53
|
+
const cited = cite(store, {
|
|
54
|
+
payload: listing.records,
|
|
55
|
+
view: `${bounded.text}${trailer}\n\n` +
|
|
56
|
+
(bounded.cut === 0
|
|
57
|
+
? `This view lists only some of what was found. ${listing.narrowing}`
|
|
58
|
+
: `Cut ${count(bounded.cut)} of ` +
|
|
59
|
+
`${count(bounded.total)} lines to fit the ` +
|
|
60
|
+
`${count(budget)} byte budget. ${listing.narrowing}`),
|
|
61
|
+
shown: bounded.shown,
|
|
62
|
+
total: bounded.total,
|
|
63
|
+
unit: "lines",
|
|
64
|
+
...(listing.elided ? { elided: true } : {}),
|
|
65
|
+
// Lines are what the reader can count; records are what is on
|
|
66
|
+
// disk. Naming both in one sentence replaced a correction
|
|
67
|
+
// appended after the fact, which contradicted the sentence above
|
|
68
|
+
// it and made the reader decide which to believe.
|
|
69
|
+
stored: { count: listing.records.length, unit: listing.unit },
|
|
70
|
+
});
|
|
71
|
+
return cited.text;
|
|
72
|
+
}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Where a session's stored payloads live, and when they stop
|
|
3
|
+
* living there.
|
|
4
|
+
*
|
|
5
|
+
* Keyed by process id, because that is the one identifier that is
|
|
6
|
+
* both available everywhere without being passed around and
|
|
7
|
+
* checkable from outside: a directory named for a process that no
|
|
8
|
+
* longer exists is abandoned, and no bookkeeping had to survive
|
|
9
|
+
* the crash to tell us so. Sessions that end cleanly delete their
|
|
10
|
+
* own directory; sessions that are killed leave one behind, and
|
|
11
|
+
* the next session to start reaps it.
|
|
12
|
+
*
|
|
13
|
+
* The alternative, reaping by age, cannot tell a dead session's
|
|
14
|
+
* payloads from a live session's, so it either deletes payloads
|
|
15
|
+
* somebody is still querying or keeps payloads nobody can.
|
|
16
|
+
*/
|
|
17
|
+
import { type ResultStore } from "./store.js";
|
|
18
|
+
/** Where every session's stored payloads are rooted. */
|
|
19
|
+
export declare const RESULT_ROOT: string;
|
|
20
|
+
/**
|
|
21
|
+
* How much disk one session's payloads may hold.
|
|
22
|
+
*
|
|
23
|
+
* Generous, because the point of storing is that the caller can
|
|
24
|
+
* come back for detail later in a long session, and a quota that
|
|
25
|
+
* evicts a page outline before it has been queried has cost the
|
|
26
|
+
* context it was meant to save.
|
|
27
|
+
*/
|
|
28
|
+
export declare const SESSION_QUOTA_BYTES: number;
|
|
29
|
+
/** This process's own payload directory. */
|
|
30
|
+
export declare function sessionResultDir(): string;
|
|
31
|
+
/**
|
|
32
|
+
* A store over this session's directory.
|
|
33
|
+
*
|
|
34
|
+
* Every family opens its own, because the store is its directory:
|
|
35
|
+
* two instances over one directory see the same payloads and
|
|
36
|
+
* enforce one quota between them. That is what lets one family
|
|
37
|
+
* cite a handle another can read without either importing the
|
|
38
|
+
* other, or a mutable instance being passed around a package that
|
|
39
|
+
* has no place to keep one.
|
|
40
|
+
*
|
|
41
|
+
* Not memoized here on purpose. Session lifetime belongs to the
|
|
42
|
+
* adapter, and an instance holds nothing worth reusing beyond
|
|
43
|
+
* the directory it names.
|
|
44
|
+
*
|
|
45
|
+
* Names the directory without creating it. Creating it here made
|
|
46
|
+
* opening a store a disk operation, and every family opens one
|
|
47
|
+
* before handing it to the code that knows how to survive a
|
|
48
|
+
* failed write: an unwritable temp directory threw straight out
|
|
49
|
+
* of nine call sites and took the whole tool call with it, past
|
|
50
|
+
* the one place that catches exactly this and answers anyway.
|
|
51
|
+
* The write itself still creates what it needs.
|
|
52
|
+
*/
|
|
53
|
+
export declare function openSessionStore(): ResultStore;
|
|
54
|
+
/** Whether a process is still running. */
|
|
55
|
+
export declare function isPidAlive(pid: number): boolean;
|
|
56
|
+
/**
|
|
57
|
+
* Remove payload directories no live process owns.
|
|
58
|
+
*
|
|
59
|
+
* The collaborators are parameters so a destructive sweep can be
|
|
60
|
+
* tested against a throwaway root rather than the real one.
|
|
61
|
+
*/
|
|
62
|
+
export declare function reapAbandonedResults(opts: {
|
|
63
|
+
root: string;
|
|
64
|
+
isPidAlive: (pid: number) => boolean;
|
|
65
|
+
}): void;
|
|
66
|
+
/** Remove this session's payload directory. */
|
|
67
|
+
export declare function cleanupSessionResults(): void;
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Where a session's stored payloads live, and when they stop
|
|
3
|
+
* living there.
|
|
4
|
+
*
|
|
5
|
+
* Keyed by process id, because that is the one identifier that is
|
|
6
|
+
* both available everywhere without being passed around and
|
|
7
|
+
* checkable from outside: a directory named for a process that no
|
|
8
|
+
* longer exists is abandoned, and no bookkeeping had to survive
|
|
9
|
+
* the crash to tell us so. Sessions that end cleanly delete their
|
|
10
|
+
* own directory; sessions that are killed leave one behind, and
|
|
11
|
+
* the next session to start reaps it.
|
|
12
|
+
*
|
|
13
|
+
* The alternative, reaping by age, cannot tell a dead session's
|
|
14
|
+
* payloads from a live session's, so it either deletes payloads
|
|
15
|
+
* somebody is still querying or keeps payloads nobody can.
|
|
16
|
+
*/
|
|
17
|
+
import * as fs from "node:fs";
|
|
18
|
+
import * as os from "node:os";
|
|
19
|
+
import * as path from "node:path";
|
|
20
|
+
import { createResultStore } from "./store.js";
|
|
21
|
+
/** Where every session's stored payloads are rooted. */
|
|
22
|
+
export const RESULT_ROOT = path.join(os.tmpdir(), "pi-tool-results");
|
|
23
|
+
// The directory's mode lives with the code that creates it, in
|
|
24
|
+
// spill.ts. Nothing here makes a directory any more.
|
|
25
|
+
/**
|
|
26
|
+
* How much disk one session's payloads may hold.
|
|
27
|
+
*
|
|
28
|
+
* Generous, because the point of storing is that the caller can
|
|
29
|
+
* come back for detail later in a long session, and a quota that
|
|
30
|
+
* evicts a page outline before it has been queried has cost the
|
|
31
|
+
* context it was meant to save.
|
|
32
|
+
*/
|
|
33
|
+
export const SESSION_QUOTA_BYTES = 256 * 1024 * 1024;
|
|
34
|
+
/** This process's own payload directory. */
|
|
35
|
+
export function sessionResultDir() {
|
|
36
|
+
return path.join(RESULT_ROOT, String(process.pid));
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* A store over this session's directory.
|
|
40
|
+
*
|
|
41
|
+
* Every family opens its own, because the store is its directory:
|
|
42
|
+
* two instances over one directory see the same payloads and
|
|
43
|
+
* enforce one quota between them. That is what lets one family
|
|
44
|
+
* cite a handle another can read without either importing the
|
|
45
|
+
* other, or a mutable instance being passed around a package that
|
|
46
|
+
* has no place to keep one.
|
|
47
|
+
*
|
|
48
|
+
* Not memoized here on purpose. Session lifetime belongs to the
|
|
49
|
+
* adapter, and an instance holds nothing worth reusing beyond
|
|
50
|
+
* the directory it names.
|
|
51
|
+
*
|
|
52
|
+
* Names the directory without creating it. Creating it here made
|
|
53
|
+
* opening a store a disk operation, and every family opens one
|
|
54
|
+
* before handing it to the code that knows how to survive a
|
|
55
|
+
* failed write: an unwritable temp directory threw straight out
|
|
56
|
+
* of nine call sites and took the whole tool call with it, past
|
|
57
|
+
* the one place that catches exactly this and answers anyway.
|
|
58
|
+
* The write itself still creates what it needs.
|
|
59
|
+
*/
|
|
60
|
+
export function openSessionStore() {
|
|
61
|
+
return createResultStore({
|
|
62
|
+
dir: sessionResultDir(),
|
|
63
|
+
maxBytes: SESSION_QUOTA_BYTES,
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
/** Whether a process is still running. */
|
|
67
|
+
export function isPidAlive(pid) {
|
|
68
|
+
try {
|
|
69
|
+
// Signal 0 tests for the process without touching it.
|
|
70
|
+
process.kill(pid, 0);
|
|
71
|
+
return true;
|
|
72
|
+
}
|
|
73
|
+
catch (err) {
|
|
74
|
+
// EPERM means it exists and belongs to somebody else, which is
|
|
75
|
+
// still alive as far as reaping is concerned.
|
|
76
|
+
return err.code === "EPERM";
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Remove payload directories no live process owns.
|
|
81
|
+
*
|
|
82
|
+
* The collaborators are parameters so a destructive sweep can be
|
|
83
|
+
* tested against a throwaway root rather than the real one.
|
|
84
|
+
*/
|
|
85
|
+
export function reapAbandonedResults(opts) {
|
|
86
|
+
let entries;
|
|
87
|
+
try {
|
|
88
|
+
entries = fs.readdirSync(opts.root, { withFileTypes: true });
|
|
89
|
+
}
|
|
90
|
+
catch {
|
|
91
|
+
// No root yet, so nothing was ever abandoned.
|
|
92
|
+
return;
|
|
93
|
+
}
|
|
94
|
+
for (const entry of entries) {
|
|
95
|
+
if (!entry.isDirectory())
|
|
96
|
+
continue;
|
|
97
|
+
const pid = Number(entry.name);
|
|
98
|
+
// Anything not named for a pid was not made by us; leaving it
|
|
99
|
+
// alone is cheaper than being wrong about whose it is.
|
|
100
|
+
if (!Number.isInteger(pid) || pid <= 0)
|
|
101
|
+
continue;
|
|
102
|
+
if (opts.isPidAlive(pid))
|
|
103
|
+
continue;
|
|
104
|
+
try {
|
|
105
|
+
fs.rmSync(path.join(opts.root, entry.name), {
|
|
106
|
+
recursive: true,
|
|
107
|
+
force: true,
|
|
108
|
+
});
|
|
109
|
+
}
|
|
110
|
+
catch {
|
|
111
|
+
// It vanished under us or will not delete; either way the next
|
|
112
|
+
// session will try again.
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
/** Remove this session's payload directory. */
|
|
117
|
+
export function cleanupSessionResults() {
|
|
118
|
+
try {
|
|
119
|
+
fs.rmSync(sessionResultDir(), { recursive: true, force: true });
|
|
120
|
+
}
|
|
121
|
+
catch {
|
|
122
|
+
// Nothing more can be done at shutdown, and the pid-keyed name
|
|
123
|
+
// means the next session's reaper will collect it.
|
|
124
|
+
}
|
|
125
|
+
}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Asking a stored payload a question.
|
|
3
|
+
*
|
|
4
|
+
* One query language for every tool that stores anything, because
|
|
5
|
+
* the cost of a query language is learning it, and that cost is
|
|
6
|
+
* paid once only if the language does not change per family.
|
|
7
|
+
* JSONPath is the choice: a language model already knows it, and
|
|
8
|
+
* filters mean a caller can find the records they want rather
|
|
9
|
+
* than paging through records they do not.
|
|
10
|
+
*
|
|
11
|
+
* Every answer is bounded twice. At most a fixed number of
|
|
12
|
+
* matches are serialized, and the serialized text passes back
|
|
13
|
+
* through the same size rule that sent the payload to disk in the
|
|
14
|
+
* first place, so a query broad enough to select everything
|
|
15
|
+
* cannot undo the storing. The total match count is always
|
|
16
|
+
* reported before that truncation, which means a deliberately
|
|
17
|
+
* broad expression is the cheapest way to answer "how many"
|
|
18
|
+
* without pulling a single whole record.
|
|
19
|
+
*
|
|
20
|
+
* The second of those bounds was documented here and never
|
|
21
|
+
* written, which is the worst of both: `$.rows[*]` over a stored
|
|
22
|
+
* listing came back larger than the payload the store had just
|
|
23
|
+
* taken out of context, and the sentence above said it could not.
|
|
24
|
+
*
|
|
25
|
+
* Nothing here throws. A handle that has expired, a payload that
|
|
26
|
+
* no longer parses and an expression with a typo are all ordinary
|
|
27
|
+
* events in a conversation, and each comes back as a note that
|
|
28
|
+
* says what to do differently.
|
|
29
|
+
*/
|
|
30
|
+
import { type ResultStore } from "./store.js";
|
|
31
|
+
/** A block of text an answer is made of. */
|
|
32
|
+
export interface TextBlock {
|
|
33
|
+
readonly type: "text";
|
|
34
|
+
readonly text: string;
|
|
35
|
+
}
|
|
36
|
+
/** Bounds on a query's answer. */
|
|
37
|
+
export interface QueryOptions {
|
|
38
|
+
/** Cap on the serialized answer, above which it is stored instead. */
|
|
39
|
+
limitBytes?: number;
|
|
40
|
+
/** Cap on how many matches are serialized. */
|
|
41
|
+
maxMatches?: number;
|
|
42
|
+
}
|
|
43
|
+
/** How many matches an answer carries when the caller says nothing. */
|
|
44
|
+
export declare const DEFAULT_MAX_MATCHES = 100;
|
|
45
|
+
/**
|
|
46
|
+
* How many bytes an answer spends before it is stored instead.
|
|
47
|
+
*
|
|
48
|
+
* The same figure a rendered listing spends, because it is the
|
|
49
|
+
* same question: how much of a collection goes in front of the
|
|
50
|
+
* model before the rest is put where it can be asked about.
|
|
51
|
+
*/
|
|
52
|
+
export declare const DEFAULT_ANSWER_BYTES = 8192;
|
|
53
|
+
/** What a query did, for a caller that wants to store the answer. */
|
|
54
|
+
export interface QueryAnswer {
|
|
55
|
+
readonly blocks: readonly TextBlock[];
|
|
56
|
+
/** Total matches before any cap, when the expression ran at all. */
|
|
57
|
+
readonly matches?: number;
|
|
58
|
+
/** The serialized matches, whatever their size. */
|
|
59
|
+
readonly json?: string;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Run a JSONPath expression against a stored payload.
|
|
63
|
+
*
|
|
64
|
+
* The answer opens with the total match count, so the number is
|
|
65
|
+
* never a casualty of the cap that follows it.
|
|
66
|
+
*/
|
|
67
|
+
export declare function queryStored(store: ResultStore, handle: string, expression: string, opts?: QueryOptions): QueryAnswer;
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Asking a stored payload a question.
|
|
3
|
+
*
|
|
4
|
+
* One query language for every tool that stores anything, because
|
|
5
|
+
* the cost of a query language is learning it, and that cost is
|
|
6
|
+
* paid once only if the language does not change per family.
|
|
7
|
+
* JSONPath is the choice: a language model already knows it, and
|
|
8
|
+
* filters mean a caller can find the records they want rather
|
|
9
|
+
* than paging through records they do not.
|
|
10
|
+
*
|
|
11
|
+
* Every answer is bounded twice. At most a fixed number of
|
|
12
|
+
* matches are serialized, and the serialized text passes back
|
|
13
|
+
* through the same size rule that sent the payload to disk in the
|
|
14
|
+
* first place, so a query broad enough to select everything
|
|
15
|
+
* cannot undo the storing. The total match count is always
|
|
16
|
+
* reported before that truncation, which means a deliberately
|
|
17
|
+
* broad expression is the cheapest way to answer "how many"
|
|
18
|
+
* without pulling a single whole record.
|
|
19
|
+
*
|
|
20
|
+
* The second of those bounds was documented here and never
|
|
21
|
+
* written, which is the worst of both: `$.rows[*]` over a stored
|
|
22
|
+
* listing came back larger than the payload the store had just
|
|
23
|
+
* taken out of context, and the sentence above said it could not.
|
|
24
|
+
*
|
|
25
|
+
* Nothing here throws. A handle that has expired, a payload that
|
|
26
|
+
* no longer parses and an expression with a typo are all ordinary
|
|
27
|
+
* events in a conversation, and each comes back as a note that
|
|
28
|
+
* says what to do differently.
|
|
29
|
+
*/
|
|
30
|
+
import { JSONPath } from "jsonpath-plus";
|
|
31
|
+
import { cite } from "./cite.js";
|
|
32
|
+
import { count } from "./counts.js";
|
|
33
|
+
import { LISTING_BUDGET_BYTES } from "./listing.js";
|
|
34
|
+
import { HandleExpiredError } from "./store.js";
|
|
35
|
+
import { withinLineBudget } from "./view.js";
|
|
36
|
+
/** How many matches an answer carries when the caller says nothing. */
|
|
37
|
+
export const DEFAULT_MAX_MATCHES = 100;
|
|
38
|
+
/**
|
|
39
|
+
* How many bytes an answer spends before it is stored instead.
|
|
40
|
+
*
|
|
41
|
+
* The same figure a rendered listing spends, because it is the
|
|
42
|
+
* same question: how much of a collection goes in front of the
|
|
43
|
+
* model before the rest is put where it can be asked about.
|
|
44
|
+
*/
|
|
45
|
+
export const DEFAULT_ANSWER_BYTES = LISTING_BUDGET_BYTES;
|
|
46
|
+
/** How much of a caller's own string is echoed back in a note. */
|
|
47
|
+
const MAX_EXPRESSION_ECHO = 200;
|
|
48
|
+
/**
|
|
49
|
+
* Run a JSONPath expression against a stored payload.
|
|
50
|
+
*
|
|
51
|
+
* The answer opens with the total match count, so the number is
|
|
52
|
+
* never a casualty of the cap that follows it.
|
|
53
|
+
*/
|
|
54
|
+
export function queryStored(store, handle, expression, opts = {}) {
|
|
55
|
+
let rawText;
|
|
56
|
+
try {
|
|
57
|
+
rawText = store.read(handle);
|
|
58
|
+
}
|
|
59
|
+
catch (err) {
|
|
60
|
+
if (err instanceof HandleExpiredError)
|
|
61
|
+
return note(err.message);
|
|
62
|
+
throw err;
|
|
63
|
+
}
|
|
64
|
+
let parsed;
|
|
65
|
+
try {
|
|
66
|
+
parsed = JSON.parse(rawText);
|
|
67
|
+
}
|
|
68
|
+
catch {
|
|
69
|
+
return note(`stored result for handle ${handle} is not valid JSON`);
|
|
70
|
+
}
|
|
71
|
+
let matches;
|
|
72
|
+
try {
|
|
73
|
+
matches = JSONPath({
|
|
74
|
+
path: expression,
|
|
75
|
+
json: parsed,
|
|
76
|
+
wrap: true,
|
|
77
|
+
// Filter expressions are the most useful verb in the language,
|
|
78
|
+
// so evaluation stays on. The expression comes from a model
|
|
79
|
+
// that can already run anything through bash, so this grants no
|
|
80
|
+
// capability it lacked; the catch below is about a typo, not a
|
|
81
|
+
// boundary.
|
|
82
|
+
eval: true,
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
catch (err) {
|
|
86
|
+
return note(`invalid JSONPath expression: ${err instanceof Error ? err.message : String(err)}. ` +
|
|
87
|
+
"If a field name contains dots it is a single literal key, so match " +
|
|
88
|
+
"it with bracket notation like @['a.b.c'] rather than dot access.");
|
|
89
|
+
}
|
|
90
|
+
if (matches.length === 0)
|
|
91
|
+
return note(`no matches for expression ${echo(expression)}. Field names are ` +
|
|
92
|
+
"case-sensitive; check the result summary for the exact names, and " +
|
|
93
|
+
"match a dotted key with bracket notation like @['a.b.c'].");
|
|
94
|
+
const maxMatches = Math.max(0, opts.maxMatches ?? DEFAULT_MAX_MATCHES);
|
|
95
|
+
const limited = matches.slice(0, maxMatches);
|
|
96
|
+
const header = limited.length < matches.length
|
|
97
|
+
? `${matches.length} matches; showing the first ${limited.length}.`
|
|
98
|
+
: `${matches.length} matches.`;
|
|
99
|
+
const json = JSON.stringify(limited, null, 2);
|
|
100
|
+
return {
|
|
101
|
+
blocks: [
|
|
102
|
+
{ type: "text", text: header },
|
|
103
|
+
{ type: "text", text: answerWithin(store, limited, json, opts) },
|
|
104
|
+
],
|
|
105
|
+
matches: matches.length,
|
|
106
|
+
json,
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* The serialized matches, cut to a budget and citable beyond it.
|
|
111
|
+
*
|
|
112
|
+
* The cut answer is stored under its own handle rather than
|
|
113
|
+
* pointing back at the original, because what the caller wants
|
|
114
|
+
* next is a narrower question about these matches, not about the
|
|
115
|
+
* payload they came from. Following a handle should move forward.
|
|
116
|
+
*/
|
|
117
|
+
function answerWithin(store, matches, json, opts) {
|
|
118
|
+
const budget = opts.limitBytes ?? DEFAULT_ANSWER_BYTES;
|
|
119
|
+
const bounded = withinLineBudget(json, budget);
|
|
120
|
+
if (bounded.cut === 0)
|
|
121
|
+
return bounded.text;
|
|
122
|
+
return cite(store, {
|
|
123
|
+
payload: matches,
|
|
124
|
+
view: `${bounded.text}\n\n` +
|
|
125
|
+
`Cut ${count(bounded.cut)} of ` +
|
|
126
|
+
`${count(bounded.total)} lines to fit the ` +
|
|
127
|
+
`${count(budget)} byte budget. Project fewer fields, ` +
|
|
128
|
+
"or filter before selecting.",
|
|
129
|
+
shown: bounded.shown,
|
|
130
|
+
total: bounded.total,
|
|
131
|
+
unit: "lines",
|
|
132
|
+
stored: { count: matches.length, unit: "matches" },
|
|
133
|
+
}).text;
|
|
134
|
+
}
|
|
135
|
+
/** A note about a query that could not run, itself bounded. */
|
|
136
|
+
function note(message) {
|
|
137
|
+
return { blocks: [{ type: "text", text: `[${echo(message)}]` }] };
|
|
138
|
+
}
|
|
139
|
+
/** Bound a caller's own string before echoing it back. */
|
|
140
|
+
function echo(text) {
|
|
141
|
+
return text.length > MAX_EXPRESSION_ECHO
|
|
142
|
+
? `${text.slice(0, MAX_EXPRESSION_ECHO)}...`
|
|
143
|
+
: text;
|
|
144
|
+
}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Putting a payload on disk so an answer does not have to carry
|
|
3
|
+
* it.
|
|
4
|
+
*
|
|
5
|
+
* A payload is named after its own content, which makes storing it
|
|
6
|
+
* twice free. That is not a micro-optimization: a caller who
|
|
7
|
+
* navigates, reads the page, clicks something and reads it again
|
|
8
|
+
* generates the same outline several times over, and the first
|
|
9
|
+
* version of this stored a separate megabyte for each of them
|
|
10
|
+
* under a separate handle. Naming by content means one file, one
|
|
11
|
+
* handle, and a handle that stays valid however many answers cite
|
|
12
|
+
* it.
|
|
13
|
+
*
|
|
14
|
+
* The write is exclusive rather than checked-then-created, because
|
|
15
|
+
* two tools answering at once is ordinary. With content
|
|
16
|
+
* addressing a collision is not a conflict: whoever lost the race
|
|
17
|
+
* wrote the same bytes, so the existing file is the correct answer.
|
|
18
|
+
*/
|
|
19
|
+
/** A stored payload, and whether it was already there. */
|
|
20
|
+
export interface SpilledPayload {
|
|
21
|
+
readonly path: string;
|
|
22
|
+
/** True when an identical payload was already stored. */
|
|
23
|
+
readonly reused: boolean;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Write text into a directory under a name derived from its
|
|
27
|
+
* content, and return where it went.
|
|
28
|
+
*
|
|
29
|
+
* The directory is created when missing and resolved through its
|
|
30
|
+
* real path, so a handle never depends on a symlink that later
|
|
31
|
+
* changes where it points.
|
|
32
|
+
*
|
|
33
|
+
* The bytes land under a temporary name and are moved into place,
|
|
34
|
+
* so the content-addressed name only ever holds a complete
|
|
35
|
+
* payload. Writing straight to it meant an interrupted write left
|
|
36
|
+
* the right name over the wrong bytes, and since the name is
|
|
37
|
+
* derived from the content, every later attempt to store the same
|
|
38
|
+
* thing took the name's existence as proof the content matched and
|
|
39
|
+
* handed back a handle to a truncated payload.
|
|
40
|
+
*/
|
|
41
|
+
export declare function spillText(text: string, dir: string): SpilledPayload;
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Putting a payload on disk so an answer does not have to carry
|
|
3
|
+
* it.
|
|
4
|
+
*
|
|
5
|
+
* A payload is named after its own content, which makes storing it
|
|
6
|
+
* twice free. That is not a micro-optimization: a caller who
|
|
7
|
+
* navigates, reads the page, clicks something and reads it again
|
|
8
|
+
* generates the same outline several times over, and the first
|
|
9
|
+
* version of this stored a separate megabyte for each of them
|
|
10
|
+
* under a separate handle. Naming by content means one file, one
|
|
11
|
+
* handle, and a handle that stays valid however many answers cite
|
|
12
|
+
* it.
|
|
13
|
+
*
|
|
14
|
+
* The write is exclusive rather than checked-then-created, because
|
|
15
|
+
* two tools answering at once is ordinary. With content
|
|
16
|
+
* addressing a collision is not a conflict: whoever lost the race
|
|
17
|
+
* wrote the same bytes, so the existing file is the correct answer.
|
|
18
|
+
*/
|
|
19
|
+
import * as crypto from "node:crypto";
|
|
20
|
+
import * as fs from "node:fs";
|
|
21
|
+
import * as path from "node:path";
|
|
22
|
+
/** Owner only, since a payload can hold anything the tool saw. */
|
|
23
|
+
const DIR_MODE = 0o700;
|
|
24
|
+
const FILE_MODE = 0o600;
|
|
25
|
+
/**
|
|
26
|
+
* How much of the digest names the file.
|
|
27
|
+
*
|
|
28
|
+
* Sixty-four bits, which for the number of payloads one session
|
|
29
|
+
* can produce makes an accidental collision far less likely than
|
|
30
|
+
* the disk lying about the write that stored it.
|
|
31
|
+
*/
|
|
32
|
+
const NAME_HEX_LENGTH = 16;
|
|
33
|
+
/**
|
|
34
|
+
* Write text into a directory under a name derived from its
|
|
35
|
+
* content, and return where it went.
|
|
36
|
+
*
|
|
37
|
+
* The directory is created when missing and resolved through its
|
|
38
|
+
* real path, so a handle never depends on a symlink that later
|
|
39
|
+
* changes where it points.
|
|
40
|
+
*
|
|
41
|
+
* The bytes land under a temporary name and are moved into place,
|
|
42
|
+
* so the content-addressed name only ever holds a complete
|
|
43
|
+
* payload. Writing straight to it meant an interrupted write left
|
|
44
|
+
* the right name over the wrong bytes, and since the name is
|
|
45
|
+
* derived from the content, every later attempt to store the same
|
|
46
|
+
* thing took the name's existence as proof the content matched and
|
|
47
|
+
* handed back a handle to a truncated payload.
|
|
48
|
+
*/
|
|
49
|
+
export function spillText(text, dir) {
|
|
50
|
+
fs.mkdirSync(dir, { recursive: true, mode: DIR_MODE });
|
|
51
|
+
const realDir = fs.realpathSync(dir);
|
|
52
|
+
const digest = crypto
|
|
53
|
+
.createHash("sha256")
|
|
54
|
+
.update(text, "utf-8")
|
|
55
|
+
.digest("hex")
|
|
56
|
+
.slice(0, NAME_HEX_LENGTH);
|
|
57
|
+
const target = path.join(realDir, `result-${digest}.json`);
|
|
58
|
+
const bytes = Buffer.from(text, "utf-8");
|
|
59
|
+
if (alreadyWhole(target, bytes.length)) {
|
|
60
|
+
// Touch it so the quota's oldest-first eviction treats it as
|
|
61
|
+
// freshly used rather than as the stalest payload in the
|
|
62
|
+
// directory, which is how a handle being cited again would
|
|
63
|
+
// otherwise get itself evicted.
|
|
64
|
+
try {
|
|
65
|
+
const now = new Date();
|
|
66
|
+
fs.utimesSync(target, now, now);
|
|
67
|
+
}
|
|
68
|
+
catch {
|
|
69
|
+
// The timestamp is a hint for eviction order, not correctness.
|
|
70
|
+
}
|
|
71
|
+
return { path: target, reused: true };
|
|
72
|
+
}
|
|
73
|
+
// A name nothing else will choose: the process, the moment and a
|
|
74
|
+
// counter, so two concurrent spills of the same payload cannot
|
|
75
|
+
// land on one temporary file.
|
|
76
|
+
const staging = path.join(realDir, `.${digest}.${process.pid}.${nextStagingId()}.part`);
|
|
77
|
+
try {
|
|
78
|
+
fs.writeFileSync(staging, bytes, { mode: FILE_MODE });
|
|
79
|
+
// Atomic within a directory, and it overwrites: a partial file
|
|
80
|
+
// left by an earlier crash is replaced by the complete one
|
|
81
|
+
// rather than being trusted forever.
|
|
82
|
+
fs.renameSync(staging, target);
|
|
83
|
+
}
|
|
84
|
+
catch (err) {
|
|
85
|
+
try {
|
|
86
|
+
fs.rmSync(staging, { force: true });
|
|
87
|
+
}
|
|
88
|
+
catch {
|
|
89
|
+
// Nothing more to do about it. The caller is about to be told
|
|
90
|
+
// the payload could not be stored, and debris in a temporary
|
|
91
|
+
// directory is the lesser problem.
|
|
92
|
+
}
|
|
93
|
+
throw err;
|
|
94
|
+
}
|
|
95
|
+
return { path: target, reused: false };
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Whether the payload is already there in full.
|
|
99
|
+
*
|
|
100
|
+
* Judged by length, because the name is a digest of the content:
|
|
101
|
+
* anything of the right length under the right name differs only
|
|
102
|
+
* by a hash collision, which content addressing already treats as
|
|
103
|
+
* less likely than the disk lying. A short file is the failure
|
|
104
|
+
* this catches, and truncation is what a torn write produces.
|
|
105
|
+
*/
|
|
106
|
+
function alreadyWhole(target, expected) {
|
|
107
|
+
try {
|
|
108
|
+
return fs.statSync(target).size === expected;
|
|
109
|
+
}
|
|
110
|
+
catch {
|
|
111
|
+
// Not there, or not readable. Either way it is about to be
|
|
112
|
+
// written.
|
|
113
|
+
return false;
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
/** Distinguishes two staging files written in the same millisecond. */
|
|
117
|
+
let stagingCounter = 0;
|
|
118
|
+
function nextStagingId() {
|
|
119
|
+
stagingCounter += 1;
|
|
120
|
+
return `${Date.now().toString(36)}${stagingCounter.toString(36)}`;
|
|
121
|
+
}
|