clawpad 0.3.4 → 0.3.5
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/.next/standalone/.next/BUILD_ID +1 -1
- package/.next/standalone/.next/app-path-routes-manifest.json +4 -4
- package/.next/standalone/.next/build-manifest.json +2 -2
- package/.next/standalone/.next/prerender-manifest.json +3 -3
- package/.next/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/_global-error.html +2 -2
- package/.next/standalone/.next/server/app/_global-error.rsc +1 -1
- package/.next/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/_not-found.html +1 -1
- package/.next/standalone/.next/server/app/_not-found.rsc +1 -1
- package/.next/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/api/ai/write/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/changes/[id]/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/changes/record/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/changes/revert/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/changes/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/changes/run/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/chat/abort/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/chat/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/files/pages/[...path]/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/files/recent/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/files/search/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/files/spaces/[space]/pages/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/files/spaces/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/files/watch/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/gateway/detect/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/gateway/events/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/gateway/features/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/gateway/history/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/gateway/resolve/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/gateway/sessions/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/gateway/status/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/openclaw/commands/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/search/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/settings/search-status/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/setup/bootstrap/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/setup/bootstrap-workspace/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/setup/status/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/setup/trigger-onboarding/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/index.html +1 -1
- package/.next/standalone/.next/server/app/index.rsc +1 -1
- package/.next/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/index.segments/_full.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/index.segments/_index.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/settings/connection/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/settings/connection.html +1 -1
- package/.next/standalone/.next/server/app/settings/connection.rsc +1 -1
- package/.next/standalone/.next/server/app/settings/connection.segments/_full.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/settings/connection.segments/_head.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/settings/connection.segments/_index.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/settings/connection.segments/_tree.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/settings/connection.segments/settings/connection/__PAGE__.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/settings/connection.segments/settings/connection.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/settings/connection.segments/settings.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/settings/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/settings.html +1 -1
- package/.next/standalone/.next/server/app/settings.rsc +1 -1
- package/.next/standalone/.next/server/app/settings.segments/_full.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/settings.segments/_head.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/settings.segments/_index.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/settings.segments/_tree.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/settings.segments/settings/__PAGE__.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/settings.segments/settings.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/setup/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/setup.html +1 -1
- package/.next/standalone/.next/server/app/setup.rsc +1 -1
- package/.next/standalone/.next/server/app/setup.segments/_full.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/setup.segments/_head.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/setup.segments/_index.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/setup.segments/_tree.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/setup.segments/setup/__PAGE__.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/setup.segments/setup.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/workspace/[...path]/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/workspace/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/workspace/search/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/workspace/search.html +2 -2
- package/.next/standalone/.next/server/app/workspace/search.rsc +1 -1
- package/.next/standalone/.next/server/app/workspace/search.segments/_full.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/workspace/search.segments/_head.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/workspace/search.segments/_index.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/workspace/search.segments/_tree.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/workspace/search.segments/workspace/search/__PAGE__.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/workspace/search.segments/workspace/search.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/workspace/search.segments/workspace.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/workspace.html +2 -2
- package/.next/standalone/.next/server/app/workspace.rsc +1 -1
- package/.next/standalone/.next/server/app/workspace.segments/_full.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/workspace.segments/_head.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/workspace.segments/_index.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/workspace.segments/_tree.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/workspace.segments/workspace/__PAGE__.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/workspace.segments/workspace.segment.rsc +1 -1
- package/.next/standalone/.next/server/app-paths-manifest.json +4 -4
- package/.next/standalone/.next/server/pages/404.html +1 -1
- package/.next/standalone/.next/server/pages/500.html +2 -2
- package/.next/standalone/.next/server/server-reference-manifest.json +1 -1
- package/.next/standalone/package.json +1 -1
- package/bin/clawpad.js +108 -1
- package/package.json +1 -1
- package/public/install.sh +19 -0
- /package/.next/static/{qgk2XcOMiy5iDOZJiQk9E → LvUY6ibmmD6EHrRtm1qSH}/_buildManifest.js +0 -0
- /package/.next/static/{qgk2XcOMiy5iDOZJiQk9E → LvUY6ibmmD6EHrRtm1qSH}/_ssgManifest.js +0 -0
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
<!DOCTYPE html><!--
|
|
2
|
-
@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}</style><h1 class="next-error-h1" style="display:inline-block;margin:0 20px 0 0;padding-right:23px;font-size:24px;font-weight:500;vertical-align:top">500</h1><div style="display:inline-block"><h2 style="font-size:14px;font-weight:400;line-height:28px">Internal Server Error.</h2></div></div></div><!--$--><!--/$--><script src="/_next/static/chunks/webpack-0c9808987c6b957c.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[57121,[],\"\"]\n3:I[74581,[],\"\"]\n4:I[90484,[],\"OutletBoundary\"]\n5:\"$Sreact.suspense\"\n7:I[90484,[],\"ViewportBoundary\"]\n9:I[90484,[],\"MetadataBoundary\"]\nb:I[27123,[],\"\"]\n"])</script><script>self.__next_f.push([1,"0:{\"P\":null,\"b\":\"
|
|
1
|
+
<!DOCTYPE html><!--LvUY6ibmmD6EHrRtm1qSH--><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-0c9808987c6b957c.js"/><script src="/_next/static/chunks/4bd1b696-e5d7c65570c947b7.js" async=""></script><script src="/_next/static/chunks/3794-337d1ca25ad99a89.js" async=""></script><script src="/_next/static/chunks/main-app-a1f34f01f7efbb58.js" async=""></script><meta name="next-size-adjust" content=""/><title>500: Internal Server Error.</title><script src="/_next/static/chunks/polyfills-42372ed130431b0a.js" noModule=""></script></head><body><div hidden=""><!--$--><!--/$--></div><div style="font-family:system-ui,"Segoe UI",Roboto,Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";height:100vh;text-align:center;display:flex;flex-direction:column;align-items:center;justify-content:center"><div style="line-height:48px"><style>body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}
|
|
2
|
+
@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}</style><h1 class="next-error-h1" style="display:inline-block;margin:0 20px 0 0;padding-right:23px;font-size:24px;font-weight:500;vertical-align:top">500</h1><div style="display:inline-block"><h2 style="font-size:14px;font-weight:400;line-height:28px">Internal Server Error.</h2></div></div></div><!--$--><!--/$--><script src="/_next/static/chunks/webpack-0c9808987c6b957c.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[57121,[],\"\"]\n3:I[74581,[],\"\"]\n4:I[90484,[],\"OutletBoundary\"]\n5:\"$Sreact.suspense\"\n7:I[90484,[],\"ViewportBoundary\"]\n9:I[90484,[],\"MetadataBoundary\"]\nb:I[27123,[],\"\"]\n"])</script><script>self.__next_f.push([1,"0:{\"P\":null,\"b\":\"LvUY6ibmmD6EHrRtm1qSH\",\"c\":[\"\",\"_global-error\"],\"q\":\"\",\"i\":false,\"f\":[[[\"\",{\"children\":[\"_global-error\",{\"children\":[\"__PAGE__\",{}]}]}],[[\"$\",\"$1\",\"c\",{\"children\":[null,[\"$\",\"$L2\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L3\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}],{\"children\":[[\"$\",\"$1\",\"c\",{\"children\":[null,[\"$\",\"$L2\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L3\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}],{\"children\":[[\"$\",\"$1\",\"c\",{\"children\":[[\"$\",\"html\",null,{\"id\":\"__next_error__\",\"children\":[[\"$\",\"head\",null,{\"children\":[\"$\",\"title\",null,{\"children\":\"500: Internal Server Error.\"}]}],[\"$\",\"body\",null,{\"children\":[\"$\",\"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,{\"style\":{\"lineHeight\":\"48px\"},\"children\":[[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}\\n@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\",\"paddingRight\":23,\"fontSize\":24,\"fontWeight\":500,\"verticalAlign\":\"top\"},\"children\":\"500\"}],[\"$\",\"div\",null,{\"style\":{\"display\":\"inline-block\"},\"children\":[\"$\",\"h2\",null,{\"style\":{\"fontSize\":14,\"fontWeight\":400,\"lineHeight\":\"28px\"},\"children\":\"Internal Server Error.\"}]}]]}]}]}]]}],null,[\"$\",\"$L4\",null,{\"children\":[\"$\",\"$5\",null,{\"name\":\"Next.MetadataOutlet\",\"children\":\"$@6\"}]}]]}],{},null,false,false]},null,false,false]},null,false,false],[\"$\",\"$1\",\"h\",{\"children\":[null,[\"$\",\"$L7\",null,{\"children\":\"$L8\"}],[\"$\",\"div\",null,{\"hidden\":true,\"children\":[\"$\",\"$L9\",null,{\"children\":[\"$\",\"$5\",null,{\"name\":\"Next.Metadata\",\"children\":\"$La\"}]}]}],[\"$\",\"meta\",null,{\"name\":\"next-size-adjust\",\"content\":\"\"}]]}],false]],\"m\":\"$undefined\",\"G\":[\"$b\",[]],\"S\":true}\n"])</script><script>self.__next_f.push([1,"8:[[\"$\",\"meta\",\"0\",{\"charSet\":\"utf-8\"}],[\"$\",\"meta\",\"1\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1\"}]]\n"])</script><script>self.__next_f.push([1,"6:null\na:[]\n"])</script></body></html>
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"node":{},"edge":{},"encryptionKey":"
|
|
1
|
+
{"node":{},"edge":{},"encryptionKey":"IQsEYUHiW/DD+l9g4tE4SJGMrBpUcyruYmHpNGwH+G0="}
|
package/bin/clawpad.js
CHANGED
|
@@ -361,6 +361,104 @@ async function killPortListeners(port) {
|
|
|
361
361
|
return { killedAny: true, verifiedFree };
|
|
362
362
|
}
|
|
363
363
|
|
|
364
|
+
function readProcessCommand(pid) {
|
|
365
|
+
try {
|
|
366
|
+
return execSync(`ps -o command= -p ${pid}`, {
|
|
367
|
+
stdio: ["ignore", "pipe", "ignore"],
|
|
368
|
+
})
|
|
369
|
+
.toString()
|
|
370
|
+
.trim();
|
|
371
|
+
} catch {
|
|
372
|
+
return "";
|
|
373
|
+
}
|
|
374
|
+
}
|
|
375
|
+
|
|
376
|
+
function readProcessInfo(pid) {
|
|
377
|
+
if (process.platform === "win32") {
|
|
378
|
+
return null;
|
|
379
|
+
}
|
|
380
|
+
|
|
381
|
+
try {
|
|
382
|
+
const output = execSync(`ps -o ppid=,command= -p ${pid}`, {
|
|
383
|
+
stdio: ["ignore", "pipe", "ignore"],
|
|
384
|
+
})
|
|
385
|
+
.toString()
|
|
386
|
+
.trim();
|
|
387
|
+
|
|
388
|
+
if (!output) return null;
|
|
389
|
+
const match = output.match(/^(\d+)\s+([\s\S]+)$/);
|
|
390
|
+
if (!match) return null;
|
|
391
|
+
|
|
392
|
+
const ppid = Number(match[1]);
|
|
393
|
+
const command = match[2].trim();
|
|
394
|
+
const parentCommand = Number.isFinite(ppid) && ppid > 0 ? readProcessCommand(ppid) : "";
|
|
395
|
+
|
|
396
|
+
return {
|
|
397
|
+
pid: Number(pid),
|
|
398
|
+
ppid,
|
|
399
|
+
command,
|
|
400
|
+
parentCommand,
|
|
401
|
+
};
|
|
402
|
+
} catch {
|
|
403
|
+
return null;
|
|
404
|
+
}
|
|
405
|
+
}
|
|
406
|
+
|
|
407
|
+
function isLikelyClawpadListener(info) {
|
|
408
|
+
if (!info) return false;
|
|
409
|
+
const command = String(info.command || "").toLowerCase();
|
|
410
|
+
const parentCommand = String(info.parentCommand || "").toLowerCase();
|
|
411
|
+
|
|
412
|
+
if (command.includes("clawpad") || parentCommand.includes("clawpad")) {
|
|
413
|
+
return true;
|
|
414
|
+
}
|
|
415
|
+
|
|
416
|
+
if (
|
|
417
|
+
command.includes(".next/standalone/server.js") &&
|
|
418
|
+
(parentCommand.includes("clawpad") || command.includes("node_modules/clawpad"))
|
|
419
|
+
) {
|
|
420
|
+
return true;
|
|
421
|
+
}
|
|
422
|
+
|
|
423
|
+
if (command.includes("next-server") && parentCommand.includes("clawpad")) {
|
|
424
|
+
return true;
|
|
425
|
+
}
|
|
426
|
+
|
|
427
|
+
return false;
|
|
428
|
+
}
|
|
429
|
+
|
|
430
|
+
async function maybeReplaceExistingClawpadListener(port) {
|
|
431
|
+
if (process.env.CLAWPAD_DISABLE_AUTO_PORT_REPLACE === "1") {
|
|
432
|
+
return { attempted: false, reason: "disabled" };
|
|
433
|
+
}
|
|
434
|
+
|
|
435
|
+
if (process.platform === "win32") {
|
|
436
|
+
return { attempted: false, reason: "unsupported-platform" };
|
|
437
|
+
}
|
|
438
|
+
|
|
439
|
+
const pids = listListeningPids(port);
|
|
440
|
+
if (pids.length === 0) {
|
|
441
|
+
return { attempted: false, reason: "no-listener" };
|
|
442
|
+
}
|
|
443
|
+
|
|
444
|
+
const infos = pids.map((pid) => readProcessInfo(pid)).filter(Boolean);
|
|
445
|
+
if (infos.length === 0) {
|
|
446
|
+
return { attempted: false, reason: "no-process-info" };
|
|
447
|
+
}
|
|
448
|
+
|
|
449
|
+
const allClawpad = infos.every((info) => isLikelyClawpadListener(info));
|
|
450
|
+
if (!allClawpad) {
|
|
451
|
+
return { attempted: false, reason: "non-clawpad-listener" };
|
|
452
|
+
}
|
|
453
|
+
|
|
454
|
+
const kill = await killPortListeners(port);
|
|
455
|
+
return {
|
|
456
|
+
attempted: true,
|
|
457
|
+
infos,
|
|
458
|
+
...kill,
|
|
459
|
+
};
|
|
460
|
+
}
|
|
461
|
+
|
|
364
462
|
function resolveUserPath(input) {
|
|
365
463
|
if (!input || !input.trim()) return input;
|
|
366
464
|
if (input.startsWith("~")) {
|
|
@@ -1092,7 +1190,16 @@ async function main() {
|
|
|
1092
1190
|
}
|
|
1093
1191
|
|
|
1094
1192
|
if (await isPortInUse(port)) {
|
|
1095
|
-
if (forcePort) {
|
|
1193
|
+
if (!forcePort) {
|
|
1194
|
+
const replaceResult = await maybeReplaceExistingClawpadListener(port);
|
|
1195
|
+
if (replaceResult.attempted && replaceResult.killedAny && replaceResult.verifiedFree) {
|
|
1196
|
+
console.log(` ♻️ Replaced existing ClawPad listener on port ${port}.`);
|
|
1197
|
+
} else if (replaceResult.attempted && replaceResult.killedAny && !replaceResult.verifiedFree) {
|
|
1198
|
+
console.error(` ❌ Found an existing ClawPad listener on port ${port} but could not free it.`);
|
|
1199
|
+
}
|
|
1200
|
+
}
|
|
1201
|
+
|
|
1202
|
+
if (forcePort && (await isPortInUse(port))) {
|
|
1096
1203
|
const forceResult = await killPortListeners(port);
|
|
1097
1204
|
if (forceResult.killedAny && forceResult.verifiedFree) {
|
|
1098
1205
|
console.log(` ✅ Cleared existing listeners on port ${port}.`);
|
package/package.json
CHANGED
package/public/install.sh
CHANGED
|
@@ -7,6 +7,7 @@ set -euo pipefail
|
|
|
7
7
|
MIN_NODE_MAJOR=18
|
|
8
8
|
INSTALL_PREFIX="${CLAWPAD_PREFIX:-$HOME/.local}"
|
|
9
9
|
INSTALL_TIMEOUT_SECONDS="${CLAWPAD_INSTALL_TIMEOUT_SECONDS:-180}"
|
|
10
|
+
PRUNE_DUPLICATES="${CLAWPAD_KEEP_DUPLICATES:-0}"
|
|
10
11
|
|
|
11
12
|
echo "ClawPad installer"
|
|
12
13
|
echo "[1/5] Checking Node.js..."
|
|
@@ -30,6 +31,24 @@ fi
|
|
|
30
31
|
|
|
31
32
|
echo "[2/5] Preparing install prefix: ${INSTALL_PREFIX}"
|
|
32
33
|
mkdir -p "${INSTALL_PREFIX}/bin"
|
|
34
|
+
INSTALL_PREFIX_ABS="$(cd "${INSTALL_PREFIX}" && pwd -P)"
|
|
35
|
+
|
|
36
|
+
# Remove older npm-based global installs from other prefixes to prevent PATH/version drift.
|
|
37
|
+
# Set CLAWPAD_KEEP_DUPLICATES=1 to skip this cleanup.
|
|
38
|
+
if [ "${PRUNE_DUPLICATES}" != "1" ]; then
|
|
39
|
+
if command -v clawpad >/dev/null 2>&1; then
|
|
40
|
+
while IFS= read -r existing_bin; do
|
|
41
|
+
[ -n "${existing_bin}" ] || continue
|
|
42
|
+
existing_prefix="$(cd "$(dirname "${existing_bin}")/.." 2>/dev/null && pwd -P || true)"
|
|
43
|
+
[ -n "${existing_prefix}" ] || continue
|
|
44
|
+
[ "${existing_prefix}" = "${INSTALL_PREFIX_ABS}" ] && continue
|
|
45
|
+
if [ -f "${existing_prefix}/lib/node_modules/clawpad/package.json" ]; then
|
|
46
|
+
echo "Pruning duplicate npm install from: ${existing_prefix}"
|
|
47
|
+
npm uninstall -g clawpad --prefix "${existing_prefix}" >/dev/null 2>&1 || true
|
|
48
|
+
fi
|
|
49
|
+
done < <(command -v -a clawpad 2>/dev/null | awk '!seen[$0]++')
|
|
50
|
+
fi
|
|
51
|
+
fi
|
|
33
52
|
|
|
34
53
|
# Make npm quieter and avoid long post-install checks
|
|
35
54
|
export NPM_CONFIG_FUND=false
|
|
File without changes
|
|
File without changes
|