negotium 0.22.6 → 0.22.7
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/agent-helpers.js +1349 -410
- package/dist/agent-helpers.js.map +7 -7
- package/dist/background-bash.js +12 -12
- package/dist/background-bash.js.map +2 -2
- package/dist/browser-runtime.js +81 -52
- package/dist/browser-runtime.js.map +4 -4
- package/dist/canonical-mcp-bridge.js +9 -8
- package/dist/canonical-mcp-bridge.js.map +1 -1
- package/dist/{chunk-e59kzyvy.js → chunk-1gznvrth.js} +5 -4
- package/dist/{chunk-e59kzyvy.js.map → chunk-1gznvrth.js.map} +2 -2
- package/dist/chunk-2mx7fq49.js +6 -0
- package/dist/{chunk-bnyvxss3.js.map → chunk-2mx7fq49.js.map} +1 -1
- package/dist/{chunk-1mba9m1j.js → chunk-9zn0bkc9.js} +116 -77
- package/dist/{chunk-1mba9m1j.js.map → chunk-9zn0bkc9.js.map} +2 -2
- package/dist/{chunk-ww8a4ej4.js → chunk-f7p0h1gs.js} +5 -5
- package/dist/{chunk-ww8a4ej4.js.map → chunk-f7p0h1gs.js.map} +2 -2
- package/dist/{chunk-9a50csg6.js → chunk-pr8p6pap.js} +125 -116
- package/dist/{chunk-9a50csg6.js.map → chunk-pr8p6pap.js.map} +7 -7
- package/dist/chunk-q5djsg78.js +200 -0
- package/dist/chunk-q5djsg78.js.map +9 -0
- package/dist/{chunk-1e0nxy7p.js → chunk-z4r7tt2p.js} +12 -12
- package/dist/{chunk-1e0nxy7p.js.map → chunk-z4r7tt2p.js.map} +2 -2
- package/dist/hosted-agent.js +128 -120
- package/dist/hosted-agent.js.map +4 -4
- package/dist/main.js +5174 -3278
- package/dist/main.js.map +9 -9
- package/dist/mcp-catalog.js +4 -4
- package/dist/mcp-catalog.js.map +1 -1
- package/dist/mcp-factories.js +1563 -632
- package/dist/mcp-factories.js.map +7 -7
- package/dist/mcp-servers.js +5 -5
- package/dist/mcp-servers.js.map +1 -1
- package/dist/media.js +3 -3
- package/dist/media.js.map +1 -1
- package/dist/outbox.js +15 -15
- package/dist/outbox.js.map +2 -2
- package/dist/platform-runtime.js +7 -7
- package/dist/platform-runtime.js.map +1 -1
- package/dist/prompts.js +6 -6
- package/dist/prompts.js.map +2 -2
- package/dist/query-runtime.js +18 -16
- package/dist/query-runtime.js.map +2 -2
- package/dist/registry.js +20 -19
- package/dist/registry.js.map +2 -2
- package/dist/rollout.js +41 -41
- package/dist/rollout.js.map +2 -2
- package/dist/runtime/src/platform/playwright/manager.ts +77 -15
- package/dist/runtime/src/storage/api-topics.ts +6 -0
- package/dist/runtime/src/storage/browser-profiles.ts +18 -0
- package/dist/runtime/src/topics/lifecycle.ts +2 -5
- package/dist/runtime/src/topics/update.ts +17 -0
- package/dist/runtime/src/types/api.ts +6 -0
- package/dist/runtime/src/version.ts +1 -1
- package/dist/runtime-gateway.js +12 -12
- package/dist/runtime-gateway.js.map +2 -2
- package/dist/runtime-helpers.js +54 -52
- package/dist/runtime-helpers.js.map +2 -2
- package/dist/sqlite.js +5 -3
- package/dist/sqlite.js.map +2 -2
- package/dist/storage.js +640 -664
- package/dist/storage.js.map +3 -3
- package/dist/types/packages/core/src/platform/playwright/manager.d.ts +8 -0
- package/dist/types/packages/core/src/storage/api-topics.d.ts +1 -0
- package/dist/types/packages/core/src/storage/browser-profiles.d.ts +4 -0
- package/dist/types/packages/core/src/types/api.d.ts +6 -0
- package/dist/types/packages/core/src/version.d.ts +1 -1
- package/dist/vault.js +22 -20
- package/dist/vault.js.map +2 -2
- package/package.json +1 -1
- package/dist/chunk-bnyvxss3.js +0 -77
package/dist/registry.js
CHANGED
|
@@ -1,22 +1,23 @@
|
|
|
1
1
|
// @bun
|
|
2
|
+
import {
|
|
3
|
+
encodeClaudeCwd,
|
|
4
|
+
writeClaudeRollout
|
|
5
|
+
} from "./chunk-z4r7tt2p.js";
|
|
2
6
|
import {
|
|
3
7
|
CLAUDE_EFFORT_VALUES,
|
|
4
8
|
CODEX_EFFORT_VALUES,
|
|
5
9
|
MAESTRO_EFFORT_VALUES,
|
|
6
|
-
logger,
|
|
7
|
-
MODEL_SONNET,
|
|
8
|
-
MODEL_OPUS,
|
|
9
10
|
MODEL_FABLE,
|
|
11
|
+
MODEL_OPUS,
|
|
12
|
+
MODEL_SONNET,
|
|
13
|
+
__require,
|
|
10
14
|
assertUuidLike,
|
|
11
15
|
ensureCwdExists,
|
|
12
|
-
|
|
16
|
+
extractChatPairs,
|
|
13
17
|
hostedCodexHomePath,
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
encodeClaudeCwd2,
|
|
18
|
-
writeClaudeRollout2
|
|
19
|
-
} from "./chunk-1e0nxy7p.js";
|
|
18
|
+
logger,
|
|
19
|
+
writeCodexRollout
|
|
20
|
+
} from "./chunk-pr8p6pap.js";
|
|
20
21
|
|
|
21
22
|
// ../../packages/core/src/agents/claude-registry.ts
|
|
22
23
|
import { existsSync, mkdirSync, readdirSync, renameSync, unlinkSync } from "fs";
|
|
@@ -49,7 +50,7 @@ var claudeRegistry = {
|
|
|
49
50
|
};
|
|
50
51
|
var claudeRegistryOperations = {
|
|
51
52
|
writeRollout(opts) {
|
|
52
|
-
const { sessionId, rolloutPath } =
|
|
53
|
+
const { sessionId, rolloutPath } = writeClaudeRollout({
|
|
53
54
|
cwd: opts.cwd,
|
|
54
55
|
entries: opts.entries,
|
|
55
56
|
model: claudeRegistry.expandModelAlias(opts.model ?? claudeRegistry.defaultModel),
|
|
@@ -63,7 +64,7 @@ var claudeRegistryOperations = {
|
|
|
63
64
|
...title ? { title } : {}
|
|
64
65
|
});
|
|
65
66
|
const projectsRoot = join(homedir(), ".claude", "projects");
|
|
66
|
-
const destDir = join(projectsRoot,
|
|
67
|
+
const destDir = join(projectsRoot, encodeClaudeCwd(cwd));
|
|
67
68
|
const destPath = join(destDir, `${result.sessionId}.jsonl`);
|
|
68
69
|
if (!existsSync(destPath)) {
|
|
69
70
|
const sourcePath = readdirSync(projectsRoot).map((d) => join(projectsRoot, d, `${result.sessionId}.jsonl`)).find((p) => existsSync(p));
|
|
@@ -79,7 +80,7 @@ var claudeRegistryOperations = {
|
|
|
79
80
|
};
|
|
80
81
|
},
|
|
81
82
|
async cleanupRollouts({ cwd, sessionIds }) {
|
|
82
|
-
const projectsDir = join(homedir(), ".claude", "projects",
|
|
83
|
+
const projectsDir = join(homedir(), ".claude", "projects", encodeClaudeCwd(cwd));
|
|
83
84
|
const failures = [];
|
|
84
85
|
for (const sid of sessionIds) {
|
|
85
86
|
const path = join(projectsDir, `${sid}.jsonl`);
|
|
@@ -121,7 +122,7 @@ var codexRegistry = {
|
|
|
121
122
|
};
|
|
122
123
|
var codexRegistryOperations = {
|
|
123
124
|
writeRollout(opts) {
|
|
124
|
-
const { threadId, rolloutPath } =
|
|
125
|
+
const { threadId, rolloutPath } = writeCodexRollout({
|
|
125
126
|
cwd: opts.cwd,
|
|
126
127
|
entries: opts.entries,
|
|
127
128
|
model: opts.model ?? codexRegistry.defaultModel,
|
|
@@ -131,7 +132,7 @@ var codexRegistryOperations = {
|
|
|
131
132
|
return { sessionId: threadId, rolloutPath };
|
|
132
133
|
},
|
|
133
134
|
async forkSession({ parentSessionId }) {
|
|
134
|
-
const { forkCodexSession } = await import("./chunk-
|
|
135
|
+
const { forkCodexSession } = await import("./chunk-1gznvrth.js");
|
|
135
136
|
return await forkCodexSession(parentSessionId);
|
|
136
137
|
},
|
|
137
138
|
async cleanupRollouts({ sessionIds }) {
|
|
@@ -232,7 +233,7 @@ function writeRollout(options) {
|
|
|
232
233
|
ensureCwdExists(options.cwd);
|
|
233
234
|
const path = maestroSessionPath(sessionId);
|
|
234
235
|
mkdirSync2(maestroSessionsDir(), { recursive: true });
|
|
235
|
-
const messages =
|
|
236
|
+
const messages = extractChatPairs(options.entries).flatMap((pair) => [
|
|
236
237
|
{ role: "user", content: nonEmptyTurnText(pair.userText) },
|
|
237
238
|
{ role: "assistant", content: nonEmptyTurnText(pair.assistantText) }
|
|
238
239
|
]);
|
|
@@ -328,8 +329,8 @@ function getRegistryOperations(agent) {
|
|
|
328
329
|
var getRegistry2 = (agent) => getRegistry(agent);
|
|
329
330
|
var getRegistryOperations2 = (agent) => getRegistryOperations(agent);
|
|
330
331
|
export {
|
|
331
|
-
|
|
332
|
-
|
|
332
|
+
getRegistryOperations2 as getRegistryOperations,
|
|
333
|
+
getRegistry2 as getRegistry
|
|
333
334
|
};
|
|
334
335
|
|
|
335
|
-
//# debugId=
|
|
336
|
+
//# debugId=FF2E0073AF14F8B464756E2164756E21
|
package/dist/registry.js.map
CHANGED
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
"import { claudeRegistry, claudeRegistryOperations } from \"#agents/claude-registry\";\nimport { codexRegistry, codexRegistryOperations } from \"#agents/codex-registry\";\nimport type { AgentRegistry, AgentRegistryOperations } from \"#agents/contracts\";\nimport { maestroRegistry, maestroRegistryOperations } from \"#agents/maestro-registry\";\nimport type { AgentKind } from \"#types\";\n\nexport type {\n AgentRegistry,\n AgentRegistryOperations,\n CleanupRolloutsOptions,\n ForkRegistryOptions,\n ForkRegistryResult,\n WriteRolloutOptions,\n WriteRolloutResult,\n} from \"#agents/contracts\";\n\nconst REGISTRIES: Record<AgentKind, AgentRegistry> = {\n claude: claudeRegistry,\n codex: codexRegistry,\n maestro: maestroRegistry,\n};\n\nexport function getRegistry(agent: AgentKind): AgentRegistry {\n return REGISTRIES[agent];\n}\n\nconst OPERATIONS: Record<AgentKind, AgentRegistryOperations> = {\n claude: claudeRegistryOperations,\n codex: codexRegistryOperations,\n maestro: maestroRegistryOperations,\n};\n\nexport function getRegistryOperations(agent: AgentKind): AgentRegistryOperations {\n return OPERATIONS[agent];\n}\n",
|
|
9
9
|
"import {\n type AgentRegistry,\n type AgentRegistryOperations,\n type CleanupRolloutsOptions,\n type ForkRegistryOptions,\n type ForkRegistryResult,\n getRegistry as resolveCoreRegistry,\n getRegistryOperations as resolveCoreRegistryOperations,\n type WriteRolloutOptions,\n type WriteRolloutResult,\n} from \"@negotium/core/registry\";\n\nexport type {\n AgentRegistry,\n AgentRegistryOperations,\n CleanupRolloutsOptions,\n ForkRegistryOptions,\n ForkRegistryResult,\n WriteRolloutOptions,\n WriteRolloutResult,\n};\n\nexport const getRegistry: typeof resolveCoreRegistry = (agent) => resolveCoreRegistry(agent);\n\nexport const getRegistryOperations: typeof resolveCoreRegistryOperations = (agent) =>\n resolveCoreRegistryOperations(agent);\n"
|
|
10
10
|
],
|
|
11
|
-
"mappings": "
|
|
12
|
-
"debugId": "
|
|
11
|
+
"mappings": "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",
|
|
12
|
+
"debugId": "FF2E0073AF14F8B464756E2164756E21",
|
|
13
13
|
"names": []
|
|
14
14
|
}
|
package/dist/rollout.js
CHANGED
|
@@ -1,46 +1,12 @@
|
|
|
1
1
|
// @bun
|
|
2
2
|
import {
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
readCodexPatchCallIds2,
|
|
8
|
-
readLatestCodexPatchPreview2,
|
|
9
|
-
extractLatestCodexContextUsage2,
|
|
10
|
-
readLatestCodexContextUsage2,
|
|
11
|
-
migrateCodexRolloutNativeMultiAgentMetadata2,
|
|
12
|
-
writeCodexRollout2,
|
|
13
|
-
decodeUuidV7Timestamp2
|
|
14
|
-
} from "./chunk-9a50csg6.js";
|
|
3
|
+
encodeClaudeCwd,
|
|
4
|
+
repairPoisonedRollout,
|
|
5
|
+
writeClaudeRollout
|
|
6
|
+
} from "./chunk-z4r7tt2p.js";
|
|
15
7
|
import {
|
|
16
|
-
encodeClaudeCwd2,
|
|
17
|
-
writeClaudeRollout2,
|
|
18
|
-
repairPoisonedRollout2
|
|
19
|
-
} from "./chunk-1e0nxy7p.js";
|
|
20
|
-
|
|
21
|
-
// src/rollout.ts
|
|
22
|
-
import { fileURLToPath } from "url";
|
|
23
|
-
configureRolloutHost2({
|
|
24
|
-
fixturesDir: fileURLToPath(new URL("./runtime/src/agents/fixtures", import.meta.url))
|
|
25
|
-
});
|
|
26
|
-
var configureRolloutHost = configureRolloutHost2;
|
|
27
|
-
var decodeUuidV7Timestamp = decodeUuidV7Timestamp2;
|
|
28
|
-
var encodeClaudeCwd = encodeClaudeCwd2;
|
|
29
|
-
var extractCodexPatchCallIds = extractCodexPatchCallIds2;
|
|
30
|
-
var extractChatPairs = extractChatPairs2;
|
|
31
|
-
var extractLatestCodexContextUsage = extractLatestCodexContextUsage2;
|
|
32
|
-
var extractLatestCodexPatchPreview = extractLatestCodexPatchPreview2;
|
|
33
|
-
var migrateCodexRolloutNativeMultiAgentMetadata = migrateCodexRolloutNativeMultiAgentMetadata2;
|
|
34
|
-
var readCodexPatchCallIds = readCodexPatchCallIds2;
|
|
35
|
-
var readLatestCodexContextUsage = readLatestCodexContextUsage2;
|
|
36
|
-
var readLatestCodexPatchPreview = readLatestCodexPatchPreview2;
|
|
37
|
-
var repairPoisonedRollout = repairPoisonedRollout2;
|
|
38
|
-
var writeClaudeRollout = writeClaudeRollout2;
|
|
39
|
-
var writeCodexRollout = writeCodexRollout2;
|
|
40
|
-
export {
|
|
41
8
|
configureRolloutHost,
|
|
42
9
|
decodeUuidV7Timestamp,
|
|
43
|
-
encodeClaudeCwd,
|
|
44
10
|
extractChatPairs,
|
|
45
11
|
extractCodexPatchCallIds,
|
|
46
12
|
extractLatestCodexContextUsage,
|
|
@@ -49,9 +15,43 @@ export {
|
|
|
49
15
|
readCodexPatchCallIds,
|
|
50
16
|
readLatestCodexContextUsage,
|
|
51
17
|
readLatestCodexPatchPreview,
|
|
52
|
-
repairPoisonedRollout,
|
|
53
|
-
writeClaudeRollout,
|
|
54
18
|
writeCodexRollout
|
|
19
|
+
} from "./chunk-pr8p6pap.js";
|
|
20
|
+
|
|
21
|
+
// src/rollout.ts
|
|
22
|
+
import { fileURLToPath } from "url";
|
|
23
|
+
configureRolloutHost({
|
|
24
|
+
fixturesDir: fileURLToPath(new URL("./runtime/src/agents/fixtures", import.meta.url))
|
|
25
|
+
});
|
|
26
|
+
var configureRolloutHost2 = configureRolloutHost;
|
|
27
|
+
var decodeUuidV7Timestamp2 = decodeUuidV7Timestamp;
|
|
28
|
+
var encodeClaudeCwd2 = encodeClaudeCwd;
|
|
29
|
+
var extractCodexPatchCallIds2 = extractCodexPatchCallIds;
|
|
30
|
+
var extractChatPairs2 = extractChatPairs;
|
|
31
|
+
var extractLatestCodexContextUsage2 = extractLatestCodexContextUsage;
|
|
32
|
+
var extractLatestCodexPatchPreview2 = extractLatestCodexPatchPreview;
|
|
33
|
+
var migrateCodexRolloutNativeMultiAgentMetadata2 = migrateCodexRolloutNativeMultiAgentMetadata;
|
|
34
|
+
var readCodexPatchCallIds2 = readCodexPatchCallIds;
|
|
35
|
+
var readLatestCodexContextUsage2 = readLatestCodexContextUsage;
|
|
36
|
+
var readLatestCodexPatchPreview2 = readLatestCodexPatchPreview;
|
|
37
|
+
var repairPoisonedRollout2 = repairPoisonedRollout;
|
|
38
|
+
var writeClaudeRollout2 = writeClaudeRollout;
|
|
39
|
+
var writeCodexRollout2 = writeCodexRollout;
|
|
40
|
+
export {
|
|
41
|
+
writeCodexRollout2 as writeCodexRollout,
|
|
42
|
+
writeClaudeRollout2 as writeClaudeRollout,
|
|
43
|
+
repairPoisonedRollout2 as repairPoisonedRollout,
|
|
44
|
+
readLatestCodexPatchPreview2 as readLatestCodexPatchPreview,
|
|
45
|
+
readLatestCodexContextUsage2 as readLatestCodexContextUsage,
|
|
46
|
+
readCodexPatchCallIds2 as readCodexPatchCallIds,
|
|
47
|
+
migrateCodexRolloutNativeMultiAgentMetadata2 as migrateCodexRolloutNativeMultiAgentMetadata,
|
|
48
|
+
extractLatestCodexPatchPreview2 as extractLatestCodexPatchPreview,
|
|
49
|
+
extractLatestCodexContextUsage2 as extractLatestCodexContextUsage,
|
|
50
|
+
extractCodexPatchCallIds2 as extractCodexPatchCallIds,
|
|
51
|
+
extractChatPairs2 as extractChatPairs,
|
|
52
|
+
encodeClaudeCwd2 as encodeClaudeCwd,
|
|
53
|
+
decodeUuidV7Timestamp2 as decodeUuidV7Timestamp,
|
|
54
|
+
configureRolloutHost2 as configureRolloutHost
|
|
55
55
|
};
|
|
56
56
|
|
|
57
|
-
//# debugId=
|
|
57
|
+
//# debugId=4271882C097E879764756E2164756E21
|
package/dist/rollout.js.map
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
"sourcesContent": [
|
|
5
5
|
"import { fileURLToPath } from \"node:url\";\nimport * as coreRollout from \"@negotium/core/rollout\";\n\ncoreRollout.configureRolloutHost({\n fixturesDir: fileURLToPath(new URL(\"./runtime/src/agents/fixtures\", import.meta.url)),\n});\n\nexport type {\n ChatPair,\n ClaudeRolloutOptions,\n ClaudeRolloutResult,\n CodexContextUsage,\n CodexPatchChangePreview,\n CodexPatchPreview,\n CodexRolloutOptions,\n CodexRolloutResult,\n RolloutHostOptions,\n} from \"@negotium/core/rollout\";\n\nexport const configureRolloutHost = coreRollout.configureRolloutHost;\nexport const decodeUuidV7Timestamp = coreRollout.decodeUuidV7Timestamp;\nexport const encodeClaudeCwd = coreRollout.encodeClaudeCwd;\nexport const extractCodexPatchCallIds = coreRollout.extractCodexPatchCallIds;\nexport const extractChatPairs = coreRollout.extractChatPairs;\nexport const extractLatestCodexContextUsage = coreRollout.extractLatestCodexContextUsage;\nexport const extractLatestCodexPatchPreview = coreRollout.extractLatestCodexPatchPreview;\nexport const migrateCodexRolloutNativeMultiAgentMetadata =\n coreRollout.migrateCodexRolloutNativeMultiAgentMetadata;\nexport const readCodexPatchCallIds = coreRollout.readCodexPatchCallIds;\nexport const readLatestCodexContextUsage = coreRollout.readLatestCodexContextUsage;\nexport const readLatestCodexPatchPreview = coreRollout.readLatestCodexPatchPreview;\nexport const repairPoisonedRollout = coreRollout.repairPoisonedRollout;\nexport const writeClaudeRollout = coreRollout.writeClaudeRollout;\nexport const writeCodexRollout = coreRollout.writeCodexRollout;\n"
|
|
6
6
|
],
|
|
7
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;;;AAAA;AAGY,
|
|
8
|
-
"debugId": "
|
|
7
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;;;AAAA;AAGY,qBAAqB;AAAA,EAC/B,aAAa,cAAc,IAAI,IAAI,iCAAiC,YAAY,GAAG,CAAC;AACtF,CAAC;AAcM,IAAM,wBAAmC;AACzC,IAAM,yBAAoC;AAC1C,IAAM,mBAA8B;AACpC,IAAM,4BAAuC;AAC7C,IAAM,oBAA+B;AACrC,IAAM,kCAA6C;AACnD,IAAM,kCAA6C;AACnD,IAAM,+CACC;AACP,IAAM,yBAAoC;AAC1C,IAAM,+BAA0C;AAChD,IAAM,+BAA0C;AAChD,IAAM,yBAAoC;AAC1C,IAAM,sBAAiC;AACvC,IAAM,qBAAgC;",
|
|
8
|
+
"debugId": "4271882C097E879764756E2164756E21",
|
|
9
9
|
"names": []
|
|
10
10
|
}
|
|
@@ -43,9 +43,11 @@ import { sanitizeTopicName } from "#security/sanitize";
|
|
|
43
43
|
import {
|
|
44
44
|
assignTopicBrowserProfile,
|
|
45
45
|
getBrowserProfileOwner,
|
|
46
|
+
getTopicBrowserConnectPort,
|
|
46
47
|
getTopicBrowserProfile,
|
|
47
48
|
hasBrowserProfileTopic,
|
|
48
49
|
normalizeBrowserProfileName,
|
|
50
|
+
setTopicBrowserConnectPort,
|
|
49
51
|
} from "#storage/browser-profiles";
|
|
50
52
|
import {
|
|
51
53
|
browserCdpIsLost,
|
|
@@ -136,6 +138,8 @@ export function resolvePlaywrightTopicBinding(
|
|
|
136
138
|
|
|
137
139
|
function defaultTopicBinding(userId: string, topic: string | undefined): PlaywrightProfileBinding {
|
|
138
140
|
if (!topic) return managerHost.resolveNamedBinding(userId, "default");
|
|
141
|
+
const connectPort = getTopicBrowserConnectPort(topic);
|
|
142
|
+
if (connectPort !== undefined) return connectBinding(connectPort);
|
|
139
143
|
const ownerId = getBrowserProfileOwner(topic, userId);
|
|
140
144
|
const profile = getTopicBrowserProfile(topic);
|
|
141
145
|
return managerHost.resolveNamedBinding(ownerId, profile);
|
|
@@ -167,6 +171,43 @@ function validateProfileBinding(binding: PlaywrightProfileBinding): PlaywrightPr
|
|
|
167
171
|
return Object.freeze({ ...binding });
|
|
168
172
|
}
|
|
169
173
|
|
|
174
|
+
/**
|
|
175
|
+
* Every room pointing at one host-run Chrome shares one Browser.rs attached to
|
|
176
|
+
* it, whoever owns the room: the Chrome, not a node profile, is the identity.
|
|
177
|
+
*/
|
|
178
|
+
function connectBinding(port: number): PlaywrightProfileBinding {
|
|
179
|
+
return { instanceKey: `connect:${port}`, ownerId: "local", profile: `connect-${port}` };
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
function parseConnectInstanceKey(instanceKey: string): number | undefined {
|
|
183
|
+
const match = /^connect:(\d+)$/.exec(instanceKey);
|
|
184
|
+
return match ? Number(match[1]) : undefined;
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
/**
|
|
188
|
+
* Browser.rs argv for one instance. A `connect:` instance attaches to the
|
|
189
|
+
* host's Chrome through `--connect`, which overrides any inherited
|
|
190
|
+
* `AB_CONNECT`; Browser.rs still requires a `--user-data-dir` it then ignores.
|
|
191
|
+
*/
|
|
192
|
+
export function browserRsArgs(instanceKey: string, port: number, userDataDir: string): string[] {
|
|
193
|
+
const connectPort = parseConnectInstanceKey(instanceKey);
|
|
194
|
+
return [
|
|
195
|
+
"--port",
|
|
196
|
+
String(port),
|
|
197
|
+
// Pin to IPv4 so every MCP client reaches the same address family and a
|
|
198
|
+
// future launcher default cannot resolve localhost to an IPv6-only bind.
|
|
199
|
+
"--host",
|
|
200
|
+
"127.0.0.1",
|
|
201
|
+
// Keep the browser visible. Do not rely on the launcher's implicit
|
|
202
|
+
// default: an explicit flag prevents wrapper/upstream default changes
|
|
203
|
+
// from silently switching topic browsers back to headless mode.
|
|
204
|
+
"--headed",
|
|
205
|
+
"--user-data-dir",
|
|
206
|
+
userDataDir,
|
|
207
|
+
...(connectPort === undefined ? [] : ["--connect", String(connectPort)]),
|
|
208
|
+
];
|
|
209
|
+
}
|
|
210
|
+
|
|
170
211
|
function defaultNamedBinding(_ownerId: string, rawProfile: string): PlaywrightProfileBinding {
|
|
171
212
|
const profile = normalizeBrowserProfileName(rawProfile);
|
|
172
213
|
const instanceKey = `profile:${profile}`;
|
|
@@ -317,6 +358,10 @@ interface InstanceKeyParts {
|
|
|
317
358
|
}
|
|
318
359
|
|
|
319
360
|
function parseInstanceKey(instanceKey: string): InstanceKeyParts {
|
|
361
|
+
const connectPort = parseConnectInstanceKey(instanceKey);
|
|
362
|
+
// The leading underscore is outside the profile-name grammar, so no named
|
|
363
|
+
// profile can share (or delete) the placeholder dir of a connect instance.
|
|
364
|
+
if (connectPort !== undefined) return { ownerId: "local", profile: `_connect-${connectPort}` };
|
|
320
365
|
const shared = /^profile:(.+)$/.exec(instanceKey);
|
|
321
366
|
if (shared && !shared[1]!.includes(":")) {
|
|
322
367
|
return { ownerId: "local", profile: normalizeBrowserProfileName(shared[1]!) };
|
|
@@ -776,20 +821,7 @@ async function spawnPlaywright(
|
|
|
776
821
|
const port = reservedPort ?? (await allocatePort());
|
|
777
822
|
mkdirSync(userDataDir, { recursive: true });
|
|
778
823
|
|
|
779
|
-
const mcpArgs =
|
|
780
|
-
"--port",
|
|
781
|
-
String(port),
|
|
782
|
-
// Pin to IPv4 so every MCP client reaches the same address family and a
|
|
783
|
-
// future launcher default cannot resolve localhost to an IPv6-only bind.
|
|
784
|
-
"--host",
|
|
785
|
-
"127.0.0.1",
|
|
786
|
-
// Keep the browser visible. Do not rely on the launcher's implicit
|
|
787
|
-
// default: an explicit flag prevents wrapper/upstream default changes
|
|
788
|
-
// from silently switching topic browsers back to headless mode.
|
|
789
|
-
"--headed",
|
|
790
|
-
"--user-data-dir",
|
|
791
|
-
userDataDir,
|
|
792
|
-
];
|
|
824
|
+
const mcpArgs = browserRsArgs(instanceKey, port, userDataDir);
|
|
793
825
|
// Pass the egress proxy to the child through the environment rather than
|
|
794
826
|
// argv so the credentials never surface in `ps`/`/proc` command lines. The
|
|
795
827
|
// Browser.rs currently rejects this configuration rather than bypassing it.
|
|
@@ -1108,7 +1140,26 @@ export async function closeBrowserOwnerTabs(
|
|
|
1108
1140
|
rawProfile: string,
|
|
1109
1141
|
owner: string,
|
|
1110
1142
|
): Promise<number> {
|
|
1111
|
-
|
|
1143
|
+
return closeBindingOwnerTabs(resolvePlaywrightProfileBinding(ownerId, rawProfile), owner);
|
|
1144
|
+
}
|
|
1145
|
+
|
|
1146
|
+
/** Close a deleted topic's tabs on the browser its turns used. */
|
|
1147
|
+
export function closeTopicBrowserTabs(userId: string, topicId: string): Promise<number> {
|
|
1148
|
+
const connectPort = getTopicBrowserConnectPort(topicId);
|
|
1149
|
+
const binding =
|
|
1150
|
+
connectPort === undefined
|
|
1151
|
+
? resolvePlaywrightProfileBinding(
|
|
1152
|
+
getBrowserProfileOwner(topicId, userId),
|
|
1153
|
+
getTopicBrowserProfile(topicId),
|
|
1154
|
+
)
|
|
1155
|
+
: connectBinding(connectPort);
|
|
1156
|
+
return closeBindingOwnerTabs(binding, `topic:${topicId}`);
|
|
1157
|
+
}
|
|
1158
|
+
|
|
1159
|
+
async function closeBindingOwnerTabs(
|
|
1160
|
+
binding: PlaywrightProfileBinding,
|
|
1161
|
+
owner: string,
|
|
1162
|
+
): Promise<number> {
|
|
1112
1163
|
const instanceKey = binding.instanceKey;
|
|
1113
1164
|
const inProgress = spawning.get(instanceKey);
|
|
1114
1165
|
if (inProgress) await inProgress;
|
|
@@ -1259,6 +1310,9 @@ export async function cloneProfileForChild(opts: {
|
|
|
1259
1310
|
if (srcOwner === dstOwner && hasBrowserProfileTopic(opts.dstTopic)) {
|
|
1260
1311
|
const profile = getTopicBrowserProfile(opts.srcTopic);
|
|
1261
1312
|
assignTopicBrowserProfile({ topicId: opts.dstTopic, actorUserId: dstOwner, profile });
|
|
1313
|
+
// A child of a room on the host's Chrome keeps working in that Chrome;
|
|
1314
|
+
// falling back to a managed profile would drop the login it was made for.
|
|
1315
|
+
setTopicBrowserConnectPort(opts.dstTopic, getTopicBrowserConnectPort(opts.srcTopic) ?? null);
|
|
1262
1316
|
const binding = resolvePlaywrightProfileBinding(srcOwner, profile);
|
|
1263
1317
|
const sharedDir = resolveUserDataDir(binding.instanceKey);
|
|
1264
1318
|
return {
|
|
@@ -1277,6 +1331,14 @@ export async function cloneProfileForChild(opts: {
|
|
|
1277
1331
|
if (srcDir === dstDir) {
|
|
1278
1332
|
return { copied: false, srcDir, dstDir, reason: "same-dir" };
|
|
1279
1333
|
}
|
|
1334
|
+
// A connect instance's dir is an unused placeholder; the real profile lives
|
|
1335
|
+
// in the host's Chrome, which is never copied, quiesced or overwritten.
|
|
1336
|
+
if (
|
|
1337
|
+
parseConnectInstanceKey(srcKey) !== undefined ||
|
|
1338
|
+
parseConnectInstanceKey(dstKey) !== undefined
|
|
1339
|
+
) {
|
|
1340
|
+
return { copied: false, srcDir, dstDir, reason: "connect-binding" };
|
|
1341
|
+
}
|
|
1280
1342
|
|
|
1281
1343
|
return withPlaywrightInstanceMaintenance([srcKey, dstKey], async () => {
|
|
1282
1344
|
// Quiesce parent if running so Chrome flushes SQLite (Cookies, Login Data)
|
|
@@ -319,6 +319,7 @@ function initializeApiTopicsSchema(): void {
|
|
|
319
319
|
surface_scope TEXT,
|
|
320
320
|
browser_profile TEXT NOT NULL DEFAULT 'default',
|
|
321
321
|
browser_profile_owner TEXT,
|
|
322
|
+
browser_connect_port INTEGER,
|
|
322
323
|
session_id TEXT,
|
|
323
324
|
CHECK (
|
|
324
325
|
(kind = 'channel' AND response_policy = 'off' AND agent IS NULL) OR
|
|
@@ -493,6 +494,9 @@ function initializeApiTopicsSchema(): void {
|
|
|
493
494
|
if (!tableColumns("api_topics").has("browser_profile_owner")) {
|
|
494
495
|
db.exec("ALTER TABLE api_topics ADD COLUMN browser_profile_owner TEXT");
|
|
495
496
|
}
|
|
497
|
+
if (!tableColumns("api_topics").has("browser_connect_port")) {
|
|
498
|
+
db.exec("ALTER TABLE api_topics ADD COLUMN browser_connect_port INTEGER");
|
|
499
|
+
}
|
|
496
500
|
if (!tableColumns("api_topics").has("subagent_report_mode")) {
|
|
497
501
|
db.exec("ALTER TABLE api_topics ADD COLUMN subagent_report_mode TEXT NOT NULL DEFAULT 'auto'");
|
|
498
502
|
}
|
|
@@ -907,6 +911,7 @@ export interface TopicRow {
|
|
|
907
911
|
surface: string | null;
|
|
908
912
|
surface_scope: string | null;
|
|
909
913
|
browser_profile_owner: string | null;
|
|
914
|
+
browser_connect_port: number | null;
|
|
910
915
|
session_id: string | null;
|
|
911
916
|
}
|
|
912
917
|
|
|
@@ -1007,6 +1012,7 @@ function rowToDto(
|
|
|
1007
1012
|
visibility: normalizeTopicVisibility(r.visibility),
|
|
1008
1013
|
surface: normalizeTopicSurface(r.surface),
|
|
1009
1014
|
surfaceScope: normalizeSurfaceScope(r.surface_scope),
|
|
1015
|
+
...(r.browser_connect_port != null ? { browserConnectPort: r.browser_connect_port } : {}),
|
|
1010
1016
|
};
|
|
1011
1017
|
}
|
|
1012
1018
|
|
|
@@ -57,6 +57,24 @@ export function getTopicBrowserProfile(topicId: string): string {
|
|
|
57
57
|
return value || DEFAULT_BROWSER_PROFILE;
|
|
58
58
|
}
|
|
59
59
|
|
|
60
|
+
/** Unprivileged TCP ports only: a CDP endpoint never needs a system port. */
|
|
61
|
+
export function isBrowserConnectPort(value: unknown): value is number {
|
|
62
|
+
return Number.isInteger(value) && (value as number) >= 1024 && (value as number) <= 65535;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
export function getTopicBrowserConnectPort(topicId: string): number | undefined {
|
|
66
|
+
const value = db
|
|
67
|
+
.query<{ browser_connect_port: number | null }, string>(
|
|
68
|
+
"SELECT browser_connect_port FROM api_topics WHERE id = ?",
|
|
69
|
+
)
|
|
70
|
+
.get(topicId)?.browser_connect_port;
|
|
71
|
+
return isBrowserConnectPort(value) ? value : undefined;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
export function setTopicBrowserConnectPort(topicId: string, port: number | null): void {
|
|
75
|
+
db.query("UPDATE api_topics SET browser_connect_port = ? WHERE id = ?").run(port, topicId);
|
|
76
|
+
}
|
|
77
|
+
|
|
60
78
|
export function hasBrowserProfileTopic(topicId: string): boolean {
|
|
61
79
|
return Boolean(
|
|
62
80
|
db.query<{ id: string }, string>("SELECT id FROM api_topics WHERE id = ?").get(topicId),
|
|
@@ -21,7 +21,7 @@ import { NODE_ID, resolveTopicWorkspaceDir } from "#platform/config";
|
|
|
21
21
|
import { GENERAL_TOPIC_ID } from "#platform/constants";
|
|
22
22
|
import { delay } from "#platform/delay";
|
|
23
23
|
import { logger } from "#platform/logger";
|
|
24
|
-
import {
|
|
24
|
+
import { closeTopicBrowserTabs, deleteTopicProfileDir } from "#platform/playwright/manager";
|
|
25
25
|
import { abortRoom, getRoomQuery, interSessionQueue } from "#query/active-rooms";
|
|
26
26
|
import { cleanupSessionInboxFiles } from "#query/session-inbox-cleanup";
|
|
27
27
|
import { clearQueryState } from "#query/state";
|
|
@@ -39,7 +39,6 @@ import {
|
|
|
39
39
|
listTopics,
|
|
40
40
|
reparentTopicChildren,
|
|
41
41
|
} from "#storage/api-topics";
|
|
42
|
-
import { getBrowserProfileOwner, getTopicBrowserProfile } from "#storage/browser-profiles";
|
|
43
42
|
import { db } from "#storage/forum-db";
|
|
44
43
|
import { getRuntimeTurnLease } from "#storage/runtime-leases";
|
|
45
44
|
import {
|
|
@@ -355,10 +354,8 @@ async function deleteTopicCascadeImpl(
|
|
|
355
354
|
// Background shells remain topic-owned. Browser profiles are shared, so
|
|
356
355
|
// deletion closes this topic's tabs without deleting login state.
|
|
357
356
|
killBgBash(userId, topicId);
|
|
358
|
-
const browserProfileOwner = getBrowserProfileOwner(topicId, userId);
|
|
359
|
-
const browserProfile = getTopicBrowserProfile(topicId);
|
|
360
357
|
try {
|
|
361
|
-
await
|
|
358
|
+
await closeTopicBrowserTabs(userId, topicId);
|
|
362
359
|
} catch (err) {
|
|
363
360
|
logger.warn({ err, topicId }, "deleteTopicCascade: browser owner cleanup failed");
|
|
364
361
|
}
|
|
@@ -25,6 +25,7 @@ import {
|
|
|
25
25
|
setApiTopicAgent,
|
|
26
26
|
upsertTopic,
|
|
27
27
|
} from "#storage/api-topics";
|
|
28
|
+
import { isBrowserConnectPort, setTopicBrowserConnectPort } from "#storage/browser-profiles";
|
|
28
29
|
import { db } from "#storage/forum-db";
|
|
29
30
|
import { TopicValidationError } from "#topics/create";
|
|
30
31
|
import { type AgentKind, type EffortLevel, isAgentKind } from "#types";
|
|
@@ -48,6 +49,11 @@ export interface UpdateTopicSettingsOptions {
|
|
|
48
49
|
* "Topic-Specific Instructions". An empty string clears them.
|
|
49
50
|
*/
|
|
50
51
|
description?: string;
|
|
52
|
+
/**
|
|
53
|
+
* CDP port (1024-65535) of a Chrome the host already runs for this room;
|
|
54
|
+
* its browser tools attach there. `null` returns the room to its profile.
|
|
55
|
+
*/
|
|
56
|
+
browserConnectPort?: number | null;
|
|
51
57
|
}
|
|
52
58
|
|
|
53
59
|
/** Room for a full work procedure (Otium tax rooms keep one per room), still small next to a turn's prompt. */
|
|
@@ -169,6 +175,14 @@ export function updateTopicSettings(opts: UpdateTopicSettingsOptions): TopicDto
|
|
|
169
175
|
description = trimmed || undefined;
|
|
170
176
|
}
|
|
171
177
|
|
|
178
|
+
if (
|
|
179
|
+
opts.browserConnectPort !== undefined &&
|
|
180
|
+
opts.browserConnectPort !== null &&
|
|
181
|
+
!isBrowserConnectPort(opts.browserConnectPort)
|
|
182
|
+
) {
|
|
183
|
+
throw new TopicValidationError("browserConnectPort must be an integer from 1024 to 65535");
|
|
184
|
+
}
|
|
185
|
+
|
|
172
186
|
if (opts.agent !== undefined && opts.agent !== null && !isAgentKind(opts.agent)) {
|
|
173
187
|
throw new TopicValidationError(`Unknown agent '${opts.agent}'`);
|
|
174
188
|
}
|
|
@@ -250,6 +264,9 @@ export function updateTopicSettings(opts: UpdateTopicSettingsOptions): TopicDto
|
|
|
250
264
|
defaultEffort,
|
|
251
265
|
};
|
|
252
266
|
upsertTopic(next);
|
|
267
|
+
if (opts.browserConnectPort !== undefined) {
|
|
268
|
+
setTopicBrowserConnectPort(next.id, opts.browserConnectPort);
|
|
269
|
+
}
|
|
253
270
|
|
|
254
271
|
// `resolveTopicTurnExecution` reads `config.model ?? topic.defaultModel`, so a
|
|
255
272
|
// stale per-topic override (set earlier by `/model` in the terminal) would
|
|
@@ -71,6 +71,12 @@ export interface TopicDto {
|
|
|
71
71
|
title: string;
|
|
72
72
|
kind?: TopicKind;
|
|
73
73
|
description?: string;
|
|
74
|
+
/**
|
|
75
|
+
* CDP port of a Chrome the host already runs for this room. Its browser
|
|
76
|
+
* tools attach to that Chrome instead of a managed profile; the node never
|
|
77
|
+
* launches, kills or deletes it.
|
|
78
|
+
*/
|
|
79
|
+
browserConnectPort?: number;
|
|
74
80
|
/** AI agent invited to this topic. */
|
|
75
81
|
agent?: AgentKind;
|
|
76
82
|
/** Canonical base model alias used by newer clients. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export const NEGOTIUM_VERSION = "0.22.
|
|
1
|
+
export const NEGOTIUM_VERSION = "0.22.7";
|
package/dist/runtime-gateway.js
CHANGED
|
@@ -152,15 +152,15 @@ async function* parseRuntimeGatewaySse(body) {
|
|
|
152
152
|
const line = buffer.slice(0, newline);
|
|
153
153
|
buffer = buffer.slice(newline + 1);
|
|
154
154
|
if (line === "") {
|
|
155
|
-
const
|
|
156
|
-
if (
|
|
157
|
-
yield
|
|
155
|
+
const parsed2 = flush();
|
|
156
|
+
if (parsed2)
|
|
157
|
+
yield parsed2;
|
|
158
158
|
} else if (line.startsWith("event:")) {
|
|
159
159
|
event = line.slice(6).trim() || "message";
|
|
160
160
|
} else if (line.startsWith("id:")) {
|
|
161
|
-
const
|
|
162
|
-
if (Number.isFinite(
|
|
163
|
-
id =
|
|
161
|
+
const parsed2 = Number.parseInt(line.slice(3).trim(), 10);
|
|
162
|
+
if (Number.isFinite(parsed2))
|
|
163
|
+
id = parsed2;
|
|
164
164
|
} else if (line.startsWith("data:")) {
|
|
165
165
|
data.push(line.slice(5).trimStart());
|
|
166
166
|
}
|
|
@@ -442,12 +442,12 @@ class RuntimeGatewayClient {
|
|
|
442
442
|
}
|
|
443
443
|
}
|
|
444
444
|
export {
|
|
445
|
-
|
|
446
|
-
RUNTIME_GATEWAY_VERSION,
|
|
447
|
-
RuntimeGatewayClient,
|
|
448
|
-
RuntimeGatewayError,
|
|
445
|
+
parseRuntimeGatewaySse,
|
|
449
446
|
parseHostMcpServers,
|
|
450
|
-
|
|
447
|
+
RuntimeGatewayError,
|
|
448
|
+
RuntimeGatewayClient,
|
|
449
|
+
RUNTIME_GATEWAY_VERSION,
|
|
450
|
+
RUNTIME_GATEWAY_CONTROL_PATH
|
|
451
451
|
};
|
|
452
452
|
|
|
453
|
-
//# debugId=
|
|
453
|
+
//# debugId=A92FEBD510CE277D64756E2164756E21
|