regionclaw 0.0.3 → 0.0.4

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 (117) hide show
  1. package/README.md +15 -0
  2. package/apps/ui/regionclaw-build/BUILD_ID +1 -1
  3. package/apps/ui/regionclaw-build/app-path-routes-manifest.json +2 -0
  4. package/apps/ui/regionclaw-build/build-manifest.json +2 -2
  5. package/apps/ui/regionclaw-build/prerender-manifest.json +0 -48
  6. package/apps/ui/regionclaw-build/routes-manifest.json +12 -0
  7. package/apps/ui/regionclaw-build/server/app/(app)/dashboard/page.js +3 -3
  8. package/apps/ui/regionclaw-build/server/app/(app)/dashboard/page_client-reference-manifest.js +1 -1
  9. package/apps/ui/regionclaw-build/server/app/_global-error/page.js +3 -3
  10. package/apps/ui/regionclaw-build/server/app/_global-error/page_client-reference-manifest.js +1 -1
  11. package/apps/ui/regionclaw-build/server/app/_global-error.html +1 -1
  12. package/apps/ui/regionclaw-build/server/app/_global-error.rsc +1 -1
  13. package/apps/ui/regionclaw-build/server/app/_global-error.segments/_full.segment.rsc +1 -1
  14. package/apps/ui/regionclaw-build/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  15. package/apps/ui/regionclaw-build/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  16. package/apps/ui/regionclaw-build/server/app/_global-error.segments/_head.segment.rsc +1 -1
  17. package/apps/ui/regionclaw-build/server/app/_global-error.segments/_index.segment.rsc +1 -1
  18. package/apps/ui/regionclaw-build/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  19. package/apps/ui/regionclaw-build/server/app/_not-found/page.js +2 -2
  20. package/apps/ui/regionclaw-build/server/app/_not-found/page_client-reference-manifest.js +1 -1
  21. package/apps/ui/regionclaw-build/server/app/_not-found.html +1 -1
  22. package/apps/ui/regionclaw-build/server/app/_not-found.rsc +4 -4
  23. package/apps/ui/regionclaw-build/server/app/_not-found.segments/_full.segment.rsc +4 -4
  24. package/apps/ui/regionclaw-build/server/app/_not-found.segments/_head.segment.rsc +1 -1
  25. package/apps/ui/regionclaw-build/server/app/_not-found.segments/_index.segment.rsc +4 -4
  26. package/apps/ui/regionclaw-build/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  27. package/apps/ui/regionclaw-build/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  28. package/apps/ui/regionclaw-build/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  29. package/apps/ui/regionclaw-build/server/app/api/auth/[...nextauth]/route.js +1 -1
  30. package/apps/ui/regionclaw-build/server/app/api/auth/first-run/route.js +1 -1
  31. package/apps/ui/regionclaw-build/server/app/api/trpc/[trpc]/route.js +2 -2
  32. package/apps/ui/regionclaw-build/server/app/api/update/run/route.js +1 -0
  33. package/apps/ui/regionclaw-build/server/app/api/update/run/route.js.nft.json +1 -0
  34. package/apps/ui/regionclaw-build/server/app/api/update/run/route_client-reference-manifest.js +1 -0
  35. package/apps/ui/regionclaw-build/server/app/api/update/status/route.js +1 -0
  36. package/apps/ui/regionclaw-build/server/app/api/update/status/route.js.nft.json +1 -0
  37. package/apps/ui/regionclaw-build/server/app/api/update/status/route_client-reference-manifest.js +1 -0
  38. package/apps/ui/regionclaw-build/server/app/favicon.ico/route.js +1 -1
  39. package/apps/ui/regionclaw-build/server/app/login/page.js +2 -2
  40. package/apps/ui/regionclaw-build/server/app/login/page_client-reference-manifest.js +1 -1
  41. package/apps/ui/regionclaw-build/server/app/page.js +2 -2
  42. package/apps/ui/regionclaw-build/server/app/page_client-reference-manifest.js +1 -1
  43. package/apps/ui/regionclaw-build/server/app/setup/page.js +2 -2
  44. package/apps/ui/regionclaw-build/server/app/setup/page_client-reference-manifest.js +1 -1
  45. package/apps/ui/regionclaw-build/server/app-paths-manifest.json +2 -0
  46. package/apps/ui/regionclaw-build/server/chunks/263.js +2 -2
  47. package/apps/ui/regionclaw-build/server/chunks/324.js +1 -1
  48. package/apps/ui/regionclaw-build/server/chunks/902.js +3 -3
  49. package/apps/ui/regionclaw-build/server/middleware-build-manifest.js +1 -1
  50. package/apps/ui/regionclaw-build/server/pages/404.html +1 -1
  51. package/apps/ui/regionclaw-build/server/pages/500.html +1 -1
  52. package/apps/ui/regionclaw-build/static/ZSgRLh43NEMa5560KIFa0/_buildManifest.js +1 -0
  53. package/apps/ui/regionclaw-build/static/chunks/557-16373a4e3e7fff4a.js +1 -0
  54. package/apps/ui/regionclaw-build/static/chunks/609-413da697ed2385f4.js +1 -0
  55. package/apps/ui/regionclaw-build/static/chunks/{777-2c6a164314456938.js → 835-8d09234672e1cdbd.js} +2 -2
  56. package/apps/ui/regionclaw-build/static/chunks/app/(app)/dashboard/page-fdd3dce681b59047.js +1 -0
  57. package/apps/ui/regionclaw-build/static/chunks/app/(app)/layout-16f7ce76f7f41b68.js +1 -0
  58. package/apps/ui/regionclaw-build/static/chunks/app/_global-error/page-fdd3dce681b59047.js +1 -0
  59. package/apps/ui/regionclaw-build/static/chunks/app/api/auth/[...nextauth]/route-fdd3dce681b59047.js +1 -0
  60. package/apps/ui/regionclaw-build/static/chunks/app/api/auth/first-run/route-fdd3dce681b59047.js +1 -0
  61. package/apps/ui/regionclaw-build/static/chunks/app/api/trpc/[trpc]/route-fdd3dce681b59047.js +1 -0
  62. package/apps/ui/regionclaw-build/static/chunks/app/api/update/run/route-fdd3dce681b59047.js +1 -0
  63. package/apps/ui/regionclaw-build/static/chunks/app/api/update/status/route-fdd3dce681b59047.js +1 -0
  64. package/apps/ui/regionclaw-build/static/chunks/app/{layout-87ffd83df9489fc3.js → layout-812a5dd3c2548265.js} +1 -1
  65. package/apps/ui/regionclaw-build/static/chunks/app/page-fdd3dce681b59047.js +1 -0
  66. package/apps/ui/regionclaw-build/static/chunks/next/dist/client/components/builtin/app-error-fdd3dce681b59047.js +1 -0
  67. package/apps/ui/regionclaw-build/static/chunks/next/dist/client/components/builtin/forbidden-fdd3dce681b59047.js +1 -0
  68. package/apps/ui/regionclaw-build/static/chunks/next/dist/client/components/builtin/not-found-fdd3dce681b59047.js +1 -0
  69. package/apps/ui/regionclaw-build/static/chunks/next/dist/client/components/builtin/unauthorized-fdd3dce681b59047.js +1 -0
  70. package/apps/ui/regionclaw-build/types/app/api/update/run/route.ts +351 -0
  71. package/apps/ui/regionclaw-build/types/app/api/update/status/route.ts +351 -0
  72. package/apps/ui/regionclaw-build/types/link.d.ts +2 -0
  73. package/apps/ui/regionclaw-build/types/routes.d.ts +3 -1
  74. package/apps/ui/regionclaw-build/types/validator.ts +18 -0
  75. package/apps/ui/src/app/(app)/layout.tsx +7 -1
  76. package/apps/ui/src/app/api/update/run/route.ts +36 -0
  77. package/apps/ui/src/app/api/update/status/route.ts +24 -0
  78. package/apps/ui/src/components/app-layout-header.tsx +8 -2
  79. package/apps/ui/src/components/app-sidebar.tsx +3 -0
  80. package/apps/ui/src/components/regionclaw-update-banner.tsx +229 -0
  81. package/apps/ui/src/server/regionclaw-meta.ts +3 -0
  82. package/apps/ui/src/server/update-cli.ts +88 -0
  83. package/bin/regionclaw.js +357 -3
  84. package/package.json +1 -1
  85. package/scripts/restart-running-regionclaw.mjs +54 -0
  86. package/apps/ui/regionclaw-build/server/app/index.html +0 -1
  87. package/apps/ui/regionclaw-build/server/app/index.meta +0 -16
  88. package/apps/ui/regionclaw-build/server/app/index.rsc +0 -21
  89. package/apps/ui/regionclaw-build/server/app/index.segments/__PAGE__.segment.rsc +0 -6
  90. package/apps/ui/regionclaw-build/server/app/index.segments/_full.segment.rsc +0 -21
  91. package/apps/ui/regionclaw-build/server/app/index.segments/_head.segment.rsc +0 -6
  92. package/apps/ui/regionclaw-build/server/app/index.segments/_index.segment.rsc +0 -9
  93. package/apps/ui/regionclaw-build/server/app/index.segments/_tree.segment.rsc +0 -5
  94. package/apps/ui/regionclaw-build/server/app/login.html +0 -1
  95. package/apps/ui/regionclaw-build/server/app/login.meta +0 -17
  96. package/apps/ui/regionclaw-build/server/app/login.rsc +0 -23
  97. package/apps/ui/regionclaw-build/server/app/login.segments/_full.segment.rsc +0 -23
  98. package/apps/ui/regionclaw-build/server/app/login.segments/_head.segment.rsc +0 -6
  99. package/apps/ui/regionclaw-build/server/app/login.segments/_index.segment.rsc +0 -9
  100. package/apps/ui/regionclaw-build/server/app/login.segments/_tree.segment.rsc +0 -5
  101. package/apps/ui/regionclaw-build/server/app/login.segments/login/__PAGE__.segment.rsc +0 -6
  102. package/apps/ui/regionclaw-build/server/app/login.segments/login.segment.rsc +0 -5
  103. package/apps/ui/regionclaw-build/static/chunks/314-50a286a8a2defe3e.js +0 -1
  104. package/apps/ui/regionclaw-build/static/chunks/774-b72ba79217cd49b6.js +0 -1
  105. package/apps/ui/regionclaw-build/static/chunks/app/(app)/dashboard/page-ee954e3484be7e8f.js +0 -1
  106. package/apps/ui/regionclaw-build/static/chunks/app/(app)/layout-8c2cbeb73ce3441e.js +0 -1
  107. package/apps/ui/regionclaw-build/static/chunks/app/_global-error/page-ee954e3484be7e8f.js +0 -1
  108. package/apps/ui/regionclaw-build/static/chunks/app/api/auth/[...nextauth]/route-ee954e3484be7e8f.js +0 -1
  109. package/apps/ui/regionclaw-build/static/chunks/app/api/auth/first-run/route-ee954e3484be7e8f.js +0 -1
  110. package/apps/ui/regionclaw-build/static/chunks/app/api/trpc/[trpc]/route-ee954e3484be7e8f.js +0 -1
  111. package/apps/ui/regionclaw-build/static/chunks/app/page-ee954e3484be7e8f.js +0 -1
  112. package/apps/ui/regionclaw-build/static/chunks/next/dist/client/components/builtin/app-error-ee954e3484be7e8f.js +0 -1
  113. package/apps/ui/regionclaw-build/static/chunks/next/dist/client/components/builtin/forbidden-ee954e3484be7e8f.js +0 -1
  114. package/apps/ui/regionclaw-build/static/chunks/next/dist/client/components/builtin/not-found-ee954e3484be7e8f.js +0 -1
  115. package/apps/ui/regionclaw-build/static/chunks/next/dist/client/components/builtin/unauthorized-ee954e3484be7e8f.js +0 -1
  116. package/apps/ui/regionclaw-build/static/tx6PZf8zETvK0EvVfqK73/_buildManifest.js +0 -1
  117. /package/apps/ui/regionclaw-build/static/{tx6PZf8zETvK0EvVfqK73 → ZSgRLh43NEMa5560KIFa0}/_ssgManifest.js +0 -0
