@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,900 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Lifecycle mutations for the quest workflow: focus, unfocus,
|
|
3
|
+
* document stage, journey entries, aliasing, reordering,
|
|
4
|
+
* priority/status/parent changes, session attach/detach.
|
|
5
|
+
*
|
|
6
|
+
* Everything here operates on a `QuestState` value and plain
|
|
7
|
+
* arguments, with no dependency on an adapter's own extension API
|
|
8
|
+
* or session log. The pi-only counterparts -- loading a quest
|
|
9
|
+
* (which sets pi's session name), persisting/restoring the loaded
|
|
10
|
+
* quest across a pi session (which reads/writes pi's own session
|
|
11
|
+
* log), and pruning phantom sessions against pi's session-log
|
|
12
|
+
* directory -- stay in agentic-harness.pi's own lifecycle.ts,
|
|
13
|
+
* which imports the mutations here for everything else.
|
|
14
|
+
*/
|
|
15
|
+
import { existsSync, mkdirSync, readdirSync, readFileSync, } from "node:fs";
|
|
16
|
+
import { join } from "node:path";
|
|
17
|
+
import { buildAliasIndex, } from "../internal/quest/alias-index.js";
|
|
18
|
+
import { appendJourneyByPath } from "../internal/quest/append-journey.js";
|
|
19
|
+
import { nowYmd } from "../internal/quest/dates.js";
|
|
20
|
+
import { discoverQuests, siblingRanks, } from "../internal/quest/discovery.js";
|
|
21
|
+
import { explainDocumentFrontMatter } from "../internal/quest/frontmatter.js";
|
|
22
|
+
import { atomicWriteFile, atomicWriteUnderLock } from "../internal/quest/io.js";
|
|
23
|
+
import { mutateQuestFrontMatter } from "../internal/quest/mutate.js";
|
|
24
|
+
import { currentInstanceId, currentProcessIdentity, } from "../internal/quest/process-liveness.js";
|
|
25
|
+
import { diffRanks, nextRank, after as rankAfter, before as rankBefore, bottom as rankBottom, bump as rankBump, renumber as rankRenumber, sink as rankSink, top as rankTop, } from "../internal/quest/ranking.js";
|
|
26
|
+
import { isSealedStatus } from "../internal/quest/status.js";
|
|
27
|
+
import { identifyCurrentTerminal } from "../terminal/index.js";
|
|
28
|
+
import { checkboxProgress, documentFrontMatterProblem, parseDocumentFrontMatter, parseQuestDoc, serializeDocumentFrontMatter, } from "./index.js";
|
|
29
|
+
/**
|
|
30
|
+
* Persist the focused document's progress (or, when no
|
|
31
|
+
* document is focused, the loaded quest's) into the
|
|
32
|
+
* QuestState struct so the widget can paint without
|
|
33
|
+
* re-parsing the body on every keystroke.
|
|
34
|
+
*
|
|
35
|
+
* Uses the broad `checkboxProgress` walk so every `- [ ]`
|
|
36
|
+
* / `- [x]` in the body contributes regardless of which
|
|
37
|
+
* section holds it. The plan, research, brief and report
|
|
38
|
+
* templates each use a different section name for their
|
|
39
|
+
* work list; one counter serves them all.
|
|
40
|
+
*/
|
|
41
|
+
export function refreshProgress(state) {
|
|
42
|
+
if (state.documentPath) {
|
|
43
|
+
try {
|
|
44
|
+
const text = readFileSync(state.documentPath, "utf8");
|
|
45
|
+
const parsed = parseDocumentFrontMatter(text);
|
|
46
|
+
if (parsed) {
|
|
47
|
+
const progress = checkboxProgress(parsed.body);
|
|
48
|
+
state.done = progress.done;
|
|
49
|
+
state.total = progress.total;
|
|
50
|
+
state.currentItem = progress.currentItem;
|
|
51
|
+
state.documentStage = parsed.frontMatter.stage;
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
catch {
|
|
56
|
+
// Document missing or unreadable; fall through.
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
if (state.questDir) {
|
|
60
|
+
try {
|
|
61
|
+
const text = readFileSync(join(state.questDir, "README.md"), "utf8");
|
|
62
|
+
const parsed = parseQuestDoc(text);
|
|
63
|
+
if (parsed) {
|
|
64
|
+
const progress = checkboxProgress(parsed.body);
|
|
65
|
+
state.done = progress.done;
|
|
66
|
+
state.total = progress.total;
|
|
67
|
+
state.currentItem = progress.currentItem;
|
|
68
|
+
return;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
catch {
|
|
72
|
+
// Quest missing; fall through.
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
state.done = 0;
|
|
76
|
+
state.total = 0;
|
|
77
|
+
state.currentItem = undefined;
|
|
78
|
+
}
|
|
79
|
+
/** Find a quest entry by id across the quests root. */
|
|
80
|
+
export function findQuestEntry(state, id) {
|
|
81
|
+
const { index } = discoverQuests(state.questsRoot);
|
|
82
|
+
return index.quests.get(id);
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Load a quest by id into `state`: the state-mutation half of pi's
|
|
86
|
+
* own `loadQuest`. pi's version additionally calls
|
|
87
|
+
* `pi.setSessionName?.()` once this succeeds -- a pi-only
|
|
88
|
+
* enrichment with no equivalent host concept, so it stays out of
|
|
89
|
+
* this pure version; an adapter that wants it layers it on after
|
|
90
|
+
* calling this.
|
|
91
|
+
*/
|
|
92
|
+
export function loadQuestById(state, id) {
|
|
93
|
+
const entry = findQuestEntry(state, id);
|
|
94
|
+
if (!entry) {
|
|
95
|
+
return {
|
|
96
|
+
ok: false,
|
|
97
|
+
guidance: `No quest with id "${id}" under ${state.questsRoot}.`,
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
state.questDir = entry.dir;
|
|
101
|
+
state.questId = entry.doc.frontMatter.id;
|
|
102
|
+
state.questTitle = entry.doc.title ?? null;
|
|
103
|
+
state.questKind = entry.doc.frontMatter.kind;
|
|
104
|
+
state.questStatus = entry.doc.frontMatter.status;
|
|
105
|
+
state.questPriority = entry.doc.frontMatter.priority;
|
|
106
|
+
state.questVerify = entry.doc.frontMatter.verify ?? null;
|
|
107
|
+
state.scratchDir = entry.doc.frontMatter.scratchDir ?? null;
|
|
108
|
+
state.documentPath = null;
|
|
109
|
+
state.documentId = null;
|
|
110
|
+
state.documentKind = null;
|
|
111
|
+
state.documentTitle = null;
|
|
112
|
+
state.documentStage = "idle";
|
|
113
|
+
refreshProgress(state);
|
|
114
|
+
return { ok: true };
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Re-read the loaded quest's README and refresh the in-memory
|
|
118
|
+
* slice (title, kind, status, priority) so an edit to the quest's
|
|
119
|
+
* own README shows up in the status line without a manual reload.
|
|
120
|
+
* No-op when no quest is loaded or the README cannot be read.
|
|
121
|
+
*/
|
|
122
|
+
export function refreshLoadedSlice(state) {
|
|
123
|
+
if (!state.questDir)
|
|
124
|
+
return;
|
|
125
|
+
let text;
|
|
126
|
+
try {
|
|
127
|
+
text = readFileSync(join(state.questDir, "README.md"), "utf8");
|
|
128
|
+
}
|
|
129
|
+
catch {
|
|
130
|
+
// README missing or unreadable; leave the slice as-is.
|
|
131
|
+
return;
|
|
132
|
+
}
|
|
133
|
+
const parsed = parseQuestDoc(text);
|
|
134
|
+
if (!parsed)
|
|
135
|
+
return;
|
|
136
|
+
state.questTitle = parsed.title ?? null;
|
|
137
|
+
state.questKind = parsed.frontMatter.kind;
|
|
138
|
+
state.questStatus = parsed.frontMatter.status;
|
|
139
|
+
state.questPriority = parsed.frontMatter.priority;
|
|
140
|
+
state.questVerify = parsed.frontMatter.verify ?? null;
|
|
141
|
+
state.scratchDir = parsed.frontMatter.scratchDir ?? null;
|
|
142
|
+
}
|
|
143
|
+
/** Unload the currently loaded quest. */
|
|
144
|
+
export function unloadQuest(state) {
|
|
145
|
+
state.questDir = null;
|
|
146
|
+
state.questId = null;
|
|
147
|
+
state.questTitle = null;
|
|
148
|
+
state.questKind = null;
|
|
149
|
+
state.questStatus = null;
|
|
150
|
+
state.questPriority = null;
|
|
151
|
+
state.questVerify = null;
|
|
152
|
+
state.scratchDir = null;
|
|
153
|
+
state.documentPath = null;
|
|
154
|
+
state.documentId = null;
|
|
155
|
+
state.documentKind = null;
|
|
156
|
+
state.documentTitle = null;
|
|
157
|
+
state.documentStage = "idle";
|
|
158
|
+
state.done = 0;
|
|
159
|
+
state.total = 0;
|
|
160
|
+
}
|
|
161
|
+
/** Focus a document under the loaded quest. */
|
|
162
|
+
export function focusDocument(state, docPath) {
|
|
163
|
+
if (!state.questDir) {
|
|
164
|
+
return { ok: false, guidance: "Load a quest first." };
|
|
165
|
+
}
|
|
166
|
+
let text;
|
|
167
|
+
try {
|
|
168
|
+
text = readFileSync(docPath, "utf8");
|
|
169
|
+
}
|
|
170
|
+
catch (err) {
|
|
171
|
+
return {
|
|
172
|
+
ok: false,
|
|
173
|
+
guidance: `Cannot read ${docPath}: ${err.message}`,
|
|
174
|
+
};
|
|
175
|
+
}
|
|
176
|
+
const parsed = parseDocumentFrontMatter(text);
|
|
177
|
+
if (!parsed) {
|
|
178
|
+
// Which field, not just that one is wrong. The answer used to be found
|
|
179
|
+
// by diffing the file against a sibling document.
|
|
180
|
+
return {
|
|
181
|
+
ok: false,
|
|
182
|
+
guidance: `Cannot focus ${docPath}: ${documentFrontMatterProblem(text) ?? "its front-matter will not parse"}.`,
|
|
183
|
+
};
|
|
184
|
+
}
|
|
185
|
+
state.documentPath = docPath;
|
|
186
|
+
state.documentId = parsed.frontMatter.id;
|
|
187
|
+
state.documentKind = parsed.frontMatter.kind;
|
|
188
|
+
state.documentTitle = extractTitle(parsed.body);
|
|
189
|
+
state.documentStage = parsed.frontMatter.stage;
|
|
190
|
+
refreshProgress(state);
|
|
191
|
+
return { ok: true };
|
|
192
|
+
}
|
|
193
|
+
/** Unfocus the active document. */
|
|
194
|
+
export function unfocusDocument(state) {
|
|
195
|
+
state.documentPath = null;
|
|
196
|
+
state.documentId = null;
|
|
197
|
+
state.documentKind = null;
|
|
198
|
+
state.documentTitle = null;
|
|
199
|
+
state.documentStage = "idle";
|
|
200
|
+
refreshProgress(state);
|
|
201
|
+
}
|
|
202
|
+
/**
|
|
203
|
+
* Persist the focused document's stage to its file and mirror it in
|
|
204
|
+
* state. Returns true when the stage reached disk, false when there
|
|
205
|
+
* is nothing to write to or the file is unreadable or unparseable,
|
|
206
|
+
* so the caller can refuse rather than let memory run ahead of disk.
|
|
207
|
+
*/
|
|
208
|
+
export function writeDocumentStage(state, stage) {
|
|
209
|
+
if (!state.documentPath)
|
|
210
|
+
return false;
|
|
211
|
+
const questDir = state.questDir;
|
|
212
|
+
let text;
|
|
213
|
+
try {
|
|
214
|
+
text = readFileSync(state.documentPath, "utf8");
|
|
215
|
+
}
|
|
216
|
+
catch {
|
|
217
|
+
return false;
|
|
218
|
+
}
|
|
219
|
+
const parsed = parseDocumentFrontMatter(text);
|
|
220
|
+
if (!parsed)
|
|
221
|
+
return false;
|
|
222
|
+
const newFm = {
|
|
223
|
+
...parsed.frontMatter,
|
|
224
|
+
stage: stage,
|
|
225
|
+
updated: nowYmd(),
|
|
226
|
+
};
|
|
227
|
+
const newText = `${serializeDocumentFrontMatter(newFm)}\n${parsed.body}`;
|
|
228
|
+
// Validate by parse-back, matching the quest mutation core: never
|
|
229
|
+
// write a document the strict parser cannot read back, which would
|
|
230
|
+
// drop it to an out-of-vocabulary stage and make it invisible.
|
|
231
|
+
const reparsed = parseDocumentFrontMatter(newText);
|
|
232
|
+
if (!reparsed || reparsed.frontMatter.stage !== newFm.stage)
|
|
233
|
+
return false;
|
|
234
|
+
const documentPath = state.documentPath;
|
|
235
|
+
if (questDir) {
|
|
236
|
+
atomicWriteUnderLock(questDir, documentPath, newText);
|
|
237
|
+
}
|
|
238
|
+
else {
|
|
239
|
+
atomicWriteFile(documentPath, newText);
|
|
240
|
+
}
|
|
241
|
+
state.documentStage = stage;
|
|
242
|
+
return true;
|
|
243
|
+
}
|
|
244
|
+
const DOC_KIND_DIRS = ["plans", "research", "briefs", "reports"];
|
|
245
|
+
const ACTIVE_DOC_STAGES = new Set(["think", "draft", "build"]);
|
|
246
|
+
/**
|
|
247
|
+
* Seal every still-active document under a quest to the quest's
|
|
248
|
+
* terminal stage, so concluding or retiring a quest does not leave
|
|
249
|
+
* documents stranded mid-stage. Returns how many were sealed.
|
|
250
|
+
* Best-effort per file: an unreadable document is skipped, not fatal.
|
|
251
|
+
*/
|
|
252
|
+
export function sealQuestDocuments(questDir, target) {
|
|
253
|
+
let sealed = 0;
|
|
254
|
+
for (const kindDir of DOC_KIND_DIRS) {
|
|
255
|
+
const dir = join(questDir, kindDir);
|
|
256
|
+
let entries;
|
|
257
|
+
try {
|
|
258
|
+
entries = readdirSync(dir, { withFileTypes: true });
|
|
259
|
+
}
|
|
260
|
+
catch {
|
|
261
|
+
continue;
|
|
262
|
+
}
|
|
263
|
+
for (const entry of entries) {
|
|
264
|
+
if (!entry.isFile() || !entry.name.endsWith(".md"))
|
|
265
|
+
continue;
|
|
266
|
+
const docPath = join(dir, entry.name);
|
|
267
|
+
let text;
|
|
268
|
+
try {
|
|
269
|
+
text = readFileSync(docPath, "utf8");
|
|
270
|
+
}
|
|
271
|
+
catch {
|
|
272
|
+
continue;
|
|
273
|
+
}
|
|
274
|
+
const parsed = parseDocumentFrontMatter(text);
|
|
275
|
+
if (!parsed)
|
|
276
|
+
continue;
|
|
277
|
+
if (!ACTIVE_DOC_STAGES.has(parsed.frontMatter.stage))
|
|
278
|
+
continue;
|
|
279
|
+
const newFm = {
|
|
280
|
+
...parsed.frontMatter,
|
|
281
|
+
stage: target,
|
|
282
|
+
updated: nowYmd(),
|
|
283
|
+
};
|
|
284
|
+
const sealedText = `${serializeDocumentFrontMatter(newFm)}\n${parsed.body}`;
|
|
285
|
+
// Validate by parse-back before writing, so the seal can never
|
|
286
|
+
// produce a document the strict parser drops to invisible.
|
|
287
|
+
const reparsed = parseDocumentFrontMatter(sealedText);
|
|
288
|
+
if (!reparsed || reparsed.frontMatter.stage !== target)
|
|
289
|
+
continue;
|
|
290
|
+
atomicWriteUnderLock(questDir, docPath, sealedText);
|
|
291
|
+
sealed++;
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
return sealed;
|
|
295
|
+
}
|
|
296
|
+
/** Append a Journey entry to the loaded quest's README. */
|
|
297
|
+
export function appendJourneyEntry(state, prose) {
|
|
298
|
+
if (!state.questDir)
|
|
299
|
+
return;
|
|
300
|
+
const ok = appendJourneyByPath(state.questDir, prose);
|
|
301
|
+
if (!ok) {
|
|
302
|
+
console.warn(`[quest] failed to append Journey entry to ${state.questDir}; README missing or unreadable.`);
|
|
303
|
+
return;
|
|
304
|
+
}
|
|
305
|
+
stampQuestUpdated(state);
|
|
306
|
+
}
|
|
307
|
+
/** Update the loaded quest's `updated` frontmatter to today. */
|
|
308
|
+
export function stampQuestUpdated(state) {
|
|
309
|
+
if (!state.questDir)
|
|
310
|
+
return;
|
|
311
|
+
// The identity transform still stamps updated in the core, so a
|
|
312
|
+
// touch is validated and locked like every other quest write.
|
|
313
|
+
mutateQuestFrontMatter(state.questDir, (fm) => fm);
|
|
314
|
+
}
|
|
315
|
+
function extractTitle(body) {
|
|
316
|
+
const match = /^#\s+(.+)$/m.exec(body);
|
|
317
|
+
return match ? match[1].trim() : null;
|
|
318
|
+
}
|
|
319
|
+
/** Create a new document under the loaded quest. */
|
|
320
|
+
export function createDocument(state, opts) {
|
|
321
|
+
if (!state.questDir)
|
|
322
|
+
return undefined;
|
|
323
|
+
const subDir = {
|
|
324
|
+
plan: "plans",
|
|
325
|
+
research: "research",
|
|
326
|
+
brief: "briefs",
|
|
327
|
+
report: "reports",
|
|
328
|
+
};
|
|
329
|
+
// Born readable or not born at all, the same rule the quest README
|
|
330
|
+
// writers meet. This is the writer that produced the five documents
|
|
331
|
+
// found invisible to discovery, and repairing the reader to fail
|
|
332
|
+
// open and explain itself left this end of it untouched: a document
|
|
333
|
+
// whose front matter will not parse is written, reported as drafted,
|
|
334
|
+
// and never listed again.
|
|
335
|
+
const complaints = explainDocumentFrontMatter(opts.scaffoldBody);
|
|
336
|
+
if (complaints.length > 0)
|
|
337
|
+
return undefined;
|
|
338
|
+
const dir = join(state.questDir, subDir[opts.kind]);
|
|
339
|
+
mkdirSync(dir, { recursive: true });
|
|
340
|
+
const path = join(dir, `${opts.id}.md`);
|
|
341
|
+
// New document; scaffold atomically. Subsequent writes go
|
|
342
|
+
// through writeDocumentStage which holds the lock too.
|
|
343
|
+
atomicWriteUnderLock(state.questDir, path, opts.scaffoldBody);
|
|
344
|
+
return path;
|
|
345
|
+
}
|
|
346
|
+
/**
|
|
347
|
+
* Inventory every working tree recorded across all quests,
|
|
348
|
+
* attributing each to its owning quest. This is what lets the
|
|
349
|
+
* harness-created trees be seen and reaped in one place instead
|
|
350
|
+
* of being a mystery pile of directories.
|
|
351
|
+
*/
|
|
352
|
+
export function inventoryWorktrees(state) {
|
|
353
|
+
const { index } = discoverQuests(state.questsRoot);
|
|
354
|
+
const entries = [];
|
|
355
|
+
for (const quest of index.quests.values()) {
|
|
356
|
+
const fm = quest.doc.frontMatter;
|
|
357
|
+
for (const tree of fm.trees ?? []) {
|
|
358
|
+
const entry = {
|
|
359
|
+
path: tree.path,
|
|
360
|
+
questId: fm.id,
|
|
361
|
+
questTitle: quest.doc.title ?? null,
|
|
362
|
+
exists: existsSync(tree.path),
|
|
363
|
+
};
|
|
364
|
+
if (tree.branch)
|
|
365
|
+
entry.branch = tree.branch;
|
|
366
|
+
entries.push(entry);
|
|
367
|
+
}
|
|
368
|
+
}
|
|
369
|
+
return entries.sort((a, b) => a.path.localeCompare(b.path));
|
|
370
|
+
}
|
|
371
|
+
/** Discover quests for /quest-list etc. */
|
|
372
|
+
export function listAllQuests(state) {
|
|
373
|
+
const { index } = discoverQuests(state.questsRoot);
|
|
374
|
+
return [...index.quests.values()];
|
|
375
|
+
}
|
|
376
|
+
/** Ensure the quests root exists on disk. */
|
|
377
|
+
export function ensureQuestsRoot(state) {
|
|
378
|
+
if (!existsSync(state.questsRoot)) {
|
|
379
|
+
mkdirSync(state.questsRoot, { recursive: true });
|
|
380
|
+
}
|
|
381
|
+
}
|
|
382
|
+
/**
|
|
383
|
+
* Reorder the sibling set the given quest belongs to.
|
|
384
|
+
* Siblings share both `parent` and `priority`. Writes the
|
|
385
|
+
* updated rank back to every quest whose rank changed.
|
|
386
|
+
*/
|
|
387
|
+
export function reorderSiblings(state, questId, action) {
|
|
388
|
+
const { index } = discoverQuests(state.questsRoot);
|
|
389
|
+
const pivot = index.quests.get(questId);
|
|
390
|
+
if (!pivot) {
|
|
391
|
+
return {
|
|
392
|
+
ok: false,
|
|
393
|
+
guidance: `No quest with id "${questId}" under ${state.questsRoot}.`,
|
|
394
|
+
};
|
|
395
|
+
}
|
|
396
|
+
if (isSealedStatus(pivot.doc.frontMatter.status)) {
|
|
397
|
+
return {
|
|
398
|
+
ok: false,
|
|
399
|
+
guidance: `Quest "${questId}" is ${pivot.doc.frontMatter.status}; reopen it before reordering.`,
|
|
400
|
+
};
|
|
401
|
+
}
|
|
402
|
+
const siblings = [];
|
|
403
|
+
for (const entry of index.quests.values()) {
|
|
404
|
+
if (entry.doc.frontMatter.parent === pivot.doc.frontMatter.parent &&
|
|
405
|
+
entry.doc.frontMatter.priority === pivot.doc.frontMatter.priority &&
|
|
406
|
+
!isSealedStatus(entry.doc.frontMatter.status)) {
|
|
407
|
+
siblings.push(entry);
|
|
408
|
+
}
|
|
409
|
+
}
|
|
410
|
+
const before = siblings.map((e) => ({
|
|
411
|
+
id: e.doc.frontMatter.id,
|
|
412
|
+
rank: e.doc.frontMatter.rank,
|
|
413
|
+
}));
|
|
414
|
+
let after;
|
|
415
|
+
switch (action.kind) {
|
|
416
|
+
case "top":
|
|
417
|
+
after = rankTop(before, questId);
|
|
418
|
+
break;
|
|
419
|
+
case "bottom":
|
|
420
|
+
after = rankBottom(before, questId);
|
|
421
|
+
break;
|
|
422
|
+
case "bump":
|
|
423
|
+
after = rankBump(before, questId);
|
|
424
|
+
break;
|
|
425
|
+
case "sink":
|
|
426
|
+
after = rankSink(before, questId);
|
|
427
|
+
break;
|
|
428
|
+
case "before":
|
|
429
|
+
after = rankBefore(before, questId, action.target);
|
|
430
|
+
break;
|
|
431
|
+
case "after":
|
|
432
|
+
after = rankAfter(before, questId, action.target);
|
|
433
|
+
break;
|
|
434
|
+
case "renumber":
|
|
435
|
+
after = rankRenumber(before);
|
|
436
|
+
break;
|
|
437
|
+
}
|
|
438
|
+
const changes = diffRanks(before, after);
|
|
439
|
+
const rankById = new Map(after.map((e) => [e.id, e.rank]));
|
|
440
|
+
for (const entry of siblings) {
|
|
441
|
+
const newRank = rankById.get(entry.doc.frontMatter.id);
|
|
442
|
+
if (newRank === undefined)
|
|
443
|
+
continue;
|
|
444
|
+
if (newRank === entry.doc.frontMatter.rank)
|
|
445
|
+
continue;
|
|
446
|
+
writeQuestRank(entry.dir, newRank);
|
|
447
|
+
}
|
|
448
|
+
return { ok: true, result: { siblings, changes } };
|
|
449
|
+
}
|
|
450
|
+
function writeQuestRank(questDir, rank) {
|
|
451
|
+
// Routed through the validated mutation core so a rank write is
|
|
452
|
+
// validated and stamped the same way every other field write is.
|
|
453
|
+
mutateQuestFrontMatter(questDir, (fm) => ({ ...fm, rank }));
|
|
454
|
+
}
|
|
455
|
+
/**
|
|
456
|
+
* Set a quest's rank by directory. The by-dir counterpart to the
|
|
457
|
+
* internal `writeQuestRank`, exported so undo can reverse a journalled
|
|
458
|
+
* rank change (a reparent re-ranks into its new sibling set).
|
|
459
|
+
*/
|
|
460
|
+
export function setQuestRankByDir(questDir, rank) {
|
|
461
|
+
const result = writeQuestFrontMatter(questDir, (fm) => ({ ...fm, rank }));
|
|
462
|
+
if (!result.ok)
|
|
463
|
+
return result;
|
|
464
|
+
return { ok: true };
|
|
465
|
+
}
|
|
466
|
+
/**
|
|
467
|
+
* Set any journalled field by directory, through the lens that knows
|
|
468
|
+
* how to write it.
|
|
469
|
+
*
|
|
470
|
+
* Undo used to reach for one exported setter per field and cast the
|
|
471
|
+
* journalled string to that field's type on the way in. The lens
|
|
472
|
+
* checks the value against the field's vocabulary instead, so a
|
|
473
|
+
* journal entry carrying a word the vocabulary has since lost is
|
|
474
|
+
* refused with a reason rather than written back unexamined.
|
|
475
|
+
*/
|
|
476
|
+
export function setQuestFieldByDir(questDir, lens, value) {
|
|
477
|
+
let refusal;
|
|
478
|
+
const result = writeQuestFrontMatter(questDir, (fm) => {
|
|
479
|
+
const written = lens.write(fm, value);
|
|
480
|
+
if (written.ok)
|
|
481
|
+
return written.fm;
|
|
482
|
+
refusal = written.reason;
|
|
483
|
+
return undefined;
|
|
484
|
+
});
|
|
485
|
+
if (refusal)
|
|
486
|
+
return { ok: false, guidance: refusal };
|
|
487
|
+
if (!result.ok)
|
|
488
|
+
return result;
|
|
489
|
+
return { ok: true };
|
|
490
|
+
}
|
|
491
|
+
/** Build a reverse alias index across every discovered quest. */
|
|
492
|
+
export function buildQuestsAliasIndex(state) {
|
|
493
|
+
const { index } = discoverQuests(state.questsRoot);
|
|
494
|
+
return buildAliasIndex(index);
|
|
495
|
+
}
|
|
496
|
+
function writeQuestFrontMatter(questDir, mutate) {
|
|
497
|
+
const result = mutateQuestFrontMatter(questDir, mutate);
|
|
498
|
+
if (!result.ok)
|
|
499
|
+
return result;
|
|
500
|
+
return { ok: true, fm: result.fm };
|
|
501
|
+
}
|
|
502
|
+
/**
|
|
503
|
+
* Set a quest's parent by directory, stamping `updated` and
|
|
504
|
+
* appending a Journey entry. Used by the reparent verb, which
|
|
505
|
+
* may move quests other than the loaded one.
|
|
506
|
+
*/
|
|
507
|
+
export function setQuestParent(questDir, newParent) {
|
|
508
|
+
const result = writeQuestFrontMatter(questDir, (fm) => ({
|
|
509
|
+
...fm,
|
|
510
|
+
parent: newParent,
|
|
511
|
+
}));
|
|
512
|
+
if (!result.ok)
|
|
513
|
+
return result;
|
|
514
|
+
appendJourneyByPath(questDir, `Reparented to ${newParent ?? "top level"}.`);
|
|
515
|
+
return { ok: true };
|
|
516
|
+
}
|
|
517
|
+
/** Set a quest's status by directory, stamping `updated`. */
|
|
518
|
+
export function setQuestStatusByDir(questDir, status) {
|
|
519
|
+
const result = writeQuestFrontMatter(questDir, (fm) => ({ ...fm, status }));
|
|
520
|
+
if (!result.ok)
|
|
521
|
+
return result;
|
|
522
|
+
return { ok: true };
|
|
523
|
+
}
|
|
524
|
+
/**
|
|
525
|
+
* Set a quest's priority by directory (the by-id counterpart to
|
|
526
|
+
* `setLoadedPriority`). Used by the bulk seal cascade and by undo
|
|
527
|
+
* when it reverses a journalled priority change.
|
|
528
|
+
*/
|
|
529
|
+
export function setQuestPriorityByDir(questDir, priority) {
|
|
530
|
+
const result = writeQuestFrontMatter(questDir, (fm) => ({ ...fm, priority }));
|
|
531
|
+
if (!result.ok)
|
|
532
|
+
return result;
|
|
533
|
+
return { ok: true };
|
|
534
|
+
}
|
|
535
|
+
/**
|
|
536
|
+
* Add one or more aliases to the loaded quest in a single front-matter
|
|
537
|
+
* write, so a list either lands whole or not at all and no partial
|
|
538
|
+
* state survives a failure. Aliases already present, and duplicates
|
|
539
|
+
* within the batch, are reported as already and added only once.
|
|
540
|
+
*/
|
|
541
|
+
export function addAliasesToLoaded(state, aliases) {
|
|
542
|
+
if (!state.questDir)
|
|
543
|
+
return { ok: false, guidance: "Load a quest first." };
|
|
544
|
+
let added = [];
|
|
545
|
+
let already = [];
|
|
546
|
+
const result = writeQuestFrontMatter(state.questDir, (fm) => {
|
|
547
|
+
// Reset on every invocation so a retried write does not
|
|
548
|
+
// accumulate duplicate report entries.
|
|
549
|
+
added = [];
|
|
550
|
+
already = [];
|
|
551
|
+
const next = [...fm.aliases];
|
|
552
|
+
for (const alias of aliases) {
|
|
553
|
+
const present = next.some((a) => a.type === alias.type && a.value === alias.value);
|
|
554
|
+
if (present) {
|
|
555
|
+
already.push(alias);
|
|
556
|
+
continue;
|
|
557
|
+
}
|
|
558
|
+
added.push(alias);
|
|
559
|
+
next.push(alias);
|
|
560
|
+
}
|
|
561
|
+
return { ...fm, aliases: next };
|
|
562
|
+
});
|
|
563
|
+
if (!result.ok)
|
|
564
|
+
return result;
|
|
565
|
+
return { ok: true, added, already };
|
|
566
|
+
}
|
|
567
|
+
/** Remove an alias from the loaded quest. */
|
|
568
|
+
export function removeAliasFromLoaded(state, alias) {
|
|
569
|
+
if (!state.questDir)
|
|
570
|
+
return { ok: false, guidance: "Load a quest first." };
|
|
571
|
+
let removed = false;
|
|
572
|
+
const result = writeQuestFrontMatter(state.questDir, (fm) => {
|
|
573
|
+
const next = fm.aliases.filter((a) => !(a.type === alias.type && a.value === alias.value));
|
|
574
|
+
if (next.length === fm.aliases.length)
|
|
575
|
+
return undefined;
|
|
576
|
+
removed = true;
|
|
577
|
+
return { ...fm, aliases: next };
|
|
578
|
+
});
|
|
579
|
+
if (!result.ok)
|
|
580
|
+
return result;
|
|
581
|
+
return { ok: true, removed };
|
|
582
|
+
}
|
|
583
|
+
/**
|
|
584
|
+
* Remove one or more aliases from the loaded quest in a single write,
|
|
585
|
+
* the batch counterpart to addAliasesToLoaded. Reports which were
|
|
586
|
+
* removed and which were absent, so the verb can signal a partial or
|
|
587
|
+
* whole no-op the same way the add path does.
|
|
588
|
+
*/
|
|
589
|
+
export function removeAliasesFromLoaded(state, aliases) {
|
|
590
|
+
if (!state.questDir)
|
|
591
|
+
return { ok: false, guidance: "Load a quest first." };
|
|
592
|
+
let removed = [];
|
|
593
|
+
let absent = [];
|
|
594
|
+
const result = writeQuestFrontMatter(state.questDir, (fm) => {
|
|
595
|
+
removed = [];
|
|
596
|
+
absent = [];
|
|
597
|
+
const drop = (a) => aliases.some((t) => t.type === a.type && t.value === a.value);
|
|
598
|
+
for (const target of aliases) {
|
|
599
|
+
if (fm.aliases.some((a) => a.type === target.type && a.value === target.value)) {
|
|
600
|
+
removed.push(target);
|
|
601
|
+
}
|
|
602
|
+
else {
|
|
603
|
+
absent.push(target);
|
|
604
|
+
}
|
|
605
|
+
}
|
|
606
|
+
if (removed.length === 0)
|
|
607
|
+
return undefined;
|
|
608
|
+
return { ...fm, aliases: fm.aliases.filter((a) => !drop(a)) };
|
|
609
|
+
});
|
|
610
|
+
if (!result.ok)
|
|
611
|
+
return result;
|
|
612
|
+
return { ok: true, removed, absent };
|
|
613
|
+
}
|
|
614
|
+
/** Attach a session id to the loaded quest. */
|
|
615
|
+
export function attachSessionToLoaded(state, session) {
|
|
616
|
+
if (!state.questDir)
|
|
617
|
+
return { ok: false, guidance: "Load a quest first." };
|
|
618
|
+
let added = false;
|
|
619
|
+
const result = writeQuestFrontMatter(state.questDir, (fm) => {
|
|
620
|
+
const existing = fm.sessions.find((s) => s.id === session.id);
|
|
621
|
+
if (existing) {
|
|
622
|
+
// Refresh status to active and merge any new fields, but keep
|
|
623
|
+
// the original started: it records when the session first
|
|
624
|
+
// touched this quest, not the latest attach. Letting the
|
|
625
|
+
// incoming started win would defeat the no-op guard below and
|
|
626
|
+
// churn the README on every load.
|
|
627
|
+
const merged = {
|
|
628
|
+
...existing,
|
|
629
|
+
...session,
|
|
630
|
+
started: existing.started ?? session.started,
|
|
631
|
+
status: "active",
|
|
632
|
+
};
|
|
633
|
+
if (JSON.stringify(merged) === JSON.stringify(existing)) {
|
|
634
|
+
return undefined;
|
|
635
|
+
}
|
|
636
|
+
return {
|
|
637
|
+
...fm,
|
|
638
|
+
sessions: fm.sessions.map((s) => (s.id === session.id ? merged : s)),
|
|
639
|
+
};
|
|
640
|
+
}
|
|
641
|
+
added = true;
|
|
642
|
+
const next = { status: "active", ...session };
|
|
643
|
+
return { ...fm, sessions: [...fm.sessions, next] };
|
|
644
|
+
});
|
|
645
|
+
if (!result.ok)
|
|
646
|
+
return result;
|
|
647
|
+
return { ok: true, added };
|
|
648
|
+
}
|
|
649
|
+
/**
|
|
650
|
+
* Capture the current process's liveness identity for a session
|
|
651
|
+
* attach: its instance id, OS process identity and the terminal
|
|
652
|
+
* surface it runs in (when a driver recognises one). Read once at
|
|
653
|
+
* attach time; the stored handle is what a later reader probes.
|
|
654
|
+
*/
|
|
655
|
+
export function captureSessionIdentity() {
|
|
656
|
+
const handle = identifyCurrentTerminal();
|
|
657
|
+
return {
|
|
658
|
+
instanceId: currentInstanceId(),
|
|
659
|
+
process: currentProcessIdentity(),
|
|
660
|
+
terminal: handle
|
|
661
|
+
? {
|
|
662
|
+
driverId: handle.driverId,
|
|
663
|
+
value: handle.value,
|
|
664
|
+
scope: handle.scope,
|
|
665
|
+
hostId: handle.hostId,
|
|
666
|
+
}
|
|
667
|
+
: undefined,
|
|
668
|
+
};
|
|
669
|
+
}
|
|
670
|
+
/**
|
|
671
|
+
* Attach the current session to the loaded quest.
|
|
672
|
+
*
|
|
673
|
+
* This is the automatic-capture path: a session-start or load flow
|
|
674
|
+
* calls it so a quest's sessions frontmatter records where work
|
|
675
|
+
* happened without the user attaching by hand. It refreshes an
|
|
676
|
+
* existing record rather than duplicating, and no-ops cleanly when
|
|
677
|
+
* no quest is loaded or the session id is unknown.
|
|
678
|
+
*/
|
|
679
|
+
export function attachCurrentSession(state, opts) {
|
|
680
|
+
// An ephemeral session has an id but writes no log, so attaching it
|
|
681
|
+
// would leave a phantom entry that can never be resumed. Skip it;
|
|
682
|
+
// only a persisted session earns a record.
|
|
683
|
+
if (opts.persisted === false)
|
|
684
|
+
return { attached: false };
|
|
685
|
+
if (!state.questDir || !opts.id)
|
|
686
|
+
return { attached: false };
|
|
687
|
+
const session = {
|
|
688
|
+
id: opts.id,
|
|
689
|
+
started: new Date().toISOString(),
|
|
690
|
+
status: "active",
|
|
691
|
+
};
|
|
692
|
+
if (opts.cwd?.trim())
|
|
693
|
+
session.cwd = opts.cwd.trim();
|
|
694
|
+
if (opts.instanceId)
|
|
695
|
+
session.instanceId = opts.instanceId;
|
|
696
|
+
if (opts.process)
|
|
697
|
+
session.process = opts.process;
|
|
698
|
+
if (opts.terminal)
|
|
699
|
+
session.terminal = opts.terminal;
|
|
700
|
+
const result = attachSessionToLoaded(state, session);
|
|
701
|
+
return { attached: result.ok };
|
|
702
|
+
}
|
|
703
|
+
/**
|
|
704
|
+
* Detach a session only when the caller's process instance owns the
|
|
705
|
+
* record, so a process that resumed a session is not detached by the
|
|
706
|
+
* delayed shutdown of the process that used to hold it. A record with
|
|
707
|
+
* no recorded instance id is legacy and detaches unconditionally,
|
|
708
|
+
* preserving the pre-lease behaviour.
|
|
709
|
+
*/
|
|
710
|
+
export function detachSessionIfOwner(questDir, sessionId, instanceId) {
|
|
711
|
+
let detached = false;
|
|
712
|
+
const result = writeQuestFrontMatter(questDir, (fm) => {
|
|
713
|
+
let hit = false;
|
|
714
|
+
const next = fm.sessions.map((s) => {
|
|
715
|
+
if (s.id !== sessionId || s.status === "detached")
|
|
716
|
+
return s;
|
|
717
|
+
// A different live instance owns the record: leave it be.
|
|
718
|
+
if (s.instanceId !== undefined && s.instanceId !== instanceId)
|
|
719
|
+
return s;
|
|
720
|
+
hit = true;
|
|
721
|
+
return { ...s, status: "detached" };
|
|
722
|
+
});
|
|
723
|
+
if (!hit)
|
|
724
|
+
return undefined;
|
|
725
|
+
detached = true;
|
|
726
|
+
return { ...fm, sessions: next };
|
|
727
|
+
});
|
|
728
|
+
if (!result.ok)
|
|
729
|
+
return result;
|
|
730
|
+
return { ok: true, detached };
|
|
731
|
+
}
|
|
732
|
+
/** Mark a session as detached on the loaded quest. */
|
|
733
|
+
export function detachSessionFromLoaded(state, sessionId) {
|
|
734
|
+
if (!state.questDir)
|
|
735
|
+
return { ok: false, guidance: "Load a quest first." };
|
|
736
|
+
return detachSessionInQuestDir(state.questDir, sessionId);
|
|
737
|
+
}
|
|
738
|
+
/**
|
|
739
|
+
* Reconcile a session's membership so it reads active on exactly one
|
|
740
|
+
* quest: detach the session from every quest other than the one being
|
|
741
|
+
* kept. The switch path already releases the immediate prior quest;
|
|
742
|
+
* this catches stragglers left by earlier runs or a lost state, so a
|
|
743
|
+
* session never lingers active on several quests at once. Returns the
|
|
744
|
+
* ids it detached the session from.
|
|
745
|
+
*/
|
|
746
|
+
export function reconcileSessionMembership(state, sessionId, keepQuestId) {
|
|
747
|
+
const { index } = discoverQuests(state.questsRoot);
|
|
748
|
+
const detachedFrom = [];
|
|
749
|
+
for (const entry of index.quests.values()) {
|
|
750
|
+
const fm = entry.doc.frontMatter;
|
|
751
|
+
if (fm.id === keepQuestId)
|
|
752
|
+
continue;
|
|
753
|
+
const holdsActive = fm.sessions.some((s) => s.id === sessionId && s.status !== "detached");
|
|
754
|
+
if (!holdsActive)
|
|
755
|
+
continue;
|
|
756
|
+
const result = detachSessionInQuestDir(entry.dir, sessionId);
|
|
757
|
+
if (result.ok && result.detached)
|
|
758
|
+
detachedFrom.push(fm.id);
|
|
759
|
+
}
|
|
760
|
+
return detachedFrom;
|
|
761
|
+
}
|
|
762
|
+
export function detachSessionInQuestDir(questDir, sessionId) {
|
|
763
|
+
let detached = false;
|
|
764
|
+
const result = writeQuestFrontMatter(questDir, (fm) => {
|
|
765
|
+
let hit = false;
|
|
766
|
+
const next = fm.sessions.map((s) => {
|
|
767
|
+
if (s.id !== sessionId)
|
|
768
|
+
return s;
|
|
769
|
+
if (s.status === "detached")
|
|
770
|
+
return s;
|
|
771
|
+
hit = true;
|
|
772
|
+
return { ...s, status: "detached" };
|
|
773
|
+
});
|
|
774
|
+
if (!hit)
|
|
775
|
+
return undefined;
|
|
776
|
+
detached = true;
|
|
777
|
+
return { ...fm, sessions: next };
|
|
778
|
+
});
|
|
779
|
+
if (!result.ok)
|
|
780
|
+
return result;
|
|
781
|
+
return { ok: true, detached };
|
|
782
|
+
}
|
|
783
|
+
const PRIORITY_ORDER = [
|
|
784
|
+
"driving",
|
|
785
|
+
"active",
|
|
786
|
+
"queued",
|
|
787
|
+
"bench",
|
|
788
|
+
"someday",
|
|
789
|
+
];
|
|
790
|
+
/** Set the loaded quest's priority bucket. */
|
|
791
|
+
export function setLoadedPriority(state, priority) {
|
|
792
|
+
if (!state.questDir)
|
|
793
|
+
return { ok: false, guidance: "Load a quest first." };
|
|
794
|
+
let changed = false;
|
|
795
|
+
const result = writeQuestFrontMatter(state.questDir, (fm) => {
|
|
796
|
+
if (fm.priority === priority)
|
|
797
|
+
return undefined;
|
|
798
|
+
changed = true;
|
|
799
|
+
// Append to the end of the destination bucket rather than
|
|
800
|
+
// colliding at rank 1: take the next free rank in the target
|
|
801
|
+
// (parent, priority) group, excluding the quest being moved.
|
|
802
|
+
const { index } = discoverQuests(state.questsRoot);
|
|
803
|
+
const destRanks = siblingRanks(index, fm.parent ?? null, priority, fm.id);
|
|
804
|
+
return { ...fm, priority, rank: nextRank(destRanks) };
|
|
805
|
+
});
|
|
806
|
+
if (!result.ok)
|
|
807
|
+
return result;
|
|
808
|
+
if (changed) {
|
|
809
|
+
state.questPriority = priority;
|
|
810
|
+
}
|
|
811
|
+
return { ok: true, changed };
|
|
812
|
+
}
|
|
813
|
+
/**
|
|
814
|
+
* Change the loaded quest's kind. A subquest needs a parent to rank
|
|
815
|
+
* within, so refuse the move to subquest when the quest has none.
|
|
816
|
+
* Returns whether the kind actually changed.
|
|
817
|
+
*/
|
|
818
|
+
export function setLoadedKind(state, kind) {
|
|
819
|
+
if (!state.questDir)
|
|
820
|
+
return { ok: false, guidance: "Load a quest first." };
|
|
821
|
+
let changed = false;
|
|
822
|
+
let refusal;
|
|
823
|
+
const result = writeQuestFrontMatter(state.questDir, (fm) => {
|
|
824
|
+
if (fm.kind === kind)
|
|
825
|
+
return undefined;
|
|
826
|
+
if (kind === "subquest" && (fm.parent ?? null) === null) {
|
|
827
|
+
refusal =
|
|
828
|
+
"A subquest needs a parent to rank within; reparent it under a quest first.";
|
|
829
|
+
return undefined;
|
|
830
|
+
}
|
|
831
|
+
changed = true;
|
|
832
|
+
return { ...fm, kind };
|
|
833
|
+
});
|
|
834
|
+
if (refusal)
|
|
835
|
+
return { ok: false, guidance: refusal };
|
|
836
|
+
if (!result.ok)
|
|
837
|
+
return result;
|
|
838
|
+
return { ok: true, changed };
|
|
839
|
+
}
|
|
840
|
+
/** Shift the loaded quest one bucket up or down the priority ladder. */
|
|
841
|
+
export function bumpLoadedPriority(state, direction) {
|
|
842
|
+
if (!state.questDir || !state.questPriority) {
|
|
843
|
+
return { ok: false, guidance: "Load a quest first." };
|
|
844
|
+
}
|
|
845
|
+
const i = PRIORITY_ORDER.indexOf(state.questPriority);
|
|
846
|
+
if (i < 0)
|
|
847
|
+
return { ok: false, guidance: "Unknown priority on the loaded quest." };
|
|
848
|
+
const step = direction === "up" ? -1 : 1;
|
|
849
|
+
const j = Math.min(PRIORITY_ORDER.length - 1, Math.max(0, i + step));
|
|
850
|
+
const next = PRIORITY_ORDER[j];
|
|
851
|
+
const from = state.questPriority;
|
|
852
|
+
if (next === from)
|
|
853
|
+
return { ok: true, from, to: from };
|
|
854
|
+
const result = setLoadedPriority(state, next);
|
|
855
|
+
if (!result.ok)
|
|
856
|
+
return result;
|
|
857
|
+
return { ok: true, from, to: next };
|
|
858
|
+
}
|
|
859
|
+
/** Set the loaded quest's coarse status enum. */
|
|
860
|
+
export function setLoadedStatus(state, status) {
|
|
861
|
+
if (!state.questDir)
|
|
862
|
+
return { ok: false, guidance: "Load a quest first." };
|
|
863
|
+
let changed = false;
|
|
864
|
+
const result = writeQuestFrontMatter(state.questDir, (fm) => {
|
|
865
|
+
if (fm.status === status)
|
|
866
|
+
return undefined;
|
|
867
|
+
changed = true;
|
|
868
|
+
return { ...fm, status };
|
|
869
|
+
});
|
|
870
|
+
if (!result.ok)
|
|
871
|
+
return result;
|
|
872
|
+
if (changed) {
|
|
873
|
+
state.questStatus = status;
|
|
874
|
+
}
|
|
875
|
+
return { ok: true, changed };
|
|
876
|
+
}
|
|
877
|
+
/** Rename a session on the loaded quest. */
|
|
878
|
+
export function renameSessionOnLoaded(state, sessionId, name) {
|
|
879
|
+
if (!state.questDir)
|
|
880
|
+
return { ok: false, guidance: "Load a quest first." };
|
|
881
|
+
let renamed = false;
|
|
882
|
+
const result = writeQuestFrontMatter(state.questDir, (fm) => {
|
|
883
|
+
let hit = false;
|
|
884
|
+
const next = fm.sessions.map((s) => {
|
|
885
|
+
if (s.id !== sessionId)
|
|
886
|
+
return s;
|
|
887
|
+
if (s.name === name)
|
|
888
|
+
return s;
|
|
889
|
+
hit = true;
|
|
890
|
+
return { ...s, name };
|
|
891
|
+
});
|
|
892
|
+
if (!hit)
|
|
893
|
+
return undefined;
|
|
894
|
+
renamed = true;
|
|
895
|
+
return { ...fm, sessions: next };
|
|
896
|
+
});
|
|
897
|
+
if (!result.ok)
|
|
898
|
+
return result;
|
|
899
|
+
return { ok: true, renamed };
|
|
900
|
+
}
|