@cairn-tool/cairn 2.0.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/.markdownlintrc +7 -0
- package/LICENSE +21 -0
- package/README.md +1431 -0
- package/dist/agent/audit/baseline.d.ts +69 -0
- package/dist/agent/audit/baseline.js +128 -0
- package/dist/agent/audit/baseline.js.map +1 -0
- package/dist/agent/audit/index.d.ts +126 -0
- package/dist/agent/audit/index.js +625 -0
- package/dist/agent/audit/index.js.map +1 -0
- package/dist/agent/import/detect.d.ts +49 -0
- package/dist/agent/import/detect.js +159 -0
- package/dist/agent/import/detect.js.map +1 -0
- package/dist/agent/import/normalize.d.ts +72 -0
- package/dist/agent/import/normalize.js +475 -0
- package/dist/agent/import/normalize.js.map +1 -0
- package/dist/agent/install/index.d.ts +211 -0
- package/dist/agent/install/index.js +907 -0
- package/dist/agent/install/index.js.map +1 -0
- package/dist/agent/manifest.d.ts +75 -0
- package/dist/agent/manifest.js +210 -0
- package/dist/agent/manifest.js.map +1 -0
- package/dist/agent/marketplace/index.d.ts +69 -0
- package/dist/agent/marketplace/index.js +212 -0
- package/dist/agent/marketplace/index.js.map +1 -0
- package/dist/agent/marketplace/spec.d.ts +48 -0
- package/dist/agent/marketplace/spec.js +237 -0
- package/dist/agent/marketplace/spec.js.map +1 -0
- package/dist/agent/output.d.ts +36 -0
- package/dist/agent/output.js +56 -0
- package/dist/agent/output.js.map +1 -0
- package/dist/agent/overlays.d.ts +38 -0
- package/dist/agent/overlays.js +223 -0
- package/dist/agent/overlays.js.map +1 -0
- package/dist/agent/package/index.d.ts +105 -0
- package/dist/agent/package/index.js +339 -0
- package/dist/agent/package/index.js.map +1 -0
- package/dist/agent/package/tar.d.ts +36 -0
- package/dist/agent/package/tar.js +137 -0
- package/dist/agent/package/tar.js.map +1 -0
- package/dist/agent/parser.d.ts +13 -0
- package/dist/agent/parser.js +559 -0
- package/dist/agent/parser.js.map +1 -0
- package/dist/agent/render.d.ts +16 -0
- package/dist/agent/render.js +721 -0
- package/dist/agent/render.js.map +1 -0
- package/dist/agent/sarif.d.ts +18 -0
- package/dist/agent/sarif.js +56 -0
- package/dist/agent/sarif.js.map +1 -0
- package/dist/agent/scaffold.d.ts +86 -0
- package/dist/agent/scaffold.js +250 -0
- package/dist/agent/scaffold.js.map +1 -0
- package/dist/agent/targets/antigravity.d.ts +17 -0
- package/dist/agent/targets/antigravity.js +218 -0
- package/dist/agent/targets/antigravity.js.map +1 -0
- package/dist/agent/targets/claude-code.d.ts +2 -0
- package/dist/agent/targets/claude-code.js +220 -0
- package/dist/agent/targets/claude-code.js.map +1 -0
- package/dist/agent/targets/codex.d.ts +2 -0
- package/dist/agent/targets/codex.js +212 -0
- package/dist/agent/targets/codex.js.map +1 -0
- package/dist/agent/targets/cursor.d.ts +2 -0
- package/dist/agent/targets/cursor.js +210 -0
- package/dist/agent/targets/cursor.js.map +1 -0
- package/dist/agent/targets/index.d.ts +31 -0
- package/dist/agent/targets/index.js +64 -0
- package/dist/agent/targets/index.js.map +1 -0
- package/dist/agent/targets/opencode.d.ts +15 -0
- package/dist/agent/targets/opencode.js +215 -0
- package/dist/agent/targets/opencode.js.map +1 -0
- package/dist/agent/targets/schema.d.ts +315 -0
- package/dist/agent/targets/schema.js +179 -0
- package/dist/agent/targets/schema.js.map +1 -0
- package/dist/agent/test/assert.d.ts +46 -0
- package/dist/agent/test/assert.js +288 -0
- package/dist/agent/test/assert.js.map +1 -0
- package/dist/agent/test/index.d.ts +73 -0
- package/dist/agent/test/index.js +181 -0
- package/dist/agent/test/index.js.map +1 -0
- package/dist/agent/test/schema.d.ts +81 -0
- package/dist/agent/test/schema.js +235 -0
- package/dist/agent/test/schema.js.map +1 -0
- package/dist/agent/types.d.ts +204 -0
- package/dist/agent/types.js +11 -0
- package/dist/agent/types.js.map +1 -0
- package/dist/agent/upgrade.d.ts +29 -0
- package/dist/agent/upgrade.js +72 -0
- package/dist/agent/upgrade.js.map +1 -0
- package/dist/agent/writer.d.ts +30 -0
- package/dist/agent/writer.js +73 -0
- package/dist/agent/writer.js.map +1 -0
- package/dist/archive/db.d.ts +20 -0
- package/dist/archive/db.js +98 -0
- package/dist/archive/db.js.map +1 -0
- package/dist/archive/progress.d.ts +62 -0
- package/dist/archive/progress.js +151 -0
- package/dist/archive/progress.js.map +1 -0
- package/dist/archive/query.d.ts +86 -0
- package/dist/archive/query.js +241 -0
- package/dist/archive/query.js.map +1 -0
- package/dist/archive/run.d.ts +91 -0
- package/dist/archive/run.js +331 -0
- package/dist/archive/run.js.map +1 -0
- package/dist/archive/segments.d.ts +89 -0
- package/dist/archive/segments.js +144 -0
- package/dist/archive/segments.js.map +1 -0
- package/dist/archive/sets.d.ts +58 -0
- package/dist/archive/sets.js +344 -0
- package/dist/archive/sets.js.map +1 -0
- package/dist/archive/tar-read.d.ts +35 -0
- package/dist/archive/tar-read.js +90 -0
- package/dist/archive/tar-read.js.map +1 -0
- package/dist/audit-baseline.d.ts +66 -0
- package/dist/audit-baseline.js +124 -0
- package/dist/audit-baseline.js.map +1 -0
- package/dist/automation.d.ts +16 -0
- package/dist/automation.js +38 -0
- package/dist/automation.js.map +1 -0
- package/dist/backlinks.d.ts +15 -0
- package/dist/backlinks.js +30 -0
- package/dist/backlinks.js.map +1 -0
- package/dist/checkers/katex.d.ts +3 -0
- package/dist/checkers/katex.js +71 -0
- package/dist/checkers/katex.js.map +1 -0
- package/dist/checkers/markdown-lint.d.ts +28 -0
- package/dist/checkers/markdown-lint.js +53 -0
- package/dist/checkers/markdown-lint.js.map +1 -0
- package/dist/checkers/mermaid.d.ts +6 -0
- package/dist/checkers/mermaid.js +53 -0
- package/dist/checkers/mermaid.js.map +1 -0
- package/dist/checkers/references.d.ts +3 -0
- package/dist/checkers/references.js +55 -0
- package/dist/checkers/references.js.map +1 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +1117 -0
- package/dist/cli.js.map +1 -0
- package/dist/command-result.d.ts +6 -0
- package/dist/command-result.js +13 -0
- package/dist/command-result.js.map +1 -0
- package/dist/commands/agent-audit.d.ts +21 -0
- package/dist/commands/agent-audit.js +119 -0
- package/dist/commands/agent-audit.js.map +1 -0
- package/dist/commands/agent-doctor.d.ts +25 -0
- package/dist/commands/agent-doctor.js +217 -0
- package/dist/commands/agent-doctor.js.map +1 -0
- package/dist/commands/agent-import.d.ts +21 -0
- package/dist/commands/agent-import.js +212 -0
- package/dist/commands/agent-import.js.map +1 -0
- package/dist/commands/agent-install.d.ts +18 -0
- package/dist/commands/agent-install.js +59 -0
- package/dist/commands/agent-install.js.map +1 -0
- package/dist/commands/agent-installed.d.ts +6 -0
- package/dist/commands/agent-installed.js +17 -0
- package/dist/commands/agent-installed.js.map +1 -0
- package/dist/commands/agent-marketplace.d.ts +11 -0
- package/dist/commands/agent-marketplace.js +178 -0
- package/dist/commands/agent-marketplace.js.map +1 -0
- package/dist/commands/agent-package.d.ts +16 -0
- package/dist/commands/agent-package.js +159 -0
- package/dist/commands/agent-package.js.map +1 -0
- package/dist/commands/agent-scaffold.d.ts +17 -0
- package/dist/commands/agent-scaffold.js +181 -0
- package/dist/commands/agent-scaffold.js.map +1 -0
- package/dist/commands/agent-specs.d.ts +7 -0
- package/dist/commands/agent-specs.js +20 -0
- package/dist/commands/agent-specs.js.map +1 -0
- package/dist/commands/agent-test.d.ts +21 -0
- package/dist/commands/agent-test.js +50 -0
- package/dist/commands/agent-test.js.map +1 -0
- package/dist/commands/agent-uninstall.d.ts +6 -0
- package/dist/commands/agent-uninstall.js +45 -0
- package/dist/commands/agent-uninstall.js.map +1 -0
- package/dist/commands/agent-upgrade.d.ts +5 -0
- package/dist/commands/agent-upgrade.js +105 -0
- package/dist/commands/agent-upgrade.js.map +1 -0
- package/dist/commands/agent.d.ts +27 -0
- package/dist/commands/agent.js +549 -0
- package/dist/commands/agent.js.map +1 -0
- package/dist/commands/archive.d.ts +47 -0
- package/dist/commands/archive.js +311 -0
- package/dist/commands/archive.js.map +1 -0
- package/dist/commands/audit.d.ts +25 -0
- package/dist/commands/audit.js +325 -0
- package/dist/commands/audit.js.map +1 -0
- package/dist/commands/check-snippets.d.ts +58 -0
- package/dist/commands/check-snippets.js +247 -0
- package/dist/commands/check-snippets.js.map +1 -0
- package/dist/commands/check-urls.d.ts +52 -0
- package/dist/commands/check-urls.js +205 -0
- package/dist/commands/check-urls.js.map +1 -0
- package/dist/commands/code-blocks.d.ts +8 -0
- package/dist/commands/code-blocks.js +66 -0
- package/dist/commands/code-blocks.js.map +1 -0
- package/dist/commands/completion.d.ts +15 -0
- package/dist/commands/completion.js +20 -0
- package/dist/commands/completion.js.map +1 -0
- package/dist/commands/context.d.ts +16 -0
- package/dist/commands/context.js +131 -0
- package/dist/commands/context.js.map +1 -0
- package/dist/commands/describe.d.ts +12 -0
- package/dist/commands/describe.js +62 -0
- package/dist/commands/describe.js.map +1 -0
- package/dist/commands/diff.d.ts +11 -0
- package/dist/commands/diff.js +185 -0
- package/dist/commands/diff.js.map +1 -0
- package/dist/commands/fix.d.ts +59 -0
- package/dist/commands/fix.js +173 -0
- package/dist/commands/fix.js.map +1 -0
- package/dist/commands/frontmatter.d.ts +7 -0
- package/dist/commands/frontmatter.js +84 -0
- package/dist/commands/frontmatter.js.map +1 -0
- package/dist/commands/graph.d.ts +12 -0
- package/dist/commands/graph.js +122 -0
- package/dist/commands/graph.js.map +1 -0
- package/dist/commands/headers.d.ts +7 -0
- package/dist/commands/headers.js +48 -0
- package/dist/commands/headers.js.map +1 -0
- package/dist/commands/index.d.ts +8 -0
- package/dist/commands/index.js +32 -0
- package/dist/commands/index.js.map +1 -0
- package/dist/commands/links.d.ts +9 -0
- package/dist/commands/links.js +123 -0
- package/dist/commands/links.js.map +1 -0
- package/dist/commands/lint-dir.d.ts +15 -0
- package/dist/commands/lint-dir.js +156 -0
- package/dist/commands/lint-dir.js.map +1 -0
- package/dist/commands/lint.d.ts +14 -0
- package/dist/commands/lint.js +45 -0
- package/dist/commands/lint.js.map +1 -0
- package/dist/commands/orphans.d.ts +10 -0
- package/dist/commands/orphans.js +74 -0
- package/dist/commands/orphans.js.map +1 -0
- package/dist/commands/outline.d.ts +7 -0
- package/dist/commands/outline.js +54 -0
- package/dist/commands/outline.js.map +1 -0
- package/dist/commands/query.d.ts +18 -0
- package/dist/commands/query.js +341 -0
- package/dist/commands/query.js.map +1 -0
- package/dist/commands/refs-to.d.ts +8 -0
- package/dist/commands/refs-to.js +65 -0
- package/dist/commands/refs-to.js.map +1 -0
- package/dist/commands/refs.d.ts +10 -0
- package/dist/commands/refs.js +103 -0
- package/dist/commands/refs.js.map +1 -0
- package/dist/commands/rename-file.d.ts +16 -0
- package/dist/commands/rename-file.js +215 -0
- package/dist/commands/rename-file.js.map +1 -0
- package/dist/commands/rename-heading.d.ts +10 -0
- package/dist/commands/rename-heading.js +182 -0
- package/dist/commands/rename-heading.js.map +1 -0
- package/dist/commands/schema.d.ts +10 -0
- package/dist/commands/schema.js +34 -0
- package/dist/commands/schema.js.map +1 -0
- package/dist/commands/scripts.d.ts +59 -0
- package/dist/commands/scripts.js +222 -0
- package/dist/commands/scripts.js.map +1 -0
- package/dist/commands/section.d.ts +9 -0
- package/dist/commands/section.js +49 -0
- package/dist/commands/section.js.map +1 -0
- package/dist/commands/serve.d.ts +6 -0
- package/dist/commands/serve.js +48 -0
- package/dist/commands/serve.js.map +1 -0
- package/dist/commands/stats.d.ts +6 -0
- package/dist/commands/stats.js +109 -0
- package/dist/commands/stats.js.map +1 -0
- package/dist/commands/structure.d.ts +6 -0
- package/dist/commands/structure.js +130 -0
- package/dist/commands/structure.js.map +1 -0
- package/dist/commands/tables.d.ts +8 -0
- package/dist/commands/tables.js +77 -0
- package/dist/commands/tables.js.map +1 -0
- package/dist/commands/tasks.d.ts +8 -0
- package/dist/commands/tasks.js +59 -0
- package/dist/commands/tasks.js.map +1 -0
- package/dist/commands/toc.d.ts +18 -0
- package/dist/commands/toc.js +105 -0
- package/dist/commands/toc.js.map +1 -0
- package/dist/commands/update-check.d.ts +36 -0
- package/dist/commands/update-check.js +119 -0
- package/dist/commands/update-check.js.map +1 -0
- package/dist/commands/usage.d.ts +56 -0
- package/dist/commands/usage.js +883 -0
- package/dist/commands/usage.js.map +1 -0
- package/dist/commands/validate-frontmatter.d.ts +13 -0
- package/dist/commands/validate-frontmatter.js +34 -0
- package/dist/commands/validate-frontmatter.js.map +1 -0
- package/dist/completion/model.d.ts +49 -0
- package/dist/completion/model.js +194 -0
- package/dist/completion/model.js.map +1 -0
- package/dist/completion/shells.d.ts +2 -0
- package/dist/completion/shells.js +280 -0
- package/dist/completion/shells.js.map +1 -0
- package/dist/config-schema.d.ts +15 -0
- package/dist/config-schema.js +44 -0
- package/dist/config-schema.js.map +1 -0
- package/dist/config.d.ts +102 -0
- package/dist/config.js +614 -0
- package/dist/config.js.map +1 -0
- package/dist/context.d.ts +106 -0
- package/dist/context.js +202 -0
- package/dist/context.js.map +1 -0
- package/dist/contract/describe.d.ts +84 -0
- package/dist/contract/describe.js +104 -0
- package/dist/contract/describe.js.map +1 -0
- package/dist/contract/registry.d.ts +2 -0
- package/dist/contract/registry.js +622 -0
- package/dist/contract/registry.js.map +1 -0
- package/dist/contract/schemas/agent.d.ts +2 -0
- package/dist/contract/schemas/agent.js +572 -0
- package/dist/contract/schemas/agent.js.map +1 -0
- package/dist/contract/schemas/archive.d.ts +3 -0
- package/dist/contract/schemas/archive.js +227 -0
- package/dist/contract/schemas/archive.js.map +1 -0
- package/dist/contract/schemas/index.d.ts +11 -0
- package/dist/contract/schemas/index.js +49 -0
- package/dist/contract/schemas/index.js.map +1 -0
- package/dist/contract/schemas/markdown.d.ts +15 -0
- package/dist/contract/schemas/markdown.js +1035 -0
- package/dist/contract/schemas/markdown.js.map +1 -0
- package/dist/contract/schemas/meta.d.ts +5 -0
- package/dist/contract/schemas/meta.js +233 -0
- package/dist/contract/schemas/meta.js.map +1 -0
- package/dist/contract/schemas/scripts.d.ts +4 -0
- package/dist/contract/schemas/scripts.js +183 -0
- package/dist/contract/schemas/scripts.js.map +1 -0
- package/dist/contract/schemas/shared.d.ts +11 -0
- package/dist/contract/schemas/shared.js +26 -0
- package/dist/contract/schemas/shared.js.map +1 -0
- package/dist/contract/schemas/usage.d.ts +6 -0
- package/dist/contract/schemas/usage.js +489 -0
- package/dist/contract/schemas/usage.js.map +1 -0
- package/dist/contract/types.d.ts +63 -0
- package/dist/contract/types.js +2 -0
- package/dist/contract/types.js.map +1 -0
- package/dist/contract/version.d.ts +20 -0
- package/dist/contract/version.js +21 -0
- package/dist/contract/version.js.map +1 -0
- package/dist/diff.d.ts +156 -0
- package/dist/diff.js +500 -0
- package/dist/diff.js.map +1 -0
- package/dist/edit-plan.d.ts +133 -0
- package/dist/edit-plan.js +245 -0
- package/dist/edit-plan.js.map +1 -0
- package/dist/fix/markdownlint-fixer.d.ts +34 -0
- package/dist/fix/markdownlint-fixer.js +125 -0
- package/dist/fix/markdownlint-fixer.js.map +1 -0
- package/dist/fix/registry.d.ts +48 -0
- package/dist/fix/registry.js +28 -0
- package/dist/fix/registry.js.map +1 -0
- package/dist/fix/relative-links-fixer.d.ts +21 -0
- package/dist/fix/relative-links-fixer.js +96 -0
- package/dist/fix/relative-links-fixer.js.map +1 -0
- package/dist/fix/snippets-fixer.d.ts +2 -0
- package/dist/fix/snippets-fixer.js +64 -0
- package/dist/fix/snippets-fixer.js.map +1 -0
- package/dist/fix/toc-fixer.d.ts +2 -0
- package/dist/fix/toc-fixer.js +94 -0
- package/dist/fix/toc-fixer.js.map +1 -0
- package/dist/formats.d.ts +22 -0
- package/dist/formats.js +34 -0
- package/dist/formats.js.map +1 -0
- package/dist/formatters.d.ts +11 -0
- package/dist/formatters.js +48 -0
- package/dist/formatters.js.map +1 -0
- package/dist/frontmatter-validation.d.ts +11 -0
- package/dist/frontmatter-validation.js +188 -0
- package/dist/frontmatter-validation.js.map +1 -0
- package/dist/git.d.ts +40 -0
- package/dist/git.js +124 -0
- package/dist/git.js.map +1 -0
- package/dist/graph.d.ts +50 -0
- package/dist/graph.js +200 -0
- package/dist/graph.js.map +1 -0
- package/dist/input-selection.d.ts +9 -0
- package/dist/input-selection.js +122 -0
- package/dist/input-selection.js.map +1 -0
- package/dist/input.d.ts +2 -0
- package/dist/input.js +32 -0
- package/dist/input.js.map +1 -0
- package/dist/link-target.d.ts +39 -0
- package/dist/link-target.js +68 -0
- package/dist/link-target.js.map +1 -0
- package/dist/lint.d.ts +13 -0
- package/dist/lint.js +27 -0
- package/dist/lint.js.map +1 -0
- package/dist/markdown-ast.d.ts +73 -0
- package/dist/markdown-ast.js +187 -0
- package/dist/markdown-ast.js.map +1 -0
- package/dist/object-path.d.ts +14 -0
- package/dist/object-path.js +14 -0
- package/dist/object-path.js.map +1 -0
- package/dist/option-utils.d.ts +13 -0
- package/dist/option-utils.js +25 -0
- package/dist/option-utils.js.map +1 -0
- package/dist/outline.d.ts +16 -0
- package/dist/outline.js +32 -0
- package/dist/outline.js.map +1 -0
- package/dist/query/entities.d.ts +60 -0
- package/dist/query/entities.js +219 -0
- package/dist/query/entities.js.map +1 -0
- package/dist/query/execute.d.ts +22 -0
- package/dist/query/execute.js +0 -0
- package/dist/query/execute.js.map +1 -0
- package/dist/query/plan.d.ts +76 -0
- package/dist/query/plan.js +183 -0
- package/dist/query/plan.js.map +1 -0
- package/dist/query/render.d.ts +3 -0
- package/dist/query/render.js +39 -0
- package/dist/query/render.js.map +1 -0
- package/dist/refs.d.ts +19 -0
- package/dist/refs.js +10 -0
- package/dist/refs.js.map +1 -0
- package/dist/result.d.ts +49 -0
- package/dist/result.js +47 -0
- package/dist/result.js.map +1 -0
- package/dist/runtime.d.ts +35 -0
- package/dist/runtime.js +77 -0
- package/dist/runtime.js.map +1 -0
- package/dist/sarif.d.ts +36 -0
- package/dist/sarif.js +30 -0
- package/dist/sarif.js.map +1 -0
- package/dist/scripts/execute.d.ts +65 -0
- package/dist/scripts/execute.js +235 -0
- package/dist/scripts/execute.js.map +1 -0
- package/dist/scripts/registry.d.ts +55 -0
- package/dist/scripts/registry.js +103 -0
- package/dist/scripts/registry.js.map +1 -0
- package/dist/scripts/resolve.d.ts +90 -0
- package/dist/scripts/resolve.js +288 -0
- package/dist/scripts/resolve.js.map +1 -0
- package/dist/sections.d.ts +53 -0
- package/dist/sections.js +100 -0
- package/dist/sections.js.map +1 -0
- package/dist/serve/errors.d.ts +25 -0
- package/dist/serve/errors.js +45 -0
- package/dist/serve/errors.js.map +1 -0
- package/dist/serve/paths.d.ts +32 -0
- package/dist/serve/paths.js +71 -0
- package/dist/serve/paths.js.map +1 -0
- package/dist/serve/server.d.ts +31 -0
- package/dist/serve/server.js +123 -0
- package/dist/serve/server.js.map +1 -0
- package/dist/serve/tools.d.ts +19 -0
- package/dist/serve/tools.js +597 -0
- package/dist/serve/tools.js.map +1 -0
- package/dist/snippets.d.ts +184 -0
- package/dist/snippets.js +454 -0
- package/dist/snippets.js.map +1 -0
- package/dist/sqlite-store.d.ts +62 -0
- package/dist/sqlite-store.js +104 -0
- package/dist/sqlite-store.js.map +1 -0
- package/dist/sqlite.d.ts +59 -0
- package/dist/sqlite.js +51 -0
- package/dist/sqlite.js.map +1 -0
- package/dist/toc.d.ts +58 -0
- package/dist/toc.js +83 -0
- package/dist/toc.js.map +1 -0
- package/dist/types.d.ts +7 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/update-notifier.d.ts +95 -0
- package/dist/update-notifier.js +301 -0
- package/dist/update-notifier.js.map +1 -0
- package/dist/url-cache.d.ts +14 -0
- package/dist/url-cache.js +70 -0
- package/dist/url-cache.js.map +1 -0
- package/dist/usage/aggregate.d.ts +107 -0
- package/dist/usage/aggregate.js +435 -0
- package/dist/usage/aggregate.js.map +1 -0
- package/dist/usage/db/index.d.ts +49 -0
- package/dist/usage/db/index.js +118 -0
- package/dist/usage/db/index.js.map +1 -0
- package/dist/usage/db/migrations.d.ts +29 -0
- package/dist/usage/db/migrations.js +38 -0
- package/dist/usage/db/migrations.js.map +1 -0
- package/dist/usage/db/open.d.ts +33 -0
- package/dist/usage/db/open.js +37 -0
- package/dist/usage/db/open.js.map +1 -0
- package/dist/usage/db/schema.d.ts +18 -0
- package/dist/usage/db/schema.js +147 -0
- package/dist/usage/db/schema.js.map +1 -0
- package/dist/usage/db/store.d.ts +74 -0
- package/dist/usage/db/store.js +280 -0
- package/dist/usage/db/store.js.map +1 -0
- package/dist/usage/events.d.ts +202 -0
- package/dist/usage/events.js +243 -0
- package/dist/usage/events.js.map +1 -0
- package/dist/usage/filter.d.ts +43 -0
- package/dist/usage/filter.js +97 -0
- package/dist/usage/filter.js.map +1 -0
- package/dist/usage/providers/antigravity.d.ts +2 -0
- package/dist/usage/providers/antigravity.js +431 -0
- package/dist/usage/providers/antigravity.js.map +1 -0
- package/dist/usage/providers/claude-code.d.ts +2 -0
- package/dist/usage/providers/claude-code.js +400 -0
- package/dist/usage/providers/claude-code.js.map +1 -0
- package/dist/usage/providers/codex.d.ts +2 -0
- package/dist/usage/providers/codex.js +387 -0
- package/dist/usage/providers/codex.js.map +1 -0
- package/dist/usage/providers/gemini-cli.d.ts +2 -0
- package/dist/usage/providers/gemini-cli.js +466 -0
- package/dist/usage/providers/gemini-cli.js.map +1 -0
- package/dist/usage/providers/index.d.ts +23 -0
- package/dist/usage/providers/index.js +46 -0
- package/dist/usage/providers/index.js.map +1 -0
- package/dist/usage/providers/opencode.d.ts +2 -0
- package/dist/usage/providers/opencode.js +422 -0
- package/dist/usage/providers/opencode.js.map +1 -0
- package/dist/usage/providers/protobuf.d.ts +35 -0
- package/dist/usage/providers/protobuf.js +125 -0
- package/dist/usage/providers/protobuf.js.map +1 -0
- package/dist/usage/providers/types.d.ts +74 -0
- package/dist/usage/providers/types.js +2 -0
- package/dist/usage/providers/types.js.map +1 -0
- package/dist/usage/scan.d.ts +54 -0
- package/dist/usage/scan.js +216 -0
- package/dist/usage/scan.js.map +1 -0
- package/dist/version.d.ts +2 -0
- package/dist/version.js +8 -0
- package/dist/version.js.map +1 -0
- package/dist/workspace-index.d.ts +39 -0
- package/dist/workspace-index.js +265 -0
- package/dist/workspace-index.js.map +1 -0
- package/dist/workspace.d.ts +89 -0
- package/dist/workspace.js +219 -0
- package/dist/workspace.js.map +1 -0
- package/package.json +92 -0
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Progress reporting for a long archive run.
|
|
3
|
+
*
|
|
4
|
+
* A full run is tens of thousands of files and several gigabytes, and without
|
|
5
|
+
* this it printed nothing at all until it finished. Two levels, because they
|
|
6
|
+
* answer different questions:
|
|
7
|
+
*
|
|
8
|
+
* - the **transient line** answers "is it still going, and how far in" — it
|
|
9
|
+
* rewrites itself in place, so it belongs only on a terminal
|
|
10
|
+
* - **verbose** answers "what exactly did it do to which file" — one durable
|
|
11
|
+
* line per artifact, so it is worth redirecting to a file and grepping later
|
|
12
|
+
*
|
|
13
|
+
* The transient line is gated the same way the update notifier is: stderr must
|
|
14
|
+
* be a TTY, the format must not be machine-readable, and `CI` must be unset.
|
|
15
|
+
* Those gates exist because a `\r`-rewritten line is corruption in a log file
|
|
16
|
+
* and noise in a CI transcript. Verbose has no such gate — being redirectable is
|
|
17
|
+
* the whole point of it.
|
|
18
|
+
*/
|
|
19
|
+
function formatBytes(value) {
|
|
20
|
+
if (value >= 1_000_000_000)
|
|
21
|
+
return `${(value / 1_000_000_000).toFixed(1)}G`;
|
|
22
|
+
if (value >= 1_000_000)
|
|
23
|
+
return `${(value / 1_000_000).toFixed(1)}M`;
|
|
24
|
+
if (value >= 1_000)
|
|
25
|
+
return `${(value / 1_000).toFixed(1)}k`;
|
|
26
|
+
return `${value}B`;
|
|
27
|
+
}
|
|
28
|
+
function formatDuration(ms) {
|
|
29
|
+
const seconds = Math.round(ms / 1000);
|
|
30
|
+
if (seconds < 60)
|
|
31
|
+
return `${seconds}s`;
|
|
32
|
+
const minutes = Math.floor(seconds / 60);
|
|
33
|
+
return `${minutes}m${String(seconds % 60).padStart(2, "0")}s`;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Trims a path to fit, keeping its end.
|
|
37
|
+
*
|
|
38
|
+
* From the left, because the tail of a path is what identifies it — the head is
|
|
39
|
+
* a project root repeated on every line.
|
|
40
|
+
*/
|
|
41
|
+
function fitPath(text, width) {
|
|
42
|
+
if (width <= 1)
|
|
43
|
+
return "";
|
|
44
|
+
if (text.length <= width)
|
|
45
|
+
return text;
|
|
46
|
+
return `…${text.slice(text.length - width + 1)}`;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Decides whether the transient line may be drawn.
|
|
50
|
+
*
|
|
51
|
+
* Kept separate from the reporter so the command can report the decision, and
|
|
52
|
+
* so the rule is testable without a terminal.
|
|
53
|
+
*/
|
|
54
|
+
export function progressAllowed(format, stream = process.stderr, env = process.env) {
|
|
55
|
+
if (format === "json")
|
|
56
|
+
return false;
|
|
57
|
+
if (env.CI)
|
|
58
|
+
return false;
|
|
59
|
+
return stream.isTTY === true;
|
|
60
|
+
}
|
|
61
|
+
export function createReporter(options) {
|
|
62
|
+
const stream = options.stream ?? process.stderr;
|
|
63
|
+
const now = options.now ?? (() => Date.now());
|
|
64
|
+
// Verbose owns the terminal when both are on: a transient line would be
|
|
65
|
+
// overwritten by the next verbose line and leave fragments behind.
|
|
66
|
+
const drawLine = options.progress && !options.verbose;
|
|
67
|
+
if (!drawLine && !options.verbose)
|
|
68
|
+
return {};
|
|
69
|
+
const started = now();
|
|
70
|
+
let totalFiles = 0;
|
|
71
|
+
let totalBytes = 0;
|
|
72
|
+
let seenFiles = 0;
|
|
73
|
+
let seenBytes = 0;
|
|
74
|
+
let storedBytes = 0;
|
|
75
|
+
let segments = 0;
|
|
76
|
+
let lastDraw = 0;
|
|
77
|
+
let dirty = false;
|
|
78
|
+
const width = () => Math.max(40, Math.min(stream.columns ?? 100, 160));
|
|
79
|
+
const clear = () => {
|
|
80
|
+
if (dirty) {
|
|
81
|
+
stream.write(`\r${" ".repeat(width() - 1)}\r`);
|
|
82
|
+
dirty = false;
|
|
83
|
+
}
|
|
84
|
+
};
|
|
85
|
+
const draw = (label, force = false) => {
|
|
86
|
+
if (!drawLine)
|
|
87
|
+
return;
|
|
88
|
+
const at = now();
|
|
89
|
+
// Throttled: redrawing per file over 24k files is most of the work.
|
|
90
|
+
if (!force && at - lastDraw < 100)
|
|
91
|
+
return;
|
|
92
|
+
lastDraw = at;
|
|
93
|
+
const elapsed = at - started;
|
|
94
|
+
const rate = elapsed > 0 ? (seenBytes / elapsed) * 1000 : 0;
|
|
95
|
+
const percent = totalBytes > 0 ? Math.floor((seenBytes / totalBytes) * 100) : 0;
|
|
96
|
+
const head = ` ${percent}% ${seenFiles}/${totalFiles} files · ` +
|
|
97
|
+
`${formatBytes(seenBytes)}/${formatBytes(totalBytes)} · ` +
|
|
98
|
+
`${segments} seg · ${formatBytes(rate)}/s · ${formatDuration(elapsed)} · `;
|
|
99
|
+
// The counters survive a narrow terminal and the path gives way, rather than
|
|
100
|
+
// the other way round: how far along it is matters more than which file.
|
|
101
|
+
const room = width() - 1 - head.length;
|
|
102
|
+
const line = room > 1 ? head + fitPath(label, room) : head.slice(0, width() - 1);
|
|
103
|
+
stream.write(`\r${line}`);
|
|
104
|
+
dirty = true;
|
|
105
|
+
};
|
|
106
|
+
return {
|
|
107
|
+
start(total) {
|
|
108
|
+
totalFiles = total.files;
|
|
109
|
+
totalBytes = total.bytes;
|
|
110
|
+
if (options.verbose) {
|
|
111
|
+
stream.write(`archiving ${total.files} artifacts, ${formatBytes(total.bytes)} uncompressed\n`);
|
|
112
|
+
}
|
|
113
|
+
draw("", true);
|
|
114
|
+
},
|
|
115
|
+
file(event) {
|
|
116
|
+
seenFiles += 1;
|
|
117
|
+
seenBytes += event.size;
|
|
118
|
+
if (event.disposition === "stored")
|
|
119
|
+
storedBytes += event.size;
|
|
120
|
+
if (options.verbose) {
|
|
121
|
+
const hash = event.sha256 ? event.sha256.slice(0, 12) : "-".repeat(12);
|
|
122
|
+
stream.write(`${event.disposition.padEnd(9)} ${event.class.padEnd(10)} ` +
|
|
123
|
+
`${formatBytes(event.size).padStart(8)} ${hash} ${event.path}\n`);
|
|
124
|
+
}
|
|
125
|
+
draw(event.path);
|
|
126
|
+
},
|
|
127
|
+
segment(event) {
|
|
128
|
+
segments += 1;
|
|
129
|
+
if (options.verbose) {
|
|
130
|
+
clear();
|
|
131
|
+
stream.write(`sealed ${event.name} ${formatBytes(event.bytes)} ${event.blobs} blobs\n`);
|
|
132
|
+
}
|
|
133
|
+
draw("", true);
|
|
134
|
+
},
|
|
135
|
+
failure(event) {
|
|
136
|
+
// Always durable, at either level: a file that could not be read is the
|
|
137
|
+
// one thing in a run nobody should have to scroll back for.
|
|
138
|
+
clear();
|
|
139
|
+
stream.write(`unreadable ${event.file}: ${event.reason}\n`);
|
|
140
|
+
draw("", true);
|
|
141
|
+
},
|
|
142
|
+
finish() {
|
|
143
|
+
clear();
|
|
144
|
+
if (options.verbose) {
|
|
145
|
+
stream.write(`archived ${formatBytes(storedBytes)} of new content in ` +
|
|
146
|
+
`${formatDuration(now() - started)}\n`);
|
|
147
|
+
}
|
|
148
|
+
},
|
|
149
|
+
};
|
|
150
|
+
}
|
|
151
|
+
//# sourceMappingURL=progress.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"progress.js","sourceRoot":"","sources":["../../src/archive/progress.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import type { SqliteDatabase } from "../sqlite.js";
|
|
2
|
+
/** Reading the archive: what it holds, and getting a file back out of it. */
|
|
3
|
+
export interface ArchiveStatus {
|
|
4
|
+
root: string;
|
|
5
|
+
present: boolean;
|
|
6
|
+
schemaVersion: number;
|
|
7
|
+
segments: number;
|
|
8
|
+
blobs: number;
|
|
9
|
+
artifacts: number;
|
|
10
|
+
/** Distinct paths, which is fewer than `artifacts` once anything has changed. */
|
|
11
|
+
paths: number;
|
|
12
|
+
/** Uncompressed bytes of stored content. */
|
|
13
|
+
bytes: number;
|
|
14
|
+
/** Bytes the segments actually occupy. */
|
|
15
|
+
compressedBytes: number;
|
|
16
|
+
updatedAt: string | null;
|
|
17
|
+
byClass: Record<string, {
|
|
18
|
+
artifacts: number;
|
|
19
|
+
bytes: number;
|
|
20
|
+
}>;
|
|
21
|
+
byProvider: Record<string, number>;
|
|
22
|
+
}
|
|
23
|
+
export declare function archiveStatus(root: string): ArchiveStatus;
|
|
24
|
+
export interface ListFilter {
|
|
25
|
+
providers?: readonly string[];
|
|
26
|
+
class?: string;
|
|
27
|
+
/** Inclusive lower bound on `last_seen`, as an ISO day. */
|
|
28
|
+
since?: string;
|
|
29
|
+
limit?: number;
|
|
30
|
+
}
|
|
31
|
+
export interface ArchivedFile {
|
|
32
|
+
provider: string;
|
|
33
|
+
set: string;
|
|
34
|
+
class: string;
|
|
35
|
+
path: string;
|
|
36
|
+
sha256: string;
|
|
37
|
+
size: number;
|
|
38
|
+
firstSeen: string;
|
|
39
|
+
lastSeen: string;
|
|
40
|
+
/** How many distinct versions of this path the archive holds. */
|
|
41
|
+
versions: number;
|
|
42
|
+
}
|
|
43
|
+
export declare function listArtifacts(db: SqliteDatabase, filter: ListFilter): ArchivedFile[];
|
|
44
|
+
export interface ResolvedBlob {
|
|
45
|
+
sha256: string;
|
|
46
|
+
size: number;
|
|
47
|
+
offset: number;
|
|
48
|
+
segment: string;
|
|
49
|
+
path: string;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Finds what to extract, by hash or by original path.
|
|
53
|
+
*
|
|
54
|
+
* A path may have several versions; the newest wins unless a hash was given,
|
|
55
|
+
* which is how an older one is reached. A hash prefix is accepted because a full
|
|
56
|
+
* sha256 is not something anyone types.
|
|
57
|
+
*/
|
|
58
|
+
export declare function resolve(db: SqliteDatabase, target: string): ResolvedBlob[];
|
|
59
|
+
export interface ExtractResult {
|
|
60
|
+
path: string;
|
|
61
|
+
sha256: string;
|
|
62
|
+
bytes: number;
|
|
63
|
+
written: string;
|
|
64
|
+
}
|
|
65
|
+
/** Writes one resolved blob into `outDir`, under its original basename. */
|
|
66
|
+
export declare function extract(root: string, blob: ResolvedBlob, outDir: string): ExtractResult;
|
|
67
|
+
export interface VerifyFinding {
|
|
68
|
+
segment: string;
|
|
69
|
+
issue: string;
|
|
70
|
+
}
|
|
71
|
+
export interface VerifyResult {
|
|
72
|
+
segments: number;
|
|
73
|
+
blobs: number;
|
|
74
|
+
checked: number;
|
|
75
|
+
findings: VerifyFinding[];
|
|
76
|
+
deep: boolean;
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Checks the archive against its index.
|
|
80
|
+
*
|
|
81
|
+
* The default pass hashes each segment file, which catches a truncated or
|
|
82
|
+
* corrupted archive for the cost of reading it. `--deep` also decompresses every
|
|
83
|
+
* segment and re-hashes each member, which additionally catches an index whose
|
|
84
|
+
* offsets no longer point where it claims.
|
|
85
|
+
*/
|
|
86
|
+
export declare function verify(root: string, deep: boolean): VerifyResult;
|
|
@@ -0,0 +1,241 @@
|
|
|
1
|
+
import fs from "node:fs";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { closeQuietly } from "../sqlite-store.js";
|
|
4
|
+
import { LATEST_VERSION, indexPath, openArchive, segmentsDirectory } from "./db.js";
|
|
5
|
+
import { extractBlob, hashBuffer, readSegment } from "./segments.js";
|
|
6
|
+
function emptyStatus(root) {
|
|
7
|
+
return {
|
|
8
|
+
root,
|
|
9
|
+
present: false,
|
|
10
|
+
schemaVersion: LATEST_VERSION,
|
|
11
|
+
segments: 0,
|
|
12
|
+
blobs: 0,
|
|
13
|
+
artifacts: 0,
|
|
14
|
+
paths: 0,
|
|
15
|
+
bytes: 0,
|
|
16
|
+
compressedBytes: 0,
|
|
17
|
+
updatedAt: null,
|
|
18
|
+
byClass: {},
|
|
19
|
+
byProvider: {},
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
export function archiveStatus(root) {
|
|
23
|
+
if (!fs.existsSync(indexPath(root)))
|
|
24
|
+
return emptyStatus(root);
|
|
25
|
+
let opened;
|
|
26
|
+
try {
|
|
27
|
+
opened = openArchive({ root, readOnly: true, migrate: false });
|
|
28
|
+
}
|
|
29
|
+
catch {
|
|
30
|
+
return emptyStatus(root);
|
|
31
|
+
}
|
|
32
|
+
try {
|
|
33
|
+
const db = opened.db;
|
|
34
|
+
const one = (sql) => Number(db.prepare(sql).get()?.n ?? 0);
|
|
35
|
+
const byClass = {};
|
|
36
|
+
for (const row of db
|
|
37
|
+
.prepare(`SELECT a.class, COUNT(*) AS n, COALESCE(SUM(b.size), 0) AS bytes
|
|
38
|
+
FROM artifact a JOIN blob b ON b.sha256 = a.sha256
|
|
39
|
+
GROUP BY a.class ORDER BY a.class`)
|
|
40
|
+
.all()) {
|
|
41
|
+
byClass[String(row.class)] = { artifacts: Number(row.n), bytes: Number(row.bytes) };
|
|
42
|
+
}
|
|
43
|
+
const byProvider = {};
|
|
44
|
+
for (const row of db
|
|
45
|
+
.prepare("SELECT provider, COUNT(*) AS n FROM artifact GROUP BY provider ORDER BY provider")
|
|
46
|
+
.all()) {
|
|
47
|
+
byProvider[String(row.provider)] = Number(row.n);
|
|
48
|
+
}
|
|
49
|
+
const updated = db.prepare("SELECT MAX(last_seen) AS at FROM artifact").get()?.at;
|
|
50
|
+
return {
|
|
51
|
+
root,
|
|
52
|
+
present: true,
|
|
53
|
+
schemaVersion: Number(db.prepare("PRAGMA user_version").get()?.user_version ?? 0),
|
|
54
|
+
segments: one("SELECT COUNT(*) AS n FROM segment"),
|
|
55
|
+
blobs: one("SELECT COUNT(*) AS n FROM blob"),
|
|
56
|
+
artifacts: one("SELECT COUNT(*) AS n FROM artifact"),
|
|
57
|
+
paths: one("SELECT COUNT(*) AS n FROM (SELECT DISTINCT provider, path FROM artifact)"),
|
|
58
|
+
bytes: one("SELECT COALESCE(SUM(size), 0) AS n FROM blob"),
|
|
59
|
+
compressedBytes: one("SELECT COALESCE(SUM(bytes), 0) AS n FROM segment"),
|
|
60
|
+
updatedAt: typeof updated === "string" ? updated : null,
|
|
61
|
+
byClass,
|
|
62
|
+
byProvider,
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
catch {
|
|
66
|
+
return emptyStatus(root);
|
|
67
|
+
}
|
|
68
|
+
finally {
|
|
69
|
+
closeQuietly(opened.db);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
export function listArtifacts(db, filter) {
|
|
73
|
+
// Only the newest row per path is listed; older rows are that path's history
|
|
74
|
+
// and are reported as `versions` rather than as separate lines.
|
|
75
|
+
const conditions = ["a.id IN (SELECT MAX(id) FROM artifact GROUP BY provider, path)"];
|
|
76
|
+
const parameters = [];
|
|
77
|
+
if (filter.providers && filter.providers.length > 0) {
|
|
78
|
+
conditions.push(`a.provider IN (${filter.providers.map(() => "?").join(",")})`);
|
|
79
|
+
parameters.push(...filter.providers);
|
|
80
|
+
}
|
|
81
|
+
if (filter.class) {
|
|
82
|
+
conditions.push("a.class = ?");
|
|
83
|
+
parameters.push(filter.class);
|
|
84
|
+
}
|
|
85
|
+
if (filter.since) {
|
|
86
|
+
conditions.push("a.last_seen >= ?");
|
|
87
|
+
parameters.push(filter.since);
|
|
88
|
+
}
|
|
89
|
+
// The limit is interpolated because SQLite will not bind a LIMIT, and is
|
|
90
|
+
// floored to an integer here rather than trusted from the caller.
|
|
91
|
+
const limit = filter.limit && filter.limit > 0 ? `LIMIT ${Math.floor(filter.limit)}` : "";
|
|
92
|
+
const rows = db
|
|
93
|
+
.prepare(`SELECT a.provider, a.set_id, a.class, a.path, a.sha256, a.size,
|
|
94
|
+
a.first_seen, a.last_seen,
|
|
95
|
+
(SELECT COUNT(*) FROM artifact v
|
|
96
|
+
WHERE v.provider = a.provider AND v.path = a.path) AS versions
|
|
97
|
+
FROM artifact a
|
|
98
|
+
WHERE ${conditions.join(" AND ")}
|
|
99
|
+
ORDER BY a.last_seen DESC, a.path ASC
|
|
100
|
+
${limit}`)
|
|
101
|
+
.all(...parameters);
|
|
102
|
+
return rows.map((row) => ({
|
|
103
|
+
provider: String(row.provider),
|
|
104
|
+
set: String(row.set_id),
|
|
105
|
+
class: String(row.class),
|
|
106
|
+
path: String(row.path),
|
|
107
|
+
sha256: String(row.sha256),
|
|
108
|
+
size: Number(row.size),
|
|
109
|
+
firstSeen: String(row.first_seen),
|
|
110
|
+
lastSeen: String(row.last_seen),
|
|
111
|
+
versions: Number(row.versions),
|
|
112
|
+
}));
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Finds what to extract, by hash or by original path.
|
|
116
|
+
*
|
|
117
|
+
* A path may have several versions; the newest wins unless a hash was given,
|
|
118
|
+
* which is how an older one is reached. A hash prefix is accepted because a full
|
|
119
|
+
* sha256 is not something anyone types.
|
|
120
|
+
*/
|
|
121
|
+
export function resolve(db, target) {
|
|
122
|
+
const byHash = db
|
|
123
|
+
.prepare(`SELECT b.sha256, b.size, b.offset, s.name AS segment,
|
|
124
|
+
(SELECT path FROM artifact WHERE sha256 = b.sha256 ORDER BY id DESC LIMIT 1) AS path
|
|
125
|
+
FROM blob b JOIN segment s ON s.id = b.segment_id
|
|
126
|
+
WHERE b.sha256 = ? OR b.sha256 LIKE ?`)
|
|
127
|
+
.all(target, `${target}%`);
|
|
128
|
+
if (byHash.length > 0) {
|
|
129
|
+
return byHash.map((row) => ({
|
|
130
|
+
sha256: String(row.sha256),
|
|
131
|
+
size: Number(row.size),
|
|
132
|
+
offset: Number(row.offset),
|
|
133
|
+
segment: String(row.segment),
|
|
134
|
+
path: String(row.path ?? row.sha256),
|
|
135
|
+
}));
|
|
136
|
+
}
|
|
137
|
+
const byPath = db
|
|
138
|
+
.prepare(`SELECT b.sha256, b.size, b.offset, s.name AS segment, a.path
|
|
139
|
+
FROM artifact a
|
|
140
|
+
JOIN blob b ON b.sha256 = a.sha256
|
|
141
|
+
JOIN segment s ON s.id = b.segment_id
|
|
142
|
+
WHERE a.path = ?
|
|
143
|
+
ORDER BY a.id DESC LIMIT 1`)
|
|
144
|
+
.all(target);
|
|
145
|
+
return byPath.map((row) => ({
|
|
146
|
+
sha256: String(row.sha256),
|
|
147
|
+
size: Number(row.size),
|
|
148
|
+
offset: Number(row.offset),
|
|
149
|
+
segment: String(row.segment),
|
|
150
|
+
path: String(row.path),
|
|
151
|
+
}));
|
|
152
|
+
}
|
|
153
|
+
/** Writes one resolved blob into `outDir`, under its original basename. */
|
|
154
|
+
export function extract(root, blob, outDir) {
|
|
155
|
+
const uncompressed = readSegment(segmentsDirectory(root), blob.segment);
|
|
156
|
+
const content = extractBlob(uncompressed, blob);
|
|
157
|
+
fs.mkdirSync(outDir, { recursive: true });
|
|
158
|
+
const written = path.join(outDir, path.basename(blob.path));
|
|
159
|
+
fs.writeFileSync(written, content);
|
|
160
|
+
return { path: blob.path, sha256: blob.sha256, bytes: content.length, written };
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* Checks the archive against its index.
|
|
164
|
+
*
|
|
165
|
+
* The default pass hashes each segment file, which catches a truncated or
|
|
166
|
+
* corrupted archive for the cost of reading it. `--deep` also decompresses every
|
|
167
|
+
* segment and re-hashes each member, which additionally catches an index whose
|
|
168
|
+
* offsets no longer point where it claims.
|
|
169
|
+
*/
|
|
170
|
+
export function verify(root, deep) {
|
|
171
|
+
const result = { segments: 0, blobs: 0, checked: 0, findings: [], deep };
|
|
172
|
+
if (!fs.existsSync(indexPath(root)))
|
|
173
|
+
return result;
|
|
174
|
+
const opened = openArchive({ root, readOnly: true, migrate: false });
|
|
175
|
+
const directory = segmentsDirectory(root);
|
|
176
|
+
try {
|
|
177
|
+
const db = opened.db;
|
|
178
|
+
const segments = db.prepare("SELECT id, name, sha256 FROM segment ORDER BY id").all();
|
|
179
|
+
result.segments = segments.length;
|
|
180
|
+
for (const segment of segments) {
|
|
181
|
+
const name = String(segment.name);
|
|
182
|
+
const file = path.join(directory, name);
|
|
183
|
+
let raw;
|
|
184
|
+
try {
|
|
185
|
+
raw = fs.readFileSync(file);
|
|
186
|
+
}
|
|
187
|
+
catch {
|
|
188
|
+
result.findings.push({ segment: name, issue: "missing from the segments directory" });
|
|
189
|
+
continue;
|
|
190
|
+
}
|
|
191
|
+
const actual = hashBuffer(raw);
|
|
192
|
+
if (actual !== String(segment.sha256)) {
|
|
193
|
+
result.findings.push({
|
|
194
|
+
segment: name,
|
|
195
|
+
issue: `hash mismatch: index says ${String(segment.sha256).slice(0, 12)}, file is ${actual.slice(0, 12)}`,
|
|
196
|
+
});
|
|
197
|
+
// A segment whose bytes already disagree cannot say anything useful
|
|
198
|
+
// about its members, so it is not opened further.
|
|
199
|
+
continue;
|
|
200
|
+
}
|
|
201
|
+
result.checked += 1;
|
|
202
|
+
const blobs = db
|
|
203
|
+
.prepare("SELECT sha256, size, offset FROM blob WHERE segment_id = ?")
|
|
204
|
+
.all(Number(segment.id));
|
|
205
|
+
result.blobs += blobs.length;
|
|
206
|
+
if (!deep)
|
|
207
|
+
continue;
|
|
208
|
+
let uncompressed;
|
|
209
|
+
try {
|
|
210
|
+
uncompressed = readSegment(directory, name);
|
|
211
|
+
}
|
|
212
|
+
catch (error) {
|
|
213
|
+
result.findings.push({
|
|
214
|
+
segment: name,
|
|
215
|
+
issue: `will not decompress: ${error.message}`,
|
|
216
|
+
});
|
|
217
|
+
continue;
|
|
218
|
+
}
|
|
219
|
+
for (const blob of blobs) {
|
|
220
|
+
try {
|
|
221
|
+
extractBlob(uncompressed, {
|
|
222
|
+
sha256: String(blob.sha256),
|
|
223
|
+
size: Number(blob.size),
|
|
224
|
+
offset: Number(blob.offset),
|
|
225
|
+
});
|
|
226
|
+
}
|
|
227
|
+
catch (error) {
|
|
228
|
+
result.findings.push({
|
|
229
|
+
segment: name,
|
|
230
|
+
issue: `${String(blob.sha256).slice(0, 12)}: ${error.message}`,
|
|
231
|
+
});
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
return result;
|
|
236
|
+
}
|
|
237
|
+
finally {
|
|
238
|
+
closeQuietly(opened.db);
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
//# sourceMappingURL=query.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"query.js","sourceRoot":"","sources":["../../src/archive/query.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import type { UsageProvider } from "../usage/providers/types.js";
|
|
2
|
+
import type { ArtifactClass, ArtifactSet } from "./sets.js";
|
|
3
|
+
import type { RunReporter } from "./progress.js";
|
|
4
|
+
/**
|
|
5
|
+
* The incremental archive walk.
|
|
6
|
+
*
|
|
7
|
+
* Two independent things make a run cheap on the second pass. A file whose
|
|
8
|
+
* `(path, size, mtime)` already matches an indexed row is never opened, so an
|
|
9
|
+
* unchanged corpus costs a stat per file; and a file that *is* opened but whose
|
|
10
|
+
* hash is already a stored blob is never written again, so a file that was
|
|
11
|
+
* merely touched, or that duplicates another, costs nothing but its row.
|
|
12
|
+
*/
|
|
13
|
+
export interface Candidate {
|
|
14
|
+
provider: string;
|
|
15
|
+
set: ArtifactSet;
|
|
16
|
+
/** Absolute path on disk. */
|
|
17
|
+
file: string;
|
|
18
|
+
/** Path recorded in the index: absolute, because that is what identifies it. */
|
|
19
|
+
recordPath: string;
|
|
20
|
+
size: number;
|
|
21
|
+
mtimeMs: number;
|
|
22
|
+
mode: number;
|
|
23
|
+
}
|
|
24
|
+
export interface RunCounters {
|
|
25
|
+
/** Files the sets matched. */
|
|
26
|
+
discovered: number;
|
|
27
|
+
/** Already indexed at this size and mtime; never opened. */
|
|
28
|
+
unchanged: number;
|
|
29
|
+
/** Opened and hashed. */
|
|
30
|
+
hashed: number;
|
|
31
|
+
/** Hashed, but the content was already stored; only a row was written. */
|
|
32
|
+
duplicate: number;
|
|
33
|
+
/** Written into a segment. */
|
|
34
|
+
stored: number;
|
|
35
|
+
/** Matched but unreadable. */
|
|
36
|
+
skipped: number;
|
|
37
|
+
/** Uncompressed bytes added. */
|
|
38
|
+
bytes: number;
|
|
39
|
+
}
|
|
40
|
+
export interface RunFailure {
|
|
41
|
+
file: string;
|
|
42
|
+
reason: string;
|
|
43
|
+
}
|
|
44
|
+
export interface RunResult {
|
|
45
|
+
counters: RunCounters;
|
|
46
|
+
failures: RunFailure[];
|
|
47
|
+
segments: {
|
|
48
|
+
name: string;
|
|
49
|
+
bytes: number;
|
|
50
|
+
blobs: number;
|
|
51
|
+
}[];
|
|
52
|
+
/** Per class, what this run took in. */
|
|
53
|
+
byClass: Record<string, {
|
|
54
|
+
discovered: number;
|
|
55
|
+
stored: number;
|
|
56
|
+
bytes: number;
|
|
57
|
+
}>;
|
|
58
|
+
}
|
|
59
|
+
export declare function emptyCounters(): RunCounters;
|
|
60
|
+
/**
|
|
61
|
+
* Walks one set, yielding what it matches.
|
|
62
|
+
*
|
|
63
|
+
* Symbolic links are not followed. A link into a directory the sets deliberately
|
|
64
|
+
* exclude would otherwise pull it in anyway, which is the failure mode the
|
|
65
|
+
* allowlist in `sets.ts` exists to prevent.
|
|
66
|
+
*/
|
|
67
|
+
export declare function collectSet(root: string, provider: string, set: ArtifactSet): Candidate[];
|
|
68
|
+
/** Everything the selected classes match, across the selected providers. */
|
|
69
|
+
export declare function collect(sources: ReadonlyArray<{
|
|
70
|
+
provider: UsageProvider;
|
|
71
|
+
root: string;
|
|
72
|
+
}>, classes: readonly ArtifactClass[]): Candidate[];
|
|
73
|
+
export interface RunOptions {
|
|
74
|
+
archiveRoot: string;
|
|
75
|
+
sources: ReadonlyArray<{
|
|
76
|
+
provider: UsageProvider;
|
|
77
|
+
root: string;
|
|
78
|
+
}>;
|
|
79
|
+
classes: readonly ArtifactClass[];
|
|
80
|
+
/** Report what would be taken in, storing nothing. */
|
|
81
|
+
dryRun?: boolean;
|
|
82
|
+
segmentBytes?: number;
|
|
83
|
+
/**
|
|
84
|
+
* Told what happened as it happens.
|
|
85
|
+
*
|
|
86
|
+
* The engine reports events; how they are drawn is the command's business, so
|
|
87
|
+
* nothing here knows about terminals, colours, or `--verbose`.
|
|
88
|
+
*/
|
|
89
|
+
reporter?: RunReporter;
|
|
90
|
+
}
|
|
91
|
+
export declare function runArchive(options: RunOptions): Promise<RunResult>;
|