negotium 0.1.48 → 0.2.0

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 (51) hide show
  1. package/README.md +1 -1
  2. package/dist/agent-helpers.js +58 -74
  3. package/dist/agent-helpers.js.map +15 -15
  4. package/dist/background-bash.js +22 -10
  5. package/dist/background-bash.js.map +3 -3
  6. package/dist/browser-runtime.js +35 -68
  7. package/dist/browser-runtime.js.map +7 -7
  8. package/dist/{chunk-d9jyt6xe.js → chunk-kc5kmr95.js} +162 -12
  9. package/dist/{chunk-d9jyt6xe.js.map → chunk-kc5kmr95.js.map} +4 -4
  10. package/dist/hosted-agent.js +36 -18
  11. package/dist/hosted-agent.js.map +7 -7
  12. package/dist/main.js +562 -98
  13. package/dist/main.js.map +21 -19
  14. package/dist/mcp-factories.js +602 -223
  15. package/dist/mcp-factories.js.map +16 -16
  16. package/dist/prompts.js +22 -10
  17. package/dist/prompts.js.map +3 -3
  18. package/dist/query-runtime.js +22 -10
  19. package/dist/query-runtime.js.map +4 -4
  20. package/dist/registry.js +286 -10
  21. package/dist/registry.js.map +9 -7
  22. package/dist/rollout.js +14 -2
  23. package/dist/rollout.js.map +3 -3
  24. package/dist/runtime/src/agents/maestro-registry.ts +1 -1
  25. package/dist/runtime/src/agents/rollout/shared.ts +12 -4
  26. package/dist/runtime/src/mcp/mcp-helpers.ts +1 -1
  27. package/dist/runtime/src/mcp/wiki-server.ts +1 -1
  28. package/dist/runtime/src/migration/single-user.ts +621 -0
  29. package/dist/runtime/src/platform/config.ts +24 -11
  30. package/dist/runtime/src/platform/mcp-config.ts +4 -4
  31. package/dist/runtime/src/platform/playwright/manager.ts +10 -28
  32. package/dist/runtime/src/runtime/attachments.ts +3 -3
  33. package/dist/runtime/src/storage/browser-profiles.ts +11 -9
  34. package/dist/runtime/src/storage/conversations.ts +5 -18
  35. package/dist/runtime/src/storage/storage-host.ts +1 -1
  36. package/dist/runtime/src/storage/tasks.ts +2 -14
  37. package/dist/runtime/src/storage/vault.ts +3 -2
  38. package/dist/runtime/src/version.ts +1 -1
  39. package/dist/runtime-helpers.js +22 -10
  40. package/dist/runtime-helpers.js.map +5 -5
  41. package/dist/storage.js +5 -19
  42. package/dist/storage.js.map +5 -5
  43. package/dist/types/packages/core/src/mcp/mcp-helpers.d.ts +1 -1
  44. package/dist/types/packages/core/src/platform/config.d.ts +9 -1
  45. package/dist/types/packages/core/src/runtime/attachments.d.ts +1 -1
  46. package/dist/types/packages/core/src/storage/conversations.d.ts +2 -2
  47. package/dist/types/packages/core/src/version.d.ts +1 -1
  48. package/dist/vault.js +25 -12
  49. package/dist/vault.js.map +4 -4
  50. package/install-browser-rs.mjs +1 -1
  51. package/package.json +2 -2
