agent-bober 0.17.1 → 0.18.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 +15 -0
- package/README.md +158 -5
- 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 +129 -0
- package/dist/chat/chat-session.d.ts.map +1 -0
- package/dist/chat/chat-session.js +470 -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 +36 -0
- package/dist/chat/slash-commands.d.ts.map +1 -0
- package/dist/chat/slash-commands.js +133 -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 +43 -0
- package/dist/chat/turn-classifier.d.ts.map +1 -0
- package/dist/chat/turn-classifier.js +150 -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/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/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/medical.d.ts +24 -0
- package/dist/cli/commands/medical.d.ts.map +1 -0
- package/dist/cli/commands/medical.js +132 -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/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/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/index.js +12 -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 +1 -1
- package/dist/config/role-providers.d.ts.map +1 -1
- package/dist/config/role-providers.js +6 -1
- package/dist/config/role-providers.js.map +1 -1
- package/dist/config/schema.d.ts +467 -222
- package/dist/config/schema.d.ts.map +1 -1
- package/dist/config/schema.js +25 -0
- 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/fleet/critic-deep.d.ts +53 -0
- package/dist/fleet/critic-deep.d.ts.map +1 -0
- package/dist/fleet/critic-deep.js +199 -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 +51 -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 +93 -0
- package/dist/fleet/index.d.ts.map +1 -1
- package/dist/fleet/index.js +230 -2
- 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 +6 -6
- 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/incident/resolution-verify.d.ts +4 -4
- package/dist/incident/types.d.ts +8 -8
- 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/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 +80 -0
- package/dist/medical/health-store.d.ts.map +1 -0
- package/dist/medical/health-store.js +204 -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/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/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/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/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/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/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/pipeline.d.ts +19 -3
- package/dist/orchestrator/pipeline.d.ts.map +1 -1
- package/dist/orchestrator/pipeline.js +63 -52
- 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/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/workflow/engine.d.ts +3 -1
- 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 +41 -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/state/facts.d.ts +110 -0
- package/dist/state/facts.d.ts.map +1 -0
- package/dist/state/facts.js +208 -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 +1 -1
- package/dist/state/index.d.ts.map +1 -1
- package/dist/state/index.js +1 -1
- package/dist/state/index.js.map +1 -1
- package/dist/state/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/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/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 +53 -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/package.json +3 -1
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
// ── fleet/synthesis.ts ────────────────────────────────────────────────
|
|
2
|
+
//
|
|
3
|
+
// SynthesisStep (CP3): PURE data assembly. After the rounds complete,
|
|
4
|
+
// bundle the final-round child results + ALL blackboard findings + the
|
|
5
|
+
// round count for the head/dynamic-workflow to synthesize.
|
|
6
|
+
//
|
|
7
|
+
// NO LLM call. NO network. NO provider/client construction.
|
|
8
|
+
// ── collect ───────────────────────────────────────────────────────────
|
|
9
|
+
/**
|
|
10
|
+
* Assemble a SynthesisBundle from the final-round child results, the round
|
|
11
|
+
* count, and (if a blackboard was used) all of its findings.
|
|
12
|
+
* PURE: no LLM, no network, no IO — just shapes existing data into JSON.
|
|
13
|
+
* When blackboard is null, findings is [].
|
|
14
|
+
*/
|
|
15
|
+
export function collect(blackboard, childResults, rounds) {
|
|
16
|
+
return {
|
|
17
|
+
rounds,
|
|
18
|
+
childResults,
|
|
19
|
+
findings: blackboard ? blackboard.readAll() : [],
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=synthesis.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"synthesis.js","sourceRoot":"","sources":["../../src/fleet/synthesis.ts"],"names":[],"mappings":"AAAA,yEAAyE;AACzE,EAAE;AACF,sEAAsE;AACtE,uEAAuE;AACvE,2DAA2D;AAC3D,EAAE;AACF,4DAA4D;AAc5D,yEAAyE;AAEzE;;;;;GAKG;AACH,MAAM,UAAU,OAAO,CACrB,UAAmC,EACnC,YAA6B,EAC7B,MAAc;IAEd,OAAO;QACL,MAAM;QACN,YAAY;QACZ,QAAQ,EAAE,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE;KACjD,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { ProviderName } from "../providers/factory.js";
|
|
2
|
+
export type DifficultyTier = "default" | "cheap" | "standard" | "hard" | "frontier";
|
|
3
|
+
export interface RoleProviderBlock {
|
|
4
|
+
provider: ProviderName;
|
|
5
|
+
model: string;
|
|
6
|
+
endpoint?: string | null;
|
|
7
|
+
}
|
|
8
|
+
export interface TieredRoleBlock {
|
|
9
|
+
planner: RoleProviderBlock;
|
|
10
|
+
generator: RoleProviderBlock;
|
|
11
|
+
evaluator: RoleProviderBlock;
|
|
12
|
+
}
|
|
13
|
+
export interface TierProviderPolicy {
|
|
14
|
+
resolveTier(tier?: DifficultyTier): TieredRoleBlock | undefined;
|
|
15
|
+
knownTiers(): DifficultyTier[];
|
|
16
|
+
}
|
|
17
|
+
export declare const tierPolicy: TierProviderPolicy;
|
|
18
|
+
//# sourceMappingURL=tier-policy.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tier-policy.d.ts","sourceRoot":"","sources":["../../src/fleet/tier-policy.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAI5D,MAAM,MAAM,cAAc,GAAG,SAAS,GAAG,OAAO,GAAG,UAAU,GAAG,MAAM,GAAG,UAAU,CAAC;AAEpF,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,YAAY,CAAC;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B;AAED,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,iBAAiB,CAAC;IAC3B,SAAS,EAAE,iBAAiB,CAAC;IAC7B,SAAS,EAAE,iBAAiB,CAAC;CAC9B;AAED,MAAM,WAAW,kBAAkB;IACjC,WAAW,CAAC,IAAI,CAAC,EAAE,cAAc,GAAG,eAAe,GAAG,SAAS,CAAC;IAChE,UAAU,IAAI,cAAc,EAAE,CAAC;CAChC;AAqDD,eAAO,MAAM,UAAU,EAAE,kBAOxB,CAAC"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
// ── Tier policy table ────────────────────────────────────────────────
|
|
2
|
+
const DEEPSEEK_BLOCK = {
|
|
3
|
+
provider: "openai-compat",
|
|
4
|
+
model: "deepseek",
|
|
5
|
+
endpoint: "https://api.deepseek.com",
|
|
6
|
+
};
|
|
7
|
+
const GROK_BLOCK = {
|
|
8
|
+
provider: "openai-compat",
|
|
9
|
+
model: "grok",
|
|
10
|
+
endpoint: "https://api.x.ai/v1",
|
|
11
|
+
};
|
|
12
|
+
const SONNET_BLOCK = {
|
|
13
|
+
provider: "anthropic",
|
|
14
|
+
model: "sonnet",
|
|
15
|
+
endpoint: null,
|
|
16
|
+
};
|
|
17
|
+
const OPUS_BLOCK = {
|
|
18
|
+
provider: "anthropic",
|
|
19
|
+
model: "opus",
|
|
20
|
+
endpoint: null,
|
|
21
|
+
};
|
|
22
|
+
const TIER_POLICY = {
|
|
23
|
+
cheap: {
|
|
24
|
+
planner: DEEPSEEK_BLOCK,
|
|
25
|
+
generator: DEEPSEEK_BLOCK,
|
|
26
|
+
evaluator: DEEPSEEK_BLOCK,
|
|
27
|
+
},
|
|
28
|
+
standard: {
|
|
29
|
+
planner: GROK_BLOCK,
|
|
30
|
+
generator: GROK_BLOCK,
|
|
31
|
+
evaluator: GROK_BLOCK,
|
|
32
|
+
},
|
|
33
|
+
hard: {
|
|
34
|
+
planner: SONNET_BLOCK,
|
|
35
|
+
generator: SONNET_BLOCK,
|
|
36
|
+
evaluator: SONNET_BLOCK,
|
|
37
|
+
},
|
|
38
|
+
frontier: {
|
|
39
|
+
planner: OPUS_BLOCK,
|
|
40
|
+
generator: OPUS_BLOCK,
|
|
41
|
+
evaluator: OPUS_BLOCK,
|
|
42
|
+
},
|
|
43
|
+
};
|
|
44
|
+
// ── Policy API ───────────────────────────────────────────────────────
|
|
45
|
+
export const tierPolicy = {
|
|
46
|
+
resolveTier(tier) {
|
|
47
|
+
return tier && tier !== "default" ? TIER_POLICY[tier] : undefined;
|
|
48
|
+
},
|
|
49
|
+
knownTiers() {
|
|
50
|
+
return ["default", "cheap", "standard", "hard", "frontier"];
|
|
51
|
+
},
|
|
52
|
+
};
|
|
53
|
+
//# sourceMappingURL=tier-policy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tier-policy.js","sourceRoot":"","sources":["../../src/fleet/tier-policy.ts"],"names":[],"mappings":"AAuBA,wEAAwE;AAExE,MAAM,cAAc,GAAsB;IACxC,QAAQ,EAAE,eAAe;IACzB,KAAK,EAAE,UAAU;IACjB,QAAQ,EAAE,0BAA0B;CACrC,CAAC;AAEF,MAAM,UAAU,GAAsB;IACpC,QAAQ,EAAE,eAAe;IACzB,KAAK,EAAE,MAAM;IACb,QAAQ,EAAE,qBAAqB;CAChC,CAAC;AAEF,MAAM,YAAY,GAAsB;IACtC,QAAQ,EAAE,WAAW;IACrB,KAAK,EAAE,QAAQ;IACf,QAAQ,EAAE,IAAI;CACf,CAAC;AAEF,MAAM,UAAU,GAAsB;IACpC,QAAQ,EAAE,WAAW;IACrB,KAAK,EAAE,MAAM;IACb,QAAQ,EAAE,IAAI;CACf,CAAC;AAEF,MAAM,WAAW,GAAgE;IAC/E,KAAK,EAAE;QACL,OAAO,EAAE,cAAc;QACvB,SAAS,EAAE,cAAc;QACzB,SAAS,EAAE,cAAc;KAC1B;IACD,QAAQ,EAAE;QACR,OAAO,EAAE,UAAU;QACnB,SAAS,EAAE,UAAU;QACrB,SAAS,EAAE,UAAU;KACtB;IACD,IAAI,EAAE;QACJ,OAAO,EAAE,YAAY;QACrB,SAAS,EAAE,YAAY;QACvB,SAAS,EAAE,YAAY;KACxB;IACD,QAAQ,EAAE;QACR,OAAO,EAAE,UAAU;QACnB,SAAS,EAAE,UAAU;QACrB,SAAS,EAAE,UAAU;KACtB;CACF,CAAC;AAEF,wEAAwE;AAExE,MAAM,CAAC,MAAM,UAAU,GAAuB;IAC5C,WAAW,CAAC,IAAqB;QAC/B,OAAO,IAAI,IAAI,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IACpE,CAAC;IACD,UAAU;QACR,OAAO,CAAC,SAAS,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,UAAU,CAAC,CAAC;IAC9D,CAAC;CACF,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { RoleName } from "../config/role-providers.js";
|
|
2
|
+
import type { FleetChild, FleetManifest } from "./manifest.js";
|
|
3
|
+
import type { BoberConfig } from "../config/schema.js";
|
|
4
|
+
export type ToolRoleViolation = {
|
|
5
|
+
childFolder: string;
|
|
6
|
+
role: RoleName;
|
|
7
|
+
provider: "claude-code";
|
|
8
|
+
};
|
|
9
|
+
/**
|
|
10
|
+
* Inspect a single fleet child's RESOLVED config for a tool-role violation.
|
|
11
|
+
* Returns the first ToolRoleViolation found, or null when the child is clean.
|
|
12
|
+
* NEVER throws — callers can safely call this in any context.
|
|
13
|
+
*/
|
|
14
|
+
export declare function check(child: FleetChild, resolved: BoberConfig): ToolRoleViolation | null;
|
|
15
|
+
/**
|
|
16
|
+
* Validate every child in the manifest for tool-role violations.
|
|
17
|
+
* Throws a named Error identifying the offending child.folder and role on the
|
|
18
|
+
* first violation. Passes silently when all children are clean.
|
|
19
|
+
*
|
|
20
|
+
* @throws Error naming child.folder + role when any child places claude-code
|
|
21
|
+
* on a tool role.
|
|
22
|
+
*/
|
|
23
|
+
export declare function assertManifest(manifest: FleetManifest): void;
|
|
24
|
+
//# sourceMappingURL=tool-role-guard.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-role-guard.d.ts","sourceRoot":"","sources":["../../src/fleet/tool-role-guard.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,6BAA6B,CAAC;AAE5D,OAAO,KAAK,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC/D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAIvD,MAAM,MAAM,iBAAiB,GAAG;IAC9B,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,QAAQ,CAAC;IACf,QAAQ,EAAE,aAAa,CAAC;CACzB,CAAC;AAeF;;;;GAIG;AACH,wBAAgB,KAAK,CAAC,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,WAAW,GAAG,iBAAiB,GAAG,IAAI,CAQxF;AAID;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,aAAa,GAAG,IAAI,CAY5D"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
// ── fleet/tool-role-guard.ts ──────────────────────────────────────────
|
|
2
|
+
//
|
|
3
|
+
// Build-time guard: reject any fleet child whose RESOLVED BoberConfig would
|
|
4
|
+
// place the claude-code provider on a TOOL_ROLE (curator/generator/evaluator/
|
|
5
|
+
// codeReview). Front-loads the runtime invariant from config/loader.ts:264 to
|
|
6
|
+
// manifest-build time so no child is spawned on a violation.
|
|
7
|
+
import { isToolRole, effectiveProvider } from "../config/role-providers.js";
|
|
8
|
+
import { buildChildConfig } from "./child-config.js";
|
|
9
|
+
// All RoleName values to iterate; gate on isToolRole (derives from TOOL_ROLES).
|
|
10
|
+
const ALL_ROLES = [
|
|
11
|
+
"planner",
|
|
12
|
+
"researcher",
|
|
13
|
+
"curator",
|
|
14
|
+
"generator",
|
|
15
|
+
"evaluator",
|
|
16
|
+
"codeReview",
|
|
17
|
+
"chat",
|
|
18
|
+
];
|
|
19
|
+
// ── check (pure, never throws) ────────────────────────────────────────
|
|
20
|
+
/**
|
|
21
|
+
* Inspect a single fleet child's RESOLVED config for a tool-role violation.
|
|
22
|
+
* Returns the first ToolRoleViolation found, or null when the child is clean.
|
|
23
|
+
* NEVER throws — callers can safely call this in any context.
|
|
24
|
+
*/
|
|
25
|
+
export function check(child, resolved) {
|
|
26
|
+
for (const role of ALL_ROLES) {
|
|
27
|
+
if (!isToolRole(role))
|
|
28
|
+
continue;
|
|
29
|
+
if (effectiveProvider(role, resolved) === "claude-code") {
|
|
30
|
+
return { childFolder: child.folder, role, provider: "claude-code" };
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
return null;
|
|
34
|
+
}
|
|
35
|
+
// ── assertManifest (throws on first violation) ────────────────────────
|
|
36
|
+
/**
|
|
37
|
+
* Validate every child in the manifest for tool-role violations.
|
|
38
|
+
* Throws a named Error identifying the offending child.folder and role on the
|
|
39
|
+
* first violation. Passes silently when all children are clean.
|
|
40
|
+
*
|
|
41
|
+
* @throws Error naming child.folder + role when any child places claude-code
|
|
42
|
+
* on a tool role.
|
|
43
|
+
*/
|
|
44
|
+
export function assertManifest(manifest) {
|
|
45
|
+
for (const child of manifest.children) {
|
|
46
|
+
const resolved = buildChildConfig(child);
|
|
47
|
+
const v = check(child, resolved);
|
|
48
|
+
if (v) {
|
|
49
|
+
throw new Error(`Fleet child "${v.childFolder}" places claude-code on tool role "${v.role}" — ` +
|
|
50
|
+
`claude-code cannot drive tools. Use an api-key provider (anthropic/openai-compat) ` +
|
|
51
|
+
`for builder roles.`);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=tool-role-guard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-role-guard.js","sourceRoot":"","sources":["../../src/fleet/tool-role-guard.ts"],"names":[],"mappings":"AAAA,yEAAyE;AACzE,EAAE;AACF,4EAA4E;AAC5E,8EAA8E;AAC9E,8EAA8E;AAC9E,6DAA6D;AAE7D,OAAO,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AAE5E,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAYrD,gFAAgF;AAChF,MAAM,SAAS,GAAe;IAC5B,SAAS;IACT,YAAY;IACZ,SAAS;IACT,WAAW;IACX,WAAW;IACX,YAAY;IACZ,MAAM;CACP,CAAC;AAEF,yEAAyE;AAEzE;;;;GAIG;AACH,MAAM,UAAU,KAAK,CAAC,KAAiB,EAAE,QAAqB;IAC5D,KAAK,MAAM,IAAI,IAAI,SAAS,EAAE,CAAC;QAC7B,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;YAAE,SAAS;QAChC,IAAI,iBAAiB,CAAC,IAAI,EAAE,QAAQ,CAAC,KAAK,aAAa,EAAE,CAAC;YACxD,OAAO,EAAE,WAAW,EAAE,KAAK,CAAC,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,aAAa,EAAE,CAAC;QACtE,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,yEAAyE;AAEzE;;;;;;;GAOG;AACH,MAAM,UAAU,cAAc,CAAC,QAAuB;IACpD,KAAK,MAAM,KAAK,IAAI,QAAQ,CAAC,QAAQ,EAAE,CAAC;QACtC,MAAM,QAAQ,GAAG,gBAAgB,CAAC,KAAK,CAAC,CAAC;QACzC,MAAM,CAAC,GAAG,KAAK,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;QACjC,IAAI,CAAC,EAAE,CAAC;YACN,MAAM,IAAI,KAAK,CACb,gBAAgB,CAAC,CAAC,WAAW,sCAAsC,CAAC,CAAC,IAAI,MAAM;gBAC7E,oFAAoF;gBACpF,oBAAoB,CACvB,CAAC;QACJ,CAAC;IACH,CAAC;AACH,CAAC"}
|
|
@@ -70,18 +70,18 @@ export declare const VerifyResultSchema: z.ZodObject<{
|
|
|
70
70
|
hint: z.ZodOptional<z.ZodString>;
|
|
71
71
|
}, "strip", z.ZodTypeAny, {
|
|
72
72
|
verified: boolean;
|
|
73
|
-
reason?: "OK" | "OUTLIER" | "NO_PROVIDER" | "NOT_IMPLEMENTED" | "MCP_ERROR" | undefined;
|
|
74
|
-
hint?: string | undefined;
|
|
75
73
|
observedValue?: number | undefined;
|
|
76
74
|
sampledAt?: string | undefined;
|
|
77
75
|
evidencePath?: string | undefined;
|
|
78
|
-
}, {
|
|
79
|
-
verified: boolean;
|
|
80
76
|
reason?: "OK" | "OUTLIER" | "NO_PROVIDER" | "NOT_IMPLEMENTED" | "MCP_ERROR" | undefined;
|
|
81
77
|
hint?: string | undefined;
|
|
78
|
+
}, {
|
|
79
|
+
verified: boolean;
|
|
82
80
|
observedValue?: number | undefined;
|
|
83
81
|
sampledAt?: string | undefined;
|
|
84
82
|
evidencePath?: string | undefined;
|
|
83
|
+
reason?: "OK" | "OUTLIER" | "NO_PROVIDER" | "NOT_IMPLEMENTED" | "MCP_ERROR" | undefined;
|
|
84
|
+
hint?: string | undefined;
|
|
85
85
|
}>;
|
|
86
86
|
export type VerifyResult = z.infer<typeof VerifyResultSchema>;
|
|
87
87
|
export declare const ResolutionEvidenceSchema: z.ZodObject<{
|
package/dist/incident/types.d.ts
CHANGED
|
@@ -26,14 +26,14 @@ export declare const TimelineEventSchema: z.ZodObject<{
|
|
|
26
26
|
/** Optional relative path to the detail artifact (e.g. actions.jsonl). */
|
|
27
27
|
refPath: z.ZodOptional<z.ZodString>;
|
|
28
28
|
}, "strip", z.ZodTypeAny, {
|
|
29
|
-
timestamp: string;
|
|
30
29
|
summary: string;
|
|
30
|
+
timestamp: string;
|
|
31
31
|
source: "observability" | "human" | "diagnoser" | "deployer" | "system";
|
|
32
32
|
eventKind: string;
|
|
33
33
|
refPath?: string | undefined;
|
|
34
34
|
}, {
|
|
35
|
-
timestamp: string;
|
|
36
35
|
summary: string;
|
|
36
|
+
timestamp: string;
|
|
37
37
|
source: "observability" | "human" | "diagnoser" | "deployer" | "system";
|
|
38
38
|
eventKind: string;
|
|
39
39
|
refPath?: string | undefined;
|
|
@@ -48,14 +48,14 @@ export declare const ObservationEntrySchema: z.ZodObject<{
|
|
|
48
48
|
verified: z.ZodBoolean;
|
|
49
49
|
}, "strip", z.ZodTypeAny, {
|
|
50
50
|
timestamp: string;
|
|
51
|
-
verified: boolean;
|
|
52
51
|
phase: number;
|
|
52
|
+
verified: boolean;
|
|
53
53
|
source: string;
|
|
54
54
|
observation: string;
|
|
55
55
|
}, {
|
|
56
56
|
timestamp: string;
|
|
57
|
-
verified: boolean;
|
|
58
57
|
phase: number;
|
|
58
|
+
verified: boolean;
|
|
59
59
|
source: string;
|
|
60
60
|
observation: string;
|
|
61
61
|
}>;
|
|
@@ -257,12 +257,12 @@ export declare const IncidentMetadataSchema: z.ZodObject<{
|
|
|
257
257
|
}>>;
|
|
258
258
|
postmortemPath: z.ZodOptional<z.ZodString>;
|
|
259
259
|
}, "strip", z.ZodTypeAny, {
|
|
260
|
-
status: "aborted" | "investigating" | "remediating" | "monitoring" | "resolved";
|
|
261
260
|
createdAt: string;
|
|
261
|
+
status: "aborted" | "investigating" | "remediating" | "monitoring" | "resolved";
|
|
262
262
|
incidentId: string;
|
|
263
263
|
symptom: string;
|
|
264
|
-
resolvedAt?: string | undefined;
|
|
265
264
|
severity?: "S1" | "S2" | "S3" | "S4" | undefined;
|
|
265
|
+
resolvedAt?: string | undefined;
|
|
266
266
|
resolutionCriteria?: string | undefined;
|
|
267
267
|
resolutionEvidence?: {
|
|
268
268
|
verified: boolean;
|
|
@@ -278,12 +278,12 @@ export declare const IncidentMetadataSchema: z.ZodObject<{
|
|
|
278
278
|
} | undefined;
|
|
279
279
|
postmortemPath?: string | undefined;
|
|
280
280
|
}, {
|
|
281
|
-
status: "aborted" | "investigating" | "remediating" | "monitoring" | "resolved";
|
|
282
281
|
createdAt: string;
|
|
282
|
+
status: "aborted" | "investigating" | "remediating" | "monitoring" | "resolved";
|
|
283
283
|
incidentId: string;
|
|
284
284
|
symptom: string;
|
|
285
|
-
resolvedAt?: string | undefined;
|
|
286
285
|
severity?: "S1" | "S2" | "S3" | "S4" | undefined;
|
|
286
|
+
resolvedAt?: string | undefined;
|
|
287
287
|
resolutionCriteria?: string | undefined;
|
|
288
288
|
resolutionEvidence?: {
|
|
289
289
|
verified: boolean;
|
|
@@ -15,7 +15,7 @@ export interface RunResult {
|
|
|
15
15
|
export interface RunState {
|
|
16
16
|
runId: string;
|
|
17
17
|
task: string;
|
|
18
|
-
status: "running" | "completed" | "failed" | "aborted";
|
|
18
|
+
status: "running" | "completed" | "failed" | "aborted" | "input-required" | "paused";
|
|
19
19
|
startedAt: string;
|
|
20
20
|
completedAt?: string;
|
|
21
21
|
abortedAt?: string;
|
|
@@ -32,6 +32,14 @@ export interface RunState {
|
|
|
32
32
|
/** Sprint 4: the git branch the worktree was created on. Undefined for
|
|
33
33
|
* in-place runs. */
|
|
34
34
|
branch?: string;
|
|
35
|
+
/** Checkpoint id the run is paused at, awaiting human input. */
|
|
36
|
+
pendingCheckpointId?: string;
|
|
37
|
+
/** Human-readable prompt surfaced for the pending checkpoint. */
|
|
38
|
+
pendingPrompt?: string;
|
|
39
|
+
/** ISO timestamp the run entered 'input-required'. */
|
|
40
|
+
pendingSince?: string;
|
|
41
|
+
/** ISO timestamp the run was soft-paused. */
|
|
42
|
+
pausedAt?: string;
|
|
35
43
|
}
|
|
36
44
|
/**
|
|
37
45
|
* Optional parameters for startRun().
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"run-manager.d.ts","sourceRoot":"","sources":["../../src/mcp/run-manager.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAEvD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAMlE,MAAM,WAAW,WAAW;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,OAAO,CAAC;IACjB,gBAAgB,EAAE,MAAM,CAAC;IACzB,aAAa,EAAE,MAAM,CAAC;IACtB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,QAAQ;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,SAAS,GAAG,WAAW,GAAG,QAAQ,GAAG,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"run-manager.d.ts","sourceRoot":"","sources":["../../src/mcp/run-manager.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAEvD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAMlE,MAAM,WAAW,WAAW;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,OAAO,CAAC;IACjB,gBAAgB,EAAE,MAAM,CAAC;IACzB,aAAa,EAAE,MAAM,CAAC;IACtB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,QAAQ;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,SAAS,GAAG,WAAW,GAAG,QAAQ,GAAG,SAAS,GAAG,gBAAgB,GAAG,QAAQ,CAAC;IACrF,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,WAAW,CAAC;IACtB,MAAM,CAAC,EAAE,SAAS,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;8CAE0C;IAC1C,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB;yBACqB;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAEhB,gEAAgE;IAChE,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,iEAAiE;IACjE,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,sDAAsD;IACtD,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,6CAA6C;IAC7C,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAID;;;GAGG;AACH,MAAM,WAAW,eAAe;IAC9B,oFAAoF;IACpF,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,0FAA0F;IAC1F,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,0CAA0C;IAC1C,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAID,qBAAa,UAAU;IACrB,OAAO,CAAC,IAAI,CAA+B;IAE3C;;;;;OAKG;IACH,SAAS,IAAI,OAAO;IAIpB;;;;;;OAMG;IACH,SAAS,IAAI,QAAQ,GAAG,IAAI;IAW5B;;OAEG;IACH,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,QAAQ,GAAG,IAAI;IAItC;;OAEG;IACH,cAAc,IAAI,QAAQ,EAAE;IAI5B;;;OAGG;IACH,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI;IAe7C;;;OAGG;IACH,WAAW,IAAI,QAAQ,EAAE;IAIzB;;;;;;;;;;;;;;OAcG;IACG,QAAQ,CACZ,IAAI,EAAE,MAAM,EACZ,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,WAAW,EACnB,UAAU,GAAE,CACV,IAAI,EAAE,MAAM,EACZ,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,WAAW,KAChB,OAAO,CAAC,cAAc,CAAe,EAC1C,IAAI,GAAE,eAAoB,GACzB,OAAO,CAAC,MAAM,CAAC;IAmElB;;;;;;;;;OASG;IACG,IAAI,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAoB/C;AAID,eAAO,MAAM,UAAU,YAAmB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"run-manager.js","sourceRoot":"","sources":["../../src/mcp/run-manager.ts"],"names":[],"mappings":"AAAA,wEAAwE;AACxE,EAAE;AACF,kEAAkE;AAClE,yDAAyD;AACzD,EAAE;AACF,mEAAmE;AACnE,mEAAmE;AACnE,yEAAyE;AACzE,UAAU;AAEV,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAGzC,OAAO,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAE1D,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AACzE,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"run-manager.js","sourceRoot":"","sources":["../../src/mcp/run-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import type { IngestionAdapter, IngestionResult, ObservationSink } from "../types.js";
|
|
2
|
+
/**
|
|
3
|
+
* Streams Apple Health export XML via SAX with bounded (~1000-row) batches.
|
|
4
|
+
*
|
|
5
|
+
* Backpressure mechanism:
|
|
6
|
+
* The stream is opened in paused (non-flowing) mode.
|
|
7
|
+
* We drive it as an async iterator, reading one chunk at a time.
|
|
8
|
+
* When the observation buffer reaches BATCH_CAP, we await sink.writeBatch
|
|
9
|
+
* before continuing to iterate — preventing unbounded accumulation.
|
|
10
|
+
*
|
|
11
|
+
* NEVER calls readFile/readFileSync on the whole file — createReadStream only.
|
|
12
|
+
*
|
|
13
|
+
* bober: single .xml extension check; extend canHandle to sniff "HealthData"
|
|
14
|
+
* root if the registry ever needs to distinguish multiple XML formats.
|
|
15
|
+
*/
|
|
16
|
+
export declare class AppleHealthAdapter implements IngestionAdapter {
|
|
17
|
+
readonly kind = "apple-health";
|
|
18
|
+
/**
|
|
19
|
+
* Returns true for .xml files (cheap extension check — no full read).
|
|
20
|
+
*/
|
|
21
|
+
canHandle(filePath: string): boolean;
|
|
22
|
+
/**
|
|
23
|
+
* Stream-parse the Apple Health export XML file.
|
|
24
|
+
*
|
|
25
|
+
* Uses createReadStream as an async iterable to pull one chunk at a time.
|
|
26
|
+
* Feeds chunks to a strict SAX parser (synchronous per chunk).
|
|
27
|
+
* Flushes the observation buffer to the sink when it reaches BATCH_CAP,
|
|
28
|
+
* awaiting the write before pulling the next chunk (backpressure).
|
|
29
|
+
*/
|
|
30
|
+
ingest(filePath: string, sink: ObservationSink): Promise<IngestionResult>;
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=apple-health.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"apple-health.d.ts","sourceRoot":"","sources":["../../../src/medical/adapters/apple-health.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAEV,gBAAgB,EAChB,eAAe,EACf,eAAe,EAChB,MAAM,aAAa,CAAC;AAKrB;;;;;;;;;;;;;GAaG;AACH,qBAAa,kBAAmB,YAAW,gBAAgB;IACzD,QAAQ,CAAC,IAAI,kBAAkB;IAE/B;;OAEG;IACH,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;IAIpC;;;;;;;OAOG;IACG,MAAM,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,eAAe,GAAG,OAAO,CAAC,eAAe,CAAC;CAwEhF"}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
/** AppleHealthAdapter — SAX streaming import of Apple Health export.xml (Phase 6, Sprint 5). */
|
|
2
|
+
import { createReadStream } from "node:fs";
|
|
3
|
+
import * as sax from "sax";
|
|
4
|
+
/** Maximum observations to buffer before awaiting a sink write (backpressure cap). */
|
|
5
|
+
const BATCH_CAP = 1000;
|
|
6
|
+
/**
|
|
7
|
+
* Streams Apple Health export XML via SAX with bounded (~1000-row) batches.
|
|
8
|
+
*
|
|
9
|
+
* Backpressure mechanism:
|
|
10
|
+
* The stream is opened in paused (non-flowing) mode.
|
|
11
|
+
* We drive it as an async iterator, reading one chunk at a time.
|
|
12
|
+
* When the observation buffer reaches BATCH_CAP, we await sink.writeBatch
|
|
13
|
+
* before continuing to iterate — preventing unbounded accumulation.
|
|
14
|
+
*
|
|
15
|
+
* NEVER calls readFile/readFileSync on the whole file — createReadStream only.
|
|
16
|
+
*
|
|
17
|
+
* bober: single .xml extension check; extend canHandle to sniff "HealthData"
|
|
18
|
+
* root if the registry ever needs to distinguish multiple XML formats.
|
|
19
|
+
*/
|
|
20
|
+
export class AppleHealthAdapter {
|
|
21
|
+
kind = "apple-health";
|
|
22
|
+
/**
|
|
23
|
+
* Returns true for .xml files (cheap extension check — no full read).
|
|
24
|
+
*/
|
|
25
|
+
canHandle(filePath) {
|
|
26
|
+
return filePath.toLowerCase().endsWith(".xml");
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Stream-parse the Apple Health export XML file.
|
|
30
|
+
*
|
|
31
|
+
* Uses createReadStream as an async iterable to pull one chunk at a time.
|
|
32
|
+
* Feeds chunks to a strict SAX parser (synchronous per chunk).
|
|
33
|
+
* Flushes the observation buffer to the sink when it reaches BATCH_CAP,
|
|
34
|
+
* awaiting the write before pulling the next chunk (backpressure).
|
|
35
|
+
*/
|
|
36
|
+
async ingest(filePath, sink) {
|
|
37
|
+
let recordsParsed = 0;
|
|
38
|
+
let buffer = [];
|
|
39
|
+
const parser = sax.parser(true, { trim: true });
|
|
40
|
+
parser.onopentag = (node) => {
|
|
41
|
+
if (node.name !== "Record")
|
|
42
|
+
return;
|
|
43
|
+
const a = node.attributes;
|
|
44
|
+
const value = parseFloat(a["value"] ?? "");
|
|
45
|
+
if (Number.isNaN(value))
|
|
46
|
+
return; // skip non-numeric records
|
|
47
|
+
recordsParsed++;
|
|
48
|
+
buffer.push({
|
|
49
|
+
metric: a["type"] ?? "",
|
|
50
|
+
value,
|
|
51
|
+
unit: a["unit"] ?? "",
|
|
52
|
+
tStart: a["startDate"] ?? "",
|
|
53
|
+
tEnd: a["endDate"] || undefined,
|
|
54
|
+
source: "apple-health",
|
|
55
|
+
});
|
|
56
|
+
};
|
|
57
|
+
// Collect any SAX parse errors so we can rethrow after the chunk.
|
|
58
|
+
let parseError = null;
|
|
59
|
+
parser.onerror = (err) => {
|
|
60
|
+
parseError = err;
|
|
61
|
+
// Clear so the parser does not get permanently stuck on the error state.
|
|
62
|
+
parser.error = null;
|
|
63
|
+
};
|
|
64
|
+
// createReadStream is an async iterable in Node.js >= 10 (streams2+).
|
|
65
|
+
// Using for-await-of pulls one chunk at a time — the stream stays paused
|
|
66
|
+
// between iterations, giving us natural backpressure control.
|
|
67
|
+
const stream = createReadStream(filePath, {
|
|
68
|
+
encoding: "utf8",
|
|
69
|
+
});
|
|
70
|
+
for await (const chunk of stream) {
|
|
71
|
+
// Feed chunk to the SAX parser synchronously (all opentag events fire here).
|
|
72
|
+
parser.write(chunk);
|
|
73
|
+
if (parseError) {
|
|
74
|
+
throw parseError;
|
|
75
|
+
}
|
|
76
|
+
// Flush in BATCH_CAP-sized slices whenever the buffer overflows.
|
|
77
|
+
// Awaiting writeBatch here IS the backpressure: the for-await loop
|
|
78
|
+
// does not pull the next chunk from the stream until this resolves.
|
|
79
|
+
while (buffer.length >= BATCH_CAP) {
|
|
80
|
+
const batch = buffer.splice(0, BATCH_CAP);
|
|
81
|
+
await sink.writeBatch(batch, []);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
// Finalize the SAX parser.
|
|
85
|
+
try {
|
|
86
|
+
parser.close();
|
|
87
|
+
}
|
|
88
|
+
catch {
|
|
89
|
+
// ignore: tolerate malformed XML tails
|
|
90
|
+
}
|
|
91
|
+
// Flush remaining buffered observations (< BATCH_CAP) after stream ends.
|
|
92
|
+
if (buffer.length > 0) {
|
|
93
|
+
await sink.writeBatch(buffer, []);
|
|
94
|
+
buffer = [];
|
|
95
|
+
}
|
|
96
|
+
const newRows = "newRows" in sink ? sink.newRows : 0;
|
|
97
|
+
return { recordsParsed, newRows };
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
//# sourceMappingURL=apple-health.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"apple-health.js","sourceRoot":"","sources":["../../../src/medical/adapters/apple-health.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import type { AuditEntry } from "./types.js";
|
|
2
|
+
/**
|
|
3
|
+
* Appends structured audit entries to .bober/medical/audit-<date>.jsonl.
|
|
4
|
+
*
|
|
5
|
+
* File is opened O_APPEND|O_CREAT with mode 0600. The date in the filename
|
|
6
|
+
* is derived from the INJECTED tIso field of each entry — never the wall clock.
|
|
7
|
+
*
|
|
8
|
+
* PHI rule: entries hold IDs/enums ONLY (tIso, event, rulesetVersion?,
|
|
9
|
+
* patternsetVersion?, ruleId?). NEVER serialize prompt text or health values.
|
|
10
|
+
*
|
|
11
|
+
* bober: single-process append; if multi-process concurrent writes are needed,
|
|
12
|
+
* swap for a SQLite WAL or a locking file-writer.
|
|
13
|
+
*/
|
|
14
|
+
export declare class AuditLog {
|
|
15
|
+
private readonly projectRoot;
|
|
16
|
+
constructor(projectRoot: string);
|
|
17
|
+
/**
|
|
18
|
+
* Filename derives from the INJECTED tIso (YYYY-MM-DD slice).
|
|
19
|
+
* Never Date.now().
|
|
20
|
+
*/
|
|
21
|
+
private path;
|
|
22
|
+
/**
|
|
23
|
+
* Append one AuditEntry as a newline-terminated JSON line.
|
|
24
|
+
*
|
|
25
|
+
* Uses O_APPEND|O_CREAT with mode 0600 and an explicit fh.chmod(0600)
|
|
26
|
+
* to guarantee the file mode even if umask would reduce it.
|
|
27
|
+
* NEVER uses appendFile — it does not reliably honour the mode argument.
|
|
28
|
+
*/
|
|
29
|
+
append(entry: AuditEntry): Promise<void>;
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=audit.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"audit.d.ts","sourceRoot":"","sources":["../../src/medical/audit.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAI7C;;;;;;;;;;;GAWG;AACH,qBAAa,QAAQ;IACP,OAAO,CAAC,QAAQ,CAAC,WAAW;gBAAX,WAAW,EAAE,MAAM;IAIhD;;;OAGG;IACH,OAAO,CAAC,IAAI;IAOZ;;;;;;OAMG;IACG,MAAM,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;CAe/C"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
/** AuditLog — append-only IDs/enums-only medical audit log (Phase 6, Sprint 2). */
|
|
2
|
+
import { open, mkdir } from "node:fs/promises";
|
|
3
|
+
import { constants } from "node:fs";
|
|
4
|
+
import { join } from "node:path";
|
|
5
|
+
// ── AuditLog ────────────────────────────────────────────────────────
|
|
6
|
+
/**
|
|
7
|
+
* Appends structured audit entries to .bober/medical/audit-<date>.jsonl.
|
|
8
|
+
*
|
|
9
|
+
* File is opened O_APPEND|O_CREAT with mode 0600. The date in the filename
|
|
10
|
+
* is derived from the INJECTED tIso field of each entry — never the wall clock.
|
|
11
|
+
*
|
|
12
|
+
* PHI rule: entries hold IDs/enums ONLY (tIso, event, rulesetVersion?,
|
|
13
|
+
* patternsetVersion?, ruleId?). NEVER serialize prompt text or health values.
|
|
14
|
+
*
|
|
15
|
+
* bober: single-process append; if multi-process concurrent writes are needed,
|
|
16
|
+
* swap for a SQLite WAL or a locking file-writer.
|
|
17
|
+
*/
|
|
18
|
+
export class AuditLog {
|
|
19
|
+
projectRoot;
|
|
20
|
+
constructor(projectRoot) {
|
|
21
|
+
this.projectRoot = projectRoot;
|
|
22
|
+
}
|
|
23
|
+
// ── Path helpers ──────────────────────────────────────────────────
|
|
24
|
+
/**
|
|
25
|
+
* Filename derives from the INJECTED tIso (YYYY-MM-DD slice).
|
|
26
|
+
* Never Date.now().
|
|
27
|
+
*/
|
|
28
|
+
path(tIso) {
|
|
29
|
+
const date = tIso.slice(0, 10); // "2026-06-16"
|
|
30
|
+
return join(this.projectRoot, ".bober", "medical", `audit-${date}.jsonl`);
|
|
31
|
+
}
|
|
32
|
+
// ── append ────────────────────────────────────────────────────────
|
|
33
|
+
/**
|
|
34
|
+
* Append one AuditEntry as a newline-terminated JSON line.
|
|
35
|
+
*
|
|
36
|
+
* Uses O_APPEND|O_CREAT with mode 0600 and an explicit fh.chmod(0600)
|
|
37
|
+
* to guarantee the file mode even if umask would reduce it.
|
|
38
|
+
* NEVER uses appendFile — it does not reliably honour the mode argument.
|
|
39
|
+
*/
|
|
40
|
+
async append(entry) {
|
|
41
|
+
const dir = join(this.projectRoot, ".bober", "medical");
|
|
42
|
+
await mkdir(dir, { recursive: true, mode: 0o700 });
|
|
43
|
+
const line = JSON.stringify(entry) + "\n";
|
|
44
|
+
const flags = constants.O_WRONLY | constants.O_APPEND | constants.O_CREAT;
|
|
45
|
+
const fh = await open(this.path(entry.tIso), flags, 0o600);
|
|
46
|
+
try {
|
|
47
|
+
// Guarantee mode 0600 even if umask would have reduced it.
|
|
48
|
+
await fh.chmod(0o600);
|
|
49
|
+
await fh.write(line);
|
|
50
|
+
}
|
|
51
|
+
finally {
|
|
52
|
+
await fh.close();
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
//# sourceMappingURL=audit.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"audit.js","sourceRoot":"","sources":["../../src/medical/audit.ts"],"names":[],"mappings":"AAAA,mFAAmF;AACnF,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACpC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAGjC,uEAAuE;AAEvE;;;;;;;;;;;GAWG;AACH,MAAM,OAAO,QAAQ;IACU;IAA7B,YAA6B,WAAmB;QAAnB,gBAAW,GAAX,WAAW,CAAQ;IAAG,CAAC;IAEpD,qEAAqE;IAErE;;;OAGG;IACK,IAAI,CAAC,IAAY;QACvB,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,eAAe;QAC/C,OAAO,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,IAAI,QAAQ,CAAC,CAAC;IAC5E,CAAC;IAED,qEAAqE;IAErE;;;;;;OAMG;IACH,KAAK,CAAC,MAAM,CAAC,KAAiB;QAC5B,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC;QACxD,MAAM,KAAK,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;QAEnD,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC;QAC1C,MAAM,KAAK,GAAG,SAAS,CAAC,QAAQ,GAAG,SAAS,CAAC,QAAQ,GAAG,SAAS,CAAC,OAAO,CAAC;QAC1E,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;QAC3D,IAAI,CAAC;YACH,2DAA2D;YAC3D,MAAM,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YACtB,MAAM,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACvB,CAAC;gBAAS,CAAC;YACT,MAAM,EAAE,CAAC,KAAK,EAAE,CAAC;QACnB,CAAC;IACH,CAAC;CACF"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import type { AuditLog } from "./audit.js";
|
|
2
|
+
import type { ConsentRecord } from "./types.js";
|
|
3
|
+
/**
|
|
4
|
+
* Manages consent persistence at .bober/medical/consent.json.
|
|
5
|
+
*
|
|
6
|
+
* Fail-closed: a missing or corrupt consent.json returns false/undefined —
|
|
7
|
+
* the engine refuses rather than proceeding without consent.
|
|
8
|
+
*
|
|
9
|
+
* Depends on AuditLog to record a 'consent' entry on recordConsent().
|
|
10
|
+
*
|
|
11
|
+
* bober: JSON file sidecar; if multi-session concurrent access is needed,
|
|
12
|
+
* migrate to the SQLite FactStore (see src/state/facts.ts).
|
|
13
|
+
*/
|
|
14
|
+
export declare class ConsentGate {
|
|
15
|
+
private readonly projectRoot;
|
|
16
|
+
private readonly audit;
|
|
17
|
+
constructor(projectRoot: string, audit: AuditLog);
|
|
18
|
+
private path;
|
|
19
|
+
/**
|
|
20
|
+
* Fail-closed: missing or corrupt file returns false. Never throws.
|
|
21
|
+
* Reads .bober/medical/consent.json via node:fs/promises.
|
|
22
|
+
*/
|
|
23
|
+
hasConsent(): Promise<boolean>;
|
|
24
|
+
/**
|
|
25
|
+
* Returns the parsed ConsentRecord, or undefined if missing/corrupt.
|
|
26
|
+
* Validates required fields — a partial/corrupt record returns undefined.
|
|
27
|
+
*/
|
|
28
|
+
current(): Promise<ConsentRecord | undefined>;
|
|
29
|
+
/**
|
|
30
|
+
* Persist a ConsentRecord (mode 0600) AND append a 'consent' audit entry.
|
|
31
|
+
*
|
|
32
|
+
* @param record - The consent record to persist.
|
|
33
|
+
* @param nowIso - INJECTED ISO 8601 timestamp — never wall-clock.
|
|
34
|
+
*/
|
|
35
|
+
recordConsent(record: ConsentRecord, nowIso: string): Promise<void>;
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=consent.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"consent.d.ts","sourceRoot":"","sources":["../../src/medical/consent.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAIhD;;;;;;;;;;GAUG;AACH,qBAAa,WAAW;IAEpB,OAAO,CAAC,QAAQ,CAAC,WAAW;IAC5B,OAAO,CAAC,QAAQ,CAAC,KAAK;gBADL,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,QAAQ;IAKlC,OAAO,CAAC,IAAI;IAMZ;;;OAGG;IACG,UAAU,IAAI,OAAO,CAAC,OAAO,CAAC;IAIpC;;;OAGG;IACG,OAAO,IAAI,OAAO,CAAC,aAAa,GAAG,SAAS,CAAC;IAsBnD;;;;;OAKG;IACG,aAAa,CAAC,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAa1E"}
|