@soleri/core 9.5.0 → 9.7.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 (249) hide show
  1. package/dist/adapters/claude-code-adapter.d.ts +27 -0
  2. package/dist/adapters/claude-code-adapter.d.ts.map +1 -0
  3. package/dist/adapters/claude-code-adapter.js +111 -0
  4. package/dist/adapters/claude-code-adapter.js.map +1 -0
  5. package/dist/adapters/index.d.ts +9 -0
  6. package/dist/adapters/index.d.ts.map +1 -0
  7. package/dist/adapters/index.js +10 -0
  8. package/dist/adapters/index.js.map +1 -0
  9. package/dist/adapters/registry.d.ts +21 -0
  10. package/dist/adapters/registry.d.ts.map +1 -0
  11. package/dist/adapters/registry.js +44 -0
  12. package/dist/adapters/registry.js.map +1 -0
  13. package/dist/adapters/types.d.ts +93 -0
  14. package/dist/adapters/types.d.ts.map +1 -0
  15. package/dist/adapters/types.js +10 -0
  16. package/dist/adapters/types.js.map +1 -0
  17. package/dist/brain/brain.d.ts +12 -1
  18. package/dist/brain/brain.d.ts.map +1 -1
  19. package/dist/brain/brain.js +106 -44
  20. package/dist/brain/brain.js.map +1 -1
  21. package/dist/brain/intelligence.d.ts.map +1 -1
  22. package/dist/brain/intelligence.js +36 -30
  23. package/dist/brain/intelligence.js.map +1 -1
  24. package/dist/chat/agent-loop.js +1 -1
  25. package/dist/chat/agent-loop.js.map +1 -1
  26. package/dist/chat/notifications.d.ts.map +1 -1
  27. package/dist/chat/notifications.js +4 -0
  28. package/dist/chat/notifications.js.map +1 -1
  29. package/dist/control/intent-router.d.ts +1 -0
  30. package/dist/control/intent-router.d.ts.map +1 -1
  31. package/dist/control/intent-router.js +11 -5
  32. package/dist/control/intent-router.js.map +1 -1
  33. package/dist/curator/curator.d.ts +4 -0
  34. package/dist/curator/curator.d.ts.map +1 -1
  35. package/dist/curator/curator.js +141 -27
  36. package/dist/curator/curator.js.map +1 -1
  37. package/dist/index.d.ts +22 -2
  38. package/dist/index.d.ts.map +1 -1
  39. package/dist/index.js +18 -1
  40. package/dist/index.js.map +1 -1
  41. package/dist/llm/llm-client.d.ts.map +1 -1
  42. package/dist/llm/llm-client.js +1 -0
  43. package/dist/llm/llm-client.js.map +1 -1
  44. package/dist/packs/index.d.ts +3 -2
  45. package/dist/packs/index.d.ts.map +1 -1
  46. package/dist/packs/index.js +3 -2
  47. package/dist/packs/index.js.map +1 -1
  48. package/dist/packs/lockfile.d.ts +23 -1
  49. package/dist/packs/lockfile.d.ts.map +1 -1
  50. package/dist/packs/lockfile.js +50 -4
  51. package/dist/packs/lockfile.js.map +1 -1
  52. package/dist/packs/pack-installer.d.ts +10 -0
  53. package/dist/packs/pack-installer.d.ts.map +1 -1
  54. package/dist/packs/pack-installer.js +69 -2
  55. package/dist/packs/pack-installer.js.map +1 -1
  56. package/dist/packs/pack-lifecycle.d.ts +50 -0
  57. package/dist/packs/pack-lifecycle.d.ts.map +1 -0
  58. package/dist/packs/pack-lifecycle.js +91 -0
  59. package/dist/packs/pack-lifecycle.js.map +1 -0
  60. package/dist/packs/types.d.ts +76 -29
  61. package/dist/packs/types.d.ts.map +1 -1
  62. package/dist/packs/types.js +9 -0
  63. package/dist/packs/types.js.map +1 -1
  64. package/dist/persistence/sqlite-provider.d.ts +5 -1
  65. package/dist/persistence/sqlite-provider.d.ts.map +1 -1
  66. package/dist/persistence/sqlite-provider.js +22 -2
  67. package/dist/persistence/sqlite-provider.js.map +1 -1
  68. package/dist/planning/github-projection.d.ts +11 -9
  69. package/dist/planning/github-projection.d.ts.map +1 -1
  70. package/dist/planning/github-projection.js +47 -43
  71. package/dist/planning/github-projection.js.map +1 -1
  72. package/dist/planning/goal-ancestry.d.ts +72 -0
  73. package/dist/planning/goal-ancestry.d.ts.map +1 -0
  74. package/dist/planning/goal-ancestry.js +137 -0
  75. package/dist/planning/goal-ancestry.js.map +1 -0
  76. package/dist/planning/plan-lifecycle.d.ts +2 -0
  77. package/dist/planning/plan-lifecycle.d.ts.map +1 -1
  78. package/dist/planning/plan-lifecycle.js +1 -0
  79. package/dist/planning/plan-lifecycle.js.map +1 -1
  80. package/dist/planning/planner-types.d.ts +2 -0
  81. package/dist/planning/planner-types.d.ts.map +1 -1
  82. package/dist/plugins/types.d.ts +21 -21
  83. package/dist/queue/pipeline-runner.d.ts.map +1 -1
  84. package/dist/queue/pipeline-runner.js +4 -0
  85. package/dist/queue/pipeline-runner.js.map +1 -1
  86. package/dist/runtime/context-health.d.ts +14 -1
  87. package/dist/runtime/context-health.d.ts.map +1 -1
  88. package/dist/runtime/context-health.js +30 -2
  89. package/dist/runtime/context-health.js.map +1 -1
  90. package/dist/runtime/curator-extra-ops.d.ts.map +1 -1
  91. package/dist/runtime/curator-extra-ops.js +9 -1
  92. package/dist/runtime/curator-extra-ops.js.map +1 -1
  93. package/dist/runtime/facades/memory-facade.d.ts.map +1 -1
  94. package/dist/runtime/facades/memory-facade.js +169 -0
  95. package/dist/runtime/facades/memory-facade.js.map +1 -1
  96. package/dist/runtime/orchestrate-ops.d.ts.map +1 -1
  97. package/dist/runtime/orchestrate-ops.js +133 -4
  98. package/dist/runtime/orchestrate-ops.js.map +1 -1
  99. package/dist/runtime/runtime.d.ts.map +1 -1
  100. package/dist/runtime/runtime.js +128 -90
  101. package/dist/runtime/runtime.js.map +1 -1
  102. package/dist/runtime/session-briefing.d.ts.map +1 -1
  103. package/dist/runtime/session-briefing.js +44 -11
  104. package/dist/runtime/session-briefing.js.map +1 -1
  105. package/dist/runtime/shutdown-registry.d.ts +36 -0
  106. package/dist/runtime/shutdown-registry.d.ts.map +1 -0
  107. package/dist/runtime/shutdown-registry.js +74 -0
  108. package/dist/runtime/shutdown-registry.js.map +1 -0
  109. package/dist/runtime/types.d.ts +10 -1
  110. package/dist/runtime/types.d.ts.map +1 -1
  111. package/dist/session/compaction-evaluator.d.ts +20 -0
  112. package/dist/session/compaction-evaluator.d.ts.map +1 -0
  113. package/dist/session/compaction-evaluator.js +73 -0
  114. package/dist/session/compaction-evaluator.js.map +1 -0
  115. package/dist/session/compaction-policy.d.ts +50 -0
  116. package/dist/session/compaction-policy.d.ts.map +1 -0
  117. package/dist/session/compaction-policy.js +17 -0
  118. package/dist/session/compaction-policy.js.map +1 -0
  119. package/dist/session/handoff-renderer.d.ts +22 -0
  120. package/dist/session/handoff-renderer.d.ts.map +1 -0
  121. package/dist/session/handoff-renderer.js +49 -0
  122. package/dist/session/handoff-renderer.js.map +1 -0
  123. package/dist/session/index.d.ts +6 -0
  124. package/dist/session/index.d.ts.map +1 -0
  125. package/dist/session/index.js +5 -0
  126. package/dist/session/index.js.map +1 -0
  127. package/dist/session/policy-resolver.d.ts +20 -0
  128. package/dist/session/policy-resolver.d.ts.map +1 -0
  129. package/dist/session/policy-resolver.js +28 -0
  130. package/dist/session/policy-resolver.js.map +1 -0
  131. package/dist/skills/sync-skills.d.ts +27 -0
  132. package/dist/skills/sync-skills.d.ts.map +1 -1
  133. package/dist/skills/sync-skills.js +92 -1
  134. package/dist/skills/sync-skills.js.map +1 -1
  135. package/dist/skills/trust-classifier.d.ts +32 -0
  136. package/dist/skills/trust-classifier.d.ts.map +1 -0
  137. package/dist/skills/trust-classifier.js +109 -0
  138. package/dist/skills/trust-classifier.js.map +1 -0
  139. package/dist/subagent/concurrency-manager.d.ts +29 -0
  140. package/dist/subagent/concurrency-manager.d.ts.map +1 -0
  141. package/dist/subagent/concurrency-manager.js +73 -0
  142. package/dist/subagent/concurrency-manager.js.map +1 -0
  143. package/dist/subagent/dispatcher.d.ts +45 -0
  144. package/dist/subagent/dispatcher.d.ts.map +1 -0
  145. package/dist/subagent/dispatcher.js +271 -0
  146. package/dist/subagent/dispatcher.js.map +1 -0
  147. package/dist/subagent/index.d.ts +14 -0
  148. package/dist/subagent/index.d.ts.map +1 -0
  149. package/dist/subagent/index.js +15 -0
  150. package/dist/subagent/index.js.map +1 -0
  151. package/dist/subagent/orphan-reaper.d.ts +37 -0
  152. package/dist/subagent/orphan-reaper.d.ts.map +1 -0
  153. package/dist/subagent/orphan-reaper.js +71 -0
  154. package/dist/subagent/orphan-reaper.js.map +1 -0
  155. package/dist/subagent/result-aggregator.d.ts +7 -0
  156. package/dist/subagent/result-aggregator.d.ts.map +1 -0
  157. package/dist/subagent/result-aggregator.js +57 -0
  158. package/dist/subagent/result-aggregator.js.map +1 -0
  159. package/dist/subagent/task-checkout.d.ts +36 -0
  160. package/dist/subagent/task-checkout.d.ts.map +1 -0
  161. package/dist/subagent/task-checkout.js +52 -0
  162. package/dist/subagent/task-checkout.js.map +1 -0
  163. package/dist/subagent/types.d.ts +114 -0
  164. package/dist/subagent/types.d.ts.map +1 -0
  165. package/dist/subagent/types.js +9 -0
  166. package/dist/subagent/types.js.map +1 -0
  167. package/dist/subagent/workspace-resolver.d.ts +35 -0
  168. package/dist/subagent/workspace-resolver.d.ts.map +1 -0
  169. package/dist/subagent/workspace-resolver.js +99 -0
  170. package/dist/subagent/workspace-resolver.js.map +1 -0
  171. package/dist/transport/http-server.d.ts.map +1 -1
  172. package/dist/transport/http-server.js +49 -3
  173. package/dist/transport/http-server.js.map +1 -1
  174. package/dist/transport/ws-server.d.ts.map +1 -1
  175. package/dist/transport/ws-server.js +7 -0
  176. package/dist/transport/ws-server.js.map +1 -1
  177. package/dist/vault/linking.d.ts +3 -4
  178. package/dist/vault/linking.d.ts.map +1 -1
  179. package/dist/vault/linking.js +79 -32
  180. package/dist/vault/linking.js.map +1 -1
  181. package/dist/vault/vault-maintenance.d.ts.map +1 -1
  182. package/dist/vault/vault-maintenance.js +7 -14
  183. package/dist/vault/vault-maintenance.js.map +1 -1
  184. package/dist/vault/vault-memories.d.ts.map +1 -1
  185. package/dist/vault/vault-memories.js +19 -9
  186. package/dist/vault/vault-memories.js.map +1 -1
  187. package/dist/vault/vault-schema.d.ts +1 -0
  188. package/dist/vault/vault-schema.d.ts.map +1 -1
  189. package/dist/vault/vault-schema.js +20 -0
  190. package/dist/vault/vault-schema.js.map +1 -1
  191. package/dist/vault/vault.d.ts.map +1 -1
  192. package/dist/vault/vault.js +7 -3
  193. package/dist/vault/vault.js.map +1 -1
  194. package/package.json +5 -2
  195. package/src/__tests__/adapters/claude-code-adapter.test.ts +167 -0
  196. package/src/__tests__/adapters/registry.test.ts +100 -0
  197. package/src/__tests__/packs/pack-lifecycle.test.ts +379 -0
  198. package/src/__tests__/subagent/concurrency-manager.test.ts +132 -0
  199. package/src/__tests__/subagent/dispatcher.test.ts +195 -0
  200. package/src/__tests__/subagent/orphan-reaper.test.ts +141 -0
  201. package/src/__tests__/subagent/result-aggregator.test.ts +141 -0
  202. package/src/__tests__/subagent/task-checkout.test.ts +86 -0
  203. package/src/__tests__/subagent/workspace-resolver.test.ts +138 -0
  204. package/src/adapters/claude-code-adapter.ts +163 -0
  205. package/src/adapters/index.ts +22 -0
  206. package/src/adapters/registry.ts +53 -0
  207. package/src/adapters/types.ts +114 -0
  208. package/src/curator/curator.ts +1 -0
  209. package/src/index.ts +78 -1
  210. package/src/packs/index.ts +9 -1
  211. package/src/packs/lockfile.ts +70 -5
  212. package/src/packs/pack-installer.ts +78 -2
  213. package/src/packs/pack-lifecycle.ts +115 -0
  214. package/src/packs/pack-lockfile.test.ts +1 -1
  215. package/src/packs/pack-system.test.ts +1 -1
  216. package/src/packs/types.ts +72 -2
  217. package/src/persistence/sqlite-provider.ts +26 -2
  218. package/src/planning/github-projection.ts +6 -0
  219. package/src/planning/goal-ancestry.test.ts +427 -0
  220. package/src/planning/goal-ancestry.ts +187 -0
  221. package/src/planning/plan-lifecycle.ts +3 -0
  222. package/src/planning/planner-types.ts +2 -0
  223. package/src/runtime/admin-setup-ops.test.ts +9 -4
  224. package/src/runtime/context-health.ts +42 -2
  225. package/src/runtime/orchestrate-ops.ts +153 -1
  226. package/src/runtime/runtime.ts +15 -0
  227. package/src/runtime/session-briefing.test.ts +94 -2
  228. package/src/runtime/session-briefing.ts +48 -12
  229. package/src/runtime/types.ts +6 -0
  230. package/src/session/compaction-evaluator.ts +87 -0
  231. package/src/session/compaction-policy.ts +66 -0
  232. package/src/session/compaction.test.ts +259 -0
  233. package/src/session/handoff-renderer.ts +56 -0
  234. package/src/session/index.ts +12 -0
  235. package/src/session/policy-resolver.ts +34 -0
  236. package/src/skills/sync-skills.ts +114 -1
  237. package/src/skills/trust-classifier.test.ts +252 -0
  238. package/src/skills/trust-classifier.ts +127 -0
  239. package/src/subagent/concurrency-manager.ts +89 -0
  240. package/src/subagent/dispatcher.ts +342 -0
  241. package/src/subagent/index.ts +28 -0
  242. package/src/subagent/orphan-reaper.ts +82 -0
  243. package/src/subagent/result-aggregator.ts +66 -0
  244. package/src/subagent/task-checkout.ts +60 -0
  245. package/src/subagent/types.ts +138 -0
  246. package/src/subagent/workspace-resolver.ts +117 -0
  247. package/src/vault/vault-scaling.test.ts +3 -2
  248. package/vitest.config.ts +2 -0
  249. package/src/hooks/index.ts +0 -6
