@shardworks/nexus 0.1.152 → 0.1.154

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.
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/commands/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAOlE,qFAAqF;AACrF,eAAO,MAAM,iBAAiB,EASzB,cAAc,EAAE,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/commands/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AASlE,qFAAqF;AACrF,eAAO,MAAM,iBAAiB,EAWzB,cAAc,EAAE,CAAC"}
@@ -12,6 +12,8 @@ import init from "./init.js";
12
12
  import version from "./version.js";
13
13
  import status from "./status.js";
14
14
  import upgrade from "./upgrade.js";
15
+ import start from "./start.js";
16
+ import stop from "./stop.js";
15
17
  import { pluginList, pluginInstall, pluginRemove, pluginUpgrade } from "./plugin.js";
16
18
  /** All framework commands, typed as the base ToolDefinition for uniform handling. */
17
19
  export const frameworkCommands = [
@@ -19,6 +21,8 @@ export const frameworkCommands = [
19
21
  version,
20
22
  status,
21
23
  upgrade,
24
+ start,
25
+ stop,
22
26
  pluginList,
23
27
  pluginInstall,
24
28
  pluginRemove,
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/commands/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAGH,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,OAAO,MAAM,cAAc,CAAC;AACnC,OAAO,MAAM,MAAM,aAAa,CAAC;AACjC,OAAO,OAAO,MAAM,cAAc,CAAC;AACnC,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAErF,qFAAqF;AACrF,MAAM,CAAC,MAAM,iBAAiB,GAAG;IAC/B,IAAI;IACJ,OAAO;IACP,MAAM;IACN,OAAO;IACP,UAAU;IACV,aAAa;IACb,YAAY;IACZ,aAAa;CACM,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/commands/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAGH,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,OAAO,MAAM,cAAc,CAAC;AACnC,OAAO,MAAM,MAAM,aAAa,CAAC;AACjC,OAAO,OAAO,MAAM,cAAc,CAAC;AACnC,OAAO,KAAK,MAAM,YAAY,CAAC;AAC/B,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAErF,qFAAqF;AACrF,MAAM,CAAC,MAAM,iBAAiB,GAAG;IAC/B,IAAI;IACJ,OAAO;IACP,MAAM;IACN,OAAO;IACP,KAAK;IACL,IAAI;IACJ,UAAU;IACV,aAAa;IACb,YAAY;IACZ,aAAa;CACM,CAAC"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * nsg start — guild daemon mode.
3
+ *
4
+ * Two modes selected by --foreground / -f:
5
+ *
6
+ * - **Detached (default):** spawns the same `nsg` binary with `--foreground`
7
+ * added, fully detached from this terminal, with stdio piped to
8
+ * `.nexus/logs/daemon.{out,err}`. Returns once startup-sync confirms the
9
+ * tool HTTP server is reachable.
10
+ *
11
+ * - **Foreground (`--foreground` / `-f`):** the inline daemon loop. Boots the
12
+ * guild, starts the Tool HTTP Server (with a Stacks-backed authorize
13
+ * closure), starts the Oculus, runs the Spider continual crawl loop, writes
14
+ * the pidfile, installs SIGTERM/SIGINT handlers, and blocks forever.
15
+ *
16
+ * The foreground mode IS the daemon — there is no separate daemon entry
17
+ * point. `nsg start` (detached) just re-execs itself with --foreground.
18
+ *
19
+ * The pidfile lives at `.nexus/daemon.pid` relative to the guild home.
20
+ * See: docs/architecture/detached-sessions.md, .scratch/nsg-daemon-mode-brief.md
21
+ */
22
+ import { z } from 'zod';
23
+ declare const _default: import("@shardworks/tools-apparatus").ToolDefinition<{
24
+ foreground: z.ZodOptional<z.ZodBoolean>;
25
+ }>;
26
+ export default _default;
27
+ //# sourceMappingURL=start.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"start.d.ts","sourceRoot":"","sources":["../../src/commands/start.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAMH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;;;;AAgUxB,wBA4BG"}
@@ -0,0 +1,305 @@
1
+ /**
2
+ * nsg start — guild daemon mode.
3
+ *
4
+ * Two modes selected by --foreground / -f:
5
+ *
6
+ * - **Detached (default):** spawns the same `nsg` binary with `--foreground`
7
+ * added, fully detached from this terminal, with stdio piped to
8
+ * `.nexus/logs/daemon.{out,err}`. Returns once startup-sync confirms the
9
+ * tool HTTP server is reachable.
10
+ *
11
+ * - **Foreground (`--foreground` / `-f`):** the inline daemon loop. Boots the
12
+ * guild, starts the Tool HTTP Server (with a Stacks-backed authorize
13
+ * closure), starts the Oculus, runs the Spider continual crawl loop, writes
14
+ * the pidfile, installs SIGTERM/SIGINT handlers, and blocks forever.
15
+ *
16
+ * The foreground mode IS the daemon — there is no separate daemon entry
17
+ * point. `nsg start` (detached) just re-execs itself with --foreground.
18
+ *
19
+ * The pidfile lives at `.nexus/daemon.pid` relative to the guild home.
20
+ * See: docs/architecture/detached-sessions.md, .scratch/nsg-daemon-mode-brief.md
21
+ */
22
+ import fs from 'node:fs';
23
+ import path from 'node:path';
24
+ import { spawn } from 'node:child_process';
25
+ import { z } from 'zod';
26
+ import { tool } from '@shardworks/tools-apparatus';
27
+ import { guild } from '@shardworks/nexus-core';
28
+ // ── Filesystem layout helpers ────────────────────────────────────────
29
+ function paths(home) {
30
+ const nexusDir = path.join(home, '.nexus');
31
+ return {
32
+ nexusDir,
33
+ pidFile: path.join(nexusDir, 'daemon.pid'),
34
+ logsDir: path.join(nexusDir, 'logs'),
35
+ outLog: path.join(nexusDir, 'logs', 'daemon.out'),
36
+ errLog: path.join(nexusDir, 'logs', 'daemon.err'),
37
+ };
38
+ }
39
+ function isProcessAlive(pid) {
40
+ try {
41
+ process.kill(pid, 0);
42
+ return true;
43
+ }
44
+ catch (err) {
45
+ const code = err.code;
46
+ if (code === 'ESRCH')
47
+ return false;
48
+ // EPERM → exists but we can't signal it. Treat as alive.
49
+ return true;
50
+ }
51
+ }
52
+ function readPidFile(pidFile) {
53
+ try {
54
+ const raw = fs.readFileSync(pidFile, 'utf-8').trim();
55
+ const pid = Number(raw);
56
+ return Number.isFinite(pid) && pid > 0 ? pid : null;
57
+ }
58
+ catch {
59
+ return null;
60
+ }
61
+ }
62
+ function tryUnlink(file) {
63
+ try {
64
+ fs.unlinkSync(file);
65
+ }
66
+ catch {
67
+ // ignore
68
+ }
69
+ }
70
+ function tailFile(file, lines) {
71
+ try {
72
+ const content = fs.readFileSync(file, 'utf-8');
73
+ const all = content.split('\n');
74
+ return all.slice(-lines).join('\n');
75
+ }
76
+ catch {
77
+ return '';
78
+ }
79
+ }
80
+ // ── Detached mode — spawn self with --foreground ─────────────────────
81
+ async function startDetached(home) {
82
+ const p = paths(home);
83
+ // Idempotency: already-running check.
84
+ const existing = readPidFile(p.pidFile);
85
+ if (existing && isProcessAlive(existing)) {
86
+ return `Guild daemon already running (pid: ${existing})`;
87
+ }
88
+ if (existing && !isProcessAlive(existing)) {
89
+ tryUnlink(p.pidFile);
90
+ }
91
+ fs.mkdirSync(p.logsDir, { recursive: true });
92
+ const outFd = fs.openSync(p.outLog, 'a');
93
+ const errFd = fs.openSync(p.errLog, 'a');
94
+ // Re-exec the same nsg entry point with --foreground appended.
95
+ // process.execPath is node, process.argv[1] is the cli.ts (or compiled
96
+ // cli.js) entry — same one Commander dispatched us from.
97
+ const nodeArgs = process.execArgv.slice();
98
+ const cliEntry = process.argv[1];
99
+ const child = spawn(process.execPath, [...nodeArgs, cliEntry, 'start', '--foreground', '--guild-root', home], {
100
+ detached: true,
101
+ stdio: ['ignore', outFd, errFd],
102
+ cwd: home,
103
+ env: process.env,
104
+ });
105
+ child.unref();
106
+ // Startup sync: poll for pidfile existence + tool server reachability.
107
+ const deadline = Date.now() + 10_000;
108
+ let lastError = '';
109
+ while (Date.now() < deadline) {
110
+ const pid = readPidFile(p.pidFile);
111
+ if (pid && isProcessAlive(pid)) {
112
+ const reached = await pingToolServer(home);
113
+ if (reached.ok) {
114
+ const oculusUrl = await guessOculusUrl(home);
115
+ return [
116
+ `Guild daemon started (pid: ${pid})`,
117
+ ` Tool HTTP Server: ${reached.url}`,
118
+ ` Oculus: ${oculusUrl ?? '(starting)'}`,
119
+ ` Spider: crawling (continual mode)`,
120
+ ` Logs: ${path.relative(home, p.outLog)}, ${path.relative(home, p.errLog)}`,
121
+ ].join('\n');
122
+ }
123
+ lastError = reached.error;
124
+ }
125
+ await new Promise((r) => setTimeout(r, 250));
126
+ }
127
+ // Startup failed. Tail the err log to help debugging.
128
+ const tail = tailFile(p.errLog, 20);
129
+ const msg = [
130
+ 'Guild daemon failed to start within 10s.',
131
+ lastError ? `Last error: ${lastError}` : '',
132
+ tail ? `\n--- last 20 lines of ${path.relative(home, p.errLog)} ---\n${tail}` : '',
133
+ ].filter(Boolean).join('\n');
134
+ throw new Error(msg);
135
+ }
136
+ async function pingToolServer(home) {
137
+ // Best-effort port discovery — read guild.json tools.serverPort if present.
138
+ const port = readToolServerPort(home);
139
+ const url = `http://127.0.0.1:${port}`;
140
+ try {
141
+ const res = await fetch(`${url}/api/tools/list`);
142
+ if (res.ok)
143
+ return { ok: true, url };
144
+ return { ok: false, error: `HTTP ${res.status}` };
145
+ }
146
+ catch (err) {
147
+ return { ok: false, error: err instanceof Error ? err.message : String(err) };
148
+ }
149
+ }
150
+ function readToolServerPort(home) {
151
+ try {
152
+ const raw = fs.readFileSync(path.join(home, 'guild.json'), 'utf-8');
153
+ const cfg = JSON.parse(raw);
154
+ return cfg.tools?.serverPort ?? 7471;
155
+ }
156
+ catch {
157
+ return 7471;
158
+ }
159
+ }
160
+ async function guessOculusUrl(home) {
161
+ try {
162
+ const raw = fs.readFileSync(path.join(home, 'guild.json'), 'utf-8');
163
+ const cfg = JSON.parse(raw);
164
+ const port = cfg.oculus?.port ?? 7470;
165
+ return `http://127.0.0.1:${port}`;
166
+ }
167
+ catch {
168
+ return null;
169
+ }
170
+ }
171
+ // ── Foreground mode — the inline daemon loop ────────────────────────
172
+ async function startForeground(home) {
173
+ const p = paths(home);
174
+ // Idempotency: refuse to double-start.
175
+ const existing = readPidFile(p.pidFile);
176
+ if (existing && isProcessAlive(existing)) {
177
+ throw new Error(`Guild daemon already running (pid: ${existing})`);
178
+ }
179
+ if (existing)
180
+ tryUnlink(p.pidFile);
181
+ fs.mkdirSync(p.nexusDir, { recursive: true });
182
+ // The guild is already booted by program.ts before any tool handler runs.
183
+ const g = guild();
184
+ // Build the Stacks-backed authorize closure for the tool server.
185
+ // Looks up the session by id and checks its authorizedTools list.
186
+ const stacks = g.apparatus('stacks');
187
+ const sessionsBook = stacks.book('animator', 'sessions');
188
+ const authorize = async (sessionId, toolName) => {
189
+ const doc = await sessionsBook.get(sessionId);
190
+ if (!doc)
191
+ return false;
192
+ if (doc.status !== 'pending' && doc.status !== 'running')
193
+ return false;
194
+ return doc.authorizedTools?.includes(toolName) ?? false;
195
+ };
196
+ // Start the Tool HTTP Server.
197
+ const tools = g.apparatus('tools');
198
+ const toolServer = await tools.startToolServer({ authorize });
199
+ console.log(`[daemon] Tool HTTP Server listening at ${toolServer.url}`);
200
+ // Start the Oculus HTTP server (best-effort — only if installed).
201
+ let oculusUrl = null;
202
+ try {
203
+ const oculus = g.apparatus('oculus');
204
+ await oculus.startServer();
205
+ oculusUrl = `http://127.0.0.1:${oculus.port()}`;
206
+ console.log(`[daemon] Oculus listening at ${oculusUrl}`);
207
+ }
208
+ catch {
209
+ console.warn('[daemon] Oculus not installed — skipping');
210
+ }
211
+ // Write the pidfile now that the servers are up.
212
+ fs.writeFileSync(p.pidFile, String(process.pid), 'utf-8');
213
+ // ── Shutdown wiring ────────────────────────────────────────────────
214
+ let shuttingDown = false;
215
+ let spiderStop = false;
216
+ const shutdown = async (signal) => {
217
+ if (shuttingDown)
218
+ return;
219
+ shuttingDown = true;
220
+ console.log(`[daemon] ${signal} received — shutting down...`);
221
+ spiderStop = true;
222
+ try {
223
+ await toolServer.close();
224
+ }
225
+ catch (err) {
226
+ console.warn(`[daemon] tool server close failed: ${err instanceof Error ? err.message : err}`);
227
+ }
228
+ // Oculus has no documented stop hook today — best effort: leave the
229
+ // process exit to tear it down. (TODO: when oculus exposes stop(), call it.)
230
+ tryUnlink(p.pidFile);
231
+ console.log('[daemon] stopped');
232
+ process.exit(0);
233
+ };
234
+ process.on('SIGTERM', () => { void shutdown('SIGTERM'); });
235
+ process.on('SIGINT', () => { void shutdown('SIGINT'); });
236
+ console.log('[daemon] Guild daemon ready');
237
+ console.log(` Tool HTTP Server: ${toolServer.url}`);
238
+ if (oculusUrl)
239
+ console.log(` Oculus: ${oculusUrl}`);
240
+ console.log(` Spider: crawling (continual mode)`);
241
+ console.log(` Pidfile: ${path.relative(home, p.pidFile)}`);
242
+ // ── Spider continual crawl loop ────────────────────────────────────
243
+ //
244
+ // This is what keeps the daemon alive. If the Spider isn't installed,
245
+ // we still run a sleep loop so the tool/oculus servers stay up.
246
+ let spider = null;
247
+ let intervalMs = 5000;
248
+ try {
249
+ spider = g.apparatus('spider');
250
+ const spiderCfg = g.guildConfig().spider ?? {};
251
+ intervalMs = spiderCfg.pollIntervalMs ?? 5000;
252
+ }
253
+ catch {
254
+ console.warn('[daemon] Spider not installed — running idle (servers only)');
255
+ }
256
+ while (!spiderStop) {
257
+ if (spider) {
258
+ try {
259
+ const result = await spider.crawl();
260
+ if (result === null) {
261
+ await new Promise((r) => setTimeout(r, intervalMs));
262
+ }
263
+ }
264
+ catch (err) {
265
+ console.error(`[daemon] crawl() error: ${err instanceof Error ? err.message : err}`);
266
+ await new Promise((r) => setTimeout(r, intervalMs));
267
+ }
268
+ }
269
+ else {
270
+ await new Promise((r) => setTimeout(r, intervalMs));
271
+ }
272
+ }
273
+ // Unreachable — shutdown() exits the process.
274
+ return new Promise(() => { });
275
+ }
276
+ // ── Tool definition ──────────────────────────────────────────────────
277
+ export default tool({
278
+ name: 'start',
279
+ description: 'Start the guild daemon (tool server + oculus + spider crawl loop)',
280
+ callableBy: ['patron'],
281
+ params: {
282
+ foreground: z
283
+ .boolean()
284
+ .optional()
285
+ .describe('Run in foreground (the inline daemon loop). Default: detached.'),
286
+ },
287
+ handler: async (params) => {
288
+ // The guild is booted by program.ts before this handler runs, so the
289
+ // singleton already knows the home directory.
290
+ let home;
291
+ try {
292
+ home = guild().home;
293
+ }
294
+ catch {
295
+ throw new Error('Not inside a guild. Run `nsg init` to create one first.');
296
+ }
297
+ if (params.foreground) {
298
+ await startForeground(home);
299
+ // startForeground never returns under normal operation.
300
+ return '';
301
+ }
302
+ return startDetached(home);
303
+ },
304
+ });
305
+ //# sourceMappingURL=start.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"start.js","sourceRoot":"","sources":["../../src/commands/start.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * nsg stop — terminate the guild daemon.
3
+ *
4
+ * Reads `.nexus/daemon.pid`, sends SIGTERM, polls for exit, and escalates
5
+ * to SIGKILL if the process is still alive after 10s. Removes the pidfile
6
+ * after the process is gone.
7
+ *
8
+ * In-flight detached anima sessions (babysitter processes) are unaffected:
9
+ * they were spawned with `detached: true` and have their own lifecycle. Only
10
+ * the daemon process itself (tool server, oculus, spider crawl loop) stops.
11
+ */
12
+ import { z } from 'zod';
13
+ declare const _default: import("@shardworks/tools-apparatus").ToolDefinition<{
14
+ timeoutMs: z.ZodOptional<z.ZodNumber>;
15
+ }>;
16
+ export default _default;
17
+ //# sourceMappingURL=stop.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stop.d.ts","sourceRoot":"","sources":["../../src/commands/stop.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAKH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;;;;AA0CxB,wBA0DG"}
@@ -0,0 +1,111 @@
1
+ /**
2
+ * nsg stop — terminate the guild daemon.
3
+ *
4
+ * Reads `.nexus/daemon.pid`, sends SIGTERM, polls for exit, and escalates
5
+ * to SIGKILL if the process is still alive after 10s. Removes the pidfile
6
+ * after the process is gone.
7
+ *
8
+ * In-flight detached anima sessions (babysitter processes) are unaffected:
9
+ * they were spawned with `detached: true` and have their own lifecycle. Only
10
+ * the daemon process itself (tool server, oculus, spider crawl loop) stops.
11
+ */
12
+ import fs from 'node:fs';
13
+ import path from 'node:path';
14
+ import { z } from 'zod';
15
+ import { tool } from '@shardworks/tools-apparatus';
16
+ import { guild } from '@shardworks/nexus-core';
17
+ function isProcessAlive(pid) {
18
+ try {
19
+ process.kill(pid, 0);
20
+ return true;
21
+ }
22
+ catch (err) {
23
+ const code = err.code;
24
+ if (code === 'ESRCH')
25
+ return false;
26
+ return true;
27
+ }
28
+ }
29
+ function readPidFile(pidFile) {
30
+ try {
31
+ const raw = fs.readFileSync(pidFile, 'utf-8').trim();
32
+ const pid = Number(raw);
33
+ return Number.isFinite(pid) && pid > 0 ? pid : null;
34
+ }
35
+ catch {
36
+ return null;
37
+ }
38
+ }
39
+ function tryUnlink(file) {
40
+ try {
41
+ fs.unlinkSync(file);
42
+ }
43
+ catch {
44
+ // ignore
45
+ }
46
+ }
47
+ async function waitForExit(pid, timeoutMs) {
48
+ const deadline = Date.now() + timeoutMs;
49
+ while (Date.now() < deadline) {
50
+ if (!isProcessAlive(pid))
51
+ return true;
52
+ await new Promise((r) => setTimeout(r, 200));
53
+ }
54
+ return false;
55
+ }
56
+ export default tool({
57
+ name: 'stop',
58
+ description: 'Stop the guild daemon (graceful SIGTERM with SIGKILL escalation)',
59
+ callableBy: ['patron'],
60
+ params: {
61
+ timeoutMs: z
62
+ .number()
63
+ .optional()
64
+ .describe('How long to wait for graceful shutdown before SIGKILL (default: 10000)'),
65
+ },
66
+ handler: async (params) => {
67
+ let home;
68
+ try {
69
+ home = guild().home;
70
+ }
71
+ catch {
72
+ throw new Error('Not inside a guild.');
73
+ }
74
+ const pidFile = path.join(home, '.nexus', 'daemon.pid');
75
+ const pid = readPidFile(pidFile);
76
+ if (pid === null) {
77
+ return 'No guild daemon running (no pidfile).';
78
+ }
79
+ if (!isProcessAlive(pid)) {
80
+ tryUnlink(pidFile);
81
+ return `Stale pidfile removed (pid ${pid} was not alive).`;
82
+ }
83
+ // Send SIGTERM and poll.
84
+ try {
85
+ process.kill(pid, 'SIGTERM');
86
+ }
87
+ catch (err) {
88
+ throw new Error(`Failed to signal pid ${pid}: ${err instanceof Error ? err.message : err}`);
89
+ }
90
+ const timeoutMs = params.timeoutMs ?? 10_000;
91
+ const exited = await waitForExit(pid, timeoutMs);
92
+ if (!exited) {
93
+ // Escalate.
94
+ try {
95
+ process.kill(pid, 'SIGKILL');
96
+ }
97
+ catch {
98
+ // already dead
99
+ }
100
+ const killed = await waitForExit(pid, 2000);
101
+ tryUnlink(pidFile);
102
+ if (!killed) {
103
+ throw new Error(`Daemon (pid ${pid}) did not exit even after SIGKILL.`);
104
+ }
105
+ return `Guild daemon stopped (pid: ${pid}, escalated to SIGKILL after ${timeoutMs}ms).`;
106
+ }
107
+ tryUnlink(pidFile);
108
+ return `Guild daemon stopped (pid: ${pid}).`;
109
+ },
110
+ });
111
+ //# sourceMappingURL=stop.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stop.js","sourceRoot":"","sources":["../../src/commands/stop.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@shardworks/nexus",
3
- "version": "0.1.152",
3
+ "version": "0.1.154",
4
4
  "license": "ISC",
5
5
  "repository": {
6
6
  "type": "git",
@@ -21,9 +21,9 @@
21
21
  "dependencies": {
22
22
  "commander": "14.0.3",
23
23
  "zod": "4.3.6",
24
- "@shardworks/nexus-core": "0.1.152",
25
- "@shardworks/nexus-arbor": "0.1.152",
26
- "@shardworks/tools-apparatus": "0.1.152"
24
+ "@shardworks/nexus-core": "0.1.154",
25
+ "@shardworks/nexus-arbor": "0.1.154",
26
+ "@shardworks/tools-apparatus": "0.1.154"
27
27
  },
28
28
  "devDependencies": {
29
29
  "@types/node": "25.5.0"