agent-bober 0.17.1 → 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 +26 -0
- package/README.md +402 -10
- 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/answerer.d.ts +17 -0
- package/dist/chat/answerer.d.ts.map +1 -0
- package/dist/chat/answerer.js +52 -0
- package/dist/chat/answerer.js.map +1 -0
- package/dist/chat/approval-cursor.d.ts +25 -0
- package/dist/chat/approval-cursor.d.ts.map +1 -0
- package/dist/chat/approval-cursor.js +61 -0
- package/dist/chat/approval-cursor.js.map +1 -0
- package/dist/chat/approval-reader.d.ts +11 -0
- package/dist/chat/approval-reader.d.ts.map +1 -0
- package/dist/chat/approval-reader.js +20 -0
- package/dist/chat/approval-reader.js.map +1 -0
- package/dist/chat/careful-sidecar.d.ts +15 -0
- package/dist/chat/careful-sidecar.d.ts.map +1 -0
- package/dist/chat/careful-sidecar.js +39 -0
- package/dist/chat/careful-sidecar.js.map +1 -0
- package/dist/chat/chat-session.d.ts +156 -0
- package/dist/chat/chat-session.d.ts.map +1 -0
- package/dist/chat/chat-session.js +570 -0
- package/dist/chat/chat-session.js.map +1 -0
- package/dist/chat/completion-tailer.d.ts +27 -0
- package/dist/chat/completion-tailer.d.ts.map +1 -0
- package/dist/chat/completion-tailer.js +187 -0
- package/dist/chat/completion-tailer.js.map +1 -0
- package/dist/chat/conversation-store.d.ts +22 -0
- package/dist/chat/conversation-store.d.ts.map +1 -0
- package/dist/chat/conversation-store.js +66 -0
- package/dist/chat/conversation-store.js.map +1 -0
- package/dist/chat/cursor-store.d.ts +23 -0
- package/dist/chat/cursor-store.d.ts.map +1 -0
- package/dist/chat/cursor-store.js +42 -0
- package/dist/chat/cursor-store.js.map +1 -0
- package/dist/chat/pid-sidecar.d.ts +22 -0
- package/dist/chat/pid-sidecar.d.ts.map +1 -0
- package/dist/chat/pid-sidecar.js +42 -0
- package/dist/chat/pid-sidecar.js.map +1 -0
- package/dist/chat/roster-reader.d.ts +16 -0
- package/dist/chat/roster-reader.d.ts.map +1 -0
- package/dist/chat/roster-reader.js +39 -0
- package/dist/chat/roster-reader.js.map +1 -0
- package/dist/chat/run-spawner.d.ts +71 -0
- package/dist/chat/run-spawner.d.ts.map +1 -0
- package/dist/chat/run-spawner.js +121 -0
- package/dist/chat/run-spawner.js.map +1 -0
- package/dist/chat/slash-commands.d.ts +40 -0
- package/dist/chat/slash-commands.d.ts.map +1 -0
- package/dist/chat/slash-commands.js +153 -0
- package/dist/chat/slash-commands.js.map +1 -0
- package/dist/chat/steer-cleanup.d.ts +12 -0
- package/dist/chat/steer-cleanup.d.ts.map +1 -0
- package/dist/chat/steer-cleanup.js +60 -0
- package/dist/chat/steer-cleanup.js.map +1 -0
- package/dist/chat/turn-classifier.d.ts +46 -0
- package/dist/chat/turn-classifier.d.ts.map +1 -0
- package/dist/chat/turn-classifier.js +157 -0
- package/dist/chat/turn-classifier.js.map +1 -0
- package/dist/cli/commands/blackboard.d.ts +33 -0
- package/dist/cli/commands/blackboard.d.ts.map +1 -0
- package/dist/cli/commands/blackboard.js +114 -0
- package/dist/cli/commands/blackboard.js.map +1 -0
- 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/chat.d.ts +13 -0
- package/dist/cli/commands/chat.d.ts.map +1 -0
- package/dist/cli/commands/chat.js +43 -0
- package/dist/cli/commands/chat.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/evolve.d.ts +18 -0
- package/dist/cli/commands/evolve.d.ts.map +1 -0
- package/dist/cli/commands/evolve.js +72 -0
- package/dist/cli/commands/evolve.js.map +1 -0
- package/dist/cli/commands/facts.d.ts +15 -0
- package/dist/cli/commands/facts.d.ts.map +1 -0
- package/dist/cli/commands/facts.js +213 -0
- package/dist/cli/commands/facts.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 +49 -0
- package/dist/cli/commands/medical.d.ts.map +1 -0
- package/dist/cli/commands/medical.js +365 -0
- package/dist/cli/commands/medical.js.map +1 -0
- package/dist/cli/commands/memory.d.ts +2 -1
- package/dist/cli/commands/memory.d.ts.map +1 -1
- package/dist/cli/commands/memory.js +94 -7
- package/dist/cli/commands/memory.js.map +1 -1
- package/dist/cli/commands/plan.d.ts.map +1 -1
- package/dist/cli/commands/plan.js +29 -3
- package/dist/cli/commands/plan.js.map +1 -1
- package/dist/cli/commands/replay.d.ts +17 -0
- package/dist/cli/commands/replay.d.ts.map +1 -0
- package/dist/cli/commands/replay.js +261 -0
- package/dist/cli/commands/replay.js.map +1 -0
- 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/run.d.ts +9 -0
- package/dist/cli/commands/run.d.ts.map +1 -1
- package/dist/cli/commands/run.js +27 -1
- package/dist/cli/commands/run.js.map +1 -1
- 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/sprint.d.ts.map +1 -1
- package/dist/cli/commands/sprint.js +17 -3
- package/dist/cli/commands/sprint.js.map +1 -1
- 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 +45 -0
- package/dist/cli/index.js.map +1 -1
- package/dist/config/defaults.d.ts.map +1 -1
- package/dist/config/defaults.js +8 -0
- package/dist/config/defaults.js.map +1 -1
- package/dist/config/role-providers.d.ts +16 -1
- package/dist/config/role-providers.d.ts.map +1 -1
- package/dist/config/role-providers.js +14 -2
- package/dist/config/role-providers.js.map +1 -1
- package/dist/config/schema.d.ts +4050 -454
- package/dist/config/schema.d.ts.map +1 -1
- package/dist/config/schema.js +429 -1
- package/dist/config/schema.js.map +1 -1
- package/dist/contracts/eval-result.d.ts +84 -84
- package/dist/contracts/spec.d.ts +28 -28
- package/dist/contracts/sprint-contract.d.ts +4 -4
- 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 +61 -0
- package/dist/fleet/critic-deep.d.ts.map +1 -0
- package/dist/fleet/critic-deep.js +202 -0
- package/dist/fleet/critic-deep.js.map +1 -0
- package/dist/fleet/decomposer-deep-constants.d.ts +4 -0
- package/dist/fleet/decomposer-deep-constants.d.ts.map +1 -0
- package/dist/fleet/decomposer-deep-constants.js +14 -0
- package/dist/fleet/decomposer-deep-constants.js.map +1 -0
- package/dist/fleet/decomposer-deep-types.d.ts +8 -0
- package/dist/fleet/decomposer-deep-types.d.ts.map +1 -0
- package/dist/fleet/decomposer-deep-types.js +9 -0
- package/dist/fleet/decomposer-deep-types.js.map +1 -0
- package/dist/fleet/decomposer-deep.d.ts +44 -0
- package/dist/fleet/decomposer-deep.d.ts.map +1 -0
- package/dist/fleet/decomposer-deep.js +261 -0
- package/dist/fleet/decomposer-deep.js.map +1 -0
- package/dist/fleet/decomposer.d.ts +22 -0
- package/dist/fleet/decomposer.d.ts.map +1 -0
- package/dist/fleet/decomposer.js +144 -0
- package/dist/fleet/decomposer.js.map +1 -0
- package/dist/fleet/index.d.ts +102 -0
- package/dist/fleet/index.d.ts.map +1 -1
- package/dist/fleet/index.js +316 -9
- package/dist/fleet/index.js.map +1 -1
- package/dist/fleet/manifest-write.d.ts +30 -0
- package/dist/fleet/manifest-write.d.ts.map +1 -0
- package/dist/fleet/manifest-write.js +90 -0
- package/dist/fleet/manifest-write.js.map +1 -0
- package/dist/fleet/manifest.d.ts +32 -6
- 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/fleet/shared-blackboard.d.ts +51 -0
- package/dist/fleet/shared-blackboard.d.ts.map +1 -0
- package/dist/fleet/shared-blackboard.js +79 -0
- package/dist/fleet/shared-blackboard.js.map +1 -0
- package/dist/fleet/synthesis.d.ts +16 -0
- package/dist/fleet/synthesis.d.ts.map +1 -0
- package/dist/fleet/synthesis.js +22 -0
- package/dist/fleet/synthesis.js.map +1 -0
- package/dist/fleet/tier-policy.d.ts +18 -0
- package/dist/fleet/tier-policy.d.ts.map +1 -0
- package/dist/fleet/tier-policy.js +53 -0
- package/dist/fleet/tier-policy.js.map +1 -0
- package/dist/fleet/tool-role-guard.d.ts +24 -0
- package/dist/fleet/tool-role-guard.d.ts.map +1 -0
- package/dist/fleet/tool-role-guard.js +55 -0
- package/dist/fleet/tool-role-guard.js.map +1 -0
- 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/incident/types.d.ts +8 -8
- 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/mcp/run-manager.d.ts +9 -1
- package/dist/mcp/run-manager.d.ts.map +1 -1
- package/dist/mcp/run-manager.js.map +1 -1
- package/dist/medical/adapters/apple-health.d.ts +32 -0
- package/dist/medical/adapters/apple-health.d.ts.map +1 -0
- package/dist/medical/adapters/apple-health.js +100 -0
- package/dist/medical/adapters/apple-health.js.map +1 -0
- 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/audit.d.ts +31 -0
- package/dist/medical/audit.d.ts.map +1 -0
- package/dist/medical/audit.js +56 -0
- package/dist/medical/audit.js.map +1 -0
- package/dist/medical/consent.d.ts +37 -0
- package/dist/medical/consent.d.ts.map +1 -0
- package/dist/medical/consent.js +73 -0
- package/dist/medical/consent.js.map +1 -0
- package/dist/medical/disclaimer.d.ts +11 -0
- package/dist/medical/disclaimer.d.ts.map +1 -0
- package/dist/medical/disclaimer.js +21 -0
- package/dist/medical/disclaimer.js.map +1 -0
- package/dist/medical/egress.d.ts +30 -0
- package/dist/medical/egress.d.ts.map +1 -0
- package/dist/medical/egress.js +50 -0
- package/dist/medical/egress.js.map +1 -0
- package/dist/medical/engine.d.ts +73 -0
- package/dist/medical/engine.d.ts.map +1 -0
- package/dist/medical/engine.js +333 -0
- package/dist/medical/engine.js.map +1 -0
- package/dist/medical/guardrails.d.ts +47 -0
- package/dist/medical/guardrails.d.ts.map +1 -0
- package/dist/medical/guardrails.js +92 -0
- package/dist/medical/guardrails.js.map +1 -0
- package/dist/medical/health-store.d.ts +85 -0
- package/dist/medical/health-store.d.ts.map +1 -0
- package/dist/medical/health-store.js +214 -0
- package/dist/medical/health-store.js.map +1 -0
- package/dist/medical/inference.d.ts +22 -0
- package/dist/medical/inference.d.ts.map +1 -0
- package/dist/medical/inference.js +39 -0
- package/dist/medical/inference.js.map +1 -0
- package/dist/medical/ingestion.d.ts +33 -0
- package/dist/medical/ingestion.d.ts.map +1 -0
- package/dist/medical/ingestion.js +52 -0
- package/dist/medical/ingestion.js.map +1 -0
- 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/numerics.d.ts +66 -0
- package/dist/medical/numerics.d.ts.map +1 -0
- package/dist/medical/numerics.js +216 -0
- package/dist/medical/numerics.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/red-flag.d.ts +42 -0
- package/dist/medical/red-flag.d.ts.map +1 -0
- package/dist/medical/red-flag.js +161 -0
- package/dist/medical/red-flag.js.map +1 -0
- package/dist/medical/refusal.d.ts +46 -0
- package/dist/medical/refusal.d.ts.map +1 -0
- package/dist/medical/refusal.js +131 -0
- package/dist/medical/refusal.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/retrieval/grounding-critic.d.ts +34 -0
- package/dist/medical/retrieval/grounding-critic.d.ts.map +1 -0
- package/dist/medical/retrieval/grounding-critic.js +153 -0
- package/dist/medical/retrieval/grounding-critic.js.map +1 -0
- package/dist/medical/retrieval/literature.d.ts +78 -0
- package/dist/medical/retrieval/literature.d.ts.map +1 -0
- package/dist/medical/retrieval/literature.js +292 -0
- package/dist/medical/retrieval/literature.js.map +1 -0
- package/dist/medical/retrieval/medline-source.d.ts +72 -0
- package/dist/medical/retrieval/medline-source.d.ts.map +1 -0
- package/dist/medical/retrieval/medline-source.js +120 -0
- package/dist/medical/retrieval/medline-source.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/medical/team.d.ts +15 -0
- package/dist/medical/team.d.ts.map +1 -0
- package/dist/medical/team.js +44 -0
- package/dist/medical/team.js.map +1 -0
- package/dist/medical/types.d.ts +175 -0
- package/dist/medical/types.d.ts.map +1 -0
- package/dist/medical/types.js +8 -0
- package/dist/medical/types.js.map +1 -0
- package/dist/medical/whoop/whoop-client.d.ts +114 -0
- package/dist/medical/whoop/whoop-client.d.ts.map +1 -0
- package/dist/medical/whoop/whoop-client.js +226 -0
- package/dist/medical/whoop/whoop-client.js.map +1 -0
- package/dist/medical/whoop/whoop-sync.d.ts +25 -0
- package/dist/medical/whoop/whoop-sync.d.ts.map +1 -0
- package/dist/medical/whoop/whoop-sync.js +97 -0
- package/dist/medical/whoop/whoop-sync.js.map +1 -0
- package/dist/medical/whoop/whoop-token.d.ts +44 -0
- package/dist/medical/whoop/whoop-token.d.ts.map +1 -0
- package/dist/medical/whoop/whoop-token.js +66 -0
- package/dist/medical/whoop/whoop-token.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/context-handoff.d.ts +60 -60
- package/dist/orchestrator/contract-materialization.d.ts +33 -0
- package/dist/orchestrator/contract-materialization.d.ts.map +1 -0
- package/dist/orchestrator/contract-materialization.js +113 -0
- package/dist/orchestrator/contract-materialization.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/memory/distill.d.ts +4 -1
- package/dist/orchestrator/memory/distill.d.ts.map +1 -1
- package/dist/orchestrator/memory/distill.js +41 -1
- package/dist/orchestrator/memory/distill.js.map +1 -1
- package/dist/orchestrator/memory/fact-detector.d.ts +61 -0
- package/dist/orchestrator/memory/fact-detector.d.ts.map +1 -0
- package/dist/orchestrator/memory/fact-detector.js +153 -0
- package/dist/orchestrator/memory/fact-detector.js.map +1 -0
- package/dist/orchestrator/memory/fact-judge.d.ts +19 -0
- package/dist/orchestrator/memory/fact-judge.d.ts.map +1 -0
- package/dist/orchestrator/memory/fact-judge.js +121 -0
- package/dist/orchestrator/memory/fact-judge.js.map +1 -0
- package/dist/orchestrator/memory/fact-retrieve.d.ts +52 -0
- package/dist/orchestrator/memory/fact-retrieve.d.ts.map +1 -0
- package/dist/orchestrator/memory/fact-retrieve.js +117 -0
- package/dist/orchestrator/memory/fact-retrieve.js.map +1 -0
- package/dist/orchestrator/memory/hygiene.d.ts +66 -0
- package/dist/orchestrator/memory/hygiene.d.ts.map +1 -0
- package/dist/orchestrator/memory/hygiene.js +153 -0
- package/dist/orchestrator/memory/hygiene.js.map +1 -0
- package/dist/orchestrator/memory/reconcile.d.ts +47 -0
- package/dist/orchestrator/memory/reconcile.d.ts.map +1 -0
- package/dist/orchestrator/memory/reconcile.js +116 -0
- package/dist/orchestrator/memory/reconcile.js.map +1 -0
- package/dist/orchestrator/memory/retrieve.d.ts +5 -3
- package/dist/orchestrator/memory/retrieve.d.ts.map +1 -1
- package/dist/orchestrator/memory/retrieve.js +9 -6
- package/dist/orchestrator/memory/retrieve.js.map +1 -1
- 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 +29 -4
- package/dist/orchestrator/pipeline.d.ts.map +1 -1
- package/dist/orchestrator/pipeline.js +165 -56
- package/dist/orchestrator/pipeline.js.map +1 -1
- package/dist/orchestrator/planner-agent.d.ts.map +1 -1
- package/dist/orchestrator/planner-agent.js +16 -1
- package/dist/orchestrator/planner-agent.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/selfimprove/eval-guards.d.ts +51 -0
- package/dist/orchestrator/selfimprove/eval-guards.d.ts.map +1 -0
- package/dist/orchestrator/selfimprove/eval-guards.js +120 -0
- package/dist/orchestrator/selfimprove/eval-guards.js.map +1 -0
- package/dist/orchestrator/selfimprove/gepa.d.ts +74 -0
- package/dist/orchestrator/selfimprove/gepa.d.ts.map +1 -0
- package/dist/orchestrator/selfimprove/gepa.js +227 -0
- package/dist/orchestrator/selfimprove/gepa.js.map +1 -0
- package/dist/orchestrator/selfimprove/replay-harness.d.ts +65 -0
- package/dist/orchestrator/selfimprove/replay-harness.d.ts.map +1 -0
- package/dist/orchestrator/selfimprove/replay-harness.js +134 -0
- package/dist/orchestrator/selfimprove/replay-harness.js.map +1 -0
- package/dist/orchestrator/selfimprove/replay-store.d.ts +45 -0
- package/dist/orchestrator/selfimprove/replay-store.d.ts.map +1 -0
- package/dist/orchestrator/selfimprove/replay-store.js +119 -0
- package/dist/orchestrator/selfimprove/replay-store.js.map +1 -0
- package/dist/orchestrator/selfimprove/replay-types.d.ts +32 -0
- package/dist/orchestrator/selfimprove/replay-types.d.ts.map +1 -0
- package/dist/orchestrator/selfimprove/replay-types.js +15 -0
- package/dist/orchestrator/selfimprove/replay-types.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 +4 -2
- package/dist/orchestrator/workflow/engine.d.ts.map +1 -1
- package/dist/orchestrator/workflow/selector.d.ts +18 -0
- package/dist/orchestrator/workflow/selector.d.ts.map +1 -1
- package/dist/orchestrator/workflow/selector.js +51 -0
- package/dist/orchestrator/workflow/selector.js.map +1 -1
- package/dist/orchestrator/workflow/ts-engine.d.ts +3 -1
- package/dist/orchestrator/workflow/ts-engine.d.ts.map +1 -1
- package/dist/orchestrator/workflow/ts-engine.js +2 -2
- package/dist/orchestrator/workflow/ts-engine.js.map +1 -1
- package/dist/orchestrator/workflow/workflow-engine.d.ts +3 -1
- package/dist/orchestrator/workflow/workflow-engine.d.ts.map +1 -1
- package/dist/orchestrator/workflow/workflow-engine.js +3 -3
- package/dist/orchestrator/workflow/workflow-engine.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 +114 -0
- package/dist/state/facts.d.ts.map +1 -0
- package/dist/state/facts.js +218 -0
- package/dist/state/facts.js.map +1 -0
- package/dist/state/guidance.d.ts +37 -0
- package/dist/state/guidance.d.ts.map +1 -0
- package/dist/state/guidance.js +144 -0
- package/dist/state/guidance.js.map +1 -0
- package/dist/state/history.d.ts +2 -2
- package/dist/state/index.d.ts +2 -2
- package/dist/state/index.d.ts.map +1 -1
- package/dist/state/index.js +2 -2
- package/dist/state/index.js.map +1 -1
- package/dist/state/memory.d.ts +43 -11
- package/dist/state/memory.d.ts.map +1 -1
- package/dist/state/memory.js +93 -15
- package/dist/state/memory.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/pause.d.ts +47 -0
- package/dist/state/pause.d.ts.map +1 -0
- package/dist/state/pause.js +146 -0
- package/dist/state/pause.js.map +1 -0
- 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/state/sprint-state.d.ts +8 -0
- package/dist/state/sprint-state.d.ts.map +1 -1
- package/dist/state/sprint-state.js +32 -1
- package/dist/state/sprint-state.js.map +1 -1
- package/dist/teams/registry.d.ts +16 -0
- package/dist/teams/registry.d.ts.map +1 -0
- package/dist/teams/registry.js +70 -0
- package/dist/teams/registry.js.map +1 -0
- package/dist/teams/types.d.ts +25 -0
- package/dist/teams/types.d.ts.map +1 -0
- package/dist/teams/types.js +2 -0
- package/dist/teams/types.js.map +1 -0
- 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 +22 -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,68 @@
|
|
|
1
|
+
import type { BoberConfig } from "../config/schema.js";
|
|
2
|
+
import type { SprintContract } from "../contracts/sprint-contract.js";
|
|
3
|
+
import type { EvaluationRunResult } from "../evaluators/registry.js";
|
|
4
|
+
import type { ReviewResult } from "./code-reviewer-agent.js";
|
|
5
|
+
import type { SecurityAuditResult, SecurityFinding } from "./security-audit-types.js";
|
|
6
|
+
import type { SecurityDiffProvider } from "./security-knowledge/diff-provider.js";
|
|
7
|
+
import type { SecurityVerifier } from "./security-verifier-agent.js";
|
|
8
|
+
/**
|
|
9
|
+
* Injectable dependencies for `runSecurityAudit`. `diffProvider` (sprint 6)
|
|
10
|
+
* and `verifier` (sprint 8) so tests never shell real git or spawn a second
|
|
11
|
+
* real LLM loop; both default to the real implementations. Appended so all
|
|
12
|
+
* existing positional callers stay byte-compatible.
|
|
13
|
+
*/
|
|
14
|
+
export interface SecurityAuditDeps {
|
|
15
|
+
diffProvider?: SecurityDiffProvider;
|
|
16
|
+
verifier?: SecurityVerifier;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Run the bober-security-auditor subagent for a stack-aware security audit.
|
|
20
|
+
*
|
|
21
|
+
* Mirrors runCodeReviewer's structure (prompt build → runAgenticLoop with
|
|
22
|
+
* read-only tools → parse → persist) but the parse is FAIL-CLOSED: an
|
|
23
|
+
* unparseable auditor response resolves with `parsed:false` and a forced
|
|
24
|
+
* `verdict:'blocked'` — it never silently degrades to a clean pass the way
|
|
25
|
+
* the advisory code reviewer's fallback does.
|
|
26
|
+
*
|
|
27
|
+
* Two distinct failure modes (per arch-20260712-security-audit-agent-team
|
|
28
|
+
* API contracts):
|
|
29
|
+
* - Provider/network/budget error → THROWS (propagates to the caller).
|
|
30
|
+
* - Unparseable auditor output → RESOLVES with `parsed:false`, `verdict:'blocked'`.
|
|
31
|
+
*
|
|
32
|
+
* @param contract The sprint contract to audit.
|
|
33
|
+
* @param evaluation The evaluation result when running in-pipeline (post-evaluation),
|
|
34
|
+
* or `null` for standalone mode — the evaluation-context section of
|
|
35
|
+
* the prompt is omitted entirely when null.
|
|
36
|
+
* @param projectRoot Absolute path to the project root.
|
|
37
|
+
* @param config The resolved bober configuration (reads `config.security` and
|
|
38
|
+
* `config.project.stack`; both optional).
|
|
39
|
+
* @param priors Deterministic scanner findings supplied directly by the caller.
|
|
40
|
+
* Combined with any findings produced internally by
|
|
41
|
+
* `runScannerPreFilter` when `config.security.scanners` is
|
|
42
|
+
* non-empty; the combined list is rendered into a "ground
|
|
43
|
+
* truth priors" prompt section when non-empty. Defaults to [].
|
|
44
|
+
* @param deps Injectable dependencies — the diff provider (sprint 6,
|
|
45
|
+
* defaults to `securityDiffProvider`) and the verifier
|
|
46
|
+
* (sprint 8, defaults to `runSecurityVerifier`). Appended
|
|
47
|
+
* last so all existing positional callers stay byte-compatible.
|
|
48
|
+
* @returns A SecurityAuditResult, already persisted via saveSecurityAudit.
|
|
49
|
+
*/
|
|
50
|
+
export declare function runSecurityAudit(contract: SprintContract, evaluation: EvaluationRunResult | null, projectRoot: string, config: BoberConfig, priors?: SecurityFinding[], deps?: SecurityAuditDeps): Promise<SecurityAuditResult>;
|
|
51
|
+
/**
|
|
52
|
+
* Parse the security auditor's response into a ReviewResult.
|
|
53
|
+
*
|
|
54
|
+
* Reuses the same resilient extraction ladder as
|
|
55
|
+
* code-reviewer-agent.ts:parseReviewResult (direct parse → markdown-fence →
|
|
56
|
+
* first-`{`-to-last-`}` slice), but INVERTS its fallback: on any parse
|
|
57
|
+
* failure (garbage text, truncated JSON, non-object shape), this returns
|
|
58
|
+
* `parsed:false` with an empty review — never a silently "clean" result.
|
|
59
|
+
* The caller forces `verdict:'blocked'` whenever `parsed` is false.
|
|
60
|
+
*
|
|
61
|
+
* A genuinely clean audit (empty critical, well-formed JSON) is
|
|
62
|
+
* `parsed:true` — distinguishable from the parse-failure case.
|
|
63
|
+
*/
|
|
64
|
+
export declare function parseSecurityAuditResult(text: string, contractId: string, specId: string): {
|
|
65
|
+
review: ReviewResult;
|
|
66
|
+
parsed: boolean;
|
|
67
|
+
};
|
|
68
|
+
//# sourceMappingURL=security-auditor-agent.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"security-auditor-agent.d.ts","sourceRoot":"","sources":["../../src/orchestrator/security-auditor-agent.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AACtE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AACrE,OAAO,KAAK,EAAE,YAAY,EAAiB,MAAM,0BAA0B,CAAC;AAC5E,OAAO,KAAK,EAAE,mBAAmB,EAAE,eAAe,EAAa,MAAM,2BAA2B,CAAC;AAajG,OAAO,KAAK,EAAa,oBAAoB,EAAE,MAAM,uCAAuC,CAAC;AAG7F,OAAO,KAAK,EAAE,gBAAgB,EAAkB,MAAM,8BAA8B,CAAC;AAIrF;;;;;GAKG;AACH,MAAM,WAAW,iBAAiB;IAChC,YAAY,CAAC,EAAE,oBAAoB,CAAC;IACpC,QAAQ,CAAC,EAAE,gBAAgB,CAAC;CAC7B;AAeD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AACH,wBAAsB,gBAAgB,CACpC,QAAQ,EAAE,cAAc,EACxB,UAAU,EAAE,mBAAmB,GAAG,IAAI,EACtC,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,WAAW,EACnB,MAAM,GAAE,eAAe,EAAO,EAC9B,IAAI,GAAE,iBAAsB,GAC3B,OAAO,CAAC,mBAAmB,CAAC,CAmO9B;AAsKD;;;;;;;;;;;;GAYG;AACH,wBAAgB,wBAAwB,CACtC,IAAI,EAAE,MAAM,EACZ,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,MAAM,GACb;IAAE,MAAM,EAAE,YAAY,CAAC;IAAC,MAAM,EAAE,OAAO,CAAA;CAAE,CAuE3C"}
|
|
@@ -0,0 +1,482 @@
|
|
|
1
|
+
import { deriveVerdict } from "./security-audit-types.js";
|
|
2
|
+
import { createClient } from "../providers/factory.js";
|
|
3
|
+
import { resolveModel } from "./model-resolver.js";
|
|
4
|
+
import { assembleSystemPrompt } from "./agent-loader.js";
|
|
5
|
+
import { resolveRoleTools, getGraphState, getGraphDeps } from "./tools/index.js";
|
|
6
|
+
import { runAgenticLoop } from "./agentic-loop.js";
|
|
7
|
+
import { budgetFromMaxUsd } from "./workflow/budget.js";
|
|
8
|
+
import { saveSecurityAudit } from "../state/security-audit-state.js";
|
|
9
|
+
import { ALL_VULN_CLASSES } from "./stack-knowledge.js";
|
|
10
|
+
import { resolveStackSecurityContext } from "./security-knowledge/resolver.js";
|
|
11
|
+
import { SecurityKnowledgeIndex } from "./security-knowledge/index.js";
|
|
12
|
+
import { runScannerPreFilter, isNetworkScanner } from "./security-scanners.js";
|
|
13
|
+
import { securityDiffProvider, extractDiffKeywords } from "./security-knowledge/diff-provider.js";
|
|
14
|
+
import { inspectSupplyChain } from "./security-knowledge/supply-chain-inspector.js";
|
|
15
|
+
import { runSecurityVerifier } from "./security-verifier-agent.js";
|
|
16
|
+
import { logger } from "../utils/logger.js";
|
|
17
|
+
// bober: one memoised index per process (ADR-7, no runtime invalidation) —
|
|
18
|
+
// swap for an injectable dependency if per-request skill reloading is ever needed.
|
|
19
|
+
let sharedSecurityKnowledgeIndex = null;
|
|
20
|
+
function getSecurityKnowledgeIndex() {
|
|
21
|
+
if (!sharedSecurityKnowledgeIndex) {
|
|
22
|
+
sharedSecurityKnowledgeIndex = new SecurityKnowledgeIndex();
|
|
23
|
+
}
|
|
24
|
+
return sharedSecurityKnowledgeIndex;
|
|
25
|
+
}
|
|
26
|
+
// ── Main ───────────────────────────────────────────────────────────
|
|
27
|
+
/**
|
|
28
|
+
* Run the bober-security-auditor subagent for a stack-aware security audit.
|
|
29
|
+
*
|
|
30
|
+
* Mirrors runCodeReviewer's structure (prompt build → runAgenticLoop with
|
|
31
|
+
* read-only tools → parse → persist) but the parse is FAIL-CLOSED: an
|
|
32
|
+
* unparseable auditor response resolves with `parsed:false` and a forced
|
|
33
|
+
* `verdict:'blocked'` — it never silently degrades to a clean pass the way
|
|
34
|
+
* the advisory code reviewer's fallback does.
|
|
35
|
+
*
|
|
36
|
+
* Two distinct failure modes (per arch-20260712-security-audit-agent-team
|
|
37
|
+
* API contracts):
|
|
38
|
+
* - Provider/network/budget error → THROWS (propagates to the caller).
|
|
39
|
+
* - Unparseable auditor output → RESOLVES with `parsed:false`, `verdict:'blocked'`.
|
|
40
|
+
*
|
|
41
|
+
* @param contract The sprint contract to audit.
|
|
42
|
+
* @param evaluation The evaluation result when running in-pipeline (post-evaluation),
|
|
43
|
+
* or `null` for standalone mode — the evaluation-context section of
|
|
44
|
+
* the prompt is omitted entirely when null.
|
|
45
|
+
* @param projectRoot Absolute path to the project root.
|
|
46
|
+
* @param config The resolved bober configuration (reads `config.security` and
|
|
47
|
+
* `config.project.stack`; both optional).
|
|
48
|
+
* @param priors Deterministic scanner findings supplied directly by the caller.
|
|
49
|
+
* Combined with any findings produced internally by
|
|
50
|
+
* `runScannerPreFilter` when `config.security.scanners` is
|
|
51
|
+
* non-empty; the combined list is rendered into a "ground
|
|
52
|
+
* truth priors" prompt section when non-empty. Defaults to [].
|
|
53
|
+
* @param deps Injectable dependencies — the diff provider (sprint 6,
|
|
54
|
+
* defaults to `securityDiffProvider`) and the verifier
|
|
55
|
+
* (sprint 8, defaults to `runSecurityVerifier`). Appended
|
|
56
|
+
* last so all existing positional callers stay byte-compatible.
|
|
57
|
+
* @returns A SecurityAuditResult, already persisted via saveSecurityAudit.
|
|
58
|
+
*/
|
|
59
|
+
export async function runSecurityAudit(contract, evaluation, projectRoot, config, priors = [], deps = {}) {
|
|
60
|
+
const contractId = contract.contractId;
|
|
61
|
+
logger.sprint(contractId, `Security audit: ${contract.title}`);
|
|
62
|
+
const securityModel = config.security?.model ?? "opus";
|
|
63
|
+
const model = resolveModel(securityModel);
|
|
64
|
+
const maxTurns = config.security?.maxTurns ?? 20;
|
|
65
|
+
// Security auditor reuses the "curator" role's tool set — read-only,
|
|
66
|
+
// no execution (read_file, glob, grep). It never gets bash, write, or
|
|
67
|
+
// edit tools (nonGoals[3]): unlike the evaluator/code-reviewer roles,
|
|
68
|
+
// the auditor must not be able to run shell commands at all.
|
|
69
|
+
const graphState = getGraphState(config);
|
|
70
|
+
const graphDeps = graphState.engineHealth === "ready" ? getGraphDeps() : undefined;
|
|
71
|
+
const toolSet = resolveRoleTools("curator", projectRoot, graphState, graphDeps ?? undefined);
|
|
72
|
+
const systemPrompt = await assembleSystemPrompt("curator", "bober-security-auditor", projectRoot, graphState);
|
|
73
|
+
const client = createClient(config.security?.provider ?? null, config.security?.endpoint ?? null, config.security?.providerConfig, securityModel, "SecurityAuditor");
|
|
74
|
+
const knowledgeIndex = getSecurityKnowledgeIndex();
|
|
75
|
+
await knowledgeIndex.load();
|
|
76
|
+
// Sprint-6: compute the real diff ONCE (opt-in via config.security.diff.mode
|
|
77
|
+
// === 'git-diff'; default 'estimated-files' keeps today's exact behavior).
|
|
78
|
+
// The diff is read-only input to the resolver/selector/finder — git runs
|
|
79
|
+
// ONLY here, in orchestrator Node, never as an auditor tool (ADR-5).
|
|
80
|
+
let changedPaths = contract.estimatedFiles;
|
|
81
|
+
let diffKeywords = [];
|
|
82
|
+
let auditDiff;
|
|
83
|
+
if (config.security?.diff?.mode === "git-diff") {
|
|
84
|
+
const provider = deps.diffProvider ?? securityDiffProvider;
|
|
85
|
+
const diffAbort = new AbortController();
|
|
86
|
+
const diffTimer = setTimeout(() => diffAbort.abort(), config.security?.timeoutMs ?? 300_000);
|
|
87
|
+
try {
|
|
88
|
+
auditDiff = await provider.compute({
|
|
89
|
+
projectRoot,
|
|
90
|
+
baseRef: config.security.diff.baseRef,
|
|
91
|
+
expandWithGraph: config.security.diff.expandWithGraph,
|
|
92
|
+
signal: diffAbort.signal,
|
|
93
|
+
config,
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
finally {
|
|
97
|
+
clearTimeout(diffTimer);
|
|
98
|
+
}
|
|
99
|
+
// Empty diff (no changes / provider failure) falls back to estimatedFiles
|
|
100
|
+
// — no regression from today's behavior (sc-6-5).
|
|
101
|
+
const files = auditDiff.changedFiles.map((f) => f.path);
|
|
102
|
+
if (files.length > 0) {
|
|
103
|
+
changedPaths = files;
|
|
104
|
+
diffKeywords = extractDiffKeywords(auditDiff.changedFiles);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
const ctx = await resolveStackSecurityContext({
|
|
108
|
+
stack: config.project.stack,
|
|
109
|
+
changedPaths,
|
|
110
|
+
diffKeywords,
|
|
111
|
+
index: knowledgeIndex,
|
|
112
|
+
});
|
|
113
|
+
// Sprint-5 seam: when scanners are configured, run the deterministic
|
|
114
|
+
// pre-filter INSIDE the audit path (under its own AbortController keyed to
|
|
115
|
+
// the same timeout the gate time-boxes the whole audit against — ADR-4)
|
|
116
|
+
// and fold its findings in as additional priors. Absent scanners config,
|
|
117
|
+
// this is a pure no-op: zero child processes spawned.
|
|
118
|
+
const configuredScanners = config.security?.scanners ?? [];
|
|
119
|
+
let effectivePriors = priors;
|
|
120
|
+
if (configuredScanners.length > 0) {
|
|
121
|
+
const scannerAbort = new AbortController();
|
|
122
|
+
const scannerTimer = setTimeout(() => scannerAbort.abort(), config.security?.timeoutMs ?? 300_000);
|
|
123
|
+
try {
|
|
124
|
+
const scannerPriors = await runScannerPreFilter({
|
|
125
|
+
scanners: configuredScanners,
|
|
126
|
+
projectRoot,
|
|
127
|
+
signal: scannerAbort.signal,
|
|
128
|
+
});
|
|
129
|
+
effectivePriors = [...priors, ...scannerPriors];
|
|
130
|
+
}
|
|
131
|
+
finally {
|
|
132
|
+
clearTimeout(scannerTimer);
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
// Sprint-7 seam (supply-chain axis, ADR-4): when supplyChain.enabled, fold
|
|
136
|
+
// both the (network-gated) scanner pre-filter and the always-available
|
|
137
|
+
// OFFLINE diff inspector into effectivePriors. Network-capable scanner
|
|
138
|
+
// kinds (npm-audit/osv-scanner) only run when egress.onlineResearch is
|
|
139
|
+
// explicitly true (default false); gitleaks and the offline inspector run
|
|
140
|
+
// regardless of egress — neither one touches the network. The offline
|
|
141
|
+
// inspector runs even when zero external scanners are configured; it is
|
|
142
|
+
// itself the "always-available" half of the axis.
|
|
143
|
+
const supplyChain = config.security?.supplyChain;
|
|
144
|
+
if (supplyChain?.enabled) {
|
|
145
|
+
const scAbort = new AbortController();
|
|
146
|
+
const scTimer = setTimeout(() => scAbort.abort(), config.security?.timeoutMs ?? 300_000);
|
|
147
|
+
try {
|
|
148
|
+
const onlineOk = config.security?.egress?.onlineResearch === true;
|
|
149
|
+
const scScanners = onlineOk
|
|
150
|
+
? (supplyChain.scanners ?? [])
|
|
151
|
+
: (supplyChain.scanners ?? []).filter((s) => !isNetworkScanner(s));
|
|
152
|
+
const scannerPriors = scScanners.length > 0
|
|
153
|
+
? await runScannerPreFilter({ scanners: scScanners, projectRoot, signal: scAbort.signal })
|
|
154
|
+
: [];
|
|
155
|
+
const inspectorPriors = auditDiff
|
|
156
|
+
? await inspectSupplyChain({ projectRoot, diff: auditDiff, signal: scAbort.signal })
|
|
157
|
+
: [];
|
|
158
|
+
effectivePriors = [...effectivePriors, ...scannerPriors, ...inspectorPriors];
|
|
159
|
+
}
|
|
160
|
+
finally {
|
|
161
|
+
clearTimeout(scTimer);
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
const userMessage = buildUserMessage(contract, evaluation, projectRoot, ctx.stackLabel, ctx.skillName, ctx.promptFragment, effectivePriors, auditDiff);
|
|
165
|
+
logger.info(`Calling security auditor model (${securityModel} → ${model})...`);
|
|
166
|
+
const budget = budgetFromMaxUsd(config.security?.budget?.maxUsd);
|
|
167
|
+
const result = await runAgenticLoop({
|
|
168
|
+
client,
|
|
169
|
+
model,
|
|
170
|
+
systemPrompt,
|
|
171
|
+
userMessage,
|
|
172
|
+
tools: toolSet.schemas,
|
|
173
|
+
toolHandlers: toolSet.handlers,
|
|
174
|
+
maxTurns,
|
|
175
|
+
maxTokens: 16384,
|
|
176
|
+
...(budget !== undefined ? { budget } : {}),
|
|
177
|
+
onToolUse: (name, input) => {
|
|
178
|
+
const inp = input;
|
|
179
|
+
const inputStr = JSON.stringify(inp).slice(0, 120);
|
|
180
|
+
logger.debug(` [security-auditor] ${name}(${inputStr})`);
|
|
181
|
+
},
|
|
182
|
+
});
|
|
183
|
+
logger.debug(`Security auditor completed in ${result.turnsUsed} turns (${result.toolsCalled.length} tool calls)`);
|
|
184
|
+
const { review: finderReview, parsed } = parseSecurityAuditResult(result.finalText, contractId, contract.specId);
|
|
185
|
+
// Sprint-8 seam (adversarial finder->verifier stage, ADR-2/ADR-6
|
|
186
|
+
// default-off): when enabled, a SECOND read-only LLM pass in a fresh,
|
|
187
|
+
// contract-free context is fed ONLY finderReview.critical+important and
|
|
188
|
+
// told to disprove each one. It may only downgrade/drop — never promote.
|
|
189
|
+
// The verifier owns its OWN AbortController keyed to the same
|
|
190
|
+
// config.security.timeoutMs the rest of this audit's sub-stages use —
|
|
191
|
+
// that is the "shared time-box" in practice (both live inside the gate's
|
|
192
|
+
// own Promise.race). A parse-failure/error/abort in the verifier is
|
|
193
|
+
// fail-closed: `review` stays `finderReview`, criticals unchanged.
|
|
194
|
+
let review = finderReview;
|
|
195
|
+
if (parsed && config.security?.verifier?.enabled === true) {
|
|
196
|
+
const verifier = deps.verifier ?? runSecurityVerifier;
|
|
197
|
+
const verifierAbort = new AbortController();
|
|
198
|
+
const verifierTimer = setTimeout(() => verifierAbort.abort(), config.security?.timeoutMs ?? 300_000);
|
|
199
|
+
try {
|
|
200
|
+
const verifierResult = await verifier.verify({
|
|
201
|
+
findings: [...finderReview.critical, ...finderReview.important],
|
|
202
|
+
diff: auditDiff,
|
|
203
|
+
projectRoot,
|
|
204
|
+
config,
|
|
205
|
+
signal: verifierAbort.signal,
|
|
206
|
+
});
|
|
207
|
+
review = foldVerifierResult(finderReview, verifierResult);
|
|
208
|
+
}
|
|
209
|
+
finally {
|
|
210
|
+
clearTimeout(verifierTimer);
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
// THE inversion (sc-2-2): verdict is only ever derived from a genuinely
|
|
214
|
+
// parsed review. A parse failure forces 'blocked' — never a silent pass
|
|
215
|
+
// from an empty fallback review. Derived on the (possibly verifier-folded)
|
|
216
|
+
// review — deriveVerdict itself is UNCHANGED.
|
|
217
|
+
const verdict = parsed ? deriveVerdict(review) : "blocked";
|
|
218
|
+
const auditResult = {
|
|
219
|
+
review,
|
|
220
|
+
stack: ctx.stackLabel,
|
|
221
|
+
// True when scanners were configured (even if they all yielded [], the
|
|
222
|
+
// deterministic pre-filter genuinely ran) OR when the caller-supplied
|
|
223
|
+
// `priors` were non-empty (sprint-2 formula — priors passed directly with
|
|
224
|
+
// no scanners configured still counts as "a scanner ran" from the
|
|
225
|
+
// caller's perspective).
|
|
226
|
+
scannerRan: configuredScanners.length > 0 || effectivePriors.length > 0,
|
|
227
|
+
parsed,
|
|
228
|
+
verdict,
|
|
229
|
+
};
|
|
230
|
+
await saveSecurityAudit(projectRoot, contractId, auditResult);
|
|
231
|
+
logger.info(`Security audit complete: verdict=${verdict}, parsed=${parsed}, ${review.critical.length} critical finding(s)`);
|
|
232
|
+
return auditResult;
|
|
233
|
+
}
|
|
234
|
+
// ── Sprint-8: verifier fold (downgrade-only, fail-closed) ──────────
|
|
235
|
+
/**
|
|
236
|
+
* Folds a `VerifierResult` into the finder's `ReviewResult`.
|
|
237
|
+
*
|
|
238
|
+
* Fail-closed: `v.ran === false` (parse-failure/error/refusal/abort) returns
|
|
239
|
+
* `finderReview` completely UNCHANGED — the finder's criticals are kept.
|
|
240
|
+
*
|
|
241
|
+
* Downgrade-only on success: `verified` findings stay at their original
|
|
242
|
+
* severity; `downgraded` findings move `critical`->`important`; `dropped`
|
|
243
|
+
* findings are removed from wherever they were (critical or important). The
|
|
244
|
+
* new `critical` set is therefore always a strict SUBSET of the finder's
|
|
245
|
+
* `critical` — nothing is ever promoted or added. `minor` and
|
|
246
|
+
* `approvedAreas` pass through byte-untouched: the verifier is never shown
|
|
247
|
+
* them, so an `approvedArea` can never be re-opened (sc-8-4).
|
|
248
|
+
*
|
|
249
|
+
* Matches by object identity: `verifier.verify` is fed and returns the SAME
|
|
250
|
+
* `SecurityFinding` object references it was given (see
|
|
251
|
+
* `security-verifier-agent.ts:resolveFindingRef`), so a `Set` membership
|
|
252
|
+
* check against `finderReview.critical`/`.important` is exact.
|
|
253
|
+
*/
|
|
254
|
+
function foldVerifierResult(finderReview, v) {
|
|
255
|
+
if (!v.ran)
|
|
256
|
+
return finderReview;
|
|
257
|
+
const dropped = new Set(v.dropped);
|
|
258
|
+
const downgraded = new Set(v.downgraded);
|
|
259
|
+
return {
|
|
260
|
+
...finderReview,
|
|
261
|
+
critical: finderReview.critical.filter((c) => !dropped.has(c) && !downgraded.has(c)),
|
|
262
|
+
important: [
|
|
263
|
+
...finderReview.important.filter((i) => !dropped.has(i)),
|
|
264
|
+
...finderReview.critical.filter((c) => downgraded.has(c)),
|
|
265
|
+
],
|
|
266
|
+
minor: finderReview.minor,
|
|
267
|
+
approvedAreas: finderReview.approvedAreas,
|
|
268
|
+
};
|
|
269
|
+
}
|
|
270
|
+
// ── Prompt assembly ────────────────────────────────────────────────
|
|
271
|
+
/**
|
|
272
|
+
* Renders the "# Changed files (real diff)" section (Pattern D — empty
|
|
273
|
+
* string when there's no diff, so git-diff-mode-with-no-changes produces a
|
|
274
|
+
* prompt byte-identical to estimated-files mode, sc-6-5).
|
|
275
|
+
*/
|
|
276
|
+
function renderChangedFilesSection(auditDiff) {
|
|
277
|
+
if (!auditDiff || auditDiff.changedFiles.length === 0)
|
|
278
|
+
return "";
|
|
279
|
+
const filesText = auditDiff.changedFiles
|
|
280
|
+
.map((f) => {
|
|
281
|
+
const hunksText = f.hunks.length > 0 ? f.hunks.map((h) => h.content).join("\n\n") : "(no hunks captured)";
|
|
282
|
+
return `## ${f.path} (${f.status})\n\n${hunksText}`;
|
|
283
|
+
})
|
|
284
|
+
.join("\n\n");
|
|
285
|
+
const neighborhoodText = auditDiff.neighborhoodFiles.length > 0
|
|
286
|
+
? `\n\nCall-graph neighborhood (files affected by the changes above):\n${auditDiff.neighborhoodFiles.join("\n")}`
|
|
287
|
+
: "";
|
|
288
|
+
const truncatedText = auditDiff.truncated
|
|
289
|
+
? "\n\n(diff truncated — showing a bounded subset of changed files/hunks)"
|
|
290
|
+
: "";
|
|
291
|
+
return `# Changed files (real diff)\n\n${filesText}${neighborhoodText}${truncatedText}\n\n`;
|
|
292
|
+
}
|
|
293
|
+
function buildUserMessage(contract, evaluation, projectRoot, stackLabel, skillName, promptFragment, priors, auditDiff) {
|
|
294
|
+
const contractId = contract.contractId;
|
|
295
|
+
const contractJson = JSON.stringify(contract, null, 2);
|
|
296
|
+
// Standalone mode (evaluation === null) omits the evaluation-context
|
|
297
|
+
// section entirely — sc-2-5.
|
|
298
|
+
const evalSection = evaluation !== null
|
|
299
|
+
? `# Evaluation Result (Already Passed)\n\n${JSON.stringify({
|
|
300
|
+
passed: evaluation.passed,
|
|
301
|
+
score: evaluation.score,
|
|
302
|
+
summary: evaluation.summary,
|
|
303
|
+
timestamp: evaluation.timestamp,
|
|
304
|
+
}, null, 2)}\n\n`
|
|
305
|
+
: "";
|
|
306
|
+
// Sprint-5 seam: deterministic scanner priors, rendered only when present.
|
|
307
|
+
const priorsSection = priors.length > 0
|
|
308
|
+
? `# Deterministic scanner findings (ground truth priors)\n\n${JSON.stringify(priors, null, 2)}\n\n`
|
|
309
|
+
: "";
|
|
310
|
+
// Sprint-6 seam: real changed files/hunks, rendered only when present.
|
|
311
|
+
const changedFilesSection = renderChangedFilesSection(auditDiff);
|
|
312
|
+
const hasRealDiff = (auditDiff?.changedFiles.length ?? 0) > 0;
|
|
313
|
+
const scopeInstruction = hasRealDiff
|
|
314
|
+
? 'Use the "# Changed files (real diff)" section above — it lists the ACTUAL changed files/hunks for ' +
|
|
315
|
+
"this sprint; Read each changed file in full for surrounding context, and ground findings in the " +
|
|
316
|
+
"real diff rather than guessing from `estimatedFiles`"
|
|
317
|
+
: "Use Glob to enumerate the in-scope files (the `estimatedFiles` patterns, or the relevant\n" +
|
|
318
|
+
" project directories when that list is empty) and Read each one in full; there is no diff\n" +
|
|
319
|
+
" available without Bash, so audit the CURRENT content of each in-scope file";
|
|
320
|
+
return `# Sprint Contract
|
|
321
|
+
|
|
322
|
+
${contractJson}
|
|
323
|
+
|
|
324
|
+
${evalSection}${priorsSection}${changedFilesSection}# Stack Security Context
|
|
325
|
+
|
|
326
|
+
Stack: ${stackLabel}
|
|
327
|
+
Skill: ${skillName ?? "none (generic taxonomy only)"}
|
|
328
|
+
|
|
329
|
+
${promptFragment}
|
|
330
|
+
|
|
331
|
+
# Project Root
|
|
332
|
+
|
|
333
|
+
${projectRoot}
|
|
334
|
+
|
|
335
|
+
# Context
|
|
336
|
+
|
|
337
|
+
- Contract ID: ${contractId}
|
|
338
|
+
- Spec ID: ${contract.specId}
|
|
339
|
+
- Mode: ${evaluation === null ? "standalone (no prior evaluation context)" : "in-pipeline (post-evaluation)"}
|
|
340
|
+
|
|
341
|
+
# Your Task
|
|
342
|
+
|
|
343
|
+
Audit the sprint's changes for exploitable security vulnerabilities. You have Read/Grep/Glob
|
|
344
|
+
only (no Bash, no git)${hasRealDiff ? ' — a real diff IS provided inline above ("# Changed files (real diff)" section)' : ""} — use them to:
|
|
345
|
+
1. Read .bober/contracts/${contractId}.json for scope, including its \`estimatedFiles\` list
|
|
346
|
+
2. ${scopeInstruction}
|
|
347
|
+
3. Use Grep to search across the codebase for suspicious patterns (hardcoded secrets, unsafe
|
|
348
|
+
string interpolation into a query/shell/template, missing auth checks) that Read alone
|
|
349
|
+
might miss
|
|
350
|
+
4. Review each file against the vulnerability taxonomy and stack-specific checklist above
|
|
351
|
+
5. Produce a ReviewResult JSON, findings organised by VulnClass, cited with path+line+snippet
|
|
352
|
+
|
|
353
|
+
Output ONLY a JSON object (no markdown fences, no surrounding prose):
|
|
354
|
+
{
|
|
355
|
+
"reviewId": "security-audit-${contractId}-<ISO-timestamp>",
|
|
356
|
+
"contractId": "${contractId}",
|
|
357
|
+
"specId": "${contract.specId}",
|
|
358
|
+
"timestamp": "<ISO-8601>",
|
|
359
|
+
"summary": "<2-3 sentence overall assessment>",
|
|
360
|
+
"critical": [],
|
|
361
|
+
"important": [],
|
|
362
|
+
"minor": [],
|
|
363
|
+
"approvedAreas": []
|
|
364
|
+
}`;
|
|
365
|
+
}
|
|
366
|
+
// ── Fail-closed JSON parser ────────────────────────────────────────
|
|
367
|
+
/**
|
|
368
|
+
* Parse the security auditor's response into a ReviewResult.
|
|
369
|
+
*
|
|
370
|
+
* Reuses the same resilient extraction ladder as
|
|
371
|
+
* code-reviewer-agent.ts:parseReviewResult (direct parse → markdown-fence →
|
|
372
|
+
* first-`{`-to-last-`}` slice), but INVERTS its fallback: on any parse
|
|
373
|
+
* failure (garbage text, truncated JSON, non-object shape), this returns
|
|
374
|
+
* `parsed:false` with an empty review — never a silently "clean" result.
|
|
375
|
+
* The caller forces `verdict:'blocked'` whenever `parsed` is false.
|
|
376
|
+
*
|
|
377
|
+
* A genuinely clean audit (empty critical, well-formed JSON) is
|
|
378
|
+
* `parsed:true` — distinguishable from the parse-failure case.
|
|
379
|
+
*/
|
|
380
|
+
export function parseSecurityAuditResult(text, contractId, specId) {
|
|
381
|
+
const timestamp = new Date().toISOString();
|
|
382
|
+
let parsedJson;
|
|
383
|
+
// Try direct parse
|
|
384
|
+
try {
|
|
385
|
+
parsedJson = JSON.parse(text.trim());
|
|
386
|
+
}
|
|
387
|
+
catch {
|
|
388
|
+
// Try extracting from markdown fences
|
|
389
|
+
const fenceMatch = /```(?:json)?\s*\n?([\s\S]*?)\n?\s*```/.exec(text);
|
|
390
|
+
if (fenceMatch) {
|
|
391
|
+
try {
|
|
392
|
+
parsedJson = JSON.parse(fenceMatch[1].trim());
|
|
393
|
+
}
|
|
394
|
+
catch {
|
|
395
|
+
// Fall through
|
|
396
|
+
}
|
|
397
|
+
}
|
|
398
|
+
// Try finding { ... }
|
|
399
|
+
if (parsedJson === undefined) {
|
|
400
|
+
const braceStart = text.indexOf("{");
|
|
401
|
+
const braceEnd = text.lastIndexOf("}");
|
|
402
|
+
if (braceStart !== -1 && braceEnd > braceStart) {
|
|
403
|
+
try {
|
|
404
|
+
parsedJson = JSON.parse(text.slice(braceStart, braceEnd + 1));
|
|
405
|
+
}
|
|
406
|
+
catch {
|
|
407
|
+
// Fall through to fail-closed default below
|
|
408
|
+
}
|
|
409
|
+
}
|
|
410
|
+
}
|
|
411
|
+
}
|
|
412
|
+
// A JSON array is technically valid JSON but not a ReviewResult shape —
|
|
413
|
+
// treating it as "parsed" would manufacture a fake clean review out of the
|
|
414
|
+
// wrong shape. Fail-closed requires an actual object, never an array.
|
|
415
|
+
if (parsedJson && typeof parsedJson === "object" && !Array.isArray(parsedJson)) {
|
|
416
|
+
const obj = parsedJson;
|
|
417
|
+
const review = {
|
|
418
|
+
reviewId: typeof obj.reviewId === "string" ? obj.reviewId : `security-audit-${contractId}-${timestamp}`,
|
|
419
|
+
contractId: typeof obj.contractId === "string" ? obj.contractId : contractId,
|
|
420
|
+
specId: typeof obj.specId === "string" ? obj.specId : specId,
|
|
421
|
+
timestamp: typeof obj.timestamp === "string" ? obj.timestamp : timestamp,
|
|
422
|
+
summary: typeof obj.summary === "string" ? obj.summary : "No summary provided.",
|
|
423
|
+
critical: parseSecurityFindingArray(obj.critical),
|
|
424
|
+
important: parseSecurityFindingArray(obj.important),
|
|
425
|
+
minor: parseSecurityFindingArray(obj.minor),
|
|
426
|
+
approvedAreas: parseStringArray(obj.approvedAreas),
|
|
427
|
+
};
|
|
428
|
+
return { review, parsed: true };
|
|
429
|
+
}
|
|
430
|
+
// Fail-closed fallback — auditor ran but the response was NOT parseable.
|
|
431
|
+
// Unlike parseReviewResult's fallback, this is a signal the caller MUST
|
|
432
|
+
// act on: parsed:false forces verdict:'blocked', never a silent pass.
|
|
433
|
+
return {
|
|
434
|
+
review: {
|
|
435
|
+
reviewId: `security-audit-${contractId}-${timestamp}`,
|
|
436
|
+
contractId,
|
|
437
|
+
specId,
|
|
438
|
+
timestamp,
|
|
439
|
+
summary: "Security auditor output could not be parsed.",
|
|
440
|
+
critical: [],
|
|
441
|
+
important: [],
|
|
442
|
+
minor: [],
|
|
443
|
+
approvedAreas: [],
|
|
444
|
+
},
|
|
445
|
+
parsed: false,
|
|
446
|
+
};
|
|
447
|
+
}
|
|
448
|
+
function isVulnClass(value) {
|
|
449
|
+
return ALL_VULN_CLASSES.includes(value);
|
|
450
|
+
}
|
|
451
|
+
function parseSecurityFindingArray(raw) {
|
|
452
|
+
if (!Array.isArray(raw))
|
|
453
|
+
return [];
|
|
454
|
+
return raw
|
|
455
|
+
.filter((item) => typeof item === "object" && item !== null)
|
|
456
|
+
.map((item) => ({
|
|
457
|
+
description: typeof item.description === "string" ? item.description : "Unknown finding",
|
|
458
|
+
evidence: parseEvidenceArray(item.evidence),
|
|
459
|
+
...(typeof item.antiPattern === "string" ? { antiPattern: item.antiPattern } : {}),
|
|
460
|
+
...(typeof item.source === "string" ? { source: item.source } : {}),
|
|
461
|
+
...(typeof item.vulnClass === "string" && isVulnClass(item.vulnClass)
|
|
462
|
+
? { vulnClass: item.vulnClass }
|
|
463
|
+
: {}),
|
|
464
|
+
}));
|
|
465
|
+
}
|
|
466
|
+
function parseEvidenceArray(raw) {
|
|
467
|
+
if (!Array.isArray(raw))
|
|
468
|
+
return [];
|
|
469
|
+
return raw
|
|
470
|
+
.filter((item) => typeof item === "object" && item !== null)
|
|
471
|
+
.map((item) => ({
|
|
472
|
+
path: typeof item.path === "string" ? item.path : "unknown",
|
|
473
|
+
line: typeof item.line === "number" ? item.line : 0,
|
|
474
|
+
snippet: typeof item.snippet === "string" ? item.snippet : "",
|
|
475
|
+
}));
|
|
476
|
+
}
|
|
477
|
+
function parseStringArray(raw) {
|
|
478
|
+
if (!Array.isArray(raw))
|
|
479
|
+
return [];
|
|
480
|
+
return raw.filter((item) => typeof item === "string");
|
|
481
|
+
}
|
|
482
|
+
//# sourceMappingURL=security-auditor-agent.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"security-auditor-agent.js","sourceRoot":"","sources":["../../src/orchestrator/security-auditor-agent.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The fail-closed SecurityAuditGate (spec-20260712-security-audit-agent-team,
|
|
3
|
+
* sprint 3, ADR-2).
|
|
4
|
+
*
|
|
5
|
+
* Thin wrapper over runSecurityAudit (sprint 2): the gate owns the
|
|
6
|
+
* Promise.race time-box, the rejection→'audit-error'/'timeout' mapping, the
|
|
7
|
+
* parsed:false→'audit-error' elevation, and the best-effort store guard
|
|
8
|
+
* (sc-3-6). It does NOT re-run or re-derive any auditor logic — the verdict
|
|
9
|
+
* comes straight from `result.verdict` (already computed via deriveVerdict
|
|
10
|
+
* inside runSecurityAudit).
|
|
11
|
+
*
|
|
12
|
+
* evaluateSecurityGate NEVER throws. Every failure mode (timeout, thrown
|
|
13
|
+
* audit error, unparseable output) resolves to `blocked:true` — an
|
|
14
|
+
* incomplete audit is never treated as clean (fail-closed).
|
|
15
|
+
*
|
|
16
|
+
* Sprint 6 additionally emits critical/important findings into the priority
|
|
17
|
+
* hub AFTER the verdict is computed and OUTSIDE the Promise.race time-box
|
|
18
|
+
* below, so a slow or failing hub ingest can never flip the verdict or
|
|
19
|
+
* manufacture a false timeout (see emitFindingsToHub).
|
|
20
|
+
*/
|
|
21
|
+
import type { BoberConfig } from "../config/schema.js";
|
|
22
|
+
import type { SprintContract } from "../contracts/sprint-contract.js";
|
|
23
|
+
import type { EvaluationRunResult } from "../evaluators/registry.js";
|
|
24
|
+
import type { SecurityAuditResult } from "./security-audit-types.js";
|
|
25
|
+
import type { SecurityFindingSink } from "./security-hub.js";
|
|
26
|
+
export interface SecurityGateInput {
|
|
27
|
+
contract: SprintContract;
|
|
28
|
+
evaluation: EvaluationRunResult;
|
|
29
|
+
projectRoot: string;
|
|
30
|
+
config: BoberConfig;
|
|
31
|
+
/** Injected hub sink (tests only) — default binds ingestFinding to a real FactStore. */
|
|
32
|
+
findingSink?: SecurityFindingSink;
|
|
33
|
+
}
|
|
34
|
+
export type SecurityGateReason = "critical-finding" | "timeout" | "audit-error" | "clean" | "disabled";
|
|
35
|
+
export interface SecurityGateVerdict {
|
|
36
|
+
blocked: boolean;
|
|
37
|
+
reason: SecurityGateReason;
|
|
38
|
+
result?: SecurityAuditResult;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Evaluate the security gate for a sprint that just passed evaluation.
|
|
42
|
+
*
|
|
43
|
+
* Never throws. Resolution mapping:
|
|
44
|
+
* - `config.security` absent or `enabled !== true` → `{blocked:false, reason:'disabled'}`
|
|
45
|
+
* WITHOUT invoking the audit at all.
|
|
46
|
+
* - `runSecurityAudit` rejects (any error) → `{blocked:true, reason:'audit-error'}`.
|
|
47
|
+
* - The Promise.race timeout (`config.security.timeoutMs`) fires first →
|
|
48
|
+
* `{blocked:true, reason:'timeout'}`.
|
|
49
|
+
* - `result.parsed === false` (unparseable auditor output) →
|
|
50
|
+
* `{blocked:true, reason:'audit-error', result}` — checked BEFORE
|
|
51
|
+
* `result.verdict` so a parse failure is never mistaken for a genuine
|
|
52
|
+
* critical finding.
|
|
53
|
+
* - `result.verdict === 'blocked'` (a real critical finding) →
|
|
54
|
+
* `{blocked:true, reason:'critical-finding', result}`.
|
|
55
|
+
* - Otherwise → `{blocked:false, reason:'clean', result}`.
|
|
56
|
+
*
|
|
57
|
+
* A `saveSecurityAudit` persistence failure is caught, logged, and never
|
|
58
|
+
* changes the already-computed verdict in either direction (sc-3-6).
|
|
59
|
+
*/
|
|
60
|
+
export declare function evaluateSecurityGate(input: SecurityGateInput): Promise<SecurityGateVerdict>;
|
|
61
|
+
/**
|
|
62
|
+
* Render a blocked SecurityGateVerdict into feedback strings for the
|
|
63
|
+
* generator's next retry iteration (ADR-5), phrased for a fixer. Pure
|
|
64
|
+
* function — no side effects, no I/O.
|
|
65
|
+
*
|
|
66
|
+
* Returns `[]` for a non-blocked verdict. Returns a single generic message
|
|
67
|
+
* when there is no `result` to enumerate findings from (a `timeout` or a
|
|
68
|
+
* rejected `audit-error` never resolves a SecurityAuditResult). Otherwise
|
|
69
|
+
* returns a summary line followed by one line per critical finding, capped
|
|
70
|
+
* to MAX_RENDERED_FINDINGS.
|
|
71
|
+
*/
|
|
72
|
+
export declare function renderSecurityFeedback(verdict: SecurityGateVerdict): string[];
|
|
73
|
+
//# sourceMappingURL=security-gate.d.ts.map
|