negotium 0.1.7 → 0.1.9

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 (270) hide show
  1. package/README.md +26 -2
  2. package/dist/canonical-mcp-bridge.js +14 -0
  3. package/dist/canonical-mcp-bridge.js.map +9 -0
  4. package/dist/chunk-10ct8814.js +429 -0
  5. package/dist/chunk-10ct8814.js.map +11 -0
  6. package/dist/chunk-18fzftjf.js +214 -0
  7. package/dist/chunk-18fzftjf.js.map +10 -0
  8. package/dist/chunk-1k7t7bnx.js +97 -0
  9. package/dist/chunk-1k7t7bnx.js.map +10 -0
  10. package/dist/chunk-1msje2zf.js +23 -0
  11. package/dist/chunk-1msje2zf.js.map +10 -0
  12. package/dist/chunk-2dgkah1z.js +706 -0
  13. package/dist/chunk-2dgkah1z.js.map +14 -0
  14. package/dist/chunk-3t4dtm26.js +61 -0
  15. package/dist/chunk-3t4dtm26.js.map +10 -0
  16. package/dist/chunk-3vn2vnj1.js +51 -0
  17. package/dist/chunk-3vn2vnj1.js.map +10 -0
  18. package/dist/chunk-6hknphtc.js +2054 -0
  19. package/dist/chunk-6hknphtc.js.map +29 -0
  20. package/dist/chunk-6tfzpcvk.js +2149 -0
  21. package/dist/chunk-6tfzpcvk.js.map +15 -0
  22. package/dist/chunk-8g0c4as0.js +23 -0
  23. package/dist/chunk-8g0c4as0.js.map +10 -0
  24. package/dist/chunk-9spx3h9n.js +279 -0
  25. package/dist/chunk-9spx3h9n.js.map +10 -0
  26. package/dist/chunk-c500xe9z.js +33 -0
  27. package/dist/chunk-c500xe9z.js.map +10 -0
  28. package/dist/chunk-e9b2xpff.js +147 -0
  29. package/dist/chunk-e9b2xpff.js.map +10 -0
  30. package/dist/chunk-edb07sjp.js +567 -0
  31. package/dist/chunk-edb07sjp.js.map +14 -0
  32. package/dist/chunk-eexqsee7.js +368 -0
  33. package/dist/chunk-eexqsee7.js.map +11 -0
  34. package/dist/chunk-efyxk97v.js +500 -0
  35. package/dist/chunk-efyxk97v.js.map +13 -0
  36. package/dist/chunk-epqxwkvh.js +3534 -0
  37. package/dist/chunk-epqxwkvh.js.map +20 -0
  38. package/dist/chunk-f1pzh3xh.js +115 -0
  39. package/dist/chunk-f1pzh3xh.js.map +10 -0
  40. package/dist/chunk-f5xgprg1.js +59 -0
  41. package/dist/chunk-f5xgprg1.js.map +10 -0
  42. package/dist/chunk-f97qybwk.js +584 -0
  43. package/dist/chunk-f97qybwk.js.map +11 -0
  44. package/dist/chunk-fvc7ncxd.js +252 -0
  45. package/dist/chunk-fvc7ncxd.js.map +10 -0
  46. package/dist/chunk-g7pvfj5e.js +574 -0
  47. package/dist/chunk-g7pvfj5e.js.map +14 -0
  48. package/dist/chunk-h8vmb9gf.js +315 -0
  49. package/dist/chunk-h8vmb9gf.js.map +10 -0
  50. package/dist/chunk-hgw7n8cm.js +43 -0
  51. package/dist/chunk-hgw7n8cm.js.map +10 -0
  52. package/dist/chunk-hsq7j9jk.js +126 -0
  53. package/dist/chunk-hsq7j9jk.js.map +10 -0
  54. package/dist/chunk-hwy3n31w.js +21 -0
  55. package/dist/chunk-hwy3n31w.js.map +9 -0
  56. package/dist/chunk-j0kjscb7.js +53 -0
  57. package/dist/chunk-j0kjscb7.js.map +10 -0
  58. package/dist/chunk-jzz91jwh.js +70 -0
  59. package/dist/chunk-jzz91jwh.js.map +10 -0
  60. package/dist/chunk-k9z47mab.js +247 -0
  61. package/dist/chunk-k9z47mab.js.map +12 -0
  62. package/dist/chunk-kbm35t7w.js +1331 -0
  63. package/dist/chunk-kbm35t7w.js.map +16 -0
  64. package/dist/chunk-m4veth0c.js +1649 -0
  65. package/dist/chunk-m4veth0c.js.map +17 -0
  66. package/dist/chunk-mhty3nna.js +150 -0
  67. package/dist/chunk-mhty3nna.js.map +11 -0
  68. package/dist/chunk-mmgh670x.js +248 -0
  69. package/dist/chunk-mmgh670x.js.map +11 -0
  70. package/dist/chunk-n0kk5xbq.js +2358 -0
  71. package/dist/chunk-n0kk5xbq.js.map +26 -0
  72. package/dist/chunk-nmv41qx9.js +2847 -0
  73. package/dist/chunk-nmv41qx9.js.map +23 -0
  74. package/dist/chunk-nqdp52aj.js +113 -0
  75. package/dist/chunk-nqdp52aj.js.map +12 -0
  76. package/dist/chunk-ns2m25dz.js +139 -0
  77. package/dist/chunk-ns2m25dz.js.map +10 -0
  78. package/dist/chunk-pkdmypdd.js +147 -0
  79. package/dist/chunk-pkdmypdd.js.map +11 -0
  80. package/dist/chunk-rmyfmrrr.js +1634 -0
  81. package/dist/chunk-rmyfmrrr.js.map +15 -0
  82. package/dist/chunk-sa874j5c.js +9 -0
  83. package/dist/chunk-sa874j5c.js.map +10 -0
  84. package/dist/chunk-sgsz2fpq.js +289 -0
  85. package/dist/chunk-sgsz2fpq.js.map +10 -0
  86. package/dist/chunk-sn51wnf1.js +3020 -0
  87. package/dist/chunk-sn51wnf1.js.map +32 -0
  88. package/dist/chunk-sqhr1a7e.js +587 -0
  89. package/dist/chunk-sqhr1a7e.js.map +11 -0
  90. package/dist/chunk-tmj5r2zv.js +2933 -0
  91. package/dist/chunk-tmj5r2zv.js.map +20 -0
  92. package/dist/chunk-vefj3880.js +56 -0
  93. package/dist/chunk-vefj3880.js.map +10 -0
  94. package/dist/chunk-vp2db42d.js +121 -0
  95. package/dist/chunk-vp2db42d.js.map +10 -0
  96. package/dist/chunk-wry79q55.js +108 -0
  97. package/dist/chunk-wry79q55.js.map +10 -0
  98. package/dist/chunk-x1arr7ze.js +63 -0
  99. package/dist/chunk-x1arr7ze.js.map +10 -0
  100. package/dist/chunk-z2xy5n2q.js +103 -0
  101. package/dist/chunk-z2xy5n2q.js.map +10 -0
  102. package/dist/hosted-agent.js +53 -0
  103. package/dist/hosted-agent.js.map +10 -0
  104. package/dist/main.js +132 -20
  105. package/dist/main.js.map +4 -4
  106. package/dist/runtime/scripts/faster-whisper-wrapper.py +87 -0
  107. package/dist/runtime/scripts/mcp-patchright-http.mjs +349 -0
  108. package/dist/runtime/src/agents/api-topic-agent-switch.ts +178 -0
  109. package/dist/runtime/src/agents/archiver.ts +396 -0
  110. package/dist/runtime/src/agents/auth-check.ts +64 -0
  111. package/dist/runtime/src/agents/claude-provider.ts +737 -0
  112. package/dist/runtime/src/agents/claude-registry.ts +115 -0
  113. package/dist/runtime/src/agents/codex-native-multi-agent.ts +177 -0
  114. package/dist/runtime/src/agents/codex-provider.ts +785 -0
  115. package/dist/runtime/src/agents/codex-registry.ts +115 -0
  116. package/dist/runtime/src/agents/codex-tree-kill.ts +365 -0
  117. package/dist/runtime/src/agents/contracts.ts +69 -0
  118. package/dist/runtime/src/agents/deep-map.ts +13 -0
  119. package/dist/runtime/src/agents/execution-host.ts +91 -0
  120. package/dist/runtime/src/agents/fixtures/claude-attachments.jsonl +2 -0
  121. package/dist/runtime/src/agents/fixtures/codex-shell.jsonl +5 -0
  122. package/dist/runtime/src/agents/fork.ts +65 -0
  123. package/dist/runtime/src/agents/hosted-agent.ts +49 -0
  124. package/dist/runtime/src/agents/idle-archiver.ts +128 -0
  125. package/dist/runtime/src/agents/index.ts +205 -0
  126. package/dist/runtime/src/agents/maestro-provider.ts +206 -0
  127. package/dist/runtime/src/agents/maestro-registry.ts +31 -0
  128. package/dist/runtime/src/agents/mcp-tools/ask-user.ts +280 -0
  129. package/dist/runtime/src/agents/mcp-tools/common.ts +21 -0
  130. package/dist/runtime/src/agents/mcp-tools/self-config.ts +220 -0
  131. package/dist/runtime/src/agents/mcp-tools/spawn-subagent.ts +525 -0
  132. package/dist/runtime/src/agents/mcp-tools/visuals.ts +88 -0
  133. package/dist/runtime/src/agents/model-catalog.ts +151 -0
  134. package/dist/runtime/src/agents/registry.ts +24 -0
  135. package/dist/runtime/src/agents/rollout/claude.ts +331 -0
  136. package/dist/runtime/src/agents/rollout/codex.ts +569 -0
  137. package/dist/runtime/src/agents/rollout/shared.ts +205 -0
  138. package/dist/runtime/src/agents/self-config-core.ts +415 -0
  139. package/dist/runtime/src/agents/task-events.ts +44 -0
  140. package/dist/runtime/src/agents/tool-format.ts +352 -0
  141. package/dist/runtime/src/agents/topic-agent-switch.ts +193 -0
  142. package/dist/runtime/src/agents/topic-cleanup.ts +231 -0
  143. package/dist/runtime/src/agents/vault-tool-policy.ts +33 -0
  144. package/dist/runtime/src/application/execute-external-user-turn.ts +23 -0
  145. package/dist/runtime/src/application/submit-user-message.ts +50 -0
  146. package/dist/runtime/src/application/switch-topic-effort.ts +48 -0
  147. package/dist/runtime/src/application/switch-topic-model.ts +79 -0
  148. package/dist/runtime/src/application/topic-service.ts +139 -0
  149. package/dist/runtime/src/application/vault-command.ts +170 -0
  150. package/dist/runtime/src/bus.ts +319 -0
  151. package/dist/runtime/src/index.ts +333 -0
  152. package/dist/runtime/src/mcp/agent-health-server.ts +309 -0
  153. package/dist/runtime/src/mcp/background-bash-server.ts +346 -0
  154. package/dist/runtime/src/mcp/canonical-bridge-config.ts +84 -0
  155. package/dist/runtime/src/mcp/canonical-proxy-server.ts +171 -0
  156. package/dist/runtime/src/mcp/dm-ipc.ts +60 -0
  157. package/dist/runtime/src/mcp/mcp-helpers.ts +40 -0
  158. package/dist/runtime/src/mcp/paddleocr-server.ts +105 -0
  159. package/dist/runtime/src/mcp/peer-bridge.ts +114 -0
  160. package/dist/runtime/src/mcp/runtime-spec.ts +137 -0
  161. package/dist/runtime/src/mcp/session-comm/bridge-ipc-config.ts +27 -0
  162. package/dist/runtime/src/mcp/session-comm/peer-forward.ts +165 -0
  163. package/dist/runtime/src/mcp/session-comm/runtime.ts +115 -0
  164. package/dist/runtime/src/mcp/session-comm/server.ts +649 -0
  165. package/dist/runtime/src/mcp/session-comm/topic-config.ts +131 -0
  166. package/dist/runtime/src/mcp/session-comm/topics.ts +229 -0
  167. package/dist/runtime/src/mcp/stdio-protect.ts +84 -0
  168. package/dist/runtime/src/mcp/system-health-server.ts +130 -0
  169. package/dist/runtime/src/mcp/task-server.ts +173 -0
  170. package/dist/runtime/src/mcp/token-stats-server.ts +98 -0
  171. package/dist/runtime/src/mcp/vault-http.ts +219 -0
  172. package/dist/runtime/src/mcp/vault-run.ts +153 -0
  173. package/dist/runtime/src/mcp/vault-server.ts +104 -0
  174. package/dist/runtime/src/mcp/wiki-server.ts +755 -0
  175. package/dist/runtime/src/media/file-events.ts +33 -0
  176. package/dist/runtime/src/media/text-extractor.ts +312 -0
  177. package/dist/runtime/src/media/video.ts +92 -0
  178. package/dist/runtime/src/outbox/file-ops.ts +210 -0
  179. package/dist/runtime/src/outbox/index.ts +8 -0
  180. package/dist/runtime/src/outbox/utils.ts +51 -0
  181. package/dist/runtime/src/platform/background-bash/manager.ts +279 -0
  182. package/dist/runtime/src/platform/config.ts +371 -0
  183. package/dist/runtime/src/platform/constants.ts +18 -0
  184. package/dist/runtime/src/platform/debug-users.ts +14 -0
  185. package/dist/runtime/src/platform/delay.ts +1 -0
  186. package/dist/runtime/src/platform/error.ts +9 -0
  187. package/dist/runtime/src/platform/file-utils.ts +16 -0
  188. package/dist/runtime/src/platform/jsonl.ts +202 -0
  189. package/dist/runtime/src/platform/lifecycle.ts +174 -0
  190. package/dist/runtime/src/platform/logger.ts +31 -0
  191. package/dist/runtime/src/platform/maestro-bootstrap-env.ts +3 -0
  192. package/dist/runtime/src/platform/mcp-config.ts +878 -0
  193. package/dist/runtime/src/platform/modules.ts +145 -0
  194. package/dist/runtime/src/platform/node-plugins.ts +46 -0
  195. package/dist/runtime/src/platform/playwright/manager.ts +1233 -0
  196. package/dist/runtime/src/prompts/agents/wiki-archiver.md +261 -0
  197. package/dist/runtime/src/prompts/builders.ts +368 -0
  198. package/dist/runtime/src/prompts/sessions/channel-system.md +48 -0
  199. package/dist/runtime/src/prompts/sessions/manager-system.md +37 -0
  200. package/dist/runtime/src/prompts/sessions/topic-system.md +47 -0
  201. package/dist/runtime/src/prompts/sessions/visual-design.md +86 -0
  202. package/dist/runtime/src/query/active-rooms.ts +534 -0
  203. package/dist/runtime/src/query/control.ts +313 -0
  204. package/dist/runtime/src/query/index.ts +24 -0
  205. package/dist/runtime/src/query/session-inbox-cleanup.ts +44 -0
  206. package/dist/runtime/src/query/session-inbox-path.ts +42 -0
  207. package/dist/runtime/src/query/state.ts +94 -0
  208. package/dist/runtime/src/query/types.ts +83 -0
  209. package/dist/runtime/src/runtime/ask-callbacks.ts +153 -0
  210. package/dist/runtime/src/runtime/attachments.ts +151 -0
  211. package/dist/runtime/src/runtime/background-sessions.ts +83 -0
  212. package/dist/runtime/src/runtime/channel-context.ts +107 -0
  213. package/dist/runtime/src/runtime/errors.ts +69 -0
  214. package/dist/runtime/src/runtime/event-heartbeat.ts +77 -0
  215. package/dist/runtime/src/runtime/file-hooks.ts +81 -0
  216. package/dist/runtime/src/runtime/footer.ts +23 -0
  217. package/dist/runtime/src/runtime/inbox.ts +946 -0
  218. package/dist/runtime/src/runtime/tasks.ts +56 -0
  219. package/dist/runtime/src/runtime/topic-config.ts +29 -0
  220. package/dist/runtime/src/runtime/turn-runner.ts +2298 -0
  221. package/dist/runtime/src/runtime/usage-alert.ts +84 -0
  222. package/dist/runtime/src/runtime/visual-html.ts +109 -0
  223. package/dist/runtime/src/runtime/visual-store.ts +430 -0
  224. package/dist/runtime/src/runtime/visuals.ts +171 -0
  225. package/dist/runtime/src/security/sanitize.ts +27 -0
  226. package/dist/runtime/src/security/sensitive-path.ts +34 -0
  227. package/dist/runtime/src/storage/activity-log.ts +152 -0
  228. package/dist/runtime/src/storage/api-messages.ts +617 -0
  229. package/dist/runtime/src/storage/api-topic-brief.ts +127 -0
  230. package/dist/runtime/src/storage/api-topic-config.ts +192 -0
  231. package/dist/runtime/src/storage/api-topics.ts +844 -0
  232. package/dist/runtime/src/storage/app-settings.ts +44 -0
  233. package/dist/runtime/src/storage/browser-profiles.ts +133 -0
  234. package/dist/runtime/src/storage/conversations.ts +268 -0
  235. package/dist/runtime/src/storage/forum/agent-settings.ts +20 -0
  236. package/dist/runtime/src/storage/forum/index.ts +4 -0
  237. package/dist/runtime/src/storage/forum/repository.ts +283 -0
  238. package/dist/runtime/src/storage/forum/schema.ts +300 -0
  239. package/dist/runtime/src/storage/forum-db.ts +23 -0
  240. package/dist/runtime/src/storage/runtime-events.ts +130 -0
  241. package/dist/runtime/src/storage/runtime-leases.ts +189 -0
  242. package/dist/runtime/src/storage/runtime-process-leases.ts +216 -0
  243. package/dist/runtime/src/storage/runtime-topic-state.ts +148 -0
  244. package/dist/runtime/src/storage/runtime-turn-requests.ts +301 -0
  245. package/dist/runtime/src/storage/self-schedules.ts +298 -0
  246. package/dist/runtime/src/storage/session-asks.ts +347 -0
  247. package/dist/runtime/src/storage/sqlite.ts +129 -0
  248. package/dist/runtime/src/storage/tasks.ts +179 -0
  249. package/dist/runtime/src/storage/token-stats.ts +144 -0
  250. package/dist/runtime/src/storage/topic-archive-state.ts +59 -0
  251. package/dist/runtime/src/storage/topic-archive.ts +74 -0
  252. package/dist/runtime/src/storage/topic-settings.ts +67 -0
  253. package/dist/runtime/src/storage/topic-transcript.ts +98 -0
  254. package/dist/runtime/src/storage/vault-crypto.ts +65 -0
  255. package/dist/runtime/src/storage/vault.ts +225 -0
  256. package/dist/runtime/src/storage/wiki-summary-names.ts +33 -0
  257. package/dist/runtime/src/storage/wiki.ts +85 -0
  258. package/dist/runtime/src/topics/create.ts +123 -0
  259. package/dist/runtime/src/topics/derive.ts +398 -0
  260. package/dist/runtime/src/topics/lifecycle.ts +311 -0
  261. package/dist/runtime/src/topics/links.ts +7 -0
  262. package/dist/runtime/src/topics/personal-general.ts +65 -0
  263. package/dist/runtime/src/topics/session.ts +381 -0
  264. package/dist/runtime/src/types/api.ts +497 -0
  265. package/dist/runtime/src/types.ts +257 -0
  266. package/dist/runtime/src/version.ts +1 -0
  267. package/dist/runtime/tsconfig.json +13 -0
  268. package/package.json +28 -3
  269. package/dist/main.d.ts +0 -3
  270. package/dist/main.d.ts.map +0 -1
