@nextclaw/service 0.1.18-beta.1 → 0.1.18-beta.3
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/cli/commands/agent/cli-agent-runner.utils.d.ts +1 -2
- package/dist/cli/commands/agent/cli-agent-runner.utils.d.ts.map +1 -1
- package/dist/cli/commands/agent/cli-agent-runner.utils.js +16 -11
- package/dist/cli/commands/agent/cli-agent-runner.utils.js.map +1 -1
- package/dist/service-runtime.service.d.ts.map +1 -1
- package/dist/service-runtime.service.js +1 -3
- package/dist/service-runtime.service.js.map +1 -1
- package/dist/shared/services/workspace/workspace-manager.service.d.ts +1 -0
- package/dist/shared/services/workspace/workspace-manager.service.d.ts.map +1 -1
- package/dist/shared/services/workspace/workspace-manager.service.js +10 -11
- package/dist/shared/services/workspace/workspace-manager.service.js.map +1 -1
- package/package.json +25 -25
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { AgentCommandOptions } from "../../../shared/types/cli.types.js";
|
|
2
2
|
import { Config } from "@nextclaw/core";
|
|
3
|
-
import {
|
|
3
|
+
import { NextclawKernel } from "@nextclaw/kernel";
|
|
4
4
|
|
|
5
5
|
//#region src/cli/commands/agent/cli-agent-runner.utils.d.ts
|
|
6
6
|
declare function runCliAgentCommand(params: {
|
|
@@ -8,7 +8,6 @@ declare function runCliAgentCommand(params: {
|
|
|
8
8
|
opts: AgentCommandOptions;
|
|
9
9
|
config: Config;
|
|
10
10
|
kernel: NextclawKernel;
|
|
11
|
-
providerManager: LlmProviderRuntime;
|
|
12
11
|
}): Promise<void>;
|
|
13
12
|
//#endregion
|
|
14
13
|
export { runCliAgentCommand };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli-agent-runner.utils.d.ts","names":[],"sources":["../../../../src/cli/commands/agent/cli-agent-runner.utils.ts"],"mappings":";;;;;
|
|
1
|
+
{"version":3,"file":"cli-agent-runner.utils.d.ts","names":[],"sources":["../../../../src/cli/commands/agent/cli-agent-runner.utils.ts"],"mappings":";;;;;iBAoFsB,kBAAA,CAAmB,MAAA;EACvC,IAAA;EACA,IAAA,EAAM,mBAAA;EACN,MAAA,EAAQ,MAAA;EACR,MAAA,EAAQ,cAAA;AAAA,IACN,OAAA"}
|
|
@@ -12,9 +12,6 @@ const EXIT_COMMANDS = new Set([
|
|
|
12
12
|
"/quit",
|
|
13
13
|
":q"
|
|
14
14
|
]);
|
|
15
|
-
function buildCliSharedMetadata(opts) {
|
|
16
|
-
return typeof opts.model === "string" && opts.model.trim() ? { model: opts.model.trim() } : {};
|
|
17
|
-
}
|
|
18
15
|
function createCliHistoryInterface() {
|
|
19
16
|
const historyFile = join(getDataDir(), "history", "cli_history");
|
|
20
17
|
mkdirSync(resolve(historyFile, ".."), { recursive: true });
|
|
@@ -29,26 +26,34 @@ function createCliHistoryInterface() {
|
|
|
29
26
|
});
|
|
30
27
|
return rl;
|
|
31
28
|
}
|
|
29
|
+
async function sendCliPrompt(params) {
|
|
30
|
+
try {
|
|
31
|
+
printAgentResponse(await dispatchPromptOverNcp(params));
|
|
32
|
+
return true;
|
|
33
|
+
} catch (error) {
|
|
34
|
+
const message = error instanceof Error ? error.message : String(error ?? "Unknown error");
|
|
35
|
+
console.error(`Error: ${message.trim() || "Unknown error"}`);
|
|
36
|
+
return false;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
32
39
|
async function runCliInteractiveLoop(params) {
|
|
33
40
|
const { agentRunClient, config, logo, metadata, sessionKey } = params;
|
|
34
41
|
console.log(`${logo} Interactive mode (type exit or Ctrl+C to quit)\n`);
|
|
35
42
|
const rl = createCliHistoryInterface();
|
|
36
|
-
|
|
37
|
-
while (running) {
|
|
43
|
+
while (true) {
|
|
38
44
|
const trimmed = (await prompt(rl, "You: ")).trim();
|
|
39
45
|
if (!trimmed) continue;
|
|
40
46
|
if (EXIT_COMMANDS.has(trimmed.toLowerCase())) {
|
|
41
47
|
rl.close();
|
|
42
|
-
running = false;
|
|
43
48
|
break;
|
|
44
49
|
}
|
|
45
|
-
|
|
50
|
+
await sendCliPrompt({
|
|
46
51
|
config,
|
|
47
52
|
agentRunClient,
|
|
48
53
|
sessionKey,
|
|
49
54
|
content: trimmed,
|
|
50
55
|
metadata
|
|
51
|
-
})
|
|
56
|
+
});
|
|
52
57
|
}
|
|
53
58
|
}
|
|
54
59
|
async function runCliAgentCommand(params) {
|
|
@@ -61,15 +66,15 @@ async function runCliAgentCommand(params) {
|
|
|
61
66
|
ingress: kernel.ingress
|
|
62
67
|
});
|
|
63
68
|
const sessionKey = opts.session ?? "cli:default";
|
|
64
|
-
const sharedMetadata =
|
|
69
|
+
const sharedMetadata = typeof opts.model === "string" && opts.model.trim() ? { model: opts.model.trim() } : {};
|
|
65
70
|
if (opts.message) {
|
|
66
|
-
|
|
71
|
+
if (!await sendCliPrompt({
|
|
67
72
|
config,
|
|
68
73
|
agentRunClient,
|
|
69
74
|
sessionKey,
|
|
70
75
|
content: opts.message,
|
|
71
76
|
metadata: sharedMetadata
|
|
72
|
-
}));
|
|
77
|
+
})) process.exitCode = 1;
|
|
73
78
|
return;
|
|
74
79
|
}
|
|
75
80
|
await runCliInteractiveLoop({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli-agent-runner.utils.js","names":[],"sources":["../../../../src/cli/commands/agent/cli-agent-runner.utils.ts"],"sourcesContent":["import {\n getDataDir,\n type Config,\n} from \"@nextclaw/core\";\nimport {\n AgentRunClient,\n dispatchPromptOverNcp,\n type
|
|
1
|
+
{"version":3,"file":"cli-agent-runner.utils.js","names":[],"sources":["../../../../src/cli/commands/agent/cli-agent-runner.utils.ts"],"sourcesContent":["import {\n getDataDir,\n type Config,\n} from \"@nextclaw/core\";\nimport {\n AgentRunClient,\n dispatchPromptOverNcp,\n type DirectPromptDispatchParams,\n type NextclawKernel,\n} from \"@nextclaw/kernel\";\nimport { existsSync, mkdirSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { join, resolve } from \"node:path\";\nimport { createInterface } from \"node:readline\";\nimport type { AgentCommandOptions } from \"@nextclaw-service/shared/types/cli.types.js\";\nimport { printAgentResponse, prompt } from \"@nextclaw-service/shared/utils/cli.utils.js\";\n\nconst EXIT_COMMANDS = new Set([\"exit\", \"quit\", \"/exit\", \"/quit\", \":q\"]);\ntype CliPromptParams = Pick<DirectPromptDispatchParams, \"agentRunClient\" | \"config\" | \"content\" | \"metadata\" | \"sessionKey\">;\n\nfunction createCliHistoryInterface() {\n const historyFile = join(getDataDir(), \"history\", \"cli_history\");\n mkdirSync(resolve(historyFile, \"..\"), { recursive: true });\n\n const history = existsSync(historyFile)\n ? readFileSync(historyFile, \"utf-8\").split(\"\\n\").filter(Boolean)\n : [];\n const rl = createInterface({\n input: process.stdin,\n output: process.stdout,\n });\n rl.on(\"close\", () => {\n const merged = history.concat(\n (rl as unknown as { history: string[] }).history ?? [],\n );\n writeFileSync(historyFile, merged.join(\"\\n\"));\n process.exit(0);\n });\n\n return rl;\n}\n\nasync function sendCliPrompt(params: CliPromptParams): Promise<boolean> {\n try {\n const response = await dispatchPromptOverNcp(params);\n printAgentResponse(response);\n return true;\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error ?? \"Unknown error\");\n console.error(`Error: ${message.trim() || \"Unknown error\"}`);\n return false;\n }\n}\n\nasync function runCliInteractiveLoop(params: {\n logo: string;\n config: Config;\n agentRunClient: AgentRunClient;\n sessionKey: string;\n metadata: Record<string, unknown>;\n}): Promise<void> {\n const { agentRunClient, config, logo, metadata, sessionKey } = params;\n console.log(`${logo} Interactive mode (type exit or Ctrl+C to quit)\\n`);\n const rl = createCliHistoryInterface();\n\n while (true) {\n const line = await prompt(rl, \"You: \");\n const trimmed = line.trim();\n if (!trimmed) {\n continue;\n }\n if (EXIT_COMMANDS.has(trimmed.toLowerCase())) {\n rl.close();\n break;\n }\n await sendCliPrompt({\n config,\n agentRunClient,\n sessionKey,\n content: trimmed,\n metadata,\n });\n }\n}\n\nexport async function runCliAgentCommand(params: {\n logo: string;\n opts: AgentCommandOptions;\n config: Config;\n kernel: NextclawKernel;\n}): Promise<void> {\n const {\n config,\n kernel,\n logo,\n opts,\n } = params;\n await kernel.extensions.load({ config });\n await kernel.start();\n\n try {\n const agentRunClient = new AgentRunClient({\n eventBus: kernel.eventBus,\n ingress: kernel.ingress,\n });\n const sessionKey = opts.session ?? \"cli:default\";\n const sharedMetadata = typeof opts.model === \"string\" && opts.model.trim()\n ? { model: opts.model.trim() }\n : {};\n\n if (opts.message) {\n const success = await sendCliPrompt({\n config,\n agentRunClient,\n sessionKey,\n content: opts.message,\n metadata: sharedMetadata,\n });\n if (!success) {\n process.exitCode = 1;\n }\n return;\n }\n\n await runCliInteractiveLoop({\n logo,\n config,\n agentRunClient,\n sessionKey,\n metadata: sharedMetadata,\n });\n } finally {\n await kernel.dispose();\n }\n}\n"],"mappings":";;;;;;;AAgBA,MAAM,gBAAgB,IAAI,IAAI;CAAC;CAAQ;CAAQ;CAAS;CAAS;CAAK,CAAC;AAGvE,SAAS,4BAA4B;CACnC,MAAM,cAAc,KAAK,YAAY,EAAE,WAAW,cAAc;AAChE,WAAU,QAAQ,aAAa,KAAK,EAAE,EAAE,WAAW,MAAM,CAAC;CAE1D,MAAM,UAAU,WAAW,YAAY,GACnC,aAAa,aAAa,QAAQ,CAAC,MAAM,KAAK,CAAC,OAAO,QAAQ,GAC9D,EAAE;CACN,MAAM,KAAK,gBAAgB;EACzB,OAAO,QAAQ;EACf,QAAQ,QAAQ;EACjB,CAAC;AACF,IAAG,GAAG,eAAe;AAInB,gBAAc,aAHC,QAAQ,OACpB,GAAwC,WAAW,EAAE,CACvD,CACiC,KAAK,KAAK,CAAC;AAC7C,UAAQ,KAAK,EAAE;GACf;AAEF,QAAO;;AAGT,eAAe,cAAc,QAA2C;AACtE,KAAI;AAEF,qBADiB,MAAM,sBAAsB,OAAO,CACxB;AAC5B,SAAO;UACA,OAAO;EACd,MAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,OAAO,SAAS,gBAAgB;AACzF,UAAQ,MAAM,UAAU,QAAQ,MAAM,IAAI,kBAAkB;AAC5D,SAAO;;;AAIX,eAAe,sBAAsB,QAMnB;CAChB,MAAM,EAAE,gBAAgB,QAAQ,MAAM,UAAU,eAAe;AAC/D,SAAQ,IAAI,GAAG,KAAK,mDAAmD;CACvE,MAAM,KAAK,2BAA2B;AAEtC,QAAO,MAAM;EAEX,MAAM,WADO,MAAM,OAAO,IAAI,QAAQ,EACjB,MAAM;AAC3B,MAAI,CAAC,QACH;AAEF,MAAI,cAAc,IAAI,QAAQ,aAAa,CAAC,EAAE;AAC5C,MAAG,OAAO;AACV;;AAEF,QAAM,cAAc;GAClB;GACA;GACA;GACA,SAAS;GACT;GACD,CAAC;;;AAIN,eAAsB,mBAAmB,QAKvB;CAChB,MAAM,EACJ,QACA,QACA,MACA,SACE;AACJ,OAAM,OAAO,WAAW,KAAK,EAAE,QAAQ,CAAC;AACxC,OAAM,OAAO,OAAO;AAEpB,KAAI;EACF,MAAM,iBAAiB,IAAI,eAAe;GACxC,UAAU,OAAO;GACjB,SAAS,OAAO;GACjB,CAAC;EACF,MAAM,aAAa,KAAK,WAAW;EACnC,MAAM,iBAAiB,OAAO,KAAK,UAAU,YAAY,KAAK,MAAM,MAAM,GACtE,EAAE,OAAO,KAAK,MAAM,MAAM,EAAE,GAC5B,EAAE;AAEN,MAAI,KAAK,SAAS;AAQhB,OAAI,CAPY,MAAM,cAAc;IAClC;IACA;IACA;IACA,SAAS,KAAK;IACd,UAAU;IACX,CAAC,CAEA,SAAQ,WAAW;AAErB;;AAGF,QAAM,sBAAsB;GAC1B;GACA;GACA;GACA;GACA,UAAU;GACX,CAAC;WACM;AACR,QAAM,OAAO,SAAS"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"service-runtime.service.d.ts","names":[],"sources":["../src/service-runtime.service.ts"],"mappings":";;;;;;;;;;;;;;;;;;;;;KA0CY,6BAAA;EACV,IAAA;AAAA;AAAA,KAGU,6BAAA;EACV,MAAA,GAAS,IAAA;IAAS,OAAA;IAAkB,IAAA;EAAA,MAAqB,OAAA;EACzD,WAAA,GACE,QAAA,UACA,IAAA;IAAS,OAAA;IAAkB,IAAA;EAAA,MACxB,OAAA;AAAA;AAAA,KAGK,uBAAA;EACV,MAAA,EAAQ,oBAAA;EACR,MAAA,EAAQ,cAAA;EACR,OAAA,EAAS,eAAA;EACT,MAAA,EAAQ,cAAA;EACR,GAAA,EAAK,WAAA;EACL,OAAA,EAAS,eAAA;EACT,MAAA,EAAQ,aAAA;EACR,QAAA,EAAU,eAAA;EACV,IAAA,EAAM,YAAA;EACN,WAAA,EAAa,mBAAA;EACb,IAAA,EAAM,YAAA;EACN,OAAA,EAAS,eAAA;EACT,EAAA,EAAI,UAAA;EACJ,KAAA,EAAO,aAAA;EACP,OAAA,EAAS,eAAA;EACT,KAAA,EAAO,aAAA;EACP,IAAA,EAAM,YAAA;EACN,KAAA,EAAO,sBAAA;AAAA;AAAA,cAGI,sBAAA;EAAA,QACH,IAAA;EAAA,QACA,kBAAA;EAAA,QACA,kBAAA;EAAA,QACA,iBAAA;EAAA,QACA,qBAAA;EAAA,QACA,gBAAA;EAAA,QACA,qBAAA;EAAA,QACA,oBAAA;EAAA,QACA,cAAA;EACR,OAAA,EAAS,6BAAA;EACT,QAAA,EAAU,uBAAA;cACE,OAAA,EAAS,6BAAA;EAAA,QAyCb,cAAA;EAAA,IA4DJ,OAAA,CAAA;EAAA,QAII,mBAAA;EAAA,QAOA,wBAAA;EAAA,QAuCA,yBAAA;EAAA,QA0GA,cAAA;EAAA,QAIA,mCAAA;EA0BR,OAAA,QAAoB,OAAA;EAOpB,IAAA,GAAc,OAAA;IAAW,MAAA;IAAiB,IAAA;IAAgB,KAAA;EAAA,MAAyB,OAAA;EA8CnF,KAAA,GAAe,IAAA,GAAM,mBAAA,KAA2B,OAAA;EAKhD,KAAA,GAAe,IAAA,EAAM,mBAAA,KAAsB,OAAA;
|
|
1
|
+
{"version":3,"file":"service-runtime.service.d.ts","names":[],"sources":["../src/service-runtime.service.ts"],"mappings":";;;;;;;;;;;;;;;;;;;;;KA0CY,6BAAA;EACV,IAAA;AAAA;AAAA,KAGU,6BAAA;EACV,MAAA,GAAS,IAAA;IAAS,OAAA;IAAkB,IAAA;EAAA,MAAqB,OAAA;EACzD,WAAA,GACE,QAAA,UACA,IAAA;IAAS,OAAA;IAAkB,IAAA;EAAA,MACxB,OAAA;AAAA;AAAA,KAGK,uBAAA;EACV,MAAA,EAAQ,oBAAA;EACR,MAAA,EAAQ,cAAA;EACR,OAAA,EAAS,eAAA;EACT,MAAA,EAAQ,cAAA;EACR,GAAA,EAAK,WAAA;EACL,OAAA,EAAS,eAAA;EACT,MAAA,EAAQ,aAAA;EACR,QAAA,EAAU,eAAA;EACV,IAAA,EAAM,YAAA;EACN,WAAA,EAAa,mBAAA;EACb,IAAA,EAAM,YAAA;EACN,OAAA,EAAS,eAAA;EACT,EAAA,EAAI,UAAA;EACJ,KAAA,EAAO,aAAA;EACP,OAAA,EAAS,eAAA;EACT,KAAA,EAAO,aAAA;EACP,IAAA,EAAM,YAAA;EACN,KAAA,EAAO,sBAAA;AAAA;AAAA,cAGI,sBAAA;EAAA,QACH,IAAA;EAAA,QACA,kBAAA;EAAA,QACA,kBAAA;EAAA,QACA,iBAAA;EAAA,QACA,qBAAA;EAAA,QACA,gBAAA;EAAA,QACA,qBAAA;EAAA,QACA,oBAAA;EAAA,QACA,cAAA;EACR,OAAA,EAAS,6BAAA;EACT,QAAA,EAAU,uBAAA;cACE,OAAA,EAAS,6BAAA;EAAA,QAyCb,cAAA;EAAA,IA4DJ,OAAA,CAAA;EAAA,QAII,mBAAA;EAAA,QAOA,wBAAA;EAAA,QAuCA,yBAAA;EAAA,QA0GA,cAAA;EAAA,QAIA,mCAAA;EA0BR,OAAA,QAAoB,OAAA;EAOpB,IAAA,GAAc,OAAA;IAAW,MAAA;IAAiB,IAAA;IAAgB,KAAA;EAAA,MAAyB,OAAA;EA8CnF,KAAA,GAAe,IAAA,GAAM,mBAAA,KAA2B,OAAA;EAKhD,KAAA,GAAe,IAAA,EAAM,mBAAA,KAAsB,OAAA;EAgB3C,MAAA,GAAgB,IAAA,EAAM,oBAAA,KAAuB,OAAA;AAAA;AAAA,cAkBlC,6BAAA,GACX,IAAA"}
|
|
@@ -333,13 +333,11 @@ var NextclawServiceRuntime = class {
|
|
|
333
333
|
configPath
|
|
334
334
|
});
|
|
335
335
|
const config = kernel.configManager.config;
|
|
336
|
-
const providerManager = kernel.llmUsage.observeProviderManager(kernel.llmProviders, "cli-agent");
|
|
337
336
|
await runCliAgentCommand({
|
|
338
337
|
logo: this.logo,
|
|
339
338
|
opts,
|
|
340
339
|
config,
|
|
341
|
-
kernel
|
|
342
|
-
providerManager
|
|
340
|
+
kernel
|
|
343
341
|
});
|
|
344
342
|
};
|
|
345
343
|
update = async (opts) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"service-runtime.service.js","names":[],"sources":["../src/service-runtime.service.ts"],"sourcesContent":["import { loadConfig, getConfigPath, getDataDir, resolveWorkspacePath, APP_NAME } from \"@nextclaw/core\";\nimport { NextclawKernel } from \"@nextclaw/kernel\";\nimport { RemoteRuntimeActions } from \"@nextclaw/remote\";\nimport { existsSync, mkdirSync } from \"node:fs\";\nimport { spawn } from \"node:child_process\";\nimport { RestartCoordinator } from \"@nextclaw-service/shared/services/restart/restart-coordinator.service.js\";\nimport type { RestartStrategy } from \"@nextclaw-service/shared/services/restart/restart-coordinator.service.js\";\nimport { initializeConfigIfMissing } from \"@nextclaw-service/shared/services/runtime/runtime-config-init.service.js\";\nimport { writeRestartSentinel } from \"@nextclaw-service/shared/services/restart/restart-sentinel.service.js\";\nimport { createTopLevelNextclawCommandEnv } from \"@nextclaw-service/shared/utils/top-level-nextclaw-command-env.utils.js\";\nimport { resolveCliSubcommandLaunch } from \"@nextclaw-service/shared/utils/marketplace/cli-subcommand-launch.utils.js\";\nimport { logStartupTrace, measureStartupSync } from \"@nextclaw-service/shared/utils/startup-trace.js\";\nimport { isProcessRunning } from \"@nextclaw-service/shared/utils/cli.utils.js\";\nimport { NpmRuntimeUpdateCommandService } from \"@nextclaw-service/launcher/npm-runtime-update-command.service.js\";\nimport { NpmRuntimeLauncher } from \"@nextclaw-service/launcher/npm-runtime-launcher.service.js\";\nimport { managedServiceStateStore } from \"@nextclaw-service/shared/stores/managed-service-state.store.js\";\nimport { ConfigCommands } from \"@nextclaw-service/cli/commands/config/index.js\";\nimport { McpCommands } from \"@nextclaw-service/cli/commands/mcp/index.js\";\nimport { SecretsCommands } from \"@nextclaw-service/cli/commands/secrets/index.js\";\nimport { ChannelCommands } from \"@nextclaw-service/commands/channel/index.js\";\nimport { CronCommands } from \"@nextclaw-service/cli/commands/cron/index.js\";\nimport { AgentCommands, runCliAgentCommand } from \"@nextclaw-service/cli/commands/agent/index.js\";\nimport { PlatformAuthCommands } from \"@nextclaw-service/commands/platform-auth/index.js\";\nimport { RemoteCommands, hasRunningNextclawManagedService } from \"@nextclaw-service/commands/remote/index.js\";\nimport { DiagnosticsCommands } from \"@nextclaw-service/cli/commands/diagnostics/index.js\";\nimport { LogsCommands } from \"@nextclaw-service/cli/commands/logs/index.js\";\nimport { RuntimeCommandService } from \"@nextclaw-service/shared/services/runtime/runtime-command.service.js\";\nimport { NextclawDistributionService } from \"@nextclaw-service/shared/services/runtime/nextclaw-distribution.service.js\";\nimport { ServiceCommands } from \"@nextclaw-service/commands/service/index.js\";\nimport { WorkspaceManager } from \"@nextclaw-service/shared/services/workspace/workspace-manager.service.js\";\nimport { RuntimeRestartRequestService } from \"@nextclaw-service/shared/services/restart/runtime-restart-request.service.js\";\nimport { SkillsCommands } from \"@nextclaw-service/cli/commands/skills/index.js\";\nimport { GatewayCommands } from \"@nextclaw-service/cli/commands/gateway/index.js\";\nimport { UiCommands } from \"@nextclaw-service/cli/commands/ui/index.js\";\nimport { StartCommands } from \"@nextclaw-service/cli/commands/start/index.js\";\nimport { RestartCommands } from \"@nextclaw-service/cli/commands/restart/index.js\";\nimport { ServeCommands } from \"@nextclaw-service/cli/commands/serve/index.js\";\nimport { StopCommands } from \"@nextclaw-service/cli/commands/stop/index.js\";\nimport { LlmUsageCommandService } from \"@nextclaw-service/cli/commands/usage/index.js\";\nimport type { AgentCommandOptions, LoginCommandOptions, RequestRestartParams, UpdateCommandOptions } from \"@nextclaw-service/shared/types/cli.types.js\";\nconst FORCED_PUBLIC_UI_HOST = \"0.0.0.0\";\n\nexport type NextclawServiceRuntimeOptions = {\n logo?: string;\n};\n\nexport type NextclawServiceRuntimeAccount = {\n status: (opts?: { apiBase?: string; json?: boolean }) => Promise<void>;\n setUsername: (\n username: string,\n opts?: { apiBase?: string; json?: boolean },\n ) => Promise<void>;\n};\n\nexport type NextclawServiceCommands = {\n remote: RemoteRuntimeActions;\n skills: SkillsCommands;\n service: ServiceCommands;\n config: ConfigCommands;\n mcp: McpCommands;\n secrets: SecretsCommands;\n agents: AgentCommands;\n channels: ChannelCommands;\n cron: CronCommands;\n diagnostics: DiagnosticsCommands;\n logs: LogsCommands;\n gateway: GatewayCommands;\n ui: UiCommands;\n start: StartCommands;\n restart: RestartCommands;\n serve: ServeCommands;\n stop: StopCommands;\n usage: LlmUsageCommandService;\n};\n\nexport class NextclawServiceRuntime {\n private logo: string;\n private restartCoordinator: RestartCoordinator;\n private serviceRestartTask: Promise<boolean> | null = null;\n private selfRelaunchArmed = false;\n private restartRequestService: RuntimeRestartRequestService;\n private workspaceManager: WorkspaceManager;\n private runtimeCommandService: RuntimeCommandService;\n private platformAuthCommands!: PlatformAuthCommands;\n private remoteCommands!: RemoteCommands;\n account: NextclawServiceRuntimeAccount;\n commands: NextclawServiceCommands;\n constructor(options: NextclawServiceRuntimeOptions) {\n logStartupTrace(\"cli.runtime.constructor.begin\");\n this.logo = options.logo ?? \"🤖\";\n this.workspaceManager = measureStartupSync(\"cli.runtime.workspace_manager\", () => new WorkspaceManager());\n this.runtimeCommandService = measureStartupSync(\"cli.runtime.runtime_command_service\", () => new RuntimeCommandService({\n requestRestart: (params) => this.requestRestart(params),\n initializeAgentHomeDirectory: (homeDirectory) => this.workspaceManager.createWorkspaceTemplates(homeDirectory)\n }));\n this.commands = this.createCommands();\n\n this.restartCoordinator = measureStartupSync(\"cli.runtime.restart_coordinator\", () => new RestartCoordinator({\n readServiceState: managedServiceStateStore.read,\n isProcessRunning,\n currentPid: () => process.pid,\n restartBackgroundService: async (reason) =>\n this.restartBackgroundService(reason),\n scheduleProcessExit: (delayMs, reason) =>\n this.scheduleProcessExit(delayMs, reason),\n }));\n this.restartRequestService = new RuntimeRestartRequestService({\n armManagedServiceRelaunch: (params) => this.armManagedServiceRelaunch(params),\n requestRestartFromCoordinator: async (params) =>\n await this.restartCoordinator.requestRestart(params)\n });\n this.account = {\n status: async (opts = {}) => {\n await this.init({ source: \"account status\", auto: true });\n await this.platformAuthCommands.accountStatus(opts);\n },\n setUsername: async (username, opts = {}) => {\n await this.init({ source: \"account set-username\", auto: true });\n await this.platformAuthCommands.accountSetUsername({\n apiBase: opts.apiBase,\n json: opts.json,\n username\n });\n },\n };\n logStartupTrace(\"cli.runtime.constructor.end\");\n }\n\n private createCommands = (): NextclawServiceCommands => {\n const start = measureStartupSync(\"cli.runtime.start_commands\", () => new StartCommands({\n runtimeCommandService: this.runtimeCommandService,\n forcedPublicHost: FORCED_PUBLIC_UI_HOST,\n init: (params) => this.init(params)\n }));\n this.platformAuthCommands = measureStartupSync(\"cli.runtime.platform_auth_commands\", () => new PlatformAuthCommands());\n this.remoteCommands = measureStartupSync(\"cli.runtime.remote_commands\", () => new RemoteCommands());\n return {\n remote: measureStartupSync(\"cli.runtime.remote_runtime_actions\", () => new RemoteRuntimeActions({\n appName: APP_NAME,\n initAuto: (source) => this.init({ source, auto: true }),\n remoteCommands: this.remoteCommands,\n restartBackgroundService: (reason) => this.restartBackgroundService(reason),\n hasRunningManagedService: hasRunningNextclawManagedService\n })),\n skills: measureStartupSync(\"cli.runtime.skills_commands\", () => new SkillsCommands()),\n service: measureStartupSync(\"cli.runtime.service_commands\", () => new ServiceCommands()),\n config: measureStartupSync(\"cli.runtime.config_commands\", () => new ConfigCommands({\n requestRestart: (params) => this.requestRestart(params),\n })),\n mcp: measureStartupSync(\"cli.runtime.mcp_commands\", () => new McpCommands()),\n secrets: measureStartupSync(\"cli.runtime.secrets_commands\", () => new SecretsCommands({\n requestRestart: (params) => this.requestRestart(params),\n })),\n agents: measureStartupSync(\"cli.runtime.agent_commands\", () => new AgentCommands({\n initializeAgentHomeDirectory: (homeDirectory) => this.workspaceManager.createWorkspaceTemplates(homeDirectory)\n })),\n channels: measureStartupSync(\"cli.runtime.channel_commands\", () => new ChannelCommands({\n requestRestart: (params) => this.requestRestart(params),\n })),\n cron: measureStartupSync(\"cli.runtime.cron_commands\", () => new CronCommands()),\n diagnostics: measureStartupSync(\"cli.runtime.diagnostics_commands\", () => new DiagnosticsCommands({ logo: this.logo })),\n logs: measureStartupSync(\"cli.runtime.logs_commands\", () => new LogsCommands()),\n gateway: measureStartupSync(\"cli.runtime.gateway_commands\", () => new GatewayCommands({\n runtimeCommandService: this.runtimeCommandService,\n forcedPublicHost: FORCED_PUBLIC_UI_HOST\n })),\n ui: measureStartupSync(\"cli.runtime.ui_commands\", () => new UiCommands({\n runtimeCommandService: this.runtimeCommandService,\n forcedPublicHost: FORCED_PUBLIC_UI_HOST\n })),\n start,\n restart: measureStartupSync(\"cli.runtime.restart_commands\", () => new RestartCommands({\n runtimeCommandService: this.runtimeCommandService,\n startCommands: start,\n forcedPublicHost: FORCED_PUBLIC_UI_HOST,\n writeRestartSentinelFromExecContext: (reason) => this.writeRestartSentinelFromExecContext(reason)\n })),\n serve: measureStartupSync(\"cli.runtime.serve_commands\", () => new ServeCommands({\n runtimeCommandService: this.runtimeCommandService,\n forcedPublicHost: FORCED_PUBLIC_UI_HOST\n })),\n stop: measureStartupSync(\"cli.runtime.stop_commands\", () => new StopCommands({\n runtimeCommandService: this.runtimeCommandService\n })),\n usage: measureStartupSync(\"cli.runtime.usage_commands\", () => new LlmUsageCommandService()),\n };\n };\n\n get version(): string {\n return NextclawDistributionService.get().version;\n }\n\n private scheduleProcessExit = (delayMs: number, reason: string): void => {\n console.warn(`Gateway restart requested (${reason}).`);\n setTimeout(() => {\n process.exit(0);\n }, delayMs);\n };\n\n private restartBackgroundService = async (reason: string): Promise<boolean> => {\n if (this.serviceRestartTask) {\n return this.serviceRestartTask;\n }\n\n this.serviceRestartTask = (async () => {\n const state = managedServiceStateStore.read();\n if (!state || !isProcessRunning(state.pid) || state.pid === process.pid) {\n return false;\n }\n\n const uiHost = FORCED_PUBLIC_UI_HOST;\n const uiPort =\n typeof state.uiPort === \"number\" && Number.isFinite(state.uiPort)\n ? state.uiPort\n : 55667;\n\n console.log(\n `Applying changes (${reason}): restarting ${APP_NAME} background service...`,\n );\n await this.runtimeCommandService.stopService();\n await this.runtimeCommandService.startService({\n uiOverrides: {\n enabled: true,\n host: uiHost,\n port: uiPort,\n },\n open: false,\n });\n return true;\n })();\n\n try {\n return await this.serviceRestartTask;\n } finally {\n this.serviceRestartTask = null;\n }\n };\n\n private armManagedServiceRelaunch = (params: {\n reason: string;\n strategy?: RestartStrategy;\n delayMs?: number;\n }): void => {\n const { delayMs: requestedDelayMs, reason, strategy: requestedStrategy } = params;\n const strategy = requestedStrategy ?? \"background-service-or-manual\";\n if (\n strategy !== \"background-service-or-exit\" &&\n strategy !== \"exit-process\"\n ) {\n return;\n }\n if (this.selfRelaunchArmed) {\n return;\n }\n\n const state = managedServiceStateStore.read();\n if (!state || state.pid !== process.pid) {\n return;\n }\n\n const uiPort =\n typeof state.uiPort === \"number\" && Number.isFinite(state.uiPort)\n ? state.uiPort\n : 55667;\n const delayMs =\n typeof requestedDelayMs === \"number\" && Number.isFinite(requestedDelayMs)\n ? Math.max(0, Math.floor(requestedDelayMs))\n : 100;\n const launch = resolveCliSubcommandLaunch({\n argvEntry: process.argv[1],\n importMetaUrl: import.meta.url,\n cliArgs: [\"start\", \"--ui-port\", String(uiPort)],\n nodePath: process.execPath\n });\n const serviceStatePath = managedServiceStateStore.path;\n const helperScript = [\n 'const { spawnSync } = require(\"node:child_process\");',\n 'const { readFileSync } = require(\"node:fs\");',\n `const parentPid = ${process.pid};`,\n `const delayMs = ${delayMs};`,\n \"const maxWaitMs = 120000;\",\n \"const retryIntervalMs = 1000;\",\n `const command = ${JSON.stringify(launch.command)};`,\n `const args = ${JSON.stringify(launch.args)};`,\n `const serviceStatePath = ${JSON.stringify(serviceStatePath)};`,\n \"function isRunning(pid) {\",\n \" try {\",\n \" process.kill(pid, 0);\",\n \" return true;\",\n \" } catch {\",\n \" return false;\",\n \" }\",\n \"}\",\n \"function hasReplacementService() {\",\n \" try {\",\n ' const raw = readFileSync(serviceStatePath, \"utf-8\");',\n \" const state = JSON.parse(raw);\",\n \" const pid = Number(state?.pid);\",\n \" return Number.isFinite(pid) && pid > 0 && pid !== parentPid && isRunning(pid);\",\n \" } catch {\",\n \" return false;\",\n \" }\",\n \"}\",\n \"function tryStart() {\",\n \" spawnSync(command, args, {\",\n ' stdio: \"ignore\",',\n \" env: process.env,\",\n \" timeout: 60000,\",\n \" windowsHide: true\",\n \" });\",\n \"}\",\n \"setTimeout(() => {\",\n \" const startedAt = Date.now();\",\n \" const tick = () => {\",\n \" if (hasReplacementService() || Date.now() - startedAt >= maxWaitMs) {\",\n \" process.exit(0);\",\n \" return;\",\n \" }\",\n \" tryStart();\",\n \" if (hasReplacementService()) {\",\n \" process.exit(0);\",\n \" return;\",\n \" }\",\n \" setTimeout(tick, retryIntervalMs);\",\n \" };\",\n \" tick();\",\n \"}, delayMs);\",\n ].join(\"\\n\");\n\n try {\n const helper = spawn(process.execPath, [\"-e\", helperScript], {\n detached: true,\n stdio: \"ignore\",\n env: createTopLevelNextclawCommandEnv(process.env),\n windowsHide: true\n });\n helper.unref();\n this.selfRelaunchArmed = true;\n console.warn(`Gateway self-restart armed (${reason}).`);\n } catch (error) {\n console.error(`Failed to arm gateway self-restart: ${String(error)}`);\n }\n };\n\n private requestRestart = async (params: RequestRestartParams): Promise<void> => {\n await this.restartRequestService.run(params);\n };\n\n private writeRestartSentinelFromExecContext = async (reason: string): Promise<void> => {\n const sessionKeyRaw = process.env.NEXTCLAW_RUNTIME_SESSION_KEY;\n const sessionKey =\n typeof sessionKeyRaw === \"string\" ? sessionKeyRaw.trim() : \"\";\n if (!sessionKey) {\n return;\n }\n\n try {\n await writeRestartSentinel({\n kind: \"restart\",\n status: \"ok\",\n ts: Date.now(),\n sessionKey,\n stats: {\n reason: reason || \"cli.restart\",\n strategy: \"exec-tool\",\n },\n });\n } catch (error) {\n console.warn(\n `Warning: failed to write restart sentinel from exec context: ${String(error)}`,\n );\n }\n };\n\n onboard = async (): Promise<void> => {\n console.warn(\n `Warning: ${APP_NAME} onboard is deprecated. Use \"${APP_NAME} init\" instead.`,\n );\n await this.init({ source: \"onboard\" });\n };\n\n init = async (options: { source?: string; auto?: boolean; force?: boolean } = {}): Promise<void> => {\n const source = options.source ?? \"init\";\n const prefix = options.auto ? \"Auto init\" : \"Init\";\n const force = Boolean(options.force);\n\n const configPath = getConfigPath();\n const createdConfig = initializeConfigIfMissing(configPath);\n\n const config = loadConfig();\n const workspacePath = resolveWorkspacePath(config.agents.defaults.workspace);\n const workspaceExisted = existsSync(workspacePath);\n mkdirSync(workspacePath, { recursive: true });\n const templateResult = this.workspaceManager.createWorkspaceTemplates(\n workspacePath,\n { force },\n );\n\n if (createdConfig) {\n console.log(`✓ ${prefix}: created config at ${configPath}`);\n }\n if (!workspaceExisted) {\n console.log(`✓ ${prefix}: created workspace at ${workspacePath}`);\n }\n for (const file of templateResult.created) {\n console.log(`✓ ${prefix}: created ${file}`);\n }\n if (\n !createdConfig &&\n workspaceExisted &&\n templateResult.created.length === 0\n ) {\n console.log(`${prefix}: already initialized.`);\n }\n\n if (!options.auto) {\n console.log(`\\n${this.logo} ${APP_NAME} is ready! (${source})`);\n console.log(\"\\nNext steps:\");\n console.log(` 1. Add your API key to ${configPath}`);\n console.log(` 2. Chat: ${APP_NAME} agent -m \"Hello!\"`);\n } else {\n console.log(\n `Tip: Run \"${APP_NAME} init${force ? \" --force\" : \"\"}\" to re-run initialization if needed.`,\n );\n }\n };\n\n login = async (opts: LoginCommandOptions = {}): Promise<void> => {\n await this.init({ source: \"login\", auto: true });\n await this.platformAuthCommands.login(opts);\n };\n\n agent = async (opts: AgentCommandOptions): Promise<void> => {\n const configPath = getConfigPath();\n const kernel = new NextclawKernel({\n homeDir: getDataDir(),\n configPath,\n });\n const config = kernel.configManager.config;\n\n const providerManager = kernel.llmUsage.observeProviderManager(\n kernel.llmProviders,\n \"cli-agent\",\n );\n\n await runCliAgentCommand({\n logo: this.logo,\n opts,\n config,\n kernel,\n providerManager,\n });\n };\n\n update = async (opts: UpdateCommandOptions): Promise<void> => {\n const versionBefore = this.version;\n if (!opts.json) {\n const installationLabel = process.env.NEXTCLAW_DESKTOP_COMMAND_SURFACE === \"1\" ? \"desktop runtime\" : \"npm launcher\";\n console.log(`Current ${installationLabel} version: ${versionBefore}`);\n }\n const snapshot = await new NpmRuntimeUpdateCommandService().run(opts);\n if (snapshot.status === \"blocked\" || snapshot.status === \"failed\") {\n process.exit(1);\n }\n\n const state = managedServiceStateStore.read();\n if (snapshot.requiresRestart && state && isProcessRunning(state.pid)) {\n console.log(`Tip: restart ${APP_NAME} to apply the update.`);\n }\n };\n}\n\nexport const runNextclawNpmRuntimeLauncher = (\n argv: string[] = process.argv,\n): void => {\n const distribution = NextclawDistributionService.get();\n new NpmRuntimeLauncher({\n argv,\n launcherVersion: distribution.version,\n packagedAppEntrypoint: distribution.appEntrypoint,\n }).run();\n};\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"service-runtime.service.js","names":[],"sources":["../src/service-runtime.service.ts"],"sourcesContent":["import { loadConfig, getConfigPath, getDataDir, resolveWorkspacePath, APP_NAME } from \"@nextclaw/core\";\nimport { NextclawKernel } from \"@nextclaw/kernel\";\nimport { RemoteRuntimeActions } from \"@nextclaw/remote\";\nimport { existsSync, mkdirSync } from \"node:fs\";\nimport { spawn } from \"node:child_process\";\nimport { RestartCoordinator } from \"@nextclaw-service/shared/services/restart/restart-coordinator.service.js\";\nimport type { RestartStrategy } from \"@nextclaw-service/shared/services/restart/restart-coordinator.service.js\";\nimport { initializeConfigIfMissing } from \"@nextclaw-service/shared/services/runtime/runtime-config-init.service.js\";\nimport { writeRestartSentinel } from \"@nextclaw-service/shared/services/restart/restart-sentinel.service.js\";\nimport { createTopLevelNextclawCommandEnv } from \"@nextclaw-service/shared/utils/top-level-nextclaw-command-env.utils.js\";\nimport { resolveCliSubcommandLaunch } from \"@nextclaw-service/shared/utils/marketplace/cli-subcommand-launch.utils.js\";\nimport { logStartupTrace, measureStartupSync } from \"@nextclaw-service/shared/utils/startup-trace.js\";\nimport { isProcessRunning } from \"@nextclaw-service/shared/utils/cli.utils.js\";\nimport { NpmRuntimeUpdateCommandService } from \"@nextclaw-service/launcher/npm-runtime-update-command.service.js\";\nimport { NpmRuntimeLauncher } from \"@nextclaw-service/launcher/npm-runtime-launcher.service.js\";\nimport { managedServiceStateStore } from \"@nextclaw-service/shared/stores/managed-service-state.store.js\";\nimport { ConfigCommands } from \"@nextclaw-service/cli/commands/config/index.js\";\nimport { McpCommands } from \"@nextclaw-service/cli/commands/mcp/index.js\";\nimport { SecretsCommands } from \"@nextclaw-service/cli/commands/secrets/index.js\";\nimport { ChannelCommands } from \"@nextclaw-service/commands/channel/index.js\";\nimport { CronCommands } from \"@nextclaw-service/cli/commands/cron/index.js\";\nimport { AgentCommands, runCliAgentCommand } from \"@nextclaw-service/cli/commands/agent/index.js\";\nimport { PlatformAuthCommands } from \"@nextclaw-service/commands/platform-auth/index.js\";\nimport { RemoteCommands, hasRunningNextclawManagedService } from \"@nextclaw-service/commands/remote/index.js\";\nimport { DiagnosticsCommands } from \"@nextclaw-service/cli/commands/diagnostics/index.js\";\nimport { LogsCommands } from \"@nextclaw-service/cli/commands/logs/index.js\";\nimport { RuntimeCommandService } from \"@nextclaw-service/shared/services/runtime/runtime-command.service.js\";\nimport { NextclawDistributionService } from \"@nextclaw-service/shared/services/runtime/nextclaw-distribution.service.js\";\nimport { ServiceCommands } from \"@nextclaw-service/commands/service/index.js\";\nimport { WorkspaceManager } from \"@nextclaw-service/shared/services/workspace/workspace-manager.service.js\";\nimport { RuntimeRestartRequestService } from \"@nextclaw-service/shared/services/restart/runtime-restart-request.service.js\";\nimport { SkillsCommands } from \"@nextclaw-service/cli/commands/skills/index.js\";\nimport { GatewayCommands } from \"@nextclaw-service/cli/commands/gateway/index.js\";\nimport { UiCommands } from \"@nextclaw-service/cli/commands/ui/index.js\";\nimport { StartCommands } from \"@nextclaw-service/cli/commands/start/index.js\";\nimport { RestartCommands } from \"@nextclaw-service/cli/commands/restart/index.js\";\nimport { ServeCommands } from \"@nextclaw-service/cli/commands/serve/index.js\";\nimport { StopCommands } from \"@nextclaw-service/cli/commands/stop/index.js\";\nimport { LlmUsageCommandService } from \"@nextclaw-service/cli/commands/usage/index.js\";\nimport type { AgentCommandOptions, LoginCommandOptions, RequestRestartParams, UpdateCommandOptions } from \"@nextclaw-service/shared/types/cli.types.js\";\nconst FORCED_PUBLIC_UI_HOST = \"0.0.0.0\";\n\nexport type NextclawServiceRuntimeOptions = {\n logo?: string;\n};\n\nexport type NextclawServiceRuntimeAccount = {\n status: (opts?: { apiBase?: string; json?: boolean }) => Promise<void>;\n setUsername: (\n username: string,\n opts?: { apiBase?: string; json?: boolean },\n ) => Promise<void>;\n};\n\nexport type NextclawServiceCommands = {\n remote: RemoteRuntimeActions;\n skills: SkillsCommands;\n service: ServiceCommands;\n config: ConfigCommands;\n mcp: McpCommands;\n secrets: SecretsCommands;\n agents: AgentCommands;\n channels: ChannelCommands;\n cron: CronCommands;\n diagnostics: DiagnosticsCommands;\n logs: LogsCommands;\n gateway: GatewayCommands;\n ui: UiCommands;\n start: StartCommands;\n restart: RestartCommands;\n serve: ServeCommands;\n stop: StopCommands;\n usage: LlmUsageCommandService;\n};\n\nexport class NextclawServiceRuntime {\n private logo: string;\n private restartCoordinator: RestartCoordinator;\n private serviceRestartTask: Promise<boolean> | null = null;\n private selfRelaunchArmed = false;\n private restartRequestService: RuntimeRestartRequestService;\n private workspaceManager: WorkspaceManager;\n private runtimeCommandService: RuntimeCommandService;\n private platformAuthCommands!: PlatformAuthCommands;\n private remoteCommands!: RemoteCommands;\n account: NextclawServiceRuntimeAccount;\n commands: NextclawServiceCommands;\n constructor(options: NextclawServiceRuntimeOptions) {\n logStartupTrace(\"cli.runtime.constructor.begin\");\n this.logo = options.logo ?? \"🤖\";\n this.workspaceManager = measureStartupSync(\"cli.runtime.workspace_manager\", () => new WorkspaceManager());\n this.runtimeCommandService = measureStartupSync(\"cli.runtime.runtime_command_service\", () => new RuntimeCommandService({\n requestRestart: (params) => this.requestRestart(params),\n initializeAgentHomeDirectory: (homeDirectory) => this.workspaceManager.createWorkspaceTemplates(homeDirectory)\n }));\n this.commands = this.createCommands();\n\n this.restartCoordinator = measureStartupSync(\"cli.runtime.restart_coordinator\", () => new RestartCoordinator({\n readServiceState: managedServiceStateStore.read,\n isProcessRunning,\n currentPid: () => process.pid,\n restartBackgroundService: async (reason) =>\n this.restartBackgroundService(reason),\n scheduleProcessExit: (delayMs, reason) =>\n this.scheduleProcessExit(delayMs, reason),\n }));\n this.restartRequestService = new RuntimeRestartRequestService({\n armManagedServiceRelaunch: (params) => this.armManagedServiceRelaunch(params),\n requestRestartFromCoordinator: async (params) =>\n await this.restartCoordinator.requestRestart(params)\n });\n this.account = {\n status: async (opts = {}) => {\n await this.init({ source: \"account status\", auto: true });\n await this.platformAuthCommands.accountStatus(opts);\n },\n setUsername: async (username, opts = {}) => {\n await this.init({ source: \"account set-username\", auto: true });\n await this.platformAuthCommands.accountSetUsername({\n apiBase: opts.apiBase,\n json: opts.json,\n username\n });\n },\n };\n logStartupTrace(\"cli.runtime.constructor.end\");\n }\n\n private createCommands = (): NextclawServiceCommands => {\n const start = measureStartupSync(\"cli.runtime.start_commands\", () => new StartCommands({\n runtimeCommandService: this.runtimeCommandService,\n forcedPublicHost: FORCED_PUBLIC_UI_HOST,\n init: (params) => this.init(params)\n }));\n this.platformAuthCommands = measureStartupSync(\"cli.runtime.platform_auth_commands\", () => new PlatformAuthCommands());\n this.remoteCommands = measureStartupSync(\"cli.runtime.remote_commands\", () => new RemoteCommands());\n return {\n remote: measureStartupSync(\"cli.runtime.remote_runtime_actions\", () => new RemoteRuntimeActions({\n appName: APP_NAME,\n initAuto: (source) => this.init({ source, auto: true }),\n remoteCommands: this.remoteCommands,\n restartBackgroundService: (reason) => this.restartBackgroundService(reason),\n hasRunningManagedService: hasRunningNextclawManagedService\n })),\n skills: measureStartupSync(\"cli.runtime.skills_commands\", () => new SkillsCommands()),\n service: measureStartupSync(\"cli.runtime.service_commands\", () => new ServiceCommands()),\n config: measureStartupSync(\"cli.runtime.config_commands\", () => new ConfigCommands({\n requestRestart: (params) => this.requestRestart(params),\n })),\n mcp: measureStartupSync(\"cli.runtime.mcp_commands\", () => new McpCommands()),\n secrets: measureStartupSync(\"cli.runtime.secrets_commands\", () => new SecretsCommands({\n requestRestart: (params) => this.requestRestart(params),\n })),\n agents: measureStartupSync(\"cli.runtime.agent_commands\", () => new AgentCommands({\n initializeAgentHomeDirectory: (homeDirectory) => this.workspaceManager.createWorkspaceTemplates(homeDirectory)\n })),\n channels: measureStartupSync(\"cli.runtime.channel_commands\", () => new ChannelCommands({\n requestRestart: (params) => this.requestRestart(params),\n })),\n cron: measureStartupSync(\"cli.runtime.cron_commands\", () => new CronCommands()),\n diagnostics: measureStartupSync(\"cli.runtime.diagnostics_commands\", () => new DiagnosticsCommands({ logo: this.logo })),\n logs: measureStartupSync(\"cli.runtime.logs_commands\", () => new LogsCommands()),\n gateway: measureStartupSync(\"cli.runtime.gateway_commands\", () => new GatewayCommands({\n runtimeCommandService: this.runtimeCommandService,\n forcedPublicHost: FORCED_PUBLIC_UI_HOST\n })),\n ui: measureStartupSync(\"cli.runtime.ui_commands\", () => new UiCommands({\n runtimeCommandService: this.runtimeCommandService,\n forcedPublicHost: FORCED_PUBLIC_UI_HOST\n })),\n start,\n restart: measureStartupSync(\"cli.runtime.restart_commands\", () => new RestartCommands({\n runtimeCommandService: this.runtimeCommandService,\n startCommands: start,\n forcedPublicHost: FORCED_PUBLIC_UI_HOST,\n writeRestartSentinelFromExecContext: (reason) => this.writeRestartSentinelFromExecContext(reason)\n })),\n serve: measureStartupSync(\"cli.runtime.serve_commands\", () => new ServeCommands({\n runtimeCommandService: this.runtimeCommandService,\n forcedPublicHost: FORCED_PUBLIC_UI_HOST\n })),\n stop: measureStartupSync(\"cli.runtime.stop_commands\", () => new StopCommands({\n runtimeCommandService: this.runtimeCommandService\n })),\n usage: measureStartupSync(\"cli.runtime.usage_commands\", () => new LlmUsageCommandService()),\n };\n };\n\n get version(): string {\n return NextclawDistributionService.get().version;\n }\n\n private scheduleProcessExit = (delayMs: number, reason: string): void => {\n console.warn(`Gateway restart requested (${reason}).`);\n setTimeout(() => {\n process.exit(0);\n }, delayMs);\n };\n\n private restartBackgroundService = async (reason: string): Promise<boolean> => {\n if (this.serviceRestartTask) {\n return this.serviceRestartTask;\n }\n\n this.serviceRestartTask = (async () => {\n const state = managedServiceStateStore.read();\n if (!state || !isProcessRunning(state.pid) || state.pid === process.pid) {\n return false;\n }\n\n const uiHost = FORCED_PUBLIC_UI_HOST;\n const uiPort =\n typeof state.uiPort === \"number\" && Number.isFinite(state.uiPort)\n ? state.uiPort\n : 55667;\n\n console.log(\n `Applying changes (${reason}): restarting ${APP_NAME} background service...`,\n );\n await this.runtimeCommandService.stopService();\n await this.runtimeCommandService.startService({\n uiOverrides: {\n enabled: true,\n host: uiHost,\n port: uiPort,\n },\n open: false,\n });\n return true;\n })();\n\n try {\n return await this.serviceRestartTask;\n } finally {\n this.serviceRestartTask = null;\n }\n };\n\n private armManagedServiceRelaunch = (params: {\n reason: string;\n strategy?: RestartStrategy;\n delayMs?: number;\n }): void => {\n const { delayMs: requestedDelayMs, reason, strategy: requestedStrategy } = params;\n const strategy = requestedStrategy ?? \"background-service-or-manual\";\n if (\n strategy !== \"background-service-or-exit\" &&\n strategy !== \"exit-process\"\n ) {\n return;\n }\n if (this.selfRelaunchArmed) {\n return;\n }\n\n const state = managedServiceStateStore.read();\n if (!state || state.pid !== process.pid) {\n return;\n }\n\n const uiPort =\n typeof state.uiPort === \"number\" && Number.isFinite(state.uiPort)\n ? state.uiPort\n : 55667;\n const delayMs =\n typeof requestedDelayMs === \"number\" && Number.isFinite(requestedDelayMs)\n ? Math.max(0, Math.floor(requestedDelayMs))\n : 100;\n const launch = resolveCliSubcommandLaunch({\n argvEntry: process.argv[1],\n importMetaUrl: import.meta.url,\n cliArgs: [\"start\", \"--ui-port\", String(uiPort)],\n nodePath: process.execPath\n });\n const serviceStatePath = managedServiceStateStore.path;\n const helperScript = [\n 'const { spawnSync } = require(\"node:child_process\");',\n 'const { readFileSync } = require(\"node:fs\");',\n `const parentPid = ${process.pid};`,\n `const delayMs = ${delayMs};`,\n \"const maxWaitMs = 120000;\",\n \"const retryIntervalMs = 1000;\",\n `const command = ${JSON.stringify(launch.command)};`,\n `const args = ${JSON.stringify(launch.args)};`,\n `const serviceStatePath = ${JSON.stringify(serviceStatePath)};`,\n \"function isRunning(pid) {\",\n \" try {\",\n \" process.kill(pid, 0);\",\n \" return true;\",\n \" } catch {\",\n \" return false;\",\n \" }\",\n \"}\",\n \"function hasReplacementService() {\",\n \" try {\",\n ' const raw = readFileSync(serviceStatePath, \"utf-8\");',\n \" const state = JSON.parse(raw);\",\n \" const pid = Number(state?.pid);\",\n \" return Number.isFinite(pid) && pid > 0 && pid !== parentPid && isRunning(pid);\",\n \" } catch {\",\n \" return false;\",\n \" }\",\n \"}\",\n \"function tryStart() {\",\n \" spawnSync(command, args, {\",\n ' stdio: \"ignore\",',\n \" env: process.env,\",\n \" timeout: 60000,\",\n \" windowsHide: true\",\n \" });\",\n \"}\",\n \"setTimeout(() => {\",\n \" const startedAt = Date.now();\",\n \" const tick = () => {\",\n \" if (hasReplacementService() || Date.now() - startedAt >= maxWaitMs) {\",\n \" process.exit(0);\",\n \" return;\",\n \" }\",\n \" tryStart();\",\n \" if (hasReplacementService()) {\",\n \" process.exit(0);\",\n \" return;\",\n \" }\",\n \" setTimeout(tick, retryIntervalMs);\",\n \" };\",\n \" tick();\",\n \"}, delayMs);\",\n ].join(\"\\n\");\n\n try {\n const helper = spawn(process.execPath, [\"-e\", helperScript], {\n detached: true,\n stdio: \"ignore\",\n env: createTopLevelNextclawCommandEnv(process.env),\n windowsHide: true\n });\n helper.unref();\n this.selfRelaunchArmed = true;\n console.warn(`Gateway self-restart armed (${reason}).`);\n } catch (error) {\n console.error(`Failed to arm gateway self-restart: ${String(error)}`);\n }\n };\n\n private requestRestart = async (params: RequestRestartParams): Promise<void> => {\n await this.restartRequestService.run(params);\n };\n\n private writeRestartSentinelFromExecContext = async (reason: string): Promise<void> => {\n const sessionKeyRaw = process.env.NEXTCLAW_RUNTIME_SESSION_KEY;\n const sessionKey =\n typeof sessionKeyRaw === \"string\" ? sessionKeyRaw.trim() : \"\";\n if (!sessionKey) {\n return;\n }\n\n try {\n await writeRestartSentinel({\n kind: \"restart\",\n status: \"ok\",\n ts: Date.now(),\n sessionKey,\n stats: {\n reason: reason || \"cli.restart\",\n strategy: \"exec-tool\",\n },\n });\n } catch (error) {\n console.warn(\n `Warning: failed to write restart sentinel from exec context: ${String(error)}`,\n );\n }\n };\n\n onboard = async (): Promise<void> => {\n console.warn(\n `Warning: ${APP_NAME} onboard is deprecated. Use \"${APP_NAME} init\" instead.`,\n );\n await this.init({ source: \"onboard\" });\n };\n\n init = async (options: { source?: string; auto?: boolean; force?: boolean } = {}): Promise<void> => {\n const source = options.source ?? \"init\";\n const prefix = options.auto ? \"Auto init\" : \"Init\";\n const force = Boolean(options.force);\n\n const configPath = getConfigPath();\n const createdConfig = initializeConfigIfMissing(configPath);\n\n const config = loadConfig();\n const workspacePath = resolveWorkspacePath(config.agents.defaults.workspace);\n const workspaceExisted = existsSync(workspacePath);\n mkdirSync(workspacePath, { recursive: true });\n const templateResult = this.workspaceManager.createWorkspaceTemplates(\n workspacePath,\n { force },\n );\n\n if (createdConfig) {\n console.log(`✓ ${prefix}: created config at ${configPath}`);\n }\n if (!workspaceExisted) {\n console.log(`✓ ${prefix}: created workspace at ${workspacePath}`);\n }\n for (const file of templateResult.created) {\n console.log(`✓ ${prefix}: created ${file}`);\n }\n if (\n !createdConfig &&\n workspaceExisted &&\n templateResult.created.length === 0\n ) {\n console.log(`${prefix}: already initialized.`);\n }\n\n if (!options.auto) {\n console.log(`\\n${this.logo} ${APP_NAME} is ready! (${source})`);\n console.log(\"\\nNext steps:\");\n console.log(` 1. Add your API key to ${configPath}`);\n console.log(` 2. Chat: ${APP_NAME} agent -m \"Hello!\"`);\n } else {\n console.log(\n `Tip: Run \"${APP_NAME} init${force ? \" --force\" : \"\"}\" to re-run initialization if needed.`,\n );\n }\n };\n\n login = async (opts: LoginCommandOptions = {}): Promise<void> => {\n await this.init({ source: \"login\", auto: true });\n await this.platformAuthCommands.login(opts);\n };\n\n agent = async (opts: AgentCommandOptions): Promise<void> => {\n const configPath = getConfigPath();\n const kernel = new NextclawKernel({\n homeDir: getDataDir(),\n configPath,\n });\n const config = kernel.configManager.config;\n\n await runCliAgentCommand({\n logo: this.logo,\n opts,\n config,\n kernel,\n });\n };\n\n update = async (opts: UpdateCommandOptions): Promise<void> => {\n const versionBefore = this.version;\n if (!opts.json) {\n const installationLabel = process.env.NEXTCLAW_DESKTOP_COMMAND_SURFACE === \"1\" ? \"desktop runtime\" : \"npm launcher\";\n console.log(`Current ${installationLabel} version: ${versionBefore}`);\n }\n const snapshot = await new NpmRuntimeUpdateCommandService().run(opts);\n if (snapshot.status === \"blocked\" || snapshot.status === \"failed\") {\n process.exit(1);\n }\n\n const state = managedServiceStateStore.read();\n if (snapshot.requiresRestart && state && isProcessRunning(state.pid)) {\n console.log(`Tip: restart ${APP_NAME} to apply the update.`);\n }\n };\n}\n\nexport const runNextclawNpmRuntimeLauncher = (\n argv: string[] = process.argv,\n): void => {\n const distribution = NextclawDistributionService.get();\n new NpmRuntimeLauncher({\n argv,\n launcherVersion: distribution.version,\n packagedAppEntrypoint: distribution.appEntrypoint,\n }).run();\n};\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"workspace-manager.service.d.ts","names":[],"sources":["../../../../src/shared/services/workspace/workspace-manager.service.ts"],"mappings":";cAKa,gBAAA;EAAA,iBACM,OAAA;EAAA,SASR,wBAAA,GAA4B,SAAA,UAAmB,OAAA;IAAW,KAAA;EAAA;IAA2B,OAAA;EAAA;EAAA,
|
|
1
|
+
{"version":3,"file":"workspace-manager.service.d.ts","names":[],"sources":["../../../../src/shared/services/workspace/workspace-manager.service.ts"],"mappings":";cAKa,gBAAA;EAAA,iBACM,OAAA;EAAA,SASR,wBAAA,GAA4B,SAAA,UAAmB,OAAA;IAAW,KAAA;EAAA;IAA2B,OAAA;EAAA;EAAA,iBA4C7E,kBAAA;EAAA,iBAaA,kBAAA;AAAA"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { APP_NAME, DEFAULT_SKILLS_DIR } from "@nextclaw/core";
|
|
1
|
+
import { APP_NAME, DEFAULT_PANELS_DIR, DEFAULT_SKILLS_DIR } from "@nextclaw/core";
|
|
2
2
|
import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
|
|
3
3
|
import { dirname, join, resolve } from "node:path";
|
|
4
4
|
import { fileURLToPath } from "node:url";
|
|
@@ -61,18 +61,17 @@ var WorkspaceManager = class {
|
|
|
61
61
|
writeFileSync(filePath, content);
|
|
62
62
|
created.push(entry.target);
|
|
63
63
|
}
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
created.push(join("memory", ""));
|
|
68
|
-
}
|
|
69
|
-
const skillsDir = join(workspace, DEFAULT_SKILLS_DIR);
|
|
70
|
-
if (!existsSync(skillsDir)) {
|
|
71
|
-
mkdirSync(skillsDir, { recursive: true });
|
|
72
|
-
created.push(join(DEFAULT_SKILLS_DIR, ""));
|
|
73
|
-
}
|
|
64
|
+
this.ensureWorkspaceDir(workspace, "memory", created);
|
|
65
|
+
this.ensureWorkspaceDir(workspace, DEFAULT_SKILLS_DIR, created);
|
|
66
|
+
this.ensureWorkspaceDir(workspace, DEFAULT_PANELS_DIR, created);
|
|
74
67
|
return { created };
|
|
75
68
|
};
|
|
69
|
+
ensureWorkspaceDir = (workspace, dirName, created) => {
|
|
70
|
+
const dir = join(workspace, dirName);
|
|
71
|
+
if (existsSync(dir)) return;
|
|
72
|
+
mkdirSync(dir, { recursive: true });
|
|
73
|
+
created.push(join(dirName, ""));
|
|
74
|
+
};
|
|
76
75
|
resolveTemplateDir = () => {
|
|
77
76
|
const override = process.env.NEXTCLAW_TEMPLATE_DIR?.trim();
|
|
78
77
|
if (override) return override;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"workspace-manager.service.js","names":[],"sources":["../../../../src/shared/services/workspace/workspace-manager.service.ts"],"sourcesContent":["import { existsSync, mkdirSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { dirname, join, resolve } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { APP_NAME, DEFAULT_SKILLS_DIR } from \"@nextclaw/core\";\n\nexport class WorkspaceManager {\n private readonly pkgRoot = resolve(\n fileURLToPath(new URL(\".\", import.meta.url)),\n \"..\",\n \"..\",\n \"..\",\n \"..\",\n \"..\"\n );\n\n readonly createWorkspaceTemplates = (workspace: string, options: { force?: boolean } = {}): { created: string[] } => {\n const created: string[] = [];\n const force = Boolean(options.force);\n const templateDir = this.resolveTemplateDir();\n if (!templateDir) {\n console.warn(\"Warning: Template directory not found. Skipping workspace templates.\");\n }\n const templateFiles = [\n { source: \"AGENTS.md\", target: \"AGENTS.md\" },\n { source: \"SOUL.md\", target: \"SOUL.md\" },\n { source: \"USER.md\", target: \"USER.md\" },\n { source: \"IDENTITY.md\", target: \"IDENTITY.md\" },\n { source: \"TOOLS.md\", target: \"TOOLS.md\" },\n { source: \"BOOT.md\", target: \"BOOT.md\" },\n { source: \"BOOTSTRAP.md\", target: \"BOOTSTRAP.md\" },\n { source: \"MEMORY.md\", target: \"MEMORY.md\" },\n { source: \"memory/MEMORY.md\", target: \"memory/MEMORY.md\" }\n ];\n\n if (templateDir) {\n for (const entry of templateFiles) {\n const filePath = join(workspace, entry.target);\n if (!force && existsSync(filePath)) {\n continue;\n }\n const templatePath = join(templateDir, entry.source);\n if (!existsSync(templatePath)) {\n console.warn(`Warning: Template file missing: ${templatePath}`);\n continue;\n }\n const raw = readFileSync(templatePath, \"utf-8\");\n const content = raw.replace(/\\$\\{APP_NAME\\}/g, APP_NAME);\n mkdirSync(dirname(filePath), { recursive: true });\n writeFileSync(filePath, content);\n created.push(entry.target);\n }\n }\n\n
|
|
1
|
+
{"version":3,"file":"workspace-manager.service.js","names":[],"sources":["../../../../src/shared/services/workspace/workspace-manager.service.ts"],"sourcesContent":["import { existsSync, mkdirSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { dirname, join, resolve } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { APP_NAME, DEFAULT_PANELS_DIR, DEFAULT_SKILLS_DIR } from \"@nextclaw/core\";\n\nexport class WorkspaceManager {\n private readonly pkgRoot = resolve(\n fileURLToPath(new URL(\".\", import.meta.url)),\n \"..\",\n \"..\",\n \"..\",\n \"..\",\n \"..\"\n );\n\n readonly createWorkspaceTemplates = (workspace: string, options: { force?: boolean } = {}): { created: string[] } => {\n const created: string[] = [];\n const force = Boolean(options.force);\n const templateDir = this.resolveTemplateDir();\n if (!templateDir) {\n console.warn(\"Warning: Template directory not found. Skipping workspace templates.\");\n }\n const templateFiles = [\n { source: \"AGENTS.md\", target: \"AGENTS.md\" },\n { source: \"SOUL.md\", target: \"SOUL.md\" },\n { source: \"USER.md\", target: \"USER.md\" },\n { source: \"IDENTITY.md\", target: \"IDENTITY.md\" },\n { source: \"TOOLS.md\", target: \"TOOLS.md\" },\n { source: \"BOOT.md\", target: \"BOOT.md\" },\n { source: \"BOOTSTRAP.md\", target: \"BOOTSTRAP.md\" },\n { source: \"MEMORY.md\", target: \"MEMORY.md\" },\n { source: \"memory/MEMORY.md\", target: \"memory/MEMORY.md\" }\n ];\n\n if (templateDir) {\n for (const entry of templateFiles) {\n const filePath = join(workspace, entry.target);\n if (!force && existsSync(filePath)) {\n continue;\n }\n const templatePath = join(templateDir, entry.source);\n if (!existsSync(templatePath)) {\n console.warn(`Warning: Template file missing: ${templatePath}`);\n continue;\n }\n const raw = readFileSync(templatePath, \"utf-8\");\n const content = raw.replace(/\\$\\{APP_NAME\\}/g, APP_NAME);\n mkdirSync(dirname(filePath), { recursive: true });\n writeFileSync(filePath, content);\n created.push(entry.target);\n }\n }\n\n this.ensureWorkspaceDir(workspace, \"memory\", created);\n this.ensureWorkspaceDir(workspace, DEFAULT_SKILLS_DIR, created);\n this.ensureWorkspaceDir(workspace, DEFAULT_PANELS_DIR, created);\n return { created };\n };\n\n private readonly ensureWorkspaceDir = (\n workspace: string,\n dirName: string,\n created: string[],\n ): void => {\n const dir = join(workspace, dirName);\n if (existsSync(dir)) {\n return;\n }\n mkdirSync(dir, { recursive: true });\n created.push(join(dirName, \"\"));\n };\n\n private readonly resolveTemplateDir = (): string | null => {\n const override = process.env.NEXTCLAW_TEMPLATE_DIR?.trim();\n if (override) {\n return override;\n }\n const candidates = [join(this.pkgRoot, \"templates\")];\n for (const candidate of candidates) {\n if (existsSync(candidate)) {\n return candidate;\n }\n }\n return null;\n };\n\n}\n"],"mappings":";;;;;AAKA,IAAa,mBAAb,MAA8B;CAC5B,UAA2B,QACzB,cAAc,IAAI,IAAI,KAAK,OAAO,KAAK,IAAI,CAAC,EAC5C,MACA,MACA,MACA,MACA,KACD;CAED,4BAAqC,WAAmB,UAA+B,EAAE,KAA4B;EACnH,MAAM,UAAoB,EAAE;EAC5B,MAAM,QAAQ,QAAQ,QAAQ,MAAM;EACpC,MAAM,cAAc,KAAK,oBAAoB;AAC7C,MAAI,CAAC,YACH,SAAQ,KAAK,uEAAuE;EAEtF,MAAM,gBAAgB;GACpB;IAAE,QAAQ;IAAa,QAAQ;IAAa;GAC5C;IAAE,QAAQ;IAAW,QAAQ;IAAW;GACxC;IAAE,QAAQ;IAAW,QAAQ;IAAW;GACxC;IAAE,QAAQ;IAAe,QAAQ;IAAe;GAChD;IAAE,QAAQ;IAAY,QAAQ;IAAY;GAC1C;IAAE,QAAQ;IAAW,QAAQ;IAAW;GACxC;IAAE,QAAQ;IAAgB,QAAQ;IAAgB;GAClD;IAAE,QAAQ;IAAa,QAAQ;IAAa;GAC5C;IAAE,QAAQ;IAAoB,QAAQ;IAAoB;GAC3D;AAED,MAAI,YACF,MAAK,MAAM,SAAS,eAAe;GACjC,MAAM,WAAW,KAAK,WAAW,MAAM,OAAO;AAC9C,OAAI,CAAC,SAAS,WAAW,SAAS,CAChC;GAEF,MAAM,eAAe,KAAK,aAAa,MAAM,OAAO;AACpD,OAAI,CAAC,WAAW,aAAa,EAAE;AAC7B,YAAQ,KAAK,mCAAmC,eAAe;AAC/D;;GAGF,MAAM,UADM,aAAa,cAAc,QAAQ,CAC3B,QAAQ,mBAAmB,SAAS;AACxD,aAAU,QAAQ,SAAS,EAAE,EAAE,WAAW,MAAM,CAAC;AACjD,iBAAc,UAAU,QAAQ;AAChC,WAAQ,KAAK,MAAM,OAAO;;AAI9B,OAAK,mBAAmB,WAAW,UAAU,QAAQ;AACrD,OAAK,mBAAmB,WAAW,oBAAoB,QAAQ;AAC/D,OAAK,mBAAmB,WAAW,oBAAoB,QAAQ;AAC/D,SAAO,EAAE,SAAS;;CAGpB,sBACE,WACA,SACA,YACS;EACT,MAAM,MAAM,KAAK,WAAW,QAAQ;AACpC,MAAI,WAAW,IAAI,CACjB;AAEF,YAAU,KAAK,EAAE,WAAW,MAAM,CAAC;AACnC,UAAQ,KAAK,KAAK,SAAS,GAAG,CAAC;;CAGjC,2BAA2D;EACzD,MAAM,WAAW,QAAQ,IAAI,uBAAuB,MAAM;AAC1D,MAAI,SACF,QAAO;EAET,MAAM,aAAa,CAAC,KAAK,KAAK,SAAS,YAAY,CAAC;AACpD,OAAK,MAAM,aAAa,WACtB,KAAI,WAAW,UAAU,CACvB,QAAO;AAGX,SAAO"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@nextclaw/service",
|
|
3
|
-
"version": "0.1.18-beta.
|
|
3
|
+
"version": "0.1.18-beta.3",
|
|
4
4
|
"private": false,
|
|
5
5
|
"description": "NextClaw long-running service host and runtime lifecycle.",
|
|
6
6
|
"type": "module",
|
|
@@ -42,30 +42,30 @@
|
|
|
42
42
|
"chokidar": "^3.6.0",
|
|
43
43
|
"commander": "^12.1.0",
|
|
44
44
|
"jszip": "^3.10.1",
|
|
45
|
-
"@nextclaw/channel-extension-
|
|
46
|
-
"@nextclaw/channel-extension-
|
|
47
|
-
"@nextclaw/channel-extension-feishu": "0.1.9-beta.
|
|
48
|
-
"@nextclaw/channel-extension-
|
|
49
|
-
"@nextclaw/channel-extension-slack": "0.1.1-beta.
|
|
50
|
-
"@nextclaw/channel-extension-telegram": "0.1.1-beta.
|
|
51
|
-
"@nextclaw/channel-extension-
|
|
52
|
-
"@nextclaw/channel-extension-
|
|
53
|
-
"@nextclaw/
|
|
54
|
-
"@nextclaw/
|
|
55
|
-
"@nextclaw/
|
|
56
|
-
"@nextclaw/
|
|
57
|
-
"@nextclaw/ncp": "0.5.18-beta.
|
|
58
|
-
"@nextclaw/ncp-
|
|
59
|
-
"@nextclaw/ncp-
|
|
60
|
-
"@nextclaw/
|
|
61
|
-
"@nextclaw/nextclaw-
|
|
62
|
-
"@nextclaw/
|
|
63
|
-
"@nextclaw/nextclaw-ncp-runtime-stdio-client": "0.1.18-beta.
|
|
64
|
-
"@nextclaw/remote": "0.1.103-beta.
|
|
65
|
-
"@nextclaw/runtime": "0.2.57-beta.
|
|
66
|
-
"@nextclaw/server": "0.12.26-beta.
|
|
67
|
-
"@nextclaw/shared": "0.1.12-beta.
|
|
68
|
-
"@nextclaw/
|
|
45
|
+
"@nextclaw/channel-extension-discord": "0.1.1-beta.3",
|
|
46
|
+
"@nextclaw/channel-extension-dingtalk": "0.1.1-beta.3",
|
|
47
|
+
"@nextclaw/channel-extension-feishu": "0.1.9-beta.3",
|
|
48
|
+
"@nextclaw/channel-extension-qq": "0.1.6-beta.3",
|
|
49
|
+
"@nextclaw/channel-extension-slack": "0.1.1-beta.3",
|
|
50
|
+
"@nextclaw/channel-extension-telegram": "0.1.1-beta.3",
|
|
51
|
+
"@nextclaw/channel-extension-wecom": "0.1.1-beta.3",
|
|
52
|
+
"@nextclaw/channel-extension-weixin": "0.1.12-beta.3",
|
|
53
|
+
"@nextclaw/channel-extension-whatsapp": "0.1.1-beta.3",
|
|
54
|
+
"@nextclaw/core": "0.12.25-beta.3",
|
|
55
|
+
"@nextclaw/kernel": "0.1.15-beta.3",
|
|
56
|
+
"@nextclaw/mcp": "0.1.90-beta.3",
|
|
57
|
+
"@nextclaw/ncp": "0.5.18-beta.3",
|
|
58
|
+
"@nextclaw/ncp-agent-runtime": "0.3.29-beta.3",
|
|
59
|
+
"@nextclaw/ncp-mcp": "0.1.92-beta.3",
|
|
60
|
+
"@nextclaw/ncp-toolkit": "0.5.23-beta.3",
|
|
61
|
+
"@nextclaw/nextclaw-hermes-acp-bridge": "0.1.17-beta.3",
|
|
62
|
+
"@nextclaw/nextclaw-ncp-runtime-http-client": "0.1.17-beta.3",
|
|
63
|
+
"@nextclaw/nextclaw-ncp-runtime-stdio-client": "0.1.18-beta.3",
|
|
64
|
+
"@nextclaw/remote": "0.1.103-beta.3",
|
|
65
|
+
"@nextclaw/runtime": "0.2.57-beta.3",
|
|
66
|
+
"@nextclaw/server": "0.12.26-beta.3",
|
|
67
|
+
"@nextclaw/shared": "0.1.12-beta.3",
|
|
68
|
+
"@nextclaw/channel-extension-email": "0.1.1-beta.3"
|
|
69
69
|
},
|
|
70
70
|
"devDependencies": {
|
|
71
71
|
"@types/node": "^20.17.6",
|