@@ -0,0 +1,138 @@
1
+ /**
2
+ * Subagent runtime engine — types for spawning, managing, and aggregating
3
+ * results from child agent processes.
4
+ *
5
+ * The SubagentDispatcher composes: TaskCheckout, WorkspaceResolver,
6
+ * ConcurrencyManager, OrphanReaper, and RuntimeAdapterRegistry.
7
+ */
8
+
9
+ import type { AdapterSessionState, AdapterTokenUsage } from '../adapters/types.js';
10
+
11
+ // ─── Task ───────────────────────────────────────────────────────────
12
+
13
+ /** A task to be dispatched to a subagent */
14
+ export interface SubagentTask {
15
+ /** Unique task identifier */
16
+ taskId: string;
17
+ /** The prompt or task description for the subagent */
18
+ prompt: string;
19
+ /** Working directory for execution */
20
+ workspace: string;
21
+ /** Runtime adapter type (e.g., 'claude-code', 'codex'). Falls back to registry default. */
22
+ runtime?: string;
23
+ /** Task IDs this task depends on (must complete first) */
24
+ dependencies?: string[];
25
+ /** Timeout in milliseconds. Default: 300_000 (5 min) */
26
+ timeout?: number;
27
+ /** Additional context to pass to the adapter */
28
+ config?: Record<string, unknown>;
29
+ }
30
+
31
+ // ─── Status ─────────────────────────────────────────────────────────
32
+
33
+ /** Lifecycle status of a subagent task */
34
+ export type SubagentStatus = 'queued' | 'claimed' | 'running' | 'completed' | 'failed' | 'orphaned';
35
+
36
+ // ─── Result ─────────────────────────────────────────────────────────
37
+
38
+ /** Result from a single subagent execution */
39
+ export interface SubagentResult {
40
+ /** Task ID this result belongs to */
41
+ taskId: string;
42
+ /** Final status */
43
+ status: SubagentStatus;
44
+ /** Exit code from the adapter (0 = success) */
45
+ exitCode: number;
46
+ /** Human-readable summary of what the subagent did */
47
+ summary?: string;
48
+ /** Token usage */
49
+ usage?: AdapterTokenUsage;
50
+ /** Session state for potential resume */
51
+ sessionState?: AdapterSessionState;
52
+ /** Files changed by this subagent */
53
+ filesChanged?: string[];
54
+ /** Error message if failed */
55
+ error?: string;
56
+ /** Duration in milliseconds */
57
+ durationMs: number;
58
+ /** PID of the child process (if spawned) */
59
+ pid?: number;
60
+ }
61
+
62
+ // ─── Dispatch Options ───────────────────────────────────────────────
63
+
64
+ /** Options controlling how tasks are dispatched */
65
+ export interface DispatchOptions {
66
+ /** Run tasks in parallel (default: true) */
67
+ parallel?: boolean;
68
+ /** Max concurrent subagents (default: 3) */
69
+ maxConcurrent?: number;
70
+ /** Isolate each task in a git worktree (default: false) */
71
+ worktreeIsolation?: boolean;
72
+ /** Global timeout per task in ms (default: 300_000) */
73
+ timeout?: number;
74
+ /** Callback for per-task status updates */
75
+ onTaskUpdate?: (taskId: string, status: SubagentStatus) => void;
76
+ }
77
+
78
+ // ─── Aggregated Result ──────────────────────────────────────────────
79
+
80
+ /** Aggregated result from multiple subagent executions */
81
+ export interface AggregatedResult {
82
+ /** Overall status */
83
+ status: 'all-passed' | 'partial' | 'all-failed';
84
+ /** Total tasks dispatched */
85
+ totalTasks: number;
86
+ /** Count of completed tasks */
87
+ completed: number;
88
+ /** Count of failed tasks */
89
+ failed: number;
90
+ /** Sum of all token usage */
91
+ totalUsage: AdapterTokenUsage;
92
+ /** Deduplicated list of all files changed */
93
+ filesChanged: string[];
94
+ /** Combined summary from all tasks */
95
+ combinedSummary: string;
96
+ /** Total duration in milliseconds */
97
+ durationMs: number;
98
+ /** Per-task results */
99
+ results: SubagentResult[];
100
+ }
101
+
102
+ // ─── Claim Info ─────────────────────────────────────────────────────
103
+
104
+ /** Information about a task claim */
105
+ export interface ClaimInfo {
106
+ /** Task ID */
107
+ taskId: string;
108
+ /** Agent/process that claimed this task */
109
+ claimerId: string;
110
+ /** When the claim was made */
111
+ claimedAt: number;
112
+ }
113
+
114
+ // ─── Worktree Info ──────────────────────────────────────────────────
115
+
116
+ /** Information about an active git worktree */
117
+ export interface WorktreeInfo {
118
+ /** Task ID this worktree is for */
119
+ taskId: string;
120
+ /** Absolute path to the worktree */
121
+ path: string;
122
+ /** Branch name (if created) */
123
+ branch?: string;
124
+ /** When the worktree was created */
125
+ createdAt: number;
126
+ }
127
+
128
+ // ─── Tracked Process ────────────────────────────────────────────────
129
+
130
+ /** A tracked child process for orphan detection */
131
+ export interface TrackedProcess {
132
+ /** Process ID */
133
+ pid: number;
134
+ /** Task ID this process is executing */
135
+ taskId: string;
136
+ /** When the process was registered */
137
+ registeredAt: number;
138
+ }
@@ -0,0 +1,117 @@
1
+ /**
2
+ * WorkspaceResolver — Git worktree isolation for subagent tasks.
3
+ *
4
+ * When isolation is requested, creates a dedicated git worktree per task
5
+ * at `<baseDir>/.soleri/worktrees/<taskId>/`. Falls back gracefully to the
6
+ * original workspace if git worktree creation fails.
7
+ */
8
+
9
+ import { execSync } from 'node:child_process';
10
+ import { existsSync, mkdirSync } from 'node:fs';
11
+ import { join } from 'node:path';
12
+
13
+ import type { WorktreeInfo } from './types.js';
14
+
15
+ const EXEC_OPTS = { encoding: 'utf-8' as const, timeout: 30_000 };
16
+
17
+ export class WorkspaceResolver {
18
+ private readonly baseDir: string;
19
+ private readonly worktrees = new Map<string, WorktreeInfo>();
20
+
21
+ constructor(baseDir: string) {
22
+ this.baseDir = baseDir;
23
+ }
24
+
25
+ /**
26
+ * Resolve a workspace path for a task.
27
+ *
28
+ * If `isolate` is true, creates a git worktree at
29
+ * `<baseDir>/.soleri/worktrees/<taskId>/` on branch `subagent/<taskId>`.
30
+ * Returns the worktree path on success, or the original `workspace` on failure.
31
+ *
32
+ * If `isolate` is false, returns `workspace` as-is.
33
+ */
34
+ resolve(taskId: string, workspace: string, isolate: boolean): string {
35
+ if (!isolate) {
36
+ return workspace;
37
+ }
38
+
39
+ try {
40
+ const worktreePath = join(this.baseDir, '.soleri', 'worktrees', taskId);
41
+ const branch = `subagent/${taskId}`;
42
+
43
+ // Ensure parent directory exists
44
+ const parentDir = join(this.baseDir, '.soleri', 'worktrees');
45
+ if (!existsSync(parentDir)) {
46
+ mkdirSync(parentDir, { recursive: true });
47
+ }
48
+
49
+ execSync(`git worktree add "${worktreePath}" -b "${branch}"`, {
50
+ ...EXEC_OPTS,
51
+ cwd: this.baseDir,
52
+ });
53
+
54
+ const info: WorktreeInfo = {
55
+ taskId,
56
+ path: worktreePath,
57
+ branch,
58
+ createdAt: Date.now(),
59
+ };
60
+ this.worktrees.set(taskId, info);
61
+
62
+ return worktreePath;
63
+ } catch (err) {
64
+ // Graceful fallback — log warning and return original workspace
65
+ console.warn(
66
+ `[WorkspaceResolver] Failed to create worktree for task "${taskId}":`,
67
+ err instanceof Error ? err.message : err,
68
+ );
69
+ return workspace;
70
+ }
71
+ }
72
+
73
+ /**
74
+ * Remove the worktree for a given task.
75
+ * Silently handles errors (e.g., worktree already removed).
76
+ */
77
+ cleanup(taskId: string): void {
78
+ const info = this.worktrees.get(taskId);
79
+ if (!info) {
80
+ return;
81
+ }
82
+
83
+ try {
84
+ execSync(`git worktree remove "${info.path}" --force`, { ...EXEC_OPTS, cwd: this.baseDir });
85
+ } catch {
86
+ // Silently ignore — worktree may already be gone
87
+ }
88
+
89
+ // Clean up the branch as well
90
+ if (info.branch) {
91
+ try {
92
+ execSync(`git branch -D "${info.branch}"`, { ...EXEC_OPTS, cwd: this.baseDir });
93
+ } catch {
94
+ // Silently ignore — branch may not exist
95
+ }
96
+ }
97
+
98
+ this.worktrees.delete(taskId);
99
+ }
100
+
101
+ /** Remove all active worktrees. */
102
+ cleanupAll(): void {
103
+ for (const taskId of Array.from(this.worktrees.keys())) {
104
+ this.cleanup(taskId);
105
+ }
106
+ }
107
+
108
+ /** Return all currently active worktrees. */
109
+ listActive(): WorktreeInfo[] {
110
+ return [...this.worktrees.values()];
111
+ }
112
+
113
+ /** Check whether a worktree exists for the given task. */
114
+ isActive(taskId: string): boolean {
115
+ return this.worktrees.has(taskId);
116
+ }
117
+ }
@@ -10,6 +10,7 @@ import { Vault } from './vault.js';
10
10
  import { Brain } from '../brain/brain.js';
