negotium 0.1.7 → 0.1.8

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 (256) hide show
  1. package/README.md +2 -2
  2. package/dist/chunk-0ay6cjdy.js +1331 -0
  3. package/dist/chunk-0ay6cjdy.js.map +16 -0
  4. package/dist/chunk-1k7t7bnx.js +97 -0
  5. package/dist/chunk-1k7t7bnx.js.map +10 -0
  6. package/dist/chunk-5ahkew9c.js +806 -0
  7. package/dist/chunk-5ahkew9c.js.map +17 -0
  8. package/dist/chunk-6cpn7ht2.js +287 -0
  9. package/dist/chunk-6cpn7ht2.js.map +13 -0
  10. package/dist/chunk-6kctn20e.js +3529 -0
  11. package/dist/chunk-6kctn20e.js.map +20 -0
  12. package/dist/chunk-7xqj7aex.js +77 -0
  13. package/dist/chunk-7xqj7aex.js.map +11 -0
  14. package/dist/chunk-9p0ww3tk.js +41 -0
  15. package/dist/chunk-9p0ww3tk.js.map +10 -0
  16. package/dist/chunk-a92a7nrk.js +252 -0
  17. package/dist/chunk-a92a7nrk.js.map +10 -0
  18. package/dist/chunk-c500xe9z.js +33 -0
  19. package/dist/chunk-c500xe9z.js.map +10 -0
  20. package/dist/chunk-cds1qxsf.js +1644 -0
  21. package/dist/chunk-cds1qxsf.js.map +17 -0
  22. package/dist/chunk-e4407g8x.js +274 -0
  23. package/dist/chunk-e4407g8x.js.map +10 -0
  24. package/dist/chunk-e5pbggsh.js +363 -0
  25. package/dist/chunk-e5pbggsh.js.map +11 -0
  26. package/dist/chunk-edb07sjp.js +567 -0
  27. package/dist/chunk-edb07sjp.js.map +14 -0
  28. package/dist/chunk-exd0v74a.js +3012 -0
  29. package/dist/chunk-exd0v74a.js.map +32 -0
  30. package/dist/chunk-fgrme9tr.js +4398 -0
  31. package/dist/chunk-fgrme9tr.js.map +47 -0
  32. package/dist/chunk-fka9eqe1.js +581 -0
  33. package/dist/chunk-fka9eqe1.js.map +11 -0
  34. package/dist/chunk-g82jygez.js +108 -0
  35. package/dist/chunk-g82jygez.js.map +10 -0
  36. package/dist/chunk-ghs2j1fr.js +312 -0
  37. package/dist/chunk-ghs2j1fr.js.map +10 -0
  38. package/dist/chunk-gmy11efb.js +125 -0
  39. package/dist/chunk-gmy11efb.js.map +10 -0
  40. package/dist/chunk-gxma4c70.js +110 -0
  41. package/dist/chunk-gxma4c70.js.map +10 -0
  42. package/dist/chunk-hkdqhm34.js +61 -0
  43. package/dist/chunk-hkdqhm34.js.map +10 -0
  44. package/dist/chunk-hpa0cpzh.js +134 -0
  45. package/dist/chunk-hpa0cpzh.js.map +10 -0
  46. package/dist/chunk-hwy3n31w.js +21 -0
  47. package/dist/chunk-hwy3n31w.js.map +9 -0
  48. package/dist/chunk-j2behpy7.js +214 -0
  49. package/dist/chunk-j2behpy7.js.map +10 -0
  50. package/dist/chunk-jc0at0tc.js +102 -0
  51. package/dist/chunk-jc0at0tc.js.map +10 -0
  52. package/dist/chunk-jkqq5ef6.js +243 -0
  53. package/dist/chunk-jkqq5ef6.js.map +11 -0
  54. package/dist/chunk-jzkw2f01.js +51 -0
  55. package/dist/chunk-jzkw2f01.js.map +10 -0
  56. package/dist/chunk-jzz91jwh.js +70 -0
  57. package/dist/chunk-jzz91jwh.js.map +10 -0
  58. package/dist/chunk-k9z47mab.js +247 -0
  59. package/dist/chunk-k9z47mab.js.map +12 -0
  60. package/dist/chunk-n17yxpa8.js +23 -0
  61. package/dist/chunk-n17yxpa8.js.map +10 -0
  62. package/dist/chunk-naa09ags.js +2143 -0
  63. package/dist/chunk-naa09ags.js.map +15 -0
  64. package/dist/chunk-ns3ke88n.js +142 -0
  65. package/dist/chunk-ns3ke88n.js.map +10 -0
  66. package/dist/chunk-p3cr2ejg.js +1626 -0
  67. package/dist/chunk-p3cr2ejg.js.map +15 -0
  68. package/dist/chunk-q5bcpf23.js +2925 -0
  69. package/dist/chunk-q5bcpf23.js.map +20 -0
  70. package/dist/chunk-rafc55bs.js +424 -0
  71. package/dist/chunk-rafc55bs.js.map +11 -0
  72. package/dist/chunk-rbrxjvbj.js +2830 -0
  73. package/dist/chunk-rbrxjvbj.js.map +23 -0
  74. package/dist/chunk-sa874j5c.js +9 -0
  75. package/dist/chunk-sa874j5c.js.map +10 -0
  76. package/dist/chunk-sgsz2fpq.js +289 -0
  77. package/dist/chunk-sgsz2fpq.js.map +10 -0
  78. package/dist/chunk-sm6fh5c5.js +569 -0
  79. package/dist/chunk-sm6fh5c5.js.map +14 -0
  80. package/dist/chunk-t9zcg8f1.js +499 -0
  81. package/dist/chunk-t9zcg8f1.js.map +13 -0
  82. package/dist/chunk-vp2db42d.js +121 -0
  83. package/dist/chunk-vp2db42d.js.map +10 -0
  84. package/dist/chunk-w13jjf4a.js +46 -0
  85. package/dist/chunk-w13jjf4a.js.map +10 -0
  86. package/dist/chunk-x1arr7ze.js +63 -0
  87. package/dist/chunk-x1arr7ze.js.map +10 -0
  88. package/dist/chunk-xfq68rch.js +583 -0
  89. package/dist/chunk-xfq68rch.js.map +11 -0
  90. package/dist/main.js +132 -20
  91. package/dist/main.js.map +4 -4
  92. package/dist/runtime/scripts/faster-whisper-wrapper.py +87 -0
  93. package/dist/runtime/scripts/mcp-patchright-http.mjs +349 -0
  94. package/dist/runtime/src/agents/api-topic-agent-switch.ts +178 -0
  95. package/dist/runtime/src/agents/archiver.ts +396 -0
  96. package/dist/runtime/src/agents/auth-check.ts +64 -0
  97. package/dist/runtime/src/agents/claude-provider.ts +737 -0
  98. package/dist/runtime/src/agents/claude-registry.ts +115 -0
  99. package/dist/runtime/src/agents/codex-native-multi-agent.ts +177 -0
  100. package/dist/runtime/src/agents/codex-provider.ts +785 -0
  101. package/dist/runtime/src/agents/codex-registry.ts +115 -0
  102. package/dist/runtime/src/agents/codex-tree-kill.ts +365 -0
  103. package/dist/runtime/src/agents/contracts.ts +69 -0
  104. package/dist/runtime/src/agents/deep-map.ts +13 -0
  105. package/dist/runtime/src/agents/execution-host.ts +91 -0
  106. package/dist/runtime/src/agents/fixtures/claude-attachments.jsonl +2 -0
  107. package/dist/runtime/src/agents/fixtures/codex-shell.jsonl +5 -0
  108. package/dist/runtime/src/agents/fork.ts +65 -0
  109. package/dist/runtime/src/agents/hosted-agent.ts +48 -0
  110. package/dist/runtime/src/agents/idle-archiver.ts +128 -0
  111. package/dist/runtime/src/agents/index.ts +205 -0
  112. package/dist/runtime/src/agents/maestro-provider.ts +206 -0
  113. package/dist/runtime/src/agents/maestro-registry.ts +31 -0
  114. package/dist/runtime/src/agents/mcp-tools/ask-user.ts +280 -0
  115. package/dist/runtime/src/agents/mcp-tools/common.ts +21 -0
  116. package/dist/runtime/src/agents/mcp-tools/self-config.ts +220 -0
  117. package/dist/runtime/src/agents/mcp-tools/spawn-subagent.ts +525 -0
  118. package/dist/runtime/src/agents/mcp-tools/visuals.ts +88 -0
  119. package/dist/runtime/src/agents/model-catalog.ts +151 -0
  120. package/dist/runtime/src/agents/registry.ts +24 -0
  121. package/dist/runtime/src/agents/rollout/claude.ts +331 -0
  122. package/dist/runtime/src/agents/rollout/codex.ts +569 -0
  123. package/dist/runtime/src/agents/rollout/shared.ts +205 -0
  124. package/dist/runtime/src/agents/self-config-core.ts +415 -0
  125. package/dist/runtime/src/agents/task-events.ts +44 -0
  126. package/dist/runtime/src/agents/tool-format.ts +352 -0
  127. package/dist/runtime/src/agents/topic-agent-switch.ts +193 -0
  128. package/dist/runtime/src/agents/topic-cleanup.ts +231 -0
  129. package/dist/runtime/src/agents/vault-tool-policy.ts +33 -0
  130. package/dist/runtime/src/application/execute-external-user-turn.ts +23 -0
  131. package/dist/runtime/src/application/submit-user-message.ts +47 -0
  132. package/dist/runtime/src/application/switch-topic-effort.ts +48 -0
  133. package/dist/runtime/src/application/switch-topic-model.ts +79 -0
  134. package/dist/runtime/src/application/topic-service.ts +139 -0
  135. package/dist/runtime/src/application/vault-command.ts +170 -0
  136. package/dist/runtime/src/bus.ts +319 -0
  137. package/dist/runtime/src/index.ts +333 -0
  138. package/dist/runtime/src/mcp/agent-health-server.ts +309 -0
  139. package/dist/runtime/src/mcp/background-bash-server.ts +346 -0
  140. package/dist/runtime/src/mcp/canonical-bridge-config.ts +84 -0
  141. package/dist/runtime/src/mcp/canonical-proxy-server.ts +171 -0
  142. package/dist/runtime/src/mcp/dm-ipc.ts +60 -0
  143. package/dist/runtime/src/mcp/mcp-helpers.ts +40 -0
  144. package/dist/runtime/src/mcp/paddleocr-server.ts +105 -0
  145. package/dist/runtime/src/mcp/peer-bridge.ts +114 -0
  146. package/dist/runtime/src/mcp/runtime-spec.ts +134 -0
  147. package/dist/runtime/src/mcp/session-comm/bridge-ipc-config.ts +27 -0
  148. package/dist/runtime/src/mcp/session-comm/peer-forward.ts +165 -0
  149. package/dist/runtime/src/mcp/session-comm/runtime.ts +115 -0
  150. package/dist/runtime/src/mcp/session-comm/server.ts +649 -0
  151. package/dist/runtime/src/mcp/session-comm/topic-config.ts +131 -0
  152. package/dist/runtime/src/mcp/session-comm/topics.ts +229 -0
  153. package/dist/runtime/src/mcp/stdio-protect.ts +84 -0
  154. package/dist/runtime/src/mcp/system-health-server.ts +130 -0
  155. package/dist/runtime/src/mcp/task-server.ts +173 -0
  156. package/dist/runtime/src/mcp/token-stats-server.ts +98 -0
  157. package/dist/runtime/src/mcp/vault-http.ts +219 -0
  158. package/dist/runtime/src/mcp/vault-run.ts +153 -0
  159. package/dist/runtime/src/mcp/vault-server.ts +104 -0
  160. package/dist/runtime/src/mcp/wiki-server.ts +755 -0
  161. package/dist/runtime/src/media/file-events.ts +33 -0
  162. package/dist/runtime/src/media/text-extractor.ts +312 -0
  163. package/dist/runtime/src/media/video.ts +92 -0
  164. package/dist/runtime/src/outbox/file-ops.ts +210 -0
  165. package/dist/runtime/src/outbox/index.ts +8 -0
  166. package/dist/runtime/src/outbox/utils.ts +51 -0
  167. package/dist/runtime/src/platform/background-bash/manager.ts +279 -0
  168. package/dist/runtime/src/platform/config.ts +371 -0
  169. package/dist/runtime/src/platform/constants.ts +18 -0
  170. package/dist/runtime/src/platform/debug-users.ts +14 -0
  171. package/dist/runtime/src/platform/delay.ts +1 -0
  172. package/dist/runtime/src/platform/error.ts +9 -0
  173. package/dist/runtime/src/platform/file-utils.ts +16 -0
  174. package/dist/runtime/src/platform/jsonl.ts +202 -0
  175. package/dist/runtime/src/platform/lifecycle.ts +174 -0
  176. package/dist/runtime/src/platform/logger.ts +31 -0
  177. package/dist/runtime/src/platform/maestro-bootstrap-env.ts +3 -0
  178. package/dist/runtime/src/platform/mcp-config.ts +865 -0
  179. package/dist/runtime/src/platform/modules.ts +145 -0
  180. package/dist/runtime/src/platform/node-plugins.ts +46 -0
  181. package/dist/runtime/src/platform/playwright/manager.ts +1233 -0
  182. package/dist/runtime/src/prompts/agents/wiki-archiver.md +261 -0
  183. package/dist/runtime/src/prompts/builders.ts +357 -0
  184. package/dist/runtime/src/prompts/sessions/channel-system.md +48 -0
  185. package/dist/runtime/src/prompts/sessions/manager-system.md +37 -0
  186. package/dist/runtime/src/prompts/sessions/topic-system.md +47 -0
  187. package/dist/runtime/src/prompts/sessions/visual-design.md +86 -0
  188. package/dist/runtime/src/query/active-rooms.ts +532 -0
  189. package/dist/runtime/src/query/control.ts +313 -0
  190. package/dist/runtime/src/query/index.ts +24 -0
  191. package/dist/runtime/src/query/session-inbox-cleanup.ts +44 -0
  192. package/dist/runtime/src/query/session-inbox-path.ts +42 -0
  193. package/dist/runtime/src/query/state.ts +94 -0
  194. package/dist/runtime/src/query/types.ts +83 -0
  195. package/dist/runtime/src/runtime/ask-callbacks.ts +153 -0
  196. package/dist/runtime/src/runtime/attachments.ts +151 -0
  197. package/dist/runtime/src/runtime/background-sessions.ts +83 -0
  198. package/dist/runtime/src/runtime/channel-context.ts +107 -0
  199. package/dist/runtime/src/runtime/errors.ts +69 -0
  200. package/dist/runtime/src/runtime/event-heartbeat.ts +77 -0
  201. package/dist/runtime/src/runtime/file-hooks.ts +81 -0
  202. package/dist/runtime/src/runtime/footer.ts +23 -0
  203. package/dist/runtime/src/runtime/inbox.ts +946 -0
  204. package/dist/runtime/src/runtime/tasks.ts +56 -0
  205. package/dist/runtime/src/runtime/topic-config.ts +29 -0
  206. package/dist/runtime/src/runtime/turn-runner.ts +2286 -0
  207. package/dist/runtime/src/runtime/usage-alert.ts +84 -0
  208. package/dist/runtime/src/runtime/visual-html.ts +109 -0
  209. package/dist/runtime/src/runtime/visual-store.ts +430 -0
  210. package/dist/runtime/src/runtime/visuals.ts +171 -0
  211. package/dist/runtime/src/security/sanitize.ts +27 -0
  212. package/dist/runtime/src/security/sensitive-path.ts +34 -0
  213. package/dist/runtime/src/storage/activity-log.ts +152 -0
  214. package/dist/runtime/src/storage/api-messages.ts +617 -0
  215. package/dist/runtime/src/storage/api-topic-brief.ts +127 -0
  216. package/dist/runtime/src/storage/api-topic-config.ts +192 -0
  217. package/dist/runtime/src/storage/api-topics.ts +844 -0
  218. package/dist/runtime/src/storage/app-settings.ts +44 -0
  219. package/dist/runtime/src/storage/browser-profiles.ts +133 -0
  220. package/dist/runtime/src/storage/conversations.ts +268 -0
  221. package/dist/runtime/src/storage/forum/agent-settings.ts +20 -0
  222. package/dist/runtime/src/storage/forum/index.ts +4 -0
  223. package/dist/runtime/src/storage/forum/repository.ts +283 -0
  224. package/dist/runtime/src/storage/forum/schema.ts +300 -0
  225. package/dist/runtime/src/storage/forum-db.ts +23 -0
  226. package/dist/runtime/src/storage/runtime-events.ts +130 -0
  227. package/dist/runtime/src/storage/runtime-leases.ts +189 -0
  228. package/dist/runtime/src/storage/runtime-process-leases.ts +216 -0
  229. package/dist/runtime/src/storage/runtime-topic-state.ts +148 -0
  230. package/dist/runtime/src/storage/runtime-turn-requests.ts +300 -0
  231. package/dist/runtime/src/storage/self-schedules.ts +298 -0
  232. package/dist/runtime/src/storage/session-asks.ts +347 -0
  233. package/dist/runtime/src/storage/sqlite.ts +129 -0
  234. package/dist/runtime/src/storage/tasks.ts +179 -0
  235. package/dist/runtime/src/storage/token-stats.ts +144 -0
  236. package/dist/runtime/src/storage/topic-archive-state.ts +59 -0
  237. package/dist/runtime/src/storage/topic-archive.ts +74 -0
  238. package/dist/runtime/src/storage/topic-settings.ts +67 -0
  239. package/dist/runtime/src/storage/topic-transcript.ts +98 -0
  240. package/dist/runtime/src/storage/vault-crypto.ts +65 -0
  241. package/dist/runtime/src/storage/vault.ts +225 -0
  242. package/dist/runtime/src/storage/wiki-summary-names.ts +33 -0
  243. package/dist/runtime/src/storage/wiki.ts +85 -0
  244. package/dist/runtime/src/topics/create.ts +123 -0
  245. package/dist/runtime/src/topics/derive.ts +398 -0
  246. package/dist/runtime/src/topics/lifecycle.ts +311 -0
  247. package/dist/runtime/src/topics/links.ts +7 -0
  248. package/dist/runtime/src/topics/personal-general.ts +65 -0
  249. package/dist/runtime/src/topics/session.ts +381 -0
  250. package/dist/runtime/src/types/api.ts +497 -0
  251. package/dist/runtime/src/types.ts +255 -0
  252. package/dist/runtime/src/version.ts +1 -0
  253. package/dist/runtime/tsconfig.json +13 -0
  254. package/package.json +16 -3
  255. package/dist/main.d.ts +0 -3
  256. package/dist/main.d.ts.map +0 -1
