@liberseek/boft-cli-win32-arm64 0.6.9 → 0.7.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 CHANGED
@@ -7,7 +7,7 @@ BOFT CLI runs Pi and other external harnesses inside Codex Desktop.
7
7
  ## Install
8
8
 
9
9
  ```bash
10
- npm install -g @liberseek/boft-cli@0.6.9
10
+ npm install -g @liberseek/boft-cli@0.7.0
11
11
  ```
12
12
 
13
13
  Do not install this package directly. npm selects it through the optional dependencies of `@liberseek/boft-cli`.
@@ -20,6 +20,14 @@ License text: licenses/MCP-SDK-LICENSE.txt
20
20
  License: MIT
21
21
  License text: licenses/OpenCode-SDK-LICENSE.txt
22
22
 
23
+ @qoder-ai/qoder-agent-sdk 1.0.39
24
+ License: SEE LICENSE IN LICENSE
25
+ License text: licenses/Qoder-Agent-SDK-LICENSE.txt
26
+
27
+ @qodercn-ai/qodercn-agent-sdk 1.0.39
28
+ License: SEE LICENSE IN LICENSE
29
+ License text: licenses/QoderCN-Agent-SDK-LICENSE.txt
30
+
23
31
  diff 8.0.2
24
32
  License: BSD-3-Clause
25
33
  License text: licenses/diff-LICENSE.txt
@@ -28,6 +36,10 @@ lucide 1.28.0
28
36
  License: ISC
29
37
  License text: licenses/lucide-LICENSE.txt
30
38
 
39
+ tailwindcss 4.3.3
40
+ License: MIT
41
+ License text: licenses/tailwindcss-LICENSE.txt
42
+
31
43
  ws 8.21.3
32
44
  License: MIT
33
45
  License text: licenses/ws-LICENSE.txt
