@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,223 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Mermaid diagram rendering.
|
|
3
|
+
*
|
|
4
|
+
* Renders Mermaid source to two artifacts: the vector SVG Mermaid
|
|
5
|
+
* produces (crisp at any zoom, the human's readable copy) and a PNG
|
|
6
|
+
* rasterized from it (the portable raster and the inline image a vision
|
|
7
|
+
* model sees). The PNG is scaled to sit just under the vision-model
|
|
8
|
+
* pixel cap, because sending a larger image only makes the API
|
|
9
|
+
* downscale and blur the text server-side. Rendering rides the shared
|
|
10
|
+
* browser lifecycle from browser.ts rather than launching its own, so
|
|
11
|
+
* it inherits the same teardown.
|
|
12
|
+
*/
|
|
13
|
+
import * as crypto from "node:crypto";
|
|
14
|
+
import * as fs from "node:fs";
|
|
15
|
+
import * as os from "node:os";
|
|
16
|
+
import * as path from "node:path";
|
|
17
|
+
import { newPage } from "./browser.js";
|
|
18
|
+
/** Pinned Mermaid version, fetched once from jsDelivr. */
|
|
19
|
+
const MERMAID_CDN = "https://cdn.jsdelivr.net/npm/mermaid@11/dist/mermaid.min.js";
|
|
20
|
+
/** How long to wait for the one-time Mermaid library fetch. */
|
|
21
|
+
const MERMAID_FETCH_TIMEOUT_MS = 15_000;
|
|
22
|
+
/**
|
|
23
|
+
* Longest-edge cap for the rasterized PNG, in pixels. Matches the Opus
|
|
24
|
+
* 4.7-plus vision budget; larger images are downscaled server-side.
|
|
25
|
+
*/
|
|
26
|
+
const PNG_MAX_LONG_EDGE = 2576;
|
|
27
|
+
/**
|
|
28
|
+
* Total-area cap for the rasterized PNG, in pixels (~3.75 megapixels,
|
|
29
|
+
* the Opus 4.7-plus budget). A squarish diagram hits this before the
|
|
30
|
+
* long-edge cap; a wide one hits the long edge first.
|
|
31
|
+
*/
|
|
32
|
+
const PNG_MAX_PIXELS = 3_750_000;
|
|
33
|
+
/**
|
|
34
|
+
* Largest factor we upscale a small diagram by. Rasterizing a vector at
|
|
35
|
+
* scale keeps text crisp, but chasing the cap for a tiny diagram would
|
|
36
|
+
* bloat it to no benefit, so the upscale is bounded.
|
|
37
|
+
*/
|
|
38
|
+
const PNG_MAX_UPSCALE = 4;
|
|
39
|
+
/**
|
|
40
|
+
* Compute the raster scale for a diagram of the given intrinsic size so
|
|
41
|
+
* the PNG lands as close to the pixel budget as possible without
|
|
42
|
+
* crossing the long-edge or total-area cap. A diagram already larger
|
|
43
|
+
* than the cap is scaled down to fit; a smaller one is scaled up to the
|
|
44
|
+
* upscale ceiling so its text stays crisp.
|
|
45
|
+
*/
|
|
46
|
+
export function pngRenderScale({ width, height }) {
|
|
47
|
+
if (width <= 0 || height <= 0)
|
|
48
|
+
return 1;
|
|
49
|
+
const edgeScale = PNG_MAX_LONG_EDGE / Math.max(width, height);
|
|
50
|
+
const areaScale = Math.sqrt(PNG_MAX_PIXELS / (width * height));
|
|
51
|
+
const capScale = Math.min(edgeScale, areaScale);
|
|
52
|
+
if (capScale < 1)
|
|
53
|
+
return capScale;
|
|
54
|
+
return Math.min(capScale, PNG_MAX_UPSCALE);
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Final integer PNG dimensions for a diagram of the given intrinsic
|
|
58
|
+
* size. The continuous scale is chosen so the unrounded box fits the
|
|
59
|
+
* budget; flooring to whole pixels can only shrink it, so the returned
|
|
60
|
+
* dimensions never cross the long-edge or total-area cap even after
|
|
61
|
+
* integerization (which independent rounding would not guarantee).
|
|
62
|
+
*/
|
|
63
|
+
export function pngPixelSize({ width, height }) {
|
|
64
|
+
const scale = pngRenderScale({ width, height });
|
|
65
|
+
return {
|
|
66
|
+
width: Math.max(1, Math.floor(width * scale)),
|
|
67
|
+
height: Math.max(1, Math.floor(height * scale)),
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
/** The Mermaid library source, fetched once and reused per process. */
|
|
71
|
+
let cachedMermaidSource;
|
|
72
|
+
/**
|
|
73
|
+
* Fetch the Mermaid library source once, in Node, and cache it.
|
|
74
|
+
* Injecting the cached content into the render page means the page
|
|
75
|
+
* itself does no network work mid-render, which is what made
|
|
76
|
+
* rendering hang under a busy shared browser.
|
|
77
|
+
*/
|
|
78
|
+
export async function loadMermaidSource(fetchImpl = fetch) {
|
|
79
|
+
if (cachedMermaidSource)
|
|
80
|
+
return cachedMermaidSource;
|
|
81
|
+
let response;
|
|
82
|
+
try {
|
|
83
|
+
response = await fetchImpl(MERMAID_CDN, {
|
|
84
|
+
signal: AbortSignal.timeout(MERMAID_FETCH_TIMEOUT_MS),
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
catch {
|
|
88
|
+
throw new MermaidRenderError("Could not fetch the Mermaid library (network required). " +
|
|
89
|
+
"Rendering needs internet access to fetch Mermaid.");
|
|
90
|
+
}
|
|
91
|
+
if (!response.ok) {
|
|
92
|
+
throw new MermaidRenderError(`Could not fetch the Mermaid library (HTTP ${response.status}).`);
|
|
93
|
+
}
|
|
94
|
+
cachedMermaidSource = await response.text();
|
|
95
|
+
return cachedMermaidSource;
|
|
96
|
+
}
|
|
97
|
+
/** Thrown when Mermaid source cannot be rendered (bad syntax or no library). */
|
|
98
|
+
export class MermaidRenderError extends Error {
|
|
99
|
+
constructor(message) {
|
|
100
|
+
super(message);
|
|
101
|
+
this.name = "MermaidRenderError";
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
/** Default output path for a rendered diagram when the caller gives none. */
|
|
105
|
+
function defaultOutputPath() {
|
|
106
|
+
const id = crypto.randomBytes(6).toString("hex");
|
|
107
|
+
const dir = path.join(os.tmpdir(), "pi-mermaid");
|
|
108
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
109
|
+
return path.join(dir, `${id}.png`);
|
|
110
|
+
}
|
|
111
|
+
/** Sibling SVG path for a PNG output path, sharing the base name. */
|
|
112
|
+
function svgPathFor(pngPath) {
|
|
113
|
+
const parsed = path.parse(pngPath);
|
|
114
|
+
return path.join(parsed.dir, `${parsed.name}.svg`);
|
|
115
|
+
}
|
|
116
|
+
/** True when a value is a finite number greater than zero. */
|
|
117
|
+
function isPositiveFinite(n) {
|
|
118
|
+
return typeof n === "number" && Number.isFinite(n) && n > 0;
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* Render Mermaid source to an SVG and a PNG on disk and return their
|
|
122
|
+
* paths plus a base64 copy of the PNG and its final dimensions. The SVG
|
|
123
|
+
* is the vector artifact (crisp at any zoom); the PNG is rasterized from
|
|
124
|
+
* it, scaled toward the vision-model pixel budget (up to an upscale
|
|
125
|
+
* ceiling) without crossing it. The output path must name the PNG; the
|
|
126
|
+
* SVG is written beside it with the same base name. Reuses the shared
|
|
127
|
+
* headless browser. Throws MermaidRenderError when the library cannot
|
|
128
|
+
* load, the path is not a PNG, or the source is invalid.
|
|
129
|
+
*/
|
|
130
|
+
export async function renderMermaid(source, outputPath) {
|
|
131
|
+
const pngPath = outputPath ?? defaultOutputPath();
|
|
132
|
+
if (!pngPath.toLowerCase().endsWith(".png")) {
|
|
133
|
+
throw new MermaidRenderError("render_mermaid output path must end in .png; the SVG is " +
|
|
134
|
+
"written beside it with the same base name.");
|
|
135
|
+
}
|
|
136
|
+
const svgPath = svgPathFor(pngPath);
|
|
137
|
+
const page = await newPage();
|
|
138
|
+
try {
|
|
139
|
+
await page.setContent('<!doctype html><html><body style="margin:0;background:#ffffff">' +
|
|
140
|
+
'<div id="container"></div></body></html>');
|
|
141
|
+
const mermaidSource = await loadMermaidSource();
|
|
142
|
+
try {
|
|
143
|
+
await page.addScriptTag({ content: mermaidSource });
|
|
144
|
+
}
|
|
145
|
+
catch {
|
|
146
|
+
throw new MermaidRenderError("Could not load the Mermaid library into the render page.");
|
|
147
|
+
}
|
|
148
|
+
const rendered = await page.evaluate(async (src) => {
|
|
149
|
+
// biome-ignore lint/suspicious/noExplicitAny: window.mermaid is injected at runtime.
|
|
150
|
+
const mermaid = window.mermaid;
|
|
151
|
+
if (!mermaid)
|
|
152
|
+
return { error: "Mermaid library did not initialize." };
|
|
153
|
+
mermaid.initialize({ startOnLoad: false, theme: "default" });
|
|
154
|
+
try {
|
|
155
|
+
const { svg } = await mermaid.render("pi-diagram", src);
|
|
156
|
+
const container = document.getElementById("container");
|
|
157
|
+
if (!container)
|
|
158
|
+
return { error: "Render container missing." };
|
|
159
|
+
container.innerHTML = svg;
|
|
160
|
+
const el = container.querySelector("svg");
|
|
161
|
+
if (!(el instanceof SVGSVGElement)) {
|
|
162
|
+
return { error: "Mermaid produced no SVG output." };
|
|
163
|
+
}
|
|
164
|
+
// Prefer the viewBox for the true intrinsic size; a Mermaid SVG
|
|
165
|
+
// carries width:100% and a max-width, so its bounding box can be
|
|
166
|
+
// clamped to the viewport rather than its natural size.
|
|
167
|
+
const vb = el.viewBox.baseVal;
|
|
168
|
+
let width = vb.width;
|
|
169
|
+
let height = vb.height;
|
|
170
|
+
if (!width || !height) {
|
|
171
|
+
const box = el.getBoundingClientRect();
|
|
172
|
+
width = box.width;
|
|
173
|
+
height = box.height;
|
|
174
|
+
}
|
|
175
|
+
return { svg, width, height };
|
|
176
|
+
}
|
|
177
|
+
catch (e) {
|
|
178
|
+
return { error: e instanceof Error ? e.message : String(e) };
|
|
179
|
+
}
|
|
180
|
+
}, source);
|
|
181
|
+
if (rendered.error || !rendered.svg) {
|
|
182
|
+
throw new MermaidRenderError(`Mermaid could not render the diagram: ${rendered.error ?? "no SVG output"}`);
|
|
183
|
+
}
|
|
184
|
+
const intrinsicWidth = rendered.width;
|
|
185
|
+
const intrinsicHeight = rendered.height;
|
|
186
|
+
if (!isPositiveFinite(intrinsicWidth) ||
|
|
187
|
+
!isPositiveFinite(intrinsicHeight)) {
|
|
188
|
+
throw new MermaidRenderError("Mermaid produced a diagram with no measurable size.");
|
|
189
|
+
}
|
|
190
|
+
// Size the PNG toward the vision-model budget, then pin the SVG to
|
|
191
|
+
// those pixels and drop its max-width so the capture is not clamped
|
|
192
|
+
// to the viewport.
|
|
193
|
+
const { width, height } = pngPixelSize({
|
|
194
|
+
width: intrinsicWidth,
|
|
195
|
+
height: intrinsicHeight,
|
|
196
|
+
});
|
|
197
|
+
await page.setViewport({ width, height, deviceScaleFactor: 1 });
|
|
198
|
+
await page.evaluate((w, h) => {
|
|
199
|
+
const el = document.querySelector("#container svg");
|
|
200
|
+
if (!(el instanceof SVGElement))
|
|
201
|
+
return;
|
|
202
|
+
el.setAttribute("width", String(w));
|
|
203
|
+
el.setAttribute("height", String(h));
|
|
204
|
+
el.style.maxWidth = "none";
|
|
205
|
+
}, width, height);
|
|
206
|
+
const element = await page.$("#container svg");
|
|
207
|
+
if (!element) {
|
|
208
|
+
throw new MermaidRenderError("Mermaid produced no SVG output.");
|
|
209
|
+
}
|
|
210
|
+
const shot = await element.screenshot({ type: "png", encoding: "base64" });
|
|
211
|
+
const base64 = typeof shot === "string" ? shot : Buffer.from(shot).toString("base64");
|
|
212
|
+
// Commit both artifacts only after a successful capture, so a mid-
|
|
213
|
+
// render failure never leaves a stray or half-written file on disk.
|
|
214
|
+
fs.mkdirSync(path.dirname(pngPath), { recursive: true });
|
|
215
|
+
fs.mkdirSync(path.dirname(svgPath), { recursive: true });
|
|
216
|
+
fs.writeFileSync(svgPath, rendered.svg, "utf8");
|
|
217
|
+
fs.writeFileSync(pngPath, Buffer.from(base64, "base64"));
|
|
218
|
+
return { pngPath, svgPath, base64, width, height };
|
|
219
|
+
}
|
|
220
|
+
finally {
|
|
221
|
+
await page.close();
|
|
222
|
+
}
|
|
223
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Where durable browser artifacts (baselines) live on disk by
|
|
3
|
+
* default, when an adapter does not say otherwise.
|
|
4
|
+
*
|
|
5
|
+
* Deliberately adapter-neutral, the same reasoning as memory's own
|
|
6
|
+
* path: a baseline taken while driving the browser through pi is
|
|
7
|
+
* still worth comparing against when the same page is later driven
|
|
8
|
+
* through Claude Code, so the default does not scope itself under
|
|
9
|
+
* either adapter's own brand. An adapter with its own established
|
|
10
|
+
* convention (pi's `dataDir("browser-integration")`, predating this
|
|
11
|
+
* library) passes `dataRoot` on `SessionOptions` instead, so moving
|
|
12
|
+
* this library out from under it does not orphan baselines already
|
|
13
|
+
* on disk.
|
|
14
|
+
*/
|
|
15
|
+
/** The default root for durable browser artifacts. */
|
|
16
|
+
export declare function defaultBrowserDataRoot(): string;
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Where durable browser artifacts (baselines) live on disk by
|
|
3
|
+
* default, when an adapter does not say otherwise.
|
|
4
|
+
*
|
|
5
|
+
* Deliberately adapter-neutral, the same reasoning as memory's own
|
|
6
|
+
* path: a baseline taken while driving the browser through pi is
|
|
7
|
+
* still worth comparing against when the same page is later driven
|
|
8
|
+
* through Claude Code, so the default does not scope itself under
|
|
9
|
+
* either adapter's own brand. An adapter with its own established
|
|
10
|
+
* convention (pi's `dataDir("browser-integration")`, predating this
|
|
11
|
+
* library) passes `dataRoot` on `SessionOptions` instead, so moving
|
|
12
|
+
* this library out from under it does not orphan baselines already
|
|
13
|
+
* on disk.
|
|
14
|
+
*/
|
|
15
|
+
import { homedir } from "node:os";
|
|
16
|
+
import { join } from "node:path";
|
|
17
|
+
/** Honours XDG_DATA_HOME; falls back to ~/.local/share per the XDG spec. */
|
|
18
|
+
function xdgDataRoot() {
|
|
19
|
+
const override = process.env.XDG_DATA_HOME;
|
|
20
|
+
return override && override.length > 0
|
|
21
|
+
? override
|
|
22
|
+
: join(homedir(), ".local", "share");
|
|
23
|
+
}
|
|
24
|
+
/** The default root for durable browser artifacts. */
|
|
25
|
+
export function defaultBrowserDataRoot() {
|
|
26
|
+
return join(xdgDataRoot(), "agentic-harness", "browser");
|
|
27
|
+
}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* How much memory the page is holding on to.
|
|
3
|
+
*
|
|
4
|
+
* A leak is the one fault none of the other instruments here can
|
|
5
|
+
* see. Nothing renders wrong, nothing is logged, no request
|
|
6
|
+
* fails; the tab simply gets slower for an hour and then dies,
|
|
7
|
+
* and by then whatever caused it is a long way back.
|
|
8
|
+
*
|
|
9
|
+
* The measurement is nearly worthless on its own. Uncollected
|
|
10
|
+
* garbage is indistinguishable from a leak, so a heap that grew
|
|
11
|
+
* is evidence of nothing unless a collection was forced first.
|
|
12
|
+
* That is why a reading carries whether it was collected, and why
|
|
13
|
+
* a comparison says outright when it cannot be trusted.
|
|
14
|
+
*/
|
|
15
|
+
/** One measurement of what the page is holding. */
|
|
16
|
+
export interface HeapReading {
|
|
17
|
+
readonly usedBytes: number;
|
|
18
|
+
readonly totalBytes: number;
|
|
19
|
+
/** Whether a collection was forced before measuring. */
|
|
20
|
+
readonly collected: boolean;
|
|
21
|
+
readonly at: number;
|
|
22
|
+
}
|
|
23
|
+
/** Two readings, and what changed between them. */
|
|
24
|
+
export interface HeapComparison {
|
|
25
|
+
readonly now: HeapReading;
|
|
26
|
+
readonly before?: HeapReading;
|
|
27
|
+
/** Bytes gained since the earlier reading; negative if lost. */
|
|
28
|
+
readonly grewBy?: number;
|
|
29
|
+
readonly direction: "grew" | "fell" | "steady" | "unknown";
|
|
30
|
+
/**
|
|
31
|
+
* Whether the comparison means anything.
|
|
32
|
+
*
|
|
33
|
+
* False when either reading was taken without forcing a
|
|
34
|
+
* collection, because then growth is as likely to be garbage
|
|
35
|
+
* nobody has swept as memory nobody can free.
|
|
36
|
+
*/
|
|
37
|
+
readonly trustworthy: boolean;
|
|
38
|
+
}
|
|
39
|
+
/** Compare a reading against an earlier one. */
|
|
40
|
+
export declare function compareHeap(now: HeapReading, before?: HeapReading): HeapComparison;
|
|
41
|
+
/** Say what the page is holding, and whether that is growing. */
|
|
42
|
+
export declare function renderHeap(comparison: HeapComparison): string;
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* How much memory the page is holding on to.
|
|
3
|
+
*
|
|
4
|
+
* A leak is the one fault none of the other instruments here can
|
|
5
|
+
* see. Nothing renders wrong, nothing is logged, no request
|
|
6
|
+
* fails; the tab simply gets slower for an hour and then dies,
|
|
7
|
+
* and by then whatever caused it is a long way back.
|
|
8
|
+
*
|
|
9
|
+
* The measurement is nearly worthless on its own. Uncollected
|
|
10
|
+
* garbage is indistinguishable from a leak, so a heap that grew
|
|
11
|
+
* is evidence of nothing unless a collection was forced first.
|
|
12
|
+
* That is why a reading carries whether it was collected, and why
|
|
13
|
+
* a comparison says outright when it cannot be trusted.
|
|
14
|
+
*/
|
|
15
|
+
/**
|
|
16
|
+
* Growth smaller than this is the runtime breathing, not a leak.
|
|
17
|
+
*
|
|
18
|
+
* Even after a forced collection a page's heap moves by tens of
|
|
19
|
+
* kilobytes between readings, and reporting that as growth would
|
|
20
|
+
* make every measurement look like a leak.
|
|
21
|
+
*/
|
|
22
|
+
const NOISE = 256 * 1024;
|
|
23
|
+
/** Compare a reading against an earlier one. */
|
|
24
|
+
export function compareHeap(now, before) {
|
|
25
|
+
if (before === undefined) {
|
|
26
|
+
// One reading is a number, not a trend. Calling a first
|
|
27
|
+
// measurement steady would be inventing news.
|
|
28
|
+
return { now, direction: "unknown", trustworthy: now.collected };
|
|
29
|
+
}
|
|
30
|
+
const grewBy = now.usedBytes - before.usedBytes;
|
|
31
|
+
const direction = Math.abs(grewBy) < NOISE ? "steady" : grewBy > 0 ? "grew" : "fell";
|
|
32
|
+
return {
|
|
33
|
+
now,
|
|
34
|
+
before,
|
|
35
|
+
grewBy,
|
|
36
|
+
direction,
|
|
37
|
+
trustworthy: now.collected && before.collected,
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
/** Bytes as a person reads them. */
|
|
41
|
+
function mb(bytes) {
|
|
42
|
+
return `${(bytes / (1024 * 1024)).toFixed(1)}MB`;
|
|
43
|
+
}
|
|
44
|
+
/** Say what the page is holding, and whether that is growing. */
|
|
45
|
+
export function renderHeap(comparison) {
|
|
46
|
+
const { now, before, grewBy, direction } = comparison;
|
|
47
|
+
const lines = [
|
|
48
|
+
`Holding ${mb(now.usedBytes)} of ${mb(now.totalBytes)} allocated.`,
|
|
49
|
+
];
|
|
50
|
+
if (before !== undefined && grewBy !== undefined) {
|
|
51
|
+
if (direction === "steady") {
|
|
52
|
+
lines.push(`Steady since the last reading, within ${mb(NOISE)} either way.`);
|
|
53
|
+
}
|
|
54
|
+
else {
|
|
55
|
+
const verb = direction === "grew" ? "Grew" : "Fell";
|
|
56
|
+
lines.push(`${verb} by ${mb(Math.abs(grewBy))} since the last reading.`);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
if (!comparison.trustworthy) {
|
|
60
|
+
// The single most misleading thing this could do is let a
|
|
61
|
+
// reader take uncollected garbage for a leak, so the caveat
|
|
62
|
+
// is not optional and does not get abbreviated.
|
|
63
|
+
lines.push("Not evidence of a leak: a collection was not forced, so " +
|
|
64
|
+
"garbage nobody has swept yet is counted the same as memory " +
|
|
65
|
+
"nobody can free. Take both readings with a collection " +
|
|
66
|
+
"before comparing them.");
|
|
67
|
+
}
|
|
68
|
+
else if (before === undefined) {
|
|
69
|
+
lines.push("One reading is a number, not a trend. Do the thing you " +
|
|
70
|
+
"suspect, read again, and compare.");
|
|
71
|
+
}
|
|
72
|
+
return lines.join("\n");
|
|
73
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* What a page cost the person waiting for it.
|
|
3
|
+
*
|
|
4
|
+
* The measurements come from the browser's performance
|
|
5
|
+
* observers; the arithmetic over them is pure and works on any
|
|
6
|
+
* capture, live or stored.
|
|
7
|
+
*/
|
|
8
|
+
export { compareHeap, type HeapComparison, type HeapReading, renderHeap, } from "./heap.js";
|
|
9
|
+
export { BYTES_PER_PIXEL, type CompositedLayer, foldLayers, LAYER_SETTLE_MS, type LayerFacts, type LayerReport, nameNode, type RawLayer, type ReasonTally, renderLayers, } from "./layers.js";
|
|
10
|
+
export { observerBootstrap, readVitalsSource } from "./probe.js";
|
|
11
|
+
export { foldProfile, type Hotspot, type Hotspots, type RawProfile, type RawProfileNode, renderHotspots, } from "./profile.js";
|
|
12
|
+
export { categoriesFor, type FrameStory, foldTrace, type RawTraceEvent, type RequestSpan, renderTrace, type TaskCost, type TimerStory, TRACE_CATEGORIES, type TraceCapture, type TraceProfile, } from "./trace.js";
|
|
13
|
+
export { renderVitals } from "./view.js";
|
|
14
|
+
export { cumulativeShift, type LongTask, type Measure, measure, type Rating, rate, SESSION_CAP_MS, SESSION_GAP_MS, type Shift, THRESHOLDS, type Vitals, worstShiftSources, } from "./vitals.js";
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* What a page cost the person waiting for it.
|
|
3
|
+
*
|
|
4
|
+
* The measurements come from the browser's performance
|
|
5
|
+
* observers; the arithmetic over them is pure and works on any
|
|
6
|
+
* capture, live or stored.
|
|
7
|
+
*/
|
|
8
|
+
export { compareHeap, renderHeap, } from "./heap.js";
|
|
9
|
+
export { BYTES_PER_PIXEL, foldLayers, LAYER_SETTLE_MS, nameNode, renderLayers, } from "./layers.js";
|
|
10
|
+
export { observerBootstrap, readVitalsSource } from "./probe.js";
|
|
11
|
+
export { foldProfile, renderHotspots, } from "./profile.js";
|
|
12
|
+
export { categoriesFor, foldTrace, renderTrace, TRACE_CATEGORIES, } from "./trace.js";
|
|
13
|
+
export { renderVitals } from "./view.js";
|
|
14
|
+
export { cumulativeShift, measure, rate, SESSION_CAP_MS, SESSION_GAP_MS, THRESHOLDS, worstShiftSources, } from "./vitals.js";
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* What the page asked the compositor to keep.
|
|
3
|
+
*
|
|
4
|
+
* A composited layer is a texture the GPU holds so that moving or
|
|
5
|
+
* fading the thing on it costs no repaint. That trade runs both
|
|
6
|
+
* ways: too little promotion and an animating element repaints
|
|
7
|
+
* every frame, too much and the page holds tens of megabytes of
|
|
8
|
+
* texture it never needed.
|
|
9
|
+
*
|
|
10
|
+
* Everything here is Chrome's own account. The layer list arrives
|
|
11
|
+
* on LayerTree.layerTreeDidChange and the reason for each layer
|
|
12
|
+
* comes from LayerTree.compositingReasons. No reason is ever
|
|
13
|
+
* synthesized: measured against Chrome 141, that API returns an
|
|
14
|
+
* empty list for a genuinely promoted layer, so silence is
|
|
15
|
+
* reported as silence rather than turned into a guess or, worse,
|
|
16
|
+
* into a claim the layer was not promoted at all.
|
|
17
|
+
*/
|
|
18
|
+
/** Four bytes to a pixel, which is how a texture is sized. */
|
|
19
|
+
export declare const BYTES_PER_PIXEL = 4;
|
|
20
|
+
/**
|
|
21
|
+
* How long to let the compositor finish reporting after a frame.
|
|
22
|
+
*
|
|
23
|
+
* The tree arrives asynchronously and in more than one instalment
|
|
24
|
+
* on a busy page, so a read that returns immediately catches a
|
|
25
|
+
* partial tree.
|
|
26
|
+
*/
|
|
27
|
+
export declare const LAYER_SETTLE_MS = 600;
|
|
28
|
+
/** One layer, as Chrome reports it. */
|
|
29
|
+
export interface RawLayer {
|
|
30
|
+
readonly layerId: string;
|
|
31
|
+
readonly parentLayerId?: string;
|
|
32
|
+
/** The element this layer was made for, when Chrome names one. */
|
|
33
|
+
readonly backendNodeId?: number;
|
|
34
|
+
readonly width: number;
|
|
35
|
+
readonly height: number;
|
|
36
|
+
readonly paintCount: number;
|
|
37
|
+
readonly drawsContent: boolean;
|
|
38
|
+
}
|
|
39
|
+
/** A capture of the layer tree and what Chrome said about it. */
|
|
40
|
+
export interface LayerFacts {
|
|
41
|
+
readonly layers: readonly RawLayer[];
|
|
42
|
+
/** Chrome's reasons per layer id, which may legitimately be empty. */
|
|
43
|
+
readonly reasons: Readonly<Record<string, readonly string[]>>;
|
|
44
|
+
/** How to name the element behind a layer, per layer id. */
|
|
45
|
+
readonly elements: Readonly<Record<string, string>>;
|
|
46
|
+
}
|
|
47
|
+
/** One layer, folded and ready to report. */
|
|
48
|
+
export interface CompositedLayer {
|
|
49
|
+
readonly id: string;
|
|
50
|
+
readonly element?: string;
|
|
51
|
+
readonly width: number;
|
|
52
|
+
readonly height: number;
|
|
53
|
+
readonly paintCount: number;
|
|
54
|
+
readonly drawsContent: boolean;
|
|
55
|
+
/** Texture bytes, which is zero for a layer that draws nothing. */
|
|
56
|
+
readonly memoryBytes: number;
|
|
57
|
+
readonly reasons: readonly string[];
|
|
58
|
+
/**
|
|
59
|
+
* Whether Chrome made this layer for an element.
|
|
60
|
+
*
|
|
61
|
+
* The tree also carries structural layers of its own, the root
|
|
62
|
+
* and the visual viewport among them. Those were never a
|
|
63
|
+
* promotion decision anybody made, so asking why they exist is
|
|
64
|
+
* the wrong question to put to them.
|
|
65
|
+
*/
|
|
66
|
+
readonly forElement: boolean;
|
|
67
|
+
}
|
|
68
|
+
/** How many layers share one reason. */
|
|
69
|
+
export interface ReasonTally {
|
|
70
|
+
readonly reason: string;
|
|
71
|
+
readonly count: number;
|
|
72
|
+
}
|
|
73
|
+
/** What the compositor is holding for this page. */
|
|
74
|
+
export interface LayerReport {
|
|
75
|
+
/** Every layer, heaviest first. */
|
|
76
|
+
readonly layers: readonly CompositedLayer[];
|
|
77
|
+
/** How many of them actually paint something. */
|
|
78
|
+
readonly drawing: number;
|
|
79
|
+
/** Texture bytes across the layers that draw. */
|
|
80
|
+
readonly memoryBytes: number;
|
|
81
|
+
/** Layers Chrome gave no reason for. */
|
|
82
|
+
readonly unexplained: number;
|
|
83
|
+
/** Reasons, in order of how many layers each accounts for. */
|
|
84
|
+
readonly byReason: readonly ReasonTally[];
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Name an element compactly, the way a developer would say it.
|
|
88
|
+
*
|
|
89
|
+
* Chrome hands back a tag name and a flat array of alternating
|
|
90
|
+
* attribute names and values. A tag with its id, or failing that
|
|
91
|
+
* its first class, is enough to find the thing again without
|
|
92
|
+
* quoting a whole selector path.
|
|
93
|
+
*/
|
|
94
|
+
export declare function nameNode(nodeName: string, attributes?: readonly string[]): string;
|
|
95
|
+
/** Fold a layer tree capture into what it costs and why it exists. */
|
|
96
|
+
export declare function foldLayers(facts: LayerFacts): LayerReport;
|
|
97
|
+
/** Report what the compositor holds and what put it there. */
|
|
98
|
+
export declare function renderLayers(report: LayerReport): string;
|
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* What the page asked the compositor to keep.
|
|
3
|
+
*
|
|
4
|
+
* A composited layer is a texture the GPU holds so that moving or
|
|
5
|
+
* fading the thing on it costs no repaint. That trade runs both
|
|
6
|
+
* ways: too little promotion and an animating element repaints
|
|
7
|
+
* every frame, too much and the page holds tens of megabytes of
|
|
8
|
+
* texture it never needed.
|
|
9
|
+
*
|
|
10
|
+
* Everything here is Chrome's own account. The layer list arrives
|
|
11
|
+
* on LayerTree.layerTreeDidChange and the reason for each layer
|
|
12
|
+
* comes from LayerTree.compositingReasons. No reason is ever
|
|
13
|
+
* synthesized: measured against Chrome 141, that API returns an
|
|
14
|
+
* empty list for a genuinely promoted layer, so silence is
|
|
15
|
+
* reported as silence rather than turned into a guess or, worse,
|
|
16
|
+
* into a claim the layer was not promoted at all.
|
|
17
|
+
*/
|
|
18
|
+
/** Four bytes to a pixel, which is how a texture is sized. */
|
|
19
|
+
export const BYTES_PER_PIXEL = 4;
|
|
20
|
+
/** How many layers to name before the tail is only counted. */
|
|
21
|
+
const LISTED_LAYERS = 12;
|
|
22
|
+
/**
|
|
23
|
+
* How long to let the compositor finish reporting after a frame.
|
|
24
|
+
*
|
|
25
|
+
* The tree arrives asynchronously and in more than one instalment
|
|
26
|
+
* on a busy page, so a read that returns immediately catches a
|
|
27
|
+
* partial tree.
|
|
28
|
+
*/
|
|
29
|
+
export const LAYER_SETTLE_MS = 600;
|
|
30
|
+
const BYTES_PER_KB = 1024;
|
|
31
|
+
const BYTES_PER_MB = BYTES_PER_KB * BYTES_PER_KB;
|
|
32
|
+
/**
|
|
33
|
+
* Name an element compactly, the way a developer would say it.
|
|
34
|
+
*
|
|
35
|
+
* Chrome hands back a tag name and a flat array of alternating
|
|
36
|
+
* attribute names and values. A tag with its id, or failing that
|
|
37
|
+
* its first class, is enough to find the thing again without
|
|
38
|
+
* quoting a whole selector path.
|
|
39
|
+
*/
|
|
40
|
+
export function nameNode(nodeName, attributes = []) {
|
|
41
|
+
const tag = nodeName.toLowerCase();
|
|
42
|
+
const read = (wanted) => {
|
|
43
|
+
for (let index = 0; index + 1 < attributes.length; index += 2) {
|
|
44
|
+
if (attributes[index] === wanted)
|
|
45
|
+
return attributes[index + 1];
|
|
46
|
+
}
|
|
47
|
+
return undefined;
|
|
48
|
+
};
|
|
49
|
+
const id = read("id");
|
|
50
|
+
if (id)
|
|
51
|
+
return `${tag}#${id}`;
|
|
52
|
+
const classes = read("class")?.trim().split(/\s+/).filter(Boolean) ?? [];
|
|
53
|
+
if (classes.length > 0)
|
|
54
|
+
return `${tag}.${classes[0]}`;
|
|
55
|
+
return tag;
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Texture bytes for one layer.
|
|
59
|
+
*
|
|
60
|
+
* A layer that draws no content holds no texture however large its
|
|
61
|
+
* bounds are: the viewport and scrolling layers come back at the
|
|
62
|
+
* full page size with drawsContent false, and counting those would
|
|
63
|
+
* bill the page several megabytes it never paid.
|
|
64
|
+
*/
|
|
65
|
+
function memoryOf(layer) {
|
|
66
|
+
if (!layer.drawsContent)
|
|
67
|
+
return 0;
|
|
68
|
+
return Math.max(0, layer.width) * Math.max(0, layer.height) * BYTES_PER_PIXEL;
|
|
69
|
+
}
|
|
70
|
+
/** Fold a layer tree capture into what it costs and why it exists. */
|
|
71
|
+
export function foldLayers(facts) {
|
|
72
|
+
const layers = facts.layers.map((layer) => {
|
|
73
|
+
const reasons = facts.reasons[layer.layerId] ?? [];
|
|
74
|
+
const element = facts.elements[layer.layerId];
|
|
75
|
+
return {
|
|
76
|
+
id: layer.layerId,
|
|
77
|
+
...(element === undefined ? {} : { element }),
|
|
78
|
+
width: layer.width,
|
|
79
|
+
height: layer.height,
|
|
80
|
+
paintCount: layer.paintCount,
|
|
81
|
+
drawsContent: layer.drawsContent,
|
|
82
|
+
memoryBytes: memoryOf(layer),
|
|
83
|
+
reasons,
|
|
84
|
+
forElement: layer.backendNodeId !== undefined,
|
|
85
|
+
};
|
|
86
|
+
});
|
|
87
|
+
// Heaviest first, because the layer worth arguing about is the one
|
|
88
|
+
// holding the most texture, not the one Chrome happened to list
|
|
89
|
+
// first.
|
|
90
|
+
layers.sort((a, b) => b.memoryBytes - a.memoryBytes);
|
|
91
|
+
const counts = new Map();
|
|
92
|
+
let unexplained = 0;
|
|
93
|
+
for (const layer of layers) {
|
|
94
|
+
if (layer.reasons.length === 0) {
|
|
95
|
+
// Only an element's layer counts as unexplained. Chrome's own
|
|
96
|
+
// structural layers carry no reason because no promotion
|
|
97
|
+
// decision produced them, and counting those would report a
|
|
98
|
+
// mystery on every page including a clean one.
|
|
99
|
+
if (layer.forElement)
|
|
100
|
+
unexplained += 1;
|
|
101
|
+
continue;
|
|
102
|
+
}
|
|
103
|
+
for (const reason of layer.reasons) {
|
|
104
|
+
counts.set(reason, (counts.get(reason) ?? 0) + 1);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
return {
|
|
108
|
+
layers,
|
|
109
|
+
drawing: layers.filter((layer) => layer.memoryBytes > 0).length,
|
|
110
|
+
memoryBytes: layers.reduce((total, layer) => total + layer.memoryBytes, 0),
|
|
111
|
+
unexplained,
|
|
112
|
+
byReason: [...counts]
|
|
113
|
+
.map(([reason, count]) => ({ reason, count }))
|
|
114
|
+
.sort((a, b) => b.count - a.count || a.reason.localeCompare(b.reason)),
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
/** Bytes as something a person reads without counting digits. */
|
|
118
|
+
function size(bytes) {
|
|
119
|
+
if (bytes >= BYTES_PER_MB) {
|
|
120
|
+
return `${(bytes / BYTES_PER_MB).toFixed(1)} MB`;
|
|
121
|
+
}
|
|
122
|
+
return `${Math.round(bytes / BYTES_PER_KB)} KB`;
|
|
123
|
+
}
|
|
124
|
+
/** Report what the compositor holds and what put it there. */
|
|
125
|
+
export function renderLayers(report) {
|
|
126
|
+
if (report.layers.length === 0) {
|
|
127
|
+
return ("No composited layers. Nothing on this page asked the " +
|
|
128
|
+
"compositor for a texture of its own.");
|
|
129
|
+
}
|
|
130
|
+
const lines = [];
|
|
131
|
+
const many = report.layers.length === 1 ? "layer" : "layers";
|
|
132
|
+
lines.push(`${report.layers.length} ${many}, ${report.drawing} drawing ` +
|
|
133
|
+
`content, holding ${size(report.memoryBytes)} of texture.`);
|
|
134
|
+
if (report.unexplained > 0) {
|
|
135
|
+
// Said plainly, because the alternative reading is the damaging
|
|
136
|
+
// one: these layers exist, and Chrome declining to explain them
|
|
137
|
+
// is not the same as their not being promoted.
|
|
138
|
+
const was = report.unexplained === 1 ? "layer" : "layers";
|
|
139
|
+
lines.push(`Chrome gave no reason for ${report.unexplained} ${was}. ` +
|
|
140
|
+
"They are promoted; its compositingReasons simply came back " +
|
|
141
|
+
"empty, so nothing here can say what put them there.");
|
|
142
|
+
}
|
|
143
|
+
if (report.byReason.length > 0) {
|
|
144
|
+
lines.push("");
|
|
145
|
+
lines.push("Why they exist:");
|
|
146
|
+
for (const entry of report.byReason) {
|
|
147
|
+
lines.push(` ${entry.count} x ${entry.reason}`);
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
lines.push("");
|
|
151
|
+
lines.push("Heaviest first:");
|
|
152
|
+
for (const layer of report.layers.slice(0, LISTED_LAYERS)) {
|
|
153
|
+
const where = layer.element ?? `layer ${layer.id}`;
|
|
154
|
+
const drawn = layer.drawsContent
|
|
155
|
+
? `${size(layer.memoryBytes)}, painted ${layer.paintCount}x`
|
|
156
|
+
: "draws nothing, so holds no texture";
|
|
157
|
+
lines.push(` ${where}: ${Math.round(layer.width)} by ` +
|
|
158
|
+
`${Math.round(layer.height)}, ${drawn}`);
|
|
159
|
+
}
|
|
160
|
+
const hidden = report.layers.length - LISTED_LAYERS;
|
|
161
|
+
if (hidden > 0) {
|
|
162
|
+
lines.push(` and ${hidden} more.`);
|
|
163
|
+
}
|
|
164
|
+
return lines.join("\n");
|
|
165
|
+
}
|