@jitsusama/agentic-harness.core 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +52 -0
- package/dist/advisor/charter.d.ts +14 -0
- package/dist/advisor/charter.js +48 -0
- package/dist/advisor/findings.d.ts +43 -0
- package/dist/advisor/findings.js +82 -0
- package/dist/advisor/index.d.ts +24 -0
- package/dist/advisor/index.js +23 -0
- package/dist/advisor/settings.d.ts +16 -0
- package/dist/advisor/settings.js +30 -0
- package/dist/advisor/substantive.d.ts +14 -0
- package/dist/advisor/substantive.js +33 -0
- package/dist/advisor/tools.d.ts +38 -0
- package/dist/advisor/tools.js +202 -0
- package/dist/attribution/commit-hook.d.ts +53 -0
- package/dist/attribution/commit-hook.js +133 -0
- package/dist/attribution/gh-footer.d.ts +27 -0
- package/dist/attribution/gh-footer.js +80 -0
- package/dist/attribution/index.d.ts +11 -0
- package/dist/attribution/index.js +11 -0
- package/dist/attribution/model-name.d.ts +11 -0
- package/dist/attribution/model-name.js +26 -0
- package/dist/bin/attribution.d.ts +36 -0
- package/dist/bin/attribution.js +82 -0
- package/dist/bin/cli.d.ts +14 -0
- package/dist/bin/cli.js +236 -0
- package/dist/bin/gate-deps.d.ts +23 -0
- package/dist/bin/gate-deps.js +61 -0
- package/dist/bin/guardians.d.ts +51 -0
- package/dist/bin/guardians.js +174 -0
- package/dist/bin/memory.d.ts +16 -0
- package/dist/bin/memory.js +81 -0
- package/dist/bin/notes.d.ts +30 -0
- package/dist/bin/notes.js +67 -0
- package/dist/bin/process-exec.d.ts +14 -0
- package/dist/bin/process-exec.js +31 -0
- package/dist/bin/quest.d.ts +38 -0
- package/dist/bin/quest.js +187 -0
- package/dist/bin/slack-auth.d.ts +49 -0
- package/dist/bin/slack-auth.js +107 -0
- package/dist/clock/index.d.ts +46 -0
- package/dist/clock/index.js +72 -0
- package/dist/command/cwd.d.ts +21 -0
- package/dist/command/cwd.js +60 -0
- package/dist/command/edit.d.ts +14 -0
- package/dist/command/edit.js +22 -0
- package/dist/command/flags.d.ts +29 -0
- package/dist/command/flags.js +111 -0
- package/dist/command/index.d.ts +16 -0
- package/dist/command/index.js +12 -0
- package/dist/command/tokenize.d.ts +7 -0
- package/dist/command/tokenize.js +315 -0
- package/dist/command/types.d.ts +66 -0
- package/dist/command/types.js +9 -0
- package/dist/completion/index.d.ts +17 -0
- package/dist/completion/index.js +16 -0
- package/dist/completion/investigate.d.ts +63 -0
- package/dist/completion/investigate.js +198 -0
- package/dist/completion/resolve.d.ts +29 -0
- package/dist/completion/resolve.js +42 -0
- package/dist/completion/side.d.ts +51 -0
- package/dist/completion/side.js +93 -0
- package/dist/completion/types.d.ts +84 -0
- package/dist/completion/types.js +14 -0
- package/dist/exec/exec.d.ts +38 -0
- package/dist/exec/exec.js +51 -0
- package/dist/exec/index.d.ts +8 -0
- package/dist/exec/index.js +8 -0
- package/dist/gate/decision.d.ts +52 -0
- package/dist/gate/decision.js +68 -0
- package/dist/gate/deps.d.ts +14 -0
- package/dist/gate/deps.js +1 -0
- package/dist/gate/index.d.ts +2 -0
- package/dist/gate/index.js +1 -0
- package/dist/git-cli/index.d.ts +47 -0
- package/dist/git-cli/index.js +127 -0
- package/dist/github-cli/command-spec.d.ts +14 -0
- package/dist/github-cli/command-spec.js +18 -0
- package/dist/github-cli/index.d.ts +71 -0
- package/dist/github-cli/index.js +188 -0
- package/dist/google/apis/calendar.d.ts +64 -0
- package/dist/google/apis/calendar.js +297 -0
- package/dist/google/apis/docs.d.ts +29 -0
- package/dist/google/apis/docs.js +154 -0
- package/dist/google/apis/drive.d.ts +46 -0
- package/dist/google/apis/drive.js +189 -0
- package/dist/google/apis/gmail.d.ts +67 -0
- package/dist/google/apis/gmail.js +374 -0
- package/dist/google/apis/index.d.ts +10 -0
- package/dist/google/apis/index.js +10 -0
- package/dist/google/apis/sheets.d.ts +16 -0
- package/dist/google/apis/sheets.js +54 -0
- package/dist/google/apis/slides.d.ts +16 -0
- package/dist/google/apis/slides.js +40 -0
- package/dist/google/auth/browser.d.ts +5 -0
- package/dist/google/auth/browser.js +27 -0
- package/dist/google/auth/credentials.d.ts +26 -0
- package/dist/google/auth/credentials.js +69 -0
- package/dist/google/auth/errors.d.ts +15 -0
- package/dist/google/auth/errors.js +26 -0
- package/dist/google/auth/index.d.ts +12 -0
- package/dist/google/auth/index.js +12 -0
- package/dist/google/auth/oauth-app.d.ts +15 -0
- package/dist/google/auth/oauth-app.js +20 -0
- package/dist/google/auth/oauth.d.ts +46 -0
- package/dist/google/auth/oauth.js +146 -0
- package/dist/google/auth/server.d.ts +13 -0
- package/dist/google/auth/server.js +70 -0
- package/dist/google/auth/setup-instructions.d.ts +16 -0
- package/dist/google/auth/setup-instructions.js +24 -0
- package/dist/google/auth/store.d.ts +19 -0
- package/dist/google/auth/store.js +27 -0
- package/dist/google/index.d.ts +13 -0
- package/dist/google/index.js +12 -0
- package/dist/google/paths.d.ts +17 -0
- package/dist/google/paths.js +28 -0
- package/dist/google/renderers/calendar.d.ts +23 -0
- package/dist/google/renderers/calendar.js +312 -0
- package/dist/google/renderers/drive.d.ts +31 -0
- package/dist/google/renderers/drive.js +214 -0
- package/dist/google/renderers/email.d.ts +16 -0
- package/dist/google/renderers/email.js +130 -0
- package/dist/google/renderers/index.d.ts +8 -0
- package/dist/google/renderers/index.js +8 -0
- package/dist/google/types.d.ts +143 -0
- package/dist/google/types.js +27 -0
- package/dist/governance/distill.d.ts +31 -0
- package/dist/governance/distill.js +78 -0
- package/dist/governance/index.d.ts +11 -0
- package/dist/governance/index.js +10 -0
- package/dist/governance/render.d.ts +13 -0
- package/dist/governance/render.js +23 -0
- package/dist/governance/store.d.ts +32 -0
- package/dist/governance/store.js +102 -0
- package/dist/governance/types.d.ts +19 -0
- package/dist/governance/types.js +9 -0
- package/dist/guardian/index.d.ts +7 -0
- package/dist/guardian/index.js +7 -0
- package/dist/guardian/types.d.ts +37 -0
- package/dist/guardian/types.js +12 -0
- package/dist/internal/github/cli.d.ts +40 -0
- package/dist/internal/github/cli.js +102 -0
- package/dist/internal/guardian/commit-file.d.ts +7 -0
- package/dist/internal/guardian/commit-file.js +36 -0
- package/dist/internal/guardian/commit-format.d.ts +35 -0
- package/dist/internal/guardian/commit-format.js +63 -0
- package/dist/internal/guardian/commit-shell.d.ts +38 -0
- package/dist/internal/guardian/commit-shell.js +134 -0
- package/dist/internal/guardian/history-gate.d.ts +41 -0
- package/dist/internal/guardian/history-gate.js +76 -0
- package/dist/internal/guardian/prose-gate.d.ts +31 -0
- package/dist/internal/guardian/prose-gate.js +50 -0
- package/dist/internal/guardian/redirect-gate.d.ts +41 -0
- package/dist/internal/guardian/redirect-gate.js +114 -0
- package/dist/internal/guardian/section-gate.d.ts +20 -0
- package/dist/internal/guardian/section-gate.js +36 -0
- package/dist/internal/guardian/title-gate.d.ts +20 -0
- package/dist/internal/guardian/title-gate.js +36 -0
- package/dist/internal/json-array.d.ts +11 -0
- package/dist/internal/json-array.js +40 -0
- package/dist/internal/lsp/registry.d.ts +12 -0
- package/dist/internal/lsp/registry.js +16 -0
- package/dist/internal/notes/discovery.d.ts +59 -0
- package/dist/internal/notes/discovery.js +91 -0
- package/dist/internal/notes/frontmatter.d.ts +52 -0
- package/dist/internal/notes/frontmatter.js +163 -0
- package/dist/internal/notes/id.d.ts +42 -0
- package/dist/internal/notes/id.js +80 -0
- package/dist/internal/notes/io.d.ts +25 -0
- package/dist/internal/notes/io.js +51 -0
- package/dist/internal/notes/sanitize.d.ts +19 -0
- package/dist/internal/notes/sanitize.js +35 -0
- package/dist/internal/process-global.d.ts +20 -0
- package/dist/internal/process-global.js +28 -0
- package/dist/internal/quest/alias-index.d.ts +61 -0
- package/dist/internal/quest/alias-index.js +69 -0
- package/dist/internal/quest/append-journey.d.ts +22 -0
- package/dist/internal/quest/append-journey.js +63 -0
- package/dist/internal/quest/bash-write.d.ts +49 -0
- package/dist/internal/quest/bash-write.js +208 -0
- package/dist/internal/quest/dates.d.ts +14 -0
- package/dist/internal/quest/dates.js +20 -0
- package/dist/internal/quest/discovery.d.ts +96 -0
- package/dist/internal/quest/discovery.js +354 -0
- package/dist/internal/quest/fields.d.ts +37 -0
- package/dist/internal/quest/fields.js +94 -0
- package/dist/internal/quest/frontmatter.d.ts +88 -0
- package/dist/internal/quest/frontmatter.js +630 -0
- package/dist/internal/quest/git-signals.d.ts +53 -0
- package/dist/internal/quest/git-signals.js +192 -0
- package/dist/internal/quest/id.d.ts +50 -0
- package/dist/internal/quest/id.js +116 -0
- package/dist/internal/quest/io.d.ts +54 -0
- package/dist/internal/quest/io.js +233 -0
- package/dist/internal/quest/mentions.d.ts +45 -0
- package/dist/internal/quest/mentions.js +70 -0
- package/dist/internal/quest/mutate.d.ts +38 -0
- package/dist/internal/quest/mutate.js +83 -0
- package/dist/internal/quest/process-liveness.d.ts +98 -0
- package/dist/internal/quest/process-liveness.js +216 -0
- package/dist/internal/quest/quest-doc.d.ts +116 -0
- package/dist/internal/quest/quest-doc.js +239 -0
- package/dist/internal/quest/ranking.d.ts +48 -0
- package/dist/internal/quest/ranking.js +114 -0
- package/dist/internal/quest/reopen.d.ts +65 -0
- package/dist/internal/quest/reopen.js +113 -0
- package/dist/internal/quest/resolve-cwd.d.ts +32 -0
- package/dist/internal/quest/resolve-cwd.js +89 -0
- package/dist/internal/quest/sanitize.d.ts +42 -0
- package/dist/internal/quest/sanitize.js +69 -0
- package/dist/internal/quest/scaffold.d.ts +59 -0
- package/dist/internal/quest/scaffold.js +169 -0
- package/dist/internal/quest/scratch.d.ts +27 -0
- package/dist/internal/quest/scratch.js +106 -0
- package/dist/internal/quest/session-liveness.d.ts +125 -0
- package/dist/internal/quest/session-liveness.js +386 -0
- package/dist/internal/quest/session-ownership.d.ts +22 -0
- package/dist/internal/quest/session-ownership.js +100 -0
- package/dist/internal/quest/session-registry.d.ts +221 -0
- package/dist/internal/quest/session-registry.js +266 -0
- package/dist/internal/quest/status.d.ts +10 -0
- package/dist/internal/quest/status.js +15 -0
- package/dist/internal/quest/structural-journal.d.ts +41 -0
- package/dist/internal/quest/structural-journal.js +67 -0
- package/dist/internal/quest/structural.d.ts +43 -0
- package/dist/internal/quest/structural.js +77 -0
- package/dist/internal/quest/toc.d.ts +28 -0
- package/dist/internal/quest/toc.js +90 -0
- package/dist/internal/quest/trees.d.ts +53 -0
- package/dist/internal/quest/trees.js +145 -0
- package/dist/internal/quest/url-fetchers.d.ts +50 -0
- package/dist/internal/quest/url-fetchers.js +97 -0
- package/dist/internal/quest/write-classifier.d.ts +46 -0
- package/dist/internal/quest/write-classifier.js +59 -0
- package/dist/internal/refs/builtins.d.ts +32 -0
- package/dist/internal/refs/builtins.js +179 -0
- package/dist/internal/refs/registry.d.ts +25 -0
- package/dist/internal/refs/registry.js +42 -0
- package/dist/internal/registry/global-symbol-registry.d.ts +37 -0
- package/dist/internal/registry/global-symbol-registry.js +55 -0
- package/dist/internal/review/registry.d.ts +12 -0
- package/dist/internal/review/registry.js +16 -0
- package/dist/internal/sqlite/db.d.ts +16 -0
- package/dist/internal/sqlite/db.js +26 -0
- package/dist/internal/terminal/builtins.d.ts +8 -0
- package/dist/internal/terminal/builtins.js +14 -0
- package/dist/internal/terminal/drivers/fallback.d.ts +8 -0
- package/dist/internal/terminal/drivers/fallback.js +31 -0
- package/dist/internal/terminal/drivers/shared.d.ts +39 -0
- package/dist/internal/terminal/drivers/shared.js +51 -0
- package/dist/internal/terminal/drivers/tmux.d.ts +14 -0
- package/dist/internal/terminal/drivers/tmux.js +88 -0
- package/dist/internal/terminal/drivers/wezterm.d.ts +35 -0
- package/dist/internal/terminal/drivers/wezterm.js +175 -0
- package/dist/internal/terminal/registry.d.ts +12 -0
- package/dist/internal/terminal/registry.js +16 -0
- package/dist/internal/tree/builtins.d.ts +8 -0
- package/dist/internal/tree/builtins.js +10 -0
- package/dist/internal/tree/providers/git-worktree.d.ts +20 -0
- package/dist/internal/tree/providers/git-worktree.js +279 -0
- package/dist/internal/tree/registry.d.ts +12 -0
- package/dist/internal/tree/registry.js +16 -0
- package/dist/lsp/config.d.ts +77 -0
- package/dist/lsp/config.js +154 -0
- package/dist/lsp/external.d.ts +13 -0
- package/dist/lsp/external.js +52 -0
- package/dist/lsp/format.d.ts +11 -0
- package/dist/lsp/format.js +54 -0
- package/dist/lsp/index.d.ts +17 -0
- package/dist/lsp/index.js +16 -0
- package/dist/lsp/offsets.d.ts +22 -0
- package/dist/lsp/offsets.js +51 -0
- package/dist/lsp/registry.d.ts +28 -0
- package/dist/lsp/registry.js +45 -0
- package/dist/lsp/standalone/backend.d.ts +42 -0
- package/dist/lsp/standalone/backend.js +150 -0
- package/dist/lsp/standalone/document.d.ts +45 -0
- package/dist/lsp/standalone/document.js +81 -0
- package/dist/lsp/standalone/server.d.ts +84 -0
- package/dist/lsp/standalone/server.js +521 -0
- package/dist/lsp/types.d.ts +119 -0
- package/dist/lsp/types.js +13 -0
- package/dist/memory/db.d.ts +15 -0
- package/dist/memory/db.js +25 -0
- package/dist/memory/index.d.ts +12 -0
- package/dist/memory/index.js +11 -0
- package/dist/memory/paths.d.ts +19 -0
- package/dist/memory/paths.js +33 -0
- package/dist/memory/scope.d.ts +14 -0
- package/dist/memory/scope.js +22 -0
- package/dist/memory/store.d.ts +12 -0
- package/dist/memory/store.js +146 -0
- package/dist/memory/types.d.ts +80 -0
- package/dist/memory/types.js +6 -0
- package/dist/notes/types.d.ts +50 -0
- package/dist/notes/types.js +23 -0
- package/dist/notes/verbs/create.d.ts +5 -0
- package/dist/notes/verbs/create.js +55 -0
- package/dist/notes/verbs/mutate.d.ts +8 -0
- package/dist/notes/verbs/mutate.js +152 -0
- package/dist/notes/verbs/queries.d.ts +15 -0
- package/dist/notes/verbs/queries.js +116 -0
- package/dist/notes/verbs/reindex.d.ts +12 -0
- package/dist/notes/verbs/reindex.js +35 -0
- package/dist/notes/verbs/shared.d.ts +37 -0
- package/dist/notes/verbs/shared.js +29 -0
- package/dist/observability/index.d.ts +13 -0
- package/dist/observability/index.js +12 -0
- package/dist/observability/recorder.d.ts +50 -0
- package/dist/observability/recorder.js +77 -0
- package/dist/observability/store.d.ts +22 -0
- package/dist/observability/store.js +213 -0
- package/dist/observability/types.d.ts +82 -0
- package/dist/observability/types.js +1 -0
- package/dist/process/index.d.ts +9 -0
- package/dist/process/index.js +9 -0
- package/dist/process/process.d.ts +95 -0
- package/dist/process/process.js +153 -0
- package/dist/prose/block.d.ts +9 -0
- package/dist/prose/block.js +43 -0
- package/dist/prose/detect.d.ts +50 -0
- package/dist/prose/detect.js +217 -0
- package/dist/prose/gate.d.ts +14 -0
- package/dist/prose/gate.js +21 -0
- package/dist/prose/index.d.ts +4 -0
- package/dist/prose/index.js +4 -0
- package/dist/prose/wrap.d.ts +9 -0
- package/dist/prose/wrap.js +47 -0
- package/dist/quest/actions.d.ts +20 -0
- package/dist/quest/actions.js +107 -0
- package/dist/quest/config.d.ts +79 -0
- package/dist/quest/config.js +83 -0
- package/dist/quest/index.d.ts +29 -0
- package/dist/quest/index.js +28 -0
- package/dist/quest/lifecycle.d.ts +365 -0
- package/dist/quest/lifecycle.js +900 -0
- package/dist/quest/lookup.d.ts +243 -0
- package/dist/quest/lookup.js +496 -0
- package/dist/quest/machine.d.ts +48 -0
- package/dist/quest/machine.js +96 -0
- package/dist/quest/render-rows.d.ts +166 -0
- package/dist/quest/render-rows.js +214 -0
- package/dist/quest/state.d.ts +111 -0
- package/dist/quest/state.js +46 -0
- package/dist/quest/types.d.ts +224 -0
- package/dist/quest/types.js +10 -0
- package/dist/quest/verbs/alias.d.ts +9 -0
- package/dist/quest/verbs/alias.js +129 -0
- package/dist/quest/verbs/lifecycle.d.ts +36 -0
- package/dist/quest/verbs/lifecycle.js +407 -0
- package/dist/quest/verbs/queries.d.ts +24 -0
- package/dist/quest/verbs/queries.js +241 -0
- package/dist/quest/verbs/reorder.d.ts +15 -0
- package/dist/quest/verbs/reorder.js +85 -0
- package/dist/quest/verbs/shared.d.ts +63 -0
- package/dist/quest/verbs/shared.js +35 -0
- package/dist/quest/verbs/stage.d.ts +39 -0
- package/dist/quest/verbs/stage.js +506 -0
- package/dist/quest/verbs/structural.d.ts +23 -0
- package/dist/quest/verbs/structural.js +310 -0
- package/dist/quest/verbs/tree-ops.d.ts +20 -0
- package/dist/quest/verbs/tree-ops.js +289 -0
- package/dist/refs/index.d.ts +13 -0
- package/dist/refs/index.js +12 -0
- package/dist/refs/lookup.d.ts +53 -0
- package/dist/refs/lookup.js +102 -0
- package/dist/refs/register.d.ts +34 -0
- package/dist/refs/register.js +44 -0
- package/dist/refs/types.d.ts +81 -0
- package/dist/refs/types.js +17 -0
- package/dist/remote/index.d.ts +9 -0
- package/dist/remote/index.js +9 -0
- package/dist/remote/name.d.ts +22 -0
- package/dist/remote/name.js +30 -0
- package/dist/result/cite.d.ts +84 -0
- package/dist/result/cite.js +127 -0
- package/dist/result/counts.d.ts +15 -0
- package/dist/result/counts.js +17 -0
- package/dist/result/details.d.ts +61 -0
- package/dist/result/details.js +121 -0
- package/dist/result/digest.d.ts +37 -0
- package/dist/result/digest.js +227 -0
- package/dist/result/follow.d.ts +29 -0
- package/dist/result/follow.js +37 -0
- package/dist/result/index.d.ts +26 -0
- package/dist/result/index.js +26 -0
- package/dist/result/listing.d.ts +62 -0
- package/dist/result/listing.js +72 -0
- package/dist/result/location.d.ts +67 -0
- package/dist/result/location.js +125 -0
- package/dist/result/query.d.ts +67 -0
- package/dist/result/query.js +144 -0
- package/dist/result/spill.d.ts +41 -0
- package/dist/result/spill.js +121 -0
- package/dist/result/store.d.ts +83 -0
- package/dist/result/store.js +214 -0
- package/dist/result/view.d.ts +31 -0
- package/dist/result/view.js +38 -0
- package/dist/review/anchor.d.ts +84 -0
- package/dist/review/anchor.js +89 -0
- package/dist/review/ask/agents.d.ts +80 -0
- package/dist/review/ask/agents.js +296 -0
- package/dist/review/ask/anchorable.d.ts +35 -0
- package/dist/review/ask/anchorable.js +76 -0
- package/dist/review/ask/answer.d.ts +54 -0
- package/dist/review/ask/answer.js +209 -0
- package/dist/review/ask/audit.d.ts +71 -0
- package/dist/review/ask/audit.js +158 -0
- package/dist/review/ask/collect.d.ts +41 -0
- package/dist/review/ask/collect.js +82 -0
- package/dist/review/ask/council.d.ts +290 -0
- package/dist/review/ask/council.js +386 -0
- package/dist/review/ask/critique.d.ts +69 -0
- package/dist/review/ask/critique.js +157 -0
- package/dist/review/ask/harvest.d.ts +119 -0
- package/dist/review/ask/harvest.js +409 -0
- package/dist/review/ask/identity.d.ts +93 -0
- package/dist/review/ask/identity.js +134 -0
- package/dist/review/ask/judge.d.ts +37 -0
- package/dist/review/ask/judge.js +140 -0
- package/dist/review/ask/persona.d.ts +84 -0
- package/dist/review/ask/persona.js +127 -0
- package/dist/review/ask/progress.d.ts +117 -0
- package/dist/review/ask/progress.js +137 -0
- package/dist/review/ask/prompt.d.ts +131 -0
- package/dist/review/ask/prompt.js +242 -0
- package/dist/review/ask/roster.d.ts +94 -0
- package/dist/review/ask/roster.js +338 -0
- package/dist/review/ask/run.d.ts +435 -0
- package/dist/review/ask/run.js +340 -0
- package/dist/review/ask/span.d.ts +70 -0
- package/dist/review/ask/span.js +166 -0
- package/dist/review/ask/stack-round.d.ts +66 -0
- package/dist/review/ask/stack-round.js +125 -0
- package/dist/review/ask/start.d.ts +48 -0
- package/dist/review/ask/start.js +118 -0
- package/dist/review/ask/store.d.ts +83 -0
- package/dist/review/ask/store.js +226 -0
- package/dist/review/ask/wire.d.ts +89 -0
- package/dist/review/ask/wire.js +204 -0
- package/dist/review/attach.d.ts +161 -0
- package/dist/review/attach.js +357 -0
- package/dist/review/authoring.d.ts +84 -0
- package/dist/review/authoring.js +203 -0
- package/dist/review/backed.d.ts +90 -0
- package/dist/review/backed.js +168 -0
- package/dist/review/bind.d.ts +75 -0
- package/dist/review/bind.js +223 -0
- package/dist/review/budget.d.ts +133 -0
- package/dist/review/budget.js +278 -0
- package/dist/review/capabilities.d.ts +217 -0
- package/dist/review/capabilities.js +46 -0
- package/dist/review/change.d.ts +155 -0
- package/dist/review/change.js +15 -0
- package/dist/review/checks.d.ts +56 -0
- package/dist/review/checks.js +11 -0
- package/dist/review/config.d.ts +71 -0
- package/dist/review/config.js +125 -0
- package/dist/review/conventions.d.ts +35 -0
- package/dist/review/conventions.js +58 -0
- package/dist/review/conversation.d.ts +98 -0
- package/dist/review/conversation.js +16 -0
- package/dist/review/decided.d.ts +58 -0
- package/dist/review/decided.js +67 -0
- package/dist/review/diff.d.ts +116 -0
- package/dist/review/diff.js +237 -0
- package/dist/review/draft/continuation.d.ts +23 -0
- package/dist/review/draft/continuation.js +32 -0
- package/dist/review/draft/fanout.d.ts +57 -0
- package/dist/review/draft/fanout.js +46 -0
- package/dist/review/draft/handle.d.ts +55 -0
- package/dist/review/draft/handle.js +110 -0
- package/dist/review/draft/plan.d.ts +112 -0
- package/dist/review/draft/plan.js +343 -0
- package/dist/review/draft/publish.d.ts +38 -0
- package/dist/review/draft/publish.js +118 -0
- package/dist/review/draft/render.d.ts +32 -0
- package/dist/review/draft/render.js +100 -0
- package/dist/review/draft/state.d.ts +98 -0
- package/dist/review/draft/state.js +83 -0
- package/dist/review/draft/store.d.ts +33 -0
- package/dist/review/draft/store.js +100 -0
- package/dist/review/elsewhere.d.ts +27 -0
- package/dist/review/elsewhere.js +39 -0
- package/dist/review/engine.d.ts +106 -0
- package/dist/review/engine.js +243 -0
- package/dist/review/events.d.ts +59 -0
- package/dist/review/events.js +35 -0
- package/dist/review/failed.d.ts +46 -0
- package/dist/review/failed.js +56 -0
- package/dist/review/finding.d.ts +81 -0
- package/dist/review/finding.js +85 -0
- package/dist/review/fix.d.ts +147 -0
- package/dist/review/fix.js +175 -0
- package/dist/review/followup.d.ts +84 -0
- package/dist/review/followup.js +123 -0
- package/dist/review/index.d.ts +134 -0
- package/dist/review/index.js +80 -0
- package/dist/review/keys.d.ts +23 -0
- package/dist/review/keys.js +40 -0
- package/dist/review/landing.d.ts +37 -0
- package/dist/review/landing.js +68 -0
- package/dist/review/lenses.d.ts +132 -0
- package/dist/review/lenses.js +430 -0
- package/dist/review/propose-from.d.ts +76 -0
- package/dist/review/propose-from.js +86 -0
- package/dist/review/provider.d.ts +306 -0
- package/dist/review/provider.js +16 -0
- package/dist/review/providers/git/index.d.ts +23 -0
- package/dist/review/providers/git/index.js +214 -0
- package/dist/review/providers/github/authoring.d.ts +22 -0
- package/dist/review/providers/github/authoring.js +350 -0
- package/dist/review/providers/github/claims.d.ts +49 -0
- package/dist/review/providers/github/claims.js +136 -0
- package/dist/review/providers/github/conversation.d.ts +18 -0
- package/dist/review/providers/github/conversation.js +455 -0
- package/dist/review/providers/github/fields.d.ts +30 -0
- package/dist/review/providers/github/fields.js +47 -0
- package/dist/review/providers/github/index.d.ts +15 -0
- package/dist/review/providers/github/index.js +110 -0
- package/dist/review/providers/github/proposals.d.ts +14 -0
- package/dist/review/providers/github/proposals.js +298 -0
- package/dist/review/providers/github/queue.d.ts +46 -0
- package/dist/review/providers/github/queue.js +122 -0
- package/dist/review/providers/github/stacking.d.ts +20 -0
- package/dist/review/providers/github/stacking.js +107 -0
- package/dist/review/queue.d.ts +43 -0
- package/dist/review/queue.js +56 -0
- package/dist/review/reactable.d.ts +93 -0
- package/dist/review/reactable.js +140 -0
- package/dist/review/register.d.ts +52 -0
- package/dist/review/register.js +53 -0
- package/dist/review/resolve.d.ts +58 -0
- package/dist/review/resolve.js +150 -0
- package/dist/review/retarget.d.ts +73 -0
- package/dist/review/retarget.js +82 -0
- package/dist/review/revisited.d.ts +77 -0
- package/dist/review/revisited.js +121 -0
- package/dist/review/stack.d.ts +110 -0
- package/dist/review/stack.js +52 -0
- package/dist/sections/block.d.ts +9 -0
- package/dist/sections/block.js +42 -0
- package/dist/sections/detect.d.ts +31 -0
- package/dist/sections/detect.js +67 -0
- package/dist/sections/gate.d.ts +21 -0
- package/dist/sections/gate.js +22 -0
- package/dist/sections/index.d.ts +5 -0
- package/dist/sections/index.js +5 -0
- package/dist/sections/sanctioned.d.ts +13 -0
- package/dist/sections/sanctioned.js +21 -0
- package/dist/shell/index.d.ts +8 -0
- package/dist/shell/index.js +8 -0
- package/dist/shell/parse.d.ts +125 -0
- package/dist/shell/parse.js +298 -0
- package/dist/slack/api/channels.d.ts +12 -0
- package/dist/slack/api/channels.js +28 -0
- package/dist/slack/api/client.d.ts +94 -0
- package/dist/slack/api/client.js +272 -0
- package/dist/slack/api/files.d.ts +95 -0
- package/dist/slack/api/files.js +223 -0
- package/dist/slack/api/index.d.ts +11 -0
- package/dist/slack/api/index.js +11 -0
- package/dist/slack/api/messages.d.ts +98 -0
- package/dist/slack/api/messages.js +292 -0
- package/dist/slack/api/reactions.d.ts +47 -0
- package/dist/slack/api/reactions.js +50 -0
- package/dist/slack/api/resolve-conversations.d.ts +43 -0
- package/dist/slack/api/resolve-conversations.js +130 -0
- package/dist/slack/api/resolve-messages.d.ts +29 -0
- package/dist/slack/api/resolve-messages.js +93 -0
- package/dist/slack/api/resolve-users.d.ts +27 -0
- package/dist/slack/api/resolve-users.js +73 -0
- package/dist/slack/api/search.d.ts +86 -0
- package/dist/slack/api/search.js +186 -0
- package/dist/slack/api/users.d.ts +12 -0
- package/dist/slack/api/users.js +33 -0
- package/dist/slack/auth/browser-extract.d.ts +33 -0
- package/dist/slack/auth/browser-extract.js +201 -0
- package/dist/slack/auth/browser.d.ts +5 -0
- package/dist/slack/auth/browser.js +25 -0
- package/dist/slack/auth/credentials.d.ts +14 -0
- package/dist/slack/auth/credentials.js +24 -0
- package/dist/slack/auth/errors.d.ts +9 -0
- package/dist/slack/auth/errors.js +19 -0
- package/dist/slack/auth/extract.d.ts +23 -0
- package/dist/slack/auth/extract.js +44 -0
- package/dist/slack/auth/index.d.ts +12 -0
- package/dist/slack/auth/index.js +11 -0
- package/dist/slack/auth/oauth-app.d.ts +11 -0
- package/dist/slack/auth/oauth-app.js +20 -0
- package/dist/slack/auth/oauth.d.ts +31 -0
- package/dist/slack/auth/oauth.js +82 -0
- package/dist/slack/auth/server.d.ts +14 -0
- package/dist/slack/auth/server.js +75 -0
- package/dist/slack/auth/store.d.ts +17 -0
- package/dist/slack/auth/store.js +27 -0
- package/dist/slack/block-message.d.ts +9 -0
- package/dist/slack/block-message.js +30 -0
- package/dist/slack/blocks.d.ts +94 -0
- package/dist/slack/blocks.js +765 -0
- package/dist/slack/content-gate.d.ts +12 -0
- package/dist/slack/content-gate.js +22 -0
- package/dist/slack/detect.d.ts +31 -0
- package/dist/slack/detect.js +125 -0
- package/dist/slack/index.d.ts +18 -0
- package/dist/slack/index.js +17 -0
- package/dist/slack/paths.d.ts +28 -0
- package/dist/slack/paths.js +46 -0
- package/dist/slack/renderers/channel.d.ts +6 -0
- package/dist/slack/renderers/channel.js +27 -0
- package/dist/slack/renderers/index.d.ts +9 -0
- package/dist/slack/renderers/index.js +9 -0
- package/dist/slack/renderers/message.d.ts +21 -0
- package/dist/slack/renderers/message.js +214 -0
- package/dist/slack/renderers/reactions.d.ts +8 -0
- package/dist/slack/renderers/reactions.js +43 -0
- package/dist/slack/renderers/search.d.ts +6 -0
- package/dist/slack/renderers/search.js +39 -0
- package/dist/slack/renderers/user.d.ts +6 -0
- package/dist/slack/renderers/user.js +32 -0
- package/dist/slack/resolvers/cache.d.ts +29 -0
- package/dist/slack/resolvers/cache.js +70 -0
- package/dist/slack/resolvers/conversation-cache.d.ts +42 -0
- package/dist/slack/resolvers/conversation-cache.js +128 -0
- package/dist/slack/resolvers/conversation.d.ts +44 -0
- package/dist/slack/resolvers/conversation.js +229 -0
- package/dist/slack/resolvers/index.d.ts +8 -0
- package/dist/slack/resolvers/index.js +8 -0
- package/dist/slack/resolvers/target.d.ts +19 -0
- package/dist/slack/resolvers/target.js +45 -0
- package/dist/slack/resolvers/url.d.ts +20 -0
- package/dist/slack/resolvers/url.js +22 -0
- package/dist/slack/resolvers/user.d.ts +54 -0
- package/dist/slack/resolvers/user.js +134 -0
- package/dist/slack/types.d.ts +180 -0
- package/dist/slack/types.js +13 -0
- package/dist/tdd/attest.d.ts +21 -0
- package/dist/tdd/attest.js +21 -0
- package/dist/tdd/discipline.d.ts +11 -0
- package/dist/tdd/discipline.js +28 -0
- package/dist/tdd/index.d.ts +14 -0
- package/dist/tdd/index.js +13 -0
- package/dist/tdd/machine.d.ts +48 -0
- package/dist/tdd/machine.js +139 -0
- package/dist/tdd/presentation.d.ts +34 -0
- package/dist/tdd/presentation.js +38 -0
- package/dist/tdd/queries.d.ts +10 -0
- package/dist/tdd/queries.js +22 -0
- package/dist/terminal/index.d.ts +12 -0
- package/dist/terminal/index.js +11 -0
- package/dist/terminal/register.d.ts +21 -0
- package/dist/terminal/register.js +31 -0
- package/dist/terminal/resolve.d.ts +63 -0
- package/dist/terminal/resolve.js +117 -0
- package/dist/terminal/types.d.ts +134 -0
- package/dist/terminal/types.js +19 -0
- package/dist/thinking/index.d.ts +20 -0
- package/dist/thinking/index.js +27 -0
- package/dist/title/block.d.ts +9 -0
- package/dist/title/block.js +32 -0
- package/dist/title/detect.d.ts +25 -0
- package/dist/title/detect.js +154 -0
- package/dist/title/gate.d.ts +19 -0
- package/dist/title/gate.js +21 -0
- package/dist/title/index.d.ts +3 -0
- package/dist/title/index.js +3 -0
- package/dist/tree/index.d.ts +18 -0
- package/dist/tree/index.js +17 -0
- package/dist/tree/register.d.ts +21 -0
- package/dist/tree/register.js +31 -0
- package/dist/tree/resolve.d.ts +20 -0
- package/dist/tree/resolve.js +31 -0
- package/dist/tree/types.d.ts +83 -0
- package/dist/tree/types.js +12 -0
- package/dist/ui/count.d.ts +29 -0
- package/dist/ui/count.js +35 -0
- package/dist/ui/path.d.ts +25 -0
- package/dist/ui/path.js +40 -0
- package/dist/verify/index.d.ts +17 -0
- package/dist/verify/index.js +14 -0
- package/dist/verify/project.d.ts +21 -0
- package/dist/verify/project.js +49 -0
- package/dist/verify/resolve.d.ts +26 -0
- package/dist/verify/resolve.js +27 -0
- package/dist/verify/run.d.ts +31 -0
- package/dist/verify/run.js +145 -0
- package/dist/web/a11y/announcements.d.ts +67 -0
- package/dist/web/a11y/announcements.js +116 -0
- package/dist/web/a11y/budget.d.ts +75 -0
- package/dist/web/a11y/budget.js +97 -0
- package/dist/web/a11y/focus.d.ts +37 -0
- package/dist/web/a11y/focus.js +106 -0
- package/dist/web/a11y/index.d.ts +19 -0
- package/dist/web/a11y/index.js +25 -0
- package/dist/web/a11y/naming.d.ts +23 -0
- package/dist/web/a11y/naming.js +55 -0
- package/dist/web/a11y/outline.d.ts +23 -0
- package/dist/web/a11y/outline.js +42 -0
- package/dist/web/a11y/reading.d.ts +12 -0
- package/dist/web/a11y/reading.js +101 -0
- package/dist/web/a11y/scope.d.ts +23 -0
- package/dist/web/a11y/scope.js +99 -0
- package/dist/web/a11y/states.d.ts +22 -0
- package/dist/web/a11y/states.js +53 -0
- package/dist/web/a11y/tree.d.ts +124 -0
- package/dist/web/a11y/tree.js +269 -0
- package/dist/web/a11y/walk.d.ts +225 -0
- package/dist/web/a11y/walk.js +568 -0
- package/dist/web/a11y/walkprobe.d.ts +44 -0
- package/dist/web/a11y/walkprobe.js +365 -0
- package/dist/web/audit/axe.d.ts +219 -0
- package/dist/web/audit/axe.js +322 -0
- package/dist/web/audit/behind.d.ts +63 -0
- package/dist/web/audit/behind.js +142 -0
- package/dist/web/audit/capture.d.ts +43 -0
- package/dist/web/audit/capture.js +185 -0
- package/dist/web/audit/colour.d.ts +85 -0
- package/dist/web/audit/colour.js +189 -0
- package/dist/web/audit/contrast.d.ts +74 -0
- package/dist/web/audit/contrast.js +104 -0
- package/dist/web/audit/health.d.ts +27 -0
- package/dist/web/audit/health.js +57 -0
- package/dist/web/audit/index.d.ts +22 -0
- package/dist/web/audit/index.js +22 -0
- package/dist/web/audit/pair.d.ts +55 -0
- package/dist/web/audit/pair.js +157 -0
- package/dist/web/audit/probe.d.ts +31 -0
- package/dist/web/audit/probe.js +189 -0
- package/dist/web/audit/report.d.ts +22 -0
- package/dist/web/audit/report.js +250 -0
- package/dist/web/audit/structure.d.ts +126 -0
- package/dist/web/audit/structure.js +595 -0
- package/dist/web/audit/sweep.d.ts +66 -0
- package/dist/web/audit/sweep.js +117 -0
- package/dist/web/audit/target.d.ts +89 -0
- package/dist/web/audit/target.js +168 -0
- package/dist/web/audit/verdict.d.ts +48 -0
- package/dist/web/audit/verdict.js +52 -0
- package/dist/web/audit/visual.d.ts +161 -0
- package/dist/web/audit/visual.js +297 -0
- package/dist/web/browser.d.ts +213 -0
- package/dist/web/browser.js +927 -0
- package/dist/web/compare/images.d.ts +45 -0
- package/dist/web/compare/images.js +101 -0
- package/dist/web/compare/index.d.ts +15 -0
- package/dist/web/compare/index.js +15 -0
- package/dist/web/compare/provenance.d.ts +48 -0
- package/dist/web/compare/provenance.js +86 -0
- package/dist/web/compare/regions.d.ts +78 -0
- package/dist/web/compare/regions.js +211 -0
- package/dist/web/cookies/extract.d.ts +26 -0
- package/dist/web/cookies/extract.js +167 -0
- package/dist/web/cookies/index.d.ts +8 -0
- package/dist/web/cookies/index.js +7 -0
- package/dist/web/cookies/inject.d.ts +13 -0
- package/dist/web/cookies/inject.js +27 -0
- package/dist/web/cookies/setup.d.ts +31 -0
- package/dist/web/cookies/setup.js +94 -0
- package/dist/web/design/index.d.ts +9 -0
- package/dist/web/design/index.js +9 -0
- package/dist/web/design/inventory.d.ts +126 -0
- package/dist/web/design/inventory.js +324 -0
- package/dist/web/design/probe.d.ts +24 -0
- package/dist/web/design/probe.js +88 -0
- package/dist/web/element/actionable.d.ts +34 -0
- package/dist/web/element/actionable.js +48 -0
- package/dist/web/element/animations.d.ts +48 -0
- package/dist/web/element/animations.js +74 -0
- package/dist/web/element/box.d.ts +53 -0
- package/dist/web/element/box.js +58 -0
- package/dist/web/element/hover.d.ts +75 -0
- package/dist/web/element/hover.js +172 -0
- package/dist/web/element/index.d.ts +17 -0
- package/dist/web/element/index.js +17 -0
- package/dist/web/element/listeners.d.ts +72 -0
- package/dist/web/element/listeners.js +98 -0
- package/dist/web/element/measure.d.ts +40 -0
- package/dist/web/element/measure.js +118 -0
- package/dist/web/element/probes.d.ts +108 -0
- package/dist/web/element/probes.js +195 -0
- package/dist/web/element/pseudo.d.ts +51 -0
- package/dist/web/element/pseudo.js +96 -0
- package/dist/web/element/view.d.ts +30 -0
- package/dist/web/element/view.js +117 -0
- package/dist/web/element/visibility.d.ts +42 -0
- package/dist/web/element/visibility.js +67 -0
- package/dist/web/envelope/artifacts.d.ts +23 -0
- package/dist/web/envelope/artifacts.js +45 -0
- package/dist/web/envelope/index.d.ts +9 -0
- package/dist/web/envelope/index.js +9 -0
- package/dist/web/envelope/naming.d.ts +23 -0
- package/dist/web/envelope/naming.js +43 -0
- package/dist/web/envelope/paged.d.ts +42 -0
- package/dist/web/envelope/paged.js +99 -0
- package/dist/web/envelope/sink.d.ts +43 -0
- package/dist/web/envelope/sink.js +67 -0
- package/dist/web/environment/devices.d.ts +65 -0
- package/dist/web/environment/devices.js +82 -0
- package/dist/web/environment/emulation.d.ts +124 -0
- package/dist/web/environment/emulation.js +258 -0
- package/dist/web/environment/index.d.ts +15 -0
- package/dist/web/environment/index.js +15 -0
- package/dist/web/environment/probes.d.ts +18 -0
- package/dist/web/environment/probes.js +40 -0
- package/dist/web/environment/shaping.d.ts +90 -0
- package/dist/web/environment/shaping.js +141 -0
- package/dist/web/environment/status.d.ts +51 -0
- package/dist/web/environment/status.js +109 -0
- package/dist/web/environment/storage.d.ts +55 -0
- package/dist/web/environment/storage.js +142 -0
- package/dist/web/environment/tabs.d.ts +32 -0
- package/dist/web/environment/tabs.js +47 -0
- package/dist/web/environment/view.d.ts +10 -0
- package/dist/web/environment/view.js +42 -0
- package/dist/web/evaluate/index.d.ts +6 -0
- package/dist/web/evaluate/index.js +6 -0
- package/dist/web/evaluate/outcome.d.ts +74 -0
- package/dist/web/evaluate/outcome.js +91 -0
- package/dist/web/evaluate/probe.d.ts +31 -0
- package/dist/web/evaluate/probe.js +303 -0
- package/dist/web/index.d.ts +47 -0
- package/dist/web/index.js +47 -0
- package/dist/web/input/index.d.ts +11 -0
- package/dist/web/input/index.js +11 -0
- package/dist/web/input/keys.d.ts +48 -0
- package/dist/web/input/keys.js +189 -0
- package/dist/web/input/pointer.d.ts +56 -0
- package/dist/web/input/pointer.js +77 -0
- package/dist/web/input/touch.d.ts +61 -0
- package/dist/web/input/touch.js +83 -0
- package/dist/web/mermaid.d.ts +69 -0
- package/dist/web/mermaid.js +223 -0
- package/dist/web/paths.d.ts +16 -0
- package/dist/web/paths.js +27 -0
- package/dist/web/perf/heap.d.ts +42 -0
- package/dist/web/perf/heap.js +73 -0
- package/dist/web/perf/index.d.ts +14 -0
- package/dist/web/perf/index.js +14 -0
- package/dist/web/perf/layers.d.ts +98 -0
- package/dist/web/perf/layers.js +165 -0
- package/dist/web/perf/probe.d.ts +26 -0
- package/dist/web/perf/probe.js +123 -0
- package/dist/web/perf/profile.d.ts +53 -0
- package/dist/web/perf/profile.js +97 -0
- package/dist/web/perf/trace.d.ts +152 -0
- package/dist/web/perf/trace.js +429 -0
- package/dist/web/perf/view.d.ts +6 -0
- package/dist/web/perf/view.js +86 -0
- package/dist/web/perf/vitals.d.ts +141 -0
- package/dist/web/perf/vitals.js +175 -0
- package/dist/web/reader.d.ts +131 -0
- package/dist/web/reader.js +340 -0
- package/dist/web/screenshot.d.ts +50 -0
- package/dist/web/screenshot.js +108 -0
- package/dist/web/search.d.ts +49 -0
- package/dist/web/search.js +137 -0
- package/dist/web/session/artifacts.d.ts +32 -0
- package/dist/web/session/artifacts.js +47 -0
- package/dist/web/session/emulation.d.ts +118 -0
- package/dist/web/session/emulation.js +307 -0
- package/dist/web/session/recording.d.ts +51 -0
- package/dist/web/session/recording.js +64 -0
- package/dist/web/session/settling.d.ts +42 -0
- package/dist/web/session/settling.js +104 -0
- package/dist/web/session/shaping.d.ts +48 -0
- package/dist/web/session/shaping.js +113 -0
- package/dist/web/session/sourcemaps.d.ts +64 -0
- package/dist/web/session/sourcemaps.js +135 -0
- package/dist/web/session/telemetry.d.ts +219 -0
- package/dist/web/session/telemetry.js +486 -0
- package/dist/web/session/wires.d.ts +22 -0
- package/dist/web/session/wires.js +11 -0
- package/dist/web/session.d.ts +1153 -0
- package/dist/web/session.js +3400 -0
- package/dist/web/snapshot/deep.d.ts +36 -0
- package/dist/web/snapshot/deep.js +91 -0
- package/dist/web/snapshot/flatten.d.ts +101 -0
- package/dist/web/snapshot/flatten.js +131 -0
- package/dist/web/snapshot/index.d.ts +8 -0
- package/dist/web/snapshot/index.js +10 -0
- package/dist/web/snapshot/presented.d.ts +32 -0
- package/dist/web/snapshot/presented.js +74 -0
- package/dist/web/snapshot/query.d.ts +67 -0
- package/dist/web/snapshot/query.js +136 -0
- package/dist/web/sourcemap/index.d.ts +9 -0
- package/dist/web/sourcemap/index.js +9 -0
- package/dist/web/sourcemap/mappings.d.ts +111 -0
- package/dist/web/sourcemap/mappings.js +218 -0
- package/dist/web/styles/capture.d.ts +49 -0
- package/dist/web/styles/capture.js +85 -0
- package/dist/web/styles/cascade.d.ts +107 -0
- package/dist/web/styles/cascade.js +275 -0
- package/dist/web/styles/curation.d.ts +45 -0
- package/dist/web/styles/curation.js +282 -0
- package/dist/web/styles/index.d.ts +10 -0
- package/dist/web/styles/index.js +10 -0
- package/dist/web/target/index.d.ts +7 -0
- package/dist/web/target/index.js +7 -0
- package/dist/web/target/refusals.d.ts +59 -0
- package/dist/web/target/refusals.js +305 -0
- package/dist/web/target/target.d.ts +59 -0
- package/dist/web/target/target.js +94 -0
- package/dist/web/telemetry/buffer.d.ts +35 -0
- package/dist/web/telemetry/buffer.js +72 -0
- package/dist/web/telemetry/console.d.ts +127 -0
- package/dist/web/telemetry/console.js +217 -0
- package/dist/web/telemetry/dialogs.d.ts +41 -0
- package/dist/web/telemetry/dialogs.js +38 -0
- package/dist/web/telemetry/downloads.d.ts +42 -0
- package/dist/web/telemetry/downloads.js +65 -0
- package/dist/web/telemetry/failure.d.ts +31 -0
- package/dist/web/telemetry/failure.js +72 -0
- package/dist/web/telemetry/har.d.ts +97 -0
- package/dist/web/telemetry/har.js +227 -0
- package/dist/web/telemetry/index.d.ts +18 -0
- package/dist/web/telemetry/index.js +18 -0
- package/dist/web/telemetry/lifecycle.d.ts +69 -0
- package/dist/web/telemetry/lifecycle.js +120 -0
- package/dist/web/telemetry/network.d.ts +152 -0
- package/dist/web/telemetry/network.js +130 -0
- package/dist/web/telemetry/requests.d.ts +31 -0
- package/dist/web/telemetry/requests.js +119 -0
- package/dist/web/telemetry/sockets.d.ts +56 -0
- package/dist/web/telemetry/sockets.js +101 -0
- package/dist/web/telemetry/view.d.ts +16 -0
- package/dist/web/telemetry/view.js +125 -0
- package/dist/web/wait/conditions.d.ts +87 -0
- package/dist/web/wait/conditions.js +100 -0
- package/dist/web/wait/index.d.ts +6 -0
- package/dist/web/wait/index.js +6 -0
- package/dist/web/wait/settle.d.ts +54 -0
- package/dist/web/wait/settle.js +84 -0
- package/dist/work/ask.d.ts +45 -0
- package/dist/work/ask.js +85 -0
- package/dist/work/author.d.ts +61 -0
- package/dist/work/author.js +144 -0
- package/dist/work/broker.d.ts +151 -0
- package/dist/work/broker.js +165 -0
- package/dist/work/events.d.ts +98 -0
- package/dist/work/events.js +57 -0
- package/dist/work/history.d.ts +69 -0
- package/dist/work/history.js +174 -0
- package/dist/work/index.d.ts +49 -0
- package/dist/work/index.js +33 -0
- package/dist/work/inplay.d.ts +43 -0
- package/dist/work/inplay.js +42 -0
- package/dist/work/memory.d.ts +84 -0
- package/dist/work/memory.js +203 -0
- package/dist/work/objection.d.ts +92 -0
- package/dist/work/objection.js +72 -0
- package/dist/work/provider.d.ts +79 -0
- package/dist/work/provider.js +45 -0
- package/dist/work/providers/git.d.ts +29 -0
- package/dist/work/providers/git.js +87 -0
- package/dist/work/publish.d.ts +53 -0
- package/dist/work/publish.js +139 -0
- package/dist/work/rebase.d.ts +78 -0
- package/dist/work/rebase.js +261 -0
- package/dist/work/reclaim.d.ts +56 -0
- package/dist/work/reclaim.js +52 -0
- package/dist/work/register.d.ts +29 -0
- package/dist/work/register.js +41 -0
- package/dist/work/stack.d.ts +126 -0
- package/dist/work/stack.js +243 -0
- package/dist/work/stacks.d.ts +156 -0
- package/dist/work/stacks.js +524 -0
- package/dist/work/survey.d.ts +52 -0
- package/dist/work/survey.js +58 -0
- package/dist/work/tidy.d.ts +147 -0
- package/dist/work/tidy.js +136 -0
- package/dist/work/tree.d.ts +120 -0
- package/dist/work/tree.js +69 -0
- package/dist/work/unattended.d.ts +40 -0
- package/dist/work/unattended.js +57 -0
- package/package.json +145 -0
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Liveness derivation for the pi sessions attached to a quest.
|
|
3
|
+
*
|
|
4
|
+
* Liveness is not stored: the persisted {@link QuestSession} shape
|
|
5
|
+
* is unchanged. This module reads the pi session store to classify
|
|
6
|
+
* each attached session by how recently its log was written, so
|
|
7
|
+
* `quest show` and reopening can tell a live session from a dead
|
|
8
|
+
* one without the agent guessing.
|
|
9
|
+
*/
|
|
10
|
+
import type { QuestSession } from "../../quest/types.js";
|
|
11
|
+
import { type TerminalProbe, type TerminalSessionHandle } from "../../terminal/types.js";
|
|
12
|
+
import type { ProcessIdentity, ProcessProbe } from "./process-liveness.js";
|
|
13
|
+
/**
|
|
14
|
+
* How a quest's attached session looks right now.
|
|
15
|
+
*
|
|
16
|
+
* `live` and `dead` are observed through a probe; `unknown` is the
|
|
17
|
+
* honest answer when the probe could not observe; `idle` is the
|
|
18
|
+
* recency fallback for a record that carries no probeable identity;
|
|
19
|
+
* `conflicted` marks a session claimed by more than one quest with no
|
|
20
|
+
* resolvable owner; `detached` is authoritative membership.
|
|
21
|
+
*/
|
|
22
|
+
export type SessionLiveness = "live" | "idle" | "detached" | "dead" | "unknown" | "conflicted";
|
|
23
|
+
/**
|
|
24
|
+
* A session's ephemeral, read-time probe result. Never persisted.
|
|
25
|
+
* A dimension is present only when the session carries the matching
|
|
26
|
+
* identity, and each dimension is itself tri-state.
|
|
27
|
+
*/
|
|
28
|
+
export interface SessionObservation {
|
|
29
|
+
process?: ProcessProbe;
|
|
30
|
+
pane?: TerminalProbe;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Everything the derivation needs, computed once per top-level
|
|
34
|
+
* request: the reference time, each session's last activity, the
|
|
35
|
+
* probe observations for sessions that carry identity, and the set
|
|
36
|
+
* of sessions with unresolved multi-quest ownership. Built by
|
|
37
|
+
* {@link buildLivenessSnapshot} and consumed by {@link deriveLiveness}.
|
|
38
|
+
*/
|
|
39
|
+
export interface LivenessSnapshot {
|
|
40
|
+
now: Date;
|
|
41
|
+
activity: ReadonlyMap<string, string>;
|
|
42
|
+
observations: ReadonlyMap<string, SessionObservation>;
|
|
43
|
+
conflicted: ReadonlySet<string>;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Injected dependencies for {@link buildLivenessSnapshot}. Every
|
|
47
|
+
* side effect (reading a log's activity, probing a process, probing
|
|
48
|
+
* terminals) is a function so the snapshot builder never shells out
|
|
49
|
+
* in tests.
|
|
50
|
+
*/
|
|
51
|
+
export interface LivenessSnapshotDeps {
|
|
52
|
+
now?: Date;
|
|
53
|
+
activityOf: (sessionId: string) => string | undefined;
|
|
54
|
+
probeProcess: (id: ProcessIdentity) => ProcessProbe;
|
|
55
|
+
probeTerminals: (handles: readonly TerminalSessionHandle[]) => Promise<ReadonlyMap<string, TerminalProbe>>;
|
|
56
|
+
conflicted?: ReadonlySet<string>;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Render an activity timestamp as a compact relative string
|
|
60
|
+
* ("just now", "15m ago", "3h ago", "2d ago"). Undefined when there
|
|
61
|
+
* is no timestamp or it does not parse, so callers drop the clause
|
|
62
|
+
* rather than print a bare "undefined ago".
|
|
63
|
+
*/
|
|
64
|
+
export declare function formatRelativeAge(iso: string | undefined, now: Date): string | undefined;
|
|
65
|
+
/** A {@link QuestSession} enriched with derived liveness. */
|
|
66
|
+
export interface SessionView extends QuestSession {
|
|
67
|
+
liveness: SessionLiveness;
|
|
68
|
+
lastActivity?: string;
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Drop a quest's no-log phantom sessions. A phantom is a detached
|
|
72
|
+
* session with no log file: a fan-out of ephemeral children leaves
|
|
73
|
+
* such ids behind, and they can never be resumed. Active sessions
|
|
74
|
+
* are never removed (the current one may not have flushed a log
|
|
75
|
+
* yet), and a detached session that still has a log is real history.
|
|
76
|
+
*/
|
|
77
|
+
export declare function prunePhantomSessions(sessions: QuestSession[], hasLog: (id: string) => boolean): {
|
|
78
|
+
kept: QuestSession[];
|
|
79
|
+
removed: QuestSession[];
|
|
80
|
+
};
|
|
81
|
+
/**
|
|
82
|
+
* Index every session log in the store once, mapping session id to
|
|
83
|
+
* its file path. Callers that need the activity of many sessions
|
|
84
|
+
* (the activity-window query over the whole backlog) build this
|
|
85
|
+
* once and reuse it, instead of re-listing the store per session.
|
|
86
|
+
*/
|
|
87
|
+
export declare function indexSessionFiles(sessionDir: string): Map<string, string>;
|
|
88
|
+
/**
|
|
89
|
+
* The most recent activity timestamp across a quest's sessions,
|
|
90
|
+
* using a prebuilt {@link indexSessionFiles} map. Undefined when
|
|
91
|
+
* none of them has a log. This is a quest's effective last-touched
|
|
92
|
+
* time for activity-window filtering and sorting.
|
|
93
|
+
*/
|
|
94
|
+
export declare function questLastActivity(sessions: QuestSession[], index: Map<string, string>): string | undefined;
|
|
95
|
+
export declare function buildLivenessSnapshot(sessions: readonly QuestSession[], deps: LivenessSnapshotDeps): Promise<LivenessSnapshot>;
|
|
96
|
+
/**
|
|
97
|
+
* Classify an attached session over a prebuilt {@link
|
|
98
|
+
* LivenessSnapshot}. Membership wins first: a detached session reads
|
|
99
|
+
* detached and a conflicted one reads conflicted, whatever a probe
|
|
100
|
+
* saw. A session that carries identity is judged by observation
|
|
101
|
+
* alone (a matching process or a present pane is live; a gone
|
|
102
|
+
* process or an absent pane is dead; anything the probe could not
|
|
103
|
+
* resolve is unknown). A record with no captured identity falls back
|
|
104
|
+
* to the recency window, the only place recency drives liveness.
|
|
105
|
+
*/
|
|
106
|
+
export declare function deriveLiveness(session: QuestSession, snapshot: LivenessSnapshot): SessionView;
|
|
107
|
+
/**
|
|
108
|
+
* Locate a session's log file by id and read its newest activity.
|
|
109
|
+
*
|
|
110
|
+
* Pi stores sessions as `<sessionDir>/<cwd-encoded>/<ts>_<id>.jsonl`,
|
|
111
|
+
* so we scan one level of cwd-encoded subdirectories (and the root,
|
|
112
|
+
* defensively) for a file whose name ends with `_<id>.jsonl`. The
|
|
113
|
+
* newest entry's timestamp is normalized to an ISO string; pi has
|
|
114
|
+
* written both epoch-millisecond numbers and ISO strings over time.
|
|
115
|
+
*/
|
|
116
|
+
export declare function sessionActivity(id: string, sessionDir: string): {
|
|
117
|
+
path: string;
|
|
118
|
+
lastActivity: string;
|
|
119
|
+
} | undefined;
|
|
120
|
+
/**
|
|
121
|
+
* A session's last activity resolved from a prebuilt {@link
|
|
122
|
+
* indexSessionFiles} map, without re-walking the store. This is the
|
|
123
|
+
* `activityOf` a real {@link buildLivenessSnapshot} passes in.
|
|
124
|
+
*/
|
|
125
|
+
export declare function activityFromIndex(index: ReadonlyMap<string, string>, id: string): string | undefined;
|
|
@@ -0,0 +1,386 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Liveness derivation for the pi sessions attached to a quest.
|
|
3
|
+
*
|
|
4
|
+
* Liveness is not stored: the persisted {@link QuestSession} shape
|
|
5
|
+
* is unchanged. This module reads the pi session store to classify
|
|
6
|
+
* each attached session by how recently its log was written, so
|
|
7
|
+
* `quest show` and reopening can tell a live session from a dead
|
|
8
|
+
* one without the agent guessing.
|
|
9
|
+
*/
|
|
10
|
+
import { closeSync, fstatSync, openSync, readdirSync, readSync, } from "node:fs";
|
|
11
|
+
import { join } from "node:path";
|
|
12
|
+
import { terminalHandleKey, } from "../../terminal/types.js";
|
|
13
|
+
/**
|
|
14
|
+
* Render an activity timestamp as a compact relative string
|
|
15
|
+
* ("just now", "15m ago", "3h ago", "2d ago"). Undefined when there
|
|
16
|
+
* is no timestamp or it does not parse, so callers drop the clause
|
|
17
|
+
* rather than print a bare "undefined ago".
|
|
18
|
+
*/
|
|
19
|
+
export function formatRelativeAge(iso, now) {
|
|
20
|
+
if (!iso)
|
|
21
|
+
return undefined;
|
|
22
|
+
const then = Date.parse(iso);
|
|
23
|
+
if (Number.isNaN(then))
|
|
24
|
+
return undefined;
|
|
25
|
+
const seconds = Math.max(0, Math.floor((now.getTime() - then) / 1000));
|
|
26
|
+
if (seconds < 60)
|
|
27
|
+
return "just now";
|
|
28
|
+
const minutes = Math.floor(seconds / 60);
|
|
29
|
+
if (minutes < 60)
|
|
30
|
+
return `${minutes}m ago`;
|
|
31
|
+
const hours = Math.floor(minutes / 60);
|
|
32
|
+
if (hours < 24)
|
|
33
|
+
return `${hours}h ago`;
|
|
34
|
+
const days = Math.floor(hours / 24);
|
|
35
|
+
return `${days}d ago`;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* A session is live when its log was written within this window;
|
|
39
|
+
* older activity reads as idle. This is a recency heuristic, not a
|
|
40
|
+
* process probe (see the plan's open question on liveness depth).
|
|
41
|
+
*/
|
|
42
|
+
const LIVE_WINDOW_MS = 15 * 60 * 1000;
|
|
43
|
+
/**
|
|
44
|
+
* Drop a quest's no-log phantom sessions. A phantom is a detached
|
|
45
|
+
* session with no log file: a fan-out of ephemeral children leaves
|
|
46
|
+
* such ids behind, and they can never be resumed. Active sessions
|
|
47
|
+
* are never removed (the current one may not have flushed a log
|
|
48
|
+
* yet), and a detached session that still has a log is real history.
|
|
49
|
+
*/
|
|
50
|
+
export function prunePhantomSessions(sessions, hasLog) {
|
|
51
|
+
const kept = [];
|
|
52
|
+
const removed = [];
|
|
53
|
+
for (const session of sessions) {
|
|
54
|
+
if (session.status === "detached" && !hasLog(session.id)) {
|
|
55
|
+
removed.push(session);
|
|
56
|
+
}
|
|
57
|
+
else {
|
|
58
|
+
kept.push(session);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
return { kept, removed };
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Index every session log in the store once, mapping session id to
|
|
65
|
+
* its file path. Callers that need the activity of many sessions
|
|
66
|
+
* (the activity-window query over the whole backlog) build this
|
|
67
|
+
* once and reuse it, instead of re-listing the store per session.
|
|
68
|
+
*/
|
|
69
|
+
export function indexSessionFiles(sessionDir) {
|
|
70
|
+
const index = new Map();
|
|
71
|
+
const add = (dir, names) => {
|
|
72
|
+
for (const name of names) {
|
|
73
|
+
if (!name.endsWith(".jsonl"))
|
|
74
|
+
continue;
|
|
75
|
+
const underscore = name.lastIndexOf("_");
|
|
76
|
+
if (underscore < 0)
|
|
77
|
+
continue;
|
|
78
|
+
const id = name.slice(underscore + 1, name.length - ".jsonl".length);
|
|
79
|
+
if (!index.has(id))
|
|
80
|
+
index.set(id, join(dir, name));
|
|
81
|
+
}
|
|
82
|
+
};
|
|
83
|
+
let entries;
|
|
84
|
+
try {
|
|
85
|
+
entries = readdirSync(sessionDir, { withFileTypes: true });
|
|
86
|
+
}
|
|
87
|
+
catch {
|
|
88
|
+
// Store does not exist or is unreadable; an empty index reads
|
|
89
|
+
// the same as "no session has a log".
|
|
90
|
+
return index;
|
|
91
|
+
}
|
|
92
|
+
add(sessionDir, entries.filter((e) => e.isFile()).map((e) => e.name));
|
|
93
|
+
for (const entry of entries) {
|
|
94
|
+
if (!entry.isDirectory())
|
|
95
|
+
continue;
|
|
96
|
+
const full = join(sessionDir, entry.name);
|
|
97
|
+
try {
|
|
98
|
+
add(full, readdirSync(full));
|
|
99
|
+
}
|
|
100
|
+
catch {
|
|
101
|
+
// Unreadable subdir; skip it and keep indexing siblings.
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
return index;
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* The most recent activity timestamp across a quest's sessions,
|
|
108
|
+
* using a prebuilt {@link indexSessionFiles} map. Undefined when
|
|
109
|
+
* none of them has a log. This is a quest's effective last-touched
|
|
110
|
+
* time for activity-window filtering and sorting.
|
|
111
|
+
*/
|
|
112
|
+
export function questLastActivity(sessions, index) {
|
|
113
|
+
let newest;
|
|
114
|
+
for (const session of sessions) {
|
|
115
|
+
const path = index.get(session.id);
|
|
116
|
+
if (!path)
|
|
117
|
+
continue;
|
|
118
|
+
const last = newestTimestamp(path);
|
|
119
|
+
if (!last)
|
|
120
|
+
continue;
|
|
121
|
+
if (!newest || Date.parse(last) > Date.parse(newest))
|
|
122
|
+
newest = last;
|
|
123
|
+
}
|
|
124
|
+
return newest;
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Build the read-time snapshot for a set of sessions: record each
|
|
128
|
+
* session's activity, probe every process identity once, and issue
|
|
129
|
+
* one batched terminal probe for the handles that carry a terminal
|
|
130
|
+
* identity. A terminal handle's host is taken from the session's
|
|
131
|
+
* process identity, since a session's terminal lives on the same
|
|
132
|
+
* host as its process. Runs once per request; the derivation over
|
|
133
|
+
* it is synchronous.
|
|
134
|
+
*/
|
|
135
|
+
/**
|
|
136
|
+
* The host a session's terminal was captured on. Prefer the host
|
|
137
|
+
* recorded on the terminal itself; fall back to the process host for
|
|
138
|
+
* a legacy record written before the terminal carried its own host.
|
|
139
|
+
*/
|
|
140
|
+
function terminalHostOf(session) {
|
|
141
|
+
return session.terminal?.hostId ?? session.process?.hostId ?? "";
|
|
142
|
+
}
|
|
143
|
+
export async function buildLivenessSnapshot(sessions, deps) {
|
|
144
|
+
const now = deps.now ?? new Date();
|
|
145
|
+
const activity = new Map();
|
|
146
|
+
const handles = [];
|
|
147
|
+
for (const session of sessions) {
|
|
148
|
+
const last = deps.activityOf(session.id);
|
|
149
|
+
if (last)
|
|
150
|
+
activity.set(session.id, last);
|
|
151
|
+
if (session.terminal) {
|
|
152
|
+
handles.push({
|
|
153
|
+
driverId: session.terminal.driverId,
|
|
154
|
+
kind: `${session.terminal.driverId}-pane`,
|
|
155
|
+
hostId: terminalHostOf(session),
|
|
156
|
+
scope: session.terminal.scope,
|
|
157
|
+
value: session.terminal.value,
|
|
158
|
+
});
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
const paneProbes = handles.length > 0
|
|
162
|
+
? await deps.probeTerminals(handles)
|
|
163
|
+
: new Map();
|
|
164
|
+
const observations = new Map();
|
|
165
|
+
for (const session of sessions) {
|
|
166
|
+
if (!session.process && !session.terminal)
|
|
167
|
+
continue;
|
|
168
|
+
const obs = {};
|
|
169
|
+
if (session.process)
|
|
170
|
+
obs.process = deps.probeProcess(session.process);
|
|
171
|
+
if (session.terminal) {
|
|
172
|
+
const key = terminalHandleKey({
|
|
173
|
+
driverId: session.terminal.driverId,
|
|
174
|
+
kind: `${session.terminal.driverId}-pane`,
|
|
175
|
+
hostId: terminalHostOf(session),
|
|
176
|
+
scope: session.terminal.scope,
|
|
177
|
+
value: session.terminal.value,
|
|
178
|
+
});
|
|
179
|
+
obs.pane = paneProbes.get(key) ?? "unknown";
|
|
180
|
+
}
|
|
181
|
+
observations.set(session.id, obs);
|
|
182
|
+
}
|
|
183
|
+
return {
|
|
184
|
+
now,
|
|
185
|
+
activity,
|
|
186
|
+
observations,
|
|
187
|
+
conflicted: deps.conflicted ?? new Set(),
|
|
188
|
+
};
|
|
189
|
+
}
|
|
190
|
+
/**
|
|
191
|
+
* Classify an attached session over a prebuilt {@link
|
|
192
|
+
* LivenessSnapshot}. Membership wins first: a detached session reads
|
|
193
|
+
* detached and a conflicted one reads conflicted, whatever a probe
|
|
194
|
+
* saw. A session that carries identity is judged by observation
|
|
195
|
+
* alone (a matching process or a present pane is live; a gone
|
|
196
|
+
* process or an absent pane is dead; anything the probe could not
|
|
197
|
+
* resolve is unknown). A record with no captured identity falls back
|
|
198
|
+
* to the recency window, the only place recency drives liveness.
|
|
199
|
+
*/
|
|
200
|
+
export function deriveLiveness(session, snapshot) {
|
|
201
|
+
const lastActivity = snapshot.activity.get(session.id);
|
|
202
|
+
if (session.status === "detached") {
|
|
203
|
+
return { ...session, liveness: "detached", lastActivity };
|
|
204
|
+
}
|
|
205
|
+
if (snapshot.conflicted.has(session.id)) {
|
|
206
|
+
return { ...session, liveness: "conflicted", lastActivity };
|
|
207
|
+
}
|
|
208
|
+
const observation = snapshot.observations.get(session.id);
|
|
209
|
+
if ((session.process || session.terminal) && observation) {
|
|
210
|
+
return {
|
|
211
|
+
...session,
|
|
212
|
+
liveness: observedLiveness(observation),
|
|
213
|
+
lastActivity,
|
|
214
|
+
};
|
|
215
|
+
}
|
|
216
|
+
if (!lastActivity)
|
|
217
|
+
return { ...session, liveness: "dead" };
|
|
218
|
+
const age = snapshot.now.getTime() - Date.parse(lastActivity);
|
|
219
|
+
const liveness = age <= LIVE_WINDOW_MS ? "live" : "idle";
|
|
220
|
+
return { ...session, liveness, lastActivity };
|
|
221
|
+
}
|
|
222
|
+
/**
|
|
223
|
+
* Reduce a probe observation to a liveness verdict. The process
|
|
224
|
+
* dimension is authoritative and checked first, so a gone process
|
|
225
|
+
* reads dead even when a stale pane lingers; a present pane rescues
|
|
226
|
+
* a session whose process could not be probed; everything else the
|
|
227
|
+
* probe could not resolve is unknown.
|
|
228
|
+
*/
|
|
229
|
+
function observedLiveness(observation) {
|
|
230
|
+
if (observation.process === "matching")
|
|
231
|
+
return "live";
|
|
232
|
+
if (observation.process === "gone")
|
|
233
|
+
return "dead";
|
|
234
|
+
if (observation.pane === "present")
|
|
235
|
+
return "live";
|
|
236
|
+
if (observation.pane === "absent")
|
|
237
|
+
return "dead";
|
|
238
|
+
return "unknown";
|
|
239
|
+
}
|
|
240
|
+
/**
|
|
241
|
+
* Locate a session's log file by id and read its newest activity.
|
|
242
|
+
*
|
|
243
|
+
* Pi stores sessions as `<sessionDir>/<cwd-encoded>/<ts>_<id>.jsonl`,
|
|
244
|
+
* so we scan one level of cwd-encoded subdirectories (and the root,
|
|
245
|
+
* defensively) for a file whose name ends with `_<id>.jsonl`. The
|
|
246
|
+
* newest entry's timestamp is normalized to an ISO string; pi has
|
|
247
|
+
* written both epoch-millisecond numbers and ISO strings over time.
|
|
248
|
+
*/
|
|
249
|
+
export function sessionActivity(id, sessionDir) {
|
|
250
|
+
const suffix = `_${id}.jsonl`;
|
|
251
|
+
const match = findSessionFile(sessionDir, suffix);
|
|
252
|
+
return activityFromPath(match);
|
|
253
|
+
}
|
|
254
|
+
/**
|
|
255
|
+
* A session's last activity resolved from a prebuilt {@link
|
|
256
|
+
* indexSessionFiles} map, without re-walking the store. This is the
|
|
257
|
+
* `activityOf` a real {@link buildLivenessSnapshot} passes in.
|
|
258
|
+
*/
|
|
259
|
+
export function activityFromIndex(index, id) {
|
|
260
|
+
return activityFromPath(index.get(id))?.lastActivity;
|
|
261
|
+
}
|
|
262
|
+
/**
|
|
263
|
+
* Read a known log path's newest activity. Shared by the
|
|
264
|
+
* directory-walk and the prebuilt-index resolution paths so both
|
|
265
|
+
* report activity identically. Undefined when the path is missing
|
|
266
|
+
* or carries no parseable timestamp.
|
|
267
|
+
*/
|
|
268
|
+
function activityFromPath(path) {
|
|
269
|
+
if (!path)
|
|
270
|
+
return undefined;
|
|
271
|
+
const lastActivity = newestTimestamp(path);
|
|
272
|
+
if (!lastActivity)
|
|
273
|
+
return undefined;
|
|
274
|
+
return { path, lastActivity };
|
|
275
|
+
}
|
|
276
|
+
/** Walk the session dir and its immediate subdirs for the id-matched file. */
|
|
277
|
+
function findSessionFile(sessionDir, suffix) {
|
|
278
|
+
let entries;
|
|
279
|
+
try {
|
|
280
|
+
entries = readdirSync(sessionDir, { withFileTypes: true });
|
|
281
|
+
}
|
|
282
|
+
catch {
|
|
283
|
+
// Session dir does not exist or is unreadable; the caller
|
|
284
|
+
// treats this the same as "no session file found".
|
|
285
|
+
return undefined;
|
|
286
|
+
}
|
|
287
|
+
for (const entry of entries) {
|
|
288
|
+
const full = join(sessionDir, entry.name);
|
|
289
|
+
if (entry.isFile() && entry.name.endsWith(suffix))
|
|
290
|
+
return full;
|
|
291
|
+
if (entry.isDirectory()) {
|
|
292
|
+
let inner;
|
|
293
|
+
try {
|
|
294
|
+
inner = readdirSync(full);
|
|
295
|
+
}
|
|
296
|
+
catch {
|
|
297
|
+
// Unreadable subdir; skip it and keep scanning siblings.
|
|
298
|
+
continue;
|
|
299
|
+
}
|
|
300
|
+
const hit = inner.find((name) => name.endsWith(suffix));
|
|
301
|
+
if (hit)
|
|
302
|
+
return join(full, hit);
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
return undefined;
|
|
306
|
+
}
|
|
307
|
+
/**
|
|
308
|
+
* How much of a session log's tail to read for its newest
|
|
309
|
+
* timestamp. Logs are append-only and can grow large, so reading
|
|
310
|
+
* the whole file just to find the latest entry is wasteful; the
|
|
311
|
+
* last window holds the recent entries.
|
|
312
|
+
*/
|
|
313
|
+
const TAIL_BYTES = 64 * 1024;
|
|
314
|
+
/**
|
|
315
|
+
* Read the newest entry's timestamp from a JSONL session file.
|
|
316
|
+
*
|
|
317
|
+
* Reads only the tail rather than the whole file, and returns the
|
|
318
|
+
* maximum timestamp among the lines it reads rather than the last
|
|
319
|
+
* positional one, so a late-arriving out-of-order entry does not
|
|
320
|
+
* mis-report activity.
|
|
321
|
+
*/
|
|
322
|
+
function newestTimestamp(path) {
|
|
323
|
+
let fd;
|
|
324
|
+
try {
|
|
325
|
+
fd = openSync(path, "r");
|
|
326
|
+
}
|
|
327
|
+
catch {
|
|
328
|
+
// File vanished between listing and reading; no activity.
|
|
329
|
+
return undefined;
|
|
330
|
+
}
|
|
331
|
+
try {
|
|
332
|
+
const { size } = fstatSync(fd);
|
|
333
|
+
const start = Math.max(0, size - TAIL_BYTES);
|
|
334
|
+
const length = size - start;
|
|
335
|
+
const buffer = Buffer.alloc(length);
|
|
336
|
+
if (length > 0)
|
|
337
|
+
readSync(fd, buffer, 0, length, start);
|
|
338
|
+
let text = buffer.toString("utf8");
|
|
339
|
+
// When we started mid-file the first line is likely partial;
|
|
340
|
+
// drop it so a truncated JSON line is not parsed.
|
|
341
|
+
if (start > 0) {
|
|
342
|
+
const newline = text.indexOf("\n");
|
|
343
|
+
if (newline >= 0)
|
|
344
|
+
text = text.slice(newline + 1);
|
|
345
|
+
}
|
|
346
|
+
let newest;
|
|
347
|
+
for (const line of text.split("\n")) {
|
|
348
|
+
const trimmed = line.trim();
|
|
349
|
+
if (trimmed === "")
|
|
350
|
+
continue;
|
|
351
|
+
const stamp = parseTimestamp(trimmed);
|
|
352
|
+
if (stamp && (!newest || Date.parse(stamp) > Date.parse(newest))) {
|
|
353
|
+
newest = stamp;
|
|
354
|
+
}
|
|
355
|
+
}
|
|
356
|
+
return newest;
|
|
357
|
+
}
|
|
358
|
+
catch {
|
|
359
|
+
return undefined;
|
|
360
|
+
}
|
|
361
|
+
finally {
|
|
362
|
+
closeSync(fd);
|
|
363
|
+
}
|
|
364
|
+
}
|
|
365
|
+
/** Parse one JSONL line's timestamp into an ISO string. */
|
|
366
|
+
function parseTimestamp(line) {
|
|
367
|
+
let parsed;
|
|
368
|
+
try {
|
|
369
|
+
parsed = JSON.parse(line);
|
|
370
|
+
}
|
|
371
|
+
catch {
|
|
372
|
+
// A partially written final line; fall back to an earlier one.
|
|
373
|
+
return undefined;
|
|
374
|
+
}
|
|
375
|
+
if (typeof parsed !== "object" || parsed === null)
|
|
376
|
+
return undefined;
|
|
377
|
+
const raw = parsed.timestamp;
|
|
378
|
+
if (typeof raw === "number")
|
|
379
|
+
return new Date(raw).toISOString();
|
|
380
|
+
if (typeof raw === "string") {
|
|
381
|
+
const ms = Date.parse(raw);
|
|
382
|
+
if (!Number.isNaN(ms))
|
|
383
|
+
return new Date(ms).toISOString();
|
|
384
|
+
}
|
|
385
|
+
return undefined;
|
|
386
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Ownership resolution from a session's own log.
|
|
3
|
+
*
|
|
4
|
+
* A quest's `sessions:` frontmatter is a denormalized index; the
|
|
5
|
+
* authoritative current quest of a session is whatever quest-workflow
|
|
6
|
+
* entry its pi log recorded last. Reconciliation and repair read this
|
|
7
|
+
* so they can resolve a session claimed by several quests from the
|
|
8
|
+
* session's recorded intent rather than from a liveness probe.
|
|
9
|
+
*/
|
|
10
|
+
/**
|
|
11
|
+
* The quest a session is authoritatively on, from the last
|
|
12
|
+
* quest-workflow entry in its log. Undefined when the log has no such
|
|
13
|
+
* entry, the last one cleared the quest, or the log cannot be read.
|
|
14
|
+
* Reads a bounded tail rather than the whole file. A real session log
|
|
15
|
+
* reached 1.2 GB, and V8 caps a string near 512 MB, so reading it
|
|
16
|
+
* whole allocated a gigabyte and then threw, leaving that session
|
|
17
|
+
* permanently unresolvable. The deciding entry is the last one, so
|
|
18
|
+
* the end of the log is where the answer lives; a quest named only
|
|
19
|
+
* further back than the window reads as no answer, which is what an
|
|
20
|
+
* unreadable log already returned.
|
|
21
|
+
*/
|
|
22
|
+
export declare function authoritativeQuestFromLog(logPath: string): string | undefined;
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Ownership resolution from a session's own log.
|
|
3
|
+
*
|
|
4
|
+
* A quest's `sessions:` frontmatter is a denormalized index; the
|
|
5
|
+
* authoritative current quest of a session is whatever quest-workflow
|
|
6
|
+
* entry its pi log recorded last. Reconciliation and repair read this
|
|
7
|
+
* so they can resolve a session claimed by several quests from the
|
|
8
|
+
* session's recorded intent rather than from a liveness probe.
|
|
9
|
+
*/
|
|
10
|
+
import { closeSync, fstatSync, openSync, readSync } from "node:fs";
|
|
11
|
+
/**
|
|
12
|
+
* How much of a log's end to read. Comfortably more than the last
|
|
13
|
+
* entries of any ordinary session, and small enough that reading it
|
|
14
|
+
* costs nothing next to the gigabyte the whole-file read could.
|
|
15
|
+
*/
|
|
16
|
+
const LOG_TAIL_BYTES = 1024 * 1024;
|
|
17
|
+
/**
|
|
18
|
+
* The last {@link LOG_TAIL_BYTES} of a file, decoded as text.
|
|
19
|
+
*
|
|
20
|
+
* The first line is dropped when the file is longer than the window,
|
|
21
|
+
* since the window almost certainly lands mid-line and a half-entry
|
|
22
|
+
* would only fail to parse. Nothing else compensates for the cut: a
|
|
23
|
+
* caller that needs the whole log should not be using this.
|
|
24
|
+
*/
|
|
25
|
+
function readLogTail(path) {
|
|
26
|
+
const fd = openSync(path, "r");
|
|
27
|
+
try {
|
|
28
|
+
const { size } = fstatSync(fd);
|
|
29
|
+
const length = Math.min(size, LOG_TAIL_BYTES);
|
|
30
|
+
const buffer = Buffer.allocUnsafe(length);
|
|
31
|
+
readSync(fd, buffer, 0, length, size - length);
|
|
32
|
+
const text = buffer.toString("utf8");
|
|
33
|
+
if (size <= LOG_TAIL_BYTES)
|
|
34
|
+
return text;
|
|
35
|
+
const firstBreak = text.indexOf("\n");
|
|
36
|
+
return firstBreak === -1 ? "" : text.slice(firstBreak + 1);
|
|
37
|
+
}
|
|
38
|
+
finally {
|
|
39
|
+
closeSync(fd);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* The quest a session is authoritatively on, from the last
|
|
44
|
+
* quest-workflow entry in its log. Undefined when the log has no such
|
|
45
|
+
* entry, the last one cleared the quest, or the log cannot be read.
|
|
46
|
+
* Reads a bounded tail rather than the whole file. A real session log
|
|
47
|
+
* reached 1.2 GB, and V8 caps a string near 512 MB, so reading it
|
|
48
|
+
* whole allocated a gigabyte and then threw, leaving that session
|
|
49
|
+
* permanently unresolvable. The deciding entry is the last one, so
|
|
50
|
+
* the end of the log is where the answer lives; a quest named only
|
|
51
|
+
* further back than the window reads as no answer, which is what an
|
|
52
|
+
* unreadable log already returned.
|
|
53
|
+
*/
|
|
54
|
+
export function authoritativeQuestFromLog(logPath) {
|
|
55
|
+
let text;
|
|
56
|
+
try {
|
|
57
|
+
text = readLogTail(logPath);
|
|
58
|
+
}
|
|
59
|
+
catch {
|
|
60
|
+
// Log missing or unreadable: no authoritative answer.
|
|
61
|
+
return undefined;
|
|
62
|
+
}
|
|
63
|
+
let current;
|
|
64
|
+
for (const line of text.split("\n")) {
|
|
65
|
+
const trimmed = line.trim();
|
|
66
|
+
if (trimmed === "")
|
|
67
|
+
continue;
|
|
68
|
+
let entry;
|
|
69
|
+
try {
|
|
70
|
+
entry = JSON.parse(trimmed);
|
|
71
|
+
}
|
|
72
|
+
catch {
|
|
73
|
+
// A partially written line; skip it and keep scanning.
|
|
74
|
+
continue;
|
|
75
|
+
}
|
|
76
|
+
const questId = questIdOfEntry(entry);
|
|
77
|
+
if (questId !== false)
|
|
78
|
+
current = questId;
|
|
79
|
+
}
|
|
80
|
+
return current;
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* The questId a quest-workflow log entry records, `undefined` when it
|
|
84
|
+
* cleared the quest, or `false` when the entry is not a quest-workflow
|
|
85
|
+
* entry at all (so the scan leaves the running value untouched).
|
|
86
|
+
*/
|
|
87
|
+
function questIdOfEntry(entry) {
|
|
88
|
+
if (typeof entry !== "object" || entry === null)
|
|
89
|
+
return false;
|
|
90
|
+
const e = entry;
|
|
91
|
+
if (e.type !== "custom" || e.customType !== "quest-workflow")
|
|
92
|
+
return false;
|
|
93
|
+
const data = e.data;
|
|
94
|
+
if (typeof data !== "object" || data === null)
|
|
95
|
+
return undefined;
|
|
96
|
+
const questId = data.questId;
|
|
97
|
+
return typeof questId === "string" && questId.length > 0
|
|
98
|
+
? questId
|
|
99
|
+
: undefined;
|
|
100
|
+
}
|