@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,175 @@
|
|
|
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
|
+
import { count } from "../../ui/count.js";
|
|
18
|
+
/**
|
|
19
|
+
* Whether an entry type was actually being watched.
|
|
20
|
+
*
|
|
21
|
+
* An observer that never installed reports nothing, which looks
|
|
22
|
+
* exactly like a page with nothing to report. Cumulative layout
|
|
23
|
+
* shift is the one that matters: it was pushed unconditionally,
|
|
24
|
+
* so a capture where no observer ran still answered 0.000 and
|
|
25
|
+
* PASS, and the renderer's "Nothing was measured" branch could
|
|
26
|
+
* never be reached.
|
|
27
|
+
*/
|
|
28
|
+
export function watching(vitals, type) {
|
|
29
|
+
// A capture from before this was recorded says nothing either
|
|
30
|
+
// way; treat it as watching, which is how it behaved then.
|
|
31
|
+
return vitals.installed === undefined || vitals.installed.includes(type);
|
|
32
|
+
}
|
|
33
|
+
/** A shift more than this far after the last one starts a new window. */
|
|
34
|
+
export const SESSION_GAP_MS = 1000;
|
|
35
|
+
/** No session window runs longer than this. */
|
|
36
|
+
export const SESSION_CAP_MS = 5000;
|
|
37
|
+
/**
|
|
38
|
+
* The published good and poor boundaries, in order.
|
|
39
|
+
*
|
|
40
|
+
* `longTask` is the per-task pair: a task over 50ms is long, and
|
|
41
|
+
* the deduction that turns a set of long tasks into total
|
|
42
|
+
* blocking time is taken against that 50. `tbt` is the separate
|
|
43
|
+
* pair for the aggregate. Reusing the per-task numbers to rate
|
|
44
|
+
* the sum called 210ms of total blocking time poor, when the
|
|
45
|
+
* published boundary for poor is 600, and because perf sits in
|
|
46
|
+
* the health digest an ordinary page dragged the whole digest
|
|
47
|
+
* to FAIL.
|
|
48
|
+
*/
|
|
49
|
+
export const THRESHOLDS = {
|
|
50
|
+
lcp: { good: 2500, poor: 4000 },
|
|
51
|
+
cls: { good: 0.1, poor: 0.25 },
|
|
52
|
+
fcp: { good: 1800, poor: 3000 },
|
|
53
|
+
ttfb: { good: 800, poor: 1800 },
|
|
54
|
+
longTask: { good: 50, poor: 200 },
|
|
55
|
+
tbt: { good: 200, poor: 600 },
|
|
56
|
+
};
|
|
57
|
+
/** Rate a measurement against its thresholds. */
|
|
58
|
+
export function rate(value, bounds) {
|
|
59
|
+
if (value <= bounds.good)
|
|
60
|
+
return "good";
|
|
61
|
+
return value <= bounds.poor ? "needs-improvement" : "poor";
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Cumulative layout shift, as the metric is actually defined.
|
|
65
|
+
*
|
|
66
|
+
* Shifts are grouped into windows: a gap of a second starts a
|
|
67
|
+
* new one, and no window runs past five seconds. The score is
|
|
68
|
+
* the largest window, not the total. Summing everything would
|
|
69
|
+
* report a page that nudges once a minute as worse than one
|
|
70
|
+
* that jumps once on load, which is backwards.
|
|
71
|
+
*/
|
|
72
|
+
export function cumulativeShift(shifts) {
|
|
73
|
+
let worst = 0;
|
|
74
|
+
let windowTotal = 0;
|
|
75
|
+
let windowStart = 0;
|
|
76
|
+
let previous = 0;
|
|
77
|
+
for (const shift of shifts) {
|
|
78
|
+
const startsNew = windowTotal > 0 &&
|
|
79
|
+
(shift.time - previous > SESSION_GAP_MS ||
|
|
80
|
+
shift.time - windowStart > SESSION_CAP_MS);
|
|
81
|
+
if (startsNew) {
|
|
82
|
+
worst = Math.max(worst, windowTotal);
|
|
83
|
+
windowTotal = 0;
|
|
84
|
+
windowStart = shift.time;
|
|
85
|
+
}
|
|
86
|
+
if (windowTotal === 0)
|
|
87
|
+
windowStart = shift.time;
|
|
88
|
+
windowTotal += shift.value;
|
|
89
|
+
previous = shift.time;
|
|
90
|
+
}
|
|
91
|
+
return Math.max(worst, windowTotal);
|
|
92
|
+
}
|
|
93
|
+
/** What most moved the page, and how much. */
|
|
94
|
+
export function worstShiftSources(shifts, limit = 5) {
|
|
95
|
+
const blame = new Map();
|
|
96
|
+
for (const shift of shifts) {
|
|
97
|
+
// A shift with several sources shares its score among them,
|
|
98
|
+
// because there is no way to tell which one moved the page.
|
|
99
|
+
const share = shift.sources.length > 0 ? shift.value / shift.sources.length : 0;
|
|
100
|
+
for (const source of shift.sources) {
|
|
101
|
+
const node = source.node ?? "(unnamed)";
|
|
102
|
+
blame.set(node, (blame.get(node) ?? 0) + share);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
return [...blame.entries()]
|
|
106
|
+
.map(([node, moved]) => ({ node, moved }))
|
|
107
|
+
.sort((a, b) => b.moved - a.moved)
|
|
108
|
+
.slice(0, limit);
|
|
109
|
+
}
|
|
110
|
+
/** Read the vitals into rated measures. */
|
|
111
|
+
export function measure(vitals) {
|
|
112
|
+
const measures = [];
|
|
113
|
+
const ttfb = vitals.nav?.responseStart;
|
|
114
|
+
if (ttfb !== undefined) {
|
|
115
|
+
measures.push({
|
|
116
|
+
name: "time to first byte",
|
|
117
|
+
value: ttfb,
|
|
118
|
+
unit: "ms",
|
|
119
|
+
rating: rate(ttfb, THRESHOLDS.ttfb),
|
|
120
|
+
});
|
|
121
|
+
}
|
|
122
|
+
const fcp = vitals.paints["first-contentful-paint"];
|
|
123
|
+
if (fcp !== undefined) {
|
|
124
|
+
measures.push({
|
|
125
|
+
name: "first contentful paint",
|
|
126
|
+
value: fcp,
|
|
127
|
+
unit: "ms",
|
|
128
|
+
rating: rate(fcp, THRESHOLDS.fcp),
|
|
129
|
+
});
|
|
130
|
+
}
|
|
131
|
+
if (vitals.lcp) {
|
|
132
|
+
measures.push({
|
|
133
|
+
name: "largest contentful paint",
|
|
134
|
+
value: vitals.lcp.time,
|
|
135
|
+
unit: "ms",
|
|
136
|
+
rating: rate(vitals.lcp.time, THRESHOLDS.lcp),
|
|
137
|
+
...(vitals.lcp.element === null ? {} : { detail: vitals.lcp.element }),
|
|
138
|
+
});
|
|
139
|
+
}
|
|
140
|
+
const cls = cumulativeShift(vitals.shifts);
|
|
141
|
+
if (watching(vitals, "layout-shift")) {
|
|
142
|
+
measures.push({
|
|
143
|
+
name: "cumulative layout shift",
|
|
144
|
+
value: Math.round(cls * 1000) / 1000,
|
|
145
|
+
unit: "score",
|
|
146
|
+
rating: rate(cls, THRESHOLDS.cls),
|
|
147
|
+
...(vitals.shifts.length === 0
|
|
148
|
+
? {}
|
|
149
|
+
: {
|
|
150
|
+
detail: count(vitals.shifts.length, "shift"),
|
|
151
|
+
}),
|
|
152
|
+
});
|
|
153
|
+
}
|
|
154
|
+
const blocking = vitals.longTasks.reduce((sum, task) => sum + Math.max(0, task.duration - THRESHOLDS.longTask.good), 0);
|
|
155
|
+
// Watched for, not found, is the same rule layout shift follows
|
|
156
|
+
// and the exact mirror of the bug that rule was written for. A
|
|
157
|
+
// page that blocked nobody is good news; reporting nothing at
|
|
158
|
+
// all made it indistinguishable from a page nobody watched, and
|
|
159
|
+
// two reads of one page could answer four measures and PASS or
|
|
160
|
+
// five and FAIL with no way to tell which had happened.
|
|
161
|
+
if (watching(vitals, "longtask")) {
|
|
162
|
+
measures.push({
|
|
163
|
+
name: "total blocking time",
|
|
164
|
+
value: Math.round(blocking),
|
|
165
|
+
unit: "ms",
|
|
166
|
+
rating: rate(blocking, THRESHOLDS.tbt),
|
|
167
|
+
...(vitals.longTasks.length === 0
|
|
168
|
+
? {}
|
|
169
|
+
: {
|
|
170
|
+
detail: count(vitals.longTasks.length, "long task"),
|
|
171
|
+
}),
|
|
172
|
+
});
|
|
173
|
+
}
|
|
174
|
+
return measures;
|
|
175
|
+
}
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Page reader: fetches a URL with headless Chrome and captures it as a
|
|
3
|
+
* bundle of representations the model can pick and choose from.
|
|
4
|
+
*
|
|
5
|
+
* Every read settles the page once (capture-width viewport, dynamic-content
|
|
6
|
+
* wait, lazy-content scroll) and then snapshots article markdown (via
|
|
7
|
+
* defuddle), the rendered inner text, the DOM and a bounded stack of
|
|
8
|
+
* screenshot tiles from that one state. Artifacts are written to a private,
|
|
9
|
+
* per-session directory keyed by process id, so a crashed session's
|
|
10
|
+
* captures can be reaped without touching a live one. The caller turns the
|
|
11
|
+
* returned paths into a pointer manifest so the model opens only what it
|
|
12
|
+
* needs.
|
|
13
|
+
*/
|
|
14
|
+
import type { Page } from "puppeteer-core";
|
|
15
|
+
import { type BundleSink } from "./envelope/sink.js";
|
|
16
|
+
import { type TiledCapture } from "./screenshot.js";
|
|
17
|
+
/**
|
|
18
|
+
* Thrown when a page redirects to an auth provider and Chrome
|
|
19
|
+
* cookie injection hasn't been set up yet.
|
|
20
|
+
*/
|
|
21
|
+
export declare class AuthSetupNeeded extends Error {
|
|
22
|
+
constructor();
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* A page captured as a bundle of representations on disk. Each path points
|
|
26
|
+
* at one representation in `dir`; the model opens whichever it needs. The
|
|
27
|
+
* DOM is always captured, so `domPath` is required; the article is present
|
|
28
|
+
* only when extraction found one.
|
|
29
|
+
*/
|
|
30
|
+
export interface PageBundle {
|
|
31
|
+
title: string;
|
|
32
|
+
/** The final URL after any redirects, which is what was actually read. */
|
|
33
|
+
url: string;
|
|
34
|
+
/** A short inline snippet so the model can judge relevance without opening a file. */
|
|
35
|
+
excerpt: string;
|
|
36
|
+
/** The bundle directory holding every artifact. */
|
|
37
|
+
dir: string;
|
|
38
|
+
/** Path to the cleaned article markdown, when extraction found an article. */
|
|
39
|
+
articlePath?: string;
|
|
40
|
+
/** Path to the rendered inner text, when the page had any. */
|
|
41
|
+
innerTextPath?: string;
|
|
42
|
+
/** Path to the rendered DOM (HTML). Always written. */
|
|
43
|
+
domPath: string;
|
|
44
|
+
/** Paths to the screenshot tiles, top to bottom. */
|
|
45
|
+
screenshotPaths: string[];
|
|
46
|
+
/** True when the page ran past the screenshot tile budget and was cut short. */
|
|
47
|
+
truncated: boolean;
|
|
48
|
+
}
|
|
49
|
+
/** Extracted article from defuddle: markdown content, title and word count. */
|
|
50
|
+
export interface Article {
|
|
51
|
+
markdown: string;
|
|
52
|
+
title: string;
|
|
53
|
+
wordCount: number;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* The raw representations captured from a settled page, before they are
|
|
57
|
+
* written to disk. Keeps capture (browser I/O) separate from assembly
|
|
58
|
+
* (pure file layout) so each is testable on its own.
|
|
59
|
+
*/
|
|
60
|
+
export interface Captured {
|
|
61
|
+
/** The final URL after redirects. */
|
|
62
|
+
url: string;
|
|
63
|
+
title: string;
|
|
64
|
+
html: string;
|
|
65
|
+
innerText: string;
|
|
66
|
+
article: Article | null;
|
|
67
|
+
/** Base64 PNG tiles, top to bottom. */
|
|
68
|
+
tiles: string[];
|
|
69
|
+
truncated: boolean;
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* The disk side of bundle assembly, injected so assembly can be tested
|
|
73
|
+
* without touching the filesystem. Defined in the envelope, since
|
|
74
|
+
* everything that outgrows a response needs somewhere to go, and
|
|
75
|
+
* re-exported here for the readers that have always imported it from
|
|
76
|
+
* this module.
|
|
77
|
+
*/
|
|
78
|
+
export type { BundleSink } from "./envelope/sink.js";
|
|
79
|
+
/** Collaborators of `capturePage`, injected so the orchestration is testable. */
|
|
80
|
+
export interface CaptureDeps {
|
|
81
|
+
preparePage(page: Page): Promise<void>;
|
|
82
|
+
captureTiles(page: Page): Promise<TiledCapture>;
|
|
83
|
+
extractArticle(html: string, url: string): Promise<Article | null>;
|
|
84
|
+
}
|
|
85
|
+
/** True when a final URL indicates a redirect to an auth provider. */
|
|
86
|
+
export declare function isAuthRedirect(url: string): boolean;
|
|
87
|
+
/**
|
|
88
|
+
* Assemble a bundle from captured representations by writing each one
|
|
89
|
+
* through the sink. The DOM is always written; the article and inner text
|
|
90
|
+
* are written only when present; every screenshot tile gets an ordered,
|
|
91
|
+
* zero-padded name. Text is capped with a visible marker, and the
|
|
92
|
+
* page-controlled title and excerpt are flattened to a single line so they
|
|
93
|
+
* cannot impersonate the manifest's own structure.
|
|
94
|
+
*/
|
|
95
|
+
export declare function assembleBundle(captured: Captured, sink: BundleSink): PageBundle;
|
|
96
|
+
export { diskSink } from "./envelope/sink.js";
|
|
97
|
+
/**
|
|
98
|
+
* Reap bundle directories that no live session owns. The current root is
|
|
99
|
+
* keyed by process id, so a pid-named directory is abandoned exactly when
|
|
100
|
+
* its pid is no longer alive; any stray entry there, and the whole legacy
|
|
101
|
+
* root, are swept by age instead. The collaborators are parameters so the
|
|
102
|
+
* destructive sweep is testable against a throwaway root.
|
|
103
|
+
*/
|
|
104
|
+
export declare function reapBundles(opts: {
|
|
105
|
+
root: string;
|
|
106
|
+
legacyRoots: readonly string[];
|
|
107
|
+
isPidAlive: (pid: number) => boolean;
|
|
108
|
+
now: number;
|
|
109
|
+
legacyMaxAgeMs: number;
|
|
110
|
+
}): void;
|
|
111
|
+
/**
|
|
112
|
+
* Reap bundle directories left behind by sessions that are no longer
|
|
113
|
+
* running. Safe to call at session start; it never touches a live
|
|
114
|
+
* session's directory.
|
|
115
|
+
*/
|
|
116
|
+
export declare function reapAbandonedBundles(): void;
|
|
117
|
+
/** Remove this session's bundle directory. Call at session shutdown. */
|
|
118
|
+
export declare function cleanupSessionBundles(): void;
|
|
119
|
+
/**
|
|
120
|
+
* Navigate a prepared page and capture every representation from one
|
|
121
|
+
* settled state: DOM, inner text, article and screenshot tiles. Relative
|
|
122
|
+
* links resolve against the final redirected URL, and a missing document
|
|
123
|
+
* body falls back to the document text so non-HTML pages still yield a
|
|
124
|
+
* capture. Cancellation is honoured between the expensive steps.
|
|
125
|
+
*/
|
|
126
|
+
export declare function capturePage(page: Page, url: string, signal?: AbortSignal, deps?: CaptureDeps): Promise<Captured>;
|
|
127
|
+
/**
|
|
128
|
+
* Fetch a URL and capture it as a bundle of representations on disk:
|
|
129
|
+
* article markdown, rendered inner text, DOM and screenshot tiles.
|
|
130
|
+
*/
|
|
131
|
+
export declare function readPage(url: string, signal?: AbortSignal): Promise<PageBundle>;
|
|
@@ -0,0 +1,340 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Page reader: fetches a URL with headless Chrome and captures it as a
|
|
3
|
+
* bundle of representations the model can pick and choose from.
|
|
4
|
+
*
|
|
5
|
+
* Every read settles the page once (capture-width viewport, dynamic-content
|
|
6
|
+
* wait, lazy-content scroll) and then snapshots article markdown (via
|
|
7
|
+
* defuddle), the rendered inner text, the DOM and a bounded stack of
|
|
8
|
+
* screenshot tiles from that one state. Artifacts are written to a private,
|
|
9
|
+
* per-session directory keyed by process id, so a crashed session's
|
|
10
|
+
* captures can be reaped without touching a live one. The caller turns the
|
|
11
|
+
* returned paths into a pointer manifest so the model opens only what it
|
|
12
|
+
* needs.
|
|
13
|
+
*/
|
|
14
|
+
import * as fs from "node:fs";
|
|
15
|
+
import * as path from "node:path";
|
|
16
|
+
import { Defuddle } from "defuddle/node";
|
|
17
|
+
import { JSDOM, VirtualConsole } from "jsdom";
|
|
18
|
+
import { isPidAlive, newPage } from "./browser.js";
|
|
19
|
+
import { injectCookies, isSetUp } from "./cookies/index.js";
|
|
20
|
+
import { BUNDLE_ROOT, diskSink, LEGACY_BUNDLE_ROOTS, sessionDir, } from "./envelope/sink.js";
|
|
21
|
+
import { captureTiles, preparePage } from "./screenshot.js";
|
|
22
|
+
/**
|
|
23
|
+
* Thrown when a page redirects to an auth provider and Chrome
|
|
24
|
+
* cookie injection hasn't been set up yet.
|
|
25
|
+
*/
|
|
26
|
+
export class AuthSetupNeeded extends Error {
|
|
27
|
+
constructor() {
|
|
28
|
+
super("This page requires authentication. Ask the user to run " +
|
|
29
|
+
"Chrome cookie setup to enable access using their Chrome " +
|
|
30
|
+
"browser sessions, then retry.");
|
|
31
|
+
this.name = "AuthSetupNeeded";
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
/** Timeout for page navigation in milliseconds. */
|
|
35
|
+
const PAGE_LOAD_TIMEOUT = 20_000;
|
|
36
|
+
/** Wait time for dynamic content to render after load. */
|
|
37
|
+
const DYNAMIC_CONTENT_WAIT = 1_500;
|
|
38
|
+
/** Characters of the best available text used for the inline excerpt. */
|
|
39
|
+
const EXCERPT_LENGTH = 500;
|
|
40
|
+
/** Below this word count we treat defuddle's article as empty and skip it. */
|
|
41
|
+
const MIN_ARTICLE_WORDS = 30;
|
|
42
|
+
/** Upper bound on the page-controlled title we carry inline. */
|
|
43
|
+
const MAX_TITLE_LENGTH = 300;
|
|
44
|
+
/**
|
|
45
|
+
* Upper bound on any single text artifact written to disk. Generous enough
|
|
46
|
+
* that real pages are never touched, but it caps a pathological page so it
|
|
47
|
+
* cannot fill the disk. When it bites, the file says so in-band rather than
|
|
48
|
+
* ending silently.
|
|
49
|
+
*/
|
|
50
|
+
const MAX_ARTIFACT_CHARS = 5_000_000;
|
|
51
|
+
/** Age past which a legacy bundle directory is reaped. */
|
|
52
|
+
const LEGACY_MAX_AGE_MS = 6 * 60 * 60 * 1_000;
|
|
53
|
+
/** URL fragments that mark a redirect to an auth provider. */
|
|
54
|
+
const AUTH_URL_MARKERS = [
|
|
55
|
+
"accounts.google.com",
|
|
56
|
+
"/oauth",
|
|
57
|
+
"/login",
|
|
58
|
+
"/signin",
|
|
59
|
+
"/auth",
|
|
60
|
+
];
|
|
61
|
+
/**
|
|
62
|
+
* Lines matching these patterns are stripped from the rendered inner
|
|
63
|
+
* text after extraction.
|
|
64
|
+
*/
|
|
65
|
+
const BOILERPLATE_PATTERNS = [
|
|
66
|
+
/^advertisement$/i,
|
|
67
|
+
/^ad$/i,
|
|
68
|
+
/^sponsored$/i,
|
|
69
|
+
/^continue reading/i,
|
|
70
|
+
/^read more$/i,
|
|
71
|
+
/^see also:?$/i,
|
|
72
|
+
/^related:?$/i,
|
|
73
|
+
/^share this/i,
|
|
74
|
+
/^follow us/i,
|
|
75
|
+
/^sign up for/i,
|
|
76
|
+
/^subscribe to/i,
|
|
77
|
+
/^newsletter/i,
|
|
78
|
+
/^click here/i,
|
|
79
|
+
];
|
|
80
|
+
/** True when a final URL indicates a redirect to an auth provider. */
|
|
81
|
+
export function isAuthRedirect(url) {
|
|
82
|
+
return AUTH_URL_MARKERS.some((marker) => url.includes(marker));
|
|
83
|
+
}
|
|
84
|
+
/** Collapse a page-controlled string to a single trimmed line. */
|
|
85
|
+
function oneLine(text) {
|
|
86
|
+
return text.replace(/\s+/g, " ").trim();
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Cap a text artifact at the size bound, appending a visible marker when it
|
|
90
|
+
* bites so a reader never mistakes a cut-off file for a complete one.
|
|
91
|
+
*/
|
|
92
|
+
function capArtifact(content) {
|
|
93
|
+
if (content.length <= MAX_ARTIFACT_CHARS)
|
|
94
|
+
return content;
|
|
95
|
+
return `${content.slice(0, MAX_ARTIFACT_CHARS)}\n\n[truncated at ${MAX_ARTIFACT_CHARS} characters]`;
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Assemble a bundle from captured representations by writing each one
|
|
99
|
+
* through the sink. The DOM is always written; the article and inner text
|
|
100
|
+
* are written only when present; every screenshot tile gets an ordered,
|
|
101
|
+
* zero-padded name. Text is capped with a visible marker, and the
|
|
102
|
+
* page-controlled title and excerpt are flattened to a single line so they
|
|
103
|
+
* cannot impersonate the manifest's own structure.
|
|
104
|
+
*/
|
|
105
|
+
export function assembleBundle(captured, sink) {
|
|
106
|
+
const title = oneLine(captured.title).slice(0, MAX_TITLE_LENGTH);
|
|
107
|
+
const body = captured.article?.markdown || captured.innerText;
|
|
108
|
+
const excerpt = oneLine(body).slice(0, EXCERPT_LENGTH);
|
|
109
|
+
const articlePath = captured.article
|
|
110
|
+
? sink.writeText("article.md", capArtifact(`# ${title}\n\nSource: ${captured.url}\n\n${captured.article.markdown}`))
|
|
111
|
+
: undefined;
|
|
112
|
+
const innerTextPath = captured.innerText
|
|
113
|
+
? sink.writeText("innertext.txt", capArtifact(captured.innerText))
|
|
114
|
+
: undefined;
|
|
115
|
+
const domPath = sink.writeText("dom.html", capArtifact(captured.html));
|
|
116
|
+
const screenshotPaths = captured.tiles.map((data, i) => sink.writeBinary(`shot-${String(i + 1).padStart(2, "0")}.png`, data));
|
|
117
|
+
return {
|
|
118
|
+
title,
|
|
119
|
+
url: captured.url,
|
|
120
|
+
excerpt,
|
|
121
|
+
dir: sink.dir,
|
|
122
|
+
articlePath,
|
|
123
|
+
innerTextPath,
|
|
124
|
+
domPath,
|
|
125
|
+
screenshotPaths,
|
|
126
|
+
truncated: captured.truncated,
|
|
127
|
+
};
|
|
128
|
+
}
|
|
129
|
+
/** Clean extracted text: collapse whitespace, strip boilerplate lines. */
|
|
130
|
+
function cleanText(text) {
|
|
131
|
+
return text
|
|
132
|
+
.split("\n")
|
|
133
|
+
.map((line) => line.trimEnd())
|
|
134
|
+
.filter((line) => {
|
|
135
|
+
const trimmed = line.trim();
|
|
136
|
+
if (!trimmed)
|
|
137
|
+
return true;
|
|
138
|
+
return !BOILERPLATE_PATTERNS.some((p) => p.test(trimmed));
|
|
139
|
+
})
|
|
140
|
+
.join("\n")
|
|
141
|
+
.replace(/\n{3,}/g, "\n\n")
|
|
142
|
+
.trim();
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* Create a jsdom VirtualConsole that suppresses CSS parse warnings
|
|
146
|
+
* without affecting process.stderr globally.
|
|
147
|
+
*/
|
|
148
|
+
function quietVirtualConsole() {
|
|
149
|
+
const vc = new VirtualConsole();
|
|
150
|
+
vc.on("error", (msg) => {
|
|
151
|
+
if (!msg.includes("Could not parse CSS stylesheet")) {
|
|
152
|
+
console.error(msg);
|
|
153
|
+
}
|
|
154
|
+
});
|
|
155
|
+
vc.on("warn", console.warn);
|
|
156
|
+
vc.on("info", console.info);
|
|
157
|
+
return vc;
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* Run defuddle over the page HTML to extract the main content as markdown,
|
|
161
|
+
* resolving relative links against the final URL. Returns null when
|
|
162
|
+
* defuddle throws or finds too little to be a real article.
|
|
163
|
+
*/
|
|
164
|
+
async function extractArticle(html, url) {
|
|
165
|
+
try {
|
|
166
|
+
const dom = new JSDOM(html, { url, virtualConsole: quietVirtualConsole() });
|
|
167
|
+
const result = await Defuddle(dom.window.document, url, {
|
|
168
|
+
markdown: true,
|
|
169
|
+
useAsync: false,
|
|
170
|
+
});
|
|
171
|
+
if (!result || result.wordCount < MIN_ARTICLE_WORDS)
|
|
172
|
+
return null;
|
|
173
|
+
return {
|
|
174
|
+
markdown: result.contentMarkdown ?? result.content ?? "",
|
|
175
|
+
title: result.title ?? "",
|
|
176
|
+
wordCount: result.wordCount,
|
|
177
|
+
};
|
|
178
|
+
}
|
|
179
|
+
catch {
|
|
180
|
+
// Defuddle or JSDOM threw (e.g., CSS parse errors on a hostile
|
|
181
|
+
// page). Article extraction is optional; the bundle still has the
|
|
182
|
+
// inner text, DOM and screenshots, so we report no article.
|
|
183
|
+
return null;
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
export { diskSink } from "./envelope/sink.js";
|
|
187
|
+
/** True when a directory's mtime is older than the given age. */
|
|
188
|
+
function olderThan(dir, now, maxAgeMs) {
|
|
189
|
+
try {
|
|
190
|
+
return now - fs.statSync(dir).mtimeMs > maxAgeMs;
|
|
191
|
+
}
|
|
192
|
+
catch {
|
|
193
|
+
// The directory vanished under us; treat it as not stale.
|
|
194
|
+
return false;
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
/** Remove immediate subdirectories of `root` for which `stale` returns true. */
|
|
198
|
+
function reapDir(root, stale) {
|
|
199
|
+
let entries;
|
|
200
|
+
try {
|
|
201
|
+
entries = fs.readdirSync(root, { withFileTypes: true });
|
|
202
|
+
}
|
|
203
|
+
catch {
|
|
204
|
+
// The root does not exist, so there is nothing to reap.
|
|
205
|
+
return;
|
|
206
|
+
}
|
|
207
|
+
for (const entry of entries) {
|
|
208
|
+
if (!entry.isDirectory())
|
|
209
|
+
continue;
|
|
210
|
+
const dir = path.join(root, entry.name);
|
|
211
|
+
try {
|
|
212
|
+
if (stale(dir, entry.name))
|
|
213
|
+
fs.rmSync(dir, { recursive: true, force: true });
|
|
214
|
+
}
|
|
215
|
+
catch {
|
|
216
|
+
// The directory vanished under us or is unreadable; skip it.
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
/**
|
|
221
|
+
* Reap bundle directories that no live session owns. The current root is
|
|
222
|
+
* keyed by process id, so a pid-named directory is abandoned exactly when
|
|
223
|
+
* its pid is no longer alive; any stray entry there, and the whole legacy
|
|
224
|
+
* root, are swept by age instead. The collaborators are parameters so the
|
|
225
|
+
* destructive sweep is testable against a throwaway root.
|
|
226
|
+
*/
|
|
227
|
+
export function reapBundles(opts) {
|
|
228
|
+
reapDir(opts.root, (dir, name) => {
|
|
229
|
+
const pid = Number(name);
|
|
230
|
+
// A pid-named dir is abandoned when its process is gone; any other
|
|
231
|
+
// entry (e.g. from an older layout) has no owner, so fall back to age.
|
|
232
|
+
return Number.isInteger(pid)
|
|
233
|
+
? !opts.isPidAlive(pid)
|
|
234
|
+
: olderThan(dir, opts.now, opts.legacyMaxAgeMs);
|
|
235
|
+
});
|
|
236
|
+
for (const legacy of opts.legacyRoots) {
|
|
237
|
+
// By age rather than by pid, even where the old layout named its
|
|
238
|
+
// directories after one: nothing writes here any more, so an
|
|
239
|
+
// entry whose pid happens to be alive again belongs to an
|
|
240
|
+
// unrelated process that reused the number.
|
|
241
|
+
reapDir(legacy, (dir) => olderThan(dir, opts.now, opts.legacyMaxAgeMs));
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
/**
|
|
245
|
+
* Reap bundle directories left behind by sessions that are no longer
|
|
246
|
+
* running. Safe to call at session start; it never touches a live
|
|
247
|
+
* session's directory.
|
|
248
|
+
*/
|
|
249
|
+
export function reapAbandonedBundles() {
|
|
250
|
+
reapBundles({
|
|
251
|
+
root: BUNDLE_ROOT,
|
|
252
|
+
legacyRoots: LEGACY_BUNDLE_ROOTS,
|
|
253
|
+
isPidAlive,
|
|
254
|
+
now: Date.now(),
|
|
255
|
+
legacyMaxAgeMs: LEGACY_MAX_AGE_MS,
|
|
256
|
+
});
|
|
257
|
+
}
|
|
258
|
+
/** Remove this session's bundle directory. Call at session shutdown. */
|
|
259
|
+
export function cleanupSessionBundles() {
|
|
260
|
+
try {
|
|
261
|
+
fs.rmSync(sessionDir(), { recursive: true, force: true });
|
|
262
|
+
}
|
|
263
|
+
catch {
|
|
264
|
+
// Best-effort cleanup; the reaper reclaims it later if this fails.
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
/** Throw if the operation has been cancelled. */
|
|
268
|
+
function throwIfAborted(signal) {
|
|
269
|
+
if (signal?.aborted)
|
|
270
|
+
throw new Error("Aborted");
|
|
271
|
+
}
|
|
272
|
+
const defaultCaptureDeps = {
|
|
273
|
+
preparePage,
|
|
274
|
+
captureTiles,
|
|
275
|
+
extractArticle,
|
|
276
|
+
};
|
|
277
|
+
/**
|
|
278
|
+
* Navigate a prepared page and capture every representation from one
|
|
279
|
+
* settled state: DOM, inner text, article and screenshot tiles. Relative
|
|
280
|
+
* links resolve against the final redirected URL, and a missing document
|
|
281
|
+
* body falls back to the document text so non-HTML pages still yield a
|
|
282
|
+
* capture. Cancellation is honoured between the expensive steps.
|
|
283
|
+
*/
|
|
284
|
+
export async function capturePage(page, url, signal, deps = defaultCaptureDeps) {
|
|
285
|
+
await page.goto(url, {
|
|
286
|
+
waitUntil: "domcontentloaded",
|
|
287
|
+
timeout: PAGE_LOAD_TIMEOUT,
|
|
288
|
+
});
|
|
289
|
+
throwIfAborted(signal);
|
|
290
|
+
await page.evaluate((ms) => new Promise((r) => setTimeout(r, ms)), DYNAMIC_CONTENT_WAIT);
|
|
291
|
+
const finalUrl = page.url();
|
|
292
|
+
if (isAuthRedirect(finalUrl) && !isSetUp()) {
|
|
293
|
+
throw new AuthSetupNeeded();
|
|
294
|
+
}
|
|
295
|
+
throwIfAborted(signal);
|
|
296
|
+
// Settle the page once so text, DOM and screenshots agree on one state.
|
|
297
|
+
await deps.preparePage(page);
|
|
298
|
+
const html = await page.content();
|
|
299
|
+
const rendered = cleanText(await page.evaluate(() => document.body?.innerText ?? document.documentElement?.textContent ?? ""));
|
|
300
|
+
const article = await deps.extractArticle(html, finalUrl);
|
|
301
|
+
const title = article?.title || (await page.title());
|
|
302
|
+
throwIfAborted(signal);
|
|
303
|
+
// Screenshots are always captured so a text-only bundle still carries a
|
|
304
|
+
// visual representation the model can fall back to.
|
|
305
|
+
const { tiles, truncated } = await deps.captureTiles(page);
|
|
306
|
+
throwIfAborted(signal);
|
|
307
|
+
return {
|
|
308
|
+
url: finalUrl,
|
|
309
|
+
title,
|
|
310
|
+
html,
|
|
311
|
+
innerText: rendered,
|
|
312
|
+
article,
|
|
313
|
+
tiles,
|
|
314
|
+
truncated,
|
|
315
|
+
};
|
|
316
|
+
}
|
|
317
|
+
/**
|
|
318
|
+
* Fetch a URL and capture it as a bundle of representations on disk:
|
|
319
|
+
* article markdown, rendered inner text, DOM and screenshot tiles.
|
|
320
|
+
*/
|
|
321
|
+
export async function readPage(url, signal) {
|
|
322
|
+
const page = await newPage();
|
|
323
|
+
try {
|
|
324
|
+
throwIfAborted(signal);
|
|
325
|
+
await injectCookies(page, url);
|
|
326
|
+
const captured = await capturePage(page, url, signal);
|
|
327
|
+
const sink = diskSink();
|
|
328
|
+
try {
|
|
329
|
+
return assembleBundle(captured, sink);
|
|
330
|
+
}
|
|
331
|
+
catch (err) {
|
|
332
|
+
// Don't leave a half-written bundle behind on a failed assembly.
|
|
333
|
+
fs.rmSync(sink.dir, { recursive: true, force: true });
|
|
334
|
+
throw err;
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
finally {
|
|
338
|
+
await page.close();
|
|
339
|
+
}
|
|
340
|
+
}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Bounded, tiled screenshot capture.
|
|
3
|
+
*
|
|
4
|
+
* `preparePage` settles the page (capture-width viewport, lazy-content
|
|
5
|
+
* scroll) so every representation is read from one state. `captureTiles`
|
|
6
|
+
* then captures the page as an ordered stack of vertical bands rather than
|
|
7
|
+
* one full-page image. Each band stays under the model provider's image
|
|
8
|
+
* dimension limit, so a long page can never produce an image the model
|
|
9
|
+
* rejects. A page taller than the tile budget is truncated and the caller
|
|
10
|
+
* is told.
|
|
11
|
+
*/
|
|
12
|
+
import type { Page } from "puppeteer-core";
|
|
13
|
+
/** A vertical slice of the page to capture, in page pixels. */
|
|
14
|
+
export interface TileBand {
|
|
15
|
+
y: number;
|
|
16
|
+
height: number;
|
|
17
|
+
}
|
|
18
|
+
/** An ordered set of clip bands covering a page, with a truncation flag. */
|
|
19
|
+
export interface TilePlan {
|
|
20
|
+
bands: TileBand[];
|
|
21
|
+
truncated: boolean;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Plan the vertical clip bands that tile a page of the given height. No
|
|
25
|
+
* band exceeds `bandHeight`, and the plan stops at `maxTiles`, reporting
|
|
26
|
+
* `truncated` when the page runs past the tile budget.
|
|
27
|
+
*/
|
|
28
|
+
export declare function planTiles(pageHeight: number, opts: {
|
|
29
|
+
bandHeight: number;
|
|
30
|
+
maxTiles: number;
|
|
31
|
+
}): TilePlan;
|
|
32
|
+
/** A tiled capture: ordered base64 PNGs plus whether the page overran the budget. */
|
|
33
|
+
export interface TiledCapture {
|
|
34
|
+
tiles: string[];
|
|
35
|
+
truncated: boolean;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Settle the page into the state every representation is captured from:
|
|
39
|
+
* fix the viewport to the capture width, then scroll to the bottom so
|
|
40
|
+
* lazy-loaded content renders, returning to the top. Call this once before
|
|
41
|
+
* reading the DOM, inner text or screenshots so they all agree.
|
|
42
|
+
*/
|
|
43
|
+
export declare function preparePage(page: Page): Promise<void>;
|
|
44
|
+
/**
|
|
45
|
+
* Capture the page as an ordered stack of PNG tiles, each a base64 string,
|
|
46
|
+
* by clipping successive vertical bands planned by `planTiles`. No tile
|
|
47
|
+
* exceeds the band height, and the capture stops at the tile ceiling.
|
|
48
|
+
* Assumes `preparePage` has already settled the viewport and lazy content.
|
|
49
|
+
*/
|
|
50
|
+
export declare function captureTiles(page: Page): Promise<TiledCapture>;
|