@@ -105,10 +105,14 @@ function parsePortEnv(envValue, fallback) {
105
105
  var WORKSPACE_DIR = resolveLocalStateDir("NEGOTIUM_WORKSPACE_DIR", "workspace");
106
106
  var TOPIC_WORKSPACE_DIR = resolve(WORKSPACE_DIR, "topics");
107
107
  var SHARED_WIKI_DIR = resolve(WORKSPACE_DIR, "wiki");
108
- var CONTEXTS_DIR = resolve(WORKSPACE_DIR, "contexts");
109
- var BROWSER_PROFILES_DIR = resolve(WORKSPACE_DIR, "browser-profiles");
110
- var DM_WORKSPACE_DIR = resolve(WORKSPACE_DIR, "dm");
111
- var SESSION_WORKSPACE_DIR = resolve(WORKSPACE_DIR, "sessions");
108
+ var CRON_WORKSPACE_DIR = resolve(WORKSPACE_DIR, "cron");
109
+ var BROWSER_DIR = resolveLocalStateDir("NEGOTIUM_BROWSER_DIR", "browser");
110
+ var BROWSER_PROFILES_DIR = resolve(BROWSER_DIR, "profiles");
111
+ var BINARIES_DIR = resolve(STATE_DIR, "binaries");
112
+ var SECRETS_DIR = resolve(STATE_DIR, "secrets");
113
+ var CONTEXTS_DIR = resolve(STATE_DIR, "data", "contexts");
114
+ var DM_WORKSPACE_DIR = resolve(STATE_DIR, "data", "dm");
115
+ var SESSION_WORKSPACE_DIR = resolve(STATE_DIR, "data", "sessions");
112
116
  var CLAUDE_EXECUTABLE_ENV = envText("NEGOTIUM_CLAUDE_EXECUTABLE");
113
117
  var CLAUDE_EXECUTABLE = CLAUDE_EXECUTABLE_ENV ? resolve(CLAUDE_EXECUTABLE_ENV) : undefined;
114
118
  var BROWSER_RS_VERSION = "v0.1.16";
@@ -146,7 +150,7 @@ function resolveBrowserRsBin(envValue) {
146
150
  if (!override && !versionAtLeast(BROWSER_RS_VERSION.replace(/^v/, ""), BROWSER_RS_MIN_SECURE_VERSION)) {
147
151
  return;
148
152
  }
149
- const candidate = override ? resolve(override) : resolve(STATE_DIR, "bin", "browser-rs", BROWSER_RS_VERSION, "browser-rs");
153
+ const candidate = override ? resolve(override) : resolve(BINARIES_DIR, "browser-rs", BROWSER_RS_VERSION, "browser-rs");
150
154
  try {
151
155
  accessSync(candidate, constants.X_OK);
152
156
  return browserRsMeetsMinimumVersion(candidate) ? candidate : undefined;
@@ -159,7 +163,7 @@ function resolveBrowserMcpBin(envValue) {
159
163
  const override = envValue?.trim();
160
164
  if (override)
161
165
  return resolve(override);
162
- return BROWSER_RS_BIN ?? resolve(STATE_DIR, "bin", "browser-rs", BROWSER_RS_VERSION, "browser-rs");
166
+ return BROWSER_RS_BIN ?? resolve(BINARIES_DIR, "browser-rs", BROWSER_RS_VERSION, "browser-rs");
163
167
  }
164
168
  var PLAYWRIGHT_MCP_BIN = resolveBrowserMcpBin(envText("NEGOTIUM_BROWSER_MCP_BIN"));
165
169
  var TSX_BIN = resolveDependencyBin("tsx");
@@ -180,7 +184,7 @@ var BG_BASH_BASE_PORT = parsePortEnv(process.env.BG_BASH_BASE_PORT, 9700);
180
184
  var BG_BASH_MAX_PORT = parsePortEnv(process.env.BG_BASH_MAX_PORT, 9799);
181
185
  function loadOrCreateLocalSecret(envKey, filename, options = {}) {
182
186
  const envValue = envText(envKey);
183
- const secretFile = resolve(STATE_DIR, filename);
187
+ const secretFile = resolve(SECRETS_DIR, filename);
184
188
  mkdirSync(dirname(secretFile), { recursive: true });
185
189
  if (envValue) {
186
190
  if (options.persistEnvValue) {
@@ -220,10 +224,12 @@ var NEGOTIUM_PORT = parseInt(process.env.NEGOTIUM_PORT || "7777", 10);
220
224
  var hostname = process.env.HOSTNAME || "127.0.0.1";
221
225
  var DATA_DIR = resolveLocalStateDir("NEGOTIUM_DATA_DIR", "data");
222
226
  var LOG_DIR = resolveLocalStateDir("NEGOTIUM_LOG_DIR", "logs");
227
+ var UPLOADS_DIR = resolve(DATA_DIR, "uploads");
228
+ var VAULT_DIR = resolve(DATA_DIR, "vault");
223
229
  var SESSIONS_DB = process.env.SESSIONS_DB_PATH ? resolve(process.env.SESSIONS_DB_PATH) : resolve(DATA_DIR, "sessions.db");
224
230
  var DEBUG_FILE = resolve(DATA_DIR, "debug-users.json");
225
231
  var USERS_LOG_DIR = resolve(DATA_DIR, "users");
226
- var RUN_DIR = resolveLocalStateDir("NEGOTIUM_RUN_DIR", "run");
232
+ var RUN_DIR = resolveLocalStateDir("NEGOTIUM_RUN_DIR", "runtime");
227
233
  var PROGRESS_DIR = resolve(RUN_DIR, "progress");
228
234
  var DM_CMD_DIR = resolve(RUN_DIR, "dm-commands");
229
235
  var DM_RESP_DIR = resolve(RUN_DIR, "dm-responses");
@@ -234,6 +240,8 @@ var PLAYWRIGHT_MAX_PORT = parsePortEnv(process.env.PLAYWRIGHT_MAX_PORT, 9499);
234
240
  var PLAYWRIGHT_PORTS_DIR = resolve(RUN_DIR, "playwright-ports");
235
241
  mkdirSync(STATE_DIR, { recursive: true });
236
242
  mkdirSync(DATA_DIR, { recursive: true });
243
+ mkdirSync(UPLOADS_DIR, { recursive: true });
244
+ mkdirSync(VAULT_DIR, { recursive: true, mode: 448 });
237
245
  mkdirSync(LOG_DIR, { recursive: true });
238
246
  mkdirSync(PROGRESS_DIR, { recursive: true });
239
247
  mkdirSync(DM_CMD_DIR, { recursive: true });
@@ -244,10 +252,14 @@ mkdirSync(PLAYWRIGHT_PORTS_DIR, { recursive: true });
244
252
  mkdirSync(WORKSPACE_DIR, { recursive: true });
245
253
  mkdirSync(TOPIC_WORKSPACE_DIR, { recursive: true });
246
254
  mkdirSync(SHARED_WIKI_DIR, { recursive: true });
255
+ mkdirSync(CRON_WORKSPACE_DIR, { recursive: true });
247
256
  mkdirSync(CONTEXTS_DIR, { recursive: true });
248
- mkdirSync(BROWSER_PROFILES_DIR, { recursive: true });
249
257
  mkdirSync(DM_WORKSPACE_DIR, { recursive: true });
250
258
  mkdirSync(SESSION_WORKSPACE_DIR, { recursive: true });
259
+ mkdirSync(BROWSER_DIR, { recursive: true });
260
+ mkdirSync(BROWSER_PROFILES_DIR, { recursive: true });
261
+ mkdirSync(BINARIES_DIR, { recursive: true });
262
+ mkdirSync(SECRETS_DIR, { recursive: true, mode: 448 });
251
263
  var ACTIVE_QUERY_STALE_MS = 10 * 60 * 1000;
252
264
  var AGENTS_PROMPTS_DIR = resolve(PROJECT_ROOT, "src/prompts/agents");
253
265
  var RESOURCES_DIR = resolve(PROJECT_ROOT, "src/resources");
@@ -287,7 +299,12 @@ function renderUserPromptBatch(prompts) {
287
299
 
288
300
  // ../../packages/core/src/agents/rollout/shared.ts
289
301
  var __dirname2 = dirname2(fileURLToPath2(import.meta.url));
290
- var trustedWorkspaceRoots = [WORKSPACE_DIR, DM_WORKSPACE_DIR, TOPIC_WORKSPACE_DIR].map((root) => resolve2(root));
302
+ var trustedWorkspaceRoots = [
303
+ WORKSPACE_DIR,
304
+ DM_WORKSPACE_DIR,
305
+ SESSION_WORKSPACE_DIR,
306
+ TOPIC_WORKSPACE_DIR
307
+ ].map((root) => resolve2(root));
291
308
  function configureRolloutHost(options) {
292
309
  if (!options.workspaceRoots && !options.fixturesDir) {
293
310
  throw new Error("configureRolloutHost requires workspaceRoots or fixturesDir");
@@ -789,6 +806,139 @@ function patchEnvContext(envContext, cwd, currentDate, timezone) {
789
806
  }
790
807
  }
791
808
  }
809
+ function canonicalFilePath(path) {
810
+ const absolute = resolve3(path);
811
+ try {
812
+ return realpathSync(absolute);
813
+ } catch {
814
+ try {
815
+ return join4(realpathSync(dirname4(absolute)), basename(absolute));
816
+ } catch {
817
+ return absolute;
818
+ }
819
+ }
820
+ }
821
+ function changedPatchLines(value) {
822
+ const removed = [];
823
+ const added = [];
824
+ const diffPreview = [];
825
+ let oldLine = 0;
826
+ let newLine = 0;
827
+ let sawHunk = false;
828
+ for (const line of value.split(`
829
+ `)) {
830
+ const hunk = /^@@ -(\d+)(?:,\d+)? \+(\d+)(?:,\d+)? @@/.exec(line);
831
+ if (hunk) {
832
+ if (sawHunk)
833
+ diffPreview.push("\u2026");
834
+ sawHunk = true;
835
+ oldLine = Number.parseInt(hunk[1] ?? "0", 10);
836
+ newLine = Number.parseInt(hunk[2] ?? "0", 10);
837
+ continue;
838
+ }
839
+ if (!sawHunk && (line.startsWith("--- ") || line.startsWith("+++ ")))
840
+ continue;
841
+ if (line.startsWith("\\ No newline"))
842
+ continue;
843
+ if (line.startsWith("-")) {
844
+ removed.push(line.slice(1));
845
+ diffPreview.push(`${oldLine} -${line.slice(1)}`);
846
+ oldLine += 1;
847
+ continue;
848
+ }
849
+ if (line.startsWith("+")) {
850
+ added.push(line.slice(1));
851
+ diffPreview.push(`${newLine} +${line.slice(1)}`);
852
+ newLine += 1;
853
+ continue;
854
+ }
855
+ if (line.startsWith(" ")) {
856
+ diffPreview.push(`${newLine} ${line.slice(1)}`);
857
+ oldLine += 1;
858
+ newLine += 1;
859
+ }
860
+ }
861
+ return {
862
+ ...removed.length > 0 ? { before: removed.join(`
863
+ `) } : {},
864
+ ...added.length > 0 ? { after: added.join(`
865
+ `) } : {},
866
+ ...diffPreview.length > 0 ? { diffPreview: diffPreview.join(`
867
+ `) } : {}
868
+ };
869
+ }
870
+ function extractLatestCodexPatchPreview(jsonl, expectedPaths, consumedCallIds = new Set, expectedCallId) {
871
+ const expected = expectedPaths.map(canonicalFilePath);
872
+ const lines = jsonl.trimEnd().split(`
873
+ `);
874
+ for (let index = lines.length - 1;index >= 0; index -= 1) {
875
+ try {
876
+ const entry = JSON.parse(lines[index] ?? "");
877
+ if (entry.type !== "event_msg" || entry.payload?.type !== "patch_apply_end")
878
+ continue;
879
+ const callId = entry.payload.call_id;
880
+ const rawChanges = entry.payload.changes;
881
+ if (!callId || consumedCallIds.has(callId) || expectedCallId !== undefined && callId !== expectedCallId || !rawChanges) {
882
+ continue;
883
+ }
884
+ const entries = Object.entries(rawChanges);
885
+ const matched = expected.map((path) => entries.find(([candidate]) => canonicalFilePath(candidate) === path));
886
+ const complete = matched.filter((change) => change !== undefined);
887
+ if (complete.length !== expected.length)
888
+ continue;
889
+ return {
890
+ callId,
891
+ changes: complete.map(([path, change]) => {
892
+ if (typeof change.unified_diff === "string") {
893
+ return { path, ...changedPatchLines(change.unified_diff) };
894
+ }
895
+ const content = typeof change.content === "string" ? change.content.replace(/\n$/, "") : undefined;
896
+ return {
897
+ path,
898
+ ...change.type === "delete" && content !== undefined ? { before: content } : {},
899
+ ...change.type === "add" && content !== undefined ? { after: content } : {}
900
+ };
901
+ })
902
+ };
903
+ } catch {}
904
+ }
905
+ return;
906
+ }
907
+ function extractCodexPatchCallIds(jsonl) {
908
+ const callIds = [];
909
+ for (const line of jsonl.trimEnd().split(`
910
+ `)) {
911
+ try {
912
+ const entry = JSON.parse(line);
913
+ if (entry.type === "event_msg" && entry.payload?.type === "patch_apply_end" && typeof entry.payload.call_id === "string") {
914
+ callIds.push(entry.payload.call_id);
915
+ }
916
+ } catch {}
917
+ }
918
+ return callIds;
919
+ }
920
+ function readCodexPatchCallIds(threadId) {
921
+ const path = latestCodexRolloutPath(threadId);
922
+ if (!path)
923
+ return [];
924
+ try {
925
+ return extractCodexPatchCallIds(readFileSync4(path, "utf8"));
926
+ } catch (error) {
927
+ logger.debug({ error, threadId }, "codex patch ids: rollout read failed");
928
+ return [];
929
+ }
930
+ }
931
+ function readLatestCodexPatchPreview(threadId, expectedPaths, consumedCallIds = new Set, expectedCallId) {
932
+ const path = latestCodexRolloutPath(threadId);
933
+ if (!path)
934
+ return;
935
+ try {
936
+ return extractLatestCodexPatchPreview(readFileSync4(path, "utf8"), expectedPaths, consumedCallIds, expectedCallId);
937
+ } catch (error) {
938
+ logger.debug({ error, threadId }, "codex patch preview: rollout read failed");
939
+ return;
940
+ }
941
+ }
792
942
  function extractLatestCodexContextUsage(jsonl) {
793
943
  const lines = jsonl.trimEnd().split(`
794
944
  `);
@@ -1070,6 +1220,6 @@ function formatDateBucket(d) {
1070
1220
  return `${yyyy}/${mm}/${dd}`;
1071
1221
  }
1072
1222
 
1073
- export { __require, CLAUDE_EFFORT_VALUES, CODEX_EFFORT_VALUES, MAESTRO_EFFORT_VALUES, MODEL_SONNET, MODEL_OPUS, MODEL_FABLE, configureRolloutHost, extractChatPairs, encodeClaudeCwd, writeClaudeRollout, repairPoisonedRollout, extractLatestCodexContextUsage, readLatestCodexContextUsage, migrateCodexRolloutNativeMultiAgentMetadata, writeCodexRollout, decodeUuidV7Timestamp };
1223
+ export { __require, logger, CLAUDE_EFFORT_VALUES, CODEX_EFFORT_VALUES, MAESTRO_EFFORT_VALUES, MODEL_SONNET, MODEL_OPUS, MODEL_FABLE, configureRolloutHost, assertUuidLike, ensureCwdExists, extractChatPairs, encodeClaudeCwd, writeClaudeRollout, repairPoisonedRollout, extractLatestCodexPatchPreview, extractCodexPatchCallIds, readCodexPatchCallIds, readLatestCodexPatchPreview, extractLatestCodexContextUsage, readLatestCodexContextUsage, migrateCodexRolloutNativeMultiAgentMetadata, writeCodexRollout, decodeUuidV7Timestamp };
1074
1224
 
1075
- //# debugId=41FB4884B4EFEB8064756E2164756E21
1225
+ //# debugId=9D224F8B58C2166C64756E2164756E21