@dv.nghiem/flowdeck 0.3.4 → 0.3.6
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/README.md +154 -3
- package/dist/agents/coder.d.ts +3 -1
- package/dist/agents/coder.d.ts.map +1 -1
- package/dist/agents/design.d.ts +3 -0
- package/dist/agents/design.d.ts.map +1 -0
- package/dist/agents/index.d.ts +4 -3
- package/dist/agents/index.d.ts.map +1 -1
- package/dist/agents/orchestrator.d.ts.map +1 -1
- package/dist/agents/reviewer.d.ts.map +1 -1
- package/dist/agents/specialist.d.ts +0 -1
- package/dist/agents/specialist.d.ts.map +1 -1
- package/dist/config/index.d.ts +1 -1
- package/dist/config/index.d.ts.map +1 -1
- package/dist/config/loader.d.ts +8 -0
- package/dist/config/loader.d.ts.map +1 -1
- package/dist/config/schema.d.ts +55 -2
- package/dist/config/schema.d.ts.map +1 -1
- package/dist/dashboard/server.mjs +24 -1
- package/dist/dashboard/types.d.ts +72 -0
- package/dist/dashboard/types.d.ts.map +1 -1
- package/dist/hooks/guard-rails.d.ts.map +1 -1
- package/dist/hooks/memory-hook.d.ts +7 -0
- package/dist/hooks/memory-hook.d.ts.map +1 -1
- package/dist/hooks/orchestrator-guard-hook.d.ts.map +1 -1
- package/dist/hooks/tool-guard.d.ts.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +749 -503
- package/dist/services/agent-contract-registry.d.ts +32 -0
- package/dist/services/agent-contract-registry.d.ts.map +1 -0
- package/dist/services/agent-performance.d.ts +1 -1
- package/dist/services/agent-performance.d.ts.map +1 -1
- package/dist/services/agent-trace-graph.d.ts +94 -0
- package/dist/services/agent-trace-graph.d.ts.map +1 -0
- package/dist/services/agent-validator.d.ts +56 -0
- package/dist/services/agent-validator.d.ts.map +1 -0
- package/dist/services/deadlock-detector.d.ts +34 -0
- package/dist/services/deadlock-detector.d.ts.map +1 -0
- package/dist/services/delegation-budget.d.ts +54 -0
- package/dist/services/delegation-budget.d.ts.map +1 -0
- package/dist/services/governance.test.d.ts +11 -0
- package/dist/services/governance.test.d.ts.map +1 -0
- package/dist/services/index.d.ts +6 -1
- package/dist/services/index.d.ts.map +1 -1
- package/dist/services/memory-store.d.ts +34 -1
- package/dist/services/memory-store.d.ts.map +1 -1
- package/dist/services/memory-store.test.d.ts +2 -0
- package/dist/services/memory-store.test.d.ts.map +1 -0
- package/dist/services/telemetry.d.ts +1 -1
- package/dist/services/telemetry.d.ts.map +1 -1
- package/dist/services/workflow-scorecard.d.ts +76 -0
- package/dist/services/workflow-scorecard.d.ts.map +1 -0
- package/dist/tools/delegate.d.ts.map +1 -1
- package/dist/tools/dispatch-routing.d.ts +4 -1
- package/dist/tools/dispatch-routing.d.ts.map +1 -1
- package/dist/tools/dispatch-routing.test.d.ts +2 -0
- package/dist/tools/dispatch-routing.test.d.ts.map +1 -0
- package/dist/tools/memory-search.d.ts.map +1 -1
- package/dist/tools/memory-status.d.ts.map +1 -1
- package/dist/tools/planning-state-lib.d.ts +8 -0
- package/dist/tools/planning-state-lib.d.ts.map +1 -1
- package/dist/tools/planning-state.d.ts.map +1 -1
- package/dist/tools/run-pipeline.d.ts.map +1 -1
- package/docs/agents.md +104 -74
- package/docs/best-practices.md +1 -1
- package/docs/commands/fd-ask.md +2 -2
- package/docs/commands/fd-fix-bug.md +2 -2
- package/docs/commands/fd-new-feature.md +2 -2
- package/docs/commands/fd-quick.md +3 -1
- package/docs/commands.md +37 -7
- package/docs/configuration.md +76 -46
- package/docs/design-first-workflow.md +94 -0
- package/docs/feature-integration-architecture.md +3 -31
- package/docs/index.md +5 -2
- package/docs/intelligence.md +92 -1
- package/docs/multi-repo.md +1 -1
- package/docs/rules.md +1 -1
- package/docs/skills.md +24 -15
- package/docs/workflows.md +11 -6
- package/package.json +1 -1
- package/src/commands/fd-ask.md +1 -0
- package/src/commands/fd-design.md +64 -0
- package/src/commands/fd-discuss.md +2 -0
- package/src/commands/fd-execute.md +7 -3
- package/src/commands/fd-fix-bug.md +2 -2
- package/src/commands/fd-multi-repo.md +3 -3
- package/src/commands/fd-plan.md +2 -0
- package/src/commands/fd-quick.md +4 -1
- package/src/commands/fd-verify.md +6 -0
- package/src/rules/common/agent-orchestration.md +6 -6
- package/src/skills/app-shell-design/SKILL.md +31 -0
- package/src/skills/dashboard-design/SKILL.md +32 -0
- package/src/skills/decision-trace/SKILL.md +1 -1
- package/src/skills/design-audit/SKILL.md +37 -0
- package/src/skills/design-system-definition/SKILL.md +33 -0
- package/src/skills/frontend-handoff/SKILL.md +31 -0
- package/src/skills/landing-page-design/SKILL.md +32 -0
- package/src/skills/multi-repo/SKILL.md +3 -3
- package/src/skills/plan-task/SKILL.md +2 -2
- package/src/skills/responsive-review/SKILL.md +31 -0
- package/src/skills/ui-ux-planning/SKILL.md +32 -0
- package/src/skills/wireframe-planning/SKILL.md +30 -0
- package/dist/services/model-router.d.ts +0 -35
- package/dist/services/model-router.d.ts.map +0 -1
package/README.md
CHANGED
|
@@ -2,14 +2,14 @@
|
|
|
2
2
|
|
|
3
3
|
> AI-powered multi-agent workflow orchestration with built-in safety intelligence for OpenCode
|
|
4
4
|
|
|
5
|
-
FlowDeck adds a structured, multi-agent development workflow to OpenCode. It coordinates 25 specialist agents through a four-phase cycle — discuss, plan, execute, review — with persistent state that survives session restarts,
|
|
5
|
+
FlowDeck adds a structured, multi-agent development workflow to OpenCode. It coordinates 25 specialist agents through a four-phase cycle — discuss, plan, execute, review — with persistent state that survives session restarts, a full AI safety layer that scores every change, predicts regressions, and enforces architectural constraints before anything is applied, and a governance layer that validates agent behaviour, traces execution, and measures workflow quality.
|
|
6
6
|
|
|
7
7
|
---
|
|
8
8
|
|
|
9
9
|
## Features
|
|
10
10
|
|
|
11
11
|
- 🤖 **25 agents** — architect, planner, coder, reviewer, tester, debugger, risk-analyst, policy-enforcer, and more
|
|
12
|
-
- 🛠️ **
|
|
12
|
+
- 🛠️ **59 skills** — reusable workflow patterns (TDD, security scan, deploy check, code review, and more)
|
|
13
13
|
- ⚡ **20 commands** — workflow commands for all project operations
|
|
14
14
|
- 📋 **15 workflows** — pre-built orchestration flows including Spec-Driven Development (SDD)
|
|
15
15
|
- 🔄 **Persistent state** — resume exactly where you left off across sessions via `.planning/STATE.md`
|
|
@@ -18,10 +18,12 @@ FlowDeck adds a structured, multi-agent development workflow to OpenCode. It coo
|
|
|
18
18
|
- 🗂️ **Multi-repo support** — coordinate changes across multiple repositories in one session
|
|
19
19
|
- 🔔 **System notifications** — desktop alerts when long-running tasks complete
|
|
20
20
|
- 🛡️ **AI Safety layer** — patch trust scoring, edit gates, phase gating, arch constraint enforcement, failure replay, and regression prediction built into every workflow
|
|
21
|
+
- 🔍 **Governance layer** — capability contracts, agent validator, inter-agent trace graph, delegation budget, deadlock/loop detector, and workflow scorecard
|
|
21
22
|
- 🪝 **Deep System Hooks** — context window monitoring, session idle summaries, shell environment injection, and structured compaction to prevent context loss
|
|
22
23
|
- 🌐 **Built-in MCPs** — Context7 (docs), Exa (web search), and Grep.app (code search) included and enabled by default
|
|
23
24
|
- 💎 **Ensemble Reasoning** — `council` tool for synthesized consensus from multiple specialized agents
|
|
24
25
|
- 🧠 **Persistent Memory** — SQLite-based memory stores tool executions, assistant messages, and session summaries. Agents can search past observations with `memory-search` tool.
|
|
26
|
+
- ⚙️ **Model-agnostic** — no model is hardcoded. Every agent uses your currently selected OpenCode model. Override per-agent in `flowdeck.json`.
|
|
25
27
|
|
|
26
28
|
---
|
|
27
29
|
|
|
@@ -57,7 +59,156 @@ FlowDeck structures every feature through a six-step cycle:
|
|
|
57
59
|
| **Define Feature** | `/fd-new-feature "…"` | Initialize feature context, creates `FEATURE.md` in current phase |
|
|
58
60
|
| **Discuss** | `/fd-discuss` | `@discusser` runs structured Q&A, saves decisions to `DISCUSS.md` |
|
|
59
61
|
| **Plan** | `/fd-plan` | `@planner` builds a wave-structured `PLAN.md`; you type `CONFIRM` to proceed |
|
|
60
|
-
| **Execute** | `/fd-execute` | `@orchestrator` delegates to `@architect`, `@coder`, `@tester`, `@reviewer` via TDD |
|
|
62
|
+
| **Execute** | `/fd-execute` | `@orchestrator` delegates to `@architect`, `@backend-coder`, `@tester`, `@reviewer` via TDD |
|
|
63
|
+
| **Verify** | `/fd-verify` | Full test suite, code review, security scan, and deploy check |
|
|
64
|
+
|
|
65
|
+
State is written to `.planning/STATE.md` after each phase. Use `/fd-checkpoint` to save mid-session and `/fd-resume` to reload context in a new session.
|
|
66
|
+
|
|
67
|
+
---
|
|
68
|
+
|
|
69
|
+
## Command Reference
|
|
70
|
+
|
|
71
|
+
### Workflow commands
|
|
72
|
+
|
|
73
|
+
| Command | Purpose |
|
|
74
|
+
|---------|---------|
|
|
75
|
+
| `/fd-new-project` | Bootstrap a new project with PROJECT.md, ROADMAP.md, STATE.md |
|
|
76
|
+
| `/fd-map-codebase` | Analyse and index the codebase into structured `.codebase/` files |
|
|
77
|
+
| `/fd-new-feature` | Define a new feature and initialize feature context |
|
|
78
|
+
| `/fd-discuss` | Pre-planning structured Q&A to capture decisions |
|
|
79
|
+
| `/fd-plan` | Generate a wave-structured execution plan from decisions |
|
|
80
|
+
| `/fd-execute` | Implement feature with TDD discipline and parallel agents |
|
|
81
|
+
| `/fd-verify` | Full verification pipeline: tests, code review, security scan, deploy check |
|
|
82
|
+
| `/fd-fix-bug` | Diagnose, fix, and verify a bug with regression test |
|
|
83
|
+
| `/fd-write-docs` | Explore APIs and generate accurate documentation |
|
|
84
|
+
| `/fd-deploy-check` | Pre-deploy safety check with test, security, and build verification |
|
|
85
|
+
| `/fd-status` | View project progress, roadmap, and workspace overview |
|
|
86
|
+
| `/fd-checkpoint` | Save a session checkpoint to STATE.md |
|
|
87
|
+
| `/fd-resume` | Reload STATE.md and PLAN.md to continue interrupted session |
|
|
88
|
+
| `/fd-reflect` | Post-session reflection or capture patterns as reusable skills |
|
|
89
|
+
| `/fd-multi-repo` | Multi-repo orchestration — list, add, remove, or status |
|
|
90
|
+
| `/fd-translate-intent` | Convert vague requests into ranked implementation options |
|
|
91
|
+
| `/fd-suggest` | Analyze the codebase and suggest high-value feature opportunities |
|
|
92
|
+
| `/fd-ask` | Smart agent dispatch — routes to specialist by keyword |
|
|
93
|
+
| `/fd-quick` | Focused task with automatic agent selection |
|
|
94
|
+
| `/fd-doctor` | Check FlowDeck installation and environment health |
|
|
95
|
+
|
|
96
|
+
### Analysis commands
|
|
97
|
+
|
|
98
|
+
These umbrella commands consolidate multiple analysis modules into focused entry points:
|
|
99
|
+
|
|
100
|
+
| Command | Purpose |
|
|
101
|
+
|---------|---------|
|
|
102
|
+
| `/fd-translate-intent` | Convert vague requests into ranked implementation options with tradeoffs |
|
|
103
|
+
| `/fd-suggest` | Combined opportunity and risk analysis (impact, volatility, failures, and skill gaps) |
|
|
104
|
+
| `/fd-deploy-check` | Pre-change release safety checks and review routing |
|
|
105
|
+
| `/fd-verify` | Standalone verification for tests, review, and security checks |
|
|
106
|
+
|
|
107
|
+
See [docs/workflows.md](docs/workflows.md) for details on how analysis commands work.
|
|
108
|
+
|
|
109
|
+
---
|
|
110
|
+
|
|
111
|
+
## Governance Layer
|
|
112
|
+
|
|
113
|
+
FlowDeck's governance layer makes multi-agent execution trustworthy and debuggable. It runs as internal runtime services — no extra commands needed.
|
|
114
|
+
|
|
115
|
+
| Service | What it does |
|
|
116
|
+
|---------|-------------|
|
|
117
|
+
| **Agent Contract Registry** | Defines allowed tools, forbidden actions, required inputs, and success criteria for every agent |
|
|
118
|
+
| **Agent Validator** | Checks each agent invocation against its contract before and after execution; mode: `off` / `advisory` / `strict` |
|
|
119
|
+
| **Inter-Agent Trace Graph** | Records every agent-to-agent delegation as a causal span graph; stored in `.codebase/AGENT_SPANS.jsonl` |
|
|
120
|
+
| **Delegation Budget** | Per-run limits on tool calls, sub-agent delegations, retries, and delegation depth; stored in `.codebase/BUDGETS.json` |
|
|
121
|
+
| **Deadlock / Loop Detector** | Detects agent bounce loops, circular delegation, step retry loops, and stage stalls; stored in `.codebase/DEADLOCK_SIGNALS.jsonl` |
|
|
122
|
+
| **Workflow Scorecard** | 10-dimension quality score for every run (TDD, design-first, approvals, budget efficiency, etc.); stored in `.codebase/SCORECARDS.jsonl` |
|
|
123
|
+
|
|
124
|
+
Configure in `flowdeck.json`:
|
|
125
|
+
|
|
126
|
+
```json
|
|
127
|
+
{
|
|
128
|
+
"governance": {
|
|
129
|
+
"validator": { "mode": "advisory" },
|
|
130
|
+
"delegationBudget": { "maxToolCalls": 200, "maxDepth": 8, "maxSameStepRetries": 3 },
|
|
131
|
+
"deadlockDetection": { "enabled": true, "bounceThreshold": 3, "autoStop": false },
|
|
132
|
+
"scorecard": { "enabled": true }
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
---
|
|
138
|
+
|
|
139
|
+
## Model Selection
|
|
140
|
+
|
|
141
|
+
**FlowDeck does not hardcode any model.** Every agent uses the model currently selected in OpenCode.
|
|
142
|
+
|
|
143
|
+
To assign a specific model to a specific agent, add it to `flowdeck.json`:
|
|
144
|
+
|
|
145
|
+
```json
|
|
146
|
+
{
|
|
147
|
+
"agents": {
|
|
148
|
+
"planner": { "model": "anthropic/claude-opus-4" },
|
|
149
|
+
"tester": { "model": "openai/gpt-4o-mini" }
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
Agents not listed in `agents` inherit the active OpenCode model. See [Configuration](docs/configuration.md) for the full schema.
|
|
155
|
+
|
|
156
|
+
---
|
|
157
|
+
|
|
158
|
+
## Documentation
|
|
159
|
+
|
|
160
|
+
| File | Description |
|
|
161
|
+
|------|-------------|
|
|
162
|
+
| [docs/index.md](docs/index.md) | Full documentation table of contents |
|
|
163
|
+
| [docs/installation.md](docs/installation.md) | Prerequisites, install methods, verification, and uninstall |
|
|
164
|
+
| [docs/quick-start.md](docs/quick-start.md) | First 15 minutes — step-by-step walkthrough |
|
|
165
|
+
| [docs/configuration.md](docs/configuration.md) | `opencode.json`, project config, environment variables, plugin tools |
|
|
166
|
+
| [docs/USER_GUIDE.md](docs/USER_GUIDE.md) | Full agent and skill usage reference with examples |
|
|
167
|
+
| [docs/workflows.md](docs/workflows.md) | Command architecture and workflow patterns |
|
|
168
|
+
| [docs/intelligence.md](docs/intelligence.md) | AI safety features: patch trust, volatility map, failure replay, regression prediction |
|
|
169
|
+
|
|
170
|
+
---
|
|
171
|
+
|
|
172
|
+
## License
|
|
173
|
+
|
|
174
|
+
MIT
|
|
175
|
+
|
|
176
|
+
|
|
177
|
+
---
|
|
178
|
+
|
|
179
|
+
## Quick Install
|
|
180
|
+
|
|
181
|
+
### Method 1: curl (recommended)
|
|
182
|
+
|
|
183
|
+
```bash
|
|
184
|
+
curl -fsSL https://raw.githubusercontent.com/DVNghiem/flowdeck/main/install.sh | bash
|
|
185
|
+
```
|
|
186
|
+
|
|
187
|
+
### Method 2: npx (no git required)
|
|
188
|
+
|
|
189
|
+
```bash
|
|
190
|
+
npx @dv.nghiem/flowdeck install
|
|
191
|
+
```
|
|
192
|
+
|
|
193
|
+
See [Installation](docs/installation.md) for prerequisites, verification steps, and environment variables.
|
|
194
|
+
|
|
195
|
+
---
|
|
196
|
+
|
|
197
|
+
## Core Workflow
|
|
198
|
+
|
|
199
|
+
FlowDeck structures every feature through a six-step cycle:
|
|
200
|
+
|
|
201
|
+
```
|
|
202
|
+
/fd-new-project → /fd-new-feature → /fd-discuss → /fd-plan → /fd-execute → /fd-verify
|
|
203
|
+
```
|
|
204
|
+
|
|
205
|
+
| Step | Command | What happens |
|
|
206
|
+
|------|---------|--------------|
|
|
207
|
+
| **Setup** | `/fd-new-project MyApp` | Creates `.planning/` directory with `PROJECT.md`, `STATE.md`, and `ROADMAP.md` |
|
|
208
|
+
| **Define Feature** | `/fd-new-feature "…"` | Initialize feature context, creates `FEATURE.md` in current phase |
|
|
209
|
+
| **Discuss** | `/fd-discuss` | `@discusser` runs structured Q&A, saves decisions to `DISCUSS.md` |
|
|
210
|
+
| **Plan** | `/fd-plan` | `@planner` builds a wave-structured `PLAN.md`; you type `CONFIRM` to proceed |
|
|
211
|
+
| **Execute** | `/fd-execute` | `@orchestrator` delegates to `@architect`, `@backend-coder`, `@tester`, `@reviewer` via TDD |
|
|
61
212
|
| **Verify** | `/fd-verify` | Full test suite, code review, security scan, and deploy check |
|
|
62
213
|
|
|
63
214
|
State is written to `.planning/STATE.md` after each phase. Use `/fd-checkpoint` to save mid-session and `/fd-resume` to reload context in a new session.
|
package/dist/agents/coder.d.ts
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
1
|
import type { AgentFactory } from './types';
|
|
2
|
-
export declare const
|
|
2
|
+
export declare const createBackendCoderAgent: AgentFactory;
|
|
3
|
+
export declare const createFrontendCoderAgent: AgentFactory;
|
|
4
|
+
export declare const createDevopsAgent: AgentFactory;
|
|
3
5
|
//# sourceMappingURL=coder.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"coder.d.ts","sourceRoot":"","sources":["../../src/agents/coder.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAmB,YAAY,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"coder.d.ts","sourceRoot":"","sources":["../../src/agents/coder.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAmB,YAAY,EAAE,MAAM,SAAS,CAAC;AA+I7D,eAAO,MAAM,uBAAuB,EAAE,YAqBrC,CAAC;AAEF,eAAO,MAAM,wBAAwB,EAAE,YAqBtC,CAAC;AAEF,eAAO,MAAM,iBAAiB,EAAE,YAiB/B,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"design.d.ts","sourceRoot":"","sources":["../../src/agents/design.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAmB,YAAY,EAAE,MAAM,SAAS,CAAC;AA0D7D,eAAO,MAAM,iBAAiB,EAAE,YAiB/B,CAAC"}
|
package/dist/agents/index.d.ts
CHANGED
|
@@ -4,7 +4,7 @@ export { resolvePrompt } from './types';
|
|
|
4
4
|
export type { AgentDefinition, AgentFactory } from './types';
|
|
5
5
|
import { createOrchestratorAgent } from './orchestrator';
|
|
6
6
|
import { createPlannerAgent, createPlanCheckerAgent } from './planner';
|
|
7
|
-
import {
|
|
7
|
+
import { createBackendCoderAgent, createFrontendCoderAgent, createDevopsAgent } from './coder';
|
|
8
8
|
import { createTesterAgent } from './tester';
|
|
9
9
|
import { createReviewerAgent } from './reviewer';
|
|
10
10
|
import { createResearcherAgent } from './researcher';
|
|
@@ -14,11 +14,12 @@ import { createDocUpdaterAgent } from './doc-updater';
|
|
|
14
14
|
import { createMapperAgent } from './mapper';
|
|
15
15
|
import { createCodeExplorerAgent } from './code-explorer';
|
|
16
16
|
import { createDebugSpecialistAgent, createBuildErrorResolverAgent } from './debug';
|
|
17
|
-
import { createTaskSplitterAgent, createDiscusserAgent
|
|
17
|
+
import { createTaskSplitterAgent, createDiscusserAgent } from './specialist';
|
|
18
18
|
import { createArchitectAgent } from './architect';
|
|
19
19
|
import { createRiskAnalystAgent } from './risk-analyst';
|
|
20
20
|
import { createPolicyEnforcerAgent } from './policy-enforcer';
|
|
21
21
|
import { createPerformanceOptimizerAgent, createRefactorGuideAgent } from './performance';
|
|
22
|
+
import { createDesignAgent } from './design';
|
|
22
23
|
/** All agent names registered by FlowDeck. */
|
|
23
24
|
export declare const AGENT_NAMES: readonly string[];
|
|
24
25
|
export type AgentMode = 'primary' | 'subagent' | 'all';
|
|
@@ -37,5 +38,5 @@ export declare function createAgents(agentModels?: Record<string, string | undef
|
|
|
37
38
|
* Pass agentModels to apply per-agent model overrides from flowdeck.json.
|
|
38
39
|
*/
|
|
39
40
|
export declare function getAgentConfigs(agentModels?: Record<string, string | undefined>): Record<string, AgentConfig>;
|
|
40
|
-
export { createOrchestratorAgent, createPlannerAgent,
|
|
41
|
+
export { createOrchestratorAgent, createPlannerAgent, createBackendCoderAgent, createFrontendCoderAgent, createDevopsAgent, createPlanCheckerAgent, createTesterAgent, createReviewerAgent, createResearcherAgent, createWriterAgent, createSecurityAuditorAgent, createDocUpdaterAgent, createMapperAgent, createCodeExplorerAgent, createDebugSpecialistAgent, createBuildErrorResolverAgent, createTaskSplitterAgent, createDiscusserAgent, createArchitectAgent, createRiskAnalystAgent, createPolicyEnforcerAgent, createPerformanceOptimizerAgent, createRefactorGuideAgent, createDesignAgent, };
|
|
41
42
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/agents/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAEvD,OAAO,KAAK,EAAE,eAAe,EAAgB,MAAM,SAAS,CAAC;AAE7D,OAAO,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACxC,YAAY,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAG7D,OAAO,EAAE,uBAAuB,EAAE,MAAM,gBAAgB,CAAC;AACzD,OAAO,EAAE,kBAAkB,EAAE,sBAAsB,EAAE,MAAM,WAAW,CAAC;AACvE,OAAO,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/agents/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAEvD,OAAO,KAAK,EAAE,eAAe,EAAgB,MAAM,SAAS,CAAC;AAE7D,OAAO,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACxC,YAAY,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAG7D,OAAO,EAAE,uBAAuB,EAAE,MAAM,gBAAgB,CAAC;AACzD,OAAO,EAAE,kBAAkB,EAAE,sBAAsB,EAAE,MAAM,WAAW,CAAC;AACvE,OAAO,EACL,uBAAuB,EACvB,wBAAwB,EACxB,iBAAiB,EAClB,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAC7C,OAAO,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AACjD,OAAO,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC;AACrD,OAAO,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAC7C,OAAO,EAAE,0BAA0B,EAAE,MAAM,oBAAoB,CAAC;AAChE,OAAO,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AACtD,OAAO,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAC7C,OAAO,EAAE,uBAAuB,EAAE,MAAM,iBAAiB,CAAC;AAC1D,OAAO,EAAE,0BAA0B,EAAE,6BAA6B,EAAE,MAAM,SAAS,CAAC;AACpF,OAAO,EACL,uBAAuB,EACvB,oBAAoB,EACrB,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;AACxD,OAAO,EAAE,yBAAyB,EAAE,MAAM,mBAAmB,CAAC;AAC9D,OAAO,EACL,+BAA+B,EAC/B,wBAAwB,EACzB,MAAM,eAAe,CAAC;AAEvB,OAAO,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAE7C,8CAA8C;AAC9C,eAAO,MAAM,WAAW,EAAE,SAAS,MAAM,EA0B/B,CAAC;AAGX,MAAM,MAAM,SAAS,GAAG,SAAS,GAAG,UAAU,GAAG,KAAK,CAAC;AAmBvD;;;GAGG;AACH,wBAAgB,WAAW,CACzB,IAAI,EAAE,MAAM,EACZ,KAAK,CAAC,EAAE,MAAM,EACd,YAAY,CAAC,EAAE,MAAM,EACrB,kBAAkB,CAAC,EAAE,MAAM,GAC1B,eAAe,GAAG,SAAS,CAgH7B;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,GAAG,eAAe,EAAE,CAYhG;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAuB7G;AAGD,OAAO,EACL,uBAAuB,EACvB,kBAAkB,EAClB,uBAAuB,EACvB,wBAAwB,EACxB,iBAAiB,EACjB,sBAAsB,EACtB,iBAAiB,EACjB,mBAAmB,EACnB,qBAAqB,EACrB,iBAAiB,EACjB,0BAA0B,EAC1B,qBAAqB,EACrB,iBAAiB,EACjB,uBAAuB,EACvB,0BAA0B,EAC1B,6BAA6B,EAC7B,uBAAuB,EACvB,oBAAoB,EACpB,oBAAoB,EACpB,sBAAsB,EACtB,yBAAyB,EACzB,+BAA+B,EAC/B,wBAAwB,EACxB,iBAAiB,GAClB,CAAC"}
|
|
@@ -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;
|
|
1
|
+
{"version":3,"file":"orchestrator.d.ts","sourceRoot":"","sources":["../../src/agents/orchestrator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AA2Q/C;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,cAAc,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,MAAM,CAsB5E;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,GAC3B,eAAe,CAuBjB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reviewer.d.ts","sourceRoot":"","sources":["../../src/agents/reviewer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAmB,YAAY,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"reviewer.d.ts","sourceRoot":"","sources":["../../src/agents/reviewer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAmB,YAAY,EAAE,MAAM,SAAS,CAAC;AAgJ7D,eAAO,MAAM,mBAAmB,EAAE,YAiBjC,CAAC"}
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import type { AgentFactory } from './types';
|
|
2
2
|
export declare const createTaskSplitterAgent: AgentFactory;
|
|
3
3
|
export declare const createDiscusserAgent: AgentFactory;
|
|
4
|
-
export declare const createParallelCoordinatorAgent: AgentFactory;
|
|
5
4
|
//# sourceMappingURL=specialist.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"specialist.d.ts","sourceRoot":"","sources":["../../src/agents/specialist.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAmB,YAAY,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"specialist.d.ts","sourceRoot":"","sources":["../../src/agents/specialist.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAmB,YAAY,EAAE,MAAM,SAAS,CAAC;AAuN7D,eAAO,MAAM,uBAAuB,EAAE,YAqBrC,CAAC;AAEF,eAAO,MAAM,oBAAoB,EAAE,YAiBlC,CAAC"}
|
package/dist/config/index.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/config/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,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,MAAM,UAAU,CAAC"}
|
package/dist/config/loader.d.ts
CHANGED
|
@@ -4,4 +4,12 @@ import type { FlowDeckConfig } from './schema';
|
|
|
4
4
|
* Returns an empty config if no file is found.
|
|
5
5
|
*/
|
|
6
6
|
export declare function loadFlowDeckConfig(directory?: string): FlowDeckConfig;
|
|
7
|
+
export interface ResolvedDesignFirstConfig {
|
|
8
|
+
enabled: boolean;
|
|
9
|
+
enforcement: "strict" | "advisory";
|
|
10
|
+
requireApprovalBeforeImplementation: boolean;
|
|
11
|
+
modelOverrides: Record<string, string>;
|
|
12
|
+
defaultSkillsByTaskType: Record<string, string[]>;
|
|
13
|
+
}
|
|
14
|
+
export declare function resolveDesignFirstConfig(config: FlowDeckConfig): ResolvedDesignFirstConfig;
|
|
7
15
|
//# sourceMappingURL=loader.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../../src/config/loader.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAa/C;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,cAAc,CAoBrE"}
|
|
1
|
+
{"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../../src/config/loader.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAa/C;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,cAAc,CAoBrE;AAED,MAAM,WAAW,yBAAyB;IACxC,OAAO,EAAE,OAAO,CAAC;IACjB,WAAW,EAAE,QAAQ,GAAG,UAAU,CAAC;IACnC,mCAAmC,EAAE,OAAO,CAAC;IAC7C,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACvC,uBAAuB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;CACnD;AAED,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,cAAc,GAAG,yBAAyB,CAc1F"}
|
package/dist/config/schema.d.ts
CHANGED
|
@@ -8,14 +8,67 @@
|
|
|
8
8
|
* Project config takes precedence over global config.
|
|
9
9
|
*/
|
|
10
10
|
export interface AgentModelConfig {
|
|
11
|
-
/** Model to use for this agent (e.g. "
|
|
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 GovernanceConfig {
|
|
15
|
+
validator?: {
|
|
16
|
+
/**
|
|
17
|
+
* off: no validation
|
|
18
|
+
* advisory: validate and warn but never block (default)
|
|
19
|
+
* strict: block on contract violations
|
|
20
|
+
*/
|
|
21
|
+
mode?: "off" | "advisory" | "strict";
|
|
22
|
+
/** Whether to enforce contract tool allowlists. Default: true when mode != off */
|
|
23
|
+
contractEnforcement?: "off" | "warn" | "strict";
|
|
24
|
+
};
|
|
25
|
+
delegationBudget?: {
|
|
26
|
+
/** Max total tool calls before run is stopped. Default: 200 */
|
|
27
|
+
maxToolCalls?: number;
|
|
28
|
+
/** Max total delegated agents. Default: 30 */
|
|
29
|
+
maxDelegatedAgents?: number;
|
|
30
|
+
/** Max total retries across all steps. Default: 10 */
|
|
31
|
+
maxRetries?: number;
|
|
32
|
+
/** Max delegation depth. Default: 8 */
|
|
33
|
+
maxDepth?: number;
|
|
34
|
+
/** Max retries on the same step before escalating. Default: 3 */
|
|
35
|
+
maxSameStepRetries?: number;
|
|
36
|
+
/** What to do when budget is exhausted. Default: "escalate" */
|
|
37
|
+
onExhaustion?: "stop" | "warn" | "escalate";
|
|
38
|
+
};
|
|
39
|
+
deadlockDetection?: {
|
|
40
|
+
/** Whether deadlock detection is active. Default: true */
|
|
41
|
+
enabled?: boolean;
|
|
42
|
+
/** How many agent-pair transitions trigger an agent_bounce signal. Default: 3 */
|
|
43
|
+
bounceThreshold?: number;
|
|
44
|
+
/** How many same-stage retries trigger a step_retry_loop signal. Default: 3 */
|
|
45
|
+
retryLoopThreshold?: number;
|
|
46
|
+
/** Minutes a span can remain "running" before a stage_stall signal fires. Default: 30 */
|
|
47
|
+
stageStallMinutes?: number;
|
|
48
|
+
/** Automatically stop the run when a signal fires. Default: false */
|
|
49
|
+
autoStop?: boolean;
|
|
50
|
+
};
|
|
51
|
+
scorecard?: {
|
|
52
|
+
/** Whether to generate scorecards after each run. Default: true */
|
|
53
|
+
enabled?: boolean;
|
|
54
|
+
/** Storage mode. Default: "jsonl" */
|
|
55
|
+
storageMode?: "jsonl" | "none";
|
|
56
|
+
};
|
|
57
|
+
}
|
|
14
58
|
export interface FlowDeckConfig {
|
|
15
59
|
/**
|
|
16
|
-
* Per-agent model overrides. Keys are agent names (e.g. "orchestrator", "coder", "planner").
|
|
60
|
+
* Per-agent model overrides. Keys are agent names (e.g. "orchestrator", "backend-coder", "frontend-coder", "devops", "planner").
|
|
17
61
|
* If an agent is not listed, it uses the model the user currently has selected in OpenCode.
|
|
18
62
|
*/
|
|
19
63
|
agents?: Record<string, AgentModelConfig>;
|
|
64
|
+
designFirst?: {
|
|
65
|
+
enabled?: boolean;
|
|
66
|
+
enforcement?: "strict" | "advisory";
|
|
67
|
+
requireApprovalBeforeImplementation?: boolean;
|
|
68
|
+
modelOverrides?: Record<string, string>;
|
|
69
|
+
defaultSkillsByTaskType?: Record<string, string[]>;
|
|
70
|
+
};
|
|
71
|
+
/** Reliability and governance layer: contracts, validation, tracing, budgets, loop detection, scoring */
|
|
72
|
+
governance?: GovernanceConfig;
|
|
20
73
|
}
|
|
21
74
|
//# sourceMappingURL=schema.d.ts.map
|
|
@@ -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,
|
|
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,gBAAgB,CAAC,EAAE;QACjB,+DAA+D;QAC/D,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,8CAA8C;QAC9C,kBAAkB,CAAC,EAAE,MAAM,CAAC;QAC5B,sDAAsD;QACtD,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,uCAAuC;QACvC,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,iEAAiE;QACjE,kBAAkB,CAAC,EAAE,MAAM,CAAC;QAC5B,+DAA+D;QAC/D,YAAY,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,UAAU,CAAC;KAC7C,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;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"}
|
|
@@ -13243,6 +13243,8 @@ function parseState(content) {
|
|
|
13243
13243
|
result[key] = value.replace(/[\[\]]/g, "").split(",").map((s) => s.trim()).filter(Boolean);
|
|
13244
13244
|
} else if (key === "plan_confirmed") {
|
|
13245
13245
|
result[key] = value === "true";
|
|
13246
|
+
} else if (key === "requires_design_first" || key === "design_approved" || key === "design_override") {
|
|
13247
|
+
result[key] = value === "true";
|
|
13246
13248
|
} else if (value !== "" && !isNaN(Number(value)) && key !== "plan_file" && key !== "confirmed_at") {
|
|
13247
13249
|
result[key] = Number(value);
|
|
13248
13250
|
} else {
|
|
@@ -13256,7 +13258,21 @@ function parseState(content) {
|
|
|
13256
13258
|
function readPlanningState(dir) {
|
|
13257
13259
|
const sp = statePath(dir);
|
|
13258
13260
|
if (!existsSync2(sp)) {
|
|
13259
|
-
return {
|
|
13261
|
+
return {
|
|
13262
|
+
phase: 0,
|
|
13263
|
+
status: "",
|
|
13264
|
+
plan_confirmed: false,
|
|
13265
|
+
requires_design_first: false,
|
|
13266
|
+
design_stage: "pending",
|
|
13267
|
+
design_approved: false,
|
|
13268
|
+
design_override: false,
|
|
13269
|
+
steps_complete: [],
|
|
13270
|
+
steps_pending: [],
|
|
13271
|
+
last_action: "",
|
|
13272
|
+
next_action: "",
|
|
13273
|
+
blockers: [],
|
|
13274
|
+
tdd: undefined
|
|
13275
|
+
};
|
|
13260
13276
|
}
|
|
13261
13277
|
const content = readFileSync2(sp, "utf-8");
|
|
13262
13278
|
const parsed = parseState(content);
|
|
@@ -13264,6 +13280,13 @@ function readPlanningState(dir) {
|
|
|
13264
13280
|
phase: parsed.phase || 1,
|
|
13265
13281
|
status: parsed.status || "",
|
|
13266
13282
|
plan_confirmed: Boolean(parsed.plan_confirmed),
|
|
13283
|
+
task_type: parsed.task_type || undefined,
|
|
13284
|
+
requires_design_first: Boolean(parsed.requires_design_first),
|
|
13285
|
+
design_stage: parsed.design_stage || "pending",
|
|
13286
|
+
design_approved: Boolean(parsed.design_approved),
|
|
13287
|
+
design_override: Boolean(parsed.design_override),
|
|
13288
|
+
design_override_reason: parsed.design_override_reason || undefined,
|
|
13289
|
+
design_artifact: parsed.design_artifact || undefined,
|
|
13267
13290
|
steps_complete: parsed.steps_complete || [],
|
|
13268
13291
|
steps_pending: parsed.steps_pending || [],
|
|
13269
13292
|
last_action: parsed.last_action || "",
|
|
@@ -50,6 +50,77 @@ export interface TDDDashboardState {
|
|
|
50
50
|
bugs_missing_regression: number;
|
|
51
51
|
overrides_used: number;
|
|
52
52
|
}
|
|
53
|
+
export interface AgentSpanSummary {
|
|
54
|
+
span_id: string;
|
|
55
|
+
agent: string;
|
|
56
|
+
invoker: string;
|
|
57
|
+
stage: string;
|
|
58
|
+
status: string;
|
|
59
|
+
latency_ms?: number;
|
|
60
|
+
contract_violations: number;
|
|
61
|
+
tools_used: number;
|
|
62
|
+
depth: number;
|
|
63
|
+
}
|
|
64
|
+
export interface TraceGraphSummary {
|
|
65
|
+
trace_id: string;
|
|
66
|
+
root_agent: string;
|
|
67
|
+
started_at: string;
|
|
68
|
+
ended_at?: string;
|
|
69
|
+
total_agents: number;
|
|
70
|
+
max_depth: number;
|
|
71
|
+
failed_spans: number;
|
|
72
|
+
retry_total: number;
|
|
73
|
+
spans: AgentSpanSummary[];
|
|
74
|
+
}
|
|
75
|
+
export interface BudgetSummary {
|
|
76
|
+
run_id: string;
|
|
77
|
+
status: string;
|
|
78
|
+
tool_calls_used: number;
|
|
79
|
+
tool_calls_limit: number;
|
|
80
|
+
delegations_used: number;
|
|
81
|
+
delegations_limit: number;
|
|
82
|
+
retries_used: number;
|
|
83
|
+
retries_limit: number;
|
|
84
|
+
exhaustion_reason?: string;
|
|
85
|
+
}
|
|
86
|
+
export interface DeadlockSummary {
|
|
87
|
+
signal_id: string;
|
|
88
|
+
trace_id: string;
|
|
89
|
+
type: string;
|
|
90
|
+
detected_at: string;
|
|
91
|
+
agents_involved: string[];
|
|
92
|
+
recommended_action: string;
|
|
93
|
+
auto_stop: boolean;
|
|
94
|
+
}
|
|
95
|
+
export interface ScorecardSummary {
|
|
96
|
+
run_id: string;
|
|
97
|
+
command: string;
|
|
98
|
+
completion_status: string;
|
|
99
|
+
overall_score: number;
|
|
100
|
+
policy_violations: number;
|
|
101
|
+
deadlock_signals: number;
|
|
102
|
+
generated_at: string;
|
|
103
|
+
}
|
|
104
|
+
export interface GovernanceDashboardState {
|
|
105
|
+
/** Active or recent trace graphs */
|
|
106
|
+
activeTraces: TraceGraphSummary[];
|
|
107
|
+
/** Runs with stuck/deadlock signals */
|
|
108
|
+
stuckRuns: DeadlockSummary[];
|
|
109
|
+
/** Budget status for recent runs */
|
|
110
|
+
budgets: BudgetSummary[];
|
|
111
|
+
/** Recent validator violations */
|
|
112
|
+
validatorViolations: number;
|
|
113
|
+
/** Scorecards for recent runs */
|
|
114
|
+
scorecards: ScorecardSummary[];
|
|
115
|
+
/** Average score across all commands */
|
|
116
|
+
averageScore: number | null;
|
|
117
|
+
/** Most failure-prone commands (by scorecard) */
|
|
118
|
+
worstCommands: Array<{
|
|
119
|
+
command: string;
|
|
120
|
+
avg_score: number;
|
|
121
|
+
runs: number;
|
|
122
|
+
}>;
|
|
123
|
+
}
|
|
53
124
|
export interface DashboardData {
|
|
54
125
|
project: string;
|
|
55
126
|
milestone: string;
|
|
@@ -68,5 +139,6 @@ export interface DashboardData {
|
|
|
68
139
|
agentPerf: AgentPerfSummary[];
|
|
69
140
|
toolFailureCount: number;
|
|
70
141
|
tdd?: TDDDashboardState;
|
|
142
|
+
governance?: GovernanceDashboardState;
|
|
71
143
|
}
|
|
72
144
|
//# sourceMappingURL=types.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/dashboard/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,KAAK;IACpB,MAAM,EAAE,MAAM,CAAA;IACd,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,EAAE,UAAU,GAAG,aAAa,GAAG,SAAS,CAAA;IAC9C,aAAa,EAAE,MAAM,CAAA;IACrB,YAAY,EAAE,MAAM,CAAA;IACpB,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,MAAM,CAAA;IACf,UAAU,EAAE,MAAM,CAAA;IAClB,SAAS,EAAE,MAAM,CAAA;IACjB,QAAQ,EAAE,MAAM,CAAA;IAChB,eAAe,EAAE,MAAM,CAAA;IACvB,QAAQ,EAAE,MAAM,CAAA;CACjB;AAED,MAAM,WAAW,SAAS;IACxB,MAAM,EAAE,MAAM,CAAA;IACd,OAAO,EAAE,MAAM,CAAA;IACf,UAAU,EAAE,MAAM,CAAA;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,MAAM,EAAE,MAAM,CAAA;IACd,UAAU,EAAE,MAAM,CAAA;IAClB,aAAa,EAAE,MAAM,CAAA;IACrB,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB;AAED,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAA;IACV,OAAO,EAAE,MAAM,CAAA;IACf,MAAM,EAAE,MAAM,CAAA;IACd,UAAU,EAAE,MAAM,CAAA;IAClB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,YAAY,EAAE,MAAM,CAAA;CACrB;AAED,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,EAAE,MAAM,CAAA;IACb,SAAS,EAAE,MAAM,CAAA;IACjB,YAAY,EAAE,MAAM,CAAA;IACpB,IAAI,EAAE,MAAM,CAAA;IACZ,eAAe,EAAE,MAAM,CAAA;CACxB;AAED,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,EAAE,MAAM,CAAA;IACb,aAAa,EAAE,MAAM,CAAA;IACrB,aAAa,EAAE,MAAM,CAAA;IACrB,mBAAmB,EAAE,MAAM,CAAA;IAC3B,iBAAiB,EAAE,MAAM,CAAA;IACzB,uBAAuB,EAAE,MAAM,CAAA;IAC/B,cAAc,EAAE,MAAM,CAAA;CACvB;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAA;IACf,SAAS,EAAE,MAAM,CAAA;IACjB,cAAc,EAAE,MAAM,CAAA;IACtB,MAAM,EAAE,KAAK,EAAE,CAAA;IACf,QAAQ,EAAE,MAAM,EAAE,CAAA;IAClB,QAAQ,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAA;IAC/D,YAAY,EAAE,MAAM,CAAA;IAEpB,gBAAgB,EAAE,gBAAgB,EAAE,CAAA;IACpC,UAAU,EAAE,SAAS,EAAE,CAAA;IACvB,gBAAgB,EAAE,eAAe,EAAE,CAAA;IACnC,SAAS,EAAE,gBAAgB,EAAE,CAAA;IAC7B,gBAAgB,EAAE,MAAM,CAAA;IAExB,GAAG,CAAC,EAAE,iBAAiB,CAAA;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/dashboard/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"guard-rails.d.ts","sourceRoot":"","sources":["../../src/hooks/guard-rails.ts"],"names":[],"mappings":"
|
|
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"}
|
|
@@ -2,6 +2,13 @@ import { type Session } from "../services/memory-store";
|
|
|
2
2
|
export declare function onSessionCreated(directory: string, contentSessionId: string, prompt?: string): Session;
|
|
3
3
|
export declare function onToolExecuted(contentSessionId: string, toolName: string, toolInput: Record<string, unknown>, toolResponse: string | null, directory: string): void;
|
|
4
4
|
export declare function onMessageUpdated(contentSessionId: string, role: string, content: string, directory: string): void;
|
|
5
|
+
/**
|
|
6
|
+
* Called when OpenCode compacts a session (session.compacted event).
|
|
7
|
+
*
|
|
8
|
+
* Previously this silently dropped the summary if the session was not in
|
|
9
|
+
* activeSessions (e.g. after plugin reload or cross-process sessions). Now it
|
|
10
|
+
* falls back to a DB lookup so the summary is never lost.
|
|
11
|
+
*/
|
|
5
12
|
export declare function onSessionCompact(contentSessionId: string, summary: string): void;
|
|
6
13
|
export declare function onSessionEnd(contentSessionId: string, lastMessage?: string): void;
|
|
7
14
|
export declare function getSessionContext(directory: string, contentSessionId: string): {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"memory-hook.d.ts","sourceRoot":"","sources":["../../src/hooks/memory-hook.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"memory-hook.d.ts","sourceRoot":"","sources":["../../src/hooks/memory-hook.ts"],"names":[],"mappings":"AAAA,OAAO,EAQL,KAAK,OAAO,EAGb,MAAM,0BAA0B,CAAA;AAgGjC,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAYtG;AAED,wBAAgB,cAAc,CAC5B,gBAAgB,EAAE,MAAM,EACxB,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAClC,YAAY,EAAE,MAAM,GAAG,IAAI,EAC3B,SAAS,EAAE,MAAM,GAChB,IAAI,CA4BN;AAED,wBAAgB,gBAAgB,CAC9B,gBAAgB,EAAE,MAAM,EACxB,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,GAChB,IAAI,CA6BN;AAED;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAAC,gBAAgB,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CA+BhF;AAED,wBAAgB,YAAY,CAAC,gBAAgB,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CA2BjF;AAED,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,GAAG;IAC9E,OAAO,EAAE,MAAM,CAAA;IACf,gBAAgB,EAAE,OAAO,EAAE,CAAA;CAC5B,CAIA;AAED,wBAAgB,YAAY,CAAC,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAE3D;AAED,eAAO,MAAM,UAAU;;;;;;;;CAQtB,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"orchestrator-guard-hook.d.ts","sourceRoot":"","sources":["../../src/hooks/orchestrator-guard-hook.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;
|
|
1
|
+
{"version":3,"file":"orchestrator-guard-hook.d.ts","sourceRoot":"","sources":["../../src/hooks/orchestrator-guard-hook.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAwEH,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,gBAAgB,CAAsB;IAE9C;;;OAGG;IACH,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;;;OAGG;IACH,KAAK,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI;CASjD"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tool-guard.d.ts","sourceRoot":"","sources":["../../src/hooks/tool-guard.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;
|
|
1
|
+
{"version":3,"file":"tool-guard.d.ts","sourceRoot":"","sources":["../../src/hooks/tool-guard.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAiBH,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,IAAI,CAAA;AAEvC;;;GAGG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,GAAG,WAAW,CAsC9D;AAED;;;;;;;;;GASG;AACH,wBAAgB,mBAAmB,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,WAAW,CAepF;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,SAAS,EAAE,MAAM,GAAG,WAAW,CAmBpE;AAkBD;;;;GAIG;AACH,wBAAsB,aAAa,CACjC,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,CA4Bf"}
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAA;AAkGjD,QAAA,MAAM,MAAM,EAAE,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAA;AAkGjD,QAAA,MAAM,MAAM,EAAE,MAsPb,CAAA;AAED,eAAe,MAAM,CAAA"}
|