@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,38 @@
|
|
|
1
|
+
import { latestVersion } from "../../sqlite-store.js";
|
|
2
|
+
import { SCHEMA_V1 } from "./schema.js";
|
|
3
|
+
/**
|
|
4
|
+
* The usage store's schema versions.
|
|
5
|
+
*
|
|
6
|
+
* This is a **fifth hand-owned version**, and the first in this project that is
|
|
7
|
+
* migrated rather than discarded. `CACHE_VERSION` in the old JSON shard store
|
|
8
|
+
* and the one in `src/url-cache.ts` are private and self-invalidating: a
|
|
9
|
+
* mismatch throws the file away and costs a re-parse. This one cannot work that
|
|
10
|
+
* way. Once `archive run --include transcripts` has run and the source logs are
|
|
11
|
+
* pruned, the database is the only surviving record of that usage, so a version
|
|
12
|
+
* bump has to carry the data forward.
|
|
13
|
+
*
|
|
14
|
+
* That makes the rules different, and they are worth stating:
|
|
15
|
+
*
|
|
16
|
+
* - **Never edit a shipped migration.** A database in the field has already run
|
|
17
|
+
* it; changing it means two databases claim the same version with different
|
|
18
|
+
* shapes. Add a new one instead.
|
|
19
|
+
* - **A migration must be able to run on real data**, not just on an empty file.
|
|
20
|
+
* - **A database from the future is refused, not guessed at.** A newer `cairn`
|
|
21
|
+
* may have written columns this build knows nothing about, and opening it
|
|
22
|
+
* read-write risks dropping them on the next write.
|
|
23
|
+
*
|
|
24
|
+
* `PRAGMA user_version` is the store, because SQLite keeps it in the file header
|
|
25
|
+
* where it costs no table and cannot itself need migrating.
|
|
26
|
+
*/
|
|
27
|
+
export const MIGRATIONS = [
|
|
28
|
+
{
|
|
29
|
+
version: 1,
|
|
30
|
+
description: "Initial schema: files, events, and the materialized day rollup",
|
|
31
|
+
up(db) {
|
|
32
|
+
db.exec(SCHEMA_V1);
|
|
33
|
+
},
|
|
34
|
+
},
|
|
35
|
+
];
|
|
36
|
+
/** The version a database this build writes ends up at. */
|
|
37
|
+
export const LATEST_VERSION = latestVersion(MIGRATIONS);
|
|
38
|
+
//# sourceMappingURL=migrations.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"migrations.js","sourceRoot":"","sources":["../../../src/usage/db/migrations.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAExC;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,MAAM,CAAC,MAAM,UAAU,GAAyB;IAC9C;QACE,OAAO,EAAE,CAAC;QACV,WAAW,EAAE,gEAAgE;QAC7E,EAAE,CAAC,EAAE;YACH,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACrB,CAAC;KACF;CACF,CAAC;AAEF,2DAA2D;AAC3D,MAAM,CAAC,MAAM,cAAc,GAAW,aAAa,CAAC,UAAU,CAAC,CAAC"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import type { StoreHandle } from "../../sqlite-store.js";
|
|
2
|
+
import { StoreTooNewError } from "../../sqlite-store.js";
|
|
3
|
+
/**
|
|
4
|
+
* Where the usage store lives.
|
|
5
|
+
*
|
|
6
|
+
* `XDG_DATA_HOME`, not `XDG_CACHE_HOME`. The JSON shard store this replaced was
|
|
7
|
+
* a cache — losing it cost a re-parse and nothing else. This is data: once
|
|
8
|
+
* transcripts have been archived and pruned, it is the only record of that usage
|
|
9
|
+
* left on the machine, and a cache directory is somewhere tools are entitled to
|
|
10
|
+
* delete without asking.
|
|
11
|
+
*/
|
|
12
|
+
export declare function getUsageDatabasePath(env?: NodeJS.ProcessEnv, homedir?: string): string;
|
|
13
|
+
export { StoreTooNewError as DatabaseTooNewError } from "../../sqlite-store.js";
|
|
14
|
+
export interface OpenOptions {
|
|
15
|
+
path: string;
|
|
16
|
+
/** Open without migrating, and refuse to create. For readers and status. */
|
|
17
|
+
readOnly?: boolean;
|
|
18
|
+
/**
|
|
19
|
+
* Apply pending migrations. Default true. When false, an out-of-date store
|
|
20
|
+
* opens as-is, which is what `usage migrate --check` needs.
|
|
21
|
+
*/
|
|
22
|
+
migrate?: boolean;
|
|
23
|
+
}
|
|
24
|
+
export type OpenResult = StoreHandle;
|
|
25
|
+
/**
|
|
26
|
+
* Opens the usage store, migrating it forward.
|
|
27
|
+
*
|
|
28
|
+
* The mechanics live in `src/sqlite-store.ts`, shared with the archive index;
|
|
29
|
+
* what belongs here is only which migrations apply and what the thing is called
|
|
30
|
+
* when something goes wrong.
|
|
31
|
+
*/
|
|
32
|
+
export declare function openUsageDatabase(options: OpenOptions): OpenResult;
|
|
33
|
+
export { StoreTooNewError };
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import os from "node:os";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { openStore, StoreTooNewError } from "../../sqlite-store.js";
|
|
4
|
+
import { MIGRATIONS } from "./migrations.js";
|
|
5
|
+
/**
|
|
6
|
+
* Where the usage store lives.
|
|
7
|
+
*
|
|
8
|
+
* `XDG_DATA_HOME`, not `XDG_CACHE_HOME`. The JSON shard store this replaced was
|
|
9
|
+
* a cache — losing it cost a re-parse and nothing else. This is data: once
|
|
10
|
+
* transcripts have been archived and pruned, it is the only record of that usage
|
|
11
|
+
* left on the machine, and a cache directory is somewhere tools are entitled to
|
|
12
|
+
* delete without asking.
|
|
13
|
+
*/
|
|
14
|
+
export function getUsageDatabasePath(env = process.env, homedir = os.homedir()) {
|
|
15
|
+
const configured = env.XDG_DATA_HOME?.trim();
|
|
16
|
+
const base = configured ? configured : path.join(homedir, ".local", "share");
|
|
17
|
+
return path.join(base, "cairn", "usage.db");
|
|
18
|
+
}
|
|
19
|
+
export { StoreTooNewError as DatabaseTooNewError } from "../../sqlite-store.js";
|
|
20
|
+
/**
|
|
21
|
+
* Opens the usage store, migrating it forward.
|
|
22
|
+
*
|
|
23
|
+
* The mechanics live in `src/sqlite-store.ts`, shared with the archive index;
|
|
24
|
+
* what belongs here is only which migrations apply and what the thing is called
|
|
25
|
+
* when something goes wrong.
|
|
26
|
+
*/
|
|
27
|
+
export function openUsageDatabase(options) {
|
|
28
|
+
return openStore({
|
|
29
|
+
path: options.path,
|
|
30
|
+
migrations: MIGRATIONS,
|
|
31
|
+
label: "usage database",
|
|
32
|
+
...(options.readOnly === true ? { readOnly: true } : {}),
|
|
33
|
+
...(options.migrate === false ? { migrate: false } : {}),
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
export { StoreTooNewError };
|
|
37
|
+
//# sourceMappingURL=open.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"open.js","sourceRoot":"","sources":["../../../src/usage/db/open.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACpE,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAE7C;;;;;;;;GAQG;AACH,MAAM,UAAU,oBAAoB,CAClC,MAAyB,OAAO,CAAC,GAAG,EACpC,UAAkB,EAAE,CAAC,OAAO,EAAE;IAE9B,MAAM,UAAU,GAAG,GAAG,CAAC,aAAa,EAAE,IAAI,EAAE,CAAC;IAC7C,MAAM,IAAI,GAAG,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;IAC7E,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,UAAU,CAAC,CAAC;AAC9C,CAAC;AAED,OAAO,EAAE,gBAAgB,IAAI,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAehF;;;;;;GAMG;AACH,MAAM,UAAU,iBAAiB,CAAC,OAAoB;IACpD,OAAO,SAAS,CAAC;QACf,IAAI,EAAE,OAAO,CAAC,IAAI;QAClB,UAAU,EAAE,UAAU;QACtB,KAAK,EAAE,gBAAgB;QACvB,GAAG,CAAC,OAAO,CAAC,QAAQ,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACxD,GAAG,CAAC,OAAO,CAAC,OAAO,KAAK,KAAK,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACzD,CAAC,CAAC;AACL,CAAC;AAED,OAAO,EAAE,gBAAgB,EAAE,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The usage store's tables.
|
|
3
|
+
*
|
|
4
|
+
* Two grains live here on purpose. `event` is the per-occurrence decomposition —
|
|
5
|
+
* roughly 2.5M rows over a full corpus — and answers anything sub-day,
|
|
6
|
+
* per-turn, or sequential. The `day*` tables are a materialized rollup of those
|
|
7
|
+
* same events, about 82k rows, and are what every report that exists today
|
|
8
|
+
* reads: keeping them means a rollup never scans the event table, and means the
|
|
9
|
+
* reports produce byte-identical output to the JSON shard cache they replaced,
|
|
10
|
+
* because they are fed the same `DayBucket` shape from the same numbers.
|
|
11
|
+
*
|
|
12
|
+
* Writing both is cheap. Deriving the buckets from `event` at query time instead
|
|
13
|
+
* would make every report pay for a grain it does not use, and deriving them at
|
|
14
|
+
* import time from anything but the provider's own bucket would risk the two
|
|
15
|
+
* disagreeing — see `tests/unit/usage-events.test.ts`, which is what pins them
|
|
16
|
+
* together.
|
|
17
|
+
*/
|
|
18
|
+
export declare const SCHEMA_V1 = "\nCREATE TABLE meta(\n key TEXT PRIMARY KEY,\n value TEXT NOT NULL\n);\n\nCREATE TABLE file(\n id INTEGER PRIMARY KEY,\n provider TEXT NOT NULL,\n relative TEXT NOT NULL,\n path TEXT NOT NULL,\n size INTEGER NOT NULL,\n mtime_ms REAL NOT NULL,\n session_id TEXT NOT NULL,\n kind TEXT NOT NULL,\n parent_session_id TEXT,\n agent_id TEXT,\n agent_type TEXT,\n agent_path TEXT,\n spawn_depth INTEGER,\n project TEXT NOT NULL,\n title TEXT,\n git_branch TEXT,\n tool_version TEXT,\n first_ts TEXT NOT NULL,\n last_ts TEXT NOT NULL,\n malformed_lines INTEGER NOT NULL DEFAULT 0,\n imported_at TEXT NOT NULL,\n UNIQUE(provider, relative)\n);\n\nCREATE TABLE event(\n id INTEGER PRIMARY KEY,\n file_id INTEGER NOT NULL REFERENCES file(id) ON DELETE CASCADE,\n ts TEXT NOT NULL,\n day TEXT NOT NULL,\n kind TEXT NOT NULL,\n model TEXT,\n tool TEXT,\n name TEXT,\n status TEXT,\n duration_ms INTEGER,\n depth INTEGER,\n input INTEGER,\n output INTEGER,\n cache_read INTEGER,\n cache_write INTEGER,\n cache_write_5m INTEGER,\n cache_write_1h INTEGER,\n thinking INTEGER,\n web_search INTEGER,\n web_fetch INTEGER,\n requests INTEGER\n);\n\nCREATE TABLE day(\n id INTEGER PRIMARY KEY,\n file_id INTEGER NOT NULL REFERENCES file(id) ON DELETE CASCADE,\n day TEXT NOT NULL,\n prompts INTEGER NOT NULL DEFAULT 0,\n errors INTEGER NOT NULL DEFAULT 0,\n compactions INTEGER NOT NULL DEFAULT 0,\n UNIQUE(file_id, day)\n);\n\nCREATE TABLE day_model(\n day_id INTEGER NOT NULL REFERENCES day(id) ON DELETE CASCADE,\n model TEXT NOT NULL,\n input INTEGER NOT NULL DEFAULT 0,\n output INTEGER NOT NULL DEFAULT 0,\n cache_read INTEGER NOT NULL DEFAULT 0,\n cache_write INTEGER NOT NULL DEFAULT 0,\n cache_write_5m INTEGER NOT NULL DEFAULT 0,\n cache_write_1h INTEGER NOT NULL DEFAULT 0,\n thinking INTEGER NOT NULL DEFAULT 0,\n web_search INTEGER NOT NULL DEFAULT 0,\n web_fetch INTEGER NOT NULL DEFAULT 0,\n requests INTEGER NOT NULL DEFAULT 0,\n PRIMARY KEY(day_id, model)\n);\n\nCREATE TABLE day_tool(\n day_id INTEGER NOT NULL REFERENCES day(id) ON DELETE CASCADE,\n tool TEXT NOT NULL,\n calls INTEGER NOT NULL DEFAULT 0,\n PRIMARY KEY(day_id, tool)\n);\n\nCREATE TABLE day_skill(\n day_id INTEGER NOT NULL REFERENCES day(id) ON DELETE CASCADE,\n skill TEXT NOT NULL,\n calls INTEGER NOT NULL DEFAULT 0,\n PRIMARY KEY(day_id, skill)\n);\n\nCREATE TABLE day_command(\n day_id INTEGER NOT NULL REFERENCES day(id) ON DELETE CASCADE,\n command TEXT NOT NULL,\n calls INTEGER NOT NULL DEFAULT 0,\n PRIMARY KEY(day_id, command)\n);\n\nCREATE TABLE day_agent(\n day_id INTEGER NOT NULL REFERENCES day(id) ON DELETE CASCADE,\n agent TEXT NOT NULL,\n count INTEGER NOT NULL DEFAULT 0,\n max_depth INTEGER NOT NULL DEFAULT 0,\n PRIMARY KEY(day_id, agent)\n);\n\nCREATE TABLE day_hook(\n day_id INTEGER NOT NULL REFERENCES day(id) ON DELETE CASCADE,\n hook TEXT NOT NULL,\n count INTEGER NOT NULL DEFAULT 0,\n failures INTEGER NOT NULL DEFAULT 0,\n cancelled INTEGER NOT NULL DEFAULT 0,\n total_ms INTEGER NOT NULL DEFAULT 0,\n max_ms INTEGER NOT NULL DEFAULT 0,\n PRIMARY KEY(day_id, hook)\n);\n\nCREATE INDEX file_provider_session ON file(provider, session_id);\nCREATE INDEX file_project ON file(project);\nCREATE INDEX file_kind ON file(provider, kind);\nCREATE INDEX day_file ON day(file_id);\nCREATE INDEX day_day ON day(day);\nCREATE INDEX event_file_ts ON event(file_id, ts);\nCREATE INDEX event_day_kind ON event(day, kind);\n";
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The usage store's tables.
|
|
3
|
+
*
|
|
4
|
+
* Two grains live here on purpose. `event` is the per-occurrence decomposition —
|
|
5
|
+
* roughly 2.5M rows over a full corpus — and answers anything sub-day,
|
|
6
|
+
* per-turn, or sequential. The `day*` tables are a materialized rollup of those
|
|
7
|
+
* same events, about 82k rows, and are what every report that exists today
|
|
8
|
+
* reads: keeping them means a rollup never scans the event table, and means the
|
|
9
|
+
* reports produce byte-identical output to the JSON shard cache they replaced,
|
|
10
|
+
* because they are fed the same `DayBucket` shape from the same numbers.
|
|
11
|
+
*
|
|
12
|
+
* Writing both is cheap. Deriving the buckets from `event` at query time instead
|
|
13
|
+
* would make every report pay for a grain it does not use, and deriving them at
|
|
14
|
+
* import time from anything but the provider's own bucket would risk the two
|
|
15
|
+
* disagreeing — see `tests/unit/usage-events.test.ts`, which is what pins them
|
|
16
|
+
* together.
|
|
17
|
+
*/
|
|
18
|
+
export const SCHEMA_V1 = `
|
|
19
|
+
CREATE TABLE meta(
|
|
20
|
+
key TEXT PRIMARY KEY,
|
|
21
|
+
value TEXT NOT NULL
|
|
22
|
+
);
|
|
23
|
+
|
|
24
|
+
CREATE TABLE file(
|
|
25
|
+
id INTEGER PRIMARY KEY,
|
|
26
|
+
provider TEXT NOT NULL,
|
|
27
|
+
relative TEXT NOT NULL,
|
|
28
|
+
path TEXT NOT NULL,
|
|
29
|
+
size INTEGER NOT NULL,
|
|
30
|
+
mtime_ms REAL NOT NULL,
|
|
31
|
+
session_id TEXT NOT NULL,
|
|
32
|
+
kind TEXT NOT NULL,
|
|
33
|
+
parent_session_id TEXT,
|
|
34
|
+
agent_id TEXT,
|
|
35
|
+
agent_type TEXT,
|
|
36
|
+
agent_path TEXT,
|
|
37
|
+
spawn_depth INTEGER,
|
|
38
|
+
project TEXT NOT NULL,
|
|
39
|
+
title TEXT,
|
|
40
|
+
git_branch TEXT,
|
|
41
|
+
tool_version TEXT,
|
|
42
|
+
first_ts TEXT NOT NULL,
|
|
43
|
+
last_ts TEXT NOT NULL,
|
|
44
|
+
malformed_lines INTEGER NOT NULL DEFAULT 0,
|
|
45
|
+
imported_at TEXT NOT NULL,
|
|
46
|
+
UNIQUE(provider, relative)
|
|
47
|
+
);
|
|
48
|
+
|
|
49
|
+
CREATE TABLE event(
|
|
50
|
+
id INTEGER PRIMARY KEY,
|
|
51
|
+
file_id INTEGER NOT NULL REFERENCES file(id) ON DELETE CASCADE,
|
|
52
|
+
ts TEXT NOT NULL,
|
|
53
|
+
day TEXT NOT NULL,
|
|
54
|
+
kind TEXT NOT NULL,
|
|
55
|
+
model TEXT,
|
|
56
|
+
tool TEXT,
|
|
57
|
+
name TEXT,
|
|
58
|
+
status TEXT,
|
|
59
|
+
duration_ms INTEGER,
|
|
60
|
+
depth INTEGER,
|
|
61
|
+
input INTEGER,
|
|
62
|
+
output INTEGER,
|
|
63
|
+
cache_read INTEGER,
|
|
64
|
+
cache_write INTEGER,
|
|
65
|
+
cache_write_5m INTEGER,
|
|
66
|
+
cache_write_1h INTEGER,
|
|
67
|
+
thinking INTEGER,
|
|
68
|
+
web_search INTEGER,
|
|
69
|
+
web_fetch INTEGER,
|
|
70
|
+
requests INTEGER
|
|
71
|
+
);
|
|
72
|
+
|
|
73
|
+
CREATE TABLE day(
|
|
74
|
+
id INTEGER PRIMARY KEY,
|
|
75
|
+
file_id INTEGER NOT NULL REFERENCES file(id) ON DELETE CASCADE,
|
|
76
|
+
day TEXT NOT NULL,
|
|
77
|
+
prompts INTEGER NOT NULL DEFAULT 0,
|
|
78
|
+
errors INTEGER NOT NULL DEFAULT 0,
|
|
79
|
+
compactions INTEGER NOT NULL DEFAULT 0,
|
|
80
|
+
UNIQUE(file_id, day)
|
|
81
|
+
);
|
|
82
|
+
|
|
83
|
+
CREATE TABLE day_model(
|
|
84
|
+
day_id INTEGER NOT NULL REFERENCES day(id) ON DELETE CASCADE,
|
|
85
|
+
model TEXT NOT NULL,
|
|
86
|
+
input INTEGER NOT NULL DEFAULT 0,
|
|
87
|
+
output INTEGER NOT NULL DEFAULT 0,
|
|
88
|
+
cache_read INTEGER NOT NULL DEFAULT 0,
|
|
89
|
+
cache_write INTEGER NOT NULL DEFAULT 0,
|
|
90
|
+
cache_write_5m INTEGER NOT NULL DEFAULT 0,
|
|
91
|
+
cache_write_1h INTEGER NOT NULL DEFAULT 0,
|
|
92
|
+
thinking INTEGER NOT NULL DEFAULT 0,
|
|
93
|
+
web_search INTEGER NOT NULL DEFAULT 0,
|
|
94
|
+
web_fetch INTEGER NOT NULL DEFAULT 0,
|
|
95
|
+
requests INTEGER NOT NULL DEFAULT 0,
|
|
96
|
+
PRIMARY KEY(day_id, model)
|
|
97
|
+
);
|
|
98
|
+
|
|
99
|
+
CREATE TABLE day_tool(
|
|
100
|
+
day_id INTEGER NOT NULL REFERENCES day(id) ON DELETE CASCADE,
|
|
101
|
+
tool TEXT NOT NULL,
|
|
102
|
+
calls INTEGER NOT NULL DEFAULT 0,
|
|
103
|
+
PRIMARY KEY(day_id, tool)
|
|
104
|
+
);
|
|
105
|
+
|
|
106
|
+
CREATE TABLE day_skill(
|
|
107
|
+
day_id INTEGER NOT NULL REFERENCES day(id) ON DELETE CASCADE,
|
|
108
|
+
skill TEXT NOT NULL,
|
|
109
|
+
calls INTEGER NOT NULL DEFAULT 0,
|
|
110
|
+
PRIMARY KEY(day_id, skill)
|
|
111
|
+
);
|
|
112
|
+
|
|
113
|
+
CREATE TABLE day_command(
|
|
114
|
+
day_id INTEGER NOT NULL REFERENCES day(id) ON DELETE CASCADE,
|
|
115
|
+
command TEXT NOT NULL,
|
|
116
|
+
calls INTEGER NOT NULL DEFAULT 0,
|
|
117
|
+
PRIMARY KEY(day_id, command)
|
|
118
|
+
);
|
|
119
|
+
|
|
120
|
+
CREATE TABLE day_agent(
|
|
121
|
+
day_id INTEGER NOT NULL REFERENCES day(id) ON DELETE CASCADE,
|
|
122
|
+
agent TEXT NOT NULL,
|
|
123
|
+
count INTEGER NOT NULL DEFAULT 0,
|
|
124
|
+
max_depth INTEGER NOT NULL DEFAULT 0,
|
|
125
|
+
PRIMARY KEY(day_id, agent)
|
|
126
|
+
);
|
|
127
|
+
|
|
128
|
+
CREATE TABLE day_hook(
|
|
129
|
+
day_id INTEGER NOT NULL REFERENCES day(id) ON DELETE CASCADE,
|
|
130
|
+
hook TEXT NOT NULL,
|
|
131
|
+
count INTEGER NOT NULL DEFAULT 0,
|
|
132
|
+
failures INTEGER NOT NULL DEFAULT 0,
|
|
133
|
+
cancelled INTEGER NOT NULL DEFAULT 0,
|
|
134
|
+
total_ms INTEGER NOT NULL DEFAULT 0,
|
|
135
|
+
max_ms INTEGER NOT NULL DEFAULT 0,
|
|
136
|
+
PRIMARY KEY(day_id, hook)
|
|
137
|
+
);
|
|
138
|
+
|
|
139
|
+
CREATE INDEX file_provider_session ON file(provider, session_id);
|
|
140
|
+
CREATE INDEX file_project ON file(project);
|
|
141
|
+
CREATE INDEX file_kind ON file(provider, kind);
|
|
142
|
+
CREATE INDEX day_file ON day(file_id);
|
|
143
|
+
CREATE INDEX day_day ON day(day);
|
|
144
|
+
CREATE INDEX event_file_ts ON event(file_id, ts);
|
|
145
|
+
CREATE INDEX event_day_kind ON event(day, kind);
|
|
146
|
+
`;
|
|
147
|
+
//# sourceMappingURL=schema.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../../../src/usage/db/schema.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,CAAC,MAAM,SAAS,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAgIxB,CAAC"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import type { SqliteDatabase, SqliteStatement } from "../../sqlite.js";
|
|
2
|
+
import type { FileAggregate, ParsedFile } from "../events.js";
|
|
3
|
+
export interface StoredFile {
|
|
4
|
+
id: number;
|
|
5
|
+
size: number;
|
|
6
|
+
mtimeMs: number;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Every transcript this provider already has a row for, keyed by its path
|
|
10
|
+
* relative to the log root — the same key the JSON shards used.
|
|
11
|
+
*/
|
|
12
|
+
export declare function storedFiles(db: SqliteDatabase, provider: string): Map<string, StoredFile>;
|
|
13
|
+
/** The prepared statements one import run reuses across every file it writes. */
|
|
14
|
+
export interface WriteStatements {
|
|
15
|
+
deleteFile: SqliteStatement;
|
|
16
|
+
insertFile: SqliteStatement;
|
|
17
|
+
insertEvent: SqliteStatement;
|
|
18
|
+
insertDay: SqliteStatement;
|
|
19
|
+
insertDayModel: SqliteStatement;
|
|
20
|
+
insertDayTool: SqliteStatement;
|
|
21
|
+
insertDaySkill: SqliteStatement;
|
|
22
|
+
insertDayCommand: SqliteStatement;
|
|
23
|
+
insertDayAgent: SqliteStatement;
|
|
24
|
+
insertDayHook: SqliteStatement;
|
|
25
|
+
}
|
|
26
|
+
export declare function prepareWrites(db: SqliteDatabase): WriteStatements;
|
|
27
|
+
/**
|
|
28
|
+
* Writes one parsed transcript, replacing any row it already had.
|
|
29
|
+
*
|
|
30
|
+
* The delete is what makes a re-import idempotent: `ON DELETE CASCADE` clears
|
|
31
|
+
* the file's events and day buckets, so a transcript that grew is rewritten
|
|
32
|
+
* whole rather than accumulating a second copy of everything it already held.
|
|
33
|
+
*/
|
|
34
|
+
export declare function writeParsedFile(statements: WriteStatements, parsed: ParsedFile, relative: string, importedAt: string, existingId?: number): void;
|
|
35
|
+
/**
|
|
36
|
+
* Drops rows for transcripts a complete walk did not find.
|
|
37
|
+
*
|
|
38
|
+
* Only ever called after a walk that looked at everything. A walk pruned by
|
|
39
|
+
* `--since` or `--no-subagents` has no evidence about the files it skipped, and
|
|
40
|
+
* deleting them would evict entries the next full import would have to re-parse
|
|
41
|
+
* from scratch — the invariant the JSON shard store called `partial`.
|
|
42
|
+
*/
|
|
43
|
+
export declare function deleteMissing(db: SqliteDatabase, provider: string, seen: ReadonlySet<string>): number;
|
|
44
|
+
export interface SelectFilter {
|
|
45
|
+
providers: readonly string[];
|
|
46
|
+
/** Inclusive day bounds, pushed down purely to narrow the row set. */
|
|
47
|
+
since?: string;
|
|
48
|
+
until?: string;
|
|
49
|
+
/** When false, subagent transcripts are left out of the walk entirely. */
|
|
50
|
+
subagents: boolean;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Hydrates the selection as `FileAggregate`s.
|
|
54
|
+
*
|
|
55
|
+
* The shape is exactly what the JSON shard store returned, so every rollup in
|
|
56
|
+
* `aggregate.ts` runs against it unchanged. Child tables are read with one query
|
|
57
|
+
* each rather than per file: the whole corpus is around 82k day rows, so seven
|
|
58
|
+
* scans cost less than the round trips a per-file query would make.
|
|
59
|
+
*/
|
|
60
|
+
export declare function selectFiles(db: SqliteDatabase, filter: SelectFilter): FileAggregate[];
|
|
61
|
+
export interface StoreStatus {
|
|
62
|
+
path: string;
|
|
63
|
+
present: boolean;
|
|
64
|
+
schemaVersion: number;
|
|
65
|
+
files: number;
|
|
66
|
+
days: number;
|
|
67
|
+
events: number;
|
|
68
|
+
bytes: number;
|
|
69
|
+
/** Most recent import as an ISO instant, or null when the store is empty. */
|
|
70
|
+
updatedAt: string | null;
|
|
71
|
+
/** Row counts per provider, so a caller can see what a store actually holds. */
|
|
72
|
+
providers: Record<string, number>;
|
|
73
|
+
}
|
|
74
|
+
export declare function storeStatus(db: SqliteDatabase): Omit<StoreStatus, "path" | "present" | "bytes">;
|
|
@@ -0,0 +1,280 @@
|
|
|
1
|
+
import { emptyBucket, emptyTokens, utcDay } from "../events.js";
|
|
2
|
+
/**
|
|
3
|
+
* Reading and writing the usage store.
|
|
4
|
+
*
|
|
5
|
+
* Nothing here decides *what* to import — that is `import.ts` — and nothing here
|
|
6
|
+
* filters by anything the pure helpers in `filter.ts` already own. SQL narrows
|
|
7
|
+
* the row set for speed; `clipToWindow` and `matchesProject` still decide
|
|
8
|
+
* membership, so the selection a report sees is defined by the same code that
|
|
9
|
+
* defined it when the store was a directory of JSON shards.
|
|
10
|
+
*/
|
|
11
|
+
/**
|
|
12
|
+
* `node:sqlite` rejects `undefined`, and every optional column here is optional
|
|
13
|
+
* because the provider genuinely had nothing to record.
|
|
14
|
+
*/
|
|
15
|
+
function bind(value) {
|
|
16
|
+
return value ?? null;
|
|
17
|
+
}
|
|
18
|
+
function text(value) {
|
|
19
|
+
return typeof value === "string" && value ? value : undefined;
|
|
20
|
+
}
|
|
21
|
+
function int(value) {
|
|
22
|
+
return typeof value === "number" ? value : 0;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Every transcript this provider already has a row for, keyed by its path
|
|
26
|
+
* relative to the log root — the same key the JSON shards used.
|
|
27
|
+
*/
|
|
28
|
+
export function storedFiles(db, provider) {
|
|
29
|
+
const rows = db
|
|
30
|
+
.prepare("SELECT id, relative, size, mtime_ms FROM file WHERE provider = ?")
|
|
31
|
+
.all(provider);
|
|
32
|
+
const found = new Map();
|
|
33
|
+
for (const row of rows) {
|
|
34
|
+
found.set(String(row.relative), {
|
|
35
|
+
id: Number(row.id),
|
|
36
|
+
size: Number(row.size),
|
|
37
|
+
mtimeMs: Number(row.mtime_ms),
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
return found;
|
|
41
|
+
}
|
|
42
|
+
export function prepareWrites(db) {
|
|
43
|
+
return {
|
|
44
|
+
deleteFile: db.prepare("DELETE FROM file WHERE id = ?"),
|
|
45
|
+
insertFile: db.prepare(`INSERT INTO file(provider, relative, path, size, mtime_ms, session_id, kind,
|
|
46
|
+
parent_session_id, agent_id, agent_type, agent_path, spawn_depth, project,
|
|
47
|
+
title, git_branch, tool_version, first_ts, last_ts, malformed_lines, imported_at)
|
|
48
|
+
VALUES(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)`),
|
|
49
|
+
insertEvent: db.prepare(`INSERT INTO event(file_id, ts, day, kind, model, tool, name, status, duration_ms, depth,
|
|
50
|
+
input, output, cache_read, cache_write, cache_write_5m, cache_write_1h,
|
|
51
|
+
thinking, web_search, web_fetch, requests)
|
|
52
|
+
VALUES(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)`),
|
|
53
|
+
insertDay: db.prepare("INSERT INTO day(file_id, day, prompts, errors, compactions) VALUES(?,?,?,?,?)"),
|
|
54
|
+
insertDayModel: db.prepare(`INSERT INTO day_model(day_id, model, input, output, cache_read, cache_write,
|
|
55
|
+
cache_write_5m, cache_write_1h, thinking, web_search, web_fetch, requests)
|
|
56
|
+
VALUES(?,?,?,?,?,?,?,?,?,?,?,?)`),
|
|
57
|
+
insertDayTool: db.prepare("INSERT INTO day_tool(day_id, tool, calls) VALUES(?,?,?)"),
|
|
58
|
+
insertDaySkill: db.prepare("INSERT INTO day_skill(day_id, skill, calls) VALUES(?,?,?)"),
|
|
59
|
+
insertDayCommand: db.prepare("INSERT INTO day_command(day_id, command, calls) VALUES(?,?,?)"),
|
|
60
|
+
insertDayAgent: db.prepare("INSERT INTO day_agent(day_id, agent, count, max_depth) VALUES(?,?,?,?)"),
|
|
61
|
+
insertDayHook: db.prepare(`INSERT INTO day_hook(day_id, hook, count, failures, cancelled, total_ms, max_ms)
|
|
62
|
+
VALUES(?,?,?,?,?,?,?)`),
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Writes one parsed transcript, replacing any row it already had.
|
|
67
|
+
*
|
|
68
|
+
* The delete is what makes a re-import idempotent: `ON DELETE CASCADE` clears
|
|
69
|
+
* the file's events and day buckets, so a transcript that grew is rewritten
|
|
70
|
+
* whole rather than accumulating a second copy of everything it already held.
|
|
71
|
+
*/
|
|
72
|
+
export function writeParsedFile(statements, parsed, relative, importedAt, existingId) {
|
|
73
|
+
if (existingId !== undefined)
|
|
74
|
+
statements.deleteFile.run(existingId);
|
|
75
|
+
const aggregate = parsed.aggregate;
|
|
76
|
+
const inserted = statements.insertFile.run(aggregate.provider, relative, aggregate.file, aggregate.size, aggregate.mtimeMs, aggregate.sessionId, aggregate.kind, bind(aggregate.parentSessionId), bind(aggregate.agentId), bind(aggregate.agentType), bind(aggregate.agentPath), bind(aggregate.spawnDepth), aggregate.project, bind(aggregate.title), bind(aggregate.gitBranch), bind(aggregate.toolVersion), aggregate.firstTs, aggregate.lastTs, aggregate.malformedLines, importedAt);
|
|
77
|
+
const fileId = Number(inserted.lastInsertRowid);
|
|
78
|
+
for (const event of parsed.events) {
|
|
79
|
+
const day = utcDay(event.ts);
|
|
80
|
+
if (!day)
|
|
81
|
+
continue;
|
|
82
|
+
const tokens = event.tokens;
|
|
83
|
+
statements.insertEvent.run(fileId, event.ts, day, event.kind, bind(event.model), bind(event.tool), bind(event.name), bind(event.status), bind(event.durationMs), bind(event.depth), bind(tokens?.input), bind(tokens?.output), bind(tokens?.cacheRead), bind(tokens?.cacheWrite), bind(tokens?.cacheWrite5m), bind(tokens?.cacheWrite1h), bind(tokens?.thinking), bind(tokens?.webSearch), bind(tokens?.webFetch), bind(tokens?.requests));
|
|
84
|
+
}
|
|
85
|
+
for (const [day, bucket] of Object.entries(aggregate.days)) {
|
|
86
|
+
const dayRow = statements.insertDay.run(fileId, day, bucket.prompts, bucket.errors, bucket.compactions);
|
|
87
|
+
const dayId = Number(dayRow.lastInsertRowid);
|
|
88
|
+
for (const [model, tokens] of Object.entries(bucket.models)) {
|
|
89
|
+
statements.insertDayModel.run(dayId, model, tokens.input, tokens.output, tokens.cacheRead, tokens.cacheWrite, tokens.cacheWrite5m, tokens.cacheWrite1h, tokens.thinking, tokens.webSearch, tokens.webFetch, tokens.requests);
|
|
90
|
+
}
|
|
91
|
+
for (const [tool, calls] of Object.entries(bucket.tools)) {
|
|
92
|
+
statements.insertDayTool.run(dayId, tool, calls);
|
|
93
|
+
}
|
|
94
|
+
for (const [skill, calls] of Object.entries(bucket.skills)) {
|
|
95
|
+
statements.insertDaySkill.run(dayId, skill, calls);
|
|
96
|
+
}
|
|
97
|
+
for (const [command, calls] of Object.entries(bucket.commands)) {
|
|
98
|
+
statements.insertDayCommand.run(dayId, command, calls);
|
|
99
|
+
}
|
|
100
|
+
for (const [agent, totals] of Object.entries(bucket.agents)) {
|
|
101
|
+
statements.insertDayAgent.run(dayId, agent, totals.count, totals.maxDepth);
|
|
102
|
+
}
|
|
103
|
+
for (const [hook, totals] of Object.entries(bucket.hooks)) {
|
|
104
|
+
statements.insertDayHook.run(dayId, hook, totals.count, totals.failures, totals.cancelled, totals.totalMs, totals.maxMs);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Drops rows for transcripts a complete walk did not find.
|
|
110
|
+
*
|
|
111
|
+
* Only ever called after a walk that looked at everything. A walk pruned by
|
|
112
|
+
* `--since` or `--no-subagents` has no evidence about the files it skipped, and
|
|
113
|
+
* deleting them would evict entries the next full import would have to re-parse
|
|
114
|
+
* from scratch — the invariant the JSON shard store called `partial`.
|
|
115
|
+
*/
|
|
116
|
+
export function deleteMissing(db, provider, seen) {
|
|
117
|
+
const rows = db.prepare("SELECT id, relative FROM file WHERE provider = ?").all(provider);
|
|
118
|
+
const remove = db.prepare("DELETE FROM file WHERE id = ?");
|
|
119
|
+
let removed = 0;
|
|
120
|
+
for (const row of rows) {
|
|
121
|
+
if (seen.has(String(row.relative)))
|
|
122
|
+
continue;
|
|
123
|
+
remove.run(Number(row.id));
|
|
124
|
+
removed += 1;
|
|
125
|
+
}
|
|
126
|
+
return removed;
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Hydrates the selection as `FileAggregate`s.
|
|
130
|
+
*
|
|
131
|
+
* The shape is exactly what the JSON shard store returned, so every rollup in
|
|
132
|
+
* `aggregate.ts` runs against it unchanged. Child tables are read with one query
|
|
133
|
+
* each rather than per file: the whole corpus is around 82k day rows, so seven
|
|
134
|
+
* scans cost less than the round trips a per-file query would make.
|
|
135
|
+
*/
|
|
136
|
+
export function selectFiles(db, filter) {
|
|
137
|
+
if (filter.providers.length === 0)
|
|
138
|
+
return [];
|
|
139
|
+
const placeholders = filter.providers.map(() => "?").join(",");
|
|
140
|
+
const conditions = [`f.provider IN (${placeholders})`];
|
|
141
|
+
const parameters = [...filter.providers];
|
|
142
|
+
if (!filter.subagents)
|
|
143
|
+
conditions.push("f.kind <> 'subagent'");
|
|
144
|
+
const fileRows = db
|
|
145
|
+
.prepare(`SELECT * FROM file f WHERE ${conditions.join(" AND ")} ORDER BY f.id`)
|
|
146
|
+
.all(...parameters);
|
|
147
|
+
const byId = new Map();
|
|
148
|
+
for (const row of fileRows) {
|
|
149
|
+
const id = Number(row.id);
|
|
150
|
+
byId.set(id, {
|
|
151
|
+
file: String(row.path),
|
|
152
|
+
size: Number(row.size),
|
|
153
|
+
mtimeMs: Number(row.mtime_ms),
|
|
154
|
+
provider: String(row.provider),
|
|
155
|
+
sessionId: String(row.session_id),
|
|
156
|
+
kind: String(row.kind),
|
|
157
|
+
...(text(row.parent_session_id) ? { parentSessionId: text(row.parent_session_id) } : {}),
|
|
158
|
+
...(text(row.agent_id) ? { agentId: text(row.agent_id) } : {}),
|
|
159
|
+
...(text(row.agent_type) ? { agentType: text(row.agent_type) } : {}),
|
|
160
|
+
...(text(row.agent_path) ? { agentPath: text(row.agent_path) } : {}),
|
|
161
|
+
...(typeof row.spawn_depth === "number" ? { spawnDepth: row.spawn_depth } : {}),
|
|
162
|
+
project: String(row.project),
|
|
163
|
+
...(text(row.title) ? { title: text(row.title) } : {}),
|
|
164
|
+
...(text(row.git_branch) ? { gitBranch: text(row.git_branch) } : {}),
|
|
165
|
+
...(text(row.tool_version) ? { toolVersion: text(row.tool_version) } : {}),
|
|
166
|
+
firstTs: String(row.first_ts),
|
|
167
|
+
lastTs: String(row.last_ts),
|
|
168
|
+
days: {},
|
|
169
|
+
malformedLines: Number(row.malformed_lines),
|
|
170
|
+
});
|
|
171
|
+
}
|
|
172
|
+
if (byId.size === 0)
|
|
173
|
+
return [];
|
|
174
|
+
const dayConditions = [...conditions];
|
|
175
|
+
const dayParameters = [...parameters];
|
|
176
|
+
if (filter.since) {
|
|
177
|
+
dayConditions.push("d.day >= ?");
|
|
178
|
+
dayParameters.push(filter.since);
|
|
179
|
+
}
|
|
180
|
+
if (filter.until) {
|
|
181
|
+
dayConditions.push("d.day <= ?");
|
|
182
|
+
dayParameters.push(filter.until);
|
|
183
|
+
}
|
|
184
|
+
const buckets = new Map();
|
|
185
|
+
const dayRows = db
|
|
186
|
+
.prepare(`SELECT d.id, d.file_id, d.day, d.prompts, d.errors, d.compactions
|
|
187
|
+
FROM day d JOIN file f ON f.id = d.file_id
|
|
188
|
+
WHERE ${dayConditions.join(" AND ")}`)
|
|
189
|
+
.all(...dayParameters);
|
|
190
|
+
for (const row of dayRows) {
|
|
191
|
+
const aggregate = byId.get(Number(row.file_id));
|
|
192
|
+
if (!aggregate)
|
|
193
|
+
continue;
|
|
194
|
+
const bucket = emptyBucket();
|
|
195
|
+
bucket.prompts = int(row.prompts);
|
|
196
|
+
bucket.errors = int(row.errors);
|
|
197
|
+
bucket.compactions = int(row.compactions);
|
|
198
|
+
aggregate.days[String(row.day)] = bucket;
|
|
199
|
+
buckets.set(Number(row.id), bucket);
|
|
200
|
+
}
|
|
201
|
+
if (buckets.size === 0)
|
|
202
|
+
return [...byId.values()];
|
|
203
|
+
const child = (table, columns) => db
|
|
204
|
+
.prepare(`SELECT c.day_id, ${columns}
|
|
205
|
+
FROM ${table} c
|
|
206
|
+
JOIN day d ON d.id = c.day_id
|
|
207
|
+
JOIN file f ON f.id = d.file_id
|
|
208
|
+
WHERE ${dayConditions.join(" AND ")}`)
|
|
209
|
+
.all(...dayParameters);
|
|
210
|
+
for (const row of child("day_model", `c.model, c.input, c.output, c.cache_read, c.cache_write, c.cache_write_5m,
|
|
211
|
+
c.cache_write_1h, c.thinking, c.web_search, c.web_fetch, c.requests`)) {
|
|
212
|
+
const bucket = buckets.get(Number(row.day_id));
|
|
213
|
+
if (!bucket)
|
|
214
|
+
continue;
|
|
215
|
+
bucket.models[String(row.model)] = {
|
|
216
|
+
...emptyTokens(),
|
|
217
|
+
input: int(row.input),
|
|
218
|
+
output: int(row.output),
|
|
219
|
+
cacheRead: int(row.cache_read),
|
|
220
|
+
cacheWrite: int(row.cache_write),
|
|
221
|
+
cacheWrite5m: int(row.cache_write_5m),
|
|
222
|
+
cacheWrite1h: int(row.cache_write_1h),
|
|
223
|
+
thinking: int(row.thinking),
|
|
224
|
+
webSearch: int(row.web_search),
|
|
225
|
+
webFetch: int(row.web_fetch),
|
|
226
|
+
requests: int(row.requests),
|
|
227
|
+
};
|
|
228
|
+
}
|
|
229
|
+
const counts = [
|
|
230
|
+
["day_tool", "tool", "tools"],
|
|
231
|
+
["day_skill", "skill", "skills"],
|
|
232
|
+
["day_command", "command", "commands"],
|
|
233
|
+
];
|
|
234
|
+
for (const [table, column, target] of counts) {
|
|
235
|
+
for (const row of child(table, `c.${column} AS key, c.calls`)) {
|
|
236
|
+
const bucket = buckets.get(Number(row.day_id));
|
|
237
|
+
if (!bucket)
|
|
238
|
+
continue;
|
|
239
|
+
bucket[target][String(row.key)] = int(row.calls);
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
for (const row of child("day_agent", "c.agent, c.count, c.max_depth")) {
|
|
243
|
+
const bucket = buckets.get(Number(row.day_id));
|
|
244
|
+
if (!bucket)
|
|
245
|
+
continue;
|
|
246
|
+
bucket.agents[String(row.agent)] = { count: int(row.count), maxDepth: int(row.max_depth) };
|
|
247
|
+
}
|
|
248
|
+
for (const row of child("day_hook", "c.hook, c.count, c.failures, c.cancelled, c.total_ms, c.max_ms")) {
|
|
249
|
+
const bucket = buckets.get(Number(row.day_id));
|
|
250
|
+
if (!bucket)
|
|
251
|
+
continue;
|
|
252
|
+
bucket.hooks[String(row.hook)] = {
|
|
253
|
+
count: int(row.count),
|
|
254
|
+
failures: int(row.failures),
|
|
255
|
+
cancelled: int(row.cancelled),
|
|
256
|
+
totalMs: int(row.total_ms),
|
|
257
|
+
maxMs: int(row.max_ms),
|
|
258
|
+
};
|
|
259
|
+
}
|
|
260
|
+
return [...byId.values()];
|
|
261
|
+
}
|
|
262
|
+
export function storeStatus(db) {
|
|
263
|
+
const one = (sql) => Number(db.prepare(sql).get()?.n ?? 0);
|
|
264
|
+
const providers = {};
|
|
265
|
+
for (const row of db
|
|
266
|
+
.prepare("SELECT provider, COUNT(*) AS n FROM file GROUP BY provider ORDER BY provider")
|
|
267
|
+
.all()) {
|
|
268
|
+
providers[String(row.provider)] = Number(row.n);
|
|
269
|
+
}
|
|
270
|
+
const updated = db.prepare("SELECT MAX(imported_at) AS at FROM file").get()?.at;
|
|
271
|
+
return {
|
|
272
|
+
schemaVersion: Number(db.prepare("PRAGMA user_version").get()?.user_version ?? 0),
|
|
273
|
+
files: one("SELECT COUNT(*) AS n FROM file"),
|
|
274
|
+
days: one("SELECT COUNT(*) AS n FROM day"),
|
|
275
|
+
events: one("SELECT COUNT(*) AS n FROM event"),
|
|
276
|
+
updatedAt: typeof updated === "string" ? updated : null,
|
|
277
|
+
providers,
|
|
278
|
+
};
|
|
279
|
+
}
|
|
280
|
+
//# sourceMappingURL=store.js.map
|