@@ -0,0 +1,110 @@
1
+ // @bun
2
+ import"./chunk-exd0v74a.js";
3
+ import"./chunk-sm6fh5c5.js";
4
+ import"./chunk-jc0at0tc.js";
5
+ import"./chunk-sgsz2fpq.js";
6
+ import"./chunk-1k7t7bnx.js";
7
+ import"./chunk-rbrxjvbj.js";
8
+ import"./chunk-ghs2j1fr.js";
9
+ import {
10
+ VAULT_DESCRIPTION_MAX_LENGTH,
11
+ VAULT_VALUE_MAX_BYTES,
12
+ VAULT_VALUE_MIN_BYTES,
13
+ normalizeVaultKey,
14
+ validateVaultKey,
15
+ vaultDel,
16
+ vaultListWithValues,
17
+ vaultSet
18
+ } from "./chunk-fgrme9tr.js";
19
+ import"./chunk-0ay6cjdy.js";
20
+ import"./chunk-xfq68rch.js";
21
+ import"./chunk-9p0ww3tk.js";
22
+ import"./chunk-vp2db42d.js";
23
+ import"./chunk-gmy11efb.js";
24
+ import"./chunk-t9zcg8f1.js";
25
+ import"./chunk-7xqj7aex.js";
26
+ import"./chunk-x1arr7ze.js";
27
+ import"./chunk-5ahkew9c.js";
28
+ import"./chunk-6cpn7ht2.js";
29
+ import"./chunk-k9z47mab.js";
30
+ import"./chunk-hwy3n31w.js";
31
+
32
+ // ../cli/src/commands/vault.ts
33
+ var DEFAULT_USER = "local";
34
+ function vaultCommand(args) {
35
+ const [sub, key, value, ...descParts] = args;
36
+ switch (sub) {
37
+ case undefined:
38
+ case "list": {
39
+ const entries = vaultListWithValues(DEFAULT_USER);
40
+ if (entries.length === 0) {
41
+ console.log("vault is empty \u2014 `negotium vault set MY_KEY <value> [description]`");
42
+ return;
43
+ }
44
+ for (const entry of entries) {
45
+ console.log(`${entry.key} ${entry.description || ""}`.trimEnd());
46
+ }
47
+ return;
48
+ }
49
+ case "set": {
50
+ if (!key || !value) {
51
+ console.error("usage: negotium vault set <KEY> <value> [description]");
52
+ process.exitCode = 1;
53
+ return;
54
+ }
55
+ const normalized = normalizeVaultKey(key);
56
+ if (!validateVaultKey(normalized)) {
57
+ console.error("invalid key \u2014 use A-Z, 0-9, _ (must start with a letter, max 128 chars)");
58
+ process.exitCode = 1;
59
+ return;
60
+ }
61
+ const valueBytes = Buffer.byteLength(value, "utf8");
62
+ if (valueBytes < VAULT_VALUE_MIN_BYTES || valueBytes > VAULT_VALUE_MAX_BYTES) {
63
+ console.error(`value must be between ${VAULT_VALUE_MIN_BYTES} and ${VAULT_VALUE_MAX_BYTES} bytes`);
64
+ process.exitCode = 1;
65
+ return;
66
+ }
67
+ const description = descParts.join(" ");
68
+ if (description.length > VAULT_DESCRIPTION_MAX_LENGTH) {
69
+ console.error(`description must be at most ${VAULT_DESCRIPTION_MAX_LENGTH} characters`);
70
+ process.exitCode = 1;
71
+ return;
72
+ }
73
+ vaultSet(DEFAULT_USER, normalized, value, description);
74
+ console.log(`stored ${normalized}`);
75
+ return;
76
+ }
77
+ case "get": {
78
+ if (!key) {
79
+ console.error("usage: negotium vault get <KEY>");
80
+ process.exitCode = 1;
81
+ return;
82
+ }
83
+ const entry = vaultListWithValues(DEFAULT_USER).find((e) => e.key === normalizeVaultKey(key));
84
+ if (!entry) {
85
+ console.error(`no such key "${key}"`);
86
+ process.exitCode = 1;
87
+ return;
88
+ }
89
+ console.log(entry.value);
90
+ return;
91
+ }
92
+ case "del": {
93
+ if (!key) {
94
+ console.error("usage: negotium vault del <KEY>");
95
+ process.exitCode = 1;
96
+ return;
97
+ }
98
+ console.log(vaultDel(DEFAULT_USER, normalizeVaultKey(key)) ? `deleted ${key}` : `no such key "${key}"`);
99
+ return;
100
+ }
101
+ default:
102
+ console.error(`unknown subcommand "${sub}" \u2014 use list|set|get|del`);
103
+ process.exitCode = 1;
104
+ }
105
+ }
106
+ export {
107
+ vaultCommand
108
+ };
109
+
110
+ //# debugId=F44F491EA5CF62FC64756E2164756E21
@@ -0,0 +1,10 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../cli/src/commands/vault.ts"],
4
+ "sourcesContent": [
5
+ "/**\n * `negotium vault <list|set|get|del>` — node secret store.\n *\n * Values are AES-encrypted at rest with the per-node master key\n * (~/.negotium/vault-master-key, or NEGOTIUM_VAULT_MASTER_KEY). The vault is a\n * core system: agents/MCPs read it through the runtime, humans through here.\n */\n\nimport {\n normalizeVaultKey,\n VAULT_DESCRIPTION_MAX_LENGTH,\n VAULT_VALUE_MAX_BYTES,\n VAULT_VALUE_MIN_BYTES,\n validateVaultKey,\n vaultDel,\n vaultListWithValues,\n vaultSet,\n} from \"@negotium/core\";\n\nconst DEFAULT_USER = \"local\";\n\nexport function vaultCommand(args: string[]): void {\n const [sub, key, value, ...descParts] = args;\n\n switch (sub) {\n case undefined:\n case \"list\": {\n const entries = vaultListWithValues(DEFAULT_USER);\n if (entries.length === 0) {\n console.log(\"vault is empty — `negotium vault set MY_KEY <value> [description]`\");\n return;\n }\n for (const entry of entries) {\n console.log(`${entry.key} ${entry.description || \"\"}`.trimEnd());\n }\n return;\n }\n case \"set\": {\n if (!key || !value) {\n console.error(\"usage: negotium vault set <KEY> <value> [description]\");\n process.exitCode = 1;\n return;\n }\n const normalized = normalizeVaultKey(key);\n if (!validateVaultKey(normalized)) {\n console.error(\"invalid key — use A-Z, 0-9, _ (must start with a letter, max 128 chars)\");\n process.exitCode = 1;\n return;\n }\n const valueBytes = Buffer.byteLength(value, \"utf8\");\n if (valueBytes < VAULT_VALUE_MIN_BYTES || valueBytes > VAULT_VALUE_MAX_BYTES) {\n console.error(\n `value must be between ${VAULT_VALUE_MIN_BYTES} and ${VAULT_VALUE_MAX_BYTES} bytes`,\n );\n process.exitCode = 1;\n return;\n }\n const description = descParts.join(\" \");\n if (description.length > VAULT_DESCRIPTION_MAX_LENGTH) {\n console.error(`description must be at most ${VAULT_DESCRIPTION_MAX_LENGTH} characters`);\n process.exitCode = 1;\n return;\n }\n vaultSet(DEFAULT_USER, normalized, value, description);\n console.log(`stored ${normalized}`);\n return;\n }\n case \"get\": {\n if (!key) {\n console.error(\"usage: negotium vault get <KEY>\");\n process.exitCode = 1;\n return;\n }\n const entry = vaultListWithValues(DEFAULT_USER).find((e) => e.key === normalizeVaultKey(key));\n if (!entry) {\n console.error(`no such key \"${key}\"`);\n process.exitCode = 1;\n return;\n }\n console.log(entry.value);\n return;\n }\n case \"del\": {\n if (!key) {\n console.error(\"usage: negotium vault del <KEY>\");\n process.exitCode = 1;\n return;\n }\n console.log(\n vaultDel(DEFAULT_USER, normalizeVaultKey(key)) ? `deleted ${key}` : `no such key \"${key}\"`,\n );\n return;\n }\n default:\n console.error(`unknown subcommand \"${sub}\" — use list|set|get|del`);\n process.exitCode = 1;\n }\n}\n"
6
+ ],
7
+ "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAmBA,IAAM,eAAe;AAEd,SAAS,YAAY,CAAC,MAAsB;AAAA,EACjD,OAAO,KAAK,KAAK,UAAU,aAAa;AAAA,EAExC,QAAQ;AAAA,SACD;AAAA,SACA,QAAQ;AAAA,MACX,MAAM,UAAU,oBAAoB,YAAY;AAAA,MAChD,IAAI,QAAQ,WAAW,GAAG;AAAA,QACxB,QAAQ,IAAI,yEAAmE;AAAA,QAC/E;AAAA,MACF;AAAA,MACA,WAAW,SAAS,SAAS;AAAA,QAC3B,QAAQ,IAAI,GAAG,MAAM,QAAQ,MAAM,eAAe,KAAK,QAAQ,CAAC;AAAA,MAClE;AAAA,MACA;AAAA,IACF;AAAA,SACK,OAAO;AAAA,MACV,KAAK,QAAQ,OAAO;AAAA,QAClB,QAAQ,MAAM,uDAAuD;AAAA,QACrE,QAAQ,WAAW;AAAA,QACnB;AAAA,MACF;AAAA,MACA,MAAM,aAAa,kBAAkB,GAAG;AAAA,MACxC,KAAK,iBAAiB,UAAU,GAAG;AAAA,QACjC,QAAQ,MAAM,8EAAwE;AAAA,QACtF,QAAQ,WAAW;AAAA,QACnB;AAAA,MACF;AAAA,MACA,MAAM,aAAa,OAAO,WAAW,OAAO,MAAM;AAAA,MAClD,IAAI,aAAa,yBAAyB,aAAa,uBAAuB;AAAA,QAC5E,QAAQ,MACN,yBAAyB,6BAA6B,6BACxD;AAAA,QACA,QAAQ,WAAW;AAAA,QACnB;AAAA,MACF;AAAA,MACA,MAAM,cAAc,UAAU,KAAK,GAAG;AAAA,MACtC,IAAI,YAAY,SAAS,8BAA8B;AAAA,QACrD,QAAQ,MAAM,+BAA+B,yCAAyC;AAAA,QACtF,QAAQ,WAAW;AAAA,QACnB;AAAA,MACF;AAAA,MACA,SAAS,cAAc,YAAY,OAAO,WAAW;AAAA,MACrD,QAAQ,IAAI,UAAU,YAAY;AAAA,MAClC;AAAA,IACF;AAAA,SACK,OAAO;AAAA,MACV,KAAK,KAAK;AAAA,QACR,QAAQ,MAAM,iCAAiC;AAAA,QAC/C,QAAQ,WAAW;AAAA,QACnB;AAAA,MACF;AAAA,MACA,MAAM,QAAQ,oBAAoB,YAAY,EAAE,KAAK,CAAC,MAAM,EAAE,QAAQ,kBAAkB,GAAG,CAAC;AAAA,MAC5F,KAAK,OAAO;AAAA,QACV,QAAQ,MAAM,gBAAgB,MAAM;AAAA,QACpC,QAAQ,WAAW;AAAA,QACnB;AAAA,MACF;AAAA,MACA,QAAQ,IAAI,MAAM,KAAK;AAAA,MACvB;AAAA,IACF;AAAA,SACK,OAAO;AAAA,MACV,KAAK,KAAK;AAAA,QACR,QAAQ,MAAM,iCAAiC;AAAA,QAC/C,QAAQ,WAAW;AAAA,QACnB;AAAA,MACF;AAAA,MACA,QAAQ,IACN,SAAS,cAAc,kBAAkB,GAAG,CAAC,IAAI,WAAW,QAAQ,gBAAgB,MACtF;AAAA,MACA;AAAA,IACF;AAAA;AAAA,MAEE,QAAQ,MAAM,uBAAuB,kCAA4B;AAAA,MACjE,QAAQ,WAAW;AAAA;AAAA;",
8
+ "debugId": "F44F491EA5CF62FC64756E2164756E21",
9
+ "names": []
10
+ }
@@ -0,0 +1,61 @@
1
+ // @bun
2
+ import {
3
+ loadOtiumCli,
4
+ loadTelegramCli,
5
+ loadTerminalCli
6
+ } from "./chunk-n17yxpa8.js";
7
+ import"./chunk-hwy3n31w.js";
8
+
9
+ // ../cli/src/commands/adapters.ts
10
+ function selectedAdapter(args) {
11
+ const withArg = args.find((arg) => arg.startsWith("--with="))?.slice("--with=".length);
12
+ const requested = [
13
+ ...withArg?.split(",") ?? [],
14
+ ...args.filter((arg) => !arg.startsWith("--"))
15
+ ].filter(Boolean);
16
+ if (requested.includes("all") || requested.length > 1) {
17
+ throw new Error("adapters run as independent processes; start terminal, telegram, and otium in separate shells");
18
+ }
19
+ const requestedName = requested[0];
20
+ if (requestedName === "terminal" || requestedName === "telegram" || requestedName === "otium") {
21
+ return requestedName;
22
+ }
23
+ if (requestedName)
24
+ throw new Error(`unknown adapter: ${requestedName}`);
25
+ if (process.stdin.isTTY && process.stdout.isTTY)
26
+ return "terminal";
27
+ if (process.env.TELEGRAM_BOT_TOKEN?.trim())
28
+ return "telegram";
29
+ if (process.env.OTIUM_CENTRAL_URL?.trim() || process.env.OTIUM_CELL_ID?.trim() || process.env.OTIUM_CELL_SECRET?.trim()) {
30
+ return "otium";
31
+ }
32
+ throw new Error("no adapter selected; pass terminal, telegram, or otium");
33
+ }
34
+ function terminalArgs(args) {
35
+ return args.filter((arg) => arg !== "terminal" && !arg.startsWith("--with="));
36
+ }
37
+ async function adaptersCommand(args) {
38
+ const adapter = selectedAdapter(args);
39
+ switch (adapter) {
40
+ case "terminal": {
41
+ const { runTerminalCli } = await loadTerminalCli();
42
+ await runTerminalCli(terminalArgs(args));
43
+ break;
44
+ }
45
+ case "telegram": {
46
+ const { runTelegramCli } = await loadTelegramCli();
47
+ await runTelegramCli();
48
+ break;
49
+ }
50
+ case "otium": {
51
+ const { runOtiumCli } = await loadOtiumCli();
52
+ await runOtiumCli(["serve"]);
53
+ break;
54
+ }
55
+ }
56
+ }
57
+ export {
58
+ adaptersCommand
59
+ };
60
+
61
+ //# debugId=A8A2C31BC0A3B00D64756E2164756E21
@@ -0,0 +1,10 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../cli/src/commands/adapters.ts"],
4
+ "sourcesContent": [
5
+ "type AdapterName = \"terminal\" | \"telegram\" | \"otium\";\n\nimport { loadOtiumCli, loadTelegramCli, loadTerminalCli } from \"@/adapter-loader\";\n\nfunction selectedAdapter(args: string[]): AdapterName {\n const withArg = args.find((arg) => arg.startsWith(\"--with=\"))?.slice(\"--with=\".length);\n const requested = [\n ...(withArg?.split(\",\") ?? []),\n ...args.filter((arg) => !arg.startsWith(\"--\")),\n ].filter(Boolean);\n\n if (requested.includes(\"all\") || requested.length > 1) {\n throw new Error(\n \"adapters run as independent processes; start terminal, telegram, and otium in separate shells\",\n );\n }\n\n const requestedName = requested[0];\n if (requestedName === \"terminal\" || requestedName === \"telegram\" || requestedName === \"otium\") {\n return requestedName;\n }\n if (requestedName) throw new Error(`unknown adapter: ${requestedName}`);\n\n if (process.stdin.isTTY && process.stdout.isTTY) return \"terminal\";\n if (process.env.TELEGRAM_BOT_TOKEN?.trim()) return \"telegram\";\n if (\n process.env.OTIUM_CENTRAL_URL?.trim() ||\n process.env.OTIUM_CELL_ID?.trim() ||\n process.env.OTIUM_CELL_SECRET?.trim()\n ) {\n return \"otium\";\n }\n throw new Error(\"no adapter selected; pass terminal, telegram, or otium\");\n}\n\nfunction terminalArgs(args: string[]): string[] {\n return args.filter((arg) => arg !== \"terminal\" && !arg.startsWith(\"--with=\"));\n}\n\n/**\n * Start one channel in this process. Terminal is a short-lived client of the\n * state directory's long-lived node; the other adapters retain their own host\n * lifecycle until they migrate to the same control boundary.\n */\nexport async function adaptersCommand(args: string[]): Promise<void> {\n const adapter = selectedAdapter(args);\n switch (adapter) {\n case \"terminal\": {\n const { runTerminalCli } = await loadTerminalCli();\n await runTerminalCli(terminalArgs(args));\n break;\n }\n case \"telegram\": {\n const { runTelegramCli } = await loadTelegramCli();\n await runTelegramCli();\n break;\n }\n case \"otium\": {\n const { runOtiumCli } = await loadOtiumCli();\n await runOtiumCli([\"serve\"]);\n break;\n }\n }\n}\n"
6
+ ],
7
+ "mappings": ";;;;;;;;;AAIA,SAAS,eAAe,CAAC,MAA6B;AAAA,EACpD,MAAM,UAAU,KAAK,KAAK,CAAC,QAAQ,IAAI,WAAW,SAAS,CAAC,GAAG,MAAM,UAAU,MAAM;AAAA,EACrF,MAAM,YAAY;AAAA,IAChB,GAAI,SAAS,MAAM,GAAG,KAAK,CAAC;AAAA,IAC5B,GAAG,KAAK,OAAO,CAAC,SAAS,IAAI,WAAW,IAAI,CAAC;AAAA,EAC/C,EAAE,OAAO,OAAO;AAAA,EAEhB,IAAI,UAAU,SAAS,KAAK,KAAK,UAAU,SAAS,GAAG;AAAA,IACrD,MAAM,IAAI,MACR,+FACF;AAAA,EACF;AAAA,EAEA,MAAM,gBAAgB,UAAU;AAAA,EAChC,IAAI,kBAAkB,cAAc,kBAAkB,cAAc,kBAAkB,SAAS;AAAA,IAC7F,OAAO;AAAA,EACT;AAAA,EACA,IAAI;AAAA,IAAe,MAAM,IAAI,MAAM,oBAAoB,eAAe;AAAA,EAEtE,IAAI,QAAQ,MAAM,SAAS,QAAQ,OAAO;AAAA,IAAO,OAAO;AAAA,EACxD,IAAI,QAAQ,IAAI,oBAAoB,KAAK;AAAA,IAAG,OAAO;AAAA,EACnD,IACE,QAAQ,IAAI,mBAAmB,KAAK,KACpC,QAAQ,IAAI,eAAe,KAAK,KAChC,QAAQ,IAAI,mBAAmB,KAAK,GACpC;AAAA,IACA,OAAO;AAAA,EACT;AAAA,EACA,MAAM,IAAI,MAAM,wDAAwD;AAAA;AAG1E,SAAS,YAAY,CAAC,MAA0B;AAAA,EAC9C,OAAO,KAAK,OAAO,CAAC,QAAQ,QAAQ,eAAe,IAAI,WAAW,SAAS,CAAC;AAAA;AAQ9E,eAAsB,eAAe,CAAC,MAA+B;AAAA,EACnE,MAAM,UAAU,gBAAgB,IAAI;AAAA,EACpC,QAAQ;AAAA,SACD,YAAY;AAAA,MACf,QAAQ,mBAAmB,MAAM,gBAAgB;AAAA,MACjD,MAAM,eAAe,aAAa,IAAI,CAAC;AAAA,MACvC;AAAA,IACF;AAAA,SACK,YAAY;AAAA,MACf,QAAQ,mBAAmB,MAAM,gBAAgB;AAAA,MACjD,MAAM,eAAe;AAAA,MACrB;AAAA,IACF;AAAA,SACK,SAAS;AAAA,MACZ,QAAQ,gBAAgB,MAAM,aAAa;AAAA,MAC3C,MAAM,YAAY,CAAC,OAAO,CAAC;AAAA,MAC3B;AAAA,IACF;AAAA;AAAA;",
8
+ "debugId": "A8A2C31BC0A3B00D64756E2164756E21",
9
+ "names": []
10
+ }
@@ -0,0 +1,134 @@
1
+ // @bun
2
+ import {
3
+ claimEnrollment,
4
+ commitEnrollment,
5
+ isEnrollmentPending,
6
+ parseEnrollmentInvite,
7
+ previewEnrollment
8
+ } from "./chunk-a92a7nrk.js";
9
+ import {
10
+ configureOtiumCentral,
11
+ selfPeerNode
12
+ } from "./chunk-ns3ke88n.js";
13
+ import {
14
+ parseInviteCode,
15
+ saveJoin
16
+ } from "./chunk-e5pbggsh.js";
17
+ import"./chunk-exd0v74a.js";
18
+ import"./chunk-sm6fh5c5.js";
19
+ import"./chunk-jc0at0tc.js";
20
+ import"./chunk-sgsz2fpq.js";
21
+ import"./chunk-1k7t7bnx.js";
22
+ import"./chunk-rbrxjvbj.js";
23
+ import"./chunk-ghs2j1fr.js";
24
+ import"./chunk-fgrme9tr.js";
25
+ import"./chunk-0ay6cjdy.js";
26
+ import"./chunk-xfq68rch.js";
27
+ import"./chunk-9p0ww3tk.js";
28
+ import"./chunk-vp2db42d.js";
29
+ import"./chunk-gmy11efb.js";
30
+ import"./chunk-t9zcg8f1.js";
31
+ import"./chunk-7xqj7aex.js";
32
+ import"./chunk-x1arr7ze.js";
33
+ import"./chunk-5ahkew9c.js";
34
+ import"./chunk-6cpn7ht2.js";
35
+ import"./chunk-k9z47mab.js";
36
+ import {
37
+ __require,
38
+ __toESM
39
+ } from "./chunk-hwy3n31w.js";
40
+
41
+ // ../../adapters/otium/src/join-cli.ts
42
+ function option(args, name) {
43
+ const index = args.indexOf(`--${name}`);
44
+ return index >= 0 ? args[index + 1]?.trim() : undefined;
45
+ }
46
+ async function confirmEnrollment(message) {
47
+ if (!process.stdin.isTTY)
48
+ return false;
49
+ const { createInterface } = await import("readline/promises");
50
+ const prompt = createInterface({ input: process.stdin, output: process.stdout });
51
+ try {
52
+ return /^(?:y|yes)$/i.test((await prompt.question(`${message} [y/N] `)).trim());
53
+ } finally {
54
+ prompt.close();
55
+ }
56
+ }
57
+ async function joinCommand(args) {
58
+ const code = args[0]?.trim();
59
+ if (!code) {
60
+ console.error("usage: negotium-otium join <invite-code> [--yes] [--name <node-name>] [--legacy] [--replace]");
61
+ process.exitCode = 1;
62
+ return;
63
+ }
64
+ let join;
65
+ let productionEnrollment = false;
66
+ if (args.includes("--legacy")) {
67
+ try {
68
+ join = parseInviteCode(code);
69
+ } catch (err) {
70
+ console.error(`invalid legacy invite code: ${err instanceof Error ? err.message : err}`);
71
+ process.exitCode = 1;
72
+ return;
73
+ }
74
+ } else {
75
+ try {
76
+ const invite = parseEnrollmentInvite(code);
77
+ const resuming = isEnrollmentPending(invite);
78
+ let nodeName = option(args, "name");
79
+ if (resuming) {
80
+ console.log(`Resuming interrupted Otium enrollment with ${invite.central}`);
81
+ } else {
82
+ const preview = await previewEnrollment(invite);
83
+ const workspace = preview.preview?.workspace;
84
+ nodeName ||= preview.preview?.suggestedNodeName || undefined;
85
+ console.log(`Otium workspace: ${workspace?.name ?? workspace?.slug ?? workspace?.id}`);
86
+ console.log(` central: ${invite.central}`);
87
+ console.log(` transport: ${preview.preview?.transport ?? "relay"}`);
88
+ console.log(` access: ${preview.preview?.topics ?? "explicitly shared topics only"}`);
89
+ const accepted = args.includes("--yes") || await confirmEnrollment("Join this workspace?");
90
+ if (!accepted) {
91
+ console.log("enrollment cancelled");
92
+ return;
93
+ }
94
+ }
95
+ join = await claimEnrollment(invite, nodeName);
96
+ productionEnrollment = true;
97
+ } catch (err) {
98
+ console.error(`enrollment failed: ${err instanceof Error ? err.message : err}`);
99
+ process.exitCode = 1;
100
+ return;
101
+ }
102
+ }
103
+ let path;
104
+ try {
105
+ const saveOptions = { replaceExisting: args.includes("--replace") };
106
+ path = productionEnrollment ? commitEnrollment(join, saveOptions) : saveJoin(join, saveOptions);
107
+ } catch (err) {
108
+ console.error(`could not save join credentials: ${err instanceof Error ? err.message : err}`);
109
+ process.exitCode = 1;
110
+ return;
111
+ }
112
+ console.log(`otium join credentials saved to ${path}`);
113
+ console.log(` central: ${join.central}`);
114
+ console.log(` cellId: ${join.cellId}`);
115
+ configureOtiumCentral(join);
116
+ try {
117
+ const self = await selfPeerNode();
118
+ if (self) {
119
+ console.log(`attached to workspace as "${self.nodeName ?? self.cellId}" (baseUrl ${self.baseUrl})`);
120
+ } else {
121
+ console.warn("warning: central answered but this cell has no visible assignment yet \u2014 check the workspace assignment");
122
+ }
123
+ } catch (err) {
124
+ console.warn(`warning: could not verify against central (${err instanceof Error ? err.message : err}) \u2014 credentials saved anyway`);
125
+ } finally {
126
+ configureOtiumCentral(null);
127
+ }
128
+ console.log("\nnext: `negotium-otium serve` (mounts the otium peer routes automatically)");
129
+ }
130
+ export {
131
+ joinCommand
132
+ };
133
+
134
+ //# debugId=F6245554D39E3BE564756E2164756E21
@@ -0,0 +1,10 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../adapters/otium/src/join-cli.ts"],
4
+ "sourcesContent": [
5
+ "/**\n * `negotium-otium join <code>` — attach this node to an otium workspace as a\n * worker. Production codes carry only `{v:2, central, token}`; the node\n * previews the workspace, creates an X25519 enrollment key, atomically claims\n * the invite, and decrypts the returned credential envelope. Credentials persist under\n * `${DATA_DIR}/otium-join.json` (0600); `negotium-otium serve` mounts the otium\n * peer routes whenever that file exists.\n */\n\nimport { configureOtiumCentral, selfPeerNode } from \"@/central\";\nimport {\n claimEnrollment,\n commitEnrollment,\n isEnrollmentPending,\n parseEnrollmentInvite,\n previewEnrollment,\n} from \"@/enrollment\";\nimport { parseInviteCode, saveJoin } from \"@/join\";\n\nfunction option(args: string[], name: string): string | undefined {\n const index = args.indexOf(`--${name}`);\n return index >= 0 ? args[index + 1]?.trim() : undefined;\n}\n\nasync function confirmEnrollment(message: string): Promise<boolean> {\n if (!process.stdin.isTTY) return false;\n const { createInterface } = await import(\"node:readline/promises\");\n const prompt = createInterface({ input: process.stdin, output: process.stdout });\n try {\n return /^(?:y|yes)$/i.test((await prompt.question(`${message} [y/N] `)).trim());\n } finally {\n prompt.close();\n }\n}\n\nexport async function joinCommand(args: string[]): Promise<void> {\n const code = args[0]?.trim();\n if (!code) {\n console.error(\n \"usage: negotium-otium join <invite-code> [--yes] [--name <node-name>] [--legacy] [--replace]\",\n );\n process.exitCode = 1;\n return;\n }\n\n let join: ReturnType<typeof parseInviteCode>;\n let productionEnrollment = false;\n if (args.includes(\"--legacy\")) {\n try {\n join = parseInviteCode(code);\n } catch (err) {\n console.error(`invalid legacy invite code: ${err instanceof Error ? err.message : err}`);\n process.exitCode = 1;\n return;\n }\n } else {\n try {\n const invite = parseEnrollmentInvite(code);\n const resuming = isEnrollmentPending(invite);\n let nodeName = option(args, \"name\");\n if (resuming) {\n console.log(`Resuming interrupted Otium enrollment with ${invite.central}`);\n } else {\n const preview = await previewEnrollment(invite);\n const workspace = preview.preview?.workspace;\n nodeName ||= preview.preview?.suggestedNodeName || undefined;\n console.log(`Otium workspace: ${workspace?.name ?? workspace?.slug ?? workspace?.id}`);\n console.log(` central: ${invite.central}`);\n console.log(` transport: ${preview.preview?.transport ?? \"relay\"}`);\n console.log(` access: ${preview.preview?.topics ?? \"explicitly shared topics only\"}`);\n const accepted =\n args.includes(\"--yes\") || (await confirmEnrollment(\"Join this workspace?\"));\n if (!accepted) {\n console.log(\"enrollment cancelled\");\n return;\n }\n }\n join = await claimEnrollment(invite, nodeName);\n productionEnrollment = true;\n } catch (err) {\n console.error(`enrollment failed: ${err instanceof Error ? err.message : err}`);\n process.exitCode = 1;\n return;\n }\n }\n\n let path: string;\n try {\n const saveOptions = { replaceExisting: args.includes(\"--replace\") };\n path = productionEnrollment ? commitEnrollment(join, saveOptions) : saveJoin(join, saveOptions);\n } catch (err) {\n console.error(`could not save join credentials: ${err instanceof Error ? err.message : err}`);\n process.exitCode = 1;\n return;\n }\n console.log(`otium join credentials saved to ${path}`);\n console.log(` central: ${join.central}`);\n console.log(` cellId: ${join.cellId}`);\n\n // Self check: confirm the assignment exists and surface the node name.\n configureOtiumCentral(join);\n try {\n const self = await selfPeerNode();\n if (self) {\n console.log(\n `attached to workspace as \"${self.nodeName ?? self.cellId}\" (baseUrl ${self.baseUrl})`,\n );\n } else {\n console.warn(\n \"warning: central answered but this cell has no visible assignment yet — check the workspace assignment\",\n );\n }\n } catch (err) {\n console.warn(\n `warning: could not verify against central (${err instanceof Error ? err.message : err}) — credentials saved anyway`,\n );\n } finally {\n configureOtiumCentral(null);\n }\n console.log(\"\\nnext: `negotium-otium serve` (mounts the otium peer routes automatically)\");\n}\n"
6
+ ],
7
+ "mappings": "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",
8
+ "debugId": "F6245554D39E3BE564756E2164756E21",
9
+ "names": []
10
+ }
@@ -0,0 +1,21 @@
1
+ var __create = Object.create;
2
+ var __getProtoOf = Object.getPrototypeOf;
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __toESM = (mod, isNodeMode, target) => {
7
+ target = mod != null ? __create(__getProtoOf(mod)) : {};
8
+ const to = isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target;
9
+ for (let key of __getOwnPropNames(mod))
10
+ if (!__hasOwnProp.call(to, key))
11
+ __defProp(to, key, {
12
+ get: () => mod[key],
13
+ enumerable: true
14
+ });
15
+ return to;
16
+ };
17
+ var __require = import.meta.require;
18
+
19
+ export { __toESM, __require };
20
+
21
+ //# debugId=675EE70373FD34DF64756E2164756E21
@@ -0,0 +1,9 @@
1
+ {
2
+ "version": 3,
3
+ "sources": [],
4
+ "sourcesContent": [
5
+ ],
6
+ "mappings": "",
7
+ "debugId": "675EE70373FD34DF64756E2164756E21",
8
+ "names": []
9
+ }
@@ -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-ns3ke88n.js"),
66
+ import("./chunk-e5pbggsh.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-hpa0cpzh.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-exd0v74a.js");
98
+ const [{ startDefaultNode }, otium] = await Promise.all([
99
+ import("./chunk-p3cr2ejg.js"),
100
+ import("./chunk-q5bcpf23.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-rafc55bs.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-rafc55bs.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-rafc55bs.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
+ }