@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.
- package/README.md +1 -1
- package/THIRD_PARTY_NOTICES.txt +12 -4
- package/app/codexhost-distribution.json +1 -1
- package/app/desktop-controller.mjs +287 -170
- package/app/host-runtime.mjs +2450 -1044
- package/app/plugins/antigravity/plugin.mjs +167 -16
- package/app/plugins/claude-code/plugin.mjs +311 -58
- package/app/plugins/codebuddy/plugin.mjs +2355 -894
- package/app/plugins/cursor-cli/plugin.mjs +35973 -10933
- package/app/plugins/deepseek-harness/plugin.mjs +125 -7
- package/app/plugins/enabled.json +4 -1
- package/app/plugins/grok/plugin.mjs +261 -97
- package/app/plugins/hermes/plugin.mjs +2486 -99
- package/app/plugins/kiro-cli/plugin.mjs +120 -3
- package/app/plugins/muse/plugin.mjs +110 -0
- package/app/plugins/omp/plugin.mjs +145 -10
- package/app/plugins/opencode/plugin.mjs +162 -46
- package/app/plugins/pi/plugin.mjs +2891 -1678
- package/app/plugins/qoder/assets/icon.svg +1 -0
- package/app/plugins/qoder/manifest.json +12 -0
- package/app/plugins/qoder/plugin.mjs +52352 -0
- package/app/plugins/qoder-cn/assets/icon.svg +1 -0
- package/app/plugins/qoder-cn/manifest.json +12 -0
- package/app/plugins/qoder-cn/plugin.mjs +52350 -0
- package/app/plugins/workbuddy/assets/icon.svg +29 -0
- package/app/plugins/workbuddy/manifest.json +14 -0
- package/app/plugins/workbuddy/plugin.mjs +25007 -0
- package/app/renderer-extension.js +6043 -1442
- package/bin/boft.exe +0 -0
- package/libexec/boft-node-repl.exe +0 -0
- package/libexec/boft-shim.exe +0 -0
- package/libexec/boft-updater.exe +0 -0
- package/licenses/Qoder-Agent-SDK-LICENSE.txt +7 -0
- package/licenses/QoderCN-Agent-SDK-LICENSE.txt +7 -0
- package/licenses/{opencodex-LICENSE.txt → tailwindcss-LICENSE.txt} +1 -1
- 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
|
|
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 (!
|
|
346
|
+
if (!isRecord3(data) || data.type !== "mcp-response" || data.hostId !== hostId) return;
|
|
347
347
|
const message = data.message;
|
|
348
|
-
if (!
|
|
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 =
|
|
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 (!
|
|
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
|
|
379
|
-
|
|
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
|
-
|
|
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 (!
|
|
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 || !
|
|
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" &&
|
|
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" &&
|
|
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 (!
|
|
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 (
|
|
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" &&
|
|
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" &&
|
|
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" || !
|
|
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 (!
|
|
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 =
|
|
713
|
+
const ownerships = isRecord3(value) && Array.isArray(value.threads) ? value.threads : null;
|
|
706
714
|
const ownership = ownerships?.[0];
|
|
707
|
-
if (!ownerships || !
|
|
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
|
|
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 (!
|
|
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
|
-
|
|
776
|
-
|
|
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
|
|
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 (!
|
|
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
|
-
|
|
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-
|
|
879
|
-
function
|
|
880
|
-
const
|
|
881
|
-
|
|
882
|
-
|
|
883
|
-
|
|
884
|
-
|
|
885
|
-
|
|
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 (
|
|
899
|
-
|
|
900
|
-
|
|
901
|
-
|
|
902
|
-
|
|
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
|
|
905
|
-
|
|
906
|
-
|
|
907
|
-
|
|
908
|
-
const
|
|
909
|
-
const
|
|
910
|
-
const
|
|
911
|
-
|
|
912
|
-
)
|
|
913
|
-
|
|
914
|
-
|
|
915
|
-
|
|
916
|
-
|
|
917
|
-
|
|
918
|
-
|
|
919
|
-
|
|
920
|
-
|
|
921
|
-
|
|
922
|
-
|
|
923
|
-
|
|
924
|
-
|
|
925
|
-
|
|
926
|
-
|
|
927
|
-
|
|
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
|
|
938
|
-
const
|
|
939
|
-
|
|
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
|
-
|
|
961
|
-
|
|
962
|
-
|
|
963
|
-
prewarmedThreadManager: selected?.prewarmedThreadManager ?? null,
|
|
962
|
+
hostIds: [...hostIds],
|
|
963
|
+
managers: [...managers],
|
|
964
|
+
registries: [...registries]
|
|
964
965
|
};
|
|
965
|
-
}
|
|
966
|
-
|
|
967
|
-
|
|
968
|
-
|
|
969
|
-
|
|
970
|
-
|
|
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 `(
|
|
988
|
-
const
|
|
989
|
-
|
|
990
|
-
|
|
991
|
-
|
|
992
|
-
|
|
993
|
-
|
|
994
|
-
|
|
995
|
-
|
|
996
|
-
|
|
997
|
-
|
|
998
|
-
|
|
999
|
-
|
|
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 (!
|
|
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
|
|
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(
|
|
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
|
|
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 (!
|
|
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 (!
|
|
1110
|
-
if (
|
|
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
|
-
"
|
|
1573
|
+
"workbuddy",
|
|
1574
|
+
"cursor-cli",
|
|
1575
|
+
"qoder",
|
|
1576
|
+
"qoder-cn"
|
|
1460
1577
|
],
|
|
1461
1578
|
timeoutMs: PRODUCTION_INSTALL_TIMEOUT_MS
|
|
1462
1579
|
},
|