@bradygaster/squad-cli 0.7.0 → 0.8.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.
- package/README.md +77 -77
- package/dist/cli/commands/copilot.d.ts +13 -0
- package/dist/cli/commands/copilot.d.ts.map +1 -0
- package/dist/cli/commands/copilot.js +86 -0
- package/dist/cli/commands/copilot.js.map +1 -0
- package/dist/cli/commands/export.d.ts +9 -0
- package/dist/cli/commands/export.d.ts.map +1 -0
- package/dist/cli/commands/export.js +89 -0
- package/dist/cli/commands/export.js.map +1 -0
- package/dist/cli/commands/import.d.ts +9 -0
- package/dist/cli/commands/import.d.ts.map +1 -0
- package/dist/cli/commands/import.js +116 -0
- package/dist/cli/commands/import.js.map +1 -0
- package/dist/cli/commands/plugin.d.ts +14 -0
- package/dist/cli/commands/plugin.d.ts.map +1 -0
- package/dist/cli/commands/plugin.js +134 -0
- package/dist/cli/commands/plugin.js.map +1 -0
- package/dist/cli/commands/watch.d.ts +8 -0
- package/dist/cli/commands/watch.d.ts.map +1 -0
- package/dist/cli/commands/watch.js +178 -0
- package/dist/cli/commands/watch.js.map +1 -0
- package/dist/cli/copilot-install.d.ts +73 -0
- package/dist/cli/copilot-install.d.ts.map +1 -0
- package/dist/cli/copilot-install.js +117 -0
- package/dist/cli/copilot-install.js.map +1 -0
- package/dist/cli/core/detect-squad-dir.d.ts +13 -0
- package/dist/cli/core/detect-squad-dir.d.ts.map +1 -0
- package/dist/cli/core/detect-squad-dir.js +21 -0
- package/dist/cli/core/detect-squad-dir.js.map +1 -0
- package/dist/cli/core/email-scrub.d.ts +10 -0
- package/dist/cli/core/email-scrub.d.ts.map +1 -0
- package/dist/cli/core/email-scrub.js +103 -0
- package/dist/cli/core/email-scrub.js.map +1 -0
- package/dist/cli/core/errors.d.ts +17 -0
- package/dist/cli/core/errors.d.ts.map +1 -0
- package/dist/cli/core/errors.js +22 -0
- package/dist/cli/core/errors.js.map +1 -0
- package/dist/cli/core/gh-cli.d.ts +41 -0
- package/dist/cli/core/gh-cli.d.ts.map +1 -0
- package/dist/cli/core/gh-cli.js +67 -0
- package/dist/cli/core/gh-cli.js.map +1 -0
- package/dist/cli/core/history-split.d.ts +9 -0
- package/dist/cli/core/history-split.d.ts.map +1 -0
- package/dist/cli/core/history-split.js +65 -0
- package/dist/cli/core/history-split.js.map +1 -0
- package/dist/cli/core/init.d.ts +9 -0
- package/dist/cli/core/init.d.ts.map +1 -0
- package/dist/cli/core/init.js +296 -0
- package/dist/cli/core/init.js.map +1 -0
- package/dist/cli/core/migrate-directory.d.ts +11 -0
- package/dist/cli/core/migrate-directory.d.ts.map +1 -0
- package/dist/cli/core/migrate-directory.js +71 -0
- package/dist/cli/core/migrate-directory.js.map +1 -0
- package/dist/cli/core/migrations.d.ts +11 -0
- package/dist/cli/core/migrations.d.ts.map +1 -0
- package/dist/cli/core/migrations.js +78 -0
- package/dist/cli/core/migrations.js.map +1 -0
- package/dist/cli/core/output.d.ts +34 -0
- package/dist/cli/core/output.d.ts.map +1 -0
- package/dist/cli/core/output.js +47 -0
- package/dist/cli/core/output.js.map +1 -0
- package/dist/cli/core/project-type.d.ts +9 -0
- package/dist/cli/core/project-type.d.ts.map +1 -0
- package/dist/cli/core/project-type.js +29 -0
- package/dist/cli/core/project-type.js.map +1 -0
- package/dist/cli/core/team-md.d.ts +28 -0
- package/dist/cli/core/team-md.d.ts.map +1 -0
- package/dist/cli/core/team-md.js +91 -0
- package/dist/cli/core/team-md.js.map +1 -0
- package/dist/cli/core/templates.d.ts +30 -0
- package/dist/cli/core/templates.d.ts.map +1 -0
- package/dist/cli/core/templates.js +247 -0
- package/dist/cli/core/templates.js.map +1 -0
- package/dist/cli/core/upgrade.d.ts +20 -0
- package/dist/cli/core/upgrade.d.ts.map +1 -0
- package/dist/cli/core/upgrade.js +399 -0
- package/dist/cli/core/upgrade.js.map +1 -0
- package/dist/cli/core/version.d.ts +18 -0
- package/dist/cli/core/version.d.ts.map +1 -0
- package/dist/cli/core/version.js +61 -0
- package/dist/cli/core/version.js.map +1 -0
- package/dist/cli/core/workflows.d.ts +10 -0
- package/dist/cli/core/workflows.d.ts.map +1 -0
- package/dist/cli/core/workflows.js +155 -0
- package/dist/cli/core/workflows.js.map +1 -0
- package/dist/cli/index.d.ts +26 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +26 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/shell/autocomplete.d.ts +12 -0
- package/dist/cli/shell/autocomplete.d.ts.map +1 -0
- package/dist/cli/shell/autocomplete.js +39 -0
- package/dist/cli/shell/autocomplete.js.map +1 -0
- package/dist/cli/shell/commands.d.ts +19 -0
- package/dist/cli/shell/commands.d.ts.map +1 -0
- package/dist/cli/shell/commands.js +87 -0
- package/dist/cli/shell/commands.js.map +1 -0
- package/dist/cli/shell/components/AgentPanel.d.ts +8 -0
- package/dist/cli/shell/components/AgentPanel.d.ts.map +1 -0
- package/dist/cli/shell/components/AgentPanel.js +17 -0
- package/dist/cli/shell/components/AgentPanel.js.map +1 -0
- package/dist/cli/shell/components/InputPrompt.d.ts +9 -0
- package/dist/cli/shell/components/InputPrompt.d.ts.map +1 -0
- package/dist/cli/shell/components/InputPrompt.js +50 -0
- package/dist/cli/shell/components/InputPrompt.js.map +1 -0
- package/dist/cli/shell/components/MessageStream.d.ts +13 -0
- package/dist/cli/shell/components/MessageStream.d.ts.map +1 -0
- package/dist/cli/shell/components/MessageStream.js +7 -0
- package/dist/cli/shell/components/MessageStream.js.map +1 -0
- package/dist/cli/shell/components/index.d.ts +4 -0
- package/dist/cli/shell/components/index.d.ts.map +1 -0
- package/dist/cli/shell/components/index.js +4 -0
- package/dist/cli/shell/components/index.js.map +1 -0
- package/dist/cli/shell/coordinator.d.ts +32 -0
- package/dist/cli/shell/coordinator.d.ts.map +1 -0
- package/dist/cli/shell/coordinator.js +113 -0
- package/dist/cli/shell/coordinator.js.map +1 -0
- package/dist/cli/shell/index.d.ts +28 -0
- package/dist/cli/shell/index.d.ts.map +1 -0
- package/dist/cli/shell/index.js +66 -0
- package/dist/cli/shell/index.js.map +1 -0
- package/dist/cli/shell/lifecycle.d.ts +52 -0
- package/dist/cli/shell/lifecycle.d.ts.map +1 -0
- package/dist/cli/shell/lifecycle.js +168 -0
- package/dist/cli/shell/lifecycle.js.map +1 -0
- package/dist/cli/shell/memory.d.ts +36 -0
- package/dist/cli/shell/memory.d.ts.map +1 -0
- package/dist/cli/shell/memory.js +53 -0
- package/dist/cli/shell/memory.js.map +1 -0
- package/dist/cli/shell/render.d.ts +22 -0
- package/dist/cli/shell/render.d.ts.map +1 -0
- package/dist/cli/shell/render.js +44 -0
- package/dist/cli/shell/render.js.map +1 -0
- package/dist/cli/shell/router.d.ts +17 -0
- package/dist/cli/shell/router.d.ts.map +1 -0
- package/dist/cli/shell/router.js +55 -0
- package/dist/cli/shell/router.js.map +1 -0
- package/dist/cli/shell/sessions.d.ts +15 -0
- package/dist/cli/shell/sessions.d.ts.map +1 -0
- package/dist/cli/shell/sessions.js +37 -0
- package/dist/cli/shell/sessions.js.map +1 -0
- package/dist/cli/shell/spawn.d.ts +47 -0
- package/dist/cli/shell/spawn.d.ts.map +1 -0
- package/dist/cli/shell/spawn.js +77 -0
- package/dist/cli/shell/spawn.js.map +1 -0
- package/dist/cli/shell/stream-bridge.d.ts +60 -0
- package/dist/cli/shell/stream-bridge.d.ts.map +1 -0
- package/dist/cli/shell/stream-bridge.js +98 -0
- package/dist/cli/shell/stream-bridge.js.map +1 -0
- package/dist/cli/shell/terminal.d.ts +30 -0
- package/dist/cli/shell/terminal.d.ts.map +1 -0
- package/dist/cli/shell/terminal.js +34 -0
- package/dist/cli/shell/terminal.js.map +1 -0
- package/dist/cli/shell/types.d.ts +21 -0
- package/dist/cli/shell/types.d.ts.map +1 -0
- package/dist/cli/shell/types.js +5 -0
- package/dist/cli/shell/types.js.map +1 -0
- package/dist/cli/upgrade.d.ts +141 -0
- package/dist/cli/upgrade.d.ts.map +1 -0
- package/dist/cli/upgrade.js +226 -0
- package/dist/cli/upgrade.js.map +1 -0
- package/dist/cli-entry.d.ts +10 -0
- package/dist/cli-entry.d.ts.map +1 -0
- package/dist/cli-entry.js +213 -0
- package/dist/cli-entry.js.map +1 -0
- package/dist/cli.js +2 -2
- package/package.json +45 -34
- package/templates/casting-history.json +4 -0
- package/templates/casting-policy.json +35 -0
- package/templates/casting-registry.json +3 -0
- package/templates/ceremonies.md +41 -0
- package/templates/charter.md +53 -0
- package/templates/constraint-tracking.md +38 -0
- package/templates/copilot-instructions.md +46 -0
- package/templates/history.md +10 -0
- package/templates/identity/now.md +9 -0
- package/templates/identity/wisdom.md +15 -0
- package/templates/mcp-config.md +90 -0
- package/templates/multi-agent-format.md +28 -0
- package/templates/orchestration-log.md +27 -0
- package/templates/plugin-marketplace.md +49 -0
- package/templates/raw-agent-output.md +37 -0
- package/templates/roster.md +60 -0
- package/templates/routing.md +54 -0
- package/templates/run-output.md +50 -0
- package/templates/scribe-charter.md +119 -0
- package/templates/skill.md +24 -0
- package/templates/skills/squad-conventions/SKILL.md +69 -0
- package/templates/squad.agent.md +1146 -0
- package/templates/workflows/squad-ci.yml +24 -0
- package/templates/workflows/squad-docs.yml +50 -0
- package/templates/workflows/squad-heartbeat.yml +315 -0
- package/templates/workflows/squad-insider-release.yml +61 -0
- package/templates/workflows/squad-issue-assign.yml +161 -0
- package/templates/workflows/squad-label-enforce.yml +181 -0
- package/templates/workflows/squad-main-guard.yml +129 -0
- package/templates/workflows/squad-preview.yml +55 -0
- package/templates/workflows/squad-promote.yml +121 -0
- package/templates/workflows/squad-release.yml +77 -0
- package/templates/workflows/squad-triage.yml +260 -0
- package/templates/workflows/sync-squad-labels.yml +169 -0
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Memory management for shell sessions.
|
|
3
|
+
* Enforces buffer limits and handles cleanup.
|
|
4
|
+
*/
|
|
5
|
+
export const DEFAULT_LIMITS = {
|
|
6
|
+
maxMessages: 1000,
|
|
7
|
+
maxStreamBuffer: 1024 * 1024, // 1MB
|
|
8
|
+
maxSessions: 10,
|
|
9
|
+
sessionIdleTimeout: 5 * 60 * 1000, // 5 minutes
|
|
10
|
+
};
|
|
11
|
+
export class MemoryManager {
|
|
12
|
+
limits;
|
|
13
|
+
bufferSizes = new Map();
|
|
14
|
+
constructor(limits = {}) {
|
|
15
|
+
this.limits = { ...DEFAULT_LIMITS, ...limits };
|
|
16
|
+
}
|
|
17
|
+
/** Check if a new session can be created */
|
|
18
|
+
canCreateSession(currentCount) {
|
|
19
|
+
return currentCount < this.limits.maxSessions;
|
|
20
|
+
}
|
|
21
|
+
/** Track buffer growth, return true if within limits */
|
|
22
|
+
trackBuffer(sessionId, additionalBytes) {
|
|
23
|
+
const current = this.bufferSizes.get(sessionId) ?? 0;
|
|
24
|
+
const newSize = current + additionalBytes;
|
|
25
|
+
if (newSize > this.limits.maxStreamBuffer) {
|
|
26
|
+
return false; // would exceed limit
|
|
27
|
+
}
|
|
28
|
+
this.bufferSizes.set(sessionId, newSize);
|
|
29
|
+
return true;
|
|
30
|
+
}
|
|
31
|
+
/** Trim message history to limit */
|
|
32
|
+
trimMessages(messages) {
|
|
33
|
+
if (messages.length <= this.limits.maxMessages)
|
|
34
|
+
return messages;
|
|
35
|
+
return messages.slice(-this.limits.maxMessages);
|
|
36
|
+
}
|
|
37
|
+
/** Clear buffer tracking for a session */
|
|
38
|
+
clearBuffer(sessionId) {
|
|
39
|
+
this.bufferSizes.delete(sessionId);
|
|
40
|
+
}
|
|
41
|
+
/** Get current memory stats */
|
|
42
|
+
getStats() {
|
|
43
|
+
let total = 0;
|
|
44
|
+
for (const size of this.bufferSizes.values())
|
|
45
|
+
total += size;
|
|
46
|
+
return { sessions: this.bufferSizes.size, totalBufferBytes: total };
|
|
47
|
+
}
|
|
48
|
+
/** Get configured limits */
|
|
49
|
+
getLimits() {
|
|
50
|
+
return { ...this.limits };
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=memory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory.js","sourceRoot":"","sources":["../../../src/cli/shell/memory.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAaH,MAAM,CAAC,MAAM,cAAc,GAAiB;IAC1C,WAAW,EAAE,IAAI;IACjB,eAAe,EAAE,IAAI,GAAG,IAAI,EAAE,MAAM;IACpC,WAAW,EAAE,EAAE;IACf,kBAAkB,EAAE,CAAC,GAAG,EAAE,GAAG,IAAI,EAAE,YAAY;CAChD,CAAC;AAEF,MAAM,OAAO,aAAa;IAChB,MAAM,CAAe;IACrB,WAAW,GAAG,IAAI,GAAG,EAAkB,CAAC;IAEhD,YAAY,SAAgC,EAAE;QAC5C,IAAI,CAAC,MAAM,GAAG,EAAE,GAAG,cAAc,EAAE,GAAG,MAAM,EAAE,CAAC;IACjD,CAAC;IAED,4CAA4C;IAC5C,gBAAgB,CAAC,YAAoB;QACnC,OAAO,YAAY,GAAG,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC;IAChD,CAAC;IAED,wDAAwD;IACxD,WAAW,CAAC,SAAiB,EAAE,eAAuB;QACpD,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QACrD,MAAM,OAAO,GAAG,OAAO,GAAG,eAAe,CAAC;QAC1C,IAAI,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,eAAe,EAAE,CAAC;YAC1C,OAAO,KAAK,CAAC,CAAC,qBAAqB;QACrC,CAAC;QACD,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;QACzC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,oCAAoC;IACpC,YAAY,CAAI,QAAa;QAC3B,IAAI,QAAQ,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,CAAC,WAAW;YAAE,OAAO,QAAQ,CAAC;QAChE,OAAO,QAAQ,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;IAClD,CAAC;IAED,0CAA0C;IAC1C,WAAW,CAAC,SAAiB;QAC3B,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IACrC,CAAC;IAED,+BAA+B;IAC/B,QAAQ;QACN,IAAI,KAAK,GAAG,CAAC,CAAC;QACd,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE;YAAE,KAAK,IAAI,IAAI,CAAC;QAC5D,OAAO,EAAE,QAAQ,EAAE,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,gBAAgB,EAAE,KAAK,EAAE,CAAC;IACtE,CAAC;IAED,4BAA4B;IAC5B,SAAS;QACP,OAAO,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;IAC5B,CAAC;CACF"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Console-based shell renderer.
|
|
3
|
+
*
|
|
4
|
+
* Renders agent output to the terminal using plain stdout writes.
|
|
5
|
+
* This is the pre-ink renderer — will be replaced with ink components later.
|
|
6
|
+
*
|
|
7
|
+
* @module cli/shell/render
|
|
8
|
+
*/
|
|
9
|
+
export declare class ShellRenderer {
|
|
10
|
+
private currentAgent;
|
|
11
|
+
/** Print a content delta (streaming chunk). */
|
|
12
|
+
renderDelta(agentName: string, content: string): void;
|
|
13
|
+
/** Print a complete message. */
|
|
14
|
+
renderMessage(role: string, name: string | undefined, content: string): void;
|
|
15
|
+
/** Print a system message. */
|
|
16
|
+
renderSystem(message: string): void;
|
|
17
|
+
/** Print an error. */
|
|
18
|
+
renderError(agentName: string, error: string): void;
|
|
19
|
+
/** Print usage stats. */
|
|
20
|
+
renderUsage(model: string, inputTokens: number, outputTokens: number, cost: number): void;
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=render.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"render.d.ts","sourceRoot":"","sources":["../../../src/cli/shell/render.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,qBAAa,aAAa;IACxB,OAAO,CAAC,YAAY,CAAuB;IAE3C,+CAA+C;IAC/C,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI;IASrD,gCAAgC;IAChC,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,SAAS,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI;IAM5E,8BAA8B;IAC9B,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAKnC,sBAAsB;IACtB,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IAKnD,yBAAyB;IACzB,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI;CAK1F"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Console-based shell renderer.
|
|
3
|
+
*
|
|
4
|
+
* Renders agent output to the terminal using plain stdout writes.
|
|
5
|
+
* This is the pre-ink renderer — will be replaced with ink components later.
|
|
6
|
+
*
|
|
7
|
+
* @module cli/shell/render
|
|
8
|
+
*/
|
|
9
|
+
export class ShellRenderer {
|
|
10
|
+
currentAgent = null;
|
|
11
|
+
/** Print a content delta (streaming chunk). */
|
|
12
|
+
renderDelta(agentName, content) {
|
|
13
|
+
if (this.currentAgent !== agentName) {
|
|
14
|
+
if (this.currentAgent)
|
|
15
|
+
process.stdout.write('\n');
|
|
16
|
+
process.stdout.write(`\n${agentName}: `);
|
|
17
|
+
this.currentAgent = agentName;
|
|
18
|
+
}
|
|
19
|
+
process.stdout.write(content);
|
|
20
|
+
}
|
|
21
|
+
/** Print a complete message. */
|
|
22
|
+
renderMessage(role, name, content) {
|
|
23
|
+
const prefix = name ? `${name}` : role;
|
|
24
|
+
console.log(`\n${prefix}: ${content}`);
|
|
25
|
+
this.currentAgent = null;
|
|
26
|
+
}
|
|
27
|
+
/** Print a system message. */
|
|
28
|
+
renderSystem(message) {
|
|
29
|
+
console.log(`\n💡 ${message}`);
|
|
30
|
+
this.currentAgent = null;
|
|
31
|
+
}
|
|
32
|
+
/** Print an error. */
|
|
33
|
+
renderError(agentName, error) {
|
|
34
|
+
console.error(`\n❌ ${agentName}: ${error}`);
|
|
35
|
+
this.currentAgent = null;
|
|
36
|
+
}
|
|
37
|
+
/** Print usage stats. */
|
|
38
|
+
renderUsage(model, inputTokens, outputTokens, cost) {
|
|
39
|
+
if (cost > 0) {
|
|
40
|
+
console.log(` 📊 ${model}: ${inputTokens}+${outputTokens} tokens ($${cost.toFixed(4)})`);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=render.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"render.js","sourceRoot":"","sources":["../../../src/cli/shell/render.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,MAAM,OAAO,aAAa;IAChB,YAAY,GAAkB,IAAI,CAAC;IAE3C,+CAA+C;IAC/C,WAAW,CAAC,SAAiB,EAAE,OAAe;QAC5C,IAAI,IAAI,CAAC,YAAY,KAAK,SAAS,EAAE,CAAC;YACpC,IAAI,IAAI,CAAC,YAAY;gBAAE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAClD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,SAAS,IAAI,CAAC,CAAC;YACzC,IAAI,CAAC,YAAY,GAAG,SAAS,CAAC;QAChC,CAAC;QACD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAChC,CAAC;IAED,gCAAgC;IAChC,aAAa,CAAC,IAAY,EAAE,IAAwB,EAAE,OAAe;QACnE,MAAM,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;QACvC,OAAO,CAAC,GAAG,CAAC,KAAK,MAAM,KAAK,OAAO,EAAE,CAAC,CAAC;QACvC,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;IAC3B,CAAC;IAED,8BAA8B;IAC9B,YAAY,CAAC,OAAe;QAC1B,OAAO,CAAC,GAAG,CAAC,QAAQ,OAAO,EAAE,CAAC,CAAC;QAC/B,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;IAC3B,CAAC;IAED,sBAAsB;IACtB,WAAW,CAAC,SAAiB,EAAE,KAAa;QAC1C,OAAO,CAAC,KAAK,CAAC,OAAO,SAAS,KAAK,KAAK,EAAE,CAAC,CAAC;QAC5C,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;IAC3B,CAAC;IAED,yBAAyB;IACzB,WAAW,CAAC,KAAa,EAAE,WAAmB,EAAE,YAAoB,EAAE,IAAY;QAChF,IAAI,IAAI,GAAG,CAAC,EAAE,CAAC;YACb,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,KAAK,WAAW,IAAI,YAAY,aAAa,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;QAC5F,CAAC;IACH,CAAC;CACF"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export type MessageType = 'slash_command' | 'direct_agent' | 'coordinator';
|
|
2
|
+
export interface ParsedInput {
|
|
3
|
+
type: MessageType;
|
|
4
|
+
raw: string;
|
|
5
|
+
command?: string;
|
|
6
|
+
args?: string[];
|
|
7
|
+
agentName?: string;
|
|
8
|
+
content?: string;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Parse user input to determine routing.
|
|
12
|
+
* - /command → slash command
|
|
13
|
+
* - @AgentName message → direct to agent
|
|
14
|
+
* - anything else → coordinator
|
|
15
|
+
*/
|
|
16
|
+
export declare function parseInput(input: string, knownAgents: string[]): ParsedInput;
|
|
17
|
+
//# sourceMappingURL=router.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"router.d.ts","sourceRoot":"","sources":["../../../src/cli/shell/router.ts"],"names":[],"mappings":"AAGA,MAAM,MAAM,WAAW,GAAG,eAAe,GAAG,cAAc,GAAG,aAAa,CAAC;AAE3E,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,WAAW,CAAC;IAClB,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;;;;GAKG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,GAAG,WAAW,CAmD5E"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Parse user input to determine routing.
|
|
3
|
+
* - /command → slash command
|
|
4
|
+
* - @AgentName message → direct to agent
|
|
5
|
+
* - anything else → coordinator
|
|
6
|
+
*/
|
|
7
|
+
export function parseInput(input, knownAgents) {
|
|
8
|
+
const trimmed = input.trim();
|
|
9
|
+
// Slash commands
|
|
10
|
+
if (trimmed.startsWith('/')) {
|
|
11
|
+
const parts = trimmed.slice(1).split(/\s+/);
|
|
12
|
+
return {
|
|
13
|
+
type: 'slash_command',
|
|
14
|
+
raw: trimmed,
|
|
15
|
+
command: parts[0].toLowerCase(),
|
|
16
|
+
args: parts.slice(1),
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
// @Agent direct addressing
|
|
20
|
+
const atMatch = trimmed.match(/^@(\w+)\s*(.*)/s);
|
|
21
|
+
if (atMatch) {
|
|
22
|
+
const name = atMatch[1];
|
|
23
|
+
// Case-insensitive match against known agents
|
|
24
|
+
const match = knownAgents.find(a => a.toLowerCase() === name.toLowerCase());
|
|
25
|
+
if (match) {
|
|
26
|
+
return {
|
|
27
|
+
type: 'direct_agent',
|
|
28
|
+
raw: trimmed,
|
|
29
|
+
agentName: match,
|
|
30
|
+
content: atMatch[2].trim() || undefined,
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
// Also support "AgentName, do something" syntax
|
|
35
|
+
const commaMatch = trimmed.match(/^(\w+),\s*(.*)/s);
|
|
36
|
+
if (commaMatch) {
|
|
37
|
+
const name = commaMatch[1];
|
|
38
|
+
const match = knownAgents.find(a => a.toLowerCase() === name.toLowerCase());
|
|
39
|
+
if (match) {
|
|
40
|
+
return {
|
|
41
|
+
type: 'direct_agent',
|
|
42
|
+
raw: trimmed,
|
|
43
|
+
agentName: match,
|
|
44
|
+
content: commaMatch[2].trim() || undefined,
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
// Default: route to coordinator
|
|
49
|
+
return {
|
|
50
|
+
type: 'coordinator',
|
|
51
|
+
raw: trimmed,
|
|
52
|
+
content: trimmed,
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=router.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"router.js","sourceRoot":"","sources":["../../../src/cli/shell/router.ts"],"names":[],"mappings":"AAcA;;;;;GAKG;AACH,MAAM,UAAU,UAAU,CAAC,KAAa,EAAE,WAAqB;IAC7D,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IAE7B,iBAAiB;IACjB,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QAC5B,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAC5C,OAAO;YACL,IAAI,EAAE,eAAe;YACrB,GAAG,EAAE,OAAO;YACZ,OAAO,EAAE,KAAK,CAAC,CAAC,CAAE,CAAC,WAAW,EAAE;YAChC,IAAI,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;SACrB,CAAC;IACJ,CAAC;IAED,2BAA2B;IAC3B,MAAM,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC;IACjD,IAAI,OAAO,EAAE,CAAC;QACZ,MAAM,IAAI,GAAG,OAAO,CAAC,CAAC,CAAE,CAAC;QACzB,8CAA8C;QAC9C,MAAM,KAAK,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,KAAK,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;QAC5E,IAAI,KAAK,EAAE,CAAC;YACV,OAAO;gBACL,IAAI,EAAE,cAAc;gBACpB,GAAG,EAAE,OAAO;gBACZ,SAAS,EAAE,KAAK;gBAChB,OAAO,EAAE,OAAO,CAAC,CAAC,CAAE,CAAC,IAAI,EAAE,IAAI,SAAS;aACzC,CAAC;QACJ,CAAC;IACH,CAAC;IAED,gDAAgD;IAChD,MAAM,UAAU,GAAG,OAAO,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC;IACpD,IAAI,UAAU,EAAE,CAAC;QACf,MAAM,IAAI,GAAG,UAAU,CAAC,CAAC,CAAE,CAAC;QAC5B,MAAM,KAAK,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,KAAK,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;QAC5E,IAAI,KAAK,EAAE,CAAC;YACV,OAAO;gBACL,IAAI,EAAE,cAAc;gBACpB,GAAG,EAAE,OAAO;gBACZ,SAAS,EAAE,KAAK;gBAChB,OAAO,EAAE,UAAU,CAAC,CAAC,CAAE,CAAC,IAAI,EAAE,IAAI,SAAS;aAC5C,CAAC;QACJ,CAAC;IACH,CAAC;IAED,gCAAgC;IAChC,OAAO;QACL,IAAI,EAAE,aAAa;QACnB,GAAG,EAAE,OAAO;QACZ,OAAO,EAAE,OAAO;KACjB,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Session registry — tracks active agent sessions within the interactive shell.
|
|
3
|
+
*/
|
|
4
|
+
import { AgentSession } from './types.js';
|
|
5
|
+
export declare class SessionRegistry {
|
|
6
|
+
private sessions;
|
|
7
|
+
register(name: string, role: string): AgentSession;
|
|
8
|
+
get(name: string): AgentSession | undefined;
|
|
9
|
+
getAll(): AgentSession[];
|
|
10
|
+
getActive(): AgentSession[];
|
|
11
|
+
updateStatus(name: string, status: AgentSession['status']): void;
|
|
12
|
+
remove(name: string): boolean;
|
|
13
|
+
clear(): void;
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=sessions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sessions.d.ts","sourceRoot":"","sources":["../../../src/cli/shell/sessions.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE1C,qBAAa,eAAe;IAC1B,OAAO,CAAC,QAAQ,CAAmC;IAEnD,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,YAAY;IAWlD,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS;IAI3C,MAAM,IAAI,YAAY,EAAE;IAIxB,SAAS,IAAI,YAAY,EAAE;IAI3B,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,CAAC,QAAQ,CAAC,GAAG,IAAI;IAKhE,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAI7B,KAAK,IAAI,IAAI;CAGd"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Session registry — tracks active agent sessions within the interactive shell.
|
|
3
|
+
*/
|
|
4
|
+
export class SessionRegistry {
|
|
5
|
+
sessions = new Map();
|
|
6
|
+
register(name, role) {
|
|
7
|
+
const session = {
|
|
8
|
+
name,
|
|
9
|
+
role,
|
|
10
|
+
status: 'idle',
|
|
11
|
+
startedAt: new Date(),
|
|
12
|
+
};
|
|
13
|
+
this.sessions.set(name, session);
|
|
14
|
+
return session;
|
|
15
|
+
}
|
|
16
|
+
get(name) {
|
|
17
|
+
return this.sessions.get(name);
|
|
18
|
+
}
|
|
19
|
+
getAll() {
|
|
20
|
+
return Array.from(this.sessions.values());
|
|
21
|
+
}
|
|
22
|
+
getActive() {
|
|
23
|
+
return this.getAll().filter(s => s.status === 'working' || s.status === 'streaming');
|
|
24
|
+
}
|
|
25
|
+
updateStatus(name, status) {
|
|
26
|
+
const session = this.sessions.get(name);
|
|
27
|
+
if (session)
|
|
28
|
+
session.status = status;
|
|
29
|
+
}
|
|
30
|
+
remove(name) {
|
|
31
|
+
return this.sessions.delete(name);
|
|
32
|
+
}
|
|
33
|
+
clear() {
|
|
34
|
+
this.sessions.clear();
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=sessions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sessions.js","sourceRoot":"","sources":["../../../src/cli/shell/sessions.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,MAAM,OAAO,eAAe;IAClB,QAAQ,GAAG,IAAI,GAAG,EAAwB,CAAC;IAEnD,QAAQ,CAAC,IAAY,EAAE,IAAY;QACjC,MAAM,OAAO,GAAiB;YAC5B,IAAI;YACJ,IAAI;YACJ,MAAM,EAAE,MAAM;YACd,SAAS,EAAE,IAAI,IAAI,EAAE;SACtB,CAAC;QACF,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QACjC,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,GAAG,CAAC,IAAY;QACd,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACjC,CAAC;IAED,MAAM;QACJ,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;IAC5C,CAAC;IAED,SAAS;QACP,OAAO,IAAI,CAAC,MAAM,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,SAAS,IAAI,CAAC,CAAC,MAAM,KAAK,WAAW,CAAC,CAAC;IACvF,CAAC;IAED,YAAY,CAAC,IAAY,EAAE,MAA8B;QACvD,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACxC,IAAI,OAAO;YAAE,OAAO,CAAC,MAAM,GAAG,MAAM,CAAC;IACvC,CAAC;IAED,MAAM,CAAC,IAAY;QACjB,OAAO,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IACpC,CAAC;IAED,KAAK;QACH,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;IACxB,CAAC;CACF"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Agent spawning — loads charters, builds prompts, and manages spawn lifecycle.
|
|
3
|
+
*
|
|
4
|
+
* Full SDK session integration is stubbed pending CopilotClient session API wiring.
|
|
5
|
+
*/
|
|
6
|
+
import { SessionRegistry } from './sessions.js';
|
|
7
|
+
export interface SpawnOptions {
|
|
8
|
+
/** Wait for completion (sync) or fire-and-track (background) */
|
|
9
|
+
mode: 'sync' | 'background';
|
|
10
|
+
/** Additional system prompt context */
|
|
11
|
+
systemContext?: string;
|
|
12
|
+
/** Tool definitions to register */
|
|
13
|
+
tools?: ToolDefinition[];
|
|
14
|
+
}
|
|
15
|
+
export interface ToolDefinition {
|
|
16
|
+
name: string;
|
|
17
|
+
description: string;
|
|
18
|
+
parameters: Record<string, unknown>;
|
|
19
|
+
}
|
|
20
|
+
export interface SpawnResult {
|
|
21
|
+
agentName: string;
|
|
22
|
+
status: 'completed' | 'streaming' | 'error';
|
|
23
|
+
response?: string;
|
|
24
|
+
error?: string;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Load agent charter from .squad/agents/{name}/charter.md
|
|
28
|
+
*/
|
|
29
|
+
export declare function loadAgentCharter(agentName: string, teamRoot?: string): string;
|
|
30
|
+
/**
|
|
31
|
+
* Build system prompt for an agent from their charter + optional context
|
|
32
|
+
*/
|
|
33
|
+
export declare function buildAgentPrompt(charter: string, options?: {
|
|
34
|
+
systemContext?: string;
|
|
35
|
+
}): string;
|
|
36
|
+
/**
|
|
37
|
+
* Spawn an agent session.
|
|
38
|
+
* In this initial version, this is a stub that:
|
|
39
|
+
* 1. Loads the agent's charter
|
|
40
|
+
* 2. Registers the session in the registry
|
|
41
|
+
* 3. Returns a SpawnResult
|
|
42
|
+
*
|
|
43
|
+
* Full SDK session integration comes in a follow-up when the CopilotClient
|
|
44
|
+
* session API is wired in.
|
|
45
|
+
*/
|
|
46
|
+
export declare function spawnAgent(name: string, task: string, registry: SessionRegistry, options?: SpawnOptions): Promise<SpawnResult>;
|
|
47
|
+
//# sourceMappingURL=spawn.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"spawn.d.ts","sourceRoot":"","sources":["../../../src/cli/shell/spawn.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAKhD,MAAM,WAAW,YAAY;IAC3B,gEAAgE;IAChE,IAAI,EAAE,MAAM,GAAG,YAAY,CAAC;IAC5B,uCAAuC;IACvC,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,mCAAmC;IACnC,KAAK,CAAC,EAAE,cAAc,EAAE,CAAC;CAC1B;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACrC;AAED,MAAM,WAAW,WAAW;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,WAAW,GAAG,WAAW,GAAG,OAAO,CAAC;IAC5C,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,CAW7E;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;IAAE,aAAa,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,MAAM,CAM9F;AAED;;;;;;;;;GASG;AACH,wBAAsB,UAAU,CAC9B,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,eAAe,EACzB,OAAO,GAAE,YAA+B,GACvC,OAAO,CAAC,WAAW,CAAC,CAoCtB"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Agent spawning — loads charters, builds prompts, and manages spawn lifecycle.
|
|
3
|
+
*
|
|
4
|
+
* Full SDK session integration is stubbed pending CopilotClient session API wiring.
|
|
5
|
+
*/
|
|
6
|
+
import { resolveSquad } from '@bradygaster/squad-sdk/resolution';
|
|
7
|
+
import { readFileSync } from 'node:fs';
|
|
8
|
+
import { join } from 'node:path';
|
|
9
|
+
/**
|
|
10
|
+
* Load agent charter from .squad/agents/{name}/charter.md
|
|
11
|
+
*/
|
|
12
|
+
export function loadAgentCharter(agentName, teamRoot) {
|
|
13
|
+
const squadDir = teamRoot ? join(teamRoot, '.squad') : resolveSquad();
|
|
14
|
+
if (!squadDir) {
|
|
15
|
+
throw new Error('No .squad/ directory found. Run "squad init" first.');
|
|
16
|
+
}
|
|
17
|
+
const charterPath = join(squadDir, 'agents', agentName.toLowerCase(), 'charter.md');
|
|
18
|
+
try {
|
|
19
|
+
return readFileSync(charterPath, 'utf-8');
|
|
20
|
+
}
|
|
21
|
+
catch {
|
|
22
|
+
throw new Error(`Charter not found for agent "${agentName}" at ${charterPath}`);
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Build system prompt for an agent from their charter + optional context
|
|
27
|
+
*/
|
|
28
|
+
export function buildAgentPrompt(charter, options) {
|
|
29
|
+
let prompt = `You are an AI agent on a software development team.\n\nYOUR CHARTER:\n${charter}`;
|
|
30
|
+
if (options?.systemContext) {
|
|
31
|
+
prompt += `\n\nADDITIONAL CONTEXT:\n${options.systemContext}`;
|
|
32
|
+
}
|
|
33
|
+
return prompt;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Spawn an agent session.
|
|
37
|
+
* In this initial version, this is a stub that:
|
|
38
|
+
* 1. Loads the agent's charter
|
|
39
|
+
* 2. Registers the session in the registry
|
|
40
|
+
* 3. Returns a SpawnResult
|
|
41
|
+
*
|
|
42
|
+
* Full SDK session integration comes in a follow-up when the CopilotClient
|
|
43
|
+
* session API is wired in.
|
|
44
|
+
*/
|
|
45
|
+
export async function spawnAgent(name, task, registry, options = { mode: 'sync' }) {
|
|
46
|
+
// Load charter
|
|
47
|
+
const charter = loadAgentCharter(name);
|
|
48
|
+
// Register in session registry
|
|
49
|
+
// Read role from charter (first line after "# Name — Role")
|
|
50
|
+
const roleMatch = charter.match(/^#\s+\w+\s+—\s+(.+)$/m);
|
|
51
|
+
const role = roleMatch?.[1] ?? 'Agent';
|
|
52
|
+
registry.register(name, role);
|
|
53
|
+
registry.updateStatus(name, 'working');
|
|
54
|
+
try {
|
|
55
|
+
// Build prompt
|
|
56
|
+
const _systemPrompt = buildAgentPrompt(charter, { systemContext: options.systemContext });
|
|
57
|
+
// TODO: Wire to CopilotClient session API
|
|
58
|
+
// For now, return a stub result indicating the spawn infrastructure is ready
|
|
59
|
+
// but actual LLM session creation requires the SDK session management
|
|
60
|
+
const result = {
|
|
61
|
+
agentName: name,
|
|
62
|
+
status: 'completed',
|
|
63
|
+
response: `[Agent ${name} spawn infrastructure ready — SDK session wiring pending]`,
|
|
64
|
+
};
|
|
65
|
+
registry.updateStatus(name, 'idle');
|
|
66
|
+
return result;
|
|
67
|
+
}
|
|
68
|
+
catch (error) {
|
|
69
|
+
registry.updateStatus(name, 'error');
|
|
70
|
+
return {
|
|
71
|
+
agentName: name,
|
|
72
|
+
status: 'error',
|
|
73
|
+
error: error instanceof Error ? error.message : String(error),
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
//# sourceMappingURL=spawn.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"spawn.js","sourceRoot":"","sources":["../../../src/cli/shell/spawn.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,mCAAmC,CAAC;AAGjE,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAwBjC;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,SAAiB,EAAE,QAAiB;IACnE,MAAM,QAAQ,GAAG,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,YAAY,EAAE,CAAC;IACtE,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,MAAM,IAAI,KAAK,CAAC,qDAAqD,CAAC,CAAC;IACzE,CAAC;IACD,MAAM,WAAW,GAAG,IAAI,CAAC,QAAQ,EAAE,QAAQ,EAAE,SAAS,CAAC,WAAW,EAAE,EAAE,YAAY,CAAC,CAAC;IACpF,IAAI,CAAC;QACH,OAAO,YAAY,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;IAC5C,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,KAAK,CAAC,gCAAgC,SAAS,QAAQ,WAAW,EAAE,CAAC,CAAC;IAClF,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,OAAe,EAAE,OAAoC;IACpF,IAAI,MAAM,GAAG,yEAAyE,OAAO,EAAE,CAAC;IAChG,IAAI,OAAO,EAAE,aAAa,EAAE,CAAC;QAC3B,MAAM,IAAI,4BAA4B,OAAO,CAAC,aAAa,EAAE,CAAC;IAChE,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,IAAY,EACZ,IAAY,EACZ,QAAyB,EACzB,UAAwB,EAAE,IAAI,EAAE,MAAM,EAAE;IAExC,eAAe;IACf,MAAM,OAAO,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC;IAEvC,+BAA+B;IAC/B,4DAA4D;IAC5D,MAAM,SAAS,GAAG,OAAO,CAAC,KAAK,CAAC,uBAAuB,CAAC,CAAC;IACzD,MAAM,IAAI,GAAG,SAAS,EAAE,CAAC,CAAC,CAAC,IAAI,OAAO,CAAC;IAEvC,QAAQ,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IAC9B,QAAQ,CAAC,YAAY,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;IAEvC,IAAI,CAAC;QACH,eAAe;QACf,MAAM,aAAa,GAAG,gBAAgB,CAAC,OAAO,EAAE,EAAE,aAAa,EAAE,OAAO,CAAC,aAAa,EAAE,CAAC,CAAC;QAE1F,0CAA0C;QAC1C,6EAA6E;QAC7E,sEAAsE;QAEtE,MAAM,MAAM,GAAgB;YAC1B,SAAS,EAAE,IAAI;YACf,MAAM,EAAE,WAAW;YACnB,QAAQ,EAAE,UAAU,IAAI,2DAA2D;SACpF,CAAC;QAEF,QAAQ,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QACpC,OAAO,MAAM,CAAC;IAChB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,QAAQ,CAAC,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QACrC,OAAO;YACL,SAAS,EAAE,IAAI;YACf,MAAM,EAAE,OAAO;YACf,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;SAC9D,CAAC;IACJ,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Stream Bridge — connects StreamingPipeline events to shell rendering callbacks.
|
|
3
|
+
*
|
|
4
|
+
* Accumulates content deltas into complete messages and dispatches
|
|
5
|
+
* to the shell's render loop via simple callbacks.
|
|
6
|
+
*
|
|
7
|
+
* @module cli/shell/stream-bridge
|
|
8
|
+
*/
|
|
9
|
+
import type { StreamingEvent } from '@bradygaster/squad-sdk/runtime/streaming';
|
|
10
|
+
import type { SessionRegistry } from './sessions.js';
|
|
11
|
+
import type { ShellMessage } from './types.js';
|
|
12
|
+
export interface StreamBridgeOptions {
|
|
13
|
+
/** Callback when new content arrives (for render updates) */
|
|
14
|
+
onContent: (agentName: string, content: string) => void;
|
|
15
|
+
/** Callback when a message is complete */
|
|
16
|
+
onComplete: (message: ShellMessage) => void;
|
|
17
|
+
/** Callback for usage/cost data */
|
|
18
|
+
onUsage?: (usage: {
|
|
19
|
+
model: string;
|
|
20
|
+
inputTokens: number;
|
|
21
|
+
outputTokens: number;
|
|
22
|
+
cost: number;
|
|
23
|
+
}) => void;
|
|
24
|
+
/** Callback for reasoning content */
|
|
25
|
+
onReasoning?: (agentName: string, content: string) => void;
|
|
26
|
+
/** Callback for errors */
|
|
27
|
+
onError?: (agentName: string, error: Error) => void;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Bridges the StreamingPipeline events to shell rendering callbacks.
|
|
31
|
+
* Accumulates content deltas into complete messages.
|
|
32
|
+
*/
|
|
33
|
+
export declare class StreamBridge {
|
|
34
|
+
private buffers;
|
|
35
|
+
private readonly options;
|
|
36
|
+
private readonly registry;
|
|
37
|
+
constructor(registry: SessionRegistry, options: StreamBridgeOptions);
|
|
38
|
+
/**
|
|
39
|
+
* Process a streaming event from the pipeline.
|
|
40
|
+
* Dispatches to the correct callback based on event type.
|
|
41
|
+
*/
|
|
42
|
+
handleEvent(event: StreamingEvent): void;
|
|
43
|
+
/**
|
|
44
|
+
* Finalize the buffer for a session, emitting a complete ShellMessage.
|
|
45
|
+
* Call this when a stream ends (e.g. after the SDK signals completion).
|
|
46
|
+
*/
|
|
47
|
+
flush(sessionId: string): void;
|
|
48
|
+
/**
|
|
49
|
+
* Get the current buffer content for a session (for partial renders).
|
|
50
|
+
*/
|
|
51
|
+
getBuffer(sessionId: string): string;
|
|
52
|
+
/**
|
|
53
|
+
* Clear all buffers (on session end).
|
|
54
|
+
*/
|
|
55
|
+
clear(): void;
|
|
56
|
+
private handleDelta;
|
|
57
|
+
private handleUsage;
|
|
58
|
+
private handleReasoning;
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=stream-bridge.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stream-bridge.d.ts","sourceRoot":"","sources":["../../../src/cli/shell/stream-bridge.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EACV,cAAc,EAIf,MAAM,0CAA0C,CAAC;AAClD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE/C,MAAM,WAAW,mBAAmB;IAClC,6DAA6D;IAC7D,SAAS,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IACxD,0CAA0C;IAC1C,UAAU,EAAE,CAAC,OAAO,EAAE,YAAY,KAAK,IAAI,CAAC;IAC5C,mCAAmC;IACnC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE;QAChB,KAAK,EAAE,MAAM,CAAC;QACd,WAAW,EAAE,MAAM,CAAC;QACpB,YAAY,EAAE,MAAM,CAAC;QACrB,IAAI,EAAE,MAAM,CAAC;KACd,KAAK,IAAI,CAAC;IACX,qCAAqC;IACrC,WAAW,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IAC3D,0BAA0B;IAC1B,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;CACrD;AAED;;;GAGG;AACH,qBAAa,YAAY;IACvB,OAAO,CAAC,OAAO,CAA6B;IAC5C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAsB;IAC9C,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAkB;gBAE/B,QAAQ,EAAE,eAAe,EAAE,OAAO,EAAE,mBAAmB;IAKnE;;;OAGG;IACH,WAAW,CAAC,KAAK,EAAE,cAAc,GAAG,IAAI;IAcxC;;;OAGG;IACH,KAAK,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAoB9B;;OAEG;IACH,SAAS,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM;IAIpC;;OAEG;IACH,KAAK,IAAI,IAAI;IAMb,OAAO,CAAC,WAAW;IAenB,OAAO,CAAC,WAAW;IAcnB,OAAO,CAAC,eAAe;CAKxB"}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Stream Bridge — connects StreamingPipeline events to shell rendering callbacks.
|
|
3
|
+
*
|
|
4
|
+
* Accumulates content deltas into complete messages and dispatches
|
|
5
|
+
* to the shell's render loop via simple callbacks.
|
|
6
|
+
*
|
|
7
|
+
* @module cli/shell/stream-bridge
|
|
8
|
+
*/
|
|
9
|
+
/**
|
|
10
|
+
* Bridges the StreamingPipeline events to shell rendering callbacks.
|
|
11
|
+
* Accumulates content deltas into complete messages.
|
|
12
|
+
*/
|
|
13
|
+
export class StreamBridge {
|
|
14
|
+
buffers = new Map();
|
|
15
|
+
options;
|
|
16
|
+
registry;
|
|
17
|
+
constructor(registry, options) {
|
|
18
|
+
this.registry = registry;
|
|
19
|
+
this.options = options;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Process a streaming event from the pipeline.
|
|
23
|
+
* Dispatches to the correct callback based on event type.
|
|
24
|
+
*/
|
|
25
|
+
handleEvent(event) {
|
|
26
|
+
switch (event.type) {
|
|
27
|
+
case 'message_delta':
|
|
28
|
+
this.handleDelta(event);
|
|
29
|
+
break;
|
|
30
|
+
case 'usage':
|
|
31
|
+
this.handleUsage(event);
|
|
32
|
+
break;
|
|
33
|
+
case 'reasoning_delta':
|
|
34
|
+
this.handleReasoning(event);
|
|
35
|
+
break;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Finalize the buffer for a session, emitting a complete ShellMessage.
|
|
40
|
+
* Call this when a stream ends (e.g. after the SDK signals completion).
|
|
41
|
+
*/
|
|
42
|
+
flush(sessionId) {
|
|
43
|
+
const content = this.buffers.get(sessionId);
|
|
44
|
+
if (content === undefined || content.length === 0)
|
|
45
|
+
return;
|
|
46
|
+
const session = this.registry.get(sessionId);
|
|
47
|
+
const agentName = session?.name ?? sessionId;
|
|
48
|
+
const message = {
|
|
49
|
+
role: 'agent',
|
|
50
|
+
agentName,
|
|
51
|
+
content,
|
|
52
|
+
timestamp: new Date(),
|
|
53
|
+
};
|
|
54
|
+
this.options.onComplete(message);
|
|
55
|
+
this.buffers.delete(sessionId);
|
|
56
|
+
this.registry.updateStatus(sessionId, 'idle');
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Get the current buffer content for a session (for partial renders).
|
|
60
|
+
*/
|
|
61
|
+
getBuffer(sessionId) {
|
|
62
|
+
return this.buffers.get(sessionId) ?? '';
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Clear all buffers (on session end).
|
|
66
|
+
*/
|
|
67
|
+
clear() {
|
|
68
|
+
this.buffers.clear();
|
|
69
|
+
}
|
|
70
|
+
// ---------- Private ----------
|
|
71
|
+
handleDelta(event) {
|
|
72
|
+
const { sessionId, content } = event;
|
|
73
|
+
const agentName = event.agentName ?? sessionId;
|
|
74
|
+
// Accumulate content in the session buffer
|
|
75
|
+
const existing = this.buffers.get(sessionId) ?? '';
|
|
76
|
+
this.buffers.set(sessionId, existing + content);
|
|
77
|
+
// Mark session as streaming
|
|
78
|
+
this.registry.updateStatus(agentName, 'streaming');
|
|
79
|
+
// Notify the render loop
|
|
80
|
+
this.options.onContent(agentName, content);
|
|
81
|
+
}
|
|
82
|
+
handleUsage(event) {
|
|
83
|
+
const agentName = event.agentName ?? event.sessionId;
|
|
84
|
+
this.options.onUsage?.({
|
|
85
|
+
model: event.model,
|
|
86
|
+
inputTokens: event.inputTokens,
|
|
87
|
+
outputTokens: event.outputTokens,
|
|
88
|
+
cost: event.estimatedCost,
|
|
89
|
+
});
|
|
90
|
+
// Usage event typically signals end of a turn — mark idle
|
|
91
|
+
this.registry.updateStatus(agentName, 'idle');
|
|
92
|
+
}
|
|
93
|
+
handleReasoning(event) {
|
|
94
|
+
const agentName = event.agentName ?? event.sessionId;
|
|
95
|
+
this.options.onReasoning?.(agentName, event.content);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
//# sourceMappingURL=stream-bridge.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stream-bridge.js","sourceRoot":"","sources":["../../../src/cli/shell/stream-bridge.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
export interface TerminalCapabilities {
|
|
2
|
+
supportsColor: boolean;
|
|
3
|
+
supportsUnicode: boolean;
|
|
4
|
+
columns: number;
|
|
5
|
+
rows: number;
|
|
6
|
+
platform: NodeJS.Platform;
|
|
7
|
+
isWindows: boolean;
|
|
8
|
+
isTTY: boolean;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Detect terminal capabilities for cross-platform compatibility.
|
|
12
|
+
*/
|
|
13
|
+
export declare function detectTerminal(): TerminalCapabilities;
|
|
14
|
+
/**
|
|
15
|
+
* Get a safe character for the platform.
|
|
16
|
+
* Falls back to ASCII on terminals that don't support unicode.
|
|
17
|
+
*/
|
|
18
|
+
export declare function safeChar(unicode: string, ascii: string, caps: TerminalCapabilities): string;
|
|
19
|
+
/**
|
|
20
|
+
* Box-drawing characters that degrade gracefully.
|
|
21
|
+
*/
|
|
22
|
+
export declare function boxChars(caps: TerminalCapabilities): {
|
|
23
|
+
tl: string;
|
|
24
|
+
tr: string;
|
|
25
|
+
bl: string;
|
|
26
|
+
br: string;
|
|
27
|
+
h: string;
|
|
28
|
+
v: string;
|
|
29
|
+
};
|
|
30
|
+
//# sourceMappingURL=terminal.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"terminal.d.ts","sourceRoot":"","sources":["../../../src/cli/shell/terminal.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,oBAAoB;IACnC,aAAa,EAAE,OAAO,CAAC;IACvB,eAAe,EAAE,OAAO,CAAC;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC,QAAQ,CAAC;IAC1B,SAAS,EAAE,OAAO,CAAC;IACnB,KAAK,EAAE,OAAO,CAAC;CAChB;AAED;;GAEG;AACH,wBAAgB,cAAc,IAAI,oBAAoB,CAarD;AAED;;;GAGG;AACH,wBAAgB,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,oBAAoB,GAAG,MAAM,CAE3F;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,IAAI,EAAE,oBAAoB;;;;;;;EAKlD"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { platform } from 'node:os';
|
|
2
|
+
/**
|
|
3
|
+
* Detect terminal capabilities for cross-platform compatibility.
|
|
4
|
+
*/
|
|
5
|
+
export function detectTerminal() {
|
|
6
|
+
const plat = platform();
|
|
7
|
+
const isTTY = Boolean(process.stdout.isTTY);
|
|
8
|
+
return {
|
|
9
|
+
supportsColor: isTTY && (process.env['FORCE_COLOR'] !== '0'),
|
|
10
|
+
supportsUnicode: plat !== 'win32' || Boolean(process.env['WT_SESSION']), // Windows Terminal supports unicode
|
|
11
|
+
columns: process.stdout.columns || 80,
|
|
12
|
+
rows: process.stdout.rows || 24,
|
|
13
|
+
platform: plat,
|
|
14
|
+
isWindows: plat === 'win32',
|
|
15
|
+
isTTY,
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Get a safe character for the platform.
|
|
20
|
+
* Falls back to ASCII on terminals that don't support unicode.
|
|
21
|
+
*/
|
|
22
|
+
export function safeChar(unicode, ascii, caps) {
|
|
23
|
+
return caps.supportsUnicode ? unicode : ascii;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Box-drawing characters that degrade gracefully.
|
|
27
|
+
*/
|
|
28
|
+
export function boxChars(caps) {
|
|
29
|
+
if (caps.supportsUnicode) {
|
|
30
|
+
return { tl: '╭', tr: '╮', bl: '╰', br: '╯', h: '─', v: '│' };
|
|
31
|
+
}
|
|
32
|
+
return { tl: '+', tr: '+', bl: '+', br: '+', h: '-', v: '|' };
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=terminal.js.map
|