package/bin/regionclaw.js CHANGED
@@ -1,16 +1,22 @@
1
1
  #!/usr/bin/env node
2
2
 
3
- const { spawn } = require("node:child_process");
3
+ const { spawn, spawnSync } = require("node:child_process");
4
4
  const crypto = require("node:crypto");
5
5
  const fs = require("node:fs");
6
6
  const os = require("node:os");
7
7
  const path = require("node:path");
8
8
 
9
+ const packageRoot = path.join(__dirname, "..");
9
10
  const appDir = path.join(__dirname, "..", "apps", "ui");
10
11
  const stateDir = path.join(os.homedir(), ".regionclaw");
11
12
  const configFilePath = path.join(stateDir, "regionclaw.json");
12
13
  const packagedBuildDir = path.join(appDir, "regionclaw-build");
13
14
  const runtimeBuildDir = path.join(appDir, ".next");
15
+ const packageJson = JSON.parse(
16
+ fs.readFileSync(path.join(packageRoot, "package.json"), "utf8"),
17
+ );
18
+ const PACKAGE_NAME = packageJson.name || "regionclaw";
19
+ const PACKAGE_VERSION = packageJson.version || "0.0.0";
14
20
  const DEFAULT_PORT = 3180;
15
21
  const DEFAULT_HOST = "127.0.0.1";
