negotium 0.1.12 → 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.
- package/dist/canonical-mcp-bridge.js +2 -3
- package/dist/canonical-mcp-bridge.js.map +1 -1
- package/dist/chunk-a9y2rwxf.js.map +1 -1
- package/dist/{chunk-j0kjscb7.js → chunk-s2gez3wg.js} +20 -2
- package/dist/{chunk-j0kjscb7.js.map → chunk-s2gez3wg.js.map} +2 -2
- package/dist/cron.js +49 -25
- package/dist/cron.js.map +15 -14
- package/dist/hosted-agent.js +3012 -17
- package/dist/hosted-agent.js.map +30 -3
- package/dist/main.js +31323 -36
- package/dist/main.js.map +198 -3
- package/dist/prompts.js +11 -8
- package/dist/prompts.js.map +4 -4
- package/dist/runtime/src/application/submit-user-message.ts +3 -0
- package/dist/runtime/src/index.ts +7 -0
- package/dist/runtime/src/mcp/runtime-spec.ts +3 -0
- package/dist/runtime/src/mcp/session-comm/server.ts +1 -1
- package/dist/runtime/src/platform/mcp-config.ts +13 -0
- package/dist/runtime/src/prompts/builders.ts +20 -6
- package/dist/runtime/src/query/active-rooms.ts +2 -0
- package/dist/runtime/src/runtime/delivery-ack.ts +112 -0
- package/dist/runtime/src/runtime/errors.ts +12 -12
- package/dist/runtime/src/runtime/turn-runner.ts +12 -0
- package/dist/runtime/src/storage/runtime-turn-requests.ts +1 -0
- package/dist/runtime/src/types/api.ts +2 -0
- package/dist/runtime/src/types.ts +2 -0
- package/dist/runtime/src/version.ts +1 -1
- package/dist/runtime-helpers.js.map +1 -1
- package/dist/storage.js.map +1 -1
- package/dist/types/packages/core/src/mcp/runtime-spec.d.ts +2 -0
- package/dist/types/packages/core/src/platform/mcp-config.d.ts +4 -0
- package/dist/types/packages/core/src/prompts/builders.d.ts +2 -0
- package/dist/types/packages/core/src/types/api.d.ts +2 -0
- package/dist/types/packages/core/src/types.d.ts +2 -0
- package/dist/types/packages/core/src/version.d.ts +1 -1
- package/dist/vault.js.map +1 -1
- package/package.json +1 -1
- package/dist/chunk-00q25k7p.js +0 -2387
- package/dist/chunk-00q25k7p.js.map +0 -26
- package/dist/chunk-03kv7mvj.js +0 -2152
- package/dist/chunk-03kv7mvj.js.map +0 -15
- package/dist/chunk-05pm51dh.js +0 -589
- package/dist/chunk-05pm51dh.js.map +0 -11
- package/dist/chunk-0eh16bk1.js +0 -2936
- package/dist/chunk-0eh16bk1.js.map +0 -20
- package/dist/chunk-0yfqyv88.js +0 -108
- package/dist/chunk-0yfqyv88.js.map +0 -10
- package/dist/chunk-1k7t7bnx.js +0 -97
- package/dist/chunk-1k7t7bnx.js.map +0 -10
- package/dist/chunk-3gkfr9vb.js +0 -431
- package/dist/chunk-3gkfr9vb.js.map +0 -11
- package/dist/chunk-5akd1gbj.js +0 -281
- package/dist/chunk-5akd1gbj.js.map +0 -10
- package/dist/chunk-7k19pcg8.js +0 -577
- package/dist/chunk-7k19pcg8.js.map +0 -14
- package/dist/chunk-81tbfbmt.js +0 -10
- package/dist/chunk-81tbfbmt.js.map +0 -10
- package/dist/chunk-82qhv1mq.js +0 -512
- package/dist/chunk-82qhv1mq.js.map +0 -13
- package/dist/chunk-8dy7e2a9.js +0 -103
- package/dist/chunk-8dy7e2a9.js.map +0 -10
- package/dist/chunk-8f2sqmrj.js +0 -1712
- package/dist/chunk-8f2sqmrj.js.map +0 -18
- package/dist/chunk-9hjeemfz.js +0 -372
- package/dist/chunk-9hjeemfz.js.map +0 -10
- package/dist/chunk-a4aa2ccv.js +0 -141
- package/dist/chunk-a4aa2ccv.js.map +0 -10
- package/dist/chunk-bsg215q3.js +0 -3536
- package/dist/chunk-bsg215q3.js.map +0 -20
- package/dist/chunk-bxnfsc7w.js +0 -58
- package/dist/chunk-bxnfsc7w.js.map +0 -10
- package/dist/chunk-c500xe9z.js +0 -33
- package/dist/chunk-c500xe9z.js.map +0 -10
- package/dist/chunk-cngrf7ab.js +0 -149
- package/dist/chunk-cngrf7ab.js.map +0 -10
- package/dist/chunk-d7tprf06.js +0 -53
- package/dist/chunk-d7tprf06.js.map +0 -10
- package/dist/chunk-ddnrmkrv.js +0 -61
- package/dist/chunk-ddnrmkrv.js.map +0 -10
- package/dist/chunk-edb07sjp.js +0 -567
- package/dist/chunk-edb07sjp.js.map +0 -14
- package/dist/chunk-ejcm6zx8.js +0 -591
- package/dist/chunk-ejcm6zx8.js.map +0 -11
- package/dist/chunk-ezs352qs.js +0 -237
- package/dist/chunk-ezs352qs.js.map +0 -11
- package/dist/chunk-f5xgprg1.js +0 -59
- package/dist/chunk-f5xgprg1.js.map +0 -10
- package/dist/chunk-fbtb3v0s.js +0 -1339
- package/dist/chunk-fbtb3v0s.js.map +0 -16
- package/dist/chunk-ffefbd3r.js +0 -17
- package/dist/chunk-ffefbd3r.js.map +0 -10
- package/dist/chunk-gaknyw04.js +0 -708
- package/dist/chunk-gaknyw04.js.map +0 -14
- package/dist/chunk-gxmny6tq.js +0 -1637
- package/dist/chunk-gxmny6tq.js.map +0 -15
- package/dist/chunk-h7bj5zwb.js +0 -3069
- package/dist/chunk-h7bj5zwb.js.map +0 -32
- package/dist/chunk-hp4g7wx7.js +0 -46
- package/dist/chunk-hp4g7wx7.js.map +0 -10
- package/dist/chunk-hwy3n31w.js +0 -21
- package/dist/chunk-hwy3n31w.js.map +0 -9
- package/dist/chunk-jzz91jwh.js +0 -70
- package/dist/chunk-jzz91jwh.js.map +0 -10
- package/dist/chunk-k778y16p.js +0 -153
- package/dist/chunk-k778y16p.js.map +0 -11
- package/dist/chunk-mh5mexsf.js +0 -147
- package/dist/chunk-mh5mexsf.js.map +0 -11
- package/dist/chunk-mnwaext5.js +0 -318
- package/dist/chunk-mnwaext5.js.map +0 -10
- package/dist/chunk-nkgs40ch.js +0 -23
- package/dist/chunk-nkgs40ch.js.map +0 -10
- package/dist/chunk-pz57vwsm.js +0 -250
- package/dist/chunk-pz57vwsm.js.map +0 -11
- package/dist/chunk-r6kdp7gn.js +0 -252
- package/dist/chunk-r6kdp7gn.js.map +0 -10
- package/dist/chunk-rkvrkcgx.js +0 -117
- package/dist/chunk-rkvrkcgx.js.map +0 -10
- package/dist/chunk-s74rdyqe.js +0 -117
- package/dist/chunk-s74rdyqe.js.map +0 -12
- package/dist/chunk-sa874j5c.js +0 -9
- package/dist/chunk-sa874j5c.js.map +0 -10
- package/dist/chunk-sffqdkvq.js +0 -122
- package/dist/chunk-sffqdkvq.js.map +0 -10
- package/dist/chunk-tcs9qjps.js +0 -64
- package/dist/chunk-tcs9qjps.js.map +0 -10
- package/dist/chunk-wx83ep8e.js +0 -131
- package/dist/chunk-wx83ep8e.js.map +0 -10
- package/dist/chunk-xag86ng3.js +0 -122
- package/dist/chunk-xag86ng3.js.map +0 -10
- package/dist/chunk-xfdkep71.js +0 -371
- package/dist/chunk-xfdkep71.js.map +0 -11
- package/dist/chunk-xhm1rfpt.js +0 -2907
- package/dist/chunk-xhm1rfpt.js.map +0 -24
- package/dist/chunk-xpcps28p.js +0 -2138
- package/dist/chunk-xpcps28p.js.map +0 -29
- package/dist/chunk-yb4rbev9.js +0 -214
- package/dist/chunk-yb4rbev9.js.map +0 -10
package/dist/chunk-9hjeemfz.js
DELETED
|
@@ -1,372 +0,0 @@
|
|
|
1
|
-
// @bun
|
|
2
|
-
import {
|
|
3
|
-
resolveStorageSessionAsksDir
|
|
4
|
-
} from "./chunk-sffqdkvq.js";
|
|
5
|
-
import"./chunk-f5xgprg1.js";
|
|
6
|
-
import"./chunk-hwy3n31w.js";
|
|
7
|
-
|
|
8
|
-
// ../../packages/core/src/storage/session-asks.ts
|
|
9
|
-
import { createHash } from "crypto";
|
|
10
|
-
import {
|
|
11
|
-
closeSync,
|
|
12
|
-
mkdirSync,
|
|
13
|
-
openSync,
|
|
14
|
-
readdirSync,
|
|
15
|
-
readFileSync,
|
|
16
|
-
statSync,
|
|
17
|
-
unlinkSync,
|
|
18
|
-
writeFileSync
|
|
19
|
-
} from "fs";
|
|
20
|
-
import { dirname, join } from "path";
|
|
21
|
-
var PENDING_ASK_TTL_MS = 15 * 60 * 1000;
|
|
22
|
-
function pendingAskDir(userId) {
|
|
23
|
-
const rawUserId = String(userId);
|
|
24
|
-
const safeUserId = /^[A-Za-z0-9][A-Za-z0-9_.@-]{0,255}$/.test(rawUserId) && !rawUserId.includes("..") ? rawUserId : `sha256-${createHash("sha256").update(rawUserId).digest("hex")}`;
|
|
25
|
-
return join(resolveStorageSessionAsksDir(), safeUserId);
|
|
26
|
-
}
|
|
27
|
-
var ASK_FILENAME_PREFIX = "v3-";
|
|
28
|
-
var V2_ASK_FILENAME_PREFIX = "v2-";
|
|
29
|
-
function encodeAskKey(key) {
|
|
30
|
-
return JSON.stringify([key.from, key.to]);
|
|
31
|
-
}
|
|
32
|
-
function pendingAskPath(key) {
|
|
33
|
-
const digest = createHash("sha256").update(encodeAskKey(key)).digest("hex");
|
|
34
|
-
return join(pendingAskDir(key.userId), `${ASK_FILENAME_PREFIX}${digest}.pending`);
|
|
35
|
-
}
|
|
36
|
-
function v2PendingAskPath(key) {
|
|
37
|
-
const encoded = Buffer.from(encodeAskKey(key), "utf8").toString("base64url");
|
|
38
|
-
return join(pendingAskDir(key.userId), `${V2_ASK_FILENAME_PREFIX}${encoded}.pending`);
|
|
39
|
-
}
|
|
40
|
-
function legacyPendingAskPath(key) {
|
|
41
|
-
if (key.from.includes("/") || key.from.includes("\\") || key.to.includes("/") || key.to.includes("\\") || key.from.includes("\x00") || key.to.includes("\x00")) {
|
|
42
|
-
return null;
|
|
43
|
-
}
|
|
44
|
-
const dir = pendingAskDir(key.userId);
|
|
45
|
-
const candidate = join(dir, `${key.from}___${key.to}.pending`);
|
|
46
|
-
return dirname(candidate) === dir ? candidate : null;
|
|
47
|
-
}
|
|
48
|
-
function parsePendingAskFilename(fileName) {
|
|
49
|
-
if (!fileName.endsWith(".pending"))
|
|
50
|
-
return null;
|
|
51
|
-
const raw = fileName.slice(0, -".pending".length);
|
|
52
|
-
if (raw.startsWith(V2_ASK_FILENAME_PREFIX)) {
|
|
53
|
-
try {
|
|
54
|
-
const decoded = JSON.parse(Buffer.from(raw.slice(V2_ASK_FILENAME_PREFIX.length), "base64url").toString("utf8"));
|
|
55
|
-
if (Array.isArray(decoded) && decoded.length === 2 && decoded.every((part) => typeof part === "string")) {
|
|
56
|
-
return { from: decoded[0], to: decoded[1] };
|
|
57
|
-
}
|
|
58
|
-
} catch {}
|
|
59
|
-
}
|
|
60
|
-
const sep = raw.indexOf("___");
|
|
61
|
-
if (sep < 0)
|
|
62
|
-
return null;
|
|
63
|
-
return { from: raw.slice(0, sep), to: raw.slice(sep + 3) };
|
|
64
|
-
}
|
|
65
|
-
function readPendingAskFile(path, fallback) {
|
|
66
|
-
try {
|
|
67
|
-
const raw = readFileSync(path, "utf8").trim();
|
|
68
|
-
if (!raw)
|
|
69
|
-
return null;
|
|
70
|
-
if (!raw.startsWith("{")) {
|
|
71
|
-
const ts = new Date(statSync(path).mtimeMs).toISOString();
|
|
72
|
-
return {
|
|
73
|
-
userId: fallback.userId,
|
|
74
|
-
from: fallback.from,
|
|
75
|
-
to: fallback.to,
|
|
76
|
-
requestId: raw,
|
|
77
|
-
state: "requested",
|
|
78
|
-
createdAt: ts,
|
|
79
|
-
updatedAt: ts
|
|
80
|
-
};
|
|
81
|
-
}
|
|
82
|
-
const parsed = JSON.parse(raw);
|
|
83
|
-
if (!parsed.requestId || !parsed.from || !parsed.to)
|
|
84
|
-
return null;
|
|
85
|
-
if (parsed.userId !== undefined && String(parsed.userId) !== String(fallback.userId))
|
|
86
|
-
return null;
|
|
87
|
-
if (fallback.from && parsed.from !== fallback.from)
|
|
88
|
-
return null;
|
|
89
|
-
if (fallback.to && parsed.to !== fallback.to)
|
|
90
|
-
return null;
|
|
91
|
-
const now = new Date().toISOString();
|
|
92
|
-
return {
|
|
93
|
-
userId: fallback.userId,
|
|
94
|
-
from: parsed.from,
|
|
95
|
-
to: parsed.to,
|
|
96
|
-
requestId: parsed.requestId,
|
|
97
|
-
contextId: parsed.contextId,
|
|
98
|
-
state: parsed.state ?? "requested",
|
|
99
|
-
createdAt: parsed.createdAt ?? now,
|
|
100
|
-
updatedAt: parsed.updatedAt ?? parsed.createdAt ?? now
|
|
101
|
-
};
|
|
102
|
-
} catch {
|
|
103
|
-
return null;
|
|
104
|
-
}
|
|
105
|
-
}
|
|
106
|
-
function isStale(record, path) {
|
|
107
|
-
const ts = record ? Date.parse(record.updatedAt || record.createdAt) : Number.NaN;
|
|
108
|
-
if (Number.isFinite(ts))
|
|
109
|
-
return Date.now() - ts > PENDING_ASK_TTL_MS;
|
|
110
|
-
try {
|
|
111
|
-
return Date.now() - statSync(path).mtimeMs > PENDING_ASK_TTL_MS;
|
|
112
|
-
} catch {
|
|
113
|
-
return false;
|
|
114
|
-
}
|
|
115
|
-
}
|
|
116
|
-
function writePendingAsk(record) {
|
|
117
|
-
const path = pendingAskPath(record);
|
|
118
|
-
mkdirSync(pendingAskDir(record.userId), { recursive: true });
|
|
119
|
-
writeFileSync(path, `${JSON.stringify(record)}
|
|
120
|
-
`);
|
|
121
|
-
}
|
|
122
|
-
function writePendingAskIfAbsent(record) {
|
|
123
|
-
const path = pendingAskPath(record);
|
|
124
|
-
mkdirSync(pendingAskDir(record.userId), { recursive: true });
|
|
125
|
-
let fd = null;
|
|
126
|
-
try {
|
|
127
|
-
fd = openSync(path, "wx");
|
|
128
|
-
writeFileSync(fd, `${JSON.stringify(record)}
|
|
129
|
-
`);
|
|
130
|
-
return true;
|
|
131
|
-
} catch (error) {
|
|
132
|
-
if (error.code === "EEXIST")
|
|
133
|
-
return false;
|
|
134
|
-
throw error;
|
|
135
|
-
} finally {
|
|
136
|
-
if (fd !== null)
|
|
137
|
-
closeSync(fd);
|
|
138
|
-
}
|
|
139
|
-
}
|
|
140
|
-
function readPendingAsk(key) {
|
|
141
|
-
const canonicalPath = pendingAskPath(key);
|
|
142
|
-
const canonical = readPendingAskFile(canonicalPath, key);
|
|
143
|
-
if (canonical && canonical.from === key.from && canonical.to === key.to) {
|
|
144
|
-
return { path: canonicalPath, record: canonical };
|
|
145
|
-
}
|
|
146
|
-
for (const compatibilityPath of [v2PendingAskPath(key), legacyPendingAskPath(key)]) {
|
|
147
|
-
if (!compatibilityPath)
|
|
148
|
-
continue;
|
|
149
|
-
const legacy = readPendingAskFile(compatibilityPath, key);
|
|
150
|
-
if (!legacy || legacy.from !== key.from || legacy.to !== key.to)
|
|
151
|
-
continue;
|
|
152
|
-
const migrated = writePendingAskIfAbsent(legacy);
|
|
153
|
-
const next = migrated ? legacy : readPendingAskFile(canonicalPath, key);
|
|
154
|
-
if (next && next.from === key.from && next.to === key.to) {
|
|
155
|
-
try {
|
|
156
|
-
unlinkSync(compatibilityPath);
|
|
157
|
-
} catch {}
|
|
158
|
-
return { path: canonicalPath, record: next };
|
|
159
|
-
}
|
|
160
|
-
return { path: compatibilityPath, record: legacy };
|
|
161
|
-
}
|
|
162
|
-
return null;
|
|
163
|
-
}
|
|
164
|
-
function createPendingAsk(args) {
|
|
165
|
-
const migrated = readPendingAsk(args);
|
|
166
|
-
if (migrated && !isStale(migrated.record, migrated.path)) {
|
|
167
|
-
return { ok: false, existing: migrated.record, stale: false };
|
|
168
|
-
}
|
|
169
|
-
if (migrated) {
|
|
170
|
-
try {
|
|
171
|
-
unlinkSync(migrated.path);
|
|
172
|
-
} catch {
|
|
173
|
-
return { ok: false, existing: migrated.record, stale: true };
|
|
174
|
-
}
|
|
175
|
-
}
|
|
176
|
-
const path = pendingAskPath(args);
|
|
177
|
-
const now = new Date().toISOString();
|
|
178
|
-
const record = {
|
|
179
|
-
userId: args.userId,
|
|
180
|
-
from: args.from,
|
|
181
|
-
to: args.to,
|
|
182
|
-
requestId: args.requestId,
|
|
183
|
-
contextId: args.contextId,
|
|
184
|
-
state: "requested",
|
|
185
|
-
createdAt: now,
|
|
186
|
-
updatedAt: now
|
|
187
|
-
};
|
|
188
|
-
mkdirSync(pendingAskDir(args.userId), { recursive: true });
|
|
189
|
-
for (let attempt = 0;attempt < 2; attempt++) {
|
|
190
|
-
let fd = null;
|
|
191
|
-
try {
|
|
192
|
-
fd = openSync(path, "wx");
|
|
193
|
-
writeFileSync(fd, `${JSON.stringify(record)}
|
|
194
|
-
`);
|
|
195
|
-
return { ok: true, record };
|
|
196
|
-
} catch (err) {
|
|
197
|
-
if (err.code !== "EEXIST")
|
|
198
|
-
throw err;
|
|
199
|
-
const existing = readPendingAskFile(path, args);
|
|
200
|
-
if (!isStale(existing, path))
|
|
201
|
-
return { ok: false, existing, stale: false };
|
|
202
|
-
try {
|
|
203
|
-
unlinkSync(path);
|
|
204
|
-
} catch {
|
|
205
|
-
return { ok: false, existing, stale: true };
|
|
206
|
-
}
|
|
207
|
-
} finally {
|
|
208
|
-
if (fd !== null)
|
|
209
|
-
closeSync(fd);
|
|
210
|
-
}
|
|
211
|
-
}
|
|
212
|
-
return { ok: false, existing: readPendingAskFile(path, args), stale: true };
|
|
213
|
-
}
|
|
214
|
-
function markPendingAskState(args) {
|
|
215
|
-
const pending = readPendingAsk(args);
|
|
216
|
-
if (!pending)
|
|
217
|
-
return null;
|
|
218
|
-
const record = pending.record;
|
|
219
|
-
if (args.requestId && record.requestId !== args.requestId)
|
|
220
|
-
return record;
|
|
221
|
-
const next = {
|
|
222
|
-
...record,
|
|
223
|
-
state: args.state,
|
|
224
|
-
updatedAt: new Date().toISOString()
|
|
225
|
-
};
|
|
226
|
-
writePendingAsk(next);
|
|
227
|
-
if (pending.path !== pendingAskPath(next)) {
|
|
228
|
-
try {
|
|
229
|
-
unlinkSync(pending.path);
|
|
230
|
-
} catch {}
|
|
231
|
-
}
|
|
232
|
-
return next;
|
|
233
|
-
}
|
|
234
|
-
function clearPendingAsk(args) {
|
|
235
|
-
const pending = readPendingAsk(args);
|
|
236
|
-
const path = pending?.path ?? pendingAskPath(args);
|
|
237
|
-
const record = pending?.record ?? null;
|
|
238
|
-
if (args.requestId && record && record.requestId !== args.requestId)
|
|
239
|
-
return false;
|
|
240
|
-
try {
|
|
241
|
-
unlinkSync(path);
|
|
242
|
-
return true;
|
|
243
|
-
} catch {
|
|
244
|
-
return false;
|
|
245
|
-
}
|
|
246
|
-
}
|
|
247
|
-
function markPendingAskSources(args) {
|
|
248
|
-
for (const source of args.sources ?? []) {
|
|
249
|
-
if (!source.from)
|
|
250
|
-
continue;
|
|
251
|
-
markPendingAskState({
|
|
252
|
-
userId: args.userId,
|
|
253
|
-
from: args.callerTopic,
|
|
254
|
-
to: source.from,
|
|
255
|
-
requestId: source.requestId,
|
|
256
|
-
state: args.state
|
|
257
|
-
});
|
|
258
|
-
}
|
|
259
|
-
}
|
|
260
|
-
function clearPendingAskSources(args) {
|
|
261
|
-
for (const source of args.sources ?? []) {
|
|
262
|
-
if (!source.from)
|
|
263
|
-
continue;
|
|
264
|
-
clearPendingAsk({
|
|
265
|
-
userId: args.userId,
|
|
266
|
-
from: args.callerTopic,
|
|
267
|
-
to: source.from,
|
|
268
|
-
requestId: source.requestId
|
|
269
|
-
});
|
|
270
|
-
}
|
|
271
|
-
}
|
|
272
|
-
function listPendingAsksForCaller(args) {
|
|
273
|
-
const dir = pendingAskDir(args.userId);
|
|
274
|
-
let files;
|
|
275
|
-
try {
|
|
276
|
-
files = readdirSync(dir);
|
|
277
|
-
} catch {
|
|
278
|
-
return [];
|
|
279
|
-
}
|
|
280
|
-
const records = new Map;
|
|
281
|
-
for (const fileName of files) {
|
|
282
|
-
const isV3 = fileName.startsWith(ASK_FILENAME_PREFIX);
|
|
283
|
-
const parsed = isV3 ? { from: args.from, to: "" } : parsePendingAskFilename(fileName);
|
|
284
|
-
if (!parsed)
|
|
285
|
-
continue;
|
|
286
|
-
const path = join(dir, fileName);
|
|
287
|
-
const record = readPendingAskFile(path, {
|
|
288
|
-
userId: args.userId,
|
|
289
|
-
from: parsed.from,
|
|
290
|
-
to: parsed.to
|
|
291
|
-
});
|
|
292
|
-
if (!record || record.from !== args.from)
|
|
293
|
-
continue;
|
|
294
|
-
if (isStale(record, path)) {
|
|
295
|
-
try {
|
|
296
|
-
unlinkSync(path);
|
|
297
|
-
} catch {}
|
|
298
|
-
continue;
|
|
299
|
-
}
|
|
300
|
-
const canonical = readPendingAsk(record);
|
|
301
|
-
if (!canonical || canonical.record.from !== args.from)
|
|
302
|
-
continue;
|
|
303
|
-
if (path !== canonical.path) {
|
|
304
|
-
try {
|
|
305
|
-
unlinkSync(path);
|
|
306
|
-
} catch {}
|
|
307
|
-
}
|
|
308
|
-
if (isStale(canonical.record, canonical.path)) {
|
|
309
|
-
try {
|
|
310
|
-
unlinkSync(canonical.path);
|
|
311
|
-
} catch {}
|
|
312
|
-
continue;
|
|
313
|
-
}
|
|
314
|
-
records.set(encodeAskKey(canonical.record), canonical.record);
|
|
315
|
-
}
|
|
316
|
-
return [...records.values()];
|
|
317
|
-
}
|
|
318
|
-
function deletePendingAsksForTopic(args) {
|
|
319
|
-
const dir = pendingAskDir(args.userId);
|
|
320
|
-
let files;
|
|
321
|
-
try {
|
|
322
|
-
files = readdirSync(dir);
|
|
323
|
-
} catch {
|
|
324
|
-
return 0;
|
|
325
|
-
}
|
|
326
|
-
let deleted = 0;
|
|
327
|
-
for (const fileName of files) {
|
|
328
|
-
const path = join(dir, fileName);
|
|
329
|
-
const parsed = parsePendingAskFilename(fileName);
|
|
330
|
-
const record = readPendingAskFile(path, {
|
|
331
|
-
userId: args.userId,
|
|
332
|
-
from: parsed?.from ?? "",
|
|
333
|
-
to: parsed?.to ?? ""
|
|
334
|
-
});
|
|
335
|
-
const from = record?.from ?? parsed?.from;
|
|
336
|
-
const to = record?.to ?? parsed?.to;
|
|
337
|
-
if (from !== args.topicName && to !== args.topicName)
|
|
338
|
-
continue;
|
|
339
|
-
try {
|
|
340
|
-
unlinkSync(path);
|
|
341
|
-
deleted++;
|
|
342
|
-
} catch {}
|
|
343
|
-
}
|
|
344
|
-
return deleted;
|
|
345
|
-
}
|
|
346
|
-
function describePendingAskState(state) {
|
|
347
|
-
switch (state) {
|
|
348
|
-
case "requested":
|
|
349
|
-
return "\uB300\uC0C1 \uC138\uC158 \uCC98\uB9AC \uC911";
|
|
350
|
-
case "reply_ready":
|
|
351
|
-
return "\uC751\uB2F5 \uC0DD\uC131 \uC644\uB8CC, \uC774 \uC138\uC158 \uC8FC\uC785 \uC900\uBE44 \uC911";
|
|
352
|
-
case "queued_for_caller":
|
|
353
|
-
return "\uC751\uB2F5 \uC0DD\uC131 \uC644\uB8CC, \uC774 \uC138\uC158 \uC2E4\uD589 \uC885\uB8CC \uD6C4 \uC8FC\uC785 \uB300\uAE30 \uC911";
|
|
354
|
-
case "injecting_to_caller":
|
|
355
|
-
return "\uC751\uB2F5\uC744 \uC774 \uC138\uC158\uC5D0 \uC8FC\uC785 \uC911";
|
|
356
|
-
}
|
|
357
|
-
}
|
|
358
|
-
export {
|
|
359
|
-
markPendingAskState,
|
|
360
|
-
markPendingAskSources,
|
|
361
|
-
listPendingAsksForCaller,
|
|
362
|
-
describePendingAskState,
|
|
363
|
-
deletePendingAsksForTopic,
|
|
364
|
-
createPendingAsk,
|
|
365
|
-
clearPendingAskSources,
|
|
366
|
-
clearPendingAsk,
|
|
367
|
-
PENDING_ASK_TTL_MS
|
|
368
|
-
};
|
|
369
|
-
|
|
370
|
-
export { PENDING_ASK_TTL_MS, clearPendingAsk, deletePendingAsksForTopic };
|
|
371
|
-
|
|
372
|
-
//# debugId=A0BB6C5592FB25FF64756E2164756E21
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../packages/core/src/storage/session-asks.ts"],
|
|
4
|
-
"sourcesContent": [
|
|
5
|
-
"import { createHash } from \"node:crypto\";\nimport {\n closeSync,\n mkdirSync,\n openSync,\n readdirSync,\n readFileSync,\n statSync,\n unlinkSync,\n writeFileSync,\n} from \"node:fs\";\nimport { dirname, join } from \"node:path\";\nimport { resolveStorageSessionAsksDir } from \"#storage/storage-host\";\n\nexport const PENDING_ASK_TTL_MS = 15 * 60 * 1000;\n\nexport type PendingAskState =\n | \"requested\"\n | \"reply_ready\"\n | \"queued_for_caller\"\n | \"injecting_to_caller\";\n\nexport type PendingAskUserId = number | string;\n\nexport interface PendingAskRecord {\n userId: PendingAskUserId;\n from: string;\n to: string;\n requestId: string;\n contextId?: string;\n state: PendingAskState;\n createdAt: string;\n updatedAt: string;\n}\n\nexport interface AskReplySource {\n from?: string;\n requestId?: string;\n contextId?: string;\n}\n\nexport interface PendingAskKey {\n userId: PendingAskUserId;\n from: string;\n to: string;\n}\n\nexport interface PendingAskIdentity extends PendingAskKey {\n requestId?: string;\n}\n\ntype AskKey = PendingAskKey;\ntype AskIdentity = PendingAskIdentity;\n\nfunction pendingAskDir(userId: PendingAskUserId): string {\n const rawUserId = String(userId);\n const safeUserId =\n /^[A-Za-z0-9][A-Za-z0-9_.@-]{0,255}$/.test(rawUserId) && !rawUserId.includes(\"..\")\n ? rawUserId\n : `sha256-${createHash(\"sha256\").update(rawUserId).digest(\"hex\")}`;\n return join(resolveStorageSessionAsksDir(), safeUserId);\n}\n\nconst ASK_FILENAME_PREFIX = \"v3-\";\nconst V2_ASK_FILENAME_PREFIX = \"v2-\";\n\nfunction encodeAskKey(key: Pick<AskKey, \"from\" | \"to\">): string {\n return JSON.stringify([key.from, key.to]);\n}\n\nfunction pendingAskPath(key: AskKey): string {\n const digest = createHash(\"sha256\").update(encodeAskKey(key)).digest(\"hex\");\n return join(pendingAskDir(key.userId), `${ASK_FILENAME_PREFIX}${digest}.pending`);\n}\n\nfunction v2PendingAskPath(key: AskKey): string {\n const encoded = Buffer.from(encodeAskKey(key), \"utf8\").toString(\"base64url\");\n return join(pendingAskDir(key.userId), `${V2_ASK_FILENAME_PREFIX}${encoded}.pending`);\n}\n\nfunction legacyPendingAskPath(key: AskKey): string | null {\n if (\n key.from.includes(\"/\") ||\n key.from.includes(\"\\\\\") ||\n key.to.includes(\"/\") ||\n key.to.includes(\"\\\\\") ||\n key.from.includes(\"\\0\") ||\n key.to.includes(\"\\0\")\n ) {\n return null;\n }\n const dir = pendingAskDir(key.userId);\n const candidate = join(dir, `${key.from}___${key.to}.pending`);\n return dirname(candidate) === dir ? candidate : null;\n}\n\nfunction parsePendingAskFilename(fileName: string): { from: string; to: string } | null {\n if (!fileName.endsWith(\".pending\")) return null;\n const raw = fileName.slice(0, -\".pending\".length);\n if (raw.startsWith(V2_ASK_FILENAME_PREFIX)) {\n try {\n const decoded = JSON.parse(\n Buffer.from(raw.slice(V2_ASK_FILENAME_PREFIX.length), \"base64url\").toString(\"utf8\"),\n ) as unknown;\n if (\n Array.isArray(decoded) &&\n decoded.length === 2 &&\n decoded.every((part) => typeof part === \"string\")\n ) {\n return { from: decoded[0], to: decoded[1] };\n }\n } catch {\n // A legacy caller key may itself start with \"v2-\". Fall through to the\n // delimiter parser when the suffix is not a valid v2 payload.\n }\n }\n\n // Read files created before the opaque v2 key was introduced.\n const sep = raw.indexOf(\"___\");\n if (sep < 0) return null;\n return { from: raw.slice(0, sep), to: raw.slice(sep + 3) };\n}\n\nfunction readPendingAskFile(path: string, fallback: AskKey): PendingAskRecord | null {\n try {\n const raw = readFileSync(path, \"utf8\").trim();\n if (!raw) return null;\n if (!raw.startsWith(\"{\")) {\n const ts = new Date(statSync(path).mtimeMs).toISOString();\n return {\n userId: fallback.userId,\n from: fallback.from,\n to: fallback.to,\n requestId: raw,\n state: \"requested\",\n createdAt: ts,\n updatedAt: ts,\n };\n }\n const parsed = JSON.parse(raw) as Partial<PendingAskRecord>;\n if (!parsed.requestId || !parsed.from || !parsed.to) return null;\n if (parsed.userId !== undefined && String(parsed.userId) !== String(fallback.userId))\n return null;\n if (fallback.from && parsed.from !== fallback.from) return null;\n if (fallback.to && parsed.to !== fallback.to) return null;\n const now = new Date().toISOString();\n return {\n // The directory selected by the caller is authoritative. Never let a\n // tampered record redirect a later migration/update into another user root.\n userId: fallback.userId,\n from: parsed.from,\n to: parsed.to,\n requestId: parsed.requestId,\n contextId: parsed.contextId,\n state: parsed.state ?? \"requested\",\n createdAt: parsed.createdAt ?? now,\n updatedAt: parsed.updatedAt ?? parsed.createdAt ?? now,\n };\n } catch {\n return null;\n }\n}\n\nfunction isStale(record: PendingAskRecord | null, path: string): boolean {\n const ts = record ? Date.parse(record.updatedAt || record.createdAt) : Number.NaN;\n if (Number.isFinite(ts)) return Date.now() - ts > PENDING_ASK_TTL_MS;\n try {\n return Date.now() - statSync(path).mtimeMs > PENDING_ASK_TTL_MS;\n } catch {\n return false;\n }\n}\n\nfunction writePendingAsk(record: PendingAskRecord): void {\n const path = pendingAskPath(record);\n mkdirSync(pendingAskDir(record.userId), { recursive: true });\n writeFileSync(path, `${JSON.stringify(record)}\\n`);\n}\n\nfunction writePendingAskIfAbsent(record: PendingAskRecord): boolean {\n const path = pendingAskPath(record);\n mkdirSync(pendingAskDir(record.userId), { recursive: true });\n let fd: number | null = null;\n try {\n fd = openSync(path, \"wx\");\n writeFileSync(fd, `${JSON.stringify(record)}\\n`);\n return true;\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"EEXIST\") return false;\n throw error;\n } finally {\n if (fd !== null) closeSync(fd);\n }\n}\n\nfunction readPendingAsk(key: AskKey): { path: string; record: PendingAskRecord } | null {\n const canonicalPath = pendingAskPath(key);\n const canonical = readPendingAskFile(canonicalPath, key);\n if (canonical && canonical.from === key.from && canonical.to === key.to) {\n return { path: canonicalPath, record: canonical };\n }\n\n for (const compatibilityPath of [v2PendingAskPath(key), legacyPendingAskPath(key)]) {\n if (!compatibilityPath) continue;\n const legacy = readPendingAskFile(compatibilityPath, key);\n if (!legacy || legacy.from !== key.from || legacy.to !== key.to) continue;\n\n const migrated = writePendingAskIfAbsent(legacy);\n const next = migrated ? legacy : readPendingAskFile(canonicalPath, key);\n if (next && next.from === key.from && next.to === key.to) {\n try {\n unlinkSync(compatibilityPath);\n } catch {\n // The canonical record is durable; concurrent cleanup may win.\n }\n return { path: canonicalPath, record: next };\n }\n\n // Never discard a valid compatibility record when a corrupt or racing\n // canonical file cannot be trusted.\n return { path: compatibilityPath, record: legacy };\n }\n\n return null;\n}\n\nexport function createPendingAsk(args: {\n userId: PendingAskUserId;\n from: string;\n to: string;\n requestId: string;\n contextId?: string;\n}):\n | { ok: true; record: PendingAskRecord }\n | { ok: false; existing: PendingAskRecord | null; stale: boolean } {\n const migrated = readPendingAsk(args);\n if (migrated && !isStale(migrated.record, migrated.path)) {\n return { ok: false, existing: migrated.record, stale: false };\n }\n if (migrated) {\n try {\n unlinkSync(migrated.path);\n } catch {\n return { ok: false, existing: migrated.record, stale: true };\n }\n }\n const path = pendingAskPath(args);\n const now = new Date().toISOString();\n const record: PendingAskRecord = {\n userId: args.userId,\n from: args.from,\n to: args.to,\n requestId: args.requestId,\n contextId: args.contextId,\n state: \"requested\",\n createdAt: now,\n updatedAt: now,\n };\n\n mkdirSync(pendingAskDir(args.userId), { recursive: true });\n for (let attempt = 0; attempt < 2; attempt++) {\n let fd: number | null = null;\n try {\n fd = openSync(path, \"wx\");\n writeFileSync(fd, `${JSON.stringify(record)}\\n`);\n return { ok: true, record };\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code !== \"EEXIST\") throw err;\n const existing = readPendingAskFile(path, args);\n if (!isStale(existing, path)) return { ok: false, existing, stale: false };\n try {\n unlinkSync(path);\n } catch {\n return { ok: false, existing, stale: true };\n }\n } finally {\n if (fd !== null) closeSync(fd);\n }\n }\n\n return { ok: false, existing: readPendingAskFile(path, args), stale: true };\n}\n\nexport function markPendingAskState(\n args: AskIdentity & { state: PendingAskState },\n): PendingAskRecord | null {\n const pending = readPendingAsk(args);\n if (!pending) return null;\n const record = pending.record;\n if (args.requestId && record.requestId !== args.requestId) return record;\n const next = {\n ...record,\n state: args.state,\n updatedAt: new Date().toISOString(),\n };\n writePendingAsk(next);\n if (pending.path !== pendingAskPath(next)) {\n try {\n unlinkSync(pending.path);\n } catch {\n // The canonical v3 record already contains the update.\n }\n }\n return next;\n}\n\nexport function clearPendingAsk(args: AskIdentity): boolean {\n const pending = readPendingAsk(args);\n const path = pending?.path ?? pendingAskPath(args);\n const record = pending?.record ?? null;\n if (args.requestId && record && record.requestId !== args.requestId) return false;\n try {\n unlinkSync(path);\n return true;\n } catch {\n return false;\n }\n}\n\nexport function markPendingAskSources(args: {\n userId: PendingAskUserId;\n callerTopic: string;\n sources?: AskReplySource[];\n state: PendingAskState;\n}): void {\n for (const source of args.sources ?? []) {\n if (!source.from) continue;\n markPendingAskState({\n userId: args.userId,\n from: args.callerTopic,\n to: source.from,\n requestId: source.requestId,\n state: args.state,\n });\n }\n}\n\nexport function clearPendingAskSources(args: {\n userId: PendingAskUserId;\n callerTopic: string;\n sources?: AskReplySource[];\n}): void {\n for (const source of args.sources ?? []) {\n if (!source.from) continue;\n clearPendingAsk({\n userId: args.userId,\n from: args.callerTopic,\n to: source.from,\n requestId: source.requestId,\n });\n }\n}\n\nexport function listPendingAsksForCaller(args: {\n userId: PendingAskUserId;\n from: string;\n}): PendingAskRecord[] {\n const dir = pendingAskDir(args.userId);\n let files: string[];\n try {\n files = readdirSync(dir);\n } catch {\n return [];\n }\n\n const records = new Map<string, PendingAskRecord>();\n for (const fileName of files) {\n const isV3 = fileName.startsWith(ASK_FILENAME_PREFIX);\n const parsed = isV3 ? { from: args.from, to: \"\" } : parsePendingAskFilename(fileName);\n if (!parsed) continue;\n const path = join(dir, fileName);\n const record = readPendingAskFile(path, {\n userId: args.userId,\n from: parsed.from,\n to: parsed.to,\n });\n if (!record || record.from !== args.from) continue;\n if (isStale(record, path)) {\n try {\n unlinkSync(path);\n } catch {\n // Best-effort stale cleanup only.\n }\n continue;\n }\n const canonical = readPendingAsk(record);\n if (!canonical || canonical.record.from !== args.from) continue;\n if (path !== canonical.path) {\n try {\n unlinkSync(path);\n } catch {\n // Canonical record wins; duplicate compatibility cleanup is best effort.\n }\n }\n if (isStale(canonical.record, canonical.path)) {\n try {\n unlinkSync(canonical.path);\n } catch {\n // Best-effort stale cleanup only.\n }\n continue;\n }\n records.set(encodeAskKey(canonical.record), canonical.record);\n }\n return [...records.values()];\n}\n\n/** Remove durable ask edges to or from a topic that no longer exists. */\nexport function deletePendingAsksForTopic(args: {\n userId: PendingAskUserId;\n topicName: string;\n}): number {\n const dir = pendingAskDir(args.userId);\n let files: string[];\n try {\n files = readdirSync(dir);\n } catch {\n return 0;\n }\n\n let deleted = 0;\n for (const fileName of files) {\n const path = join(dir, fileName);\n const parsed = parsePendingAskFilename(fileName);\n const record = readPendingAskFile(path, {\n userId: args.userId,\n from: parsed?.from ?? \"\",\n to: parsed?.to ?? \"\",\n });\n const from = record?.from ?? parsed?.from;\n const to = record?.to ?? parsed?.to;\n if (from !== args.topicName && to !== args.topicName) continue;\n try {\n unlinkSync(path);\n deleted++;\n } catch {\n // Best-effort teardown; stale cleanup will retry any file that survives.\n }\n }\n return deleted;\n}\n\nexport function describePendingAskState(state: PendingAskState): string {\n switch (state) {\n case \"requested\":\n return \"대상 세션 처리 중\";\n case \"reply_ready\":\n return \"응답 생성 완료, 이 세션 주입 준비 중\";\n case \"queued_for_caller\":\n return \"응답 생성 완료, 이 세션 실행 종료 후 주입 대기 중\";\n case \"injecting_to_caller\":\n return \"응답을 이 세션에 주입 중\";\n }\n}\n"
|
|
6
|
-
],
|
|
7
|
-
"mappings": ";;;;;;;;AAAA;AACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAUA;AAGO,IAAM,qBAAqB,KAAK,KAAK;AAwC5C,SAAS,aAAa,CAAC,QAAkC;AAAA,EACvD,MAAM,YAAY,OAAO,MAAM;AAAA,EAC/B,MAAM,aACJ,sCAAsC,KAAK,SAAS,MAAM,UAAU,SAAS,IAAI,IAC7E,YACA,UAAU,WAAW,QAAQ,EAAE,OAAO,SAAS,EAAE,OAAO,KAAK;AAAA,EACnE,OAAO,KAAK,6BAA6B,GAAG,UAAU;AAAA;AAGxD,IAAM,sBAAsB;AAC5B,IAAM,yBAAyB;AAE/B,SAAS,YAAY,CAAC,KAA0C;AAAA,EAC9D,OAAO,KAAK,UAAU,CAAC,IAAI,MAAM,IAAI,EAAE,CAAC;AAAA;AAG1C,SAAS,cAAc,CAAC,KAAqB;AAAA,EAC3C,MAAM,SAAS,WAAW,QAAQ,EAAE,OAAO,aAAa,GAAG,CAAC,EAAE,OAAO,KAAK;AAAA,EAC1E,OAAO,KAAK,cAAc,IAAI,MAAM,GAAG,GAAG,sBAAsB,gBAAgB;AAAA;AAGlF,SAAS,gBAAgB,CAAC,KAAqB;AAAA,EAC7C,MAAM,UAAU,OAAO,KAAK,aAAa,GAAG,GAAG,MAAM,EAAE,SAAS,WAAW;AAAA,EAC3E,OAAO,KAAK,cAAc,IAAI,MAAM,GAAG,GAAG,yBAAyB,iBAAiB;AAAA;AAGtF,SAAS,oBAAoB,CAAC,KAA4B;AAAA,EACxD,IACE,IAAI,KAAK,SAAS,GAAG,KACrB,IAAI,KAAK,SAAS,IAAI,KACtB,IAAI,GAAG,SAAS,GAAG,KACnB,IAAI,GAAG,SAAS,IAAI,KACpB,IAAI,KAAK,SAAS,MAAI,KACtB,IAAI,GAAG,SAAS,MAAI,GACpB;AAAA,IACA,OAAO;AAAA,EACT;AAAA,EACA,MAAM,MAAM,cAAc,IAAI,MAAM;AAAA,EACpC,MAAM,YAAY,KAAK,KAAK,GAAG,IAAI,UAAU,IAAI,YAAY;AAAA,EAC7D,OAAO,QAAQ,SAAS,MAAM,MAAM,YAAY;AAAA;AAGlD,SAAS,uBAAuB,CAAC,UAAuD;AAAA,EACtF,KAAK,SAAS,SAAS,UAAU;AAAA,IAAG,OAAO;AAAA,EAC3C,MAAM,MAAM,SAAS,MAAM,IAAI,WAAW,MAAM;AAAA,EAChD,IAAI,IAAI,WAAW,sBAAsB,GAAG;AAAA,IAC1C,IAAI;AAAA,MACF,MAAM,UAAU,KAAK,MACnB,OAAO,KAAK,IAAI,MAAM,uBAAuB,MAAM,GAAG,WAAW,EAAE,SAAS,MAAM,CACpF;AAAA,MACA,IACE,MAAM,QAAQ,OAAO,KACrB,QAAQ,WAAW,KACnB,QAAQ,MAAM,CAAC,SAAS,OAAO,SAAS,QAAQ,GAChD;AAAA,QACA,OAAO,EAAE,MAAM,QAAQ,IAAI,IAAI,QAAQ,GAAG;AAAA,MAC5C;AAAA,MACA,MAAM;AAAA,EAIV;AAAA,EAGA,MAAM,MAAM,IAAI,QAAQ,KAAK;AAAA,EAC7B,IAAI,MAAM;AAAA,IAAG,OAAO;AAAA,EACpB,OAAO,EAAE,MAAM,IAAI,MAAM,GAAG,GAAG,GAAG,IAAI,IAAI,MAAM,MAAM,CAAC,EAAE;AAAA;AAG3D,SAAS,kBAAkB,CAAC,MAAc,UAA2C;AAAA,EACnF,IAAI;AAAA,IACF,MAAM,MAAM,aAAa,MAAM,MAAM,EAAE,KAAK;AAAA,IAC5C,KAAK;AAAA,MAAK,OAAO;AAAA,IACjB,KAAK,IAAI,WAAW,GAAG,GAAG;AAAA,MACxB,MAAM,KAAK,IAAI,KAAK,SAAS,IAAI,EAAE,OAAO,EAAE,YAAY;AAAA,MACxD,OAAO;AAAA,QACL,QAAQ,SAAS;AAAA,QACjB,MAAM,SAAS;AAAA,QACf,IAAI,SAAS;AAAA,QACb,WAAW;AAAA,QACX,OAAO;AAAA,QACP,WAAW;AAAA,QACX,WAAW;AAAA,MACb;AAAA,IACF;AAAA,IACA,MAAM,SAAS,KAAK,MAAM,GAAG;AAAA,IAC7B,KAAK,OAAO,cAAc,OAAO,SAAS,OAAO;AAAA,MAAI,OAAO;AAAA,IAC5D,IAAI,OAAO,WAAW,aAAa,OAAO,OAAO,MAAM,MAAM,OAAO,SAAS,MAAM;AAAA,MACjF,OAAO;AAAA,IACT,IAAI,SAAS,QAAQ,OAAO,SAAS,SAAS;AAAA,MAAM,OAAO;AAAA,IAC3D,IAAI,SAAS,MAAM,OAAO,OAAO,SAAS;AAAA,MAAI,OAAO;AAAA,IACrD,MAAM,MAAM,IAAI,KAAK,EAAE,YAAY;AAAA,IACnC,OAAO;AAAA,MAGL,QAAQ,SAAS;AAAA,MACjB,MAAM,OAAO;AAAA,MACb,IAAI,OAAO;AAAA,MACX,WAAW,OAAO;AAAA,MAClB,WAAW,OAAO;AAAA,MAClB,OAAO,OAAO,SAAS;AAAA,MACvB,WAAW,OAAO,aAAa;AAAA,MAC/B,WAAW,OAAO,aAAa,OAAO,aAAa;AAAA,IACrD;AAAA,IACA,MAAM;AAAA,IACN,OAAO;AAAA;AAAA;AAIX,SAAS,OAAO,CAAC,QAAiC,MAAuB;AAAA,EACvE,MAAM,KAAK,SAAS,KAAK,MAAM,OAAO,aAAa,OAAO,SAAS,IAAI,OAAO;AAAA,EAC9E,IAAI,OAAO,SAAS,EAAE;AAAA,IAAG,OAAO,KAAK,IAAI,IAAI,KAAK;AAAA,EAClD,IAAI;AAAA,IACF,OAAO,KAAK,IAAI,IAAI,SAAS,IAAI,EAAE,UAAU;AAAA,IAC7C,MAAM;AAAA,IACN,OAAO;AAAA;AAAA;AAIX,SAAS,eAAe,CAAC,QAAgC;AAAA,EACvD,MAAM,OAAO,eAAe,MAAM;AAAA,EAClC,UAAU,cAAc,OAAO,MAAM,GAAG,EAAE,WAAW,KAAK,CAAC;AAAA,EAC3D,cAAc,MAAM,GAAG,KAAK,UAAU,MAAM;AAAA,CAAK;AAAA;AAGnD,SAAS,uBAAuB,CAAC,QAAmC;AAAA,EAClE,MAAM,OAAO,eAAe,MAAM;AAAA,EAClC,UAAU,cAAc,OAAO,MAAM,GAAG,EAAE,WAAW,KAAK,CAAC;AAAA,EAC3D,IAAI,KAAoB;AAAA,EACxB,IAAI;AAAA,IACF,KAAK,SAAS,MAAM,IAAI;AAAA,IACxB,cAAc,IAAI,GAAG,KAAK,UAAU,MAAM;AAAA,CAAK;AAAA,IAC/C,OAAO;AAAA,IACP,OAAO,OAAO;AAAA,IACd,IAAK,MAAgC,SAAS;AAAA,MAAU,OAAO;AAAA,IAC/D,MAAM;AAAA,YACN;AAAA,IACA,IAAI,OAAO;AAAA,MAAM,UAAU,EAAE;AAAA;AAAA;AAIjC,SAAS,cAAc,CAAC,KAAgE;AAAA,EACtF,MAAM,gBAAgB,eAAe,GAAG;AAAA,EACxC,MAAM,YAAY,mBAAmB,eAAe,GAAG;AAAA,EACvD,IAAI,aAAa,UAAU,SAAS,IAAI,QAAQ,UAAU,OAAO,IAAI,IAAI;AAAA,IACvE,OAAO,EAAE,MAAM,eAAe,QAAQ,UAAU;AAAA,EAClD;AAAA,EAEA,WAAW,qBAAqB,CAAC,iBAAiB,GAAG,GAAG,qBAAqB,GAAG,CAAC,GAAG;AAAA,IAClF,KAAK;AAAA,MAAmB;AAAA,IACxB,MAAM,SAAS,mBAAmB,mBAAmB,GAAG;AAAA,IACxD,KAAK,UAAU,OAAO,SAAS,IAAI,QAAQ,OAAO,OAAO,IAAI;AAAA,MAAI;AAAA,IAEjE,MAAM,WAAW,wBAAwB,MAAM;AAAA,IAC/C,MAAM,OAAO,WAAW,SAAS,mBAAmB,eAAe,GAAG;AAAA,IACtE,IAAI,QAAQ,KAAK,SAAS,IAAI,QAAQ,KAAK,OAAO,IAAI,IAAI;AAAA,MACxD,IAAI;AAAA,QACF,WAAW,iBAAiB;AAAA,QAC5B,MAAM;AAAA,MAGR,OAAO,EAAE,MAAM,eAAe,QAAQ,KAAK;AAAA,IAC7C;AAAA,IAIA,OAAO,EAAE,MAAM,mBAAmB,QAAQ,OAAO;AAAA,EACnD;AAAA,EAEA,OAAO;AAAA;AAGF,SAAS,gBAAgB,CAAC,MAQoC;AAAA,EACnE,MAAM,WAAW,eAAe,IAAI;AAAA,EACpC,IAAI,aAAa,QAAQ,SAAS,QAAQ,SAAS,IAAI,GAAG;AAAA,IACxD,OAAO,EAAE,IAAI,OAAO,UAAU,SAAS,QAAQ,OAAO,MAAM;AAAA,EAC9D;AAAA,EACA,IAAI,UAAU;AAAA,IACZ,IAAI;AAAA,MACF,WAAW,SAAS,IAAI;AAAA,MACxB,MAAM;AAAA,MACN,OAAO,EAAE,IAAI,OAAO,UAAU,SAAS,QAAQ,OAAO,KAAK;AAAA;AAAA,EAE/D;AAAA,EACA,MAAM,OAAO,eAAe,IAAI;AAAA,EAChC,MAAM,MAAM,IAAI,KAAK,EAAE,YAAY;AAAA,EACnC,MAAM,SAA2B;AAAA,IAC/B,QAAQ,KAAK;AAAA,IACb,MAAM,KAAK;AAAA,IACX,IAAI,KAAK;AAAA,IACT,WAAW,KAAK;AAAA,IAChB,WAAW,KAAK;AAAA,IAChB,OAAO;AAAA,IACP,WAAW;AAAA,IACX,WAAW;AAAA,EACb;AAAA,EAEA,UAAU,cAAc,KAAK,MAAM,GAAG,EAAE,WAAW,KAAK,CAAC;AAAA,EACzD,SAAS,UAAU,EAAG,UAAU,GAAG,WAAW;AAAA,IAC5C,IAAI,KAAoB;AAAA,IACxB,IAAI;AAAA,MACF,KAAK,SAAS,MAAM,IAAI;AAAA,MACxB,cAAc,IAAI,GAAG,KAAK,UAAU,MAAM;AAAA,CAAK;AAAA,MAC/C,OAAO,EAAE,IAAI,MAAM,OAAO;AAAA,MAC1B,OAAO,KAAK;AAAA,MACZ,IAAK,IAA8B,SAAS;AAAA,QAAU,MAAM;AAAA,MAC5D,MAAM,WAAW,mBAAmB,MAAM,IAAI;AAAA,MAC9C,KAAK,QAAQ,UAAU,IAAI;AAAA,QAAG,OAAO,EAAE,IAAI,OAAO,UAAU,OAAO,MAAM;AAAA,MACzE,IAAI;AAAA,QACF,WAAW,IAAI;AAAA,QACf,MAAM;AAAA,QACN,OAAO,EAAE,IAAI,OAAO,UAAU,OAAO,KAAK;AAAA;AAAA,cAE5C;AAAA,MACA,IAAI,OAAO;AAAA,QAAM,UAAU,EAAE;AAAA;AAAA,EAEjC;AAAA,EAEA,OAAO,EAAE,IAAI,OAAO,UAAU,mBAAmB,MAAM,IAAI,GAAG,OAAO,KAAK;AAAA;AAGrE,SAAS,mBAAmB,CACjC,MACyB;AAAA,EACzB,MAAM,UAAU,eAAe,IAAI;AAAA,EACnC,KAAK;AAAA,IAAS,OAAO;AAAA,EACrB,MAAM,SAAS,QAAQ;AAAA,EACvB,IAAI,KAAK,aAAa,OAAO,cAAc,KAAK;AAAA,IAAW,OAAO;AAAA,EAClE,MAAM,OAAO;AAAA,OACR;AAAA,IACH,OAAO,KAAK;AAAA,IACZ,WAAW,IAAI,KAAK,EAAE,YAAY;AAAA,EACpC;AAAA,EACA,gBAAgB,IAAI;AAAA,EACpB,IAAI,QAAQ,SAAS,eAAe,IAAI,GAAG;AAAA,IACzC,IAAI;AAAA,MACF,WAAW,QAAQ,IAAI;AAAA,MACvB,MAAM;AAAA,EAGV;AAAA,EACA,OAAO;AAAA;AAGF,SAAS,eAAe,CAAC,MAA4B;AAAA,EAC1D,MAAM,UAAU,eAAe,IAAI;AAAA,EACnC,MAAM,OAAO,SAAS,QAAQ,eAAe,IAAI;AAAA,EACjD,MAAM,SAAS,SAAS,UAAU;AAAA,EAClC,IAAI,KAAK,aAAa,UAAU,OAAO,cAAc,KAAK;AAAA,IAAW,OAAO;AAAA,EAC5E,IAAI;AAAA,IACF,WAAW,IAAI;AAAA,IACf,OAAO;AAAA,IACP,MAAM;AAAA,IACN,OAAO;AAAA;AAAA;AAIJ,SAAS,qBAAqB,CAAC,MAK7B;AAAA,EACP,WAAW,UAAU,KAAK,WAAW,CAAC,GAAG;AAAA,IACvC,KAAK,OAAO;AAAA,MAAM;AAAA,IAClB,oBAAoB;AAAA,MAClB,QAAQ,KAAK;AAAA,MACb,MAAM,KAAK;AAAA,MACX,IAAI,OAAO;AAAA,MACX,WAAW,OAAO;AAAA,MAClB,OAAO,KAAK;AAAA,IACd,CAAC;AAAA,EACH;AAAA;AAGK,SAAS,sBAAsB,CAAC,MAI9B;AAAA,EACP,WAAW,UAAU,KAAK,WAAW,CAAC,GAAG;AAAA,IACvC,KAAK,OAAO;AAAA,MAAM;AAAA,IAClB,gBAAgB;AAAA,MACd,QAAQ,KAAK;AAAA,MACb,MAAM,KAAK;AAAA,MACX,IAAI,OAAO;AAAA,MACX,WAAW,OAAO;AAAA,IACpB,CAAC;AAAA,EACH;AAAA;AAGK,SAAS,wBAAwB,CAAC,MAGlB;AAAA,EACrB,MAAM,MAAM,cAAc,KAAK,MAAM;AAAA,EACrC,IAAI;AAAA,EACJ,IAAI;AAAA,IACF,QAAQ,YAAY,GAAG;AAAA,IACvB,MAAM;AAAA,IACN,OAAO,CAAC;AAAA;AAAA,EAGV,MAAM,UAAU,IAAI;AAAA,EACpB,WAAW,YAAY,OAAO;AAAA,IAC5B,MAAM,OAAO,SAAS,WAAW,mBAAmB;AAAA,IACpD,MAAM,SAAS,OAAO,EAAE,MAAM,KAAK,MAAM,IAAI,GAAG,IAAI,wBAAwB,QAAQ;AAAA,IACpF,KAAK;AAAA,MAAQ;AAAA,IACb,MAAM,OAAO,KAAK,KAAK,QAAQ;AAAA,IAC/B,MAAM,SAAS,mBAAmB,MAAM;AAAA,MACtC,QAAQ,KAAK;AAAA,MACb,MAAM,OAAO;AAAA,MACb,IAAI,OAAO;AAAA,IACb,CAAC;AAAA,IACD,KAAK,UAAU,OAAO,SAAS,KAAK;AAAA,MAAM;AAAA,IAC1C,IAAI,QAAQ,QAAQ,IAAI,GAAG;AAAA,MACzB,IAAI;AAAA,QACF,WAAW,IAAI;AAAA,QACf,MAAM;AAAA,MAGR;AAAA,IACF;AAAA,IACA,MAAM,YAAY,eAAe,MAAM;AAAA,IACvC,KAAK,aAAa,UAAU,OAAO,SAAS,KAAK;AAAA,MAAM;AAAA,IACvD,IAAI,SAAS,UAAU,MAAM;AAAA,MAC3B,IAAI;AAAA,QACF,WAAW,IAAI;AAAA,QACf,MAAM;AAAA,IAGV;AAAA,IACA,IAAI,QAAQ,UAAU,QAAQ,UAAU,IAAI,GAAG;AAAA,MAC7C,IAAI;AAAA,QACF,WAAW,UAAU,IAAI;AAAA,QACzB,MAAM;AAAA,MAGR;AAAA,IACF;AAAA,IACA,QAAQ,IAAI,aAAa,UAAU,MAAM,GAAG,UAAU,MAAM;AAAA,EAC9D;AAAA,EACA,OAAO,CAAC,GAAG,QAAQ,OAAO,CAAC;AAAA;AAItB,SAAS,yBAAyB,CAAC,MAG/B;AAAA,EACT,MAAM,MAAM,cAAc,KAAK,MAAM;AAAA,EACrC,IAAI;AAAA,EACJ,IAAI;AAAA,IACF,QAAQ,YAAY,GAAG;AAAA,IACvB,MAAM;AAAA,IACN,OAAO;AAAA;AAAA,EAGT,IAAI,UAAU;AAAA,EACd,WAAW,YAAY,OAAO;AAAA,IAC5B,MAAM,OAAO,KAAK,KAAK,QAAQ;AAAA,IAC/B,MAAM,SAAS,wBAAwB,QAAQ;AAAA,IAC/C,MAAM,SAAS,mBAAmB,MAAM;AAAA,MACtC,QAAQ,KAAK;AAAA,MACb,MAAM,QAAQ,QAAQ;AAAA,MACtB,IAAI,QAAQ,MAAM;AAAA,IACpB,CAAC;AAAA,IACD,MAAM,OAAO,QAAQ,QAAQ,QAAQ;AAAA,IACrC,MAAM,KAAK,QAAQ,MAAM,QAAQ;AAAA,IACjC,IAAI,SAAS,KAAK,aAAa,OAAO,KAAK;AAAA,MAAW;AAAA,IACtD,IAAI;AAAA,MACF,WAAW,IAAI;AAAA,MACf;AAAA,MACA,MAAM;AAAA,EAGV;AAAA,EACA,OAAO;AAAA;AAGF,SAAS,uBAAuB,CAAC,OAAgC;AAAA,EACtE,QAAQ;AAAA,SACD;AAAA,MACH,OAAO;AAAA,SACJ;AAAA,MACH,OAAO;AAAA,SACJ;AAAA,MACH,OAAO;AAAA,SACJ;AAAA,MACH,OAAO;AAAA;AAAA;",
|
|
8
|
-
"debugId": "A0BB6C5592FB25FF64756E2164756E21",
|
|
9
|
-
"names": []
|
|
10
|
-
}
|
package/dist/chunk-a4aa2ccv.js
DELETED
|
@@ -1,141 +0,0 @@
|
|
|
1
|
-
// @bun
|
|
2
|
-
import {
|
|
3
|
-
claimEnrollment,
|
|
4
|
-
commitEnrollment,
|
|
5
|
-
isEnrollmentPending,
|
|
6
|
-
parseEnrollmentInvite,
|
|
7
|
-
previewEnrollment
|
|
8
|
-
} from "./chunk-r6kdp7gn.js";
|
|
9
|
-
import {
|
|
10
|
-
configureOtiumCentral,
|
|
11
|
-
selfPeerNode
|
|
12
|
-
} from "./chunk-cngrf7ab.js";
|
|
13
|
-
import {
|
|
14
|
-
parseInviteCode,
|
|
15
|
-
saveJoin
|
|
16
|
-
} from "./chunk-xfdkep71.js";
|
|
17
|
-
import"./chunk-h7bj5zwb.js";
|
|
18
|
-
import"./chunk-tcs9qjps.js";
|
|
19
|
-
import"./chunk-7k19pcg8.js";
|
|
20
|
-
import"./chunk-8dy7e2a9.js";
|
|
21
|
-
import"./chunk-9hjeemfz.js";
|
|
22
|
-
import"./chunk-1k7t7bnx.js";
|
|
23
|
-
import"./chunk-xhm1rfpt.js";
|
|
24
|
-
import"./chunk-mnwaext5.js";
|
|
25
|
-
import"./chunk-xpcps28p.js";
|
|
26
|
-
import"./chunk-fbtb3v0s.js";
|
|
27
|
-
import"./chunk-ejcm6zx8.js";
|
|
28
|
-
import"./chunk-hp4g7wx7.js";
|
|
29
|
-
import"./chunk-s74rdyqe.js";
|
|
30
|
-
import"./chunk-k778y16p.js";
|
|
31
|
-
import"./chunk-xag86ng3.js";
|
|
32
|
-
import"./chunk-wx83ep8e.js";
|
|
33
|
-
import"./chunk-00q25k7p.js";
|
|
34
|
-
import"./chunk-gaknyw04.js";
|
|
35
|
-
import"./chunk-mh5mexsf.js";
|
|
36
|
-
import"./chunk-ezs352qs.js";
|
|
37
|
-
import"./chunk-j0kjscb7.js";
|
|
38
|
-
import"./chunk-82qhv1mq.js";
|
|
39
|
-
import"./chunk-ffefbd3r.js";
|
|
40
|
-
import"./chunk-81tbfbmt.js";
|
|
41
|
-
import"./chunk-sffqdkvq.js";
|
|
42
|
-
import"./chunk-f5xgprg1.js";
|
|
43
|
-
import {
|
|
44
|
-
__require,
|
|
45
|
-
__toESM
|
|
46
|
-
} from "./chunk-hwy3n31w.js";
|
|
47
|
-
|
|
48
|
-
// ../../adapters/otium/src/join-cli.ts
|
|
49
|
-
function option(args, name) {
|
|
50
|
-
const index = args.indexOf(`--${name}`);
|
|
51
|
-
return index >= 0 ? args[index + 1]?.trim() : undefined;
|
|
52
|
-
}
|
|
53
|
-
async function confirmEnrollment(message) {
|
|
54
|
-
if (!process.stdin.isTTY)
|
|
55
|
-
return false;
|
|
56
|
-
const { createInterface } = await import("readline/promises");
|
|
57
|
-
const prompt = createInterface({ input: process.stdin, output: process.stdout });
|
|
58
|
-
try {
|
|
59
|
-
return /^(?:y|yes)$/i.test((await prompt.question(`${message} [y/N] `)).trim());
|
|
60
|
-
} finally {
|
|
61
|
-
prompt.close();
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
|
-
async function joinCommand(args) {
|
|
65
|
-
const code = args[0]?.trim();
|
|
66
|
-
if (!code) {
|
|
67
|
-
console.error("usage: negotium-otium join <invite-code> [--yes] [--name <node-name>] [--legacy] [--replace]");
|
|
68
|
-
process.exitCode = 1;
|
|
69
|
-
return;
|
|
70
|
-
}
|
|
71
|
-
let join;
|
|
72
|
-
let productionEnrollment = false;
|
|
73
|
-
if (args.includes("--legacy")) {
|
|
74
|
-
try {
|
|
75
|
-
join = parseInviteCode(code);
|
|
76
|
-
} catch (err) {
|
|
77
|
-
console.error(`invalid legacy invite code: ${err instanceof Error ? err.message : err}`);
|
|
78
|
-
process.exitCode = 1;
|
|
79
|
-
return;
|
|
80
|
-
}
|
|
81
|
-
} else {
|
|
82
|
-
try {
|
|
83
|
-
const invite = parseEnrollmentInvite(code);
|
|
84
|
-
const resuming = isEnrollmentPending(invite);
|
|
85
|
-
let nodeName = option(args, "name");
|
|
86
|
-
if (resuming) {
|
|
87
|
-
console.log(`Resuming interrupted Otium enrollment with ${invite.central}`);
|
|
88
|
-
} else {
|
|
89
|
-
const preview = await previewEnrollment(invite);
|
|
90
|
-
const workspace = preview.preview?.workspace;
|
|
91
|
-
nodeName ||= preview.preview?.suggestedNodeName || undefined;
|
|
92
|
-
console.log(`Otium workspace: ${workspace?.name ?? workspace?.slug ?? workspace?.id}`);
|
|
93
|
-
console.log(` central: ${invite.central}`);
|
|
94
|
-
console.log(` transport: ${preview.preview?.transport ?? "relay"}`);
|
|
95
|
-
console.log(` access: ${preview.preview?.topics ?? "explicitly shared topics only"}`);
|
|
96
|
-
const accepted = args.includes("--yes") || await confirmEnrollment("Join this workspace?");
|
|
97
|
-
if (!accepted) {
|
|
98
|
-
console.log("enrollment cancelled");
|
|
99
|
-
return;
|
|
100
|
-
}
|
|
101
|
-
}
|
|
102
|
-
join = await claimEnrollment(invite, nodeName);
|
|
103
|
-
productionEnrollment = true;
|
|
104
|
-
} catch (err) {
|
|
105
|
-
console.error(`enrollment failed: ${err instanceof Error ? err.message : err}`);
|
|
106
|
-
process.exitCode = 1;
|
|
107
|
-
return;
|
|
108
|
-
}
|
|
109
|
-
}
|
|
110
|
-
let path;
|
|
111
|
-
try {
|
|
112
|
-
const saveOptions = { replaceExisting: args.includes("--replace") };
|
|
113
|
-
path = productionEnrollment ? commitEnrollment(join, saveOptions) : saveJoin(join, saveOptions);
|
|
114
|
-
} catch (err) {
|
|
115
|
-
console.error(`could not save join credentials: ${err instanceof Error ? err.message : err}`);
|
|
116
|
-
process.exitCode = 1;
|
|
117
|
-
return;
|
|
118
|
-
}
|
|
119
|
-
console.log(`otium join credentials saved to ${path}`);
|
|
120
|
-
console.log(` central: ${join.central}`);
|
|
121
|
-
console.log(` cellId: ${join.cellId}`);
|
|
122
|
-
configureOtiumCentral(join);
|
|
123
|
-
try {
|
|
124
|
-
const self = await selfPeerNode();
|
|
125
|
-
if (self) {
|
|
126
|
-
console.log(`attached to workspace as "${self.nodeName ?? self.cellId}" (baseUrl ${self.baseUrl})`);
|
|
127
|
-
} else {
|
|
128
|
-
console.warn("warning: central answered but this cell has no visible assignment yet \u2014 check the workspace assignment");
|
|
129
|
-
}
|
|
130
|
-
} catch (err) {
|
|
131
|
-
console.warn(`warning: could not verify against central (${err instanceof Error ? err.message : err}) \u2014 credentials saved anyway`);
|
|
132
|
-
} finally {
|
|
133
|
-
configureOtiumCentral(null);
|
|
134
|
-
}
|
|
135
|
-
console.log("\nnext: `negotium-otium serve` (mounts the otium peer routes automatically)");
|
|
136
|
-
}
|
|
137
|
-
export {
|
|
138
|
-
joinCommand
|
|
139
|
-
};
|
|
140
|
-
|
|
141
|
-
//# debugId=2889F5B123EC294564756E2164756E21
|
|
@@ -1,10 +0,0 @@
|
|
|
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": "2889F5B123EC294564756E2164756E21",
|
|
9
|
-
"names": []
|
|
10
|
-
}
|