@@ -0,0 +1,214 @@
1
+ #!/usr/bin/env bun
2
+ // @bun
3
+ import {
4
+ MAX_PEER_INPUT_REQUEST_BYTES
5
+ } from "./chunk-c500xe9z.js";
6
+ import {
7
+ __require,
8
+ __toESM
9
+ } from "./chunk-hwy3n31w.js";
10
+
11
+ // ../../adapters/otium/src/cli.ts
12
+ function parseArgs(args) {
13
+ const positional = [];
14
+ const options = new Map;
15
+ for (let i = 0;i < args.length; i += 1) {
16
+ const value = args[i];
17
+ if (!value.startsWith("--")) {
18
+ positional.push(value);
19
+ continue;
20
+ }
21
+ const equalsAt = value.indexOf("=");
22
+ if (equalsAt > 2) {
23
+ options.set(value.slice(2, equalsAt), value.slice(equalsAt + 1));
24
+ continue;
25
+ }
26
+ const next = args[i + 1];
27
+ if (next && !next.startsWith("--")) {
28
+ options.set(value.slice(2), next);
29
+ i += 1;
30
+ } else {
31
+ options.set(value.slice(2), "true");
32
+ }
33
+ }
34
+ return { positional, options };
35
+ }
36
+ function parseOtiumServePort(args, fallback) {
37
+ const parsed = parseArgs(args);
38
+ if (parsed.positional.length > 0 || [...parsed.options.keys()].some((key) => key !== "port" && key !== "relay")) {
39
+ throw new Error("usage: negotium otium serve [--port <1-65535>] [--relay <url>]");
40
+ }
41
+ const raw = parsed.options.get("port");
42
+ const port = raw === undefined ? fallback : Number(raw);
43
+ if (!Number.isInteger(port) || port < 1 || port > 65535) {
44
+ throw new Error("serve port must be an integer between 1 and 65535");
45
+ }
46
+ return port;
47
+ }
48
+ function parseOtiumServeRelayUrl(args) {
49
+ const parsed = parseArgs(args);
50
+ if (parsed.positional.length > 0 || [...parsed.options.keys()].some((key) => key !== "port" && key !== "relay")) {
51
+ throw new Error("usage: negotium otium serve [--port <1-65535>] [--relay <url>]");
52
+ }
53
+ const raw = parsed.options.get("relay")?.trim();
54
+ if (!raw)
55
+ return;
56
+ if (!/^(?:https?|wss?):\/\//.test(raw)) {
57
+ throw new Error("relay URL must use http(s) or ws(s)");
58
+ }
59
+ return raw.replace(/\/+$/, "");
60
+ }
61
+ async function resolveHostNodeId(explicit) {
62
+ if (explicit?.trim())
63
+ return explicit.trim();
64
+ const [{ configureOtiumCentral, listPeerNodes }, { loadJoin }] = await Promise.all([
65
+ import("./chunk-e9b2xpff.js"),
66
+ import("./chunk-eexqsee7.js")
67
+ ]);
68
+ const join = loadJoin();
69
+ if (!join)
70
+ throw new Error("not joined to an Otium workspace; pass --host-node or join first");
71
+ configureOtiumCentral(join);
72
+ try {
73
+ const nodes = await listPeerNodes({ fresh: true });
74
+ const primary = nodes.find((node) => node.isPrimary && !node.self) ?? nodes.find((node) => node.isPrimary);
75
+ if (!primary)
76
+ throw new Error("workspace has no primary Otium node");
77
+ return primary.cellId;
78
+ } finally {
79
+ configureOtiumCentral(null);
80
+ }
81
+ }
82
+ async function runOtiumCli(args = process.argv.slice(2)) {
83
+ const [command, ...commandArgs] = args;
84
+ switch (command) {
85
+ case "join": {
86
+ const { joinCommand } = await import("./chunk-ns2m25dz.js");
87
+ await joinCommand(commandArgs);
88
+ break;
89
+ }
90
+ case "serve": {
91
+ const {
92
+ NEGOTIUM_PORT,
93
+ onShutdown,
94
+ registerNodeRequestHandler,
95
+ unregisterNodeRequestHandler,
96
+ waitForRequiredRuntimeProcessLease
97
+ } = await import("./chunk-sn51wnf1.js");
98
+ const [{ startDefaultNode }, otium] = await Promise.all([
99
+ import("./chunk-rmyfmrrr.js"),
100
+ import("./chunk-tmj5r2zv.js")
101
+ ]);
102
+ const port = parseOtiumServePort(commandArgs, NEGOTIUM_PORT);
103
+ const relayUrl = parseOtiumServeRelayUrl(commandArgs);
104
+ let node;
105
+ const singleton = await waitForRequiredRuntimeProcessLease("adapter:otium", {
106
+ workloadName: "Otium adapter",
107
+ onLost: () => {
108
+ console.error("negotium otium: singleton lease lost; shutting down");
109
+ node?.stop();
110
+ }
111
+ });
112
+ const { handleOtiumPeerRequest, startOtiumWorker } = otium;
113
+ const worker = startOtiumWorker();
114
+ if (!worker) {
115
+ singleton.stop();
116
+ throw new Error("not joined to an otium workspace \u2014 run `negotium otium join <code>` first");
117
+ }
118
+ registerNodeRequestHandler("otium-peer", handleOtiumPeerRequest);
119
+ let workerStopped = false;
120
+ const stopWorker = () => {
121
+ if (workerStopped)
122
+ return;
123
+ workerStopped = true;
124
+ unregisterNodeRequestHandler("otium-peer");
125
+ worker.stop();
126
+ };
127
+ onShutdown("otium-worker", 100, stopWorker);
128
+ onShutdown("otium-singleton", 90, () => singleton.stop());
129
+ try {
130
+ node = await startDefaultNode({
131
+ port,
132
+ maxRequestBodySize: MAX_PEER_INPUT_REQUEST_BYTES
133
+ });
134
+ } catch (error) {
135
+ stopWorker();
136
+ singleton.stop();
137
+ throw error;
138
+ }
139
+ console.log(`negotium node (otium worker) listening on 127.0.0.1:${node.port} (ctrl-c to stop)`);
140
+ worker.startTunnel({ targetOrigin: `http://127.0.0.1:${node.port}`, relayUrl });
141
+ await node.completed;
142
+ break;
143
+ }
144
+ case "bindings": {
145
+ const { listOtiumTopicBindings } = await import("./chunk-10ct8814.js");
146
+ const bindings = listOtiumTopicBindings();
147
+ if (bindings.length === 0) {
148
+ console.log("no Otium topic bindings");
149
+ break;
150
+ }
151
+ for (const binding of bindings) {
152
+ const local = binding.localTopicTitle ? `${binding.localTopicTitle} (${binding.localTopicId})` : `${binding.localTopicId} [missing]`;
153
+ console.log(`${binding.transport.padEnd(16)} ${binding.hostNodeId}/${binding.hostTopicId} -> ${local}`);
154
+ }
155
+ break;
156
+ }
157
+ case "share": {
158
+ const parsed = parseArgs(commandArgs);
159
+ const [hostTopicId, localTopicId] = parsed.positional;
160
+ const userId = parsed.options.get("user")?.trim();
161
+ if (!hostTopicId || !localTopicId || !userId) {
162
+ throw new Error("usage: negotium otium share <host-topic-id> <local-topic-id> --user <user-id> [--host-node <cell-id>]");
163
+ }
164
+ const hostNodeId = await resolveHostNodeId(parsed.options.get("host-node"));
165
+ const { shareOtiumTopic } = await import("./chunk-10ct8814.js");
166
+ const result = shareOtiumTopic({ hostNodeId, hostTopicId, localTopicId, userId });
167
+ if (!result.ok)
168
+ throw new Error(result.error);
169
+ console.log(`shared ${hostNodeId}/${hostTopicId} with local topic ${result.localTopicId}` + (result.replaced ? " (replaced previous binding)" : ""));
170
+ break;
171
+ }
172
+ case "private": {
173
+ const parsed = parseArgs(commandArgs);
174
+ const [localTopicId] = parsed.positional;
175
+ const userId = parsed.options.get("user")?.trim();
176
+ if (!localTopicId || !userId) {
177
+ throw new Error("usage: negotium otium private <local-topic-id> --user <user-id>");
178
+ }
179
+ const { setOtiumTopicPrivate } = await import("./chunk-10ct8814.js");
180
+ const result = setOtiumTopicPrivate({ localTopicId, userId });
181
+ if (!result.ok)
182
+ throw new Error(result.error);
183
+ console.log(`private mode selected for ${result.localTopicId}; removed ${result.removedBindings} Otium binding(s)`);
184
+ break;
185
+ }
186
+ default: {
187
+ console.log([
188
+ "negotium otium \u2014 attach a Negotium node to an Otium workspace",
189
+ "",
190
+ "usage: negotium otium <join|serve|bindings|share|private> [args]",
191
+ "",
192
+ " join <code> store credentials from an Otium invite code",
193
+ " serve [--port <port>] [--relay <url>]",
194
+ " run peer routes and an outbound relay tunnel",
195
+ " bindings list internal mirrors and shared topic bindings",
196
+ " share <host-topic> <local-topic> --user <id> [--host-node <cell>]",
197
+ " publish one private local topic to Otium as shared",
198
+ " private <local-topic> --user <id>",
199
+ " remove all Otium bindings; keep Terminal/Telegram access"
200
+ ].join(`
201
+ `));
202
+ if (command && command !== "help" && command !== "--help")
203
+ process.exitCode = 1;
204
+ }
205
+ }
206
+ }
207
+ if (false) {}
208
+ export {
209
+ runOtiumCli,
210
+ parseOtiumServeRelayUrl,
211
+ parseOtiumServePort
212
+ };
213
+
214
+ //# debugId=8477A0A218977B2264756E2164756E21
@@ -0,0 +1,10 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../adapters/otium/src/cli.ts"],
4
+ "sourcesContent": [
5
+ "#!/usr/bin/env bun\n/**\n * negotium-otium — run a negotium node as an otium workspace worker.\n *\n * negotium-otium join <invite-code> store credentials from an invite code\n * negotium-otium serve negotium node + otium peer routes\n * negotium-otium bindings inspect internal/shared Otium transports\n * negotium-otium share ... bind an Otium room to a visible local topic\n * negotium-otium private ... keep a topic on Terminal/Telegram only\n *\n * The otium integration mounts onto the node through negotium's plugin chain\n * (registerNodeRequestHandler) — negotium core knows nothing about otium.\n */\n\nimport { MAX_PEER_INPUT_REQUEST_BYTES } from \"@/protocol\";\n\nfunction parseArgs(args: string[]): { positional: string[]; options: Map<string, string> } {\n const positional: string[] = [];\n const options = new Map<string, string>();\n for (let i = 0; i < args.length; i += 1) {\n const value = args[i]!;\n if (!value.startsWith(\"--\")) {\n positional.push(value);\n continue;\n }\n const equalsAt = value.indexOf(\"=\");\n if (equalsAt > 2) {\n options.set(value.slice(2, equalsAt), value.slice(equalsAt + 1));\n continue;\n }\n const next = args[i + 1];\n if (next && !next.startsWith(\"--\")) {\n options.set(value.slice(2), next);\n i += 1;\n } else {\n options.set(value.slice(2), \"true\");\n }\n }\n return { positional, options };\n}\n\nexport function parseOtiumServePort(args: string[], fallback: number): number {\n const parsed = parseArgs(args);\n if (\n parsed.positional.length > 0 ||\n [...parsed.options.keys()].some((key) => key !== \"port\" && key !== \"relay\")\n ) {\n throw new Error(\"usage: negotium otium serve [--port <1-65535>] [--relay <url>]\");\n }\n const raw = parsed.options.get(\"port\");\n const port = raw === undefined ? fallback : Number(raw);\n if (!Number.isInteger(port) || port < 1 || port > 65_535) {\n throw new Error(\"serve port must be an integer between 1 and 65535\");\n }\n return port;\n}\n\nexport function parseOtiumServeRelayUrl(args: string[]): string | undefined {\n const parsed = parseArgs(args);\n if (\n parsed.positional.length > 0 ||\n [...parsed.options.keys()].some((key) => key !== \"port\" && key !== \"relay\")\n ) {\n throw new Error(\"usage: negotium otium serve [--port <1-65535>] [--relay <url>]\");\n }\n const raw = parsed.options.get(\"relay\")?.trim();\n if (!raw) return undefined;\n if (!/^(?:https?|wss?):\\/\\//.test(raw)) {\n throw new Error(\"relay URL must use http(s) or ws(s)\");\n }\n return raw.replace(/\\/+$/, \"\");\n}\n\nasync function resolveHostNodeId(explicit?: string): Promise<string> {\n if (explicit?.trim()) return explicit.trim();\n const [{ configureOtiumCentral, listPeerNodes }, { loadJoin }] = await Promise.all([\n import(\"@/central\"),\n import(\"@/join\"),\n ]);\n const join = loadJoin();\n if (!join) throw new Error(\"not joined to an Otium workspace; pass --host-node or join first\");\n configureOtiumCentral(join);\n try {\n const nodes = await listPeerNodes({ fresh: true });\n const primary =\n nodes.find((node) => node.isPrimary && !node.self) ?? nodes.find((node) => node.isPrimary);\n if (!primary) throw new Error(\"workspace has no primary Otium node\");\n return primary.cellId;\n } finally {\n configureOtiumCentral(null);\n }\n}\n\nexport async function runOtiumCli(args = process.argv.slice(2)): Promise<void> {\n const [command, ...commandArgs] = args;\n switch (command) {\n case \"join\": {\n const { joinCommand } = await import(\"@/join-cli\");\n await joinCommand(commandArgs);\n break;\n }\n case \"serve\": {\n const {\n NEGOTIUM_PORT,\n onShutdown,\n registerNodeRequestHandler,\n unregisterNodeRequestHandler,\n waitForRequiredRuntimeProcessLease,\n } = await import(\"@negotium/core\");\n const [{ startDefaultNode }, otium] = await Promise.all([\n import(\"@negotium/node\"),\n import(\"@/index\"),\n ]);\n const port = parseOtiumServePort(commandArgs, NEGOTIUM_PORT);\n const relayUrl = parseOtiumServeRelayUrl(commandArgs);\n let node: Awaited<ReturnType<typeof startDefaultNode>> | undefined;\n const singleton = await waitForRequiredRuntimeProcessLease(\"adapter:otium\", {\n workloadName: \"Otium adapter\",\n onLost: () => {\n console.error(\"negotium otium: singleton lease lost; shutting down\");\n void node?.stop();\n },\n });\n const { handleOtiumPeerRequest, startOtiumWorker } = otium;\n const worker = startOtiumWorker();\n if (!worker) {\n singleton.stop();\n throw new Error(\n \"not joined to an otium workspace — run `negotium otium join <code>` first\",\n );\n }\n registerNodeRequestHandler(\"otium-peer\", handleOtiumPeerRequest);\n let workerStopped = false;\n const stopWorker = (): void => {\n if (workerStopped) return;\n workerStopped = true;\n unregisterNodeRequestHandler(\"otium-peer\");\n worker.stop();\n };\n onShutdown(\"otium-worker\", 100, stopWorker);\n onShutdown(\"otium-singleton\", 90, () => singleton.stop());\n try {\n node = await startDefaultNode({\n port,\n maxRequestBodySize: MAX_PEER_INPUT_REQUEST_BYTES,\n });\n } catch (error) {\n stopWorker();\n singleton.stop();\n throw error;\n }\n console.log(\n `negotium node (otium worker) listening on 127.0.0.1:${node.port} (ctrl-c to stop)`,\n );\n worker.startTunnel({ targetOrigin: `http://127.0.0.1:${node.port}`, relayUrl });\n await node.completed;\n break;\n }\n case \"bindings\": {\n const { listOtiumTopicBindings } = await import(\"@/bindings\");\n const bindings = listOtiumTopicBindings();\n if (bindings.length === 0) {\n console.log(\"no Otium topic bindings\");\n break;\n }\n for (const binding of bindings) {\n const local = binding.localTopicTitle\n ? `${binding.localTopicTitle} (${binding.localTopicId})`\n : `${binding.localTopicId} [missing]`;\n console.log(\n `${binding.transport.padEnd(16)} ${binding.hostNodeId}/${binding.hostTopicId} -> ${local}`,\n );\n }\n break;\n }\n case \"share\": {\n const parsed = parseArgs(commandArgs);\n const [hostTopicId, localTopicId] = parsed.positional;\n const userId = parsed.options.get(\"user\")?.trim();\n if (!hostTopicId || !localTopicId || !userId) {\n throw new Error(\n \"usage: negotium otium share <host-topic-id> <local-topic-id> --user <user-id> [--host-node <cell-id>]\",\n );\n }\n const hostNodeId = await resolveHostNodeId(parsed.options.get(\"host-node\"));\n const { shareOtiumTopic } = await import(\"@/bindings\");\n const result = shareOtiumTopic({ hostNodeId, hostTopicId, localTopicId, userId });\n if (!result.ok) throw new Error(result.error);\n console.log(\n `shared ${hostNodeId}/${hostTopicId} with local topic ${result.localTopicId}` +\n (result.replaced ? \" (replaced previous binding)\" : \"\"),\n );\n break;\n }\n case \"private\": {\n const parsed = parseArgs(commandArgs);\n const [localTopicId] = parsed.positional;\n const userId = parsed.options.get(\"user\")?.trim();\n if (!localTopicId || !userId) {\n throw new Error(\"usage: negotium otium private <local-topic-id> --user <user-id>\");\n }\n const { setOtiumTopicPrivate } = await import(\"@/bindings\");\n const result = setOtiumTopicPrivate({ localTopicId, userId });\n if (!result.ok) throw new Error(result.error);\n console.log(\n `private mode selected for ${result.localTopicId}; removed ${result.removedBindings} Otium binding(s)`,\n );\n break;\n }\n default: {\n console.log(\n [\n \"negotium otium — attach a Negotium node to an Otium workspace\",\n \"\",\n \"usage: negotium otium <join|serve|bindings|share|private> [args]\",\n \"\",\n \" join <code> store credentials from an Otium invite code\",\n \" serve [--port <port>] [--relay <url>]\",\n \" run peer routes and an outbound relay tunnel\",\n \" bindings list internal mirrors and shared topic bindings\",\n \" share <host-topic> <local-topic> --user <id> [--host-node <cell>]\",\n \" publish one private local topic to Otium as shared\",\n \" private <local-topic> --user <id>\",\n \" remove all Otium bindings; keep Terminal/Telegram access\",\n ].join(\"\\n\"),\n );\n if (command && command !== \"help\" && command !== \"--help\") process.exitCode = 1;\n }\n }\n}\n\nif (import.meta.main) {\n runOtiumCli().catch((error) => {\n process.stderr.write(\n `negotium-otium: ${error instanceof Error ? error.message : String(error)}\\n`,\n );\n process.exitCode = 1;\n });\n}\n"
6
+ ],
7
+ "mappings": "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",
8
+ "debugId": "8477A0A218977B2264756E2164756E21",
9
+ "names": []
10
+ }
@@ -0,0 +1,97 @@
1
+ // @bun
2
+ import"./chunk-hwy3n31w.js";
3
+
4
+ // ../../packages/core/src/mcp/session-comm/peer-forward.ts
5
+ var activeBridge = null;
6
+ var PEER_BRIDGE_URL_ENV = "NEGOTIUM_PEER_SESSION_BRIDGE_URL";
7
+ var PEER_BRIDGE_TOKEN_ENV = "NEGOTIUM_PEER_SESSION_BRIDGE_TOKEN";
8
+ var PEER_BRIDGE_TIMEOUT_MS = 5000;
9
+ function loopbackBridgeConfig() {
10
+ const rawUrl = process.env[PEER_BRIDGE_URL_ENV]?.trim();
11
+ const token = process.env[PEER_BRIDGE_TOKEN_ENV]?.trim();
12
+ if (!rawUrl || !token)
13
+ return null;
14
+ try {
15
+ const url = new URL(rawUrl);
16
+ if (url.protocol !== "http:" || !["127.0.0.1", "::1", "localhost"].includes(url.hostname)) {
17
+ return null;
18
+ }
19
+ return { url: url.toString(), token };
20
+ } catch {
21
+ return null;
22
+ }
23
+ }
24
+ async function callLoopbackBridge(request) {
25
+ const config = loopbackBridgeConfig();
26
+ if (!config)
27
+ return { configured: false, result: null };
28
+ try {
29
+ const response = await fetch(config.url, {
30
+ method: "POST",
31
+ headers: {
32
+ authorization: `Bearer ${config.token}`,
33
+ "content-type": "application/json"
34
+ },
35
+ body: JSON.stringify(request),
36
+ signal: AbortSignal.timeout(PEER_BRIDGE_TIMEOUT_MS)
37
+ });
38
+ if (!response.ok)
39
+ return { configured: true, result: null };
40
+ return { configured: true, result: await response.json() };
41
+ } catch {
42
+ return { configured: true, result: null };
43
+ }
44
+ }
45
+ function registerPeerSessionBridge(bridge) {
46
+ activeBridge = bridge;
47
+ return () => {
48
+ if (activeBridge === bridge)
49
+ activeBridge = null;
50
+ };
51
+ }
52
+ async function forwardToPeer(args) {
53
+ if (activeBridge)
54
+ return activeBridge.forward(args);
55
+ const forwarded = await callLoopbackBridge({ action: "forward", args });
56
+ if (forwarded.result)
57
+ return forwarded.result;
58
+ return {
59
+ ok: false,
60
+ error: forwarded.configured ? "remote session bridge is configured but unavailable" : "remote nodes are not connected on this negotium node (standalone mode)"
61
+ };
62
+ }
63
+ async function peerSessionsForUser(userId, sourceQueryId) {
64
+ if (activeBridge)
65
+ return activeBridge.sessions(userId, sourceQueryId);
66
+ const sessions = await callLoopbackBridge({
67
+ action: "sessions",
68
+ userId,
69
+ sourceQueryId
70
+ });
71
+ if (sessions.result)
72
+ return sessions.result;
73
+ if (sessions.configured)
74
+ return { ok: false, nodes: [] };
75
+ return { ok: true, nodes: [] };
76
+ }
77
+ async function deliverPeerReply(route, sourceTitle, replyText, kind) {
78
+ if (activeBridge)
79
+ return activeBridge.reply(route, sourceTitle, replyText, kind);
80
+ return (await callLoopbackBridge({
81
+ action: "reply",
82
+ route,
83
+ sourceTitle,
84
+ replyText,
85
+ kind
86
+ })).result ?? false;
87
+ }
88
+ export {
89
+ registerPeerSessionBridge,
90
+ peerSessionsForUser,
91
+ forwardToPeer,
92
+ deliverPeerReply
93
+ };
94
+
95
+ export { registerPeerSessionBridge, deliverPeerReply };
96
+
97
+ //# debugId=C6D7A2F8FD57D92564756E2164756E21
@@ -0,0 +1,10 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../packages/core/src/mcp/session-comm/peer-forward.ts"],
4
+ "sourcesContent": [
5
+ "/**\n * Remote-node forwarding adapter hook.\n *\n * Addressing keeps the `\"<node>/<topic>\"` shape so cross-node session-comm can\n * plug in later (an otium-hub adapter, a negotium peer protocol, …) without\n * changing tool contracts. On a standalone node every remote call fails\n * gracefully and `peerSessionsForUser` contributes nothing to peek listings.\n */\n\nexport interface PeerForwardArgs {\n action: \"tell\" | \"ask\" | \"abort\";\n toNode: string;\n toTopic: string;\n userId: string;\n fromKey?: string;\n fromTitle?: string;\n fromTopicId?: string;\n message?: string;\n requestId?: string;\n depth?: number;\n fromDepth?: number;\n /** Hub turn authorizing a worker-originated peer call. */\n sourceQueryId?: string;\n}\n\nexport type PeerForwardResult = { ok: true } | { ok: false; error: string };\n\nexport interface RemoteReplyRoute {\n nodeName: string;\n nodeCellId: string;\n topicId: string;\n userId: string;\n requestId: string;\n}\n\nexport interface PeerSessionBridge {\n forward(args: PeerForwardArgs): Promise<PeerForwardResult>;\n sessions(userId: string, sourceQueryId?: string): Promise<PeerSessionsResult>;\n reply(\n route: RemoteReplyRoute,\n sourceTitle: string,\n replyText: string,\n kind: \"reply\" | \"error\",\n ): Promise<boolean>;\n}\n\nlet activeBridge: PeerSessionBridge | null = null;\n\nconst PEER_BRIDGE_URL_ENV = \"NEGOTIUM_PEER_SESSION_BRIDGE_URL\";\nconst PEER_BRIDGE_TOKEN_ENV = \"NEGOTIUM_PEER_SESSION_BRIDGE_TOKEN\";\nconst PEER_BRIDGE_TIMEOUT_MS = 5_000;\n\ntype IpcRequest =\n | { action: \"forward\"; args: PeerForwardArgs }\n | { action: \"sessions\"; userId: string; sourceQueryId?: string }\n | {\n action: \"reply\";\n route: RemoteReplyRoute;\n sourceTitle: string;\n replyText: string;\n kind: \"reply\" | \"error\";\n };\n\nfunction loopbackBridgeConfig(): { url: string; token: string } | null {\n const rawUrl = process.env[PEER_BRIDGE_URL_ENV]?.trim();\n const token = process.env[PEER_BRIDGE_TOKEN_ENV]?.trim();\n if (!rawUrl || !token) return null;\n try {\n const url = new URL(rawUrl);\n if (url.protocol !== \"http:\" || ![\"127.0.0.1\", \"::1\", \"localhost\"].includes(url.hostname)) {\n return null;\n }\n return { url: url.toString(), token };\n } catch {\n return null;\n }\n}\n\nasync function callLoopbackBridge<T>(\n request: IpcRequest,\n): Promise<{ configured: boolean; result: T | null }> {\n const config = loopbackBridgeConfig();\n if (!config) return { configured: false, result: null };\n try {\n const response = await fetch(config.url, {\n method: \"POST\",\n headers: {\n authorization: `Bearer ${config.token}`,\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify(request),\n signal: AbortSignal.timeout(PEER_BRIDGE_TIMEOUT_MS),\n });\n if (!response.ok) return { configured: true, result: null };\n return { configured: true, result: (await response.json()) as T };\n } catch {\n return { configured: true, result: null };\n }\n}\n\nexport function registerPeerSessionBridge(bridge: PeerSessionBridge): () => void {\n activeBridge = bridge;\n return () => {\n if (activeBridge === bridge) activeBridge = null;\n };\n}\n\nexport async function forwardToPeer(args: PeerForwardArgs): Promise<PeerForwardResult> {\n if (activeBridge) return activeBridge.forward(args);\n const forwarded = await callLoopbackBridge<PeerForwardResult>({ action: \"forward\", args });\n if (forwarded.result) return forwarded.result;\n return {\n ok: false,\n error: forwarded.configured\n ? \"remote session bridge is configured but unavailable\"\n : \"remote nodes are not connected on this negotium node (standalone mode)\",\n };\n}\n\nexport interface PeerSessionEntry {\n name: string;\n agent: string | null;\n hasSession: boolean;\n description?: string;\n}\n\nexport interface PeerSessionsResult {\n ok: boolean;\n nodes?: Array<{ node: string; error?: string; sessions?: PeerSessionEntry[] }>;\n}\n\nexport async function peerSessionsForUser(\n userId: string,\n sourceQueryId?: string,\n): Promise<PeerSessionsResult> {\n if (activeBridge) return activeBridge.sessions(userId, sourceQueryId);\n const sessions = await callLoopbackBridge<PeerSessionsResult>({\n action: \"sessions\",\n userId,\n sourceQueryId,\n });\n if (sessions.result) return sessions.result;\n if (sessions.configured) return { ok: false, nodes: [] };\n return { ok: true, nodes: [] };\n}\n\nexport async function deliverPeerReply(\n route: RemoteReplyRoute,\n sourceTitle: string,\n replyText: string,\n kind: \"reply\" | \"error\",\n): Promise<boolean> {\n if (activeBridge) return activeBridge.reply(route, sourceTitle, replyText, kind);\n return (\n (\n await callLoopbackBridge<boolean>({\n action: \"reply\",\n route,\n sourceTitle,\n replyText,\n kind,\n })\n ).result ?? false\n );\n}\n"
6
+ ],
7
+ "mappings": ";;;;AA8CA,IAAI,eAAyC;AAE7C,IAAM,sBAAsB;AAC5B,IAAM,wBAAwB;AAC9B,IAAM,yBAAyB;AAa/B,SAAS,oBAAoB,GAA0C;AAAA,EACrE,MAAM,SAAS,QAAQ,IAAI,sBAAsB,KAAK;AAAA,EACtD,MAAM,QAAQ,QAAQ,IAAI,wBAAwB,KAAK;AAAA,EACvD,KAAK,WAAW;AAAA,IAAO,OAAO;AAAA,EAC9B,IAAI;AAAA,IACF,MAAM,MAAM,IAAI,IAAI,MAAM;AAAA,IAC1B,IAAI,IAAI,aAAa,YAAY,CAAC,aAAa,OAAO,WAAW,EAAE,SAAS,IAAI,QAAQ,GAAG;AAAA,MACzF,OAAO;AAAA,IACT;AAAA,IACA,OAAO,EAAE,KAAK,IAAI,SAAS,GAAG,MAAM;AAAA,IACpC,MAAM;AAAA,IACN,OAAO;AAAA;AAAA;AAIX,eAAe,kBAAqB,CAClC,SACoD;AAAA,EACpD,MAAM,SAAS,qBAAqB;AAAA,EACpC,KAAK;AAAA,IAAQ,OAAO,EAAE,YAAY,OAAO,QAAQ,KAAK;AAAA,EACtD,IAAI;AAAA,IACF,MAAM,WAAW,MAAM,MAAM,OAAO,KAAK;AAAA,MACvC,QAAQ;AAAA,MACR,SAAS;AAAA,QACP,eAAe,UAAU,OAAO;AAAA,QAChC,gBAAgB;AAAA,MAClB;AAAA,MACA,MAAM,KAAK,UAAU,OAAO;AAAA,MAC5B,QAAQ,YAAY,QAAQ,sBAAsB;AAAA,IACpD,CAAC;AAAA,IACD,KAAK,SAAS;AAAA,MAAI,OAAO,EAAE,YAAY,MAAM,QAAQ,KAAK;AAAA,IAC1D,OAAO,EAAE,YAAY,MAAM,QAAS,MAAM,SAAS,KAAK,EAAQ;AAAA,IAChE,MAAM;AAAA,IACN,OAAO,EAAE,YAAY,MAAM,QAAQ,KAAK;AAAA;AAAA;AAIrC,SAAS,yBAAyB,CAAC,QAAuC;AAAA,EAC/E,eAAe;AAAA,EACf,OAAO,MAAM;AAAA,IACX,IAAI,iBAAiB;AAAA,MAAQ,eAAe;AAAA;AAAA;AAIhD,eAAsB,aAAa,CAAC,MAAmD;AAAA,EACrF,IAAI;AAAA,IAAc,OAAO,aAAa,QAAQ,IAAI;AAAA,EAClD,MAAM,YAAY,MAAM,mBAAsC,EAAE,QAAQ,WAAW,KAAK,CAAC;AAAA,EACzF,IAAI,UAAU;AAAA,IAAQ,OAAO,UAAU;AAAA,EACvC,OAAO;AAAA,IACL,IAAI;AAAA,IACJ,OAAO,UAAU,aACb,wDACA;AAAA,EACN;AAAA;AAeF,eAAsB,mBAAmB,CACvC,QACA,eAC6B;AAAA,EAC7B,IAAI;AAAA,IAAc,OAAO,aAAa,SAAS,QAAQ,aAAa;AAAA,EACpE,MAAM,WAAW,MAAM,mBAAuC;AAAA,IAC5D,QAAQ;AAAA,IACR;AAAA,IACA;AAAA,EACF,CAAC;AAAA,EACD,IAAI,SAAS;AAAA,IAAQ,OAAO,SAAS;AAAA,EACrC,IAAI,SAAS;AAAA,IAAY,OAAO,EAAE,IAAI,OAAO,OAAO,CAAC,EAAE;AAAA,EACvD,OAAO,EAAE,IAAI,MAAM,OAAO,CAAC,EAAE;AAAA;AAG/B,eAAsB,gBAAgB,CACpC,OACA,aACA,WACA,MACkB;AAAA,EAClB,IAAI;AAAA,IAAc,OAAO,aAAa,MAAM,OAAO,aAAa,WAAW,IAAI;AAAA,EAC/E,QAEI,MAAM,mBAA4B;AAAA,IAChC,QAAQ;AAAA,IACR;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC,GACD,UAAU;AAAA;",
8
+ "debugId": "C6D7A2F8FD57D92564756E2164756E21",
9
+ "names": []
10
+ }
@@ -0,0 +1,23 @@
1
+ import {
2
+ Database
3
+ } from "./chunk-f5xgprg1.js";
4
+ import {
5
+ SESSIONS_DB
6
+ } from "./chunk-k9z47mab.js";
7
+
8
+ // ../../packages/core/src/storage/forum-db.ts
9
+ import { mkdirSync } from "fs";
10
+ import { dirname } from "path";
11
+ mkdirSync(dirname(SESSIONS_DB), { recursive: true });
12
+ var db = new Database(SESSIONS_DB, { create: true });
13
+ db.exec("PRAGMA journal_mode = WAL");
14
+ db.exec("PRAGMA foreign_keys = ON");
15
+ db.exec("PRAGMA busy_timeout = 5000");
16
+ db.exec("PRAGMA wal_autocheckpoint = 1000");
17
+ try {
18
+ db.exec("PRAGMA wal_checkpoint(TRUNCATE)");
19
+ } catch {}
20
+
21
+ export { db };
22
+
23
+ //# debugId=589B08445A0B54C564756E2164756E21
@@ -0,0 +1,10 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../packages/core/src/storage/forum-db.ts"],
4
+ "sourcesContent": [
5
+ "import { mkdirSync } from \"node:fs\";\nimport { dirname } from \"node:path\";\nimport { SESSIONS_DB } from \"#platform/config\";\nimport { Database } from \"#storage/sqlite\";\n\nmkdirSync(dirname(SESSIONS_DB), { recursive: true });\n\nexport const db = new Database(SESSIONS_DB, { create: true });\ndb.exec(\"PRAGMA journal_mode = WAL\");\ndb.exec(\"PRAGMA foreign_keys = ON\");\ndb.exec(\"PRAGMA busy_timeout = 5000\");\n// Auto-checkpoint every ~1000 WAL pages (~4 MB at 4KB page size) to keep the\n// WAL file from growing unbounded during long-running pm2 sessions. The\n// default is 1000 but we set it explicitly so the policy is auditable.\ndb.exec(\"PRAGMA wal_autocheckpoint = 1000\");\n// Also run a TRUNCATE checkpoint on startup to reclaim any WAL space\n// accumulated while the bot was stopped (checkpointer doesn't run when\n// no connections are open).\ntry {\n db.exec(\"PRAGMA wal_checkpoint(TRUNCATE)\");\n} catch {\n // Non-fatal; a concurrent writer may hold the WAL briefly.\n}\n"
6
+ ],
7
+ "mappings": ";;;;;;;;AAAA;AACA;AAIA,UAAU,QAAQ,WAAW,GAAG,EAAE,WAAW,KAAK,CAAC;AAE5C,IAAM,KAAK,IAAI,SAAS,aAAa,EAAE,QAAQ,KAAK,CAAC;AAC5D,GAAG,KAAK,2BAA2B;AACnC,GAAG,KAAK,0BAA0B;AAClC,GAAG,KAAK,4BAA4B;AAIpC,GAAG,KAAK,kCAAkC;AAI1C,IAAI;AAAA,EACF,GAAG,KAAK,iCAAiC;AAAA,EACzC,MAAM;",
8
+ "debugId": "589B08445A0B54C564756E2164756E21",
9
+ "names": []
10
+ }