@cleocode/core 2026.3.58 → 2026.3.60

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 (153) hide show
  1. package/dist/agents/agent-registry.d.ts +206 -0
  2. package/dist/agents/agent-registry.d.ts.map +1 -0
  3. package/dist/agents/agent-registry.js +288 -0
  4. package/dist/agents/agent-registry.js.map +1 -0
  5. package/dist/agents/agent-schema.js +5 -0
  6. package/dist/agents/agent-schema.js.map +1 -1
  7. package/dist/agents/execution-learning.js +474 -0
  8. package/dist/agents/execution-learning.js.map +1 -0
  9. package/dist/agents/health-monitor.d.ts +161 -0
  10. package/dist/agents/health-monitor.d.ts.map +1 -0
  11. package/dist/agents/health-monitor.js +217 -0
  12. package/dist/agents/health-monitor.js.map +1 -0
  13. package/dist/agents/index.d.ts +3 -1
  14. package/dist/agents/index.d.ts.map +1 -1
  15. package/dist/agents/index.js +9 -1
  16. package/dist/agents/index.js.map +1 -1
  17. package/dist/agents/retry.d.ts +57 -4
  18. package/dist/agents/retry.d.ts.map +1 -1
  19. package/dist/agents/retry.js +57 -4
  20. package/dist/agents/retry.js.map +1 -1
  21. package/dist/backfill/index.d.ts +27 -0
  22. package/dist/backfill/index.d.ts.map +1 -1
  23. package/dist/backfill/index.js +229 -0
  24. package/dist/backfill/index.js.map +1 -0
  25. package/dist/bootstrap.d.ts +2 -1
  26. package/dist/bootstrap.d.ts.map +1 -1
  27. package/dist/bootstrap.js +135 -28
  28. package/dist/bootstrap.js.map +1 -1
  29. package/dist/cleo.d.ts +40 -0
  30. package/dist/cleo.d.ts.map +1 -1
  31. package/dist/config.js +83 -0
  32. package/dist/config.js.map +1 -1
  33. package/dist/index.d.ts +1 -0
  34. package/dist/index.d.ts.map +1 -1
  35. package/dist/index.js +1036 -536
  36. package/dist/index.js.map +4 -4
  37. package/dist/intelligence/adaptive-validation.js +497 -0
  38. package/dist/intelligence/adaptive-validation.js.map +1 -0
  39. package/dist/intelligence/impact.d.ts +34 -1
  40. package/dist/intelligence/impact.d.ts.map +1 -1
  41. package/dist/intelligence/impact.js +176 -0
  42. package/dist/intelligence/impact.js.map +1 -1
  43. package/dist/intelligence/index.d.ts +2 -2
  44. package/dist/intelligence/index.d.ts.map +1 -1
  45. package/dist/intelligence/index.js +6 -1
  46. package/dist/intelligence/index.js.map +1 -1
  47. package/dist/intelligence/types.d.ts +60 -0
  48. package/dist/intelligence/types.d.ts.map +1 -1
  49. package/dist/internal.d.ts +5 -4
  50. package/dist/internal.d.ts.map +1 -1
  51. package/dist/internal.js +11 -2
  52. package/dist/internal.js.map +1 -1
  53. package/dist/lib/index.d.ts +10 -0
  54. package/dist/lib/index.d.ts.map +1 -0
  55. package/dist/lib/index.js +10 -0
  56. package/dist/lib/index.js.map +1 -0
  57. package/dist/lib/retry.d.ts +128 -0
  58. package/dist/lib/retry.d.ts.map +1 -0
  59. package/dist/lib/retry.js +152 -0
  60. package/dist/lib/retry.js.map +1 -0
  61. package/dist/nexus/sharing/index.d.ts +48 -2
  62. package/dist/nexus/sharing/index.d.ts.map +1 -1
  63. package/dist/nexus/sharing/index.js +110 -1
  64. package/dist/nexus/sharing/index.js.map +1 -1
  65. package/dist/scaffold.d.ts.map +1 -1
  66. package/dist/scaffold.js +22 -2
  67. package/dist/scaffold.js.map +1 -1
  68. package/dist/sessions/session-enforcement.js +4 -0
  69. package/dist/sessions/session-enforcement.js.map +1 -1
  70. package/dist/stats/index.js +2 -0
  71. package/dist/stats/index.js.map +1 -1
  72. package/dist/stats/workflow-telemetry.d.ts +15 -0
  73. package/dist/stats/workflow-telemetry.d.ts.map +1 -1
  74. package/dist/stats/workflow-telemetry.js +400 -0
  75. package/dist/stats/workflow-telemetry.js.map +1 -0
  76. package/dist/store/brain-schema.js +4 -1
  77. package/dist/store/brain-schema.js.map +1 -1
  78. package/dist/store/converters.js +2 -0
  79. package/dist/store/converters.js.map +1 -1
  80. package/dist/store/cross-db-cleanup.d.ts +35 -0
  81. package/dist/store/cross-db-cleanup.d.ts.map +1 -1
  82. package/dist/store/cross-db-cleanup.js +169 -0
  83. package/dist/store/cross-db-cleanup.js.map +1 -0
  84. package/dist/store/db-helpers.js +2 -0
  85. package/dist/store/db-helpers.js.map +1 -1
  86. package/dist/store/migration-sqlite.js +5 -0
  87. package/dist/store/migration-sqlite.js.map +1 -1
  88. package/dist/store/sqlite-data-accessor.js +20 -28
  89. package/dist/store/sqlite-data-accessor.js.map +1 -1
  90. package/dist/store/sqlite.js +13 -2
  91. package/dist/store/sqlite.js.map +1 -1
  92. package/dist/store/task-store.js +4 -0
  93. package/dist/store/task-store.js.map +1 -1
  94. package/dist/store/tasks-schema.js +50 -20
  95. package/dist/store/tasks-schema.js.map +1 -1
  96. package/dist/tasks/add.js +87 -3
  97. package/dist/tasks/add.js.map +1 -1
  98. package/dist/tasks/complete.d.ts.map +1 -1
  99. package/dist/tasks/complete.js +15 -4
  100. package/dist/tasks/complete.js.map +1 -1
  101. package/dist/tasks/enforcement.d.ts.map +1 -1
  102. package/dist/tasks/enforcement.js +8 -1
  103. package/dist/tasks/enforcement.js.map +1 -1
  104. package/dist/tasks/epic-enforcement.d.ts +61 -0
  105. package/dist/tasks/epic-enforcement.d.ts.map +1 -1
  106. package/dist/tasks/epic-enforcement.js +294 -0
  107. package/dist/tasks/epic-enforcement.js.map +1 -0
  108. package/dist/tasks/index.js +1 -1
  109. package/dist/tasks/index.js.map +1 -1
  110. package/dist/tasks/pipeline-stage.d.ts +70 -1
  111. package/dist/tasks/pipeline-stage.d.ts.map +1 -1
  112. package/dist/tasks/pipeline-stage.js +248 -0
  113. package/dist/tasks/pipeline-stage.js.map +1 -0
  114. package/dist/tasks/update.js +28 -0
  115. package/dist/tasks/update.js.map +1 -1
  116. package/package.json +5 -5
  117. package/schemas/config.schema.json +37 -1547
  118. package/src/__tests__/sharing.test.ts +24 -0
  119. package/src/agents/__tests__/agent-registry.test.ts +351 -0
  120. package/src/agents/__tests__/health-monitor.test.ts +332 -0
  121. package/src/agents/agent-registry.ts +394 -0
  122. package/src/agents/health-monitor.ts +279 -0
  123. package/src/agents/index.ts +24 -1
  124. package/src/agents/retry.ts +57 -4
  125. package/src/backfill/index.ts +27 -0
  126. package/src/bootstrap.ts +171 -30
  127. package/src/cleo.ts +103 -2
  128. package/src/config.ts +3 -3
  129. package/src/index.ts +1 -0
  130. package/src/intelligence/__tests__/impact.test.ts +165 -1
  131. package/src/intelligence/impact.ts +203 -0
  132. package/src/intelligence/index.ts +3 -0
  133. package/src/intelligence/types.ts +76 -0
  134. package/src/internal.ts +20 -0
  135. package/src/lib/__tests__/retry.test.ts +321 -0
  136. package/src/lib/index.ts +16 -0
  137. package/src/lib/retry.ts +224 -0
  138. package/src/nexus/sharing/index.ts +142 -2
  139. package/src/scaffold.ts +24 -2
  140. package/src/stats/workflow-telemetry.ts +15 -0
  141. package/src/store/__tests__/session-store.test.ts +43 -7
  142. package/src/store/__tests__/task-store.test.ts +1 -1
  143. package/src/store/__tests__/test-db-helper.ts +7 -3
  144. package/src/store/cross-db-cleanup.ts +35 -0
  145. package/src/tasks/__tests__/epic-enforcement.test.ts +9 -4
  146. package/src/tasks/__tests__/minimal-test.test.ts +2 -2
  147. package/src/tasks/__tests__/update.test.ts +25 -25
  148. package/src/tasks/complete.ts +11 -6
  149. package/src/tasks/enforcement.ts +6 -3
  150. package/src/tasks/epic-enforcement.ts +61 -0
  151. package/src/tasks/pipeline-stage.ts +70 -1
  152. package/templates/config.template.json +5 -116
  153. package/templates/global-config.template.json +2 -44
