@beacon-build/sdk 1.15.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/CHANGELOG.md +36 -0
- package/LICENSE +21 -0
- package/dist/cli/backlog.d.ts +14 -0
- package/dist/cli/backlog.d.ts.map +1 -0
- package/dist/cli/backlog.js +228 -0
- package/dist/cli/backlog.js.map +1 -0
- package/dist/cli/claude-md-check.d.ts +18 -0
- package/dist/cli/claude-md-check.d.ts.map +1 -0
- package/dist/cli/claude-md-check.js +57 -0
- package/dist/cli/claude-md-check.js.map +1 -0
- package/dist/cli/context.d.ts +14 -0
- package/dist/cli/context.d.ts.map +1 -0
- package/dist/cli/context.js +465 -0
- package/dist/cli/context.js.map +1 -0
- package/dist/cli/help.d.ts +17 -0
- package/dist/cli/help.d.ts.map +1 -0
- package/dist/cli/help.js +71 -0
- package/dist/cli/help.js.map +1 -0
- package/dist/cli/index.d.ts +22 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +212 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/project-log.d.ts +16 -0
- package/dist/cli/project-log.d.ts.map +1 -0
- package/dist/cli/project-log.js +185 -0
- package/dist/cli/project-log.js.map +1 -0
- package/dist/cli/setup-worktree.d.ts +23 -0
- package/dist/cli/setup-worktree.d.ts.map +1 -0
- package/dist/cli/setup-worktree.js +396 -0
- package/dist/cli/setup-worktree.js.map +1 -0
- package/dist/cli/update-client.d.ts +14 -0
- package/dist/cli/update-client.d.ts.map +1 -0
- package/dist/cli/update-client.js +629 -0
- package/dist/cli/update-client.js.map +1 -0
- package/dist/cli/workflow-sync.d.ts +19 -0
- package/dist/cli/workflow-sync.d.ts.map +1 -0
- package/dist/cli/workflow-sync.js +133 -0
- package/dist/cli/workflow-sync.js.map +1 -0
- package/dist/clients/admin/agents.client.d.ts +38 -0
- package/dist/clients/admin/agents.client.d.ts.map +1 -0
- package/dist/clients/admin/agents.client.js +90 -0
- package/dist/clients/admin/agents.client.js.map +1 -0
- package/dist/clients/admin/alerts.client.d.ts +8 -0
- package/dist/clients/admin/alerts.client.d.ts.map +1 -0
- package/dist/clients/admin/alerts.client.js +11 -0
- package/dist/clients/admin/alerts.client.js.map +1 -0
- package/dist/clients/admin/assets.client.d.ts +19 -0
- package/dist/clients/admin/assets.client.d.ts.map +1 -0
- package/dist/clients/admin/assets.client.js +27 -0
- package/dist/clients/admin/assets.client.js.map +1 -0
- package/dist/clients/admin/board-messages.client.d.ts +13 -0
- package/dist/clients/admin/board-messages.client.d.ts.map +1 -0
- package/dist/clients/admin/board-messages.client.js +16 -0
- package/dist/clients/admin/board-messages.client.js.map +1 -0
- package/dist/clients/admin/conversation-messages.client.d.ts +11 -0
- package/dist/clients/admin/conversation-messages.client.d.ts.map +1 -0
- package/dist/clients/admin/conversation-messages.client.js +27 -0
- package/dist/clients/admin/conversation-messages.client.js.map +1 -0
- package/dist/clients/admin/db.client.d.ts +12 -0
- package/dist/clients/admin/db.client.d.ts.map +1 -0
- package/dist/clients/admin/db.client.js +13 -0
- package/dist/clients/admin/db.client.js.map +1 -0
- package/dist/clients/admin/documents.client.d.ts +23 -0
- package/dist/clients/admin/documents.client.d.ts.map +1 -0
- package/dist/clients/admin/documents.client.js +33 -0
- package/dist/clients/admin/documents.client.js.map +1 -0
- package/dist/clients/admin/github-proxy.client.d.ts +12 -0
- package/dist/clients/admin/github-proxy.client.d.ts.map +1 -0
- package/dist/clients/admin/github-proxy.client.js +10 -0
- package/dist/clients/admin/github-proxy.client.js.map +1 -0
- package/dist/clients/admin/memories.client.d.ts +25 -0
- package/dist/clients/admin/memories.client.d.ts.map +1 -0
- package/dist/clients/admin/memories.client.js +67 -0
- package/dist/clients/admin/memories.client.js.map +1 -0
- package/dist/clients/admin/organizations.client.d.ts +25 -0
- package/dist/clients/admin/organizations.client.d.ts.map +1 -0
- package/dist/clients/admin/organizations.client.js +33 -0
- package/dist/clients/admin/organizations.client.js.map +1 -0
- package/dist/clients/admin/planning.client.d.ts +16 -0
- package/dist/clients/admin/planning.client.d.ts.map +1 -0
- package/dist/clients/admin/planning.client.js +24 -0
- package/dist/clients/admin/planning.client.js.map +1 -0
- package/dist/clients/admin/projects.client.d.ts +10 -0
- package/dist/clients/admin/projects.client.d.ts.map +1 -0
- package/dist/clients/admin/projects.client.js +21 -0
- package/dist/clients/admin/projects.client.js.map +1 -0
- package/dist/clients/admin/sessions.client.d.ts +23 -0
- package/dist/clients/admin/sessions.client.d.ts.map +1 -0
- package/dist/clients/admin/sessions.client.js +53 -0
- package/dist/clients/admin/sessions.client.js.map +1 -0
- package/dist/clients/admin/tasks.client.d.ts +21 -0
- package/dist/clients/admin/tasks.client.d.ts.map +1 -0
- package/dist/clients/admin/tasks.client.js +44 -0
- package/dist/clients/admin/tasks.client.js.map +1 -0
- package/dist/clients/admin/tool-calls.client.d.ts +12 -0
- package/dist/clients/admin/tool-calls.client.d.ts.map +1 -0
- package/dist/clients/admin/tool-calls.client.js +29 -0
- package/dist/clients/admin/tool-calls.client.js.map +1 -0
- package/dist/clients/admin/usage.client.d.ts +23 -0
- package/dist/clients/admin/usage.client.d.ts.map +1 -0
- package/dist/clients/admin/usage.client.js +37 -0
- package/dist/clients/admin/usage.client.js.map +1 -0
- package/dist/clients/admin/users.client.d.ts +17 -0
- package/dist/clients/admin/users.client.d.ts.map +1 -0
- package/dist/clients/admin/users.client.js +24 -0
- package/dist/clients/admin/users.client.js.map +1 -0
- package/dist/clients/agent/messaging.client.d.ts +13 -0
- package/dist/clients/agent/messaging.client.d.ts.map +1 -0
- package/dist/clients/agent/messaging.client.js +37 -0
- package/dist/clients/agent/messaging.client.js.map +1 -0
- package/dist/clients/agent/tasks.client.d.ts +18 -0
- package/dist/clients/agent/tasks.client.d.ts.map +1 -0
- package/dist/clients/agent/tasks.client.js +68 -0
- package/dist/clients/agent/tasks.client.js.map +1 -0
- package/dist/clients/auth.client.d.ts +40 -0
- package/dist/clients/auth.client.d.ts.map +1 -0
- package/dist/clients/auth.client.js +78 -0
- package/dist/clients/auth.client.js.map +1 -0
- package/dist/clients/ops/agents-ops.client.d.ts +46 -0
- package/dist/clients/ops/agents-ops.client.d.ts.map +1 -0
- package/dist/clients/ops/agents-ops.client.js +117 -0
- package/dist/clients/ops/agents-ops.client.js.map +1 -0
- package/dist/clients/ops/board-messages-ops.client.d.ts +14 -0
- package/dist/clients/ops/board-messages-ops.client.d.ts.map +1 -0
- package/dist/clients/ops/board-messages-ops.client.js +26 -0
- package/dist/clients/ops/board-messages-ops.client.js.map +1 -0
- package/dist/clients/ops/conversation-messages-ops.client.d.ts +10 -0
- package/dist/clients/ops/conversation-messages-ops.client.d.ts.map +1 -0
- package/dist/clients/ops/conversation-messages-ops.client.js +20 -0
- package/dist/clients/ops/conversation-messages-ops.client.js.map +1 -0
- package/dist/clients/ops/documents-ops.client.d.ts +20 -0
- package/dist/clients/ops/documents-ops.client.d.ts.map +1 -0
- package/dist/clients/ops/documents-ops.client.js +31 -0
- package/dist/clients/ops/documents-ops.client.js.map +1 -0
- package/dist/clients/ops/memories-ops.client.d.ts +25 -0
- package/dist/clients/ops/memories-ops.client.d.ts.map +1 -0
- package/dist/clients/ops/memories-ops.client.js +71 -0
- package/dist/clients/ops/memories-ops.client.js.map +1 -0
- package/dist/clients/ops/ops-db.client.d.ts +29 -0
- package/dist/clients/ops/ops-db.client.d.ts.map +1 -0
- package/dist/clients/ops/ops-db.client.js +35 -0
- package/dist/clients/ops/ops-db.client.js.map +1 -0
- package/dist/clients/ops/ops-logs.client.d.ts +22 -0
- package/dist/clients/ops/ops-logs.client.d.ts.map +1 -0
- package/dist/clients/ops/ops-logs.client.js +24 -0
- package/dist/clients/ops/ops-logs.client.js.map +1 -0
- package/dist/clients/ops/ops-mq.client.d.ts +19 -0
- package/dist/clients/ops/ops-mq.client.d.ts.map +1 -0
- package/dist/clients/ops/ops-mq.client.js +16 -0
- package/dist/clients/ops/ops-mq.client.js.map +1 -0
- package/dist/clients/ops/ops-northflank.client.d.ts +34 -0
- package/dist/clients/ops/ops-northflank.client.d.ts.map +1 -0
- package/dist/clients/ops/ops-northflank.client.js +42 -0
- package/dist/clients/ops/ops-northflank.client.js.map +1 -0
- package/dist/clients/ops/ops-storage.client.d.ts +34 -0
- package/dist/clients/ops/ops-storage.client.d.ts.map +1 -0
- package/dist/clients/ops/ops-storage.client.js +39 -0
- package/dist/clients/ops/ops-storage.client.js.map +1 -0
- package/dist/clients/ops/projects-ops.client.d.ts +20 -0
- package/dist/clients/ops/projects-ops.client.d.ts.map +1 -0
- package/dist/clients/ops/projects-ops.client.js +18 -0
- package/dist/clients/ops/projects-ops.client.js.map +1 -0
- package/dist/clients/ops/realtime-ops.client.d.ts +14 -0
- package/dist/clients/ops/realtime-ops.client.d.ts.map +1 -0
- package/dist/clients/ops/realtime-ops.client.js +10 -0
- package/dist/clients/ops/realtime-ops.client.js.map +1 -0
- package/dist/clients/ops/sessions-ops.client.d.ts +29 -0
- package/dist/clients/ops/sessions-ops.client.d.ts.map +1 -0
- package/dist/clients/ops/sessions-ops.client.js +69 -0
- package/dist/clients/ops/sessions-ops.client.js.map +1 -0
- package/dist/clients/ops/tasks-ops.client.d.ts +18 -0
- package/dist/clients/ops/tasks-ops.client.d.ts.map +1 -0
- package/dist/clients/ops/tasks-ops.client.js +37 -0
- package/dist/clients/ops/tasks-ops.client.js.map +1 -0
- package/dist/clients/ops/tool-calls-ops.client.d.ts +12 -0
- package/dist/clients/ops/tool-calls-ops.client.d.ts.map +1 -0
- package/dist/clients/ops/tool-calls-ops.client.js +29 -0
- package/dist/clients/ops/tool-calls-ops.client.js.map +1 -0
- package/dist/clients/ops/usage-workflows-ops.client.d.ts +22 -0
- package/dist/clients/ops/usage-workflows-ops.client.d.ts.map +1 -0
- package/dist/clients/ops/usage-workflows-ops.client.js +23 -0
- package/dist/clients/ops/usage-workflows-ops.client.js.map +1 -0
- package/dist/factory/admin-sdk.d.ts +53 -0
- package/dist/factory/admin-sdk.d.ts.map +1 -0
- package/dist/factory/admin-sdk.js +59 -0
- package/dist/factory/admin-sdk.js.map +1 -0
- package/dist/factory/agent-sdk.d.ts +22 -0
- package/dist/factory/agent-sdk.d.ts.map +1 -0
- package/dist/factory/agent-sdk.js +22 -0
- package/dist/factory/agent-sdk.js.map +1 -0
- package/dist/factory/ops-sdk.d.ts +53 -0
- package/dist/factory/ops-sdk.d.ts.map +1 -0
- package/dist/factory/ops-sdk.js +56 -0
- package/dist/factory/ops-sdk.js.map +1 -0
- package/dist/index.d.ts +37 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +45 -0
- package/dist/index.js.map +1 -0
- package/dist/legacy/sdk-factory.d.ts +34 -0
- package/dist/legacy/sdk-factory.d.ts.map +1 -0
- package/dist/legacy/sdk-factory.js +34 -0
- package/dist/legacy/sdk-factory.js.map +1 -0
- package/dist/lib/context.d.ts +69 -0
- package/dist/lib/context.d.ts.map +1 -0
- package/dist/lib/context.js +225 -0
- package/dist/lib/context.js.map +1 -0
- package/dist/lib/db.d.ts +16 -0
- package/dist/lib/db.d.ts.map +1 -0
- package/dist/lib/db.js +50 -0
- package/dist/lib/db.js.map +1 -0
- package/dist/lib/logger.d.ts +14 -0
- package/dist/lib/logger.d.ts.map +1 -0
- package/dist/lib/logger.js +14 -0
- package/dist/lib/logger.js.map +1 -0
- package/dist/lib/opencode.d.ts +33 -0
- package/dist/lib/opencode.d.ts.map +1 -0
- package/dist/lib/opencode.js +101 -0
- package/dist/lib/opencode.js.map +1 -0
- package/dist/lib/utils.d.ts +18 -0
- package/dist/lib/utils.d.ts.map +1 -0
- package/dist/lib/utils.js +40 -0
- package/dist/lib/utils.js.map +1 -0
- package/dist/manifest.d.ts +26 -0
- package/dist/manifest.d.ts.map +1 -0
- package/dist/manifest.js +700 -0
- package/dist/manifest.js.map +1 -0
- package/dist/realtime/realtime.client.d.ts +76 -0
- package/dist/realtime/realtime.client.d.ts.map +1 -0
- package/dist/realtime/realtime.client.js +168 -0
- package/dist/realtime/realtime.client.js.map +1 -0
- package/dist/transport/binary-client.d.ts +23 -0
- package/dist/transport/binary-client.d.ts.map +1 -0
- package/dist/transport/binary-client.js +69 -0
- package/dist/transport/binary-client.js.map +1 -0
- package/dist/transport/errors.d.ts +14 -0
- package/dist/transport/errors.d.ts.map +1 -0
- package/dist/transport/errors.js +57 -0
- package/dist/transport/errors.js.map +1 -0
- package/dist/transport/http-client.d.ts +23 -0
- package/dist/transport/http-client.d.ts.map +1 -0
- package/dist/transport/http-client.js +88 -0
- package/dist/transport/http-client.js.map +1 -0
- package/dist/transport/multipart-client.d.ts +25 -0
- package/dist/transport/multipart-client.d.ts.map +1 -0
- package/dist/transport/multipart-client.js +87 -0
- package/dist/transport/multipart-client.js.map +1 -0
- package/dist/transport/ops-api-client.d.ts +39 -0
- package/dist/transport/ops-api-client.d.ts.map +1 -0
- package/dist/transport/ops-api-client.js +153 -0
- package/dist/transport/ops-api-client.js.map +1 -0
- package/dist/transport/sse-client.d.ts +33 -0
- package/dist/transport/sse-client.d.ts.map +1 -0
- package/dist/transport/sse-client.js +127 -0
- package/dist/transport/sse-client.js.map +1 -0
- package/package.json +32 -0
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import { SdkError, statusToSdkCode } from './errors.js';
|
|
2
|
+
/**
|
|
3
|
+
* MultipartClient — Multipart/form-data upload transport.
|
|
4
|
+
* Used for asset uploads, avatar uploads, and storage uploads.
|
|
5
|
+
* INV-14: multipart-specific transport layer.
|
|
6
|
+
*/
|
|
7
|
+
export class MultipartClient {
|
|
8
|
+
config;
|
|
9
|
+
constructor(config) {
|
|
10
|
+
this.config = config;
|
|
11
|
+
}
|
|
12
|
+
async upload(path, options) {
|
|
13
|
+
let authHeader;
|
|
14
|
+
try {
|
|
15
|
+
authHeader = await this.config.getAuthHeader();
|
|
16
|
+
}
|
|
17
|
+
catch {
|
|
18
|
+
throw new SdkError('unauthorized', 'Failed to retrieve access token');
|
|
19
|
+
}
|
|
20
|
+
const basePath = this.config.basePath ?? '/api/v1';
|
|
21
|
+
const url = `${this.config.baseUrl}${basePath}${path}`;
|
|
22
|
+
const form = new FormData();
|
|
23
|
+
if (options.additionalFields) {
|
|
24
|
+
for (const [key, value] of Object.entries(options.additionalFields)) {
|
|
25
|
+
form.append(key, value);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
if (options.file instanceof Blob || options.file instanceof File) {
|
|
29
|
+
const filename = options.file instanceof File ? options.file.name : 'upload';
|
|
30
|
+
form.append('file', options.file, filename);
|
|
31
|
+
}
|
|
32
|
+
else {
|
|
33
|
+
// ReadableStream — buffer into Blob before sending.
|
|
34
|
+
// Note: this buffers the full stream in memory. For large files,
|
|
35
|
+
// prefer passing a Blob/File directly (INV-15: streaming deferred to phase 2).
|
|
36
|
+
const reader = options.file.stream.getReader();
|
|
37
|
+
const chunks = [];
|
|
38
|
+
let done = false;
|
|
39
|
+
while (!done) {
|
|
40
|
+
const result = await reader.read();
|
|
41
|
+
done = result.done;
|
|
42
|
+
if (result.value) {
|
|
43
|
+
// Copy the view's own bytes only — avoid aliasing issues with
|
|
44
|
+
// shared ArrayBuffer (e.g. when byteOffset > 0).
|
|
45
|
+
chunks.push(result.value.slice().buffer);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
const blob = new Blob(chunks, { type: options.file.contentType });
|
|
49
|
+
form.append('file', blob, options.file.filename);
|
|
50
|
+
}
|
|
51
|
+
let res;
|
|
52
|
+
try {
|
|
53
|
+
res = await fetch(url, {
|
|
54
|
+
method: 'POST',
|
|
55
|
+
headers: { Authorization: authHeader },
|
|
56
|
+
body: form,
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
catch (err) {
|
|
60
|
+
throw new SdkError('network_error', err instanceof Error ? err.message : 'Network request failed');
|
|
61
|
+
}
|
|
62
|
+
if (res.status === 401) {
|
|
63
|
+
this.config.onUnauthorized?.();
|
|
64
|
+
throw new SdkError('unauthorized', 'Unauthorized', 401);
|
|
65
|
+
}
|
|
66
|
+
if (!res.ok) {
|
|
67
|
+
const code = statusToSdkCode(res.status);
|
|
68
|
+
let message = `HTTP ${res.status}`;
|
|
69
|
+
try {
|
|
70
|
+
const body = await res.json();
|
|
71
|
+
if (body?.error?.message)
|
|
72
|
+
message = body.error.message;
|
|
73
|
+
else if (typeof body?.error === 'string')
|
|
74
|
+
message = body.error;
|
|
75
|
+
}
|
|
76
|
+
catch {
|
|
77
|
+
// ignore
|
|
78
|
+
}
|
|
79
|
+
throw new SdkError(code, message, res.status);
|
|
80
|
+
}
|
|
81
|
+
if (res.status === 204)
|
|
82
|
+
return undefined;
|
|
83
|
+
const body = await res.json();
|
|
84
|
+
return (body?.data !== undefined ? body.data : body);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
//# sourceMappingURL=multipart-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"multipart-client.js","sourceRoot":"","sources":["../../src/transport/multipart-client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OpsApiClient — HTTP client for beacon API /api/v1/* endpoints.
|
|
3
|
+
*
|
|
4
|
+
* Uses OPS_API_KEY Bearer auth (vendor role, C80 bypass).
|
|
5
|
+
* Supports retry with exponential backoff for transient errors (INV-5).
|
|
6
|
+
* Logs errors with request context (INV-4).
|
|
7
|
+
*
|
|
8
|
+
* F217: Used by MCP, Sidecar, Janitor, Runtime to replace direct Prisma access.
|
|
9
|
+
*/
|
|
10
|
+
export interface OpsApiClientConfig {
|
|
11
|
+
baseUrl: string;
|
|
12
|
+
apiKey: string;
|
|
13
|
+
/** Max retry attempts for 5xx/network errors (default: 3) */
|
|
14
|
+
retries?: number;
|
|
15
|
+
/** Base delay ms for exponential backoff (default: 100) */
|
|
16
|
+
retryBaseMs?: number;
|
|
17
|
+
}
|
|
18
|
+
export declare class OpsApiClient {
|
|
19
|
+
private readonly baseUrl;
|
|
20
|
+
private readonly apiKey;
|
|
21
|
+
private readonly retries;
|
|
22
|
+
private readonly retryBaseMs;
|
|
23
|
+
constructor(config: OpsApiClientConfig);
|
|
24
|
+
getBaseUrl(): string;
|
|
25
|
+
getApiKey(): string;
|
|
26
|
+
private buildUrl;
|
|
27
|
+
private executeWithRetry;
|
|
28
|
+
get<T>(path: string): Promise<T>;
|
|
29
|
+
post<T>(path: string, body?: unknown): Promise<T>;
|
|
30
|
+
patch<T>(path: string, body: unknown): Promise<T>;
|
|
31
|
+
put<T>(path: string, body?: unknown): Promise<T>;
|
|
32
|
+
delete<T>(path: string): Promise<T>;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Create an OpsApiClient from environment variables.
|
|
36
|
+
* Reads BEACON_API_URL and OPS_API_KEY from process.env.
|
|
37
|
+
*/
|
|
38
|
+
export declare function createOpsApiClient(overrides?: Partial<OpsApiClientConfig>): OpsApiClient;
|
|
39
|
+
//# sourceMappingURL=ops-api-client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ops-api-client.d.ts","sourceRoot":"","sources":["../../src/transport/ops-api-client.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAuBH,MAAM,WAAW,kBAAkB;IAC/B,OAAO,EAAE,MAAM,CAAA;IACf,MAAM,EAAE,MAAM,CAAA;IACd,6DAA6D;IAC7D,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,2DAA2D;IAC3D,WAAW,CAAC,EAAE,MAAM,CAAA;CACvB;AAID,qBAAa,YAAY;IACrB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAQ;IAChC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAQ;IAC/B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAQ;IAChC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAQ;gBAExB,MAAM,EAAE,kBAAkB;IAOtC,UAAU,IAAI,MAAM;IAIpB,SAAS,IAAI,MAAM;IAInB,OAAO,CAAC,QAAQ;YAKF,gBAAgB;IAsF9B,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC;IAIhC,IAAI,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC;IAIjD,KAAK,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC;IAIjD,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC;IAIhD,MAAM,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC;CAGtC;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC,kBAAkB,CAAC,GAAG,YAAY,CAOxF"}
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OpsApiClient — HTTP client for beacon API /api/v1/* endpoints.
|
|
3
|
+
*
|
|
4
|
+
* Uses OPS_API_KEY Bearer auth (vendor role, C80 bypass).
|
|
5
|
+
* Supports retry with exponential backoff for transient errors (INV-5).
|
|
6
|
+
* Logs errors with request context (INV-4).
|
|
7
|
+
*
|
|
8
|
+
* F217: Used by MCP, Sidecar, Janitor, Runtime to replace direct Prisma access.
|
|
9
|
+
*/
|
|
10
|
+
import { SdkError, apiCodeToSdkCode, statusToSdkCode } from './errors.js';
|
|
11
|
+
// Minimal logger for INV-4 — avoid pulling in @beacon-build/logger to keep client lean
|
|
12
|
+
// INV-4b: 4xx errors (except 429) are NOT logged at level:50 — they are expected fallbacks.
|
|
13
|
+
// Only 5xx and network errors are logged as errors.
|
|
14
|
+
function logError(msg, context) {
|
|
15
|
+
if (typeof process !== 'undefined' && process.stderr) {
|
|
16
|
+
process.stderr.write(JSON.stringify({ level: 50, time: Date.now(), msg, ...context }) + '\n');
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
function logDebug(msg, context) {
|
|
20
|
+
if (typeof process !== 'undefined' && process.stderr) {
|
|
21
|
+
process.stderr.write(JSON.stringify({ level: 20, time: Date.now(), msg, ...context }) + '\n');
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
const RETRYABLE_STATUSES = new Set([429, 500, 502, 503, 504]);
|
|
25
|
+
export class OpsApiClient {
|
|
26
|
+
baseUrl;
|
|
27
|
+
apiKey;
|
|
28
|
+
retries;
|
|
29
|
+
retryBaseMs;
|
|
30
|
+
constructor(config) {
|
|
31
|
+
this.baseUrl = config.baseUrl.replace(/\/$/, '');
|
|
32
|
+
this.apiKey = config.apiKey;
|
|
33
|
+
this.retries = config.retries ?? 3;
|
|
34
|
+
this.retryBaseMs = config.retryBaseMs ?? 100;
|
|
35
|
+
}
|
|
36
|
+
getBaseUrl() {
|
|
37
|
+
return this.baseUrl;
|
|
38
|
+
}
|
|
39
|
+
getApiKey() {
|
|
40
|
+
return this.apiKey;
|
|
41
|
+
}
|
|
42
|
+
buildUrl(path) {
|
|
43
|
+
const p = path.startsWith('/') ? path : `/${path}`;
|
|
44
|
+
return `${this.baseUrl}${p}`;
|
|
45
|
+
}
|
|
46
|
+
async executeWithRetry(method, path, body) {
|
|
47
|
+
const url = this.buildUrl(path);
|
|
48
|
+
const headers = {
|
|
49
|
+
'Content-Type': 'application/json',
|
|
50
|
+
Authorization: `Bearer ${this.apiKey}`,
|
|
51
|
+
};
|
|
52
|
+
let lastError;
|
|
53
|
+
for (let attempt = 0; attempt <= this.retries; attempt++) {
|
|
54
|
+
if (attempt > 0) {
|
|
55
|
+
const delay = this.retryBaseMs * Math.pow(2, attempt - 1);
|
|
56
|
+
await new Promise((r) => setTimeout(r, delay));
|
|
57
|
+
}
|
|
58
|
+
let res;
|
|
59
|
+
try {
|
|
60
|
+
res = await fetch(url, {
|
|
61
|
+
method,
|
|
62
|
+
headers,
|
|
63
|
+
body: body !== undefined ? JSON.stringify(body) : undefined,
|
|
64
|
+
signal: AbortSignal.timeout(15_000),
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
catch (err) {
|
|
68
|
+
// Network error — retryable
|
|
69
|
+
const networkErr = new SdkError('network_error', err instanceof Error ? err.message : 'Network request failed');
|
|
70
|
+
lastError = networkErr;
|
|
71
|
+
if (attempt === this.retries) {
|
|
72
|
+
// All retries exhausted — log with request context before throwing
|
|
73
|
+
logError('OpsApiClient network error (all retries exhausted)', {
|
|
74
|
+
method,
|
|
75
|
+
path,
|
|
76
|
+
attempt,
|
|
77
|
+
error: networkErr.message,
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
continue;
|
|
81
|
+
}
|
|
82
|
+
if (RETRYABLE_STATUSES.has(res.status) && attempt < this.retries) {
|
|
83
|
+
lastError = new SdkError(statusToSdkCode(res.status), `HTTP ${res.status}`, res.status);
|
|
84
|
+
continue;
|
|
85
|
+
}
|
|
86
|
+
if (!res.ok) {
|
|
87
|
+
let code = statusToSdkCode(res.status);
|
|
88
|
+
// Always preserve method+path for INV-4 context
|
|
89
|
+
let message = `HTTP ${res.status} ${method} ${path}`;
|
|
90
|
+
try {
|
|
91
|
+
const b = await res.json();
|
|
92
|
+
// Prefer body.code for precise error classification (e.g. 422 VALIDATION vs INVALID_TRANSITION)
|
|
93
|
+
if (typeof b?.code === 'string')
|
|
94
|
+
code = apiCodeToSdkCode(b.code, res.status);
|
|
95
|
+
if (b?.error?.message)
|
|
96
|
+
message = `${message} — ${b.error.message}`;
|
|
97
|
+
else if (typeof b?.error === 'string')
|
|
98
|
+
message = `${message} — ${b.error}`;
|
|
99
|
+
}
|
|
100
|
+
catch {
|
|
101
|
+
// ignore parse errors
|
|
102
|
+
}
|
|
103
|
+
// INV-4b: 4xx (except 429) = expected — log at debug, not error.
|
|
104
|
+
// 429/5xx = unexpected — log at error.
|
|
105
|
+
if (res.status >= 500 || res.status === 429) {
|
|
106
|
+
logError('OpsApiClient error', { method, path, status: res.status, attempt });
|
|
107
|
+
}
|
|
108
|
+
else {
|
|
109
|
+
logDebug('OpsApiClient 4xx', { method, path, status: res.status, attempt });
|
|
110
|
+
}
|
|
111
|
+
throw new SdkError(code, message, res.status);
|
|
112
|
+
}
|
|
113
|
+
// 204 No Content
|
|
114
|
+
if (res.status === 204)
|
|
115
|
+
return undefined;
|
|
116
|
+
try {
|
|
117
|
+
return (await res.json());
|
|
118
|
+
}
|
|
119
|
+
catch {
|
|
120
|
+
return undefined;
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
throw lastError ?? new SdkError('network_error', `Failed after ${this.retries} retries`);
|
|
124
|
+
}
|
|
125
|
+
get(path) {
|
|
126
|
+
return this.executeWithRetry('GET', path);
|
|
127
|
+
}
|
|
128
|
+
post(path, body) {
|
|
129
|
+
return this.executeWithRetry('POST', path, body);
|
|
130
|
+
}
|
|
131
|
+
patch(path, body) {
|
|
132
|
+
return this.executeWithRetry('PATCH', path, body);
|
|
133
|
+
}
|
|
134
|
+
put(path, body) {
|
|
135
|
+
return this.executeWithRetry('PUT', path, body);
|
|
136
|
+
}
|
|
137
|
+
delete(path) {
|
|
138
|
+
return this.executeWithRetry('DELETE', path);
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* Create an OpsApiClient from environment variables.
|
|
143
|
+
* Reads BEACON_API_URL and OPS_API_KEY from process.env.
|
|
144
|
+
*/
|
|
145
|
+
export function createOpsApiClient(overrides) {
|
|
146
|
+
const baseUrl = overrides?.baseUrl ?? process.env.BEACON_API_URL ?? 'http://localhost:4000';
|
|
147
|
+
const apiKey = overrides?.apiKey ?? process.env.OPS_API_KEY ?? '';
|
|
148
|
+
if (!apiKey) {
|
|
149
|
+
throw new Error('OPS_API_KEY is required for OpsApiClient — check ~/.beacon-platform/.env');
|
|
150
|
+
}
|
|
151
|
+
return new OpsApiClient({ baseUrl, apiKey, ...overrides });
|
|
152
|
+
}
|
|
153
|
+
//# sourceMappingURL=ops-api-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ops-api-client.js","sourceRoot":"","sources":["../../src/transport/ops-api-client.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,QAAQ,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;AAEzE,uFAAuF;AACvF,4FAA4F;AAC5F,4DAA4D;AAC5D,SAAS,QAAQ,CAAC,GAAW,EAAE,OAAgC;IAC3D,IAAI,OAAO,OAAO,KAAK,WAAW,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;QACnD,OAAO,CAAC,MAAM,CAAC,KAAK,CAChB,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,GAAG,EAAE,GAAG,OAAO,EAAE,CAAC,GAAG,IAAI,CAC1E,CAAA;IACL,CAAC;AACL,CAAC;AAED,SAAS,QAAQ,CAAC,GAAW,EAAE,OAAgC;IAC3D,IAAI,OAAO,OAAO,KAAK,WAAW,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;QACnD,OAAO,CAAC,MAAM,CAAC,KAAK,CAChB,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,GAAG,EAAE,GAAG,OAAO,EAAE,CAAC,GAAG,IAAI,CAC1E,CAAA;IACL,CAAC;AACL,CAAC;AAWD,MAAM,kBAAkB,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,CAAA;AAE7D,MAAM,OAAO,YAAY;IACJ,OAAO,CAAQ;IACf,MAAM,CAAQ;IACd,OAAO,CAAQ;IACf,WAAW,CAAQ;IAEpC,YAAY,MAA0B;QAClC,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAA;QAChD,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAA;QAC3B,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,IAAI,CAAC,CAAA;QAClC,IAAI,CAAC,WAAW,GAAG,MAAM,CAAC,WAAW,IAAI,GAAG,CAAA;IAChD,CAAC;IAED,UAAU;QACN,OAAO,IAAI,CAAC,OAAO,CAAA;IACvB,CAAC;IAED,SAAS;QACL,OAAO,IAAI,CAAC,MAAM,CAAA;IACtB,CAAC;IAEO,QAAQ,CAAC,IAAY;QACzB,MAAM,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAA;QAClD,OAAO,GAAG,IAAI,CAAC,OAAO,GAAG,CAAC,EAAE,CAAA;IAChC,CAAC;IAEO,KAAK,CAAC,gBAAgB,CAAI,MAAc,EAAE,IAAY,EAAE,IAAc;QAC1E,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAA;QAC/B,MAAM,OAAO,GAA2B;YACpC,cAAc,EAAE,kBAAkB;YAClC,aAAa,EAAE,UAAU,IAAI,CAAC,MAAM,EAAE;SACzC,CAAA;QAED,IAAI,SAAkB,CAAA;QACtB,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,IAAI,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,CAAC;YACvD,IAAI,OAAO,GAAG,CAAC,EAAE,CAAC;gBACd,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,GAAG,CAAC,CAAC,CAAA;gBACzD,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAA;YAClD,CAAC;YAED,IAAI,GAAa,CAAA;YACjB,IAAI,CAAC;gBACD,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;oBACnB,MAAM;oBACN,OAAO;oBACP,IAAI,EAAE,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS;oBAC3D,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC;iBACtC,CAAC,CAAA;YACN,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACX,4BAA4B;gBAC5B,MAAM,UAAU,GAAG,IAAI,QAAQ,CAC3B,eAAe,EACf,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,wBAAwB,CAChE,CAAA;gBACD,SAAS,GAAG,UAAU,CAAA;gBACtB,IAAI,OAAO,KAAK,IAAI,CAAC,OAAO,EAAE,CAAC;oBAC3B,mEAAmE;oBACnE,QAAQ,CAAC,oDAAoD,EAAE;wBAC3D,MAAM;wBACN,IAAI;wBACJ,OAAO;wBACP,KAAK,EAAE,UAAU,CAAC,OAAO;qBAC5B,CAAC,CAAA;gBACN,CAAC;gBACD,SAAQ;YACZ,CAAC;YAED,IAAI,kBAAkB,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,OAAO,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC;gBAC/D,SAAS,GAAG,IAAI,QAAQ,CACpB,eAAe,CAAC,GAAG,CAAC,MAAM,CAAC,EAC3B,QAAQ,GAAG,CAAC,MAAM,EAAE,EACpB,GAAG,CAAC,MAAM,CACb,CAAA;gBACD,SAAQ;YACZ,CAAC;YAED,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;gBACV,IAAI,IAAI,GAAG,eAAe,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;gBACtC,gDAAgD;gBAChD,IAAI,OAAO,GAAG,QAAQ,GAAG,CAAC,MAAM,IAAI,MAAM,IAAI,IAAI,EAAE,CAAA;gBACpD,IAAI,CAAC;oBACD,MAAM,CAAC,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAA;oBAC1B,gGAAgG;oBAChG,IAAI,OAAO,CAAC,EAAE,IAAI,KAAK,QAAQ;wBAAE,IAAI,GAAG,gBAAgB,CAAC,CAAC,CAAC,IAAI,EAAE,GAAG,CAAC,MAAM,CAAC,CAAA;oBAC5E,IAAI,CAAC,EAAE,KAAK,EAAE,OAAO;wBAAE,OAAO,GAAG,GAAG,OAAO,MAAM,CAAC,CAAC,KAAK,CAAC,OAAO,EAAE,CAAA;yBAC7D,IAAI,OAAO,CAAC,EAAE,KAAK,KAAK,QAAQ;wBAAE,OAAO,GAAG,GAAG,OAAO,MAAM,CAAC,CAAC,KAAK,EAAE,CAAA;gBAC9E,CAAC;gBAAC,MAAM,CAAC;oBACL,sBAAsB;gBAC1B,CAAC;gBACD,iEAAiE;gBACjE,+CAA+C;gBAC/C,IAAI,GAAG,CAAC,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;oBAC1C,QAAQ,CAAC,oBAAoB,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC,CAAA;gBACjF,CAAC;qBAAM,CAAC;oBACJ,QAAQ,CAAC,kBAAkB,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC,CAAA;gBAC/E,CAAC;gBACD,MAAM,IAAI,QAAQ,CAAC,IAAI,EAAE,OAAO,EAAE,GAAG,CAAC,MAAM,CAAC,CAAA;YACjD,CAAC;YAED,iBAAiB;YACjB,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG;gBAAE,OAAO,SAAc,CAAA;YAE7C,IAAI,CAAC;gBACD,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAM,CAAA;YAClC,CAAC;YAAC,MAAM,CAAC;gBACL,OAAO,SAAc,CAAA;YACzB,CAAC;QACL,CAAC;QAED,MAAM,SAAS,IAAI,IAAI,QAAQ,CAAC,eAAe,EAAE,gBAAgB,IAAI,CAAC,OAAO,UAAU,CAAC,CAAA;IAC5F,CAAC;IAED,GAAG,CAAI,IAAY;QACf,OAAO,IAAI,CAAC,gBAAgB,CAAI,KAAK,EAAE,IAAI,CAAC,CAAA;IAChD,CAAC;IAED,IAAI,CAAI,IAAY,EAAE,IAAc;QAChC,OAAO,IAAI,CAAC,gBAAgB,CAAI,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,CAAA;IACvD,CAAC;IAED,KAAK,CAAI,IAAY,EAAE,IAAa;QAChC,OAAO,IAAI,CAAC,gBAAgB,CAAI,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,CAAA;IACxD,CAAC;IAED,GAAG,CAAI,IAAY,EAAE,IAAc;QAC/B,OAAO,IAAI,CAAC,gBAAgB,CAAI,KAAK,EAAE,IAAI,EAAE,IAAI,CAAC,CAAA;IACtD,CAAC;IAED,MAAM,CAAI,IAAY;QAClB,OAAO,IAAI,CAAC,gBAAgB,CAAI,QAAQ,EAAE,IAAI,CAAC,CAAA;IACnD,CAAC;CACJ;AAED;;;GAGG;AACH,MAAM,UAAU,kBAAkB,CAAC,SAAuC;IACtE,MAAM,OAAO,GAAG,SAAS,EAAE,OAAO,IAAI,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,uBAAuB,CAAA;IAC3F,MAAM,MAAM,GAAG,SAAS,EAAE,MAAM,IAAI,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,EAAE,CAAA;IACjE,IAAI,CAAC,MAAM,EAAE,CAAC;QACV,MAAM,IAAI,KAAK,CAAC,0EAA0E,CAAC,CAAA;IAC/F,CAAC;IACD,OAAO,IAAI,YAAY,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,SAAS,EAAE,CAAC,CAAA;AAC9D,CAAC"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
export interface SseStreamEvent {
|
|
2
|
+
type: string | null;
|
|
3
|
+
data: string;
|
|
4
|
+
id?: string;
|
|
5
|
+
}
|
|
6
|
+
export interface SseStreamHandler {
|
|
7
|
+
onEvent?: (event: SseStreamEvent) => void;
|
|
8
|
+
onError?: (error: Error) => void;
|
|
9
|
+
onDone?: () => void;
|
|
10
|
+
}
|
|
11
|
+
export interface SseStreamResult {
|
|
12
|
+
promise: Promise<void>;
|
|
13
|
+
abort: () => void;
|
|
14
|
+
}
|
|
15
|
+
export interface SseClientConfig {
|
|
16
|
+
baseUrl: string;
|
|
17
|
+
basePath?: string;
|
|
18
|
+
getAuthHeader: () => Promise<string>;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* SseClient — Generic SSE stream reader for Ops SSE endpoints.
|
|
22
|
+
* Handles: POST /api/v1/ops/db/migrate|seed|reset, GET /api/v1/ops/services/:id/logs,
|
|
23
|
+
* POST /api/v1/ops/jobs/run
|
|
24
|
+
*
|
|
25
|
+
* NOT for /api/v1/realtime/subscribe — that is RealtimeSdkClient (F141).
|
|
26
|
+
* INV-16: interprets 'event: done' and 'event: error' as stream termination signals.
|
|
27
|
+
*/
|
|
28
|
+
export declare class SseClient {
|
|
29
|
+
private config;
|
|
30
|
+
constructor(config: SseClientConfig);
|
|
31
|
+
stream(method: 'GET' | 'POST', path: string, handler: SseStreamHandler, body?: unknown): SseStreamResult;
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=sse-client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sse-client.d.ts","sourceRoot":"","sources":["../../src/transport/sse-client.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,cAAc;IAC3B,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;IACnB,IAAI,EAAE,MAAM,CAAA;IACZ,EAAE,CAAC,EAAE,MAAM,CAAA;CACd;AAED,MAAM,WAAW,gBAAgB;IAC7B,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,cAAc,KAAK,IAAI,CAAA;IACzC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAA;IAChC,MAAM,CAAC,EAAE,MAAM,IAAI,CAAA;CACtB;AAED,MAAM,WAAW,eAAe;IAC5B,OAAO,EAAE,OAAO,CAAC,IAAI,CAAC,CAAA;IACtB,KAAK,EAAE,MAAM,IAAI,CAAA;CACpB;AAED,MAAM,WAAW,eAAe;IAC5B,OAAO,EAAE,MAAM,CAAA;IACf,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,aAAa,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,CAAA;CACvC;AAED;;;;;;;GAOG;AACH,qBAAa,SAAS;IACN,OAAO,CAAC,MAAM;gBAAN,MAAM,EAAE,eAAe;IAE3C,MAAM,CACF,MAAM,EAAE,KAAK,GAAG,MAAM,EACtB,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,gBAAgB,EACzB,IAAI,CAAC,EAAE,OAAO,GACf,eAAe;CAyHrB"}
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
import { SdkError, statusToSdkCode } from './errors.js';
|
|
2
|
+
/**
|
|
3
|
+
* SseClient — Generic SSE stream reader for Ops SSE endpoints.
|
|
4
|
+
* Handles: POST /api/v1/ops/db/migrate|seed|reset, GET /api/v1/ops/services/:id/logs,
|
|
5
|
+
* POST /api/v1/ops/jobs/run
|
|
6
|
+
*
|
|
7
|
+
* NOT for /api/v1/realtime/subscribe — that is RealtimeSdkClient (F141).
|
|
8
|
+
* INV-16: interprets 'event: done' and 'event: error' as stream termination signals.
|
|
9
|
+
*/
|
|
10
|
+
export class SseClient {
|
|
11
|
+
config;
|
|
12
|
+
constructor(config) {
|
|
13
|
+
this.config = config;
|
|
14
|
+
}
|
|
15
|
+
stream(method, path, handler, body) {
|
|
16
|
+
const controller = new AbortController();
|
|
17
|
+
let aborted = false;
|
|
18
|
+
const promise = (async () => {
|
|
19
|
+
let authHeader;
|
|
20
|
+
try {
|
|
21
|
+
authHeader = await this.config.getAuthHeader();
|
|
22
|
+
}
|
|
23
|
+
catch {
|
|
24
|
+
throw new SdkError('unauthorized', 'Failed to retrieve access token');
|
|
25
|
+
}
|
|
26
|
+
const basePath = this.config.basePath ?? '/api/v1';
|
|
27
|
+
const url = `${this.config.baseUrl}${basePath}${path}`;
|
|
28
|
+
let res;
|
|
29
|
+
try {
|
|
30
|
+
const init = {
|
|
31
|
+
method,
|
|
32
|
+
headers: {
|
|
33
|
+
Authorization: authHeader,
|
|
34
|
+
Accept: 'text/event-stream',
|
|
35
|
+
...(body !== undefined ? { 'Content-Type': 'application/json' } : {}),
|
|
36
|
+
},
|
|
37
|
+
body: body !== undefined ? JSON.stringify(body) : undefined,
|
|
38
|
+
signal: controller.signal,
|
|
39
|
+
};
|
|
40
|
+
res = await fetch(url, init);
|
|
41
|
+
}
|
|
42
|
+
catch (err) {
|
|
43
|
+
if (aborted)
|
|
44
|
+
return;
|
|
45
|
+
const error = new SdkError('network_error', err instanceof Error ? err.message : 'Network request failed');
|
|
46
|
+
handler.onError?.(error);
|
|
47
|
+
throw error;
|
|
48
|
+
}
|
|
49
|
+
if (!res.ok || !res.body) {
|
|
50
|
+
const error = new SdkError(statusToSdkCode(res.status), `HTTP ${res.status}`, res.status);
|
|
51
|
+
handler.onError?.(error);
|
|
52
|
+
throw error;
|
|
53
|
+
}
|
|
54
|
+
const reader = res.body.getReader();
|
|
55
|
+
const decoder = new TextDecoder();
|
|
56
|
+
let buffer = '';
|
|
57
|
+
// Event fields are declared outside the read loop so state is preserved
|
|
58
|
+
// across chunk boundaries (SSE events may be split across multiple reads).
|
|
59
|
+
let eventType = null;
|
|
60
|
+
let eventData = '';
|
|
61
|
+
let eventId;
|
|
62
|
+
while (true) {
|
|
63
|
+
let chunk;
|
|
64
|
+
try {
|
|
65
|
+
chunk = await reader.read();
|
|
66
|
+
}
|
|
67
|
+
catch {
|
|
68
|
+
if (aborted)
|
|
69
|
+
return;
|
|
70
|
+
const error = new Error('SSE stream read error');
|
|
71
|
+
handler.onError?.(error);
|
|
72
|
+
return;
|
|
73
|
+
}
|
|
74
|
+
if (chunk.done) {
|
|
75
|
+
handler.onDone?.();
|
|
76
|
+
return;
|
|
77
|
+
}
|
|
78
|
+
// Strip trailing \r to handle CRLF line endings (RFC 6455 / SSE spec)
|
|
79
|
+
buffer += decoder.decode(chunk.value, { stream: true });
|
|
80
|
+
const lines = buffer.split('\n');
|
|
81
|
+
buffer = lines.pop() ?? '';
|
|
82
|
+
for (const rawLine of lines) {
|
|
83
|
+
const line = rawLine.endsWith('\r') ? rawLine.slice(0, -1) : rawLine;
|
|
84
|
+
if (line.startsWith('event:')) {
|
|
85
|
+
eventType = line.slice(6).trim();
|
|
86
|
+
}
|
|
87
|
+
else if (line.startsWith('data:')) {
|
|
88
|
+
// SSE spec: multiple data: lines are concatenated with \n
|
|
89
|
+
const chunk = line.slice(5).trim();
|
|
90
|
+
eventData = eventData ? `${eventData}\n${chunk}` : chunk;
|
|
91
|
+
}
|
|
92
|
+
else if (line.startsWith('id:')) {
|
|
93
|
+
eventId = line.slice(3).trim();
|
|
94
|
+
}
|
|
95
|
+
else if (line === '') {
|
|
96
|
+
// Dispatch event
|
|
97
|
+
if (eventData || eventType) {
|
|
98
|
+
if (eventType === 'done') {
|
|
99
|
+
handler.onDone?.();
|
|
100
|
+
reader.cancel();
|
|
101
|
+
return;
|
|
102
|
+
}
|
|
103
|
+
if (eventType === 'error') {
|
|
104
|
+
const error = new Error(eventData || 'SSE error event');
|
|
105
|
+
handler.onError?.(error);
|
|
106
|
+
reader.cancel();
|
|
107
|
+
return;
|
|
108
|
+
}
|
|
109
|
+
handler.onEvent?.({ type: eventType, data: eventData, id: eventId });
|
|
110
|
+
}
|
|
111
|
+
eventType = null;
|
|
112
|
+
eventData = '';
|
|
113
|
+
eventId = undefined;
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
})();
|
|
118
|
+
return {
|
|
119
|
+
promise,
|
|
120
|
+
abort: () => {
|
|
121
|
+
aborted = true;
|
|
122
|
+
controller.abort();
|
|
123
|
+
},
|
|
124
|
+
};
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
//# sourceMappingURL=sse-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sse-client.js","sourceRoot":"","sources":["../../src/transport/sse-client.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@beacon-build/sdk",
|
|
3
|
+
"version": "1.15.0",
|
|
4
|
+
"type": "module",
|
|
5
|
+
"main": "dist/index.js",
|
|
6
|
+
"types": "dist/index.d.ts",
|
|
7
|
+
"files": [
|
|
8
|
+
"dist",
|
|
9
|
+
"README.md",
|
|
10
|
+
"LICENSE",
|
|
11
|
+
"CHANGELOG.md"
|
|
12
|
+
],
|
|
13
|
+
"scripts": {
|
|
14
|
+
"build": "tsc",
|
|
15
|
+
"dev": "tsc --watch",
|
|
16
|
+
"lint": "eslint src/ --max-warnings 0",
|
|
17
|
+
"typecheck": "tsc --noEmit",
|
|
18
|
+
"test": "vitest run"
|
|
19
|
+
},
|
|
20
|
+
"dependencies": {
|
|
21
|
+
"@beacon-build/core": "workspace:*",
|
|
22
|
+
"@types/event-source-polyfill": "^1.0.5",
|
|
23
|
+
"event-source-polyfill": "^1.0.31"
|
|
24
|
+
},
|
|
25
|
+
"devDependencies": {
|
|
26
|
+
"vitest": "^4.1.2"
|
|
27
|
+
},
|
|
28
|
+
"publishConfig": {
|
|
29
|
+
"registry": "https://registry.npmjs.org",
|
|
30
|
+
"access": "public"
|
|
31
|
+
}
|
|
32
|
+
}
|