@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,307 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* What a session pretends to be, and how the pretence is kept.
|
|
3
|
+
*
|
|
4
|
+
* The intent is held whole and re-applied in full, because
|
|
5
|
+
* Chrome's media emulation forgets anything a call omits, and a
|
|
6
|
+
* cross-process navigation swaps the renderer the flags live in.
|
|
7
|
+
* Applying, observing and diverging all live here so the one
|
|
8
|
+
* piece of state has one keeper.
|
|
9
|
+
*/
|
|
10
|
+
import { KnownDevices } from "puppeteer-core";
|
|
11
|
+
import { deviceEmulation, noSuchDevice } from "../environment/devices.js";
|
|
12
|
+
import { divergences, ENVIRONMENT_PROBE, mediaFeaturesOf, mergeEmulation, refusedFeature, unsupportedFields, withoutFeature, } from "../environment/index.js";
|
|
13
|
+
/**
|
|
14
|
+
* Touch points a touch device is given, matching a common phone.
|
|
15
|
+
*
|
|
16
|
+
* Layered over the driver's own request, which asks only for touch
|
|
17
|
+
* to exist. If a navigation ever costs us this command again, the
|
|
18
|
+
* driver restores touch with one point rather than none, so the
|
|
19
|
+
* page stays a touch device and only the count degrades.
|
|
20
|
+
*/
|
|
21
|
+
const TOUCH_POINTS = 5;
|
|
22
|
+
/** Metres of accuracy claimed for an overridden position. */
|
|
23
|
+
const GEOLOCATION_ACCURACY = 10;
|
|
24
|
+
/** The standing pretence, applied, observed and diverged. */
|
|
25
|
+
export class EmulationController {
|
|
26
|
+
wires;
|
|
27
|
+
hooks;
|
|
28
|
+
/** What this session is pretending to be. */
|
|
29
|
+
state = {};
|
|
30
|
+
/**
|
|
31
|
+
* Media features this browser turned down.
|
|
32
|
+
*
|
|
33
|
+
* Kept so the refusal can be reported once, rather than lost
|
|
34
|
+
* silently or, worse, left in the intent to fail again on every
|
|
35
|
+
* navigation that replays it.
|
|
36
|
+
*/
|
|
37
|
+
refused = [];
|
|
38
|
+
constructor(wires, hooks) {
|
|
39
|
+
this.wires = wires;
|
|
40
|
+
this.hooks = hooks;
|
|
41
|
+
}
|
|
42
|
+
/** What this session has asked the browser to pretend. */
|
|
43
|
+
get asked() {
|
|
44
|
+
return this.state;
|
|
45
|
+
}
|
|
46
|
+
/** Whether the page believes it is being touched. */
|
|
47
|
+
get touch() {
|
|
48
|
+
return this.state.touch === true;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Put the emulation back exactly as it was.
|
|
52
|
+
*
|
|
53
|
+
* change merges, which is right for a caller adding one
|
|
54
|
+
* condition and wrong for anything that has to undo itself: a
|
|
55
|
+
* merge cannot clear a field, so a sweep that widened the
|
|
56
|
+
* viewport could never restore a session that had none. This
|
|
57
|
+
* replaces the state wholesale.
|
|
58
|
+
*/
|
|
59
|
+
async restore(state) {
|
|
60
|
+
await this.wires.ready();
|
|
61
|
+
this.state = state;
|
|
62
|
+
await this.apply();
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Pretend to be a different visitor, then report what the page
|
|
66
|
+
* actually experiences.
|
|
67
|
+
*
|
|
68
|
+
* The intent is kept whole and re-applied in full, because
|
|
69
|
+
* Chrome's media emulation forgets anything a call omits, so
|
|
70
|
+
* asking for reduced motion after asking for dark mode would
|
|
71
|
+
* otherwise turn the dark mode back off.
|
|
72
|
+
*/
|
|
73
|
+
async change(change = {},
|
|
74
|
+
/** Overrides to take off, which an absent key cannot express. */
|
|
75
|
+
clear = []) {
|
|
76
|
+
await this.wires.ready();
|
|
77
|
+
// Anything this cannot emulate is named before it is dropped.
|
|
78
|
+
// Silently ignoring a field meant a call asking for a 1024px
|
|
79
|
+
// viewport did nothing, said nothing, and reported no gaps.
|
|
80
|
+
const ignored = unsupportedFields(change);
|
|
81
|
+
this.state = mergeEmulation(this.state, change, clear);
|
|
82
|
+
// A device this catalogue has never heard of is reported the
|
|
83
|
+
// same way as a field with nothing behind it, rather than
|
|
84
|
+
// echoed back as though it had been honoured.
|
|
85
|
+
const device = this.state.device;
|
|
86
|
+
const unknown = device !== undefined && !deviceEmulation(device, KnownDevices)
|
|
87
|
+
? [
|
|
88
|
+
{
|
|
89
|
+
what: "device",
|
|
90
|
+
asked: device,
|
|
91
|
+
observed: "ignored, no device by that name",
|
|
92
|
+
note: noSuchDevice(device, KnownDevices),
|
|
93
|
+
},
|
|
94
|
+
]
|
|
95
|
+
: [];
|
|
96
|
+
await this.apply();
|
|
97
|
+
// A feature the browser turned down is reported beside the
|
|
98
|
+
// fields this build never had, since to the caller they are the
|
|
99
|
+
// same disappointment.
|
|
100
|
+
const turnedDown = this.refused.map((feature) => ({
|
|
101
|
+
what: feature,
|
|
102
|
+
asked: "emulated",
|
|
103
|
+
observed: "refused by this browser",
|
|
104
|
+
note: `this Chrome does not know ${feature}, so it has been ` +
|
|
105
|
+
"dropped rather than retried on every navigation",
|
|
106
|
+
}));
|
|
107
|
+
// A viewport change reflows the page and a real application
|
|
108
|
+
// re-renders for it, so the same wait a navigation gets applies
|
|
109
|
+
// here: without it the next read describes the old layout.
|
|
110
|
+
await this.hooks.settle();
|
|
111
|
+
const observed = await this.observe();
|
|
112
|
+
// Emulating before navigating is the order this tool asks for,
|
|
113
|
+
// and it used to be punished for it. There is nothing laid out
|
|
114
|
+
// on a blank page, so the width comes back as the desktop
|
|
115
|
+
// default and ontouchstart has no document to be installed on:
|
|
116
|
+
// two alarming gaps that both come right the moment a real page
|
|
117
|
+
// loads. Reporting them as divergences sent me measuring the
|
|
118
|
+
// wrong thing twice. What the page cannot answer yet is not a
|
|
119
|
+
// discrepancy, so it is held back and said plainly instead.
|
|
120
|
+
const blank = this.wires.page().url() === "about:blank";
|
|
121
|
+
const measured = blank
|
|
122
|
+
? [
|
|
123
|
+
{
|
|
124
|
+
what: "the page",
|
|
125
|
+
asked: "nothing loaded yet",
|
|
126
|
+
observed: "about:blank",
|
|
127
|
+
note: "layout and touch cannot be checked until a document " +
|
|
128
|
+
"is loaded; navigate, then read status to confirm",
|
|
129
|
+
},
|
|
130
|
+
]
|
|
131
|
+
: divergences(this.effective, observed);
|
|
132
|
+
return {
|
|
133
|
+
asked: this.state,
|
|
134
|
+
observed,
|
|
135
|
+
// Compared against the effective state, since a device is
|
|
136
|
+
// the reason a viewport is what it is.
|
|
137
|
+
gaps: [...ignored, ...unknown, ...turnedDown, ...measured],
|
|
138
|
+
};
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* Put the standing intent to the browser again, after arriving.
|
|
142
|
+
*
|
|
143
|
+
* Kept, though the driver now carries emulation across a
|
|
144
|
+
* navigation itself, because this same path restores a session
|
|
145
|
+
* after a crash and because it costs nothing when nothing is
|
|
146
|
+
* being emulated.
|
|
147
|
+
*
|
|
148
|
+
* What is gone is what used to sit under here: a second
|
|
149
|
+
* application on the document-arrival event, and a loop that
|
|
150
|
+
* asked the page whether the first two had worked. Both were
|
|
151
|
+
* workarounds for sending emulation on a protocol session of our
|
|
152
|
+
* own, and neither made it certain. Removing the cause removed
|
|
153
|
+
* the need for either, measured twelve times out of twelve
|
|
154
|
+
* through the shape that used to fail one time in three.
|
|
155
|
+
*/
|
|
156
|
+
async reassert() {
|
|
157
|
+
if (Object.keys(this.state).length === 0)
|
|
158
|
+
return;
|
|
159
|
+
await this.apply();
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* How the pretence and the page disagree right now.
|
|
163
|
+
*
|
|
164
|
+
* Checked rather than recited. What is being emulated is what
|
|
165
|
+
* the session asked for, and a navigation can quietly drop part
|
|
166
|
+
* of it, so the page is asked whether it agrees before status
|
|
167
|
+
* says it is pretending to be a phone. A blank page has nothing
|
|
168
|
+
* laid out to check, so it reports no gaps rather than fake ones.
|
|
169
|
+
*/
|
|
170
|
+
async currentGaps() {
|
|
171
|
+
const blank = this.wires.page().url() === "about:blank";
|
|
172
|
+
if (blank || Object.keys(this.state).length === 0)
|
|
173
|
+
return [];
|
|
174
|
+
return divergences(this.effective, await this.observe());
|
|
175
|
+
}
|
|
176
|
+
/**
|
|
177
|
+
* The standing intent with any named device resolved.
|
|
178
|
+
*
|
|
179
|
+
* A device is shorthand for a viewport and a touch screen, and
|
|
180
|
+
* anything the caller said explicitly outranks it: asking for a
|
|
181
|
+
* phone and a width means the phone with that width.
|
|
182
|
+
*/
|
|
183
|
+
get effective() {
|
|
184
|
+
const asked = this.state;
|
|
185
|
+
if (asked.device === undefined)
|
|
186
|
+
return asked;
|
|
187
|
+
const fromDevice = deviceEmulation(asked.device, KnownDevices);
|
|
188
|
+
if (!fromDevice)
|
|
189
|
+
return asked;
|
|
190
|
+
return { ...fromDevice, ...asked };
|
|
191
|
+
}
|
|
192
|
+
/**
|
|
193
|
+
* Put the media features to the browser, dropping any it refuses.
|
|
194
|
+
*
|
|
195
|
+
* The set goes over in one call and Chrome rejects the whole set on
|
|
196
|
+
* the first feature it does not recognise, so a feature this build
|
|
197
|
+
* of Chrome has never heard of would otherwise take every working
|
|
198
|
+
* feature with it. Worse, the intent is replayed on navigation, so
|
|
199
|
+
* a single refusal became an error on later calls that asked for
|
|
200
|
+
* nothing at all: one real session failed a plain navigate with
|
|
201
|
+
* "Unsupported media feature: prefers-contrast" long after the
|
|
202
|
+
* emulate call that set it.
|
|
203
|
+
*
|
|
204
|
+
* Dropping is per feature and one at a time, because the message
|
|
205
|
+
* names only the first offender.
|
|
206
|
+
*/
|
|
207
|
+
async applyMediaFeatures(page, state) {
|
|
208
|
+
let wanted = state;
|
|
209
|
+
for (;;) {
|
|
210
|
+
try {
|
|
211
|
+
await page.emulateMediaFeatures([...mediaFeaturesOf(wanted)]);
|
|
212
|
+
return;
|
|
213
|
+
}
|
|
214
|
+
catch (failure) {
|
|
215
|
+
const feature = refusedFeature(failure instanceof Error ? failure.message : String(failure));
|
|
216
|
+
const left = feature ? withoutFeature(wanted, feature) : wanted;
|
|
217
|
+
// Nothing to drop means the failure was not a refusal, or
|
|
218
|
+
// names something this cannot map, and retrying would spin.
|
|
219
|
+
if (!feature || left === wanted)
|
|
220
|
+
throw failure;
|
|
221
|
+
if (!this.refused.includes(feature))
|
|
222
|
+
this.refused.push(feature);
|
|
223
|
+
// The intent itself gives the feature up, so no later
|
|
224
|
+
// navigation replays it.
|
|
225
|
+
this.state = withoutFeature(this.state, feature);
|
|
226
|
+
wanted = left;
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
/** Put the whole standing intent to the browser. */
|
|
231
|
+
async apply() {
|
|
232
|
+
const state = this.effective;
|
|
233
|
+
const page = this.wires.page();
|
|
234
|
+
// Every one of these goes through the driver rather than the
|
|
235
|
+
// protocol, and that is the whole fix for emulation not
|
|
236
|
+
// surviving a navigation.
|
|
237
|
+
//
|
|
238
|
+
// A cross-process navigation swaps the target's protocol
|
|
239
|
+
// session. The driver listens for that swap and puts its whole
|
|
240
|
+
// emulation state to the new session; commands sent on a session
|
|
241
|
+
// of our own just went to the renderer being replaced. Device
|
|
242
|
+
// metrics are held browser-side and came through regardless,
|
|
243
|
+
// which is why this looked like a touch-only fault: touch is a
|
|
244
|
+
// flag in the renderer, so the page quietly stopped being a
|
|
245
|
+
// phone while the report still said it was one.
|
|
246
|
+
await page.emulateMediaType(state.media);
|
|
247
|
+
await this.applyMediaFeatures(page, state);
|
|
248
|
+
await page.emulateVisionDeficiency(state.vision ?? "none");
|
|
249
|
+
// Screen, touch and user agent go through the driver rather
|
|
250
|
+
// than the protocol, which is the whole reason they now survive
|
|
251
|
+
// a navigation.
|
|
252
|
+
await page.setViewport(state.viewport
|
|
253
|
+
? {
|
|
254
|
+
width: state.viewport.width,
|
|
255
|
+
height: state.viewport.height,
|
|
256
|
+
deviceScaleFactor: state.viewport.deviceScaleFactor ?? 1,
|
|
257
|
+
isMobile: state.viewport.mobile ?? false,
|
|
258
|
+
hasTouch: state.touch ?? false,
|
|
259
|
+
}
|
|
260
|
+
: // Null is how the driver spells "stop overriding", and
|
|
261
|
+
// touch has to be asked for separately when there is no
|
|
262
|
+
// viewport to carry it.
|
|
263
|
+
null);
|
|
264
|
+
// The driver asks for a touch screen without saying how many
|
|
265
|
+
// fingers, which Chrome reads as one; a real phone reports five,
|
|
266
|
+
// so that is asked for on top.
|
|
267
|
+
//
|
|
268
|
+
// Sent every time, including to turn it off. Sending it only
|
|
269
|
+
// when touch was wanted left a phone that could not stop being
|
|
270
|
+
// one: this override rides on our own protocol session, the
|
|
271
|
+
// driver's disable rides on its own, and one session cannot
|
|
272
|
+
// clear the other's. So the viewport and the user agent went
|
|
273
|
+
// back to the desktop while the touch screen stayed.
|
|
274
|
+
await this.wires.cdp().send("Emulation.setTouchEmulationEnabled", {
|
|
275
|
+
enabled: state.touch ?? false,
|
|
276
|
+
...(state.touch ? { maxTouchPoints: TOUCH_POINTS } : {}),
|
|
277
|
+
});
|
|
278
|
+
// An empty string is how this one is taken off again.
|
|
279
|
+
await page.setUserAgent(state.userAgent ?? "");
|
|
280
|
+
await page.emulateCPUThrottling(state.cpuThrottle ?? null);
|
|
281
|
+
// Passed undefined rather than skipped, because an override
|
|
282
|
+
// with no arguments is how one gets taken off again. Guarding
|
|
283
|
+
// these on being defined meant nothing could ever be cleared: a
|
|
284
|
+
// session that emulated Tokyo once stayed in Tokyo for its life,
|
|
285
|
+
// quietly recolouring every later reading.
|
|
286
|
+
await page.emulateTimezone(state.timezone);
|
|
287
|
+
await page.emulateLocale(state.locale);
|
|
288
|
+
if (state.geolocation === undefined) {
|
|
289
|
+
await this.wires.cdp().send("Emulation.clearGeolocationOverride");
|
|
290
|
+
}
|
|
291
|
+
else {
|
|
292
|
+
await this.wires.cdp().send("Emulation.setGeolocationOverride", {
|
|
293
|
+
latitude: state.geolocation.latitude,
|
|
294
|
+
longitude: state.geolocation.longitude,
|
|
295
|
+
accuracy: state.geolocation.accuracy ?? GEOLOCATION_ACCURACY,
|
|
296
|
+
});
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
/** What the page says it is experiencing. */
|
|
300
|
+
async observe() {
|
|
301
|
+
const { result } = await this.wires.cdp().send("Runtime.evaluate", {
|
|
302
|
+
expression: ENVIRONMENT_PROBE,
|
|
303
|
+
returnByValue: true,
|
|
304
|
+
});
|
|
305
|
+
return result.value;
|
|
306
|
+
}
|
|
307
|
+
}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Who is tracing, and the fact that only one of us can be.
|
|
3
|
+
*
|
|
4
|
+
* Tracing is a browser-wide facility rather than a per-page one.
|
|
5
|
+
* Measured: a second Tracing.start is refused with "Tracing has
|
|
6
|
+
* already been started (possibly in another tab)", and a recording
|
|
7
|
+
* begun for one session contains another session's work. So the
|
|
8
|
+
* limit is real, and it is shared.
|
|
9
|
+
*
|
|
10
|
+
* That makes two things this module's job. It hands out the single
|
|
11
|
+
* permit, so a second session is told no rather than crashing into
|
|
12
|
+
* a protocol error. And it remembers who holds it, because every
|
|
13
|
+
* page in the browser is paying for a recording while it runs and
|
|
14
|
+
* a reader wondering why should be able to find out.
|
|
15
|
+
*/
|
|
16
|
+
import type { TraceProfile } from "../perf/trace.js";
|
|
17
|
+
/** A recording in progress, and who asked for it. */
|
|
18
|
+
export interface Recording {
|
|
19
|
+
/** The session that started it. */
|
|
20
|
+
readonly session: string;
|
|
21
|
+
readonly profiles: readonly TraceProfile[];
|
|
22
|
+
readonly startedAt: Date;
|
|
23
|
+
}
|
|
24
|
+
/** Why a recording could not be started. */
|
|
25
|
+
export interface RecordingRefused {
|
|
26
|
+
readonly refusal: string;
|
|
27
|
+
/** The recording already running. */
|
|
28
|
+
readonly held: Recording;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Claim the single recording permit.
|
|
32
|
+
*
|
|
33
|
+
* Refuses rather than waiting. A traced action that silently
|
|
34
|
+
* queued behind another session's recording would report a
|
|
35
|
+
* duration that included the wait, which is a worse answer than
|
|
36
|
+
* being told the facility is busy.
|
|
37
|
+
*/
|
|
38
|
+
export declare function claimRecording(session: string, profiles: readonly TraceProfile[]): Recording | RecordingRefused;
|
|
39
|
+
/** Release the permit. Safe to call when nothing is held. */
|
|
40
|
+
export declare function releaseRecording(): void;
|
|
41
|
+
/** The recording in progress, for any session that wants to report it. */
|
|
42
|
+
export declare function recordingInProgress(): Recording | undefined;
|
|
43
|
+
/**
|
|
44
|
+
* How a session's status should mention a live recording.
|
|
45
|
+
*
|
|
46
|
+
* Every session says this, not just the one that started it,
|
|
47
|
+
* because every page in the browser is being instrumented while
|
|
48
|
+
* it runs. A reader looking at an unexpectedly slow page should
|
|
49
|
+
* find the reason in front of them.
|
|
50
|
+
*/
|
|
51
|
+
export declare function describeRecording(recording: Recording | undefined, viewer: string): string | undefined;
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Who is tracing, and the fact that only one of us can be.
|
|
3
|
+
*
|
|
4
|
+
* Tracing is a browser-wide facility rather than a per-page one.
|
|
5
|
+
* Measured: a second Tracing.start is refused with "Tracing has
|
|
6
|
+
* already been started (possibly in another tab)", and a recording
|
|
7
|
+
* begun for one session contains another session's work. So the
|
|
8
|
+
* limit is real, and it is shared.
|
|
9
|
+
*
|
|
10
|
+
* That makes two things this module's job. It hands out the single
|
|
11
|
+
* permit, so a second session is told no rather than crashing into
|
|
12
|
+
* a protocol error. And it remembers who holds it, because every
|
|
13
|
+
* page in the browser is paying for a recording while it runs and
|
|
14
|
+
* a reader wondering why should be able to find out.
|
|
15
|
+
*/
|
|
16
|
+
let current;
|
|
17
|
+
/**
|
|
18
|
+
* Claim the single recording permit.
|
|
19
|
+
*
|
|
20
|
+
* Refuses rather than waiting. A traced action that silently
|
|
21
|
+
* queued behind another session's recording would report a
|
|
22
|
+
* duration that included the wait, which is a worse answer than
|
|
23
|
+
* being told the facility is busy.
|
|
24
|
+
*/
|
|
25
|
+
export function claimRecording(session, profiles) {
|
|
26
|
+
if (current !== undefined) {
|
|
27
|
+
const since = current.startedAt.toISOString().slice(11, 19);
|
|
28
|
+
return {
|
|
29
|
+
refusal: `Session ${current.session} has been recording a trace since ` +
|
|
30
|
+
`${since}. The browser allows one at a time, so this one ` +
|
|
31
|
+
"cannot start until that finishes.",
|
|
32
|
+
held: current,
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
current = { session, profiles, startedAt: new Date() };
|
|
36
|
+
return current;
|
|
37
|
+
}
|
|
38
|
+
/** Release the permit. Safe to call when nothing is held. */
|
|
39
|
+
export function releaseRecording() {
|
|
40
|
+
current = undefined;
|
|
41
|
+
}
|
|
42
|
+
/** The recording in progress, for any session that wants to report it. */
|
|
43
|
+
export function recordingInProgress() {
|
|
44
|
+
return current;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* How a session's status should mention a live recording.
|
|
48
|
+
*
|
|
49
|
+
* Every session says this, not just the one that started it,
|
|
50
|
+
* because every page in the browser is being instrumented while
|
|
51
|
+
* it runs. A reader looking at an unexpectedly slow page should
|
|
52
|
+
* find the reason in front of them.
|
|
53
|
+
*/
|
|
54
|
+
export function describeRecording(recording, viewer) {
|
|
55
|
+
if (recording === undefined)
|
|
56
|
+
return undefined;
|
|
57
|
+
const whose = recording.session === viewer
|
|
58
|
+
? "this session"
|
|
59
|
+
: `session ${recording.session}`;
|
|
60
|
+
return (`Tracing is on, started by ${whose} at ` +
|
|
61
|
+
`${recording.startedAt.toISOString().slice(11, 19)} ` +
|
|
62
|
+
`(${recording.profiles.join(" and ")}). Every page in the browser ` +
|
|
63
|
+
"is being instrumented while it runs.");
|
|
64
|
+
}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Waiting for a page to stop changing, so a read that follows
|
|
3
|
+
* describes where the page ended up rather than where it was.
|
|
4
|
+
*
|
|
5
|
+
* The DOM and the network each miss a case the other catches,
|
|
6
|
+
* so both have to hold at once, and since satisfying one can
|
|
7
|
+
* disturb the other they are rechecked together until they
|
|
8
|
+
* agree or the budget runs out.
|
|
9
|
+
*/
|
|
10
|
+
import type { NetworkRequest } from "../telemetry/index.js";
|
|
11
|
+
import { type Settled } from "../wait/index.js";
|
|
12
|
+
import type { SessionWires } from "./wires.js";
|
|
13
|
+
/** The wait between a change and an honest reading of it. */
|
|
14
|
+
export declare class PageSettler {
|
|
15
|
+
private readonly wires;
|
|
16
|
+
/** The request log, for what may yet rewrite the page. */
|
|
17
|
+
private readonly requests;
|
|
18
|
+
/** What the last settle saw, so a reader can qualify its answer. */
|
|
19
|
+
private last;
|
|
20
|
+
constructor(wires: SessionWires,
|
|
21
|
+
/** The request log, for what may yet rewrite the page. */
|
|
22
|
+
requests: () => readonly NetworkRequest[]);
|
|
23
|
+
/** What the last settle saw, for a reader that wants to say so. */
|
|
24
|
+
get lastSeen(): Settled | undefined;
|
|
25
|
+
/**
|
|
26
|
+
* Wait for the page to stop changing.
|
|
27
|
+
*
|
|
28
|
+
* Returns what it found instead of throwing on a page that never
|
|
29
|
+
* settles: something that animates or polls for ever is still
|
|
30
|
+
* worth reading, as long as the answer does not pretend it was
|
|
31
|
+
* final.
|
|
32
|
+
*
|
|
33
|
+
* The budget is a parameter rather than only a constant because
|
|
34
|
+
* what it has to exceed is the quiet interval, and both stretch
|
|
35
|
+
* on a machine under load. A caller that needs "this page is
|
|
36
|
+
* quiet" to be answered reliably has to be able to say how long
|
|
37
|
+
* it is willing to wait for that, rather than inheriting a number
|
|
38
|
+
* chosen for an interactive read. Two browser tests asserting
|
|
39
|
+
* exactly that property failed intermittently for want of this.
|
|
40
|
+
*/
|
|
41
|
+
settle(budgetMs?: number): Promise<Settled>;
|
|
42
|
+
}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Waiting for a page to stop changing, so a read that follows
|
|
3
|
+
* describes where the page ended up rather than where it was.
|
|
4
|
+
*
|
|
5
|
+
* The DOM and the network each miss a case the other catches,
|
|
6
|
+
* so both have to hold at once, and since satisfying one can
|
|
7
|
+
* disturb the other they are rechecked together until they
|
|
8
|
+
* agree or the budget runs out.
|
|
9
|
+
*/
|
|
10
|
+
import { inFlight, SETTLE_BUDGET_MS, SETTLE_QUIET_MS, settleSource, } from "../wait/index.js";
|
|
11
|
+
/**
|
|
12
|
+
* Whether the settle probe came back with what it promised.
|
|
13
|
+
*
|
|
14
|
+
* Page-side results arrive as unknown, and a navigation landing
|
|
15
|
+
* mid-evaluate resolves with nothing at all, so this is narrowed
|
|
16
|
+
* rather than asserted.
|
|
17
|
+
*/
|
|
18
|
+
function isSettled(value) {
|
|
19
|
+
if (typeof value !== "object" || value === null)
|
|
20
|
+
return false;
|
|
21
|
+
const candidate = value;
|
|
22
|
+
return (typeof candidate.quiet === "boolean" &&
|
|
23
|
+
typeof candidate.waitedMs === "number" &&
|
|
24
|
+
typeof candidate.mutations === "number");
|
|
25
|
+
}
|
|
26
|
+
/** The wait between a change and an honest reading of it. */
|
|
27
|
+
export class PageSettler {
|
|
28
|
+
wires;
|
|
29
|
+
requests;
|
|
30
|
+
/** What the last settle saw, so a reader can qualify its answer. */
|
|
31
|
+
last;
|
|
32
|
+
constructor(wires,
|
|
33
|
+
/** The request log, for what may yet rewrite the page. */
|
|
34
|
+
requests) {
|
|
35
|
+
this.wires = wires;
|
|
36
|
+
this.requests = requests;
|
|
37
|
+
}
|
|
38
|
+
/** What the last settle saw, for a reader that wants to say so. */
|
|
39
|
+
get lastSeen() {
|
|
40
|
+
return this.last;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Wait for the page to stop changing.
|
|
44
|
+
*
|
|
45
|
+
* Returns what it found instead of throwing on a page that never
|
|
46
|
+
* settles: something that animates or polls for ever is still
|
|
47
|
+
* worth reading, as long as the answer does not pretend it was
|
|
48
|
+
* final.
|
|
49
|
+
*
|
|
50
|
+
* The budget is a parameter rather than only a constant because
|
|
51
|
+
* what it has to exceed is the quiet interval, and both stretch
|
|
52
|
+
* on a machine under load. A caller that needs "this page is
|
|
53
|
+
* quiet" to be answered reliably has to be able to say how long
|
|
54
|
+
* it is willing to wait for that, rather than inheriting a number
|
|
55
|
+
* chosen for an interactive read. Two browser tests asserting
|
|
56
|
+
* exactly that property failed intermittently for want of this.
|
|
57
|
+
*/
|
|
58
|
+
async settle(budgetMs = SETTLE_BUDGET_MS) {
|
|
59
|
+
const started = Date.now();
|
|
60
|
+
let mutations = 0;
|
|
61
|
+
let quiet = false;
|
|
62
|
+
// The DOM and the network each miss a case the other catches.
|
|
63
|
+
//
|
|
64
|
+
// A client-side navigation waiting on a fetch touches nothing
|
|
65
|
+
// for as long as the request takes, so the DOM goes quiet and
|
|
66
|
+
// the page then changes completely a moment later: pressing
|
|
67
|
+
// Enter on a search box answered with the pre-search page for
|
|
68
|
+
// exactly this reason. Meanwhile Chrome's network idle fires
|
|
69
|
+
// before an app that already has its data has rendered any of
|
|
70
|
+
// it.
|
|
71
|
+
//
|
|
72
|
+
// So both have to hold at once, and since satisfying one can
|
|
73
|
+
// disturb the other, they are rechecked together until they
|
|
74
|
+
// agree or the budget runs out.
|
|
75
|
+
while (Date.now() - started < budgetMs) {
|
|
76
|
+
const left = budgetMs - (Date.now() - started);
|
|
77
|
+
const outcome = await this.wires
|
|
78
|
+
.page()
|
|
79
|
+
.evaluate(settleSource(SETTLE_QUIET_MS, left))
|
|
80
|
+
.catch(() => undefined);
|
|
81
|
+
if (isSettled(outcome)) {
|
|
82
|
+
mutations += outcome.mutations;
|
|
83
|
+
quiet = outcome.quiet;
|
|
84
|
+
}
|
|
85
|
+
else {
|
|
86
|
+
// A navigation landed mid-evaluate, which is itself the
|
|
87
|
+
// change we are waiting out. Go round again.
|
|
88
|
+
quiet = false;
|
|
89
|
+
}
|
|
90
|
+
if (!quiet)
|
|
91
|
+
continue;
|
|
92
|
+
if (inFlight(this.requests()).length === 0)
|
|
93
|
+
break;
|
|
94
|
+
// Something is outstanding that may yet rewrite the page.
|
|
95
|
+
quiet = false;
|
|
96
|
+
}
|
|
97
|
+
this.last = {
|
|
98
|
+
quiet,
|
|
99
|
+
waitedMs: Date.now() - started,
|
|
100
|
+
mutations,
|
|
101
|
+
};
|
|
102
|
+
return this.last;
|
|
103
|
+
}
|
|
104
|
+
}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Bending the network a session sees: mocked replies, blocked
|
|
3
|
+
* requests and throttled throughput.
|
|
4
|
+
*
|
|
5
|
+
* Interception is only attached while there is a rule to apply.
|
|
6
|
+
* Every paused request has to be answered or the page waits on
|
|
7
|
+
* it forever, so an interceptor with nothing to say is a
|
|
8
|
+
* liability rather than a neutral bystander.
|
|
9
|
+
*/
|
|
10
|
+
import { type NetworkRule, type ThrottleConditions } from "../environment/index.js";
|
|
11
|
+
import type { SessionWires } from "./wires.js";
|
|
12
|
+
/** The rules and throttle a session's network answers to. */
|
|
13
|
+
export declare class NetworkShaper {
|
|
14
|
+
private readonly wires;
|
|
15
|
+
/** Requests being mocked or blocked, first match winning. */
|
|
16
|
+
private rules;
|
|
17
|
+
/** How slow the network is being made, if at all. */
|
|
18
|
+
private throttle?;
|
|
19
|
+
/** Whether the interceptor is currently attached. */
|
|
20
|
+
private intercepting;
|
|
21
|
+
constructor(wires: SessionWires);
|
|
22
|
+
/** How the network is currently being bent. */
|
|
23
|
+
get current(): {
|
|
24
|
+
rules: readonly NetworkRule[];
|
|
25
|
+
throttle: ThrottleConditions | undefined;
|
|
26
|
+
};
|
|
27
|
+
/**
|
|
28
|
+
* Mock a reply, block a request, slow it all down, or stop
|
|
29
|
+
* pretending.
|
|
30
|
+
*/
|
|
31
|
+
shape(change: {
|
|
32
|
+
rules?: readonly NetworkRule[];
|
|
33
|
+
/** Conditions, or the name of a profile such as slow-3g. */
|
|
34
|
+
throttle?: ThrottleConditions | string;
|
|
35
|
+
clear?: boolean;
|
|
36
|
+
}): Promise<{
|
|
37
|
+
rules: readonly NetworkRule[];
|
|
38
|
+
throttle: ThrottleConditions | undefined;
|
|
39
|
+
}>;
|
|
40
|
+
/**
|
|
41
|
+
* Decide what a paused request gets.
|
|
42
|
+
*
|
|
43
|
+
* Whatever happens, it is answered. A handler that throws and
|
|
44
|
+
* says nothing leaves the page waiting forever on a request
|
|
45
|
+
* the browser has already stopped for us.
|
|
46
|
+
*/
|
|
47
|
+
private answerPaused;
|
|
48
|
+
}
|