negotium 0.22.5 → 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.
Files changed (33) hide show
  1. package/dist/agent-helpers.js +56 -18
  2. package/dist/agent-helpers.js.map +7 -7
  3. package/dist/browser-runtime.js +38 -11
  4. package/dist/browser-runtime.js.map +4 -4
  5. package/dist/{chunk-7rpbcn1j.js → chunk-1gznvrth.js} +3 -3
  6. package/dist/{chunk-7rpbcn1j.js.map → chunk-1gznvrth.js.map} +2 -2
  7. package/dist/{chunk-vh8px000.js → chunk-pr8p6pap.js} +7 -2
  8. package/dist/{chunk-vh8px000.js.map → chunk-pr8p6pap.js.map} +3 -3
  9. package/dist/{chunk-a3me2mje.js → chunk-z4r7tt2p.js} +1 -1
  10. package/dist/hosted-agent.js +8 -3
  11. package/dist/hosted-agent.js.map +4 -4
  12. package/dist/main.js +86 -19
  13. package/dist/main.js.map +9 -9
  14. package/dist/mcp-factories.js +56 -18
  15. package/dist/mcp-factories.js.map +7 -7
  16. package/dist/registry.js +3 -3
  17. package/dist/rollout.js +2 -2
  18. package/dist/runtime/src/platform/playwright/manager.ts +77 -15
  19. package/dist/runtime/src/storage/api-topics.ts +6 -0
  20. package/dist/runtime/src/storage/browser-profiles.ts +18 -0
  21. package/dist/runtime/src/topics/lifecycle.ts +2 -5
  22. package/dist/runtime/src/topics/update.ts +37 -0
  23. package/dist/runtime/src/types/api.ts +6 -0
  24. package/dist/runtime/src/version.ts +1 -1
  25. package/dist/storage.js +7 -2
  26. package/dist/storage.js.map +3 -3
  27. package/dist/types/packages/core/src/platform/playwright/manager.d.ts +8 -0
  28. package/dist/types/packages/core/src/storage/api-topics.d.ts +1 -0
  29. package/dist/types/packages/core/src/storage/browser-profiles.d.ts +4 -0
  30. package/dist/types/packages/core/src/types/api.d.ts +6 -0
  31. package/dist/types/packages/core/src/version.d.ts +1 -1
  32. package/package.json +1 -1
  33. /package/dist/{chunk-a3me2mje.js.map → chunk-z4r7tt2p.js.map} +0 -0
