openmausbot 0.1.92 → 0.1.94
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/dist/assets/{DesktopViewer-Do6lBa4C.js → DesktopViewer-bxM7NV3N.js} +1 -1
- package/dist/assets/{abnfDiagram-O67JEVCF-Cd3X7Hxc.js → abnfDiagram-O67JEVCF-BhMdJhRJ.js} +1 -1
- package/dist/assets/{arc-DIYc7Ymx.js → arc-B5itKDcx.js} +1 -1
- package/dist/assets/{architectureDiagram-NJMV4G6O-DBmRGVyP.js → architectureDiagram-NJMV4G6O-C5d7UY6U.js} +1 -1
- package/dist/assets/{blockDiagram-BEXU5L5S-CPFePSEE.js → blockDiagram-BEXU5L5S-BrZIhMmu.js} +1 -1
- package/dist/assets/{c4Diagram-YGBWAQC7-DD_DO1qy.js → c4Diagram-YGBWAQC7-7I0ArfbD.js} +1 -1
- package/dist/assets/channel-CdJX6i8k.js +1 -0
- package/dist/assets/{chunk-2Q5K7J3B-BNEeNSjX.js → chunk-2Q5K7J3B-BnEsyN36.js} +1 -1
- package/dist/assets/{chunk-3FUC2YCW-BbinLaqH.js → chunk-3FUC2YCW-BXATQ52s.js} +2 -2
- package/dist/assets/{chunk-5VM5RSS4-BBgYrgDR.js → chunk-5VM5RSS4-B0BpTkEx.js} +1 -1
- package/dist/assets/{chunk-GTNCS2PH-ezXj-kA-.js → chunk-GTNCS2PH-BtLTz6FR.js} +1 -1
- package/dist/assets/{chunk-GWA4HPMP-9FxZ3diV.js → chunk-GWA4HPMP-D6gcZOYt.js} +1 -1
- package/dist/assets/{chunk-JWPE2WC7-CO-40JpI.js → chunk-JWPE2WC7-DCLrosvf.js} +1 -1
- package/dist/assets/{chunk-NETBCI7D-BEhjslYE.js → chunk-NETBCI7D-B9JsknV9.js} +1 -1
- package/dist/assets/{chunk-WEXAMYUT-CNeq4n7_.js → chunk-WEXAMYUT-CsoTxw7z.js} +1 -1
- package/dist/assets/{chunk-XXDRQBXY-OsCY7KSi.js → chunk-XXDRQBXY-0F_frB0c.js} +1 -1
- package/dist/assets/{classDiagram-v2-NBCMYWYE-CloRUEtk.js → classDiagram-v2-NBCMYWYE-DkrpnflX.js} +1 -1
- package/dist/assets/{cose-bilkent-JH36ORCC-D1BGZhp4.js → cose-bilkent-JH36ORCC-BNDwYBt9.js} +1 -1
- package/dist/assets/{cynefin-OW5HDTMX-CUf4T2CN.js → cynefin-OW5HDTMX-JUkNr1Mk.js} +1 -1
- package/dist/assets/{cynefinDiagram-VND7K2PF-DPEZrFGA.js → cynefinDiagram-VND7K2PF-DKeh9N4M.js} +1 -1
- package/dist/assets/{dagre-6A5THRUB-bDe6GIv5.js → dagre-6A5THRUB-ve-6T_wX.js} +1 -1
- package/dist/assets/{diagram-22UHCM2B-CdcUQz55.js → diagram-22UHCM2B-BuJ2d8rT.js} +1 -1
- package/dist/assets/{diagram-3UASUU5V-BZpqGg7c.js → diagram-3UASUU5V-BgOs_Ni-.js} +1 -1
- package/dist/assets/{diagram-ATOU4E4O-DvGM6ugp.js → diagram-ATOU4E4O-DMK6VmcP.js} +1 -1
- package/dist/assets/{diagram-CDSNMT55-DSTmMm0s.js → diagram-CDSNMT55-DksASlcY.js} +1 -1
- package/dist/assets/{diagram-MLGK6HIB-15cucnMn.js → diagram-MLGK6HIB-Bgn8I5k6.js} +1 -1
- package/dist/assets/{diagram-MPIPVDR6-tMbuaE6n.js → diagram-MPIPVDR6-zK0jqO8N.js} +1 -1
- package/dist/assets/{ebnfDiagram-ZINNZB2B-BYxYzjHI.js → ebnfDiagram-ZINNZB2B-vKrbzTwr.js} +1 -1
- package/dist/assets/{elk-276RUBZZ-v6bj852W.js → elk-276RUBZZ-Bzv2mPNf.js} +1 -1
- package/dist/assets/{erDiagram-OPXOYQCR-5lBBlnd2.js → erDiagram-OPXOYQCR-CvOyYuxu.js} +1 -1
- package/dist/assets/{flowDiagram-KWPJA3E3-CZyl1zIj.js → flowDiagram-KWPJA3E3-CtbnDbc0.js} +1 -1
- package/dist/assets/{ganttDiagram-FUAMR5RP-BiAI-ltZ.js → ganttDiagram-FUAMR5RP-c4dMRYyG.js} +1 -1
- package/dist/assets/{gitGraphDiagram-X574FWY7-BAZISkj3.js → gitGraphDiagram-X574FWY7-B34uaQho.js} +1 -1
- package/dist/assets/index-CPYrGsv1.js +610 -0
- package/dist/assets/{index-DGBaEXrM.js → index-CPiqc_DN.js} +1 -1
- package/dist/assets/index-CzT42GR8.css +1 -0
- package/dist/assets/{infoDiagram-VRGFBTTK-B6ooOy-Z.js → infoDiagram-VRGFBTTK-o64ma4CI.js} +1 -1
- package/dist/assets/{ishikawaDiagram-OU5B5YK6-BZ9ksi-B.js → ishikawaDiagram-OU5B5YK6-DV4C9BAm.js} +1 -1
- package/dist/assets/{journeyDiagram-ZHPQQLJL-DWqlzIEe.js → journeyDiagram-ZHPQQLJL-Bf0AHk1H.js} +1 -1
- package/dist/assets/{kanban-definition-PNTS6WVX-JX6piDwL.js → kanban-definition-PNTS6WVX-B1UMSKmE.js} +1 -1
- package/dist/assets/{linear-CmOWzX0P.js → linear-BpKhuyLm.js} +1 -1
- package/dist/assets/{mermaid.core-CF1zwoQ-.js → mermaid.core-B_BKNCw5.js} +5 -5
- package/dist/assets/{mindmap-definition-NLK3R4M7-CGh2K4fW.js → mindmap-definition-NLK3R4M7-DeARruT1.js} +1 -1
- package/dist/assets/{pegDiagram-GJSIUBJH-CDwYN0s7.js → pegDiagram-GJSIUBJH-BOQEk_1D.js} +1 -1
- package/dist/assets/{pieDiagram-5QR66LMP-1rfjJocB.js → pieDiagram-5QR66LMP-EIfoiTZo.js} +1 -1
- package/dist/assets/{quadrantDiagram-O4NWA36T-tKPvPiok.js → quadrantDiagram-O4NWA36T-GgZwT-fi.js} +1 -1
- package/dist/assets/{railroadDiagram-XR7U4H2S-BHLm5vXR.js → railroadDiagram-XR7U4H2S-D9rDQomj.js} +1 -1
- package/dist/assets/{requirementDiagram-PLB6GJNP-CB45STp7.js → requirementDiagram-PLB6GJNP-DAh1MIeo.js} +1 -1
- package/dist/assets/{sankeyDiagram-IPEJSGJF-55QA_huC.js → sankeyDiagram-IPEJSGJF-CPr6Uz64.js} +1 -1
- package/dist/assets/{sequenceDiagram-PO4LG4MO-BckFmQHn.js → sequenceDiagram-PO4LG4MO-BU6VIdcm.js} +1 -1
- package/dist/assets/{sizeCapture-INFHLROL-BFCOJF11.js → sizeCapture-INFHLROL-qF2HO41r.js} +1 -1
- package/dist/assets/{stateDiagram-v2-GCMORJYK-CZvmiVVN.js → stateDiagram-v2-GCMORJYK-DlJ8G4MD.js} +1 -1
- package/dist/assets/{swimlanes-2SLR337P-BpDUCEKy.js → swimlanes-2SLR337P-DzYE8I54.js} +1 -1
- package/dist/assets/swimlanesDiagram-TC7HE7FX-D-U4GtLQ.js +8 -0
- package/dist/assets/{timeline-definition-EJHVYXUP-BpxHq6IK.js → timeline-definition-EJHVYXUP-B7wzEQ0A.js} +1 -1
- package/dist/assets/{usecaseDiagram-POWQR4AR-Cj66vm02.js → usecaseDiagram-POWQR4AR-BvGgrxIP.js} +1 -1
- package/dist/assets/{vennDiagram-UO4OBE2U-C9nRkWE_.js → vennDiagram-UO4OBE2U-CEECdgQg.js} +1 -1
- package/dist/assets/{wardleyDiagram-VNRHLVJA-D-me_nWj.js → wardleyDiagram-VNRHLVJA-XQHA0P_P.js} +1 -1
- package/dist/assets/{xychartDiagram-PMCCYNJV-Dc_fL4mk.js → xychartDiagram-PMCCYNJV-B5mLcZI2.js} +1 -1
- package/dist/index.html +2 -2
- package/dist-server/cloud-home-start.js +1 -0
- package/dist-server/companion/src/routes.js +45 -1
- package/dist-server/container-mcp.js +99 -77
- package/dist-server/drivers/agents-proxy.js +40 -1
- package/dist-server/drivers/pi-mcp-extension.ts +245 -299
- package/dist-server/enterprise/server/index.js +1 -0
- package/dist-server/index.js +18361 -13794
- package/dist-server/local-computer-proxy.js +5 -1
- package/dist-server/local-computer.js +1 -0
- package/dist-server/mcp-gate.js +152 -20
- package/dist-server/mcp-remote-proxy.js +437 -0
- package/dist-server/openmausbot.js +8872 -7620
- package/dist-server/pair-cli.js +8872 -7620
- package/dist-server/permission-proxy.js +65 -1
- package/dist-server/proxy-paths.js +1 -0
- package/dist-server/server/auto-approve.js +33 -11
- package/dist-server/server/boat.js +3 -3
- package/dist-server/server/browser-live.js +14 -5
- package/dist-server/server/browser-runtime.js +6 -0
- package/dist-server/server/channel-queue.js +4 -1
- package/dist-server/server/cli.js +32 -12
- package/dist-server/server/cloud-move-http.js +9 -3
- package/dist-server/server/cloud-move.js +18 -0
- package/dist-server/server/cloud-owner.js +1 -1
- package/dist-server/server/computer-control.js +6 -0
- package/dist-server/server/computer-wait.js +33 -13
- package/dist-server/server/config.js +57 -10
- package/dist-server/server/container-computer.js +43 -32
- package/dist-server/server/decision-log.js +9 -6
- package/dist-server/server/delegations.js +47 -22
- package/dist-server/server/digest.js +12 -2
- package/dist-server/server/drivers/acp/core.js +229 -20
- package/dist-server/server/drivers/acp/cursor.js +13 -1
- package/dist-server/server/drivers/acp/grok.js +208 -3
- package/dist-server/server/drivers/acp/quiet-status.js +257 -0
- package/dist-server/server/drivers/acp/qwen.js +18 -0
- package/dist-server/server/drivers/agents-call.js +28 -0
- package/dist-server/server/drivers/agents-catalog.js +10 -1
- package/dist-server/server/drivers/boatagent.js +2 -0
- package/dist-server/server/drivers/builtIn.js +2 -0
- package/dist-server/server/drivers/cerebras.js +108 -0
- package/dist-server/server/drivers/chat-mcp-tools.js +45 -15
- package/dist-server/server/drivers/claude.js +35 -9
- package/dist-server/server/drivers/codex.js +84 -10
- package/dist-server/server/drivers/openai-chat.js +37 -5
- package/dist-server/server/drivers/pi.js +48 -4
- package/dist-server/server/drivers/prompt-split.js +2 -0
- package/dist-server/server/env-path.js +6 -2
- package/dist-server/server/environment.js +3 -0
- package/dist-server/server/guarded-requests.js +2 -1
- package/dist-server/server/index.js +1353 -311
- package/dist-server/server/live-call-controller.js +868 -0
- package/dist-server/server/live-call.js +216 -0
- package/dist-server/server/local-vm-stop-reason.js +26 -0
- package/dist-server/server/mcp-gate-config.js +43 -12
- package/dist-server/server/mcp-gate.js +127 -25
- package/dist-server/server/mcp-http.js +46 -8
- package/dist-server/server/mcp-remote-proxy.js +108 -0
- package/dist-server/server/new-bot-defaults.js +3 -0
- package/dist-server/server/peer-provenance.js +4 -2
- package/dist-server/server/permission-proxy.js +15 -1
- package/dist-server/server/plan-usage.js +797 -0
- package/dist-server/server/provider-key-check.js +2 -1
- package/dist-server/server/proxy-paths.js +1 -0
- package/dist-server/server/redact.js +2 -0
- package/dist-server/server/request-auth.js +3 -2
- package/dist-server/server/routes/desktop-viewer.js +50 -6
- package/dist-server/server/routes/live.js +98 -0
- package/dist-server/server/routines.js +6 -3
- package/dist-server/server/skill-library.js +207 -0
- package/dist-server/server/skills-library-migration.js +235 -0
- package/dist-server/server/skills.js +66 -3
- package/dist-server/server/steer-queue.js +13 -1
- package/dist-server/server/store.js +86 -4
- package/dist-server/server/surface.js +9 -3
- package/dist-server/server/team-backup.js +2 -1
- package/dist-server/server/thread-events.js +1 -1
- package/dist-server/server/tunnel.js +20 -1
- package/dist-server/server/turn-log.js +10 -0
- package/dist-server/server/turn-resources.js +124 -0
- package/dist-server/server/vps-computer.js +1 -1
- package/dist-server/server/workspace-backup.js +22 -0
- package/dist-server/server/workspace.js +1 -1
- package/dist-server/shared/approval-mode.js +1 -1
- package/dist-server/shared/ask-question.js +13 -0
- package/dist-server/shared/call-consent.js +28 -0
- package/dist-server/shared/live-approval.js +124 -0
- package/dist-server/shared/live-call.js +176 -0
- package/dist-server/shared/redact.js +1 -0
- package/dist-server/shared/skill-md.js +10 -0
- package/dist-server/shared/team-backup.js +3 -0
- package/dist-server/shared/tool-name.js +22 -0
- package/dist-server/shared/tool-scope-support.js +25 -0
- package/dist-server/shared/tool-scope.js +136 -0
- package/dist-server/src/lib/thread-refs.js +406 -0
- package/dist-server/vps-container-mcp.js +99 -77
- package/dist-server/workspace-backup.worker.js +103 -100
- package/enterprise/server/index.js +1 -0
- package/package.json +1 -1
- package/dist/assets/channel-Dtk5Mtic.js +0 -1
- package/dist/assets/index-Cdmjrl28.css +0 -1
- package/dist/assets/index-DR7YPMkW.js +0 -597
- package/dist/assets/swimlanesDiagram-TC7HE7FX-M0GYW9Y3.js +0 -8
|
@@ -34,6 +34,8 @@ import { newEventId, newId } from "../contracts.js";
|
|
|
34
34
|
import { parseAskQuestions, parseChoices, questionAnswersByQuestion } from "../../shared/ask-question.js";
|
|
35
35
|
import { decodeInjectId, encodeInjectId, hostApiKey, localHost, mergeLocalInject, } from "./local-inject.js";
|
|
36
36
|
import { appendNative } from "./native.js";
|
|
37
|
+
import { canUseMcpServer, parseToolScope } from "../../shared/tool-scope.js";
|
|
38
|
+
import { gateServer, mcpStdioServer, resultBudget } from "../mcp-gate-config.js";
|
|
37
39
|
const DRIVER_KIND = "piAgent";
|
|
38
40
|
const PI_ARGS = ["--mode", "rpc", "--no-session"];
|
|
39
41
|
const PI_MODEL_UPDATE_ARGS = ["update", "--models", "--no-approve"];
|
|
@@ -87,6 +89,9 @@ export function piThinkingLevel(effort) {
|
|
|
87
89
|
* a JSON-RPC 2.0 stdio server the pi-mcp-extension consumes. Returns null when
|
|
88
90
|
* there is nothing to mount (the common case). */
|
|
89
91
|
export function buildMcpServers(turn) {
|
|
92
|
+
const parsed = parseToolScope(turn.toolScope);
|
|
93
|
+
if (!parsed.ok)
|
|
94
|
+
throw new Error(parsed.error);
|
|
90
95
|
const servers = {};
|
|
91
96
|
if (turn.integrations?.composio)
|
|
92
97
|
servers.composio = { ...turn.integrations.composio };
|
|
@@ -112,6 +117,22 @@ export function buildMcpServers(turn) {
|
|
|
112
117
|
env: { ...NODE_ENV_FLAG, DWEB_URL: turn.integrations.dweb.url },
|
|
113
118
|
};
|
|
114
119
|
}
|
|
120
|
+
if (turn.integrations?.browser)
|
|
121
|
+
servers.browser = { ...turn.integrations.browser };
|
|
122
|
+
for (const [name, server] of Object.entries(turn.integrations?.custom ?? {}))
|
|
123
|
+
servers[name] = { ...server, scope: "custom" };
|
|
124
|
+
for (const [name, server] of Object.entries(servers)) {
|
|
125
|
+
if (parsed.scope !== undefined && !canUseMcpServer(parsed.scope, name)) {
|
|
126
|
+
delete servers[name];
|
|
127
|
+
continue;
|
|
128
|
+
}
|
|
129
|
+
const gated = gateServer({ name, server, toolScope: parsed.scope, threadId: turn.threadId, budget: name in (turn.integrations?.custom ?? {}) ? resultBudget() : 0, nodeEnv: NODE_ENV_FLAG });
|
|
130
|
+
const stdio = gated ?? mcpStdioServer(server, { nodeEnv: NODE_ENV_FLAG });
|
|
131
|
+
if (!stdio)
|
|
132
|
+
throw new Error("Pi MCP server configuration is invalid");
|
|
133
|
+
const original = server;
|
|
134
|
+
servers[name] = { ...stdio, ...(original.scope ? { scope: original.scope } : {}) };
|
|
135
|
+
}
|
|
115
136
|
return Object.keys(servers).length ? servers : null;
|
|
116
137
|
}
|
|
117
138
|
/** Pure parser: turn a `get_available_models` stdout blob into a catalog.
|
|
@@ -428,6 +449,10 @@ export const PiDriver = {
|
|
|
428
449
|
});
|
|
429
450
|
const sendTurn = async (turn) => {
|
|
430
451
|
const { threadId } = turn;
|
|
452
|
+
const selection = parseToolScope(turn.toolScope);
|
|
453
|
+
if (!selection.ok)
|
|
454
|
+
throw new Error(selection.error);
|
|
455
|
+
const toolScope = selection.scope;
|
|
431
456
|
if (active.has(threadId))
|
|
432
457
|
throw new Error("a turn is already running on this thread");
|
|
433
458
|
// Per-bot Ask/Auto is authoritative for harness turns. Preserve the
|
|
@@ -469,10 +494,13 @@ export const PiDriver = {
|
|
|
469
494
|
// into a 0600 temp file removed when the turn settles — never on argv.
|
|
470
495
|
const mcpServers = buildMcpServers(turn);
|
|
471
496
|
let mcpTempDir = null;
|
|
472
|
-
|
|
497
|
+
let scopeReadyPath;
|
|
498
|
+
if (mcpServers || toolScope !== undefined) {
|
|
473
499
|
mcpTempDir = mkdtempSync(join(tmpdir(), "omb-pi-mcp-"));
|
|
500
|
+
if (toolScope !== undefined)
|
|
501
|
+
scopeReadyPath = join(mcpTempDir, "scope-ready.json");
|
|
474
502
|
try {
|
|
475
|
-
writeFileSync(join(mcpTempDir, "mcp.json"), JSON.stringify({ mcpServers }), { mode: 0o600 });
|
|
503
|
+
writeFileSync(join(mcpTempDir, "mcp.json"), JSON.stringify({ mcpServers: mcpServers ?? {}, toolScope, scopeReadyPath, approvalMode: turn.approvalMode }), { mode: 0o600 });
|
|
476
504
|
}
|
|
477
505
|
catch (err) {
|
|
478
506
|
// A failed write must not leave the temp dir behind — a partial file
|
|
@@ -486,7 +514,7 @@ export const PiDriver = {
|
|
|
486
514
|
throw err;
|
|
487
515
|
}
|
|
488
516
|
}
|
|
489
|
-
const childArgs =
|
|
517
|
+
const childArgs = mcpTempDir ? [...PI_ARGS, "-e", SPAWNED_PROXIES.piMcpExtension] : PI_ARGS;
|
|
490
518
|
// spawnCli can throw synchronously (unresolvable CLI); if it does, the
|
|
491
519
|
// 0600 temp file with the boat token / composio key / comms token must
|
|
492
520
|
// not be left on disk — settle() never runs because no child existed.
|
|
@@ -498,7 +526,7 @@ export const PiDriver = {
|
|
|
498
526
|
env: piEnvironment({
|
|
499
527
|
...process.env,
|
|
500
528
|
...input.environment,
|
|
501
|
-
...(
|
|
529
|
+
...(mcpTempDir ? { OMB_MCP_CONFIG: join(mcpTempDir, "mcp.json") } : {}),
|
|
502
530
|
}),
|
|
503
531
|
});
|
|
504
532
|
}
|
|
@@ -962,6 +990,20 @@ export const PiDriver = {
|
|
|
962
990
|
/* keep going on the engine default */
|
|
963
991
|
}
|
|
964
992
|
}
|
|
993
|
+
if (scopeReadyPath) {
|
|
994
|
+
let ready = false;
|
|
995
|
+
try {
|
|
996
|
+
const receipt = JSON.parse(readFileSync(scopeReadyPath, "utf8"));
|
|
997
|
+
ready = receipt.ok === true && JSON.stringify(receipt.toolScope) === JSON.stringify(toolScope);
|
|
998
|
+
}
|
|
999
|
+
catch { /* Missing or malformed readiness is never a grant. */ }
|
|
1000
|
+
if (!ready) {
|
|
1001
|
+
const message = "Pi tool selection enforcement is unavailable. Update Pi and check the OpenMausBot extension before retrying.";
|
|
1002
|
+
emit({ ...base(threadId, turnId), type: "runtime.error", message });
|
|
1003
|
+
settle(false);
|
|
1004
|
+
throw new Error(message);
|
|
1005
|
+
}
|
|
1006
|
+
}
|
|
965
1007
|
// The stable/volatile split: the full prompt rides only the turn that
|
|
966
1008
|
// establishes - or re-instructs, after a soul edit - this pi session,
|
|
967
1009
|
// which previously re-sent the whole system prompt on every turn and
|
|
@@ -1086,6 +1128,8 @@ export const PiDriver = {
|
|
|
1086
1128
|
computerMcp: true,
|
|
1087
1129
|
composioMcp: true,
|
|
1088
1130
|
phoneMcp: true,
|
|
1131
|
+
customMcp: true,
|
|
1132
|
+
browserMcp: true,
|
|
1089
1133
|
// Host control (the user's real Mac) rides the pi-native permission
|
|
1090
1134
|
// card (`ctx.ui.confirm` → extension_ui_request) gated in the
|
|
1091
1135
|
// extension, so it is offered exactly when the other engines offer
|
|
@@ -57,6 +57,8 @@ export function readPromptSplitReceipt(scope, key) {
|
|
|
57
57
|
stable: record.stable,
|
|
58
58
|
volatile: record.volatile,
|
|
59
59
|
...(typeof record.turnsSinceFull === "number" ? { turnsSinceFull: record.turnsSinceFull } : {}),
|
|
60
|
+
...(typeof record.lastUsed === "number" && record.lastUsed > 0 ? { lastUsed: record.lastUsed } : {}),
|
|
61
|
+
...(typeof record.peakUsed === "number" && record.peakUsed > 0 ? { peakUsed: record.peakUsed } : {}),
|
|
60
62
|
};
|
|
61
63
|
}
|
|
62
64
|
}
|
|
@@ -64,8 +64,9 @@ function knownDirs() {
|
|
|
64
64
|
* invisible until it restarts, because Windows never pushes PATH changes
|
|
65
65
|
* into a live process. Scanning the standard install locations recovers
|
|
66
66
|
* those without a restart — `~/.grok/bin` (the x.ai installer) and
|
|
67
|
-
* `%APPDATA%\npm` (global npm shims), plus `%LOCALAPPDATA%\agy\bin
|
|
68
|
-
* every engine we ship an install
|
|
67
|
+
* `%APPDATA%\npm` (global npm shims), plus `%LOCALAPPDATA%\agy\bin` and
|
|
68
|
+
* `%LOCALAPPDATA%\cursor-agent`, cover every engine we ship an install
|
|
69
|
+
* command for. */
|
|
69
70
|
function windowsKnownDirs() {
|
|
70
71
|
const home = homedir();
|
|
71
72
|
const appData = process.env.APPDATA ?? join(home, "AppData", "Roaming");
|
|
@@ -74,12 +75,15 @@ function windowsKnownDirs() {
|
|
|
74
75
|
join(appData, "npm"), // npm -g shims: claude, codex
|
|
75
76
|
join(home, ".grok", "bin"), // x.ai installer
|
|
76
77
|
join(localAppData, "agy", "bin"), // Antigravity installer
|
|
78
|
+
// Cursor installer: cursor-agent.* and its `agent` copies (MOCA-272)
|
|
79
|
+
join(localAppData, "cursor-agent"),
|
|
77
80
|
join(home, ".local", "bin"), // claude native installer
|
|
78
81
|
join(home, ".claude", "local"),
|
|
79
82
|
join(home, "bin"), // Factory droid installer (%USERPROFILE%\bin)
|
|
80
83
|
join(home, ".bun", "bin"),
|
|
81
84
|
join(home, ".deno", "bin"),
|
|
82
85
|
join(home, "go", "bin"),
|
|
86
|
+
join(process.env.ProgramFiles ?? "C:\\Program Files", "Docker", "Docker", "resources", "bin"), // Docker Desktop installer
|
|
83
87
|
];
|
|
84
88
|
}
|
|
85
89
|
let cached = null;
|
|
@@ -102,6 +102,9 @@ export function environmentDescriptor(input) {
|
|
|
102
102
|
// Never advertise a protocol this server would refuse: the routes are
|
|
103
103
|
// gone unless features.sharedComputers is on, so the capability is too.
|
|
104
104
|
...(input.sharedComputers === true ? { sharedComputers: true } : {}),
|
|
105
|
+
// An OMB Cloud home: its pairing page says "Opening your Cloud…" and
|
|
106
|
+
// where to connect from, not "the code shown on the server".
|
|
107
|
+
...(input.cloudHome === true ? { cloudHome: true } : {}),
|
|
105
108
|
selfUpdate: input.desktopManaged ? "desktop-managed" : "operator",
|
|
106
109
|
emailSignIn: input.emailSignIn === true,
|
|
107
110
|
},
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { isPersistentQuestionCard } from "../shared/ask-question.js";
|
|
1
2
|
export function requestConflict(message = "The request no longer owns this conversation") {
|
|
2
3
|
return Object.assign(new Error(message), { status: 409, code: "guarded_request_changed" });
|
|
3
4
|
}
|
|
@@ -54,7 +55,7 @@ export function requestSourceForCard(messages, messageId) {
|
|
|
54
55
|
return undefined;
|
|
55
56
|
}
|
|
56
57
|
export function requestNeedsInput(message) {
|
|
57
|
-
return Boolean((message.card?.requestId && !message.card.answered && !message.card.dismissed && !message.card.expired) ||
|
|
58
|
+
return Boolean((message.card?.requestId && !message.card.answered && !message.card.dismissed && !message.card.expired && !isPersistentQuestionCard(message.card)) ||
|
|
58
59
|
(message.connector && !message.connector.dismissed && !message.connector.resumed && message.connector.status !== "connected") ||
|
|
59
60
|
(message.secret && !message.secret.provided && !message.secret.dismissed && !message.secret.superseded));
|
|
60
61
|
}
|