@@ -0,0 +1,206 @@
1
+ /**
2
+ * Agent registry with capacity tracking for load balancing.
3
+ *
4
+ * Provides task-count-based capacity queries, specialization lookup,
5
+ * and performance recording on top of the existing `agent_instances` schema.
6
+ *
7
+ * Capacity model: each agent has a maximum of {@link MAX_TASKS_PER_AGENT}
8
+ * concurrent tasks. "Remaining capacity" is that constant minus the number of
9
+ * tasks currently assigned to an active agent instance.
10
+ *
11
+ * Specializations are stored as a `specializations` array inside the agent's
12
+ * `metadata_json` column. Use {@link updateAgentSpecializations} to write them.
13
+ *
14
+ * Performance recording delegates to the existing `recordAgentExecution`
15
+ * function in `execution-learning.ts` and wraps it with a simpler metrics
16
+ * interface suited for load-balancer callers.
17
+ *
18
+ * @module agents/agent-registry
19
+ * @task T041
20
+ * @epic T038
21
+ */
22
+ import { type AgentInstanceRow, type AgentType } from './agent-schema.js';
23
+ import { type AgentExecutionOutcome } from './execution-learning.js';
24
+ /**
25
+ * Maximum number of tasks that can be concurrently assigned to one agent.
26
+ * Used as the upper bound for task-count-based capacity calculation.
27
+ */
28
+ export declare const MAX_TASKS_PER_AGENT = 5;
29
+ /**
30
+ * Task-count-based capacity for a single agent instance.
31
+ */
32
+ export interface AgentCapacity {
33
+ /** Agent instance ID. */
34
+ agentId: string;
35
+ /** Agent type classification. */
36
+ agentType: AgentType;
37
+ /** Current status of the agent. */
38
+ status: AgentInstanceRow['status'];
39
+ /** Number of tasks currently assigned to this agent. */
40
+ activeTasks: number;
41
+ /** Number of additional tasks this agent can accept (max - active). */
42
+ remainingCapacity: number;
43
+ /** Maximum tasks this agent can hold ({@link MAX_TASKS_PER_AGENT}). */
44
+ maxCapacity: number;
45
+ /** Whether this agent can accept new tasks. */
46
+ available: boolean;
47
+ }
48
+ /**
49
+ * Metrics provided when recording agent performance.
50
+ */
51
+ export interface AgentPerformanceMetrics {
52
+ /** Task ID that was processed. */
53
+ taskId: string;
54
+ /** Task type label (e.g. "epic", "task", "subtask"). */
55
+ taskType: string;
56
+ /** Outcome of the agent's work on the task. */
57
+ outcome: AgentExecutionOutcome;
58
+ /** Optional task labels for richer pattern classification. */
59
+ taskLabels?: string[];
60
+ /** Session ID the agent was operating under. */
61
+ sessionId?: string;
62
+ /** Duration of execution in milliseconds. */
63
+ durationMs?: number;
64
+ /** Error message if outcome is "failure". */
65
+ errorMessage?: string;
66
+ /** Error classification if outcome is "failure". */
67
+ errorType?: 'retriable' | 'permanent' | 'unknown';
68
+ }
69
+ /**
70
+ * Get task-count-based remaining capacity for an agent.
71
+ *
72
+ * Remaining capacity = {@link MAX_TASKS_PER_AGENT} minus the number of tasks
73
+ * currently routed to this agent instance (tracked via the `task_id` column
74
+ * on `agent_instances` — each instance handles one task at a time; child agents
75
+ * spawned by an orchestrator appear as sibling rows referencing the same
76
+ * `parent_agent_id`).
77
+ *
78
+ * For capacity purposes the "active tasks" count is derived from the number of
79
+ * non-terminal sibling rows that share the same `parent_agent_id` as this
80
+ * agent, plus 1 for the agent's own current task when `task_id` is set.
81
+ *
82
+ * @remarks
83
+ * Agents in terminal states (`stopped`, `crashed`) always return 0 remaining
84
+ * capacity because they cannot accept work.
85
+ *
86
+ * @param agentId - Agent instance ID (agt_...) to check
87
+ * @param cwd - Working directory used to resolve tasks.db path
88
+ * @returns Capacity breakdown or null if the agent does not exist
89
+ *
90
+ * @example
91
+ * ```ts
92
+ * const cap = await getAgentCapacity('agt_20260321120000_ab12cd', '/project');
93
+ * if (cap && cap.available) {
94
+ * console.log(`Agent can take ${cap.remainingCapacity} more tasks`);
95
+ * }
96
+ * ```
97
+ */
98
+ export declare function getAgentCapacity(agentId: string, cwd?: string): Promise<AgentCapacity | null>;
99
+ /**
100
+ * List all non-terminal agents sorted by remaining task capacity (descending).
101
+ *
102
+ * Returns agents with the most available slots first, enabling callers to
103
+ * select the least-loaded agent for new work assignment.
104
+ *
105
+ * @remarks
106
+ * Only agents in `active` or `idle` states are included — `starting` agents
107
+ * are excluded because they may not yet be ready to accept work.
108
+ * Terminal agents (`stopped`, `crashed`) are always omitted.
109
+ *
110
+ * @param agentType - Optional filter to limit results to one agent type
111
+ * @param cwd - Working directory used to resolve tasks.db path
112
+ * @returns Array of capacity entries sorted highest remaining capacity first
113
+ *
114
+ * @example
115
+ * ```ts
116
+ * const agents = await getAgentsByCapacity('executor', '/project');
117
+ * const best = agents[0]; // most available slots
118
+ * if (best && best.available) {
119
+ * await assignTask(best.agentId, taskId);
120
+ * }
121
+ * ```
122
+ */
123
+ export declare function getAgentsByCapacity(agentType?: AgentType, cwd?: string): Promise<AgentCapacity[]>;
124
+ /**
125
+ * Get the specialization/skills list for an agent.
126
+ *
127
+ * Specializations are stored as a string array under the `specializations`
128
+ * key in the agent's `metadata_json` column. An empty array is returned when
129
+ * the field is absent or the agent is not found.
130
+ *
131
+ * @remarks
132
+ * Write specializations with {@link updateAgentSpecializations} when
133
+ * registering or updating an agent. The metadata column is a free-form JSON
134
+ * blob — specializations are one namespaced key inside it.
135
+ *
136
+ * @param agentId - Agent instance ID (agt_...)
137
+ * @param cwd - Working directory used to resolve tasks.db path
138
+ * @returns Array of specialization strings (empty if none recorded)
139
+ *
140
+ * @example
141
+ * ```ts
142
+ * const skills = await getAgentSpecializations('agt_20260321120000_ab12cd', '/project');
143
+ * // ['typescript', 'testing', 'documentation']
144
+ * if (skills.includes('typescript')) {
145
+ * console.log('Agent can handle TypeScript tasks');
146
+ * }
147
+ * ```
148
+ */
149
+ export declare function getAgentSpecializations(agentId: string, cwd?: string): Promise<string[]>;
150
+ /**
151
+ * Update the specializations list stored in an agent's metadata.
152
+ *
153
+ * Merges the new list into the existing `metadata_json` object, preserving
154
+ * any other keys already present. Returns the updated specializations list,
155
+ * or null if the agent was not found.
156
+ *
157
+ * @remarks
158
+ * This is a write-side companion to {@link getAgentSpecializations}. Call it
159
+ * after {@link registerAgent} to record the skills an agent was spawned with.
160
+ *
161
+ * @param agentId - Agent instance ID (agt_...)
162
+ * @param specializations - New specializations list (replaces existing)
163
+ * @param cwd - Working directory used to resolve tasks.db path
164
+ * @returns Updated specializations list, or null if agent not found
165
+ *
166
+ * @example
167
+ * ```ts
168
+ * await updateAgentSpecializations(
169
+ * 'agt_20260321120000_ab12cd',
170
+ * ['typescript', 'testing'],
171
+ * '/project',
172
+ * );
173
+ * ```
174
+ */
175
+ export declare function updateAgentSpecializations(agentId: string, specializations: string[], cwd?: string): Promise<string[] | null>;
176
+ /**
177
+ * Record agent performance metrics to the BRAIN execution history.
178
+ *
179
+ * Translates a simplified {@link AgentPerformanceMetrics} object into the
180
+ * {@link AgentExecutionEvent} format expected by `execution-learning.ts` and
181
+ * delegates to {@link recordAgentExecution}. The agent type is resolved from
182
+ * the `agent_instances` table so callers only need to supply the agent ID.
183
+ *
184
+ * @remarks
185
+ * Recording is best-effort — if brain.db is unavailable the error is swallowed
186
+ * and null is returned, consistent with the rest of the execution-learning
187
+ * module. Agent lifecycle code is never disrupted by a brain write failure.
188
+ *
189
+ * @param agentId - Agent instance ID whose performance is being recorded
190
+ * @param metrics - Performance metrics for the task that was processed
191
+ * @param cwd - Working directory used to resolve tasks.db and brain.db paths
192
+ * @returns The brain decision ID if recorded, null on failure or not found
193
+ *
194
+ * @example
195
+ * ```ts
196
+ * const decisionId = await recordAgentPerformance('agt_20260321120000_ab12cd', {
197
+ * taskId: 'T041',
198
+ * taskType: 'task',
199
+ * outcome: 'success',
200
+ * durationMs: 4200,
201
+ * sessionId: 'ses_20260321_abc',
202
+ * }, '/project');
203
+ * ```
204
+ */
205
+ export declare function recordAgentPerformance(agentId: string, metrics: AgentPerformanceMetrics, cwd?: string): Promise<string | null>;
206
+ //# sourceMappingURL=agent-registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-registry.d.ts","sourceRoot":"","sources":["../../src/agents/agent-registry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAIH,OAAO,EAAE,KAAK,gBAAgB,EAAE,KAAK,SAAS,EAAkB,MAAM,mBAAmB,CAAC;AAC1F,OAAO,EAEL,KAAK,qBAAqB,EAE3B,MAAM,yBAAyB,CAAC;AAOjC;;;GAGG;AACH,eAAO,MAAM,mBAAmB,IAAI,CAAC;AAMrC;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,yBAAyB;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,iCAAiC;IACjC,SAAS,EAAE,SAAS,CAAC;IACrB,mCAAmC;IACnC,MAAM,EAAE,gBAAgB,CAAC,QAAQ,CAAC,CAAC;IACnC,wDAAwD;IACxD,WAAW,EAAE,MAAM,CAAC;IACpB,uEAAuE;IACvE,iBAAiB,EAAE,MAAM,CAAC;IAC1B,uEAAuE;IACvE,WAAW,EAAE,MAAM,CAAC;IACpB,+CAA+C;IAC/C,SAAS,EAAE,OAAO,CAAC;CACpB;AAED;;GAEG;AACH,MAAM,WAAW,uBAAuB;IACtC,kCAAkC;IAClC,MAAM,EAAE,MAAM,CAAC;IACf,wDAAwD;IACxD,QAAQ,EAAE,MAAM,CAAC;IACjB,+CAA+C;IAC/C,OAAO,EAAE,qBAAqB,CAAC;IAC/B,8DAA8D;IAC9D,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,gDAAgD;IAChD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,6CAA6C;IAC7C,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,6CAA6C;IAC7C,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,oDAAoD;IACpD,SAAS,CAAC,EAAE,WAAW,GAAG,WAAW,GAAG,SAAS,CAAC;CACnD;AAMD;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,wBAAsB,gBAAgB,CACpC,OAAO,EAAE,MAAM,EACf,GAAG,CAAC,EAAE,MAAM,GACX,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC,CA+C/B;AAED;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAsB,mBAAmB,CACvC,SAAS,CAAC,EAAE,SAAS,EACrB,GAAG,CAAC,EAAE,MAAM,GACX,OAAO,CAAC,aAAa,EAAE,CAAC,CAc1B;AAiBD;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,wBAAsB,uBAAuB,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAkB9F;AAED;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,wBAAsB,0BAA0B,CAC9C,OAAO,EAAE,MAAM,EACf,eAAe,EAAE,MAAM,EAAE,EACzB,GAAG,CAAC,EAAE,MAAM,GACX,OAAO,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,CAwB1B;AAMD;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,wBAAsB,sBAAsB,CAC1C,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,uBAAuB,EAChC,GAAG,CAAC,EAAE,MAAM,GACX,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAyBxB"}
@@ -0,0 +1,288 @@
1
+ /**
2
+ * Agent registry with capacity tracking for load balancing.
3
+ *
4
+ * Provides task-count-based capacity queries, specialization lookup,
5
+ * and performance recording on top of the existing `agent_instances` schema.
6
+ *
7
+ * Capacity model: each agent has a maximum of {@link MAX_TASKS_PER_AGENT}
8
+ * concurrent tasks. "Remaining capacity" is that constant minus the number of
9
+ * tasks currently assigned to an active agent instance.
10
+ *
11
+ * Specializations are stored as a `specializations` array inside the agent's
12
+ * `metadata_json` column. Use {@link updateAgentSpecializations} to write them.
13
+ *
14
+ * Performance recording delegates to the existing `recordAgentExecution`
15
+ * function in `execution-learning.ts` and wraps it with a simpler metrics
16
+ * interface suited for load-balancer callers.
17
+ *
18
+ * @module agents/agent-registry
19
+ * @task T041
20
+ * @epic T038
21
+ */
22
+ import { and, eq, inArray } from 'drizzle-orm';
23
+ import { getDb } from '../store/sqlite.js';
24
+ import { agentInstances } from './agent-schema.js';
25
+ import { recordAgentExecution, } from './execution-learning.js';
26
+ import { listAgentInstances } from './registry.js';
27
+ // ============================================================================
28
+ // Constants
29
+ // ============================================================================
30
+ /**
31
+ * Maximum number of tasks that can be concurrently assigned to one agent.
32
+ * Used as the upper bound for task-count-based capacity calculation.
33
+ */
34
+ export const MAX_TASKS_PER_AGENT = 5;
35
+ // ============================================================================
36
+ // Capacity queries
37
+ // ============================================================================
38
+ /**
39
+ * Get task-count-based remaining capacity for an agent.
40
+ *
41
+ * Remaining capacity = {@link MAX_TASKS_PER_AGENT} minus the number of tasks
42
+ * currently routed to this agent instance (tracked via the `task_id` column
43
+ * on `agent_instances` — each instance handles one task at a time; child agents
44
+ * spawned by an orchestrator appear as sibling rows referencing the same
45
+ * `parent_agent_id`).
46
+ *
47
+ * For capacity purposes the "active tasks" count is derived from the number of
48
+ * non-terminal sibling rows that share the same `parent_agent_id` as this
49
+ * agent, plus 1 for the agent's own current task when `task_id` is set.
50
+ *
51
+ * @remarks
52
+ * Agents in terminal states (`stopped`, `crashed`) always return 0 remaining
53
+ * capacity because they cannot accept work.
54
+ *
55
+ * @param agentId - Agent instance ID (agt_...) to check
56
+ * @param cwd - Working directory used to resolve tasks.db path
57
+ * @returns Capacity breakdown or null if the agent does not exist
58
+ *
59
+ * @example
60
+ * ```ts
61
+ * const cap = await getAgentCapacity('agt_20260321120000_ab12cd', '/project');
62
+ * if (cap && cap.available) {
63
+ * console.log(`Agent can take ${cap.remainingCapacity} more tasks`);
64
+ * }
65
+ * ```
66
+ */
67
+ export async function getAgentCapacity(agentId, cwd) {
68
+ const db = await getDb(cwd);
69
+ const agent = await db.select().from(agentInstances).where(eq(agentInstances.id, agentId)).get();
70
+ if (!agent)
71
+ return null;
72
+ // Terminal agents have zero capacity
73
+ const isTerminal = agent.status === 'stopped' || agent.status === 'crashed';
74
+ if (isTerminal) {
75
+ return {
76
+ agentId: agent.id,
77
+ agentType: agent.agentType,
78
+ status: agent.status,
79
+ activeTasks: 0,
80
+ remainingCapacity: 0,
81
+ maxCapacity: MAX_TASKS_PER_AGENT,
82
+ available: false,
83
+ };
84
+ }
85
+ // Count active child agents (subtasks delegated by this agent)
86
+ const children = await db
87
+ .select({ id: agentInstances.id })
88
+ .from(agentInstances)
89
+ .where(and(eq(agentInstances.parentAgentId, agentId), inArray(agentInstances.status, ['starting', 'active', 'idle', 'error'])))
90
+ .all();
91
+ // The agent itself counts as 1 active task when it has a task assigned
92
+ const selfTask = agent.taskId != null ? 1 : 0;
93
+ const activeTasks = selfTask + children.length;
94
+ const remainingCapacity = Math.max(0, MAX_TASKS_PER_AGENT - activeTasks);
95
+ return {
96
+ agentId: agent.id,
97
+ agentType: agent.agentType,
98
+ status: agent.status,
99
+ activeTasks,
100
+ remainingCapacity,
101
+ maxCapacity: MAX_TASKS_PER_AGENT,
102
+ available: remainingCapacity > 0,
103
+ };
104
+ }
105
+ /**
106
+ * List all non-terminal agents sorted by remaining task capacity (descending).
107
+ *
108
+ * Returns agents with the most available slots first, enabling callers to
109
+ * select the least-loaded agent for new work assignment.
110
+ *
111
+ * @remarks
112
+ * Only agents in `active` or `idle` states are included — `starting` agents
113
+ * are excluded because they may not yet be ready to accept work.
114
+ * Terminal agents (`stopped`, `crashed`) are always omitted.
115
+ *
116
+ * @param agentType - Optional filter to limit results to one agent type
117
+ * @param cwd - Working directory used to resolve tasks.db path
118
+ * @returns Array of capacity entries sorted highest remaining capacity first
119
+ *
120
+ * @example
121
+ * ```ts
122
+ * const agents = await getAgentsByCapacity('executor', '/project');
123
+ * const best = agents[0]; // most available slots
124
+ * if (best && best.available) {
125
+ * await assignTask(best.agentId, taskId);
126
+ * }
127
+ * ```
128
+ */
129
+ export async function getAgentsByCapacity(agentType, cwd) {
130
+ const filters = agentType
131
+ ? { status: ['active', 'idle'], agentType }
132
+ : { status: ['active', 'idle'] };
133
+ const activeAgents = await listAgentInstances(filters, cwd);
134
+ const capacities = await Promise.all(activeAgents.map((agent) => getAgentCapacity(agent.id, cwd)));
135
+ return capacities
136
+ .filter((c) => c !== null)
137
+ .sort((a, b) => b.remainingCapacity - a.remainingCapacity);
138
+ }
139
+ /**
140
+ * Get the specialization/skills list for an agent.
141
+ *
142
+ * Specializations are stored as a string array under the `specializations`
143
+ * key in the agent's `metadata_json` column. An empty array is returned when
144
+ * the field is absent or the agent is not found.
145
+ *
146
+ * @remarks
147
+ * Write specializations with {@link updateAgentSpecializations} when
148
+ * registering or updating an agent. The metadata column is a free-form JSON
149
+ * blob — specializations are one namespaced key inside it.
150
+ *
151
+ * @param agentId - Agent instance ID (agt_...)
152
+ * @param cwd - Working directory used to resolve tasks.db path
153
+ * @returns Array of specialization strings (empty if none recorded)
154
+ *
155
+ * @example
156
+ * ```ts
157
+ * const skills = await getAgentSpecializations('agt_20260321120000_ab12cd', '/project');
158
+ * // ['typescript', 'testing', 'documentation']
159
+ * if (skills.includes('typescript')) {
160
+ * console.log('Agent can handle TypeScript tasks');
161
+ * }
162
+ * ```
163
+ */
164
+ export async function getAgentSpecializations(agentId, cwd) {
165
+ const db = await getDb(cwd);
166
+ const agent = await db
167
+ .select({ metadataJson: agentInstances.metadataJson })
168
+ .from(agentInstances)
169
+ .where(eq(agentInstances.id, agentId))
170
+ .get();
171
+ if (!agent)
172
+ return [];
173
+ try {
174
+ const meta = JSON.parse(agent.metadataJson ?? '{}');
175
+ const specs = meta.specializations;
176
+ if (!Array.isArray(specs))
177
+ return [];
178
+ return specs.filter((s) => typeof s === 'string');
179
+ }
180
+ catch {
181
+ return [];
182
+ }
183
+ }
184
+ /**
185
+ * Update the specializations list stored in an agent's metadata.
186
+ *
187
+ * Merges the new list into the existing `metadata_json` object, preserving
188
+ * any other keys already present. Returns the updated specializations list,
189
+ * or null if the agent was not found.
190
+ *
191
+ * @remarks
192
+ * This is a write-side companion to {@link getAgentSpecializations}. Call it
193
+ * after {@link registerAgent} to record the skills an agent was spawned with.
194
+ *
195
+ * @param agentId - Agent instance ID (agt_...)
196
+ * @param specializations - New specializations list (replaces existing)
197
+ * @param cwd - Working directory used to resolve tasks.db path
198
+ * @returns Updated specializations list, or null if agent not found
199
+ *
200
+ * @example
201
+ * ```ts
202
+ * await updateAgentSpecializations(
203
+ * 'agt_20260321120000_ab12cd',
204
+ * ['typescript', 'testing'],
205
+ * '/project',
206
+ * );
207
+ * ```
208
+ */
209
+ export async function updateAgentSpecializations(agentId, specializations, cwd) {
210
+ const db = await getDb(cwd);
211
+ const agent = await db
212
+ .select({ metadataJson: agentInstances.metadataJson })
213
+ .from(agentInstances)
214
+ .where(eq(agentInstances.id, agentId))
215
+ .get();
216
+ if (!agent)
217
+ return null;
218
+ let existing = {};
219
+ try {
220
+ existing = JSON.parse(agent.metadataJson ?? '{}');
221
+ }
222
+ catch {
223
+ // Proceed with empty object if metadata is unparseable
224
+ }
225
+ const updated = { ...existing, specializations };
226
+ await db
227
+ .update(agentInstances)
228
+ .set({ metadataJson: JSON.stringify(updated) })
229
+ .where(eq(agentInstances.id, agentId));
230
+ return specializations;
231
+ }
232
+ // ============================================================================
233
+ // Performance recording
234
+ // ============================================================================
235
+ /**
236
+ * Record agent performance metrics to the BRAIN execution history.
237
+ *
238
+ * Translates a simplified {@link AgentPerformanceMetrics} object into the
239
+ * {@link AgentExecutionEvent} format expected by `execution-learning.ts` and
240
+ * delegates to {@link recordAgentExecution}. The agent type is resolved from
241
+ * the `agent_instances` table so callers only need to supply the agent ID.
242
+ *
243
+ * @remarks
244
+ * Recording is best-effort — if brain.db is unavailable the error is swallowed
245
+ * and null is returned, consistent with the rest of the execution-learning
246
+ * module. Agent lifecycle code is never disrupted by a brain write failure.
247
+ *
248
+ * @param agentId - Agent instance ID whose performance is being recorded
249
+ * @param metrics - Performance metrics for the task that was processed
250
+ * @param cwd - Working directory used to resolve tasks.db and brain.db paths
251
+ * @returns The brain decision ID if recorded, null on failure or not found
252
+ *
253
+ * @example
254
+ * ```ts
255
+ * const decisionId = await recordAgentPerformance('agt_20260321120000_ab12cd', {
256
+ * taskId: 'T041',
257
+ * taskType: 'task',
258
+ * outcome: 'success',
259
+ * durationMs: 4200,
260
+ * sessionId: 'ses_20260321_abc',
261
+ * }, '/project');
262
+ * ```
263
+ */
264
+ export async function recordAgentPerformance(agentId, metrics, cwd) {
265
+ const db = await getDb(cwd);
266
+ const agent = await db
267
+ .select({ agentType: agentInstances.agentType, sessionId: agentInstances.sessionId })
268
+ .from(agentInstances)
269
+ .where(eq(agentInstances.id, agentId))
270
+ .get();
271
+ if (!agent)
272
+ return null;
273
+ const event = {
274
+ agentId,
275
+ agentType: agent.agentType,
276
+ taskId: metrics.taskId,
277
+ taskType: metrics.taskType,
278
+ outcome: metrics.outcome,
279
+ taskLabels: metrics.taskLabels,
280
+ sessionId: metrics.sessionId ?? agent.sessionId ?? undefined,
281
+ durationMs: metrics.durationMs,
282
+ errorMessage: metrics.errorMessage,
283
+ errorType: metrics.errorType,
284
+ };
285
+ const decision = await recordAgentExecution(event, cwd);
286
+ return decision?.id ?? null;
287
+ }
288
+ //# sourceMappingURL=agent-registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-registry.js","sourceRoot":"","sources":["../../src/agents/agent-registry.ts"],"names":[],"mappings":"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"}
@@ -41,6 +41,11 @@ export const agentInstances = sqliteTable('agent_instances', {
41
41
  id: text('id').primaryKey(),
42
42
  agentType: text('agent_type', { enum: AGENT_TYPES }).notNull(),
43
43
  status: text('status', { enum: AGENT_INSTANCE_STATUSES }).notNull().default('starting'),
44
+ // T033: FK constraints enforced at DB level by migration; kept soft here
45
+ // to avoid circular dependency with tasks-schema.ts (which imports agent-schema.ts).
46
+ // The migration SQL adds: session_id -> sessions ON DELETE SET NULL,
47
+ // task_id -> tasks ON DELETE SET NULL,
48
+ // parent_agent_id -> agent_instances ON DELETE SET NULL.
44
49
  sessionId: text('session_id'),
45
50
  taskId: text('task_id'),
46
51
  startedAt: text('started_at').notNull().default(sql `(datetime('now'))`),
@@ -1 +1 @@
1
- {"version":3,"file":"agent-schema.js","sourceRoot":"","sources":["../../src/agents/agent-schema.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"agent-schema.js","sourceRoot":"","sources":["../../src/agents/agent-schema.ts"],"names":[],"mappings":"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"}