heyio 3.4.0 → 4.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CODE_OF_CONDUCT.md +83 -0
- package/LICENSE +21 -0
- package/README.md +203 -151
- package/dist/daemon/cli.js +7153 -0
- package/dist/daemon/index.js +6421 -0
- package/dist/web/assets/index-CbptHIYU.js +520 -0
- package/{public → dist/web}/index.html +1 -1
- package/package.json +45 -48
- package/dist/api/middleware/auth.d.ts +0 -14
- package/dist/api/middleware/auth.d.ts.map +0 -1
- package/dist/api/middleware/auth.js +0 -130
- package/dist/api/middleware/auth.js.map +0 -1
- package/dist/api/notifications.d.ts +0 -14
- package/dist/api/notifications.d.ts.map +0 -1
- package/dist/api/notifications.js +0 -114
- package/dist/api/notifications.js.map +0 -1
- package/dist/api/routes/activity.d.ts +0 -3
- package/dist/api/routes/activity.d.ts.map +0 -1
- package/dist/api/routes/activity.js +0 -28
- package/dist/api/routes/activity.js.map +0 -1
- package/dist/api/routes/attachments.d.ts +0 -3
- package/dist/api/routes/attachments.d.ts.map +0 -1
- package/dist/api/routes/attachments.js +0 -83
- package/dist/api/routes/attachments.js.map +0 -1
- package/dist/api/routes/config.d.ts +0 -3
- package/dist/api/routes/config.d.ts.map +0 -1
- package/dist/api/routes/config.js +0 -107
- package/dist/api/routes/config.js.map +0 -1
- package/dist/api/routes/conversations.d.ts +0 -3
- package/dist/api/routes/conversations.d.ts.map +0 -1
- package/dist/api/routes/conversations.js +0 -25
- package/dist/api/routes/conversations.js.map +0 -1
- package/dist/api/routes/health.d.ts +0 -3
- package/dist/api/routes/health.d.ts.map +0 -1
- package/dist/api/routes/health.js +0 -39
- package/dist/api/routes/health.js.map +0 -1
- package/dist/api/routes/inbox.d.ts +0 -3
- package/dist/api/routes/inbox.d.ts.map +0 -1
- package/dist/api/routes/inbox.js +0 -139
- package/dist/api/routes/inbox.js.map +0 -1
- package/dist/api/routes/schedules.d.ts +0 -3
- package/dist/api/routes/schedules.d.ts.map +0 -1
- package/dist/api/routes/schedules.js +0 -116
- package/dist/api/routes/schedules.js.map +0 -1
- package/dist/api/routes/skills.d.ts +0 -2
- package/dist/api/routes/skills.d.ts.map +0 -1
- package/dist/api/routes/skills.js +0 -127
- package/dist/api/routes/skills.js.map +0 -1
- package/dist/api/routes/squads.d.ts +0 -3
- package/dist/api/routes/squads.d.ts.map +0 -1
- package/dist/api/routes/squads.js +0 -578
- package/dist/api/routes/squads.js.map +0 -1
- package/dist/api/routes/usage.d.ts +0 -3
- package/dist/api/routes/usage.d.ts.map +0 -1
- package/dist/api/routes/usage.js +0 -55
- package/dist/api/routes/usage.js.map +0 -1
- package/dist/api/routes/wiki.d.ts +0 -2
- package/dist/api/routes/wiki.d.ts.map +0 -1
- package/dist/api/routes/wiki.js +0 -75
- package/dist/api/routes/wiki.js.map +0 -1
- package/dist/api/server.d.ts +0 -7
- package/dist/api/server.d.ts.map +0 -1
- package/dist/api/server.js +0 -183
- package/dist/api/server.js.map +0 -1
- package/dist/config.d.ts +0 -3
- package/dist/config.d.ts.map +0 -1
- package/dist/config.js +0 -3
- package/dist/config.js.map +0 -1
- package/dist/copilot/client.d.ts +0 -5
- package/dist/copilot/client.d.ts.map +0 -1
- package/dist/copilot/client.js +0 -38
- package/dist/copilot/client.js.map +0 -1
- package/dist/copilot/health-monitor.d.ts +0 -14
- package/dist/copilot/health-monitor.d.ts.map +0 -1
- package/dist/copilot/health-monitor.js +0 -70
- package/dist/copilot/health-monitor.js.map +0 -1
- package/dist/copilot/orchestrator.d.ts +0 -5
- package/dist/copilot/orchestrator.d.ts.map +0 -1
- package/dist/copilot/orchestrator.js +0 -227
- package/dist/copilot/orchestrator.js.map +0 -1
- package/dist/copilot/tools.d.ts +0 -80
- package/dist/copilot/tools.d.ts.map +0 -1
- package/dist/copilot/tools.js +0 -1067
- package/dist/copilot/tools.js.map +0 -1
- package/dist/index.d.ts +0 -3
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js +0 -94
- package/dist/index.js.map +0 -1
- package/dist/logging/logger.d.ts +0 -6
- package/dist/logging/logger.d.ts.map +0 -1
- package/dist/logging/logger.js +0 -33
- package/dist/logging/logger.js.map +0 -1
- package/dist/models/index.d.ts +0 -6
- package/dist/models/index.d.ts.map +0 -1
- package/dist/models/index.js +0 -4
- package/dist/models/index.js.map +0 -1
- package/dist/models/pricing.d.ts +0 -25
- package/dist/models/pricing.d.ts.map +0 -1
- package/dist/models/pricing.js +0 -96
- package/dist/models/pricing.js.map +0 -1
- package/dist/models/registry.d.ts +0 -34
- package/dist/models/registry.d.ts.map +0 -1
- package/dist/models/registry.js +0 -109
- package/dist/models/registry.js.map +0 -1
- package/dist/models/token-tracker.d.ts +0 -41
- package/dist/models/token-tracker.d.ts.map +0 -1
- package/dist/models/token-tracker.js +0 -103
- package/dist/models/token-tracker.js.map +0 -1
- package/dist/scheduler/engine.d.ts +0 -12
- package/dist/scheduler/engine.d.ts.map +0 -1
- package/dist/scheduler/engine.js +0 -128
- package/dist/scheduler/engine.js.map +0 -1
- package/dist/skills/discover.d.ts +0 -22
- package/dist/skills/discover.d.ts.map +0 -1
- package/dist/skills/discover.js +0 -228
- package/dist/skills/discover.js.map +0 -1
- package/dist/skills/index.d.ts +0 -5
- package/dist/skills/index.d.ts.map +0 -1
- package/dist/skills/index.js +0 -3
- package/dist/skills/index.js.map +0 -1
- package/dist/skills/store.d.ts +0 -56
- package/dist/skills/store.d.ts.map +0 -1
- package/dist/skills/store.js +0 -154
- package/dist/skills/store.js.map +0 -1
- package/dist/squad/agent.d.ts +0 -65
- package/dist/squad/agent.d.ts.map +0 -1
- package/dist/squad/agent.js +0 -544
- package/dist/squad/agent.js.map +0 -1
- package/dist/squad/autonomy.d.ts +0 -16
- package/dist/squad/autonomy.d.ts.map +0 -1
- package/dist/squad/autonomy.js +0 -63
- package/dist/squad/autonomy.js.map +0 -1
- package/dist/squad/event-bus.d.ts +0 -22
- package/dist/squad/event-bus.d.ts.map +0 -1
- package/dist/squad/event-bus.js +0 -56
- package/dist/squad/event-bus.js.map +0 -1
- package/dist/squad/execution/index.d.ts +0 -14
- package/dist/squad/execution/index.d.ts.map +0 -1
- package/dist/squad/execution/index.js +0 -8
- package/dist/squad/execution/index.js.map +0 -1
- package/dist/squad/execution/instance.d.ts +0 -45
- package/dist/squad/execution/instance.d.ts.map +0 -1
- package/dist/squad/execution/instance.js +0 -165
- package/dist/squad/execution/instance.js.map +0 -1
- package/dist/squad/execution/planning.d.ts +0 -20
- package/dist/squad/execution/planning.d.ts.map +0 -1
- package/dist/squad/execution/planning.js +0 -62
- package/dist/squad/execution/planning.js.map +0 -1
- package/dist/squad/execution/pr.d.ts +0 -15
- package/dist/squad/execution/pr.d.ts.map +0 -1
- package/dist/squad/execution/pr.js +0 -109
- package/dist/squad/execution/pr.js.map +0 -1
- package/dist/squad/execution/review.d.ts +0 -21
- package/dist/squad/execution/review.d.ts.map +0 -1
- package/dist/squad/execution/review.js +0 -157
- package/dist/squad/execution/review.js.map +0 -1
- package/dist/squad/execution/runner.d.ts +0 -52
- package/dist/squad/execution/runner.d.ts.map +0 -1
- package/dist/squad/execution/runner.js +0 -93
- package/dist/squad/execution/runner.js.map +0 -1
- package/dist/squad/execution/tasks.d.ts +0 -22
- package/dist/squad/execution/tasks.d.ts.map +0 -1
- package/dist/squad/execution/tasks.js +0 -111
- package/dist/squad/execution/tasks.js.map +0 -1
- package/dist/squad/execution/worktree.d.ts +0 -27
- package/dist/squad/execution/worktree.d.ts.map +0 -1
- package/dist/squad/execution/worktree.js +0 -141
- package/dist/squad/execution/worktree.js.map +0 -1
- package/dist/squad/hiring.d.ts +0 -57
- package/dist/squad/hiring.d.ts.map +0 -1
- package/dist/squad/hiring.js +0 -588
- package/dist/squad/hiring.js.map +0 -1
- package/dist/squad/index.d.ts +0 -8
- package/dist/squad/index.d.ts.map +0 -1
- package/dist/squad/index.js +0 -6
- package/dist/squad/index.js.map +0 -1
- package/dist/squad/manager.d.ts +0 -58
- package/dist/squad/manager.d.ts.map +0 -1
- package/dist/squad/manager.js +0 -351
- package/dist/squad/manager.js.map +0 -1
- package/dist/squad/model-selector.d.ts +0 -29
- package/dist/squad/model-selector.d.ts.map +0 -1
- package/dist/squad/model-selector.js +0 -64
- package/dist/squad/model-selector.js.map +0 -1
- package/dist/squad/name-generator.d.ts +0 -16
- package/dist/squad/name-generator.d.ts.map +0 -1
- package/dist/squad/name-generator.js +0 -111
- package/dist/squad/name-generator.js.map +0 -1
- package/dist/squad/roles/templates.d.ts +0 -7
- package/dist/squad/roles/templates.d.ts.map +0 -1
- package/dist/squad/roles/templates.js +0 -104
- package/dist/squad/roles/templates.js.map +0 -1
- package/dist/squad/skill-parser.d.ts +0 -36
- package/dist/squad/skill-parser.d.ts.map +0 -1
- package/dist/squad/skill-parser.js +0 -90
- package/dist/squad/skill-parser.js.map +0 -1
- package/dist/squad/source-resolver.d.ts +0 -20
- package/dist/squad/source-resolver.d.ts.map +0 -1
- package/dist/squad/source-resolver.js +0 -51
- package/dist/squad/source-resolver.js.map +0 -1
- package/dist/store/activity.d.ts +0 -51
- package/dist/store/activity.d.ts.map +0 -1
- package/dist/store/activity.js +0 -197
- package/dist/store/activity.js.map +0 -1
- package/dist/store/conversations.d.ts +0 -25
- package/dist/store/conversations.d.ts.map +0 -1
- package/dist/store/conversations.js +0 -76
- package/dist/store/conversations.js.map +0 -1
- package/dist/store/db.d.ts +0 -5
- package/dist/store/db.d.ts.map +0 -1
- package/dist/store/db.js +0 -290
- package/dist/store/db.js.map +0 -1
- package/dist/store/inbox.d.ts +0 -67
- package/dist/store/inbox.d.ts.map +0 -1
- package/dist/store/inbox.js +0 -192
- package/dist/store/inbox.js.map +0 -1
- package/dist/store/schedules.d.ts +0 -53
- package/dist/store/schedules.d.ts.map +0 -1
- package/dist/store/schedules.js +0 -160
- package/dist/store/schedules.js.map +0 -1
- package/dist/wiki/index.d.ts +0 -3
- package/dist/wiki/index.d.ts.map +0 -1
- package/dist/wiki/index.js +0 -2
- package/dist/wiki/index.js.map +0 -1
- package/dist/wiki/store.d.ts +0 -81
- package/dist/wiki/store.d.ts.map +0 -1
- package/dist/wiki/store.js +0 -270
- package/dist/wiki/store.js.map +0 -1
- package/node_modules/@io/shared/dist/config.d.ts +0 -26
- package/node_modules/@io/shared/dist/config.d.ts.map +0 -1
- package/node_modules/@io/shared/dist/config.js +0 -53
- package/node_modules/@io/shared/dist/config.js.map +0 -1
- package/node_modules/@io/shared/dist/constants.d.ts +0 -19
- package/node_modules/@io/shared/dist/constants.d.ts.map +0 -1
- package/node_modules/@io/shared/dist/constants.js +0 -51
- package/node_modules/@io/shared/dist/constants.js.map +0 -1
- package/node_modules/@io/shared/dist/index.d.ts +0 -12
- package/node_modules/@io/shared/dist/index.d.ts.map +0 -1
- package/node_modules/@io/shared/dist/index.js +0 -3
- package/node_modules/@io/shared/dist/index.js.map +0 -1
- package/node_modules/@io/shared/dist/types/agents.d.ts +0 -3
- package/node_modules/@io/shared/dist/types/agents.d.ts.map +0 -1
- package/node_modules/@io/shared/dist/types/agents.js +0 -2
- package/node_modules/@io/shared/dist/types/agents.js.map +0 -1
- package/node_modules/@io/shared/dist/types/api.d.ts +0 -33
- package/node_modules/@io/shared/dist/types/api.d.ts.map +0 -1
- package/node_modules/@io/shared/dist/types/api.js +0 -2
- package/node_modules/@io/shared/dist/types/api.js.map +0 -1
- package/node_modules/@io/shared/dist/types/attachments.d.ts +0 -10
- package/node_modules/@io/shared/dist/types/attachments.d.ts.map +0 -1
- package/node_modules/@io/shared/dist/types/attachments.js +0 -2
- package/node_modules/@io/shared/dist/types/attachments.js.map +0 -1
- package/node_modules/@io/shared/dist/types/events.d.ts +0 -44
- package/node_modules/@io/shared/dist/types/events.d.ts.map +0 -1
- package/node_modules/@io/shared/dist/types/events.js +0 -2
- package/node_modules/@io/shared/dist/types/events.js.map +0 -1
- package/node_modules/@io/shared/dist/types/history.d.ts +0 -33
- package/node_modules/@io/shared/dist/types/history.d.ts.map +0 -1
- package/node_modules/@io/shared/dist/types/history.js +0 -2
- package/node_modules/@io/shared/dist/types/history.js.map +0 -1
- package/node_modules/@io/shared/dist/types/messages.d.ts +0 -15
- package/node_modules/@io/shared/dist/types/messages.d.ts.map +0 -1
- package/node_modules/@io/shared/dist/types/messages.js +0 -2
- package/node_modules/@io/shared/dist/types/messages.js.map +0 -1
- package/node_modules/@io/shared/dist/types/squads.d.ts +0 -46
- package/node_modules/@io/shared/dist/types/squads.d.ts.map +0 -1
- package/node_modules/@io/shared/dist/types/squads.js +0 -2
- package/node_modules/@io/shared/dist/types/squads.js.map +0 -1
- package/node_modules/@io/shared/dist/types/tokens.d.ts +0 -19
- package/node_modules/@io/shared/dist/types/tokens.d.ts.map +0 -1
- package/node_modules/@io/shared/dist/types/tokens.js +0 -2
- package/node_modules/@io/shared/dist/types/tokens.js.map +0 -1
- package/node_modules/@io/shared/package.json +0 -18
- package/node_modules/@io/shared/src/config.ts +0 -85
- package/node_modules/@io/shared/src/constants.ts +0 -54
- package/node_modules/@io/shared/src/index.ts +0 -46
- package/node_modules/@io/shared/src/types/agents.ts +0 -3
- package/node_modules/@io/shared/src/types/api.ts +0 -35
- package/node_modules/@io/shared/src/types/attachments.ts +0 -9
- package/node_modules/@io/shared/src/types/events.ts +0 -86
- package/node_modules/@io/shared/src/types/history.ts +0 -37
- package/node_modules/@io/shared/src/types/messages.ts +0 -15
- package/node_modules/@io/shared/src/types/squads.ts +0 -56
- package/node_modules/@io/shared/src/types/tokens.ts +0 -19
- package/node_modules/@io/shared/tsconfig.json +0 -9
- package/node_modules/@io/shared/tsconfig.tsbuildinfo +0 -1
- package/public/assets/index-CoSJG-14.js +0 -510
- package/public/assets/index-CoSJG-14.js.map +0 -1
- /package/{public → dist/web}/assets/index-B6F0UZkW.css +0 -0
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
import type { IOEvent } from '@io/shared';
|
|
2
|
-
type EventHandler<T extends IOEvent = IOEvent> = (event: T) => void | Promise<void>;
|
|
3
|
-
/**
|
|
4
|
-
* Typed pub/sub event bus with error-isolated handlers.
|
|
5
|
-
* Handlers that throw are logged but don't crash the bus or other handlers.
|
|
6
|
-
*/
|
|
7
|
-
export declare class EventBus {
|
|
8
|
-
private handlers;
|
|
9
|
-
private globalHandlers;
|
|
10
|
-
private logger;
|
|
11
|
-
/** Subscribe to a specific event type */
|
|
12
|
-
on<T extends IOEvent>(type: T['type'], handler: EventHandler<T>): () => void;
|
|
13
|
-
/** Subscribe to all events */
|
|
14
|
-
onAny(handler: EventHandler): () => void;
|
|
15
|
-
/** Emit an event to all matching handlers */
|
|
16
|
-
emit(event: IOEvent): Promise<void>;
|
|
17
|
-
/** Remove all handlers */
|
|
18
|
-
clear(): void;
|
|
19
|
-
}
|
|
20
|
-
export declare function getEventBus(): EventBus;
|
|
21
|
-
export {};
|
|
22
|
-
//# sourceMappingURL=event-bus.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"event-bus.d.ts","sourceRoot":"","sources":["../../src/squad/event-bus.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAG1C,KAAK,YAAY,CAAC,CAAC,SAAS,OAAO,GAAG,OAAO,IAAI,CAAC,KAAK,EAAE,CAAC,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;AAEpF;;;GAGG;AACH,qBAAa,QAAQ;IACpB,OAAO,CAAC,QAAQ,CAAwC;IACxD,OAAO,CAAC,cAAc,CAA2B;IACjD,OAAO,CAAC,MAAM,CAAkC;IAEhD,yCAAyC;IACzC,EAAE,CAAC,CAAC,SAAS,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,YAAY,CAAC,CAAC,CAAC,GAAG,MAAM,IAAI;IAS5E,8BAA8B;IAC9B,KAAK,CAAC,OAAO,EAAE,YAAY,GAAG,MAAM,IAAI;IAKxC,6CAA6C;IACvC,IAAI,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAwBzC,0BAA0B;IAC1B,KAAK,IAAI,IAAI;CAIb;AAKD,wBAAgB,WAAW,IAAI,QAAQ,CAKtC"}
|
package/dist/squad/event-bus.js
DELETED
|
@@ -1,56 +0,0 @@
|
|
|
1
|
-
import { createChildLogger } from '../logging/logger.js';
|
|
2
|
-
/**
|
|
3
|
-
* Typed pub/sub event bus with error-isolated handlers.
|
|
4
|
-
* Handlers that throw are logged but don't crash the bus or other handlers.
|
|
5
|
-
*/
|
|
6
|
-
export class EventBus {
|
|
7
|
-
handlers = new Map();
|
|
8
|
-
globalHandlers = new Set();
|
|
9
|
-
logger = createChildLogger('event-bus');
|
|
10
|
-
/** Subscribe to a specific event type */
|
|
11
|
-
on(type, handler) {
|
|
12
|
-
if (!this.handlers.has(type)) {
|
|
13
|
-
this.handlers.set(type, new Set());
|
|
14
|
-
}
|
|
15
|
-
const set = this.handlers.get(type);
|
|
16
|
-
set.add(handler);
|
|
17
|
-
return () => set.delete(handler);
|
|
18
|
-
}
|
|
19
|
-
/** Subscribe to all events */
|
|
20
|
-
onAny(handler) {
|
|
21
|
-
this.globalHandlers.add(handler);
|
|
22
|
-
return () => this.globalHandlers.delete(handler);
|
|
23
|
-
}
|
|
24
|
-
/** Emit an event to all matching handlers */
|
|
25
|
-
async emit(event) {
|
|
26
|
-
const typeHandlers = this.handlers.get(event.type) ?? new Set();
|
|
27
|
-
const allHandlers = [...typeHandlers, ...this.globalHandlers];
|
|
28
|
-
const results = await Promise.allSettled(allHandlers.map((handler) => {
|
|
29
|
-
try {
|
|
30
|
-
return Promise.resolve(handler(event));
|
|
31
|
-
}
|
|
32
|
-
catch (err) {
|
|
33
|
-
return Promise.reject(err);
|
|
34
|
-
}
|
|
35
|
-
}));
|
|
36
|
-
for (const result of results) {
|
|
37
|
-
if (result.status === 'rejected') {
|
|
38
|
-
this.logger.error({ err: result.reason, eventType: event.type }, 'Event handler threw an error');
|
|
39
|
-
}
|
|
40
|
-
}
|
|
41
|
-
}
|
|
42
|
-
/** Remove all handlers */
|
|
43
|
-
clear() {
|
|
44
|
-
this.handlers.clear();
|
|
45
|
-
this.globalHandlers.clear();
|
|
46
|
-
}
|
|
47
|
-
}
|
|
48
|
-
// Singleton instance
|
|
49
|
-
let busInstance = null;
|
|
50
|
-
export function getEventBus() {
|
|
51
|
-
if (!busInstance) {
|
|
52
|
-
busInstance = new EventBus();
|
|
53
|
-
}
|
|
54
|
-
return busInstance;
|
|
55
|
-
}
|
|
56
|
-
//# sourceMappingURL=event-bus.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"event-bus.js","sourceRoot":"","sources":["../../src/squad/event-bus.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAIzD;;;GAGG;AACH,MAAM,OAAO,QAAQ;IACZ,QAAQ,GAAG,IAAI,GAAG,EAA6B,CAAC;IAChD,cAAc,GAAG,IAAI,GAAG,EAAgB,CAAC;IACzC,MAAM,GAAG,iBAAiB,CAAC,WAAW,CAAC,CAAC;IAEhD,yCAAyC;IACzC,EAAE,CAAoB,IAAe,EAAE,OAAwB;QAC9D,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YAC9B,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,GAAG,EAAE,CAAC,CAAC;QACpC,CAAC;QACD,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAE,CAAC;QACrC,GAAG,CAAC,GAAG,CAAC,OAAuB,CAAC,CAAC;QACjC,OAAO,GAAG,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,OAAuB,CAAC,CAAC;IAClD,CAAC;IAED,8BAA8B;IAC9B,KAAK,CAAC,OAAqB;QAC1B,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACjC,OAAO,GAAG,EAAE,CAAC,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAClD,CAAC;IAED,6CAA6C;IAC7C,KAAK,CAAC,IAAI,CAAC,KAAc;QACxB,MAAM,YAAY,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,IAAI,GAAG,EAAE,CAAC;QAChE,MAAM,WAAW,GAAG,CAAC,GAAG,YAAY,EAAE,GAAG,IAAI,CAAC,cAAc,CAAC,CAAC;QAE9D,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,UAAU,CACvC,WAAW,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE;YAC3B,IAAI,CAAC;gBACJ,OAAO,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC;YACxC,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACd,OAAO,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAC5B,CAAC;QACF,CAAC,CAAC,CACF,CAAC;QAEF,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;YAC9B,IAAI,MAAM,CAAC,MAAM,KAAK,UAAU,EAAE,CAAC;gBAClC,IAAI,CAAC,MAAM,CAAC,KAAK,CAChB,EAAE,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,EAAE,KAAK,CAAC,IAAI,EAAE,EAC7C,8BAA8B,CAC9B,CAAC;YACH,CAAC;QACF,CAAC;IACF,CAAC;IAED,0BAA0B;IAC1B,KAAK;QACJ,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;QACtB,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,CAAC;IAC7B,CAAC;CACD;AAED,qBAAqB;AACrB,IAAI,WAAW,GAAoB,IAAI,CAAC;AAExC,MAAM,UAAU,WAAW;IAC1B,IAAI,CAAC,WAAW,EAAE,CAAC;QAClB,WAAW,GAAG,IAAI,QAAQ,EAAE,CAAC;IAC9B,CAAC;IACD,OAAO,WAAW,CAAC;AACpB,CAAC"}
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
export { createWorktree, removeWorktree, listWorktrees } from './worktree.js';
|
|
2
|
-
export type { WorktreeInfo } from './worktree.js';
|
|
3
|
-
export { cancelInstance, createInstance, transitionInstance, cleanupInstance, getInstance, getSquadInstances, } from './instance.js';
|
|
4
|
-
export type { Instance, InstanceTask } from './instance.js';
|
|
5
|
-
export { planInstance } from './planning.js';
|
|
6
|
-
export type { PlanResult } from './planning.js';
|
|
7
|
-
export { executeTasks, executeRework } from './tasks.js';
|
|
8
|
-
export { reviewWork } from './review.js';
|
|
9
|
-
export type { ReviewResult } from './review.js';
|
|
10
|
-
export { createPullRequest } from './pr.js';
|
|
11
|
-
export type { PrResult } from './pr.js';
|
|
12
|
-
export { runInstance, initInstance, executeInstance } from './runner.js';
|
|
13
|
-
export type { RunResult, InitResult } from './runner.js';
|
|
14
|
-
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/squad/execution/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC9E,YAAY,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAClD,OAAO,EACN,cAAc,EACd,cAAc,EACd,kBAAkB,EAClB,eAAe,EACf,WAAW,EACX,iBAAiB,GACjB,MAAM,eAAe,CAAC;AACvB,YAAY,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC5D,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,YAAY,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AACzD,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,YAAY,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AAC5C,YAAY,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACxC,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AACzE,YAAY,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC"}
|
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
export { createWorktree, removeWorktree, listWorktrees } from './worktree.js';
|
|
2
|
-
export { cancelInstance, createInstance, transitionInstance, cleanupInstance, getInstance, getSquadInstances, } from './instance.js';
|
|
3
|
-
export { planInstance } from './planning.js';
|
|
4
|
-
export { executeTasks, executeRework } from './tasks.js';
|
|
5
|
-
export { reviewWork } from './review.js';
|
|
6
|
-
export { createPullRequest } from './pr.js';
|
|
7
|
-
export { runInstance, initInstance, executeInstance } from './runner.js';
|
|
8
|
-
//# sourceMappingURL=index.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/squad/execution/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAE9E,OAAO,EACN,cAAc,EACd,cAAc,EACd,kBAAkB,EAClB,eAAe,EACf,WAAW,EACX,iBAAiB,GACjB,MAAM,eAAe,CAAC;AAEvB,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAE7C,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AACzD,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,OAAO,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AAE5C,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC"}
|
|
@@ -1,45 +0,0 @@
|
|
|
1
|
-
import type { InstanceStatus, Squad } from '@io/shared';
|
|
2
|
-
import type { ModelTier } from '../model-selector.js';
|
|
3
|
-
import { type WorktreeInfo } from './worktree.js';
|
|
4
|
-
export interface InstanceTask {
|
|
5
|
-
id: string;
|
|
6
|
-
description: string;
|
|
7
|
-
assignedTo: string;
|
|
8
|
-
status: 'pending' | 'in_progress' | 'done' | 'failed';
|
|
9
|
-
result?: string;
|
|
10
|
-
modelTier?: ModelTier;
|
|
11
|
-
retryCount: number;
|
|
12
|
-
}
|
|
13
|
-
export interface Instance {
|
|
14
|
-
id: string;
|
|
15
|
-
squadId: string;
|
|
16
|
-
issueRef?: string;
|
|
17
|
-
worktree: WorktreeInfo | null;
|
|
18
|
-
branch: string | null;
|
|
19
|
-
status: InstanceStatus;
|
|
20
|
-
tasks: InstanceTask[];
|
|
21
|
-
meetingLog: string[];
|
|
22
|
-
abortController: AbortController;
|
|
23
|
-
}
|
|
24
|
-
/**
|
|
25
|
-
* Create a new instance for a squad. Enforces max 3 per squad.
|
|
26
|
-
*/
|
|
27
|
-
export declare function createInstance(params: {
|
|
28
|
-
squad: Squad;
|
|
29
|
-
issueRef?: string;
|
|
30
|
-
objective: string;
|
|
31
|
-
}): Promise<Instance>;
|
|
32
|
-
/**
|
|
33
|
-
* Transition instance to a new status.
|
|
34
|
-
*/
|
|
35
|
-
export declare function transitionInstance(instanceId: string, newStatus: InstanceStatus): Promise<void>;
|
|
36
|
-
/**
|
|
37
|
-
* Cancel a running instance. Aborts in-flight work and transitions to failed.
|
|
38
|
-
*/
|
|
39
|
-
export declare function cancelInstance(instanceId: string, squad: Squad): Promise<boolean>;
|
|
40
|
-
export declare function cleanupInstance(instanceId: string, squad: Squad): Promise<void>;
|
|
41
|
-
/** Get an active instance */
|
|
42
|
-
export declare function getInstance(instanceId: string): Instance | undefined;
|
|
43
|
-
/** Get all active instances for a squad */
|
|
44
|
-
export declare function getSquadInstances(squadId: string): Instance[];
|
|
45
|
-
//# sourceMappingURL=instance.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"instance.d.ts","sourceRoot":"","sources":["../../../src/squad/execution/instance.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAKxD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,KAAK,YAAY,EAAkC,MAAM,eAAe,CAAC;AAIlF,MAAM,WAAW,YAAY;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,SAAS,GAAG,aAAa,GAAG,MAAM,GAAG,QAAQ,CAAC;IACtD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,QAAQ;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,YAAY,GAAG,IAAI,CAAC;IAC9B,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,MAAM,EAAE,cAAc,CAAC;IACvB,KAAK,EAAE,YAAY,EAAE,CAAC;IACtB,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,eAAe,EAAE,eAAe,CAAC;CACjC;AAID;;GAEG;AACH,wBAAsB,cAAc,CAAC,MAAM,EAAE;IAC5C,KAAK,EAAE,KAAK,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CAClB,GAAG,OAAO,CAAC,QAAQ,CAAC,CA8DpB;AAED;;GAEG;AACH,wBAAsB,kBAAkB,CACvC,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,cAAc,GACvB,OAAO,CAAC,IAAI,CAAC,CA+Cf;AAED;;GAEG;AACH,wBAAsB,cAAc,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC,CAmCvF;AAED,wBAAsB,eAAe,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,CAarF;AAED,6BAA6B;AAC7B,wBAAgB,WAAW,CAAC,UAAU,EAAE,MAAM,GAAG,QAAQ,GAAG,SAAS,CAEpE;AAED,2CAA2C;AAC3C,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,QAAQ,EAAE,CAE7D"}
|
|
@@ -1,165 +0,0 @@
|
|
|
1
|
-
import { createChildLogger } from '../../logging/logger.js';
|
|
2
|
-
import { getDatabase } from '../../store/db.js';
|
|
3
|
-
import { getEventBus } from '../event-bus.js';
|
|
4
|
-
import { getSquadMembers, getSquadRuntime } from '../manager.js';
|
|
5
|
-
import { createWorktree, removeWorktree } from './worktree.js';
|
|
6
|
-
const logger = () => createChildLogger('instance');
|
|
7
|
-
const activeInstances = new Map();
|
|
8
|
-
/**
|
|
9
|
-
* Create a new instance for a squad. Enforces max 3 per squad.
|
|
10
|
-
*/
|
|
11
|
-
export async function createInstance(params) {
|
|
12
|
-
const log = logger();
|
|
13
|
-
const db = getDatabase();
|
|
14
|
-
// Enforce instance limit
|
|
15
|
-
const existingResult = await db.execute({
|
|
16
|
-
sql: "SELECT COUNT(*) as cnt FROM squad_instances WHERE squad_id = ? AND status NOT IN ('complete', 'failed')",
|
|
17
|
-
args: [params.squad.id],
|
|
18
|
-
});
|
|
19
|
-
const count = existingResult.rows[0]?.cnt ?? 0;
|
|
20
|
-
if (count >= 3) {
|
|
21
|
-
throw new Error(`Squad '${params.squad.name}' already has ${count} active instances (max 3)`);
|
|
22
|
-
}
|
|
23
|
-
const id = crypto.randomUUID();
|
|
24
|
-
// Create worktree — required for agents to do actual work
|
|
25
|
-
const worktree = await createWorktree({
|
|
26
|
-
repoPath: params.squad.projectPath,
|
|
27
|
-
squadName: params.squad.name,
|
|
28
|
-
instanceId: id,
|
|
29
|
-
});
|
|
30
|
-
// Persist to DB
|
|
31
|
-
await db.execute({
|
|
32
|
-
sql: `INSERT INTO squad_instances (id, squad_id, issue_ref, worktree_path, branch_name, objective, status)
|
|
33
|
-
VALUES (?, ?, ?, ?, ?, ?, 'planning')`,
|
|
34
|
-
args: [
|
|
35
|
-
id,
|
|
36
|
-
params.squad.id,
|
|
37
|
-
params.issueRef ?? null,
|
|
38
|
-
worktree.path,
|
|
39
|
-
worktree.branch,
|
|
40
|
-
params.objective,
|
|
41
|
-
],
|
|
42
|
-
});
|
|
43
|
-
const instance = {
|
|
44
|
-
id,
|
|
45
|
-
squadId: params.squad.id,
|
|
46
|
-
issueRef: params.issueRef,
|
|
47
|
-
worktree,
|
|
48
|
-
branch: worktree.branch,
|
|
49
|
-
status: 'planning',
|
|
50
|
-
tasks: [],
|
|
51
|
-
meetingLog: [],
|
|
52
|
-
abortController: new AbortController(),
|
|
53
|
-
};
|
|
54
|
-
activeInstances.set(id, instance);
|
|
55
|
-
await getEventBus().emit({
|
|
56
|
-
id: crypto.randomUUID(),
|
|
57
|
-
timestamp: new Date(),
|
|
58
|
-
type: 'instance:created',
|
|
59
|
-
squadId: params.squad.id,
|
|
60
|
-
instanceId: id,
|
|
61
|
-
data: { issueRef: params.issueRef, objective: params.objective },
|
|
62
|
-
});
|
|
63
|
-
log.info({ instanceId: id, squadId: params.squad.id }, 'Instance created');
|
|
64
|
-
return instance;
|
|
65
|
-
}
|
|
66
|
-
/**
|
|
67
|
-
* Transition instance to a new status.
|
|
68
|
-
*/
|
|
69
|
-
export async function transitionInstance(instanceId, newStatus) {
|
|
70
|
-
const db = getDatabase();
|
|
71
|
-
const instance = activeInstances.get(instanceId);
|
|
72
|
-
if (!instance)
|
|
73
|
-
throw new Error(`Instance ${instanceId} not found`);
|
|
74
|
-
const validTransitions = {
|
|
75
|
-
planning: ['meeting', 'working', 'failed'],
|
|
76
|
-
meeting: ['working', 'failed'],
|
|
77
|
-
working: ['reviewing', 'failed'],
|
|
78
|
-
reviewing: ['complete', 'working', 'failed'],
|
|
79
|
-
complete: [],
|
|
80
|
-
failed: [],
|
|
81
|
-
};
|
|
82
|
-
const allowed = validTransitions[instance.status];
|
|
83
|
-
if (!allowed.includes(newStatus)) {
|
|
84
|
-
throw new Error(`Invalid transition: ${instance.status} → ${newStatus}`);
|
|
85
|
-
}
|
|
86
|
-
instance.status = newStatus;
|
|
87
|
-
const completedAt = newStatus === 'complete' || newStatus === 'failed' ? new Date().toISOString() : null;
|
|
88
|
-
await db.execute({
|
|
89
|
-
sql: 'UPDATE squad_instances SET status = ?, completed_at = COALESCE(?, completed_at) WHERE id = ?',
|
|
90
|
-
args: [newStatus, completedAt, instanceId],
|
|
91
|
-
});
|
|
92
|
-
const eventType = newStatus === 'meeting'
|
|
93
|
-
? 'instance:meeting_started'
|
|
94
|
-
: newStatus === 'working'
|
|
95
|
-
? 'instance:work_started'
|
|
96
|
-
: newStatus === 'complete'
|
|
97
|
-
? 'instance:complete'
|
|
98
|
-
: newStatus === 'failed'
|
|
99
|
-
? 'instance:failed'
|
|
100
|
-
: 'instance:created';
|
|
101
|
-
await getEventBus().emit({
|
|
102
|
-
id: crypto.randomUUID(),
|
|
103
|
-
timestamp: new Date(),
|
|
104
|
-
type: eventType,
|
|
105
|
-
squadId: instance.squadId,
|
|
106
|
-
instanceId,
|
|
107
|
-
data: { from: instance.status, to: newStatus },
|
|
108
|
-
});
|
|
109
|
-
}
|
|
110
|
-
/**
|
|
111
|
-
* Cancel a running instance. Aborts in-flight work and transitions to failed.
|
|
112
|
-
*/
|
|
113
|
-
export async function cancelInstance(instanceId, squad) {
|
|
114
|
-
const log = logger();
|
|
115
|
-
const instance = activeInstances.get(instanceId);
|
|
116
|
-
if (!instance)
|
|
117
|
-
return false;
|
|
118
|
-
// Already terminal
|
|
119
|
-
if (instance.status === 'complete' || instance.status === 'failed') {
|
|
120
|
-
return false;
|
|
121
|
-
}
|
|
122
|
-
// Signal abort to any in-flight work
|
|
123
|
-
instance.abortController.abort();
|
|
124
|
-
// Force transition to failed (bypass normal validation)
|
|
125
|
-
instance.status = 'failed';
|
|
126
|
-
const db = getDatabase();
|
|
127
|
-
await db.execute({
|
|
128
|
-
sql: "UPDATE squad_instances SET status = 'failed', completed_at = ? WHERE id = ?",
|
|
129
|
-
args: [new Date().toISOString(), instanceId],
|
|
130
|
-
});
|
|
131
|
-
await getEventBus().emit({
|
|
132
|
-
id: crypto.randomUUID(),
|
|
133
|
-
timestamp: new Date(),
|
|
134
|
-
type: 'instance:failed',
|
|
135
|
-
squadId: instance.squadId,
|
|
136
|
-
instanceId,
|
|
137
|
-
data: { reason: 'cancelled' },
|
|
138
|
-
});
|
|
139
|
-
// Clean up worktree
|
|
140
|
-
await cleanupInstance(instanceId, squad);
|
|
141
|
-
log.info({ instanceId }, 'Instance cancelled');
|
|
142
|
-
return true;
|
|
143
|
-
}
|
|
144
|
-
export async function cleanupInstance(instanceId, squad) {
|
|
145
|
-
const instance = activeInstances.get(instanceId);
|
|
146
|
-
if (!instance)
|
|
147
|
-
return;
|
|
148
|
-
if (instance.worktree && instance.branch) {
|
|
149
|
-
await removeWorktree({
|
|
150
|
-
repoPath: squad.projectPath,
|
|
151
|
-
worktreePath: instance.worktree.path,
|
|
152
|
-
branch: instance.branch,
|
|
153
|
-
});
|
|
154
|
-
}
|
|
155
|
-
activeInstances.delete(instanceId);
|
|
156
|
-
}
|
|
157
|
-
/** Get an active instance */
|
|
158
|
-
export function getInstance(instanceId) {
|
|
159
|
-
return activeInstances.get(instanceId);
|
|
160
|
-
}
|
|
161
|
-
/** Get all active instances for a squad */
|
|
162
|
-
export function getSquadInstances(squadId) {
|
|
163
|
-
return [...activeInstances.values()].filter((i) => i.squadId === squadId);
|
|
164
|
-
}
|
|
165
|
-
//# sourceMappingURL=instance.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"instance.js","sourceRoot":"","sources":["../../../src/squad/execution/instance.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
import type { SquadRuntime } from '../manager.js';
|
|
2
|
-
import type { Instance, InstanceTask } from './instance.js';
|
|
3
|
-
export interface PlanResult {
|
|
4
|
-
tasks: InstanceTask[];
|
|
5
|
-
}
|
|
6
|
-
/**
|
|
7
|
-
* Team Lead plans the instance alone — one LLM call to produce a task list.
|
|
8
|
-
* No round-table, no consensus, no veto at planning stage.
|
|
9
|
-
*/
|
|
10
|
-
export declare function planInstance(params: {
|
|
11
|
-
instance: Instance;
|
|
12
|
-
runtime: SquadRuntime;
|
|
13
|
-
objective: string;
|
|
14
|
-
attachments?: Array<{
|
|
15
|
-
type: 'file';
|
|
16
|
-
path: string;
|
|
17
|
-
displayName?: string;
|
|
18
|
-
}>;
|
|
19
|
-
}): Promise<PlanResult>;
|
|
20
|
-
//# sourceMappingURL=planning.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"planning.d.ts","sourceRoot":"","sources":["../../../src/squad/execution/planning.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAElD,OAAO,KAAK,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAK5D,MAAM,WAAW,UAAU;IAC1B,KAAK,EAAE,YAAY,EAAE,CAAC;CACtB;AAED;;;GAGG;AACH,wBAAsB,YAAY,CAAC,MAAM,EAAE;IAC1C,QAAQ,EAAE,QAAQ,CAAC;IACnB,OAAO,EAAE,YAAY,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAC1E,GAAG,OAAO,CAAC,UAAU,CAAC,CA2CtB"}
|
|
@@ -1,62 +0,0 @@
|
|
|
1
|
-
import { createChildLogger } from '../../logging/logger.js';
|
|
2
|
-
import { getEventBus } from '../event-bus.js';
|
|
3
|
-
import { parseTierHint } from '../model-selector.js';
|
|
4
|
-
import { transitionInstance } from './instance.js';
|
|
5
|
-
const logger = () => createChildLogger('planning');
|
|
6
|
-
/**
|
|
7
|
-
* Team Lead plans the instance alone — one LLM call to produce a task list.
|
|
8
|
-
* No round-table, no consensus, no veto at planning stage.
|
|
9
|
-
*/
|
|
10
|
-
export async function planInstance(params) {
|
|
11
|
-
const log = logger();
|
|
12
|
-
const { instance, runtime, objective, attachments } = params;
|
|
13
|
-
// Transition to planning (already in 'planning' from createInstance, transition to working skipped — we use a direct status)
|
|
14
|
-
const teamLead = runtime.members.get('technical-pm');
|
|
15
|
-
if (!teamLead)
|
|
16
|
-
throw new Error('No team lead available for planning');
|
|
17
|
-
// Track activity under this instance
|
|
18
|
-
teamLead.setInstanceId(instance.id);
|
|
19
|
-
// Build roster description so the lead knows who's available (exclude scribe — it's never assigned tasks)
|
|
20
|
-
const roster = [...runtime.members.entries()]
|
|
21
|
-
.filter(([role]) => role !== 'technical-pm' && role !== 'scribe')
|
|
22
|
-
.map(([role]) => `- ${role}`)
|
|
23
|
-
.join('\n');
|
|
24
|
-
const attachmentNote = attachments?.length
|
|
25
|
-
? `\n\nThe user has provided ${attachments.length} file(s) as reference material. They are attached to this message — review them as part of your planning.`
|
|
26
|
-
: '';
|
|
27
|
-
const taskPlan = await teamLead.send(`You are the team lead. Plan the following objective and produce a task list for your team.\n\nObjective: ${objective}${attachmentNote}\n\nYour team members (by role):\n${roster}\n\nFor each task, specify:\n1. A brief description of the work\n2. Which team member role should do it (must match a role above)\n3. The model tier needed (fast for simple edits/docs, standard for typical coding, reasoning for complex architecture/analysis)\n\nFormat each task as: "TASK: <description> | ASSIGN: <role> | MODEL_TIER: <fast|standard|reasoning>"\n\nChoose the lowest tier that can handle each task to minimize cost. Tasks will execute in parallel, so ensure they are independent and don't conflict on the same files.`, attachments);
|
|
28
|
-
const tasks = parseTaskList(taskPlan, instance.id);
|
|
29
|
-
instance.tasks = tasks;
|
|
30
|
-
instance.meetingLog = [`[technical-pm] Plan:\n${taskPlan}`];
|
|
31
|
-
await getEventBus().emit({
|
|
32
|
-
id: crypto.randomUUID(),
|
|
33
|
-
timestamp: new Date(),
|
|
34
|
-
type: 'instance:planning_complete',
|
|
35
|
-
squadId: instance.squadId,
|
|
36
|
-
instanceId: instance.id,
|
|
37
|
-
data: { taskCount: tasks.length, objective },
|
|
38
|
-
});
|
|
39
|
-
log.info({ instanceId: instance.id, tasks: tasks.length }, 'Planning complete');
|
|
40
|
-
return { tasks };
|
|
41
|
-
}
|
|
42
|
-
/** Parse the team lead's task list into structured tasks */
|
|
43
|
-
function parseTaskList(taskPlan, instanceId) {
|
|
44
|
-
const tasks = [];
|
|
45
|
-
const lines = taskPlan.split('\n');
|
|
46
|
-
for (const line of lines) {
|
|
47
|
-
const match = line.match(/TASK:\s*(.+?)\s*\|\s*ASSIGN:\s*([^|]+)(?:\s*\|\s*MODEL_TIER:\s*(\w+))?/i);
|
|
48
|
-
if (match) {
|
|
49
|
-
const tierHint = parseTierHint(match[3]);
|
|
50
|
-
tasks.push({
|
|
51
|
-
id: crypto.randomUUID(),
|
|
52
|
-
description: match[1].trim(),
|
|
53
|
-
assignedTo: match[2].trim().toLowerCase().replace(/\s+/g, '-'),
|
|
54
|
-
status: 'pending',
|
|
55
|
-
modelTier: tierHint,
|
|
56
|
-
retryCount: 0,
|
|
57
|
-
});
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
return tasks;
|
|
61
|
-
}
|
|
62
|
-
//# sourceMappingURL=planning.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"planning.js","sourceRoot":"","sources":["../../../src/squad/execution/planning.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
import type { Instance } from './instance.js';
|
|
2
|
-
export interface PrResult {
|
|
3
|
-
url: string;
|
|
4
|
-
number: number;
|
|
5
|
-
}
|
|
6
|
-
/**
|
|
7
|
-
* Create a pull request from the instance's worktree branch.
|
|
8
|
-
* Commits any uncommitted changes, pushes the branch, then creates a PR.
|
|
9
|
-
*/
|
|
10
|
-
export declare function createPullRequest(params: {
|
|
11
|
-
instance: Instance;
|
|
12
|
-
title: string;
|
|
13
|
-
squadName: string;
|
|
14
|
-
}): Promise<PrResult | null>;
|
|
15
|
-
//# sourceMappingURL=pr.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"pr.d.ts","sourceRoot":"","sources":["../../../src/squad/execution/pr.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAM9C,MAAM,WAAW,QAAQ;IACxB,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;CACf;AAED;;;GAGG;AACH,wBAAsB,iBAAiB,CAAC,MAAM,EAAE;IAC/C,QAAQ,EAAE,QAAQ,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;CAClB,GAAG,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CA0D3B"}
|
|
@@ -1,109 +0,0 @@
|
|
|
1
|
-
import { exec as execCb } from 'node:child_process';
|
|
2
|
-
import { unlinkSync, writeFileSync } from 'node:fs';
|
|
3
|
-
import { tmpdir } from 'node:os';
|
|
4
|
-
import { join } from 'node:path';
|
|
5
|
-
import { promisify } from 'node:util';
|
|
6
|
-
import { createChildLogger } from '../../logging/logger.js';
|
|
7
|
-
import { transitionInstance } from './instance.js';
|
|
8
|
-
const exec = promisify(execCb);
|
|
9
|
-
const logger = () => createChildLogger('pr');
|
|
10
|
-
/**
|
|
11
|
-
* Create a pull request from the instance's worktree branch.
|
|
12
|
-
* Commits any uncommitted changes, pushes the branch, then creates a PR.
|
|
13
|
-
*/
|
|
14
|
-
export async function createPullRequest(params) {
|
|
15
|
-
const log = logger();
|
|
16
|
-
const { instance, title, squadName } = params;
|
|
17
|
-
if (!instance.worktree || !instance.branch) {
|
|
18
|
-
log.warn({ instanceId: instance.id }, 'No worktree/branch, skipping PR creation');
|
|
19
|
-
await transitionInstance(instance.id, 'complete');
|
|
20
|
-
return null;
|
|
21
|
-
}
|
|
22
|
-
const cwd = instance.worktree.path;
|
|
23
|
-
try {
|
|
24
|
-
// Check if there are changes to commit
|
|
25
|
-
const { stdout: status } = await exec('git status --porcelain', { cwd });
|
|
26
|
-
if (!status.trim()) {
|
|
27
|
-
log.info({ instanceId: instance.id }, 'No changes to commit');
|
|
28
|
-
await transitionInstance(instance.id, 'complete');
|
|
29
|
-
return null;
|
|
30
|
-
}
|
|
31
|
-
// Stage and commit all changes
|
|
32
|
-
await exec('git add -A', { cwd });
|
|
33
|
-
const commitMessage = buildCommitMessage(title, instance, squadName);
|
|
34
|
-
await exec(`git commit -m "${escapeShell(commitMessage)}"`, { cwd });
|
|
35
|
-
// Push the branch
|
|
36
|
-
await exec(`git push -u origin "${instance.branch}"`, { cwd });
|
|
37
|
-
// Create the PR using gh CLI with --body-file to avoid shell escaping issues
|
|
38
|
-
const prBody = buildPrBody(instance, squadName);
|
|
39
|
-
const bodyFile = join(tmpdir(), `io-pr-body-${instance.id}.md`);
|
|
40
|
-
writeFileSync(bodyFile, prBody, 'utf-8');
|
|
41
|
-
try {
|
|
42
|
-
const { stdout: prOutput } = await exec(`gh pr create --title "${escapeShell(title)}" --body-file "${bodyFile}" --head "${instance.branch}"`, { cwd });
|
|
43
|
-
// Parse the PR URL to get the number
|
|
44
|
-
const prUrl = prOutput.trim();
|
|
45
|
-
const prNumber = Number.parseInt(prUrl.split('/').pop() ?? '0', 10);
|
|
46
|
-
await transitionInstance(instance.id, 'complete');
|
|
47
|
-
log.info({ instanceId: instance.id, prUrl, prNumber }, 'PR created');
|
|
48
|
-
return { url: prUrl, number: prNumber };
|
|
49
|
-
}
|
|
50
|
-
finally {
|
|
51
|
-
try {
|
|
52
|
-
unlinkSync(bodyFile);
|
|
53
|
-
}
|
|
54
|
-
catch { }
|
|
55
|
-
}
|
|
56
|
-
}
|
|
57
|
-
catch (err) {
|
|
58
|
-
const errMsg = err instanceof Error ? err.message : String(err);
|
|
59
|
-
log.error({ instanceId: instance.id, error: errMsg.slice(0, 200) }, 'Failed to create PR');
|
|
60
|
-
await transitionInstance(instance.id, 'failed');
|
|
61
|
-
return null;
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
|
-
function buildCommitMessage(title, instance, squadName) {
|
|
65
|
-
const lines = [`feat: ${title}`, '', `Squad: ${squadName}`, `Instance: ${instance.id}`];
|
|
66
|
-
if (instance.issueRef) {
|
|
67
|
-
lines.push(`Closes ${instance.issueRef}`);
|
|
68
|
-
}
|
|
69
|
-
const completedTasks = instance.tasks.filter((t) => t.status === 'done');
|
|
70
|
-
if (completedTasks.length > 0) {
|
|
71
|
-
lines.push('', 'Tasks completed:');
|
|
72
|
-
for (const task of completedTasks) {
|
|
73
|
-
lines.push(`- ${task.description} (${task.assignedTo})`);
|
|
74
|
-
}
|
|
75
|
-
}
|
|
76
|
-
return lines.join('\n');
|
|
77
|
-
}
|
|
78
|
-
function buildPrBody(instance, squadName) {
|
|
79
|
-
const sections = [];
|
|
80
|
-
sections.push(`## 🤖 Generated by IO Squad: ${squadName}`);
|
|
81
|
-
sections.push('');
|
|
82
|
-
if (instance.issueRef) {
|
|
83
|
-
sections.push(`Closes ${instance.issueRef}`);
|
|
84
|
-
sections.push('');
|
|
85
|
-
}
|
|
86
|
-
// Tasks section
|
|
87
|
-
sections.push('### Tasks Completed');
|
|
88
|
-
for (const task of instance.tasks) {
|
|
89
|
-
const icon = task.status === 'done' ? '✅' : task.status === 'failed' ? '❌' : '⏳';
|
|
90
|
-
sections.push(`${icon} ${task.description} — *${task.assignedTo}*`);
|
|
91
|
-
}
|
|
92
|
-
// Meeting highlights (last few entries)
|
|
93
|
-
if (instance.meetingLog.length > 0) {
|
|
94
|
-
sections.push('');
|
|
95
|
-
sections.push('<details><summary>Meeting Discussion</summary>');
|
|
96
|
-
sections.push('');
|
|
97
|
-
const recentLog = instance.meetingLog.slice(-10);
|
|
98
|
-
for (const entry of recentLog) {
|
|
99
|
-
sections.push(`> ${entry.slice(0, 200)}`);
|
|
100
|
-
sections.push('');
|
|
101
|
-
}
|
|
102
|
-
sections.push('</details>');
|
|
103
|
-
}
|
|
104
|
-
return sections.join('\n');
|
|
105
|
-
}
|
|
106
|
-
function escapeShell(str) {
|
|
107
|
-
return str.replace(/"/g, '\\"').replace(/\n/g, '\\n');
|
|
108
|
-
}
|
|
109
|
-
//# sourceMappingURL=pr.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"pr.js","sourceRoot":"","sources":["../../../src/squad/execution/pr.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
import type { SquadRuntime } from '../manager.js';
|
|
2
|
-
import type { Instance } from './instance.js';
|
|
3
|
-
export interface ReviewResult {
|
|
4
|
-
approved: boolean;
|
|
5
|
-
cycles: number;
|
|
6
|
-
failureReason?: string;
|
|
7
|
-
}
|
|
8
|
-
/**
|
|
9
|
-
* Gated review cycle:
|
|
10
|
-
* 1. Lead reviews all task results
|
|
11
|
-
* 2. If lead rejects → identifies tasks to rework, specialists rework in parallel
|
|
12
|
-
* 3. If lead approves → QA/veto reviews
|
|
13
|
-
* 4. If QA rejects → same rework loop
|
|
14
|
-
* 5. Max 5 cycles total, then fail to inbox
|
|
15
|
-
*/
|
|
16
|
-
export declare function reviewWork(params: {
|
|
17
|
-
instance: Instance;
|
|
18
|
-
runtime: SquadRuntime;
|
|
19
|
-
objective: string;
|
|
20
|
-
}): Promise<ReviewResult>;
|
|
21
|
-
//# sourceMappingURL=review.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"review.d.ts","sourceRoot":"","sources":["../../../src/squad/execution/review.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAGlD,OAAO,KAAK,EAAE,QAAQ,EAAgB,MAAM,eAAe,CAAC;AAQ5D,MAAM,WAAW,YAAY;IAC5B,QAAQ,EAAE,OAAO,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,aAAa,CAAC,EAAE,MAAM,CAAC;CACvB;AAED;;;;;;;GAOG;AACH,wBAAsB,UAAU,CAAC,MAAM,EAAE;IACxC,QAAQ,EAAE,QAAQ,CAAC;IACnB,OAAO,EAAE,YAAY,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;CAClB,GAAG,OAAO,CAAC,YAAY,CAAC,CA+HxB"}
|