@bradygaster/squad-cli 0.8.20 → 0.8.22

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 (104) hide show
  1. package/README.md +77 -77
  2. package/dist/cli/commands/build.d.ts +31 -0
  3. package/dist/cli/commands/build.d.ts.map +1 -0
  4. package/dist/cli/commands/build.js +453 -0
  5. package/dist/cli/commands/build.js.map +1 -0
  6. package/dist/cli/commands/init-remote.d.ts.map +1 -1
  7. package/dist/cli/commands/init-remote.js +13 -0
  8. package/dist/cli/commands/init-remote.js.map +1 -1
  9. package/dist/cli/commands/link.d.ts.map +1 -1
  10. package/dist/cli/commands/link.js +13 -0
  11. package/dist/cli/commands/link.js.map +1 -1
  12. package/dist/cli/commands/migrate.d.ts +14 -0
  13. package/dist/cli/commands/migrate.d.ts.map +1 -0
  14. package/dist/cli/commands/migrate.js +419 -0
  15. package/dist/cli/commands/migrate.js.map +1 -0
  16. package/dist/cli/commands/streams.d.ts +15 -0
  17. package/dist/cli/commands/streams.d.ts.map +1 -0
  18. package/dist/cli/commands/streams.js +147 -0
  19. package/dist/cli/commands/streams.js.map +1 -0
  20. package/dist/cli/core/cast.d.ts.map +1 -1
  21. package/dist/cli/core/cast.js +111 -63
  22. package/dist/cli/core/cast.js.map +1 -1
  23. package/dist/cli/core/init.d.ts +4 -0
  24. package/dist/cli/core/init.d.ts.map +1 -1
  25. package/dist/cli/core/init.js +2 -2
  26. package/dist/cli/core/init.js.map +1 -1
  27. package/dist/cli/core/team-md.js +34 -34
  28. package/dist/cli/core/templates.d.ts.map +1 -1
  29. package/dist/cli/core/templates.js +0 -6
  30. package/dist/cli/core/templates.js.map +1 -1
  31. package/dist/cli/core/upgrade.d.ts.map +1 -1
  32. package/dist/cli/core/upgrade.js +2 -1
  33. package/dist/cli/core/upgrade.js.map +1 -1
  34. package/dist/cli/index.d.ts +1 -0
  35. package/dist/cli/index.d.ts.map +1 -1
  36. package/dist/cli/index.js +1 -0
  37. package/dist/cli/index.js.map +1 -1
  38. package/dist/cli/shell/commands.d.ts +6 -0
  39. package/dist/cli/shell/commands.d.ts.map +1 -1
  40. package/dist/cli/shell/commands.js +2 -1
  41. package/dist/cli/shell/commands.js.map +1 -1
  42. package/dist/cli/shell/components/AgentPanel.d.ts.map +1 -1
  43. package/dist/cli/shell/components/AgentPanel.js +4 -3
  44. package/dist/cli/shell/components/AgentPanel.js.map +1 -1
  45. package/dist/cli/shell/components/App.d.ts.map +1 -1
  46. package/dist/cli/shell/components/App.js +36 -2
  47. package/dist/cli/shell/components/App.js.map +1 -1
  48. package/dist/cli/shell/components/MessageStream.d.ts.map +1 -1
  49. package/dist/cli/shell/components/MessageStream.js +2 -1
  50. package/dist/cli/shell/components/MessageStream.js.map +1 -1
  51. package/dist/cli/shell/components/ThinkingIndicator.js +2 -2
  52. package/dist/cli/shell/components/ThinkingIndicator.js.map +1 -1
  53. package/dist/cli/shell/coordinator.js +88 -88
  54. package/dist/cli/shell/index.d.ts.map +1 -1
  55. package/dist/cli/shell/index.js +41 -3
  56. package/dist/cli/shell/index.js.map +1 -1
  57. package/dist/cli-entry.js +206 -14
  58. package/dist/cli-entry.js.map +1 -1
  59. package/package.json +27 -2
  60. package/templates/casting-history.json +4 -4
  61. package/templates/casting-policy.json +35 -35
  62. package/templates/casting-registry.json +3 -3
  63. package/templates/ceremonies.md +41 -41
  64. package/templates/charter.md +53 -53
  65. package/templates/constraint-tracking.md +38 -38
  66. package/templates/copilot-instructions.md +46 -46
  67. package/templates/history.md +10 -10
  68. package/templates/identity/now.md +9 -9
  69. package/templates/identity/wisdom.md +15 -15
  70. package/templates/mcp-config.md +90 -90
  71. package/templates/multi-agent-format.md +28 -28
  72. package/templates/orchestration-log.md +27 -27
  73. package/templates/plugin-marketplace.md +49 -49
  74. package/templates/raw-agent-output.md +37 -37
  75. package/templates/roster.md +60 -60
  76. package/templates/routing.md +54 -54
  77. package/templates/run-output.md +50 -50
  78. package/templates/scribe-charter.md +119 -119
  79. package/templates/skill.md +24 -24
  80. package/templates/skills/squad-conventions/SKILL.md +69 -69
  81. package/templates/squad.agent.md +1146 -1146
  82. package/templates/workflows/squad-ci.yml +24 -24
  83. package/templates/workflows/squad-docs.yml +50 -50
  84. package/templates/workflows/squad-insider-release.yml +61 -61
  85. package/templates/workflows/squad-issue-assign.yml +161 -161
  86. package/templates/workflows/squad-label-enforce.yml +181 -181
  87. package/templates/workflows/squad-preview.yml +55 -55
  88. package/templates/workflows/squad-promote.yml +120 -120
  89. package/templates/workflows/squad-release.yml +77 -77
  90. package/templates/workflows/squad-triage.yml +260 -260
  91. package/templates/workflows/sync-squad-labels.yml +169 -169
  92. package/dist/cli/shell/sdk-bridge.d.ts +0 -50
  93. package/dist/cli/shell/sdk-bridge.d.ts.map +0 -1
  94. package/dist/cli/shell/sdk-bridge.js +0 -235
  95. package/dist/cli/shell/sdk-bridge.js.map +0 -1
  96. package/dist/cli/shell/theme-colors.d.ts +0 -39
  97. package/dist/cli/shell/theme-colors.d.ts.map +0 -1
  98. package/dist/cli/shell/theme-colors.js +0 -39
  99. package/dist/cli/shell/theme-colors.js.map +0 -1
  100. package/dist/cli.d.ts +0 -3
  101. package/dist/cli.d.ts.map +0 -1
  102. package/dist/cli.js +0 -4
  103. package/dist/cli.js.map +0 -1
  104. package/templates/workflows/squad-main-guard.yml +0 -129
