@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,429 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* What the page was doing, and what caused what.
|
|
3
|
+
*
|
|
4
|
+
* A profile says which functions the time went into. It cannot say
|
|
5
|
+
* that a click installed a timer, that the timer fired forty
|
|
6
|
+
* milliseconds late, or that two fetches were in flight together
|
|
7
|
+
* and the second answered first. Those are questions about order
|
|
8
|
+
* and causation rather than cost, and the only place the browser
|
|
9
|
+
* answers them is its own trace stream.
|
|
10
|
+
*
|
|
11
|
+
* A trace is a recording rather than a recorder. Chrome hands
|
|
12
|
+
* nothing over while it runs and delivers everything in a burst
|
|
13
|
+
* when it stops, which is measured and is why this module folds a
|
|
14
|
+
* finished capture rather than following a live one.
|
|
15
|
+
*
|
|
16
|
+
* Two things about the stream shape are worth knowing before
|
|
17
|
+
* reading the code. Timestamps and durations are microseconds.
|
|
18
|
+
* And only some events say which frame they belong to: resource
|
|
19
|
+
* events carry a request id instead, and frame-pipeline events
|
|
20
|
+
* carry a layer tree, so placing those takes a join and a
|
|
21
|
+
* process, not a lookup.
|
|
22
|
+
*/
|
|
23
|
+
import { count } from "../../ui/count.js";
|
|
24
|
+
/**
|
|
25
|
+
* The categories each profile turns on.
|
|
26
|
+
*
|
|
27
|
+
* Naming no categories is never right: measured, the default set
|
|
28
|
+
* costs about five megabytes a second and is almost entirely
|
|
29
|
+
* Chrome talking to itself about mojo messages and task queues.
|
|
30
|
+
* The sets below are the page's own story, at about sixty
|
|
31
|
+
* kilobytes a second for async and three hundred and forty with
|
|
32
|
+
* frames.
|
|
33
|
+
*/
|
|
34
|
+
export const TRACE_CATEGORIES = {
|
|
35
|
+
async: ["devtools.timeline", "v8.execute", "latencyInfo"],
|
|
36
|
+
frames: ["devtools.timeline", "disabled-by-default-devtools.timeline.frame"],
|
|
37
|
+
};
|
|
38
|
+
/** The categories to ask for, with nothing repeated. */
|
|
39
|
+
export function categoriesFor(profiles) {
|
|
40
|
+
const wanted = new Set();
|
|
41
|
+
for (const profile of profiles) {
|
|
42
|
+
for (const category of TRACE_CATEGORIES[profile])
|
|
43
|
+
wanted.add(category);
|
|
44
|
+
}
|
|
45
|
+
return [...wanted];
|
|
46
|
+
}
|
|
47
|
+
/** Sixteen milliseconds is the budget for sixty frames a second. */
|
|
48
|
+
const FRAME_BUDGET_MS = 1000 / 60;
|
|
49
|
+
/** How many kinds of work to name before it is a data dump. */
|
|
50
|
+
const TOP_TASKS = 12;
|
|
51
|
+
const US_PER_MS = 1000;
|
|
52
|
+
/** Microseconds to milliseconds, rounded to whole milliseconds. */
|
|
53
|
+
const ms = (microseconds) => Math.round(microseconds / US_PER_MS);
|
|
54
|
+
/** The payload most devtools.timeline events hang their fields on. */
|
|
55
|
+
function dataOf(event) {
|
|
56
|
+
const data = event.args?.data;
|
|
57
|
+
return typeof data === "object" && data !== null
|
|
58
|
+
? data
|
|
59
|
+
: undefined;
|
|
60
|
+
}
|
|
61
|
+
function stringField(data, key) {
|
|
62
|
+
const value = data?.[key];
|
|
63
|
+
return typeof value === "string" ? value : undefined;
|
|
64
|
+
}
|
|
65
|
+
function numberField(data, key) {
|
|
66
|
+
const value = data?.[key];
|
|
67
|
+
return typeof value === "number" ? value : undefined;
|
|
68
|
+
}
|
|
69
|
+
/** Which frame an event names, when it names one at all. */
|
|
70
|
+
function frameOf(event) {
|
|
71
|
+
return stringField(dataOf(event), "frame");
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Fold a finished recording into what it says.
|
|
75
|
+
*
|
|
76
|
+
* Attribution runs in two passes because the first pass is what
|
|
77
|
+
* makes the second possible: events that name one of our frames
|
|
78
|
+
* reveal which renderer process we are in, and that process is
|
|
79
|
+
* the only handle on the frame-pipeline events, which name no
|
|
80
|
+
* frame at all. Anything left is counted rather than guessed,
|
|
81
|
+
* because a report that quietly adopts another page's work is
|
|
82
|
+
* worse than one that admits a gap.
|
|
83
|
+
*/
|
|
84
|
+
export function foldTrace(events, options) {
|
|
85
|
+
const wantsFrames = options.profiles.includes("frames");
|
|
86
|
+
const myPids = new Set();
|
|
87
|
+
for (const event of events) {
|
|
88
|
+
const frame = frameOf(event);
|
|
89
|
+
if (frame !== undefined && options.frames.has(frame))
|
|
90
|
+
myPids.add(event.pid);
|
|
91
|
+
}
|
|
92
|
+
// Resource events name a request rather than a frame, so the
|
|
93
|
+
// send is what places the whole span and the rest follow it.
|
|
94
|
+
const requestFrames = new Map();
|
|
95
|
+
for (const event of events) {
|
|
96
|
+
if (event.name !== "ResourceSendRequest")
|
|
97
|
+
continue;
|
|
98
|
+
const data = dataOf(event);
|
|
99
|
+
const id = stringField(data, "requestId");
|
|
100
|
+
const frame = stringField(data, "frame");
|
|
101
|
+
if (id !== undefined && frame !== undefined)
|
|
102
|
+
requestFrames.set(id, frame);
|
|
103
|
+
}
|
|
104
|
+
const isMine = (event) => {
|
|
105
|
+
const frame = frameOf(event);
|
|
106
|
+
if (frame !== undefined)
|
|
107
|
+
return options.frames.has(frame);
|
|
108
|
+
const requestId = stringField(dataOf(event), "requestId");
|
|
109
|
+
if (requestId !== undefined) {
|
|
110
|
+
const owner = requestFrames.get(requestId);
|
|
111
|
+
if (owner !== undefined)
|
|
112
|
+
return options.frames.has(owner);
|
|
113
|
+
return undefined;
|
|
114
|
+
}
|
|
115
|
+
if (myPids.has(event.pid))
|
|
116
|
+
return true;
|
|
117
|
+
return undefined;
|
|
118
|
+
};
|
|
119
|
+
let mine = 0;
|
|
120
|
+
let unattributed = 0;
|
|
121
|
+
let firstUs = Number.POSITIVE_INFINITY;
|
|
122
|
+
let lastUs = Number.NEGATIVE_INFINITY;
|
|
123
|
+
const ours = [];
|
|
124
|
+
for (const event of events) {
|
|
125
|
+
if (event.ph === "M")
|
|
126
|
+
continue;
|
|
127
|
+
const verdict = isMine(event);
|
|
128
|
+
if (verdict === undefined)
|
|
129
|
+
unattributed += 1;
|
|
130
|
+
else if (verdict) {
|
|
131
|
+
mine += 1;
|
|
132
|
+
ours.push(event);
|
|
133
|
+
firstUs = Math.min(firstUs, event.ts);
|
|
134
|
+
lastUs = Math.max(lastUs, event.ts + (event.dur ?? 0));
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
const startUs = Number.isFinite(firstUs) ? firstUs : 0;
|
|
138
|
+
const at = (microseconds) => ms(microseconds - startUs);
|
|
139
|
+
return {
|
|
140
|
+
profiles: options.profiles,
|
|
141
|
+
spanMs: Number.isFinite(firstUs) ? ms(lastUs - firstUs) : 0,
|
|
142
|
+
events: events.length,
|
|
143
|
+
mine,
|
|
144
|
+
unattributed,
|
|
145
|
+
tasks: foldTasks(ours),
|
|
146
|
+
timers: foldTimers(ours, at),
|
|
147
|
+
...foldRequests(ours, at),
|
|
148
|
+
frames: wantsFrames ? foldFrames(ours) : undefined,
|
|
149
|
+
};
|
|
150
|
+
}
|
|
151
|
+
/** Total the complete events by kind, dearest first. */
|
|
152
|
+
function foldTasks(events) {
|
|
153
|
+
const totals = new Map();
|
|
154
|
+
for (const event of events) {
|
|
155
|
+
if (event.ph !== "X" || event.dur === undefined)
|
|
156
|
+
continue;
|
|
157
|
+
const seen = totals.get(event.name) ?? { count: 0, total: 0, max: 0 };
|
|
158
|
+
seen.count += 1;
|
|
159
|
+
seen.total += event.dur;
|
|
160
|
+
seen.max = Math.max(seen.max, event.dur);
|
|
161
|
+
totals.set(event.name, seen);
|
|
162
|
+
}
|
|
163
|
+
return [...totals.entries()]
|
|
164
|
+
.map(([name, seen]) => ({
|
|
165
|
+
name,
|
|
166
|
+
count: seen.count,
|
|
167
|
+
totalMs: ms(seen.total),
|
|
168
|
+
longestMs: ms(seen.max),
|
|
169
|
+
}))
|
|
170
|
+
.sort((one, other) => other.totalMs - one.totalMs)
|
|
171
|
+
.slice(0, TOP_TASKS);
|
|
172
|
+
}
|
|
173
|
+
/**
|
|
174
|
+
* Pair each install with the fire that belongs to it.
|
|
175
|
+
*
|
|
176
|
+
* Chrome recycles timer ids within a frame, so an id is not an
|
|
177
|
+
* identity. Pairing keeps only the most recent live install for
|
|
178
|
+
* an id and drops it on removal, because keyed naively a recycled
|
|
179
|
+
* id blames a fire on a long-dead install and reports a lateness
|
|
180
|
+
* of several seconds that never happened.
|
|
181
|
+
*/
|
|
182
|
+
function foldTimers(events, at) {
|
|
183
|
+
/** Where each live timer's story sits, so a fire can revise it. */
|
|
184
|
+
const live = new Map();
|
|
185
|
+
const stories = [];
|
|
186
|
+
const key = (frame, id) => `${frame ?? "?"}#${id}`;
|
|
187
|
+
for (const event of events) {
|
|
188
|
+
const data = dataOf(event);
|
|
189
|
+
const id = numberField(data, "timerId");
|
|
190
|
+
if (id === undefined)
|
|
191
|
+
continue;
|
|
192
|
+
const frame = stringField(data, "frame");
|
|
193
|
+
if (event.name === "TimerInstall") {
|
|
194
|
+
const story = {
|
|
195
|
+
timerId: id,
|
|
196
|
+
timeoutMs: numberField(data, "timeout") ?? 0,
|
|
197
|
+
singleShot: data?.singleShot === true,
|
|
198
|
+
installedAtMs: at(event.ts),
|
|
199
|
+
firedCount: 0,
|
|
200
|
+
};
|
|
201
|
+
live.set(key(frame, id), stories.length);
|
|
202
|
+
stories.push(story);
|
|
203
|
+
continue;
|
|
204
|
+
}
|
|
205
|
+
if (event.name === "TimerRemove") {
|
|
206
|
+
live.delete(key(frame, id));
|
|
207
|
+
continue;
|
|
208
|
+
}
|
|
209
|
+
if (event.name !== "TimerFire")
|
|
210
|
+
continue;
|
|
211
|
+
const slot = live.get(key(frame, id));
|
|
212
|
+
if (slot === undefined)
|
|
213
|
+
continue;
|
|
214
|
+
const install = stories[slot];
|
|
215
|
+
const firedAtMs = at(event.ts);
|
|
216
|
+
// A repeating timer keeps an interval, so what it promised is
|
|
217
|
+
// about the gap since it last ran. Measured from the install
|
|
218
|
+
// instead, a punctual interval looks later on every fire.
|
|
219
|
+
const since = install.firedAtMs ?? install.installedAtMs;
|
|
220
|
+
const lateBy = Math.max(0, firedAtMs - since - install.timeoutMs);
|
|
221
|
+
stories[slot] = {
|
|
222
|
+
...install,
|
|
223
|
+
firedAtMs,
|
|
224
|
+
firedCount: install.firedCount + 1,
|
|
225
|
+
ranForMs: event.dur === undefined ? undefined : ms(event.dur),
|
|
226
|
+
lateByMs: Math.max(install.lateByMs ?? 0, lateBy),
|
|
227
|
+
};
|
|
228
|
+
if (install.singleShot)
|
|
229
|
+
live.delete(key(frame, id));
|
|
230
|
+
}
|
|
231
|
+
return stories;
|
|
232
|
+
}
|
|
233
|
+
/** Join request events by id, and say what the overlap was. */
|
|
234
|
+
function foldRequests(events, at) {
|
|
235
|
+
const spans = new Map();
|
|
236
|
+
for (const event of events) {
|
|
237
|
+
const data = dataOf(event);
|
|
238
|
+
const id = stringField(data, "requestId");
|
|
239
|
+
if (id === undefined)
|
|
240
|
+
continue;
|
|
241
|
+
if (event.name === "ResourceSendRequest") {
|
|
242
|
+
spans.set(id, {
|
|
243
|
+
requestId: id,
|
|
244
|
+
url: stringField(data, "url"),
|
|
245
|
+
method: stringField(data, "requestMethod"),
|
|
246
|
+
resourceType: stringField(data, "resourceType"),
|
|
247
|
+
sentAtMs: at(event.ts),
|
|
248
|
+
});
|
|
249
|
+
continue;
|
|
250
|
+
}
|
|
251
|
+
const span = spans.get(id);
|
|
252
|
+
if (span === undefined)
|
|
253
|
+
continue;
|
|
254
|
+
if (event.name === "ResourceReceiveResponse") {
|
|
255
|
+
spans.set(id, {
|
|
256
|
+
...span,
|
|
257
|
+
status: numberField(data, "statusCode"),
|
|
258
|
+
respondedAtMs: at(event.ts),
|
|
259
|
+
});
|
|
260
|
+
}
|
|
261
|
+
else if (event.name === "ResourceFinish") {
|
|
262
|
+
spans.set(id, {
|
|
263
|
+
...span,
|
|
264
|
+
finishedAtMs: at(event.ts),
|
|
265
|
+
failed: data?.didFail === true,
|
|
266
|
+
});
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
const requests = [...spans.values()].sort((one, other) => one.sentAtMs - other.sentAtMs);
|
|
270
|
+
// A sweep over starts and ends gives the most in flight at once.
|
|
271
|
+
const edges = [];
|
|
272
|
+
for (const request of requests) {
|
|
273
|
+
edges.push({ atMs: request.sentAtMs, delta: 1 });
|
|
274
|
+
edges.push({
|
|
275
|
+
atMs: request.finishedAtMs ?? Number.POSITIVE_INFINITY,
|
|
276
|
+
delta: -1,
|
|
277
|
+
});
|
|
278
|
+
}
|
|
279
|
+
edges.sort((one, other) => one.atMs - other.atMs || one.delta - other.delta);
|
|
280
|
+
let inFlight = 0;
|
|
281
|
+
let overlapping = 0;
|
|
282
|
+
for (const edge of edges) {
|
|
283
|
+
inFlight += edge.delta;
|
|
284
|
+
overlapping = Math.max(overlapping, inFlight);
|
|
285
|
+
}
|
|
286
|
+
// Sent first but settled last is the fact that explains a
|
|
287
|
+
// waterfall nobody expected.
|
|
288
|
+
let resolvedOutOfOrder = false;
|
|
289
|
+
const settled = requests.filter((one) => one.finishedAtMs !== undefined);
|
|
290
|
+
for (let index = 1; index < settled.length; index += 1) {
|
|
291
|
+
const previous = settled[index - 1].finishedAtMs ?? 0;
|
|
292
|
+
if ((settled[index].finishedAtMs ?? 0) < previous) {
|
|
293
|
+
resolvedOutOfOrder = true;
|
|
294
|
+
break;
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
return { requests, overlapping, resolvedOutOfOrder };
|
|
298
|
+
}
|
|
299
|
+
/** Which layer tree host a pipeline event names, if any. */
|
|
300
|
+
function layerTreeHostOf(event) {
|
|
301
|
+
const reporter = event.args?.frame_reporter;
|
|
302
|
+
if (typeof reporter !== "object" || reporter === null)
|
|
303
|
+
return undefined;
|
|
304
|
+
const host = reporter.layer_tree_host_id;
|
|
305
|
+
return typeof host === "number" ? host : undefined;
|
|
306
|
+
}
|
|
307
|
+
/**
|
|
308
|
+
* Time each frame from its paired begin and end.
|
|
309
|
+
*
|
|
310
|
+
* Only the begin event carries the layer tree host, the end event
|
|
311
|
+
* having empty args, so the host is banked on the way in and read
|
|
312
|
+
* back when the pair closes. Measured across 414 pairs, a begin is
|
|
313
|
+
* always closed by the next end for its id, so no pair is lost to
|
|
314
|
+
* an id being reused for a different tree.
|
|
315
|
+
*/
|
|
316
|
+
function foldFrames(events) {
|
|
317
|
+
const opened = new Map();
|
|
318
|
+
const durations = [];
|
|
319
|
+
const hosts = new Set();
|
|
320
|
+
for (const event of events) {
|
|
321
|
+
if (event.name !== "PipelineReporter")
|
|
322
|
+
continue;
|
|
323
|
+
const id = event.id2?.local;
|
|
324
|
+
if (id === undefined)
|
|
325
|
+
continue;
|
|
326
|
+
if (event.ph === "b") {
|
|
327
|
+
const host = layerTreeHostOf(event);
|
|
328
|
+
opened.set(id, { at: event.ts, ...(host === undefined ? {} : { host }) });
|
|
329
|
+
}
|
|
330
|
+
else if (event.ph === "e") {
|
|
331
|
+
const began = opened.get(id);
|
|
332
|
+
if (began === undefined)
|
|
333
|
+
continue;
|
|
334
|
+
opened.delete(id);
|
|
335
|
+
durations.push(ms(event.ts - began.at));
|
|
336
|
+
// Counted only for a frame that closed, so the tally covers
|
|
337
|
+
// exactly the frames the figures are built from.
|
|
338
|
+
if (began.host !== undefined)
|
|
339
|
+
hosts.add(began.host);
|
|
340
|
+
}
|
|
341
|
+
}
|
|
342
|
+
return {
|
|
343
|
+
counted: durations.length,
|
|
344
|
+
longestMs: durations.length === 0 ? 0 : Math.max(...durations),
|
|
345
|
+
slowMs: durations.filter((each) => each > FRAME_BUDGET_MS),
|
|
346
|
+
layerTrees: hosts.size,
|
|
347
|
+
};
|
|
348
|
+
}
|
|
349
|
+
/**
|
|
350
|
+
* Whose frames these are, said as precisely as the trace allows.
|
|
351
|
+
*
|
|
352
|
+
* A trace cannot tie a layer tree to a frame, so this cannot always
|
|
353
|
+
* be narrowed to one page. What it can do is stop hedging when
|
|
354
|
+
* there is nothing to hedge about: a single contributing layer tree
|
|
355
|
+
* means nothing else was in the numbers.
|
|
356
|
+
*/
|
|
357
|
+
function whoseFrames(frames) {
|
|
358
|
+
if (frames.layerTrees === 1) {
|
|
359
|
+
return [
|
|
360
|
+
" One compositor layer tree produced all of them, so these are",
|
|
361
|
+
" this page's frames.",
|
|
362
|
+
];
|
|
363
|
+
}
|
|
364
|
+
if (frames.layerTrees > 1) {
|
|
365
|
+
return [
|
|
366
|
+
` ${frames.layerTrees} compositor layer trees produced them, so`,
|
|
367
|
+
" another page or tree in this renderer process is counted here",
|
|
368
|
+
" too. Nothing in a trace ties a layer tree to a frame, so they",
|
|
369
|
+
" cannot be told apart.",
|
|
370
|
+
];
|
|
371
|
+
}
|
|
372
|
+
return [
|
|
373
|
+
" The pipeline events named no layer tree, so whether another",
|
|
374
|
+
" page in this renderer process is counted here is unknown.",
|
|
375
|
+
];
|
|
376
|
+
}
|
|
377
|
+
/** Say what the recording found, in the order a reader needs it. */
|
|
378
|
+
export function renderTrace(capture) {
|
|
379
|
+
if (capture.mine === 0) {
|
|
380
|
+
return "Nothing was recorded for this page.";
|
|
381
|
+
}
|
|
382
|
+
const lines = [
|
|
383
|
+
`Recorded ${capture.spanMs}ms across ${capture.mine} events ` +
|
|
384
|
+
`(${capture.profiles.join(" and ")}).`,
|
|
385
|
+
];
|
|
386
|
+
if (capture.tasks.length > 0) {
|
|
387
|
+
lines.push("", "Where the time went:");
|
|
388
|
+
for (const task of capture.tasks) {
|
|
389
|
+
lines.push(` ${task.name}: ${task.totalMs}ms over ${task.count}, ` +
|
|
390
|
+
`longest ${task.longestMs}ms`);
|
|
391
|
+
}
|
|
392
|
+
}
|
|
393
|
+
const late = capture.timers.filter((each) => (each.lateByMs ?? 0) > 0);
|
|
394
|
+
if (late.length > 0) {
|
|
395
|
+
lines.push("", "Timers that did not run when they were asked to:");
|
|
396
|
+
for (const timer of late) {
|
|
397
|
+
lines.push(` asked for ${timer.timeoutMs}ms, fired ${timer.lateByMs}ms late`);
|
|
398
|
+
}
|
|
399
|
+
}
|
|
400
|
+
const pending = capture.timers.filter((each) => each.firedAtMs === undefined);
|
|
401
|
+
if (pending.length > 0) {
|
|
402
|
+
lines.push("", `${count(pending.length, "timer")} ` +
|
|
403
|
+
"installed but still waiting when the recording stopped.");
|
|
404
|
+
}
|
|
405
|
+
if (capture.requests.length > 0) {
|
|
406
|
+
lines.push("", `${count(capture.requests.length, "request")}, ` +
|
|
407
|
+
`at most ${capture.overlapping} in flight at once:`);
|
|
408
|
+
for (const request of capture.requests) {
|
|
409
|
+
const settled = request.finishedAtMs === undefined
|
|
410
|
+
? "never settled"
|
|
411
|
+
: `settled ${request.finishedAtMs}ms`;
|
|
412
|
+
lines.push(` ${request.sentAtMs}ms ${request.method ?? "?"} ` +
|
|
413
|
+
`${request.url ?? request.requestId} -> ` +
|
|
414
|
+
`${request.status ?? (request.failed ? "failed" : "?")}, ${settled}`);
|
|
415
|
+
}
|
|
416
|
+
if (capture.resolvedOutOfOrder) {
|
|
417
|
+
lines.push(" One of these settled before a request sent earlier, so the", " order they answered in is not the order they were made.");
|
|
418
|
+
}
|
|
419
|
+
}
|
|
420
|
+
if (capture.frames !== undefined && capture.frames.counted > 0) {
|
|
421
|
+
const frames = capture.frames;
|
|
422
|
+
lines.push("", `${frames.counted} frames, longest ${frames.longestMs}ms, ` +
|
|
423
|
+
`${frames.slowMs.length} over the 16ms budget.`, ...whoseFrames(frames));
|
|
424
|
+
}
|
|
425
|
+
if (capture.unattributed > 0) {
|
|
426
|
+
lines.push("", `${capture.unattributed} events named neither our frames nor our`, "process and were left out rather than guessed at.");
|
|
427
|
+
}
|
|
428
|
+
return lines.join("\n");
|
|
429
|
+
}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Reporting what the page cost.
|
|
3
|
+
*/
|
|
4
|
+
import { renderVerdict } from "../audit/verdict.js";
|
|
5
|
+
import { worstShiftSources, } from "./vitals.js";
|
|
6
|
+
const MARK = {
|
|
7
|
+
good: "good",
|
|
8
|
+
"needs-improvement": "near",
|
|
9
|
+
poor: "POOR",
|
|
10
|
+
};
|
|
11
|
+
/** Mildest to worst, for ordering what to look at first. */
|
|
12
|
+
const SEVERITY = ["good", "needs-improvement", "poor"];
|
|
13
|
+
/** The worst rating decides the verdict. */
|
|
14
|
+
function overall(measures) {
|
|
15
|
+
if (measures.some((one) => one.rating === "poor"))
|
|
16
|
+
return "fail";
|
|
17
|
+
return measures.some((one) => one.rating === "needs-improvement")
|
|
18
|
+
? "warn"
|
|
19
|
+
: "pass";
|
|
20
|
+
}
|
|
21
|
+
function say(value, unit) {
|
|
22
|
+
return unit === "ms" ? `${Math.round(value)} ms` : value.toFixed(3);
|
|
23
|
+
}
|
|
24
|
+
/** Say what the page cost, and what to look at first. */
|
|
25
|
+
export function renderVitals(vitals, measures) {
|
|
26
|
+
if (vitals.error) {
|
|
27
|
+
return renderVerdict({
|
|
28
|
+
standing: "warn",
|
|
29
|
+
headline: "The performance observers could not be installed.",
|
|
30
|
+
measured: vitals.error,
|
|
31
|
+
}, "");
|
|
32
|
+
}
|
|
33
|
+
if (measures.length === 0) {
|
|
34
|
+
return renderVerdict({
|
|
35
|
+
standing: "warn",
|
|
36
|
+
headline: "Nothing was measured.",
|
|
37
|
+
measured: "Observers are installed when a page opens, so a session " +
|
|
38
|
+
"that has not navigated since has nothing to report.",
|
|
39
|
+
}, "");
|
|
40
|
+
}
|
|
41
|
+
// Some measures arrived and some observers did not install. Say
|
|
42
|
+
// both, rather than throwing away what was collected: one
|
|
43
|
+
// unsupported entry type used to cost the whole report.
|
|
44
|
+
const missing = vitals.unavailable ?? [];
|
|
45
|
+
// Naming the one that is never taken, rather than leaving a
|
|
46
|
+
// count to imply the set. Interaction to next paint needs a
|
|
47
|
+
// person to interact: nothing here observes event timing, so a
|
|
48
|
+
// reader told only that four were measured has no way to know
|
|
49
|
+
// responsiveness was never among them, and assumes it passed.
|
|
50
|
+
const caveat = ` Interaction to next paint is not among them: it needs an ` +
|
|
51
|
+
`interaction, and this measures a load.` +
|
|
52
|
+
(missing.length === 0 ? "" : ` Not observed: ${missing.join("; ")}.`);
|
|
53
|
+
const width = Math.max(...measures.map((one) => one.name.length));
|
|
54
|
+
const lines = measures.map((one) => ` ${one.name.padEnd(width)} ${MARK[one.rating].padEnd(4)} ` +
|
|
55
|
+
`${say(one.value, one.unit).padStart(9)}` +
|
|
56
|
+
`${one.detail ? ` ${one.detail}` : ""}`);
|
|
57
|
+
const blame = worstShiftSources(vitals.shifts);
|
|
58
|
+
if (blame.length > 0) {
|
|
59
|
+
lines.push("", "What moved the page:");
|
|
60
|
+
for (const source of blame) {
|
|
61
|
+
lines.push(` ${source.node} ${source.moved.toFixed(3)}`);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
// Worst first, so naming failing[0] names the worst thing.
|
|
65
|
+
// Sorting the other way put a near-miss ahead of a failure and
|
|
66
|
+
// the headline pointed at the milder of the two.
|
|
67
|
+
const failing = measures
|
|
68
|
+
.filter((one) => one.rating !== "good")
|
|
69
|
+
.sort((a, b) => SEVERITY.indexOf(b.rating) - SEVERITY.indexOf(a.rating));
|
|
70
|
+
return renderVerdict({
|
|
71
|
+
// A partial capture cannot pass: an observer that never
|
|
72
|
+
// installed reports nothing, which reads the same as a page
|
|
73
|
+
// with nothing wrong.
|
|
74
|
+
standing: missing.length > 0 && overall(measures) === "pass"
|
|
75
|
+
? "warn"
|
|
76
|
+
: overall(measures),
|
|
77
|
+
headline: failing.length === 0
|
|
78
|
+
? missing.length === 0
|
|
79
|
+
? "Every measure is within its threshold."
|
|
80
|
+
: "Every measure taken is within its threshold, but " +
|
|
81
|
+
`${missing.length} could not be observed.`
|
|
82
|
+
: `${failing.length} of ${measures.length} measures are outside ` +
|
|
83
|
+
`their threshold, worst is ${failing[0]?.name}.`,
|
|
84
|
+
measured: `Measured ${measures.length} of the published web vitals.${caveat}`,
|
|
85
|
+
}, lines.join("\n"));
|
|
86
|
+
}
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* What the page cost the person waiting for it.
|
|
3
|
+
*
|
|
4
|
+
* The numbers come from the browser's own performance observers,
|
|
5
|
+
* which is the only place they can honestly come from: largest
|
|
6
|
+
* contentful paint and layout shift are defined by what the
|
|
7
|
+
* renderer did, not by anything measurable from outside.
|
|
8
|
+
*
|
|
9
|
+
* What this module adds is the arithmetic the observers leave to
|
|
10
|
+
* the caller, and one piece of it matters more than the rest.
|
|
11
|
+
* Cumulative layout shift is not the sum of every shift, though
|
|
12
|
+
* summing is the obvious reading of the name. It is the largest
|
|
13
|
+
* sum within a session window, so a page that shifts a little
|
|
14
|
+
* every few seconds over a long visit is not punished as though
|
|
15
|
+
* it had shifted once, enormously.
|
|
16
|
+
*/
|
|
17
|
+
/** Where a metric falls against the published thresholds. */
|
|
18
|
+
export type Rating = "good" | "needs-improvement" | "poor";
|
|
19
|
+
/** One layout shift the browser recorded. */
|
|
20
|
+
export interface Shift {
|
|
21
|
+
readonly value: number;
|
|
22
|
+
readonly time: number;
|
|
23
|
+
readonly sources: readonly {
|
|
24
|
+
readonly node: string | null;
|
|
25
|
+
readonly from: readonly [number, number] | null;
|
|
26
|
+
readonly to: readonly [number, number] | null;
|
|
27
|
+
}[];
|
|
28
|
+
}
|
|
29
|
+
/** A stretch where the main thread could not respond. */
|
|
30
|
+
export interface LongTask {
|
|
31
|
+
readonly time: number;
|
|
32
|
+
readonly duration: number;
|
|
33
|
+
}
|
|
34
|
+
/** Everything the observers gathered. */
|
|
35
|
+
export interface Vitals {
|
|
36
|
+
readonly lcp?: {
|
|
37
|
+
readonly time: number;
|
|
38
|
+
readonly size: number;
|
|
39
|
+
readonly element: string | null;
|
|
40
|
+
readonly url: string | null;
|
|
41
|
+
};
|
|
42
|
+
readonly shifts: readonly Shift[];
|
|
43
|
+
readonly longTasks: readonly LongTask[];
|
|
44
|
+
readonly paints: Readonly<Record<string, number>>;
|
|
45
|
+
readonly nav?: {
|
|
46
|
+
readonly domContentLoaded: number;
|
|
47
|
+
readonly load: number;
|
|
48
|
+
readonly responseStart: number;
|
|
49
|
+
readonly transferSize: number;
|
|
50
|
+
};
|
|
51
|
+
/** Set when the bootstrap itself could not run at all. */
|
|
52
|
+
readonly error?: string;
|
|
53
|
+
/** Entry types that are being observed. */
|
|
54
|
+
readonly installed?: readonly string[];
|
|
55
|
+
/** Entry types that could not be observed, and why. */
|
|
56
|
+
readonly unavailable?: readonly string[];
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Whether an entry type was actually being watched.
|
|
60
|
+
*
|
|
61
|
+
* An observer that never installed reports nothing, which looks
|
|
62
|
+
* exactly like a page with nothing to report. Cumulative layout
|
|
63
|
+
* shift is the one that matters: it was pushed unconditionally,
|
|
64
|
+
* so a capture where no observer ran still answered 0.000 and
|
|
65
|
+
* PASS, and the renderer's "Nothing was measured" branch could
|
|
66
|
+
* never be reached.
|
|
67
|
+
*/
|
|
68
|
+
export declare function watching(vitals: Vitals, type: string): boolean;
|
|
69
|
+
/** A shift more than this far after the last one starts a new window. */
|
|
70
|
+
export declare const SESSION_GAP_MS = 1000;
|
|
71
|
+
/** No session window runs longer than this. */
|
|
72
|
+
export declare const SESSION_CAP_MS = 5000;
|
|
73
|
+
/**
|
|
74
|
+
* The published good and poor boundaries, in order.
|
|
75
|
+
*
|
|
76
|
+
* `longTask` is the per-task pair: a task over 50ms is long, and
|
|
77
|
+
* the deduction that turns a set of long tasks into total
|
|
78
|
+
* blocking time is taken against that 50. `tbt` is the separate
|
|
79
|
+
* pair for the aggregate. Reusing the per-task numbers to rate
|
|
80
|
+
* the sum called 210ms of total blocking time poor, when the
|
|
81
|
+
* published boundary for poor is 600, and because perf sits in
|
|
82
|
+
* the health digest an ordinary page dragged the whole digest
|
|
83
|
+
* to FAIL.
|
|
84
|
+
*/
|
|
85
|
+
export declare const THRESHOLDS: {
|
|
86
|
+
readonly lcp: {
|
|
87
|
+
readonly good: 2500;
|
|
88
|
+
readonly poor: 4000;
|
|
89
|
+
};
|
|
90
|
+
readonly cls: {
|
|
91
|
+
readonly good: 0.1;
|
|
92
|
+
readonly poor: 0.25;
|
|
93
|
+
};
|
|
94
|
+
readonly fcp: {
|
|
95
|
+
readonly good: 1800;
|
|
96
|
+
readonly poor: 3000;
|
|
97
|
+
};
|
|
98
|
+
readonly ttfb: {
|
|
99
|
+
readonly good: 800;
|
|
100
|
+
readonly poor: 1800;
|
|
101
|
+
};
|
|
102
|
+
readonly longTask: {
|
|
103
|
+
readonly good: 50;
|
|
104
|
+
readonly poor: 200;
|
|
105
|
+
};
|
|
106
|
+
readonly tbt: {
|
|
107
|
+
readonly good: 200;
|
|
108
|
+
readonly poor: 600;
|
|
109
|
+
};
|
|
110
|
+
};
|
|
111
|
+
/** Rate a measurement against its thresholds. */
|
|
112
|
+
export declare function rate(value: number, bounds: {
|
|
113
|
+
readonly good: number;
|
|
114
|
+
readonly poor: number;
|
|
115
|
+
}): Rating;
|
|
116
|
+
/**
|
|
117
|
+
* Cumulative layout shift, as the metric is actually defined.
|
|
118
|
+
*
|
|
119
|
+
* Shifts are grouped into windows: a gap of a second starts a
|
|
120
|
+
* new one, and no window runs past five seconds. The score is
|
|
121
|
+
* the largest window, not the total. Summing everything would
|
|
122
|
+
* report a page that nudges once a minute as worse than one
|
|
123
|
+
* that jumps once on load, which is backwards.
|
|
124
|
+
*/
|
|
125
|
+
export declare function cumulativeShift(shifts: readonly Shift[]): number;
|
|
126
|
+
/** What most moved the page, and how much. */
|
|
127
|
+
export declare function worstShiftSources(shifts: readonly Shift[], limit?: number): readonly {
|
|
128
|
+
readonly node: string;
|
|
129
|
+
readonly moved: number;
|
|
130
|
+
}[];
|
|
131
|
+
/** One metric, rated. */
|
|
132
|
+
export interface Measure {
|
|
133
|
+
readonly name: string;
|
|
134
|
+
readonly value: number;
|
|
135
|
+
readonly unit: "ms" | "score";
|
|
136
|
+
readonly rating: Rating;
|
|
137
|
+
/** What the value points at, when the browser said. */
|
|
138
|
+
readonly detail?: string;
|
|
139
|
+
}
|
|
140
|
+
/** Read the vitals into rated measures. */
|
|
141
|
+
export declare function measure(vitals: Vitals): readonly Measure[];
|