@coralai/sps-cli 0.49.0 → 0.49.1

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 (155) hide show
  1. package/dist/console-assets/assets/{index-C7skV1yt.js → index-Co0H5e5_.js} +14 -14
  2. package/dist/console-assets/index.html +1 -1
  3. package/package.json +1 -1
  4. package/dist/commands/cardMarkComplete.test.d.ts +0 -2
  5. package/dist/commands/cardMarkComplete.test.d.ts.map +0 -1
  6. package/dist/commands/cardMarkComplete.test.js +0 -142
  7. package/dist/commands/cardMarkComplete.test.js.map +0 -1
  8. package/dist/commands/cardMarkStarted.test.d.ts +0 -2
  9. package/dist/commands/cardMarkStarted.test.d.ts.map +0 -1
  10. package/dist/commands/cardMarkStarted.test.js +0 -98
  11. package/dist/commands/cardMarkStarted.test.js.map +0 -1
  12. package/dist/commands/projectInit.test.d.ts +0 -2
  13. package/dist/commands/projectInit.test.d.ts.map +0 -1
  14. package/dist/commands/projectInit.test.js +0 -126
  15. package/dist/commands/projectInit.test.js.map +0 -1
  16. package/dist/commands/tick-heartbeat.test.d.ts +0 -2
  17. package/dist/commands/tick-heartbeat.test.d.ts.map +0 -1
  18. package/dist/commands/tick-heartbeat.test.js +0 -89
  19. package/dist/commands/tick-heartbeat.test.js.map +0 -1
  20. package/dist/console-server/routes/chat.test.d.ts +0 -2
  21. package/dist/console-server/routes/chat.test.d.ts.map +0 -1
  22. package/dist/console-server/routes/chat.test.js +0 -131
  23. package/dist/console-server/routes/chat.test.js.map +0 -1
  24. package/dist/console-server/routes/projects.test.d.ts +0 -2
  25. package/dist/console-server/routes/projects.test.d.ts.map +0 -1
  26. package/dist/console-server/routes/projects.test.js +0 -150
  27. package/dist/console-server/routes/projects.test.js.map +0 -1
  28. package/dist/console-server/routes/system.test.d.ts +0 -2
  29. package/dist/console-server/routes/system.test.d.ts.map +0 -1
  30. package/dist/console-server/routes/system.test.js +0 -107
  31. package/dist/console-server/routes/system.test.js.map +0 -1
  32. package/dist/core/checklist.test.d.ts +0 -2
  33. package/dist/core/checklist.test.d.ts.map +0 -1
  34. package/dist/core/checklist.test.js +0 -74
  35. package/dist/core/checklist.test.js.map +0 -1
  36. package/dist/core/config.test.d.ts +0 -2
  37. package/dist/core/config.test.d.ts.map +0 -1
  38. package/dist/core/config.test.js +0 -352
  39. package/dist/core/config.test.js.map +0 -1
  40. package/dist/core/lock.test.d.ts +0 -2
  41. package/dist/core/lock.test.d.ts.map +0 -1
  42. package/dist/core/lock.test.js +0 -118
  43. package/dist/core/lock.test.js.map +0 -1
  44. package/dist/core/markerFile.test.d.ts +0 -2
  45. package/dist/core/markerFile.test.d.ts.map +0 -1
  46. package/dist/core/markerFile.test.js +0 -111
  47. package/dist/core/markerFile.test.js.map +0 -1
  48. package/dist/core/queue.test.d.ts +0 -2
  49. package/dist/core/queue.test.d.ts.map +0 -1
  50. package/dist/core/queue.test.js +0 -114
  51. package/dist/core/queue.test.js.map +0 -1
  52. package/dist/core/sessionCleanup.test.d.ts +0 -2
  53. package/dist/core/sessionCleanup.test.d.ts.map +0 -1
  54. package/dist/core/sessionCleanup.test.js +0 -158
  55. package/dist/core/sessionCleanup.test.js.map +0 -1
  56. package/dist/core/shellEnv.test.d.ts +0 -2
  57. package/dist/core/shellEnv.test.d.ts.map +0 -1
  58. package/dist/core/shellEnv.test.js +0 -116
  59. package/dist/core/shellEnv.test.js.map +0 -1
  60. package/dist/core/skillStore.test.d.ts +0 -2
  61. package/dist/core/skillStore.test.d.ts.map +0 -1
  62. package/dist/core/skillStore.test.js +0 -203
  63. package/dist/core/skillStore.test.js.map +0 -1
  64. package/dist/core/state.test.d.ts +0 -2
  65. package/dist/core/state.test.d.ts.map +0 -1
  66. package/dist/core/state.test.js +0 -336
  67. package/dist/core/state.test.js.map +0 -1
  68. package/dist/engines/CloseoutEngine.d.ts +0 -72
  69. package/dist/engines/CloseoutEngine.d.ts.map +0 -1
  70. package/dist/engines/CloseoutEngine.js +0 -648
  71. package/dist/engines/CloseoutEngine.js.map +0 -1
  72. package/dist/engines/EventHandler.test.d.ts +0 -2
  73. package/dist/engines/EventHandler.test.d.ts.map +0 -1
  74. package/dist/engines/EventHandler.test.js +0 -169
  75. package/dist/engines/EventHandler.test.js.map +0 -1
  76. package/dist/engines/ExecutionEngine.d.ts +0 -125
  77. package/dist/engines/ExecutionEngine.d.ts.map +0 -1
  78. package/dist/engines/ExecutionEngine.js +0 -766
  79. package/dist/engines/ExecutionEngine.js.map +0 -1
  80. package/dist/engines/MonitorEngine.test.d.ts +0 -2
  81. package/dist/engines/MonitorEngine.test.d.ts.map +0 -1
  82. package/dist/engines/MonitorEngine.test.js +0 -355
  83. package/dist/engines/MonitorEngine.test.js.map +0 -1
  84. package/dist/engines/engine-pipeline-adapter.test.d.ts +0 -17
  85. package/dist/engines/engine-pipeline-adapter.test.d.ts.map +0 -1
  86. package/dist/engines/engine-pipeline-adapter.test.js +0 -707
  87. package/dist/engines/engine-pipeline-adapter.test.js.map +0 -1
  88. package/dist/interfaces/HookProvider.d.ts +0 -9
  89. package/dist/interfaces/HookProvider.d.ts.map +0 -1
  90. package/dist/interfaces/HookProvider.js +0 -2
  91. package/dist/interfaces/HookProvider.js.map +0 -1
  92. package/dist/manager/completion-judge.test.d.ts +0 -17
  93. package/dist/manager/completion-judge.test.d.ts.map +0 -1
  94. package/dist/manager/completion-judge.test.js +0 -233
  95. package/dist/manager/completion-judge.test.js.map +0 -1
  96. package/dist/manager/integration-queue.d.ts +0 -71
  97. package/dist/manager/integration-queue.d.ts.map +0 -1
  98. package/dist/manager/integration-queue.js +0 -137
  99. package/dist/manager/integration-queue.js.map +0 -1
  100. package/dist/manager/integration-queue.test.d.ts +0 -17
  101. package/dist/manager/integration-queue.test.d.ts.map +0 -1
  102. package/dist/manager/integration-queue.test.js +0 -210
  103. package/dist/manager/integration-queue.test.js.map +0 -1
  104. package/dist/manager/pm-client.d.ts +0 -10
  105. package/dist/manager/pm-client.d.ts.map +0 -1
  106. package/dist/manager/pm-client.js +0 -260
  107. package/dist/manager/pm-client.js.map +0 -1
  108. package/dist/manager/resource-limiter.d.ts +0 -56
  109. package/dist/manager/resource-limiter.d.ts.map +0 -1
  110. package/dist/manager/resource-limiter.js +0 -116
  111. package/dist/manager/resource-limiter.js.map +0 -1
  112. package/dist/manager/resource-limiter.test.d.ts +0 -17
  113. package/dist/manager/resource-limiter.test.d.ts.map +0 -1
  114. package/dist/manager/resource-limiter.test.js +0 -118
  115. package/dist/manager/resource-limiter.test.js.map +0 -1
  116. package/dist/manager/supervisor.test.d.ts +0 -17
  117. package/dist/manager/supervisor.test.d.ts.map +0 -1
  118. package/dist/manager/supervisor.test.js +0 -216
  119. package/dist/manager/supervisor.test.js.map +0 -1
  120. package/dist/manager/worker-manager-impl.test.d.ts +0 -17
  121. package/dist/manager/worker-manager-impl.test.d.ts.map +0 -1
  122. package/dist/manager/worker-manager-impl.test.js +0 -446
  123. package/dist/manager/worker-manager-impl.test.js.map +0 -1
  124. package/dist/providers/PlaneTaskBackend.d.ts +0 -83
  125. package/dist/providers/PlaneTaskBackend.d.ts.map +0 -1
  126. package/dist/providers/PlaneTaskBackend.js +0 -461
  127. package/dist/providers/PlaneTaskBackend.js.map +0 -1
  128. package/dist/providers/TrelloTaskBackend.d.ts +0 -64
  129. package/dist/providers/TrelloTaskBackend.d.ts.map +0 -1
  130. package/dist/providers/TrelloTaskBackend.js +0 -298
  131. package/dist/providers/TrelloTaskBackend.js.map +0 -1
  132. package/dist/providers/adapters/acp-fs-handlers.test.d.ts +0 -2
  133. package/dist/providers/adapters/acp-fs-handlers.test.d.ts.map +0 -1
  134. package/dist/providers/adapters/acp-fs-handlers.test.js +0 -80
  135. package/dist/providers/adapters/acp-fs-handlers.test.js.map +0 -1
  136. package/dist/providers/adapters/acp-permissions.test.d.ts +0 -2
  137. package/dist/providers/adapters/acp-permissions.test.d.ts.map +0 -1
  138. package/dist/providers/adapters/acp-permissions.test.js +0 -103
  139. package/dist/providers/adapters/acp-permissions.test.js.map +0 -1
  140. package/dist/providers/adapters/acp-session-accumulator.test.d.ts +0 -2
  141. package/dist/providers/adapters/acp-session-accumulator.test.d.ts.map +0 -1
  142. package/dist/providers/adapters/acp-session-accumulator.test.js +0 -88
  143. package/dist/providers/adapters/acp-session-accumulator.test.js.map +0 -1
  144. package/dist/providers/adapters/acp-terminal-manager.test.d.ts +0 -2
  145. package/dist/providers/adapters/acp-terminal-manager.test.d.ts.map +0 -1
  146. package/dist/providers/adapters/acp-terminal-manager.test.js +0 -86
  147. package/dist/providers/adapters/acp-terminal-manager.test.js.map +0 -1
  148. package/dist/providers/outputParser.test.d.ts +0 -2
  149. package/dist/providers/outputParser.test.d.ts.map +0 -1
  150. package/dist/providers/outputParser.test.js +0 -185
  151. package/dist/providers/outputParser.test.js.map +0 -1
  152. package/dist/test-setup.d.ts +0 -2
  153. package/dist/test-setup.d.ts.map +0 -1
  154. package/dist/test-setup.js +0 -27
  155. package/dist/test-setup.js.map +0 -1