@@ -2483,6 +2483,7 @@ function initializeApiTopicsSchema() {
2483
2483
  surface_scope TEXT,
2484
2484
  browser_profile TEXT NOT NULL DEFAULT 'default',
2485
2485
  browser_profile_owner TEXT,
2486
+ browser_connect_port INTEGER,
2486
2487
  session_id TEXT,
2487
2488
  CHECK (
2488
2489
  (kind = 'channel' AND response_policy = 'off' AND agent IS NULL) OR
@@ -2600,6 +2601,9 @@ function initializeApiTopicsSchema() {
2600
2601
  if (!tableColumns("api_topics").has("browser_profile_owner")) {
2601
2602
  db.exec("ALTER TABLE api_topics ADD COLUMN browser_profile_owner TEXT");
2602
2603
  }
2604
+ if (!tableColumns("api_topics").has("browser_connect_port")) {
2605
+ db.exec("ALTER TABLE api_topics ADD COLUMN browser_connect_port INTEGER");
2606
+ }
2603
2607
  if (!tableColumns("api_topics").has("subagent_report_mode")) {
2604
2608
  db.exec("ALTER TABLE api_topics ADD COLUMN subagent_report_mode TEXT NOT NULL DEFAULT 'auto'");
2605
2609
  }
@@ -2837,7 +2841,8 @@ function rowToDto2(r, participants = getTopicParticipants(r.id), tellTargets) {
2837
2841
  } : {},
2838
2842
  visibility: normalizeTopicVisibility(r.visibility),
2839
2843
  surface: normalizeTopicSurface(r.surface),
2840
- surfaceScope: normalizeSurfaceScope(r.surface_scope)
2844
+ surfaceScope: normalizeSurfaceScope(r.surface_scope),
2845
+ ...r.browser_connect_port != null ? { browserConnectPort: r.browser_connect_port } : {}
2841
2846
  };
2842
2847
  }
2843
2848
  function normalizeTopicVisibility(value) {
@@ -5236,7 +5241,7 @@ var init_codex = __esm(async () => {
5236
5241
  });
5237
5242
 
5238
5243
  // ../../packages/core/src/version.ts
5239
- var NEGOTIUM_VERSION = "0.22.5";
5244
+ var NEGOTIUM_VERSION = "0.22.7";
5240
5245
 
5241
5246
  // ../../packages/core/src/agents/codex-native-multi-agent.ts
5242
5247
  import { spawn as spawn2 } from "child_process";
@@ -13007,6 +13012,16 @@ function getTopicBrowserProfile(topicId) {
13007
13012
  const value = db.query("SELECT browser_profile FROM api_topics WHERE id = ?").get(topicId)?.browser_profile;
13008
13013
  return value || DEFAULT_BROWSER_PROFILE;
13009
13014
  }
13015
+ function isBrowserConnectPort(value) {
13016
+ return Number.isInteger(value) && value >= 1024 && value <= 65535;
13017
+ }
13018
+ function getTopicBrowserConnectPort(topicId) {
13019
+ const value = db.query("SELECT browser_connect_port FROM api_topics WHERE id = ?").get(topicId)?.browser_connect_port;
13020
+ return isBrowserConnectPort(value) ? value : undefined;
13021
+ }
13022
+ function setTopicBrowserConnectPort(topicId, port) {
13023
+ db.query("UPDATE api_topics SET browser_connect_port = ? WHERE id = ?").run(port, topicId);
13024
+ }
13010
13025
  function hasBrowserProfileTopic(topicId) {
13011
13026
  return Boolean(db.query("SELECT id FROM api_topics WHERE id = ?").get(topicId));
13012
13027
  }
@@ -13083,6 +13098,9 @@ function resolvePlaywrightTopicBinding(userId, topic) {
13083
13098
  function defaultTopicBinding(userId, topic) {
13084
13099
  if (!topic)
13085
13100
  return managerHost.resolveNamedBinding(userId, "default");
13101
+ const connectPort = getTopicBrowserConnectPort(topic);
13102
+ if (connectPort !== undefined)
13103
+ return connectBinding(connectPort);
13086
13104
  const ownerId = getBrowserProfileOwner(topic, userId);
13087
13105
  const profile = getTopicBrowserProfile(topic);
13088
13106
  return managerHost.resolveNamedBinding(ownerId, profile);
@@ -13096,6 +13114,26 @@ function validateProfileBinding(binding) {
13096
13114
  }
13097
13115
  return Object.freeze({ ...binding });
13098
13116
  }
13117
+ function connectBinding(port) {
13118
+ return { instanceKey: `connect:${port}`, ownerId: "local", profile: `connect-${port}` };
13119
+ }
13120
+ function parseConnectInstanceKey(instanceKey) {
13121
+ const match = /^connect:(\d+)$/.exec(instanceKey);
13122
+ return match ? Number(match[1]) : undefined;
13123
+ }
13124
+ function browserRsArgs(instanceKey, port, userDataDir) {
13125
+ const connectPort = parseConnectInstanceKey(instanceKey);
13126
+ return [
13127
+ "--port",
13128
+ String(port),
13129
+ "--host",
13130
+ "127.0.0.1",
13131
+ "--headed",
13132
+ "--user-data-dir",
13133
+ userDataDir,
13134
+ ...connectPort === undefined ? [] : ["--connect", String(connectPort)]
13135
+ ];
13136
+ }
13099
13137
  function defaultNamedBinding(_ownerId, rawProfile) {
13100
13138
  const profile = normalizeBrowserProfileName(rawProfile);
13101
13139
  const instanceKey = `profile:${profile}`;
@@ -13115,6 +13153,9 @@ function defaultChildEnvironment(context) {
13115
13153
  return childEnvironment;
13116
13154
  }
13117
13155
  function parseInstanceKey(instanceKey) {
13156
+ const connectPort = parseConnectInstanceKey(instanceKey);
13157
+ if (connectPort !== undefined)
13158
+ return { ownerId: "local", profile: `_connect-${connectPort}` };
13118
13159
  const shared = /^profile:(.+)$/.exec(instanceKey);
13119
13160
  if (shared && !shared[1].includes(":")) {
13120
13161
  return { ownerId: "local", profile: normalizeBrowserProfileName(shared[1]) };
@@ -13342,15 +13383,7 @@ async function spawnPlaywright(instanceKey, ownerId, reservedPort, browserBin =
13342
13383
  const userDataDir = resolveUserDataDir(instanceKey);
13343
13384
  const port = reservedPort ?? await allocatePort();
13344
13385
  mkdirSync11(userDataDir, { recursive: true });
13345
- const mcpArgs = [
13346
- "--port",
13347
- String(port),
13348
- "--host",
13349
- "127.0.0.1",
13350
- "--headed",
13351
- "--user-data-dir",
13352
- userDataDir
13353
- ];
13386
+ const mcpArgs = browserRsArgs(instanceKey, port, userDataDir);
13354
13387
  const proxy = managerHost.resolveProxy();
13355
13388
  if (proxy) {
13356
13389
  releasePort(port);
@@ -13538,8 +13571,12 @@ async function waitForPortRelease(port, timeoutMs = 3000) {
13538
13571
  await delay(200);
13539
13572
  }
13540
13573
  }
13541
- async function closeBrowserOwnerTabs(ownerId, rawProfile, owner) {
13542
- const binding = resolvePlaywrightProfileBinding(ownerId, rawProfile);
13574
+ function closeTopicBrowserTabs(userId, topicId) {
13575
+ const connectPort = getTopicBrowserConnectPort(topicId);
13576
+ const binding = connectPort === undefined ? resolvePlaywrightProfileBinding(getBrowserProfileOwner(topicId, userId), getTopicBrowserProfile(topicId)) : connectBinding(connectPort);
13577
+ return closeBindingOwnerTabs(binding, `topic:${topicId}`);
13578
+ }
13579
+ async function closeBindingOwnerTabs(binding, owner) {
13543
13580
  const instanceKey = binding.instanceKey;
13544
13581
  const inProgress = spawning.get(instanceKey);
13545
13582
  if (inProgress)
@@ -13613,6 +13650,7 @@ async function cloneProfileForChild(opts) {
13613
13650
  if (srcOwner === dstOwner && hasBrowserProfileTopic(opts.dstTopic)) {
13614
13651
  const profile = getTopicBrowserProfile(opts.srcTopic);
13615
13652
  assignTopicBrowserProfile({ topicId: opts.dstTopic, actorUserId: dstOwner, profile });
13653
+ setTopicBrowserConnectPort(opts.dstTopic, getTopicBrowserConnectPort(opts.srcTopic) ?? null);
13616
13654
  const binding = resolvePlaywrightProfileBinding(srcOwner, profile);
13617
13655
  const sharedDir = resolveUserDataDir(binding.instanceKey);
13618
13656
  return {
@@ -13629,6 +13667,9 @@ async function cloneProfileForChild(opts) {
13629
13667
  if (srcDir === dstDir) {
13630
13668
  return { copied: false, srcDir, dstDir, reason: "same-dir" };
13631
13669
  }
13670
+ if (parseConnectInstanceKey(srcKey) !== undefined || parseConnectInstanceKey(dstKey) !== undefined) {
13671
+ return { copied: false, srcDir, dstDir, reason: "connect-binding" };
13672
+ }
13632
13673
  return withPlaywrightInstanceMaintenance([srcKey, dstKey], async () => {
13633
13674
  const parentWasLive = instances.has(srcKey);
13634
13675
  if (parentWasLive) {
@@ -17843,10 +17884,8 @@ async function deleteTopicCascadeImpl(topic, userId, options, deletingAncestorId
17843
17884
  await deleteTopicCascadeImpl(child, userId, childOptions, deletingTopicIds);
17844
17885
  }
17845
17886
  killBgBash(userId, topicId);
17846
- const browserProfileOwner = getBrowserProfileOwner(topicId, userId);
17847
- const browserProfile = getTopicBrowserProfile(topicId);
17848
17887
  try {
17849
- await closeBrowserOwnerTabs(browserProfileOwner, browserProfile, `topic:${topicId}`);
17888
+ await closeTopicBrowserTabs(userId, topicId);
17850
17889
  } catch (err2) {
17851
17890
  logger.warn({ err: err2, topicId }, "deleteTopicCascade: browser owner cleanup failed");
17852
17891
  }
@@ -17928,7 +17967,6 @@ var init_lifecycle = __esm(async () => {
17928
17967
  init_api_topic_brief(),
17929
17968
  init_api_topic_config(),
17930
17969
  init_api_topics(),
17931
- init_browser_profiles(),
17932
17970
  init_forum_db(),
17933
17971
  init_runtime_leases(),
17934
17972
  init_runtime_topic_state(),
@@ -23422,4 +23460,4 @@ export {
23422
23460
  DEFAULT_SELF_CONFIG_PRODUCT
23423
23461
  };
23424
23462
 
23425
- //# debugId=EC76F8098D97C2B164756E2164756E21
23463
+ //# debugId=E43DD0B32649A10364756E2164756E21