11
11
  import type { IntelligenceEntry } from '../intelligence/types.js';
12
12
 
13
+ const isCI = !!process.env.CI;
13
14
  const DOMAINS = ['design', 'a11y', 'performance', 'security', 'architecture', 'testing', 'ux'];
14
15
  const TYPES: IntelligenceEntry['type'][] = ['pattern', 'anti-pattern', 'rule', 'playbook'];
15
16
  const SEVERITIES: IntelligenceEntry['severity'][] = ['critical', 'warning', 'suggestion'];
@@ -76,7 +77,7 @@ describe('Vault Scaling — 10K entries', () => {
76
77
  const elapsed = performance.now() - start;
77
78
 
78
79
  expect(results.length).toBeGreaterThan(0);
79
- expect(elapsed).toBeLessThan(50);
80
+ expect(elapsed).toBeLessThan(isCI ? 500 : 50);
80
81
  }
81
82
  });
82
83
 
@@ -89,7 +90,7 @@ describe('Vault Scaling — 10K entries', () => {
89
90
  const elapsed = performance.now() - start;
90
91
 
91
92
  expect(results.length).toBeGreaterThan(0);
92
- expect(elapsed).toBeLessThan(50);
93
+ expect(elapsed).toBeLessThan(isCI ? 500 : 50);
93
94
  });
94
95
 
95
96
  test('list with filters under 200ms at 10K', () => {
package/vitest.config.ts CHANGED
@@ -11,6 +11,8 @@ export default defineConfig({
11
11
  provider: 'v8',
12
12
  include: ['src/**/*.ts'],
13
13
  exclude: ['src/**/*.test.ts', 'src/__tests__/**', 'src/index.ts'],
14
+ reporter: ['text', 'json-summary'],
15
+ reportOnFailure: true,
14
16
  },
15
17
  },
16
18
  });
@@ -1,6 +0,0 @@
1
- export {
2
- scoreCandidateForConversion,
3
- type CandidateDimensions,
4
- type CandidateScore,
5
- type DimensionLevel,
6
- } from './candidate-scorer.js';