@ai-accounts/ts-core 0.2.2 → 0.3.0-alpha.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +129 -0
- package/dist/index.d.cts +164 -1
- package/dist/index.d.ts +164 -1
- package/dist/index.js +129 -0
- package/package.json +1 -1
package/dist/index.cjs
CHANGED
|
@@ -31,6 +31,36 @@ module.exports = __toCommonJS(index_exports);
|
|
|
31
31
|
// src/protocol/wire.ts
|
|
32
32
|
var WIRE_PROTOCOL_VERSION = 1;
|
|
33
33
|
|
|
34
|
+
// src/client/login-stream.ts
|
|
35
|
+
async function* parseSseLoginEvents(response) {
|
|
36
|
+
if (!response.body) return;
|
|
37
|
+
const reader = response.body.getReader();
|
|
38
|
+
const decoder = new TextDecoder();
|
|
39
|
+
let buffer = "";
|
|
40
|
+
try {
|
|
41
|
+
while (true) {
|
|
42
|
+
const { value, done } = await reader.read();
|
|
43
|
+
if (done) break;
|
|
44
|
+
buffer += decoder.decode(value, { stream: true });
|
|
45
|
+
while (true) {
|
|
46
|
+
const sep = buffer.indexOf("\n\n");
|
|
47
|
+
if (sep === -1) break;
|
|
48
|
+
const frame = buffer.slice(0, sep);
|
|
49
|
+
buffer = buffer.slice(sep + 2);
|
|
50
|
+
const dataLine = frame.split("\n").find((l) => l.startsWith("data: "));
|
|
51
|
+
if (!dataLine) continue;
|
|
52
|
+
const payload = dataLine.slice(6);
|
|
53
|
+
try {
|
|
54
|
+
yield JSON.parse(payload);
|
|
55
|
+
} catch {
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
} finally {
|
|
60
|
+
reader.releaseLock();
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
|
|
34
64
|
// src/client/index.ts
|
|
35
65
|
async function toError(r) {
|
|
36
66
|
let code = "http_error";
|
|
@@ -130,6 +160,55 @@ var AiAccountsClient = class {
|
|
|
130
160
|
async validateBackend(id) {
|
|
131
161
|
return this.postAction(id, "validate");
|
|
132
162
|
}
|
|
163
|
+
async beginLogin(accountId, flowKind, inputs) {
|
|
164
|
+
const r = await this._fetch(
|
|
165
|
+
`${this.baseUrl}/api/v1/backends/${encodeURIComponent(accountId)}/login/begin`,
|
|
166
|
+
{
|
|
167
|
+
method: "POST",
|
|
168
|
+
headers: this.headers(),
|
|
169
|
+
body: JSON.stringify({ flow_kind: flowKind, inputs })
|
|
170
|
+
}
|
|
171
|
+
);
|
|
172
|
+
if (!r.ok) throw await toError(r);
|
|
173
|
+
return await r.json();
|
|
174
|
+
}
|
|
175
|
+
async respondLogin(accountId, sessionId, promptId, answer) {
|
|
176
|
+
const r = await this._fetch(
|
|
177
|
+
`${this.baseUrl}/api/v1/backends/${encodeURIComponent(accountId)}/login/respond`,
|
|
178
|
+
{
|
|
179
|
+
method: "POST",
|
|
180
|
+
headers: this.headers(),
|
|
181
|
+
body: JSON.stringify({ session_id: sessionId, prompt_id: promptId, answer })
|
|
182
|
+
}
|
|
183
|
+
);
|
|
184
|
+
if (!r.ok) throw await toError(r);
|
|
185
|
+
}
|
|
186
|
+
async cancelLogin(accountId, sessionId) {
|
|
187
|
+
const r = await this._fetch(
|
|
188
|
+
`${this.baseUrl}/api/v1/backends/${encodeURIComponent(accountId)}/login/cancel`,
|
|
189
|
+
{
|
|
190
|
+
method: "POST",
|
|
191
|
+
headers: this.headers(),
|
|
192
|
+
body: JSON.stringify({ session_id: sessionId })
|
|
193
|
+
}
|
|
194
|
+
);
|
|
195
|
+
if (!r.ok) throw await toError(r);
|
|
196
|
+
}
|
|
197
|
+
async *streamLogin(accountId, sessionId) {
|
|
198
|
+
const url = `${this.baseUrl}/api/v1/backends/${encodeURIComponent(accountId)}/login/stream?session_id=${encodeURIComponent(sessionId)}`;
|
|
199
|
+
const headers = { Accept: "text/event-stream" };
|
|
200
|
+
if (this.token) headers["authorization"] = `Bearer ${this.token}`;
|
|
201
|
+
const r = await this._fetch(url, { method: "GET", headers });
|
|
202
|
+
if (!r.ok) throw await toError(r);
|
|
203
|
+
yield* parseSseLoginEvents(r);
|
|
204
|
+
}
|
|
205
|
+
async getBackendMetadata() {
|
|
206
|
+
const r = await this._fetch(`${this.baseUrl}/api/v1/backends/_meta`, {
|
|
207
|
+
headers: this.headers()
|
|
208
|
+
});
|
|
209
|
+
if (!r.ok) throw await toError(r);
|
|
210
|
+
return await r.json();
|
|
211
|
+
}
|
|
133
212
|
async startOnboarding() {
|
|
134
213
|
const r = await this._fetch(`${this.baseUrl}/api/v1/onboarding`, {
|
|
135
214
|
method: "POST",
|
|
@@ -167,6 +246,56 @@ var AiAccountsClient = class {
|
|
|
167
246
|
async finalizeOnboarding(id) {
|
|
168
247
|
return this.onboardingAction(id, "finalize");
|
|
169
248
|
}
|
|
249
|
+
// --- Backend CLI install ---
|
|
250
|
+
async installBackendCli(kind) {
|
|
251
|
+
const r = await this._fetch(
|
|
252
|
+
`${this.baseUrl}/api/v1/backends/${encodeURIComponent(kind)}/install`,
|
|
253
|
+
{
|
|
254
|
+
method: "POST",
|
|
255
|
+
headers: this.headers()
|
|
256
|
+
}
|
|
257
|
+
);
|
|
258
|
+
if (!r.ok) throw await toError(r);
|
|
259
|
+
return await r.json();
|
|
260
|
+
}
|
|
261
|
+
// --- CLIProxyAPI ---
|
|
262
|
+
async cliproxyStatus() {
|
|
263
|
+
const r = await this._fetch(`${this.baseUrl}/api/v1/cliproxy/status`, {
|
|
264
|
+
method: "GET",
|
|
265
|
+
headers: this.headers()
|
|
266
|
+
});
|
|
267
|
+
if (!r.ok) throw await toError(r);
|
|
268
|
+
return await r.json();
|
|
269
|
+
}
|
|
270
|
+
async cliproxyInstall() {
|
|
271
|
+
const r = await this._fetch(`${this.baseUrl}/api/v1/cliproxy/install`, {
|
|
272
|
+
method: "POST",
|
|
273
|
+
headers: this.headers()
|
|
274
|
+
});
|
|
275
|
+
if (!r.ok) throw await toError(r);
|
|
276
|
+
return await r.json();
|
|
277
|
+
}
|
|
278
|
+
async cliproxyLoginBegin(backendKind, configDir) {
|
|
279
|
+
const r = await this._fetch(`${this.baseUrl}/api/v1/cliproxy/login/begin`, {
|
|
280
|
+
method: "POST",
|
|
281
|
+
headers: this.headers(),
|
|
282
|
+
body: JSON.stringify({ backend_kind: backendKind, config_dir: configDir ?? null })
|
|
283
|
+
});
|
|
284
|
+
if (!r.ok) throw await toError(r);
|
|
285
|
+
return await r.json();
|
|
286
|
+
}
|
|
287
|
+
async cliproxyCallbackForward(callbackUrl) {
|
|
288
|
+
const r = await this._fetch(
|
|
289
|
+
`${this.baseUrl}/api/v1/cliproxy/login/callback-forward`,
|
|
290
|
+
{
|
|
291
|
+
method: "POST",
|
|
292
|
+
headers: this.headers(),
|
|
293
|
+
body: JSON.stringify({ callback_url: callbackUrl })
|
|
294
|
+
}
|
|
295
|
+
);
|
|
296
|
+
if (!r.ok) throw await toError(r);
|
|
297
|
+
return await r.json();
|
|
298
|
+
}
|
|
170
299
|
async postAction(id, action, body) {
|
|
171
300
|
const r = await this._fetch(
|
|
172
301
|
`${this.baseUrl}/api/v1/backends/${encodeURIComponent(id)}/${action}`,
|
package/dist/index.d.cts
CHANGED
|
@@ -61,6 +61,115 @@ interface ErrorEvent {
|
|
|
61
61
|
}
|
|
62
62
|
type WireEvent = SessionStartEvent | SessionEndEvent | ChatTokenEvent | ChatToolCallEvent | ChatDoneEvent | PtyOutputEvent | PtyResizeEvent | PtyExitEvent | ErrorEvent;
|
|
63
63
|
|
|
64
|
+
type UrlPrompt = {
|
|
65
|
+
type: 'url_prompt';
|
|
66
|
+
prompt_id: string;
|
|
67
|
+
url: string;
|
|
68
|
+
user_code?: string | null;
|
|
69
|
+
};
|
|
70
|
+
type TextPrompt = {
|
|
71
|
+
type: 'text_prompt';
|
|
72
|
+
prompt_id: string;
|
|
73
|
+
prompt: string;
|
|
74
|
+
hidden: boolean;
|
|
75
|
+
};
|
|
76
|
+
type StdoutChunk = {
|
|
77
|
+
type: 'stdout';
|
|
78
|
+
text: string;
|
|
79
|
+
};
|
|
80
|
+
type ProgressUpdate = {
|
|
81
|
+
type: 'progress';
|
|
82
|
+
label: string;
|
|
83
|
+
percent?: number | null;
|
|
84
|
+
};
|
|
85
|
+
type LoginComplete = {
|
|
86
|
+
type: 'complete';
|
|
87
|
+
account_id: string;
|
|
88
|
+
backend_status: string;
|
|
89
|
+
};
|
|
90
|
+
type LoginFailed = {
|
|
91
|
+
type: 'failed';
|
|
92
|
+
code: string;
|
|
93
|
+
message: string;
|
|
94
|
+
};
|
|
95
|
+
type LoginEvent = UrlPrompt | TextPrompt | StdoutChunk | ProgressUpdate | LoginComplete | LoginFailed;
|
|
96
|
+
type PromptAnswer = {
|
|
97
|
+
prompt_id: string;
|
|
98
|
+
answer: string;
|
|
99
|
+
};
|
|
100
|
+
type LoginFlowKind = 'api_key' | 'oauth_device' | 'cli_browser';
|
|
101
|
+
|
|
102
|
+
type InstallCheck = {
|
|
103
|
+
command: string[];
|
|
104
|
+
version_regex: string;
|
|
105
|
+
};
|
|
106
|
+
type InputSpec = {
|
|
107
|
+
name: string;
|
|
108
|
+
label: string;
|
|
109
|
+
kind: 'text' | 'secret' | 'email' | 'path';
|
|
110
|
+
placeholder?: string | null;
|
|
111
|
+
};
|
|
112
|
+
type LoginFlowSpec = {
|
|
113
|
+
kind: string;
|
|
114
|
+
display_name: string;
|
|
115
|
+
description: string;
|
|
116
|
+
requires_inputs: InputSpec[];
|
|
117
|
+
};
|
|
118
|
+
type PlanOption = {
|
|
119
|
+
id: string;
|
|
120
|
+
label: string;
|
|
121
|
+
description: string;
|
|
122
|
+
};
|
|
123
|
+
type BackendMetadata = {
|
|
124
|
+
kind: string;
|
|
125
|
+
display_name: string;
|
|
126
|
+
icon_url: string | null;
|
|
127
|
+
install_check: InstallCheck;
|
|
128
|
+
login_flows: LoginFlowSpec[];
|
|
129
|
+
plan_options: PlanOption[] | null;
|
|
130
|
+
config_schema: Record<string, unknown>;
|
|
131
|
+
supports_multi_account: boolean;
|
|
132
|
+
isolation_env_var: string | null;
|
|
133
|
+
};
|
|
134
|
+
|
|
135
|
+
/**
|
|
136
|
+
* Types for backend CLI install + CLIProxyAPI install/login flows.
|
|
137
|
+
*
|
|
138
|
+
* Mirror of Python models in `ai_accounts.core.cli_install` /
|
|
139
|
+
* `ai_accounts.core.cliproxy_manager` and the Litestar route responses.
|
|
140
|
+
*/
|
|
141
|
+
type InstallResult = {
|
|
142
|
+
kind: string;
|
|
143
|
+
success: boolean;
|
|
144
|
+
display: string;
|
|
145
|
+
stdout: string;
|
|
146
|
+
stderr: string;
|
|
147
|
+
exit_code: number;
|
|
148
|
+
binary_path: string | null;
|
|
149
|
+
};
|
|
150
|
+
type CliproxyStatus = {
|
|
151
|
+
installed: boolean;
|
|
152
|
+
version: string | null;
|
|
153
|
+
binary_path: string | null;
|
|
154
|
+
};
|
|
155
|
+
type CliproxyInstallResult = {
|
|
156
|
+
success: boolean;
|
|
157
|
+
display: string;
|
|
158
|
+
stdout: string;
|
|
159
|
+
stderr: string;
|
|
160
|
+
binary_path: string | null;
|
|
161
|
+
};
|
|
162
|
+
type CliproxyLoginBeginResponse = {
|
|
163
|
+
status: 'started' | 'imported' | 'skipped' | 'error';
|
|
164
|
+
message: string;
|
|
165
|
+
oauth_url?: string | null;
|
|
166
|
+
device_code?: string | null;
|
|
167
|
+
};
|
|
168
|
+
type CliproxyCallbackForwardResponse = {
|
|
169
|
+
status: 'completed' | 'error';
|
|
170
|
+
message: string;
|
|
171
|
+
};
|
|
172
|
+
|
|
64
173
|
/**
|
|
65
174
|
* This file was auto-generated by openapi-typescript.
|
|
66
175
|
* Do not make direct changes to the file.
|
|
@@ -1074,6 +1183,15 @@ declare class AiAccountsClient {
|
|
|
1074
1183
|
loginBackend(id: string, flowKind: string, inputs: Record<string, string>): Promise<LoginResponseDTO>;
|
|
1075
1184
|
pollBackendLogin(id: string, handle: string): Promise<LoginResponseDTO>;
|
|
1076
1185
|
validateBackend(id: string): Promise<BackendDTO>;
|
|
1186
|
+
beginLogin(accountId: string, flowKind: LoginFlowKind, inputs: Record<string, string>): Promise<{
|
|
1187
|
+
session_id: string;
|
|
1188
|
+
}>;
|
|
1189
|
+
respondLogin(accountId: string, sessionId: string, promptId: string, answer: string): Promise<void>;
|
|
1190
|
+
cancelLogin(accountId: string, sessionId: string): Promise<void>;
|
|
1191
|
+
streamLogin(accountId: string, sessionId: string): AsyncIterable<LoginEvent>;
|
|
1192
|
+
getBackendMetadata(): Promise<{
|
|
1193
|
+
items: BackendMetadata[];
|
|
1194
|
+
}>;
|
|
1077
1195
|
startOnboarding(): Promise<OnboardingStateDTO>;
|
|
1078
1196
|
getOnboarding(id: string): Promise<OnboardingStateDTO>;
|
|
1079
1197
|
detectForOnboarding(id: string): Promise<DetectResultsDTO>;
|
|
@@ -1081,10 +1199,55 @@ declare class AiAccountsClient {
|
|
|
1081
1199
|
beginOnboardingLogin(id: string, flowKind: string, inputs: Record<string, string>): Promise<LoginResponseDTO>;
|
|
1082
1200
|
pollOnboardingLogin(id: string, handle: string): Promise<LoginResponseDTO>;
|
|
1083
1201
|
finalizeOnboarding(id: string): Promise<OnboardingStateDTO>;
|
|
1202
|
+
installBackendCli(kind: string): Promise<InstallResult>;
|
|
1203
|
+
cliproxyStatus(): Promise<CliproxyStatus>;
|
|
1204
|
+
cliproxyInstall(): Promise<CliproxyInstallResult>;
|
|
1205
|
+
cliproxyLoginBegin(backendKind: string, configDir?: string): Promise<CliproxyLoginBeginResponse>;
|
|
1206
|
+
cliproxyCallbackForward(callbackUrl: string): Promise<CliproxyCallbackForwardResponse>;
|
|
1084
1207
|
private postAction;
|
|
1085
1208
|
private onboardingAction;
|
|
1086
1209
|
}
|
|
1087
1210
|
|
|
1211
|
+
type AiAccountsEvent = {
|
|
1212
|
+
type: 'wizard.opened';
|
|
1213
|
+
backendKind: string;
|
|
1214
|
+
} | {
|
|
1215
|
+
type: 'wizard.step';
|
|
1216
|
+
backendKind: string;
|
|
1217
|
+
step: string;
|
|
1218
|
+
} | {
|
|
1219
|
+
type: 'wizard.account.created';
|
|
1220
|
+
backendKind: string;
|
|
1221
|
+
accountId: string;
|
|
1222
|
+
} | {
|
|
1223
|
+
type: 'wizard.closed';
|
|
1224
|
+
backendKind: string;
|
|
1225
|
+
reason: 'done' | 'skip' | 'cancel';
|
|
1226
|
+
} | {
|
|
1227
|
+
type: 'login.started';
|
|
1228
|
+
sessionId: string;
|
|
1229
|
+
backendKind: string;
|
|
1230
|
+
flow: string;
|
|
1231
|
+
} | {
|
|
1232
|
+
type: 'login.prompt';
|
|
1233
|
+
sessionId: string;
|
|
1234
|
+
promptKind: 'url' | 'text';
|
|
1235
|
+
} | {
|
|
1236
|
+
type: 'login.completed';
|
|
1237
|
+
sessionId: string;
|
|
1238
|
+
accountId: string;
|
|
1239
|
+
} | {
|
|
1240
|
+
type: 'login.failed';
|
|
1241
|
+
sessionId: string;
|
|
1242
|
+
code: string;
|
|
1243
|
+
message: string;
|
|
1244
|
+
} | {
|
|
1245
|
+
type: 'internal.handler_error';
|
|
1246
|
+
error: string;
|
|
1247
|
+
original: AiAccountsEvent;
|
|
1248
|
+
};
|
|
1249
|
+
type AiAccountsEventHandler = (event: AiAccountsEvent) => void;
|
|
1250
|
+
|
|
1088
1251
|
type WizardState = 'idle' | 'picking_kind' | 'detecting' | 'entering_credential' | 'validating' | 'done' | 'error';
|
|
1089
1252
|
interface AccountWizard {
|
|
1090
1253
|
readonly state: WizardState;
|
|
@@ -1134,4 +1297,4 @@ declare function createOnboardingFlow(opts: CreateOnboardingFlowOptions): Onboar
|
|
|
1134
1297
|
|
|
1135
1298
|
declare const version = "0.0.0";
|
|
1136
1299
|
|
|
1137
|
-
export { type AccountWizard, type paths as AiAccountsApiPaths, AiAccountsClient, type ApiError, type BackendDTO, type ChatDoneEvent, type ChatTokenEvent, type ChatToolCallEvent, type ClientOptions, type CreateAccountWizardOptions, type CreateOnboardingFlowOptions, type DetectResultDTO, type DetectResultsDTO, type ErrorEvent, type LoginResponseDTO, type OAuthDeviceLoginDTO, type OnboardingFlowMachine, type OnboardingMachineState, type OnboardingStateDTO, type PtyExitEvent, type PtyOutputEvent, type PtyResizeEvent, type SessionEndEvent, type SessionStartEvent, WIRE_PROTOCOL_VERSION, type WireEvent, type WizardState, createAccountWizard, createOnboardingFlow, version };
|
|
1300
|
+
export { type AccountWizard, type paths as AiAccountsApiPaths, AiAccountsClient, type AiAccountsEvent, type AiAccountsEventHandler, type ApiError, type BackendDTO, type BackendMetadata, type ChatDoneEvent, type ChatTokenEvent, type ChatToolCallEvent, type ClientOptions, type CliproxyCallbackForwardResponse, type CliproxyInstallResult, type CliproxyLoginBeginResponse, type CliproxyStatus, type CreateAccountWizardOptions, type CreateOnboardingFlowOptions, type DetectResultDTO, type DetectResultsDTO, type ErrorEvent, type InputSpec, type InstallCheck, type InstallResult, type LoginComplete, type LoginEvent, type LoginFailed, type LoginFlowKind, type LoginFlowSpec, type LoginResponseDTO, type OAuthDeviceLoginDTO, type OnboardingFlowMachine, type OnboardingMachineState, type OnboardingStateDTO, type PlanOption, type ProgressUpdate, type PromptAnswer, type PtyExitEvent, type PtyOutputEvent, type PtyResizeEvent, type SessionEndEvent, type SessionStartEvent, type StdoutChunk, type TextPrompt, type UrlPrompt, WIRE_PROTOCOL_VERSION, type WireEvent, type WizardState, createAccountWizard, createOnboardingFlow, version };
|
package/dist/index.d.ts
CHANGED
|
@@ -61,6 +61,115 @@ interface ErrorEvent {
|
|
|
61
61
|
}
|
|
62
62
|
type WireEvent = SessionStartEvent | SessionEndEvent | ChatTokenEvent | ChatToolCallEvent | ChatDoneEvent | PtyOutputEvent | PtyResizeEvent | PtyExitEvent | ErrorEvent;
|
|
63
63
|
|
|
64
|
+
type UrlPrompt = {
|
|
65
|
+
type: 'url_prompt';
|
|
66
|
+
prompt_id: string;
|
|
67
|
+
url: string;
|
|
68
|
+
user_code?: string | null;
|
|
69
|
+
};
|
|
70
|
+
type TextPrompt = {
|
|
71
|
+
type: 'text_prompt';
|
|
72
|
+
prompt_id: string;
|
|
73
|
+
prompt: string;
|
|
74
|
+
hidden: boolean;
|
|
75
|
+
};
|
|
76
|
+
type StdoutChunk = {
|
|
77
|
+
type: 'stdout';
|
|
78
|
+
text: string;
|
|
79
|
+
};
|
|
80
|
+
type ProgressUpdate = {
|
|
81
|
+
type: 'progress';
|
|
82
|
+
label: string;
|
|
83
|
+
percent?: number | null;
|
|
84
|
+
};
|
|
85
|
+
type LoginComplete = {
|
|
86
|
+
type: 'complete';
|
|
87
|
+
account_id: string;
|
|
88
|
+
backend_status: string;
|
|
89
|
+
};
|
|
90
|
+
type LoginFailed = {
|
|
91
|
+
type: 'failed';
|
|
92
|
+
code: string;
|
|
93
|
+
message: string;
|
|
94
|
+
};
|
|
95
|
+
type LoginEvent = UrlPrompt | TextPrompt | StdoutChunk | ProgressUpdate | LoginComplete | LoginFailed;
|
|
96
|
+
type PromptAnswer = {
|
|
97
|
+
prompt_id: string;
|
|
98
|
+
answer: string;
|
|
99
|
+
};
|
|
100
|
+
type LoginFlowKind = 'api_key' | 'oauth_device' | 'cli_browser';
|
|
101
|
+
|
|
102
|
+
type InstallCheck = {
|
|
103
|
+
command: string[];
|
|
104
|
+
version_regex: string;
|
|
105
|
+
};
|
|
106
|
+
type InputSpec = {
|
|
107
|
+
name: string;
|
|
108
|
+
label: string;
|
|
109
|
+
kind: 'text' | 'secret' | 'email' | 'path';
|
|
110
|
+
placeholder?: string | null;
|
|
111
|
+
};
|
|
112
|
+
type LoginFlowSpec = {
|
|
113
|
+
kind: string;
|
|
114
|
+
display_name: string;
|
|
115
|
+
description: string;
|
|
116
|
+
requires_inputs: InputSpec[];
|
|
117
|
+
};
|
|
118
|
+
type PlanOption = {
|
|
119
|
+
id: string;
|
|
120
|
+
label: string;
|
|
121
|
+
description: string;
|
|
122
|
+
};
|
|
123
|
+
type BackendMetadata = {
|
|
124
|
+
kind: string;
|
|
125
|
+
display_name: string;
|
|
126
|
+
icon_url: string | null;
|
|
127
|
+
install_check: InstallCheck;
|
|
128
|
+
login_flows: LoginFlowSpec[];
|
|
129
|
+
plan_options: PlanOption[] | null;
|
|
130
|
+
config_schema: Record<string, unknown>;
|
|
131
|
+
supports_multi_account: boolean;
|
|
132
|
+
isolation_env_var: string | null;
|
|
133
|
+
};
|
|
134
|
+
|
|
135
|
+
/**
|
|
136
|
+
* Types for backend CLI install + CLIProxyAPI install/login flows.
|
|
137
|
+
*
|
|
138
|
+
* Mirror of Python models in `ai_accounts.core.cli_install` /
|
|
139
|
+
* `ai_accounts.core.cliproxy_manager` and the Litestar route responses.
|
|
140
|
+
*/
|
|
141
|
+
type InstallResult = {
|
|
142
|
+
kind: string;
|
|
143
|
+
success: boolean;
|
|
144
|
+
display: string;
|
|
145
|
+
stdout: string;
|
|
146
|
+
stderr: string;
|
|
147
|
+
exit_code: number;
|
|
148
|
+
binary_path: string | null;
|
|
149
|
+
};
|
|
150
|
+
type CliproxyStatus = {
|
|
151
|
+
installed: boolean;
|
|
152
|
+
version: string | null;
|
|
153
|
+
binary_path: string | null;
|
|
154
|
+
};
|
|
155
|
+
type CliproxyInstallResult = {
|
|
156
|
+
success: boolean;
|
|
157
|
+
display: string;
|
|
158
|
+
stdout: string;
|
|
159
|
+
stderr: string;
|
|
160
|
+
binary_path: string | null;
|
|
161
|
+
};
|
|
162
|
+
type CliproxyLoginBeginResponse = {
|
|
163
|
+
status: 'started' | 'imported' | 'skipped' | 'error';
|
|
164
|
+
message: string;
|
|
165
|
+
oauth_url?: string | null;
|
|
166
|
+
device_code?: string | null;
|
|
167
|
+
};
|
|
168
|
+
type CliproxyCallbackForwardResponse = {
|
|
169
|
+
status: 'completed' | 'error';
|
|
170
|
+
message: string;
|
|
171
|
+
};
|
|
172
|
+
|
|
64
173
|
/**
|
|
65
174
|
* This file was auto-generated by openapi-typescript.
|
|
66
175
|
* Do not make direct changes to the file.
|
|
@@ -1074,6 +1183,15 @@ declare class AiAccountsClient {
|
|
|
1074
1183
|
loginBackend(id: string, flowKind: string, inputs: Record<string, string>): Promise<LoginResponseDTO>;
|
|
1075
1184
|
pollBackendLogin(id: string, handle: string): Promise<LoginResponseDTO>;
|
|
1076
1185
|
validateBackend(id: string): Promise<BackendDTO>;
|
|
1186
|
+
beginLogin(accountId: string, flowKind: LoginFlowKind, inputs: Record<string, string>): Promise<{
|
|
1187
|
+
session_id: string;
|
|
1188
|
+
}>;
|
|
1189
|
+
respondLogin(accountId: string, sessionId: string, promptId: string, answer: string): Promise<void>;
|
|
1190
|
+
cancelLogin(accountId: string, sessionId: string): Promise<void>;
|
|
1191
|
+
streamLogin(accountId: string, sessionId: string): AsyncIterable<LoginEvent>;
|
|
1192
|
+
getBackendMetadata(): Promise<{
|
|
1193
|
+
items: BackendMetadata[];
|
|
1194
|
+
}>;
|
|
1077
1195
|
startOnboarding(): Promise<OnboardingStateDTO>;
|
|
1078
1196
|
getOnboarding(id: string): Promise<OnboardingStateDTO>;
|
|
1079
1197
|
detectForOnboarding(id: string): Promise<DetectResultsDTO>;
|
|
@@ -1081,10 +1199,55 @@ declare class AiAccountsClient {
|
|
|
1081
1199
|
beginOnboardingLogin(id: string, flowKind: string, inputs: Record<string, string>): Promise<LoginResponseDTO>;
|
|
1082
1200
|
pollOnboardingLogin(id: string, handle: string): Promise<LoginResponseDTO>;
|
|
1083
1201
|
finalizeOnboarding(id: string): Promise<OnboardingStateDTO>;
|
|
1202
|
+
installBackendCli(kind: string): Promise<InstallResult>;
|
|
1203
|
+
cliproxyStatus(): Promise<CliproxyStatus>;
|
|
1204
|
+
cliproxyInstall(): Promise<CliproxyInstallResult>;
|
|
1205
|
+
cliproxyLoginBegin(backendKind: string, configDir?: string): Promise<CliproxyLoginBeginResponse>;
|
|
1206
|
+
cliproxyCallbackForward(callbackUrl: string): Promise<CliproxyCallbackForwardResponse>;
|
|
1084
1207
|
private postAction;
|
|
1085
1208
|
private onboardingAction;
|
|
1086
1209
|
}
|
|
1087
1210
|
|
|
1211
|
+
type AiAccountsEvent = {
|
|
1212
|
+
type: 'wizard.opened';
|
|
1213
|
+
backendKind: string;
|
|
1214
|
+
} | {
|
|
1215
|
+
type: 'wizard.step';
|
|
1216
|
+
backendKind: string;
|
|
1217
|
+
step: string;
|
|
1218
|
+
} | {
|
|
1219
|
+
type: 'wizard.account.created';
|
|
1220
|
+
backendKind: string;
|
|
1221
|
+
accountId: string;
|
|
1222
|
+
} | {
|
|
1223
|
+
type: 'wizard.closed';
|
|
1224
|
+
backendKind: string;
|
|
1225
|
+
reason: 'done' | 'skip' | 'cancel';
|
|
1226
|
+
} | {
|
|
1227
|
+
type: 'login.started';
|
|
1228
|
+
sessionId: string;
|
|
1229
|
+
backendKind: string;
|
|
1230
|
+
flow: string;
|
|
1231
|
+
} | {
|
|
1232
|
+
type: 'login.prompt';
|
|
1233
|
+
sessionId: string;
|
|
1234
|
+
promptKind: 'url' | 'text';
|
|
1235
|
+
} | {
|
|
1236
|
+
type: 'login.completed';
|
|
1237
|
+
sessionId: string;
|
|
1238
|
+
accountId: string;
|
|
1239
|
+
} | {
|
|
1240
|
+
type: 'login.failed';
|
|
1241
|
+
sessionId: string;
|
|
1242
|
+
code: string;
|
|
1243
|
+
message: string;
|
|
1244
|
+
} | {
|
|
1245
|
+
type: 'internal.handler_error';
|
|
1246
|
+
error: string;
|
|
1247
|
+
original: AiAccountsEvent;
|
|
1248
|
+
};
|
|
1249
|
+
type AiAccountsEventHandler = (event: AiAccountsEvent) => void;
|
|
1250
|
+
|
|
1088
1251
|
type WizardState = 'idle' | 'picking_kind' | 'detecting' | 'entering_credential' | 'validating' | 'done' | 'error';
|
|
1089
1252
|
interface AccountWizard {
|
|
1090
1253
|
readonly state: WizardState;
|
|
@@ -1134,4 +1297,4 @@ declare function createOnboardingFlow(opts: CreateOnboardingFlowOptions): Onboar
|
|
|
1134
1297
|
|
|
1135
1298
|
declare const version = "0.0.0";
|
|
1136
1299
|
|
|
1137
|
-
export { type AccountWizard, type paths as AiAccountsApiPaths, AiAccountsClient, type ApiError, type BackendDTO, type ChatDoneEvent, type ChatTokenEvent, type ChatToolCallEvent, type ClientOptions, type CreateAccountWizardOptions, type CreateOnboardingFlowOptions, type DetectResultDTO, type DetectResultsDTO, type ErrorEvent, type LoginResponseDTO, type OAuthDeviceLoginDTO, type OnboardingFlowMachine, type OnboardingMachineState, type OnboardingStateDTO, type PtyExitEvent, type PtyOutputEvent, type PtyResizeEvent, type SessionEndEvent, type SessionStartEvent, WIRE_PROTOCOL_VERSION, type WireEvent, type WizardState, createAccountWizard, createOnboardingFlow, version };
|
|
1300
|
+
export { type AccountWizard, type paths as AiAccountsApiPaths, AiAccountsClient, type AiAccountsEvent, type AiAccountsEventHandler, type ApiError, type BackendDTO, type BackendMetadata, type ChatDoneEvent, type ChatTokenEvent, type ChatToolCallEvent, type ClientOptions, type CliproxyCallbackForwardResponse, type CliproxyInstallResult, type CliproxyLoginBeginResponse, type CliproxyStatus, type CreateAccountWizardOptions, type CreateOnboardingFlowOptions, type DetectResultDTO, type DetectResultsDTO, type ErrorEvent, type InputSpec, type InstallCheck, type InstallResult, type LoginComplete, type LoginEvent, type LoginFailed, type LoginFlowKind, type LoginFlowSpec, type LoginResponseDTO, type OAuthDeviceLoginDTO, type OnboardingFlowMachine, type OnboardingMachineState, type OnboardingStateDTO, type PlanOption, type ProgressUpdate, type PromptAnswer, type PtyExitEvent, type PtyOutputEvent, type PtyResizeEvent, type SessionEndEvent, type SessionStartEvent, type StdoutChunk, type TextPrompt, type UrlPrompt, WIRE_PROTOCOL_VERSION, type WireEvent, type WizardState, createAccountWizard, createOnboardingFlow, version };
|
package/dist/index.js
CHANGED
|
@@ -1,6 +1,36 @@
|
|
|
1
1
|
// src/protocol/wire.ts
|
|
2
2
|
var WIRE_PROTOCOL_VERSION = 1;
|
|
3
3
|
|
|
4
|
+
// src/client/login-stream.ts
|
|
5
|
+
async function* parseSseLoginEvents(response) {
|
|
6
|
+
if (!response.body) return;
|
|
7
|
+
const reader = response.body.getReader();
|
|
8
|
+
const decoder = new TextDecoder();
|
|
9
|
+
let buffer = "";
|
|
10
|
+
try {
|
|
11
|
+
while (true) {
|
|
12
|
+
const { value, done } = await reader.read();
|
|
13
|
+
if (done) break;
|
|
14
|
+
buffer += decoder.decode(value, { stream: true });
|
|
15
|
+
while (true) {
|
|
16
|
+
const sep = buffer.indexOf("\n\n");
|
|
17
|
+
if (sep === -1) break;
|
|
18
|
+
const frame = buffer.slice(0, sep);
|
|
19
|
+
buffer = buffer.slice(sep + 2);
|
|
20
|
+
const dataLine = frame.split("\n").find((l) => l.startsWith("data: "));
|
|
21
|
+
if (!dataLine) continue;
|
|
22
|
+
const payload = dataLine.slice(6);
|
|
23
|
+
try {
|
|
24
|
+
yield JSON.parse(payload);
|
|
25
|
+
} catch {
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
} finally {
|
|
30
|
+
reader.releaseLock();
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
|
|
4
34
|
// src/client/index.ts
|
|
5
35
|
async function toError(r) {
|
|
6
36
|
let code = "http_error";
|
|
@@ -100,6 +130,55 @@ var AiAccountsClient = class {
|
|
|
100
130
|
async validateBackend(id) {
|
|
101
131
|
return this.postAction(id, "validate");
|
|
102
132
|
}
|
|
133
|
+
async beginLogin(accountId, flowKind, inputs) {
|
|
134
|
+
const r = await this._fetch(
|
|
135
|
+
`${this.baseUrl}/api/v1/backends/${encodeURIComponent(accountId)}/login/begin`,
|
|
136
|
+
{
|
|
137
|
+
method: "POST",
|
|
138
|
+
headers: this.headers(),
|
|
139
|
+
body: JSON.stringify({ flow_kind: flowKind, inputs })
|
|
140
|
+
}
|
|
141
|
+
);
|
|
142
|
+
if (!r.ok) throw await toError(r);
|
|
143
|
+
return await r.json();
|
|
144
|
+
}
|
|
145
|
+
async respondLogin(accountId, sessionId, promptId, answer) {
|
|
146
|
+
const r = await this._fetch(
|
|
147
|
+
`${this.baseUrl}/api/v1/backends/${encodeURIComponent(accountId)}/login/respond`,
|
|
148
|
+
{
|
|
149
|
+
method: "POST",
|
|
150
|
+
headers: this.headers(),
|
|
151
|
+
body: JSON.stringify({ session_id: sessionId, prompt_id: promptId, answer })
|
|
152
|
+
}
|
|
153
|
+
);
|
|
154
|
+
if (!r.ok) throw await toError(r);
|
|
155
|
+
}
|
|
156
|
+
async cancelLogin(accountId, sessionId) {
|
|
157
|
+
const r = await this._fetch(
|
|
158
|
+
`${this.baseUrl}/api/v1/backends/${encodeURIComponent(accountId)}/login/cancel`,
|
|
159
|
+
{
|
|
160
|
+
method: "POST",
|
|
161
|
+
headers: this.headers(),
|
|
162
|
+
body: JSON.stringify({ session_id: sessionId })
|
|
163
|
+
}
|
|
164
|
+
);
|
|
165
|
+
if (!r.ok) throw await toError(r);
|
|
166
|
+
}
|
|
167
|
+
async *streamLogin(accountId, sessionId) {
|
|
168
|
+
const url = `${this.baseUrl}/api/v1/backends/${encodeURIComponent(accountId)}/login/stream?session_id=${encodeURIComponent(sessionId)}`;
|
|
169
|
+
const headers = { Accept: "text/event-stream" };
|
|
170
|
+
if (this.token) headers["authorization"] = `Bearer ${this.token}`;
|
|
171
|
+
const r = await this._fetch(url, { method: "GET", headers });
|
|
172
|
+
if (!r.ok) throw await toError(r);
|
|
173
|
+
yield* parseSseLoginEvents(r);
|
|
174
|
+
}
|
|
175
|
+
async getBackendMetadata() {
|
|
176
|
+
const r = await this._fetch(`${this.baseUrl}/api/v1/backends/_meta`, {
|
|
177
|
+
headers: this.headers()
|
|
178
|
+
});
|
|
179
|
+
if (!r.ok) throw await toError(r);
|
|
180
|
+
return await r.json();
|
|
181
|
+
}
|
|
103
182
|
async startOnboarding() {
|
|
104
183
|
const r = await this._fetch(`${this.baseUrl}/api/v1/onboarding`, {
|
|
105
184
|
method: "POST",
|
|
@@ -137,6 +216,56 @@ var AiAccountsClient = class {
|
|
|
137
216
|
async finalizeOnboarding(id) {
|
|
138
217
|
return this.onboardingAction(id, "finalize");
|
|
139
218
|
}
|
|
219
|
+
// --- Backend CLI install ---
|
|
220
|
+
async installBackendCli(kind) {
|
|
221
|
+
const r = await this._fetch(
|
|
222
|
+
`${this.baseUrl}/api/v1/backends/${encodeURIComponent(kind)}/install`,
|
|
223
|
+
{
|
|
224
|
+
method: "POST",
|
|
225
|
+
headers: this.headers()
|
|
226
|
+
}
|
|
227
|
+
);
|
|
228
|
+
if (!r.ok) throw await toError(r);
|
|
229
|
+
return await r.json();
|
|
230
|
+
}
|
|
231
|
+
// --- CLIProxyAPI ---
|
|
232
|
+
async cliproxyStatus() {
|
|
233
|
+
const r = await this._fetch(`${this.baseUrl}/api/v1/cliproxy/status`, {
|
|
234
|
+
method: "GET",
|
|
235
|
+
headers: this.headers()
|
|
236
|
+
});
|
|
237
|
+
if (!r.ok) throw await toError(r);
|
|
238
|
+
return await r.json();
|
|
239
|
+
}
|
|
240
|
+
async cliproxyInstall() {
|
|
241
|
+
const r = await this._fetch(`${this.baseUrl}/api/v1/cliproxy/install`, {
|
|
242
|
+
method: "POST",
|
|
243
|
+
headers: this.headers()
|
|
244
|
+
});
|
|
245
|
+
if (!r.ok) throw await toError(r);
|
|
246
|
+
return await r.json();
|
|
247
|
+
}
|
|
248
|
+
async cliproxyLoginBegin(backendKind, configDir) {
|
|
249
|
+
const r = await this._fetch(`${this.baseUrl}/api/v1/cliproxy/login/begin`, {
|
|
250
|
+
method: "POST",
|
|
251
|
+
headers: this.headers(),
|
|
252
|
+
body: JSON.stringify({ backend_kind: backendKind, config_dir: configDir ?? null })
|
|
253
|
+
});
|
|
254
|
+
if (!r.ok) throw await toError(r);
|
|
255
|
+
return await r.json();
|
|
256
|
+
}
|
|
257
|
+
async cliproxyCallbackForward(callbackUrl) {
|
|
258
|
+
const r = await this._fetch(
|
|
259
|
+
`${this.baseUrl}/api/v1/cliproxy/login/callback-forward`,
|
|
260
|
+
{
|
|
261
|
+
method: "POST",
|
|
262
|
+
headers: this.headers(),
|
|
263
|
+
body: JSON.stringify({ callback_url: callbackUrl })
|
|
264
|
+
}
|
|
265
|
+
);
|
|
266
|
+
if (!r.ok) throw await toError(r);
|
|
267
|
+
return await r.json();
|
|
268
|
+
}
|
|
140
269
|
async postAction(id, action, body) {
|
|
141
270
|
const r = await this._fetch(
|
|
142
271
|
`${this.baseUrl}/api/v1/backends/${encodeURIComponent(id)}/${action}`,
|