negotium 0.1.11 → 0.1.13

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 (165) hide show
  1. package/README.md +11 -2
  2. package/dist/canonical-mcp-bridge.js +2 -3
  3. package/dist/canonical-mcp-bridge.js.map +1 -1
  4. package/dist/{chunk-gz12qcf0.js → chunk-a9y2rwxf.js} +2 -2
  5. package/dist/{chunk-gz12qcf0.js.map → chunk-a9y2rwxf.js.map} +3 -3
  6. package/dist/{chunk-j0kjscb7.js → chunk-s2gez3wg.js} +20 -2
  7. package/dist/{chunk-j0kjscb7.js.map → chunk-s2gez3wg.js.map} +2 -2
  8. package/dist/cron.js +292 -256
  9. package/dist/cron.js.map +23 -22
  10. package/dist/hosted-agent.js +3012 -17
  11. package/dist/hosted-agent.js.map +30 -3
  12. package/dist/main.js +31323 -36
  13. package/dist/main.js.map +198 -3
  14. package/dist/prompts.js +12 -9
  15. package/dist/prompts.js.map +5 -5
  16. package/dist/registry.js +10 -6
  17. package/dist/registry.js.map +3 -3
  18. package/dist/rollout.js +1 -1
  19. package/dist/runtime/cron/store.ts +24 -1
  20. package/dist/runtime/src/application/submit-user-message.ts +3 -0
  21. package/dist/runtime/src/index.ts +7 -0
  22. package/dist/runtime/src/mcp/runtime-spec.ts +3 -0
  23. package/dist/runtime/src/mcp/session-comm/server.ts +1 -1
  24. package/dist/runtime/src/platform/config.ts +2 -2
  25. package/dist/runtime/src/platform/mcp-config.ts +13 -0
  26. package/dist/runtime/src/prompts/builders.ts +20 -6
  27. package/dist/runtime/src/query/active-rooms.ts +2 -0
  28. package/dist/runtime/src/runtime/delivery-ack.ts +112 -0
  29. package/dist/runtime/src/runtime/errors.ts +12 -12
  30. package/dist/runtime/src/runtime/turn-runner.ts +12 -0
  31. package/dist/runtime/src/storage/api-messages.ts +7 -5
  32. package/dist/runtime/src/storage/api-topics.ts +5 -2
  33. package/dist/runtime/src/storage/forum-db.ts +4 -1
  34. package/dist/runtime/src/storage/runtime-turn-requests.ts +1 -0
  35. package/dist/runtime/src/storage/session-asks.ts +13 -5
  36. package/dist/runtime/src/storage/storage-contract.ts +54 -0
  37. package/dist/runtime/src/storage/storage-host.ts +89 -36
  38. package/dist/runtime/src/storage/storage-public-host.ts +16 -0
  39. package/dist/runtime/src/storage/storage-public.ts +21 -5
  40. package/dist/runtime/src/storage/token-stats.ts +1 -1
  41. package/dist/runtime/src/types/api.ts +2 -0
  42. package/dist/runtime/src/types.ts +2 -0
  43. package/dist/runtime/src/version.ts +1 -1
  44. package/dist/runtime-helpers.js +29 -18
  45. package/dist/runtime-helpers.js.map +8 -7
  46. package/dist/storage.js +260 -202
  47. package/dist/storage.js.map +11 -9
  48. package/dist/types/packages/core/src/mcp/runtime-spec.d.ts +2 -0
  49. package/dist/types/packages/core/src/platform/mcp-config.d.ts +4 -0
  50. package/dist/types/packages/core/src/prompts/builders.d.ts +2 -0
  51. package/dist/types/packages/core/src/storage/api-messages.d.ts +6 -6
  52. package/dist/types/packages/core/src/storage/api-topics.d.ts +20 -2
  53. package/dist/types/packages/core/src/storage/forum-db.d.ts +2 -1
  54. package/dist/types/packages/core/src/storage/session-asks.d.ts +3 -2
  55. package/dist/types/packages/core/src/storage/storage-contract.d.ts +46 -0
  56. package/dist/types/packages/core/src/storage/storage-host.d.ts +12 -19
  57. package/dist/types/packages/core/src/storage/storage-public-host.d.ts +7 -0
  58. package/dist/types/packages/core/src/storage/storage-public.d.ts +4 -2
  59. package/dist/types/packages/core/src/types/api.d.ts +2 -0
  60. package/dist/types/packages/core/src/types.d.ts +2 -0
  61. package/dist/types/packages/core/src/version.d.ts +1 -1
  62. package/dist/types/packages/module-cron/src/store.d.ts +22 -2
  63. package/dist/vault.js +2 -2
  64. package/dist/vault.js.map +3 -3
  65. package/package.json +1 -1
  66. package/dist/chunk-01xcc856.js +0 -149
  67. package/dist/chunk-01xcc856.js.map +0 -10
  68. package/dist/chunk-1a6kv9vt.js +0 -118
  69. package/dist/chunk-1a6kv9vt.js.map +0 -10
  70. package/dist/chunk-1b62d730.js +0 -117
  71. package/dist/chunk-1b62d730.js.map +0 -10
  72. package/dist/chunk-1k7t7bnx.js +0 -97
  73. package/dist/chunk-1k7t7bnx.js.map +0 -10
  74. package/dist/chunk-28apmz4r.js +0 -431
  75. package/dist/chunk-28apmz4r.js.map +0 -11
  76. package/dist/chunk-2fvydfkx.js +0 -141
  77. package/dist/chunk-2fvydfkx.js.map +0 -10
  78. package/dist/chunk-41ygvg5k.js +0 -2387
  79. package/dist/chunk-41ygvg5k.js.map +0 -26
  80. package/dist/chunk-4q966ttx.js +0 -371
  81. package/dist/chunk-4q966ttx.js.map +0 -11
  82. package/dist/chunk-51rcsavw.js +0 -1712
  83. package/dist/chunk-51rcsavw.js.map +0 -18
  84. package/dist/chunk-59d0shyj.js +0 -103
  85. package/dist/chunk-59d0shyj.js.map +0 -10
  86. package/dist/chunk-5fzgvn79.js +0 -3536
  87. package/dist/chunk-5fzgvn79.js.map +0 -20
  88. package/dist/chunk-61px0717.js +0 -153
  89. package/dist/chunk-61px0717.js.map +0 -11
  90. package/dist/chunk-66y0hr8c.js +0 -2136
  91. package/dist/chunk-66y0hr8c.js.map +0 -29
  92. package/dist/chunk-69k45zg8.js +0 -250
  93. package/dist/chunk-69k45zg8.js.map +0 -11
  94. package/dist/chunk-6ah5farg.js +0 -130
  95. package/dist/chunk-6ah5farg.js.map +0 -10
  96. package/dist/chunk-6d4fmea5.js +0 -117
  97. package/dist/chunk-6d4fmea5.js.map +0 -12
  98. package/dist/chunk-8cahx7xc.js +0 -46
  99. package/dist/chunk-8cahx7xc.js.map +0 -10
  100. package/dist/chunk-8f20fk4n.js +0 -252
  101. package/dist/chunk-8f20fk4n.js.map +0 -10
  102. package/dist/chunk-91ckrvk8.js +0 -318
  103. package/dist/chunk-91ckrvk8.js.map +0 -10
  104. package/dist/chunk-93krf6ng.js +0 -3069
  105. package/dist/chunk-93krf6ng.js.map +0 -32
  106. package/dist/chunk-9qx1t77a.js +0 -214
  107. package/dist/chunk-9qx1t77a.js.map +0 -10
  108. package/dist/chunk-beqhdr9w.js +0 -589
  109. package/dist/chunk-beqhdr9w.js.map +0 -11
  110. package/dist/chunk-bftftsgq.js +0 -1637
  111. package/dist/chunk-bftftsgq.js.map +0 -15
  112. package/dist/chunk-c500xe9z.js +0 -33
  113. package/dist/chunk-c500xe9z.js.map +0 -10
  114. package/dist/chunk-cjsnkvq2.js +0 -23
  115. package/dist/chunk-cjsnkvq2.js.map +0 -10
  116. package/dist/chunk-cxa7yghg.js +0 -577
  117. package/dist/chunk-cxa7yghg.js.map +0 -14
  118. package/dist/chunk-edb07sjp.js +0 -567
  119. package/dist/chunk-edb07sjp.js.map +0 -14
  120. package/dist/chunk-f361dwba.js +0 -589
  121. package/dist/chunk-f361dwba.js.map +0 -11
  122. package/dist/chunk-f5xgprg1.js +0 -59
  123. package/dist/chunk-f5xgprg1.js.map +0 -10
  124. package/dist/chunk-ffefbd3r.js +0 -17
  125. package/dist/chunk-ffefbd3r.js.map +0 -10
  126. package/dist/chunk-fswhzdf5.js +0 -64
  127. package/dist/chunk-fswhzdf5.js.map +0 -10
  128. package/dist/chunk-g144wdrs.js +0 -2907
  129. package/dist/chunk-g144wdrs.js.map +0 -24
  130. package/dist/chunk-h980hb2n.js +0 -512
  131. package/dist/chunk-h980hb2n.js.map +0 -13
  132. package/dist/chunk-h9vbhhgr.js +0 -1337
  133. package/dist/chunk-h9vbhhgr.js.map +0 -16
  134. package/dist/chunk-hwy3n31w.js +0 -21
  135. package/dist/chunk-hwy3n31w.js.map +0 -9
  136. package/dist/chunk-jtrk0khr.js +0 -108
  137. package/dist/chunk-jtrk0khr.js.map +0 -10
  138. package/dist/chunk-jzz91jwh.js +0 -70
  139. package/dist/chunk-jzz91jwh.js.map +0 -10
  140. package/dist/chunk-m9e3tbr8.js +0 -708
  141. package/dist/chunk-m9e3tbr8.js.map +0 -14
  142. package/dist/chunk-mh5mexsf.js +0 -147
  143. package/dist/chunk-mh5mexsf.js.map +0 -11
  144. package/dist/chunk-npd8n03v.js +0 -2152
  145. package/dist/chunk-npd8n03v.js.map +0 -15
  146. package/dist/chunk-pg1azh6n.js +0 -2
  147. package/dist/chunk-pg1azh6n.js.map +0 -9
  148. package/dist/chunk-qwy57177.js +0 -237
  149. package/dist/chunk-qwy57177.js.map +0 -11
  150. package/dist/chunk-r31q21h5.js +0 -53
  151. package/dist/chunk-r31q21h5.js.map +0 -10
  152. package/dist/chunk-rbvctv1n.js +0 -366
  153. package/dist/chunk-rbvctv1n.js.map +0 -10
  154. package/dist/chunk-sa874j5c.js +0 -9
  155. package/dist/chunk-sa874j5c.js.map +0 -10
  156. package/dist/chunk-sctcs5zb.js +0 -281
  157. package/dist/chunk-sctcs5zb.js.map +0 -10
  158. package/dist/chunk-tsstrcfc.js +0 -122
  159. package/dist/chunk-tsstrcfc.js.map +0 -10
  160. package/dist/chunk-wk2qf31s.js +0 -58
  161. package/dist/chunk-wk2qf31s.js.map +0 -10
  162. package/dist/chunk-wx7ag4dd.js +0 -2936
  163. package/dist/chunk-wx7ag4dd.js.map +0 -20
  164. package/dist/chunk-znx1fpfd.js +0 -61
  165. package/dist/chunk-znx1fpfd.js.map +0 -10
