@parall/daemon 1.56.0 → 1.56.2

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.
@@ -225,6 +225,8 @@ var init_constants = __esm({
225
225
  // Users
226
226
  USERS_ME: `${API_BASE}/users/me`,
227
227
  USER_AVATAR: `${API_BASE}/users/me/avatar`,
228
+ PERSONAL_API_KEYS: `${API_BASE}/users/me/api-keys`,
229
+ PERSONAL_API_KEY: (keyId) => `${API_BASE}/users/me/api-keys/${keyId}`,
228
230
  USER: (id) => `${API_BASE}/users/${id}`,
229
231
  // WebSocket ticket
230
232
  WS_TICKET: `${API_BASE}/ws/ticket`,
@@ -1061,14 +1063,110 @@ var init_attachment_client = __esm({
1061
1063
  }
1062
1064
  });
1063
1065
 
1064
- // ts/sdk/dist/client.js
1066
+ // ts/sdk/dist/wiki-upload.js
1067
+ function createWikiUploadFormData(params) {
1068
+ const form = new FormData();
1069
+ form.append("path", params.path);
1070
+ form.append("file", params.file);
1071
+ if (params.message)
1072
+ form.append("message", params.message);
1073
+ if (params.uploadId)
1074
+ form.append("upload_id", params.uploadId);
1075
+ if (params.conflict)
1076
+ form.append("conflict", params.conflict);
1077
+ if ("contentRoute" in params && params.contentRoute) {
1078
+ form.append("content_route", params.contentRoute);
1079
+ }
1080
+ return form;
1081
+ }
1082
+ function sendMultipartRequest(options) {
1083
+ if (options.onProgress && typeof XMLHttpRequest !== "undefined") {
1084
+ return multipartXHR(options, options.onProgress);
1085
+ }
1086
+ const timeoutSignal = AbortSignal.timeout(options.timeoutMs);
1087
+ const signal = options.signal ? AbortSignal.any([options.signal, timeoutSignal]) : timeoutSignal;
1088
+ return fetch(options.url, {
1089
+ method: options.method,
1090
+ headers: options.headers,
1091
+ body: options.body,
1092
+ signal
1093
+ });
1094
+ }
1095
+ function multipartXHR(options, onProgress) {
1096
+ return new Promise((resolve9, reject) => {
1097
+ const xhr = new XMLHttpRequest();
1098
+ let settled = false;
1099
+ const finish = (fn) => {
1100
+ if (settled)
1101
+ return;
1102
+ settled = true;
1103
+ options.signal?.removeEventListener("abort", abortFromSignal);
1104
+ fn();
1105
+ };
1106
+ const abortFromSignal = () => xhr.abort();
1107
+ xhr.open(options.method, options.url, true);
1108
+ xhr.timeout = options.timeoutMs;
1109
+ for (const [name, value] of Object.entries(options.headers)) {
1110
+ xhr.setRequestHeader(name, value);
1111
+ }
1112
+ xhr.upload.onprogress = (event) => {
1113
+ try {
1114
+ onProgress(event.loaded, event.lengthComputable ? event.total : 0);
1115
+ } catch {
1116
+ }
1117
+ };
1118
+ xhr.onload = () => finish(() => {
1119
+ const responseHeaders = new Headers();
1120
+ for (const line of xhr.getAllResponseHeaders().trim().split(/[\r\n]+/)) {
1121
+ if (!line)
1122
+ continue;
1123
+ const separator = line.indexOf(":");
1124
+ if (separator > 0) {
1125
+ responseHeaders.append(line.slice(0, separator).trim(), line.slice(separator + 1).trim());
1126
+ }
1127
+ }
1128
+ const responseBody = xhr.status === 204 || xhr.responseText === "" ? null : xhr.responseText;
1129
+ resolve9(new Response(responseBody, {
1130
+ status: xhr.status,
1131
+ statusText: xhr.statusText,
1132
+ headers: responseHeaders
1133
+ }));
1134
+ });
1135
+ xhr.onerror = () => finish(() => reject(new TypeError("Network request failed")));
1136
+ xhr.ontimeout = () => finish(() => reject(new DOMException("Request timed out", "TimeoutError")));
1137
+ xhr.onabort = () => finish(() => reject(new DOMException("Request aborted", "AbortError")));
1138
+ if (options.signal?.aborted) {
1139
+ finish(() => reject(new DOMException("Request aborted", "AbortError")));
1140
+ return;
1141
+ }
1142
+ options.signal?.addEventListener("abort", abortFromSignal, { once: true });
1143
+ xhr.send(options.body);
1144
+ });
1145
+ }
1146
+ var init_wiki_upload = __esm({
1147
+ "ts/sdk/dist/wiki-upload.js"() {
1148
+ "use strict";
1149
+ }
1150
+ });
1151
+
1152
+ // ts/sdk/dist/wiki-changeset.js
1065
1153
  function normalizeWikiChangeset(changeset) {
1066
1154
  return {
1067
1155
  ...changeset,
1156
+ head_branch: changeset.head_branch ?? null,
1157
+ base_commit: changeset.base_commit ?? null,
1158
+ merge_commit: changeset.merge_commit ?? null,
1068
1159
  changed_paths: changeset.changed_paths ?? [],
1069
1160
  file_changes: changeset.file_changes ?? []
1070
1161
  };
1071
1162
  }
1163
+ var init_wiki_changeset = __esm({
1164
+ "ts/sdk/dist/wiki-changeset.js"() {
1165
+ "use strict";
1166
+ }
1167
+ });
1168
+
1169
+ // ts/sdk/dist/client.js
1072
1170
  function buildApiError(res, rawErrorBody) {
1073
1171
  const errorBody = rawErrorBody !== null && typeof rawErrorBody === "object" ? rawErrorBody : {};
1074
1172
  const errorObj = errorBody.error && typeof errorBody.error === "object" ? errorBody.error : void 0;
@@ -1106,6 +1204,8 @@ var init_client = __esm({
1106
1204
  init_browser_viewer();
1107
1205
  init_constants();
1108
1206
  init_attachment_client();
1207
+ init_wiki_upload();
1208
+ init_wiki_changeset();
1109
1209
  ParallClient = class _ParallClient extends AttachmentClient {
1110
1210
  baseUrl;
1111
1211
  wikiBaseUrl;
@@ -1310,23 +1410,27 @@ var init_client = __esm({
1310
1410
  * Multipart upload variant of `request`. Same auth / refresh / error
1311
1411
  * handling, but lets the caller hand us a prepared `FormData` (file +
1312
1412
  * text fields) and skips the JSON content-type. Used by
1313
- * uploadWikiFile / uploadWikiFileToChangeset — wiki binary uploads can
1413
+ * uploadWikiFile / uploadWikiFileToChangeset — wiki file uploads can
1314
1414
  * hit the 100 MiB cap, so a longer 5-minute timeout is used so a
1315
1415
  * 50 MiB blob on a slow connection doesn't get chopped at 15 s.
1316
1416
  */
1317
- async multipartRequest(method, path23, body, retried = false) {
1417
+ async multipartRequest(method, path23, body, retried = false, opts) {
1318
1418
  if (!retried) {
1319
1419
  await this.ensureFreshToken(path23);
1320
1420
  }
1321
1421
  const { "Content-Type": _drop, ...headers } = this.buildHeaders(path23);
1322
1422
  void _drop;
1423
+ const timeoutMs = opts?.timeoutMs ?? 5 * 60 * 1e3;
1323
1424
  let res;
1324
1425
  try {
1325
- res = await fetch(`${this.baseUrlFor(path23)}${path23}`, {
1426
+ res = await sendMultipartRequest({
1326
1427
  method,
1428
+ url: `${this.baseUrlFor(path23)}${path23}`,
1327
1429
  headers,
1328
1430
  body,
1329
- signal: AbortSignal.timeout(5 * 60 * 1e3)
1431
+ timeoutMs,
1432
+ signal: opts?.signal,
1433
+ onProgress: opts?.onProgress
1330
1434
  });
1331
1435
  } catch (err) {
1332
1436
  throw _ParallClient.normalizeFetchError(err);
@@ -1337,7 +1441,7 @@ var init_client = __esm({
1337
1441
  if (!retried && !isAuthPath && this.getRefreshToken) {
1338
1442
  const refreshed = await this.tryRefresh();
1339
1443
  if (refreshed) {
1340
- return this.multipartRequest(method, path23, body, true);
1444
+ return this.multipartRequest(method, path23, body, true, opts);
1341
1445
  }
1342
1446
  }
1343
1447
  if (this.onTokenExpired && !isAuthPath) {
@@ -1416,6 +1520,18 @@ var init_client = __esm({
1416
1520
  async deleteAvatar() {
1417
1521
  return this.request("DELETE", ENDPOINTS.USER_AVATAR);
1418
1522
  }
1523
+ // ---- Personal API keys (org-scoped; JWT session required) ----
1524
+ /** Mints an org-scoped personal API key. The plaintext is returned once and never again. */
1525
+ async createPersonalApiKey(req) {
1526
+ return this.request("POST", ENDPOINTS.PERSONAL_API_KEYS, req);
1527
+ }
1528
+ async listPersonalApiKeys() {
1529
+ const res = await this.request("GET", ENDPOINTS.PERSONAL_API_KEYS);
1530
+ return res.data;
1531
+ }
1532
+ async revokePersonalApiKey(keyId) {
1533
+ return this.request("DELETE", ENDPOINTS.PERSONAL_API_KEY(keyId));
1534
+ }
1419
1535
  async uploadAgentAvatar(orgId, agentId, file) {
1420
1536
  const fd = new FormData();
1421
1537
  fd.append("file", file);
@@ -2634,26 +2750,21 @@ var init_client = __esm({
2634
2750
  * through createWikiChangeset / updateWikiChangeset.
2635
2751
  */
2636
2752
  async uploadWikiFile(orgId, wikiId, params) {
2637
- const fd = new FormData();
2638
- fd.append("path", params.path);
2639
- fd.append("file", params.file);
2640
- if (params.message)
2641
- fd.append("message", params.message);
2642
- return this.multipartRequest("POST", ENDPOINTS.WIKI_UPLOADS(orgId, wikiId), fd);
2753
+ const fd = createWikiUploadFormData(params);
2754
+ return this.multipartRequest("POST", ENDPOINTS.WIKI_UPLOADS(orgId, wikiId), fd, false, {
2755
+ signal: params.signal,
2756
+ onProgress: params.onProgress
2757
+ });
2643
2758
  }
2644
2759
  /**
2645
- * Upload a binary file into a changeset's feature branch (read scope +
2646
- * author-only). Used by reader flow: propose a changeset, attach
2647
- * binary, PATCH markdown that references it. On merge the binary
2648
- * squashes into the default branch.
2760
+ * Upload a file into a changeset's feature branch (read scope +
2761
+ * author-only). The default remains binary-only; contentRoute `auto`
2762
+ * opts into reviewable text for the Web library upload flow. On merge the
2763
+ * branch contents squash into the default branch.
2649
2764
  */
2650
2765
  async uploadWikiFileToChangeset(orgId, wikiId, changesetId, params) {
2651
- const fd = new FormData();
2652
- fd.append("path", params.path);
2653
- fd.append("file", params.file);
2654
- if (params.message)
2655
- fd.append("message", params.message);
2656
- return this.multipartRequest("POST", ENDPOINTS.WIKI_CHANGESET_FILES(orgId, wikiId, changesetId), fd);
2766
+ const fd = createWikiUploadFormData(params);
2767
+ return this.multipartRequest("POST", ENDPOINTS.WIKI_CHANGESET_FILES(orgId, wikiId, changesetId), fd, false, { signal: params.signal, onProgress: params.onProgress });
2657
2768
  }
2658
2769
  /** Remove a binary file from the default branch. Text files must use a
2659
2770
  * changeset delete action. The blob stays reachable via git history. */
@@ -48686,7 +48797,7 @@ var require_headers = __commonJS({
48686
48797
  }
48687
48798
  }
48688
48799
  };
48689
- var Headers = class _Headers {
48800
+ var Headers2 = class _Headers {
48690
48801
  #guard;
48691
48802
  /**
48692
48803
  * @type {HeadersList}
@@ -48827,13 +48938,13 @@ var require_headers = __commonJS({
48827
48938
  target.#headersList = list;
48828
48939
  }
48829
48940
  };
48830
- var { getHeadersGuard, setHeadersGuard, getHeadersList, setHeadersList } = Headers;
48831
- Reflect.deleteProperty(Headers, "getHeadersGuard");
48832
- Reflect.deleteProperty(Headers, "setHeadersGuard");
48833
- Reflect.deleteProperty(Headers, "getHeadersList");
48834
- Reflect.deleteProperty(Headers, "setHeadersList");
48835
- iteratorMixin("Headers", Headers, headersListSortAndCombine, 0, 1);
48836
- Object.defineProperties(Headers.prototype, {
48941
+ var { getHeadersGuard, setHeadersGuard, getHeadersList, setHeadersList } = Headers2;
48942
+ Reflect.deleteProperty(Headers2, "getHeadersGuard");
48943
+ Reflect.deleteProperty(Headers2, "setHeadersGuard");
48944
+ Reflect.deleteProperty(Headers2, "getHeadersList");
48945
+ Reflect.deleteProperty(Headers2, "setHeadersList");
48946
+ iteratorMixin("Headers", Headers2, headersListSortAndCombine, 0, 1);
48947
+ Object.defineProperties(Headers2.prototype, {
48837
48948
  append: kEnumerableProperty,
48838
48949
  delete: kEnumerableProperty,
48839
48950
  get: kEnumerableProperty,
@@ -48851,7 +48962,7 @@ var require_headers = __commonJS({
48851
48962
  webidl.converters.HeadersInit = function(V, prefix, argument) {
48852
48963
  if (webidl.util.Type(V) === webidl.util.Types.OBJECT) {
48853
48964
  const iterator = Reflect.get(V, Symbol.iterator);
48854
- if (!util.types.isProxy(V) && iterator === Headers.prototype.entries) {
48965
+ if (!util.types.isProxy(V) && iterator === Headers2.prototype.entries) {
48855
48966
  try {
48856
48967
  return getHeadersList(V).entriesList;
48857
48968
  } catch {
@@ -48872,7 +48983,7 @@ var require_headers = __commonJS({
48872
48983
  fill,
48873
48984
  // for test.
48874
48985
  compareHeaderName,
48875
- Headers,
48986
+ Headers: Headers2,
48876
48987
  HeadersList,
48877
48988
  getHeadersGuard,
48878
48989
  setHeadersGuard,
@@ -48886,7 +48997,7 @@ var require_headers = __commonJS({
48886
48997
  var require_response = __commonJS({
48887
48998
  "ts/node_modules/.pnpm/undici@7.24.8/node_modules/undici/lib/web/fetch/response.js"(exports2, module2) {
48888
48999
  "use strict";
48889
- var { Headers, HeadersList, fill, getHeadersGuard, setHeadersGuard, setHeadersList } = require_headers();
49000
+ var { Headers: Headers2, HeadersList, fill, getHeadersGuard, setHeadersGuard, setHeadersList } = require_headers();
48890
49001
  var { extractBody, cloneBody, mixinBody, streamRegistry, bodyUnusable } = require_body();
48891
49002
  var util = require_util2();
48892
49003
  var nodeUtil = __require("node:util");
@@ -48908,7 +49019,7 @@ var require_response = __commonJS({
48908
49019
  var assert = __require("node:assert");
48909
49020
  var { isomorphicEncode, serializeJavascriptValueToJSONString } = require_infra();
48910
49021
  var textEncoder = new TextEncoder("utf-8");
48911
- var Response = class _Response {
49022
+ var Response2 = class _Response {
48912
49023
  /** @type {Headers} */
48913
49024
  #headers;
48914
49025
  #state;
@@ -48962,7 +49073,7 @@ var require_response = __commonJS({
48962
49073
  }
48963
49074
  init = webidl.converters.ResponseInit(init);
48964
49075
  this.#state = makeResponse({});
48965
- this.#headers = new Headers(kConstruct);
49076
+ this.#headers = new Headers2(kConstruct);
48966
49077
  setHeadersGuard(this.#headers, "response");
48967
49078
  setHeadersList(this.#headers, this.#state.headersList);
48968
49079
  let bodyWithType = null;
@@ -49080,13 +49191,13 @@ var require_response = __commonJS({
49080
49191
  response.#state = newState;
49081
49192
  }
49082
49193
  };
49083
- var { getResponseHeaders, setResponseHeaders, getResponseState, setResponseState } = Response;
49084
- Reflect.deleteProperty(Response, "getResponseHeaders");
49085
- Reflect.deleteProperty(Response, "setResponseHeaders");
49086
- Reflect.deleteProperty(Response, "getResponseState");
49087
- Reflect.deleteProperty(Response, "setResponseState");
49088
- mixinBody(Response, getResponseState);
49089
- Object.defineProperties(Response.prototype, {
49194
+ var { getResponseHeaders, setResponseHeaders, getResponseState, setResponseState } = Response2;
49195
+ Reflect.deleteProperty(Response2, "getResponseHeaders");
49196
+ Reflect.deleteProperty(Response2, "setResponseHeaders");
49197
+ Reflect.deleteProperty(Response2, "getResponseState");
49198
+ Reflect.deleteProperty(Response2, "setResponseState");
49199
+ mixinBody(Response2, getResponseState);
49200
+ Object.defineProperties(Response2.prototype, {
49090
49201
  type: kEnumerableProperty,
49091
49202
  url: kEnumerableProperty,
49092
49203
  status: kEnumerableProperty,
@@ -49102,7 +49213,7 @@ var require_response = __commonJS({
49102
49213
  configurable: true
49103
49214
  }
49104
49215
  });
49105
- Object.defineProperties(Response, {
49216
+ Object.defineProperties(Response2, {
49106
49217
  json: kEnumerableProperty,
49107
49218
  redirect: kEnumerableProperty,
49108
49219
  error: kEnumerableProperty
@@ -49235,9 +49346,9 @@ var require_response = __commonJS({
49235
49346
  }
49236
49347
  }
49237
49348
  function fromInnerResponse(innerResponse, guard) {
49238
- const response = new Response(kConstruct);
49349
+ const response = new Response2(kConstruct);
49239
49350
  setResponseState(response, innerResponse);
49240
- const headers = new Headers(kConstruct);
49351
+ const headers = new Headers2(kConstruct);
49241
49352
  setResponseHeaders(response, headers);
49242
49353
  setHeadersList(headers, innerResponse.headersList);
49243
49354
  setHeadersGuard(headers, guard);
@@ -49289,14 +49400,14 @@ var require_response = __commonJS({
49289
49400
  converter: webidl.converters.HeadersInit
49290
49401
  }
49291
49402
  ]);
49292
- webidl.is.Response = webidl.util.MakeTypeAssertion(Response);
49403
+ webidl.is.Response = webidl.util.MakeTypeAssertion(Response2);
49293
49404
  module2.exports = {
49294
49405
  isNetworkError,
49295
49406
  makeNetworkError,
49296
49407
  makeResponse,
49297
49408
  makeAppropriateNetworkError,
49298
49409
  filterResponse,
49299
- Response,
49410
+ Response: Response2,
49300
49411
  cloneResponse,
49301
49412
  fromInnerResponse,
49302
49413
  getResponseState
@@ -49309,7 +49420,7 @@ var require_request2 = __commonJS({
49309
49420
  "ts/node_modules/.pnpm/undici@7.24.8/node_modules/undici/lib/web/fetch/request.js"(exports2, module2) {
49310
49421
  "use strict";
49311
49422
  var { extractBody, mixinBody, cloneBody, bodyUnusable } = require_body();
49312
- var { Headers, fill: fillHeaders, HeadersList, setHeadersGuard, getHeadersGuard, setHeadersList, getHeadersList } = require_headers();
49423
+ var { Headers: Headers2, fill: fillHeaders, HeadersList, setHeadersGuard, getHeadersGuard, setHeadersList, getHeadersList } = require_headers();
49313
49424
  var util = require_util2();
49314
49425
  var nodeUtil = __require("node:util");
49315
49426
  var {
@@ -49578,7 +49689,7 @@ var require_request2 = __commonJS({
49578
49689
  requestFinalizer.register(ac, { signal, abort }, abort);
49579
49690
  }
49580
49691
  }
49581
- this.#headers = new Headers(kConstruct);
49692
+ this.#headers = new Headers2(kConstruct);
49582
49693
  setHeadersList(this.#headers, request3.headersList);
49583
49694
  setHeadersGuard(this.#headers, "request");
49584
49695
  if (mode === "no-cors") {
@@ -49919,7 +50030,7 @@ var require_request2 = __commonJS({
49919
50030
  setRequestState(request3, innerRequest);
49920
50031
  setRequestDispatcher(request3, dispatcher);
49921
50032
  setRequestSignal(request3, signal);
49922
- const headers = new Headers(kConstruct);
50033
+ const headers = new Headers2(kConstruct);
49923
50034
  setRequestHeaders(request3, headers);
49924
50035
  setHeadersList(headers, innerRequest.headersList);
49925
50036
  setHeadersGuard(headers, guard);
@@ -52363,8 +52474,8 @@ var require_cookies = __commonJS({
52363
52474
  var { parseSetCookie } = require_parse2();
52364
52475
  var { stringify } = require_util5();
52365
52476
  var { webidl } = require_webidl();
52366
- var { Headers } = require_headers();
52367
- var brandChecks = webidl.brandCheckMultiple([Headers, globalThis.Headers].filter(Boolean));
52477
+ var { Headers: Headers2 } = require_headers();
52478
+ var brandChecks = webidl.brandCheckMultiple([Headers2, globalThis.Headers].filter(Boolean));
52368
52479
  function getCookies(headers) {
52369
52480
  webidl.argumentLengthCheck(arguments, 1, "getCookies");
52370
52481
  brandChecks(headers);
@@ -53105,7 +53216,7 @@ var require_connection = __commonJS({
53105
53216
  var { parseExtensions, isClosed, isClosing, isEstablished, isConnecting, validateCloseCodeAndReason } = require_util6();
53106
53217
  var { makeRequest } = require_request2();
53107
53218
  var { fetching } = require_fetch();
53108
- var { Headers, getHeadersList } = require_headers();
53219
+ var { Headers: Headers2, getHeadersList } = require_headers();
53109
53220
  var { getDecodeSplit } = require_util3();
53110
53221
  var { WebsocketFrameSend } = require_frame();
53111
53222
  var assert = __require("node:assert");
@@ -53127,7 +53238,7 @@ var require_connection = __commonJS({
53127
53238
  useURLCredentials: true
53128
53239
  });
53129
53240
  if (options.headers) {
53130
- const headersList = getHeadersList(new Headers(options.headers));
53241
+ const headersList = getHeadersList(new Headers2(options.headers));
53131
53242
  request3.headersList = headersList;
53132
53243
  }
53133
53244
  const keyValue = crypto2.randomBytes(16).toString("base64");
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@parall/daemon",
3
- "version": "1.56.0",
3
+ "version": "1.56.2",
4
4
  "description": "Parall local agent runtime — daemon supervisor + bridge runtimes, bundled as standalone JS files",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -33,11 +33,11 @@
33
33
  "@aws-sdk/client-s3": "3.984.0",
34
34
  "@pinixai/bb-browser-pro": "0.15.0",
35
35
  "ws": "^8.18.0",
36
- "@parall/agent-core": "1.56.0",
37
- "@parall/sdk": "1.56.0",
38
- "@parall/claude-agent": "1.56.0",
39
- "@parall/codex-agent": "1.56.0",
40
- "@parall/openclaw-agent": "1.56.0"
36
+ "@parall/agent-core": "1.56.2",
37
+ "@parall/claude-agent": "1.56.2",
38
+ "@parall/codex-agent": "1.56.2",
39
+ "@parall/sdk": "1.56.2",
40
+ "@parall/openclaw-agent": "1.56.2"
41
41
  },
42
42
  "devDependencies": {
43
43
  "@types/node": "^22.0.0",