@liberseek/boft-cli-win32-arm64 0.6.9 → 0.7.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.
Files changed (36) hide show
  1. package/README.md +1 -1
  2. package/THIRD_PARTY_NOTICES.txt +12 -4
  3. package/app/codexhost-distribution.json +1 -1
  4. package/app/desktop-controller.mjs +287 -170
  5. package/app/host-runtime.mjs +2450 -1044
  6. package/app/plugins/antigravity/plugin.mjs +167 -16
  7. package/app/plugins/claude-code/plugin.mjs +311 -58
  8. package/app/plugins/codebuddy/plugin.mjs +2355 -894
  9. package/app/plugins/cursor-cli/plugin.mjs +35973 -10933
  10. package/app/plugins/deepseek-harness/plugin.mjs +125 -7
  11. package/app/plugins/enabled.json +4 -1
  12. package/app/plugins/grok/plugin.mjs +261 -97
  13. package/app/plugins/hermes/plugin.mjs +2486 -99
  14. package/app/plugins/kiro-cli/plugin.mjs +120 -3
  15. package/app/plugins/muse/plugin.mjs +110 -0
  16. package/app/plugins/omp/plugin.mjs +145 -10
  17. package/app/plugins/opencode/plugin.mjs +162 -46
  18. package/app/plugins/pi/plugin.mjs +2891 -1678
  19. package/app/plugins/qoder/assets/icon.svg +1 -0
  20. package/app/plugins/qoder/manifest.json +12 -0
  21. package/app/plugins/qoder/plugin.mjs +52352 -0
  22. package/app/plugins/qoder-cn/assets/icon.svg +1 -0
  23. package/app/plugins/qoder-cn/manifest.json +12 -0
  24. package/app/plugins/qoder-cn/plugin.mjs +52350 -0
  25. package/app/plugins/workbuddy/assets/icon.svg +29 -0
  26. package/app/plugins/workbuddy/manifest.json +14 -0
  27. package/app/plugins/workbuddy/plugin.mjs +25007 -0
  28. package/app/renderer-extension.js +6043 -1442
  29. package/bin/boft.exe +0 -0
  30. package/libexec/boft-node-repl.exe +0 -0
  31. package/libexec/boft-shim.exe +0 -0
  32. package/libexec/boft-updater.exe +0 -0
  33. package/licenses/Qoder-Agent-SDK-LICENSE.txt +7 -0
  34. package/licenses/QoderCN-Agent-SDK-LICENSE.txt +7 -0
  35. package/licenses/{opencodex-LICENSE.txt → tailwindcss-LICENSE.txt} +1 -1
  36. package/package.json +1 -1