@@ -1,149 +0,0 @@
1
- // @bun
2
- import"./chunk-93krf6ng.js";
3
- import"./chunk-fswhzdf5.js";
4
- import"./chunk-cxa7yghg.js";
5
- import"./chunk-59d0shyj.js";
6
- import"./chunk-rbvctv1n.js";
7
- import"./chunk-1k7t7bnx.js";
8
- import"./chunk-g144wdrs.js";
9
- import"./chunk-91ckrvk8.js";
10
- import"./chunk-66y0hr8c.js";
11
- import"./chunk-h9vbhhgr.js";
12
- import"./chunk-f361dwba.js";
13
- import"./chunk-8cahx7xc.js";
14
- import"./chunk-6d4fmea5.js";
15
- import"./chunk-61px0717.js";
16
- import"./chunk-tsstrcfc.js";
17
- import"./chunk-6ah5farg.js";
18
- import"./chunk-41ygvg5k.js";
19
- import"./chunk-m9e3tbr8.js";
20
- import"./chunk-mh5mexsf.js";
21
- import"./chunk-qwy57177.js";
22
- import"./chunk-j0kjscb7.js";
23
- import"./chunk-h980hb2n.js";
24
- import {
25
- logger
26
- } from "./chunk-ffefbd3r.js";
27
- import"./chunk-pg1azh6n.js";
28
- import"./chunk-1a6kv9vt.js";
29
- import"./chunk-f5xgprg1.js";
30
- import"./chunk-hwy3n31w.js";
31
-
32
- // ../../adapters/otium/src/central.ts
33
- var NODES_CACHE_MS = 30000;
34
- var VERIFY_CACHE_MS = 30000;
35
- var joinConfig = null;
36
- var nodesCache = null;
37
- var verifyCache = new Map;
38
- var tokenCache = new Map;
39
- function configureOtiumCentral(join) {
40
- joinConfig = join;
41
- resetPeerCentralCaches();
42
- }
43
- function otiumCentralConfig() {
44
- return joinConfig;
45
- }
46
- function centralFetch(path, init) {
47
- if (!joinConfig)
48
- throw new Error("otium: join credentials missing");
49
- return fetch(`${joinConfig.central}${path}`, {
50
- ...init,
51
- headers: {
52
- authorization: `Bearer ${joinConfig.secret}`,
53
- "content-type": "application/json",
54
- ...init.headers ?? {}
55
- },
56
- signal: AbortSignal.timeout(5000)
57
- });
58
- }
59
- async function listPeerNodes(opts = {}) {
60
- if (!opts.fresh && nodesCache && Date.now() - nodesCache.at < NODES_CACHE_MS) {
61
- return nodesCache.nodes;
62
- }
63
- const response = await centralFetch("/peer/nodes", { method: "GET" });
64
- const body = await response.json();
65
- if (!response.ok || !body.ok || !Array.isArray(body.nodes)) {
66
- throw new Error(`otium: node discovery failed: ${body.error ?? response.status}`);
67
- }
68
- nodesCache = { nodes: body.nodes, workspaceId: body.workspaceId ?? "", at: Date.now() };
69
- return body.nodes;
70
- }
71
- async function selfPeerNode() {
72
- const nodes = await listPeerNodes();
73
- return nodes.find((node) => node.self) ?? null;
74
- }
75
- async function resolvePeerNodeByCellId(cellId) {
76
- const find = (nodes) => nodes.find((node) => node.cellId === cellId) ?? null;
77
- const cached = find(await listPeerNodes());
78
- if (cached)
79
- return cached;
80
- return find(await listPeerNodes({ fresh: true }));
81
- }
82
- async function mintPeerToken(toCellId) {
83
- const cached = tokenCache.get(toCellId);
84
- if (cached && cached.expiresAtMs - Date.now() > 30000)
85
- return cached.token;
86
- const response = await centralFetch("/peer/token", {
87
- method: "POST",
88
- body: JSON.stringify({ toCellId })
89
- });
90
- const body = await response.json();
91
- if (!response.ok || !body.ok || !body.token) {
92
- throw new Error(`otium: peer token mint failed: ${body.error ?? response.status}`);
93
- }
94
- tokenCache.set(toCellId, {
95
- token: body.token,
96
- expiresAtMs: Date.parse(body.expiresAt ?? "") || Date.now() + 60000
97
- });
98
- return body.token;
99
- }
100
- async function verifyPeerToken(token) {
101
- const cached = verifyCache.get(token);
102
- if (cached && Date.now() - cached.at < VERIFY_CACHE_MS)
103
- return cached.verified;
104
- let response;
105
- try {
106
- response = await centralFetch("/peer/verify", {
107
- method: "POST",
108
- body: JSON.stringify({ token })
109
- });
110
- } catch (err) {
111
- logger.warn({ err }, "otium: central verify unreachable");
112
- return null;
113
- }
114
- const body = await response.json().catch(() => null);
115
- if (!response.ok || !body?.ok)
116
- return null;
117
- const verified = {
118
- workspaceId: body.workspaceId,
119
- fromCellId: body.fromCellId,
120
- fromNodeName: body.fromNodeName,
121
- fromIsPrimary: body.fromIsPrimary,
122
- expiresAt: body.expiresAt
123
- };
124
- verifyCache.set(token, { verified, at: Date.now() });
125
- for (const [key, entry] of verifyCache) {
126
- if (Date.now() - entry.at > VERIFY_CACHE_MS)
127
- verifyCache.delete(key);
128
- }
129
- return verified;
130
- }
131
- function resetPeerCentralCaches() {
132
- nodesCache = null;
133
- verifyCache.clear();
134
- tokenCache.clear();
135
- }
136
- export {
137
- verifyPeerToken,
138
- selfPeerNode,
139
- resolvePeerNodeByCellId,
140
- resetPeerCentralCaches,
141
- otiumCentralConfig,
142
- mintPeerToken,
143
- listPeerNodes,
144
- configureOtiumCentral
145
- };
146
-
147
- export { configureOtiumCentral, otiumCentralConfig, listPeerNodes, selfPeerNode, resolvePeerNodeByCellId, mintPeerToken, verifyPeerToken, resetPeerCentralCaches };
148
-
149
- //# debugId=FC91852260C865A864756E2164756E21
@@ -1,10 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../adapters/otium/src/central.ts"],
4
- "sourcesContent": [
5
- "/**\n * Central peer API client — token mint/verify and node discovery for this\n * cell. Port of otium's `apps/runtime-api/src/peer/central.ts` (identical\n * cache policy) with `hostedRuntimeConfig()` replaced by the adapter's join\n * credentials. The cell secret never leaves this process; peers only ever see\n * the short-lived `ptk_…` tokens central mints here.\n */\n\nimport { logger } from \"@negotium/core\";\nimport type { OtiumJoin } from \"@/join\";\n\nexport interface PeerNode {\n cellId: string;\n nodeName: string | null;\n isPrimary: boolean;\n baseUrl: string;\n self: boolean;\n}\n\nexport interface VerifiedPeer {\n workspaceId: string;\n fromCellId: string;\n fromNodeName: string | null;\n fromIsPrimary: boolean;\n expiresAt: string;\n}\n\nconst NODES_CACHE_MS = 30_000;\n/** Positive verify cache — deliberately short so assignment revocation bites\n * within seconds, not the token TTL. */\nconst VERIFY_CACHE_MS = 30_000;\n\nlet joinConfig: OtiumJoin | null = null;\nlet nodesCache: { nodes: PeerNode[]; workspaceId: string; at: number } | null = null;\nconst verifyCache = new Map<string, { verified: VerifiedPeer; at: number }>();\nconst tokenCache = new Map<string, { token: string; expiresAtMs: number }>();\n\n/** Install (or clear) the join credentials every central call authenticates with. */\nexport function configureOtiumCentral(join: OtiumJoin | null): void {\n joinConfig = join;\n resetPeerCentralCaches();\n}\n\nexport function otiumCentralConfig(): OtiumJoin | null {\n return joinConfig;\n}\n\nfunction centralFetch(path: string, init: RequestInit): Promise<Response> {\n if (!joinConfig) throw new Error(\"otium: join credentials missing\");\n return fetch(`${joinConfig.central}${path}`, {\n ...init,\n headers: {\n authorization: `Bearer ${joinConfig.secret}`,\n \"content-type\": \"application/json\",\n ...(init.headers ?? {}),\n },\n signal: AbortSignal.timeout(5000),\n });\n}\n\n/** Active nodes of this cell's workspace (30s cache; pass fresh=true after a\n * resolution miss so a just-attached node is visible). */\nexport async function listPeerNodes(opts: { fresh?: boolean } = {}): Promise<PeerNode[]> {\n if (!opts.fresh && nodesCache && Date.now() - nodesCache.at < NODES_CACHE_MS) {\n return nodesCache.nodes;\n }\n const response = await centralFetch(\"/peer/nodes\", { method: \"GET\" });\n const body = (await response.json()) as {\n ok: boolean;\n error?: string;\n workspaceId?: string;\n nodes?: PeerNode[];\n };\n if (!response.ok || !body.ok || !Array.isArray(body.nodes)) {\n throw new Error(`otium: node discovery failed: ${body.error ?? response.status}`);\n }\n nodesCache = { nodes: body.nodes, workspaceId: body.workspaceId ?? \"\", at: Date.now() };\n return body.nodes;\n}\n\nexport async function selfPeerNode(): Promise<PeerNode | null> {\n const nodes = await listPeerNodes();\n return nodes.find((node) => node.self) ?? null;\n}\n\nexport async function resolvePeerNodeByCellId(cellId: string): Promise<PeerNode | null> {\n const find = (nodes: PeerNode[]) => nodes.find((node) => node.cellId === cellId) ?? null;\n const cached = find(await listPeerNodes());\n if (cached) return cached;\n return find(await listPeerNodes({ fresh: true }));\n}\n\n/** Mint (or reuse a still-fresh) peer token for one target cell. Tokens are\n * reusable within their TTL, so cache until shortly before expiry. */\nexport async function mintPeerToken(toCellId: string): Promise<string> {\n const cached = tokenCache.get(toCellId);\n if (cached && cached.expiresAtMs - Date.now() > 30_000) return cached.token;\n const response = await centralFetch(\"/peer/token\", {\n method: \"POST\",\n body: JSON.stringify({ toCellId }),\n });\n const body = (await response.json()) as {\n ok: boolean;\n error?: string;\n token?: string;\n expiresAt?: string;\n };\n if (!response.ok || !body.ok || !body.token) {\n throw new Error(`otium: peer token mint failed: ${body.error ?? response.status}`);\n }\n tokenCache.set(toCellId, {\n token: body.token,\n expiresAtMs: Date.parse(body.expiresAt ?? \"\") || Date.now() + 60_000,\n });\n return body.token;\n}\n\n/** Verify an inbound peer token against central (fail-closed on outages). */\nexport async function verifyPeerToken(token: string): Promise<VerifiedPeer | null> {\n const cached = verifyCache.get(token);\n if (cached && Date.now() - cached.at < VERIFY_CACHE_MS) return cached.verified;\n let response: Response;\n try {\n response = await centralFetch(\"/peer/verify\", {\n method: \"POST\",\n body: JSON.stringify({ token }),\n });\n } catch (err) {\n logger.warn({ err }, \"otium: central verify unreachable\");\n return null;\n }\n const body = (await response.json().catch(() => null)) as (VerifiedPeer & { ok: boolean }) | null;\n if (!response.ok || !body?.ok) return null;\n const verified: VerifiedPeer = {\n workspaceId: body.workspaceId,\n fromCellId: body.fromCellId,\n fromNodeName: body.fromNodeName,\n fromIsPrimary: body.fromIsPrimary,\n expiresAt: body.expiresAt,\n };\n verifyCache.set(token, { verified, at: Date.now() });\n // Opportunistic sweep — the cache only ever holds a handful of live tokens.\n for (const [key, entry] of verifyCache) {\n if (Date.now() - entry.at > VERIFY_CACHE_MS) verifyCache.delete(key);\n }\n return verified;\n}\n\n/** Test hook — caches are module singletons. */\nexport function resetPeerCentralCaches(): void {\n nodesCache = null;\n verifyCache.clear();\n tokenCache.clear();\n}\n"
6
- ],
7
- "mappings": "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",
8
- "debugId": "FC91852260C865A864756E2164756E21",
9
- "names": []
10
- }
@@ -1,118 +0,0 @@
1
- import {
2
- Database
3
- } from "./chunk-f5xgprg1.js";
4
-
5
- // ../../packages/core/src/storage/storage-host.ts
6
- import { mkdirSync } from "fs";
7
- import { homedir } from "os";
8
- import { dirname, join, resolve } from "path";
9
- var configuredHost = {};
10
- var fallbackDatabase = null;
11
- var schemaInitializers = [];
12
- var initializedSchemas = new WeakMap;
13
- var initializingDatabases = new WeakSet;
14
- function envPath(name, fallback) {
15
- const value = process.env[name]?.trim();
16
- return resolve(value || fallback);
17
- }
18
- function defaultStateDir() {
19
- return envPath("NEGOTIUM_STATE_DIR", join(homedir(), ".negotium"));
20
- }
21
- function defaultDataDir() {
22
- return envPath("NEGOTIUM_DATA_DIR", join(defaultStateDir(), "data"));
23
- }
24
- function defaultLogDir() {
25
- return envPath("NEGOTIUM_LOG_DIR", join(defaultStateDir(), "logs"));
26
- }
27
- function defaultWorkspaceDir() {
28
- return envPath("NEGOTIUM_WORKSPACE_DIR", join(defaultStateDir(), "workspace"));
29
- }
30
- function defaultSessionAsksDir() {
31
- const runDir = envPath("NEGOTIUM_RUN_DIR", join(defaultStateDir(), "run"));
32
- return join(runDir, "session-asks");
33
- }
34
- function defaultSessionsDatabasePath() {
35
- return envPath("SESSIONS_DB_PATH", join(defaultDataDir(), "sessions.db"));
36
- }
37
- function initializeDatabase(database) {
38
- database.exec("PRAGMA journal_mode = WAL");
39
- database.exec("PRAGMA foreign_keys = ON");
40
- database.exec("PRAGMA busy_timeout = 5000");
41
- database.exec("PRAGMA wal_autocheckpoint = 1000");
42
- try {
43
- database.exec("PRAGMA wal_checkpoint(TRUNCATE)");
44
- } catch {}
45
- }
46
- function defaultDatabase() {
47
- if (fallbackDatabase)
48
- return fallbackDatabase;
49
- const path = defaultSessionsDatabasePath();
50
- mkdirSync(dirname(path), { recursive: true });
51
- fallbackDatabase = new Database(path, { create: true });
52
- initializeDatabase(fallbackDatabase);
53
- return fallbackDatabase;
54
- }
55
- function resolveStorageDatabase() {
56
- return configuredHost.database ?? defaultDatabase();
57
- }
58
- function resolveStorageDataDir() {
59
- return configuredHost.dataDir ?? defaultDataDir();
60
- }
61
- function resolveStorageLogDir() {
62
- return configuredHost.logDir ?? defaultLogDir();
63
- }
64
- function resolveStorageSessionAsksDir() {
65
- return configuredHost.sessionAsksDir ?? defaultSessionAsksDir();
66
- }
67
- function resolveStorageWorkspaceDir() {
68
- return configuredHost.workspaceDir ?? defaultWorkspaceDir();
69
- }
70
- function resolveStorageSharedWikiDir() {
71
- return join(resolveStorageWorkspaceDir(), "wiki");
72
- }
73
- function registerStorageSchemaInitializer(initialize, priority = 100) {
74
- schemaInitializers.push({ initialize, priority });
75
- schemaInitializers.sort((a, b) => a.priority - b.priority);
76
- }
77
- function ensureStorageSchemas(database = resolveStorageDatabase()) {
78
- if (initializingDatabases.has(database))
79
- return;
80
- let initialized = initializedSchemas.get(database);
81
- if (!initialized) {
82
- initialized = new Set;
83
- initializedSchemas.set(database, initialized);
84
- }
85
- initializingDatabases.add(database);
86
- try {
87
- for (const entry of schemaInitializers) {
88
- if (initialized.has(entry.initialize))
89
- continue;
90
- initialized.add(entry.initialize);
91
- try {
92
- entry.initialize(database);
93
- } catch (error) {
94
- initialized.delete(entry.initialize);
95
- throw error;
96
- }
97
- }
98
- } finally {
99
- initializingDatabases.delete(database);
100
- }
101
- }
102
- var storageDatabase = new Proxy({}, {
103
- get(_target, property) {
104
- const database = resolveStorageDatabase();
105
- ensureStorageSchemas(database);
106
- const value = Reflect.get(database, property, database);
107
- return typeof value === "function" ? value.bind(database) : value;
108
- },
109
- set(_target, property, value) {
110
- const database = resolveStorageDatabase();
111
- ensureStorageSchemas(database);
112
- return Reflect.set(database, property, value, database);
113
- }
114
- });
115
-
116
- export { resolveStorageDataDir, resolveStorageLogDir, resolveStorageSessionAsksDir, resolveStorageWorkspaceDir, resolveStorageSharedWikiDir, registerStorageSchemaInitializer, storageDatabase };
117
-
118
- //# debugId=83AECADE534BF13864756E2164756E21
@@ -1,10 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../packages/core/src/storage/storage-host.ts"],
4
- "sourcesContent": [
5
- "import { mkdirSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { dirname, join, resolve } from \"node:path\";\nimport { Database } from \"#storage/sqlite\";\n\nexport type StorageDatabase = InstanceType<typeof Database>;\n\nexport interface StorageHostOptions {\n /** Borrowed SQLite connection. Negotium never closes an injected database. */\n database?: StorageDatabase;\n /** Persistent JSON/JSONL state root. */\n dataDir?: string;\n /** Activity and token-usage log root. */\n logDir?: string;\n /** Durable ask edge root. Defaults to Negotium's runtime ask directory. */\n sessionAsksDir?: string;\n /** Shared topic workspace root used by wiki/archive helpers. */\n workspaceDir?: string;\n}\n\nlet configuredHost: Readonly<StorageHostOptions> = {};\nlet fallbackDatabase: StorageDatabase | null = null;\n\ntype StorageSchemaInitializer = (database: StorageDatabase) => void;\ninterface RegisteredSchemaInitializer {\n initialize: StorageSchemaInitializer;\n priority: number;\n}\n\nconst schemaInitializers: RegisteredSchemaInitializer[] = [];\nconst initializedSchemas = new WeakMap<StorageDatabase, Set<StorageSchemaInitializer>>();\nconst initializingDatabases = new WeakSet<StorageDatabase>();\n\nfunction envPath(name: string, fallback: string): string {\n const value = process.env[name]?.trim();\n return resolve(value || fallback);\n}\n\nfunction defaultStateDir(): string {\n return envPath(\"NEGOTIUM_STATE_DIR\", join(homedir(), \".negotium\"));\n}\n\nfunction defaultDataDir(): string {\n return envPath(\"NEGOTIUM_DATA_DIR\", join(defaultStateDir(), \"data\"));\n}\n\nfunction defaultLogDir(): string {\n return envPath(\"NEGOTIUM_LOG_DIR\", join(defaultStateDir(), \"logs\"));\n}\n\nfunction defaultWorkspaceDir(): string {\n return envPath(\"NEGOTIUM_WORKSPACE_DIR\", join(defaultStateDir(), \"workspace\"));\n}\n\nfunction defaultSessionAsksDir(): string {\n const runDir = envPath(\"NEGOTIUM_RUN_DIR\", join(defaultStateDir(), \"run\"));\n return join(runDir, \"session-asks\");\n}\n\nfunction defaultSessionsDatabasePath(): string {\n return envPath(\"SESSIONS_DB_PATH\", join(defaultDataDir(), \"sessions.db\"));\n}\n\nfunction initializeDatabase(database: StorageDatabase): void {\n database.exec(\"PRAGMA journal_mode = WAL\");\n database.exec(\"PRAGMA foreign_keys = ON\");\n database.exec(\"PRAGMA busy_timeout = 5000\");\n database.exec(\"PRAGMA wal_autocheckpoint = 1000\");\n try {\n database.exec(\"PRAGMA wal_checkpoint(TRUNCATE)\");\n } catch {\n // Non-fatal; a concurrent writer may hold the WAL briefly.\n }\n}\n\nfunction defaultDatabase(): StorageDatabase {\n if (fallbackDatabase) return fallbackDatabase;\n const path = defaultSessionsDatabasePath();\n mkdirSync(dirname(path), { recursive: true });\n fallbackDatabase = new Database(path, { create: true });\n initializeDatabase(fallbackDatabase);\n return fallbackDatabase;\n}\n\nexport function resolveStorageDatabase(): StorageDatabase {\n return configuredHost.database ?? defaultDatabase();\n}\n\nexport function resolveStorageDataDir(): string {\n return configuredHost.dataDir ?? defaultDataDir();\n}\n\nexport function resolveStorageLogDir(): string {\n return configuredHost.logDir ?? defaultLogDir();\n}\n\nexport function resolveStorageSessionAsksDir(): string {\n return configuredHost.sessionAsksDir ?? defaultSessionAsksDir();\n}\n\nexport function resolveStorageWorkspaceDir(): string {\n return configuredHost.workspaceDir ?? defaultWorkspaceDir();\n}\n\nexport function resolveStorageSharedWikiDir(): string {\n return join(resolveStorageWorkspaceDir(), \"wiki\");\n}\n\nexport function resolveStorageUsersLogDir(): string {\n return join(resolveStorageDataDir(), \"users\");\n}\n\n/**\n * Configure the process-local storage boundary for an embedding host.\n *\n * Resolution is lazy: importing `negotium/storage` never opens a database or\n * touches a filesystem path. The returned disposer restores the exact prior\n * host, which keeps tests and nested embeddings isolated.\n */\nexport function configureStorageHost(options: StorageHostOptions): () => void {\n const previous = configuredHost;\n configuredHost = Object.freeze({ ...previous, ...options });\n let restored = false;\n return () => {\n if (restored) return;\n restored = true;\n configuredHost = previous;\n };\n}\n\n/** Close only Negotium's fallback connection. Injected connections are borrowed. */\nexport function closeStorageDatabase(): void {\n if (configuredHost.database || !fallbackDatabase) return;\n fallbackDatabase.close();\n fallbackDatabase = null;\n}\n\nexport function registerStorageSchemaInitializer(\n initialize: StorageSchemaInitializer,\n priority = 100,\n): void {\n schemaInitializers.push({ initialize, priority });\n schemaInitializers.sort((a, b) => a.priority - b.priority);\n}\n\nexport function ensureStorageSchemas(database = resolveStorageDatabase()): void {\n if (initializingDatabases.has(database)) return;\n let initialized = initializedSchemas.get(database);\n if (!initialized) {\n initialized = new Set();\n initializedSchemas.set(database, initialized);\n }\n initializingDatabases.add(database);\n try {\n for (const entry of schemaInitializers) {\n if (initialized.has(entry.initialize)) continue;\n // Mark first so a migration that calls through the public db proxy does\n // not recursively invoke itself. Remove on failure so the next call can retry.\n initialized.add(entry.initialize);\n try {\n entry.initialize(database);\n } catch (error) {\n initialized.delete(entry.initialize);\n throw error;\n }\n }\n } finally {\n initializingDatabases.delete(database);\n }\n}\n\n/** Stable proxy identity used by legacy imports and embedding hosts. */\nexport const storageDatabase = new Proxy({} as StorageDatabase, {\n get(_target, property) {\n const database = resolveStorageDatabase();\n ensureStorageSchemas(database);\n const value = Reflect.get(database as object, property, database);\n return typeof value === \"function\" ? value.bind(database) : value;\n },\n set(_target, property, value) {\n const database = resolveStorageDatabase();\n ensureStorageSchemas(database);\n return Reflect.set(database as object, property, value, database);\n },\n});\n"
6
- ],
7
- "mappings": "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",
8
- "debugId": "83AECADE534BF13864756E2164756E21",
9
- "names": []
10
- }
@@ -1,117 +0,0 @@
1
- // @bun
2
- import"./chunk-93krf6ng.js";
3
- import"./chunk-fswhzdf5.js";
4
- import"./chunk-cxa7yghg.js";
5
- import"./chunk-59d0shyj.js";
6
- import"./chunk-rbvctv1n.js";
7
- import"./chunk-1k7t7bnx.js";
8
- import"./chunk-g144wdrs.js";
9
- import"./chunk-91ckrvk8.js";
10
- import"./chunk-66y0hr8c.js";
11
- import"./chunk-h9vbhhgr.js";
12
- import"./chunk-f361dwba.js";
13
- import"./chunk-8cahx7xc.js";
14
- import"./chunk-6d4fmea5.js";
15
- import"./chunk-61px0717.js";
16
- import"./chunk-tsstrcfc.js";
17
- import"./chunk-6ah5farg.js";
18
- import {
19
- VAULT_DESCRIPTION_MAX_LENGTH,
20
- VAULT_VALUE_MAX_BYTES,
21
- VAULT_VALUE_MIN_BYTES,
22
- normalizeVaultKey,
23
- validateVaultKey,
24
- vaultDel,
25
- vaultListWithValues,
26
- vaultSet
27
- } from "./chunk-41ygvg5k.js";
28
- import"./chunk-m9e3tbr8.js";
29
- import"./chunk-mh5mexsf.js";
30
- import"./chunk-qwy57177.js";
31
- import"./chunk-j0kjscb7.js";
32
- import"./chunk-h980hb2n.js";
33
- import"./chunk-ffefbd3r.js";
34
- import"./chunk-pg1azh6n.js";
35
- import"./chunk-1a6kv9vt.js";
36
- import"./chunk-f5xgprg1.js";
37
- import"./chunk-hwy3n31w.js";
38
-
39
- // ../cli/src/commands/vault.ts
40
- var DEFAULT_USER = "local";
41
- function vaultCommand(args) {
42
- const [sub, key, value, ...descParts] = args;
43
- switch (sub) {
44
- case undefined:
45
- case "list": {
46
- const entries = vaultListWithValues(DEFAULT_USER);
47
- if (entries.length === 0) {
48
- console.log("vault is empty \u2014 `negotium vault set MY_KEY <value> [description]`");
49
- return;
50
- }
51
- for (const entry of entries) {
52
- console.log(`${entry.key} ${entry.description || ""}`.trimEnd());
53
- }
54
- return;
55
- }
56
- case "set": {
57
- if (!key || !value) {
58
- console.error("usage: negotium vault set <KEY> <value> [description]");
59
- process.exitCode = 1;
60
- return;
61
- }
62
- const normalized = normalizeVaultKey(key);
63
- if (!validateVaultKey(normalized)) {
64
- console.error("invalid key \u2014 use A-Z, 0-9, _ (must start with a letter, max 128 chars)");
65
- process.exitCode = 1;
66
- return;
67
- }
68
- const valueBytes = Buffer.byteLength(value, "utf8");
69
- if (valueBytes < VAULT_VALUE_MIN_BYTES || valueBytes > VAULT_VALUE_MAX_BYTES) {
70
- console.error(`value must be between ${VAULT_VALUE_MIN_BYTES} and ${VAULT_VALUE_MAX_BYTES} bytes`);
71
- process.exitCode = 1;
72
- return;
73
- }
74
- const description = descParts.join(" ");
75
- if (description.length > VAULT_DESCRIPTION_MAX_LENGTH) {
76
- console.error(`description must be at most ${VAULT_DESCRIPTION_MAX_LENGTH} characters`);
77
- process.exitCode = 1;
78
- return;
79
- }
80
- vaultSet(DEFAULT_USER, normalized, value, description);
81
- console.log(`stored ${normalized}`);
82
- return;
83
- }
84
- case "get": {
85
- if (!key) {
86
- console.error("usage: negotium vault get <KEY>");
87
- process.exitCode = 1;
88
- return;
89
- }
90
- const entry = vaultListWithValues(DEFAULT_USER).find((e) => e.key === normalizeVaultKey(key));
91
- if (!entry) {
92
- console.error(`no such key "${key}"`);
93
- process.exitCode = 1;
94
- return;
95
- }
96
- console.log(entry.value);
97
- return;
98
- }
99
- case "del": {
100
- if (!key) {
101
- console.error("usage: negotium vault del <KEY>");
102
- process.exitCode = 1;
103
- return;
104
- }
105
- console.log(vaultDel(DEFAULT_USER, normalizeVaultKey(key)) ? `deleted ${key}` : `no such key "${key}"`);
106
- return;
107
- }
108
- default:
109
- console.error(`unknown subcommand "${sub}" \u2014 use list|set|get|del`);
110
- process.exitCode = 1;
111
- }
112
- }
113
- export {
114
- vaultCommand
115
- };
116
-
117
- //# debugId=EE1D095AA690E88864756E2164756E21
@@ -1,10 +0,0 @@
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": "EE1D095AA690E88864756E2164756E21",
9
- "names": []
10
- }
@@ -1,97 +0,0 @@
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
@@ -1,10 +0,0 @@
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
- }