@parall/daemon 1.58.0 → 1.58.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,6 +1,6 @@
1
1
  {
2
- "version": "1.58.0",
3
- "built_at": "2026-08-30T07:17:02.587Z",
2
+ "version": "1.58.1",
3
+ "built_at": "2026-08-31T06:18:26.328Z",
4
4
  "min_node_version": "20.0.0",
5
5
  "files": {
6
6
  "bb-browser-daemon.js": {
@@ -16,29 +16,29 @@
16
16
  "size": 18
17
17
  },
18
18
  "parall-browser-pod.js": {
19
- "sha256": "22cf8a224a89c91256969b5ef462b009af7b23b795e5a90577a44099124c5f6b",
20
- "size": 2971772
19
+ "sha256": "110e15542b7816fed7400a3cb1261d876a534fe756480e7a1a82f33d8bbd95dc",
20
+ "size": 2972173
21
21
  },
22
22
  "parall-channel-exec.js": {
23
23
  "sha256": "7c2a6e12483a45e9eb4a42cd7d4cdd3c4fa21dd09ac1347d9a3e177b4ddee930",
24
24
  "size": 7220
25
25
  },
26
26
  "parall-claude-agent.js": {
27
- "sha256": "024e1c4e47530dc0f7081cd89abd18a726531e09ef4973b8148135e5cd707759",
28
- "size": 2813575
27
+ "sha256": "0ed8b74b056eef72f4b3ff16d5a6278fc480fb80cfe8097ad47322cc04a68cc8",
28
+ "size": 2815581
29
29
  },
30
30
  "parall-codex-agent.js": {
31
- "sha256": "687f07dfa7deb4e90bc6997bb9c0c227c4b2e6379cd194bfbd342d59403c82ae",
32
- "size": 2844057
31
+ "sha256": "40da8f4df4790ff923aaf736aab173b1002585b4117e38bf2448e7bad6abec3c",
32
+ "size": 2844812
33
33
  },
34
34
  "parall-daemon.js": {
35
- "sha256": "351656776702b981df5a0abd35d911088e0acde4fb0738c8288632bf9b85806e",
36
- "size": 3040630
35
+ "sha256": "8395ec40201b0dd60d798113947253c3ccf5d25f210470f6d024e8dbc7220e0c",
36
+ "size": 3041166
37
37
  },
38
38
  "parall-openclaw-agent.js": {
39
39
  "sha256": "856a1c3a9ae0ffef8efe2481fa1171dbeb1d67cccb88616aa9bf16da96a69355",
40
40
  "size": 9923
41
41
  }
42
42
  },
43
- "signature": "x5c625rzvIm7kfd5Re7oFBt5D9ortWxexu0jathft/la7zPAAI6U1Dwwxzt4ptGak2iLz0vSK+uiOUrRyrdbCg=="
43
+ "signature": "M7Lk69BP79NRgmmdwtrMToFKNNCT6D44Oop6alLRJDXW6E66Cw0FCrmGo3fOFlLw7P055GiZ86ygM72OVh+xBw=="
44
44
  }
@@ -63536,6 +63536,18 @@ function attachmentEndpoints(apiBase) {
63536
63536
  };
63537
63537
  }
63538
63538
 
63539
+ // ts/sdk/dist/wechat-endpoints.js
63540
+ function wechatEndpoints(apiBase) {
63541
+ const agentBase = (orgId) => `${apiBase}/orgs/${orgId}/agents/me/wechat`;
63542
+ return {
63543
+ WECHAT_CONTACTS: (orgId) => `${agentBase(orgId)}/contacts`,
63544
+ WECHAT_HISTORY: (orgId) => `${agentBase(orgId)}/history`,
63545
+ WECHAT_MEDIA: (orgId) => `${agentBase(orgId)}/media`,
63546
+ WECHAT_PROFILE: (orgId) => `${agentBase(orgId)}/profile`,
63547
+ WECHAT_STATUS: (orgId) => `${agentBase(orgId)}/status`
63548
+ };
63549
+ }
63550
+
63539
63551
  // ts/sdk/dist/constants.js
63540
63552
  var API_BASE = "/api/v1";
