@nextclaw/service 0.1.18-beta.0 → 0.1.18-beta.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,6 +1,6 @@
1
1
  import { AgentCommandOptions } from "../../../shared/types/cli.types.js";
2
2
  import { Config } from "@nextclaw/core";
3
- import { LlmProviderRuntime, NextclawKernel } from "@nextclaw/kernel";
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":";;;;;iBAmFsB,kBAAA,CAAmB,MAAA;EACvC,IAAA;EACA,IAAA,EAAM,mBAAA;EACN,MAAA,EAAQ,MAAA;EACR,MAAA,EAAQ,cAAA;EACR,eAAA,EAAiB,kBAAA;AAAA,IACf,OAAA"}
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
- let running = true;
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
- printAgentResponse(await dispatchPromptOverNcp({
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 = buildCliSharedMetadata(opts);
69
+ const sharedMetadata = typeof opts.model === "string" && opts.model.trim() ? { model: opts.model.trim() } : {};
65
70
  if (opts.message) {
66
- printAgentResponse(await dispatchPromptOverNcp({
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 LlmProviderRuntime,\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\"]);\n\nfunction buildCliSharedMetadata(\n opts: Pick<AgentCommandOptions, \"model\">,\n): Record<string, unknown> {\n return typeof opts.model === \"string\" && opts.model.trim()\n ? { model: opts.model.trim() }\n : {};\n}\n\nfunction createCliHistoryInterface() {\n const historyFile = join(getDataDir(), \"history\", \"cli_history\");\n const historyDir = resolve(historyFile, \"..\");\n mkdirSync(historyDir, { 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 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 let running = true;\n while (running) {\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 running = false;\n break;\n }\n const response = await dispatchPromptOverNcp({\n config,\n agentRunClient,\n sessionKey,\n content: trimmed,\n metadata,\n });\n printAgentResponse(response);\n }\n}\n\nexport async function runCliAgentCommand(params: {\n logo: string;\n opts: AgentCommandOptions;\n config: Config;\n kernel: NextclawKernel;\n providerManager: LlmProviderRuntime;\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 = buildCliSharedMetadata(opts);\n\n if (opts.message) {\n const response = await dispatchPromptOverNcp({\n config,\n agentRunClient,\n sessionKey,\n content: opts.message,\n metadata: sharedMetadata,\n });\n printAgentResponse(response);\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;AAEvE,SAAS,uBACP,MACyB;AACzB,QAAO,OAAO,KAAK,UAAU,YAAY,KAAK,MAAM,MAAM,GACtD,EAAE,OAAO,KAAK,MAAM,MAAM,EAAE,GAC5B,EAAE;;AAGR,SAAS,4BAA4B;CACnC,MAAM,cAAc,KAAK,YAAY,EAAE,WAAW,cAAc;AAEhE,WADmB,QAAQ,aAAa,KAAK,EACvB,EAAE,WAAW,MAAM,CAAC;CAE1C,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,sBAAsB,QAMnB;CAChB,MAAM,EAAE,gBAAgB,QAAQ,MAAM,UAAU,eAAe;AAC/D,SAAQ,IAAI,GAAG,KAAK,mDAAmD;CACvE,MAAM,KAAK,2BAA2B;CAEtC,IAAI,UAAU;AACd,QAAO,SAAS;EAEd,MAAM,WADO,MAAM,OAAO,IAAI,QAAQ,EACjB,MAAM;AAC3B,MAAI,CAAC,QACH;AAEF,MAAI,cAAc,IAAI,QAAQ,aAAa,CAAC,EAAE;AAC5C,MAAG,OAAO;AACV,aAAU;AACV;;AASF,qBAPiB,MAAM,sBAAsB;GAC3C;GACA;GACA;GACA,SAAS;GACT;GACD,CAAC,CAC0B;;;AAIhC,eAAsB,mBAAmB,QAMvB;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,uBAAuB,KAAK;AAEnD,MAAI,KAAK,SAAS;AAQhB,sBAPiB,MAAM,sBAAsB;IAC3C;IACA;IACA;IACA,SAAS,KAAK;IACd,UAAU;IACX,CAAC,CAC0B;AAC5B;;AAGF,QAAM,sBAAsB;GAC1B;GACA;GACA;GACA;GACA,UAAU;GACX,CAAC;WACM;AACR,QAAM,OAAO,SAAS"}
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;EAsB3C,MAAA,GAAgB,IAAA,EAAM,oBAAA,KAAuB,OAAA;AAAA;AAAA,cAkBlC,6BAAA,GACX,IAAA"}
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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"}
@@ -6,6 +6,7 @@ declare class WorkspaceManager {
6
6
  }) => {
7
7
  created: string[];
8
8
  };
9
+ private readonly ensureWorkspaceDir;
9
10
  private readonly resolveTemplateDir;
10
11
  }
11
12
  //#endregion
@@ -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,iBAoD7E,kBAAA;AAAA"}
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
- const memoryDir = join(workspace, "memory");
65
- if (!existsSync(memoryDir)) {
66
- mkdirSync(memoryDir, { recursive: true });
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 const memoryDir = join(workspace, \"memory\");\n if (!existsSync(memoryDir)) {\n mkdirSync(memoryDir, { recursive: true });\n created.push(join(\"memory\", \"\"));\n }\n\n const skillsDir = join(workspace, DEFAULT_SKILLS_DIR);\n if (!existsSync(skillsDir)) {\n mkdirSync(skillsDir, { recursive: true });\n created.push(join(DEFAULT_SKILLS_DIR, \"\"));\n }\n return { created };\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;;EAI9B,MAAM,YAAY,KAAK,WAAW,SAAS;AAC3C,MAAI,CAAC,WAAW,UAAU,EAAE;AAC1B,aAAU,WAAW,EAAE,WAAW,MAAM,CAAC;AACzC,WAAQ,KAAK,KAAK,UAAU,GAAG,CAAC;;EAGlC,MAAM,YAAY,KAAK,WAAW,mBAAmB;AACrD,MAAI,CAAC,WAAW,UAAU,EAAE;AAC1B,aAAU,WAAW,EAAE,WAAW,MAAM,CAAC;AACzC,WAAQ,KAAK,KAAK,oBAAoB,GAAG,CAAC;;AAE5C,SAAO,EAAE,SAAS;;CAGpB,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"}
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.0",
3
+ "version": "0.1.18-beta.2",
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-dingtalk": "0.1.1-beta.0",
46
- "@nextclaw/channel-extension-discord": "0.1.1-beta.0",
47
- "@nextclaw/channel-extension-email": "0.1.1-beta.0",
48
- "@nextclaw/channel-extension-feishu": "0.1.9-beta.0",
49
- "@nextclaw/channel-extension-qq": "0.1.6-beta.0",
50
- "@nextclaw/channel-extension-telegram": "0.1.1-beta.0",
51
- "@nextclaw/channel-extension-slack": "0.1.1-beta.0",
52
- "@nextclaw/channel-extension-whatsapp": "0.1.1-beta.0",
53
- "@nextclaw/channel-extension-wecom": "0.1.1-beta.0",
54
- "@nextclaw/channel-extension-weixin": "0.1.12-beta.0",
55
- "@nextclaw/core": "0.12.25-beta.0",
56
- "@nextclaw/mcp": "0.1.90-beta.0",
57
- "@nextclaw/kernel": "0.1.15-beta.0",
58
- "@nextclaw/ncp": "0.5.18-beta.0",
59
- "@nextclaw/ncp-agent-runtime": "0.3.29-beta.0",
60
- "@nextclaw/ncp-mcp": "0.1.92-beta.0",
61
- "@nextclaw/nextclaw-hermes-acp-bridge": "0.1.17-beta.0",
62
- "@nextclaw/ncp-toolkit": "0.5.23-beta.0",
63
- "@nextclaw/nextclaw-ncp-runtime-http-client": "0.1.17-beta.0",
64
- "@nextclaw/runtime": "0.2.57-beta.0",
65
- "@nextclaw/remote": "0.1.103-beta.0",
66
- "@nextclaw/nextclaw-ncp-runtime-stdio-client": "0.1.18-beta.0",
67
- "@nextclaw/server": "0.12.26-beta.0",
68
- "@nextclaw/shared": "0.1.12-beta.0"
45
+ "@nextclaw/channel-extension-dingtalk": "0.1.1-beta.2",
46
+ "@nextclaw/channel-extension-discord": "0.1.1-beta.2",
47
+ "@nextclaw/channel-extension-email": "0.1.1-beta.2",
48
+ "@nextclaw/channel-extension-feishu": "0.1.9-beta.2",
49
+ "@nextclaw/channel-extension-slack": "0.1.1-beta.2",
50
+ "@nextclaw/channel-extension-qq": "0.1.6-beta.2",
51
+ "@nextclaw/channel-extension-wecom": "0.1.1-beta.2",
52
+ "@nextclaw/channel-extension-weixin": "0.1.12-beta.2",
53
+ "@nextclaw/channel-extension-telegram": "0.1.1-beta.2",
54
+ "@nextclaw/channel-extension-whatsapp": "0.1.1-beta.2",
55
+ "@nextclaw/core": "0.12.25-beta.2",
56
+ "@nextclaw/ncp": "0.5.18-beta.2",
57
+ "@nextclaw/kernel": "0.1.15-beta.2",
58
+ "@nextclaw/mcp": "0.1.90-beta.2",
59
+ "@nextclaw/ncp-agent-runtime": "0.3.29-beta.2",
60
+ "@nextclaw/ncp-mcp": "0.1.92-beta.2",
61
+ "@nextclaw/nextclaw-hermes-acp-bridge": "0.1.17-beta.2",
62
+ "@nextclaw/nextclaw-ncp-runtime-stdio-client": "0.1.18-beta.2",
63
+ "@nextclaw/remote": "0.1.103-beta.2",
64
+ "@nextclaw/ncp-toolkit": "0.5.23-beta.2",
65
+ "@nextclaw/shared": "0.1.12-beta.2",
66
+ "@nextclaw/nextclaw-ncp-runtime-http-client": "0.1.17-beta.2",
67
+ "@nextclaw/runtime": "0.2.57-beta.2",
68
+ "@nextclaw/server": "0.12.26-beta.2"
69
69
  },
70
70
  "devDependencies": {
71
71
  "@types/node": "^20.17.6",