@nextclaw/service 0.1.17 → 0.1.18-beta.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (85) hide show
  1. package/dist/cli/commands/agent/cli-agent-runner.utils.d.ts.map +1 -1
  2. package/dist/cli/commands/agent/cli-agent-runner.utils.js +9 -5
  3. package/dist/cli/commands/agent/cli-agent-runner.utils.js.map +1 -1
  4. package/dist/cli/commands/config/services/config-commands.service.d.ts +0 -2
  5. package/dist/cli/commands/config/services/config-commands.service.d.ts.map +1 -1
  6. package/dist/cli/commands/config/services/config-commands.service.js +7 -25
  7. package/dist/cli/commands/config/services/config-commands.service.js.map +1 -1
  8. package/dist/commands/channel/channel-config-view.utils.d.ts +7 -0
  9. package/dist/commands/channel/channel-config-view.utils.d.ts.map +1 -0
  10. package/dist/commands/channel/channel-config-view.utils.js +9 -0
  11. package/dist/commands/channel/channel-config-view.utils.js.map +1 -0
  12. package/dist/commands/channel/channel-list-view.service.d.ts +0 -4
  13. package/dist/commands/channel/channel-list-view.service.d.ts.map +1 -1
  14. package/dist/commands/channel/channel-list-view.service.js +6 -19
  15. package/dist/commands/channel/channel-list-view.service.js.map +1 -1
  16. package/dist/commands/channel/index.d.ts +1 -12
  17. package/dist/commands/channel/index.d.ts.map +1 -1
  18. package/dist/commands/channel/index.js +26 -160
  19. package/dist/commands/channel/index.js.map +1 -1
  20. package/dist/service-runtime.service.d.ts +0 -2
  21. package/dist/service-runtime.service.d.ts.map +1 -1
  22. package/dist/service-runtime.service.js +10 -28
  23. package/dist/service-runtime.service.js.map +1 -1
  24. package/dist/shared/services/gateway/managers/gateway-extension.manager.d.ts +23 -0
  25. package/dist/shared/services/gateway/managers/gateway-extension.manager.d.ts.map +1 -0
  26. package/dist/shared/services/gateway/managers/gateway-extension.manager.js +77 -0
  27. package/dist/shared/services/gateway/managers/gateway-extension.manager.js.map +1 -0
  28. package/dist/shared/services/gateway/nextclaw-app.service.d.ts.map +1 -1
  29. package/dist/shared/services/gateway/nextclaw-app.service.js +2 -3
  30. package/dist/shared/services/gateway/nextclaw-app.service.js.map +1 -1
  31. package/dist/shared/services/gateway/nextclaw-gateway-runtime.service.d.ts +4 -5
  32. package/dist/shared/services/gateway/nextclaw-gateway-runtime.service.d.ts.map +1 -1
  33. package/dist/shared/services/gateway/nextclaw-gateway-runtime.service.js +13 -38
  34. package/dist/shared/services/gateway/nextclaw-gateway-runtime.service.js.map +1 -1
  35. package/dist/shared/services/gateway/service-bootstrap-status.service.d.ts +9 -9
  36. package/dist/shared/services/gateway/service-bootstrap-status.service.d.ts.map +1 -1
  37. package/dist/shared/services/gateway/service-bootstrap-status.service.js +24 -24
  38. package/dist/shared/services/gateway/service-bootstrap-status.service.js.map +1 -1
  39. package/dist/shared/services/gateway/service-startup-support.service.d.ts +1 -9
  40. package/dist/shared/services/gateway/service-startup-support.service.d.ts.map +1 -1
  41. package/dist/shared/services/gateway/service-startup-support.service.js +1 -14
  42. package/dist/shared/services/gateway/service-startup-support.service.js.map +1 -1
  43. package/dist/shared/services/gateway/utils/cron-job-handler.utils.d.ts +2 -2
  44. package/dist/shared/services/gateway/utils/cron-job-handler.utils.d.ts.map +1 -1
  45. package/dist/shared/services/gateway/utils/cron-job-handler.utils.js +7 -14
  46. package/dist/shared/services/gateway/utils/cron-job-handler.utils.js.map +1 -1
  47. package/dist/shared/services/gateway/utils/gateway-runtime-lifecycle.utils.js +1 -1
  48. package/dist/shared/services/gateway/utils/gateway-runtime-lifecycle.utils.js.map +1 -1
  49. package/dist/shared/services/marketplace/service-marketplace-installer.service.d.ts +0 -4
  50. package/dist/shared/services/marketplace/service-marketplace-installer.service.d.ts.map +1 -1
  51. package/dist/shared/services/marketplace/service-marketplace-installer.service.js +0 -27
  52. package/dist/shared/services/marketplace/service-marketplace-installer.service.js.map +1 -1
  53. package/dist/shared/services/workspace/workspace-manager.service.d.ts +0 -7
  54. package/dist/shared/services/workspace/workspace-manager.service.d.ts.map +1 -1
  55. package/dist/shared/services/workspace/workspace-manager.service.js +2 -50
  56. package/dist/shared/services/workspace/workspace-manager.service.js.map +1 -1
  57. package/package.json +33 -20
  58. package/dist/commands/channel/channel-config-view.d.ts +0 -8
  59. package/dist/commands/channel/channel-config-view.d.ts.map +0 -1
  60. package/dist/commands/channel/channel-config-view.js +0 -9
  61. package/dist/commands/channel/channel-config-view.js.map +0 -1
  62. package/dist/commands/plugin/index.d.ts +0 -29
  63. package/dist/commands/plugin/index.d.ts.map +0 -1
  64. package/dist/commands/plugin/index.js +0 -256
  65. package/dist/commands/plugin/index.js.map +0 -1
  66. package/dist/commands/plugin/plugin-command.utils.d.ts +0 -13
  67. package/dist/commands/plugin/plugin-command.utils.d.ts.map +0 -1
  68. package/dist/commands/plugin/plugin-command.utils.js +0 -37
  69. package/dist/commands/plugin/plugin-command.utils.js.map +0 -1
  70. package/dist/commands/plugin/plugin-mutation-actions.utils.d.ts +0 -16
  71. package/dist/commands/plugin/plugin-mutation-actions.utils.d.ts.map +0 -1
  72. package/dist/commands/plugin/plugin-mutation-actions.utils.js +0 -164
  73. package/dist/commands/plugin/plugin-mutation-actions.utils.js.map +0 -1
  74. package/dist/shared/services/gateway/managers/gateway-plugin.manager.d.ts +0 -32
  75. package/dist/shared/services/gateway/managers/gateway-plugin.manager.d.ts.map +0 -1
  76. package/dist/shared/services/gateway/managers/gateway-plugin.manager.js +0 -176
  77. package/dist/shared/services/gateway/managers/gateway-plugin.manager.js.map +0 -1
  78. package/dist/shared/services/plugin/utils/plugin-dev-hot-reload.utils.d.ts +0 -25
  79. package/dist/shared/services/plugin/utils/plugin-dev-hot-reload.utils.d.ts.map +0 -1
  80. package/dist/shared/services/plugin/utils/plugin-dev-hot-reload.utils.js +0 -119
  81. package/dist/shared/services/plugin/utils/plugin-dev-hot-reload.utils.js.map +0 -1
  82. package/dist/shared/services/plugin/utils/plugin-runtime-bridge.utils.d.ts +0 -7
  83. package/dist/shared/services/plugin/utils/plugin-runtime-bridge.utils.d.ts.map +0 -1
  84. package/dist/shared/services/plugin/utils/plugin-runtime-bridge.utils.js +0 -97
  85. package/dist/shared/services/plugin/utils/plugin-runtime-bridge.utils.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"cli-agent-runner.utils.d.ts","names":[],"sources":["../../../../src/cli/commands/agent/cli-agent-runner.utils.ts"],"mappings":";;;;;iBAkFsB,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":";;;;;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,6 +1,6 @@
1
1
  import { printAgentResponse, prompt } from "../../../shared/utils/cli.utils.js";
2
2
  import { getDataDir } from "@nextclaw/core";
3
- import { dispatchPromptOverNcp } from "@nextclaw/kernel";
3
+ import { AgentRunClient, dispatchPromptOverNcp } from "@nextclaw/kernel";
4
4
  import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
5
5
  import { join, resolve } from "node:path";
6
6
  import { createInterface } from "node:readline";
@@ -30,7 +30,7 @@ function createCliHistoryInterface() {
30
30
  return rl;
31
31
  }