@@ -1 +1 @@
1
- {"schemaVersion":1,"version":"0.6.9","distribution":"npm","target":"windows-arm64"}
1
+ {"schemaVersion":1,"version":"0.7.0","distribution":"npm","target":"windows-arm64"}
@@ -387,6 +387,17 @@ function installDraftPrewarmPolicyBridge(manager, bridge, hostId, target, prewar
387
387
  const originalDispatchAppServerResponse = manager.dispatchAppServerResponse;
388
388
  let selectedModel = null;
389
389
  const isRecord4 = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
390
+ const isUnsupportedPosixBridgeSpawn = (value) => {
391
+ const marker = "AbsolutePathBuf deserialized without a base path";
392
+ if (typeof value === "string") {
393
+ return value.startsWith("Invalid request:") && value.includes(marker);
394
+ }
395
+ if (!isRecord4(value)) return false;
396
+ if (typeof value.message === "string" && value.message.includes(marker)) {
397
+ if (value.code === -32600 || value.message.startsWith("Invalid request:")) return true;
398
+ }
399
+ return value.cause !== value && isUnsupportedPosixBridgeSpawn(value.cause);
400
+ };
390
401
  const isRemoteControlHost = hostId.startsWith("remote-control:");
391
402
  const retireResponses = isRemoteControlHost ? () => {
392
403
  } : retainResponses(bridge, hostId, target);
@@ -765,7 +776,17 @@ function installDraftPrewarmPolicyBridge(manager, bridge, hostId, target, prewar
765
776
  const unresolvedThreadId = shouldResolveThreadOwnership(method, routedParameters);
766
777
  if (unresolvedThreadId) {
767
778
  return resolveThreadOwnership(unresolvedThreadId).then(
768
- (owner) => owner === "external" ? sendBridged() : sendDirect()
779
+ (owner) => owner === "external" ? sendBridged() : sendDirect(),
780
+ (error) => {
781
+ if ((method === "thread/read" || method === "thread/resume") && isUnsupportedPosixBridgeSpawn(error)) {
782
+ return Promise.resolve(sendDirect()).then((result) => {
783
+ knownOfficialThreadIds.add(unresolvedThreadId);
784
+ knownExternalThreadIds.delete(unresolvedThreadId);
785
+ return result;
786
+ });
787
+ }
788
+ throw error;
789
+ }
769
790
  );
770
791
  }
771
792
  return shouldUseBridge(method, routedParameters) ? sendBridged() : sendDirect();
@@ -889,17 +910,25 @@ function selectRendererRequestManager(candidates, activeHostIds) {
889
910
  );
890
911
  return eligible.length === 1 ? eligible[0] ?? null : null;
891
912
  }
892
- function requestManagerFromHookState(value) {
913
+ function requestManagerFromHookState(value, activeHostId) {
893
914
  const matchesRequestManager = (candidate) => {
894
- if (candidate == null || typeof candidate !== "object") return false;
895
- const value2 = candidate;
896
- return value2.requestClient != null && typeof value2.requestClient.prewarmThreadStart === "function" && typeof value2.requestClient.sendRequest === "function" && typeof value2.requestClient.enqueueRequest === "function" && typeof value2.prewarmedThreadManager?.discardAllPrewarmedThreads === "function" && typeof value2.sendRequest === "function";
915
+ if (candidate == null || typeof candidate !== "object" || !("requestClient" in candidate) || !("prewarmedThreadManager" in candidate) || !("sendRequest" in candidate)) {
916
+ return false;
917
+ }
918
+ const requestClient = candidate.requestClient;
919
+ const prewarmedThreadManager = candidate.prewarmedThreadManager;
920
+ return requestClient != null && typeof requestClient === "object" && "prewarmThreadStart" in requestClient && typeof requestClient.prewarmThreadStart === "function" && "sendRequest" in requestClient && typeof requestClient.sendRequest === "function" && "enqueueRequest" in requestClient && typeof requestClient.enqueueRequest === "function" && prewarmedThreadManager != null && typeof prewarmedThreadManager === "object" && "discardAllPrewarmedThreads" in prewarmedThreadManager && typeof prewarmedThreadManager.discardAllPrewarmedThreads === "function" && typeof candidate.sendRequest === "function";
897
921
  };
898
922
  if (matchesRequestManager(value)) return value;
899
- if (value != null && typeof value === "object" && matchesRequestManager(value.manager)) {
923
+ if (value != null && typeof value === "object" && "manager" in value && matchesRequestManager(value.manager)) {
900
924
  return value.manager;
901
925
  }
902
- return null;
926
+ if (typeof activeHostId !== "string" || activeHostId.length === 0) return null;
927
+ if (value == null || typeof value !== "object" || !("addManager" in value) || typeof value.addManager !== "function" || !("getForHostId" in value) || typeof value.getForHostId !== "function" || !("waitForManagerForHostId" in value) || typeof value.waitForManagerForHostId !== "function") {
928
+ return null;
929
+ }
930
+ const manager = value.getForHostId.call(value, activeHostId);
931
+ return matchesRequestManager(manager) ? manager : null;
903
932
  }
904
933
  function isRecord2(value) {
905
934
  return typeof value === "object" && value !== null && !Array.isArray(value);
@@ -910,32 +939,41 @@ var FIND_REQUEST_MANAGER_EXPRESSION = `(() => {
910
939
  const editors = [...document.querySelectorAll(
911
940
  '[data-codex-composer], [contenteditable="true"][role="textbox"]',
912
941
  )];
913
- if (editors.length !== 1) {
942
+ if (editors.length === 0) {
914
943
  return { candidateCount: 0, editorCount: editors.length, hostId: null, sendRequest: null };
915
944
  }
916
- let element = editors[0];
917
- let fiber = null;
918
- while (element != null && fiber == null) {
919
- const key = Object.getOwnPropertyNames(element).find((name) =>
920
- name.startsWith('__reactFiber$'),
921
- );
922
- if (key != null) fiber = element[key];
923
- element = element.parentElement;
924
- }
925
- const managers = new Set();
945
+ // Main and side chat can expose multiple editors backed by the same manager.
946
+ // Resolve their combined Host ownership before consulting any Host registry.
947
+ const composerAncestors = new Set();
926
948
  const activeHostIds = new Set();
927
- for (const current of committedReactAncestors(fiber)) {
928
- const fiber = current;
929
- const props = fiber.memoizedProps;
930
- if (props != null && typeof props === 'object') {
931
- for (const name of ['executionTargetHostId', 'permissionsHostId']) {
932
- const value = props[name];
933
- if (typeof value === 'string' && value.length > 0) activeHostIds.add(value);
949
+ for (const editor of editors) {
950
+ let element = editor;
951
+ let fiber = null;
952
+ while (element != null && fiber == null) {
953
+ const key = Object.getOwnPropertyNames(element).find((name) =>
954
+ name.startsWith('__reactFiber$'),
955
+ );
956
+ if (key != null) fiber = element[key];
957
+ element = element.parentElement;
958
+ }
959
+ for (const current of committedReactAncestors(fiber)) {
960
+ composerAncestors.add(current);
961
+ const props = current.memoizedProps;
962
+ if (props != null && typeof props === 'object') {
963
+ for (const name of ['executionTargetHostId', 'permissionsHostId']) {
964
+ const value = props[name];
965
+ if (typeof value === 'string' && value.length > 0) activeHostIds.add(value);
966
+ }
934
967
  }
935
968
  }
969
+ }
970
+ const activeHostId =
971
+ activeHostIds.size === 1 ? activeHostIds.values().next().value : undefined;
972
+ const managers = new Set();
973
+ for (const fiber of composerAncestors) {
936
974
  let hook = fiber.memoizedState;
937
975
  for (let index = 0; hook != null && index < 120; index += 1, hook = hook.next) {
938
- const manager = requestManagerFromHookState(hook.memoizedState);
976
+ const manager = requestManagerFromHookState(hook.memoizedState, activeHostId);
939
977
  if (manager != null) managers.add(manager);
940
978
  }
941
979
  }
@@ -1456,7 +1494,9 @@ ${rendererSource}`,
1456
1494
  "muse",
1457
1495
  "kiro-cli",
1458
1496
  "codebuddy",
1459
- "cursor-cli"
1497
+ "cursor-cli",
1498
+ "qoder",
1499
+ "qoder-cn"
1460
1500
  ],
1461
1501
  timeoutMs: PRODUCTION_INSTALL_TIMEOUT_MS
1462
1502
  },