@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,221 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The durable record of which pi sessions are open, which quest each
|
|
3
|
+
* is on, and when each was last open.
|
|
4
|
+
*
|
|
5
|
+
* This module is pure: it shapes records and answers questions about
|
|
6
|
+
* them. Reading and writing them, probing whether a session is still
|
|
7
|
+
* alive and touching the heartbeat all live in the extension's
|
|
8
|
+
* wiring.
|
|
9
|
+
*/
|
|
10
|
+
import type { ProcessIdentity } from "./process-liveness.js";
|
|
11
|
+
/**
|
|
12
|
+
* The terminal surface a session ran in, as recorded.
|
|
13
|
+
*
|
|
14
|
+
* Leaner than a full `TerminalSessionHandle`, and deliberately the
|
|
15
|
+
* same shape the quest frontmatter already persists. The handle's
|
|
16
|
+
* `kind` is descriptive rather than probeable, and a reader
|
|
17
|
+
* reconstitutes it from the driver id, so storing it would only give
|
|
18
|
+
* two copies of one fact the chance to disagree.
|
|
19
|
+
*/
|
|
20
|
+
export interface RecordedTerminal {
|
|
21
|
+
driverId: string;
|
|
22
|
+
value: string;
|
|
23
|
+
scope?: string;
|
|
24
|
+
hostId?: string;
|
|
25
|
+
}
|
|
26
|
+
/** One pi session, as recorded by the process that owns it. */
|
|
27
|
+
export interface SessionRecord {
|
|
28
|
+
sessionId: string;
|
|
29
|
+
/** The pi process the session ran in; a tab's sessions share it. */
|
|
30
|
+
instanceId: string;
|
|
31
|
+
cwd: string;
|
|
32
|
+
/** The quest the session is on now, absent once it has unloaded. */
|
|
33
|
+
quest?: string;
|
|
34
|
+
/**
|
|
35
|
+
* Quests the session has since left, each against the moment it
|
|
36
|
+
* left. A quest reads its own entry here rather than the session's
|
|
37
|
+
* overall recency, so it dates a session by when it was last doing
|
|
38
|
+
* that quest's work.
|
|
39
|
+
*/
|
|
40
|
+
previousQuests?: Record<string, string>;
|
|
41
|
+
process?: ProcessIdentity;
|
|
42
|
+
terminal?: RecordedTerminal;
|
|
43
|
+
/**
|
|
44
|
+
* True when the registry adopted this session rather than opening
|
|
45
|
+
* it: a tab that was already running before the registry existed.
|
|
46
|
+
* Its own process has no shutdown hook, so nothing it does can
|
|
47
|
+
* stamp the record, and its disappearance is not evidence of a
|
|
48
|
+
* crash.
|
|
49
|
+
*/
|
|
50
|
+
adopted?: true;
|
|
51
|
+
openedAt: string;
|
|
52
|
+
closedAt?: string;
|
|
53
|
+
/** Why the session ended; absent while it is still running. */
|
|
54
|
+
endReason?: SessionEndReason;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* How a session ended. `quit` means the pi process exited and took
|
|
58
|
+
* its tab with it. `swapped` means the conversation was replaced
|
|
59
|
+
* inside a tab that is still on screen, which is what a reload, a
|
|
60
|
+
* session switch and a fork all do. `died` means no process recorded
|
|
61
|
+
* an ending at all and a later reader found it gone, which is what a
|
|
62
|
+
* crash looks like from the outside.
|
|
63
|
+
*/
|
|
64
|
+
/**
|
|
65
|
+
* Why a session's record stopped being open.
|
|
66
|
+
*
|
|
67
|
+
* `quit` and `swapped` are stamped by the session itself. `died` and
|
|
68
|
+
* `vanished` are written by a later reader that found the process
|
|
69
|
+
* gone, and the difference between them is whether anyone was ever in
|
|
70
|
+
* a position to see it close: a session that opened its own record
|
|
71
|
+
* had a shutdown hook and failing to use it means it was taken away,
|
|
72
|
+
* while a session the registry merely adopted never had one, so its
|
|
73
|
+
* disappearance says nothing about how it ended.
|
|
74
|
+
*/
|
|
75
|
+
export type SessionEndReason = "quit" | "swapped" | "died" | "vanished";
|
|
76
|
+
/** What a caller knows when a session first loads a quest. */
|
|
77
|
+
export interface OpenInput {
|
|
78
|
+
sessionId: string;
|
|
79
|
+
instanceId: string;
|
|
80
|
+
cwd: string;
|
|
81
|
+
questId?: string;
|
|
82
|
+
process?: ProcessIdentity;
|
|
83
|
+
terminal?: RecordedTerminal;
|
|
84
|
+
/** True when adopting a tab that was running before the registry. */
|
|
85
|
+
adopted?: true;
|
|
86
|
+
now: Date;
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Mint a record for a session that has just loaded a quest. Identity
|
|
90
|
+
* a session could not capture is left off the record entirely rather
|
|
91
|
+
* than stored empty, because the readers treat an absent dimension as
|
|
92
|
+
* "cannot say" and an empty one would read as a mismatch.
|
|
93
|
+
*/
|
|
94
|
+
export declare function openRecord(input: OpenInput): SessionRecord;
|
|
95
|
+
export declare function parseSessionRecord(value: unknown): SessionRecord | undefined;
|
|
96
|
+
/**
|
|
97
|
+
* Split records into those worth keeping and those old enough to
|
|
98
|
+
* forget. Only a session we can prove ended is ever forgotten: a
|
|
99
|
+
* record with no close stamp is either still running or crashed and
|
|
100
|
+
* not yet repaired, and dropping it would lose a tab that could still
|
|
101
|
+
* have been reopened. That makes the reader-side repair, which stamps
|
|
102
|
+
* a record whose process a probe found gone, the thing that lets this
|
|
103
|
+
* window ever apply.
|
|
104
|
+
*/
|
|
105
|
+
export declare function pruneRecords(records: readonly SessionRecord[], opts: {
|
|
106
|
+
now: Date;
|
|
107
|
+
retentionDays: number;
|
|
108
|
+
}): {
|
|
109
|
+
kept: SessionRecord[];
|
|
110
|
+
dropped: SessionRecord[];
|
|
111
|
+
};
|
|
112
|
+
/**
|
|
113
|
+
* Move a session to a different quest, or to none, stamping the quest
|
|
114
|
+
* it is leaving with the moment it left. Returning to a quest clears
|
|
115
|
+
* its old departure, since it is current again and the record should
|
|
116
|
+
* not claim it both is and was.
|
|
117
|
+
*/
|
|
118
|
+
export declare function switchQuest(record: SessionRecord, questId: string | undefined, now: Date): SessionRecord;
|
|
119
|
+
/**
|
|
120
|
+
* When a session was last open on one particular quest, or undefined
|
|
121
|
+
* when it was never on it.
|
|
122
|
+
*
|
|
123
|
+
* The quest it is on now is dated by the session itself, so a live
|
|
124
|
+
* session reads as open. A quest it has left is dated by the leaving,
|
|
125
|
+
* which is what stops a still-running session from making every quest
|
|
126
|
+
* it ever touched look current.
|
|
127
|
+
*/
|
|
128
|
+
export declare function lastOpenOnQuest(record: SessionRecord, questId: string, observation: RecordObservation, now: Date): LastOpen | undefined;
|
|
129
|
+
/** What a reader observed about a record when it looked. */
|
|
130
|
+
export interface RecordObservation {
|
|
131
|
+
/** Whether a probe found the session open right now. */
|
|
132
|
+
live: boolean;
|
|
133
|
+
/** When the record was last touched, as an ISO string. */
|
|
134
|
+
heartbeatAt?: string;
|
|
135
|
+
}
|
|
136
|
+
/** When a session was last open, and whether we can be exact. */
|
|
137
|
+
export interface LastOpen {
|
|
138
|
+
at: string;
|
|
139
|
+
exact: boolean;
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* When a session was last open.
|
|
143
|
+
*
|
|
144
|
+
* Three sources, in descending order of how much they can be
|
|
145
|
+
* trusted. A probe that found the session alive means it is open now.
|
|
146
|
+
* A close stamp is the moment its own process recorded it ending, and
|
|
147
|
+
* outranks the heartbeat because the record is touched as the process
|
|
148
|
+
* winds down, so an mtime a moment past the close is normal. Anything
|
|
149
|
+
* else died without saying so, and the last time we saw it alive is
|
|
150
|
+
* the best answer there is, flagged as approximate.
|
|
151
|
+
*
|
|
152
|
+
* A close a reader wrote after finding the process gone carries the
|
|
153
|
+
* same shape but not the same authority, so it reports approximate
|
|
154
|
+
* too: nobody watched that session end.
|
|
155
|
+
*
|
|
156
|
+
* Deliberately not a source: how recently the session's log was
|
|
157
|
+
* written. That measures when someone last typed, which is the thing
|
|
158
|
+
* this whole record exists to stop standing in for being open.
|
|
159
|
+
*/
|
|
160
|
+
export declare function lastOpenAt(record: SessionRecord, observation: RecordObservation, now: Date): LastOpen;
|
|
161
|
+
/**
|
|
162
|
+
* Stamp a record as ended. Closing an already-closed record leaves it
|
|
163
|
+
* alone: a late heartbeat or a second shutdown must not move the
|
|
164
|
+
* moment the session actually ended, which is the timestamp every
|
|
165
|
+
* recency ordering is built on.
|
|
166
|
+
*/
|
|
167
|
+
/**
|
|
168
|
+
* A runnable line per session, to be pasted into a shell.
|
|
169
|
+
*
|
|
170
|
+
* Everything interpolated is quoted, because all of it comes from
|
|
171
|
+
* disk: a working directory is whatever the filesystem allows, and a
|
|
172
|
+
* record can be hand-edited. A line the user is invited to paste is
|
|
173
|
+
* not the place to trust either.
|
|
174
|
+
*/
|
|
175
|
+
export declare function restoreRecipe(records: readonly SessionRecord[]): string[];
|
|
176
|
+
/**
|
|
177
|
+
* Wrap a value in single quotes for safe shell interpolation. An
|
|
178
|
+
* embedded single quote is closed, escaped and reopened (`'\''`), the
|
|
179
|
+
* standard POSIX idiom, so the value cannot break out of the quoting.
|
|
180
|
+
*/
|
|
181
|
+
export declare function shellSingleQuote(value: string): string;
|
|
182
|
+
/**
|
|
183
|
+
* The sessions worth offering back, most recently lost first.
|
|
184
|
+
*
|
|
185
|
+
* Only a session that ended without anyone asking qualifies. Quitting
|
|
186
|
+
* a tab is an instruction rather than an accident, and a swap
|
|
187
|
+
* replaced the conversation in a tab that is still on screen, so
|
|
188
|
+
* neither leaves anything to bring back. Offering those anyway is how
|
|
189
|
+
* restore came to propose tabs nobody had lost, which taught people
|
|
190
|
+
* to distrust the whole list.
|
|
191
|
+
*
|
|
192
|
+
* A session still in the open set is either running or waiting for a
|
|
193
|
+
* reader to notice it is not. Either way it is not yet known to be
|
|
194
|
+
* lost, and a reader that probes it settles the question before this
|
|
195
|
+
* is asked.
|
|
196
|
+
*/
|
|
197
|
+
export declare function restorable(records: readonly SessionRecord[]): SessionRecord[];
|
|
198
|
+
/**
|
|
199
|
+
* Put a closed record back in the open set, under the identity of the
|
|
200
|
+
* process that has resumed it.
|
|
201
|
+
*
|
|
202
|
+
* Restore offers back the sessions that died. One the user has
|
|
203
|
+
* already brought back has to stop being offered, and the only thing
|
|
204
|
+
* that says so is its record rejoining the open set.
|
|
205
|
+
*
|
|
206
|
+
* The new identity replaces the old rather than merging with it. The
|
|
207
|
+
* recorded pid belongs to a process that is gone, and after a reboot
|
|
208
|
+
* to whatever inherited the number, so probing it would answer about
|
|
209
|
+
* a stranger. Where the resuming process could not capture an
|
|
210
|
+
* identity the field is dropped for the same reason: absent reads as
|
|
211
|
+
* cannot say, which is true, while a stale value reads as fact.
|
|
212
|
+
*
|
|
213
|
+
* The opening moment stays put. Resuming continues a session rather
|
|
214
|
+
* than starting one.
|
|
215
|
+
*/
|
|
216
|
+
export declare function reopenRecord(record: SessionRecord, input: {
|
|
217
|
+
instanceId: string;
|
|
218
|
+
process?: ProcessIdentity;
|
|
219
|
+
terminal?: RecordedTerminal;
|
|
220
|
+
}): SessionRecord;
|
|
221
|
+
export declare function closeRecord(record: SessionRecord, reason: SessionEndReason, now: Date): SessionRecord;
|
|
@@ -0,0 +1,266 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The durable record of which pi sessions are open, which quest each
|
|
3
|
+
* is on, and when each was last open.
|
|
4
|
+
*
|
|
5
|
+
* This module is pure: it shapes records and answers questions about
|
|
6
|
+
* them. Reading and writing them, probing whether a session is still
|
|
7
|
+
* alive and touching the heartbeat all live in the extension's
|
|
8
|
+
* wiring.
|
|
9
|
+
*/
|
|
10
|
+
/**
|
|
11
|
+
* Mint a record for a session that has just loaded a quest. Identity
|
|
12
|
+
* a session could not capture is left off the record entirely rather
|
|
13
|
+
* than stored empty, because the readers treat an absent dimension as
|
|
14
|
+
* "cannot say" and an empty one would read as a mismatch.
|
|
15
|
+
*/
|
|
16
|
+
export function openRecord(input) {
|
|
17
|
+
return {
|
|
18
|
+
sessionId: input.sessionId,
|
|
19
|
+
instanceId: input.instanceId,
|
|
20
|
+
cwd: input.cwd,
|
|
21
|
+
...(input.questId ? { quest: input.questId } : {}),
|
|
22
|
+
...(input.process ? { process: input.process } : {}),
|
|
23
|
+
...(input.terminal ? { terminal: input.terminal } : {}),
|
|
24
|
+
...(input.adopted ? { adopted: input.adopted } : {}),
|
|
25
|
+
openedAt: input.now.toISOString(),
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
/** The end reasons a reader is willing to act on. */
|
|
29
|
+
const END_REASONS = ["quit", "swapped", "died", "vanished"];
|
|
30
|
+
/**
|
|
31
|
+
* Read a stored value back as a record, or refuse it.
|
|
32
|
+
*
|
|
33
|
+
* A record decides whether a tab is offered back to the user, so a
|
|
34
|
+
* file that has been hand-edited, half-written or produced by a newer
|
|
35
|
+
* version is skipped rather than half-believed. Refusing costs one
|
|
36
|
+
* forgotten session; trusting a malformed one can hide a recoverable
|
|
37
|
+
* tab or resurrect a closed one.
|
|
38
|
+
*/
|
|
39
|
+
/**
|
|
40
|
+
* What a session id may contain: the shape pi's own ids take, which
|
|
41
|
+
* is also the shape that is safe as a file name and as a shell word.
|
|
42
|
+
*/
|
|
43
|
+
const SAFE_SESSION_ID = /^[A-Za-z0-9._-]+$/;
|
|
44
|
+
export function parseSessionRecord(value) {
|
|
45
|
+
if (typeof value !== "object" || value === null)
|
|
46
|
+
return undefined;
|
|
47
|
+
const v = value;
|
|
48
|
+
const required = [v.sessionId, v.instanceId, v.cwd, v.openedAt];
|
|
49
|
+
if (!required.every((field) => typeof field === "string" && field !== "")) {
|
|
50
|
+
return undefined;
|
|
51
|
+
}
|
|
52
|
+
// Restore resumes a session by typing its id into a live shell, and
|
|
53
|
+
// a record is just a file, so anything that can write one could
|
|
54
|
+
// otherwise reach the terminal through it. Refuse here rather than
|
|
55
|
+
// escaping downstream: an id that is not an identifier is not a
|
|
56
|
+
// record, and one check at the door beats remembering to quote at
|
|
57
|
+
// every use. The same shape keeps the id usable as a file name.
|
|
58
|
+
if (!SAFE_SESSION_ID.test(v.sessionId))
|
|
59
|
+
return undefined;
|
|
60
|
+
if (v.adopted !== undefined && v.adopted !== true)
|
|
61
|
+
return undefined;
|
|
62
|
+
if (v.quest !== undefined && typeof v.quest !== "string")
|
|
63
|
+
return undefined;
|
|
64
|
+
if (v.closedAt !== undefined && typeof v.closedAt !== "string") {
|
|
65
|
+
return undefined;
|
|
66
|
+
}
|
|
67
|
+
if (v.endReason !== undefined &&
|
|
68
|
+
!END_REASONS.includes(v.endReason)) {
|
|
69
|
+
return undefined;
|
|
70
|
+
}
|
|
71
|
+
if (v.previousQuests !== undefined && !isStringMap(v.previousQuests)) {
|
|
72
|
+
return undefined;
|
|
73
|
+
}
|
|
74
|
+
return value;
|
|
75
|
+
}
|
|
76
|
+
/** Whether a value is a flat object of string values. */
|
|
77
|
+
function isStringMap(value) {
|
|
78
|
+
if (typeof value !== "object" || value === null || Array.isArray(value)) {
|
|
79
|
+
return false;
|
|
80
|
+
}
|
|
81
|
+
return Object.values(value).every((entry) => typeof entry === "string");
|
|
82
|
+
}
|
|
83
|
+
/** Milliseconds in a day, for the retention window. */
|
|
84
|
+
const DAY_MS = 24 * 60 * 60 * 1000;
|
|
85
|
+
/**
|
|
86
|
+
* Split records into those worth keeping and those old enough to
|
|
87
|
+
* forget. Only a session we can prove ended is ever forgotten: a
|
|
88
|
+
* record with no close stamp is either still running or crashed and
|
|
89
|
+
* not yet repaired, and dropping it would lose a tab that could still
|
|
90
|
+
* have been reopened. That makes the reader-side repair, which stamps
|
|
91
|
+
* a record whose process a probe found gone, the thing that lets this
|
|
92
|
+
* window ever apply.
|
|
93
|
+
*/
|
|
94
|
+
export function pruneRecords(records, opts) {
|
|
95
|
+
const cutoff = opts.now.getTime() - opts.retentionDays * DAY_MS;
|
|
96
|
+
const kept = [];
|
|
97
|
+
const dropped = [];
|
|
98
|
+
for (const record of records) {
|
|
99
|
+
const closed = record.closedAt ? Date.parse(record.closedAt) : undefined;
|
|
100
|
+
if (closed !== undefined && !Number.isNaN(closed) && closed < cutoff) {
|
|
101
|
+
dropped.push(record);
|
|
102
|
+
}
|
|
103
|
+
else {
|
|
104
|
+
kept.push(record);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
return { kept, dropped };
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Move a session to a different quest, or to none, stamping the quest
|
|
111
|
+
* it is leaving with the moment it left. Returning to a quest clears
|
|
112
|
+
* its old departure, since it is current again and the record should
|
|
113
|
+
* not claim it both is and was.
|
|
114
|
+
*/
|
|
115
|
+
export function switchQuest(record, questId, now) {
|
|
116
|
+
if (record.quest === questId)
|
|
117
|
+
return record;
|
|
118
|
+
const previous = { ...record.previousQuests };
|
|
119
|
+
if (record.quest)
|
|
120
|
+
previous[record.quest] = now.toISOString();
|
|
121
|
+
if (questId)
|
|
122
|
+
delete previous[questId];
|
|
123
|
+
const next = { ...record };
|
|
124
|
+
if (questId)
|
|
125
|
+
next.quest = questId;
|
|
126
|
+
else
|
|
127
|
+
delete next.quest;
|
|
128
|
+
if (Object.keys(previous).length > 0)
|
|
129
|
+
next.previousQuests = previous;
|
|
130
|
+
else
|
|
131
|
+
delete next.previousQuests;
|
|
132
|
+
return next;
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* When a session was last open on one particular quest, or undefined
|
|
136
|
+
* when it was never on it.
|
|
137
|
+
*
|
|
138
|
+
* The quest it is on now is dated by the session itself, so a live
|
|
139
|
+
* session reads as open. A quest it has left is dated by the leaving,
|
|
140
|
+
* which is what stops a still-running session from making every quest
|
|
141
|
+
* it ever touched look current.
|
|
142
|
+
*/
|
|
143
|
+
export function lastOpenOnQuest(record, questId, observation, now) {
|
|
144
|
+
if (record.quest === questId)
|
|
145
|
+
return lastOpenAt(record, observation, now);
|
|
146
|
+
const left = record.previousQuests?.[questId];
|
|
147
|
+
return left ? { at: left, exact: true } : undefined;
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* When a session was last open.
|
|
151
|
+
*
|
|
152
|
+
* Three sources, in descending order of how much they can be
|
|
153
|
+
* trusted. A probe that found the session alive means it is open now.
|
|
154
|
+
* A close stamp is the moment its own process recorded it ending, and
|
|
155
|
+
* outranks the heartbeat because the record is touched as the process
|
|
156
|
+
* winds down, so an mtime a moment past the close is normal. Anything
|
|
157
|
+
* else died without saying so, and the last time we saw it alive is
|
|
158
|
+
* the best answer there is, flagged as approximate.
|
|
159
|
+
*
|
|
160
|
+
* A close a reader wrote after finding the process gone carries the
|
|
161
|
+
* same shape but not the same authority, so it reports approximate
|
|
162
|
+
* too: nobody watched that session end.
|
|
163
|
+
*
|
|
164
|
+
* Deliberately not a source: how recently the session's log was
|
|
165
|
+
* written. That measures when someone last typed, which is the thing
|
|
166
|
+
* this whole record exists to stop standing in for being open.
|
|
167
|
+
*/
|
|
168
|
+
export function lastOpenAt(record, observation, now) {
|
|
169
|
+
if (observation.live)
|
|
170
|
+
return { at: now.toISOString(), exact: true };
|
|
171
|
+
if (record.closedAt) {
|
|
172
|
+
return { at: record.closedAt, exact: record.endReason !== "died" };
|
|
173
|
+
}
|
|
174
|
+
return { at: observation.heartbeatAt ?? record.openedAt, exact: false };
|
|
175
|
+
}
|
|
176
|
+
/**
|
|
177
|
+
* Stamp a record as ended. Closing an already-closed record leaves it
|
|
178
|
+
* alone: a late heartbeat or a second shutdown must not move the
|
|
179
|
+
* moment the session actually ended, which is the timestamp every
|
|
180
|
+
* recency ordering is built on.
|
|
181
|
+
*/
|
|
182
|
+
/**
|
|
183
|
+
* A runnable line per session, to be pasted into a shell.
|
|
184
|
+
*
|
|
185
|
+
* Everything interpolated is quoted, because all of it comes from
|
|
186
|
+
* disk: a working directory is whatever the filesystem allows, and a
|
|
187
|
+
* record can be hand-edited. A line the user is invited to paste is
|
|
188
|
+
* not the place to trust either.
|
|
189
|
+
*/
|
|
190
|
+
export function restoreRecipe(records) {
|
|
191
|
+
return records.map((record) => {
|
|
192
|
+
const quest = record.quest ? ` # ${commentSafe(record.quest)}` : "";
|
|
193
|
+
return `(cd ${shellSingleQuote(record.cwd)} && pi --session ${shellSingleQuote(record.sessionId)})${quest}`;
|
|
194
|
+
});
|
|
195
|
+
}
|
|
196
|
+
/**
|
|
197
|
+
* Wrap a value in single quotes for safe shell interpolation. An
|
|
198
|
+
* embedded single quote is closed, escaped and reopened (`'\''`), the
|
|
199
|
+
* standard POSIX idiom, so the value cannot break out of the quoting.
|
|
200
|
+
*/
|
|
201
|
+
export function shellSingleQuote(value) {
|
|
202
|
+
return `'${value.replaceAll("'", "'\\''")}'`;
|
|
203
|
+
}
|
|
204
|
+
/**
|
|
205
|
+
* Flatten a value for a trailing shell comment. A newline would end
|
|
206
|
+
* the comment and turn the rest of the recipe into a live command, so
|
|
207
|
+
* control characters are collapsed to a space.
|
|
208
|
+
*/
|
|
209
|
+
function commentSafe(value) {
|
|
210
|
+
return value.replace(/[\r\n]+/g, " ").trim();
|
|
211
|
+
}
|
|
212
|
+
/**
|
|
213
|
+
* The sessions worth offering back, most recently lost first.
|
|
214
|
+
*
|
|
215
|
+
* Only a session that ended without anyone asking qualifies. Quitting
|
|
216
|
+
* a tab is an instruction rather than an accident, and a swap
|
|
217
|
+
* replaced the conversation in a tab that is still on screen, so
|
|
218
|
+
* neither leaves anything to bring back. Offering those anyway is how
|
|
219
|
+
* restore came to propose tabs nobody had lost, which taught people
|
|
220
|
+
* to distrust the whole list.
|
|
221
|
+
*
|
|
222
|
+
* A session still in the open set is either running or waiting for a
|
|
223
|
+
* reader to notice it is not. Either way it is not yet known to be
|
|
224
|
+
* lost, and a reader that probes it settles the question before this
|
|
225
|
+
* is asked.
|
|
226
|
+
*/
|
|
227
|
+
export function restorable(records) {
|
|
228
|
+
return records
|
|
229
|
+
.filter((record) => record.endReason === "died" && record.closedAt)
|
|
230
|
+
.sort((a, b) => (b.closedAt ?? "").localeCompare(a.closedAt ?? ""));
|
|
231
|
+
}
|
|
232
|
+
/**
|
|
233
|
+
* Put a closed record back in the open set, under the identity of the
|
|
234
|
+
* process that has resumed it.
|
|
235
|
+
*
|
|
236
|
+
* Restore offers back the sessions that died. One the user has
|
|
237
|
+
* already brought back has to stop being offered, and the only thing
|
|
238
|
+
* that says so is its record rejoining the open set.
|
|
239
|
+
*
|
|
240
|
+
* The new identity replaces the old rather than merging with it. The
|
|
241
|
+
* recorded pid belongs to a process that is gone, and after a reboot
|
|
242
|
+
* to whatever inherited the number, so probing it would answer about
|
|
243
|
+
* a stranger. Where the resuming process could not capture an
|
|
244
|
+
* identity the field is dropped for the same reason: absent reads as
|
|
245
|
+
* cannot say, which is true, while a stale value reads as fact.
|
|
246
|
+
*
|
|
247
|
+
* The opening moment stays put. Resuming continues a session rather
|
|
248
|
+
* than starting one.
|
|
249
|
+
*/
|
|
250
|
+
export function reopenRecord(record, input) {
|
|
251
|
+
// `adopted` goes with the rest: a session being resumed is running
|
|
252
|
+
// a process that keeps this registry, so from here it has a
|
|
253
|
+
// shutdown hook and owns its own ending.
|
|
254
|
+
const { closedAt, endReason, process, terminal, adopted, ...rest } = record;
|
|
255
|
+
return {
|
|
256
|
+
...rest,
|
|
257
|
+
instanceId: input.instanceId,
|
|
258
|
+
...(input.process ? { process: input.process } : {}),
|
|
259
|
+
...(input.terminal ? { terminal: input.terminal } : {}),
|
|
260
|
+
};
|
|
261
|
+
}
|
|
262
|
+
export function closeRecord(record, reason, now) {
|
|
263
|
+
if (record.closedAt)
|
|
264
|
+
return record;
|
|
265
|
+
return { ...record, closedAt: now.toISOString(), endReason: reason };
|
|
266
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Quest status liveness, in one place so every reader agrees on what
|
|
3
|
+
* "sealed" means. A sealed quest (concluded or retired) is finished:
|
|
4
|
+
* it sorts after live work, is excluded from reorders, and drops its
|
|
5
|
+
* live priority on the seal cascade.
|
|
6
|
+
*/
|
|
7
|
+
/** True when the status marks a finished quest (concluded or retired). */
|
|
8
|
+
export declare function isSealedStatus(status: string | undefined): boolean;
|
|
9
|
+
/** True when the quest is still live (any status that is not sealed). */
|
|
10
|
+
export declare function isLiveStatus(status: string | undefined): boolean;
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Quest status liveness, in one place so every reader agrees on what
|
|
3
|
+
* "sealed" means. A sealed quest (concluded or retired) is finished:
|
|
4
|
+
* it sorts after live work, is excluded from reorders, and drops its
|
|
5
|
+
* live priority on the seal cascade.
|
|
6
|
+
*/
|
|
7
|
+
const SEALED_STATUSES = new Set(["concluded", "retired"]);
|
|
8
|
+
/** True when the status marks a finished quest (concluded or retired). */
|
|
9
|
+
export function isSealedStatus(status) {
|
|
10
|
+
return status !== undefined && SEALED_STATUSES.has(status);
|
|
11
|
+
}
|
|
12
|
+
/** True when the quest is still live (any status that is not sealed). */
|
|
13
|
+
export function isLiveStatus(status) {
|
|
14
|
+
return !isSealedStatus(status);
|
|
15
|
+
}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A durable journal of applied structural edits (reparents and
|
|
3
|
+
* bulk status changes). Each entry records the old and new value
|
|
4
|
+
* per quest so an operation can be reversed. The journal is a
|
|
5
|
+
* JSONL file at the quests root; the most recent line is the
|
|
6
|
+
* newest operation.
|
|
7
|
+
*/
|
|
8
|
+
/**
|
|
9
|
+
* A field a mutation can change, journal and reverse. Widened past
|
|
10
|
+
* the original parent-and-status pair so every quest field mutation
|
|
11
|
+
* is reversible; `stage` covers document mutations journalled the
|
|
12
|
+
* same way.
|
|
13
|
+
*/
|
|
14
|
+
export type MutableField = "parent" | "status" | "priority" | "rank" | "kind" | "stage";
|
|
15
|
+
/** One quest's before-and-after for a single field. */
|
|
16
|
+
export interface JournalChange {
|
|
17
|
+
id: string;
|
|
18
|
+
field: MutableField;
|
|
19
|
+
old: string | null;
|
|
20
|
+
new: string | null;
|
|
21
|
+
}
|
|
22
|
+
/** A recorded structural operation. */
|
|
23
|
+
export interface JournalEntry {
|
|
24
|
+
ts: string;
|
|
25
|
+
op: string;
|
|
26
|
+
changes: JournalChange[];
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Append an applied operation to the journal, under the same
|
|
30
|
+
* per-root advisory lock the README writers use, so a concurrent
|
|
31
|
+
* record and undo in another process cannot interleave.
|
|
32
|
+
*/
|
|
33
|
+
export declare function recordStructuralOp(questsRoot: string, op: string, changes: JournalChange[]): void;
|
|
34
|
+
/** The most recent recorded operation, or undefined when empty. */
|
|
35
|
+
export declare function lastStructuralOp(questsRoot: string): JournalEntry | undefined;
|
|
36
|
+
/**
|
|
37
|
+
* Remove the most recent recorded operation. The read-modify-write
|
|
38
|
+
* runs under the per-root lock and rewrites through an atomic
|
|
39
|
+
* rename, so it cannot truncate a concurrent append or lose an op.
|
|
40
|
+
*/
|
|
41
|
+
export declare function dropLastStructuralOp(questsRoot: string): void;
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A durable journal of applied structural edits (reparents and
|
|
3
|
+
* bulk status changes). Each entry records the old and new value
|
|
4
|
+
* per quest so an operation can be reversed. The journal is a
|
|
5
|
+
* JSONL file at the quests root; the most recent line is the
|
|
6
|
+
* newest operation.
|
|
7
|
+
*/
|
|
8
|
+
import { appendFileSync, readFileSync } from "node:fs";
|
|
9
|
+
import { join } from "node:path";
|
|
10
|
+
import { atomicWriteFile, withQuestLock } from "./io.js";
|
|
11
|
+
function journalPath(questsRoot) {
|
|
12
|
+
return join(questsRoot, ".structural-journal.jsonl");
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Append an applied operation to the journal, under the same
|
|
16
|
+
* per-root advisory lock the README writers use, so a concurrent
|
|
17
|
+
* record and undo in another process cannot interleave.
|
|
18
|
+
*/
|
|
19
|
+
export function recordStructuralOp(questsRoot, op, changes) {
|
|
20
|
+
const entry = { ts: new Date().toISOString(), op, changes };
|
|
21
|
+
withQuestLock(questsRoot, () => {
|
|
22
|
+
appendFileSync(journalPath(questsRoot), `${JSON.stringify(entry)}\n`, "utf8");
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
function readEntries(questsRoot) {
|
|
26
|
+
let text;
|
|
27
|
+
try {
|
|
28
|
+
text = readFileSync(journalPath(questsRoot), "utf8");
|
|
29
|
+
}
|
|
30
|
+
catch {
|
|
31
|
+
// No journal yet: nothing has been recorded.
|
|
32
|
+
return [];
|
|
33
|
+
}
|
|
34
|
+
const entries = [];
|
|
35
|
+
for (const line of text.split("\n")) {
|
|
36
|
+
const trimmed = line.trim();
|
|
37
|
+
if (!trimmed)
|
|
38
|
+
continue;
|
|
39
|
+
try {
|
|
40
|
+
entries.push(JSON.parse(trimmed));
|
|
41
|
+
}
|
|
42
|
+
catch {
|
|
43
|
+
// Skip a corrupt line rather than wedging undo.
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
return entries;
|
|
47
|
+
}
|
|
48
|
+
/** The most recent recorded operation, or undefined when empty. */
|
|
49
|
+
export function lastStructuralOp(questsRoot) {
|
|
50
|
+
const entries = readEntries(questsRoot);
|
|
51
|
+
return entries[entries.length - 1];
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Remove the most recent recorded operation. The read-modify-write
|
|
55
|
+
* runs under the per-root lock and rewrites through an atomic
|
|
56
|
+
* rename, so it cannot truncate a concurrent append or lose an op.
|
|
57
|
+
*/
|
|
58
|
+
export function dropLastStructuralOp(questsRoot) {
|
|
59
|
+
withQuestLock(questsRoot, () => {
|
|
60
|
+
const entries = readEntries(questsRoot);
|
|
61
|
+
if (entries.length === 0)
|
|
62
|
+
return;
|
|
63
|
+
entries.pop();
|
|
64
|
+
const body = entries.map((e) => JSON.stringify(e)).join("\n");
|
|
65
|
+
atomicWriteFile(journalPath(questsRoot), body.length > 0 ? `${body}\n` : "");
|
|
66
|
+
});
|
|
67
|
+
}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Structural edits to the quest tree: reparenting and bulk
|
|
3
|
+
* status changes. The planners here are pure: they read an
|
|
4
|
+
* in-memory index and compute what would change, validating
|
|
5
|
+
* scope and refusing cycles, so a caller can preview before it
|
|
6
|
+
* writes and report exactly what moved.
|
|
7
|
+
*/
|
|
8
|
+
import type { QuestIndex } from "./discovery.js";
|
|
9
|
+
/** A single parent change produced by {@link planReparent}. */
|
|
10
|
+
export interface ReparentChange {
|
|
11
|
+
id: string;
|
|
12
|
+
oldParent: string | null;
|
|
13
|
+
newParent: string | null;
|
|
14
|
+
}
|
|
15
|
+
/** The outcome of planning a reparent: moves plus refusals. */
|
|
16
|
+
export interface ReparentPlan {
|
|
17
|
+
changes: ReparentChange[];
|
|
18
|
+
errors: string[];
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Plan the parent changes for `targetIds` against `newParent`
|
|
22
|
+
* without touching disk. No-op moves are dropped; missing
|
|
23
|
+
* quests, a missing new parent, self-parenting and cycle-forming
|
|
24
|
+
* moves are reported in `errors`.
|
|
25
|
+
*/
|
|
26
|
+
export declare function planReparent(index: QuestIndex, targetIds: string[], newParent: string | null): ReparentPlan;
|
|
27
|
+
/** A single status change produced by {@link planStatusChange}. */
|
|
28
|
+
export interface StatusChange {
|
|
29
|
+
id: string;
|
|
30
|
+
oldStatus: string;
|
|
31
|
+
newStatus: string;
|
|
32
|
+
}
|
|
33
|
+
/** The outcome of planning a bulk status change. */
|
|
34
|
+
export interface StatusChangePlan {
|
|
35
|
+
changes: StatusChange[];
|
|
36
|
+
errors: string[];
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Plan the status changes for `targetIds` to `newStatus` without
|
|
40
|
+
* touching disk. Quests already at the target status are dropped;
|
|
41
|
+
* missing quests are reported in `errors`.
|
|
42
|
+
*/
|
|
43
|
+
export declare function planStatusChange(index: QuestIndex, targetIds: string[], newStatus: string): StatusChangePlan;
|