ace-swarm 1.1.3 → 2.0.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 (68) hide show
  1. package/README.md +58 -0
  2. package/assets/instructions/ACE.instructions.md +10 -0
  3. package/assets/tasks/README.md +3 -0
  4. package/assets/tasks/role_tasks.md +2 -0
  5. package/dist/agent-runtime/role-adapters.d.ts +26 -0
  6. package/dist/agent-runtime/role-adapters.d.ts.map +1 -0
  7. package/dist/agent-runtime/role-adapters.js +450 -0
  8. package/dist/agent-runtime/role-adapters.js.map +1 -0
  9. package/dist/cli.js +19 -4
  10. package/dist/cli.js.map +1 -1
  11. package/dist/helpers.d.ts.map +1 -1
  12. package/dist/helpers.js +21 -0
  13. package/dist/helpers.js.map +1 -1
  14. package/dist/job-scheduler.d.ts +184 -0
  15. package/dist/job-scheduler.d.ts.map +1 -0
  16. package/dist/job-scheduler.js +1271 -0
  17. package/dist/job-scheduler.js.map +1 -0
  18. package/dist/resources.d.ts.map +1 -1
  19. package/dist/resources.js +37 -0
  20. package/dist/resources.js.map +1 -1
  21. package/dist/tools-framework.d.ts.map +1 -1
  22. package/dist/tools-framework.js +40 -0
  23. package/dist/tools-framework.js.map +1 -1
  24. package/dist/tools-handoff.d.ts +13 -0
  25. package/dist/tools-handoff.d.ts.map +1 -1
  26. package/dist/tools-handoff.js +113 -2
  27. package/dist/tools-handoff.js.map +1 -1
  28. package/dist/tools-scheduler.d.ts +6 -0
  29. package/dist/tools-scheduler.d.ts.map +1 -0
  30. package/dist/tools-scheduler.js +232 -0
  31. package/dist/tools-scheduler.js.map +1 -0
  32. package/dist/tools.d.ts.map +1 -1
  33. package/dist/tools.js +2 -0
  34. package/dist/tools.js.map +1 -1
  35. package/dist/tui/agent-runner.d.ts +18 -1
  36. package/dist/tui/agent-runner.d.ts.map +1 -1
  37. package/dist/tui/agent-runner.js +267 -45
  38. package/dist/tui/agent-runner.js.map +1 -1
  39. package/dist/tui/agent-worker.d.ts +8 -0
  40. package/dist/tui/agent-worker.d.ts.map +1 -0
  41. package/dist/tui/agent-worker.js +197 -0
  42. package/dist/tui/agent-worker.js.map +1 -0
  43. package/dist/tui/chat.d.ts.map +1 -1
  44. package/dist/tui/commands.d.ts +5 -1
  45. package/dist/tui/commands.d.ts.map +1 -1
  46. package/dist/tui/commands.js +83 -14
  47. package/dist/tui/commands.js.map +1 -1
  48. package/dist/tui/dashboard.d.ts +1 -1
  49. package/dist/tui/dashboard.d.ts.map +1 -1
  50. package/dist/tui/dashboard.js +2 -1
  51. package/dist/tui/dashboard.js.map +1 -1
  52. package/dist/tui/index.d.ts +30 -0
  53. package/dist/tui/index.d.ts.map +1 -1
  54. package/dist/tui/index.js +367 -39
  55. package/dist/tui/index.js.map +1 -1
  56. package/dist/tui/input.d.ts +2 -0
  57. package/dist/tui/input.d.ts.map +1 -1
  58. package/dist/tui/input.js +22 -5
  59. package/dist/tui/input.js.map +1 -1
  60. package/dist/tui/layout.d.ts +15 -1
  61. package/dist/tui/layout.d.ts.map +1 -1
  62. package/dist/tui/layout.js +85 -23
  63. package/dist/tui/layout.js.map +1 -1
  64. package/dist/tui/provider-discovery.d.ts +29 -0
  65. package/dist/tui/provider-discovery.d.ts.map +1 -0
  66. package/dist/tui/provider-discovery.js +343 -0
  67. package/dist/tui/provider-discovery.js.map +1 -0
  68. package/package.json +1 -1
