@bradygaster/squad-cli 0.6.2 → 0.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (200) hide show
  1. package/README.md +77 -77
  2. package/dist/cli/commands/copilot.d.ts +13 -0
  3. package/dist/cli/commands/copilot.d.ts.map +1 -0
  4. package/dist/cli/commands/copilot.js +86 -0
  5. package/dist/cli/commands/copilot.js.map +1 -0
  6. package/dist/cli/commands/export.d.ts +9 -0
  7. package/dist/cli/commands/export.d.ts.map +1 -0
  8. package/dist/cli/commands/export.js +89 -0
  9. package/dist/cli/commands/export.js.map +1 -0
  10. package/dist/cli/commands/import.d.ts +9 -0
  11. package/dist/cli/commands/import.d.ts.map +1 -0
  12. package/dist/cli/commands/import.js +116 -0
  13. package/dist/cli/commands/import.js.map +1 -0
  14. package/dist/cli/commands/plugin.d.ts +14 -0
  15. package/dist/cli/commands/plugin.d.ts.map +1 -0
  16. package/dist/cli/commands/plugin.js +134 -0
  17. package/dist/cli/commands/plugin.js.map +1 -0
  18. package/dist/cli/commands/watch.d.ts +8 -0
  19. package/dist/cli/commands/watch.d.ts.map +1 -0
  20. package/dist/cli/commands/watch.js +178 -0
  21. package/dist/cli/commands/watch.js.map +1 -0
  22. package/dist/cli/copilot-install.d.ts +73 -0
  23. package/dist/cli/copilot-install.d.ts.map +1 -0
  24. package/dist/cli/copilot-install.js +117 -0
  25. package/dist/cli/copilot-install.js.map +1 -0
  26. package/dist/cli/core/detect-squad-dir.d.ts +13 -0
  27. package/dist/cli/core/detect-squad-dir.d.ts.map +1 -0
  28. package/dist/cli/core/detect-squad-dir.js +21 -0
  29. package/dist/cli/core/detect-squad-dir.js.map +1 -0
  30. package/dist/cli/core/email-scrub.d.ts +10 -0
  31. package/dist/cli/core/email-scrub.d.ts.map +1 -0
  32. package/dist/cli/core/email-scrub.js +103 -0
  33. package/dist/cli/core/email-scrub.js.map +1 -0
  34. package/dist/cli/core/errors.d.ts +17 -0
  35. package/dist/cli/core/errors.d.ts.map +1 -0
  36. package/dist/cli/core/errors.js +22 -0
  37. package/dist/cli/core/errors.js.map +1 -0
  38. package/dist/cli/core/gh-cli.d.ts +41 -0
  39. package/dist/cli/core/gh-cli.d.ts.map +1 -0
  40. package/dist/cli/core/gh-cli.js +67 -0
  41. package/dist/cli/core/gh-cli.js.map +1 -0
  42. package/dist/cli/core/history-split.d.ts +9 -0
  43. package/dist/cli/core/history-split.d.ts.map +1 -0
  44. package/dist/cli/core/history-split.js +65 -0
  45. package/dist/cli/core/history-split.js.map +1 -0
  46. package/dist/cli/core/init.d.ts +9 -0
  47. package/dist/cli/core/init.d.ts.map +1 -0
  48. package/dist/cli/core/init.js +296 -0
  49. package/dist/cli/core/init.js.map +1 -0
  50. package/dist/cli/core/migrate-directory.d.ts +11 -0
  51. package/dist/cli/core/migrate-directory.d.ts.map +1 -0
  52. package/dist/cli/core/migrate-directory.js +71 -0
  53. package/dist/cli/core/migrate-directory.js.map +1 -0
  54. package/dist/cli/core/migrations.d.ts +11 -0
  55. package/dist/cli/core/migrations.d.ts.map +1 -0
  56. package/dist/cli/core/migrations.js +78 -0
  57. package/dist/cli/core/migrations.js.map +1 -0
  58. package/dist/cli/core/output.d.ts +34 -0
  59. package/dist/cli/core/output.d.ts.map +1 -0
  60. package/dist/cli/core/output.js +47 -0
  61. package/dist/cli/core/output.js.map +1 -0
  62. package/dist/cli/core/project-type.d.ts +9 -0
  63. package/dist/cli/core/project-type.d.ts.map +1 -0
  64. package/dist/cli/core/project-type.js +29 -0
  65. package/dist/cli/core/project-type.js.map +1 -0
  66. package/dist/cli/core/team-md.d.ts +28 -0
  67. package/dist/cli/core/team-md.d.ts.map +1 -0
  68. package/dist/cli/core/team-md.js +91 -0
  69. package/dist/cli/core/team-md.js.map +1 -0
  70. package/dist/cli/core/templates.d.ts +30 -0
  71. package/dist/cli/core/templates.d.ts.map +1 -0
  72. package/dist/cli/core/templates.js +247 -0
  73. package/dist/cli/core/templates.js.map +1 -0
  74. package/dist/cli/core/upgrade.d.ts +20 -0
  75. package/dist/cli/core/upgrade.d.ts.map +1 -0
  76. package/dist/cli/core/upgrade.js +399 -0
  77. package/dist/cli/core/upgrade.js.map +1 -0
  78. package/dist/cli/core/version.d.ts +18 -0
  79. package/dist/cli/core/version.d.ts.map +1 -0
  80. package/dist/cli/core/version.js +61 -0
  81. package/dist/cli/core/version.js.map +1 -0
  82. package/dist/cli/core/workflows.d.ts +10 -0
  83. package/dist/cli/core/workflows.d.ts.map +1 -0
  84. package/dist/cli/core/workflows.js +155 -0
  85. package/dist/cli/core/workflows.js.map +1 -0
  86. package/dist/cli/index.d.ts +26 -0
  87. package/dist/cli/index.d.ts.map +1 -0
  88. package/dist/cli/index.js +26 -0
  89. package/dist/cli/index.js.map +1 -0
  90. package/dist/cli/shell/autocomplete.d.ts +12 -0
  91. package/dist/cli/shell/autocomplete.d.ts.map +1 -0
  92. package/dist/cli/shell/autocomplete.js +39 -0
  93. package/dist/cli/shell/autocomplete.js.map +1 -0
  94. package/dist/cli/shell/commands.d.ts +19 -0
  95. package/dist/cli/shell/commands.d.ts.map +1 -0
  96. package/dist/cli/shell/commands.js +87 -0
  97. package/dist/cli/shell/commands.js.map +1 -0
  98. package/dist/cli/shell/components/AgentPanel.d.ts +8 -0
  99. package/dist/cli/shell/components/AgentPanel.d.ts.map +1 -0
  100. package/dist/cli/shell/components/AgentPanel.js +17 -0
  101. package/dist/cli/shell/components/AgentPanel.js.map +1 -0
  102. package/dist/cli/shell/components/InputPrompt.d.ts +9 -0
  103. package/dist/cli/shell/components/InputPrompt.d.ts.map +1 -0
  104. package/dist/cli/shell/components/InputPrompt.js +50 -0
  105. package/dist/cli/shell/components/InputPrompt.js.map +1 -0
  106. package/dist/cli/shell/components/MessageStream.d.ts +13 -0
  107. package/dist/cli/shell/components/MessageStream.d.ts.map +1 -0
  108. package/dist/cli/shell/components/MessageStream.js +7 -0
  109. package/dist/cli/shell/components/MessageStream.js.map +1 -0
  110. package/dist/cli/shell/components/index.d.ts +4 -0
  111. package/dist/cli/shell/components/index.d.ts.map +1 -0
  112. package/dist/cli/shell/components/index.js +4 -0
  113. package/dist/cli/shell/components/index.js.map +1 -0
  114. package/dist/cli/shell/coordinator.d.ts +32 -0
  115. package/dist/cli/shell/coordinator.d.ts.map +1 -0
  116. package/dist/cli/shell/coordinator.js +113 -0
  117. package/dist/cli/shell/coordinator.js.map +1 -0
  118. package/dist/cli/shell/index.d.ts +28 -0
  119. package/dist/cli/shell/index.d.ts.map +1 -0
  120. package/dist/cli/shell/index.js +66 -0
  121. package/dist/cli/shell/index.js.map +1 -0
  122. package/dist/cli/shell/lifecycle.d.ts +52 -0
  123. package/dist/cli/shell/lifecycle.d.ts.map +1 -0
  124. package/dist/cli/shell/lifecycle.js +168 -0
  125. package/dist/cli/shell/lifecycle.js.map +1 -0
  126. package/dist/cli/shell/memory.d.ts +36 -0
  127. package/dist/cli/shell/memory.d.ts.map +1 -0
  128. package/dist/cli/shell/memory.js +53 -0
  129. package/dist/cli/shell/memory.js.map +1 -0
  130. package/dist/cli/shell/render.d.ts +22 -0
  131. package/dist/cli/shell/render.d.ts.map +1 -0
  132. package/dist/cli/shell/render.js +44 -0
  133. package/dist/cli/shell/render.js.map +1 -0
  134. package/dist/cli/shell/router.d.ts +17 -0
  135. package/dist/cli/shell/router.d.ts.map +1 -0
  136. package/dist/cli/shell/router.js +55 -0
  137. package/dist/cli/shell/router.js.map +1 -0
  138. package/dist/cli/shell/sessions.d.ts +15 -0
  139. package/dist/cli/shell/sessions.d.ts.map +1 -0
  140. package/dist/cli/shell/sessions.js +37 -0
  141. package/dist/cli/shell/sessions.js.map +1 -0
  142. package/dist/cli/shell/spawn.d.ts +47 -0
  143. package/dist/cli/shell/spawn.d.ts.map +1 -0
  144. package/dist/cli/shell/spawn.js +77 -0
  145. package/dist/cli/shell/spawn.js.map +1 -0
  146. package/dist/cli/shell/stream-bridge.d.ts +60 -0
  147. package/dist/cli/shell/stream-bridge.d.ts.map +1 -0
  148. package/dist/cli/shell/stream-bridge.js +98 -0
  149. package/dist/cli/shell/stream-bridge.js.map +1 -0
  150. package/dist/cli/shell/terminal.d.ts +30 -0
  151. package/dist/cli/shell/terminal.d.ts.map +1 -0
  152. package/dist/cli/shell/terminal.js +34 -0
  153. package/dist/cli/shell/terminal.js.map +1 -0
  154. package/dist/cli/shell/types.d.ts +21 -0
  155. package/dist/cli/shell/types.d.ts.map +1 -0
  156. package/dist/cli/shell/types.js +5 -0
  157. package/dist/cli/shell/types.js.map +1 -0
  158. package/dist/cli/upgrade.d.ts +141 -0
  159. package/dist/cli/upgrade.d.ts.map +1 -0
  160. package/dist/cli/upgrade.js +226 -0
  161. package/dist/cli/upgrade.js.map +1 -0
  162. package/dist/cli-entry.d.ts +10 -0
  163. package/dist/cli-entry.d.ts.map +1 -0
  164. package/dist/cli-entry.js +213 -0
  165. package/dist/cli-entry.js.map +1 -0
  166. package/package.json +44 -34
  167. package/templates/casting-history.json +4 -0
  168. package/templates/casting-policy.json +35 -0
  169. package/templates/casting-registry.json +3 -0
  170. package/templates/ceremonies.md +41 -0
  171. package/templates/charter.md +53 -0
  172. package/templates/constraint-tracking.md +38 -0
  173. package/templates/copilot-instructions.md +46 -0
  174. package/templates/history.md +10 -0
  175. package/templates/identity/now.md +9 -0
  176. package/templates/identity/wisdom.md +15 -0
  177. package/templates/mcp-config.md +90 -0
  178. package/templates/multi-agent-format.md +28 -0
  179. package/templates/orchestration-log.md +27 -0
  180. package/templates/plugin-marketplace.md +49 -0
  181. package/templates/raw-agent-output.md +37 -0
  182. package/templates/roster.md +60 -0
  183. package/templates/routing.md +54 -0
  184. package/templates/run-output.md +50 -0
  185. package/templates/scribe-charter.md +119 -0
  186. package/templates/skill.md +24 -0
  187. package/templates/skills/squad-conventions/SKILL.md +69 -0
  188. package/templates/squad.agent.md +1146 -0
  189. package/templates/workflows/squad-ci.yml +24 -0
  190. package/templates/workflows/squad-docs.yml +50 -0
  191. package/templates/workflows/squad-heartbeat.yml +315 -0
  192. package/templates/workflows/squad-insider-release.yml +61 -0
  193. package/templates/workflows/squad-issue-assign.yml +161 -0
  194. package/templates/workflows/squad-label-enforce.yml +181 -0
  195. package/templates/workflows/squad-main-guard.yml +129 -0
  196. package/templates/workflows/squad-preview.yml +55 -0
  197. package/templates/workflows/squad-promote.yml +121 -0
  198. package/templates/workflows/squad-release.yml +77 -0
  199. package/templates/workflows/squad-triage.yml +260 -0
  200. 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