16
22
 
@@ -24,9 +30,12 @@ function printHelp() {
24
30
  " npx regionclaw --dev",
25
31
  " npx regionclaw --port 3000",
26
32
  " npx regionclaw --host 127.0.0.1 --port 3000",
33
+ " regionclaw update",
34
+ " regionclaw update status",
27
35
  "",
28
36
  "Options:",
29
37
  " --dev Run in Next.js development mode",
38
+ " --json Print machine-readable JSON for update commands",
30
39
  " -p, --port <port> Port to bind. Default: regionclaw.json or 3180",
31
40
  " -H, --host <host> Hostname to bind. Default: regionclaw.json or 127.0.0.1",
32
41
  " -h, --help Show this help message",
@@ -37,20 +46,38 @@ function printHelp() {
37
46
 
38
47
  function parseArgs(argv) {
39
48
  const parsed = {
49
+ command: "start",
50
+ updateAction: "run",
40
51
  dev: false,
41
52
  port: undefined,
42
53
  host: undefined,
43
54
  help: false,
55
+ json: false,
44
56
  };
45
57
 
46
58
  for (let index = 0; index < argv.length; index += 1) {
47
59
  const value = argv[index];
48
60
 
61
+ if (index === 0 && value === "update") {
62
+ parsed.command = "update";
63
+ continue;
64
+ }
65
+
66
+ if (parsed.command === "update" && value === "status") {
67
+ parsed.updateAction = "status";
68
+ continue;
69
+ }
70
+
49
71
  if (value === "-h" || value === "--help") {
50
72
  parsed.help = true;
51
73
  continue;
52
74
  }
53
75
 
76
+ if (value === "--json") {
77
+ parsed.json = true;
78
+ continue;
79
+ }
80
+
54
81
  if (value === "--dev") {
55
82
  parsed.dev = true;
56
83
  continue;
@@ -72,6 +99,320 @@ function parseArgs(argv) {
72
99
  return parsed;
73
100
  }
74
101
 
102
+ function parseComparableVersion(value) {
103
+ const raw = String(value || "").trim();
104
+ const [mainPart, prereleasePart = ""] = raw.split("-", 2);
105
+ const parts = mainPart.split(".").map((part) => Number.parseInt(part, 10));
106
+ if (parts.length !== 3 || parts.some((part) => !Number.isFinite(part))) {
107
+ return null;
108
+ }
109
+
110
+ return {
111
+ parts,
112
+ prerelease: prereleasePart || null,
113
+ };
114
+ }
115
+
116
+ function compareVersions(a, b) {
117
+ const left = parseComparableVersion(a);
118
+ const right = parseComparableVersion(b);
119
+ if (!left || !right) {
120
+ return null;
121
+ }
122
+
123
+ for (let index = 0; index < 3; index += 1) {
124
+ const diff = left.parts[index] - right.parts[index];
125
+ if (diff !== 0) {
126
+ return diff;
127
+ }
128
+ }
129
+
130
+ if (left.prerelease === right.prerelease) {
131
+ return 0;
132
+ }
133
+ if (!left.prerelease) {
134
+ return 1;
135
+ }
136
+ if (!right.prerelease) {
137
+ return -1;
138
+ }
139
+ return left.prerelease.localeCompare(right.prerelease);
140
+ }
141
+
142
+ async function fetchLatestPackageVersion(tag = "latest") {
143
+ const response = await fetch(`https://registry.npmjs.org/${PACKAGE_NAME}/${tag}`, {
144
+ headers: {
145
+ accept: "application/json",
146
+ },
147
+ });
148
+
149
+ if (!response.ok) {
150
+ throw new Error(`npm registry request failed with ${response.status}`);
151
+ }
152
+
153
+ const payload = await response.json();
154
+ if (!payload || typeof payload.version !== "string") {
155
+ throw new Error("npm registry response did not include a version");
156
+ }
157
+
158
+ return payload.version;
159
+ }
160
+
161
+ function safeRealpath(targetPath) {
162
+ try {
163
+ return fs.realpathSync(targetPath);
164
+ } catch {
165
+ return path.resolve(targetPath);
166
+ }
167
+ }
168
+
169
+ function runCapturedCommand(command, args) {
170
+ const result = spawnSync(command, args, {
171
+ encoding: "utf8",
172
+ stdio: ["ignore", "pipe", "pipe"],
173
+ });
174
+
175
+ return {
176
+ ok: !result.error && result.status === 0,
177
+ status: result.status ?? null,
178
+ stdout: result.stdout ?? "",
179
+ stderr: result.stderr ?? "",
180
+ error: result.error ? String(result.error) : null,
181
+ };
182
+ }
183
+
184
+ function detectGlobalInstallManager() {
185
+ const packageRootReal = safeRealpath(packageRoot);
186
+
187
+ const candidates = [
188
+ { manager: "pnpm", command: "pnpm", args: ["root", "-g"] },
189
+ { manager: "npm", command: "npm", args: ["root", "-g"] },
190
+ ];
191
+
192
+ for (const candidate of candidates) {
193
+ const result = runCapturedCommand(candidate.command, candidate.args);
194
+ if (!result.ok) {
195
+ continue;
196
+ }
197
+
198
+ const globalRoot = result.stdout.trim();
199
+ if (!globalRoot) {
200
+ continue;
201
+ }
202
+
203
+ const installedPackageRoot = safeRealpath(path.join(globalRoot, PACKAGE_NAME));
204
+ if (installedPackageRoot === packageRootReal) {
205
+ return candidate.manager;
206
+ }
207
+ }
208
+
209
+ return null;
210
+ }
211
+
212
+ function detectInstallKind(globalManager) {
213
+ if (globalManager) {
214
+ return "global";
215
+ }
216
+
217
+ const currentRoot = safeRealpath(packageRoot);
218
+ const home = os.homedir();
219
+ const npxMarkers = [
220
+ path.join(home, ".npm", "_npx"),
221
+ path.join(home, "Library", "Caches", "pnpm", "dlx"),
222
+ path.join(home, ".local", "share", "pnpm", "dlx"),
223
+ path.join(home, ".bun"),
224
+ ];
225
+
226
+ if (npxMarkers.some((marker) => currentRoot.includes(marker))) {
227
+ return "npx";
228
+ }
229
+
230
+ return "local";
231
+ }
232
+
233
+ function buildRecommendedUpdateCommand(installKind, packageManager, version = "latest") {
234
+ const spec = `${PACKAGE_NAME}@${version}`;
235
+
236
+ if (installKind === "global" && packageManager === "pnpm") {
237
+ return `pnpm add -g ${spec}`;
238
+ }
239
+
240
+ if (installKind === "global") {
241
+ return `npm install -g ${spec}`;
242
+ }
243
+
244
+ if (installKind === "npx") {
245
+ return `npx --yes ${spec}`;
246
+ }
247
+
248
+ return null;
249
+ }
250
+
251
+ async function getUpdateStatus() {
252
+ const packageManager = detectGlobalInstallManager() || "unknown";
253
+ const installKind = detectInstallKind(packageManager === "unknown" ? null : packageManager);
254
+
255
+ try {
256
+ const latestVersion = await fetchLatestPackageVersion("latest");
257
+ const versionDiff = compareVersions(latestVersion, PACKAGE_VERSION);
258
+ const updateAvailable = versionDiff != null ? versionDiff > 0 : latestVersion !== PACKAGE_VERSION;
259
+
260
+ return {
261
+ ok: true,
262
+ packageName: PACKAGE_NAME,
263
+ currentVersion: PACKAGE_VERSION,
264
+ latestVersion,
265
+ updateAvailable,
266
+ installKind,
267
+ packageManager,
268
+ canUpdateInPlace: installKind === "global",
269
+ recommendedCommand: buildRecommendedUpdateCommand(installKind, packageManager),
270
+ };
271
+ } catch (error) {
272
+ return {
273
+ ok: false,
274
+ packageName: PACKAGE_NAME,
275
+ currentVersion: PACKAGE_VERSION,
276
+ latestVersion: null,
277
+ updateAvailable: false,
278
+ installKind,
279
+ packageManager,
280
+ canUpdateInPlace: false,
281
+ recommendedCommand: buildRecommendedUpdateCommand(installKind, packageManager),
282
+ error: error instanceof Error ? error.message : String(error),
283
+ };
284
+ }
285
+ }
286
+
287
+ function printJson(payload) {
288
+ process.stdout.write(`${JSON.stringify(payload, null, 2)}\n`);
289
+ }
290
+
291
+ function printUpdateStatus(status) {
292
+ if (!status.ok) {
293
+ process.stderr.write(
294
+ `Failed to check for RegionClaw updates: ${status.error || "unknown error"}\n`,
295
+ );
296
+ return;
297
+ }
298
+
299
+ process.stdout.write(`RegionClaw v${status.currentVersion}\n`);
300
+ process.stdout.write(`Latest: ${status.latestVersion}\n`);
301
+ process.stdout.write(`Install: ${status.installKind} (${status.packageManager})\n`);
302
+
303
+ if (!status.updateAvailable) {
304
+ process.stdout.write("RegionClaw is already up to date.\n");
305
+ return;
306
+ }
307
+
308
+ process.stdout.write(`Update available: v${status.latestVersion}\n`);
309
+ if (status.recommendedCommand) {
310
+ process.stdout.write(`Run: ${status.recommendedCommand}\n`);
311
+ }
312
+ }
313
+
314
+ function runInstallCommand(command, args) {
315
+ const result = spawnSync(command, args, {
316
+ encoding: "utf8",
317
+ stdio: ["ignore", "pipe", "pipe"],
318
+ });
319
+
320
+ return {
321
+ ok: !result.error && result.status === 0,
322
+ status: result.status ?? null,
323
+ stdout: result.stdout ?? "",
324
+ stderr: result.stderr ?? "",
325
+ error: result.error ? String(result.error) : null,
326
+ };
327
+ }
328
+
329
+ async function runUpdateAction(args) {
330
+ const status = await getUpdateStatus();
331
+
332
+ if (args.updateAction === "status") {
333
+ if (args.json) {
334
+ printJson(status);
335
+ return status.ok ? 0 : 1;
336
+ }
337
+
338
+ printUpdateStatus(status);
339
+ return status.ok ? 0 : 1;
340
+ }
341
+
342
+ if (!status.ok) {
343
+ const result = {
344
+ ...status,
345
+ status: "error",
346
+ message: status.error || "Failed to check for updates.",
347
+ };
348
+ if (args.json) {
349
+ printJson(result);
350
+ } else {
351
+ process.stderr.write(`${result.message}\n`);
352
+ }
353
+ return 1;
354
+ }
355
+
356
+ if (!status.updateAvailable) {
357
+ const result = {
358
+ ...status,
359
+ status: "already-current",
360
+ message: `RegionClaw is already on v${status.currentVersion}.`,
361
+ };
362
+ if (args.json) {
363
+ printJson(result);
364
+ } else {
365
+ process.stdout.write(`${result.message}\n`);
366
+ }
367
+ return 0;
368
+ }
369
+
370
+ if (!status.canUpdateInPlace) {
371
+ const result = {
372
+ ...status,
373
+ status: "manual",
374
+ message: status.recommendedCommand
375
+ ? `This install cannot self-update in place. Run: ${status.recommendedCommand}`
376
+ : "This install cannot self-update in place.",
377
+ requiresRestart: false,
378
+ };
379
+ if (args.json) {
380
+ printJson(result);
381
+ } else {
382
+ process.stdout.write(`${result.message}\n`);
383
+ }
384
+ return 0;
385
+ }
386
+
387
+ const installArgs =
388
+ status.packageManager === "pnpm"
389
+ ? ["add", "-g", `${PACKAGE_NAME}@latest`]
390
+ : ["install", "-g", `${PACKAGE_NAME}@latest`, "--no-fund", "--no-audit", "--loglevel=error"];
391
+ const command = status.packageManager === "pnpm" ? "pnpm" : "npm";
392
+ const install = runInstallCommand(command, installArgs);
393
+ const result = {
394
+ ...status,
395
+ status: install.ok ? "updated" : "error",
396
+ requiresRestart: install.ok,
397
+ message: install.ok
398
+ ? `RegionClaw updated to v${status.latestVersion}. Restart RegionClaw to use the new version.`
399
+ : install.error || install.stderr.trim() || `Update command exited with ${install.status ?? "unknown"}.`,
400
+ command: `${command} ${installArgs.join(" ")}`,
401
+ stdout: install.stdout.trim() || null,
402
+ stderr: install.stderr.trim() || null,
403
+ };
404
+
405
+ if (args.json) {
406
+ printJson(result);
407
+ } else if (install.ok) {
408
+ process.stdout.write(`${result.message}\n`);
409
+ } else {
410
+ process.stderr.write(`${result.message}\n`);
411
+ }
412
+
413
+ return install.ok ? 0 : 1;
414
+ }
415
+
75
416
  function defaultConfig() {
76
417
  return {
77
418
  meta: {
@@ -132,13 +473,18 @@ function ensureProductionBuild() {
132
473
  fs.cpSync(packagedBuildDir, runtimeBuildDir, { recursive: true });
133
474
  }
134
475
 
135
- function main() {
476
+ async function main() {
136
477
  const args = parseArgs(process.argv.slice(2));
137
478
  if (args.help) {
138
479
  printHelp();
139
480
  return;
140
481
  }
141
482
 
483
+ if (args.command === "update") {
484
+ process.exitCode = await runUpdateAction(args);
485
+ return;
486
+ }
487
+
142
488
  const config = loadOrCreateConfig();
143
489
  const port = String(args.port || process.env.PORT || config.server?.port || DEFAULT_PORT);
144
490
  const host = String(args.host || process.env.HOST || config.server?.host || DEFAULT_HOST);
@@ -180,6 +526,11 @@ function main() {
180
526
  PORT: port,
181
527
  HOST: host,
182
528
  DATABASE_URL: databaseUrl,
529
+ REGIONCLAW_HOST: host,
530
+ REGIONCLAW_PORT: port,
531
+ REGIONCLAW_PARENT_PID: String(process.pid),
532
+ REGIONCLAW_PACKAGE_ROOT: packageRoot,
533
+ REGIONCLAW_VERSION: PACKAGE_VERSION,
183
534
  NEXTAUTH_SECRET: nextAuthSecret,
184
535
  NEXTAUTH_URL: nextAuthUrl,
185
536
  },
@@ -205,4 +556,7 @@ function main() {
205
556
  });
206
557
  }
207
558
 
208
- main();
559
+ main().catch((error) => {
560
+ process.stderr.write(`${error instanceof Error ? error.stack || error.message : String(error)}\n`);
561
+ process.exit(1);
562
+ });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "regionclaw",
3
- "version": "0.0.3",
3
+ "version": "0.0.4",
4
4
  "description": "RegionClaw local workspace app",
5
5
  "bin": {
6
6
  "regionclaw": "bin/regionclaw.js"
@@ -0,0 +1,54 @@
1
+ import { spawn } from "node:child_process";
2
+ import path from "node:path";
3
+
4
+ const [parentPidRaw, binPath, host, port] = process.argv.slice(2);
5
+ const parentPid = Number.parseInt(parentPidRaw ?? "", 10);
6
+
7
+ function sleep(ms) {
8
+ return new Promise((resolve) => setTimeout(resolve, ms));
9
+ }
10
+
11
+ function isPidRunning(pid) {
12
+ if (!Number.isFinite(pid) || pid <= 0) {
13
+ return false;
14
+ }
15
+
16
+ try {
17
+ process.kill(pid, 0);
18
+ return true;
19
+ } catch {
20
+ return false;
21
+ }
22
+ }
23
+
24
+ async function main() {
25
+ if (!Number.isFinite(parentPid) || !binPath || !host || !port) {
26
+ process.exit(1);
27
+ }
28
+
29
+ try {
30
+ process.kill(parentPid, "SIGTERM");
31
+ } catch {
32
+ // Parent may already be gone.
33
+ }
34
+
35
+ for (let attempt = 0; attempt < 40; attempt += 1) {
36
+ if (!isPidRunning(parentPid)) {
37
+ break;
38
+ }
39
+ await sleep(250);
40
+ }
41
+
42
+ const child = spawn(process.execPath, [binPath, "--host", host, "--port", port], {
43
+ cwd: path.resolve(path.dirname(binPath), ".."),
44
+ detached: true,
45
+ stdio: "ignore",
46
+ env: process.env,
47
+ });
48
+
49
+ child.unref();
50
+ }
51
+
52
+ main().catch(() => {
53
+ process.exit(1);
54
+ });
@@ -1 +0,0 @@
1
- <!DOCTYPE html><html id="__next_error__"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="script" fetchPriority="low" href="/_next/static/chunks/webpack-95e4dbce7bf11a3e.js"/><script src="/_next/static/chunks/628c8b96-cdfc45e32fce7014.js" async=""></script><script src="/_next/static/chunks/16-7d9bc77e936a4cb6.js" async=""></script><script src="/_next/static/chunks/main-app-e0f42b94daafe3ad.js" async=""></script><title>RegionClaw</title><meta name="description" content="RegionClaw workspace scaffold"/><link rel="icon" href="/favicon.ico?603d046c9a6fdfbb" type="image/x-icon" sizes="16x16"/><script src="/_next/static/chunks/polyfills-42372ed130431b0a.js" noModule=""></script></head><body><div hidden=""><!--$--><!--/$--></div><script src="/_next/static/chunks/webpack-95e4dbce7bf11a3e.js" id="_R_" async=""></script><script>(self.__next_f=self.__next_f||[]).push([0])</script><script>self.__next_f.push([1,"1:\"$Sreact.fragment\"\n2:I[1827,[\"473\",\"static/chunks/473-41dc1131ba74f205.js\",\"774\",\"static/chunks/774-b72ba79217cd49b6.js\",\"314\",\"static/chunks/314-50a286a8a2defe3e.js\",\"177\",\"static/chunks/app/layout-87ffd83df9489fc3.js\"],\"Providers\"]\n3:I[7434,[\"473\",\"static/chunks/473-41dc1131ba74f205.js\",\"774\",\"static/chunks/774-b72ba79217cd49b6.js\",\"314\",\"static/chunks/314-50a286a8a2defe3e.js\",\"177\",\"static/chunks/app/layout-87ffd83df9489fc3.js\"],\"TooltipProvider\"]\n4:I[1166,[],\"\"]\n5:I[6660,[],\"\"]\n6:I[3222,[\"473\",\"static/chunks/473-41dc1131ba74f205.js\",\"774\",\"static/chunks/774-b72ba79217cd49b6.js\",\"314\",\"static/chunks/314-50a286a8a2defe3e.js\",\"177\",\"static/chunks/app/layout-87ffd83df9489fc3.js\"],\"Toaster\"]\n8:I[8007,[],\"OutletBoundary\"]\n9:\"$Sreact.suspense\"\nb:I[8007,[],\"ViewportBoundary\"]\nd:I[8007,[],\"MetadataBoundary\"]\nf:I[1702,[],\"default\",1]\n:HL[\"/_next/static/media/4cf2300e9c8272f7-s.p.woff2\",\"font\",{\"crossOrigin\":\"\",\"type\":\"font/woff2\"}]\n:HL[\"/_next/static/media/93f479601ee12b01-s.p.woff2\",\"font\",{\"crossOrigin\":\"\",\"type\":\"font/woff2\"}]\n:HL[\"/_next/static/css/de70bee13400563f.css\",\"style\"]\n:HL[\"/_next/static/css/9a04963144d959d5.css\",\"style\"]\n"])</script><script>self.__next_f.push([1,"0:{\"P\":null,\"c\":[\"\",\"\"],\"q\":\"\",\"i\":false,\"f\":[[[\"\",{\"children\":[\"__PAGE__\",{}]},\"$undefined\",\"$undefined\",16],[[\"$\",\"$1\",\"c\",{\"children\":[[[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/css/de70bee13400563f.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}],[\"$\",\"link\",\"1\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/css/9a04963144d959d5.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}]],[\"$\",\"html\",null,{\"lang\":\"en\",\"suppressHydrationWarning\":true,\"className\":\"__variable_188709 __variable_9a8899 h-full antialiased\",\"children\":[\"$\",\"body\",null,{\"className\":\"flex min-h-full flex-col bg-background\",\"children\":[\"$\",\"$L2\",null,{\"children\":[\"$\",\"$L3\",null,{\"children\":[[\"$\",\"$L4\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L5\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":[[[\"$\",\"title\",null,{\"children\":\"404: This page could not be found.\"}],[\"$\",\"div\",null,{\"style\":{\"fontFamily\":\"system-ui,\\\"Segoe UI\\\",Roboto,Helvetica,Arial,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\"\",\"height\":\"100vh\",\"textAlign\":\"center\",\"display\":\"flex\",\"flexDirection\":\"column\",\"alignItems\":\"center\",\"justifyContent\":\"center\"},\"children\":[\"$\",\"div\",null,{\"children\":[[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\"}}],[\"$\",\"h1\",null,{\"className\":\"next-error-h1\",\"style\":{\"display\":\"inline-block\",\"margin\":\"0 20px 0 0\",\"padding\":\"0 23px 0 0\",\"fontSize\":24,\"fontWeight\":500,\"verticalAlign\":\"top\",\"lineHeight\":\"49px\"},\"children\":404}],[\"$\",\"div\",null,{\"style\":{\"display\":\"inline-block\"},\"children\":[\"$\",\"h2\",null,{\"style\":{\"fontSize\":14,\"fontWeight\":400,\"lineHeight\":\"49px\",\"margin\":0},\"children\":\"This page could not be found.\"}]}]]}]}]],[]],\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}],[\"$\",\"$L6\",null,{}]]}]}]}]}]]}],{\"children\":[[\"$\",\"$1\",\"c\",{\"children\":[\"$L7\",null,[\"$\",\"$L8\",null,{\"children\":[\"$\",\"$9\",null,{\"name\":\"Next.MetadataOutlet\",\"children\":\"$@a\"}]}]]}],{},null,false,null]},null,false,null],[\"$\",\"$1\",\"h\",{\"children\":[null,[\"$\",\"$Lb\",null,{\"children\":\"$Lc\"}],[\"$\",\"div\",null,{\"hidden\":true,\"children\":[\"$\",\"$Ld\",null,{\"children\":[\"$\",\"$9\",null,{\"name\":\"Next.Metadata\",\"children\":\"$Le\"}]}]}],[\"$\",\"meta\",null,{\"name\":\"next-size-adjust\",\"content\":\"\"}]]}],false]],\"m\":\"$undefined\",\"G\":[\"$f\",[]],\"S\":true,\"h\":null,\"s\":\"$undefined\",\"l\":\"$undefined\",\"p\":\"$undefined\",\"d\":\"$undefined\",\"b\":\"tx6PZf8zETvK0EvVfqK73\"}\n"])</script><script>self.__next_f.push([1,"c:[[\"$\",\"meta\",\"0\",{\"charSet\":\"utf-8\"}],[\"$\",\"meta\",\"1\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1\"}]]\n"])</script><script>self.__next_f.push([1,"7:E{\"digest\":\"NEXT_REDIRECT;replace;/setup;307;\"}\n"])</script><script>self.__next_f.push([1,"10:I[5766,[],\"IconMark\"]\na:null\ne:[[\"$\",\"title\",\"0\",{\"children\":\"RegionClaw\"}],[\"$\",\"meta\",\"1\",{\"name\":\"description\",\"content\":\"RegionClaw workspace scaffold\"}],[\"$\",\"link\",\"2\",{\"rel\":\"icon\",\"href\":\"/favicon.ico?603d046c9a6fdfbb\",\"type\":\"image/x-icon\",\"sizes\":\"16x16\"}],[\"$\",\"$L10\",\"3\",{}]]\n"])</script></body></html>
@@ -1,16 +0,0 @@
1
- {
2
- "status": 307,
3
- "headers": {
4
- "location": "/setup",
5
- "x-nextjs-stale-time": "300",
6
- "x-nextjs-prerender": "1",
7
- "x-next-cache-tags": "_N_T_/layout,_N_T_/page,_N_T_/,_N_T_/index"
8
- },
9
- "segmentPaths": [
10
- "/_tree",
11
- "/_full",
12
- "/__PAGE__",
13
- "/_index",
14
- "/_head"
15
- ]
16
- }
@@ -1,21 +0,0 @@
1
- 1:"$Sreact.fragment"
2
- 2:I[1827,["473","static/chunks/473-41dc1131ba74f205.js","774","static/chunks/774-b72ba79217cd49b6.js","314","static/chunks/314-50a286a8a2defe3e.js","177","static/chunks/app/layout-87ffd83df9489fc3.js"],"Providers"]
3
- 3:I[7434,["473","static/chunks/473-41dc1131ba74f205.js","774","static/chunks/774-b72ba79217cd49b6.js","314","static/chunks/314-50a286a8a2defe3e.js","177","static/chunks/app/layout-87ffd83df9489fc3.js"],"TooltipProvider"]
4
- 4:I[1166,[],""]
5
- 5:I[6660,[],""]
6
- 6:I[3222,["473","static/chunks/473-41dc1131ba74f205.js","774","static/chunks/774-b72ba79217cd49b6.js","314","static/chunks/314-50a286a8a2defe3e.js","177","static/chunks/app/layout-87ffd83df9489fc3.js"],"Toaster"]
7
- 8:I[8007,[],"OutletBoundary"]
8
- 9:"$Sreact.suspense"
9
- b:I[8007,[],"ViewportBoundary"]
10
- d:I[8007,[],"MetadataBoundary"]
11
- f:I[1702,[],"default",1]
12
- :HL["/_next/static/media/4cf2300e9c8272f7-s.p.woff2","font",{"crossOrigin":"","type":"font/woff2"}]
13
- :HL["/_next/static/media/93f479601ee12b01-s.p.woff2","font",{"crossOrigin":"","type":"font/woff2"}]
14
- :HL["/_next/static/css/de70bee13400563f.css","style"]
15
- :HL["/_next/static/css/9a04963144d959d5.css","style"]
16
- 0:{"P":null,"c":["",""],"q":"","i":false,"f":[[["",{"children":["__PAGE__",{}]},"$undefined","$undefined",16],[["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/css/de70bee13400563f.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}],["$","link","1",{"rel":"stylesheet","href":"/_next/static/css/9a04963144d959d5.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}]],["$","html",null,{"lang":"en","suppressHydrationWarning":true,"className":"__variable_188709 __variable_9a8899 h-full antialiased","children":["$","body",null,{"className":"flex min-h-full flex-col bg-background","children":["$","$L2",null,{"children":["$","$L3",null,{"children":[["$","$L4",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":[[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","textAlign":"center","display":"flex","flexDirection":"column","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":{"display":"inline-block","margin":"0 20px 0 0","padding":"0 23px 0 0","fontSize":24,"fontWeight":500,"verticalAlign":"top","lineHeight":"49px"},"children":404}],["$","div",null,{"style":{"display":"inline-block"},"children":["$","h2",null,{"style":{"fontSize":14,"fontWeight":400,"lineHeight":"49px","margin":0},"children":"This page could not be found."}]}]]}]}]],[]],"forbidden":"$undefined","unauthorized":"$undefined"}],["$","$L6",null,{}]]}]}]}]}]]}],{"children":[["$","$1","c",{"children":["$L7",null,["$","$L8",null,{"children":["$","$9",null,{"name":"Next.MetadataOutlet","children":"$@a"}]}]]}],{},null,false,null]},null,false,null],["$","$1","h",{"children":[null,["$","$Lb",null,{"children":"$Lc"}],["$","div",null,{"hidden":true,"children":["$","$Ld",null,{"children":["$","$9",null,{"name":"Next.Metadata","children":"$Le"}]}]}],["$","meta",null,{"name":"next-size-adjust","content":""}]]}],false]],"m":"$undefined","G":["$f",[]],"S":true,"h":null,"s":"$undefined","l":"$undefined","p":"$undefined","d":"$undefined","b":"tx6PZf8zETvK0EvVfqK73"}
17
- c:[["$","meta","0",{"charSet":"utf-8"}],["$","meta","1",{"name":"viewport","content":"width=device-width, initial-scale=1"}]]
18
- 7:E{"digest":"NEXT_REDIRECT;replace;/setup;307;"}
19
- 10:I[5766,[],"IconMark"]
20
- a:null
21
- e:[["$","title","0",{"children":"RegionClaw"}],["$","meta","1",{"name":"description","content":"RegionClaw workspace scaffold"}],["$","link","2",{"rel":"icon","href":"/favicon.ico?603d046c9a6fdfbb","type":"image/x-icon","sizes":"16x16"}],["$","$L10","3",{}]]
@@ -1,6 +0,0 @@
1
- 1:"$Sreact.fragment"
2
- 3:I[8007,[],"OutletBoundary"]
3
- 4:"$Sreact.suspense"
4
- 0:{"rsc":["$","$1","c",{"children":["$L2",null,["$","$L3",null,{"children":["$","$4",null,{"name":"Next.MetadataOutlet","children":"$@5"}]}]]}],"isPartial":false,"staleTime":300,"varyParams":null,"buildId":"tx6PZf8zETvK0EvVfqK73"}
5
- 5:null
6
- 2:E{"digest":"NEXT_REDIRECT;replace;/setup;307;"}
@@ -1,21 +0,0 @@
1
- 1:"$Sreact.fragment"
2
- 2:I[1827,["473","static/chunks/473-41dc1131ba74f205.js","774","static/chunks/774-b72ba79217cd49b6.js","314","static/chunks/314-50a286a8a2defe3e.js","177","static/chunks/app/layout-87ffd83df9489fc3.js"],"Providers"]
3
- 3:I[7434,["473","static/chunks/473-41dc1131ba74f205.js","774","static/chunks/774-b72ba79217cd49b6.js","314","static/chunks/314-50a286a8a2defe3e.js","177","static/chunks/app/layout-87ffd83df9489fc3.js"],"TooltipProvider"]
4
- 4:I[1166,[],""]
5
- 5:I[6660,[],""]
6
- 6:I[3222,["473","static/chunks/473-41dc1131ba74f205.js","774","static/chunks/774-b72ba79217cd49b6.js","314","static/chunks/314-50a286a8a2defe3e.js","177","static/chunks/app/layout-87ffd83df9489fc3.js"],"Toaster"]
7
- 8:I[8007,[],"OutletBoundary"]
8
- 9:"$Sreact.suspense"
9
- b:I[8007,[],"ViewportBoundary"]
10
- d:I[8007,[],"MetadataBoundary"]
11
- f:I[1702,[],"default",1]
12
- :HL["/_next/static/media/4cf2300e9c8272f7-s.p.woff2","font",{"crossOrigin":"","type":"font/woff2"}]
13
- :HL["/_next/static/media/93f479601ee12b01-s.p.woff2","font",{"crossOrigin":"","type":"font/woff2"}]
14
- :HL["/_next/static/css/de70bee13400563f.css","style"]
15
- :HL["/_next/static/css/9a04963144d959d5.css","style"]
16
- 0:{"P":null,"c":["",""],"q":"","i":false,"f":[[["",{"children":["__PAGE__",{}]},"$undefined","$undefined",16],[["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/css/de70bee13400563f.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}],["$","link","1",{"rel":"stylesheet","href":"/_next/static/css/9a04963144d959d5.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}]],["$","html",null,{"lang":"en","suppressHydrationWarning":true,"className":"__variable_188709 __variable_9a8899 h-full antialiased","children":["$","body",null,{"className":"flex min-h-full flex-col bg-background","children":["$","$L2",null,{"children":["$","$L3",null,{"children":[["$","$L4",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":[[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","textAlign":"center","display":"flex","flexDirection":"column","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":{"display":"inline-block","margin":"0 20px 0 0","padding":"0 23px 0 0","fontSize":24,"fontWeight":500,"verticalAlign":"top","lineHeight":"49px"},"children":404}],["$","div",null,{"style":{"display":"inline-block"},"children":["$","h2",null,{"style":{"fontSize":14,"fontWeight":400,"lineHeight":"49px","margin":0},"children":"This page could not be found."}]}]]}]}]],[]],"forbidden":"$undefined","unauthorized":"$undefined"}],["$","$L6",null,{}]]}]}]}]}]]}],{"children":[["$","$1","c",{"children":["$L7",null,["$","$L8",null,{"children":["$","$9",null,{"name":"Next.MetadataOutlet","children":"$@a"}]}]]}],{},null,false,null]},null,false,null],["$","$1","h",{"children":[null,["$","$Lb",null,{"children":"$Lc"}],["$","div",null,{"hidden":true,"children":["$","$Ld",null,{"children":["$","$9",null,{"name":"Next.Metadata","children":"$Le"}]}]}],["$","meta",null,{"name":"next-size-adjust","content":""}]]}],false]],"m":"$undefined","G":["$f",[]],"S":true,"h":null,"s":"$undefined","l":"$undefined","p":"$undefined","d":"$undefined","b":"tx6PZf8zETvK0EvVfqK73"}
17
- c:[["$","meta","0",{"charSet":"utf-8"}],["$","meta","1",{"name":"viewport","content":"width=device-width, initial-scale=1"}]]
18
- 7:E{"digest":"NEXT_REDIRECT;replace;/setup;307;"}
19
- 10:I[5766,[],"IconMark"]
20
- a:null
21
- e:[["$","title","0",{"children":"RegionClaw"}],["$","meta","1",{"name":"description","content":"RegionClaw workspace scaffold"}],["$","link","2",{"rel":"icon","href":"/favicon.ico?603d046c9a6fdfbb","type":"image/x-icon","sizes":"16x16"}],["$","$L10","3",{}]]
@@ -1,6 +0,0 @@
1
- 1:"$Sreact.fragment"
2
- 2:I[8007,[],"ViewportBoundary"]
3
- 3:I[8007,[],"MetadataBoundary"]
4
- 4:"$Sreact.suspense"
5
- 5:I[5766,[],"IconMark"]
6
- 0:{"rsc":["$","$1","h",{"children":[null,["$","$L2",null,{"children":[["$","meta","0",{"charSet":"utf-8"}],["$","meta","1",{"name":"viewport","content":"width=device-width, initial-scale=1"}]]}],["$","div",null,{"hidden":true,"children":["$","$L3",null,{"children":["$","$4",null,{"name":"Next.Metadata","children":[["$","title","0",{"children":"RegionClaw"}],["$","meta","1",{"name":"description","content":"RegionClaw workspace scaffold"}],["$","link","2",{"rel":"icon","href":"/favicon.ico?603d046c9a6fdfbb","type":"image/x-icon","sizes":"16x16"}],["$","$L5","3",{}]]}]}]}],["$","meta",null,{"name":"next-size-adjust","content":""}]]}],"isPartial":false,"staleTime":300,"varyParams":null,"buildId":"tx6PZf8zETvK0EvVfqK73"}
@@ -1,9 +0,0 @@
1
- 1:"$Sreact.fragment"
2
- 2:I[1827,["473","static/chunks/473-41dc1131ba74f205.js","774","static/chunks/774-b72ba79217cd49b6.js","314","static/chunks/314-50a286a8a2defe3e.js","177","static/chunks/app/layout-87ffd83df9489fc3.js"],"Providers"]
3
- 3:I[7434,["473","static/chunks/473-41dc1131ba74f205.js","774","static/chunks/774-b72ba79217cd49b6.js","314","static/chunks/314-50a286a8a2defe3e.js","177","static/chunks/app/layout-87ffd83df9489fc3.js"],"TooltipProvider"]
4
- 4:I[1166,[],""]
5
- 5:I[6660,[],""]
6
- 6:I[3222,["473","static/chunks/473-41dc1131ba74f205.js","774","static/chunks/774-b72ba79217cd49b6.js","314","static/chunks/314-50a286a8a2defe3e.js","177","static/chunks/app/layout-87ffd83df9489fc3.js"],"Toaster"]
7
- :HL["/_next/static/css/de70bee13400563f.css","style"]
8
- :HL["/_next/static/css/9a04963144d959d5.css","style"]
9
- 0:{"rsc":["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/css/de70bee13400563f.css","precedence":"next"}],["$","link","1",{"rel":"stylesheet","href":"/_next/static/css/9a04963144d959d5.css","precedence":"next"}]],["$","html",null,{"lang":"en","suppressHydrationWarning":true,"className":"__variable_188709 __variable_9a8899 h-full antialiased","children":["$","body",null,{"className":"flex min-h-full flex-col bg-background","children":["$","$L2",null,{"children":["$","$L3",null,{"children":[["$","$L4",null,{"parallelRouterKey":"children","template":["$","$L5",null,{}],"notFound":[[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","textAlign":"center","display":"flex","flexDirection":"column","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":{"display":"inline-block","margin":"0 20px 0 0","padding":"0 23px 0 0","fontSize":24,"fontWeight":500,"verticalAlign":"top","lineHeight":"49px"},"children":404}],["$","div",null,{"style":{"display":"inline-block"},"children":["$","h2",null,{"style":{"fontSize":14,"fontWeight":400,"lineHeight":"49px","margin":0},"children":"This page could not be found."}]}]]}]}]],[]]}],["$","$L6",null,{}]]}]}]}]}]]}],"isPartial":false,"staleTime":300,"varyParams":null,"buildId":"tx6PZf8zETvK0EvVfqK73"}
@@ -1,5 +0,0 @@
1
- :HL["/_next/static/media/4cf2300e9c8272f7-s.p.woff2","font",{"crossOrigin":"","type":"font/woff2"}]
2
- :HL["/_next/static/media/93f479601ee12b01-s.p.woff2","font",{"crossOrigin":"","type":"font/woff2"}]
3
- :HL["/_next/static/css/de70bee13400563f.css","style"]
4
- :HL["/_next/static/css/9a04963144d959d5.css","style"]
5
- 0:{"tree":{"name":"","param":null,"prefetchHints":16,"slots":{"children":{"name":"__PAGE__","param":null,"prefetchHints":0,"slots":null}}},"staleTime":300,"buildId":"tx6PZf8zETvK0EvVfqK73"}