package/README.md CHANGED
@@ -4,6 +4,8 @@ ACE Swarm packages the ACE framework (agents, skills, schemas, prompts, tasks, h
4
4
 
5
5
  Swarm agents (`orchestrator`, `vos`, `ui`, `coders`) and composable agents (`skeptic`, `ops`, `research`, `spec`, `builder`, `qa`, `docs`) are treated as one unified agent system, with composable agents available as subagents for every swarm workflow.
6
6
 
7
+ Suggestions and collaborations: `voybio.fundr@gmail.com`.
8
+
7
9
  ## Install
8
10
 
9
11
  ```bash
@@ -112,6 +114,7 @@ ace mcp-config --all
112
114
  ```bash
113
115
  ace mcp # start MCP server on stdio
114
116
  ace serve # alias for mcp
117
+ ace tui [options] # launch interactive terminal dashboard
115
118
  ace init [options] # bootstrap ACE files into current workspace
116
119
  ace turnkey [options] # same as init (turnkey alias)
117
120
  ace doctor [options] # local LLM + MCP readiness checks
@@ -119,6 +122,35 @@ ace mcp-config [--client <name>|--all] # print one/all MCP client snippets
119
122
  ace paths # show resolved package/workspace paths
120
123
  ```
121
124
 
125
+ ### Interactive TUI
126
+
127
+ Launch a full-screen terminal dashboard with Ollama model chat, agent tabs, telemetry, and task tracking:
128
+
129
+ ```bash
130
+ ace tui
131
+ ace tui --model llama3.1:8b --ollama-url http://127.0.0.1:11434
132
+ ```
133
+
134
+ The TUI starts regardless of whether Ollama is running. Use `/ollama` inside the TUI to check status, or `/pull <model>` to download models.
135
+
136
+ Key commands inside TUI:
137
+
138
+ | Command | Description |
139
+ |---------|-------------|
140
+ | `/models` | List available Ollama models |
141
+ | `/model <name>` | Switch active model |
142
+ | `/pull <name>` | Download a model |
143
+ | `/ollama` | Check Ollama connection status |
144
+ | `/agent <role>` | Start a subagent in a new tab |
145
+ | `/agents` | List all agent roles and status |
146
+ | `/status` | Show orchestrator status |
147
+ | `/chat` | Open new chat tab |
148
+ | `/logs` | Open logs tab |
149
+ | `/help` | List all commands |
150
+ | `/quit` | Exit TUI |
151
+
152
+ Keyboard shortcuts: `Alt+1-9` switch tabs, `Tab/Shift+Tab` cycle tabs, `Ctrl+N` new chat, `Ctrl+R` refresh, `Ctrl+D` quit.
153
+
122
154
  Options for `init` / `turnkey`:
123
155
 
124
156
  ```bash
@@ -176,6 +208,25 @@ Resources:
176
208
  - `ace://kanban` (JSON)
177
209
  - `ace://kanban/html` (HTML)
178
210
 
211
+ ## Scheduler Queue (Runtime)
212
+
213
+ ACE Swarm now supports a lease-owned, rolling-horizon scheduler for handoff/job execution:
214
+
215
+ - `agent-state/job-queue.json`
216
+ - `agent-state/job-reservations.json`
217
+ - `agent-state/scheduler-lease.json`
218
+
219
+ Priority and planning model:
220
+
221
+ - Priority-aware (`P0 > P1 > P2 > P3`) with FIFO ordering inside each band.
222
+ - Collision-free reservations over shared resources/time slices.
223
+ - Rolling-horizon replanning on each scheduler tick.
224
+
225
+ Handoff integration:
226
+
227
+ - `create_handoff` and `ack_handoff` automatically sync lifecycle updates into scheduler jobs.
228
+ - Scheduler replanning is triggered automatically during these handoff transitions.
229
+
179
230
  ## New Runtime State Stores
180
231
 
181
232
  ACE Swarm now persists additional orchestration stores:
@@ -184,6 +235,9 @@ ACE Swarm now persists additional orchestration stores:
184
235
  - `agent-state/todo-state.json` (explicit TODO statuses, dependencies, transition gates)
185
236
  - `agent-state/index.json` (workspace delta scan index)
186
237
  - `agent-state/handoff-registry.json` (handoff lifecycle: `open|accepted|blocked|completed`)
238
+ - `agent-state/job-queue.json` (scheduler jobs with dependency/priority metadata)
239
+ - `agent-state/job-reservations.json` (resource/time reservation table)
240
+ - `agent-state/scheduler-lease.json` (active scheduler owner/heartbeat)
187
241
 
188
242
  New/extended tools:
189
243
 
@@ -191,12 +245,16 @@ New/extended tools:
191
245
  - `scan_workspace_delta` writes indexed changed/unchanged/deleted diffs
192
246
  - `ack_handoff` updates handoff lifecycle status
193
247
  - `get_run_ledger`, `get_todo_state`, `get_handoff_status` expose persisted store state
248
+ - Scheduler: `enqueue_job`, `list_jobs`, `ack_job`, `run_scheduler_tick`, `start_reserved_job`, `complete_job`, `get_reservation_table`, `get_scheduler_lease`
194
249
 
195
250
  New resources:
196
251
 
197
252
  - `ace://run-ledger`
198
253
  - `ace://index`
199
254
  - `ace://handoffs/status`
255
+ - `ace://scheduler/queue`
256
+ - `ace://scheduler/reservations`
257
+ - `ace://scheduler/lease`
200
258
  - `ace://kernel/directive_kernel`
201
259
  - `ace://kernel/agent_registry`
202
260
 
@@ -37,6 +37,16 @@ applyTo: 'ACE_Orchestrator'
37
37
 
38
38
  **SYNCHRONIZE:** Update `MASTER_PLAN.md` with the new reality.
39
39
 
40
+ ### 0.5 Directive: SCHEDULER-AWARE ORCHESTRATION
41
+
42
+ **COMMAND:** Treat handoffs as schedulable jobs, not only static payloads.
43
+
44
+ **SCHEDULE:** When work is deferred, gated, or waiting on release windows, rely on ACE scheduler state (`job-queue`, `job-reservations`, `scheduler-lease`) to track dispatch readiness.
45
+
46
+ **VERIFY:** After `create_handoff` and `ack_handoff`, verify scheduler sync (`list_jobs`, `get_scheduler_lease`) and ensure rolling-horizon replanning is active.
47
+
48
+ **ESCALATE:** If scheduler lease ownership blocks dispatch, record the blocker and reroute through ACE-Ops instead of bypassing scheduler contracts.
49
+
40
50
  ### 0.4 Directive: THE CLARITY PROTOCOL (The Manager's Mind)
41
51
 
42
52
  **COMMAND:** You must think before you route. Execute this Socratic loop for every request.
@@ -10,6 +10,9 @@ This directory contains shared execution artifacts consumed by ACE prompts, tool
10
10
  - `cli_work_split.md`: Codex CLI vs Gemini CLI routing contract.
11
11
  - `SWARM_HANDOFF.template.json`: canonical inter-agent handoff schema.
12
12
  - `SWARM_HANDOFF.example*.json`: concrete routing examples.
13
+ - `agent-state/job-queue.json`: scheduler job queue for deferred/gated dispatch.
14
+ - `agent-state/job-reservations.json`: collision-free scheduler reservations.
15
+ - `agent-state/scheduler-lease.json`: active scheduler lease ownership.
13
16
 
14
17
  ## Operating Rules
15
18
 
@@ -64,12 +64,14 @@
64
64
  - Maintain dependency order and blocker/circuit-breaker state.
65
65
  - Publish truthful `STATUS.md` and schema-valid handoffs.
66
66
  - Route work to the next role with bounded scope.
67
+ - Keep scheduler flow healthy for deferred/gated work (`enqueue_job`, `run_scheduler_tick`, lease ownership checks).
67
68
 
68
69
  **Required evidence**
69
70
 
70
71
  - Updated `STATUS.md` with active phase, blockers, and next action.
71
72
  - Updated `HANDOFF.json` (or SWARM handoff payload) with evidence anchors.
72
73
  - Blocker transitions captured in `EVIDENCE_LOG.md`.
74
+ - Scheduler evidence when applicable (`agent-state/job-queue.json`, `agent-state/job-reservations.json`, `agent-state/scheduler-lease.json`).
73
75
 
74
76
  ## ACE-Research Task Pack
75
77
 
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Shared role adapter engine for worker implementations.
3
+ *
4
+ * This module is transport-agnostic so both TUI and non-TUI workers can reuse
5
+ * the same role-intent planning behavior.
6
+ */
7
+ export type AdapterDomain = "venture" | "ux" | "engineering" | "mixed" | "research";
8
+ export interface ToolIntent {
9
+ tool: string;
10
+ args: Record<string, unknown>;
11
+ }
12
+ export interface HandoffIntent {
13
+ from: string;
14
+ to: string;
15
+ payload: Record<string, unknown>;
16
+ }
17
+ export interface AdapterDecision {
18
+ toolCalls: ToolIntent[];
19
+ handoffs: HandoffIntent[];
20
+ notes: string[];
21
+ }
22
+ export declare function inferDomain(input: string): AdapterDomain;
23
+ export declare function parseManualHandoffCommand(input: string): HandoffIntent | undefined;
24
+ export declare function parseManualToolCommand(input: string): ToolIntent | undefined;
25
+ export declare function planRoleExecution(roleValue: string, input: string): AdapterDecision;
26
+ //# sourceMappingURL=role-adapters.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"role-adapters.d.ts","sourceRoot":"","sources":["../../src/agent-runtime/role-adapters.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,MAAM,aAAa,GAAG,SAAS,GAAG,IAAI,GAAG,aAAa,GAAG,OAAO,GAAG,UAAU,CAAC;AAIpF,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC/B;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAClC;AAED,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,UAAU,EAAE,CAAC;IACxB,QAAQ,EAAE,aAAa,EAAE,CAAC;IAC1B,KAAK,EAAE,MAAM,EAAE,CAAC;CACjB;AAuCD,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,aAAa,CAgDxD;AA8BD,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,MAAM,GAAG,aAAa,GAAG,SAAS,CAclF;AAED,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,MAAM,GAAG,UAAU,GAAG,SAAS,CAiB5E;AA2DD,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,eAAe,CAsQnF"}
@@ -0,0 +1,450 @@
1
+ /**
2
+ * Shared role adapter engine for worker implementations.
3
+ *
4
+ * This module is transport-agnostic so both TUI and non-TUI workers can reuse
5
+ * the same role-intent planning behavior.
6
+ */
7
+ const KNOWN_ROLES = [
8
+ "orchestrator",
9
+ "vos",
10
+ "ui",
11
+ "coders",
12
+ "astgrep",
13
+ "skeptic",
14
+ "ops",
15
+ "research",
16
+ "spec",
17
+ "builder",
18
+ "qa",
19
+ "docs",
20
+ "memory",
21
+ "security",
22
+ "observability",
23
+ "eval",
24
+ "release",
25
+ ];
26
+ const KNOWN_ROLE_SET = new Set(KNOWN_ROLES);
27
+ const ROLE_PATTERN = new RegExp(`\\b(?:agent[-\\s]?)?(${KNOWN_ROLES.join("|")})\\b`, "i");
28
+ function canonicalizeRole(input) {
29
+ const value = input.trim().toLowerCase().replace(/^agent-/, "");
30
+ return value || "unknown";
31
+ }
32
+ function includeAny(text, needles) {
33
+ return needles.some((needle) => text.includes(needle));
34
+ }
35
+ function truncate(input, max) {
36
+ if (input.length <= max)
37
+ return input;
38
+ const clipped = input.slice(0, Math.max(0, max - 3)).trimEnd();
39
+ return `${clipped}...`;
40
+ }
41
+ export function inferDomain(input) {
42
+ const text = input.toLowerCase();
43
+ if (includeAny(text, ["ux", "ui", "design", "layout", "visual", "tui"])) {
44
+ return "ux";
45
+ }
46
+ if (includeAny(text, [
47
+ "build",
48
+ "code",
49
+ "test",
50
+ "debug",
51
+ "fix",
52
+ "bug",
53
+ "compile",
54
+ "deploy",
55
+ "engineer",
56
+ ])) {
57
+ return "engineering";
58
+ }
59
+ if (includeAny(text, [
60
+ "market",
61
+ "pricing",
62
+ "thesis",
63
+ "growth",
64
+ "revenue",
65
+ "venture",
66
+ "business",
67
+ "fund",
68
+ ])) {
69
+ return "venture";
70
+ }
71
+ if (includeAny(text, [
72
+ "research",
73
+ "evidence",
74
+ "source",
75
+ "hypothesis",
76
+ "assumption",
77
+ "unknown",
78
+ "literature",
79
+ ])) {
80
+ return "research";
81
+ }
82
+ return "mixed";
83
+ }
84
+ function inferPriority(input) {
85
+ const text = input.toLowerCase();
86
+ if (includeAny(text, ["p0", "urgent", "critical", "asap", "immediately"])) {
87
+ return "P0";
88
+ }
89
+ if (includeAny(text, ["p1", "high", "soon", "priority"])) {
90
+ return "P1";
91
+ }
92
+ return "P2";
93
+ }
94
+ function normalizeRoleTarget(input) {
95
+ if (!input)
96
+ return undefined;
97
+ const raw = input.trim().toLowerCase().replace(/^agent-/, "").replace(/[^a-z]/g, "");
98
+ if (!raw)
99
+ return undefined;
100
+ return KNOWN_ROLE_SET.has(raw) ? raw : undefined;
101
+ }
102
+ function extractTargetRole(input) {
103
+ const text = input.toLowerCase();
104
+ const explicit = text.match(/\b(?:to|into|for)\s+(?:agent[-\s]?)?([a-z-]+)\b/i)?.[1];
105
+ const normalizedExplicit = normalizeRoleTarget(explicit);
106
+ if (normalizedExplicit)
107
+ return normalizedExplicit;
108
+ const anyRole = text.match(ROLE_PATTERN)?.[1];
109
+ return normalizeRoleTarget(anyRole);
110
+ }
111
+ export function parseManualHandoffCommand(input) {
112
+ if (!input.toLowerCase().startsWith("handoff "))
113
+ return undefined;
114
+ const [, fromRaw, toRaw, ...rest] = input.split(/\s+/);
115
+ const from = normalizeRoleTarget(fromRaw);
116
+ const to = normalizeRoleTarget(toRaw);
117
+ if (!from || !to)
118
+ return undefined;
119
+ return {
120
+ from,
121
+ to,
122
+ payload: {
123
+ reason: rest.join(" ") || "manual handoff request from worker input",
124
+ mode: "manual",
125
+ },
126
+ };
127
+ }
128
+ export function parseManualToolCommand(input) {
129
+ if (!input.toLowerCase().startsWith("tool "))
130
+ return undefined;
131
+ const [, tool, ...argsParts] = input.split(/\s+/);
132
+ if (!tool)
133
+ return undefined;
134
+ const rawArg = argsParts.join(" ").trim();
135
+ if (!rawArg)
136
+ return { tool, args: {} };
137
+ if (rawArg.startsWith("{")) {
138
+ try {
139
+ const parsed = JSON.parse(rawArg);
140
+ if (parsed && typeof parsed === "object" && !Array.isArray(parsed)) {
141
+ return { tool, args: parsed };
142
+ }
143
+ }
144
+ catch {
145
+ // Fall through to raw payload.
146
+ }
147
+ }
148
+ return { tool, args: { raw: rawArg } };
149
+ }
150
+ function asHandoffTaskType(domain) {
151
+ if (domain === "venture" || domain === "ux" || domain === "engineering") {
152
+ return domain;
153
+ }
154
+ return "mixed";
155
+ }
156
+ function dedupeToolIntents(calls) {
157
+ const seen = new Set();
158
+ const out = [];
159
+ for (const call of calls) {
160
+ const key = `${call.tool}:${JSON.stringify(call.args)}`;
161
+ if (seen.has(key))
162
+ continue;
163
+ seen.add(key);
164
+ out.push(call);
165
+ if (out.length >= 4)
166
+ break;
167
+ }
168
+ return out;
169
+ }
170
+ function dedupeHandoffIntents(handoffs) {
171
+ const seen = new Set();
172
+ const out = [];
173
+ for (const handoff of handoffs) {
174
+ const key = `${handoff.from}->${handoff.to}:${JSON.stringify(handoff.payload)}`;
175
+ if (seen.has(key))
176
+ continue;
177
+ seen.add(key);
178
+ out.push(handoff);
179
+ if (out.length >= 2)
180
+ break;
181
+ }
182
+ return out;
183
+ }
184
+ function buildCreateHandoffIntent(fromRole, toRole, input) {
185
+ const from = normalizeRoleTarget(fromRole) ?? "orchestrator";
186
+ const to = normalizeRoleTarget(toRole) ?? "ops";
187
+ const domain = inferDomain(input);
188
+ const taskType = asHandoffTaskType(domain);
189
+ const priority = inferPriority(input);
190
+ const summary = truncate(input, 96);
191
+ return {
192
+ tool: "create_handoff",
193
+ args: {
194
+ from,
195
+ to,
196
+ title: `Worker dispatch: ${truncate(summary, 64)}`,
197
+ task_type: taskType,
198
+ priority,
199
+ directive: input,
200
+ acceptance_criteria: [
201
+ `Execute delegated objective: ${summary}`,
202
+ "Return completion status with evidence references.",
203
+ ],
204
+ },
205
+ };
206
+ }
207
+ export function planRoleExecution(roleValue, input) {
208
+ const normalizedRole = canonicalizeRole(roleValue);
209
+ const text = input.toLowerCase();
210
+ const domain = inferDomain(input);
211
+ const toolCalls = [];
212
+ const handoffs = [];
213
+ const notes = [];
214
+ const dispatchRequested = includeAny(text, [
215
+ "handoff",
216
+ "delegate",
217
+ "route to",
218
+ "dispatch",
219
+ "assign to",
220
+ ]);
221
+ const targetRole = extractTargetRole(input);
222
+ switch (normalizedRole) {
223
+ case "orchestrator": {
224
+ toolCalls.push({ tool: "route_task", args: { description: input, domain } });
225
+ if (includeAny(text, ["scheduler", "queue", "tick", "reservation"])) {
226
+ toolCalls.push({ tool: "run_scheduler_tick", args: {} });
227
+ toolCalls.push({ tool: "list_jobs", args: { limit: 20 } });
228
+ }
229
+ if (includeAny(text, ["framework", "state", "status", "health"])) {
230
+ toolCalls.push({ tool: "get_framework_status", args: {} });
231
+ }
232
+ if (dispatchRequested && targetRole && targetRole !== normalizedRole) {
233
+ toolCalls.push(buildCreateHandoffIntent(normalizedRole, targetRole, input));
234
+ handoffs.push({
235
+ from: normalizedRole,
236
+ to: targetRole,
237
+ payload: { reason: truncate(input, 180), mode: "adapter" },
238
+ });
239
+ }
240
+ break;
241
+ }
242
+ case "vos": {
243
+ toolCalls.push({ tool: "get_task_pack", args: { role: "vos" } });
244
+ toolCalls.push({ tool: "route_task", args: { description: input, domain: "venture" } });
245
+ if (dispatchRequested && targetRole && targetRole !== normalizedRole) {
246
+ toolCalls.push(buildCreateHandoffIntent(normalizedRole, targetRole, input));
247
+ handoffs.push({ from: normalizedRole, to: targetRole, payload: { reason: input, mode: "adapter" } });
248
+ }
249
+ break;
250
+ }
251
+ case "ui": {
252
+ toolCalls.push({ tool: "get_task_pack", args: { role: "ui" } });
253
+ toolCalls.push({ tool: "route_task", args: { description: input, domain: "ux" } });
254
+ if (includeAny(text, ["test", "qa", "verify"])) {
255
+ toolCalls.push({ tool: "run_tests", args: {} });
256
+ }
257
+ if (dispatchRequested && targetRole && targetRole !== normalizedRole) {
258
+ toolCalls.push(buildCreateHandoffIntent(normalizedRole, targetRole, input));
259
+ handoffs.push({ from: normalizedRole, to: targetRole, payload: { reason: input, mode: "adapter" } });
260
+ }
261
+ break;
262
+ }
263
+ case "coders": {
264
+ toolCalls.push({ tool: "get_task_pack", args: { role: "coders" } });
265
+ if (includeAny(text, ["test", "regression", "verify", "suite"])) {
266
+ toolCalls.push({ tool: "run_tests", args: {} });
267
+ }
268
+ if (includeAny(text, ["gate", "criteria", "quality"])) {
269
+ toolCalls.push({ tool: "execute_gates", args: {} });
270
+ }
271
+ if (includeAny(text, ["diff", "patch", "changes"])) {
272
+ toolCalls.push({ tool: "git_diff", args: {} });
273
+ }
274
+ if (dispatchRequested && targetRole && targetRole !== normalizedRole) {
275
+ toolCalls.push(buildCreateHandoffIntent(normalizedRole, targetRole, input));
276
+ handoffs.push({ from: normalizedRole, to: targetRole, payload: { reason: input, mode: "adapter" } });
277
+ }
278
+ break;
279
+ }
280
+ case "astgrep": {
281
+ toolCalls.push({ tool: "refresh_astgrep_index", args: {} });
282
+ if (includeAny(text, ["scan", "delta", "workspace", "changed", "index"])) {
283
+ toolCalls.push({ tool: "scan_workspace_delta", args: {} });
284
+ }
285
+ break;
286
+ }
287
+ case "skeptic": {
288
+ toolCalls.push({ tool: "execute_gates", args: {} });
289
+ if (includeAny(text, ["risk", "blocker", "unsafe", "halt", "critical"])) {
290
+ toolCalls.push({
291
+ tool: "open_circuit_breaker",
292
+ args: { reason: `skeptic flagged: ${truncate(input, 160)}` },
293
+ });
294
+ }
295
+ break;
296
+ }
297
+ case "ops": {
298
+ toolCalls.push({ tool: "list_jobs", args: { limit: 20 } });
299
+ toolCalls.push({
300
+ tool: "emit_status_event",
301
+ args: {
302
+ source_module: "capability-ops",
303
+ event_type: "WORKER_INPUT",
304
+ status: "in_progress",
305
+ summary: truncate(input, 140),
306
+ },
307
+ });
308
+ if (includeAny(text, ["tick", "schedule", "reservation"])) {
309
+ toolCalls.push({ tool: "run_scheduler_tick", args: {} });
310
+ }
311
+ if (includeAny(text, ["lease"])) {
312
+ toolCalls.push({ tool: "get_scheduler_lease", args: {} });
313
+ }
314
+ if (includeAny(text, ["todo", "task"])) {
315
+ toolCalls.push({ tool: "get_todo_state", args: {} });
316
+ }
317
+ if (dispatchRequested && targetRole && targetRole !== normalizedRole) {
318
+ toolCalls.push(buildCreateHandoffIntent(normalizedRole, targetRole, input));
319
+ handoffs.push({ from: normalizedRole, to: targetRole, payload: { reason: input, mode: "adapter" } });
320
+ }
321
+ break;
322
+ }
323
+ case "research": {
324
+ toolCalls.push({ tool: "route_task", args: { description: input, domain: "research" } });
325
+ if (includeAny(text, ["skill", "pattern", "approach"])) {
326
+ toolCalls.push({ tool: "list_skills", args: {} });
327
+ }
328
+ if (includeAny(text, ["assumption", "hypothesis", "unknown", "gap"])) {
329
+ toolCalls.push({
330
+ tool: "context_snapshot",
331
+ args: {
332
+ name: `research-${Date.now()}`,
333
+ summary: truncate(input, 140),
334
+ },
335
+ });
336
+ }
337
+ break;
338
+ }
339
+ case "spec": {
340
+ toolCalls.push({ tool: "get_task_pack", args: { role: "spec" } });
341
+ if (includeAny(text, ["schema", "contract", "interface", "validate"])) {
342
+ toolCalls.push({ tool: "validate_framework", args: {} });
343
+ }
344
+ if (includeAny(text, ["handoff", "payload"])) {
345
+ toolCalls.push({ tool: "get_handoff_template", args: {} });
346
+ }
347
+ break;
348
+ }
349
+ case "builder": {
350
+ toolCalls.push({ tool: "get_task_pack", args: { role: "builder" } });
351
+ if (includeAny(text, ["build", "implement", "fix", "test"])) {
352
+ toolCalls.push({ tool: "run_tests", args: {} });
353
+ }
354
+ if (includeAny(text, ["diff", "changes", "patch"])) {
355
+ toolCalls.push({ tool: "git_diff", args: {} });
356
+ }
357
+ break;
358
+ }
359
+ case "qa": {
360
+ toolCalls.push({ tool: "run_tests", args: {} });
361
+ toolCalls.push({ tool: "execute_gates", args: {} });
362
+ if (includeAny(text, ["status", "trace", "event", "regression"])) {
363
+ toolCalls.push({ tool: "list_status_events", args: { limit: 25 } });
364
+ }
365
+ break;
366
+ }
367
+ case "docs": {
368
+ toolCalls.push({ tool: "get_task_pack", args: { role: "docs" } });
369
+ if (includeAny(text, ["kanban", "board"])) {
370
+ toolCalls.push({ tool: "generate_kanban_ui", args: {} });
371
+ }
372
+ if (includeAny(text, ["readme", "docs", "guide", "documentation"])) {
373
+ toolCalls.push({ tool: "get_run_ledger", args: {} });
374
+ }
375
+ break;
376
+ }
377
+ case "memory": {
378
+ toolCalls.push({ tool: "recall_context", args: {} });
379
+ if (includeAny(text, ["snapshot", "remember", "save", "capture", "context"])) {
380
+ toolCalls.push({
381
+ tool: "context_snapshot",
382
+ args: {
383
+ name: `memory-${Date.now()}`,
384
+ summary: truncate(input, 140),
385
+ },
386
+ });
387
+ }
388
+ if (includeAny(text, ["lesson", "guardrail", "failure"])) {
389
+ toolCalls.push({ tool: "get_lessons", args: {} });
390
+ }
391
+ break;
392
+ }
393
+ case "security": {
394
+ toolCalls.push({ tool: "execute_gates", args: {} });
395
+ toolCalls.push({ tool: "validate_framework", args: {} });
396
+ if (includeAny(text, ["breach", "vulnerability", "exploit", "critical", "risk"])) {
397
+ toolCalls.push({
398
+ tool: "open_circuit_breaker",
399
+ args: { reason: `security escalation: ${truncate(input, 160)}` },
400
+ });
401
+ }
402
+ if (includeAny(text, ["resolved", "mitigated", "resume", "unblock"])) {
403
+ toolCalls.push({
404
+ tool: "close_circuit_breaker",
405
+ args: { reason: `security clear: ${truncate(input, 160)}` },
406
+ });
407
+ }
408
+ break;
409
+ }
410
+ case "observability": {
411
+ toolCalls.push({ tool: "list_status_events", args: { limit: 50 } });
412
+ if (includeAny(text, ["ledger", "history", "trend"])) {
413
+ toolCalls.push({ tool: "get_run_ledger", args: {} });
414
+ }
415
+ if (includeAny(text, ["scheduler", "lease"])) {
416
+ toolCalls.push({ tool: "get_scheduler_lease", args: {} });
417
+ }
418
+ break;
419
+ }
420
+ case "eval": {
421
+ toolCalls.push({ tool: "run_tests", args: {} });
422
+ toolCalls.push({ tool: "execute_gates", args: {} });
423
+ if (includeAny(text, ["framework", "drift", "integrity", "validate"])) {
424
+ toolCalls.push({ tool: "validate_framework", args: {} });
425
+ }
426
+ break;
427
+ }
428
+ case "release": {
429
+ toolCalls.push({ tool: "git_status", args: {} });
430
+ toolCalls.push({ tool: "execute_gates", args: {} });
431
+ if (includeAny(text, ["log", "history", "changelog"])) {
432
+ toolCalls.push({ tool: "git_log", args: { limit: 20 } });
433
+ }
434
+ if (includeAny(text, ["validate", "framework", "check"])) {
435
+ toolCalls.push({ tool: "validate_framework", args: {} });
436
+ }
437
+ break;
438
+ }
439
+ default: {
440
+ toolCalls.push({ tool: "route_task", args: { description: input, domain } });
441
+ notes.push(`No role adapter profile for "${normalizedRole}", defaulted to route_task.`);
442
+ }
443
+ }
444
+ return {
445
+ toolCalls: dedupeToolIntents(toolCalls),
446
+ handoffs: dedupeHandoffIntents(handoffs),
447
+ notes,
448
+ };
449
+ }
450
+ //# sourceMappingURL=role-adapters.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"role-adapters.js","sourceRoot":"","sources":["../../src/agent-runtime/role-adapters.ts"],"names":[],"mappings":"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"}