@@ -329,7 +329,7 @@ function retainRendererHostResponses(client, hostId, target) {
329
329
  if (typeof client.addRequestLifecycleListener !== "function" || typeof target.addEventListener !== "function" || typeof target.removeEventListener !== "function")
330
330
  return () => {
331
331
  };
332
- const isRecord4 = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
332
+ const isRecord3 = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
333
333
  const pending = /* @__PURE__ */ new Set();
334
334
  let retired = false;
335
335
  let unsubscribe = () => {
@@ -343,12 +343,12 @@ function retainRendererHostResponses(client, hostId, target) {
343
343
  if (source != null && source !== target) return;
344
344
  const ownOrigin = target.location?.origin;
345
345
  if (source === target && ownOrigin && ownOrigin !== "null" && origin !== ownOrigin) return;
346
- if (!isRecord4(data) || data.type !== "mcp-response" || data.hostId !== hostId) return;
346
+ if (!isRecord3(data) || data.type !== "mcp-response" || data.hostId !== hostId) return;
347
347
  const message = data.message;
348
- if (!isRecord4(message)) return;
348
+ if (!isRecord3(message)) return;
349
349
  const id = message.id;
350
350
  if (typeof id !== "string" && typeof id !== "number" || !pending.has(id)) return;
351
- const hasError = isRecord4(message.error);
351
+ const hasError = isRecord3(message.error);
352
352
  if (!hasError && !Object.prototype.hasOwnProperty.call(message, "result")) return;
353
353
  queueMicrotask(() => {
354
354
  if (!pending.has(id)) return;
@@ -358,7 +358,7 @@ function retainRendererHostResponses(client, hostId, target) {
358
358
  };
359
359
  target.addEventListener("message", receive);
360
360
  unsubscribe = client.addRequestLifecycleListener((event) => {
361
- if (!isRecord4(event) || event.hostId !== hostId) return;
361
+ if (!isRecord3(event) || event.hostId !== hostId) return;
362
362
  const id = event.id;
363
363
  if (typeof id !== "string" && typeof id !== "number") return;
364
364
  if (!retired && event.type === "started" && typeof event.method === "string" && event.method.startsWith("codexhost/"))
@@ -375,18 +375,26 @@ function retainRendererHostResponses(client, hostId, target) {
375
375
  }
376
376
 
377
377
  // packages/desktop-control/src/renderer-draft-prewarm-runtime.ts
378
- function installDraftPrewarmPolicyBridge(manager, bridge, hostId, target, prewarmedThreadManager, isCurrentManager, retainResponses = retainRendererHostResponses) {
379
- const existing = target.__codexhostDraftPrewarmPolicyV1;
380
- if (existing?.owns?.length === 5 && existing.owns(manager, bridge, hostId, prewarmedThreadManager, !!isCurrentManager) === true) {
381
- return { state: "ready", reason: "owned-request-bridge" };
382
- }
383
- existing?.dispose?.();
378
+ function createDraftPrewarmPolicyBridge(manager, bridge, hostId, target, prewarmedThreadManager, isCurrentManager, retainResponses = retainRendererHostResponses) {
379
+ let disposed = false;
384
380
  const originalSend = bridge.sendRequest;
385
381
  const originalPrewarm = bridge.prewarmThreadStart;
386
382
  const originalOnNotification = manager.onNotification;
387
383
  const originalDispatchAppServerResponse = manager.dispatchAppServerResponse;
388
384
  let selectedModel = null;
389
- const isRecord4 = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
385
+ let prewarmGeneration = 0;
386
+ const isRecord3 = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
387
+ const isUnsupportedPosixBridgeSpawn = (value) => {
388
+ const marker = "AbsolutePathBuf deserialized without a base path";
389
+ if (typeof value === "string") {
390
+ return value.startsWith("Invalid request:") && value.includes(marker);
391
+ }
392
+ if (!isRecord3(value)) return false;
393
+ if (typeof value.message === "string" && value.message.includes(marker)) {
394
+ if (value.code === -32600 || value.message.startsWith("Invalid request:")) return true;
395
+ }
396
+ return value.cause !== value && isUnsupportedPosixBridgeSpawn(value.cause);
397
+ };
390
398
  const isRemoteControlHost = hostId.startsWith("remote-control:");
391
399
  const retireResponses = isRemoteControlHost ? () => {
392
400
  } : retainResponses(bridge, hostId, target);
@@ -472,14 +480,14 @@ function installDraftPrewarmPolicyBridge(manager, bridge, hostId, target, prewar
472
480
  bridgeState = "idle";
473
481
  };
474
482
  const rememberExternalThread = (value) => {
475
- if (!isRecord4(value) || typeof value.id !== "string") return;
483
+ if (!isRecord3(value) || typeof value.id !== "string") return;
476
484
  if (value.modelProvider === "codexhost" || value.cliVersion === "codexhost") {
477
485
  knownExternalThreadIds.add(value.id);
478
486
  knownOfficialThreadIds.delete(value.id);
479
487
  }
480
488
  };
481
489
  const observeBridgeResult = (request, result) => {
482
- if (!request || !isRecord4(result)) return;
490
+ if (!request || !isRecord3(result)) return;
483
491
  if (request.method === "thread/list" && Array.isArray(result.data)) {
484
492
  for (const thread of result.data) rememberExternalThread(thread);
485
493
  return;
@@ -488,7 +496,7 @@ function installDraftPrewarmPolicyBridge(manager, bridge, hostId, target, prewar
488
496
  rememberExternalThread(result.thread);
489
497
  return;
490
498
  }
491
- if (request.method === "codexhost/thread/inspect" && isRecord4(request.parameters) && typeof request.parameters.threadId === "string") {
499
+ if (request.method === "codexhost/thread/inspect" && isRecord3(request.parameters) && typeof request.parameters.threadId === "string") {
492
500
  if (result.owner === "external") {
493
501
  knownExternalThreadIds.add(request.parameters.threadId);
494
502
  knownOfficialThreadIds.delete(request.parameters.threadId);
@@ -498,18 +506,18 @@ function installDraftPrewarmPolicyBridge(manager, bridge, hostId, target, prewar
498
506
  }
499
507
  return;
500
508
  }
501
- if (request.method === "thread/delete" && isRecord4(request.parameters) && typeof request.parameters.threadId === "string") {
509
+ if (request.method === "thread/delete" && isRecord3(request.parameters) && typeof request.parameters.threadId === "string") {
502
510
  knownExternalThreadIds.delete(request.parameters.threadId);
503
511
  knownOfficialThreadIds.delete(request.parameters.threadId);
504
512
  }
505
513
  };
506
514
  const handleBridgeFrame = (value) => {
507
- if (!isRecord4(value)) {
515
+ if (!isRecord3(value)) {
508
516
  failBridge("received a non-object app-server frame");
509
517
  return;
510
518
  }
511
519
  if (value.method === bridgeReadyMethod && value.id === void 0) {
512
- if (isRecord4(value.params) && value.params.protocolVersion === 1) {
520
+ if (isRecord3(value.params) && value.params.protocolVersion === 1) {
513
521
  bridgeState = "ready";
514
522
  if (bridgeReadyTimeout !== null) globalThis.clearTimeout(bridgeReadyTimeout);
515
523
  bridgeReadyTimeout = null;
@@ -522,7 +530,7 @@ function installDraftPrewarmPolicyBridge(manager, bridge, hostId, target, prewar
522
530
  return;
523
531
  }
524
532
  if (typeof value.method === "string" && value.id === void 0) {
525
- if (value.method === "thread/started" && isRecord4(value.params)) {
533
+ if (value.method === "thread/started" && isRecord3(value.params)) {
526
534
  rememberExternalThread(value.params.thread);
527
535
  }
528
536
  originalOnNotification.call(manager, value.method, value.params);
@@ -573,7 +581,7 @@ function installDraftPrewarmPolicyBridge(manager, bridge, hostId, target, prewar
573
581
  }
574
582
  };
575
583
  const handleOuterNotification = (method, parameters) => {
576
- if (method === "process/exited" && isRecord4(parameters) && parameters.processHandle === bridgeProcessHandle) {
584
+ if (method === "process/exited" && isRecord3(parameters) && parameters.processHandle === bridgeProcessHandle) {
577
585
  const exitCode = typeof parameters.exitCode === "number" ? parameters.exitCode : "unknown";
578
586
  const stderr = typeof parameters.stderr === "string" ? parameters.stderr.trim() : "";
579
587
  failBridge(
@@ -582,7 +590,7 @@ function installDraftPrewarmPolicyBridge(manager, bridge, hostId, target, prewar
582
590
  );
583
591
  return true;
584
592
  }
585
- if (method !== "process/outputDelta" || !isRecord4(parameters) || parameters.processHandle !== bridgeProcessHandle || parameters.stream !== "stdout" && parameters.stream !== "stderr" || typeof parameters.deltaBase64 !== "string") {
593
+ if (method !== "process/outputDelta" || !isRecord3(parameters) || parameters.processHandle !== bridgeProcessHandle || parameters.stream !== "stdout" && parameters.stream !== "stderr" || typeof parameters.deltaBase64 !== "string") {
586
594
  return false;
587
595
  }
588
596
  if (parameters.capReached === true) {
@@ -687,7 +695,7 @@ function installDraftPrewarmPolicyBridge(manager, bridge, hostId, target, prewar
687
695
  return bridgeInitialization;
688
696
  };
689
697
  const threadIdFromParameters = (parameters) => {
690
- if (!isRecord4(parameters)) return null;
698
+ if (!isRecord3(parameters)) return null;
691
699
  const value = parameters.threadId ?? parameters.conversationId;
692
700
  return typeof value === "string" ? value : null;
693
701
  };
@@ -702,9 +710,9 @@ function installDraftPrewarmPolicyBridge(manager, bridge, hostId, target, prewar
702
710
  threadIds: [threadId]
703
711
  })
704
712
  ).then((value) => {
705
- const ownerships = isRecord4(value) && Array.isArray(value.threads) ? value.threads : null;
713
+ const ownerships = isRecord3(value) && Array.isArray(value.threads) ? value.threads : null;
706
714
  const ownership = ownerships?.[0];
707
- if (!ownerships || !isRecord4(ownership) || ownerships.length !== 1 || ownership.threadId !== threadId || ownership.owner !== "external" && ownership.owner !== "codex") {
715
+ if (!ownerships || !isRecord3(ownership) || ownerships.length !== 1 || ownership.threadId !== threadId || ownership.owner !== "external" && ownership.owner !== "codex") {
708
716
  throw transportError("Thread ownership lookup returned an invalid result");
709
717
  }
710
718
  if (ownership.owner === "external") {
@@ -740,7 +748,7 @@ function installDraftPrewarmPolicyBridge(manager, bridge, hostId, target, prewar
740
748
  if (method.startsWith("codexhost/")) return true;
741
749
  if (method === "thread/list") return true;
742
750
  if (method === "thread/start") {
743
- return isRecord4(parameters) && typeof parameters.model === "string" && parameters.model.startsWith("codexhost/");
751
+ return isRecord3(parameters) && typeof parameters.model === "string" && parameters.model.startsWith("codexhost/");
744
752
  }
745
753
  const threadId = threadIdFromParameters(parameters);
746
754
  if (threadId && knownExternalThreadIds.has(threadId)) return true;
@@ -748,7 +756,7 @@ function installDraftPrewarmPolicyBridge(manager, bridge, hostId, target, prewar
748
756
  return selectedModel !== null && (method.startsWith("thread/") || method.startsWith("turn/") || method.startsWith("review/"));
749
757
  };
750
758
  const routeThreadStart = (parameters) => {
751
- if (!isRecord4(parameters) || parameters.ephemeral === true) {
759
+ if (!isRecord3(parameters) || parameters.ephemeral === true) {
752
760
  return parameters;
753
761
  }
754
762
  return {
@@ -765,23 +773,40 @@ function installDraftPrewarmPolicyBridge(manager, bridge, hostId, target, prewar
765
773
  const unresolvedThreadId = shouldResolveThreadOwnership(method, routedParameters);
766
774
  if (unresolvedThreadId) {
767
775
  return resolveThreadOwnership(unresolvedThreadId).then(
768
- (owner) => owner === "external" ? sendBridged() : sendDirect()
776
+ (owner) => owner === "external" ? sendBridged() : sendDirect(),
777
+ (error) => {
778
+ if ((method === "thread/read" || method === "thread/resume") && isUnsupportedPosixBridgeSpawn(error)) {
779
+ return Promise.resolve(sendDirect()).then((result) => {
780
+ knownOfficialThreadIds.add(unresolvedThreadId);
781
+ knownExternalThreadIds.delete(unresolvedThreadId);
782
+ return result;
783
+ });
784
+ }
785
+ throw error;
786
+ }
769
787
  );
770
788
  }
771
789
  return shouldUseBridge(method, routedParameters) ? sendBridged() : sendDirect();
772
790
  };
773
791
  const routedPrewarm = (parameters, options) => {
774
792
  const routedParameters = routeThreadStart(parameters);
775
- if (shouldUseBridge("thread/start", routedParameters)) {
776
- return routedSend("thread/start", routedParameters, options);
793
+ const generation = prewarmGeneration;
794
+ const pending = shouldUseBridge("thread/start", routedParameters) ? routedSend("thread/start", routedParameters, options) : options === void 0 ? originalPrewarm.call(bridge, routedParameters) : originalPrewarm.call(bridge, routedParameters, options);
795
+ if (isRecord3(parameters) && parameters.ephemeral === true || typeof pending !== "object" && typeof pending !== "function" || pending === null || typeof Reflect.get(pending, "then") !== "function") {
796
+ return pending;
777
797
  }
778
- return options === void 0 ? originalPrewarm.call(bridge, routedParameters) : originalPrewarm.call(bridge, routedParameters, options);
798
+ return Promise.resolve(pending).then((result) => {
799
+ if (disposed || generation !== prewarmGeneration) {
800
+ throw new Error("Renderer draft prewarm was invalidated by a configuration change");
801
+ }
802
+ return result;
803
+ });
779
804
  };
780
805
  bridge.sendRequest = routedSend;
781
806
  bridge.prewarmThreadStart = routedPrewarm;
782
807
  const routedWindowMessage = (event) => {
783
808
  const message = event.data;
784
- if (!isRecord4(message) || message.type !== "mcp-notification" || message.hostId !== hostId || typeof message.method !== "string") {
809
+ if (!isRecord3(message) || message.type !== "mcp-notification" || message.hostId !== hostId || typeof message.method !== "string") {
785
810
  return;
786
811
  }
787
812
  handleOuterNotification(message.method, message.params);
@@ -813,26 +838,35 @@ function installDraftPrewarmPolicyBridge(manager, bridge, hostId, target, prewar
813
838
  state: "ready",
814
839
  hostId,
815
840
  owns(candidateManager, candidate, candidateHostId, candidatePrewarmedThreadManager, requiresCurrentManager) {
816
- return candidateManager === manager && candidate === bridge && candidateHostId === hostId && candidatePrewarmedThreadManager === prewarmedThreadManager && requiresCurrentManager === !!isCurrentManager;
841
+ return !disposed && candidateManager === manager && candidate === bridge && candidateHostId === hostId && candidatePrewarmedThreadManager === prewarmedThreadManager && requiresCurrentManager === !!isCurrentManager;
817
842
  },
818
843
  requestTarget() {
819
- if (isCurrentManager && !isCurrentManager())
844
+ if (disposed || isCurrentManager && !isCurrentManager())
820
845
  throw new Error("Renderer request manager is retired");
821
846
  return manager;
822
847
  },
823
848
  select(model) {
849
+ if (disposed || isCurrentManager && !isCurrentManager())
850
+ throw new Error("Renderer request manager is retired");
824
851
  if (model !== null && (typeof model !== "string" || !model.startsWith("codexhost/"))) {
825
852
  throw new Error("Draft route Model must be a codexhost transport carrier");
826
853
  }
827
854
  if (selectedModel === model) return false;
828
855
  selectedModel = model;
856
+ prewarmGeneration += 1;
829
857
  return true;
830
858
  },
831
859
  clear() {
860
+ if (disposed || isCurrentManager && !isCurrentManager())
861
+ return Promise.reject(new Error("Renderer request manager is retired"));
862
+ prewarmGeneration += 1;
832
863
  prewarmedThreadManager.discardAllPrewarmedThreads();
833
864
  return Promise.resolve();
834
865
  },
835
866
  dispose() {
867
+ if (disposed) return;
868
+ disposed = true;
869
+ prewarmGeneration += 1;
836
870
  retireResponses();
837
871
  if (bridge.sendRequest === routedSend) bridge.sendRequest = originalSend;
838
872
  if (bridge.prewarmThreadStart === routedPrewarm) {
@@ -865,150 +899,231 @@ function installDraftPrewarmPolicyBridge(manager, bridge, hostId, target, prewar
865
899
  selectedModel = null;
866
900
  }
867
901
  });
868
- Object.defineProperty(target, "__codexhostDraftPrewarmPolicyV1", {
869
- configurable: true,
870
- value: policy
871
- });
872
- if (typeof target.dispatchEvent === "function" && typeof CustomEvent === "function") {
873
- target.dispatchEvent(new CustomEvent("codexhost:draft-prewarm-policy-changed"));
874
- }
875
- return { state: "ready", reason: "owned-request-bridge" };
902
+ return policy;
876
903
  }
877
904
 
878
- // packages/desktop-control/src/renderer-draft-prewarm-policy.ts
879
- function selectRendererRequestManager(candidates, activeHostIds) {
880
- const unique = /* @__PURE__ */ new Map();
881
- for (const candidate of candidates) unique.set(candidate.manager, candidate);
882
- const hosts = new Set(
883
- activeHostIds.filter((value) => typeof value === "string" && value.length > 0)
884
- );
885
- if (hosts.size > 1) return null;
886
- const activeHostId = hosts.values().next().value;
887
- const eligible = [...unique.values()].filter(
888
- (candidate) => activeHostId === void 0 || candidate.hostId === activeHostId
889
- );
890
- return eligible.length === 1 ? eligible[0] ?? null : null;
891
- }
892
- function requestManagerFromHookState(value) {
893
- 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";
905
+ // packages/desktop-control/src/renderer-host-discovery.ts
906
+ function requestManagerFromHookState(value, hostId) {
907
+ const record = (candidate) => typeof candidate === "object" && candidate !== null;
908
+ const manager = (candidate) => {
909
+ if (!record(candidate) || !record(candidate.requestClient) || !record(candidate.prewarmedThreadManager))
910
+ return null;
911
+ const bridge = candidate.requestClient;
912
+ return typeof candidate.sendRequest === "function" && typeof bridge.sendRequest === "function" && typeof bridge.prewarmThreadStart === "function" && typeof bridge.enqueueRequest === "function" && typeof candidate.prewarmedThreadManager.discardAllPrewarmedThreads === "function" ? candidate : null;
897
913
  };
898
- if (matchesRequestManager(value)) return value;
899
- if (value != null && typeof value === "object" && matchesRequestManager(value.manager)) {
900
- return value.manager;
901
- }
902
- return null;
914
+ if (!record(value)) return null;
915
+ const direct = manager(value) ?? manager(value.manager);
916
+ if (direct) return direct;
917
+ if (!hostId || typeof value.addManager !== "function" || typeof value.getForHostId !== "function" || typeof value.waitForManagerForHostId !== "function")
918
+ return null;
919
+ return manager(value.getForHostId(hostId));
903
920
  }
904
- function isRecord2(value) {
905
- return typeof value === "object" && value !== null && !Array.isArray(value);
906
- }
907
- var FIND_REQUEST_MANAGER_EXPRESSION = `(() => {
908
- const requestManagerFromHookState = ${requestManagerFromHookState.toString()};
909
- const committedReactAncestors = ${committedReactAncestors.toString()};
910
- const editors = [...document.querySelectorAll(
911
- '[data-codex-composer], [contenteditable="true"][role="textbox"]',
912
- )];
913
- if (editors.length !== 1) {
914
- return { candidateCount: 0, editorCount: editors.length, hostId: null, sendRequest: null };
915
- }
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();
926
- 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);
921
+ function discoverRendererHosts(root, ancestors = committedReactAncestors, managerFrom = requestManagerFromHookState) {
922
+ const editors = [
923
+ ...root.querySelectorAll('[data-codex-composer], [contenteditable="true"][role="textbox"]')
924
+ ];
925
+ const hostIds = /* @__PURE__ */ new Set();
926
+ const managers = /* @__PURE__ */ new Set();
927
+ const registries = /* @__PURE__ */ new Set();
928
+ const fibers = /* @__PURE__ */ new Set();
929
+ for (const editor of editors) {
930
+ let element = editor;
931
+ let fiber;
932
+ while (element && !fiber) {
933
+ const key = Object.getOwnPropertyNames(element).find(
934
+ (name) => name.startsWith("__reactFiber$")
935
+ );
936
+ if (key) fiber = Object.getOwnPropertyDescriptor(element, key)?.value;
937
+ element = element.parentElement ?? null;
938
+ }
939
+ for (const current of ancestors(fiber)) {
940
+ fibers.add(current);
941
+ const props = current.memoizedProps;
942
+ for (const key of ["executionTargetHostId", "permissionsHostId"]) {
943
+ const hostId = props?.[key];
944
+ if (typeof hostId === "string" && hostId) hostIds.add(hostId);
934
945
  }
935
946
  }
947
+ }
948
+ for (const fiber of fibers) {
936
949
  let hook = fiber.memoizedState;
937
- for (let index = 0; hook != null && index < 120; index += 1, hook = hook.next) {
938
- const manager = requestManagerFromHookState(hook.memoizedState);
939
- if (manager != null) managers.add(manager);
950
+ for (let index = 0; hook && index < 120; index += 1) {
951
+ const value = hook.memoizedState;
952
+ const manager = managerFrom(value);
953
+ if (manager) managers.add(manager);
954
+ if (value && typeof value === "object" && "addManager" in value && typeof value.addManager === "function" && "getForHostId" in value && typeof value.getForHostId === "function" && "waitForManagerForHostId" in value && typeof value.waitForManagerForHostId === "function") {
955
+ registries.add(value);
956
+ }
957
+ hook = hook.next && typeof hook.next === "object" ? hook.next : null;
940
958
  }
941
959
  }
942
- const candidates = [...managers].map((manager) => {
943
- const requestClient =
944
- typeof manager.requestClient?.sendRequest === 'function' &&
945
- typeof manager.requestClient?.prewarmThreadStart === 'function' &&
946
- typeof manager.requestClient?.enqueueRequest === 'function'
947
- ? manager.requestClient
948
- : manager;
949
- return {
950
- manager,
951
- requestClient,
952
- hostId: manager?.getHostId?.() ?? requestClient?.hostId ?? null,
953
- prewarmedThreadManager: manager?.prewarmedThreadManager ?? null,
954
- };
955
- });
956
- const selected = (${selectRendererRequestManager.toString()})(candidates, [...activeHostIds]);
957
960
  return {
958
- candidateCount: selected == null ? candidates.length : 1,
959
961
  editorCount: editors.length,
960
- hostId: selected?.hostId ?? null,
961
- manager: selected?.manager ?? null,
962
- requestClient: selected?.requestClient ?? null,
963
- prewarmedThreadManager: selected?.prewarmedThreadManager ?? null,
962
+ hostIds: [...hostIds],
963
+ managers: [...managers],
964
+ registries: [...registries]
964
965
  };
965
- })()`;
966
- var IS_CURRENT_REQUEST_MANAGER = `function(manager, requestClient, hostId, prewarmedThreadManager) {
967
- const current = ${FIND_REQUEST_MANAGER_EXPRESSION};
968
- return current.editorCount === 0 || (
969
- current.manager === manager && current.requestClient === requestClient &&
970
- current.hostId === hostId && current.prewarmedThreadManager === prewarmedThreadManager
971
- );
972
- }`;
973
- var INSTALL_RENDERER_POLICY_FUNCTION = `function(requestClient, hostId, prewarmedThreadManager) {
974
- return (${installDraftPrewarmPolicyBridge.toString()})(
975
- this,
976
- requestClient,
977
- hostId,
978
- window,
979
- prewarmedThreadManager,
980
- () => (${IS_CURRENT_REQUEST_MANAGER})(this, requestClient, hostId, prewarmedThreadManager),
981
- (${retainRendererHostResponses.toString()}),
966
+ }
967
+ function resolveRendererHostManager(discovery, hostId, managerFrom = requestManagerFromHookState) {
968
+ if (!hostId) return null;
969
+ const candidates = discovery.registries.length ? discovery.registries.map((registry) => managerFrom(registry.getForHostId(hostId))) : discovery.managers;
970
+ const matching = new Set(
971
+ candidates.filter(
972
+ (manager) => manager && (manager.getHostId?.() ?? manager.requestClient.hostId) === hostId && (manager.requestClient.hostId === void 0 || manager.requestClient.hostId === hostId)
973
+ )
982
974
  );
983
- }`;
975
+ return matching.size === 1 ? matching.values().next().value ?? null : null;
976
+ }
977
+
978
+ // packages/desktop-control/src/renderer-host-routing.ts
979
+ function installRendererHostRouting(root, target, discover, resolve, createPolicy) {
980
+ const existing = target.__codexhostHostRoutingV1;
981
+ if (existing) return existing;
982
+ target.__codexhostDraftPrewarmPolicyV1?.dispose?.();
983
+ let disposed = false;
984
+ let lastDiscovery = null;
985
+ const routes = /* @__PURE__ */ new Map();
986
+ const read = (composer) => {
987
+ const source = composer?.matches?.(
988
+ '[data-codex-composer], [contenteditable="true"][role="textbox"]'
989
+ ) ? { querySelectorAll: () => [composer] } : composer ?? root;
990
+ const discovery = discover(source);
991
+ if (composer) return discovery;
992
+ if (discovery.editorCount === 0 && lastDiscovery) return lastDiscovery;
993
+ lastDiscovery = discovery;
994
+ return discovery;
995
+ };
996
+ const lookup = (hostId, discovery) => {
997
+ if (disposed) return null;
998
+ try {
999
+ return resolve(discovery ?? read(), hostId);
1000
+ } catch {
1001
+ return null;
1002
+ }
1003
+ };
1004
+ const retire = (hostId) => {
1005
+ const entry = routes.get(hostId);
1006
+ routes.delete(hostId);
1007
+ entry?.route.policy.dispose();
1008
+ };
1009
+ const routeFor = (hostId, discovery) => {
1010
+ const manager = lookup(hostId, discovery);
1011
+ const previous = routes.get(hostId);
1012
+ if (manager && previous?.route.manager === manager && previous.bridge === manager.requestClient && previous.prewarmed === manager.prewarmedThreadManager && previous.route.policy.owns(
1013
+ manager,
1014
+ manager.requestClient,
1015
+ hostId,
1016
+ manager.prewarmedThreadManager,
1017
+ true
1018
+ )) {
1019
+ return previous.route;
1020
+ }
1021
+ retire(hostId);
1022
+ if (!manager) return null;
1023
+ const bridge = manager.requestClient;
1024
+ const prewarmed = manager.prewarmedThreadManager;
1025
+ const policy = createPolicy(
1026
+ manager,
1027
+ bridge,
1028
+ hostId,
1029
+ target,
1030
+ prewarmed,
1031
+ () => lookup(hostId) === manager && manager.requestClient === bridge && manager.prewarmedThreadManager === prewarmed
1032
+ );
1033
+ const route = { hostId, manager, policy };
1034
+ routes.set(hostId, { route, bridge, prewarmed });
1035
+ return route;
1036
+ };
1037
+ const publish = (route) => {
1038
+ const policy = route?.policy;
1039
+ if (target.__codexhostDraftPrewarmPolicyV1 === policy) return;
1040
+ Object.defineProperty(target, "__codexhostDraftPrewarmPolicyV1", {
1041
+ configurable: true,
1042
+ value: policy
1043
+ });
1044
+ if (typeof target.dispatchEvent === "function" && typeof CustomEvent === "function") {
1045
+ target.dispatchEvent(new CustomEvent("codexhost:draft-prewarm-policy-changed"));
1046
+ }
1047
+ };
1048
+ const composerHostId = (discovery) => {
1049
+ if (discovery.hostIds.length === 0 && discovery.registries.length > 0) return null;
1050
+ const hostIds = new Set(
1051
+ discovery.hostIds.length ? discovery.hostIds : discovery.managers.map(
1052
+ (manager) => manager.getHostId?.() ?? manager.requestClient.hostId
1053
+ )
1054
+ );
1055
+ const hostId = hostIds.size === 1 ? hostIds.values().next().value : null;
1056
+ return typeof hostId === "string" && hostId ? hostId : null;
1057
+ };
1058
+ const routing = {
1059
+ forHost(hostId) {
1060
+ return hostId ? routeFor(hostId) : null;
1061
+ },
1062
+ hostIdForComposer(composer) {
1063
+ if (disposed) return null;
1064
+ try {
1065
+ return composerHostId(read(composer));
1066
+ } catch {
1067
+ return null;
1068
+ }
1069
+ },
1070
+ forComposer(composer) {
1071
+ if (disposed) return null;
1072
+ let discovery;
1073
+ try {
1074
+ discovery = read(composer);
1075
+ } catch {
1076
+ publish(null);
1077
+ return null;
1078
+ }
1079
+ if (!composer) {
1080
+ for (const [hostId2, entry] of routes) {
1081
+ const manager = lookup(hostId2, discovery);
1082
+ if (manager !== entry.route.manager || manager.requestClient !== entry.bridge || manager.prewarmedThreadManager !== entry.prewarmed)
1083
+ retire(hostId2);
1084
+ }
1085
+ }
1086
+ const hostId = composerHostId(discovery);
1087
+ const route = hostId ? routeFor(hostId, discovery) : null;
1088
+ if (!composer) publish(route);
1089
+ return route;
1090
+ },
1091
+ dispose() {
1092
+ if (disposed) return;
1093
+ disposed = true;
1094
+ for (const hostId of routes.keys()) retire(hostId);
1095
+ lastDiscovery = null;
1096
+ if (target.__codexhostHostRoutingV1 === routing) {
1097
+ delete target.__codexhostHostRoutingV1;
1098
+ publish(null);
1099
+ }
1100
+ }
1101
+ };
1102
+ Object.defineProperty(target, "__codexhostHostRoutingV1", { configurable: true, value: routing });
1103
+ return routing;
1104
+ }
1105
+
1106
+ // packages/desktop-control/src/renderer-draft-prewarm-policy.ts
984
1107
  var REQUEST_MANAGER_WAIT_TIMEOUT_MS = 6e4;
985
1108
  var REQUEST_MANAGER_POLL_INTERVAL_MS = 25;
986
1109
  function directRendererInstaller() {
987
- return `(async () => {
988
- const selected = ${FIND_REQUEST_MANAGER_EXPRESSION};
989
- if (
990
- selected.candidateCount !== 1 ||
991
- typeof selected.hostId !== 'string' ||
992
- selected.hostId.length === 0 ||
993
- selected.manager == null ||
994
- selected.requestClient == null
995
- ) {
996
- throw new Error('Renderer request manager is ambiguous');
997
- }
998
- if (selected.prewarmedThreadManager == null) {
999
- throw new Error('Renderer prewarmed Thread manager is unavailable');
1000
- }
1001
- return (${installDraftPrewarmPolicyBridge.toString()})(
1002
- selected.manager,
1003
- selected.requestClient,
1004
- selected.hostId,
1005
- window,
1006
- selected.prewarmedThreadManager,
1007
- () => (${IS_CURRENT_REQUEST_MANAGER})(
1008
- selected.manager, selected.requestClient, selected.hostId, selected.prewarmedThreadManager,
1110
+ return `(() => {
1111
+ const committedReactAncestors = ${committedReactAncestors.toString()};
1112
+ const requestManagerFromHookState = ${requestManagerFromHookState.toString()};
1113
+ const discoverRendererHosts = ${discoverRendererHosts.toString()};
1114
+ const resolveRendererHostManager = ${resolveRendererHostManager.toString()};
1115
+ const retainRendererHostResponses = ${retainRendererHostResponses.toString()};
1116
+ const createDraftPrewarmPolicyBridge = ${createDraftPrewarmPolicyBridge.toString()};
1117
+ const routing = (${installRendererHostRouting.toString()})(
1118
+ document, window,
1119
+ (root) => discoverRendererHosts(root, committedReactAncestors, requestManagerFromHookState),
1120
+ (discovery, hostId) => resolveRendererHostManager(discovery, hostId, requestManagerFromHookState),
1121
+ (manager, bridge, hostId, target, prewarmed, isCurrent) => createDraftPrewarmPolicyBridge(
1122
+ manager, bridge, hostId, target, prewarmed, isCurrent, retainRendererHostResponses,
1009
1123
  ),
1010
- (${retainRendererHostResponses.toString()}),
1011
1124
  );
1125
+ if (!routing.forComposer()) throw new Error('Renderer request manager is ambiguous');
1126
+ return { state: 'ready', reason: 'owned-request-bridge' };
1012
1127
  })()`;
1013
1128
  }
1014
1129
  async function waitForDraftPrewarmPolicy(evaluate, expression) {
@@ -1016,17 +1131,17 @@ async function waitForDraftPrewarmPolicy(evaluate, expression) {
1016
1131
  while (true) {
1017
1132
  try {
1018
1133
  const value = await evaluate(expression);
1019
- if (!isRecord2(value) || value.state !== "ready" || value.reason !== "owned-request-bridge") {
1134
+ if (typeof value !== "object" || value === null || !("state" in value) || value.state !== "ready" || !("reason" in value) || value.reason !== "owned-request-bridge") {
1020
1135
  throw new Error("Renderer draft prewarm policy returned an invalid status");
1021
1136
  }
1022
- return value;
1137
+ return { state: "ready", reason: "owned-request-bridge" };
1023
1138
  } catch (error) {
1024
1139
  const message = error instanceof Error ? error.message : String(error);
1025
1140
  const remaining = deadline - Date.now();
1026
1141
  if (!message.includes("Renderer request manager is ambiguous") || remaining <= 0) throw error;
1027
- await new Promise((resolve) => {
1028
- setTimeout(resolve, Math.min(REQUEST_MANAGER_POLL_INTERVAL_MS, remaining));
1029
- });
1142
+ await new Promise(
1143
+ (resolve) => setTimeout(resolve, Math.min(REQUEST_MANAGER_POLL_INTERVAL_MS, remaining))
1144
+ );
1030
1145
  }
1031
1146
  }
1032
1147
  }
@@ -1038,7 +1153,7 @@ function installRendererDraftPrewarmPolicyDirect(renderer) {
1038
1153
  }
1039
1154
 
1040
1155
  // packages/desktop-control/src/renderer-cdp-control-session.ts
1041
- function isRecord3(value) {
1156
+ function isRecord2(value) {
1042
1157
  return typeof value === "object" && value !== null && !Array.isArray(value);
1043
1158
  }
1044
1159
  function sleep(milliseconds) {
@@ -1072,7 +1187,7 @@ var RendererAdapterReadinessError = class extends Error {
1072
1187
  reason;
1073
1188
  };
1074
1189
  function validateBindingStatus(value, expectedAgents) {
1075
- if (!isRecord3(value) || value.version !== 2 || !Array.isArray(value.enabledAgents) || value.enabledAgents.some((agent) => typeof agent !== "string") || !sameAgents(value.enabledAgents, expectedAgents) || !isRecord3(value.adapter)) {
1190
+ if (!isRecord2(value) || value.version !== 2 || !Array.isArray(value.enabledAgents) || value.enabledAgents.some((agent) => typeof agent !== "string") || !sameAgents(value.enabledAgents, expectedAgents) || !isRecord2(value.adapter)) {
1076
1191
  throw new Error("Production Renderer binding returned an invalid status");
1077
1192
  }
1078
1193
  if (value.adapter.state !== "ready" || typeof value.adapter.reason !== "string") {
@@ -1106,8 +1221,8 @@ async function evaluateSource(renderer, source) {
1106
1221
  expression: source,
1107
1222
  awaitPromise: true
1108
1223
  });
1109
- if (!isRecord3(response)) throw new Error("Renderer source evaluation returned an invalid result");
1110
- if (isRecord3(response.exceptionDetails)) {
1224
+ if (!isRecord2(response)) throw new Error("Renderer source evaluation returned an invalid result");
1225
+ if (isRecord2(response.exceptionDetails)) {
1111
1226
  const text = typeof response.exceptionDetails.text === "string" ? response.exceptionDetails.text : "Renderer source evaluation failed";
1112
1227
  throw new Error(text);
1113
1228
  }
@@ -1197,7 +1312,6 @@ var InstalledRendererCdpControlSession = class {
1197
1312
  try {
1198
1313
  const existing = await readBinding(this.renderer);
1199
1314
  if (existing === null) await evaluateSource(this.renderer, this.rendererSource);
1200
- else validateBindingStatus(existing, this.enabledAgents);
1201
1315
  const draftPrewarmPolicy = await this.operations.installDraftPrewarmPolicy(this.renderer);
1202
1316
  const binding = await waitForBinding(
1203
1317
  this.renderer,
@@ -1456,7 +1570,10 @@ ${rendererSource}`,
1456
1570
  "muse",
1457
1571
  "kiro-cli",
1458
1572
  "codebuddy",
1459
- "cursor-cli"
1573
+ "workbuddy",
1574
+ "cursor-cli",
1575
+ "qoder",
1576
+ "qoder-cn"
1460
1577
  ],
1461
1578
  timeoutMs: PRODUCTION_INSTALL_TIMEOUT_MS
1462
1579
  },