@dv.nghiem/flowdeck 0.4.11 → 0.5.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.
Files changed (105) hide show
  1. package/README.md +0 -2
  2. package/dist/agents/orchestrator.d.ts.map +1 -1
  3. package/dist/config/index.d.ts +1 -1
  4. package/dist/config/index.d.ts.map +1 -1
  5. package/dist/config/schema.d.ts +27 -1
  6. package/dist/config/schema.d.ts.map +1 -1
  7. package/dist/dashboard/lib/state-reader.d.ts +2 -1
  8. package/dist/dashboard/lib/state-reader.d.ts.map +1 -1
  9. package/dist/dashboard/server.mjs +128 -13
  10. package/dist/dashboard/types.d.ts +12 -0
  11. package/dist/dashboard/types.d.ts.map +1 -1
  12. package/dist/hooks/approval-hook.d.ts +16 -2
  13. package/dist/hooks/approval-hook.d.ts.map +1 -1
  14. package/dist/hooks/compaction-hook.d.ts +1 -1
  15. package/dist/hooks/compaction-hook.d.ts.map +1 -1
  16. package/dist/hooks/context-window-monitor.d.ts +7 -1
  17. package/dist/hooks/context-window-monitor.d.ts.map +1 -1
  18. package/dist/hooks/decision-trace-hook.d.ts +3 -0
  19. package/dist/hooks/decision-trace-hook.d.ts.map +1 -1
  20. package/dist/hooks/event-log-hook.d.ts +19 -3
  21. package/dist/hooks/event-log-hook.d.ts.map +1 -1
  22. package/dist/hooks/guard-rails.d.ts +16 -5
  23. package/dist/hooks/guard-rails.d.ts.map +1 -1
  24. package/dist/hooks/orchestrator-guard-hook.d.ts +8 -5
  25. package/dist/hooks/orchestrator-guard-hook.d.ts.map +1 -1
  26. package/dist/hooks/shell-env-hook.d.ts.map +1 -1
  27. package/dist/hooks/tool-guard.d.ts +19 -3
  28. package/dist/hooks/tool-guard.d.ts.map +1 -1
  29. package/dist/index.d.ts.map +1 -1
  30. package/dist/index.js +8401 -4863
  31. package/dist/services/agent-contract-registry.d.ts.map +1 -1
  32. package/dist/services/agent-trace-graph.d.ts +4 -0
  33. package/dist/services/agent-trace-graph.d.ts.map +1 -1
  34. package/dist/services/agent-validator.d.ts +2 -1
  35. package/dist/services/agent-validator.d.ts.map +1 -1
  36. package/dist/services/approval-manager.d.ts +14 -1
  37. package/dist/services/approval-manager.d.ts.map +1 -1
  38. package/dist/services/audit-log.d.ts +23 -0
  39. package/dist/services/audit-log.d.ts.map +1 -0
  40. package/dist/services/context-ingress.d.ts +75 -0
  41. package/dist/services/context-ingress.d.ts.map +1 -0
  42. package/dist/services/deadlock-detector.d.ts.map +1 -1
  43. package/dist/services/delegation-budget.d.ts +55 -0
  44. package/dist/services/delegation-budget.d.ts.map +1 -0
  45. package/dist/services/event-logger.d.ts +3 -1
  46. package/dist/services/event-logger.d.ts.map +1 -1
  47. package/dist/services/execution-substrate.d.ts +35 -0
  48. package/dist/services/execution-substrate.d.ts.map +1 -0
  49. package/dist/services/harness-controller.d.ts +58 -0
  50. package/dist/services/harness-controller.d.ts.map +1 -0
  51. package/dist/services/harness-policy.d.ts +24 -0
  52. package/dist/services/harness-policy.d.ts.map +1 -0
  53. package/dist/services/harness-types.d.ts +178 -0
  54. package/dist/services/harness-types.d.ts.map +1 -0
  55. package/dist/services/lazy-rule-loader.d.ts +2 -0
  56. package/dist/services/lazy-rule-loader.d.ts.map +1 -1
  57. package/dist/services/loop-detector.d.ts.map +1 -1
  58. package/dist/services/prompt-cache.d.ts +25 -0
  59. package/dist/services/prompt-cache.d.ts.map +1 -0
  60. package/dist/services/recovery-layer.d.ts +26 -0
  61. package/dist/services/recovery-layer.d.ts.map +1 -0
  62. package/dist/services/run-trace.d.ts +17 -0
  63. package/dist/services/run-trace.d.ts.map +1 -1
  64. package/dist/services/state-persistence.d.ts +22 -0
  65. package/dist/services/state-persistence.d.ts.map +1 -0
  66. package/dist/services/supervisor-binding.d.ts +9 -0
  67. package/dist/services/supervisor-binding.d.ts.map +1 -1
  68. package/dist/services/token-metrics.d.ts +39 -0
  69. package/dist/services/token-metrics.d.ts.map +1 -0
  70. package/dist/services/verification-layer.d.ts +24 -0
  71. package/dist/services/verification-layer.d.ts.map +1 -0
  72. package/dist/services/workflow-scorecard.d.ts +5 -0
  73. package/dist/services/workflow-scorecard.d.ts.map +1 -1
  74. package/dist/tools/decision-trace.d.ts +4 -0
  75. package/dist/tools/decision-trace.d.ts.map +1 -1
  76. package/dist/tools/delegate.d.ts +16 -0
  77. package/dist/tools/delegate.d.ts.map +1 -0
  78. package/dist/tools/failure-replay.d.ts +8 -0
  79. package/dist/tools/failure-replay.d.ts.map +1 -1
  80. package/dist/tools/policy-engine.d.ts +1 -0
  81. package/dist/tools/policy-engine.d.ts.map +1 -1
  82. package/docs/concepts/HARNESS_ARCHITECTURE.md +241 -0
  83. package/docs/concepts/HARNESS_LAYERS.md +378 -0
  84. package/docs/concepts/HARNESS_WIRING.md +404 -0
  85. package/docs/getting-started/installation.md +0 -18
  86. package/docs/index.md +0 -1
  87. package/docs/reference/hooks.md +1 -16
  88. package/package.json +6 -6
  89. package/src/commands/fd-guarded-edit.md +69 -0
  90. package/src/rules/common/agent-defense.md +66 -0
  91. package/src/rules/common/agent-orchestration.md +35 -1
  92. package/src/skills/context-budget/SKILL.md +266 -0
  93. package/src/skills/context-guard/SKILL.md +172 -0
  94. package/src/skills/context-steward/SKILL.md +297 -0
  95. package/src/skills/decision-trace/SKILL.md +137 -0
  96. package/src/skills/research-first/SKILL.md +344 -0
  97. package/src/skills/session-persistence/SKILL.md +320 -0
  98. package/src/skills/telemetry-steward/SKILL.md +191 -0
  99. package/dist/services/rtk-manager.d.ts +0 -80
  100. package/dist/services/rtk-manager.d.ts.map +0 -1
  101. package/dist/services/rtk-policy.d.ts +0 -26
  102. package/dist/services/rtk-policy.d.ts.map +0 -1
  103. package/dist/tools/rtk-setup.d.ts +0 -22
  104. package/dist/tools/rtk-setup.d.ts.map +0 -1
  105. package/docs/reference/rtk.md +0 -162