63541
63553
  var WIKI_BASE = "/wiki/v1";
@@ -63789,10 +63801,7 @@ var ENDPOINTS = {
63789
63801
  SLACK_MEMBERS: (orgId) => `${API_BASE}/orgs/${orgId}/agents/me/slack/members`,
63790
63802
  SLACK_STATUS: (orgId) => `${API_BASE}/orgs/${orgId}/agents/me/slack/status`,
63791
63803
  // WeChat tier-B read verbs (agent-only; internal research preview).
63792
- WECHAT_CONTACTS: (orgId) => `${API_BASE}/orgs/${orgId}/agents/me/wechat/contacts`,
63793
- WECHAT_HISTORY: (orgId) => `${API_BASE}/orgs/${orgId}/agents/me/wechat/history`,
63794
- WECHAT_PROFILE: (orgId) => `${API_BASE}/orgs/${orgId}/agents/me/wechat/profile`,
63795
- WECHAT_STATUS: (orgId) => `${API_BASE}/orgs/${orgId}/agents/me/wechat/status`,
63804
+ ...wechatEndpoints(API_BASE),
63796
63805
  // Invitations (org-scoped, admin)
63797
63806
  ORG_INVITATIONS: (orgId) => `${API_BASE}/orgs/${orgId}/invitations`,
63798
63807
  ORG_INVITATION: (orgId, invId) => `${API_BASE}/orgs/${orgId}/invitations/${invId}`,
@@ -64261,6 +64270,10 @@ var WechatClient = class extends TaskLabelClient {
64261
64270
  params.set("limit", String(query.limit));
64262
64271
  return this.request("GET", `${ENDPOINTS.WECHAT_HISTORY(orgId)}?${params.toString()}`);
64263
64272
  }
64273
+ /** Fetch and cache one WeChat image or completed file on first explicit read. */
64274
+ async materializeWechatMedia(orgId, messageId) {
64275
+ return this.request("POST", ENDPOINTS.WECHAT_MEDIA(orgId), { message_id: messageId });
64276
+ }
64264
64277
  /** Connected WeChat account identity. */
64265
64278
  async wechatProfile(orgId) {
64266
64279
  return this.request("GET", ENDPOINTS.WECHAT_PROFILE(orgId));
@@ -51544,6 +51544,18 @@ function attachmentEndpoints(apiBase) {
51544
51544
  };
51545
51545
  }
51546
51546
 
51547
+ // ts/sdk/dist/wechat-endpoints.js
51548
+ function wechatEndpoints(apiBase) {
51549
+ const agentBase = (orgId) => `${apiBase}/orgs/${orgId}/agents/me/wechat`;
51550
+ return {
51551
+ WECHAT_CONTACTS: (orgId) => `${agentBase(orgId)}/contacts`,
51552
+ WECHAT_HISTORY: (orgId) => `${agentBase(orgId)}/history`,
51553
+ WECHAT_MEDIA: (orgId) => `${agentBase(orgId)}/media`,
51554
+ WECHAT_PROFILE: (orgId) => `${agentBase(orgId)}/profile`,
51555
+ WECHAT_STATUS: (orgId) => `${agentBase(orgId)}/status`
51556
+ };
51557
+ }
51558
+
51547
51559
  // ts/sdk/dist/constants.js
51548
51560
  var API_BASE = "/api/v1";
51549
51561
  var WIKI_BASE = "/wiki/v1";
@@ -51797,10 +51809,7 @@ var ENDPOINTS = {
51797
51809
  SLACK_MEMBERS: (orgId) => `${API_BASE}/orgs/${orgId}/agents/me/slack/members`,
51798
51810
  SLACK_STATUS: (orgId) => `${API_BASE}/orgs/${orgId}/agents/me/slack/status`,
51799
51811
  // WeChat tier-B read verbs (agent-only; internal research preview).
51800
- WECHAT_CONTACTS: (orgId) => `${API_BASE}/orgs/${orgId}/agents/me/wechat/contacts`,
51801
- WECHAT_HISTORY: (orgId) => `${API_BASE}/orgs/${orgId}/agents/me/wechat/history`,
51802
- WECHAT_PROFILE: (orgId) => `${API_BASE}/orgs/${orgId}/agents/me/wechat/profile`,
51803
- WECHAT_STATUS: (orgId) => `${API_BASE}/orgs/${orgId}/agents/me/wechat/status`,
51812
+ ...wechatEndpoints(API_BASE),
51804
51813
  // Invitations (org-scoped, admin)
51805
51814
  ORG_INVITATIONS: (orgId) => `${API_BASE}/orgs/${orgId}/invitations`,
51806
51815
  ORG_INVITATION: (orgId, invId) => `${API_BASE}/orgs/${orgId}/invitations/${invId}`,
@@ -52360,6 +52369,10 @@ var WechatClient = class extends TaskLabelClient {
52360
52369
  params.set("limit", String(query.limit));
52361
52370
  return this.request("GET", `${ENDPOINTS.WECHAT_HISTORY(orgId)}?${params.toString()}`);
52362
52371
  }
52372
+ /** Fetch and cache one WeChat image or completed file on first explicit read. */
52373
+ async materializeWechatMedia(orgId, messageId) {
52374
+ return this.request("POST", ENDPOINTS.WECHAT_MEDIA(orgId), { message_id: messageId });
52375
+ }
52363
52376
  /** Connected WeChat account identity. */
52364
52377
  async wechatProfile(orgId) {
52365
52378
  return this.request("GET", ENDPOINTS.WECHAT_PROFILE(orgId));
@@ -59304,6 +59317,14 @@ function resolveRuntimeContextWindow(resolvedModel, defaults, llmSource2) {
59304
59317
  const contextWindow = defaults.contextWindow;
59305
59318
  return typeof contextWindow === "number" && Number.isSafeInteger(contextWindow) && contextWindow > 0 ? contextWindow : void 0;
59306
59319
  }
59320
+ function resolveRuntimeMaxTokens(resolvedModel, defaults, llmSource2) {
59321
+ if (llmSource2 !== "parall")
59322
+ return void 0;
59323
+ if (!resolvedModel || resolvedModel !== defaults.model)
59324
+ return void 0;
59325
+ const maxTokens = defaults.maxTokens;
59326
+ return typeof maxTokens === "number" && Number.isSafeInteger(maxTokens) && maxTokens > 0 ? maxTokens : void 0;
59327
+ }
59307
59328
  function deriveModelIsPin(defaults, profile) {
59308
59329
  return defaults.modelIsPin !== void 0 ? defaults.modelIsPin : isPlatformModelOverride(profile);
59309
59330
  }
@@ -59341,38 +59362,42 @@ function runtimeModelConfig(canonicalModel, runtimeType, config) {
59341
59362
  const catalog = Array.isArray(parall.models) ? parall.models : [];
59342
59363
  const match = catalog.find((model) => model.id === canonicalModel);
59343
59364
  if (!match) {
59344
- return !runtime || runtime === "openclaw" || runtime === "hermes" ? { model: canonicalModel, contextWindow: null } : null;
59365
+ return !runtime || runtime === "openclaw" || runtime === "hermes" ? { model: canonicalModel, contextWindow: null, maxTokens: null } : null;
59345
59366
  }
59346
59367
  const contextWindow = typeof match.contextWindow === "number" && Number.isSafeInteger(match.contextWindow) && match.contextWindow > 0 ? match.contextWindow : null;
59368
+ const maxTokens = typeof match.maxTokens === "number" && Number.isSafeInteger(match.maxTokens) && match.maxTokens > 0 ? match.maxTokens : null;
59347
59369
  if (!runtime || runtime === "openclaw" || runtime === "hermes") {
59348
- return { model: canonicalModel, contextWindow };
59370
+ return { model: canonicalModel, contextWindow, maxTokens };
59349
59371
  }
59350
59372
  const runtimeNames = match.runtime_names ?? {};
59351
59373
  const runtimeName = runtimeNames[runtime];
59352
59374
  if (typeof runtimeName === "string" && runtimeName) {
59353
59375
  return {
59354
59376
  model: runtimeName,
59355
- contextWindow: runtimeName === canonicalModel ? contextWindow : null
59377
+ contextWindow: runtimeName === canonicalModel ? contextWindow : null,
59378
+ maxTokens: runtimeName === canonicalModel ? maxTokens : null
59356
59379
  };
59357
59380
  }
59358
- return { model: canonicalModel, contextWindow };
59381
+ return { model: canonicalModel, contextWindow, maxTokens };
59359
59382
  }
59360
59383
  function extractDefaults(config, runtimeType) {
59361
59384
  const agents = config.agents ?? {};
59362
59385
  const defaults = agents.defaults ?? {};
59363
59386
  let model = null;
59364
59387
  let contextWindow = null;
59388
+ let maxTokens = null;
59365
59389
  if (typeof defaults.model === "string" && defaults.model) {
59366
59390
  const canonicalModel = defaults.model.replace(/^parall-anthropic\//, "").replace(/^parall\//, "");
59367
59391
  const resolved = runtimeModelConfig(canonicalModel, runtimeType, config);
59368
59392
  model = resolved?.model ?? null;
59369
59393
  contextWindow = resolved?.contextWindow ?? null;
59394
+ maxTokens = resolved?.maxTokens ?? null;
59370
59395
  }
59371
59396
  let thinkingEffort = null;
59372
59397
  if (typeof defaults.thinking_effort === "string" && defaults.thinking_effort) {
59373
59398
  thinkingEffort = defaults.thinking_effort;
59374
59399
  }
59375
- return { model, thinkingEffort, contextWindow };
59400
+ return { model, thinkingEffort, contextWindow, maxTokens };
59376
59401
  }
59377
59402
  function createPlatformConfigManager(opts) {
59378
59403
  const { client, stateDir, runtimeType, log: log2 } = opts;
@@ -59381,6 +59406,7 @@ function createPlatformConfigManager(opts) {
59381
59406
  model: null,
59382
59407
  thinkingEffort: null,
59383
59408
  contextWindow: null,
59409
+ maxTokens: null,
59384
59410
  modelIsPin: void 0
59385
59411
  };
59386
59412
  let currentRawConfig = null;
@@ -61938,7 +61964,11 @@ function buildSpawnEnv(parentEnv, claudeHome, context2, opts) {
61938
61964
  result.CLAUDE_CODE_EFFORT_LEVEL = opts.effortLevel;
61939
61965
  }
61940
61966
  if (typeof opts.contextWindow === "number" && Number.isSafeInteger(opts.contextWindow) && opts.contextWindow > 0) {
61941
- result.CLAUDE_CODE_MAX_CONTEXT_TOKENS = String(opts.contextWindow);
61967
+ let inputBudget = opts.contextWindow;
61968
+ if (typeof opts.maxTokens === "number" && Number.isSafeInteger(opts.maxTokens) && opts.maxTokens > 0 && opts.maxTokens < opts.contextWindow) {
61969
+ inputBudget = opts.contextWindow - opts.maxTokens;
61970
+ }
61971
+ result.CLAUDE_CODE_MAX_CONTEXT_TOKENS = String(inputBudget);
61942
61972
  }
61943
61973
  if (opts.capabilityBinDir) {
61944
61974
  const pathKey = process.platform === "win32" ? Object.keys(result).find((k) => k.toUpperCase() === "PATH") ?? "PATH" : "PATH";
@@ -62101,10 +62131,12 @@ var ClaudeCodeAdapter = class {
62101
62131
  _model;
62102
62132
  _effortLevel;
62103
62133
  _contextWindow;
62134
+ _maxTokens;
62104
62135
  constructor(opts) {
62105
62136
  this.opts = opts;
62106
62137
  this._model = opts.model;
62107
62138
  this._contextWindow = opts.contextWindow;
62139
+ this._maxTokens = opts.maxTokens;
62108
62140
  }
62109
62141
  get currentModel() {
62110
62142
  return this._model;
@@ -62116,13 +62148,16 @@ var ClaudeCodeAdapter = class {
62116
62148
  const modelChanged = config.model !== void 0 && config.model !== this._model;
62117
62149
  const effortChanged = config.effort !== void 0 && config.effort !== this._effortLevel;
62118
62150
  const contextWindowChanged = config.contextWindow !== void 0 && config.contextWindow !== this._contextWindow;
62151
+ const maxTokensChanged = config.maxTokens !== void 0 && config.maxTokens !== this._maxTokens;
62119
62152
  if (modelChanged)
62120
62153
  this._model = config.model ?? void 0;
62121
62154
  if (effortChanged)
62122
62155
  this._effortLevel = config.effort ?? void 0;
62123
62156
  if (contextWindowChanged)
62124
62157
  this._contextWindow = config.contextWindow ?? void 0;
62125
- if (modelChanged || effortChanged || contextWindowChanged) {
62158
+ if (maxTokensChanged)
62159
+ this._maxTokens = config.maxTokens ?? void 0;
62160
+ if (modelChanged || effortChanged || contextWindowChanged || maxTokensChanged) {
62126
62161
  this.requestProcessRestart();
62127
62162
  }
62128
62163
  }
@@ -62528,11 +62563,12 @@ var ClaudeCodeAdapter = class {
62528
62563
  const env = buildSpawnEnv(process.env, this.opts.claudeHome, this.buildPlaceholderContext(sessionKey), {
62529
62564
  allowApiKey: this.opts.allowApiKey,
62530
62565
  contextWindow: this._contextWindow,
62566
+ maxTokens: this._maxTokens,
62531
62567
  effortLevel: this._effortLevel,
62532
62568
  wikiMountRoot: this.opts.workspaceDir,
62533
62569
  capabilityBinDir: this.opts.capabilityBinDir
62534
62570
  });
62535
- log2?.info(`spawn long-lived ${this.opts.claudeBin} (session ${sessionKey}, model=${this._model || "default"}, context=${this._contextWindow || "cli-default"}, effort=${this._effortLevel || "default"}, mode=${this.opts.permissionMode})`);
62571
+ log2?.info(`spawn long-lived ${this.opts.claudeBin} (session ${sessionKey}, model=${this._model || "default"}, context=${this._contextWindow || "cli-default"}, maxOut=${this._maxTokens || "cli-default"}, effort=${this._effortLevel || "default"}, mode=${this.opts.permissionMode})`);
62536
62572
  const proc = spawn(IS_WIN32 ? quoteWin32Arg(this.opts.claudeBin) : this.opts.claudeBin, IS_WIN32 ? args.map(quoteWin32Arg) : args, {
62537
62573
  cwd: this.opts.workspaceDir,
62538
62574
  env,
@@ -62939,6 +62975,7 @@ async function main() {
62939
62975
  const platformModelOverride = deriveModelIsPin(platformDefaults, me.agent_profile);
62940
62976
  const resolvedModel = resolveRuntimeModel(platformModelOverride, platformDefaults.model, config.model);
62941
62977
  const resolvedContextWindow = resolveRuntimeContextWindow(resolvedModel, platformDefaults, activeLLMSource);
62978
+ const resolvedMaxTokens = resolveRuntimeMaxTokens(resolvedModel, platformDefaults, activeLLMSource);
62942
62979
  const resolvedEffort = platformDefaults.thinkingEffort ?? (process.env.CLAUDE_CODE_EFFORT_LEVEL?.trim() || void 0);
62943
62980
  if (platformDefaults.model)
62944
62981
  agentLog.info(`platform config: model=${platformDefaults.model} \u2192 resolved=${resolvedModel ?? "cli-default"} (${platformModelOverride ? "pin/override" : "floor"})`);
@@ -62946,12 +62983,15 @@ async function main() {
62946
62983
  agentLog.info(`platform config: thinking_effort=${platformDefaults.thinkingEffort}`);
62947
62984
  if (resolvedContextWindow)
62948
62985
  agentLog.info(`platform config: context_window=${resolvedContextWindow}`);
62986
+ if (resolvedMaxTokens)
62987
+ agentLog.info(`platform config: max_tokens=${resolvedMaxTokens}`);
62949
62988
  const adapter = new ClaudeCodeAdapter({
62950
62989
  claudeBin: config.claudeBin,
62951
62990
  claudeHome: config.claudeHome,
62952
62991
  workspaceDir: config.workspaceDir,
62953
62992
  model: resolvedModel,
62954
62993
  contextWindow: resolvedContextWindow,
62994
+ maxTokens: resolvedMaxTokens,
62955
62995
  permissionMode: config.permissionMode,
62956
62996
  allowedTools: config.allowedTools,
62957
62997
  disallowedTools: config.disallowedTools,
@@ -62993,6 +63033,7 @@ async function main() {
62993
63033
  adapter.updateConfig({
62994
63034
  model,
62995
63035
  contextWindow: resolveRuntimeContextWindow(model, updated, activeLLMSource) ?? null,
63036
+ maxTokens: resolveRuntimeMaxTokens(model, updated, activeLLMSource) ?? null,
62996
63037
  effort: updated.thinkingEffort ?? localEffort
62997
63038
  });
62998
63039
  const fragments = applyChannelCapabilities();
@@ -51544,6 +51544,18 @@ function attachmentEndpoints(apiBase) {
51544
51544
  };
51545
51545
  }
51546
51546
 
51547
+ // ts/sdk/dist/wechat-endpoints.js
51548
+ function wechatEndpoints(apiBase) {
51549
+ const agentBase = (orgId) => `${apiBase}/orgs/${orgId}/agents/me/wechat`;
51550
+ return {
51551
+ WECHAT_CONTACTS: (orgId) => `${agentBase(orgId)}/contacts`,
51552
+ WECHAT_HISTORY: (orgId) => `${agentBase(orgId)}/history`,
51553
+ WECHAT_MEDIA: (orgId) => `${agentBase(orgId)}/media`,
51554
+ WECHAT_PROFILE: (orgId) => `${agentBase(orgId)}/profile`,
51555
+ WECHAT_STATUS: (orgId) => `${agentBase(orgId)}/status`
51556
+ };
51557
+ }
51558
+
51547
51559
  // ts/sdk/dist/constants.js
51548
51560
  var API_BASE = "/api/v1";
51549
51561
  var WIKI_BASE = "/wiki/v1";
@@ -51797,10 +51809,7 @@ var ENDPOINTS = {
51797
51809
  SLACK_MEMBERS: (orgId) => `${API_BASE}/orgs/${orgId}/agents/me/slack/members`,
51798
51810
  SLACK_STATUS: (orgId) => `${API_BASE}/orgs/${orgId}/agents/me/slack/status`,
51799
51811
  // WeChat tier-B read verbs (agent-only; internal research preview).
51800
- WECHAT_CONTACTS: (orgId) => `${API_BASE}/orgs/${orgId}/agents/me/wechat/contacts`,
51801
- WECHAT_HISTORY: (orgId) => `${API_BASE}/orgs/${orgId}/agents/me/wechat/history`,
51802
- WECHAT_PROFILE: (orgId) => `${API_BASE}/orgs/${orgId}/agents/me/wechat/profile`,
51803
- WECHAT_STATUS: (orgId) => `${API_BASE}/orgs/${orgId}/agents/me/wechat/status`,
51812
+ ...wechatEndpoints(API_BASE),
51804
51813
  // Invitations (org-scoped, admin)
51805
51814
  ORG_INVITATIONS: (orgId) => `${API_BASE}/orgs/${orgId}/invitations`,
51806
51815
  ORG_INVITATION: (orgId, invId) => `${API_BASE}/orgs/${orgId}/invitations/${invId}`,
@@ -52360,6 +52369,10 @@ var WechatClient = class extends TaskLabelClient {
52360
52369
  params.set("limit", String(query.limit));
52361
52370
  return this.request("GET", `${ENDPOINTS.WECHAT_HISTORY(orgId)}?${params.toString()}`);
52362
52371
  }
52372
+ /** Fetch and cache one WeChat image or completed file on first explicit read. */
52373
+ async materializeWechatMedia(orgId, messageId) {
52374
+ return this.request("POST", ENDPOINTS.WECHAT_MEDIA(orgId), { message_id: messageId });
52375
+ }
52363
52376
  /** Connected WeChat account identity. */
52364
52377
  async wechatProfile(orgId) {
52365
52378
  return this.request("GET", ENDPOINTS.WECHAT_PROFILE(orgId));
@@ -59333,38 +59346,42 @@ function runtimeModelConfig(canonicalModel, runtimeType, config) {
59333
59346
  const catalog = Array.isArray(parall.models) ? parall.models : [];
59334
59347
  const match = catalog.find((model) => model.id === canonicalModel);
59335
59348
  if (!match) {
59336
- return !runtime || runtime === "openclaw" || runtime === "hermes" ? { model: canonicalModel, contextWindow: null } : null;
59349
+ return !runtime || runtime === "openclaw" || runtime === "hermes" ? { model: canonicalModel, contextWindow: null, maxTokens: null } : null;
59337
59350
  }
59338
59351
  const contextWindow = typeof match.contextWindow === "number" && Number.isSafeInteger(match.contextWindow) && match.contextWindow > 0 ? match.contextWindow : null;
59352
+ const maxTokens = typeof match.maxTokens === "number" && Number.isSafeInteger(match.maxTokens) && match.maxTokens > 0 ? match.maxTokens : null;
59339
59353
  if (!runtime || runtime === "openclaw" || runtime === "hermes") {
59340
- return { model: canonicalModel, contextWindow };
59354
+ return { model: canonicalModel, contextWindow, maxTokens };
59341
59355
  }
59342
59356
  const runtimeNames = match.runtime_names ?? {};
59343
59357
  const runtimeName = runtimeNames[runtime];
59344
59358
  if (typeof runtimeName === "string" && runtimeName) {
59345
59359
  return {
59346
59360
  model: runtimeName,
59347
- contextWindow: runtimeName === canonicalModel ? contextWindow : null
59361
+ contextWindow: runtimeName === canonicalModel ? contextWindow : null,
59362
+ maxTokens: runtimeName === canonicalModel ? maxTokens : null
59348
59363
  };
59349
59364
  }
59350
- return { model: canonicalModel, contextWindow };
59365
+ return { model: canonicalModel, contextWindow, maxTokens };
59351
59366
  }
59352
59367
  function extractDefaults(config, runtimeType) {
59353
59368
  const agents = config.agents ?? {};
59354
59369
  const defaults = agents.defaults ?? {};
59355
59370
  let model = null;
59356
59371
  let contextWindow = null;
59372
+ let maxTokens = null;
59357
59373
  if (typeof defaults.model === "string" && defaults.model) {
59358
59374
  const canonicalModel = defaults.model.replace(/^parall-anthropic\//, "").replace(/^parall\//, "");
59359
59375
  const resolved = runtimeModelConfig(canonicalModel, runtimeType, config);
59360
59376
  model = resolved?.model ?? null;
59361
59377
  contextWindow = resolved?.contextWindow ?? null;
59378
+ maxTokens = resolved?.maxTokens ?? null;
59362
59379
  }
59363
59380
  let thinkingEffort = null;
59364
59381
  if (typeof defaults.thinking_effort === "string" && defaults.thinking_effort) {
59365
59382
  thinkingEffort = defaults.thinking_effort;
59366
59383
  }
59367
- return { model, thinkingEffort, contextWindow };
59384
+ return { model, thinkingEffort, contextWindow, maxTokens };
59368
59385
  }
59369
59386
  function createPlatformConfigManager(opts) {
59370
59387
  const { client, stateDir, runtimeType, log: log2 } = opts;
@@ -59373,6 +59390,7 @@ function createPlatformConfigManager(opts) {
59373
59390
  model: null,
59374
59391
  thinkingEffort: null,
59375
59392
  contextWindow: null,
59393
+ maxTokens: null,
59376
59394
  modelIsPin: void 0
59377
59395
  };
59378
59396
  let currentRawConfig = null;
@@ -215,12 +215,30 @@ var init_attachment_endpoints = __esm({
215
215
  }
216
216
  });
217
217
 
218
+ // ts/sdk/dist/wechat-endpoints.js
219
+ function wechatEndpoints(apiBase) {
220
+ const agentBase = (orgId) => `${apiBase}/orgs/${orgId}/agents/me/wechat`;
221
+ return {
222
+ WECHAT_CONTACTS: (orgId) => `${agentBase(orgId)}/contacts`,
223
+ WECHAT_HISTORY: (orgId) => `${agentBase(orgId)}/history`,
224
+ WECHAT_MEDIA: (orgId) => `${agentBase(orgId)}/media`,
225
+ WECHAT_PROFILE: (orgId) => `${agentBase(orgId)}/profile`,
226
+ WECHAT_STATUS: (orgId) => `${agentBase(orgId)}/status`
227
+ };
228
+ }
229
+ var init_wechat_endpoints = __esm({
230
+ "ts/sdk/dist/wechat-endpoints.js"() {
231
+ "use strict";
232
+ }
233
+ });
234
+
218
235
  // ts/sdk/dist/constants.js
219
236
  var API_BASE, WIKI_BASE, CLIP_BASE, ENDPOINTS, WS_EVENTS;
220
237
  var init_constants = __esm({
221
238
  "ts/sdk/dist/constants.js"() {
222
239
  "use strict";
223
240
  init_attachment_endpoints();
241
+ init_wechat_endpoints();
224
242
  API_BASE = "/api/v1";
225
243
  WIKI_BASE = "/wiki/v1";
226
244
  CLIP_BASE = "/clip/v1";
@@ -473,10 +491,7 @@ var init_constants = __esm({
473
491
  SLACK_MEMBERS: (orgId) => `${API_BASE}/orgs/${orgId}/agents/me/slack/members`,
474
492
  SLACK_STATUS: (orgId) => `${API_BASE}/orgs/${orgId}/agents/me/slack/status`,
475
493
  // WeChat tier-B read verbs (agent-only; internal research preview).
476
- WECHAT_CONTACTS: (orgId) => `${API_BASE}/orgs/${orgId}/agents/me/wechat/contacts`,
477
- WECHAT_HISTORY: (orgId) => `${API_BASE}/orgs/${orgId}/agents/me/wechat/history`,
478
- WECHAT_PROFILE: (orgId) => `${API_BASE}/orgs/${orgId}/agents/me/wechat/profile`,
479
- WECHAT_STATUS: (orgId) => `${API_BASE}/orgs/${orgId}/agents/me/wechat/status`,
494
+ ...wechatEndpoints(API_BASE),
480
495
  // Invitations (org-scoped, admin)
481
496
  ORG_INVITATIONS: (orgId) => `${API_BASE}/orgs/${orgId}/invitations`,
482
497
  ORG_INVITATION: (orgId, invId) => `${API_BASE}/orgs/${orgId}/invitations/${invId}`,
@@ -1059,6 +1074,10 @@ var init_wechat_client = __esm({
1059
1074
  params.set("limit", String(query.limit));
1060
1075
  return this.request("GET", `${ENDPOINTS.WECHAT_HISTORY(orgId)}?${params.toString()}`);
1061
1076
  }
1077
+ /** Fetch and cache one WeChat image or completed file on first explicit read. */
1078
+ async materializeWechatMedia(orgId, messageId) {
1079
+ return this.request("POST", ENDPOINTS.WECHAT_MEDIA(orgId), { message_id: messageId });
1080
+ }
1062
1081
  /** Connected WeChat account identity. */
1063
1082
  async wechatProfile(orgId) {
1064
1083
  return this.request("GET", ENDPOINTS.WECHAT_PROFILE(orgId));
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@parall/daemon",
3
- "version": "1.58.0",
3
+ "version": "1.58.1",
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/sdk": "1.58.0",
37
- "@parall/claude-agent": "1.58.0",
38
- "@parall/codex-agent": "1.58.0",
39
- "@parall/openclaw-agent": "1.58.0",
40
- "@parall/agent-core": "1.58.0"
36
+ "@parall/sdk": "1.58.1",
37
+ "@parall/agent-core": "1.58.1",
38
+ "@parall/claude-agent": "1.58.1",
39
+ "@parall/codex-agent": "1.58.1",
40
+ "@parall/openclaw-agent": "1.58.1"
41
41
  },
42
42
  "devDependencies": {
43
43
  "@types/node": "^22.0.0",