agent-bober 0.18.0 → 0.19.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/.claude-plugin/plugin.json +1 -1
- package/CHANGELOG.md +11 -0
- package/README.md +245 -6
- package/agents/bober-art-director.md +100 -0
- package/agents/bober-design-critic.md +114 -0
- package/agents/bober-frontend-builder.md +101 -0
- package/agents/bober-security-auditor.md +193 -0
- package/agents/bober-security-verifier.md +104 -0
- package/agents/bober-seo-strategist.md +144 -0
- package/agents/bober-seo-verifier.md +103 -0
- package/dist/calendar/calendar-egress.d.ts +26 -0
- package/dist/calendar/calendar-egress.d.ts.map +1 -0
- package/dist/calendar/calendar-egress.js +35 -0
- package/dist/calendar/calendar-egress.js.map +1 -0
- package/dist/calendar/calendar-token.d.ts +34 -0
- package/dist/calendar/calendar-token.d.ts.map +1 -0
- package/dist/calendar/calendar-token.js +56 -0
- package/dist/calendar/calendar-token.js.map +1 -0
- package/dist/calendar/connector.d.ts +22 -0
- package/dist/calendar/connector.d.ts.map +1 -0
- package/dist/calendar/connector.js +3 -0
- package/dist/calendar/connector.js.map +1 -0
- package/dist/calendar/finding-source.d.ts +20 -0
- package/dist/calendar/finding-source.d.ts.map +1 -0
- package/dist/calendar/finding-source.js +35 -0
- package/dist/calendar/finding-source.js.map +1 -0
- package/dist/calendar/google-connector.d.ts +65 -0
- package/dist/calendar/google-connector.d.ts.map +1 -0
- package/dist/calendar/google-connector.js +129 -0
- package/dist/calendar/google-connector.js.map +1 -0
- package/dist/calendar/ics-connector.d.ts +12 -0
- package/dist/calendar/ics-connector.d.ts.map +1 -0
- package/dist/calendar/ics-connector.js +48 -0
- package/dist/calendar/ics-connector.js.map +1 -0
- package/dist/calendar/proposal-gate.d.ts +84 -0
- package/dist/calendar/proposal-gate.d.ts.map +1 -0
- package/dist/calendar/proposal-gate.js +126 -0
- package/dist/calendar/proposal-gate.js.map +1 -0
- package/dist/calendar/slotter.d.ts +34 -0
- package/dist/calendar/slotter.d.ts.map +1 -0
- package/dist/calendar/slotter.js +196 -0
- package/dist/calendar/slotter.js.map +1 -0
- package/dist/calendar/types.d.ts +162 -0
- package/dist/calendar/types.d.ts.map +1 -0
- package/dist/calendar/types.js +28 -0
- package/dist/calendar/types.js.map +1 -0
- package/dist/chat/chat-session.d.ts +27 -0
- package/dist/chat/chat-session.d.ts.map +1 -1
- package/dist/chat/chat-session.js +101 -1
- package/dist/chat/chat-session.js.map +1 -1
- package/dist/chat/slash-commands.d.ts +6 -2
- package/dist/chat/slash-commands.d.ts.map +1 -1
- package/dist/chat/slash-commands.js +22 -2
- package/dist/chat/slash-commands.js.map +1 -1
- package/dist/chat/turn-classifier.d.ts +3 -0
- package/dist/chat/turn-classifier.d.ts.map +1 -1
- package/dist/chat/turn-classifier.js +7 -0
- package/dist/chat/turn-classifier.js.map +1 -1
- package/dist/cli/commands/calendar.d.ts +75 -0
- package/dist/cli/commands/calendar.d.ts.map +1 -0
- package/dist/cli/commands/calendar.js +203 -0
- package/dist/cli/commands/calendar.js.map +1 -0
- package/dist/cli/commands/do.d.ts +52 -0
- package/dist/cli/commands/do.d.ts.map +1 -0
- package/dist/cli/commands/do.js +216 -0
- package/dist/cli/commands/do.js.map +1 -0
- package/dist/cli/commands/hub.d.ts +29 -0
- package/dist/cli/commands/hub.d.ts.map +1 -0
- package/dist/cli/commands/hub.js +233 -0
- package/dist/cli/commands/hub.js.map +1 -0
- package/dist/cli/commands/medical.d.ts +25 -0
- package/dist/cli/commands/medical.d.ts.map +1 -1
- package/dist/cli/commands/medical.js +233 -0
- package/dist/cli/commands/medical.js.map +1 -1
- package/dist/cli/commands/research.d.ts +41 -0
- package/dist/cli/commands/research.d.ts.map +1 -0
- package/dist/cli/commands/research.js +313 -0
- package/dist/cli/commands/research.js.map +1 -0
- package/dist/cli/commands/security-audit.d.ts +89 -0
- package/dist/cli/commands/security-audit.d.ts.map +1 -0
- package/dist/cli/commands/security-audit.js +238 -0
- package/dist/cli/commands/security-audit.js.map +1 -0
- package/dist/cli/commands/task.d.ts +64 -0
- package/dist/cli/commands/task.d.ts.map +1 -0
- package/dist/cli/commands/task.js +422 -0
- package/dist/cli/commands/task.js.map +1 -0
- package/dist/cli/commands/telegram.d.ts +10 -0
- package/dist/cli/commands/telegram.d.ts.map +1 -0
- package/dist/cli/commands/telegram.js +44 -0
- package/dist/cli/commands/telegram.js.map +1 -0
- package/dist/cli/commands/vault.d.ts +40 -0
- package/dist/cli/commands/vault.d.ts.map +1 -0
- package/dist/cli/commands/vault.js +122 -0
- package/dist/cli/commands/vault.js.map +1 -0
- package/dist/cli/index.js +33 -0
- package/dist/cli/index.js.map +1 -1
- package/dist/config/role-providers.d.ts +15 -0
- package/dist/config/role-providers.d.ts.map +1 -1
- package/dist/config/role-providers.js +8 -1
- package/dist/config/role-providers.js.map +1 -1
- package/dist/config/schema.d.ts +3522 -171
- package/dist/config/schema.d.ts.map +1 -1
- package/dist/config/schema.js +405 -2
- package/dist/config/schema.js.map +1 -1
- package/dist/do-bridge/coding-promoter.d.ts +19 -0
- package/dist/do-bridge/coding-promoter.d.ts.map +1 -0
- package/dist/do-bridge/coding-promoter.js +43 -0
- package/dist/do-bridge/coding-promoter.js.map +1 -0
- package/dist/do-bridge/finding-port.d.ts +88 -0
- package/dist/do-bridge/finding-port.d.ts.map +1 -0
- package/dist/do-bridge/finding-port.js +95 -0
- package/dist/do-bridge/finding-port.js.map +1 -0
- package/dist/do-bridge/launcher.d.ts +55 -0
- package/dist/do-bridge/launcher.d.ts.map +1 -0
- package/dist/do-bridge/launcher.js +37 -0
- package/dist/do-bridge/launcher.js.map +1 -0
- package/dist/do-bridge/promote.d.ts +50 -0
- package/dist/do-bridge/promote.d.ts.map +1 -0
- package/dist/do-bridge/promote.js +116 -0
- package/dist/do-bridge/promote.js.map +1 -0
- package/dist/do-bridge/reconcile.d.ts +50 -0
- package/dist/do-bridge/reconcile.d.ts.map +1 -0
- package/dist/do-bridge/reconcile.js +70 -0
- package/dist/do-bridge/reconcile.js.map +1 -0
- package/dist/do-bridge/registry.d.ts +23 -0
- package/dist/do-bridge/registry.d.ts.map +1 -0
- package/dist/do-bridge/registry.js +42 -0
- package/dist/do-bridge/registry.js.map +1 -0
- package/dist/do-bridge/types.d.ts +50 -0
- package/dist/do-bridge/types.d.ts.map +1 -0
- package/dist/do-bridge/types.js +17 -0
- package/dist/do-bridge/types.js.map +1 -0
- package/dist/fleet/child-config.d.ts.map +1 -1
- package/dist/fleet/child-config.js +7 -0
- package/dist/fleet/child-config.js.map +1 -1
- package/dist/fleet/coordinator.d.ts +27 -1
- package/dist/fleet/coordinator.d.ts.map +1 -1
- package/dist/fleet/coordinator.js +70 -0
- package/dist/fleet/coordinator.js.map +1 -1
- package/dist/fleet/critic-deep.d.ts +9 -1
- package/dist/fleet/critic-deep.d.ts.map +1 -1
- package/dist/fleet/critic-deep.js +5 -2
- package/dist/fleet/critic-deep.js.map +1 -1
- package/dist/fleet/decomposer-deep.d.ts +4 -11
- package/dist/fleet/decomposer-deep.d.ts.map +1 -1
- package/dist/fleet/decomposer-deep.js +5 -5
- package/dist/fleet/decomposer-deep.js.map +1 -1
- package/dist/fleet/index.d.ts +9 -0
- package/dist/fleet/index.d.ts.map +1 -1
- package/dist/fleet/index.js +87 -8
- package/dist/fleet/index.js.map +1 -1
- package/dist/fleet/manifest.d.ts +26 -0
- package/dist/fleet/manifest.d.ts.map +1 -1
- package/dist/fleet/manifest.js +8 -0
- package/dist/fleet/manifest.js.map +1 -1
- package/dist/fleet/reporter.d.ts +4 -1
- package/dist/fleet/reporter.d.ts.map +1 -1
- package/dist/fleet/reporter.js +2 -1
- package/dist/fleet/reporter.js.map +1 -1
- package/dist/fleet/scaffolder.d.ts +5 -1
- package/dist/fleet/scaffolder.d.ts.map +1 -1
- package/dist/fleet/scaffolder.js +11 -2
- package/dist/fleet/scaffolder.js.map +1 -1
- package/dist/graph/client.d.ts.map +1 -1
- package/dist/graph/client.js +115 -23
- package/dist/graph/client.js.map +1 -1
- package/dist/graph/mcp-client.d.ts +1 -0
- package/dist/graph/mcp-client.d.ts.map +1 -1
- package/dist/graph/mcp-client.js +58 -7
- package/dist/graph/mcp-client.js.map +1 -1
- package/dist/hub/collector.d.ts +12 -0
- package/dist/hub/collector.d.ts.map +1 -0
- package/dist/hub/collector.js +36 -0
- package/dist/hub/collector.js.map +1 -0
- package/dist/hub/finding-source.d.ts +22 -0
- package/dist/hub/finding-source.d.ts.map +1 -0
- package/dist/hub/finding-source.js +41 -0
- package/dist/hub/finding-source.js.map +1 -0
- package/dist/hub/finding-store.d.ts +68 -0
- package/dist/hub/finding-store.d.ts.map +1 -0
- package/dist/hub/finding-store.js +122 -0
- package/dist/hub/finding-store.js.map +1 -0
- package/dist/hub/finding.d.ts +54 -0
- package/dist/hub/finding.d.ts.map +1 -0
- package/dist/hub/finding.js +24 -0
- package/dist/hub/finding.js.map +1 -0
- package/dist/hub/gmail-to-task.d.ts +69 -0
- package/dist/hub/gmail-to-task.d.ts.map +1 -0
- package/dist/hub/gmail-to-task.js +102 -0
- package/dist/hub/gmail-to-task.js.map +1 -0
- package/dist/hub/hub-config.d.ts +18 -0
- package/dist/hub/hub-config.d.ts.map +1 -0
- package/dist/hub/hub-config.js +40 -0
- package/dist/hub/hub-config.js.map +1 -0
- package/dist/hub/judge.d.ts +30 -0
- package/dist/hub/judge.d.ts.map +1 -0
- package/dist/hub/judge.js +177 -0
- package/dist/hub/judge.js.map +1 -0
- package/dist/hub/lenses.d.ts +60 -0
- package/dist/hub/lenses.d.ts.map +1 -0
- package/dist/hub/lenses.js +123 -0
- package/dist/hub/lenses.js.map +1 -0
- package/dist/hub/priority-md.d.ts +21 -0
- package/dist/hub/priority-md.d.ts.map +1 -0
- package/dist/hub/priority-md.js +64 -0
- package/dist/hub/priority-md.js.map +1 -0
- package/dist/hub/repo-resolver.d.ts +11 -0
- package/dist/hub/repo-resolver.d.ts.map +1 -0
- package/dist/hub/repo-resolver.js +39 -0
- package/dist/hub/repo-resolver.js.map +1 -0
- package/dist/hub/scope.d.ts +39 -0
- package/dist/hub/scope.d.ts.map +1 -0
- package/dist/hub/scope.js +62 -0
- package/dist/hub/scope.js.map +1 -0
- package/dist/hub/task-inbox.d.ts +16 -0
- package/dist/hub/task-inbox.d.ts.map +1 -0
- package/dist/hub/task-inbox.js +39 -0
- package/dist/hub/task-inbox.js.map +1 -0
- package/dist/incident/resolution-verify.d.ts +2 -2
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -1
- package/dist/index.js.map +1 -1
- package/dist/medical/adapters/apple-health.js +1 -1
- package/dist/medical/adapters/apple-health.js.map +1 -1
- package/dist/medical/analysis/cadence.d.ts +32 -0
- package/dist/medical/analysis/cadence.d.ts.map +1 -0
- package/dist/medical/analysis/cadence.js +72 -0
- package/dist/medical/analysis/cadence.js.map +1 -0
- package/dist/medical/analysis/cross-marker.d.ts +33 -0
- package/dist/medical/analysis/cross-marker.d.ts.map +1 -0
- package/dist/medical/analysis/cross-marker.js +79 -0
- package/dist/medical/analysis/cross-marker.js.map +1 -0
- package/dist/medical/analysis/finding-writer.d.ts +26 -0
- package/dist/medical/analysis/finding-writer.d.ts.map +1 -0
- package/dist/medical/analysis/finding-writer.js +60 -0
- package/dist/medical/analysis/finding-writer.js.map +1 -0
- package/dist/medical/analysis/finding.d.ts +63 -0
- package/dist/medical/analysis/finding.d.ts.map +1 -0
- package/dist/medical/analysis/finding.js +70 -0
- package/dist/medical/analysis/finding.js.map +1 -0
- package/dist/medical/analysis/review-pass.d.ts +76 -0
- package/dist/medical/analysis/review-pass.d.ts.map +1 -0
- package/dist/medical/analysis/review-pass.js +119 -0
- package/dist/medical/analysis/review-pass.js.map +1 -0
- package/dist/medical/analysis/trends.d.ts +36 -0
- package/dist/medical/analysis/trends.d.ts.map +1 -0
- package/dist/medical/analysis/trends.js +157 -0
- package/dist/medical/analysis/trends.js.map +1 -0
- package/dist/medical/health-store.d.ts +5 -0
- package/dist/medical/health-store.d.ts.map +1 -1
- package/dist/medical/health-store.js +10 -0
- package/dist/medical/health-store.js.map +1 -1
- package/dist/medical/lab-note.d.ts +72 -0
- package/dist/medical/lab-note.d.ts.map +1 -0
- package/dist/medical/lab-note.js +161 -0
- package/dist/medical/lab-note.js.map +1 -0
- package/dist/medical/lab-pdf-parser.d.ts +19 -0
- package/dist/medical/lab-pdf-parser.d.ts.map +1 -0
- package/dist/medical/lab-pdf-parser.js +57 -0
- package/dist/medical/lab-pdf-parser.js.map +1 -0
- package/dist/medical/lab-reindex.d.ts +24 -0
- package/dist/medical/lab-reindex.d.ts.map +1 -0
- package/dist/medical/lab-reindex.js +45 -0
- package/dist/medical/lab-reindex.js.map +1 -0
- package/dist/medical/lab-types.d.ts +75 -0
- package/dist/medical/lab-types.d.ts.map +1 -0
- package/dist/medical/lab-types.js +17 -0
- package/dist/medical/lab-types.js.map +1 -0
- package/dist/medical/profile.d.ts +96 -0
- package/dist/medical/profile.d.ts.map +1 -0
- package/dist/medical/profile.js +273 -0
- package/dist/medical/profile.js.map +1 -0
- package/dist/medical/recommend/context.d.ts +48 -0
- package/dist/medical/recommend/context.d.ts.map +1 -0
- package/dist/medical/recommend/context.js +109 -0
- package/dist/medical/recommend/context.js.map +1 -0
- package/dist/medical/recommend/judge-panel.d.ts +49 -0
- package/dist/medical/recommend/judge-panel.d.ts.map +1 -0
- package/dist/medical/recommend/judge-panel.js +164 -0
- package/dist/medical/recommend/judge-panel.js.map +1 -0
- package/dist/medical/recommend/lenses.d.ts +72 -0
- package/dist/medical/recommend/lenses.d.ts.map +1 -0
- package/dist/medical/recommend/lenses.js +220 -0
- package/dist/medical/recommend/lenses.js.map +1 -0
- package/dist/medical/recommend/recommend.d.ts +86 -0
- package/dist/medical/recommend/recommend.d.ts.map +1 -0
- package/dist/medical/recommend/recommend.js +211 -0
- package/dist/medical/recommend/recommend.js.map +1 -0
- package/dist/medical/recommend/types.d.ts +98 -0
- package/dist/medical/recommend/types.d.ts.map +1 -0
- package/dist/medical/recommend/types.js +20 -0
- package/dist/medical/recommend/types.js.map +1 -0
- package/dist/medical/recommend/urgency.d.ts +26 -0
- package/dist/medical/recommend/urgency.d.ts.map +1 -0
- package/dist/medical/recommend/urgency.js +124 -0
- package/dist/medical/recommend/urgency.js.map +1 -0
- package/dist/medical/research/online-research.d.ts +65 -0
- package/dist/medical/research/online-research.d.ts.map +1 -0
- package/dist/medical/research/online-research.js +101 -0
- package/dist/medical/research/online-research.js.map +1 -0
- package/dist/medical/research/research-note.d.ts +32 -0
- package/dist/medical/research/research-note.d.ts.map +1 -0
- package/dist/medical/research/research-note.js +55 -0
- package/dist/medical/research/research-note.js.map +1 -0
- package/dist/medical/supplements.d.ts +82 -0
- package/dist/medical/supplements.d.ts.map +1 -0
- package/dist/medical/supplements.js +173 -0
- package/dist/medical/supplements.js.map +1 -0
- package/dist/orchestrator/agentic-loop.d.ts +160 -1
- package/dist/orchestrator/agentic-loop.d.ts.map +1 -1
- package/dist/orchestrator/agentic-loop.js +350 -41
- package/dist/orchestrator/agentic-loop.js.map +1 -1
- package/dist/orchestrator/compaction.d.ts +47 -0
- package/dist/orchestrator/compaction.d.ts.map +1 -0
- package/dist/orchestrator/compaction.js +75 -0
- package/dist/orchestrator/compaction.js.map +1 -0
- package/dist/orchestrator/generator-agent.d.ts +19 -0
- package/dist/orchestrator/generator-agent.d.ts.map +1 -1
- package/dist/orchestrator/generator-agent.js +27 -1
- package/dist/orchestrator/generator-agent.js.map +1 -1
- package/dist/orchestrator/loop-events.d.ts +98 -0
- package/dist/orchestrator/loop-events.d.ts.map +1 -0
- package/dist/orchestrator/loop-events.js +2 -0
- package/dist/orchestrator/loop-events.js.map +1 -0
- package/dist/orchestrator/model-resolver.d.ts.map +1 -1
- package/dist/orchestrator/model-resolver.js +10 -6
- package/dist/orchestrator/model-resolver.js.map +1 -1
- package/dist/orchestrator/pipeline.d.ts +10 -1
- package/dist/orchestrator/pipeline.d.ts.map +1 -1
- package/dist/orchestrator/pipeline.js +102 -4
- package/dist/orchestrator/pipeline.js.map +1 -1
- package/dist/orchestrator/security-audit-types.d.ts +53 -0
- package/dist/orchestrator/security-audit-types.d.ts.map +1 -0
- package/dist/orchestrator/security-audit-types.js +10 -0
- package/dist/orchestrator/security-audit-types.js.map +1 -0
- package/dist/orchestrator/security-auditor-agent.d.ts +68 -0
- package/dist/orchestrator/security-auditor-agent.d.ts.map +1 -0
- package/dist/orchestrator/security-auditor-agent.js +482 -0
- package/dist/orchestrator/security-auditor-agent.js.map +1 -0
- package/dist/orchestrator/security-gate.d.ts +73 -0
- package/dist/orchestrator/security-gate.d.ts.map +1 -0
- package/dist/orchestrator/security-gate.js +174 -0
- package/dist/orchestrator/security-gate.js.map +1 -0
- package/dist/orchestrator/security-hub.d.ts +45 -0
- package/dist/orchestrator/security-hub.d.ts.map +1 -0
- package/dist/orchestrator/security-hub.js +147 -0
- package/dist/orchestrator/security-hub.js.map +1 -0
- package/dist/orchestrator/security-knowledge/benchmark/harness.d.ts +43 -0
- package/dist/orchestrator/security-knowledge/benchmark/harness.d.ts.map +1 -0
- package/dist/orchestrator/security-knowledge/benchmark/harness.js +13 -0
- package/dist/orchestrator/security-knowledge/benchmark/harness.js.map +1 -0
- package/dist/orchestrator/security-knowledge/diff-provider.d.ts +79 -0
- package/dist/orchestrator/security-knowledge/diff-provider.d.ts.map +1 -0
- package/dist/orchestrator/security-knowledge/diff-provider.js +320 -0
- package/dist/orchestrator/security-knowledge/diff-provider.js.map +1 -0
- package/dist/orchestrator/security-knowledge/index.d.ts +22 -0
- package/dist/orchestrator/security-knowledge/index.d.ts.map +1 -0
- package/dist/orchestrator/security-knowledge/index.js +66 -0
- package/dist/orchestrator/security-knowledge/index.js.map +1 -0
- package/dist/orchestrator/security-knowledge/parser.d.ts +9 -0
- package/dist/orchestrator/security-knowledge/parser.d.ts.map +1 -0
- package/dist/orchestrator/security-knowledge/parser.js +137 -0
- package/dist/orchestrator/security-knowledge/parser.js.map +1 -0
- package/dist/orchestrator/security-knowledge/registry.d.ts +25 -0
- package/dist/orchestrator/security-knowledge/registry.d.ts.map +1 -0
- package/dist/orchestrator/security-knowledge/registry.js +114 -0
- package/dist/orchestrator/security-knowledge/registry.js.map +1 -0
- package/dist/orchestrator/security-knowledge/resolver.d.ts +48 -0
- package/dist/orchestrator/security-knowledge/resolver.d.ts.map +1 -0
- package/dist/orchestrator/security-knowledge/resolver.js +63 -0
- package/dist/orchestrator/security-knowledge/resolver.js.map +1 -0
- package/dist/orchestrator/security-knowledge/selector.d.ts +18 -0
- package/dist/orchestrator/security-knowledge/selector.d.ts.map +1 -0
- package/dist/orchestrator/security-knowledge/selector.js +46 -0
- package/dist/orchestrator/security-knowledge/selector.js.map +1 -0
- package/dist/orchestrator/security-knowledge/signature.d.ts +37 -0
- package/dist/orchestrator/security-knowledge/signature.d.ts.map +1 -0
- package/dist/orchestrator/security-knowledge/signature.js +2 -0
- package/dist/orchestrator/security-knowledge/signature.js.map +1 -0
- package/dist/orchestrator/security-knowledge/supply-chain-inspector.d.ts +29 -0
- package/dist/orchestrator/security-knowledge/supply-chain-inspector.d.ts.map +1 -0
- package/dist/orchestrator/security-knowledge/supply-chain-inspector.js +211 -0
- package/dist/orchestrator/security-knowledge/supply-chain-inspector.js.map +1 -0
- package/dist/orchestrator/security-scanners.d.ts +126 -0
- package/dist/orchestrator/security-scanners.d.ts.map +1 -0
- package/dist/orchestrator/security-scanners.js +501 -0
- package/dist/orchestrator/security-scanners.js.map +1 -0
- package/dist/orchestrator/security-verifier-agent.d.ts +62 -0
- package/dist/orchestrator/security-verifier-agent.d.ts.map +1 -0
- package/dist/orchestrator/security-verifier-agent.js +230 -0
- package/dist/orchestrator/security-verifier-agent.js.map +1 -0
- package/dist/orchestrator/session-store.d.ts +95 -0
- package/dist/orchestrator/session-store.d.ts.map +1 -0
- package/dist/orchestrator/session-store.js +186 -0
- package/dist/orchestrator/session-store.js.map +1 -0
- package/dist/orchestrator/stack-knowledge.d.ts +17 -0
- package/dist/orchestrator/stack-knowledge.d.ts.map +1 -0
- package/dist/orchestrator/stack-knowledge.js +35 -0
- package/dist/orchestrator/stack-knowledge.js.map +1 -0
- package/dist/orchestrator/subagents.d.ts +62 -0
- package/dist/orchestrator/subagents.d.ts.map +1 -0
- package/dist/orchestrator/subagents.js +143 -0
- package/dist/orchestrator/subagents.js.map +1 -0
- package/dist/orchestrator/tools/executor.d.ts +68 -0
- package/dist/orchestrator/tools/executor.d.ts.map +1 -0
- package/dist/orchestrator/tools/executor.js +104 -0
- package/dist/orchestrator/tools/executor.js.map +1 -0
- package/dist/orchestrator/tools/mcp-bridge.d.ts +76 -0
- package/dist/orchestrator/tools/mcp-bridge.d.ts.map +1 -0
- package/dist/orchestrator/tools/mcp-bridge.js +154 -0
- package/dist/orchestrator/tools/mcp-bridge.js.map +1 -0
- package/dist/orchestrator/tools/schemas.d.ts.map +1 -1
- package/dist/orchestrator/tools/schemas.js +3 -0
- package/dist/orchestrator/tools/schemas.js.map +1 -1
- package/dist/orchestrator/workflow/budget.d.ts +24 -2
- package/dist/orchestrator/workflow/budget.d.ts.map +1 -1
- package/dist/orchestrator/workflow/budget.js +39 -1
- package/dist/orchestrator/workflow/budget.js.map +1 -1
- package/dist/orchestrator/workflow/engine.d.ts +1 -1
- package/dist/orchestrator/workflow/engine.d.ts.map +1 -1
- package/dist/orchestrator/workflow/selector.d.ts.map +1 -1
- package/dist/orchestrator/workflow/selector.js +10 -0
- package/dist/orchestrator/workflow/selector.js.map +1 -1
- package/dist/providers/anthropic.d.ts.map +1 -1
- package/dist/providers/anthropic.js +116 -26
- package/dist/providers/anthropic.js.map +1 -1
- package/dist/providers/claude-code.d.ts.map +1 -1
- package/dist/providers/claude-code.js +17 -0
- package/dist/providers/claude-code.js.map +1 -1
- package/dist/providers/cost-meter.d.ts +52 -0
- package/dist/providers/cost-meter.d.ts.map +1 -0
- package/dist/providers/cost-meter.js +81 -0
- package/dist/providers/cost-meter.js.map +1 -0
- package/dist/providers/factory.d.ts +6 -1
- package/dist/providers/factory.d.ts.map +1 -1
- package/dist/providers/factory.js +24 -5
- package/dist/providers/factory.js.map +1 -1
- package/dist/providers/google.d.ts.map +1 -1
- package/dist/providers/google.js +29 -0
- package/dist/providers/google.js.map +1 -1
- package/dist/providers/grounded-search.d.ts +128 -0
- package/dist/providers/grounded-search.d.ts.map +1 -0
- package/dist/providers/grounded-search.js +160 -0
- package/dist/providers/grounded-search.js.map +1 -0
- package/dist/providers/openai-compat.d.ts +15 -1
- package/dist/providers/openai-compat.d.ts.map +1 -1
- package/dist/providers/openai-compat.js +24 -0
- package/dist/providers/openai-compat.js.map +1 -1
- package/dist/providers/openai.d.ts +7 -0
- package/dist/providers/openai.d.ts.map +1 -1
- package/dist/providers/openai.js +95 -4
- package/dist/providers/openai.js.map +1 -1
- package/dist/providers/types.d.ts +88 -0
- package/dist/providers/types.d.ts.map +1 -1
- package/dist/research/cadence.d.ts +33 -0
- package/dist/research/cadence.d.ts.map +1 -0
- package/dist/research/cadence.js +55 -0
- package/dist/research/cadence.js.map +1 -0
- package/dist/research/digest.d.ts +80 -0
- package/dist/research/digest.d.ts.map +1 -0
- package/dist/research/digest.js +119 -0
- package/dist/research/digest.js.map +1 -0
- package/dist/research/egress.d.ts +28 -0
- package/dist/research/egress.d.ts.map +1 -0
- package/dist/research/egress.js +41 -0
- package/dist/research/egress.js.map +1 -0
- package/dist/research/job-store.d.ts +30 -0
- package/dist/research/job-store.d.ts.map +1 -0
- package/dist/research/job-store.js +100 -0
- package/dist/research/job-store.js.map +1 -0
- package/dist/research/model-diversity.d.ts +27 -0
- package/dist/research/model-diversity.d.ts.map +1 -0
- package/dist/research/model-diversity.js +52 -0
- package/dist/research/model-diversity.js.map +1 -0
- package/dist/research/note-writer.d.ts +36 -0
- package/dist/research/note-writer.d.ts.map +1 -0
- package/dist/research/note-writer.js +53 -0
- package/dist/research/note-writer.js.map +1 -0
- package/dist/research/online-retrieval.d.ts +27 -0
- package/dist/research/online-retrieval.d.ts.map +1 -0
- package/dist/research/online-retrieval.js +22 -0
- package/dist/research/online-retrieval.js.map +1 -0
- package/dist/research/runner.d.ts +80 -0
- package/dist/research/runner.d.ts.map +1 -0
- package/dist/research/runner.js +115 -0
- package/dist/research/runner.js.map +1 -0
- package/dist/research/scheduler.d.ts +61 -0
- package/dist/research/scheduler.d.ts.map +1 -0
- package/dist/research/scheduler.js +58 -0
- package/dist/research/scheduler.js.map +1 -0
- package/dist/research/types.d.ts +81 -0
- package/dist/research/types.d.ts.map +1 -0
- package/dist/research/types.js +57 -0
- package/dist/research/types.js.map +1 -0
- package/dist/seo/adapters/http.d.ts +43 -0
- package/dist/seo/adapters/http.d.ts.map +1 -0
- package/dist/seo/adapters/http.js +35 -0
- package/dist/seo/adapters/http.js.map +1 -0
- package/dist/seo/ai-visibility-provider.d.ts +171 -0
- package/dist/seo/ai-visibility-provider.d.ts.map +1 -0
- package/dist/seo/ai-visibility-provider.js +165 -0
- package/dist/seo/ai-visibility-provider.js.map +1 -0
- package/dist/seo/ai-visibility-scorer.d.ts +43 -0
- package/dist/seo/ai-visibility-scorer.d.ts.map +1 -0
- package/dist/seo/ai-visibility-scorer.js +102 -0
- package/dist/seo/ai-visibility-scorer.js.map +1 -0
- package/dist/seo/analyzer.d.ts +58 -0
- package/dist/seo/analyzer.d.ts.map +1 -0
- package/dist/seo/analyzer.js +265 -0
- package/dist/seo/analyzer.js.map +1 -0
- package/dist/seo/benchmark/harness.d.ts +56 -0
- package/dist/seo/benchmark/harness.d.ts.map +1 -0
- package/dist/seo/benchmark/harness.js +172 -0
- package/dist/seo/benchmark/harness.js.map +1 -0
- package/dist/seo/builder/approved-finding.d.ts +115 -0
- package/dist/seo/builder/approved-finding.d.ts.map +1 -0
- package/dist/seo/builder/approved-finding.js +145 -0
- package/dist/seo/builder/approved-finding.js.map +1 -0
- package/dist/seo/builder/build-runner.d.ts +41 -0
- package/dist/seo/builder/build-runner.d.ts.map +1 -0
- package/dist/seo/builder/build-runner.js +156 -0
- package/dist/seo/builder/build-runner.js.map +1 -0
- package/dist/seo/builder/draft-generators.d.ts +32 -0
- package/dist/seo/builder/draft-generators.d.ts.map +1 -0
- package/dist/seo/builder/draft-generators.js +31 -0
- package/dist/seo/builder/draft-generators.js.map +1 -0
- package/dist/seo/builder/draft-store.d.ts +30 -0
- package/dist/seo/builder/draft-store.d.ts.map +1 -0
- package/dist/seo/builder/draft-store.js +76 -0
- package/dist/seo/builder/draft-store.js.map +1 -0
- package/dist/seo/builder/draft-types.d.ts +36 -0
- package/dist/seo/builder/draft-types.d.ts.map +1 -0
- package/dist/seo/builder/draft-types.js +14 -0
- package/dist/seo/builder/draft-types.js.map +1 -0
- package/dist/seo/builder/hub-approved-source.d.ts +11 -0
- package/dist/seo/builder/hub-approved-source.d.ts.map +1 -0
- package/dist/seo/builder/hub-approved-source.js +48 -0
- package/dist/seo/builder/hub-approved-source.js.map +1 -0
- package/dist/seo/builder/seo-builder.d.ts +72 -0
- package/dist/seo/builder/seo-builder.d.ts.map +1 -0
- package/dist/seo/builder/seo-builder.js +72 -0
- package/dist/seo/builder/seo-builder.js.map +1 -0
- package/dist/seo/citation-gate.d.ts +36 -0
- package/dist/seo/citation-gate.d.ts.map +1 -0
- package/dist/seo/citation-gate.js +59 -0
- package/dist/seo/citation-gate.js.map +1 -0
- package/dist/seo/command.d.ts +11 -0
- package/dist/seo/command.d.ts.map +1 -0
- package/dist/seo/command.js +90 -0
- package/dist/seo/command.js.map +1 -0
- package/dist/seo/content-sanitizer.d.ts +56 -0
- package/dist/seo/content-sanitizer.d.ts.map +1 -0
- package/dist/seo/content-sanitizer.js +55 -0
- package/dist/seo/content-sanitizer.js.map +1 -0
- package/dist/seo/crawl-engine.d.ts +35 -0
- package/dist/seo/crawl-engine.d.ts.map +1 -0
- package/dist/seo/crawl-engine.js +2 -0
- package/dist/seo/crawl-engine.js.map +1 -0
- package/dist/seo/data-source.d.ts +156 -0
- package/dist/seo/data-source.d.ts.map +1 -0
- package/dist/seo/data-source.js +2 -0
- package/dist/seo/data-source.js.map +1 -0
- package/dist/seo/egress.d.ts +39 -0
- package/dist/seo/egress.d.ts.map +1 -0
- package/dist/seo/egress.js +64 -0
- package/dist/seo/egress.js.map +1 -0
- package/dist/seo/hub-emitter.d.ts +28 -0
- package/dist/seo/hub-emitter.d.ts.map +1 -0
- package/dist/seo/hub-emitter.js +95 -0
- package/dist/seo/hub-emitter.js.map +1 -0
- package/dist/seo/index.d.ts +42 -0
- package/dist/seo/index.d.ts.map +1 -0
- package/dist/seo/index.js +19 -0
- package/dist/seo/index.js.map +1 -0
- package/dist/seo/never-encode-filter.d.ts +45 -0
- package/dist/seo/never-encode-filter.d.ts.map +1 -0
- package/dist/seo/never-encode-filter.js +51 -0
- package/dist/seo/never-encode-filter.js.map +1 -0
- package/dist/seo/parser.d.ts +46 -0
- package/dist/seo/parser.d.ts.map +1 -0
- package/dist/seo/parser.js +113 -0
- package/dist/seo/parser.js.map +1 -0
- package/dist/seo/playbook-index.d.ts +19 -0
- package/dist/seo/playbook-index.d.ts.map +1 -0
- package/dist/seo/playbook-index.js +74 -0
- package/dist/seo/playbook-index.js.map +1 -0
- package/dist/seo/quota-governor.d.ts +100 -0
- package/dist/seo/quota-governor.d.ts.map +1 -0
- package/dist/seo/quota-governor.js +199 -0
- package/dist/seo/quota-governor.js.map +1 -0
- package/dist/seo/quota-ledger.d.ts +50 -0
- package/dist/seo/quota-ledger.d.ts.map +1 -0
- package/dist/seo/quota-ledger.js +95 -0
- package/dist/seo/quota-ledger.js.map +1 -0
- package/dist/seo/report-store.d.ts +30 -0
- package/dist/seo/report-store.d.ts.map +1 -0
- package/dist/seo/report-store.js +94 -0
- package/dist/seo/report-store.js.map +1 -0
- package/dist/seo/retriever.d.ts +34 -0
- package/dist/seo/retriever.d.ts.map +1 -0
- package/dist/seo/retriever.js +95 -0
- package/dist/seo/retriever.js.map +1 -0
- package/dist/seo/runner.d.ts +108 -0
- package/dist/seo/runner.d.ts.map +1 -0
- package/dist/seo/runner.js +512 -0
- package/dist/seo/runner.js.map +1 -0
- package/dist/seo/scrape-throttle.d.ts +84 -0
- package/dist/seo/scrape-throttle.d.ts.map +1 -0
- package/dist/seo/scrape-throttle.js +149 -0
- package/dist/seo/scrape-throttle.js.map +1 -0
- package/dist/seo/serp-provider.d.ts +52 -0
- package/dist/seo/serp-provider.d.ts.map +1 -0
- package/dist/seo/serp-provider.js +17 -0
- package/dist/seo/serp-provider.js.map +1 -0
- package/dist/seo/sources/ai-visibility-adapter.d.ts +87 -0
- package/dist/seo/sources/ai-visibility-adapter.d.ts.map +1 -0
- package/dist/seo/sources/ai-visibility-adapter.js +85 -0
- package/dist/seo/sources/ai-visibility-adapter.js.map +1 -0
- package/dist/seo/sources/api-spine-provider.d.ts +66 -0
- package/dist/seo/sources/api-spine-provider.d.ts.map +1 -0
- package/dist/seo/sources/api-spine-provider.js +68 -0
- package/dist/seo/sources/api-spine-provider.js.map +1 -0
- package/dist/seo/sources/citation-verifier.d.ts +95 -0
- package/dist/seo/sources/citation-verifier.d.ts.map +1 -0
- package/dist/seo/sources/citation-verifier.js +106 -0
- package/dist/seo/sources/citation-verifier.js.map +1 -0
- package/dist/seo/sources/crawl-source.d.ts +62 -0
- package/dist/seo/sources/crawl-source.d.ts.map +1 -0
- package/dist/seo/sources/crawl-source.js +87 -0
- package/dist/seo/sources/crawl-source.js.map +1 -0
- package/dist/seo/sources/damcrawler-crawl-engine.d.ts +151 -0
- package/dist/seo/sources/damcrawler-crawl-engine.d.ts.map +1 -0
- package/dist/seo/sources/damcrawler-crawl-engine.js +154 -0
- package/dist/seo/sources/damcrawler-crawl-engine.js.map +1 -0
- package/dist/seo/sources/damcrawler-serp-provider.d.ts +75 -0
- package/dist/seo/sources/damcrawler-serp-provider.d.ts.map +1 -0
- package/dist/seo/sources/damcrawler-serp-provider.js +60 -0
- package/dist/seo/sources/damcrawler-serp-provider.js.map +1 -0
- package/dist/seo/sources/dataforseo-adapter.d.ts +46 -0
- package/dist/seo/sources/dataforseo-adapter.d.ts.map +1 -0
- package/dist/seo/sources/dataforseo-adapter.js +335 -0
- package/dist/seo/sources/dataforseo-adapter.js.map +1 -0
- package/dist/seo/sources/dataforseo-serp-provider.d.ts +30 -0
- package/dist/seo/sources/dataforseo-serp-provider.d.ts.map +1 -0
- package/dist/seo/sources/dataforseo-serp-provider.js +20 -0
- package/dist/seo/sources/dataforseo-serp-provider.js.map +1 -0
- package/dist/seo/sources/engine-scrape-parser-chatgpt.d.ts +62 -0
- package/dist/seo/sources/engine-scrape-parser-chatgpt.d.ts.map +1 -0
- package/dist/seo/sources/engine-scrape-parser-chatgpt.js +72 -0
- package/dist/seo/sources/engine-scrape-parser-chatgpt.js.map +1 -0
- package/dist/seo/sources/engine-scrape-parser-perplexity.d.ts +10 -0
- package/dist/seo/sources/engine-scrape-parser-perplexity.d.ts.map +1 -0
- package/dist/seo/sources/engine-scrape-parser-perplexity.js +72 -0
- package/dist/seo/sources/engine-scrape-parser-perplexity.js.map +1 -0
- package/dist/seo/sources/gsc-adapter.d.ts +64 -0
- package/dist/seo/sources/gsc-adapter.d.ts.map +1 -0
- package/dist/seo/sources/gsc-adapter.js +221 -0
- package/dist/seo/sources/gsc-adapter.js.map +1 -0
- package/dist/seo/sources/local-export.d.ts +53 -0
- package/dist/seo/sources/local-export.d.ts.map +1 -0
- package/dist/seo/sources/local-export.js +307 -0
- package/dist/seo/sources/local-export.js.map +1 -0
- package/dist/seo/sources/mention-citation-extractor.d.ts +136 -0
- package/dist/seo/sources/mention-citation-extractor.d.ts.map +1 -0
- package/dist/seo/sources/mention-citation-extractor.js +272 -0
- package/dist/seo/sources/mention-citation-extractor.js.map +1 -0
- package/dist/seo/sources/scrape-arm-provider.d.ts +109 -0
- package/dist/seo/sources/scrape-arm-provider.d.ts.map +1 -0
- package/dist/seo/sources/scrape-arm-provider.js +129 -0
- package/dist/seo/sources/scrape-arm-provider.js.map +1 -0
- package/dist/seo/tracked-prompt-store.d.ts +33 -0
- package/dist/seo/tracked-prompt-store.d.ts.map +1 -0
- package/dist/seo/tracked-prompt-store.js +68 -0
- package/dist/seo/tracked-prompt-store.js.map +1 -0
- package/dist/seo/types.d.ts +128 -0
- package/dist/seo/types.d.ts.map +1 -0
- package/dist/seo/types.js +14 -0
- package/dist/seo/types.js.map +1 -0
- package/dist/seo/verifier.d.ts +34 -0
- package/dist/seo/verifier.d.ts.map +1 -0
- package/dist/seo/verifier.js +204 -0
- package/dist/seo/verifier.js.map +1 -0
- package/dist/seo/workflow-capabilities.d.ts +26 -0
- package/dist/seo/workflow-capabilities.d.ts.map +1 -0
- package/dist/seo/workflow-capabilities.js +12 -0
- package/dist/seo/workflow-capabilities.js.map +1 -0
- package/dist/state/facts.d.ts +5 -1
- package/dist/state/facts.d.ts.map +1 -1
- package/dist/state/facts.js +29 -19
- package/dist/state/facts.js.map +1 -1
- package/dist/state/index.d.ts +1 -1
- package/dist/state/index.d.ts.map +1 -1
- package/dist/state/index.js +1 -1
- package/dist/state/index.js.map +1 -1
- package/dist/state/outline-state.d.ts +0 -12
- package/dist/state/outline-state.d.ts.map +1 -1
- package/dist/state/outline-state.js +1 -18
- package/dist/state/outline-state.js.map +1 -1
- package/dist/state/security-audit-state.d.ts +20 -0
- package/dist/state/security-audit-state.d.ts.map +1 -0
- package/dist/state/security-audit-state.js +59 -0
- package/dist/state/security-audit-state.js.map +1 -0
- package/dist/teams/registry.d.ts.map +1 -1
- package/dist/teams/registry.js +17 -0
- package/dist/teams/registry.js.map +1 -1
- package/dist/telegram/bot.d.ts +137 -0
- package/dist/telegram/bot.d.ts.map +1 -0
- package/dist/telegram/bot.js +323 -0
- package/dist/telegram/bot.js.map +1 -0
- package/dist/telegram/digest.d.ts +19 -0
- package/dist/telegram/digest.d.ts.map +1 -0
- package/dist/telegram/digest.js +23 -0
- package/dist/telegram/digest.js.map +1 -0
- package/dist/telegram/fleet-view.d.ts +38 -0
- package/dist/telegram/fleet-view.d.ts.map +1 -0
- package/dist/telegram/fleet-view.js +98 -0
- package/dist/telegram/fleet-view.js.map +1 -0
- package/dist/telegram/handlers/approvals.d.ts +61 -0
- package/dist/telegram/handlers/approvals.d.ts.map +1 -0
- package/dist/telegram/handlers/approvals.js +122 -0
- package/dist/telegram/handlers/approvals.js.map +1 -0
- package/dist/telegram/handlers/capture.d.ts +43 -0
- package/dist/telegram/handlers/capture.d.ts.map +1 -0
- package/dist/telegram/handlers/capture.js +51 -0
- package/dist/telegram/handlers/capture.js.map +1 -0
- package/dist/telegram/handlers/prioritize.d.ts +50 -0
- package/dist/telegram/handlers/prioritize.d.ts.map +1 -0
- package/dist/telegram/handlers/prioritize.js +99 -0
- package/dist/telegram/handlers/prioritize.js.map +1 -0
- package/dist/telegram/handlers/upload.d.ts +105 -0
- package/dist/telegram/handlers/upload.d.ts.map +1 -0
- package/dist/telegram/handlers/upload.js +149 -0
- package/dist/telegram/handlers/upload.js.map +1 -0
- package/dist/telegram/keyboard.d.ts +48 -0
- package/dist/telegram/keyboard.d.ts.map +1 -0
- package/dist/telegram/keyboard.js +81 -0
- package/dist/telegram/keyboard.js.map +1 -0
- package/dist/telegram/outbound.d.ts +77 -0
- package/dist/telegram/outbound.d.ts.map +1 -0
- package/dist/telegram/outbound.js +45 -0
- package/dist/telegram/outbound.js.map +1 -0
- package/dist/telegram/router.d.ts +46 -0
- package/dist/telegram/router.d.ts.map +1 -0
- package/dist/telegram/router.js +63 -0
- package/dist/telegram/router.js.map +1 -0
- package/dist/telegram/streaming.d.ts +36 -0
- package/dist/telegram/streaming.d.ts.map +1 -0
- package/dist/telegram/streaming.js +55 -0
- package/dist/telegram/streaming.js.map +1 -0
- package/dist/telegram/whitelist.d.ts +20 -0
- package/dist/telegram/whitelist.d.ts.map +1 -0
- package/dist/telegram/whitelist.js +34 -0
- package/dist/telegram/whitelist.js.map +1 -0
- package/dist/utils/git.d.ts +0 -6
- package/dist/utils/git.d.ts.map +1 -1
- package/dist/utils/git.js +0 -19
- package/dist/utils/git.js.map +1 -1
- package/dist/utils/index.d.ts +1 -1
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +1 -1
- package/dist/utils/index.js.map +1 -1
- package/dist/vault/conventions.d.ts +23 -0
- package/dist/vault/conventions.d.ts.map +1 -0
- package/dist/vault/conventions.js +22 -0
- package/dist/vault/conventions.js.map +1 -0
- package/dist/vault/frontmatter.d.ts +47 -0
- package/dist/vault/frontmatter.d.ts.map +1 -0
- package/dist/vault/frontmatter.js +149 -0
- package/dist/vault/frontmatter.js.map +1 -0
- package/dist/vault/index-map.d.ts +35 -0
- package/dist/vault/index-map.d.ts.map +1 -0
- package/dist/vault/index-map.js +67 -0
- package/dist/vault/index-map.js.map +1 -0
- package/dist/vault/mcp-adapter.d.ts +96 -0
- package/dist/vault/mcp-adapter.d.ts.map +1 -0
- package/dist/vault/mcp-adapter.js +176 -0
- package/dist/vault/mcp-adapter.js.map +1 -0
- package/dist/vault/note-io.d.ts +29 -0
- package/dist/vault/note-io.d.ts.map +1 -0
- package/dist/vault/note-io.js +44 -0
- package/dist/vault/note-io.js.map +1 -0
- package/dist/vault/profile.d.ts +35 -0
- package/dist/vault/profile.d.ts.map +1 -0
- package/dist/vault/profile.js +50 -0
- package/dist/vault/profile.js.map +1 -0
- package/dist/vault/reindex.d.ts +55 -0
- package/dist/vault/reindex.d.ts.map +1 -0
- package/dist/vault/reindex.js +69 -0
- package/dist/vault/reindex.js.map +1 -0
- package/dist/vault/types.d.ts +25 -0
- package/dist/vault/types.d.ts.map +1 -0
- package/dist/vault/types.js +9 -0
- package/dist/vault/types.js.map +1 -0
- package/package.json +20 -4
- package/scripts/sync-targets.json +2 -1
- package/skills/bober.design/SKILL.md +190 -0
- package/skills/bober.design/references/1-anti-slop.md +102 -0
- package/skills/bober.design/references/2-design-brief.md +84 -0
- package/skills/bober.design/references/3-critique-rubric.md +62 -0
- package/skills/bober.design/references/4-copy-guide.md +43 -0
- package/skills/bober.plan/SKILL.md +15 -1
- package/skills/bober.run/SKILL.md +7 -4
- package/skills/bober.security-anchor/SKILL.md +172 -0
- package/skills/bober.security-audit/SKILL.md +288 -0
- package/skills/bober.security-dex-backend/SKILL.md +306 -0
- package/skills/bober.security-generic/SKILL.md +295 -0
- package/skills/bober.security-igaming/SKILL.md +290 -0
- package/skills/bober.security-node/SKILL.md +267 -0
- package/skills/bober.security-payments/SKILL.md +249 -0
- package/skills/bober.security-react/SKILL.md +194 -0
- package/skills/bober.security-solidity/SKILL.md +306 -0
- package/skills/bober.seo/SKILL.md +132 -0
- package/skills/bober.seo-ai-visibility/SKILL.md +110 -0
- package/skills/bober.seo-content-decay/SKILL.md +99 -0
- package/skills/bober.seo-generic/SKILL.md +173 -0
- package/skills/bober.seo-internal-linking/SKILL.md +87 -0
- package/skills/bober.seo-parasite-watch/SKILL.md +121 -0
- package/skills/bober.seo-rank-track/SKILL.md +98 -0
- package/skills/bober.seo-schema-audit/SKILL.md +97 -0
- package/skills/bober.seo-technical-audit/SKILL.md +113 -0
- package/skills/bober.seo-topical-map/SKILL.md +100 -0
- package/skills/bober.seo-verticals/SKILL.md +133 -0
- package/skills/bober.using-bober/SKILL.md +1 -0
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Lab trend analyzer — deterministic reference-range and slope rules.
|
|
3
|
+
*
|
|
4
|
+
* PURE / NO network / NO LLM / NO Date.now() / NO async / NO fs.
|
|
5
|
+
* Identical input => identical output.
|
|
6
|
+
*
|
|
7
|
+
* ADR-3: The LLM NEVER performs arithmetic. All trend math is delegated exclusively to
|
|
8
|
+
* NumericsQueryLayer.getLabTrend (slope + latestValue). No hand-rolled slope arithmetic.
|
|
9
|
+
*
|
|
10
|
+
* Rules:
|
|
11
|
+
* A. Reference-range crossing: latestValue outside [referenceLow, referenceHigh]
|
|
12
|
+
* → kind 'watch' (severity 3, urgency 3);
|
|
13
|
+
* >20% beyond the edge → kind 'risk' (severity 4, urgency 4).
|
|
14
|
+
* B. Slope-toward-edge: slope != null, value is in range, trending toward the nearer
|
|
15
|
+
* reference edge with a projected crossing → kind 'watch' (severity 2, urgency 2).
|
|
16
|
+
*
|
|
17
|
+
* Abstains (empty findings) when sampleCount === 0 for a biomarker.
|
|
18
|
+
* Reference range is read from store.getLabSeries (LabTrend does not carry it).
|
|
19
|
+
*/
|
|
20
|
+
import type { HealthDataStore } from "../health-store.js";
|
|
21
|
+
import type { MedicalFinding } from "./finding.js";
|
|
22
|
+
/**
|
|
23
|
+
* Analyze lab trends for a set of biomarkers and return detected findings.
|
|
24
|
+
*
|
|
25
|
+
* PURE, synchronous, deterministic. No async, no fs, no network, no LLM.
|
|
26
|
+
* Delegates ALL trend math to NumericsQueryLayer.getLabTrend (ADR-3).
|
|
27
|
+
* Reference ranges are read from store.getLabSeries (LabTrend does not carry them).
|
|
28
|
+
*
|
|
29
|
+
* @param store HealthDataStore (caller is responsible for lifecycle)
|
|
30
|
+
* @param biomarkers List of biomarker names to analyze
|
|
31
|
+
* @param opts { now: ISO 8601 injected timestamp }
|
|
32
|
+
*/
|
|
33
|
+
export declare function analyzeTrends(store: HealthDataStore, biomarkers: string[], opts: {
|
|
34
|
+
now: string;
|
|
35
|
+
}): MedicalFinding[];
|
|
36
|
+
//# sourceMappingURL=trends.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trends.d.ts","sourceRoot":"","sources":["../../../src/medical/analysis/trends.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAGH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAE1D,OAAO,KAAK,EAAE,cAAc,EAAe,MAAM,cAAc,CAAC;AAmJhE;;;;;;;;;;GAUG;AACH,wBAAgB,aAAa,CAC3B,KAAK,EAAE,eAAe,EACtB,UAAU,EAAE,MAAM,EAAE,EACpB,IAAI,EAAE;IAAE,GAAG,EAAE,MAAM,CAAA;CAAE,GACpB,cAAc,EAAE,CAoDlB"}
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Lab trend analyzer — deterministic reference-range and slope rules.
|
|
3
|
+
*
|
|
4
|
+
* PURE / NO network / NO LLM / NO Date.now() / NO async / NO fs.
|
|
5
|
+
* Identical input => identical output.
|
|
6
|
+
*
|
|
7
|
+
* ADR-3: The LLM NEVER performs arithmetic. All trend math is delegated exclusively to
|
|
8
|
+
* NumericsQueryLayer.getLabTrend (slope + latestValue). No hand-rolled slope arithmetic.
|
|
9
|
+
*
|
|
10
|
+
* Rules:
|
|
11
|
+
* A. Reference-range crossing: latestValue outside [referenceLow, referenceHigh]
|
|
12
|
+
* → kind 'watch' (severity 3, urgency 3);
|
|
13
|
+
* >20% beyond the edge → kind 'risk' (severity 4, urgency 4).
|
|
14
|
+
* B. Slope-toward-edge: slope != null, value is in range, trending toward the nearer
|
|
15
|
+
* reference edge with a projected crossing → kind 'watch' (severity 2, urgency 2).
|
|
16
|
+
*
|
|
17
|
+
* Abstains (empty findings) when sampleCount === 0 for a biomarker.
|
|
18
|
+
* Reference range is read from store.getLabSeries (LabTrend does not carry it).
|
|
19
|
+
*/
|
|
20
|
+
import { NumericsQueryLayer } from "../numerics.js";
|
|
21
|
+
import { findingId } from "./finding.js";
|
|
22
|
+
// -- Internal helpers -----------------------------------------------------
|
|
23
|
+
/**
|
|
24
|
+
* Build a MedicalFinding for a detected trend condition.
|
|
25
|
+
* Uses findingId with domain|biomarker|ruleKey (NOT now) for idempotency.
|
|
26
|
+
*/
|
|
27
|
+
function makeFinding(biomarker, ruleKey, title, kind, urgency, severity, evidence, now) {
|
|
28
|
+
return {
|
|
29
|
+
id: findingId("medical", biomarker, ruleKey),
|
|
30
|
+
domain: "medical",
|
|
31
|
+
title,
|
|
32
|
+
kind,
|
|
33
|
+
urgency,
|
|
34
|
+
severity,
|
|
35
|
+
evidence,
|
|
36
|
+
surfacedAt: now,
|
|
37
|
+
tags: ["lab-trend", biomarker],
|
|
38
|
+
status: "open",
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
// -- Rule A ---------------------------------------------------------------
|
|
42
|
+
/**
|
|
43
|
+
* Apply Rule A: latestValue outside [referenceLow, referenceHigh].
|
|
44
|
+
* - >20% beyond edge → 'risk', severity 4, urgency 4
|
|
45
|
+
* - ≤20% beyond edge → 'watch', severity 3, urgency 3
|
|
46
|
+
*
|
|
47
|
+
* Returns a finding or undefined when in range.
|
|
48
|
+
*/
|
|
49
|
+
function applyRuleA(biomarker, latestValue, latestUnit, referenceLow, referenceHigh, now) {
|
|
50
|
+
// Above referenceHigh
|
|
51
|
+
if (referenceHigh !== undefined && latestValue > referenceHigh) {
|
|
52
|
+
const pctBeyond = referenceHigh !== 0 ? (latestValue - referenceHigh) / referenceHigh : 0;
|
|
53
|
+
const isRisk = pctBeyond > 0.2;
|
|
54
|
+
const kind = isRisk ? "risk" : "watch";
|
|
55
|
+
const severity = isRisk ? 4 : 3;
|
|
56
|
+
const urgency = isRisk ? 4 : 3;
|
|
57
|
+
const ruleKey = isRisk ? "rule-a-high-risk" : "rule-a-high";
|
|
58
|
+
const evidence = [
|
|
59
|
+
`${biomarker} = ${latestValue} ${latestUnit} (reference: ≤${referenceHigh} ${latestUnit})`,
|
|
60
|
+
`${(pctBeyond * 100).toFixed(1)}% above upper reference limit`,
|
|
61
|
+
];
|
|
62
|
+
return makeFinding(biomarker, ruleKey, `${biomarker}: above reference range`, kind, urgency, severity, evidence, now);
|
|
63
|
+
}
|
|
64
|
+
// Below referenceLow
|
|
65
|
+
if (referenceLow !== undefined && latestValue < referenceLow) {
|
|
66
|
+
const divisor = Math.abs(referenceLow) > 0 ? referenceLow : 1;
|
|
67
|
+
const pctBeyond = (referenceLow - latestValue) / divisor;
|
|
68
|
+
const isRisk = pctBeyond > 0.2;
|
|
69
|
+
const kind = isRisk ? "risk" : "watch";
|
|
70
|
+
const severity = isRisk ? 4 : 3;
|
|
71
|
+
const urgency = isRisk ? 4 : 3;
|
|
72
|
+
const ruleKey = isRisk ? "rule-a-low-risk" : "rule-a-low";
|
|
73
|
+
const evidence = [
|
|
74
|
+
`${biomarker} = ${latestValue} ${latestUnit} (reference: ≥${referenceLow} ${latestUnit})`,
|
|
75
|
+
`${(pctBeyond * 100).toFixed(1)}% below lower reference limit`,
|
|
76
|
+
];
|
|
77
|
+
return makeFinding(biomarker, ruleKey, `${biomarker}: below reference range`, kind, urgency, severity, evidence, now);
|
|
78
|
+
}
|
|
79
|
+
return undefined;
|
|
80
|
+
}
|
|
81
|
+
// -- Rule B ---------------------------------------------------------------
|
|
82
|
+
/**
|
|
83
|
+
* Apply Rule B: value is in range, slope != null, trending toward the nearer reference edge.
|
|
84
|
+
* The slope direction (positive toward high edge, negative toward low edge) combined with
|
|
85
|
+
* which edge is nearer determines whether there is a projected crossing.
|
|
86
|
+
*
|
|
87
|
+
* Returns a finding or undefined when no projected crossing is detected.
|
|
88
|
+
*/
|
|
89
|
+
function applyRuleB(biomarker, latestValue, latestUnit, slope, referenceLow, referenceHigh, now) {
|
|
90
|
+
if (referenceLow === undefined && referenceHigh === undefined)
|
|
91
|
+
return undefined;
|
|
92
|
+
const distToHigh = referenceHigh !== undefined ? referenceHigh - latestValue : Infinity;
|
|
93
|
+
const distToLow = referenceLow !== undefined ? latestValue - referenceLow : Infinity;
|
|
94
|
+
// Trending upward toward referenceHigh and high edge is nearer (or the only bound)
|
|
95
|
+
if (slope > 0 && referenceHigh !== undefined && distToHigh <= distToLow && distToHigh > 0) {
|
|
96
|
+
const evidence = [
|
|
97
|
+
`${biomarker} = ${latestValue} ${latestUnit}, rising trend (slope > 0)`,
|
|
98
|
+
`Upper reference limit: ${referenceHigh} ${latestUnit} (${distToHigh.toFixed(2)} ${latestUnit} away)`,
|
|
99
|
+
];
|
|
100
|
+
return makeFinding(biomarker, "rule-b-high", `${biomarker}: rising trend toward upper reference limit`, "watch", 2, 2, evidence, now);
|
|
101
|
+
}
|
|
102
|
+
// Trending downward toward referenceLow and low edge is nearer (or the only bound)
|
|
103
|
+
if (slope < 0 && referenceLow !== undefined && distToLow <= distToHigh && distToLow > 0) {
|
|
104
|
+
const evidence = [
|
|
105
|
+
`${biomarker} = ${latestValue} ${latestUnit}, falling trend (slope < 0)`,
|
|
106
|
+
`Lower reference limit: ${referenceLow} ${latestUnit} (${distToLow.toFixed(2)} ${latestUnit} away)`,
|
|
107
|
+
];
|
|
108
|
+
return makeFinding(biomarker, "rule-b-low", `${biomarker}: falling trend toward lower reference limit`, "watch", 2, 2, evidence, now);
|
|
109
|
+
}
|
|
110
|
+
return undefined;
|
|
111
|
+
}
|
|
112
|
+
// -- Public API -----------------------------------------------------------
|
|
113
|
+
/**
|
|
114
|
+
* Analyze lab trends for a set of biomarkers and return detected findings.
|
|
115
|
+
*
|
|
116
|
+
* PURE, synchronous, deterministic. No async, no fs, no network, no LLM.
|
|
117
|
+
* Delegates ALL trend math to NumericsQueryLayer.getLabTrend (ADR-3).
|
|
118
|
+
* Reference ranges are read from store.getLabSeries (LabTrend does not carry them).
|
|
119
|
+
*
|
|
120
|
+
* @param store HealthDataStore (caller is responsible for lifecycle)
|
|
121
|
+
* @param biomarkers List of biomarker names to analyze
|
|
122
|
+
* @param opts { now: ISO 8601 injected timestamp }
|
|
123
|
+
*/
|
|
124
|
+
export function analyzeTrends(store, biomarkers, opts) {
|
|
125
|
+
const numerics = new NumericsQueryLayer(store);
|
|
126
|
+
const findings = [];
|
|
127
|
+
for (const biomarker of biomarkers) {
|
|
128
|
+
const trend = numerics.getLabTrend(biomarker);
|
|
129
|
+
// Abstain when no data (sc-1-2, sc-1-3)
|
|
130
|
+
if (trend.sampleCount === 0)
|
|
131
|
+
continue;
|
|
132
|
+
if (trend.latestValue === null)
|
|
133
|
+
continue;
|
|
134
|
+
// Read reference range from the latest LabResult (LabTrend does not carry it)
|
|
135
|
+
const series = store.getLabSeries(biomarker);
|
|
136
|
+
const latestResult = series[series.length - 1];
|
|
137
|
+
if (!latestResult)
|
|
138
|
+
continue;
|
|
139
|
+
const { referenceLow, referenceHigh } = latestResult;
|
|
140
|
+
const { latestValue, latestUnit } = trend;
|
|
141
|
+
// Rule A: reference-range crossing (takes precedence over Rule B)
|
|
142
|
+
const ruleAFinding = applyRuleA(biomarker, latestValue, latestUnit, referenceLow, referenceHigh, opts.now);
|
|
143
|
+
if (ruleAFinding !== undefined) {
|
|
144
|
+
findings.push(ruleAFinding);
|
|
145
|
+
continue; // Rule A takes precedence; Rule B not evaluated for this biomarker
|
|
146
|
+
}
|
|
147
|
+
// Rule B: slope-toward-edge (only when in range and sampleCount >= 2 for valid slope)
|
|
148
|
+
if (trend.slope !== null && trend.sampleCount >= 2) {
|
|
149
|
+
const ruleBFinding = applyRuleB(biomarker, latestValue, latestUnit, trend.slope, referenceLow, referenceHigh, opts.now);
|
|
150
|
+
if (ruleBFinding !== undefined) {
|
|
151
|
+
findings.push(ruleBFinding);
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
return findings;
|
|
156
|
+
}
|
|
157
|
+
//# sourceMappingURL=trends.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trends.js","sourceRoot":"","sources":["../../../src/medical/analysis/trends.ts"],"names":[],"mappings":"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"}
|
|
@@ -74,6 +74,11 @@ export declare class HealthDataStore {
|
|
|
74
74
|
* Returns undefined if the key is not set.
|
|
75
75
|
*/
|
|
76
76
|
getPreference(key: string): string | undefined;
|
|
77
|
+
/**
|
|
78
|
+
* Return all distinct biomarker names present in the lab_results table, ordered alphabetically.
|
|
79
|
+
* Returns an empty array when no lab results have been loaded.
|
|
80
|
+
*/
|
|
81
|
+
listBiomarkers(): string[];
|
|
77
82
|
/** Close the underlying database connection. */
|
|
78
83
|
close(): void;
|
|
79
84
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"health-store.d.ts","sourceRoot":"","sources":["../../src/medical/health-store.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAMH,OAAO,KAAK,EAAE,iBAAiB,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAIzE;;;;;GAKG;AACH,wBAAgB,aAAa,CAC3B,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,GACZ,MAAM,CAKR;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAK5F;AAoDD;;;;;;;;;GASG;AACH,qBAAa,eAAe;IAC1B,OAAO,CAAC,EAAE,CAAe;gBAEb,MAAM,EAAE,MAAM;IAgC1B;;;;OAIG;IACH,kBAAkB,CAAC,IAAI,EAAE,iBAAiB,EAAE,GAAG,MAAM;IAsBrD;;;OAGG;IACH,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,iBAAiB,EAAE;IAYpF;;OAEG;IACH,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS,EAAE;IAY5C;;;OAGG;IACH,eAAe,CAAC,MAAM,EAAE,SAAS,GAAG,MAAM;IAoB1C;;;OAGG;IACH,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,QAAQ,GAAG,SAAS;IAQjD;;OAEG;IACH,WAAW,CAAC,CAAC,EAAE,QAAQ,GAAG,IAAI;IAM9B;;;OAGG;IACH,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAO9C,gDAAgD;IAChD,KAAK,IAAI,IAAI;CAGd"}
|
|
1
|
+
{"version":3,"file":"health-store.d.ts","sourceRoot":"","sources":["../../src/medical/health-store.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAMH,OAAO,KAAK,EAAE,iBAAiB,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAIzE;;;;;GAKG;AACH,wBAAgB,aAAa,CAC3B,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,GACZ,MAAM,CAKR;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAK5F;AAoDD;;;;;;;;;GASG;AACH,qBAAa,eAAe;IAC1B,OAAO,CAAC,EAAE,CAAe;gBAEb,MAAM,EAAE,MAAM;IAgC1B;;;;OAIG;IACH,kBAAkB,CAAC,IAAI,EAAE,iBAAiB,EAAE,GAAG,MAAM;IAsBrD;;;OAGG;IACH,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,iBAAiB,EAAE;IAYpF;;OAEG;IACH,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS,EAAE;IAY5C;;;OAGG;IACH,eAAe,CAAC,MAAM,EAAE,SAAS,GAAG,MAAM;IAoB1C;;;OAGG;IACH,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,QAAQ,GAAG,SAAS;IAQjD;;OAEG;IACH,WAAW,CAAC,CAAC,EAAE,QAAQ,GAAG,IAAI;IAM9B;;;OAGG;IACH,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAO9C;;;OAGG;IACH,cAAc,IAAI,MAAM,EAAE;IAO1B,gDAAgD;IAChD,KAAK,IAAI,IAAI;CAGd"}
|
|
@@ -196,6 +196,16 @@ export class HealthDataStore {
|
|
|
196
196
|
.get(`pref:${key}`);
|
|
197
197
|
return row?.v;
|
|
198
198
|
}
|
|
199
|
+
/**
|
|
200
|
+
* Return all distinct biomarker names present in the lab_results table, ordered alphabetically.
|
|
201
|
+
* Returns an empty array when no lab results have been loaded.
|
|
202
|
+
*/
|
|
203
|
+
listBiomarkers() {
|
|
204
|
+
const rows = this.db
|
|
205
|
+
.prepare(`SELECT DISTINCT biomarker FROM lab_results ORDER BY biomarker ASC`)
|
|
206
|
+
.all();
|
|
207
|
+
return rows.map((r) => r.biomarker);
|
|
208
|
+
}
|
|
199
209
|
/** Close the underlying database connection. */
|
|
200
210
|
close() {
|
|
201
211
|
this.db.close();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"health-store.js","sourceRoot":"","sources":["../../src/medical/health-store.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"health-store.js","sourceRoot":"","sources":["../../src/medical/health-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Lab-note vault writer — serializes parsed lab markers to YAML-frontmatter markdown notes.
|
|
3
|
+
*
|
|
4
|
+
* Status classification is deterministic JS: value vs reference range (ADR-3 spirit).
|
|
5
|
+
*
|
|
6
|
+
* PURE file I/O + deterministic helpers only.
|
|
7
|
+
* NO network. NO LLM. NO Date.now(). All timestamps are injected parameters.
|
|
8
|
+
*
|
|
9
|
+
* bober: hand-rolled YAML-frontmatter subset (flat scalars only, no arrays/nested objects).
|
|
10
|
+
* Mirror of src/vault/frontmatter.ts approach — never import that module.
|
|
11
|
+
* Swap for a vetted YAML library if quoted strings or nested objects are required.
|
|
12
|
+
*/
|
|
13
|
+
import type { ParsedLabMarker } from "./lab-types.js";
|
|
14
|
+
/** Deterministic lab status — derived in pure JS, never by an LLM (ADR-3 spirit). */
|
|
15
|
+
export type LabStatus = "low" | "normal" | "high" | "critical";
|
|
16
|
+
/** Report-level metadata supplied alongside a ParsedLabMarker at write time. */
|
|
17
|
+
export interface LabNoteMeta {
|
|
18
|
+
panel: string;
|
|
19
|
+
/** ISO 8601 collection timestamp — INJECTED, never Date.now(). */
|
|
20
|
+
collectedAtIso: string;
|
|
21
|
+
source: string;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Structured contents of a lab note's YAML frontmatter.
|
|
25
|
+
* All 10 keys are always present; ref_low / ref_high are undefined when absent.
|
|
26
|
+
*/
|
|
27
|
+
export interface LabNoteFrontmatter {
|
|
28
|
+
marker: string;
|
|
29
|
+
value: number;
|
|
30
|
+
unit: string;
|
|
31
|
+
ref_low: number | undefined;
|
|
32
|
+
ref_high: number | undefined;
|
|
33
|
+
/** Human-readable range string, e.g. "70-100", or "" when bounds are absent. */
|
|
34
|
+
ref_range: string;
|
|
35
|
+
/** ISO 8601 collection date (stored verbatim from collectedAtIso). */
|
|
36
|
+
date: string;
|
|
37
|
+
status: LabStatus;
|
|
38
|
+
panel: string;
|
|
39
|
+
source: string;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Produce a URL-safe slug from an arbitrary string.
|
|
43
|
+
* Precedent: src/incident/timeline.ts:117.
|
|
44
|
+
*/
|
|
45
|
+
export declare function slugify(s: string): string;
|
|
46
|
+
/**
|
|
47
|
+
* Derive a deterministic lab status from value vs reference range.
|
|
48
|
+
* Pure sync — no LLM, no network, no Date.now() (ADR-3 spirit).
|
|
49
|
+
*
|
|
50
|
+
* Priority: critical flag wins; else compare to bounds; missing bounds → "normal".
|
|
51
|
+
*/
|
|
52
|
+
export declare function deriveLabStatus(value: number, refLow?: number, refHigh?: number, critical?: boolean): LabStatus;
|
|
53
|
+
/**
|
|
54
|
+
* Parse the YAML frontmatter from a raw lab-note markdown string.
|
|
55
|
+
* Numeric fields (value, ref_low, ref_high) are coerced from their string representation.
|
|
56
|
+
* ref_low / ref_high are undefined when the value is absent or empty.
|
|
57
|
+
*
|
|
58
|
+
* Throws if the opening or closing `---` fence is missing.
|
|
59
|
+
*
|
|
60
|
+
* Mirror of src/vault/frontmatter.ts:53-135 — DO NOT import that module.
|
|
61
|
+
*/
|
|
62
|
+
export declare function parseLabNote(raw: string): LabNoteFrontmatter;
|
|
63
|
+
/**
|
|
64
|
+
* Write one parsed lab marker to a YAML-frontmatter markdown note.
|
|
65
|
+
*
|
|
66
|
+
* Note path: `<vaultDir>/labs/<panel-slug>/<marker-slug>-<date>.md`
|
|
67
|
+
* The date segment is the YYYY-MM-DD portion of collectedAtIso (colons stripped).
|
|
68
|
+
*
|
|
69
|
+
* Parent directories are created automatically. Returns the absolute path written.
|
|
70
|
+
*/
|
|
71
|
+
export declare function writeLabNote(vaultDir: string, marker: ParsedLabMarker, meta: LabNoteMeta): Promise<string>;
|
|
72
|
+
//# sourceMappingURL=lab-note.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lab-note.d.ts","sourceRoot":"","sources":["../../src/medical/lab-note.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAKH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAKtD,qFAAqF;AACrF,MAAM,MAAM,SAAS,GAAG,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,UAAU,CAAC;AAE/D,gFAAgF;AAChF,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,kEAAkE;IAClE,cAAc,EAAE,MAAM,CAAC;IACvB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;;GAGG;AACH,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,GAAG,SAAS,CAAC;IAC5B,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAC;IAC7B,gFAAgF;IAChF,SAAS,EAAE,MAAM,CAAC;IAClB,sEAAsE;IACtE,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,SAAS,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB;AAID;;;GAGG;AACH,wBAAgB,OAAO,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAKzC;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAC7B,KAAK,EAAE,MAAM,EACb,MAAM,CAAC,EAAE,MAAM,EACf,OAAO,CAAC,EAAE,MAAM,EAChB,QAAQ,CAAC,EAAE,OAAO,GACjB,SAAS,CAKX;AA8BD;;;;;;;;GAQG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,kBAAkB,CA2D5D;AAID;;;;;;;GAOG;AACH,wBAAsB,YAAY,CAChC,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,eAAe,EACvB,IAAI,EAAE,WAAW,GAChB,OAAO,CAAC,MAAM,CAAC,CAyCjB"}
|
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Lab-note vault writer — serializes parsed lab markers to YAML-frontmatter markdown notes.
|
|
3
|
+
*
|
|
4
|
+
* Status classification is deterministic JS: value vs reference range (ADR-3 spirit).
|
|
5
|
+
*
|
|
6
|
+
* PURE file I/O + deterministic helpers only.
|
|
7
|
+
* NO network. NO LLM. NO Date.now(). All timestamps are injected parameters.
|
|
8
|
+
*
|
|
9
|
+
* bober: hand-rolled YAML-frontmatter subset (flat scalars only, no arrays/nested objects).
|
|
10
|
+
* Mirror of src/vault/frontmatter.ts approach — never import that module.
|
|
11
|
+
* Swap for a vetted YAML library if quoted strings or nested objects are required.
|
|
12
|
+
*/
|
|
13
|
+
import { writeFile } from "node:fs/promises";
|
|
14
|
+
import { join, dirname } from "node:path";
|
|
15
|
+
import { ensureDir } from "../utils/fs.js";
|
|
16
|
+
// -- Pure helpers --------------------------------------------------------
|
|
17
|
+
/**
|
|
18
|
+
* Produce a URL-safe slug from an arbitrary string.
|
|
19
|
+
* Precedent: src/incident/timeline.ts:117.
|
|
20
|
+
*/
|
|
21
|
+
export function slugify(s) {
|
|
22
|
+
return s
|
|
23
|
+
.toLowerCase()
|
|
24
|
+
.replace(/[^a-z0-9]+/g, "-")
|
|
25
|
+
.replace(/^-+|-+$/g, "");
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Derive a deterministic lab status from value vs reference range.
|
|
29
|
+
* Pure sync — no LLM, no network, no Date.now() (ADR-3 spirit).
|
|
30
|
+
*
|
|
31
|
+
* Priority: critical flag wins; else compare to bounds; missing bounds → "normal".
|
|
32
|
+
*/
|
|
33
|
+
export function deriveLabStatus(value, refLow, refHigh, critical) {
|
|
34
|
+
if (critical === true)
|
|
35
|
+
return "critical";
|
|
36
|
+
if (refLow !== undefined && value < refLow)
|
|
37
|
+
return "low";
|
|
38
|
+
if (refHigh !== undefined && value > refHigh)
|
|
39
|
+
return "high";
|
|
40
|
+
return "normal";
|
|
41
|
+
}
|
|
42
|
+
// -- Hand-rolled YAML frontmatter ----------------------------------------
|
|
43
|
+
/** Matches an integer or float (with optional leading minus). */
|
|
44
|
+
const NUM_REGEX = /^-?\d+(\.\d+)?$/;
|
|
45
|
+
/**
|
|
46
|
+
* Serialize a LabNoteFrontmatter to a YAML-frontmatter markdown string.
|
|
47
|
+
* Produces `---\n<key: value lines>\n---\n`.
|
|
48
|
+
* Flat scalar keys only; undefined numeric values are serialized as empty strings.
|
|
49
|
+
*
|
|
50
|
+
* Mirror of src/vault/frontmatter.ts:145-164 — DO NOT import that module.
|
|
51
|
+
*/
|
|
52
|
+
function serializeLabFrontmatter(fm) {
|
|
53
|
+
const lines = ["---"];
|
|
54
|
+
lines.push(`marker: ${fm.marker}`);
|
|
55
|
+
lines.push(`value: ${String(fm.value)}`);
|
|
56
|
+
lines.push(`unit: ${fm.unit}`);
|
|
57
|
+
lines.push(`ref_low: ${fm.ref_low !== undefined ? String(fm.ref_low) : ""}`);
|
|
58
|
+
lines.push(`ref_high: ${fm.ref_high !== undefined ? String(fm.ref_high) : ""}`);
|
|
59
|
+
lines.push(`ref_range: ${fm.ref_range}`);
|
|
60
|
+
lines.push(`date: ${fm.date}`);
|
|
61
|
+
lines.push(`status: ${fm.status}`);
|
|
62
|
+
lines.push(`panel: ${fm.panel}`);
|
|
63
|
+
lines.push(`source: ${fm.source}`);
|
|
64
|
+
lines.push("---");
|
|
65
|
+
return lines.join("\n") + "\n";
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Parse the YAML frontmatter from a raw lab-note markdown string.
|
|
69
|
+
* Numeric fields (value, ref_low, ref_high) are coerced from their string representation.
|
|
70
|
+
* ref_low / ref_high are undefined when the value is absent or empty.
|
|
71
|
+
*
|
|
72
|
+
* Throws if the opening or closing `---` fence is missing.
|
|
73
|
+
*
|
|
74
|
+
* Mirror of src/vault/frontmatter.ts:53-135 — DO NOT import that module.
|
|
75
|
+
*/
|
|
76
|
+
export function parseLabNote(raw) {
|
|
77
|
+
const lines = raw.split("\n");
|
|
78
|
+
if (lines[0]?.trim() !== "---") {
|
|
79
|
+
throw new Error("parseLabNote: missing opening '---' fence");
|
|
80
|
+
}
|
|
81
|
+
let closingIdx = -1;
|
|
82
|
+
for (let i = 1; i < lines.length; i++) {
|
|
83
|
+
if (lines[i].trim() === "---") {
|
|
84
|
+
closingIdx = i;
|
|
85
|
+
break;
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
if (closingIdx === -1) {
|
|
89
|
+
throw new Error("parseLabNote: missing closing '---' fence");
|
|
90
|
+
}
|
|
91
|
+
const yamlLines = lines.slice(1, closingIdx);
|
|
92
|
+
const record = {};
|
|
93
|
+
for (const line of yamlLines) {
|
|
94
|
+
const colonIdx = line.indexOf(":");
|
|
95
|
+
if (colonIdx < 0)
|
|
96
|
+
continue;
|
|
97
|
+
const key = line.slice(0, colonIdx).trim();
|
|
98
|
+
if (key === "")
|
|
99
|
+
continue;
|
|
100
|
+
const rawVal = line.slice(colonIdx + 1).trim();
|
|
101
|
+
record[key] = NUM_REGEX.test(rawVal) ? Number(rawVal) : rawVal;
|
|
102
|
+
}
|
|
103
|
+
// -- Coerce and extract fields --
|
|
104
|
+
const marker = String(record["marker"] ?? "");
|
|
105
|
+
const valueRaw = record["value"];
|
|
106
|
+
const value = typeof valueRaw === "number" ? valueRaw : Number(valueRaw ?? 0);
|
|
107
|
+
const unit = String(record["unit"] ?? "");
|
|
108
|
+
const refLowRaw = record["ref_low"];
|
|
109
|
+
const ref_low = typeof refLowRaw === "number"
|
|
110
|
+
? refLowRaw
|
|
111
|
+
: refLowRaw === "" || refLowRaw === undefined
|
|
112
|
+
? undefined
|
|
113
|
+
: Number(refLowRaw);
|
|
114
|
+
const refHighRaw = record["ref_high"];
|
|
115
|
+
const ref_high = typeof refHighRaw === "number"
|
|
116
|
+
? refHighRaw
|
|
117
|
+
: refHighRaw === "" || refHighRaw === undefined
|
|
118
|
+
? undefined
|
|
119
|
+
: Number(refHighRaw);
|
|
120
|
+
const ref_range = String(record["ref_range"] ?? "");
|
|
121
|
+
const date = String(record["date"] ?? "");
|
|
122
|
+
const status = String(record["status"] ?? "normal");
|
|
123
|
+
const panel = String(record["panel"] ?? "");
|
|
124
|
+
const source = String(record["source"] ?? "");
|
|
125
|
+
return { marker, value, unit, ref_low, ref_high, ref_range, date, status, panel, source };
|
|
126
|
+
}
|
|
127
|
+
// -- Note writer ---------------------------------------------------------
|
|
128
|
+
/**
|
|
129
|
+
* Write one parsed lab marker to a YAML-frontmatter markdown note.
|
|
130
|
+
*
|
|
131
|
+
* Note path: `<vaultDir>/labs/<panel-slug>/<marker-slug>-<date>.md`
|
|
132
|
+
* The date segment is the YYYY-MM-DD portion of collectedAtIso (colons stripped).
|
|
133
|
+
*
|
|
134
|
+
* Parent directories are created automatically. Returns the absolute path written.
|
|
135
|
+
*/
|
|
136
|
+
export async function writeLabNote(vaultDir, marker, meta) {
|
|
137
|
+
const status = deriveLabStatus(marker.value, marker.referenceLow, marker.referenceHigh, marker.critical);
|
|
138
|
+
const refRange = marker.referenceLow !== undefined && marker.referenceHigh !== undefined
|
|
139
|
+
? `${marker.referenceLow}-${marker.referenceHigh}`
|
|
140
|
+
: "";
|
|
141
|
+
const fm = {
|
|
142
|
+
marker: marker.name,
|
|
143
|
+
value: marker.value,
|
|
144
|
+
unit: marker.unit,
|
|
145
|
+
ref_low: marker.referenceLow,
|
|
146
|
+
ref_high: marker.referenceHigh,
|
|
147
|
+
ref_range: refRange,
|
|
148
|
+
date: meta.collectedAtIso,
|
|
149
|
+
status,
|
|
150
|
+
panel: meta.panel,
|
|
151
|
+
source: meta.source,
|
|
152
|
+
};
|
|
153
|
+
// Use only the YYYY-MM-DD portion so the filename contains no colons.
|
|
154
|
+
const datePortion = meta.collectedAtIso.split("T")[0] ?? meta.collectedAtIso;
|
|
155
|
+
const notePath = join(vaultDir, "labs", slugify(meta.panel), `${slugify(marker.name)}-${datePortion}.md`);
|
|
156
|
+
const serialized = serializeLabFrontmatter(fm);
|
|
157
|
+
await ensureDir(dirname(notePath));
|
|
158
|
+
await writeFile(notePath, serialized, "utf-8");
|
|
159
|
+
return notePath;
|
|
160
|
+
}
|
|
161
|
+
//# sourceMappingURL=lab-note.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lab-note.js","sourceRoot":"","sources":["../../src/medical/lab-note.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { LLMClient } from "../providers/types.js";
|
|
2
|
+
import { type ParsedLabReport } from "./lab-types.js";
|
|
3
|
+
export interface ParseLabPdfDeps {
|
|
4
|
+
/** Injectable LLMClient; tests inject a fake, production uses buildMedicalInferenceClient (Sprint 3). */
|
|
5
|
+
client: LLMClient;
|
|
6
|
+
/** Model identifier to pass to the client. */
|
|
7
|
+
model: string;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Base64-encodes `pdfBytes`, sends it as an Anthropic document content block
|
|
11
|
+
* via an injectable `LLMClient` with schema-constrained output, and returns a
|
|
12
|
+
* Zod-validated `ParsedLabReport`. Throws a `ZodError` on malformed model output
|
|
13
|
+
* — never returns an unvalidated object.
|
|
14
|
+
*
|
|
15
|
+
* @param pdfBytes Raw bytes of a native-text PDF lab report.
|
|
16
|
+
* @param deps Injectable `{ client, model }` seam for testing and egress gating.
|
|
17
|
+
*/
|
|
18
|
+
export declare function parseLabPdf(pdfBytes: Uint8Array, deps: ParseLabPdfDeps): Promise<ParsedLabReport>;
|
|
19
|
+
//# sourceMappingURL=lab-pdf-parser.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lab-pdf-parser.d.ts","sourceRoot":"","sources":["../../src/medical/lab-pdf-parser.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,SAAS,EAAoB,MAAM,uBAAuB,CAAC;AACzE,OAAO,EAAyB,KAAK,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAI7E,MAAM,WAAW,eAAe;IAC9B,yGAAyG;IACzG,MAAM,EAAE,SAAS,CAAC;IAClB,8CAA8C;IAC9C,KAAK,EAAE,MAAM,CAAC;CACf;AA8BD;;;;;;;;GAQG;AACH,wBAAsB,WAAW,CAC/B,QAAQ,EAAE,UAAU,EACpB,IAAI,EAAE,eAAe,GACpB,OAAO,CAAC,eAAe,CAAC,CAsB1B"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
/** parseLabPdf — native-text lab PDF -> Zod-validated ParsedLabReport via injectable LLMClient. */
|
|
2
|
+
import { Buffer } from "node:buffer";
|
|
3
|
+
import { ParsedLabReportSchema } from "./lab-types.js";
|
|
4
|
+
// -- Response schema (hand-written JsonSchemaObject literal) ----------
|
|
5
|
+
const LAB_REPORT_JSON_SCHEMA = {
|
|
6
|
+
type: "object",
|
|
7
|
+
properties: {
|
|
8
|
+
panel: { type: "string" },
|
|
9
|
+
collectedAtIso: { type: "string" },
|
|
10
|
+
markers: {
|
|
11
|
+
type: "array",
|
|
12
|
+
items: {
|
|
13
|
+
type: "object",
|
|
14
|
+
properties: {
|
|
15
|
+
name: { type: "string" },
|
|
16
|
+
value: { type: "number" },
|
|
17
|
+
unit: { type: "string" },
|
|
18
|
+
referenceLow: { type: "number" },
|
|
19
|
+
referenceHigh: { type: "number" },
|
|
20
|
+
critical: { type: "boolean" },
|
|
21
|
+
},
|
|
22
|
+
required: ["name", "value", "unit"],
|
|
23
|
+
},
|
|
24
|
+
},
|
|
25
|
+
},
|
|
26
|
+
required: ["panel", "collectedAtIso", "markers"],
|
|
27
|
+
};
|
|
28
|
+
// -- parseLabPdf ------------------------------------------------------
|
|
29
|
+
/**
|
|
30
|
+
* Base64-encodes `pdfBytes`, sends it as an Anthropic document content block
|
|
31
|
+
* via an injectable `LLMClient` with schema-constrained output, and returns a
|
|
32
|
+
* Zod-validated `ParsedLabReport`. Throws a `ZodError` on malformed model output
|
|
33
|
+
* — never returns an unvalidated object.
|
|
34
|
+
*
|
|
35
|
+
* @param pdfBytes Raw bytes of a native-text PDF lab report.
|
|
36
|
+
* @param deps Injectable `{ client, model }` seam for testing and egress gating.
|
|
37
|
+
*/
|
|
38
|
+
export async function parseLabPdf(pdfBytes, deps) {
|
|
39
|
+
const base64 = Buffer.from(pdfBytes).toString("base64");
|
|
40
|
+
const response = await deps.client.chat({
|
|
41
|
+
model: deps.model,
|
|
42
|
+
system: "You are a medical data extraction assistant. Extract structured lab results from the provided PDF document. Return ONLY a JSON object matching the requested schema — no prose, no markdown.",
|
|
43
|
+
messages: [
|
|
44
|
+
{
|
|
45
|
+
role: "user",
|
|
46
|
+
content: "Extract all lab markers from the attached PDF. Return a JSON object with panel name, ISO collection date, and a markers array (name, numeric value, unit, optional referenceLow/referenceHigh/critical).",
|
|
47
|
+
},
|
|
48
|
+
],
|
|
49
|
+
documents: [{ base64, mediaType: "application/pdf" }],
|
|
50
|
+
responseSchema: LAB_REPORT_JSON_SCHEMA,
|
|
51
|
+
});
|
|
52
|
+
// With responseSchema set, the adapter guarantees response.text holds the JSON document.
|
|
53
|
+
const parsed = JSON.parse(response.text);
|
|
54
|
+
// Throws ZodError on malformed output — never coerce (sc-1-4).
|
|
55
|
+
return ParsedLabReportSchema.parse(parsed);
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=lab-pdf-parser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lab-pdf-parser.js","sourceRoot":"","sources":["../../src/medical/lab-pdf-parser.ts"],"names":[],"mappings":"AAAA,mGAAmG;AACnG,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAGrC,OAAO,EAAE,qBAAqB,EAAwB,MAAM,gBAAgB,CAAC;AAW7E,wEAAwE;AAExE,MAAM,sBAAsB,GAAqB;IAC/C,IAAI,EAAE,QAAQ;IACd,UAAU,EAAE;QACV,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;QACzB,cAAc,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;QAClC,OAAO,EAAE;YACP,IAAI,EAAE,OAAO;YACb,KAAK,EAAE;gBACL,IAAI,EAAE,QAAQ;gBACd,UAAU,EAAE;oBACV,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;oBACxB,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;oBACzB,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;oBACxB,YAAY,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;oBAChC,aAAa,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;oBACjC,QAAQ,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE;iBAC9B;gBACD,QAAQ,EAAE,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC;aACpC;SACF;KACF;IACD,QAAQ,EAAE,CAAC,OAAO,EAAE,gBAAgB,EAAE,SAAS,CAAC;CACjD,CAAC;AAEF,wEAAwE;AAExE;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,QAAoB,EACpB,IAAqB;IAErB,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAExD,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC;QACtC,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,MAAM,EACJ,8LAA8L;QAChM,QAAQ,EAAE;YACR;gBACE,IAAI,EAAE,MAAM;gBACZ,OAAO,EACL,0MAA0M;aAC7M;SACF;QACD,SAAS,EAAE,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,iBAAiB,EAAE,CAAC;QACrD,cAAc,EAAE,sBAAsB;KACvC,CAAC,CAAC;IAEH,yFAAyF;IACzF,MAAM,MAAM,GAAY,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;IAClD,+DAA+D;IAC/D,OAAO,qBAAqB,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;AAC7C,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Lab-note reindexer — globs lab vault notes and upserts each result into HealthDataStore.
|
|
3
|
+
*
|
|
4
|
+
* Pure file + SQLite. NO network. NO LLM. NO Date.now().
|
|
5
|
+
*
|
|
6
|
+
* Architecture: vault is canonical; SQLite store is a derived, rebuildable index.
|
|
7
|
+
* Dedup runs at ingest time via the deterministic labResultId (INSERT OR IGNORE).
|
|
8
|
+
* Re-running over unchanged notes returns 0 new rows (idempotent).
|
|
9
|
+
*/
|
|
10
|
+
import type { HealthDataStore } from "./health-store.js";
|
|
11
|
+
/**
|
|
12
|
+
* Glob all markdown notes under `<vaultDir>/labs/`, parse each note's YAML frontmatter,
|
|
13
|
+
* map the fields to a LabResult, and upsert into the store.
|
|
14
|
+
*
|
|
15
|
+
* Returns the total count of NEW rows inserted (sum of upsertLabResult return values).
|
|
16
|
+
* Duplicate notes produce 0 new rows — dedup is automatic via the deterministic
|
|
17
|
+
* labResultId (biomarker|collectedAtIso|value) under INSERT OR IGNORE.
|
|
18
|
+
*
|
|
19
|
+
* @param vaultDir Root of the vault directory tree (contains the `labs/` subdirectory).
|
|
20
|
+
* @param store An open HealthDataStore instance to upsert into.
|
|
21
|
+
* @returns Number of genuinely new rows inserted in this run.
|
|
22
|
+
*/
|
|
23
|
+
export declare function reindexLabNotes(vaultDir: string, store: HealthDataStore): Promise<number>;
|
|
24
|
+
//# sourceMappingURL=lab-reindex.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lab-reindex.d.ts","sourceRoot":"","sources":["../../src/medical/lab-reindex.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAOH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAIzD;;;;;;;;;;;GAWG;AACH,wBAAsB,eAAe,CACnC,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,eAAe,GACrB,OAAO,CAAC,MAAM,CAAC,CAuBjB"}
|