package/README.md CHANGED
@@ -26,7 +26,6 @@ FlowDeck adds a structured, multi-agent development workflow to OpenCode. It coo
26
26
  - 🧭 **Adaptive Workflow Routing** — scores tasks across 5 dimensions (complexity, risk, confidence, blast radius, codebase freshness) and selects the minimal sufficient workflow class dynamically
27
27
  - ⚙️ **Model-agnostic** — no model is hardcoded. Every agent uses your currently selected OpenCode model. Override per-agent in `flowdeck.json`.
28
28
  - 💰 **Cost Optimization** — USD cost estimation (40+ models), per-workflow budget enforcement, retry-cost tracking, and concurrency limits to control total production spend.
29
- - 📦 **rtk Integration** — optional [rtk](https://github.com/rtk-ai/rtk) output-compression layer compresses noisy CLI output (git, npm, test runners, linters) 60–90% before it reaches the model. Auto-detected, telemetry-disabled by default.
30
29
 
31
30
  ---
32
31
 
@@ -173,7 +172,6 @@ Agents not listed in `agents` inherit the active OpenCode model. See [Configurat
173
172
  | [docs/USER_GUIDE.md](docs/USER_GUIDE.md) | Full agent and skill usage reference with examples |
174
173
  | [docs/workflows.md](docs/workflows.md) | Command architecture and workflow patterns |
175
174
  | [docs/intelligence.md](docs/intelligence.md) | AI safety features: patch trust, volatility map, failure replay, regression prediction |
176
- | [docs/reference/rtk.md](docs/reference/rtk.md) | rtk CLI output compression: detection, telemetry, supported commands, setup |
177
175
 
178
176
  ---
179
177
 
@@ -1 +1 @@
1
- {"version":3,"file":"orchestrator.d.ts","sourceRoot":"","sources":["../../src/agents/orchestrator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAsV/C,wBAAgB,uBAAuB,CACrC,cAAc,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,EAC5B,aAAa,CAAC,EAAE,MAAM,GACrB,MAAM,CA6BR;AAED,wBAAgB,uBAAuB,CACrC,KAAK,CAAC,EAAE,MAAM,GAAG,KAAK,CAAC,MAAM,GAAG;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,EACjE,YAAY,CAAC,EAAE,MAAM,EACrB,kBAAkB,CAAC,EAAE,MAAM,EAC3B,cAAc,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,EAC5B,aAAa,CAAC,EAAE,MAAM,GACrB,eAAe,CAuBjB"}
1
+ {"version":3,"file":"orchestrator.d.ts","sourceRoot":"","sources":["../../src/agents/orchestrator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAwV/C,wBAAgB,uBAAuB,CACrC,cAAc,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,EAC5B,aAAa,CAAC,EAAE,MAAM,GACrB,MAAM,CA6BR;AAED,wBAAgB,uBAAuB,CACrC,KAAK,CAAC,EAAE,MAAM,GAAG,KAAK,CAAC,MAAM,GAAG;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,EACjE,YAAY,CAAC,EAAE,MAAM,EACrB,kBAAkB,CAAC,EAAE,MAAM,EAC3B,cAAc,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,EAC5B,aAAa,CAAC,EAAE,MAAM,GACrB,eAAe,CAuBjB"}
@@ -1,3 +1,3 @@
1
1
  export { loadFlowDeckConfig, resolveDesignFirstConfig } from './loader';
2
- export type { FlowDeckConfig, AgentModelConfig } from './schema';
2
+ export type { FlowDeckConfig, AgentModelConfig, HarnessConfig, GovernanceConfig } from './schema';
3
3
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/config/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,wBAAwB,EAAE,MAAM,UAAU,CAAC;AACxE,YAAY,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/config/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,wBAAwB,EAAE,MAAM,UAAU,CAAC;AACxE,YAAY,EAAE,cAAc,EAAE,gBAAgB,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC"}
@@ -11,6 +11,16 @@ export interface AgentModelConfig {
11
11
  /** Model to use for this agent (e.g. "github-copilot/sonnet-4.6"). If not set, uses the currently selected model. */
12
12
  model?: string;
13
13
  }
14
+ export interface HarnessConfig {
15
+ /** Whether the runtime harness is active. Default: true */
16
+ enabled?: boolean;
17
+ /**
18
+ * strict: policy denials block execution
19
+ * advisory: policy violations are logged but do not block
20
+ * Default: "strict"
21
+ */
22
+ mode?: "strict" | "advisory";
23
+ }
14
24
  export interface GovernanceConfig {
15
25
  validator?: {
16
26
  /**
@@ -34,6 +44,12 @@ export interface GovernanceConfig {
34
44
  /** Automatically stop the run when a signal fires. Default: false */
35
45
  autoStop?: boolean;
36
46
  };
47
+ /** Whether the tool-guard layer is active. Default: true */
48
+ toolGuard?: boolean;
49
+ /** Whether the guard-rails layer is active. Default: true */
50
+ guardRails?: boolean;
51
+ /** Whether approval gating is active. Default: true */
52
+ approvals?: boolean;
37
53
  scorecard?: {
38
54
  /** Whether to generate scorecards after each run. Default: true */
39
55
  enabled?: boolean;
@@ -69,10 +85,18 @@ export interface GovernanceConfig {
69
85
  */
70
86
  onExhaustion?: "warn" | "stop" | "escalate";
71
87
  };
88
+ delegationBudget?: {
89
+ /** Maximum number of tool calls allowed per run. Default: 200 */
90
+ maxToolCalls?: number;
91
+ /** Maximum delegation depth (parent-child run nesting). Default: 3 */
92
+ maxDepth?: number;
93
+ /** Maximum retries for the same step before escalation. Default: 3 */
94
+ maxSameStepRetries?: number;
95
+ };
72
96
  supervisor?: {
73
97
  /**
74
98
  * Whether the supervisor review layer is active.
75
- * Default: false (opt-in)
99
+ * Default: true
76
100
  */
77
101
  enabled?: boolean;
78
102
  /**
@@ -119,6 +143,8 @@ export interface FlowDeckConfig {
119
143
  modelOverrides?: Record<string, string>;
120
144
  defaultSkillsByTaskType?: Record<string, string[]>;
121
145
  };
146
+ /** Runtime harness configuration */
147
+ harness?: HarnessConfig;
122
148
  /** Reliability and governance layer: contracts, validation, tracing, budgets, loop detection, scoring */
123
149
  governance?: GovernanceConfig;
124
150
  }
@@ -1 +1 @@
1
- {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/config/schema.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,MAAM,WAAW,gBAAgB;IAC/B,qHAAqH;IACrH,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,gBAAgB;IAC/B,SAAS,CAAC,EAAE;QACV;;;;WAIG;QACH,IAAI,CAAC,EAAE,KAAK,GAAG,UAAU,GAAG,QAAQ,CAAC;QACrC,kFAAkF;QAClF,mBAAmB,CAAC,EAAE,KAAK,GAAG,MAAM,GAAG,QAAQ,CAAC;KACjD,CAAC;IACF,iBAAiB,CAAC,EAAE;QAClB,0DAA0D;QAC1D,OAAO,CAAC,EAAE,OAAO,CAAC;QAClB,iFAAiF;QACjF,eAAe,CAAC,EAAE,MAAM,CAAC;QACzB,+EAA+E;QAC/E,kBAAkB,CAAC,EAAE,MAAM,CAAC;QAC5B,yFAAyF;QACzF,iBAAiB,CAAC,EAAE,MAAM,CAAC;QAC3B,qEAAqE;QACrE,QAAQ,CAAC,EAAE,OAAO,CAAC;KACpB,CAAC;IACF,SAAS,CAAC,EAAE;QACV,mEAAmE;QACnE,OAAO,CAAC,EAAE,OAAO,CAAC;QAClB,qCAAqC;QACrC,WAAW,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;KAChC,CAAC;IACF,aAAa,CAAC,EAAE;QACd,sDAAsD;QACtD,OAAO,CAAC,EAAE,OAAO,CAAC;QAClB,gFAAgF;QAChF,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,mFAAmF;QACnF,mBAAmB,CAAC,EAAE,MAAM,CAAC;QAC7B,2EAA2E;QAC3E,WAAW,CAAC,EAAE,MAAM,CAAC;KACtB,CAAC;IACF,UAAU,CAAC,EAAE;QACX;;;WAGG;QACH,mBAAmB,CAAC,EAAE,MAAM,CAAC;QAC7B,iEAAiE;QACjE,cAAc,CAAC,EAAE,MAAM,CAAC;QACxB,kEAAkE;QAClE,eAAe,CAAC,EAAE,MAAM,CAAC;QACzB;;;;;;WAMG;QACH,YAAY,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,UAAU,CAAC;KAC7C,CAAC;IACF,UAAU,CAAC,EAAE;QACX;;;WAGG;QACH,OAAO,CAAC,EAAE,OAAO,CAAC;QAClB;;;;WAIG;QACH,IAAI,CAAC,EAAE,UAAU,GAAG,QAAQ,CAAC;QAC7B;;;;WAIG;QACH,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;QAC3B;;;;WAIG;QACH,QAAQ,CAAC,EAAE,OAAO,CAAC;QACnB;;;;WAIG;QACH,mBAAmB,CAAC,EAAE,MAAM,CAAC;QAC7B;;;WAGG;QACH,mBAAmB,CAAC,EAAE,OAAO,CAAC;KAC/B,CAAC;CACH;AAED,MAAM,WAAW,cAAc;IAC7B;;;OAGG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;IAC1C,WAAW,CAAC,EAAE;QACZ,OAAO,CAAC,EAAE,OAAO,CAAC;QAClB,WAAW,CAAC,EAAE,QAAQ,GAAG,UAAU,CAAC;QACpC,mCAAmC,CAAC,EAAE,OAAO,CAAC;QAC9C,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACxC,uBAAuB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;KACpD,CAAC;IACF,yGAAyG;IACzG,UAAU,CAAC,EAAE,gBAAgB,CAAC;CAC/B"}
1
+ {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/config/schema.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,4 @@
1
- import type { DashboardData } from "../types";
1
+ import type { DashboardData, Readiness } from "../types";
2
+ export declare function computeReadiness(dir: string): Readiness;
2
3
  export declare function readDashboardData(dir: string): DashboardData;
3
4
  //# sourceMappingURL=state-reader.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"state-reader.d.ts","sourceRoot":"","sources":["../../../src/dashboard/lib/state-reader.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAS,aAAa,EAAmE,MAAM,UAAU,CAAA;AA4ErH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,aAAa,CAuE5D"}
1
+ {"version":3,"file":"state-reader.d.ts","sourceRoot":"","sources":["../../../src/dashboard/lib/state-reader.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAS,aAAa,EAAmE,SAAS,EAAkB,MAAM,UAAU,CAAA;AAgLhJ,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,CAiCvD;AAED,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,aAAa,CAwE5D"}
@@ -21,7 +21,7 @@ import path2 from "path";
21
21
  import { fileURLToPath } from "url";
22
22
 
23
23
  // src/dashboard/lib/state-reader.ts
24
- import { existsSync as existsSync6, readFileSync as readFileSync6 } from "fs";
24
+ import { existsSync as existsSync6, readFileSync as readFileSync6, statSync } from "fs";
25
25
  import { join as join6 } from "path";
26
26
 
27
27
  // src/tools/planning-state-lib.ts
@@ -12670,6 +12670,123 @@ function findCurrentPhase(phases) {
12670
12670
  return phases[phases.length - 1].number;
12671
12671
  return 0;
12672
12672
  }
12673
+ var ONE_DAY_MS = 24 * 60 * 60 * 1000;
12674
+ var HIGH_RISK_THRESHOLD = 70;
12675
+ function checkPlanningBlockers(state) {
12676
+ const count = state.blockers?.length ?? 0;
12677
+ if (count > 0) {
12678
+ return { name: "Planning Blockers", status: "warn", message: `${count} blocker(s) recorded in STATE.md` };
12679
+ }
12680
+ return { name: "Planning Blockers", status: "pass", message: "No blockers" };
12681
+ }
12682
+ function checkTestStatus(state, traces) {
12683
+ const tdd = state.tdd;
12684
+ if (tdd && tdd.failing_tests > 0) {
12685
+ return { name: "Test Status", status: "fail", message: `${tdd.failing_tests} failing test(s) in TDD state` };
12686
+ }
12687
+ const testFailures = traces.filter((t) => t.status === "failed" && /test|spec/i.test(t.command));
12688
+ if (testFailures.length > 0) {
12689
+ return { name: "Test Status", status: "fail", message: `${testFailures.length} recent test run(s) failed` };
12690
+ }
12691
+ if (tdd && tdd.passing_tests > 0) {
12692
+ return { name: "Test Status", status: "pass", message: `${tdd.passing_tests} test(s) passing` };
12693
+ }
12694
+ return { name: "Test Status", status: "pass", message: "No failing tests detected" };
12695
+ }
12696
+ function checkPendingApprovals(dir) {
12697
+ const approvals = getPendingApprovals(dir);
12698
+ const highRisk = approvals.filter((a) => a.risk_score >= HIGH_RISK_THRESHOLD);
12699
+ if (highRisk.length > 0) {
12700
+ return { name: "Pending Approvals", status: "warn", message: `${highRisk.length} high-risk approval(s) pending` };
12701
+ }
12702
+ if (approvals.length > 0) {
12703
+ return { name: "Pending Approvals", status: "pass", message: `${approvals.length} approval(s) pending, none high-risk` };
12704
+ }
12705
+ return { name: "Pending Approvals", status: "pass", message: "No pending approvals" };
12706
+ }
12707
+ function checkDecisionHealth(dir) {
12708
+ const decisionsPath = join6(dir, ".codebase", "DECISIONS.jsonl");
12709
+ if (!existsSync6(decisionsPath)) {
12710
+ return { name: "Decision Health", status: "pass", message: "No decisions recorded" };
12711
+ }
12712
+ try {
12713
+ const content = readFileSync6(decisionsPath, "utf-8");
12714
+ const entries = content.split(`
12715
+ `).filter((l) => l.trim()).map((l) => {
12716
+ try {
12717
+ return JSON.parse(l);
12718
+ } catch {
12719
+ return null;
12720
+ }
12721
+ }).filter(Boolean);
12722
+ const riskyWithoutEvidence = entries.filter((e) => e.risk_level === "high" && (!e.evidence || e.evidence.length === 0));
12723
+ if (riskyWithoutEvidence.length > 0) {
12724
+ return { name: "Decision Health", status: "warn", message: `${riskyWithoutEvidence.length} high-risk decision(s) without evidence` };
12725
+ }
12726
+ return { name: "Decision Health", status: "pass", message: "All high-risk decisions have evidence" };
12727
+ } catch {
12728
+ return { name: "Decision Health", status: "warn", message: "Unable to read decisions file" };
12729
+ }
12730
+ }
12731
+ function checkLintTypeStatus(traces) {
12732
+ const failures = traces.filter((t) => t.status === "failed");
12733
+ const lintFailures = failures.filter((t) => /lint|type|build|check/i.test(t.command));
12734
+ if (lintFailures.length > 0) {
12735
+ return { name: "Lint/Type Status", status: "fail", message: `${lintFailures.length} recent lint/type/build failure(s)` };
12736
+ }
12737
+ if (failures.length > 0) {
12738
+ return { name: "Lint/Type Status", status: "warn", message: `${failures.length} recent run failure(s)` };
12739
+ }
12740
+ return { name: "Lint/Type Status", status: "pass", message: "No recent failures" };
12741
+ }
12742
+ function checkSessionHealth(dir) {
12743
+ const sp = statePath(dir);
12744
+ if (!existsSync6(sp)) {
12745
+ return { name: "Session Health", status: "warn", message: "STATE.md not found" };
12746
+ }
12747
+ try {
12748
+ const stats = statSync(sp);
12749
+ const ageMs = Date.now() - stats.mtime.getTime();
12750
+ if (ageMs > ONE_DAY_MS) {
12751
+ const hours = Math.round(ageMs / (60 * 60 * 1000));
12752
+ return { name: "Session Health", status: "warn", message: `STATE.md is ${hours}h old (>24h)` };
12753
+ }
12754
+ return { name: "Session Health", status: "pass", message: "STATE.md updated within 24h" };
12755
+ } catch {
12756
+ return { name: "Session Health", status: "warn", message: "Unable to check STATE.md age" };
12757
+ }
12758
+ }
12759
+ function computeReadiness(dir) {
12760
+ const state = readPlanningState(dir);
12761
+ const traces = listTraces(dir, 20);
12762
+ const checks3 = [
12763
+ checkPlanningBlockers(state),
12764
+ checkTestStatus(state, traces),
12765
+ checkPendingApprovals(dir),
12766
+ checkDecisionHealth(dir),
12767
+ checkLintTypeStatus(traces),
12768
+ checkSessionHealth(dir)
12769
+ ];
12770
+ const failCount = checks3.filter((c) => c.status === "fail").length;
12771
+ const warnCount = checks3.filter((c) => c.status === "warn").length;
12772
+ let status;
12773
+ if (failCount > 0)
12774
+ status = "critical";
12775
+ else if (warnCount > 0)
12776
+ status = "attention";
12777
+ else
12778
+ status = "ok";
12779
+ const score = Math.max(0, 100 - failCount * 20 - warnCount * 10);
12780
+ let summary;
12781
+ if (status === "ok") {
12782
+ summary = "All readiness checks passed";
12783
+ } else if (status === "critical") {
12784
+ summary = `${failCount} check(s) failed, ${warnCount} warning(s)`;
12785
+ } else {
12786
+ summary = `${warnCount} check(s) need attention`;
12787
+ }
12788
+ return { status, score, checks: checks3, summary };
12789
+ }
12673
12790
  function readDashboardData(dir) {
12674
12791
  const pd = planningDir(dir);
12675
12792
  const state = readPlanningState(dir);
@@ -12730,7 +12847,8 @@ function readDashboardData(dir) {
12730
12847
  avg_duration_ms: Math.round(e.total_duration_ms / e.runs)
12731
12848
  })),
12732
12849
  toolFailureCount: 0,
12733
- tdd: buildTDDDashboardState(state)
12850
+ tdd: buildTDDDashboardState(state),
12851
+ readiness: computeReadiness(dir)
12734
12852
  };
12735
12853
  }
12736
12854
  function buildTDDDashboardState(state) {
@@ -12785,10 +12903,6 @@ import fs from "fs";
12785
12903
  import path from "path";
12786
12904
 
12787
12905
  // node_modules/ejs/lib/esm/utils.js
12788
- var exports_utils = {};
12789
- __export(exports_utils, {
12790
- default: () => utils_default
12791
- });
12792
12906
  var utils = {};
12793
12907
  var regExpChars = /[|\\{}()[\]^$+*?.]/g;
12794
12908
  var hasOwnProperty = Object.prototype.hasOwnProperty;
@@ -12919,9 +13033,6 @@ utils.hasOwnOnlyObject = function(obj) {
12919
13033
  }
12920
13034
  return o;
12921
13035
  };
12922
- if (typeof exports_utils != "undefined") {
12923
- module_utils.exports = utils;
12924
- }
12925
13036
  var utils_default = utils;
12926
13037
 
12927
13038
  // node_modules/ejs/lib/esm/ejs.js
@@ -13176,6 +13287,7 @@ function Template(text, optsParam) {
13176
13287
  options.async = opts.async;
13177
13288
  options.destructuredLocals = opts.destructuredLocals;
13178
13289
  options.legacyInclude = typeof opts.legacyInclude != "undefined" ? !!opts.legacyInclude : true;
13290
+ options.unsafePrototypeLocals = !!opts.unsafePrototypeLocals;
13179
13291
  if (options.strict) {
13180
13292
  options._with = false;
13181
13293
  } else {
@@ -13317,7 +13429,13 @@ Template.prototype = {
13317
13429
  }
13318
13430
  return includeFile(path2, opts)(d);
13319
13431
  };
13320
- return fn.apply(opts.context, [data || utils_default.createNullProtoObjWherePossible(), escapeFn, include, rethrow]);
13432
+ let locals;
13433
+ if (opts.unsafePrototypeLocals) {
13434
+ locals = data || utils_default.createNullProtoObjWherePossible();
13435
+ } else {
13436
+ locals = utils_default.shallowCopy(utils_default.createNullProtoObjWherePossible(), data);
13437
+ }
13438
+ return fn.apply(opts.context, [locals, escapeFn, include, rethrow]);
13321
13439
  };
13322
13440
  if (opts.filename && typeof Object.defineProperty === "function") {
13323
13441
  let filename = opts.filename;
@@ -13486,9 +13604,6 @@ ejs.__express = ejs.renderFile;
13486
13604
  if (typeof window != "undefined") {
13487
13605
  window.ejs = ejs;
13488
13606
  }
13489
- if (typeof module_ejs != "undefined") {
13490
- module_ejs.exports = ejs;
13491
- }
13492
13607
  var ejs_default = ejs;
13493
13608
 
13494
13609
  // src/dashboard/server.ts
@@ -50,6 +50,17 @@ export interface TDDDashboardState {
50
50
  bugs_missing_regression: number;
51
51
  overrides_used: number;
52
52
  }
53
+ export interface ReadinessCheck {
54
+ name: string;
55
+ status: "pass" | "warn" | "fail";
56
+ message: string;
57
+ }
58
+ export interface Readiness {
59
+ status: "ok" | "attention" | "critical";
60
+ score: number;
61
+ checks: ReadinessCheck[];
62
+ summary: string;
63
+ }
53
64
  export interface AgentSpanSummary {
54
65
  span_id: string;
55
66
  agent: string;
@@ -138,5 +149,6 @@ export interface DashboardData {
138
149
  toolFailureCount: number;
139
150
  tdd?: TDDDashboardState;
140
151
  governance?: GovernanceDashboardState;
152
+ readiness?: Readiness;
141
153
  }
142
154
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/dashboard/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/dashboard/types.ts"],"names":[],"mappings":"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"}
@@ -1,8 +1,22 @@
1
1
  /**
2
2
  * Approval Hook
3
3
  * Intercepts write/edit operations on sensitive files and blocks them
4
- * unless a recent approval exists. Throws to block (per OpenCode hook contract).
5
- * To enable: set FLOWDECK_APPROVAL_HOOK_ENABLED=on. Default is OFF.
4
+ * unless a recent approval exists.
5
+ *
6
+ * The exported evaluate() function returns a PolicyDecision so the harness
7
+ * can compose it with other governance layers. The legacy approvalHook
8
+ * remains a thin adapter that throws on ask/deny for existing hook wiring.
9
+ */
10
+ import type { PolicyDecision, PolicyInput } from "../services/harness-types";
11
+ /**
12
+ * Evaluate whether a write/edit tool on a sensitive path needs approval.
13
+ *
14
+ * No longer gated by environment variables — the harness decides whether to
15
+ * invoke this layer via `governance.approvals` in flowdeck.json.
16
+ */
17
+ export declare function evaluate(input: PolicyInput): PolicyDecision;
18
+ /**
19
+ * Legacy hook adapter. Throws when approval is required.
6
20
  */
7
21
  export declare function approvalHook(context: {
8
22
  directory?: string;
@@ -1 +1 @@
1
- {"version":3,"file":"approval-hook.d.ts","sourceRoot":"","sources":["../../src/hooks/approval-hook.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAQH,wBAAsB,YAAY,CAChC,OAAO,EAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,EAC/B,SAAS,EAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,EAC3C,MAAM,EAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAAE,GACzC,OAAO,CAAC,IAAI,CAAC,CAuBf"}
1
+ {"version":3,"file":"approval-hook.d.ts","sourceRoot":"","sources":["../../src/hooks/approval-hook.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,KAAK,EAAE,cAAc,EAAE,WAAW,EAAiB,MAAM,2BAA2B,CAAA;AAyB3F;;;;;GAKG;AACH,wBAAgB,QAAQ,CAAC,KAAK,EAAE,WAAW,GAAG,cAAc,CA6B3D;AAED;;GAEG;AACH,wBAAsB,YAAY,CAChC,OAAO,EAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,EAC/B,SAAS,EAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,EAC3C,MAAM,EAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAAE,GACzC,OAAO,CAAC,IAAI,CAAC,CAuBf"}
@@ -19,7 +19,7 @@
19
19
  import type { SessionFileTracker } from "./file-tracker";
20
20
  export declare function createCompactionHook(ctx: {
21
21
  directory: string;
22
- }, tracker: SessionFileTracker): (input: {
22
+ }, tracker: SessionFileTracker, promptFragment?: string | ((sessionID: string) => string | undefined)): (input: {
23
23
  sessionID: string;
24
24
  }, output: {
25
25
  context: string[];
@@ -1 +1 @@
1
- {"version":3,"file":"compaction-hook.d.ts","sourceRoot":"","sources":["../../src/hooks/compaction-hook.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAIH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAA;AAmExD,wBAAgB,oBAAoB,CAClC,GAAG,EAAE;IAAE,SAAS,EAAE,MAAM,CAAA;CAAE,EAC1B,OAAO,EAAE,kBAAkB,IAGzB,OAAO;IAAE,SAAS,EAAE,MAAM,CAAA;CAAE,EAC5B,QAAQ;IAAE,OAAO,EAAE,MAAM,EAAE,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,mBAiEjD"}
1
+ {"version":3,"file":"compaction-hook.d.ts","sourceRoot":"","sources":["../../src/hooks/compaction-hook.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAIH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAA;AAmExD,wBAAgB,oBAAoB,CAClC,GAAG,EAAE;IAAE,SAAS,EAAE,MAAM,CAAA;CAAE,EAC1B,OAAO,EAAE,kBAAkB,EAC3B,cAAc,CAAC,EAAE,MAAM,GAAG,CAAC,CAAC,SAAS,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS,CAAC,IAGnE,OAAO;IAAE,SAAS,EAAE,MAAM,CAAA;CAAE,EAC5B,QAAQ;IAAE,OAAO,EAAE,MAAM,EAAE,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,mBA2EjD"}
@@ -5,7 +5,13 @@
5
5
  *
6
6
  * Inspired by oh-my-openagent's context-window-monitor.ts.
7
7
  */
8
- export declare function createContextWindowMonitorHook(): {
8
+ export interface ContextWindowMonitorOptions {
9
+ /** Optional source for the total token budget for a session. */
10
+ getTotalBudget?: (sessionID: string) => number;
11
+ /** Fallback limit when no budget source is provided or returns nothing. */
12
+ defaultLimit?: number;
13
+ }
14
+ export declare function createContextWindowMonitorHook(options?: ContextWindowMonitorOptions): {
9
15
  "tool.execute.after": (input: {
10
16
  sessionID: string;
11
17
  }, output: {
@@ -1 +1 @@
1
- {"version":3,"file":"context-window-monitor.d.ts","sourceRoot":"","sources":["../../src/hooks/context-window-monitor.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AA0BH,wBAAgB,8BAA8B;kCAKnC;QAAE,SAAS,EAAE,MAAM,CAAA;KAAE,UACpB;QAAE,MAAM,EAAE,MAAM,CAAA;KAAE;uBAwBI;QAAE,KAAK,EAAE;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,UAAU,CAAC,EAAE,OAAO,CAAA;SAAE,CAAA;KAAE;EAsBlF"}
1
+ {"version":3,"file":"context-window-monitor.d.ts","sourceRoot":"","sources":["../../src/hooks/context-window-monitor.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AA4BH,MAAM,WAAW,2BAA2B;IAC1C,gEAAgE;IAChE,cAAc,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,MAAM,CAAA;IAC9C,2EAA2E;IAC3E,YAAY,CAAC,EAAE,MAAM,CAAA;CACtB;AAED,wBAAgB,8BAA8B,CAAC,OAAO,CAAC,EAAE,2BAA2B;kCAKzE;QAAE,SAAS,EAAE,MAAM,CAAA;KAAE,UACpB;QAAE,MAAM,EAAE,MAAM,CAAA;KAAE;uBAyBI;QAAE,KAAK,EAAE;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,UAAU,CAAC,EAAE,OAAO,CAAA;SAAE,CAAA;KAAE;EAuBlF"}
@@ -9,5 +9,8 @@ export declare function decisionTraceHook(ctx: {
9
9
  tool: string;
10
10
  }, output: {
11
11
  args: any;
12
+ }, options?: {
13
+ policyReason?: string;
14
+ auditEntryId?: string;
12
15
  }): Promise<void>;
13
16
  //# sourceMappingURL=decision-trace-hook.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"decision-trace-hook.d.ts","sourceRoot":"","sources":["../../src/hooks/decision-trace-hook.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAMH,wBAAsB,iBAAiB,CACrC,GAAG,EAAE;IAAE,SAAS,EAAE,MAAM,CAAA;CAAE,EAC1B,KAAK,EAAE;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,EACvB,MAAM,EAAE;IAAE,IAAI,EAAE,GAAG,CAAA;CAAE,GACpB,OAAO,CAAC,IAAI,CAAC,CA8Bf"}
1
+ {"version":3,"file":"decision-trace-hook.d.ts","sourceRoot":"","sources":["../../src/hooks/decision-trace-hook.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAMH,wBAAsB,iBAAiB,CACrC,GAAG,EAAE;IAAE,SAAS,EAAE,MAAM,CAAA;CAAE,EAC1B,KAAK,EAAE;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,EACvB,MAAM,EAAE;IAAE,IAAI,EAAE,GAAG,CAAA;CAAE,EACrB,OAAO,CAAC,EAAE;IAAE,YAAY,CAAC,EAAE,MAAM,CAAC;IAAC,YAAY,CAAC,EAAE,MAAM,CAAA;CAAE,GACzD,OAAO,CAAC,IAAI,CAAC,CAgCf"}
@@ -1,5 +1,21 @@
1
+ import type { SpanStatus } from "@/services/harness-types";
1
2
  type AppLog = (msg: string) => void;
2
3
  export type OnToolAfterCallback = (toolName: string, args: Record<string, unknown>, output: unknown, sessionId: string, status: string) => void;
4
+ export interface SpanLifecycleCallbacks {
5
+ /** Called when a delegated session starts (span open). */
6
+ onSpanOpen?: (props: {
7
+ spanId: string;
8
+ agent: string;
9
+ sessionId: string;
10
+ parentSessionId?: string;
11
+ }) => void;
12
+ /** Called when a delegated session ends (span close). */
13
+ onSpanClose?: (props: {
14
+ spanId: string;
15
+ status: Exclude<SpanStatus, "running">;
16
+ sessionId: string;
17
+ }) => void;
18
+ }
3
19
  export declare function setStaleThresholdMs(ms: number): void;
4
20
  export declare function cleanupStaleToolStartTimes(): void;
5
21
  /**
@@ -7,7 +23,7 @@ export declare function cleanupStaleToolStartTimes(): void;
7
23
  * All tool and session events are persisted to .opencode/flowdeck-events.jsonl
8
24
  * AND displayed in the TUI's bounded log panel through the provided appLog fn.
9
25
  */
10
- export declare function createEventLogHooks(appLog: AppLog, onToolAfter?: OnToolAfterCallback): {
26
+ export declare function createEventLogHooks(appLog: AppLog, onToolAfter?: OnToolAfterCallback, spanLifecycle?: SpanLifecycleCallbacks): {
11
27
  before(ctx: {
12
28
  directory: string;
13
29
  }, toolInput: any, toolOutput: any): Promise<void>;
@@ -16,7 +32,7 @@ export declare function createEventLogHooks(appLog: AppLog, onToolAfter?: OnTool
16
32
  }, toolInput: any, toolOutput: any): Promise<boolean>;
17
33
  session(ctx: {
18
34
  directory: string;
19
- }, event: any): Promise<void>;
35
+ }, event: any): Promise<boolean>;
20
36
  };
21
37
  export declare function eventLogBeforeHook(ctx: {
22
38
  directory: string;
@@ -26,6 +42,6 @@ export declare function eventLogAfterHook(ctx: {
26
42
  }, toolInput: any, toolOutput: any): Promise<boolean>;
27
43
  export declare function eventLogSessionHook(ctx: {
28
44
  directory: string;
29
- }, event: any): Promise<void>;
45
+ }, event: any): Promise<boolean>;
30
46
  export {};
31
47
  //# sourceMappingURL=event-log-hook.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"event-log-hook.d.ts","sourceRoot":"","sources":["../../src/hooks/event-log-hook.ts"],"names":[],"mappings":"AAQA,KAAK,MAAM,GAAG,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAA;AAEnC,MAAM,MAAM,mBAAmB,GAAG,CAChC,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,MAAM,EAAE,OAAO,EACf,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,KACX,IAAI,CAAA;AAST,wBAAgB,mBAAmB,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,CAEpD;AAED,wBAAgB,0BAA0B,IAAI,IAAI,CAOjD;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,MAAM,EACd,WAAW,CAAC,EAAE,mBAAmB;gBAGb;QAAE,SAAS,EAAE,MAAM,CAAA;KAAE,aAAa,GAAG,cAAc,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC;eA2BvE;QAAE,SAAS,EAAE,MAAM,CAAA;KAAE,aAAa,GAAG,cAAc,GAAG,GAAG,OAAO,CAAC,OAAO,CAAC;iBA0CvE;QAAE,SAAS,EAAE,MAAM,CAAA;KAAE,SAAS,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC;EA+CvE;AAGD,wBAAsB,kBAAkB,CACtC,GAAG,EAAE;IAAE,SAAS,EAAE,MAAM,CAAA;CAAE,EAC1B,SAAS,EAAE,GAAG,EACd,UAAU,EAAE,GAAG,GACd,OAAO,CAAC,IAAI,CAAC,CAEf;AAED,wBAAsB,iBAAiB,CACrC,GAAG,EAAE;IAAE,SAAS,EAAE,MAAM,CAAA;CAAE,EAC1B,SAAS,EAAE,GAAG,EACd,UAAU,EAAE,GAAG,GACd,OAAO,CAAC,OAAO,CAAC,CAElB;AAED,wBAAsB,mBAAmB,CACvC,GAAG,EAAE;IAAE,SAAS,EAAE,MAAM,CAAA;CAAE,EAC1B,KAAK,EAAE,GAAG,GACT,OAAO,CAAC,IAAI,CAAC,CAEf"}
1
+ {"version":3,"file":"event-log-hook.d.ts","sourceRoot":"","sources":["../../src/hooks/event-log-hook.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAA;AAE1D,KAAK,MAAM,GAAG,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAA;AAEnC,MAAM,MAAM,mBAAmB,GAAG,CAChC,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,MAAM,EAAE,OAAO,EACf,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,KACX,IAAI,CAAA;AAET,MAAM,WAAW,sBAAsB;IACrC,0DAA0D;IAC1D,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE;QACnB,MAAM,EAAE,MAAM,CAAA;QACd,KAAK,EAAE,MAAM,CAAA;QACb,SAAS,EAAE,MAAM,CAAA;QACjB,eAAe,CAAC,EAAE,MAAM,CAAA;KACzB,KAAK,IAAI,CAAA;IACV,yDAAyD;IACzD,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE;QACpB,MAAM,EAAE,MAAM,CAAA;QACd,MAAM,EAAE,OAAO,CAAC,UAAU,EAAE,SAAS,CAAC,CAAA;QACtC,SAAS,EAAE,MAAM,CAAA;KAClB,KAAK,IAAI,CAAA;CACX;AASD,wBAAgB,mBAAmB,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,CAEpD;AAED,wBAAgB,0BAA0B,IAAI,IAAI,CAOjD;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,MAAM,EACd,WAAW,CAAC,EAAE,mBAAmB,EACjC,aAAa,CAAC,EAAE,sBAAsB;gBASlB;QAAE,SAAS,EAAE,MAAM,CAAA;KAAE,aAAa,GAAG,cAAc,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC;eA2BvE;QAAE,SAAS,EAAE,MAAM,CAAA;KAAE,aAAa,GAAG,cAAc,GAAG,GAAG,OAAO,CAAC,OAAO,CAAC;iBA0CvE;QAAE,SAAS,EAAE,MAAM,CAAA;KAAE,SAAS,GAAG,GAAG,OAAO,CAAC,OAAO,CAAC;EA4G1E;AAGD,wBAAsB,kBAAkB,CACtC,GAAG,EAAE;IAAE,SAAS,EAAE,MAAM,CAAA;CAAE,EAC1B,SAAS,EAAE,GAAG,EACd,UAAU,EAAE,GAAG,GACd,OAAO,CAAC,IAAI,CAAC,CAEf;AAED,wBAAsB,iBAAiB,CACrC,GAAG,EAAE;IAAE,SAAS,EAAE,MAAM,CAAA;CAAE,EAC1B,SAAS,EAAE,GAAG,EACd,UAAU,EAAE,GAAG,GACd,OAAO,CAAC,OAAO,CAAC,CAElB;AAED,wBAAsB,mBAAmB,CACvC,GAAG,EAAE;IAAE,SAAS,EAAE,MAAM,CAAA;CAAE,EAC1B,KAAK,EAAE,GAAG,GACT,OAAO,CAAC,OAAO,CAAC,CAElB"}
@@ -1,3 +1,4 @@
1
+ import type { PolicyDecision, PolicyInput } from "../services/harness-types";
1
2
  /**
2
3
  * Safe Execution Mode — three tiers of AI edit safety.
3
4
  * auto: AI can apply edits without confirmation (default, low-risk changes)
@@ -12,14 +13,24 @@ export type ExecutionMode = "auto" | "guarded" | "review-only";
12
13
  export declare function resolveExecutionMode(configPath: string, trustScore: number | null, // 0–100, null = unknown
13
14
  volatility?: string): ExecutionMode;
14
15
  export type Severity = "warn" | "block" | null;
15
- export declare function guardRailsHook(ctx: {
16
- directory: string;
17
- }, input: {
18
- tool: string;
19
- }, _output: any): Promise<void>;
16
+ /**
17
+ * Evaluate a tool call against workspace, plan-confirmation, design-gate, and
18
+ * build/deploy guard rules.
19
+ */
20
+ export declare function evaluate(input: PolicyInput): PolicyDecision;
20
21
  /**
21
22
  * Determine effective severity based on config.json override or STATE.md plan_confirmed.
22
23
  */
23
24
  export declare function effectiveSeverity(configPath: string, statePath: string): Severity;
24
25
  export declare function getPlanConfirmed(statePath: string): boolean;
26
+ /**
27
+ * Legacy hook adapter. Throws when evaluate returns deny.
28
+ */
29
+ export declare function guardRailsHook(ctx: {
30
+ directory: string;
31
+ }, input: {
32
+ tool: string;
33
+ }, output: {
34
+ args?: Record<string, unknown>;
35
+ }): Promise<void>;
25
36
  //# sourceMappingURL=guard-rails.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"guard-rails.d.ts","sourceRoot":"","sources":["../../src/hooks/guard-rails.ts"],"names":[],"mappings":"AAWA;;;;;GAKG;AACH,MAAM,MAAM,aAAa,GAAG,MAAM,GAAG,SAAS,GAAG,aAAa,CAAA;AAE9D;;;GAGG;AACH,wBAAgB,oBAAoB,CAClC,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,MAAM,GAAG,IAAI,EAAG,wBAAwB;AACpD,UAAU,CAAC,EAAE,MAAM,GAClB,aAAa,CAkBf;AAgBD,MAAM,MAAM,QAAQ,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,CAAA;AAa9C,wBAAsB,cAAc,CAClC,GAAG,EAAE;IAAE,SAAS,EAAE,MAAM,CAAA;CAAE,EAC1B,KAAK,EAAE;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,EACvB,OAAO,EAAE,GAAG,GACX,OAAO,CAAC,IAAI,CAAC,CAqEf;AA0BD;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,QAAQ,CAWjF;AAMD,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAS3D"}
1
+ {"version":3,"file":"guard-rails.d.ts","sourceRoot":"","sources":["../../src/hooks/guard-rails.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,cAAc,EAAE,WAAW,EAAiB,MAAM,2BAA2B,CAAA;AAM3F;;;;;GAKG;AACH,MAAM,MAAM,aAAa,GAAG,MAAM,GAAG,SAAS,GAAG,aAAa,CAAA;AAE9D;;;GAGG;AACH,wBAAgB,oBAAoB,CAClC,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,MAAM,GAAG,IAAI,EAAG,wBAAwB;AACpD,UAAU,CAAC,EAAE,MAAM,GAClB,aAAa,CAkBf;AAgBD,MAAM,MAAM,QAAQ,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,CAAA;AA6B9C;;;GAGG;AACH,wBAAgB,QAAQ,CAAC,KAAK,EAAE,WAAW,GAAG,cAAc,CA0E3D;AA0BD;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,QAAQ,CAWjF;AAED,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAS3D;AAgBD;;GAEG;AACH,wBAAsB,cAAc,CAClC,GAAG,EAAE;IAAE,SAAS,EAAE,MAAM,CAAA;CAAE,EAC1B,KAAK,EAAE;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,EACvB,MAAM,EAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAAE,GACzC,OAAO,CAAC,IAAI,CAAC,CAaf"}
@@ -2,15 +2,18 @@
2
2
  * Orchestrator Guard Hook
3
3
  *
4
4
  * Enforces the "orchestrator as coordinator, not executor" rule for the primary session.
5
- * The orchestrator may inspect files and planning state directly, but it CANNOT
6
- * use file-write, edit, or shell tools. Those MUST be routed to specialist agents
7
- * or the default-executor.
5
+ * The guard consults the orchestrator capability contract in agent-contract-registry
6
+ * and the harness policy. Any tool not in the orchestrator's allowedTools list is
7
+ * blocked when run from the primary session.
8
8
  *
9
9
  * To disable: set FLOWDECK_ORCHESTRATOR_GUARD=off in the environment.
10
10
  * Default is ON.
11
11
  */
12
+ import type { HarnessPolicy } from "../services/harness-policy";
12
13
  export declare class OrchestratorGuard {
13
14
  private primarySessionId;
15
+ private policy?;
16
+ setPolicy(policy: HarnessPolicy): void;
14
17
  onEvent(event: {
15
18
  type?: string;
16
19
  properties?: unknown;
@@ -19,9 +22,9 @@ export declare class OrchestratorGuard {
19
22
  sessionId?: string;
20
23
  }): void;
21
24
  check(sessionId: string, toolName: string): void;
22
- /** Exposed for testing. */
25
+ /** Returns true if the tool is not in the orchestrator contract allowlist. */
23
26
  _isBlockedForTest(name: string): boolean;
24
- /** Exposed for testing. */
27
+ /** Returns true if the tool is in the orchestrator contract allowlist. */
25
28
  _isAllowedForTest(name: string): boolean;
26
29
  /** Exposed for testing. */
27
30
  _setPrimarySessionIdForTest(id: string | null): void;
@@ -1 +1 @@
1
- {"version":3,"file":"orchestrator-guard-hook.d.ts","sourceRoot":"","sources":["../../src/hooks/orchestrator-guard-hook.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAsHH,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,gBAAgB,CAAsB;IAE9C,OAAO,CAAC,KAAK,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,UAAU,CAAC,EAAE,OAAO,CAAC;QAAC,KAAK,CAAC,EAAE,OAAO,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI;IAkBtH,KAAK,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI;IAUhD,2BAA2B;IAC3B,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAIxC,2BAA2B;IAC3B,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAIxC,2BAA2B;IAC3B,2BAA2B,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI;CAGrD"}
1
+ {"version":3,"file":"orchestrator-guard-hook.d.ts","sourceRoot":"","sources":["../../src/hooks/orchestrator-guard-hook.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAGH,OAAO,KAAK,EAAE,aAAa,EAAkB,MAAM,4BAA4B,CAAA;AA6B/E,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,gBAAgB,CAAsB;IAC9C,OAAO,CAAC,MAAM,CAAC,CAAe;IAE9B,SAAS,CAAC,MAAM,EAAE,aAAa,GAAG,IAAI;IAItC,OAAO,CAAC,KAAK,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,UAAU,CAAC,EAAE,OAAO,CAAC;QAAC,KAAK,CAAC,EAAE,OAAO,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI;IAkBtH,KAAK,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI;IAyBhD,8EAA8E;IAC9E,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAOxC,0EAA0E;IAC1E,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAIxC,2BAA2B;IAC3B,2BAA2B,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI;CAGrD"}
@@ -1 +1 @@
1
- {"version":3,"file":"shell-env-hook.d.ts","sourceRoot":"","sources":["../../src/hooks/shell-env-hook.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAyFH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE,IAGhE,QAAQ,OAAO,EAAE,QAAQ;IAAE,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAAE,mBA6BvE"}
1
+ {"version":3,"file":"shell-env-hook.d.ts","sourceRoot":"","sources":["../../src/hooks/shell-env-hook.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAyEH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE,IAGhE,QAAQ,OAAO,EAAE,QAAQ;IAAE,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAAE,mBAiBvE"}