@bradygaster/squad-sdk 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.
- package/README.md +296 -296
- package/dist/adapter/client.d.ts +225 -0
- package/dist/adapter/client.d.ts.map +1 -0
- package/dist/adapter/client.js +397 -0
- package/dist/adapter/client.js.map +1 -0
- package/dist/adapter/errors.d.ts +260 -0
- package/dist/adapter/errors.d.ts.map +1 -0
- package/dist/adapter/errors.js +362 -0
- package/dist/adapter/errors.js.map +1 -0
- package/dist/adapter/types.d.ts +779 -0
- package/dist/adapter/types.d.ts.map +1 -0
- package/dist/adapter/types.js +11 -0
- package/dist/adapter/types.js.map +1 -0
- package/dist/agents/charter-compiler.d.ts +102 -0
- package/dist/agents/charter-compiler.d.ts.map +1 -0
- package/dist/agents/charter-compiler.js +157 -0
- package/dist/agents/charter-compiler.js.map +1 -0
- package/dist/agents/history-shadow.d.ts +80 -0
- package/dist/agents/history-shadow.d.ts.map +1 -0
- package/dist/agents/history-shadow.js +239 -0
- package/dist/agents/history-shadow.js.map +1 -0
- package/dist/agents/index.d.ts +68 -0
- package/dist/agents/index.d.ts.map +1 -0
- package/dist/agents/index.js +74 -0
- package/dist/agents/index.js.map +1 -0
- package/dist/agents/lifecycle.d.ts +138 -0
- package/dist/agents/lifecycle.d.ts.map +1 -0
- package/dist/agents/lifecycle.js +258 -0
- package/dist/agents/lifecycle.js.map +1 -0
- package/dist/agents/model-selector.d.ts +80 -0
- package/dist/agents/model-selector.d.ts.map +1 -0
- package/dist/agents/model-selector.js +198 -0
- package/dist/agents/model-selector.js.map +1 -0
- package/dist/agents/onboarding.d.ts +65 -0
- package/dist/agents/onboarding.d.ts.map +1 -0
- package/dist/agents/onboarding.js +373 -0
- package/dist/agents/onboarding.js.map +1 -0
- package/dist/build/bundle.d.ts +32 -0
- package/dist/build/bundle.d.ts.map +1 -0
- package/dist/build/bundle.js +97 -0
- package/dist/build/bundle.js.map +1 -0
- package/dist/build/ci-pipeline.d.ts +51 -0
- package/dist/build/ci-pipeline.d.ts.map +1 -0
- package/dist/build/ci-pipeline.js +180 -0
- package/dist/build/ci-pipeline.js.map +1 -0
- package/dist/build/github-dist.d.ts +37 -0
- package/dist/build/github-dist.d.ts.map +1 -0
- package/dist/build/github-dist.js +117 -0
- package/dist/build/github-dist.js.map +1 -0
- package/dist/build/index.d.ts +11 -0
- package/dist/build/index.d.ts.map +1 -0
- package/dist/build/index.js +11 -0
- package/dist/build/index.js.map +1 -0
- package/dist/build/install-migration.d.ts +28 -0
- package/dist/build/install-migration.d.ts.map +1 -0
- package/dist/build/install-migration.js +103 -0
- package/dist/build/install-migration.js.map +1 -0
- package/dist/build/npm-package.d.ts +54 -0
- package/dist/build/npm-package.d.ts.map +1 -0
- package/dist/build/npm-package.js +128 -0
- package/dist/build/npm-package.js.map +1 -0
- package/dist/build/release.d.ts +108 -0
- package/dist/build/release.d.ts.map +1 -0
- package/dist/build/release.js +295 -0
- package/dist/build/release.js.map +1 -0
- package/dist/build/versioning.d.ts +38 -0
- package/dist/build/versioning.d.ts.map +1 -0
- package/dist/build/versioning.js +113 -0
- package/dist/build/versioning.js.map +1 -0
- package/dist/casting/casting-engine.d.ts +60 -0
- package/dist/casting/casting-engine.d.ts.map +1 -0
- package/dist/casting/casting-engine.js +223 -0
- package/dist/casting/casting-engine.js.map +1 -0
- package/dist/casting/casting-history.d.ts +54 -0
- package/dist/casting/casting-history.d.ts.map +1 -0
- package/dist/casting/casting-history.js +63 -0
- package/dist/casting/casting-history.js.map +1 -0
- package/dist/casting/index.d.ts +46 -0
- package/dist/casting/index.d.ts.map +1 -0
- package/dist/casting/index.js +37 -0
- package/dist/casting/index.js.map +1 -0
- package/dist/client/event-bus.d.ts +29 -0
- package/dist/client/event-bus.d.ts.map +1 -0
- package/dist/client/event-bus.js +53 -0
- package/dist/client/event-bus.js.map +1 -0
- package/dist/client/index.d.ts +100 -0
- package/dist/client/index.d.ts.map +1 -0
- package/dist/client/index.js +170 -0
- package/dist/client/index.js.map +1 -0
- package/dist/client/session-pool.d.ts +66 -0
- package/dist/client/session-pool.d.ts.map +1 -0
- package/dist/client/session-pool.js +145 -0
- package/dist/client/session-pool.js.map +1 -0
- package/dist/config/agent-doc.d.ts +43 -0
- package/dist/config/agent-doc.d.ts.map +1 -0
- package/dist/config/agent-doc.js +158 -0
- package/dist/config/agent-doc.js.map +1 -0
- package/dist/config/agent-source.d.ts +95 -0
- package/dist/config/agent-source.d.ts.map +1 -0
- package/dist/config/agent-source.js +274 -0
- package/dist/config/agent-source.js.map +1 -0
- package/dist/config/doc-sync.d.ts +66 -0
- package/dist/config/doc-sync.d.ts.map +1 -0
- package/dist/config/doc-sync.js +270 -0
- package/dist/config/doc-sync.js.map +1 -0
- package/dist/config/feature-audit.d.ts +49 -0
- package/dist/config/feature-audit.d.ts.map +1 -0
- package/dist/config/feature-audit.js +148 -0
- package/dist/config/feature-audit.js.map +1 -0
- package/dist/config/index.d.ts +15 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +15 -0
- package/dist/config/index.js.map +1 -0
- package/dist/config/init.d.ts +61 -0
- package/dist/config/init.d.ts.map +1 -0
- package/dist/config/init.js +369 -0
- package/dist/config/init.js.map +1 -0
- package/dist/config/legacy-fallback.d.ts +83 -0
- package/dist/config/legacy-fallback.d.ts.map +1 -0
- package/dist/config/legacy-fallback.js +212 -0
- package/dist/config/legacy-fallback.js.map +1 -0
- package/dist/config/markdown-migration.d.ts +157 -0
- package/dist/config/markdown-migration.d.ts.map +1 -0
- package/dist/config/markdown-migration.js +434 -0
- package/dist/config/markdown-migration.js.map +1 -0
- package/dist/config/migration.d.ts +123 -0
- package/dist/config/migration.d.ts.map +1 -0
- package/dist/config/migration.js +273 -0
- package/dist/config/migration.js.map +1 -0
- package/dist/config/migrations/index.d.ts +36 -0
- package/dist/config/migrations/index.d.ts.map +1 -0
- package/dist/config/migrations/index.js +216 -0
- package/dist/config/migrations/index.js.map +1 -0
- package/dist/config/models.d.ts +134 -0
- package/dist/config/models.d.ts.map +1 -0
- package/dist/config/models.js +354 -0
- package/dist/config/models.js.map +1 -0
- package/dist/config/routing.d.ts +118 -0
- package/dist/config/routing.d.ts.map +1 -0
- package/dist/config/routing.js +247 -0
- package/dist/config/routing.js.map +1 -0
- package/dist/config/schema.d.ts +72 -0
- package/dist/config/schema.d.ts.map +1 -0
- package/dist/config/schema.js +63 -0
- package/dist/config/schema.js.map +1 -0
- package/dist/coordinator/coordinator.d.ts +82 -0
- package/dist/coordinator/coordinator.d.ts.map +1 -0
- package/dist/coordinator/coordinator.js +174 -0
- package/dist/coordinator/coordinator.js.map +1 -0
- package/dist/coordinator/direct-response.d.ts +83 -0
- package/dist/coordinator/direct-response.d.ts.map +1 -0
- package/dist/coordinator/direct-response.js +187 -0
- package/dist/coordinator/direct-response.js.map +1 -0
- package/dist/coordinator/fan-out.d.ts +83 -0
- package/dist/coordinator/fan-out.d.ts.map +1 -0
- package/dist/coordinator/fan-out.js +161 -0
- package/dist/coordinator/fan-out.js.map +1 -0
- package/dist/coordinator/index.d.ts +47 -0
- package/dist/coordinator/index.d.ts.map +1 -0
- package/dist/coordinator/index.js +54 -0
- package/dist/coordinator/index.js.map +1 -0
- package/dist/coordinator/response-tiers.d.ts +49 -0
- package/dist/coordinator/response-tiers.d.ts.map +1 -0
- package/dist/coordinator/response-tiers.js +149 -0
- package/dist/coordinator/response-tiers.js.map +1 -0
- package/dist/hooks/index.d.ts +103 -0
- package/dist/hooks/index.d.ts.map +1 -0
- package/dist/hooks/index.js +279 -0
- package/dist/hooks/index.js.map +1 -0
- package/dist/index.d.ts +24 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +23 -3
- package/dist/index.js.map +1 -1
- package/dist/marketplace/backend.d.ts +35 -0
- package/dist/marketplace/backend.d.ts.map +1 -0
- package/dist/marketplace/backend.js +99 -0
- package/dist/marketplace/backend.js.map +1 -0
- package/dist/marketplace/browser.d.ts +33 -0
- package/dist/marketplace/browser.d.ts.map +1 -0
- package/dist/marketplace/browser.js +97 -0
- package/dist/marketplace/browser.js.map +1 -0
- package/dist/marketplace/extension-adapter.d.ts +51 -0
- package/dist/marketplace/extension-adapter.d.ts.map +1 -0
- package/dist/marketplace/extension-adapter.js +81 -0
- package/dist/marketplace/extension-adapter.js.map +1 -0
- package/dist/marketplace/index.d.ts +51 -0
- package/dist/marketplace/index.d.ts.map +1 -0
- package/dist/marketplace/index.js +108 -0
- package/dist/marketplace/index.js.map +1 -0
- package/dist/marketplace/packaging.d.ts +25 -0
- package/dist/marketplace/packaging.d.ts.map +1 -0
- package/dist/marketplace/packaging.js +117 -0
- package/dist/marketplace/packaging.js.map +1 -0
- package/dist/marketplace/schema.d.ts +50 -0
- package/dist/marketplace/schema.d.ts.map +1 -0
- package/dist/marketplace/schema.js +120 -0
- package/dist/marketplace/schema.js.map +1 -0
- package/dist/marketplace/security.d.ts +26 -0
- package/dist/marketplace/security.d.ts.map +1 -0
- package/dist/marketplace/security.js +199 -0
- package/dist/marketplace/security.js.map +1 -0
- package/dist/parsers.d.ts +15 -0
- package/dist/parsers.d.ts.map +1 -0
- package/dist/parsers.js +15 -0
- package/dist/parsers.js.map +1 -0
- package/dist/ralph/index.d.ts +56 -0
- package/dist/ralph/index.d.ts.map +1 -0
- package/dist/ralph/index.js +61 -0
- package/dist/ralph/index.js.map +1 -0
- package/dist/resolution.d.ts +47 -0
- package/dist/resolution.d.ts.map +1 -0
- package/dist/resolution.js +106 -0
- package/dist/resolution.js.map +1 -0
- package/dist/runtime/benchmarks.d.ts +121 -0
- package/dist/runtime/benchmarks.d.ts.map +1 -0
- package/dist/runtime/benchmarks.js +251 -0
- package/dist/runtime/benchmarks.js.map +1 -0
- package/dist/runtime/config.d.ts +313 -0
- package/dist/runtime/config.d.ts.map +1 -0
- package/dist/runtime/config.js +466 -0
- package/dist/runtime/config.js.map +1 -0
- package/dist/runtime/cost-tracker.d.ts +73 -0
- package/dist/runtime/cost-tracker.d.ts.map +1 -0
- package/dist/runtime/cost-tracker.js +157 -0
- package/dist/runtime/cost-tracker.js.map +1 -0
- package/dist/runtime/event-bus.d.ts +190 -0
- package/dist/runtime/event-bus.d.ts.map +1 -0
- package/dist/runtime/event-bus.js +218 -0
- package/dist/runtime/event-bus.js.map +1 -0
- package/dist/runtime/health.d.ts +66 -0
- package/dist/runtime/health.d.ts.map +1 -0
- package/dist/runtime/health.js +111 -0
- package/dist/runtime/health.js.map +1 -0
- package/dist/runtime/i18n.d.ts +54 -0
- package/dist/runtime/i18n.d.ts.map +1 -0
- package/dist/runtime/i18n.js +126 -0
- package/dist/runtime/i18n.js.map +1 -0
- package/dist/runtime/offline.d.ts +64 -0
- package/dist/runtime/offline.d.ts.map +1 -0
- package/dist/runtime/offline.js +108 -0
- package/dist/runtime/offline.js.map +1 -0
- package/dist/runtime/streaming.d.ts +97 -0
- package/dist/runtime/streaming.d.ts.map +1 -0
- package/dist/runtime/streaming.js +156 -0
- package/dist/runtime/streaming.js.map +1 -0
- package/dist/runtime/telemetry.d.ts +82 -0
- package/dist/runtime/telemetry.d.ts.map +1 -0
- package/dist/runtime/telemetry.js +120 -0
- package/dist/runtime/telemetry.js.map +1 -0
- package/dist/sharing/agent-repo.d.ts +33 -0
- package/dist/sharing/agent-repo.d.ts.map +1 -0
- package/dist/sharing/agent-repo.js +79 -0
- package/dist/sharing/agent-repo.js.map +1 -0
- package/dist/sharing/cache.d.ts +36 -0
- package/dist/sharing/cache.d.ts.map +1 -0
- package/dist/sharing/cache.js +85 -0
- package/dist/sharing/cache.js.map +1 -0
- package/dist/sharing/conflicts.d.ts +32 -0
- package/dist/sharing/conflicts.d.ts.map +1 -0
- package/dist/sharing/conflicts.js +121 -0
- package/dist/sharing/conflicts.js.map +1 -0
- package/dist/sharing/export.d.ts +50 -0
- package/dist/sharing/export.d.ts.map +1 -0
- package/dist/sharing/export.js +156 -0
- package/dist/sharing/export.js.map +1 -0
- package/dist/sharing/history-split.d.ts +34 -0
- package/dist/sharing/history-split.d.ts.map +1 -0
- package/dist/sharing/history-split.js +101 -0
- package/dist/sharing/history-split.js.map +1 -0
- package/dist/sharing/import.d.ts +37 -0
- package/dist/sharing/import.d.ts.map +1 -0
- package/dist/sharing/import.js +138 -0
- package/dist/sharing/import.js.map +1 -0
- package/dist/sharing/index.d.ts +11 -0
- package/dist/sharing/index.d.ts.map +1 -0
- package/dist/sharing/index.js +11 -0
- package/dist/sharing/index.js.map +1 -0
- package/dist/sharing/versioning.d.ts +32 -0
- package/dist/sharing/versioning.d.ts.map +1 -0
- package/dist/sharing/versioning.js +64 -0
- package/dist/sharing/versioning.js.map +1 -0
- package/dist/skills/index.d.ts +49 -0
- package/dist/skills/index.d.ts.map +1 -0
- package/dist/skills/index.js +85 -0
- package/dist/skills/index.js.map +1 -0
- package/dist/skills/skill-loader.d.ts +56 -0
- package/dist/skills/skill-loader.d.ts.map +1 -0
- package/dist/skills/skill-loader.js +106 -0
- package/dist/skills/skill-loader.js.map +1 -0
- package/dist/skills/skill-source.d.ts +63 -0
- package/dist/skills/skill-source.d.ts.map +1 -0
- package/dist/skills/skill-source.js +199 -0
- package/dist/skills/skill-source.js.map +1 -0
- package/dist/tools/index.d.ts +87 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +419 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/types.d.ts +43 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +8 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/normalize-eol.d.ts +6 -0
- package/dist/utils/normalize-eol.d.ts.map +1 -0
- package/dist/utils/normalize-eol.js +8 -0
- package/dist/utils/normalize-eol.js.map +1 -0
- package/package.json +115 -39
|
@@ -0,0 +1,225 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Squad SDK Client Adapter
|
|
3
|
+
*
|
|
4
|
+
* Wraps CopilotClient to provide connection lifecycle management, error recovery,
|
|
5
|
+
* automatic reconnection, and protocol version validation.
|
|
6
|
+
*
|
|
7
|
+
* @module adapter/client
|
|
8
|
+
*/
|
|
9
|
+
import type { SquadSessionConfig, SquadSession, SquadSessionEventHandler, SquadSessionEventType, SquadSessionMetadata, SquadGetAuthStatusResponse, SquadGetStatusResponse, SquadModelInfo } from "./types.js";
|
|
10
|
+
/**
|
|
11
|
+
* Connection state for SquadClient.
|
|
12
|
+
*/
|
|
13
|
+
export type SquadConnectionState = "disconnected" | "connecting" | "connected" | "reconnecting" | "error";
|
|
14
|
+
/**
|
|
15
|
+
* Options for creating a SquadClient.
|
|
16
|
+
*/
|
|
17
|
+
export interface SquadClientOptions {
|
|
18
|
+
/**
|
|
19
|
+
* Path to the Copilot CLI executable.
|
|
20
|
+
* Defaults to bundled CLI from @github/copilot package.
|
|
21
|
+
*/
|
|
22
|
+
cliPath?: string;
|
|
23
|
+
/**
|
|
24
|
+
* Additional arguments to pass to the CLI process.
|
|
25
|
+
*/
|
|
26
|
+
cliArgs?: string[];
|
|
27
|
+
/**
|
|
28
|
+
* Working directory for the CLI process.
|
|
29
|
+
* @default process.cwd()
|
|
30
|
+
*/
|
|
31
|
+
cwd?: string;
|
|
32
|
+
/**
|
|
33
|
+
* Port to bind the CLI server (TCP mode).
|
|
34
|
+
* Set to 0 for random port, or undefined to use stdio mode.
|
|
35
|
+
*/
|
|
36
|
+
port?: number;
|
|
37
|
+
/**
|
|
38
|
+
* Use stdio transport instead of TCP.
|
|
39
|
+
* @default true
|
|
40
|
+
*/
|
|
41
|
+
useStdio?: boolean;
|
|
42
|
+
/**
|
|
43
|
+
* URL of an external CLI server to connect to.
|
|
44
|
+
* Mutually exclusive with useStdio and cliPath.
|
|
45
|
+
*/
|
|
46
|
+
cliUrl?: string;
|
|
47
|
+
/**
|
|
48
|
+
* Log level for the CLI process.
|
|
49
|
+
* @default "debug"
|
|
50
|
+
*/
|
|
51
|
+
logLevel?: "error" | "warning" | "info" | "debug" | "all" | "none";
|
|
52
|
+
/**
|
|
53
|
+
* Automatically start the connection when creating a session.
|
|
54
|
+
* @default true
|
|
55
|
+
*/
|
|
56
|
+
autoStart?: boolean;
|
|
57
|
+
/**
|
|
58
|
+
* Automatically reconnect on transient failures.
|
|
59
|
+
* @default true
|
|
60
|
+
*/
|
|
61
|
+
autoReconnect?: boolean;
|
|
62
|
+
/**
|
|
63
|
+
* Environment variables to pass to the CLI process.
|
|
64
|
+
* @default process.env
|
|
65
|
+
*/
|
|
66
|
+
env?: Record<string, string>;
|
|
67
|
+
/**
|
|
68
|
+
* GitHub token for authentication.
|
|
69
|
+
* If not provided, uses logged-in user credentials.
|
|
70
|
+
*/
|
|
71
|
+
githubToken?: string;
|
|
72
|
+
/**
|
|
73
|
+
* Use logged-in user credentials for authentication.
|
|
74
|
+
* @default true (false if githubToken is provided)
|
|
75
|
+
*/
|
|
76
|
+
useLoggedInUser?: boolean;
|
|
77
|
+
/**
|
|
78
|
+
* Maximum number of reconnection attempts before giving up.
|
|
79
|
+
* @default 3
|
|
80
|
+
*/
|
|
81
|
+
maxReconnectAttempts?: number;
|
|
82
|
+
/**
|
|
83
|
+
* Initial delay in milliseconds before first reconnection attempt.
|
|
84
|
+
* Subsequent attempts use exponential backoff.
|
|
85
|
+
* @default 1000
|
|
86
|
+
*/
|
|
87
|
+
reconnectDelayMs?: number;
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* SquadClient wraps CopilotClient with enhanced lifecycle management.
|
|
91
|
+
*
|
|
92
|
+
* Features:
|
|
93
|
+
* - Connection state tracking
|
|
94
|
+
* - Automatic reconnection with exponential backoff
|
|
95
|
+
* - Protocol version validation
|
|
96
|
+
* - Error recovery
|
|
97
|
+
* - Session lifecycle event handling
|
|
98
|
+
*
|
|
99
|
+
* @example
|
|
100
|
+
* ```typescript
|
|
101
|
+
* const client = new SquadClient();
|
|
102
|
+
* await client.connect();
|
|
103
|
+
*
|
|
104
|
+
* const session = await client.createSession({
|
|
105
|
+
* model: "claude-sonnet-4.5"
|
|
106
|
+
* });
|
|
107
|
+
*
|
|
108
|
+
* await client.disconnect();
|
|
109
|
+
* ```
|
|
110
|
+
*/
|
|
111
|
+
export declare class SquadClient {
|
|
112
|
+
private client;
|
|
113
|
+
private state;
|
|
114
|
+
private reconnectAttempts;
|
|
115
|
+
private reconnectTimer;
|
|
116
|
+
private options;
|
|
117
|
+
private manualDisconnect;
|
|
118
|
+
/**
|
|
119
|
+
* Creates a new SquadClient instance.
|
|
120
|
+
*
|
|
121
|
+
* @param options - Configuration options
|
|
122
|
+
* @throws Error if mutually exclusive options are provided
|
|
123
|
+
*/
|
|
124
|
+
constructor(options?: SquadClientOptions);
|
|
125
|
+
/**
|
|
126
|
+
* Get the current connection state.
|
|
127
|
+
*/
|
|
128
|
+
getState(): SquadConnectionState;
|
|
129
|
+
/**
|
|
130
|
+
* Check if the client is connected.
|
|
131
|
+
*/
|
|
132
|
+
isConnected(): boolean;
|
|
133
|
+
/**
|
|
134
|
+
* Establish connection to the Copilot CLI server.
|
|
135
|
+
*
|
|
136
|
+
* This method:
|
|
137
|
+
* 1. Spawns or connects to the CLI server
|
|
138
|
+
* 2. Validates protocol version compatibility
|
|
139
|
+
* 3. Sets up automatic reconnection handlers
|
|
140
|
+
*
|
|
141
|
+
* @returns Promise that resolves when connection is established
|
|
142
|
+
* @throws Error if connection fails or protocol version is incompatible
|
|
143
|
+
*/
|
|
144
|
+
connect(): Promise<void>;
|
|
145
|
+
/**
|
|
146
|
+
* Disconnect from the Copilot CLI server.
|
|
147
|
+
*
|
|
148
|
+
* Performs graceful cleanup:
|
|
149
|
+
* 1. Destroys all active sessions
|
|
150
|
+
* 2. Closes the connection
|
|
151
|
+
* 3. Terminates the CLI process (if spawned)
|
|
152
|
+
*
|
|
153
|
+
* @returns Promise that resolves with any errors encountered during cleanup
|
|
154
|
+
*/
|
|
155
|
+
disconnect(): Promise<Error[]>;
|
|
156
|
+
/**
|
|
157
|
+
* Force disconnect without graceful cleanup.
|
|
158
|
+
* Use only when disconnect() fails or hangs.
|
|
159
|
+
*/
|
|
160
|
+
forceDisconnect(): Promise<void>;
|
|
161
|
+
/**
|
|
162
|
+
* Create a new Squad session.
|
|
163
|
+
*
|
|
164
|
+
* If autoStart is enabled and the client is not connected, this will
|
|
165
|
+
* automatically establish the connection.
|
|
166
|
+
*
|
|
167
|
+
* @param config - Session configuration
|
|
168
|
+
* @returns Promise that resolves with the created session
|
|
169
|
+
*/
|
|
170
|
+
createSession(config?: SquadSessionConfig): Promise<SquadSession>;
|
|
171
|
+
/**
|
|
172
|
+
* Resume an existing Squad session by ID.
|
|
173
|
+
*
|
|
174
|
+
* @param sessionId - ID of the session to resume
|
|
175
|
+
* @param config - Optional configuration overrides
|
|
176
|
+
* @returns Promise that resolves with the resumed session
|
|
177
|
+
*/
|
|
178
|
+
resumeSession(sessionId: string, config?: SquadSessionConfig): Promise<SquadSession>;
|
|
179
|
+
/**
|
|
180
|
+
* List all available sessions.
|
|
181
|
+
*/
|
|
182
|
+
listSessions(): Promise<SquadSessionMetadata[]>;
|
|
183
|
+
/**
|
|
184
|
+
* Delete a session by ID.
|
|
185
|
+
*/
|
|
186
|
+
deleteSession(sessionId: string): Promise<void>;
|
|
187
|
+
/**
|
|
188
|
+
* Get the ID of the last updated session.
|
|
189
|
+
*/
|
|
190
|
+
getLastSessionId(): Promise<string | undefined>;
|
|
191
|
+
/**
|
|
192
|
+
* Send a ping to verify connectivity.
|
|
193
|
+
*/
|
|
194
|
+
ping(message?: string): Promise<{
|
|
195
|
+
message: string;
|
|
196
|
+
timestamp: number;
|
|
197
|
+
protocolVersion?: number;
|
|
198
|
+
}>;
|
|
199
|
+
/**
|
|
200
|
+
* Get CLI status information.
|
|
201
|
+
*/
|
|
202
|
+
getStatus(): Promise<SquadGetStatusResponse>;
|
|
203
|
+
/**
|
|
204
|
+
* Get authentication status.
|
|
205
|
+
*/
|
|
206
|
+
getAuthStatus(): Promise<SquadGetAuthStatusResponse>;
|
|
207
|
+
/**
|
|
208
|
+
* List available models.
|
|
209
|
+
*/
|
|
210
|
+
listModels(): Promise<SquadModelInfo[]>;
|
|
211
|
+
/**
|
|
212
|
+
* Subscribe to session lifecycle events.
|
|
213
|
+
*/
|
|
214
|
+
on(eventType: SquadSessionEventType, handler: SquadSessionEventHandler): () => void;
|
|
215
|
+
on(handler: SquadSessionEventHandler): () => void;
|
|
216
|
+
/**
|
|
217
|
+
* Determine if an error is recoverable via reconnection.
|
|
218
|
+
*/
|
|
219
|
+
private shouldAttemptReconnect;
|
|
220
|
+
/**
|
|
221
|
+
* Attempt to reconnect with exponential backoff.
|
|
222
|
+
*/
|
|
223
|
+
private attemptReconnection;
|
|
224
|
+
}
|
|
225
|
+
//# sourceMappingURL=client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/adapter/client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,397 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Squad SDK Client Adapter
|
|
3
|
+
*
|
|
4
|
+
* Wraps CopilotClient to provide connection lifecycle management, error recovery,
|
|
5
|
+
* automatic reconnection, and protocol version validation.
|
|
6
|
+
*
|
|
7
|
+
* @module adapter/client
|
|
8
|
+
*/
|
|
9
|
+
import { CopilotClient } from "@github/copilot-sdk";
|
|
10
|
+
/**
|
|
11
|
+
* SquadClient wraps CopilotClient with enhanced lifecycle management.
|
|
12
|
+
*
|
|
13
|
+
* Features:
|
|
14
|
+
* - Connection state tracking
|
|
15
|
+
* - Automatic reconnection with exponential backoff
|
|
16
|
+
* - Protocol version validation
|
|
17
|
+
* - Error recovery
|
|
18
|
+
* - Session lifecycle event handling
|
|
19
|
+
*
|
|
20
|
+
* @example
|
|
21
|
+
* ```typescript
|
|
22
|
+
* const client = new SquadClient();
|
|
23
|
+
* await client.connect();
|
|
24
|
+
*
|
|
25
|
+
* const session = await client.createSession({
|
|
26
|
+
* model: "claude-sonnet-4.5"
|
|
27
|
+
* });
|
|
28
|
+
*
|
|
29
|
+
* await client.disconnect();
|
|
30
|
+
* ```
|
|
31
|
+
*/
|
|
32
|
+
export class SquadClient {
|
|
33
|
+
client;
|
|
34
|
+
state = "disconnected";
|
|
35
|
+
reconnectAttempts = 0;
|
|
36
|
+
reconnectTimer = null;
|
|
37
|
+
options;
|
|
38
|
+
manualDisconnect = false;
|
|
39
|
+
/**
|
|
40
|
+
* Creates a new SquadClient instance.
|
|
41
|
+
*
|
|
42
|
+
* @param options - Configuration options
|
|
43
|
+
* @throws Error if mutually exclusive options are provided
|
|
44
|
+
*/
|
|
45
|
+
constructor(options = {}) {
|
|
46
|
+
this.options = {
|
|
47
|
+
cliPath: options.cliPath,
|
|
48
|
+
cliArgs: options.cliArgs ?? [],
|
|
49
|
+
cwd: options.cwd ?? process.cwd(),
|
|
50
|
+
port: options.port ?? 0,
|
|
51
|
+
useStdio: options.useStdio ?? true,
|
|
52
|
+
cliUrl: options.cliUrl,
|
|
53
|
+
logLevel: options.logLevel ?? "debug",
|
|
54
|
+
autoStart: options.autoStart ?? true,
|
|
55
|
+
autoReconnect: options.autoReconnect ?? true,
|
|
56
|
+
env: options.env ?? process.env,
|
|
57
|
+
githubToken: options.githubToken,
|
|
58
|
+
useLoggedInUser: options.useLoggedInUser ?? (options.githubToken ? false : true),
|
|
59
|
+
maxReconnectAttempts: options.maxReconnectAttempts ?? 3,
|
|
60
|
+
reconnectDelayMs: options.reconnectDelayMs ?? 1000,
|
|
61
|
+
};
|
|
62
|
+
this.client = new CopilotClient({
|
|
63
|
+
cliPath: this.options.cliPath,
|
|
64
|
+
cliArgs: this.options.cliArgs,
|
|
65
|
+
cwd: this.options.cwd,
|
|
66
|
+
port: this.options.port,
|
|
67
|
+
useStdio: this.options.useStdio,
|
|
68
|
+
cliUrl: this.options.cliUrl,
|
|
69
|
+
logLevel: this.options.logLevel,
|
|
70
|
+
autoStart: false, // We manage connection lifecycle
|
|
71
|
+
autoRestart: false, // We handle reconnection ourselves
|
|
72
|
+
env: this.options.env,
|
|
73
|
+
githubToken: this.options.githubToken,
|
|
74
|
+
useLoggedInUser: this.options.useLoggedInUser,
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Get the current connection state.
|
|
79
|
+
*/
|
|
80
|
+
getState() {
|
|
81
|
+
return this.state;
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Check if the client is connected.
|
|
85
|
+
*/
|
|
86
|
+
isConnected() {
|
|
87
|
+
return this.state === "connected";
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Establish connection to the Copilot CLI server.
|
|
91
|
+
*
|
|
92
|
+
* This method:
|
|
93
|
+
* 1. Spawns or connects to the CLI server
|
|
94
|
+
* 2. Validates protocol version compatibility
|
|
95
|
+
* 3. Sets up automatic reconnection handlers
|
|
96
|
+
*
|
|
97
|
+
* @returns Promise that resolves when connection is established
|
|
98
|
+
* @throws Error if connection fails or protocol version is incompatible
|
|
99
|
+
*/
|
|
100
|
+
async connect() {
|
|
101
|
+
if (this.state === "connected") {
|
|
102
|
+
return;
|
|
103
|
+
}
|
|
104
|
+
if (this.state === "connecting") {
|
|
105
|
+
throw new Error("Connection already in progress");
|
|
106
|
+
}
|
|
107
|
+
this.state = "connecting";
|
|
108
|
+
this.manualDisconnect = false;
|
|
109
|
+
const startTime = Date.now();
|
|
110
|
+
try {
|
|
111
|
+
await this.client.start();
|
|
112
|
+
const elapsed = Date.now() - startTime;
|
|
113
|
+
this.state = "connected";
|
|
114
|
+
this.reconnectAttempts = 0;
|
|
115
|
+
if (elapsed > 2000) {
|
|
116
|
+
console.warn(`SquadClient connection took ${elapsed}ms (> 2s threshold)`);
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
catch (error) {
|
|
120
|
+
this.state = "error";
|
|
121
|
+
throw new Error(`Failed to connect to Copilot CLI: ${error instanceof Error ? error.message : String(error)}`);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Disconnect from the Copilot CLI server.
|
|
126
|
+
*
|
|
127
|
+
* Performs graceful cleanup:
|
|
128
|
+
* 1. Destroys all active sessions
|
|
129
|
+
* 2. Closes the connection
|
|
130
|
+
* 3. Terminates the CLI process (if spawned)
|
|
131
|
+
*
|
|
132
|
+
* @returns Promise that resolves with any errors encountered during cleanup
|
|
133
|
+
*/
|
|
134
|
+
async disconnect() {
|
|
135
|
+
this.manualDisconnect = true;
|
|
136
|
+
if (this.reconnectTimer) {
|
|
137
|
+
clearTimeout(this.reconnectTimer);
|
|
138
|
+
this.reconnectTimer = null;
|
|
139
|
+
}
|
|
140
|
+
const errors = await this.client.stop();
|
|
141
|
+
this.state = "disconnected";
|
|
142
|
+
this.reconnectAttempts = 0;
|
|
143
|
+
return errors;
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* Force disconnect without graceful cleanup.
|
|
147
|
+
* Use only when disconnect() fails or hangs.
|
|
148
|
+
*/
|
|
149
|
+
async forceDisconnect() {
|
|
150
|
+
this.manualDisconnect = true;
|
|
151
|
+
if (this.reconnectTimer) {
|
|
152
|
+
clearTimeout(this.reconnectTimer);
|
|
153
|
+
this.reconnectTimer = null;
|
|
154
|
+
}
|
|
155
|
+
await this.client.forceStop();
|
|
156
|
+
this.state = "disconnected";
|
|
157
|
+
this.reconnectAttempts = 0;
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* Create a new Squad session.
|
|
161
|
+
*
|
|
162
|
+
* If autoStart is enabled and the client is not connected, this will
|
|
163
|
+
* automatically establish the connection.
|
|
164
|
+
*
|
|
165
|
+
* @param config - Session configuration
|
|
166
|
+
* @returns Promise that resolves with the created session
|
|
167
|
+
*/
|
|
168
|
+
async createSession(config = {}) {
|
|
169
|
+
if (!this.isConnected() && this.options.autoStart) {
|
|
170
|
+
await this.connect();
|
|
171
|
+
}
|
|
172
|
+
if (!this.isConnected()) {
|
|
173
|
+
throw new Error("Client not connected. Call connect() first.");
|
|
174
|
+
}
|
|
175
|
+
try {
|
|
176
|
+
const session = await this.client.createSession(config);
|
|
177
|
+
return session;
|
|
178
|
+
}
|
|
179
|
+
catch (error) {
|
|
180
|
+
if (this.shouldAttemptReconnect(error)) {
|
|
181
|
+
await this.attemptReconnection();
|
|
182
|
+
return this.createSession(config);
|
|
183
|
+
}
|
|
184
|
+
throw error;
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
/**
|
|
188
|
+
* Resume an existing Squad session by ID.
|
|
189
|
+
*
|
|
190
|
+
* @param sessionId - ID of the session to resume
|
|
191
|
+
* @param config - Optional configuration overrides
|
|
192
|
+
* @returns Promise that resolves with the resumed session
|
|
193
|
+
*/
|
|
194
|
+
async resumeSession(sessionId, config = {}) {
|
|
195
|
+
if (!this.isConnected() && this.options.autoStart) {
|
|
196
|
+
await this.connect();
|
|
197
|
+
}
|
|
198
|
+
if (!this.isConnected()) {
|
|
199
|
+
throw new Error("Client not connected. Call connect() first.");
|
|
200
|
+
}
|
|
201
|
+
try {
|
|
202
|
+
const session = await this.client.resumeSession(sessionId, config);
|
|
203
|
+
return session;
|
|
204
|
+
}
|
|
205
|
+
catch (error) {
|
|
206
|
+
if (this.shouldAttemptReconnect(error)) {
|
|
207
|
+
await this.attemptReconnection();
|
|
208
|
+
return this.resumeSession(sessionId, config);
|
|
209
|
+
}
|
|
210
|
+
throw error;
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
/**
|
|
214
|
+
* List all available sessions.
|
|
215
|
+
*/
|
|
216
|
+
async listSessions() {
|
|
217
|
+
if (!this.isConnected()) {
|
|
218
|
+
throw new Error("Client not connected");
|
|
219
|
+
}
|
|
220
|
+
try {
|
|
221
|
+
const sessions = await this.client.listSessions();
|
|
222
|
+
return sessions;
|
|
223
|
+
}
|
|
224
|
+
catch (error) {
|
|
225
|
+
if (this.shouldAttemptReconnect(error)) {
|
|
226
|
+
await this.attemptReconnection();
|
|
227
|
+
return this.listSessions();
|
|
228
|
+
}
|
|
229
|
+
throw error;
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
/**
|
|
233
|
+
* Delete a session by ID.
|
|
234
|
+
*/
|
|
235
|
+
async deleteSession(sessionId) {
|
|
236
|
+
if (!this.isConnected()) {
|
|
237
|
+
throw new Error("Client not connected");
|
|
238
|
+
}
|
|
239
|
+
try {
|
|
240
|
+
await this.client.deleteSession(sessionId);
|
|
241
|
+
}
|
|
242
|
+
catch (error) {
|
|
243
|
+
if (this.shouldAttemptReconnect(error)) {
|
|
244
|
+
await this.attemptReconnection();
|
|
245
|
+
return this.deleteSession(sessionId);
|
|
246
|
+
}
|
|
247
|
+
throw error;
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
/**
|
|
251
|
+
* Get the ID of the last updated session.
|
|
252
|
+
*/
|
|
253
|
+
async getLastSessionId() {
|
|
254
|
+
if (!this.isConnected()) {
|
|
255
|
+
throw new Error("Client not connected");
|
|
256
|
+
}
|
|
257
|
+
try {
|
|
258
|
+
return await this.client.getLastSessionId();
|
|
259
|
+
}
|
|
260
|
+
catch (error) {
|
|
261
|
+
if (this.shouldAttemptReconnect(error)) {
|
|
262
|
+
await this.attemptReconnection();
|
|
263
|
+
return this.getLastSessionId();
|
|
264
|
+
}
|
|
265
|
+
throw error;
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
/**
|
|
269
|
+
* Send a ping to verify connectivity.
|
|
270
|
+
*/
|
|
271
|
+
async ping(message) {
|
|
272
|
+
if (!this.isConnected()) {
|
|
273
|
+
throw new Error("Client not connected");
|
|
274
|
+
}
|
|
275
|
+
try {
|
|
276
|
+
return await this.client.ping(message);
|
|
277
|
+
}
|
|
278
|
+
catch (error) {
|
|
279
|
+
if (this.shouldAttemptReconnect(error)) {
|
|
280
|
+
await this.attemptReconnection();
|
|
281
|
+
return this.ping(message);
|
|
282
|
+
}
|
|
283
|
+
throw error;
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
/**
|
|
287
|
+
* Get CLI status information.
|
|
288
|
+
*/
|
|
289
|
+
async getStatus() {
|
|
290
|
+
if (!this.isConnected()) {
|
|
291
|
+
throw new Error("Client not connected");
|
|
292
|
+
}
|
|
293
|
+
try {
|
|
294
|
+
return await this.client.getStatus();
|
|
295
|
+
}
|
|
296
|
+
catch (error) {
|
|
297
|
+
if (this.shouldAttemptReconnect(error)) {
|
|
298
|
+
await this.attemptReconnection();
|
|
299
|
+
return this.getStatus();
|
|
300
|
+
}
|
|
301
|
+
throw error;
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
/**
|
|
305
|
+
* Get authentication status.
|
|
306
|
+
*/
|
|
307
|
+
async getAuthStatus() {
|
|
308
|
+
if (!this.isConnected()) {
|
|
309
|
+
throw new Error("Client not connected");
|
|
310
|
+
}
|
|
311
|
+
try {
|
|
312
|
+
return await this.client.getAuthStatus();
|
|
313
|
+
}
|
|
314
|
+
catch (error) {
|
|
315
|
+
if (this.shouldAttemptReconnect(error)) {
|
|
316
|
+
await this.attemptReconnection();
|
|
317
|
+
return this.getAuthStatus();
|
|
318
|
+
}
|
|
319
|
+
throw error;
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
/**
|
|
323
|
+
* List available models.
|
|
324
|
+
*/
|
|
325
|
+
async listModels() {
|
|
326
|
+
if (!this.isConnected()) {
|
|
327
|
+
throw new Error("Client not connected");
|
|
328
|
+
}
|
|
329
|
+
try {
|
|
330
|
+
return await this.client.listModels();
|
|
331
|
+
}
|
|
332
|
+
catch (error) {
|
|
333
|
+
if (this.shouldAttemptReconnect(error)) {
|
|
334
|
+
await this.attemptReconnection();
|
|
335
|
+
return this.listModels();
|
|
336
|
+
}
|
|
337
|
+
throw error;
|
|
338
|
+
}
|
|
339
|
+
}
|
|
340
|
+
on(eventTypeOrHandler, handler) {
|
|
341
|
+
if (typeof eventTypeOrHandler === "string" && handler) {
|
|
342
|
+
return this.client.on(eventTypeOrHandler, handler);
|
|
343
|
+
}
|
|
344
|
+
else {
|
|
345
|
+
return this.client.on(eventTypeOrHandler);
|
|
346
|
+
}
|
|
347
|
+
}
|
|
348
|
+
/**
|
|
349
|
+
* Determine if an error is recoverable via reconnection.
|
|
350
|
+
*/
|
|
351
|
+
shouldAttemptReconnect(error) {
|
|
352
|
+
if (!this.options.autoReconnect) {
|
|
353
|
+
return false;
|
|
354
|
+
}
|
|
355
|
+
if (this.manualDisconnect) {
|
|
356
|
+
return false;
|
|
357
|
+
}
|
|
358
|
+
if (this.reconnectAttempts >= this.options.maxReconnectAttempts) {
|
|
359
|
+
return false;
|
|
360
|
+
}
|
|
361
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
362
|
+
// Transient connection errors
|
|
363
|
+
if (message.includes("ECONNREFUSED") ||
|
|
364
|
+
message.includes("ECONNRESET") ||
|
|
365
|
+
message.includes("EPIPE") ||
|
|
366
|
+
message.includes("Client not connected") ||
|
|
367
|
+
message.includes("Connection closed")) {
|
|
368
|
+
return true;
|
|
369
|
+
}
|
|
370
|
+
return false;
|
|
371
|
+
}
|
|
372
|
+
/**
|
|
373
|
+
* Attempt to reconnect with exponential backoff.
|
|
374
|
+
*/
|
|
375
|
+
async attemptReconnection() {
|
|
376
|
+
if (this.state === "reconnecting") {
|
|
377
|
+
throw new Error("Reconnection already in progress");
|
|
378
|
+
}
|
|
379
|
+
this.state = "reconnecting";
|
|
380
|
+
this.reconnectAttempts++;
|
|
381
|
+
const delay = this.options.reconnectDelayMs * Math.pow(2, this.reconnectAttempts - 1);
|
|
382
|
+
await new Promise((resolve) => {
|
|
383
|
+
this.reconnectTimer = setTimeout(resolve, delay);
|
|
384
|
+
});
|
|
385
|
+
try {
|
|
386
|
+
await this.client.stop();
|
|
387
|
+
await this.client.start();
|
|
388
|
+
this.state = "connected";
|
|
389
|
+
this.reconnectAttempts = 0;
|
|
390
|
+
}
|
|
391
|
+
catch (error) {
|
|
392
|
+
this.state = "error";
|
|
393
|
+
throw new Error(`Reconnection attempt ${this.reconnectAttempts} failed: ${error instanceof Error ? error.message : String(error)}`);
|
|
394
|
+
}
|
|
395
|
+
}
|
|
396
|
+
}
|
|
397
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/adapter/client.ts"],"names":[],"mappings":"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"}
|