@@ -1,210 +0,0 @@
1
- /**
2
- * @module integration-queue.test
3
- * @description IntegrationQueue 单元测试
4
- *
5
- * @author eddy
6
- * @organization wykj
7
- * @ownership wykj/eddy
8
- *
9
- * @created 2026-03-29
10
- * @updated 2026-04-03
11
- *
12
- * @role test
13
- * @layer manager
14
- * @boundedContext worker-lifecycle
15
- */
16
- import { mkdtempSync, rmSync } from 'node:fs';
17
- import { tmpdir } from 'node:os';
18
- import { join } from 'node:path';
19
- import { afterEach, beforeEach, describe, expect, it } from 'vitest';
20
- import { createIdleWorkerSlot, writeState } from '../core/state.js';
21
- import { IntegrationQueue } from './integration-queue.js';
22
- // ─── Helpers ──────────────────────────────────────────────────────
23
- function makeTempDir() {
24
- return mkdtempSync(join(tmpdir(), 'sps-iq-test-'));
25
- }
26
- function initState(stateFile, maxWorkers = 1) {
27
- const workers = {};
28
- for (let i = 1; i <= maxWorkers; i++) {
29
- workers[`worker-${i}`] = createIdleWorkerSlot();
30
- }
31
- const state = {
32
- version: 1, generation: 0,
33
- updatedAt: new Date().toISOString(), updatedBy: 'test',
34
- workers, activeCards: {}, leases: {},
35
- worktreeEvidence: {}, worktreeCleanup: [],
36
- sessions: {}, integrationQueues: {}, pendingPMActions: [],
37
- };
38
- writeState(stateFile, state, 'test-init');
39
- }
40
- function makeEntry(taskId, project = 'myapp', targetBranch = 'main') {
41
- return {
42
- taskId, cardId: taskId, project,
43
- prompt: `integrate task ${taskId}`,
44
- cwd: `/tmp/wt-${taskId}`,
45
- branch: `feat-${taskId}`,
46
- targetBranch,
47
- tool: 'claude', transport: 'acp-sdk',
48
- outputFile: `/tmp/out-${taskId}.jsonl`,
49
- enqueuedAt: new Date().toISOString(),
50
- };
51
- }
52
- // ─── Tests ────────────────────────────────────────────────────────
53
- describe('IntegrationQueue', () => {
54
- let tempDir;
55
- let stateFile;
56
- let iq;
57
- beforeEach(() => {
58
- tempDir = makeTempDir();
59
- stateFile = join(tempDir, 'state.json');
60
- initState(stateFile);
61
- iq = new IntegrationQueue(stateFile, 1);
62
- });
63
- afterEach(() => {
64
- rmSync(tempDir, { recursive: true, force: true });
65
- });
66
- describe('enqueue', () => {
67
- it('first entry becomes active immediately', () => {
68
- const result = iq.enqueue(makeEntry('1'));
69
- expect(result.queued).toBe(false);
70
- expect(result.position).toBe(0);
71
- });
72
- it('second entry is queued as waiting', () => {
73
- iq.enqueue(makeEntry('1'));
74
- const result = iq.enqueue(makeEntry('2'));
75
- expect(result.queued).toBe(true);
76
- expect(result.position).toBe(1);
77
- });
78
- it('third entry gets position 2', () => {
79
- iq.enqueue(makeEntry('1'));
80
- iq.enqueue(makeEntry('2'));
81
- const result = iq.enqueue(makeEntry('3'));
82
- expect(result.queued).toBe(true);
83
- expect(result.position).toBe(2);
84
- });
85
- it('different targetBranches have independent queues', () => {
86
- iq.enqueue(makeEntry('1', 'myapp', 'main'));
87
- const r2 = iq.enqueue(makeEntry('2', 'myapp', 'develop'));
88
- // Different queue key — becomes active, not queued
89
- expect(r2.queued).toBe(false);
90
- expect(r2.position).toBe(0);
91
- });
92
- it('different projects have independent queues', () => {
93
- iq.enqueue(makeEntry('1', 'proj-a', 'main'));
94
- const r2 = iq.enqueue(makeEntry('2', 'proj-b', 'main'));
95
- expect(r2.queued).toBe(false);
96
- });
97
- });
98
- describe('getActive', () => {
99
- it('returns null when queue is empty', () => {
100
- expect(iq.getActive('myapp', 'main')).toBeNull();
101
- });
102
- it('returns the active entry', () => {
103
- iq.enqueue(makeEntry('1'));
104
- const active = iq.getActive('myapp', 'main');
105
- expect(active).not.toBeNull();
106
- expect(active.taskId).toBe('1');
107
- });
108
- it('returns null for wrong project', () => {
109
- iq.enqueue(makeEntry('1', 'myapp'));
110
- expect(iq.getActive('other', 'main')).toBeNull();
111
- });
112
- });
113
- describe('getPosition', () => {
114
- it('returns -1 for unknown task', () => {
115
- expect(iq.getPosition('999')).toBe(-1);
116
- });
117
- it('returns 0 for active task', () => {
118
- iq.enqueue(makeEntry('1'));
119
- expect(iq.getPosition('1')).toBe(0);
120
- });
121
- it('returns 1-based position for waiting tasks', () => {
122
- iq.enqueue(makeEntry('1'));
123
- iq.enqueue(makeEntry('2'));
124
- iq.enqueue(makeEntry('3'));
125
- expect(iq.getPosition('2')).toBe(1);
126
- expect(iq.getPosition('3')).toBe(2);
127
- });
128
- });
129
- describe('dequeueNext', () => {
130
- it('returns null when queue is empty', () => {
131
- expect(iq.dequeueNext('myapp', 'main')).toBeNull();
132
- });
133
- it('promotes waiting entry to active', () => {
134
- iq.enqueue(makeEntry('1'));
135
- iq.enqueue(makeEntry('2'));
136
- iq.enqueue(makeEntry('3'));
137
- const next = iq.dequeueNext('myapp', 'main');
138
- expect(next).not.toBeNull();
139
- expect(next.taskId).toBe('2');
140
- // Now 2 should be active
141
- const active = iq.getActive('myapp', 'main');
142
- expect(active.taskId).toBe('2');
143
- });
144
- it('returns null after all waiting entries are consumed', () => {
145
- iq.enqueue(makeEntry('1'));
146
- iq.enqueue(makeEntry('2'));
147
- const next1 = iq.dequeueNext('myapp', 'main');
148
- expect(next1.taskId).toBe('2');
149
- const next2 = iq.dequeueNext('myapp', 'main');
150
- expect(next2).toBeNull();
151
- });
152
- it('cleans up queue key when fully drained', () => {
153
- iq.enqueue(makeEntry('1'));
154
- iq.dequeueNext('myapp', 'main'); // Drains active, no waiting
155
- // Queue should be gone — getActive returns null
156
- expect(iq.getActive('myapp', 'main')).toBeNull();
157
- });
158
- });
159
- describe('remove', () => {
160
- it('removes a waiting task', () => {
161
- iq.enqueue(makeEntry('1'));
162
- iq.enqueue(makeEntry('2'));
163
- iq.enqueue(makeEntry('3'));
164
- const removed = iq.remove('2');
165
- expect(removed).toBe(true);
166
- expect(iq.getPosition('2')).toBe(-1);
167
- // Task 3 should now be position 1
168
- expect(iq.getPosition('3')).toBe(1);
169
- });
170
- it('returns false for unknown task', () => {
171
- expect(iq.remove('999')).toBe(false);
172
- });
173
- it('does not remove active task', () => {
174
- iq.enqueue(makeEntry('1'));
175
- // remove() only targets waiting list
176
- const removed = iq.remove('1');
177
- expect(removed).toBe(false);
178
- expect(iq.getActive('myapp', 'main').taskId).toBe('1');
179
- });
180
- });
181
- describe('list', () => {
182
- it('returns empty when no queues', () => {
183
- expect(iq.list()).toEqual([]);
184
- });
185
- it('returns all queues', () => {
186
- iq.enqueue(makeEntry('1', 'proj-a', 'main'));
187
- iq.enqueue(makeEntry('2', 'proj-b', 'main'));
188
- expect(iq.list()).toHaveLength(2);
189
- });
190
- it('filters by project', () => {
191
- iq.enqueue(makeEntry('1', 'proj-a', 'main'));
192
- iq.enqueue(makeEntry('2', 'proj-b', 'main'));
193
- expect(iq.list('proj-a')).toHaveLength(1);
194
- expect(iq.list('proj-c')).toHaveLength(0);
195
- });
196
- });
197
- describe('persistence', () => {
198
- it('survives queue reconstruction', () => {
199
- iq.enqueue(makeEntry('1'));
200
- iq.enqueue(makeEntry('2'));
201
- iq.enqueue(makeEntry('3'));
202
- // Create a new IntegrationQueue instance pointing to the same state file
203
- const iq2 = new IntegrationQueue(stateFile, 1);
204
- expect(iq2.getActive('myapp', 'main').taskId).toBe('1');
205
- expect(iq2.getPosition('2')).toBe(1);
206
- expect(iq2.getPosition('3')).toBe(2);
207
- });
208
- });
209
- });
210
- //# sourceMappingURL=integration-queue.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"integration-queue.test.js","sourceRoot":"","sources":["../../src/manager/integration-queue.test.ts"],"names":[],"mappings":"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"}
@@ -1,10 +0,0 @@
1
- import type { ProjectConfig } from '../core/config.js';
2
- export interface PMClient {
3
- move(seq: string, targetState: string): Promise<void>;
4
- addLabel(seq: string, label: string): Promise<void>;
5
- removeLabel(seq: string, label: string): Promise<void>;
6
- comment(seq: string, text: string): Promise<void>;
7
- releaseClaim(seq: string): Promise<void>;
8
- }
9
- export declare function createPMClient(config: ProjectConfig): PMClient;
10
- //# sourceMappingURL=pm-client.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"pm-client.d.ts","sourceRoot":"","sources":["../../src/manager/pm-client.ts"],"names":[],"mappings":"AAiBA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAIvD,MAAM,WAAW,QAAQ;IACvB,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACtD,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACpD,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACvD,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAClD,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC1C;AAID,wBAAgB,cAAc,CAAC,MAAM,EAAE,aAAa,GAAG,QAAQ,CAW9D"}
@@ -1,260 +0,0 @@
1
- /**
2
- * @module pm-client
3
- * @description 轻量级项目管理客户端,为 PostActions 提供完成/失败后续操作
4
- *
5
- * @author eddy
6
- * @organization wykj
7
- * @ownership wykj/eddy
8
- *
9
- * @created 2026-03-25
10
- * @updated 2026-04-03
11
- *
12
- * @role manager
13
- * @layer manager
14
- * @boundedContext worker-lifecycle
15
- */
16
- import { existsSync, readFileSync, writeFileSync } from 'node:fs';
17
- import { resolve } from 'node:path';
18
- // ─── Factory ────────────────────────────────────────────────────
19
- export function createPMClient(config) {
20
- switch (config.PM_TOOL) {
21
- case 'plane':
22
- return new PlanePMClient(config);
23
- case 'trello':
24
- return new TrelloPMClient(config);
25
- case 'markdown':
26
- return new MarkdownPMClient(config);
27
- default:
28
- throw new Error(`Unknown PM_TOOL: ${config.PM_TOOL}`);
29
- }
30
- }
31
- // ─── Plane ──────────────────────────────────────────────────────
32
- class PlanePMClient {
33
- baseUrl;
34
- headers;
35
- pmMetaDir;
36
- projectName;
37
- labelCache = null;
38
- constructor(config) {
39
- const raw = config.raw;
40
- const apiUrl = raw.PLANE_API_URL || raw.PLANE_URL || '';
41
- const apiKey = raw.PLANE_API_KEY || '';
42
- const workspace = raw.PLANE_WORKSPACE_SLUG || '';
43
- const projectId = raw.PLANE_PROJECT_ID || '';
44
- this.baseUrl = `${apiUrl}/api/v1/workspaces/${workspace}/projects/${projectId}`;
45
- this.headers = {
46
- 'X-API-Key': apiKey,
47
- 'Content-Type': 'application/json',
48
- };
49
- this.projectName = config.PROJECT_NAME;
50
- this.pmMetaDir = resolve(process.env.HOME || '~', '.coral', 'projects', this.projectName, 'pm_meta');
51
- }
52
- async move(seq, targetStateId) {
53
- const issue = await this.resolveIssue(seq);
54
- await this.request('PATCH', `/issues/${issue.id}/`, { state: targetStateId });
55
- }
56
- async addLabel(seq, label) {
57
- const issue = await this.resolveIssue(seq);
58
- const labelId = await this.ensureLabel(label);
59
- const currentIds = await this.getIssueLabelIds(issue.id);
60
- if (!currentIds.includes(labelId)) {
61
- currentIds.push(labelId);
62
- await this.request('PATCH', `/issues/${issue.id}/`, { labels: currentIds });
63
- }
64
- }
65
- async removeLabel(seq, label) {
66
- const issue = await this.resolveIssue(seq);
67
- const labelId = await this.findLabelId(label);
68
- if (!labelId)
69
- return;
70
- const currentIds = await this.getIssueLabelIds(issue.id);
71
- const filtered = currentIds.filter(id => id !== labelId);
72
- if (filtered.length !== currentIds.length) {
73
- await this.request('PATCH', `/issues/${issue.id}/`, { labels: filtered });
74
- }
75
- }
76
- async comment(seq, text) {
77
- const issue = await this.resolveIssue(seq);
78
- await this.request('POST', `/issues/${issue.id}/comments/`, {
79
- comment_html: `<p>${escapeHtml(text)}</p>`,
80
- });
81
- }
82
- async releaseClaim(seq) {
83
- // Update local pm_meta
84
- const metaFile = resolve(this.pmMetaDir, `${seq}.json`);
85
- if (existsSync(metaFile)) {
86
- try {
87
- const existing = JSON.parse(readFileSync(metaFile, 'utf-8'));
88
- existing.status = 'RELEASED';
89
- existing.releasedAt = new Date().toISOString();
90
- writeFileSync(metaFile, JSON.stringify(existing, null, 2));
91
- }
92
- catch { /* best effort */ }
93
- }
94
- await this.removeLabel(seq, 'CLAIMED');
95
- }
96
- // ── Plane API helpers ──
97
- async request(method, path, body) {
98
- const url = `${this.baseUrl}${path}`;
99
- const init = { method, headers: this.headers };
100
- if (body !== undefined)
101
- init.body = JSON.stringify(body);
102
- const res = await fetch(url, init);
103
- if (!res.ok) {
104
- const text = await res.text().catch(() => '');
105
- throw new Error(`Plane API ${method} ${path} failed (${res.status}): ${text}`);
106
- }
107
- const text = await res.text();
108
- if (!text)
109
- return undefined;
110
- return JSON.parse(text);
111
- }
112
- async resolveIssue(seq) {
113
- const data = await this.request('GET', `/issues/?search=${seq}`);
114
- const issues = Array.isArray(data) ? data : (data.results ?? []);
115
- const match = issues.find((i) => String(i.sequence_id) === seq);
116
- if (!match)
117
- throw new Error(`Plane issue seq:${seq} not found`);
118
- return match;
119
- }
120
- async getIssueLabelIds(issueId) {
121
- const issue = await this.request('GET', `/issues/${issueId}/`);
122
- if (issue.label_ids)
123
- return [...issue.label_ids];
124
- return (issue.labels ?? []).map((l) => typeof l === 'string' ? l : l.id);
125
- }
126
- async ensureLabel(name) {
127
- const existing = await this.findLabelId(name);
128
- if (existing)
129
- return existing;
130
- const label = await this.request('POST', '/labels/', { name });
131
- this.labelCache = null;
132
- return label.id;
133
- }
134
- async findLabelId(name) {
135
- if (!this.labelCache) {
136
- const data = await this.request('GET', '/labels/');
137
- const labels = Array.isArray(data) ? data : (data.results ?? []);
138
- this.labelCache = new Map(labels.map(l => [l.name, l.id]));
139
- }
140
- return this.labelCache.get(name) ?? null;
141
- }
142
- }
143
- // ─── Trello ─────────────────────────────────────────────────────
144
- class TrelloPMClient {
145
- apiKey;
146
- apiToken;
147
- boardId;
148
- constructor(config) {
149
- const raw = config.raw;
150
- this.apiKey = raw.TRELLO_API_KEY || '';
151
- this.apiToken = raw.TRELLO_API_TOKEN || '';
152
- this.boardId = raw.TRELLO_BOARD_ID || '';
153
- }
154
- get auth() {
155
- return `key=${this.apiKey}&token=${this.apiToken}`;
156
- }
157
- async move(seq, targetListId) {
158
- const cardId = await this.findCardId(seq);
159
- if (!cardId)
160
- return;
161
- const res = await fetch(`https://api.trello.com/1/cards/${cardId}?${this.auth}`, {
162
- method: 'PUT',
163
- headers: { 'Content-Type': 'application/json' },
164
- body: JSON.stringify({ idList: targetListId }),
165
- });
166
- if (!res.ok)
167
- throw new Error(`Trello move failed (${res.status})`);
168
- }
169
- async addLabel(seq, label) {
170
- const cardId = await this.findCardId(seq);
171
- if (!cardId)
172
- return;
173
- const labelId = await this.findOrCreateLabel(label);
174
- if (labelId) {
175
- const res = await fetch(`https://api.trello.com/1/cards/${cardId}/idLabels?${this.auth}`, {
176
- method: 'POST',
177
- headers: { 'Content-Type': 'application/json' },
178
- body: JSON.stringify({ value: labelId }),
179
- });
180
- if (!res.ok)
181
- throw new Error(`Trello addLabel failed (${res.status})`);
182
- }
183
- }
184
- async removeLabel(seq, label) {
185
- const cardId = await this.findCardId(seq);
186
- if (!cardId)
187
- return;
188
- const labelId = await this.findOrCreateLabel(label);
189
- if (labelId) {
190
- const res = await fetch(`https://api.trello.com/1/cards/${cardId}/idLabels/${labelId}?${this.auth}`, {
191
- method: 'DELETE',
192
- });
193
- if (!res.ok && res.status !== 404)
194
- throw new Error(`Trello removeLabel failed (${res.status})`);
195
- }
196
- }
197
- async comment(seq, text) {
198
- const cardId = await this.findCardId(seq);
199
- if (!cardId)
200
- return;
201
- const res = await fetch(`https://api.trello.com/1/cards/${cardId}/actions/comments?${this.auth}`, {
202
- method: 'POST',
203
- headers: { 'Content-Type': 'application/json' },
204
- body: JSON.stringify({ text }),
205
- });
206
- if (!res.ok)
207
- throw new Error(`Trello comment failed (${res.status})`);
208
- }
209
- async releaseClaim(seq) {
210
- await this.removeLabel(seq, 'CLAIMED');
211
- }
212
- async findCardId(seq) {
213
- const res = await fetch(`https://api.trello.com/1/boards/${this.boardId}/cards?${this.auth}&fields=name`);
214
- if (!res.ok)
215
- return null;
216
- const cards = await res.json();
217
- const match = cards.find(c => c.name.startsWith(`${seq}:`) || c.name.startsWith(`#${seq} `));
218
- return match?.id ?? null;
219
- }
220
- async findOrCreateLabel(name) {
221
- const res = await fetch(`https://api.trello.com/1/boards/${this.boardId}/labels?${this.auth}`);
222
- if (!res.ok)
223
- return null;
224
- const labels = await res.json();
225
- const match = labels.find(l => l.name === name);
226
- return match?.id ?? null;
227
- }
228
- }
229
- // ─── Markdown ───────────────────────────────────────────────────
230
- class MarkdownPMClient {
231
- tasksFile;
232
- constructor(config) {
233
- this.tasksFile = config.raw.TASKS_FILE || resolve(config.PROJECT_DIR || '.', 'TASKS.md');
234
- }
235
- async move(_seq, _targetState) {
236
- // Markdown backend: state is managed by file content, handled by full TaskBackend
237
- // PMClient.move is a no-op since PostActions should use TaskBackend for Markdown projects
238
- }
239
- async addLabel(_seq, _label) {
240
- // No-op for markdown
241
- }
242
- async removeLabel(_seq, _label) {
243
- // No-op for markdown
244
- }
245
- async comment(_seq, _text) {
246
- // No-op for markdown
247
- }
248
- async releaseClaim(_seq) {
249
- // No-op for markdown
250
- }
251
- }
252
- // ─── Helpers ────────────────────────────────────────────────────
253
- function escapeHtml(text) {
254
- return text
255
- .replace(/&/g, '&amp;')
256
- .replace(/</g, '&lt;')
257
- .replace(/>/g, '&gt;')
258
- .replace(/"/g, '&quot;');
259
- }
260
- //# sourceMappingURL=pm-client.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"pm-client.js","sourceRoot":"","sources":["../../src/manager/pm-client.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAClE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAapC,mEAAmE;AAEnE,MAAM,UAAU,cAAc,CAAC,MAAqB;IAClD,QAAQ,MAAM,CAAC,OAAO,EAAE,CAAC;QACvB,KAAK,OAAO;YACV,OAAO,IAAI,aAAa,CAAC,MAAM,CAAC,CAAC;QACnC,KAAK,QAAQ;YACX,OAAO,IAAI,cAAc,CAAC,MAAM,CAAC,CAAC;QACpC,KAAK,UAAU;YACb,OAAO,IAAI,gBAAgB,CAAC,MAAM,CAAC,CAAC;QACtC;YACE,MAAM,IAAI,KAAK,CAAC,oBAAoB,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;IAC1D,CAAC;AACH,CAAC;AAED,mEAAmE;AAEnE,MAAM,aAAa;IACA,OAAO,CAAS;IAChB,OAAO,CAAyB;IAChC,SAAS,CAAS;IAClB,WAAW,CAAS;IAC7B,UAAU,GAA+B,IAAI,CAAC;IAEtD,YAAY,MAAqB;QAC/B,MAAM,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC;QACvB,MAAM,MAAM,GAAG,GAAG,CAAC,aAAa,IAAI,GAAG,CAAC,SAAS,IAAI,EAAE,CAAC;QACxD,MAAM,MAAM,GAAG,GAAG,CAAC,aAAa,IAAI,EAAE,CAAC;QACvC,MAAM,SAAS,GAAG,GAAG,CAAC,oBAAoB,IAAI,EAAE,CAAC;QACjD,MAAM,SAAS,GAAG,GAAG,CAAC,gBAAgB,IAAI,EAAE,CAAC;QAE7C,IAAI,CAAC,OAAO,GAAG,GAAG,MAAM,sBAAsB,SAAS,aAAa,SAAS,EAAE,CAAC;QAChF,IAAI,CAAC,OAAO,GAAG;YACb,WAAW,EAAE,MAAM;YACnB,cAAc,EAAE,kBAAkB;SACnC,CAAC;QACF,IAAI,CAAC,WAAW,GAAG,MAAM,CAAC,YAAY,CAAC;QACvC,IAAI,CAAC,SAAS,GAAG,OAAO,CACtB,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,GAAG,EAAE,QAAQ,EAAE,UAAU,EAAE,IAAI,CAAC,WAAW,EAAE,SAAS,CAC3E,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,GAAW,EAAE,aAAqB;QAC3C,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;QAC3C,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,WAAW,KAAK,CAAC,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,aAAa,EAAE,CAAC,CAAC;IAChF,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,GAAW,EAAE,KAAa;QACvC,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;QAC3C,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;QAC9C,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QACzD,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;YAClC,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACzB,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,WAAW,KAAK,CAAC,EAAE,GAAG,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,CAAC;QAC9E,CAAC;IACH,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,GAAW,EAAE,KAAa;QAC1C,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;QAC3C,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;QAC9C,IAAI,CAAC,OAAO;YAAE,OAAO;QACrB,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QACzD,MAAM,QAAQ,GAAG,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,OAAO,CAAC,CAAC;QACzD,IAAI,QAAQ,CAAC,MAAM,KAAK,UAAU,CAAC,MAAM,EAAE,CAAC;YAC1C,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,WAAW,KAAK,CAAC,EAAE,GAAG,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC;QAC5E,CAAC;IACH,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,GAAW,EAAE,IAAY;QACrC,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;QAC3C,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,WAAW,KAAK,CAAC,EAAE,YAAY,EAAE;YAC1D,YAAY,EAAE,MAAM,UAAU,CAAC,IAAI,CAAC,MAAM;SAC3C,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,GAAW;QAC5B,uBAAuB;QACvB,MAAM,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,GAAG,OAAO,CAAC,CAAC;QACxD,IAAI,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YACzB,IAAI,CAAC;gBACH,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC;gBAC7D,QAAQ,CAAC,MAAM,GAAG,UAAU,CAAC;gBAC7B,QAAQ,CAAC,UAAU,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;gBAC/C,aAAa,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;YAC7D,CAAC;YAAC,MAAM,CAAC,CAAC,iBAAiB,CAAC,CAAC;QAC/B,CAAC;QACD,MAAM,IAAI,CAAC,WAAW,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;IACzC,CAAC;IAED,0BAA0B;IAElB,KAAK,CAAC,OAAO,CAAc,MAAc,EAAE,IAAY,EAAE,IAAc;QAC7E,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,OAAO,GAAG,IAAI,EAAE,CAAC;QACrC,MAAM,IAAI,GAAgB,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC;QAC5D,IAAI,IAAI,KAAK,SAAS;YAAE,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QACzD,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QACnC,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;YACZ,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;YAC9C,MAAM,IAAI,KAAK,CAAC,aAAa,MAAM,IAAI,IAAI,YAAY,GAAG,CAAC,MAAM,MAAM,IAAI,EAAE,CAAC,CAAC;QACjF,CAAC;QACD,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;QAC9B,IAAI,CAAC,IAAI;YAAE,OAAO,SAAc,CAAC;QACjC,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAM,CAAC;IAC/B,CAAC;IAEO,KAAK,CAAC,YAAY,CAAC,GAAW;QACpC,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,OAAO,CAC7B,KAAK,EAAE,mBAAmB,GAAG,EAAE,CAChC,CAAC;QACF,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC;QACjE,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAA0B,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,KAAK,GAAG,CAAC,CAAC;QACzF,IAAI,CAAC,KAAK;YAAE,MAAM,IAAI,KAAK,CAAC,mBAAmB,GAAG,YAAY,CAAC,CAAC;QAChE,OAAO,KAAK,CAAC;IACf,CAAC;IAEO,KAAK,CAAC,gBAAgB,CAAC,OAAe;QAC5C,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,OAAO,CAC9B,KAAK,EAAE,WAAW,OAAO,GAAG,CAC7B,CAAC;QACF,IAAI,KAAK,CAAC,SAAS;YAAE,OAAO,CAAC,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC;QACjD,OAAO,CAAC,KAAK,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAA0B,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IACpG,CAAC;IAEO,KAAK,CAAC,WAAW,CAAC,IAAY;QACpC,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;QAC9C,IAAI,QAAQ;YAAE,OAAO,QAAQ,CAAC;QAC9B,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,OAAO,CAAiB,MAAM,EAAE,UAAU,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;QAC/E,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;QACvB,OAAO,KAAK,CAAC,EAAE,CAAC;IAClB,CAAC;IAEO,KAAK,CAAC,WAAW,CAAC,IAAY;QACpC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;YACrB,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,OAAO,CAC7B,KAAK,EAAE,UAAU,CAClB,CAAC;YACF,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC;YACjE,IAAI,CAAC,UAAU,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAC7D,CAAC;QACD,OAAO,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC;IAC3C,CAAC;CACF;AAED,mEAAmE;AAEnE,MAAM,cAAc;IACD,MAAM,CAAS;IACf,QAAQ,CAAS;IACjB,OAAO,CAAS;IAEjC,YAAY,MAAqB;QAC/B,MAAM,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC;QACvB,IAAI,CAAC,MAAM,GAAG,GAAG,CAAC,cAAc,IAAI,EAAE,CAAC;QACvC,IAAI,CAAC,QAAQ,GAAG,GAAG,CAAC,gBAAgB,IAAI,EAAE,CAAC;QAC3C,IAAI,CAAC,OAAO,GAAG,GAAG,CAAC,eAAe,IAAI,EAAE,CAAC;IAC3C,CAAC;IAED,IAAY,IAAI;QACd,OAAO,OAAO,IAAI,CAAC,MAAM,UAAU,IAAI,CAAC,QAAQ,EAAE,CAAC;IACrD,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,GAAW,EAAE,YAAoB;QAC1C,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;QAC1C,IAAI,CAAC,MAAM;YAAE,OAAO;QACpB,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,kCAAkC,MAAM,IAAI,IAAI,CAAC,IAAI,EAAE,EAAE;YAC/E,MAAM,EAAE,KAAK;YACb,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;YAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC;SAC/C,CAAC,CAAC;QACH,IAAI,CAAC,GAAG,CAAC,EAAE;YAAE,MAAM,IAAI,KAAK,CAAC,uBAAuB,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC;IACrE,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,GAAW,EAAE,KAAa;QACvC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;QAC1C,IAAI,CAAC,MAAM;YAAE,OAAO;QACpB,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC;QACpD,IAAI,OAAO,EAAE,CAAC;YACZ,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,kCAAkC,MAAM,aAAa,IAAI,CAAC,IAAI,EAAE,EAAE;gBACxF,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;gBAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;aACzC,CAAC,CAAC;YACH,IAAI,CAAC,GAAG,CAAC,EAAE;gBAAE,MAAM,IAAI,KAAK,CAAC,2BAA2B,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC;QACzE,CAAC;IACH,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,GAAW,EAAE,KAAa;QAC1C,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;QAC1C,IAAI,CAAC,MAAM;YAAE,OAAO;QACpB,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC;QACpD,IAAI,OAAO,EAAE,CAAC;YACZ,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,kCAAkC,MAAM,aAAa,OAAO,IAAI,IAAI,CAAC,IAAI,EAAE,EAAE;gBACnG,MAAM,EAAE,QAAQ;aACjB,CAAC,CAAC;YACH,IAAI,CAAC,GAAG,CAAC,EAAE,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG;gBAAE,MAAM,IAAI,KAAK,CAAC,8BAA8B,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC;QAClG,CAAC;IACH,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,GAAW,EAAE,IAAY;QACrC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;QAC1C,IAAI,CAAC,MAAM;YAAE,OAAO;QACpB,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,kCAAkC,MAAM,qBAAqB,IAAI,CAAC,IAAI,EAAE,EAAE;YAChG,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;YAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,CAAC;SAC/B,CAAC,CAAC;QACH,IAAI,CAAC,GAAG,CAAC,EAAE;YAAE,MAAM,IAAI,KAAK,CAAC,0BAA0B,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC;IACxE,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,GAAW;QAC5B,MAAM,IAAI,CAAC,WAAW,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;IACzC,CAAC;IAEO,KAAK,CAAC,UAAU,CAAC,GAAW;QAClC,MAAM,GAAG,GAAG,MAAM,KAAK,CACrB,mCAAmC,IAAI,CAAC,OAAO,UAAU,IAAI,CAAC,IAAI,cAAc,CACjF,CAAC;QACF,IAAI,CAAC,GAAG,CAAC,EAAE;YAAE,OAAO,IAAI,CAAC;QACzB,MAAM,KAAK,GAAG,MAAM,GAAG,CAAC,IAAI,EAAoC,CAAC;QACjE,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,GAAG,GAAG,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,GAAG,GAAG,CAAC,CAAC,CAAC;QAC7F,OAAO,KAAK,EAAE,EAAE,IAAI,IAAI,CAAC;IAC3B,CAAC;IAEO,KAAK,CAAC,iBAAiB,CAAC,IAAY;QAC1C,MAAM,GAAG,GAAG,MAAM,KAAK,CACrB,mCAAmC,IAAI,CAAC,OAAO,WAAW,IAAI,CAAC,IAAI,EAAE,CACtE,CAAC;QACF,IAAI,CAAC,GAAG,CAAC,EAAE;YAAE,OAAO,IAAI,CAAC;QACzB,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,IAAI,EAAoC,CAAC;QAClE,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;QAChD,OAAO,KAAK,EAAE,EAAE,IAAI,IAAI,CAAC;IAC3B,CAAC;CACF;AAED,mEAAmE;AAEnE,MAAM,gBAAgB;IACH,SAAS,CAAS;IAEnC,YAAY,MAAqB;QAC/B,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,GAAG,CAAC,UAAU,IAAI,OAAO,CAC/C,MAAM,CAAC,WAAW,IAAI,GAAG,EAAE,UAAU,CACtC,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,IAAY,EAAE,YAAoB;QAC3C,kFAAkF;QAClF,0FAA0F;IAC5F,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,IAAY,EAAE,MAAc;QACzC,qBAAqB;IACvB,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,IAAY,EAAE,MAAc;QAC5C,qBAAqB;IACvB,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,IAAY,EAAE,KAAa;QACvC,qBAAqB;IACvB,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,IAAY;QAC7B,qBAAqB;IACvB,CAAC;CACF;AAED,mEAAmE;AAEnE,SAAS,UAAU,CAAC,IAAY;IAC9B,OAAO,IAAI;SACR,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC;SACtB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;SACrB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;SACrB,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;AAC7B,CAAC"}
@@ -1,56 +0,0 @@
1
- export interface ResourceConfig {
2
- /** Maximum concurrent workers globally (default 30) */
3
- maxGlobalWorkers: number;
4
- /** Minimum delay between consecutive launches in ms (default 5000) */
5
- staggerDelayMs: number;
6
- /** Maximum system memory usage percent before pausing launches (default 80) */
7
- maxMemoryPercent: number;
8
- }
9
- export interface ResourceStats {
10
- active: number;
11
- max: number;
12
- memoryPercent: number;
13
- maxMemoryPercent: number;
14
- canLaunch: boolean;
15
- blockReason: 'workers' | 'memory' | null;
16
- }
17
- export interface AcquireResult {
18
- acquired: boolean;
19
- stats: ResourceStats;
20
- }
21
- export declare class ResourceLimiter {
22
- private readonly config;
23
- private activeCount;
24
- private lastLaunchAt;
25
- constructor(config?: Partial<ResourceConfig>);
26
- /**
27
- * Try to acquire a worker slot.
28
- * Returns true if launch is allowed, false if at capacity.
29
- */
30
- tryAcquire(): boolean;
31
- /**
32
- * Try to acquire a worker slot and return structured rejection details.
33
- */
34
- tryAcquireDetailed(): AcquireResult;
35
- /**
36
- * Release a worker slot (call when worker exits).
37
- */
38
- release(): void;
39
- /**
40
- * Enforce stagger delay between launches.
41
- * Returns a promise that resolves when the delay has passed.
42
- */
43
- enforceStagger(): Promise<void>;
44
- /**
45
- * Get current resource stats.
46
- */
47
- getStats(): ResourceStats;
48
- /**
49
- * Override active count (used during Recovery to sync with actual state).
50
- */
51
- setActiveCount(count: number): void;
52
- formatBlockReason(stats: ResourceStats): string;
53
- private collectStats;
54
- private memoryPercent;
55
- }
56
- //# sourceMappingURL=resource-limiter.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"resource-limiter.d.ts","sourceRoot":"","sources":["../../src/manager/resource-limiter.ts"],"names":[],"mappings":"AAiBA,MAAM,WAAW,cAAc;IAC7B,uDAAuD;IACvD,gBAAgB,EAAE,MAAM,CAAC;IACzB,sEAAsE;IACtE,cAAc,EAAE,MAAM,CAAC;IACvB,+EAA+E;IAC/E,gBAAgB,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;IACZ,aAAa,EAAE,MAAM,CAAC;IACtB,gBAAgB,EAAE,MAAM,CAAC;IACzB,SAAS,EAAE,OAAO,CAAC;IACnB,WAAW,EAAE,SAAS,GAAG,QAAQ,GAAG,IAAI,CAAC;CAC1C;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,OAAO,CAAC;IAClB,KAAK,EAAE,aAAa,CAAC;CACtB;AAQD,qBAAa,eAAe;IAC1B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAiB;IACxC,OAAO,CAAC,WAAW,CAAK;IACxB,OAAO,CAAC,YAAY,CAAK;gBAEb,MAAM,CAAC,EAAE,OAAO,CAAC,cAAc,CAAC;IAI5C;;;OAGG;IACH,UAAU,IAAI,OAAO;IAIrB;;OAEG;IACH,kBAAkB,IAAI,aAAa;IAenC;;OAEG;IACH,OAAO,IAAI,IAAI;IAMf;;;OAGG;IACG,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC;IAUrC;;OAEG;IACH,QAAQ,IAAI,aAAa;IAIzB;;OAEG;IACH,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAInC,iBAAiB,CAAC,KAAK,EAAE,aAAa,GAAG,MAAM;IAW/C,OAAO,CAAC,YAAY;IAgBpB,OAAO,CAAC,aAAa;CAKtB"}