32
32
  async function runCliInteractiveLoop(params) {
33
- const { agentRunRequests, config, logo, metadata, sessionKey } = params;
33
+ const { agentRunClient, config, logo, metadata, sessionKey } = params;
34
34
  console.log(`${logo} Interactive mode (type exit or Ctrl+C to quit)\n`);
35
35
  const rl = createCliHistoryInterface();
36
36
  let running = true;
@@ -44,7 +44,7 @@ async function runCliInteractiveLoop(params) {
44
44
  }
45
45
  printAgentResponse(await dispatchPromptOverNcp({
46
46
  config,
47
- agentRunRequests,
47
+ agentRunClient,
48
48
  sessionKey,
49
49
  content: trimmed,
50
50
  metadata
@@ -56,12 +56,16 @@ async function runCliAgentCommand(params) {
56
56
  await kernel.extensions.load({ config });
57
57
  await kernel.start();
58
58
  try {
59
+ const agentRunClient = new AgentRunClient({
60
+ eventBus: kernel.eventBus,
61
+ ingress: kernel.ingress
62
+ });
59
63
  const sessionKey = opts.session ?? "cli:default";
60
64
  const sharedMetadata = buildCliSharedMetadata(opts);
61
65
  if (opts.message) {
62
66
  printAgentResponse(await dispatchPromptOverNcp({
63
67
  config,
64
- agentRunRequests: kernel.agentRunRequestManager,
68
+ agentRunClient,
65
69
  sessionKey,
66
70
  content: opts.message,
67
71
  metadata: sharedMetadata
@@ -71,7 +75,7 @@ async function runCliAgentCommand(params) {
71
75
  await runCliInteractiveLoop({
72
76
  logo,
73
77
  config,
74
- agentRunRequests: kernel.agentRunRequestManager,
78
+ agentRunClient,
75
79
  sessionKey,
76
80
  metadata: sharedMetadata
77
81
  });
@@ -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 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 agentRunRequests: NextclawKernel[\"agentRunRequestManager\"];\n sessionKey: string;\n metadata: Record<string, unknown>;\n}): Promise<void> {\n const { agentRunRequests, 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 agentRunRequests,\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 sessionKey = opts.session ?? \"cli:default\";\n const sharedMetadata = buildCliSharedMetadata(opts);\n\n if (opts.message) {\n const response = await dispatchPromptOverNcp({\n config,\n agentRunRequests: kernel.agentRunRequestManager,\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 agentRunRequests: kernel.agentRunRequestManager,\n sessionKey,\n metadata: sharedMetadata,\n });\n } finally {\n await kernel.dispose();\n }\n}\n"],"mappings":";;;;;;;AAeA,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,kBAAkB,QAAQ,MAAM,UAAU,eAAe;AACjE,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,aAAa,KAAK,WAAW;EACnC,MAAM,iBAAiB,uBAAuB,KAAK;AAEnD,MAAI,KAAK,SAAS;AAQhB,sBAPiB,MAAM,sBAAsB;IAC3C;IACA,kBAAkB,OAAO;IACzB;IACA,SAAS,KAAK;IACd,UAAU;IACX,CAAC,CAC0B;AAC5B;;AAGF,QAAM,sBAAsB;GAC1B;GACA;GACA,kBAAkB,OAAO;GACzB;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 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"}
@@ -10,8 +10,6 @@ declare class ConfigCommands {
10
10
  set: (pathExpr: string, value: string, opts?: ConfigSetOptions) => Promise<void>;
11
11
  unset: (pathExpr: string) => Promise<void>;
12
12
  private resolveReadConfigView;
13
- private resolveProjectedChannelContext;
14
- private loadPluginChannelBindings;
15
13
  private requestRestartForConfigDiff;
16
14
  }
17
15
  //#endregion
@@ -1 +1 @@
1
- {"version":3,"file":"config-commands.service.d.ts","names":[],"sources":["../../../../../src/cli/commands/config/services/config-commands.service.ts"],"mappings":";;;cAOa,cAAA;EAAA,QAED,IAAA;cAAA,IAAA;IACN,cAAA,GAAiB,MAAA,EAAQ,oBAAA,KAAyB,OAAA;EAAA;EAItD,GAAA,GAAO,QAAA,UAAkB,IAAA,GAAM,gBAAA;EAoC/B,GAAA,GAAa,QAAA,UAAkB,KAAA,UAAe,IAAA,GAAM,gBAAA,KAAwB,OAAA;EA4C5E,KAAA,GAAe,QAAA,aAAmB,OAAA;EAAA,QAkC1B,qBAAA;EAAA,QAQA,8BAAA;EAAA,QAoBA,yBAAA;EAAA,QAUA,2BAAA;AAAA"}
1
+ {"version":3,"file":"config-commands.service.d.ts","names":[],"sources":["../../../../../src/cli/commands/config/services/config-commands.service.ts"],"mappings":";;;cAKa,cAAA;EAAA,QAED,IAAA;cAAA,IAAA;IACN,cAAA,GAAiB,MAAA,EAAQ,oBAAA,KAAyB,OAAA;EAAA;EAItD,GAAA,GAAO,QAAA,UAAkB,IAAA,GAAM,gBAAA;EAoC/B,GAAA,GAAa,QAAA,UAAkB,KAAA,UAAe,IAAA,GAAM,gBAAA,KAAwB,OAAA;EAuC5E,KAAA,GAAe,QAAA,aAAmB,OAAA;EAAA,QA6B1B,qBAAA;EAAA,QAOA,2BAAA;AAAA"}
@@ -1,9 +1,7 @@
1
- import { loadPluginRegistry, mergePluginConfigView } from "../../../../commands/plugin/index.js";
2
1
  import { getAtConfigPath, parseConfigSetValue, parseRequiredConfigPath, setAtConfigPath, unsetAtConfigPath } from "../../../../shared/utils/config-path.js";
3
- import { resolveChannelConfigView } from "../../../../commands/channel/channel-config-view.js";
2
+ import { resolveChannelConfigView } from "../../../../commands/channel/channel-config-view.utils.js";
4
3
  import "../../../../commands/channel/index.js";
5
- import { buildReloadPlan, diffConfigPaths, getWorkspacePath, loadConfig, saveConfig } from "@nextclaw/core";
6
- import { getPluginChannelBindings } from "@nextclaw/openclaw-compat";
4
+ import { buildReloadPlan, diffConfigPaths, loadConfig, saveConfig } from "@nextclaw/core";
7
5
  //#region src/cli/commands/config/services/config-commands.service.ts
8
6
  var ConfigCommands = class {
9
7
  constructor(deps) {
@@ -53,8 +51,7 @@ var ConfigCommands = class {
53
51
  return;
54
52
  }
55
53
  const prevConfig = loadConfig();
56
- const projectedContext = this.resolveProjectedChannelContext(prevConfig, parsedPath);
57
- const nextConfigTarget = projectedContext ? structuredClone(projectedContext.view) : structuredClone(prevConfig);
54
+ const nextConfigTarget = structuredClone(prevConfig);
58
55
  try {
59
56
  setAtConfigPath(nextConfigTarget, parsedPath, parsedValue);
60
57
  } catch (error) {
@@ -62,7 +59,7 @@ var ConfigCommands = class {
62
59
  process.exit(1);
63
60
  return;
64
61
  }
65
- const nextConfig = projectedContext ? mergePluginConfigView(prevConfig, nextConfigTarget, projectedContext.bindings) : nextConfigTarget;
62
+ const nextConfig = nextConfigTarget;
66
63
  saveConfig(nextConfig);
67
64
  await this.requestRestartForConfigDiff({
68
65
  prevConfig,
@@ -81,14 +78,13 @@ var ConfigCommands = class {
81
78
  return;
82
79
  }
83
80
  const prevConfig = loadConfig();
84
- const projectedContext = this.resolveProjectedChannelContext(prevConfig, parsedPath);
85
- const nextConfigTarget = projectedContext ? structuredClone(projectedContext.view) : structuredClone(prevConfig);
81
+ const nextConfigTarget = structuredClone(prevConfig);
86
82
  if (!unsetAtConfigPath(nextConfigTarget, parsedPath)) {
87
83
  console.error(`Config path not found: ${pathExpr}`);
88
84
  process.exit(1);
89
85
  return;
90
86
  }
91
- const nextConfig = projectedContext ? mergePluginConfigView(prevConfig, nextConfigTarget, projectedContext.bindings) : nextConfigTarget;
87
+ const nextConfig = nextConfigTarget;
92
88
  saveConfig(nextConfig);
93
89
  await this.requestRestartForConfigDiff({
94
90
  prevConfig,
@@ -99,21 +95,7 @@ var ConfigCommands = class {
99
95
  };
100
96
  resolveReadConfigView = (config, parsedPath) => {
101
97
  if (parsedPath[0] !== "channels") return config;
102
- const { bindings } = this.loadPluginChannelBindings(config);
103
- return resolveChannelConfigView(config, bindings);
104
- };
105
- resolveProjectedChannelContext = (config, parsedPath) => {
106
- if (parsedPath[0] !== "channels" || parsedPath.length < 2) return null;
107
- const channelId = parsedPath[1];
108
- const { bindings } = this.loadPluginChannelBindings(config);
109
- if (!bindings.some((binding) => binding.channelId === channelId)) return null;
110
- return {
111
- bindings,
112
- view: resolveChannelConfigView(config, bindings)
113
- };
114
- };
115
- loadPluginChannelBindings = (config) => {
116
- return { bindings: getPluginChannelBindings(loadPluginRegistry(config, getWorkspacePath(config.agents.defaults.workspace))) };
98
+ return resolveChannelConfigView(config);
117
99
  };
118
100
  requestRestartForConfigDiff = async (params) => {
119
101
  const { manualMessage, nextConfig, prevConfig, reason } = params;
@@ -1 +1 @@
1
- {"version":3,"file":"config-commands.service.js","names":[],"sources":["../../../../../src/cli/commands/config/services/config-commands.service.ts"],"sourcesContent":["import { buildReloadPlan, diffConfigPaths, getWorkspacePath, loadConfig, saveConfig, type Config } from \"@nextclaw/core\";\nimport { getPluginChannelBindings } from \"@nextclaw/openclaw-compat\";\nimport { getAtConfigPath, parseConfigSetValue, parseRequiredConfigPath, setAtConfigPath, unsetAtConfigPath } from \"@nextclaw-service/shared/utils/config-path.js\";\nimport { resolveChannelConfigView } from \"@nextclaw-service/commands/channel/index.js\";\nimport { loadPluginRegistry, mergePluginConfigView } from \"@nextclaw-service/commands/plugin/index.js\";\nimport type { ConfigGetOptions, ConfigSetOptions, RequestRestartParams } from \"@nextclaw-service/shared/types/cli.types.js\";\n\nexport class ConfigCommands {\n constructor(\n private deps: {\n requestRestart: (params: RequestRestartParams) => Promise<void>;\n }\n ) {}\n\n get = (pathExpr: string, opts: ConfigGetOptions = {}): void => {\n let parsedPath: string[];\n try {\n parsedPath = parseRequiredConfigPath(pathExpr);\n } catch (error) {\n console.error(String(error));\n process.exit(1);\n return;\n }\n\n const config = loadConfig();\n const resolvedConfig = this.resolveReadConfigView(config, parsedPath) as unknown as Record<string, unknown>;\n const result = getAtConfigPath(resolvedConfig, parsedPath);\n if (!result.found) {\n console.error(`Config path not found: ${pathExpr}`);\n process.exit(1);\n return;\n }\n\n if (opts.json) {\n console.log(JSON.stringify(result.value ?? null, null, 2));\n return;\n }\n\n if (\n typeof result.value === \"string\" ||\n typeof result.value === \"number\" ||\n typeof result.value === \"boolean\"\n ) {\n console.log(String(result.value));\n return;\n }\n\n console.log(JSON.stringify(result.value ?? null, null, 2));\n };\n\n set = async (pathExpr: string, value: string, opts: ConfigSetOptions = {}): Promise<void> => {\n let parsedPath: string[];\n try {\n parsedPath = parseRequiredConfigPath(pathExpr);\n } catch (error) {\n console.error(String(error));\n process.exit(1);\n return;\n }\n\n let parsedValue: unknown;\n try {\n parsedValue = parseConfigSetValue(value, opts);\n } catch (error) {\n console.error(`Failed to parse config value: ${String(error)}`);\n process.exit(1);\n return;\n }\n\n const prevConfig = loadConfig();\n const projectedContext = this.resolveProjectedChannelContext(prevConfig, parsedPath);\n const nextConfigTarget = projectedContext\n ? structuredClone(projectedContext.view) as unknown as Record<string, unknown>\n : structuredClone(prevConfig) as unknown as Record<string, unknown>;\n try {\n setAtConfigPath(nextConfigTarget, parsedPath, parsedValue);\n } catch (error) {\n console.error(String(error));\n process.exit(1);\n return;\n }\n\n const nextConfig = projectedContext\n ? mergePluginConfigView(prevConfig, nextConfigTarget, projectedContext.bindings)\n : nextConfigTarget as Config;\n saveConfig(nextConfig as Config);\n await this.requestRestartForConfigDiff({\n prevConfig,\n nextConfig: nextConfig as Config,\n reason: `config.set ${pathExpr}`,\n manualMessage: `Updated ${pathExpr}. Restart the gateway to apply.`\n });\n };\n\n unset = async (pathExpr: string): Promise<void> => {\n let parsedPath: string[];\n try {\n parsedPath = parseRequiredConfigPath(pathExpr);\n } catch (error) {\n console.error(String(error));\n process.exit(1);\n return;\n }\n\n const prevConfig = loadConfig();\n const projectedContext = this.resolveProjectedChannelContext(prevConfig, parsedPath);\n const nextConfigTarget = projectedContext\n ? structuredClone(projectedContext.view) as unknown as Record<string, unknown>\n : structuredClone(prevConfig) as unknown as Record<string, unknown>;\n const removed = unsetAtConfigPath(nextConfigTarget, parsedPath);\n if (!removed) {\n console.error(`Config path not found: ${pathExpr}`);\n process.exit(1);\n return;\n }\n\n const nextConfig = projectedContext\n ? mergePluginConfigView(prevConfig, nextConfigTarget, projectedContext.bindings)\n : nextConfigTarget as Config;\n saveConfig(nextConfig as Config);\n await this.requestRestartForConfigDiff({\n prevConfig,\n nextConfig: nextConfig as Config,\n reason: `config.unset ${pathExpr}`,\n manualMessage: `Removed ${pathExpr}. Restart the gateway to apply.`\n });\n };\n\n private resolveReadConfigView = (config: Config, parsedPath: string[]): Config => {\n if (parsedPath[0] !== \"channels\") {\n return config;\n }\n const { bindings } = this.loadPluginChannelBindings(config);\n return resolveChannelConfigView(config, bindings);\n };\n\n private resolveProjectedChannelContext = (config: Config, parsedPath: string[]): {\n bindings: ReturnType<typeof getPluginChannelBindings>;\n view: Config;\n } | null => {\n if (parsedPath[0] !== \"channels\" || parsedPath.length < 2) {\n return null;\n }\n\n const channelId = parsedPath[1];\n const { bindings } = this.loadPluginChannelBindings(config);\n if (!bindings.some((binding) => binding.channelId === channelId)) {\n return null;\n }\n\n return {\n bindings,\n view: resolveChannelConfigView(config, bindings)\n };\n };\n\n private loadPluginChannelBindings = (config: Config): {\n bindings: ReturnType<typeof getPluginChannelBindings>;\n } => {\n const workspaceDir = getWorkspacePath(config.agents.defaults.workspace);\n const pluginRegistry = loadPluginRegistry(config, workspaceDir);\n return {\n bindings: getPluginChannelBindings(pluginRegistry)\n };\n };\n\n private requestRestartForConfigDiff = async (params: {\n prevConfig: Config;\n nextConfig: Config;\n reason: string;\n manualMessage: string;\n }): Promise<void> => {\n const { manualMessage, nextConfig, prevConfig, reason } = params;\n const changedPaths = diffConfigPaths(prevConfig, nextConfig);\n if (!changedPaths.length) {\n return;\n }\n const plan = buildReloadPlan(changedPaths);\n if (plan.restartRequired.length === 0) {\n return;\n }\n await this.deps.requestRestart({\n changedPaths: plan.restartRequired,\n mode: \"notify\",\n reason: `${reason} (${plan.restartRequired.join(\", \")})`,\n manualMessage\n });\n };\n}\n"],"mappings":";;;;;;;AAOA,IAAa,iBAAb,MAA4B;CAC1B,YACE,MAGA;AAHQ,OAAA,OAAA;;CAKV,OAAO,UAAkB,OAAyB,EAAE,KAAW;EAC7D,IAAI;AACJ,MAAI;AACF,gBAAa,wBAAwB,SAAS;WACvC,OAAO;AACd,WAAQ,MAAM,OAAO,MAAM,CAAC;AAC5B,WAAQ,KAAK,EAAE;AACf;;EAGF,MAAM,SAAS,YAAY;EAE3B,MAAM,SAAS,gBADQ,KAAK,sBAAsB,QAAQ,WAAW,EACtB,WAAW;AAC1D,MAAI,CAAC,OAAO,OAAO;AACjB,WAAQ,MAAM,0BAA0B,WAAW;AACnD,WAAQ,KAAK,EAAE;AACf;;AAGF,MAAI,KAAK,MAAM;AACb,WAAQ,IAAI,KAAK,UAAU,OAAO,SAAS,MAAM,MAAM,EAAE,CAAC;AAC1D;;AAGF,MACE,OAAO,OAAO,UAAU,YACxB,OAAO,OAAO,UAAU,YACxB,OAAO,OAAO,UAAU,WACxB;AACA,WAAQ,IAAI,OAAO,OAAO,MAAM,CAAC;AACjC;;AAGF,UAAQ,IAAI,KAAK,UAAU,OAAO,SAAS,MAAM,MAAM,EAAE,CAAC;;CAG5D,MAAM,OAAO,UAAkB,OAAe,OAAyB,EAAE,KAAoB;EAC3F,IAAI;AACJ,MAAI;AACF,gBAAa,wBAAwB,SAAS;WACvC,OAAO;AACd,WAAQ,MAAM,OAAO,MAAM,CAAC;AAC5B,WAAQ,KAAK,EAAE;AACf;;EAGF,IAAI;AACJ,MAAI;AACF,iBAAc,oBAAoB,OAAO,KAAK;WACvC,OAAO;AACd,WAAQ,MAAM,iCAAiC,OAAO,MAAM,GAAG;AAC/D,WAAQ,KAAK,EAAE;AACf;;EAGF,MAAM,aAAa,YAAY;EAC/B,MAAM,mBAAmB,KAAK,+BAA+B,YAAY,WAAW;EACpF,MAAM,mBAAmB,mBACrB,gBAAgB,iBAAiB,KAAK,GACtC,gBAAgB,WAAW;AAC/B,MAAI;AACF,mBAAgB,kBAAkB,YAAY,YAAY;WACnD,OAAO;AACd,WAAQ,MAAM,OAAO,MAAM,CAAC;AAC5B,WAAQ,KAAK,EAAE;AACf;;EAGF,MAAM,aAAa,mBACf,sBAAsB,YAAY,kBAAkB,iBAAiB,SAAS,GAC9E;AACJ,aAAW,WAAqB;AAChC,QAAM,KAAK,4BAA4B;GACrC;GACY;GACZ,QAAQ,cAAc;GACtB,eAAe,WAAW,SAAS;GACpC,CAAC;;CAGJ,QAAQ,OAAO,aAAoC;EACjD,IAAI;AACJ,MAAI;AACF,gBAAa,wBAAwB,SAAS;WACvC,OAAO;AACd,WAAQ,MAAM,OAAO,MAAM,CAAC;AAC5B,WAAQ,KAAK,EAAE;AACf;;EAGF,MAAM,aAAa,YAAY;EAC/B,MAAM,mBAAmB,KAAK,+BAA+B,YAAY,WAAW;EACpF,MAAM,mBAAmB,mBACrB,gBAAgB,iBAAiB,KAAK,GACtC,gBAAgB,WAAW;AAE/B,MAAI,CADY,kBAAkB,kBAAkB,WAAW,EACjD;AACZ,WAAQ,MAAM,0BAA0B,WAAW;AACnD,WAAQ,KAAK,EAAE;AACf;;EAGF,MAAM,aAAa,mBACf,sBAAsB,YAAY,kBAAkB,iBAAiB,SAAS,GAC9E;AACJ,aAAW,WAAqB;AAChC,QAAM,KAAK,4BAA4B;GACrC;GACY;GACZ,QAAQ,gBAAgB;GACxB,eAAe,WAAW,SAAS;GACpC,CAAC;;CAGJ,yBAAiC,QAAgB,eAAiC;AAChF,MAAI,WAAW,OAAO,WACpB,QAAO;EAET,MAAM,EAAE,aAAa,KAAK,0BAA0B,OAAO;AAC3D,SAAO,yBAAyB,QAAQ,SAAS;;CAGnD,kCAA0C,QAAgB,eAG9C;AACV,MAAI,WAAW,OAAO,cAAc,WAAW,SAAS,EACtD,QAAO;EAGT,MAAM,YAAY,WAAW;EAC7B,MAAM,EAAE,aAAa,KAAK,0BAA0B,OAAO;AAC3D,MAAI,CAAC,SAAS,MAAM,YAAY,QAAQ,cAAc,UAAU,CAC9D,QAAO;AAGT,SAAO;GACL;GACA,MAAM,yBAAyB,QAAQ,SAAS;GACjD;;CAGH,6BAAqC,WAEhC;AAGH,SAAO,EACL,UAAU,yBAFW,mBAAmB,QADrB,iBAAiB,OAAO,OAAO,SAAS,UAAU,CACR,CAEX,EACnD;;CAGH,8BAAsC,OAAO,WAKxB;EACnB,MAAM,EAAE,eAAe,YAAY,YAAY,WAAW;EAC1D,MAAM,eAAe,gBAAgB,YAAY,WAAW;AAC5D,MAAI,CAAC,aAAa,OAChB;EAEF,MAAM,OAAO,gBAAgB,aAAa;AAC1C,MAAI,KAAK,gBAAgB,WAAW,EAClC;AAEF,QAAM,KAAK,KAAK,eAAe;GAC7B,cAAc,KAAK;GACnB,MAAM;GACN,QAAQ,GAAG,OAAO,IAAI,KAAK,gBAAgB,KAAK,KAAK,CAAC;GACtD;GACD,CAAC"}
1
+ {"version":3,"file":"config-commands.service.js","names":[],"sources":["../../../../../src/cli/commands/config/services/config-commands.service.ts"],"sourcesContent":["import { buildReloadPlan, diffConfigPaths, loadConfig, saveConfig, type Config } from \"@nextclaw/core\";\nimport { getAtConfigPath, parseConfigSetValue, parseRequiredConfigPath, setAtConfigPath, unsetAtConfigPath } from \"@nextclaw-service/shared/utils/config-path.js\";\nimport { resolveChannelConfigView } from \"@nextclaw-service/commands/channel/index.js\";\nimport type { ConfigGetOptions, ConfigSetOptions, RequestRestartParams } from \"@nextclaw-service/shared/types/cli.types.js\";\n\nexport class ConfigCommands {\n constructor(\n private deps: {\n requestRestart: (params: RequestRestartParams) => Promise<void>;\n }\n ) {}\n\n get = (pathExpr: string, opts: ConfigGetOptions = {}): void => {\n let parsedPath: string[];\n try {\n parsedPath = parseRequiredConfigPath(pathExpr);\n } catch (error) {\n console.error(String(error));\n process.exit(1);\n return;\n }\n\n const config = loadConfig();\n const resolvedConfig = this.resolveReadConfigView(config, parsedPath) as unknown as Record<string, unknown>;\n const result = getAtConfigPath(resolvedConfig, parsedPath);\n if (!result.found) {\n console.error(`Config path not found: ${pathExpr}`);\n process.exit(1);\n return;\n }\n\n if (opts.json) {\n console.log(JSON.stringify(result.value ?? null, null, 2));\n return;\n }\n\n if (\n typeof result.value === \"string\" ||\n typeof result.value === \"number\" ||\n typeof result.value === \"boolean\"\n ) {\n console.log(String(result.value));\n return;\n }\n\n console.log(JSON.stringify(result.value ?? null, null, 2));\n };\n\n set = async (pathExpr: string, value: string, opts: ConfigSetOptions = {}): Promise<void> => {\n let parsedPath: string[];\n try {\n parsedPath = parseRequiredConfigPath(pathExpr);\n } catch (error) {\n console.error(String(error));\n process.exit(1);\n return;\n }\n\n let parsedValue: unknown;\n try {\n parsedValue = parseConfigSetValue(value, opts);\n } catch (error) {\n console.error(`Failed to parse config value: ${String(error)}`);\n process.exit(1);\n return;\n }\n\n const prevConfig = loadConfig();\n const nextConfigTarget = structuredClone(prevConfig) as unknown as Record<string, unknown>;\n try {\n setAtConfigPath(nextConfigTarget, parsedPath, parsedValue);\n } catch (error) {\n console.error(String(error));\n process.exit(1);\n return;\n }\n\n const nextConfig = nextConfigTarget as Config;\n saveConfig(nextConfig as Config);\n await this.requestRestartForConfigDiff({\n prevConfig,\n nextConfig: nextConfig as Config,\n reason: `config.set ${pathExpr}`,\n manualMessage: `Updated ${pathExpr}. Restart the gateway to apply.`\n });\n };\n\n unset = async (pathExpr: string): Promise<void> => {\n let parsedPath: string[];\n try {\n parsedPath = parseRequiredConfigPath(pathExpr);\n } catch (error) {\n console.error(String(error));\n process.exit(1);\n return;\n }\n\n const prevConfig = loadConfig();\n const nextConfigTarget = structuredClone(prevConfig) as unknown as Record<string, unknown>;\n const removed = unsetAtConfigPath(nextConfigTarget, parsedPath);\n if (!removed) {\n console.error(`Config path not found: ${pathExpr}`);\n process.exit(1);\n return;\n }\n\n const nextConfig = nextConfigTarget as Config;\n saveConfig(nextConfig as Config);\n await this.requestRestartForConfigDiff({\n prevConfig,\n nextConfig: nextConfig as Config,\n reason: `config.unset ${pathExpr}`,\n manualMessage: `Removed ${pathExpr}. Restart the gateway to apply.`\n });\n };\n\n private resolveReadConfigView = (config: Config, parsedPath: string[]): Config => {\n if (parsedPath[0] !== \"channels\") {\n return config;\n }\n return resolveChannelConfigView(config);\n };\n\n private requestRestartForConfigDiff = async (params: {\n prevConfig: Config;\n nextConfig: Config;\n reason: string;\n manualMessage: string;\n }): Promise<void> => {\n const { manualMessage, nextConfig, prevConfig, reason } = params;\n const changedPaths = diffConfigPaths(prevConfig, nextConfig);\n if (!changedPaths.length) {\n return;\n }\n const plan = buildReloadPlan(changedPaths);\n if (plan.restartRequired.length === 0) {\n return;\n }\n await this.deps.requestRestart({\n changedPaths: plan.restartRequired,\n mode: \"notify\",\n reason: `${reason} (${plan.restartRequired.join(\", \")})`,\n manualMessage\n });\n };\n}\n"],"mappings":";;;;;AAKA,IAAa,iBAAb,MAA4B;CAC1B,YACE,MAGA;AAHQ,OAAA,OAAA;;CAKV,OAAO,UAAkB,OAAyB,EAAE,KAAW;EAC7D,IAAI;AACJ,MAAI;AACF,gBAAa,wBAAwB,SAAS;WACvC,OAAO;AACd,WAAQ,MAAM,OAAO,MAAM,CAAC;AAC5B,WAAQ,KAAK,EAAE;AACf;;EAGF,MAAM,SAAS,YAAY;EAE3B,MAAM,SAAS,gBADQ,KAAK,sBAAsB,QAAQ,WAAW,EACtB,WAAW;AAC1D,MAAI,CAAC,OAAO,OAAO;AACjB,WAAQ,MAAM,0BAA0B,WAAW;AACnD,WAAQ,KAAK,EAAE;AACf;;AAGF,MAAI,KAAK,MAAM;AACb,WAAQ,IAAI,KAAK,UAAU,OAAO,SAAS,MAAM,MAAM,EAAE,CAAC;AAC1D;;AAGF,MACE,OAAO,OAAO,UAAU,YACxB,OAAO,OAAO,UAAU,YACxB,OAAO,OAAO,UAAU,WACxB;AACA,WAAQ,IAAI,OAAO,OAAO,MAAM,CAAC;AACjC;;AAGF,UAAQ,IAAI,KAAK,UAAU,OAAO,SAAS,MAAM,MAAM,EAAE,CAAC;;CAG5D,MAAM,OAAO,UAAkB,OAAe,OAAyB,EAAE,KAAoB;EAC3F,IAAI;AACJ,MAAI;AACF,gBAAa,wBAAwB,SAAS;WACvC,OAAO;AACd,WAAQ,MAAM,OAAO,MAAM,CAAC;AAC5B,WAAQ,KAAK,EAAE;AACf;;EAGF,IAAI;AACJ,MAAI;AACF,iBAAc,oBAAoB,OAAO,KAAK;WACvC,OAAO;AACd,WAAQ,MAAM,iCAAiC,OAAO,MAAM,GAAG;AAC/D,WAAQ,KAAK,EAAE;AACf;;EAGF,MAAM,aAAa,YAAY;EAC/B,MAAM,mBAAmB,gBAAgB,WAAW;AACpD,MAAI;AACF,mBAAgB,kBAAkB,YAAY,YAAY;WACnD,OAAO;AACd,WAAQ,MAAM,OAAO,MAAM,CAAC;AAC5B,WAAQ,KAAK,EAAE;AACf;;EAGF,MAAM,aAAa;AACnB,aAAW,WAAqB;AAChC,QAAM,KAAK,4BAA4B;GACrC;GACY;GACZ,QAAQ,cAAc;GACtB,eAAe,WAAW,SAAS;GACpC,CAAC;;CAGJ,QAAQ,OAAO,aAAoC;EACjD,IAAI;AACJ,MAAI;AACF,gBAAa,wBAAwB,SAAS;WACvC,OAAO;AACd,WAAQ,MAAM,OAAO,MAAM,CAAC;AAC5B,WAAQ,KAAK,EAAE;AACf;;EAGF,MAAM,aAAa,YAAY;EAC/B,MAAM,mBAAmB,gBAAgB,WAAW;AAEpD,MAAI,CADY,kBAAkB,kBAAkB,WAAW,EACjD;AACZ,WAAQ,MAAM,0BAA0B,WAAW;AACnD,WAAQ,KAAK,EAAE;AACf;;EAGF,MAAM,aAAa;AACnB,aAAW,WAAqB;AAChC,QAAM,KAAK,4BAA4B;GACrC;GACY;GACZ,QAAQ,gBAAgB;GACxB,eAAe,WAAW,SAAS;GACpC,CAAC;;CAGJ,yBAAiC,QAAgB,eAAiC;AAChF,MAAI,WAAW,OAAO,WACpB,QAAO;AAET,SAAO,yBAAyB,OAAO;;CAGzC,8BAAsC,OAAO,WAKxB;EACnB,MAAM,EAAE,eAAe,YAAY,YAAY,WAAW;EAC1D,MAAM,eAAe,gBAAgB,YAAY,WAAW;AAC5D,MAAI,CAAC,aAAa,OAChB;EAEF,MAAM,OAAO,gBAAgB,aAAa;AAC1C,MAAI,KAAK,gBAAgB,WAAW,EAClC;AAEF,QAAM,KAAK,KAAK,eAAe;GAC7B,cAAc,KAAK;GACnB,MAAM;GACN,QAAQ,GAAG,OAAO,IAAI,KAAK,gBAAgB,KAAK,KAAK,CAAC;GACtD;GACD,CAAC"}
@@ -0,0 +1,7 @@
1
+ import { Config } from "@nextclaw/core";
2
+
3
+ //#region src/commands/channel/channel-config-view.utils.d.ts
4
+ declare function resolveChannelConfigView(config: Config): Config;
5
+ //#endregion
6
+ export { resolveChannelConfigView };
7
+ //# sourceMappingURL=channel-config-view.utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"channel-config-view.utils.d.ts","names":[],"sources":["../../../src/commands/channel/channel-config-view.utils.ts"],"mappings":";;;iBAEgB,wBAAA,CAAyB,MAAA,EAAQ,MAAA,GAAS,MAAA"}
@@ -0,0 +1,9 @@
1
+ import { toExtensionConfigView } from "@nextclaw/core";
2
+ //#region src/commands/channel/channel-config-view.utils.ts
3
+ function resolveChannelConfigView(config) {
4
+ return toExtensionConfigView(config);
5
+ }
6
+ //#endregion
7
+ export { resolveChannelConfigView };
8
+
9
+ //# sourceMappingURL=channel-config-view.utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"channel-config-view.utils.js","names":[],"sources":["../../../src/commands/channel/channel-config-view.utils.ts"],"sourcesContent":["import { toExtensionConfigView, type Config } from \"@nextclaw/core\";\n\nexport function resolveChannelConfigView(config: Config): Config {\n return toExtensionConfigView(config) as Config;\n}\n"],"mappings":";;AAEA,SAAgB,yBAAyB,QAAwB;AAC/D,QAAO,sBAAsB,OAAO"}
@@ -1,5 +1,4 @@
1
1
  import { Config } from "@nextclaw/core";
2
- import { PluginChannelBinding } from "@nextclaw/openclaw-compat";
3
2
 
4
3
  //#region src/commands/channel/channel-list-view.service.d.ts
5
4
  type ChannelListEntry = {
@@ -19,14 +18,11 @@ declare class ChannelListViewService {
19
18
  build: (params: {
20
19
  config: Config;
21
20
  workspaceDir: string;
22
- pluginBindings: PluginChannelBinding[];
23
21
  }) => ChannelListOutput;
24
22
  private toManifestChannelSources;
25
- private toPluginChannelSource;
26
23
  private toChannelListEntry;
27
24
  private resolveAccounts;
28
25
  private mergeChannelSources;
29
- private resolveDefaultAccountId;
30
26
  }
31
27
  //#endregion
32
28
  export { ChannelListAccount, ChannelListEntry, ChannelListOutput, ChannelListViewService };
@@ -1 +1 @@
1
- {"version":3,"file":"channel-list-view.service.d.ts","names":[],"sources":["../../../src/commands/channel/channel-list-view.service.ts"],"mappings":";;;;KAKY,gBAAA;EACV,EAAA;EACA,OAAA;EACA,gBAAA;EACA,QAAA,GAAW,kBAAA;AAAA;AAAA,KAGD,kBAAA;EACV,EAAA;EACA,MAAA;AAAA;AAAA,KAGU,iBAAA;EACV,QAAA,EAAU,gBAAA;AAAA;AAAA,cAmBC,sBAAA;EACX,KAAA,GAAS,MAAA;IACP,MAAA,EAAQ,MAAA;IACR,YAAA;IACA,cAAA,EAAgB,oBAAA;EAAA,MACd,iBAAA;EAAA,QAkBI,wBAAA;EAAA,QAGA,qBAAA;EAAA,QAKA,kBAAA;EAAA,QAYA,eAAA;EAAA,QAiBA,mBAAA;EAAA,QAWA,uBAAA;AAAA"}
1
+ {"version":3,"file":"channel-list-view.service.d.ts","names":[],"sources":["../../../src/commands/channel/channel-list-view.service.ts"],"mappings":";;;KAIY,gBAAA;EACV,EAAA;EACA,OAAA;EACA,gBAAA;EACA,QAAA,GAAW,kBAAA;AAAA;AAAA,KAGD,kBAAA;EACV,EAAA;EACA,MAAA;AAAA;AAAA,KAGU,iBAAA;EACV,QAAA,EAAU,gBAAA;AAAA;AAAA,cAmBC,sBAAA;EACX,KAAA,GAAS,MAAA;IACP,MAAA,EAAQ,MAAA;IACR,YAAA;EAAA,MACE,iBAAA;EAAA,QAiBI,wBAAA;EAAA,QAGA,kBAAA;EAAA,QAYA,eAAA;EAAA,QAiBA,mBAAA;AAAA"}
@@ -1,4 +1,4 @@
1
- import { resolveChannelConfigView } from "./channel-config-view.js";
1
+ import { resolveChannelConfigView } from "./channel-config-view.utils.js";
2
2
  import { listExtensionChannelIds } from "@nextclaw/kernel";
3
3
  //#region src/commands/channel/channel-list-view.service.ts
4
4
  function readRecord(value) {
@@ -10,19 +10,15 @@ function readString(value) {
10
10
  }
11
11
  var ChannelListViewService = class {
12
12
  build = (params) => {
13
- const { config, pluginBindings, workspaceDir } = params;
14
- const sources = this.mergeChannelSources(pluginBindings.map(this.toPluginChannelSource), this.toManifestChannelSources(listExtensionChannelIds({
13
+ const { config, workspaceDir } = params;
14
+ const sources = this.mergeChannelSources(this.toManifestChannelSources(listExtensionChannelIds({
15
15
  config,
16
16
  workspace: workspaceDir
17
17
  })));
18
- const channelConfigs = readRecord(resolveChannelConfigView(config, pluginBindings).channels) ?? {};
18
+ const channelConfigs = readRecord(resolveChannelConfigView(config).channels) ?? {};
19
19
  return { channels: sources.map((source) => this.toChannelListEntry(source, channelConfigs[source.id])).sort((left, right) => left.id.localeCompare(right.id)) };
20
20
  };
21
21
  toManifestChannelSources = (channelIds) => channelIds.map((id) => ({ id }));
22
- toPluginChannelSource = (binding) => ({
23
- id: binding.channelId,
24
- resolveDefaultAccountId: (channelConfig) => this.resolveDefaultAccountId(binding, channelConfig)
25
- });
26
22
  toChannelListEntry = (source, rawChannelConfig) => {
27
23
  const channelConfig = readRecord(rawChannelConfig);
28
24
  const defaultAccountId = readString(channelConfig?.defaultAccountId) ?? source.resolveDefaultAccountId?.(channelConfig);
@@ -45,20 +41,11 @@ var ChannelListViewService = class {
45
41
  };
46
42
  }).sort((left, right) => left.id.localeCompare(right.id));
47
43
  };
48
- mergeChannelSources = (pluginSources, extensionSources) => {
44
+ mergeChannelSources = (extensionSources) => {
49
45
  const sourcesByChannelId = /* @__PURE__ */ new Map();
50
- for (const source of [...pluginSources, ...extensionSources]) sourcesByChannelId.set(source.id, source);
46
+ for (const source of extensionSources) sourcesByChannelId.set(source.id, source);
51
47
  return [...sourcesByChannelId.values()];
52
48
  };
53
- resolveDefaultAccountId = (binding, channelConfig) => {
54
- const configAdapter = binding.channel.config?.defaultAccountId;
55
- if (!configAdapter) return;
56
- try {
57
- return readString(configAdapter({ channels: { [binding.channelId]: channelConfig ?? {} } }));
58
- } catch {
59
- return;
60
- }
61
- };
62
49
  };
63
50
  //#endregion
64
51
  export { ChannelListViewService };
@@ -1 +1 @@
1
- {"version":3,"file":"channel-list-view.service.js","names":[],"sources":["../../../src/commands/channel/channel-list-view.service.ts"],"sourcesContent":["import type { Config } from \"@nextclaw/core\";\nimport type { PluginChannelBinding } from \"@nextclaw/openclaw-compat\";\nimport { resolveChannelConfigView } from \"./channel-config-view.js\";\nimport { listExtensionChannelIds } from \"@nextclaw/kernel\";\n\nexport type ChannelListEntry = {\n id: string;\n enabled: boolean;\n defaultAccountId?: string;\n accounts?: ChannelListAccount[];\n};\n\nexport type ChannelListAccount = {\n id: string;\n userId?: string;\n};\n\nexport type ChannelListOutput = {\n channels: ChannelListEntry[];\n};\n\ntype ChannelListSource = {\n id: string;\n resolveDefaultAccountId?: (channelConfig: Record<string, unknown> | undefined) => string | undefined;\n};\n\nfunction readRecord(value: unknown): Record<string, unknown> | undefined {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) {\n return undefined;\n }\n return value as Record<string, unknown>;\n}\n\nfunction readString(value: unknown): string | undefined {\n return typeof value === \"string\" && value.trim().length > 0 ? value.trim() : undefined;\n}\n\nexport class ChannelListViewService {\n build = (params: {\n config: Config;\n workspaceDir: string;\n pluginBindings: PluginChannelBinding[];\n }): ChannelListOutput => {\n const { config, pluginBindings, workspaceDir } = params;\n const sources = this.mergeChannelSources(\n pluginBindings.map(this.toPluginChannelSource),\n this.toManifestChannelSources(listExtensionChannelIds({\n config,\n workspace: workspaceDir,\n })),\n );\n const channelConfig = resolveChannelConfigView(config, pluginBindings);\n const channelConfigs = readRecord(channelConfig.channels) ?? {};\n return {\n channels: sources\n .map((source) => this.toChannelListEntry(source, channelConfigs[source.id]))\n .sort((left, right) => left.id.localeCompare(right.id))\n };\n };\n\n private toManifestChannelSources = (channelIds: string[]): ChannelListSource[] =>\n channelIds.map((id) => ({ id }));\n\n private toPluginChannelSource = (binding: PluginChannelBinding): ChannelListSource => ({\n id: binding.channelId,\n resolveDefaultAccountId: (channelConfig) => this.resolveDefaultAccountId(binding, channelConfig),\n });\n\n private toChannelListEntry = (source: ChannelListSource, rawChannelConfig: unknown): ChannelListEntry => {\n const channelConfig = readRecord(rawChannelConfig);\n const defaultAccountId = readString(channelConfig?.defaultAccountId) ?? source.resolveDefaultAccountId?.(channelConfig);\n const accounts = this.resolveAccounts(channelConfig);\n return {\n id: source.id,\n enabled: channelConfig?.enabled === true,\n ...(defaultAccountId ? { defaultAccountId } : {}),\n ...(accounts.length > 0 ? { accounts } : {})\n };\n };\n\n private resolveAccounts = (channelConfig: Record<string, unknown> | undefined): ChannelListAccount[] => {\n const accounts = readRecord(channelConfig?.accounts);\n if (!accounts) {\n return [];\n }\n return Object.entries(accounts)\n .map(([id, rawAccount]) => {\n const accountConfig = readRecord(rawAccount);\n const userId = readString(accountConfig?.userId);\n return {\n id,\n ...(userId ? { userId } : {})\n };\n })\n .sort((left, right) => left.id.localeCompare(right.id));\n };\n\n private mergeChannelSources = (\n pluginSources: ChannelListSource[],\n extensionSources: ChannelListSource[],\n ): ChannelListSource[] => {\n const sourcesByChannelId = new Map<string, ChannelListSource>();\n for (const source of [...pluginSources, ...extensionSources]) {\n sourcesByChannelId.set(source.id, source);\n }\n return [...sourcesByChannelId.values()];\n };\n\n private resolveDefaultAccountId = (\n binding: PluginChannelBinding,\n channelConfig: Record<string, unknown> | undefined,\n ): string | undefined => {\n const configAdapter = binding.channel.config?.defaultAccountId;\n if (!configAdapter) {\n return undefined;\n }\n try {\n return readString(configAdapter({ channels: { [binding.channelId]: channelConfig ?? {} } }));\n } catch {\n return undefined;\n }\n };\n}\n"],"mappings":";;;AA0BA,SAAS,WAAW,OAAqD;AACvE,KAAI,CAAC,SAAS,OAAO,UAAU,YAAY,MAAM,QAAQ,MAAM,CAC7D;AAEF,QAAO;;AAGT,SAAS,WAAW,OAAoC;AACtD,QAAO,OAAO,UAAU,YAAY,MAAM,MAAM,CAAC,SAAS,IAAI,MAAM,MAAM,GAAG,KAAA;;AAG/E,IAAa,yBAAb,MAAoC;CAClC,SAAS,WAIgB;EACvB,MAAM,EAAE,QAAQ,gBAAgB,iBAAiB;EACjD,MAAM,UAAU,KAAK,oBACnB,eAAe,IAAI,KAAK,sBAAsB,EAC9C,KAAK,yBAAyB,wBAAwB;GACpD;GACA,WAAW;GACZ,CAAC,CAAC,CACJ;EAED,MAAM,iBAAiB,WADD,yBAAyB,QAAQ,eAAe,CACtB,SAAS,IAAI,EAAE;AAC/D,SAAO,EACL,UAAU,QACP,KAAK,WAAW,KAAK,mBAAmB,QAAQ,eAAe,OAAO,IAAI,CAAC,CAC3E,MAAM,MAAM,UAAU,KAAK,GAAG,cAAc,MAAM,GAAG,CAAC,EAC1D;;CAGH,4BAAoC,eAClC,WAAW,KAAK,QAAQ,EAAE,IAAI,EAAE;CAElC,yBAAiC,aAAsD;EACrF,IAAI,QAAQ;EACZ,0BAA0B,kBAAkB,KAAK,wBAAwB,SAAS,cAAc;EACjG;CAED,sBAA8B,QAA2B,qBAAgD;EACvG,MAAM,gBAAgB,WAAW,iBAAiB;EAClD,MAAM,mBAAmB,WAAW,eAAe,iBAAiB,IAAI,OAAO,0BAA0B,cAAc;EACvH,MAAM,WAAW,KAAK,gBAAgB,cAAc;AACpD,SAAO;GACL,IAAI,OAAO;GACX,SAAS,eAAe,YAAY;GACpC,GAAI,mBAAmB,EAAE,kBAAkB,GAAG,EAAE;GAChD,GAAI,SAAS,SAAS,IAAI,EAAE,UAAU,GAAG,EAAE;GAC5C;;CAGH,mBAA2B,kBAA6E;EACtG,MAAM,WAAW,WAAW,eAAe,SAAS;AACpD,MAAI,CAAC,SACH,QAAO,EAAE;AAEX,SAAO,OAAO,QAAQ,SAAS,CAC5B,KAAK,CAAC,IAAI,gBAAgB;GAEzB,MAAM,SAAS,WADO,WAAW,WAAW,EACH,OAAO;AAChD,UAAO;IACL;IACA,GAAI,SAAS,EAAE,QAAQ,GAAG,EAAE;IAC7B;IACD,CACD,MAAM,MAAM,UAAU,KAAK,GAAG,cAAc,MAAM,GAAG,CAAC;;CAG3D,uBACE,eACA,qBACwB;EACxB,MAAM,qCAAqB,IAAI,KAAgC;AAC/D,OAAK,MAAM,UAAU,CAAC,GAAG,eAAe,GAAG,iBAAiB,CAC1D,oBAAmB,IAAI,OAAO,IAAI,OAAO;AAE3C,SAAO,CAAC,GAAG,mBAAmB,QAAQ,CAAC;;CAGzC,2BACE,SACA,kBACuB;EACvB,MAAM,gBAAgB,QAAQ,QAAQ,QAAQ;AAC9C,MAAI,CAAC,cACH;AAEF,MAAI;AACF,UAAO,WAAW,cAAc,EAAE,UAAU,GAAG,QAAQ,YAAY,iBAAiB,EAAE,EAAE,EAAE,CAAC,CAAC;UACtF;AACN"}
1
+ {"version":3,"file":"channel-list-view.service.js","names":[],"sources":["../../../src/commands/channel/channel-list-view.service.ts"],"sourcesContent":["import type { Config } from \"@nextclaw/core\";\nimport { resolveChannelConfigView } from \"./channel-config-view.utils.js\";\nimport { listExtensionChannelIds } from \"@nextclaw/kernel\";\n\nexport type ChannelListEntry = {\n id: string;\n enabled: boolean;\n defaultAccountId?: string;\n accounts?: ChannelListAccount[];\n};\n\nexport type ChannelListAccount = {\n id: string;\n userId?: string;\n};\n\nexport type ChannelListOutput = {\n channels: ChannelListEntry[];\n};\n\ntype ChannelListSource = {\n id: string;\n resolveDefaultAccountId?: (channelConfig: Record<string, unknown> | undefined) => string | undefined;\n};\n\nfunction readRecord(value: unknown): Record<string, unknown> | undefined {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) {\n return undefined;\n }\n return value as Record<string, unknown>;\n}\n\nfunction readString(value: unknown): string | undefined {\n return typeof value === \"string\" && value.trim().length > 0 ? value.trim() : undefined;\n}\n\nexport class ChannelListViewService {\n build = (params: {\n config: Config;\n workspaceDir: string;\n }): ChannelListOutput => {\n const { config, workspaceDir } = params;\n const sources = this.mergeChannelSources(\n this.toManifestChannelSources(listExtensionChannelIds({\n config,\n workspace: workspaceDir,\n })),\n );\n const channelConfig = resolveChannelConfigView(config);\n const channelConfigs = readRecord(channelConfig.channels) ?? {};\n return {\n channels: sources\n .map((source) => this.toChannelListEntry(source, channelConfigs[source.id]))\n .sort((left, right) => left.id.localeCompare(right.id))\n };\n };\n\n private toManifestChannelSources = (channelIds: string[]): ChannelListSource[] =>\n channelIds.map((id) => ({ id }));\n\n private toChannelListEntry = (source: ChannelListSource, rawChannelConfig: unknown): ChannelListEntry => {\n const channelConfig = readRecord(rawChannelConfig);\n const defaultAccountId = readString(channelConfig?.defaultAccountId) ?? source.resolveDefaultAccountId?.(channelConfig);\n const accounts = this.resolveAccounts(channelConfig);\n return {\n id: source.id,\n enabled: channelConfig?.enabled === true,\n ...(defaultAccountId ? { defaultAccountId } : {}),\n ...(accounts.length > 0 ? { accounts } : {})\n };\n };\n\n private resolveAccounts = (channelConfig: Record<string, unknown> | undefined): ChannelListAccount[] => {\n const accounts = readRecord(channelConfig?.accounts);\n if (!accounts) {\n return [];\n }\n return Object.entries(accounts)\n .map(([id, rawAccount]) => {\n const accountConfig = readRecord(rawAccount);\n const userId = readString(accountConfig?.userId);\n return {\n id,\n ...(userId ? { userId } : {})\n };\n })\n .sort((left, right) => left.id.localeCompare(right.id));\n };\n\n private mergeChannelSources = (extensionSources: ChannelListSource[]): ChannelListSource[] => {\n const sourcesByChannelId = new Map<string, ChannelListSource>();\n for (const source of extensionSources) {\n sourcesByChannelId.set(source.id, source);\n }\n return [...sourcesByChannelId.values()];\n };\n}\n"],"mappings":";;;AAyBA,SAAS,WAAW,OAAqD;AACvE,KAAI,CAAC,SAAS,OAAO,UAAU,YAAY,MAAM,QAAQ,MAAM,CAC7D;AAEF,QAAO;;AAGT,SAAS,WAAW,OAAoC;AACtD,QAAO,OAAO,UAAU,YAAY,MAAM,MAAM,CAAC,SAAS,IAAI,MAAM,MAAM,GAAG,KAAA;;AAG/E,IAAa,yBAAb,MAAoC;CAClC,SAAS,WAGgB;EACvB,MAAM,EAAE,QAAQ,iBAAiB;EACjC,MAAM,UAAU,KAAK,oBACnB,KAAK,yBAAyB,wBAAwB;GACpD;GACA,WAAW;GACZ,CAAC,CAAC,CACJ;EAED,MAAM,iBAAiB,WADD,yBAAyB,OAAO,CACN,SAAS,IAAI,EAAE;AAC/D,SAAO,EACL,UAAU,QACP,KAAK,WAAW,KAAK,mBAAmB,QAAQ,eAAe,OAAO,IAAI,CAAC,CAC3E,MAAM,MAAM,UAAU,KAAK,GAAG,cAAc,MAAM,GAAG,CAAC,EAC1D;;CAGH,4BAAoC,eAClC,WAAW,KAAK,QAAQ,EAAE,IAAI,EAAE;CAElC,sBAA8B,QAA2B,qBAAgD;EACvG,MAAM,gBAAgB,WAAW,iBAAiB;EAClD,MAAM,mBAAmB,WAAW,eAAe,iBAAiB,IAAI,OAAO,0BAA0B,cAAc;EACvH,MAAM,WAAW,KAAK,gBAAgB,cAAc;AACpD,SAAO;GACL,IAAI,OAAO;GACX,SAAS,eAAe,YAAY;GACpC,GAAI,mBAAmB,EAAE,kBAAkB,GAAG,EAAE;GAChD,GAAI,SAAS,SAAS,IAAI,EAAE,UAAU,GAAG,EAAE;GAC5C;;CAGH,mBAA2B,kBAA6E;EACtG,MAAM,WAAW,WAAW,eAAe,SAAS;AACpD,MAAI,CAAC,SACH,QAAO,EAAE;AAEX,SAAO,OAAO,QAAQ,SAAS,CAC5B,KAAK,CAAC,IAAI,gBAAgB;GAEzB,MAAM,SAAS,WADO,WAAW,WAAW,EACH,OAAO;AAChD,UAAO;IACL;IACA,GAAI,SAAS,EAAE,QAAQ,GAAG,EAAE;IAC7B;IACD,CACD,MAAM,MAAM,UAAU,KAAK,GAAG,cAAc,MAAM,GAAG,CAAC;;CAG3D,uBAA+B,qBAA+D;EAC5F,MAAM,qCAAqB,IAAI,KAAgC;AAC/D,OAAK,MAAM,UAAU,iBACnB,oBAAmB,IAAI,OAAO,IAAI,OAAO;AAE3C,SAAO,CAAC,GAAG,mBAAmB,QAAQ,CAAC"}
@@ -1,30 +1,19 @@
1
1
  import { ChannelsAddOptions, ChannelsListOptions, ChannelsLoginOptions, RequestRestartParams } from "../../shared/types/cli.types.js";
2
- import { resolveChannelConfigView } from "./channel-config-view.js";
2
+ import { resolveChannelConfigView } from "./channel-config-view.utils.js";
3
3
 
4
4
  //#region src/commands/channel/index.d.ts
5
5
  declare class ChannelCommands {
6
6
  private deps;
7
7
  private readonly channelListView;
8
8
  constructor(deps: {
9
- logo: string;
10
- getBridgeDir: () => string;
11
9
  requestRestart: (params: RequestRestartParams) => Promise<void>;
12
10
  });
13
11
  status: () => void;
14
12
  list: (opts?: ChannelsListOptions) => void;
15
13
  login: (opts?: ChannelsLoginOptions) => Promise<void>;
16
- private runLegacyBridgeLogin;
17
- private resolvePluginChannelContext;
18
14
  private buildChannelListOutput;
19
- private loginPluginChannel;
20
- private clonePluginConfig;
21
- private assertValidPluginLoginResult;
22
- private buildNextConfigAfterChannelLogin;
23
- private printPluginChannelLoginResult;
24
15
  add: (opts: ChannelsAddOptions) => Promise<void>;
25
16
  private requireChannelId;
26
- private resolveRequiredChannelBinding;
27
- private resolveRequiredChannelSetup;
28
17
  private buildChannelSetupInput;
29
18
  }
30
19
  //#endregion
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","names":[],"sources":["../../../src/commands/channel/index.ts"],"mappings":";;;;cA4Ca,eAAA;EAAA,QAID,IAAA;EAAA,iBAHO,eAAA;cAGP,IAAA;IACN,IAAA;IACA,YAAA;IACA,cAAA,GAAiB,MAAA,EAAQ,oBAAA,KAAyB,OAAA;EAAA;EAItD,MAAA;EA+BA,IAAA,GAAQ,IAAA,GAAM,mBAAA;EAiBd,KAAA,GAAe,IAAA,GAAM,oBAAA,KAA4B,OAAA;EAAA,QA4BzC,oBAAA;EAAA,QAUA,2BAAA;EAAA,QAWA,sBAAA;EAAA,QAWA,kBAAA;EAAA,QA8BA,iBAAA;EAAA,QAOA,4BAAA;EAAA,QAYA,gCAAA;EAAA,QAeA,6BAAA;EAUR,GAAA,GAAa,IAAA,EAAM,kBAAA,KAAqB,OAAA;EAAA,QA6ChC,gBAAA;EAAA,QASA,6BAAA;EAAA,QAaA,2BAAA;EAAA,QASA,sBAAA;AAAA"}
1
+ {"version":3,"file":"index.d.ts","names":[],"sources":["../../../src/commands/channel/index.ts"],"mappings":";;;;cAqBa,eAAA;EAAA,QAID,IAAA;EAAA,iBAHO,eAAA;cAGP,IAAA;IACN,cAAA,GAAiB,MAAA,EAAQ,oBAAA,KAAyB,OAAA;EAAA;EAItD,MAAA;EAsBA,IAAA,GAAQ,IAAA,GAAM,mBAAA;EAiBd,KAAA,GAAe,IAAA,GAAM,oBAAA,KAA4B,OAAA;EAAA,QAWzC,sBAAA;EASR,GAAA,GAAa,IAAA,EAAM,kBAAA,KAAqB,OAAA;EAAA,QAwBhC,gBAAA;EAAA,QASA,sBAAA;AAAA"}
@@ -1,10 +1,8 @@
1
- import { loadPluginRegistry, mergePluginConfigView, toPluginConfigView as toPluginConfigView$1 } from "../plugin/index.js";
2
- import { resolveChannelConfigView } from "./channel-config-view.js";
1
+ import { resolveChannelConfigView } from "./channel-config-view.utils.js";
3
2
  import { ChannelListViewService } from "./channel-list-view.service.js";
4
3
  import { getWorkspacePath, loadConfig, saveConfig } from "@nextclaw/core";
5
- import { buildPluginStatusReport, enablePluginInConfig, getPluginChannelBindings } from "@nextclaw/openclaw-compat";
6
- import { spawnSync } from "node:child_process";
7
- import { BUILTIN_CHANNEL_PLUGIN_IDS, builtinProviderIds } from "@nextclaw/runtime";
4
+ import { listExtensionChannelIds } from "@nextclaw/kernel";
5
+ import { BUILTIN_CHANNEL_IDS } from "@nextclaw/runtime";
8
6
  //#region src/commands/channel/index.ts
9
7
  const CHANNEL_LABELS = {
10
8
  telegram: "Telegram",
@@ -18,10 +16,6 @@ const CHANNEL_LABELS = {
18
16
  qq: "QQ",
19
17
  weixin: "Weixin"
20
18
  };
21
- const RESERVED_PROVIDER_IDS = builtinProviderIds();
22
- function resolveChannelBindings(pluginRegistry) {
23
- return getPluginChannelBindings(pluginRegistry);
24
- }
25
19
  var ChannelCommands = class {
26
20
  channelListView = new ChannelListViewService();
27
21
  constructor(deps) {
@@ -30,26 +24,21 @@ var ChannelCommands = class {
30
24
  status = () => {
31
25
  const config = loadConfig();
32
26
  const workspaceDir = getWorkspacePath(config.agents.defaults.workspace);
33
- const channelConfig = resolveChannelConfigView(config, resolveChannelBindings(loadPluginRegistry(config, workspaceDir)));
27
+ const channelConfig = resolveChannelConfigView(config);
34
28
  console.log("Channel Status");
35
29
  const channels = channelConfig.channels;
36
- for (const channelId of BUILTIN_CHANNEL_PLUGIN_IDS) {
30
+ for (const channelId of BUILTIN_CHANNEL_IDS) {
37
31
  const label = CHANNEL_LABELS[channelId] ?? channelId;
38
32
  const enabled = channels[channelId]?.enabled === true;
39
33
  console.log(`${label}: ${enabled ? "✓" : "✗"}`);
40
34
  }
41
- const pluginChannels = buildPluginStatusReport({
35
+ const extensionChannels = listExtensionChannelIds({
42
36
  config,
43
- workspaceDir,
44
- reservedChannelIds: [],
45
- reservedProviderIds: RESERVED_PROVIDER_IDS
46
- }).plugins.filter((plugin) => plugin.status === "loaded" && plugin.channelIds.length > 0);
47
- if (pluginChannels.length > 0) {
48
- console.log("Plugin Channels:");
49
- for (const plugin of pluginChannels) {
50
- const channels = plugin.channelIds.join(", ");
51
- console.log(`- ${channels} (plugin: ${plugin.id})`);
52
- }
37
+ workspace: workspaceDir
38
+ });
39
+ if (extensionChannels.length > 0) {
40
+ console.log("Extension Channels:");
41
+ for (const channelId of extensionChannels) console.log(`- ${channelId}`);
53
42
  }
54
43
  };
55
44
  list = (opts = {}) => {
@@ -67,141 +56,38 @@ var ChannelCommands = class {
67
56
  login = async (opts = {}) => {
68
57
  const channelId = opts.channel?.trim();
69
58
  if (!channelId) {
70
- this.runLegacyBridgeLogin();
71
- return;
72
- }
73
- const config = loadConfig();
74
- const channelContext = this.resolvePluginChannelContext(config, channelId);
75
- if (!channelContext) {
76
- console.error(`No plugin channel found for: ${channelId}`);
59
+ console.error("Channel login is handled by the running UI extension auth flow. Pass --channel <id> and use the UI login flow.");
77
60
  process.exit(1);
78
61
  }
79
- const result = await this.loginPluginChannel(config, channelContext, opts);
80
- if (!result) return;
81
- saveConfig(this.buildNextConfigAfterChannelLogin(config, channelContext.binding, result));
82
- this.printPluginChannelLoginResult(channelContext.binding, result);
83
- await this.deps.requestRestart({
84
- mode: "notify",
85
- reason: `channel login via plugin: ${channelContext.binding.pluginId}`,
86
- manualMessage: "渠道配置已保存,等待你手动重启后生效。"
87
- });
88
- };
89
- runLegacyBridgeLogin = () => {
90
- const bridgeDir = this.deps.getBridgeDir();
91
- console.log(`${this.deps.logo} Starting bridge...`);
92
- console.log("Scan the QR code to connect.\n");
93
- const result = spawnSync("npm", ["start"], {
94
- cwd: bridgeDir,
95
- stdio: "inherit"
96
- });
97
- if (result.status !== 0) console.error(`Bridge failed: ${result.status ?? 1}`);
98
- };
99
- resolvePluginChannelContext = (config, channelId) => {
100
- const bindings = resolveChannelBindings(loadPluginRegistry(config, getWorkspacePath(config.agents.defaults.workspace)));
101
- const binding = bindings.find((entry) => entry.channelId === channelId || entry.pluginId === channelId);
102
- if (!binding) return null;
103
- return {
104
- binding,
105
- bindings
106
- };
62
+ console.error(`Channel "${channelId}" login is handled by the running UI extension auth flow.`);
63
+ process.exit(1);
107
64
  };
108
65
  buildChannelListOutput = () => {
109
66
  const config = loadConfig();
110
67
  const workspaceDir = getWorkspacePath(config.agents.defaults.workspace);
111
- const pluginRegistry = loadPluginRegistry(config, workspaceDir);
112
68
  return this.channelListView.build({
113
69
  config,
114
- workspaceDir,
115
- pluginBindings: resolveChannelBindings(pluginRegistry)
70
+ workspaceDir
116
71
  });
117
72
  };
118
- loginPluginChannel = async (config, channelContext, opts) => {
119
- const { binding, bindings } = channelContext;
120
- const login = binding.channel.auth?.login;
121
- if (!login) {
122
- if (binding.channelId === "whatsapp") {
123
- this.runLegacyBridgeLogin();
124
- return null;
125
- }
126
- console.error(`Channel "${binding.channelId}" does not support login.`);
127
- process.exit(1);
128
- }
129
- const configView = resolveChannelConfigView(config, bindings);
130
- const result = await login({
131
- cfg: configView,
132
- pluginId: binding.pluginId,
133
- channelId: binding.channelId,
134
- pluginConfig: this.clonePluginConfig(configView.channels?.[binding.channelId]),
135
- accountId: opts.account?.trim() || null,
136
- baseUrl: opts.url?.trim() || opts.httpUrl?.trim() || null,
137
- verbose: Boolean(opts.verbose)
138
- });
139
- this.assertValidPluginLoginResult(result);
140
- return result;
141
- };
142
- clonePluginConfig = (value) => {
143
- if (!value || typeof value !== "object" || Array.isArray(value)) return;
144
- return JSON.parse(JSON.stringify(value));
145
- };
146
- assertValidPluginLoginResult = (result) => {
147
- if (!result || typeof result !== "object" || Array.isArray(result)) {
148
- console.error("Channel login returned an invalid result.");
149
- process.exit(1);
150
- }
151
- const record = result;
152
- if (!record.pluginConfig || typeof record.pluginConfig !== "object" || Array.isArray(record.pluginConfig)) {
153
- console.error("Channel login returned an invalid plugin config.");
154
- process.exit(1);
155
- }
156
- };
157
- buildNextConfigAfterChannelLogin = (config, binding, result) => {
158
- return enablePluginInConfig({
73
+ add = async (opts) => {
74
+ const channelId = this.requireChannelId(opts);
75
+ const config = loadConfig();
76
+ saveConfig({
159
77
  ...config,
160
78
  channels: {
161
79
  ...config.channels,
162
- [binding.channelId]: result.pluginConfig
80
+ [channelId]: {
81
+ ...config.channels[channelId] ?? {},
82
+ ...this.buildChannelSetupInput(opts),
83
+ enabled: true
84
+ }
163
85
  }
164
- }, binding.pluginId);
165
- };
166
- printPluginChannelLoginResult = (binding, result) => {
167
- console.log(`Logged into channel "${binding.channelId}" via plugin "${binding.pluginId}".`);
168
- if (result.accountId) console.log(`Active account: ${result.accountId}`);
169
- for (const note of result.notes ?? []) console.log(note);
170
- };
171
- add = async (opts) => {
172
- const channelId = this.requireChannelId(opts);
173
- const config = loadConfig();
174
- const pluginRegistry = loadPluginRegistry(config, getWorkspacePath(config.agents.defaults.workspace));
175
- const { binding, bindings } = this.resolveRequiredChannelBinding(pluginRegistry, channelId);
176
- const setup = this.resolveRequiredChannelSetup(binding);
177
- const input = this.buildChannelSetupInput(opts);
178
- const currentView = toPluginConfigView$1(config, bindings);
179
- const accountId = binding.channel.config?.defaultAccountId?.(currentView) ?? "default";
180
- const validateError = setup.validateInput?.({
181
- cfg: currentView,
182
- input,
183
- accountId
184
86
  });
185
- if (validateError) {
186
- console.error(`Channel setup validation failed: ${validateError}`);
187
- process.exit(1);
188
- }
189
- const nextView = setup.applyAccountConfig({
190
- cfg: currentView,
191
- input,
192
- accountId
193
- });
194
- if (!nextView || typeof nextView !== "object" || Array.isArray(nextView)) {
195
- console.error("Channel setup returned invalid config payload.");
196
- process.exit(1);
197
- }
198
- let next = mergePluginConfigView(config, nextView, bindings);
199
- next = enablePluginInConfig(next, binding.pluginId);
200
- saveConfig(next);
201
- console.log(`Configured channel "${binding.channelId}" via plugin "${binding.pluginId}".`);
87
+ console.log(`Configured channel "${channelId}".`);
202
88
  await this.deps.requestRestart({
203
89
  mode: "notify",
204
- reason: `channel configured via plugin: ${binding.pluginId}`,
90
+ reason: `channel configured: ${channelId}`,
205
91
  manualMessage: "渠道配置已保存,等待你手动重启后生效。"
206
92
  });
207
93
  };
@@ -213,26 +99,6 @@ var ChannelCommands = class {
213
99
  }
214
100
  return channelId;
215
101
  };
216
- resolveRequiredChannelBinding = (pluginRegistry, channelId) => {
217
- const bindings = resolveChannelBindings(pluginRegistry);
218
- const binding = bindings.find((entry) => entry.channelId === channelId || entry.pluginId === channelId);
219
- if (!binding) {
220
- console.error(`No plugin channel found for: ${channelId}`);
221
- process.exit(1);
222
- }
223
- return {
224
- binding,
225
- bindings
226
- };
227
- };
228
- resolveRequiredChannelSetup = (binding) => {
229
- const setup = binding.channel.setup;
230
- if (!setup?.applyAccountConfig) {
231
- console.error(`Channel "${binding.channelId}" does not support setup.`);
232
- process.exit(1);
233
- }
234
- return setup;
235
- };
236
102
  buildChannelSetupInput = (opts) => {
237
103
  return {
238
104
  name: opts.name,