@runmark/sdk 0.1.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 ADDED
@@ -0,0 +1,219 @@
1
+ # @skyforge-ai/sdk
2
+
3
+ Server-side TypeScript SDK for Skyforge agent chat integrations.
4
+
5
+ This package is internal for now and is not published to npm. `private: true`
6
+ is intentionally retained until a release process, package metadata, and npm
7
+ publishing policy are approved.
8
+
9
+ ## Runtime
10
+
11
+ - Node.js 24.17.0 or newer.
12
+ - Server-only. The SDK throws in browser-like environments.
13
+ - Zero runtime dependencies.
14
+ - Uses native `fetch`, `FormData`, `ReadableStream`, and `AbortSignal`.
15
+
16
+ ## Authentication
17
+
18
+ Every request uses the existing Skyforge chat routes and sends:
19
+
20
+ ```http
21
+ Authorization: Bearer <skyforge_api_token>
22
+ ```
23
+
24
+ The SDK does not set cookies, `X-CSRF-Token`, `credentials: "include"`, or call
25
+ `/api/auth/csrf`.
26
+
27
+ ## Response Shape
28
+
29
+ SDK method inputs use camelCase. Request bodies are serialized to the existing
30
+ backend field names.
31
+
32
+ V1 response payloads intentionally mirror the backend DTOs, including snake_case
33
+ fields such as `chat_id`, `agent_branch_id`, and `pending_human_actions`. The SDK
34
+ does not translate response fields to camelCase.
35
+
36
+ ## Usage
37
+
38
+ ```ts
39
+ import { SkyforgeClient } from "@skyforge-ai/sdk";
40
+
41
+ const skyforge = new SkyforgeClient({
42
+ apiKey: process.env.SKYFORGE_API_TOKEN!,
43
+ baseUrl: "https://api.skyforge.ai",
44
+ });
45
+ ```
46
+
47
+ ### Get Agent Branch State
48
+
49
+ ```ts
50
+ const state = await skyforge.agentBranches.getState({
51
+ agentBranchId: "11111111-1111-1111-1111-111111111111",
52
+ chatId: "22222222-2222-2222-2222-222222222222",
53
+ });
54
+
55
+ console.log(state.chat_id, state.messages);
56
+ ```
57
+
58
+ ### Send Message
59
+
60
+ ```ts
61
+ const response = await skyforge.agentBranches.sendMessage({
62
+ agentBranchId: "11111111-1111-1111-1111-111111111111",
63
+ chatId: "22222222-2222-2222-2222-222222222222",
64
+ message: "Summarize the latest run.",
65
+ structuredContext: {
66
+ priority: "high",
67
+ },
68
+ });
69
+
70
+ console.log(response.chat_id, response.agent_run_id);
71
+ ```
72
+
73
+ ### Stream Run Events
74
+
75
+ ```ts
76
+ const events = await skyforge.agentRuns.streamEvents({
77
+ agentRunId: "33333333-3333-3333-3333-333333333333",
78
+ afterSequence: 12,
79
+ });
80
+
81
+ for await (const event of events) {
82
+ console.log(event.sequence, event.event.type);
83
+ }
84
+ ```
85
+
86
+ Breaking out of the loop cancels the underlying response reader.
87
+
88
+ ### Submit Human Action
89
+
90
+ ```ts
91
+ await skyforge.humanActions.submit({
92
+ humanActionRequestId: "44444444-4444-4444-4444-444444444444",
93
+ values: {
94
+ approved: true,
95
+ },
96
+ });
97
+ ```
98
+
99
+ ### Uploaded Files
100
+
101
+ ```ts
102
+ const upload = await skyforge.uploadedFiles.upload({
103
+ agentBranchId: "11111111-1111-1111-1111-111111111111",
104
+ chatId: "22222222-2222-2222-2222-222222222222",
105
+ file: new Blob(["notes"], { type: "text/plain" }),
106
+ filename: "notes.txt",
107
+ contentType: "text/plain",
108
+ });
109
+
110
+ const files = await skyforge.uploadedFiles.list({
111
+ agentBranchId: upload.file.agent_branch_id,
112
+ chatId: upload.chat_id,
113
+ });
114
+
115
+ await skyforge.uploadedFiles.delete({
116
+ agentBranchId: upload.file.agent_branch_id,
117
+ chatId: upload.chat_id,
118
+ fileContextId: upload.file.id,
119
+ });
120
+ ```
121
+
122
+ `filename` is required and must not be blank.
123
+
124
+ ## Tests
125
+
126
+ Run the fast SDK unit tests:
127
+
128
+ ```bash
129
+ cd packages/skyforge-sdk
130
+ npm test
131
+ ```
132
+
133
+ The opt-in live suite requires a running local Skyforge backend and a valid
134
+ local API token with access to the selected agent branch. It uses only
135
+ `Authorization: Bearer <skyforge_api_token>` through the existing
136
+ `/api/skyforge-chat/...` routes.
137
+
138
+ Live test environment variables can be stored in `.e2e.env` at the package
139
+ root. Copy the example file and fill in your local token:
140
+
141
+ ```bash
142
+ cd packages/skyforge-sdk
143
+ cp .e2e.env.example .e2e.env
144
+ ```
145
+
146
+ `.e2e.env` is ignored by git. Shell environment variables take precedence over
147
+ values in the file.
148
+
149
+ ```bash
150
+ cd packages/skyforge-sdk
151
+
152
+ SKYFORGE_SDK_LIVE=1 \
153
+ SKYFORGE_API_BASE_URL=http://localhost:3000 \
154
+ SKYFORGE_API_TOKEN=... \
155
+ SKYFORGE_AGENT_BRANCH_ID=... \
156
+ npm run test:live
157
+ ```
158
+
159
+ With `.e2e.env` populated, this is enough:
160
+
161
+ ```bash
162
+ npm run test:live
163
+ ```
164
+
165
+ Optional live test controls:
166
+
167
+ ```bash
168
+ SKYFORGE_SDK_LIVE_UPLOADS=1
169
+ SKYFORGE_SDK_LIVE_HITL_REQUEST_ID=...
170
+ SKYFORGE_SDK_LIVE_EXISTING_CHAT_ID=...
171
+ SKYFORGE_SDK_LIVE_TIMEOUT_MS=60000
172
+ SKYFORGE_SDK_LIVE_HITL_TIMEOUT_MS=120000
173
+ SKYFORGE_SDK_LIVE_EVENT_TIMEOUT_MS=15000
174
+ SKYFORGE_SDK_LIVE_MESSAGE="SDK live smoke test. Reply with a short confirmation."
175
+ SKYFORGE_SDK_LIVE_EXPECT_PENDING_HITL=1
176
+ SKYFORGE_SDK_LIVE_EXPECT_BUBBLED_HITL=1
177
+ SKYFORGE_SDK_LIVE_SUBMIT_PENDING_HITL=1
178
+ SKYFORGE_SDK_LIVE_HITL_VALUES='{"decision":"approve","notes":"Approved by SDK live test."}'
179
+ ```
180
+
181
+ ### HITL Bubbling Demo
182
+
183
+ The repository seed includes a TailYew `hitl-bubbling-demo` parent agent. The
184
+ SDK package has a convenience live command for that seeded local fixture:
185
+
186
+ ```bash
187
+ cd packages/skyforge-sdk
188
+
189
+ SKYFORGE_API_TOKEN=... \
190
+ npm run test:live:hitl-bubbling-demo
191
+ ```
192
+
193
+ If `.e2e.env` contains `SKYFORGE_API_TOKEN`, you can run:
194
+
195
+ ```bash
196
+ npm run test:live:hitl-bubbling-demo
197
+ ```
198
+
199
+ This command sets:
200
+
201
+ ```bash
202
+ SKYFORGE_SDK_LIVE=1
203
+ SKYFORGE_API_BASE_URL=http://127.0.0.1:3000
204
+ SKYFORGE_AGENT_BRANCH_ID=9ab14d38-55d1-4a9c-bc56-0df2c03aee02
205
+ SKYFORGE_SDK_LIVE_MESSAGE="Use ask_skyforge_agent to ask the human-workflow-demo child agent to look up Bulbasaur. Do not answer without calling the child agent."
206
+ SKYFORGE_SDK_LIVE_TIMEOUT_MS=180000
207
+ SKYFORGE_SDK_LIVE_HITL_TIMEOUT_MS=120000
208
+ SKYFORGE_SDK_LIVE_EVENT_TIMEOUT_MS=15000
209
+ SKYFORGE_SDK_LIVE_EXPECT_PENDING_HITL=1
210
+ SKYFORGE_SDK_LIVE_EXPECT_BUBBLED_HITL=1
211
+ SKYFORGE_SDK_LIVE_SUBMIT_PENDING_HITL=1
212
+ ```
213
+
214
+ `SKYFORGE_API_TOKEN` is still required and is not set by the script. Use a valid
215
+ local API token with access to the seeded TailYew repository/branch. You can
216
+ override the base URL, branch ID, message, HITL values, or timeout by setting
217
+ the same environment variables before running the command.
218
+
219
+ Do not expose Skyforge API tokens in browser code. This SDK is server-side only.
@@ -0,0 +1,29 @@
1
+ import type { DeleteUploadedFileParams, GetAgentBranchStateParams, SendMessageParams, SkyforgeAgentRunEventEnvelope, SkyforgeChatMessageResponse, SkyforgeChatStateResponse, SkyforgeChatUploadedFileListResponse, SkyforgeChatUploadedFileUploadResponse, SkyforgeClientOptions, StreamAgentRunEventsParams, SubmitHumanActionParams, UploadFileParams, ListUploadedFilesParams } from "./types.js";
2
+ export declare class SkyforgeClient {
3
+ readonly agentBranches: {
4
+ getState: (params: GetAgentBranchStateParams) => Promise<SkyforgeChatStateResponse>;
5
+ sendMessage: (params: SendMessageParams) => Promise<SkyforgeChatMessageResponse>;
6
+ };
7
+ readonly agentRuns: {
8
+ streamEvents: (params: StreamAgentRunEventsParams) => Promise<AsyncIterable<SkyforgeAgentRunEventEnvelope>>;
9
+ };
10
+ readonly humanActions: {
11
+ submit: (params: SubmitHumanActionParams) => Promise<SkyforgeChatMessageResponse>;
12
+ };
13
+ readonly uploadedFiles: {
14
+ list: (params: ListUploadedFilesParams) => Promise<SkyforgeChatUploadedFileListResponse>;
15
+ upload: (params: UploadFileParams) => Promise<SkyforgeChatUploadedFileUploadResponse>;
16
+ delete: (params: DeleteUploadedFileParams) => Promise<SkyforgeChatUploadedFileListResponse>;
17
+ };
18
+ private readonly baseUrl;
19
+ private readonly http;
20
+ constructor(options: SkyforgeClientOptions);
21
+ private getAgentBranchState;
22
+ private sendMessage;
23
+ private streamEvents;
24
+ private submitHumanAction;
25
+ private listUploadedFiles;
26
+ private uploadFile;
27
+ private deleteUploadedFile;
28
+ }
29
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EACV,wBAAwB,EACxB,yBAAyB,EACzB,iBAAiB,EACjB,6BAA6B,EAC7B,2BAA2B,EAC3B,yBAAyB,EACzB,oCAAoC,EACpC,sCAAsC,EACtC,qBAAqB,EAErB,0BAA0B,EAC1B,uBAAuB,EAEvB,gBAAgB,EAChB,uBAAuB,EACxB,MAAM,YAAY,CAAC;AAIpB,qBAAa,cAAc;IACzB,QAAQ,CAAC,aAAa,EAAE;QACtB,QAAQ,EAAE,CAAC,MAAM,EAAE,yBAAyB,KAAK,OAAO,CAAC,yBAAyB,CAAC,CAAC;QACpF,WAAW,EAAE,CAAC,MAAM,EAAE,iBAAiB,KAAK,OAAO,CAAC,2BAA2B,CAAC,CAAC;KAClF,CAAC;IACF,QAAQ,CAAC,SAAS,EAAE;QAClB,YAAY,EAAE,CACZ,MAAM,EAAE,0BAA0B,KAC/B,OAAO,CAAC,aAAa,CAAC,6BAA6B,CAAC,CAAC,CAAC;KAC5D,CAAC;IACF,QAAQ,CAAC,YAAY,EAAE;QACrB,MAAM,EAAE,CAAC,MAAM,EAAE,uBAAuB,KAAK,OAAO,CAAC,2BAA2B,CAAC,CAAC;KACnF,CAAC;IACF,QAAQ,CAAC,aAAa,EAAE;QACtB,IAAI,EAAE,CAAC,MAAM,EAAE,uBAAuB,KAAK,OAAO,CAAC,oCAAoC,CAAC,CAAC;QACzF,MAAM,EAAE,CAAC,MAAM,EAAE,gBAAgB,KAAK,OAAO,CAAC,sCAAsC,CAAC,CAAC;QACtF,MAAM,EAAE,CAAC,MAAM,EAAE,wBAAwB,KAAK,OAAO,CAAC,oCAAoC,CAAC,CAAC;KAC7F,CAAC;IAEF,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAa;gBAEtB,OAAO,EAAE,qBAAqB;IAmC1C,OAAO,CAAC,mBAAmB;IAS3B,OAAO,CAAC,WAAW;YAeL,YAAY;IAU1B,OAAO,CAAC,iBAAiB;IAQzB,OAAO,CAAC,iBAAiB;IASzB,OAAO,CAAC,UAAU;IAmBlB,OAAO,CAAC,kBAAkB;CAa3B"}
package/dist/client.js ADDED
@@ -0,0 +1,101 @@
1
+ import { HttpClient } from "./http.js";
2
+ import { parseSkyforgeEventStream } from "./sse.js";
3
+ import { chatStateUrl, humanActionSubmitUrl, runEventStreamUrl, sendMessageUrl, uploadedFileDeleteUrl, uploadedFilesUrl, } from "./routes.js";
4
+ const DEFAULT_BASE_URL = "https://api.skyforge.ai";
5
+ export class SkyforgeClient {
6
+ agentBranches;
7
+ agentRuns;
8
+ humanActions;
9
+ uploadedFiles;
10
+ baseUrl;
11
+ http;
12
+ constructor(options) {
13
+ assertServerEnvironment();
14
+ if (options.apiKey.trim().length === 0) {
15
+ throw new Error("Skyforge apiKey is required.");
16
+ }
17
+ const fetchFn = options.fetch ?? globalThis.fetch;
18
+ if (fetchFn === undefined) {
19
+ throw new Error("Skyforge SDK requires a fetch implementation.");
20
+ }
21
+ this.baseUrl = options.baseUrl ?? DEFAULT_BASE_URL;
22
+ this.http = new HttpClient({
23
+ apiKey: options.apiKey,
24
+ fetch: fetchFn,
25
+ });
26
+ this.agentBranches = {
27
+ getState: (params) => this.getAgentBranchState(params),
28
+ sendMessage: (params) => this.sendMessage(params),
29
+ };
30
+ this.agentRuns = {
31
+ streamEvents: (params) => this.streamEvents(params),
32
+ };
33
+ this.humanActions = {
34
+ submit: (params) => this.submitHumanAction(params),
35
+ };
36
+ this.uploadedFiles = {
37
+ list: (params) => this.listUploadedFiles(params),
38
+ upload: (params) => this.uploadFile(params),
39
+ delete: (params) => this.deleteUploadedFile(params),
40
+ };
41
+ }
42
+ getAgentBranchState(params) {
43
+ return this.http.getJson(chatStateUrl(this.baseUrl, params.agentBranchId, params.chatId), params.signal);
44
+ }
45
+ sendMessage(params) {
46
+ return this.http.postJson(sendMessageUrl(this.baseUrl, params.agentBranchId), compactBody({
47
+ message: params.message,
48
+ chat_id: params.chatId,
49
+ retried_from_agent_run_id: params.retriedFromAgentRunId,
50
+ source_user_message_id: params.sourceUserMessageId,
51
+ structured_context: params.structuredContext,
52
+ retrieval_scope: params.retrievalScope,
53
+ }), params.signal);
54
+ }
55
+ async streamEvents(params) {
56
+ const response = await this.http.stream(runEventStreamUrl(this.baseUrl, params.agentRunId, params.afterSequence), params.signal);
57
+ return parseSkyforgeEventStream(response.body);
58
+ }
59
+ submitHumanAction(params) {
60
+ return this.http.postJson(humanActionSubmitUrl(this.baseUrl, params.humanActionRequestId), { values: params.values }, params.signal);
61
+ }
62
+ listUploadedFiles(params) {
63
+ return this.http.getJson(uploadedFilesUrl(this.baseUrl, params.agentBranchId, params.chatId), params.signal);
64
+ }
65
+ uploadFile(params) {
66
+ if (params.filename === undefined || params.filename.trim().length === 0) {
67
+ throw new Error("Skyforge uploaded file filename is required.");
68
+ }
69
+ const form = new FormData();
70
+ if (params.chatId !== undefined) {
71
+ form.append("chat_id", params.chatId);
72
+ }
73
+ form.append("file", toUploadBlob(params.file, params.contentType), params.filename);
74
+ return this.http.postForm(uploadedFilesUrl(this.baseUrl, params.agentBranchId), form, params.signal);
75
+ }
76
+ deleteUploadedFile(params) {
77
+ return this.http.deleteJson(uploadedFileDeleteUrl(this.baseUrl, params.agentBranchId, params.fileContextId, params.chatId), params.signal);
78
+ }
79
+ }
80
+ function toUploadBlob(file, contentType) {
81
+ const options = contentType === undefined ? undefined : { type: contentType };
82
+ if (file instanceof Blob) {
83
+ return contentType === undefined || file.type === contentType ? file : new Blob([file], options);
84
+ }
85
+ if (file instanceof ArrayBuffer) {
86
+ return new Blob([file], options);
87
+ }
88
+ const bytes = new Uint8Array(file.byteLength);
89
+ bytes.set(file);
90
+ return new Blob([bytes.buffer], options);
91
+ }
92
+ function compactBody(input) {
93
+ return Object.fromEntries(Object.entries(input).filter(([, value]) => value !== undefined));
94
+ }
95
+ function assertServerEnvironment() {
96
+ const globalObject = globalThis;
97
+ if (globalObject.window !== undefined && globalObject.document !== undefined) {
98
+ throw new Error("@skyforge-ai/sdk is server-only and cannot run in a browser.");
99
+ }
100
+ }
101
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ export interface SkyforgeApiErrorOptions {
2
+ method: string;
3
+ url: string;
4
+ status: number;
5
+ statusText: string;
6
+ requestId?: string;
7
+ responseBody?: unknown;
8
+ responseText?: string;
9
+ }
10
+ export declare class SkyforgeApiError extends Error {
11
+ readonly method: string;
12
+ readonly url: string;
13
+ readonly status: number;
14
+ readonly statusText: string;
15
+ readonly requestId?: string;
16
+ readonly responseBody?: unknown;
17
+ readonly responseText?: string;
18
+ constructor(message: string, options: SkyforgeApiErrorOptions);
19
+ }
20
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,uBAAuB;IACtC,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,qBAAa,gBAAiB,SAAQ,KAAK;IACzC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,YAAY,CAAC,EAAE,OAAO,CAAC;IAChC,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;gBAEnB,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,uBAAuB;CAW9D"}
package/dist/errors.js ADDED
@@ -0,0 +1,21 @@
1
+ export class SkyforgeApiError extends Error {
2
+ method;
3
+ url;
4
+ status;
5
+ statusText;
6
+ requestId;
7
+ responseBody;
8
+ responseText;
9
+ constructor(message, options) {
10
+ super(message);
11
+ this.name = "SkyforgeApiError";
12
+ this.method = options.method;
13
+ this.url = options.url;
14
+ this.status = options.status;
15
+ this.statusText = options.statusText;
16
+ this.requestId = options.requestId;
17
+ this.responseBody = options.responseBody;
18
+ this.responseText = options.responseText;
19
+ }
20
+ }
21
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAUA,MAAM,OAAO,gBAAiB,SAAQ,KAAK;IAChC,MAAM,CAAS;IACf,GAAG,CAAS;IACZ,MAAM,CAAS;IACf,UAAU,CAAS;IACnB,SAAS,CAAU;IACnB,YAAY,CAAW;IACvB,YAAY,CAAU;IAE/B,YAAY,OAAe,EAAE,OAAgC;QAC3D,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,kBAAkB,CAAC;QAC/B,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;QAC7B,IAAI,CAAC,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC;QACvB,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;QAC7B,IAAI,CAAC,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC;QACrC,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC;QACnC,IAAI,CAAC,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC;QACzC,IAAI,CAAC,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC;IAC3C,CAAC;CACF"}
package/dist/http.d.ts ADDED
@@ -0,0 +1,19 @@
1
+ import type { SkyforgeFetch } from "./types.js";
2
+ export interface HttpClientOptions {
3
+ apiKey: string;
4
+ fetch: SkyforgeFetch;
5
+ }
6
+ export declare class HttpClient {
7
+ private readonly apiKey;
8
+ private readonly fetchFn;
9
+ constructor(options: HttpClientOptions);
10
+ getJson<T>(url: string, signal?: AbortSignal): Promise<T>;
11
+ postJson<T>(url: string, body: unknown, signal?: AbortSignal): Promise<T>;
12
+ deleteJson<T>(url: string, signal?: AbortSignal): Promise<T>;
13
+ postForm<T>(url: string, body: FormData, signal?: AbortSignal): Promise<T>;
14
+ stream(url: string, signal?: AbortSignal): Promise<Response>;
15
+ private requestJson;
16
+ private authHeaders;
17
+ }
18
+ export declare function throwIfError(response: Response, method: string, url: string): Promise<void>;
19
+ //# sourceMappingURL=http.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../src/http.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAA2B,MAAM,YAAY,CAAC;AAEzE,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,aAAa,CAAC;CACtB;AAED,qBAAa,UAAU;IACrB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAgB;gBAE5B,OAAO,EAAE,iBAAiB;IAKhC,OAAO,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,CAAC,CAAC;IAIzD,QAAQ,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,CAAC,CAAC;IAIzE,UAAU,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,CAAC,CAAC;IAI5D,QAAQ,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,CAAC,CAAC;IAU1E,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,QAAQ,CAAC;YAUpD,WAAW;IAqBzB,OAAO,CAAC,WAAW;CAMpB;AAkBD,wBAAsB,YAAY,CAChC,QAAQ,EAAE,QAAQ,EAClB,MAAM,EAAE,MAAM,EACd,GAAG,EAAE,MAAM,GACV,OAAO,CAAC,IAAI,CAAC,CAOf"}
package/dist/http.js ADDED
@@ -0,0 +1,129 @@
1
+ import { SkyforgeApiError } from "./errors.js";
2
+ export class HttpClient {
3
+ apiKey;
4
+ fetchFn;
5
+ constructor(options) {
6
+ this.apiKey = options.apiKey;
7
+ this.fetchFn = options.fetch;
8
+ }
9
+ async getJson(url, signal) {
10
+ return this.requestJson("GET", url, undefined, signal);
11
+ }
12
+ async postJson(url, body, signal) {
13
+ return this.requestJson("POST", url, JSON.stringify(body), signal);
14
+ }
15
+ async deleteJson(url, signal) {
16
+ return this.requestJson("DELETE", url, undefined, signal);
17
+ }
18
+ async postForm(url, body, signal) {
19
+ const response = await this.fetchFn(url, {
20
+ method: "POST",
21
+ headers: this.authHeaders("application/json"),
22
+ body,
23
+ signal,
24
+ });
25
+ return parseJsonEnvelopeResponse(response, "POST", url);
26
+ }
27
+ async stream(url, signal) {
28
+ const response = await this.fetchFn(url, {
29
+ method: "GET",
30
+ headers: this.authHeaders("text/event-stream"),
31
+ signal,
32
+ });
33
+ await throwIfError(response, "GET", url);
34
+ return response;
35
+ }
36
+ async requestJson(method, url, body, signal) {
37
+ const headers = this.authHeaders("application/json");
38
+ if (body !== undefined) {
39
+ headers["Content-Type"] = "application/json";
40
+ }
41
+ const response = await this.fetchFn(url, {
42
+ method,
43
+ headers,
44
+ body,
45
+ signal,
46
+ });
47
+ return parseJsonEnvelopeResponse(response, method, url);
48
+ }
49
+ authHeaders(accept) {
50
+ return {
51
+ Authorization: `Bearer ${this.apiKey}`,
52
+ Accept: accept,
53
+ };
54
+ }
55
+ }
56
+ async function parseJsonEnvelopeResponse(response, method, url) {
57
+ const text = await response.text();
58
+ const parsed = parseJson(text);
59
+ if (!response.ok) {
60
+ throw apiErrorFromResponse(response, method, url, text, parsed);
61
+ }
62
+ const envelope = parsed;
63
+ return envelope?.data;
64
+ }
65
+ export async function throwIfError(response, method, url) {
66
+ if (response.ok) {
67
+ return;
68
+ }
69
+ const text = await response.text();
70
+ throw apiErrorFromResponse(response, method, url, text, parseJson(text));
71
+ }
72
+ function apiErrorFromResponse(response, method, url, responseText, responseBody) {
73
+ return new SkyforgeApiError(errorMessage(response, responseText, responseBody), {
74
+ method,
75
+ url,
76
+ status: response.status,
77
+ statusText: response.statusText,
78
+ requestId: requestId(response.headers),
79
+ responseBody,
80
+ responseText,
81
+ });
82
+ }
83
+ function parseJson(text) {
84
+ if (text.trim().length === 0) {
85
+ return undefined;
86
+ }
87
+ try {
88
+ return JSON.parse(text);
89
+ }
90
+ catch {
91
+ return undefined;
92
+ }
93
+ }
94
+ function errorMessage(response, responseText, responseBody) {
95
+ if (isRecord(responseBody)) {
96
+ const message = stringField(responseBody, "message");
97
+ if (message !== undefined) {
98
+ return message;
99
+ }
100
+ const error = responseBody.error;
101
+ if (typeof error === "string") {
102
+ return error;
103
+ }
104
+ if (isRecord(error)) {
105
+ const nestedMessage = stringField(error, "message") ?? stringField(error, "error");
106
+ if (nestedMessage !== undefined) {
107
+ return nestedMessage;
108
+ }
109
+ }
110
+ }
111
+ if (responseText.trim().length > 0) {
112
+ return responseText;
113
+ }
114
+ return response.statusText || `Skyforge request failed with status ${response.status}`;
115
+ }
116
+ function requestId(headers) {
117
+ return (headers.get("x-request-id") ??
118
+ headers.get("x-skyforge-request-id") ??
119
+ headers.get("x-correlation-id") ??
120
+ undefined);
121
+ }
122
+ function isRecord(value) {
123
+ return typeof value === "object" && value !== null && !Array.isArray(value);
124
+ }
125
+ function stringField(record, key) {
126
+ const value = record[key];
127
+ return typeof value === "string" ? value : undefined;
128
+ }
129
+ //# sourceMappingURL=http.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http.js","sourceRoot":"","sources":["../src/http.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ export { SkyforgeClient } from "./client.js";
2
+ export { SkyforgeApiError } from "./errors.js";
3
+ export { joinSkyforgeApiPath } from "./routes.js";
4
+ export type { DeleteUploadedFileParams, GetAgentBranchStateParams, HumanActionRequestDto, JsonObject, JsonValue, ListUploadedFilesParams, SendMessageParams, SkyforgeAgentRunEventEnvelope, SkyforgeChatMessageDto, SkyforgeChatMessageResponse, SkyforgeChatStateResponse, SkyforgeChatUploadedFileContextDto, SkyforgeChatUploadedFileListResponse, SkyforgeChatUploadedFileUploadResponse, SkyforgeClientOptions, SkyforgeFetch, StreamAgentRunEventsParams, SubmitHumanActionParams, UploadFileParams, } from "./types.js";
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAClD,YAAY,EACV,wBAAwB,EACxB,yBAAyB,EACzB,qBAAqB,EACrB,UAAU,EACV,SAAS,EACT,uBAAuB,EACvB,iBAAiB,EACjB,6BAA6B,EAC7B,sBAAsB,EACtB,2BAA2B,EAC3B,yBAAyB,EACzB,kCAAkC,EAClC,oCAAoC,EACpC,sCAAsC,EACtC,qBAAqB,EACrB,aAAa,EACb,0BAA0B,EAC1B,uBAAuB,EACvB,gBAAgB,GACjB,MAAM,YAAY,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,4 @@
1
+ export { SkyforgeClient } from "./client.js";
2
+ export { SkyforgeApiError } from "./errors.js";
3
+ export { joinSkyforgeApiPath } from "./routes.js";
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC"}
@@ -0,0 +1,8 @@
1
+ export declare function joinSkyforgeApiPath(apiBaseUrl: string, path: string): string;
2
+ export declare function chatStateUrl(apiBaseUrl: string, agentBranchId: string, chatId?: string): string;
3
+ export declare function sendMessageUrl(apiBaseUrl: string, agentBranchId: string): string;
4
+ export declare function humanActionSubmitUrl(apiBaseUrl: string, humanActionRequestId: string): string;
5
+ export declare function runEventStreamUrl(apiBaseUrl: string, agentRunId: string, afterSequence?: number): string;
6
+ export declare function uploadedFilesUrl(apiBaseUrl: string, agentBranchId: string, chatId?: string): string;
7
+ export declare function uploadedFileDeleteUrl(apiBaseUrl: string, agentBranchId: string, fileContextId: string, chatId: string): string;
8
+ //# sourceMappingURL=routes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"routes.d.ts","sourceRoot":"","sources":["../src/routes.ts"],"names":[],"mappings":"AAIA,wBAAgB,mBAAmB,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAa5E;AAUD,wBAAgB,YAAY,CAC1B,UAAU,EAAE,MAAM,EAClB,aAAa,EAAE,MAAM,EACrB,MAAM,CAAC,EAAE,MAAM,GACd,MAAM,CAQR;AAED,wBAAgB,cAAc,CAAC,UAAU,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,MAAM,CAKhF;AAED,wBAAgB,oBAAoB,CAClC,UAAU,EAAE,MAAM,EAClB,oBAAoB,EAAE,MAAM,GAC3B,MAAM,CAKR;AAED,wBAAgB,iBAAiB,CAC/B,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,MAAM,EAClB,aAAa,CAAC,EAAE,MAAM,GACrB,MAAM,CAQR;AAED,wBAAgB,gBAAgB,CAC9B,UAAU,EAAE,MAAM,EAClB,aAAa,EAAE,MAAM,EACrB,MAAM,CAAC,EAAE,MAAM,GACd,MAAM,CAQR;AAED,wBAAgB,qBAAqB,CACnC,UAAU,EAAE,MAAM,EAClB,aAAa,EAAE,MAAM,EACrB,aAAa,EAAE,MAAM,EACrB,MAAM,EAAE,MAAM,GACb,MAAM,CAQR"}
package/dist/routes.js ADDED
@@ -0,0 +1,41 @@
1
+ function normalizePath(path) {
2
+ return path.startsWith("/") ? path : `/${path}`;
3
+ }
4
+ export function joinSkyforgeApiPath(apiBaseUrl, path) {
5
+ const base = apiBaseUrl.replace(/\/+$/, "");
6
+ let normalizedPath = normalizePath(path);
7
+ if (base.endsWith("/api")) {
8
+ if (normalizedPath.startsWith("/api/")) {
9
+ normalizedPath = normalizedPath.slice("/api".length);
10
+ }
11
+ else if (normalizedPath === "/api") {
12
+ normalizedPath = "";
13
+ }
14
+ }
15
+ return base.length === 0 ? normalizedPath : `${base}${normalizedPath}`;
16
+ }
17
+ function appendQuery(url, query) {
18
+ const parts = Object.entries(query)
19
+ .filter(([, value]) => value !== undefined)
20
+ .map(([key, value]) => `${encodeURIComponent(key)}=${encodeURIComponent(String(value))}`);
21
+ return parts.length === 0 ? url : `${url}?${parts.join("&")}`;
22
+ }
23
+ export function chatStateUrl(apiBaseUrl, agentBranchId, chatId) {
24
+ return appendQuery(joinSkyforgeApiPath(apiBaseUrl, `/api/skyforge-chat/agent_branches/${encodeURIComponent(agentBranchId)}/state`), { chat_id: chatId });
25
+ }
26
+ export function sendMessageUrl(apiBaseUrl, agentBranchId) {
27
+ return joinSkyforgeApiPath(apiBaseUrl, `/api/skyforge-chat/agent_branches/${encodeURIComponent(agentBranchId)}/messages`);
28
+ }
29
+ export function humanActionSubmitUrl(apiBaseUrl, humanActionRequestId) {
30
+ return joinSkyforgeApiPath(apiBaseUrl, `/api/skyforge-chat/human-actions/${encodeURIComponent(humanActionRequestId)}/submit`);
31
+ }
32
+ export function runEventStreamUrl(apiBaseUrl, agentRunId, afterSequence) {
33
+ return appendQuery(joinSkyforgeApiPath(apiBaseUrl, `/api/skyforge-chat/agent_runs/${encodeURIComponent(agentRunId)}/events`), { after_sequence: afterSequence });
34
+ }
35
+ export function uploadedFilesUrl(apiBaseUrl, agentBranchId, chatId) {
36
+ return appendQuery(joinSkyforgeApiPath(apiBaseUrl, `/api/skyforge-chat/agent_branches/${encodeURIComponent(agentBranchId)}/uploaded-files`), { chat_id: chatId });
37
+ }
38
+ export function uploadedFileDeleteUrl(apiBaseUrl, agentBranchId, fileContextId, chatId) {
39
+ return appendQuery(joinSkyforgeApiPath(apiBaseUrl, `/api/skyforge-chat/agent_branches/${encodeURIComponent(agentBranchId)}/uploaded-files/${encodeURIComponent(fileContextId)}`), { chat_id: chatId });
40
+ }
41
+ //# sourceMappingURL=routes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"routes.js","sourceRoot":"","sources":["../src/routes.ts"],"names":[],"mappings":"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"}
package/dist/sse.d.ts ADDED
@@ -0,0 +1,3 @@
1
+ import type { SkyforgeAgentRunEventEnvelope } from "./types.js";
2
+ export declare function parseSkyforgeEventStream(body: ReadableStream<Uint8Array> | null): AsyncIterable<SkyforgeAgentRunEventEnvelope>;
3
+ //# sourceMappingURL=sse.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sse.d.ts","sourceRoot":"","sources":["../src/sse.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,6BAA6B,EAAE,MAAM,YAAY,CAAC;AAEhE,wBAAuB,wBAAwB,CAC7C,IAAI,EAAE,cAAc,CAAC,UAAU,CAAC,GAAG,IAAI,GACtC,aAAa,CAAC,6BAA6B,CAAC,CA2C9C"}
package/dist/sse.js ADDED
@@ -0,0 +1,57 @@
1
+ export async function* parseSkyforgeEventStream(body) {
2
+ if (body === null) {
3
+ return;
4
+ }
5
+ const reader = body.getReader();
6
+ const decoder = new TextDecoder();
7
+ let buffer = "";
8
+ let streamCompleted = false;
9
+ try {
10
+ while (true) {
11
+ const { value, done } = await reader.read();
12
+ if (done) {
13
+ streamCompleted = true;
14
+ break;
15
+ }
16
+ buffer += decoder.decode(value, { stream: true });
17
+ const events = drainEvents(buffer);
18
+ buffer = events.remainder;
19
+ for (const event of events.blocks) {
20
+ const parsed = parseEventBlock(event);
21
+ if (parsed !== undefined) {
22
+ yield parsed;
23
+ }
24
+ }
25
+ }
26
+ buffer += decoder.decode();
27
+ if (buffer.trim().length > 0) {
28
+ const parsed = parseEventBlock(buffer);
29
+ if (parsed !== undefined) {
30
+ yield parsed;
31
+ }
32
+ }
33
+ }
34
+ finally {
35
+ if (!streamCompleted) {
36
+ await reader.cancel().catch(() => undefined);
37
+ }
38
+ reader.releaseLock();
39
+ }
40
+ }
41
+ function drainEvents(buffer) {
42
+ const normalized = buffer.replace(/\r\n/g, "\n");
43
+ const parts = normalized.split("\n\n");
44
+ const remainder = parts.pop() ?? "";
45
+ return { blocks: parts, remainder };
46
+ }
47
+ function parseEventBlock(block) {
48
+ const dataLines = block
49
+ .split("\n")
50
+ .filter((line) => line.startsWith("data:"))
51
+ .map((line) => line.slice("data:".length).trimStart());
52
+ if (dataLines.length === 0) {
53
+ return undefined;
54
+ }
55
+ return JSON.parse(dataLines.join("\n"));
56
+ }
57
+ //# sourceMappingURL=sse.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sse.js","sourceRoot":"","sources":["../src/sse.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,KAAK,SAAS,CAAC,CAAC,wBAAwB,CAC7C,IAAuC;IAEvC,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;QAClB,OAAO;IACT,CAAC;IAED,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC;IAChC,MAAM,OAAO,GAAG,IAAI,WAAW,EAAE,CAAC;IAClC,IAAI,MAAM,GAAG,EAAE,CAAC;IAChB,IAAI,eAAe,GAAG,KAAK,CAAC;IAE5B,IAAI,CAAC;QACH,OAAO,IAAI,EAAE,CAAC;YACZ,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;YAC5C,IAAI,IAAI,EAAE,CAAC;gBACT,eAAe,GAAG,IAAI,CAAC;gBACvB,MAAM;YACR,CAAC;YAED,MAAM,IAAI,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;YAClD,MAAM,MAAM,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC;YACnC,MAAM,GAAG,MAAM,CAAC,SAAS,CAAC;YAE1B,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;gBAClC,MAAM,MAAM,GAAG,eAAe,CAAC,KAAK,CAAC,CAAC;gBACtC,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;oBACzB,MAAM,MAAM,CAAC;gBACf,CAAC;YACH,CAAC;QACH,CAAC;QAED,MAAM,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;QAC3B,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC7B,MAAM,MAAM,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC;YACvC,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;gBACzB,MAAM,MAAM,CAAC;YACf,CAAC;QACH,CAAC;IACH,CAAC;YAAS,CAAC;QACT,IAAI,CAAC,eAAe,EAAE,CAAC;YACrB,MAAM,MAAM,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;QAC/C,CAAC;QACD,MAAM,CAAC,WAAW,EAAE,CAAC;IACvB,CAAC;AACH,CAAC;AAED,SAAS,WAAW,CAAC,MAAc;IACjC,MAAM,UAAU,GAAG,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IACjD,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IACvC,MAAM,SAAS,GAAG,KAAK,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC;IACpC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;AACtC,CAAC;AAED,SAAS,eAAe,CAAC,KAAa;IACpC,MAAM,SAAS,GAAG,KAAK;SACpB,KAAK,CAAC,IAAI,CAAC;SACX,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;SAC1C,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC;IAEzD,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC3B,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,OAAO,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAkC,CAAC;AAC3E,CAAC"}
@@ -0,0 +1,160 @@
1
+ export type JsonPrimitive = string | number | boolean | null;
2
+ export type JsonValue = JsonPrimitive | JsonObject | JsonValue[];
3
+ export interface JsonObject {
4
+ [key: string]: JsonValue;
5
+ }
6
+ export interface SkyforgeClientOptions {
7
+ apiKey: string;
8
+ baseUrl?: string;
9
+ fetch?: SkyforgeFetch;
10
+ }
11
+ export type SkyforgeFetch = (input: string | URL | Request, init?: RequestInit) => Promise<Response>;
12
+ export interface RequestOptions {
13
+ signal?: AbortSignal;
14
+ }
15
+ export interface GetAgentBranchStateParams extends RequestOptions {
16
+ agentBranchId: string;
17
+ chatId?: string;
18
+ }
19
+ export interface SkyforgeChatRetrievalScopeRequest {
20
+ context_ids?: string[];
21
+ context_release_ids?: string[];
22
+ }
23
+ export interface SendMessageParams extends RequestOptions {
24
+ agentBranchId: string;
25
+ message: string;
26
+ chatId?: string;
27
+ retriedFromAgentRunId?: string;
28
+ sourceUserMessageId?: string;
29
+ structuredContext?: JsonObject;
30
+ retrievalScope?: SkyforgeChatRetrievalScopeRequest;
31
+ }
32
+ export interface StreamAgentRunEventsParams extends RequestOptions {
33
+ agentRunId: string;
34
+ afterSequence?: number;
35
+ }
36
+ export interface SubmitHumanActionParams extends RequestOptions {
37
+ humanActionRequestId: string;
38
+ values: JsonValue;
39
+ }
40
+ export interface ListUploadedFilesParams extends RequestOptions {
41
+ agentBranchId: string;
42
+ chatId: string;
43
+ }
44
+ export type UploadFileBody = Blob | ArrayBuffer | Uint8Array;
45
+ export interface UploadFileParams extends RequestOptions {
46
+ agentBranchId: string;
47
+ chatId?: string;
48
+ file: UploadFileBody;
49
+ filename: string;
50
+ contentType?: string;
51
+ }
52
+ export interface DeleteUploadedFileParams extends RequestOptions {
53
+ agentBranchId: string;
54
+ fileContextId: string;
55
+ chatId: string;
56
+ }
57
+ export interface SkyforgeSuccessResponse<T> {
58
+ message: string;
59
+ data?: T | null;
60
+ }
61
+ export type AgentRuntimeMode = "turn_based" | "run_based" | string;
62
+ export type SkyforgeChatMessageRole = "assistant" | "user" | "system" | "tool" | "error" | string;
63
+ export interface SkyforgeChatMessageDto {
64
+ id: string;
65
+ role: SkyforgeChatMessageRole;
66
+ content: string;
67
+ relevant_chunks?: string | null;
68
+ external_tool_call_id?: string | null;
69
+ group_id?: string | null;
70
+ is_displayable?: boolean;
71
+ agent_run_id?: string | null;
72
+ [key: string]: unknown;
73
+ }
74
+ export interface HumanActionRequestDto {
75
+ id: string;
76
+ kind?: string;
77
+ agent_run_id?: string;
78
+ chat_id?: string;
79
+ source_agent_run_id?: string;
80
+ source_chat_id?: string;
81
+ visible_chat_id?: string | null;
82
+ waiting_parent_agent_run_id?: string | null;
83
+ source_agent_name?: string | null;
84
+ source_agent_branch_name?: string | null;
85
+ is_bubbled?: boolean;
86
+ tool_call_id: string;
87
+ tool_name: string;
88
+ tool_arguments?: JsonValue;
89
+ bubbled_parent_tool_call_metadata?: JsonValue | null;
90
+ title?: string | null;
91
+ description?: string | null;
92
+ submit_label?: string | null;
93
+ form_schema: JsonValue;
94
+ status: string;
95
+ created_at: string;
96
+ [key: string]: unknown;
97
+ }
98
+ export interface SkyforgeChatStateResponse {
99
+ agent_branch_id: string;
100
+ runtime_mode: AgentRuntimeMode;
101
+ chat_id?: string | null;
102
+ can_send_messages: boolean;
103
+ start_message?: string | null;
104
+ messages: SkyforgeChatMessageDto[];
105
+ latest_agent_run_id?: string | null;
106
+ agent_title?: string | null;
107
+ agent_subtitle?: string | null;
108
+ pending_human_actions?: HumanActionRequestDto[];
109
+ [key: string]: unknown;
110
+ }
111
+ export interface SkyforgeChatMessageResponse {
112
+ runtime_mode: AgentRuntimeMode;
113
+ chat_id: string;
114
+ chat_title?: string | null;
115
+ agent_run_id?: string | null;
116
+ source_user_message_id?: string | null;
117
+ retried_from_agent_run_id?: string | null;
118
+ messages: SkyforgeChatMessageDto[];
119
+ pending_human_actions?: HumanActionRequestDto[];
120
+ terminal: boolean;
121
+ [key: string]: unknown;
122
+ }
123
+ export interface SkyforgeChatUploadedFileContextDto {
124
+ id: string;
125
+ chat_id: string;
126
+ agent_branch_id: string;
127
+ filename: string;
128
+ content_type?: string | null;
129
+ file_size_bytes: number;
130
+ file_type: string;
131
+ extracted_char_count: number;
132
+ status: string;
133
+ prompt_char_count?: number | null;
134
+ prompt_truncated?: boolean;
135
+ created_at: string;
136
+ expires_at: string;
137
+ [key: string]: unknown;
138
+ }
139
+ export interface SkyforgeChatUploadedFileListResponse {
140
+ files: SkyforgeChatUploadedFileContextDto[];
141
+ }
142
+ export interface SkyforgeChatUploadedFileUploadResponse {
143
+ chat_id: string;
144
+ file: SkyforgeChatUploadedFileContextDto;
145
+ preview_text?: string | null;
146
+ }
147
+ export interface SkyforgeAgentRunEventStep {
148
+ id: string;
149
+ name: string;
150
+ }
151
+ export interface SkyforgeAgentRunEventEnvelope {
152
+ event_id: string;
153
+ agent_run_id: string;
154
+ sequence: number;
155
+ occurred_at: string;
156
+ step?: SkyforgeAgentRunEventStep | null;
157
+ event: JsonObject;
158
+ [key: string]: unknown;
159
+ }
160
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
package/dist/types.js ADDED
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
package/package.json ADDED
@@ -0,0 +1,32 @@
1
+ {
2
+ "name": "@runmark/sdk",
3
+ "version": "0.1.0",
4
+ "description": "Server-side SDK for agent chat routes.",
5
+ "type": "module",
6
+ "license": "MIT",
7
+ "private": false,
8
+ "engines": {
9
+ "node": ">=24.17.0"
10
+ },
11
+ "exports": {
12
+ ".": {
13
+ "types": "./dist/index.d.ts",
14
+ "import": "./dist/index.js"
15
+ }
16
+ },
17
+ "types": "./dist/index.d.ts",
18
+ "files": [
19
+ "dist"
20
+ ],
21
+ "scripts": {
22
+ "build": "tsc -p tsconfig.build.json",
23
+ "test": "npm run build && node --test test/*.test.mjs",
24
+ "test:live": "npm run build && node --test test/live/*.live.test.mjs",
25
+ "test:live:hitl-bubbling-demo": "node test/live/run-hitl-bubbling-demo.mjs"
26
+ },
27
+ "dependencies": {},
28
+ "devDependencies": {
29
+ "@types/node": "^24.0.0",
30
+ "typescript": "^5.7.2"
31
+ }
32
+ }