@@ -1,169 +1,169 @@
1
- name: Sync Squad Labels
2
-
3
- on:
4
- push:
5
- paths:
6
- - '.squad/team.md'
7
- - '.ai-team/team.md'
8
- workflow_dispatch:
9
-
10
- permissions:
11
- issues: write
12
- contents: read
13
-
14
- jobs:
15
- sync-labels:
16
- runs-on: ubuntu-latest
17
- steps:
18
- - uses: actions/checkout@v4
19
-
20
- - name: Parse roster and sync labels
21
- uses: actions/github-script@v7
22
- with:
23
- script: |
24
- const fs = require('fs');
25
- let teamFile = '.squad/team.md';
26
- if (!fs.existsSync(teamFile)) {
27
- teamFile = '.ai-team/team.md';
28
- }
29
-
30
- if (!fs.existsSync(teamFile)) {
31
- core.info('No .squad/team.md or .ai-team/team.md found — skipping label sync');
32
- return;
33
- }
34
-
35
- const content = fs.readFileSync(teamFile, 'utf8');
36
- const lines = content.split('\n');
37
-
38
- // Parse the Members table for agent names
39
- const members = [];
40
- let inMembersTable = false;
41
- for (const line of lines) {
42
- if (line.match(/^##\s+(Members|Team Roster)/i)) {
43
- inMembersTable = true;
44
- continue;
45
- }
46
- if (inMembersTable && line.startsWith('## ')) {
47
- break;
48
- }
49
- if (inMembersTable && line.startsWith('|') && !line.includes('---') && !line.includes('Name')) {
50
- const cells = line.split('|').map(c => c.trim()).filter(Boolean);
51
- if (cells.length >= 2 && cells[0] !== 'Scribe') {
52
- members.push({
53
- name: cells[0],
54
- role: cells[1]
55
- });
56
- }
57
- }
58
- }
59
-
60
- core.info(`Found ${members.length} squad members: ${members.map(m => m.name).join(', ')}`);
61
-
62
- // Check if @copilot is on the team
63
- const hasCopilot = content.includes('🤖 Coding Agent');
64
-
65
- // Define label color palette for squad labels
66
- const SQUAD_COLOR = '9B8FCC';
67
- const MEMBER_COLOR = '9B8FCC';
68
- const COPILOT_COLOR = '10b981';
69
-
70
- // Define go: and release: labels (static)
71
- const GO_LABELS = [
72
- { name: 'go:yes', color: '0E8A16', description: 'Ready to implement' },
73
- { name: 'go:no', color: 'B60205', description: 'Not pursuing' },
74
- { name: 'go:needs-research', color: 'FBCA04', description: 'Needs investigation' }
75
- ];
76
-
77
- const RELEASE_LABELS = [
78
- { name: 'release:v0.4.0', color: '6B8EB5', description: 'Targeted for v0.4.0' },
79
- { name: 'release:v0.5.0', color: '6B8EB5', description: 'Targeted for v0.5.0' },
80
- { name: 'release:v0.6.0', color: '8B7DB5', description: 'Targeted for v0.6.0' },
81
- { name: 'release:v1.0.0', color: '8B7DB5', description: 'Targeted for v1.0.0' },
82
- { name: 'release:backlog', color: 'D4E5F7', description: 'Not yet targeted' }
83
- ];
84
-
85
- const TYPE_LABELS = [
86
- { name: 'type:feature', color: 'DDD1F2', description: 'New capability' },
87
- { name: 'type:bug', color: 'FF0422', description: 'Something broken' },
88
- { name: 'type:spike', color: 'F2DDD4', description: 'Research/investigation — produces a plan, not code' },
89
- { name: 'type:docs', color: 'D4E5F7', description: 'Documentation work' },
90
- { name: 'type:chore', color: 'D4E5F7', description: 'Maintenance, refactoring, cleanup' },
91
- { name: 'type:epic', color: 'CC4455', description: 'Parent issue that decomposes into sub-issues' }
92
- ];
93
-
94
- // High-signal labels — these MUST visually dominate all others
95
- const SIGNAL_LABELS = [
96
- { name: 'bug', color: 'FF0422', description: 'Something isn\'t working' },
97
- { name: 'feedback', color: '00E5FF', description: 'User feedback — high signal, needs attention' }
98
- ];
99
-
100
- const PRIORITY_LABELS = [
101
- { name: 'priority:p0', color: 'B60205', description: 'Blocking release' },
102
- { name: 'priority:p1', color: 'D93F0B', description: 'This sprint' },
103
- { name: 'priority:p2', color: 'FBCA04', description: 'Next sprint' }
104
- ];
105
-
106
- // Ensure the base "squad" triage label exists
107
- const labels = [
108
- { name: 'squad', color: SQUAD_COLOR, description: 'Squad triage inbox — Lead will assign to a member' }
109
- ];
110
-
111
- for (const member of members) {
112
- labels.push({
113
- name: `squad:${member.name.toLowerCase()}`,
114
- color: MEMBER_COLOR,
115
- description: `Assigned to ${member.name} (${member.role})`
116
- });
117
- }
118
-
119
- // Add @copilot label if coding agent is on the team
120
- if (hasCopilot) {
121
- labels.push({
122
- name: 'squad:copilot',
123
- color: COPILOT_COLOR,
124
- description: 'Assigned to @copilot (Coding Agent) for autonomous work'
125
- });
126
- }
127
-
128
- // Add go:, release:, type:, priority:, and high-signal labels
129
- labels.push(...GO_LABELS);
130
- labels.push(...RELEASE_LABELS);
131
- labels.push(...TYPE_LABELS);
132
- labels.push(...PRIORITY_LABELS);
133
- labels.push(...SIGNAL_LABELS);
134
-
135
- // Sync labels (create or update)
136
- for (const label of labels) {
137
- try {
138
- await github.rest.issues.getLabel({
139
- owner: context.repo.owner,
140
- repo: context.repo.repo,
141
- name: label.name
142
- });
143
- // Label exists — update it
144
- await github.rest.issues.updateLabel({
145
- owner: context.repo.owner,
146
- repo: context.repo.repo,
147
- name: label.name,
148
- color: label.color,
149
- description: label.description
150
- });
151
- core.info(`Updated label: ${label.name}`);
152
- } catch (err) {
153
- if (err.status === 404) {
154
- // Label doesn't exist — create it
155
- await github.rest.issues.createLabel({
156
- owner: context.repo.owner,
157
- repo: context.repo.repo,
158
- name: label.name,
159
- color: label.color,
160
- description: label.description
161
- });
162
- core.info(`Created label: ${label.name}`);
163
- } else {
164
- throw err;
165
- }
166
- }
167
- }
168
-
169
- core.info(`Label sync complete: ${labels.length} labels synced`);
1
+ name: Sync Squad Labels
2
+
3
+ on:
4
+ push:
5
+ paths:
6
+ - '.squad/team.md'
7
+ - '.ai-team/team.md'
8
+ workflow_dispatch:
9
+
10
+ permissions:
11
+ issues: write
12
+ contents: read
13
+
14
+ jobs:
15
+ sync-labels:
16
+ runs-on: ubuntu-latest
17
+ steps:
18
+ - uses: actions/checkout@v4
19
+
20
+ - name: Parse roster and sync labels
21
+ uses: actions/github-script@v7
22
+ with:
23
+ script: |
24
+ const fs = require('fs');
25
+ let teamFile = '.squad/team.md';
26
+ if (!fs.existsSync(teamFile)) {
27
+ teamFile = '.ai-team/team.md';
28
+ }
29
+
30
+ if (!fs.existsSync(teamFile)) {
31
+ core.info('No .squad/team.md or .ai-team/team.md found — skipping label sync');
32
+ return;
33
+ }
34
+
35
+ const content = fs.readFileSync(teamFile, 'utf8');
36
+ const lines = content.split('\n');
37
+
38
+ // Parse the Members table for agent names
39
+ const members = [];
40
+ let inMembersTable = false;
41
+ for (const line of lines) {
42
+ if (line.match(/^##\s+(Members|Team Roster)/i)) {
43
+ inMembersTable = true;
44
+ continue;
45
+ }
46
+ if (inMembersTable && line.startsWith('## ')) {
47
+ break;
48
+ }
49
+ if (inMembersTable && line.startsWith('|') && !line.includes('---') && !line.includes('Name')) {
50
+ const cells = line.split('|').map(c => c.trim()).filter(Boolean);
51
+ if (cells.length >= 2 && cells[0] !== 'Scribe') {
52
+ members.push({
53
+ name: cells[0],
54
+ role: cells[1]
55
+ });
56
+ }
57
+ }
58
+ }
59
+
60
+ core.info(`Found ${members.length} squad members: ${members.map(m => m.name).join(', ')}`);
61
+
62
+ // Check if @copilot is on the team
63
+ const hasCopilot = content.includes('🤖 Coding Agent');
64
+
65
+ // Define label color palette for squad labels
66
+ const SQUAD_COLOR = '9B8FCC';
67
+ const MEMBER_COLOR = '9B8FCC';
68
+ const COPILOT_COLOR = '10b981';
69
+
70
+ // Define go: and release: labels (static)
71
+ const GO_LABELS = [
72
+ { name: 'go:yes', color: '0E8A16', description: 'Ready to implement' },
73
+ { name: 'go:no', color: 'B60205', description: 'Not pursuing' },
74
+ { name: 'go:needs-research', color: 'FBCA04', description: 'Needs investigation' }
75
+ ];
76
+
77
+ const RELEASE_LABELS = [
78
+ { name: 'release:v0.4.0', color: '6B8EB5', description: 'Targeted for v0.4.0' },
79
+ { name: 'release:v0.5.0', color: '6B8EB5', description: 'Targeted for v0.5.0' },
80
+ { name: 'release:v0.6.0', color: '8B7DB5', description: 'Targeted for v0.6.0' },
81
+ { name: 'release:v1.0.0', color: '8B7DB5', description: 'Targeted for v1.0.0' },
82
+ { name: 'release:backlog', color: 'D4E5F7', description: 'Not yet targeted' }
83
+ ];
84
+
85
+ const TYPE_LABELS = [
86
+ { name: 'type:feature', color: 'DDD1F2', description: 'New capability' },
87
+ { name: 'type:bug', color: 'FF0422', description: 'Something broken' },
88
+ { name: 'type:spike', color: 'F2DDD4', description: 'Research/investigation — produces a plan, not code' },
89
+ { name: 'type:docs', color: 'D4E5F7', description: 'Documentation work' },
90
+ { name: 'type:chore', color: 'D4E5F7', description: 'Maintenance, refactoring, cleanup' },
91
+ { name: 'type:epic', color: 'CC4455', description: 'Parent issue that decomposes into sub-issues' }
92
+ ];
93
+
94
+ // High-signal labels — these MUST visually dominate all others
95
+ const SIGNAL_LABELS = [
96
+ { name: 'bug', color: 'FF0422', description: 'Something isn\'t working' },
97
+ { name: 'feedback', color: '00E5FF', description: 'User feedback — high signal, needs attention' }
98
+ ];
99
+
100
+ const PRIORITY_LABELS = [
101
+ { name: 'priority:p0', color: 'B60205', description: 'Blocking release' },
102
+ { name: 'priority:p1', color: 'D93F0B', description: 'This sprint' },
103
+ { name: 'priority:p2', color: 'FBCA04', description: 'Next sprint' }
104
+ ];
105
+
106
+ // Ensure the base "squad" triage label exists
107
+ const labels = [
108
+ { name: 'squad', color: SQUAD_COLOR, description: 'Squad triage inbox — Lead will assign to a member' }
109
+ ];
110
+
111
+ for (const member of members) {
112
+ labels.push({
113
+ name: `squad:${member.name.toLowerCase()}`,
114
+ color: MEMBER_COLOR,
115
+ description: `Assigned to ${member.name} (${member.role})`
116
+ });
117
+ }
118
+
119
+ // Add @copilot label if coding agent is on the team
120
+ if (hasCopilot) {
121
+ labels.push({
122
+ name: 'squad:copilot',
123
+ color: COPILOT_COLOR,
124
+ description: 'Assigned to @copilot (Coding Agent) for autonomous work'
125
+ });
126
+ }
127
+
128
+ // Add go:, release:, type:, priority:, and high-signal labels
129
+ labels.push(...GO_LABELS);
130
+ labels.push(...RELEASE_LABELS);
131
+ labels.push(...TYPE_LABELS);
132
+ labels.push(...PRIORITY_LABELS);
133
+ labels.push(...SIGNAL_LABELS);
134
+
135
+ // Sync labels (create or update)
136
+ for (const label of labels) {
137
+ try {
138
+ await github.rest.issues.getLabel({
139
+ owner: context.repo.owner,
140
+ repo: context.repo.repo,
141
+ name: label.name
142
+ });
143
+ // Label exists — update it
144
+ await github.rest.issues.updateLabel({
145
+ owner: context.repo.owner,
146
+ repo: context.repo.repo,
147
+ name: label.name,
148
+ color: label.color,
149
+ description: label.description
150
+ });
151
+ core.info(`Updated label: ${label.name}`);
152
+ } catch (err) {
153
+ if (err.status === 404) {
154
+ // Label doesn't exist — create it
155
+ await github.rest.issues.createLabel({
156
+ owner: context.repo.owner,
157
+ repo: context.repo.repo,
158
+ name: label.name,
159
+ color: label.color,
160
+ description: label.description
161
+ });
162
+ core.info(`Created label: ${label.name}`);
163
+ } else {
164
+ throw err;
165
+ }
166
+ }
167
+ }
168
+
169
+ core.info(`Label sync complete: ${labels.length} labels synced`);
@@ -1,50 +0,0 @@
1
- /**
2
- * SDK Bridge — connects the shell REPL to the Copilot SDK for LLM interactions.
3
- *
4
- * Manages SquadClient lifecycle, creates sessions for coordinator and agent routing,
5
- * and streams responses back through callbacks. Handles graceful degradation when
6
- * the SDK is unavailable (no auth, no network).
7
- *
8
- * @module cli/shell/sdk-bridge
9
- */
10
- import type { ShellMessage } from './types.js';
11
- import type { ParsedInput } from './router.js';
12
- import type { SessionRegistry } from './sessions.js';
13
- /** Callback interface for SDK bridge events flowing back to the shell. */
14
- export interface SdkBridgeCallbacks {
15
- onContent: (agentName: string, delta: string) => void;
16
- onComplete: (message: ShellMessage) => void;
17
- onError: (agentName: string, error: Error) => void;
18
- onStatusChange?: (agentName: string, status: 'working' | 'streaming' | 'idle' | 'error') => void;
19
- }
20
- export interface SdkBridgeConfig {
21
- teamRoot: string;
22
- registry: SessionRegistry;
23
- callbacks: SdkBridgeCallbacks;
24
- }
25
- /**
26
- * Bridges the shell REPL to the Copilot SDK.
27
- *
28
- * Lazily connects on first message. Manages one coordinator session and
29
- * per-agent sessions. Streams responses back through callbacks.
30
- */
31
- export declare class SdkBridge {
32
- private client;
33
- private coordinatorSession;
34
- private agentSessions;
35
- private connecting;
36
- private readonly config;
37
- constructor(config: SdkBridgeConfig);
38
- /**
39
- * Send a parsed input through the SDK.
40
- * Handles both coordinator and direct_agent routing.
41
- */
42
- send(parsed: ParsedInput, messageHistory: ShellMessage[]): Promise<void>;
43
- /** Shut down all sessions and disconnect. */
44
- shutdown(): Promise<void>;
45
- private ensureConnected;
46
- private sendToCoordinator;
47
- private sendToAgent;
48
- private createTrackedSession;
49
- }
50
- //# sourceMappingURL=sdk-bridge.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"sdk-bridge.d.ts","sourceRoot":"","sources":["../../../src/cli/shell/sdk-bridge.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC/C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAG/C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAErD,0EAA0E;AAC1E,MAAM,WAAW,kBAAkB;IACjC,SAAS,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACtD,UAAU,EAAE,CAAC,OAAO,EAAE,YAAY,KAAK,IAAI,CAAC;IAC5C,OAAO,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;IACnD,cAAc,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,GAAG,WAAW,GAAG,MAAM,GAAG,OAAO,KAAK,IAAI,CAAC;CAClG;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,eAAe,CAAC;IAC1B,SAAS,EAAE,kBAAkB,CAAC;CAC/B;AAiBD;;;;;GAKG;AACH,qBAAa,SAAS;IACpB,OAAO,CAAC,MAAM,CAAgC;IAC9C,OAAO,CAAC,kBAAkB,CAAiC;IAC3D,OAAO,CAAC,aAAa,CAAuC;IAC5D,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAkB;gBAE7B,MAAM,EAAE,eAAe;IAInC;;;OAGG;IACG,IAAI,CAAC,MAAM,EAAE,WAAW,EAAE,cAAc,EAAE,YAAY,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAsB9E,6CAA6C;IACvC,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;YAqBjB,eAAe;YAmBf,iBAAiB;YAwEjB,WAAW;YA2DX,oBAAoB;CAiBnC"}
@@ -1,235 +0,0 @@
1
- /**
2
- * SDK Bridge — connects the shell REPL to the Copilot SDK for LLM interactions.
3
- *
4
- * Manages SquadClient lifecycle, creates sessions for coordinator and agent routing,
5
- * and streams responses back through callbacks. Handles graceful degradation when
6
- * the SDK is unavailable (no auth, no network).
7
- *
8
- * @module cli/shell/sdk-bridge
9
- */
10
- import { buildCoordinatorPrompt, parseCoordinatorResponse, formatConversationContext } from './coordinator.js';
11
- import { loadAgentCharter, buildAgentPrompt } from './spawn.js';
12
- /**
13
- * Bridges the shell REPL to the Copilot SDK.
14
- *
15
- * Lazily connects on first message. Manages one coordinator session and
16
- * per-agent sessions. Streams responses back through callbacks.
17
- */
18
- export class SdkBridge {
19
- client = null;
20
- coordinatorSession = null;
21
- agentSessions = new Map();
22
- connecting = false;
23
- config;
24
- constructor(config) {
25
- this.config = config;
26
- }
27
- /**
28
- * Send a parsed input through the SDK.
29
- * Handles both coordinator and direct_agent routing.
30
- */
31
- async send(parsed, messageHistory) {
32
- const { callbacks, registry } = this.config;
33
- try {
34
- await this.ensureConnected();
35
- }
36
- catch (err) {
37
- const errorMsg = err instanceof Error ? err.message : String(err);
38
- callbacks.onComplete({
39
- role: 'system',
40
- content: `⚠️ SDK unavailable: ${errorMsg}\nThe shell is running in offline mode. Slash commands (/help, /status, /agents) still work.`,
41
- timestamp: new Date(),
42
- });
43
- return;
44
- }
45
- if (parsed.type === 'direct_agent' && parsed.agentName) {
46
- await this.sendToAgent(parsed.agentName, parsed.content ?? parsed.raw, messageHistory);
47
- }
48
- else {
49
- await this.sendToCoordinator(parsed.content ?? parsed.raw, messageHistory);
50
- }
51
- }
52
- /** Shut down all sessions and disconnect. */
53
- async shutdown() {
54
- const errors = [];
55
- for (const [name, session] of this.agentSessions) {
56
- try {
57
- await session.close();
58
- }
59
- catch (e) {
60
- errors.push(e instanceof Error ? e : new Error(String(e)));
61
- }
62
- this.agentSessions.delete(name);
63
- }
64
- if (this.coordinatorSession) {
65
- try {
66
- await this.coordinatorSession.close();
67
- }
68
- catch { /* ignore */ }
69
- this.coordinatorSession = null;
70
- }
71
- if (this.client) {
72
- try {
73
- await this.client.disconnect();
74
- }
75
- catch { /* ignore */ }
76
- this.client = null;
77
- }
78
- }
79
- // ---------- Private ----------
80
- async ensureConnected() {
81
- if (this.client?.isConnected())
82
- return;
83
- if (this.connecting)
84
- throw new Error('Connection already in progress');
85
- this.connecting = true;
86
- try {
87
- const { SquadClient } = await import('@bradygaster/squad-sdk/client');
88
- this.client = new SquadClient({ autoStart: true });
89
- await this.client.connect();
90
- }
91
- catch (err) {
92
- this.client = null;
93
- throw new Error(`Could not connect to Copilot SDK. Ensure you are authenticated (run "gh auth login") and have network access. (${err instanceof Error ? err.message : String(err)})`);
94
- }
95
- finally {
96
- this.connecting = false;
97
- }
98
- }
99
- async sendToCoordinator(content, messageHistory) {
100
- const { callbacks, registry, teamRoot } = this.config;
101
- const agentName = 'coordinator';
102
- callbacks.onStatusChange?.(agentName, 'working');
103
- registry.updateStatus(agentName, 'working');
104
- try {
105
- if (!this.coordinatorSession) {
106
- const systemPrompt = buildCoordinatorPrompt({ teamRoot });
107
- this.coordinatorSession = await this.createTrackedSession(agentName, systemPrompt);
108
- }
109
- const context = formatConversationContext(messageHistory);
110
- const prompt = context ? `${context}\n\n[user]: ${content}` : content;
111
- let accumulated = '';
112
- const deltaHandler = (event) => {
113
- const delta = event.content ?? '';
114
- accumulated += delta;
115
- callbacks.onContent(agentName, delta);
116
- };
117
- this.coordinatorSession.on('message_delta', deltaHandler);
118
- try {
119
- await this.coordinatorSession.sendMessage({ prompt });
120
- }
121
- finally {
122
- this.coordinatorSession.off('message_delta', deltaHandler);
123
- }
124
- // Parse coordinator response for routing decisions
125
- if (accumulated) {
126
- const decision = parseCoordinatorResponse(accumulated);
127
- if (decision.type === 'route' && decision.routes?.length) {
128
- for (const route of decision.routes) {
129
- callbacks.onComplete({
130
- role: 'system',
131
- content: `🔀 Routing to ${route.agent}: ${route.task}`,
132
- timestamp: new Date(),
133
- });
134
- await this.sendToAgent(route.agent, route.task, messageHistory);
135
- }
136
- }
137
- else if (decision.type === 'multi' && decision.routes?.length) {
138
- for (const route of decision.routes) {
139
- callbacks.onComplete({
140
- role: 'system',
141
- content: `🔀 Routing to ${route.agent}: ${route.task}`,
142
- timestamp: new Date(),
143
- });
144
- await this.sendToAgent(route.agent, route.task, messageHistory);
145
- }
146
- }
147
- else {
148
- callbacks.onComplete({
149
- role: 'agent',
150
- agentName,
151
- content: decision.directAnswer ?? accumulated,
152
- timestamp: new Date(),
153
- });
154
- }
155
- }
156
- registry.updateStatus(agentName, 'idle');
157
- callbacks.onStatusChange?.(agentName, 'idle');
158
- }
159
- catch (err) {
160
- registry.updateStatus(agentName, 'error');
161
- callbacks.onStatusChange?.(agentName, 'error');
162
- callbacks.onError(agentName, err instanceof Error ? err : new Error(String(err)));
163
- }
164
- }
165
- async sendToAgent(agentName, content, messageHistory) {
166
- const { callbacks, registry, teamRoot } = this.config;
167
- callbacks.onStatusChange?.(agentName, 'working');
168
- registry.updateStatus(agentName, 'working');
169
- try {
170
- let session = this.agentSessions.get(agentName);
171
- if (!session) {
172
- let charter;
173
- try {
174
- charter = loadAgentCharter(agentName, teamRoot);
175
- }
176
- catch {
177
- callbacks.onComplete({
178
- role: 'system',
179
- content: `❌ No charter found for agent "${agentName}". Use /agents to see available agents.`,
180
- timestamp: new Date(),
181
- });
182
- registry.updateStatus(agentName, 'idle');
183
- return;
184
- }
185
- const systemPrompt = buildAgentPrompt(charter);
186
- session = await this.createTrackedSession(agentName, systemPrompt);
187
- this.agentSessions.set(agentName, session);
188
- }
189
- let accumulated = '';
190
- const deltaHandler = (event) => {
191
- const delta = event.content ?? '';
192
- accumulated += delta;
193
- callbacks.onContent(agentName, delta);
194
- };
195
- session.on('message_delta', deltaHandler);
196
- try {
197
- await session.sendMessage({ prompt: content });
198
- }
199
- finally {
200
- session.off('message_delta', deltaHandler);
201
- }
202
- if (accumulated) {
203
- callbacks.onComplete({
204
- role: 'agent',
205
- agentName,
206
- content: accumulated,
207
- timestamp: new Date(),
208
- });
209
- }
210
- registry.updateStatus(agentName, 'idle');
211
- callbacks.onStatusChange?.(agentName, 'idle');
212
- }
213
- catch (err) {
214
- registry.updateStatus(agentName, 'error');
215
- callbacks.onStatusChange?.(agentName, 'error');
216
- callbacks.onError(agentName, err instanceof Error ? err : new Error(String(err)));
217
- }
218
- }
219
- async createTrackedSession(agentName, systemPrompt) {
220
- if (!this.client)
221
- throw new Error('Client not connected');
222
- const session = await this.client.createSession({
223
- streaming: true,
224
- systemMessage: { mode: 'replace', content: systemPrompt },
225
- workingDirectory: this.config.teamRoot,
226
- });
227
- // Register in the shell's session registry if not already there
228
- const { registry } = this.config;
229
- if (!registry.get(agentName)) {
230
- registry.register(agentName, agentName);
231
- }
232
- return session;
233
- }
234
- }
235
- //# sourceMappingURL=sdk-bridge.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"sdk-bridge.js","sourceRoot":"","sources":["../../../src/cli/shell/sdk-bridge.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH,OAAO,EAAE,sBAAsB,EAAE,wBAAwB,EAAE,yBAAyB,EAAE,MAAM,kBAAkB,CAAC;AAC/G,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAgChE;;;;;GAKG;AACH,MAAM,OAAO,SAAS;IACZ,MAAM,GAA2B,IAAI,CAAC;IACtC,kBAAkB,GAA4B,IAAI,CAAC;IACnD,aAAa,GAAG,IAAI,GAAG,EAA4B,CAAC;IACpD,UAAU,GAAG,KAAK,CAAC;IACV,MAAM,CAAkB;IAEzC,YAAY,MAAuB;QACjC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,IAAI,CAAC,MAAmB,EAAE,cAA8B;QAC5D,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC;QAE5C,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,eAAe,EAAE,CAAC;QAC/B,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,QAAQ,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAClE,SAAS,CAAC,UAAU,CAAC;gBACnB,IAAI,EAAE,QAAQ;gBACd,OAAO,EAAE,uBAAuB,QAAQ,8FAA8F;gBACtI,SAAS,EAAE,IAAI,IAAI,EAAE;aACtB,CAAC,CAAC;YACH,OAAO;QACT,CAAC;QAED,IAAI,MAAM,CAAC,IAAI,KAAK,cAAc,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;YACvD,MAAM,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC;QACzF,CAAC;aAAM,CAAC;YACN,MAAM,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC;QAC7E,CAAC;IACH,CAAC;IAED,6CAA6C;IAC7C,KAAK,CAAC,QAAQ;QACZ,MAAM,MAAM,GAAY,EAAE,CAAC;QAE3B,KAAK,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;YACjD,IAAI,CAAC;gBAAC,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC;YAAC,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBAAC,MAAM,CAAC,IAAI,CAAC,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAAC,CAAC;YACxG,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAClC,CAAC;QAED,IAAI,IAAI,CAAC,kBAAkB,EAAE,CAAC;YAC5B,IAAI,CAAC;gBAAC,MAAM,IAAI,CAAC,kBAAkB,CAAC,KAAK,EAAE,CAAC;YAAC,CAAC;YAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC;YACrE,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC;QACjC,CAAC;QAED,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,IAAI,CAAC;gBAAC,MAAM,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC;YAAC,CAAC;YAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC;YAC9D,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;QACrB,CAAC;IACH,CAAC;IAED,gCAAgC;IAExB,KAAK,CAAC,eAAe;QAC3B,IAAI,IAAI,CAAC,MAAM,EAAE,WAAW,EAAE;YAAE,OAAO;QACvC,IAAI,IAAI,CAAC,UAAU;YAAE,MAAM,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAC;QAEvE,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;QACvB,IAAI,CAAC;YACH,MAAM,EAAE,WAAW,EAAE,GAAG,MAAM,MAAM,CAAC,+BAA+B,CAAC,CAAC;YACtE,IAAI,CAAC,MAAM,GAAG,IAAI,WAAW,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,CAA+B,CAAC;YACjF,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QAC9B,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;YACnB,MAAM,IAAI,KAAK,CACb,kHAAkH,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CACtK,CAAC;QACJ,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;QAC1B,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,iBAAiB,CAAC,OAAe,EAAE,cAA8B;QAC7E,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,QAAQ,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC;QACtD,MAAM,SAAS,GAAG,aAAa,CAAC;QAEhC,SAAS,CAAC,cAAc,EAAE,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;QACjD,QAAQ,CAAC,YAAY,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;QAE5C,IAAI,CAAC;YACH,IAAI,CAAC,IAAI,CAAC,kBAAkB,EAAE,CAAC;gBAC7B,MAAM,YAAY,GAAG,sBAAsB,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC;gBAC1D,IAAI,CAAC,kBAAkB,GAAG,MAAM,IAAI,CAAC,oBAAoB,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC;YACrF,CAAC;YAED,MAAM,OAAO,GAAG,yBAAyB,CAAC,cAAc,CAAC,CAAC;YAC1D,MAAM,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,eAAe,OAAO,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC;YAEtE,IAAI,WAAW,GAAG,EAAE,CAAC;YACrB,MAAM,YAAY,GAAG,CAAC,KAA8B,EAAE,EAAE;gBACtD,MAAM,KAAK,GAAI,KAA8B,CAAC,OAAO,IAAI,EAAE,CAAC;gBAC5D,WAAW,IAAI,KAAK,CAAC;gBACrB,SAAS,CAAC,SAAS,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;YACxC,CAAC,CAAC;YAEF,IAAI,CAAC,kBAAkB,CAAC,EAAE,CAAC,eAAe,EAAE,YAAY,CAAC,CAAC;YAE1D,IAAI,CAAC;gBACH,MAAM,IAAI,CAAC,kBAAkB,CAAC,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;YACxD,CAAC;oBAAS,CAAC;gBACT,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,eAAe,EAAE,YAAY,CAAC,CAAC;YAC7D,CAAC;YAED,mDAAmD;YACnD,IAAI,WAAW,EAAE,CAAC;gBAChB,MAAM,QAAQ,GAAG,wBAAwB,CAAC,WAAW,CAAC,CAAC;gBAEvD,IAAI,QAAQ,CAAC,IAAI,KAAK,OAAO,IAAI,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC;oBACzD,KAAK,MAAM,KAAK,IAAI,QAAQ,CAAC,MAAM,EAAE,CAAC;wBACpC,SAAS,CAAC,UAAU,CAAC;4BACnB,IAAI,EAAE,QAAQ;4BACd,OAAO,EAAE,iBAAiB,KAAK,CAAC,KAAK,KAAK,KAAK,CAAC,IAAI,EAAE;4BACtD,SAAS,EAAE,IAAI,IAAI,EAAE;yBACtB,CAAC,CAAC;wBACH,MAAM,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC;oBAClE,CAAC;gBACH,CAAC;qBAAM,IAAI,QAAQ,CAAC,IAAI,KAAK,OAAO,IAAI,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC;oBAChE,KAAK,MAAM,KAAK,IAAI,QAAQ,CAAC,MAAM,EAAE,CAAC;wBACpC,SAAS,CAAC,UAAU,CAAC;4BACnB,IAAI,EAAE,QAAQ;4BACd,OAAO,EAAE,iBAAiB,KAAK,CAAC,KAAK,KAAK,KAAK,CAAC,IAAI,EAAE;4BACtD,SAAS,EAAE,IAAI,IAAI,EAAE;yBACtB,CAAC,CAAC;wBACH,MAAM,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC;oBAClE,CAAC;gBACH,CAAC;qBAAM,CAAC;oBACN,SAAS,CAAC,UAAU,CAAC;wBACnB,IAAI,EAAE,OAAO;wBACb,SAAS;wBACT,OAAO,EAAE,QAAQ,CAAC,YAAY,IAAI,WAAW;wBAC7C,SAAS,EAAE,IAAI,IAAI,EAAE;qBACtB,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;YAED,QAAQ,CAAC,YAAY,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;YACzC,SAAS,CAAC,cAAc,EAAE,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;QAChD,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,QAAQ,CAAC,YAAY,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;YAC1C,SAAS,CAAC,cAAc,EAAE,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;YAC/C,SAAS,CAAC,OAAO,CAAC,SAAS,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QACpF,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,WAAW,CAAC,SAAiB,EAAE,OAAe,EAAE,cAA8B;QAC1F,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,QAAQ,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC;QAEtD,SAAS,CAAC,cAAc,EAAE,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;QACjD,QAAQ,CAAC,YAAY,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;QAE5C,IAAI,CAAC;YACH,IAAI,OAAO,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;YAChD,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,IAAI,OAAe,CAAC;gBACpB,IAAI,CAAC;oBACH,OAAO,GAAG,gBAAgB,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;gBAClD,CAAC;gBAAC,MAAM,CAAC;oBACP,SAAS,CAAC,UAAU,CAAC;wBACnB,IAAI,EAAE,QAAQ;wBACd,OAAO,EAAE,iCAAiC,SAAS,yCAAyC;wBAC5F,SAAS,EAAE,IAAI,IAAI,EAAE;qBACtB,CAAC,CAAC;oBACH,QAAQ,CAAC,YAAY,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;oBACzC,OAAO;gBACT,CAAC;gBACD,MAAM,YAAY,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAC;gBAC/C,OAAO,GAAG,MAAM,IAAI,CAAC,oBAAoB,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC;gBACnE,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;YAC7C,CAAC;YAED,IAAI,WAAW,GAAG,EAAE,CAAC;YACrB,MAAM,YAAY,GAAG,CAAC,KAA8B,EAAE,EAAE;gBACtD,MAAM,KAAK,GAAI,KAA8B,CAAC,OAAO,IAAI,EAAE,CAAC;gBAC5D,WAAW,IAAI,KAAK,CAAC;gBACrB,SAAS,CAAC,SAAS,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;YACxC,CAAC,CAAC;YAEF,OAAO,CAAC,EAAE,CAAC,eAAe,EAAE,YAAY,CAAC,CAAC;YAE1C,IAAI,CAAC;gBACH,MAAM,OAAO,CAAC,WAAW,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC;YACjD,CAAC;oBAAS,CAAC;gBACT,OAAO,CAAC,GAAG,CAAC,eAAe,EAAE,YAAY,CAAC,CAAC;YAC7C,CAAC;YAED,IAAI,WAAW,EAAE,CAAC;gBAChB,SAAS,CAAC,UAAU,CAAC;oBACnB,IAAI,EAAE,OAAO;oBACb,SAAS;oBACT,OAAO,EAAE,WAAW;oBACpB,SAAS,EAAE,IAAI,IAAI,EAAE;iBACtB,CAAC,CAAC;YACL,CAAC;YAED,QAAQ,CAAC,YAAY,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;YACzC,SAAS,CAAC,cAAc,EAAE,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;QAChD,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,QAAQ,CAAC,YAAY,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;YAC1C,SAAS,CAAC,cAAc,EAAE,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;YAC/C,SAAS,CAAC,OAAO,CAAC,SAAS,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QACpF,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,oBAAoB,CAAC,SAAiB,EAAE,YAAoB;QACxE,IAAI,CAAC,IAAI,CAAC,MAAM;YAAE,MAAM,IAAI,KAAK,CAAC,sBAAsB,CAAC,CAAC;QAE1D,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC;YAC9C,SAAS,EAAE,IAAI;YACf,aAAa,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,YAAY,EAAE;YACzD,gBAAgB,EAAE,IAAI,CAAC,MAAM,CAAC,QAAQ;SACvC,CAAC,CAAC;QAEH,gEAAgE;QAChE,MAAM,EAAE,QAAQ,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC;QACjC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC;YAC7B,QAAQ,CAAC,QAAQ,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;QAC1C,CAAC;QAED,OAAO,OAAO,CAAC;IACjB,CAAC;CACF"}