@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":"index.js","names":["toPluginConfigView"],"sources":["../../../src/commands/channel/index.ts"],"sourcesContent":["import { spawnSync } from \"node:child_process\";\nimport { getWorkspacePath, loadConfig, saveConfig } from \"@nextclaw/core\";\nimport { BUILTIN_CHANNEL_PLUGIN_IDS, builtinProviderIds } from \"@nextclaw/runtime\";\nimport { buildPluginStatusReport, enablePluginInConfig, getPluginChannelBindings } from \"@nextclaw/openclaw-compat\";\nimport { loadPluginRegistry, mergePluginConfigView, toPluginConfigView } from \"../plugin/index.js\";\nimport { resolveChannelConfigView } from \"./channel-config-view.js\";\nimport { ChannelListViewService } from \"./channel-list-view.service.js\";\nimport type { ChannelsAddOptions, ChannelsListOptions, ChannelsLoginOptions, RequestRestartParams } from \"../../shared/types/cli.types.js\";\n\nexport { resolveChannelConfigView } from \"./channel-config-view.js\";\n\nconst CHANNEL_LABELS: Record<string, string> = {\n telegram: \"Telegram\",\n whatsapp: \"WhatsApp\",\n discord: \"Discord\",\n feishu: \"Feishu\",\n dingtalk: \"DingTalk\",\n wecom: \"WeCom\",\n email: \"Email\",\n slack: \"Slack\",\n qq: \"QQ\",\n weixin: \"Weixin\"\n};\nconst RESERVED_PROVIDER_IDS = builtinProviderIds();\n\ntype PluginChannelBinding = ReturnType<typeof getPluginChannelBindings>[number];\ntype PluginLoginResult = {\n pluginConfig: Record<string, unknown>;\n accountId?: string | null;\n notes?: string[];\n};\ntype RequiredChannelSetup = NonNullable<PluginChannelBinding[\"channel\"][\"setup\"]> & {\n applyAccountConfig: NonNullable<NonNullable<PluginChannelBinding[\"channel\"][\"setup\"]>[\"applyAccountConfig\"]>;\n};\n\ntype PluginChannelContext = {\n binding: PluginChannelBinding;\n bindings: PluginChannelBinding[];\n};\n\nfunction resolveChannelBindings(pluginRegistry: ReturnType<typeof loadPluginRegistry>): PluginChannelBinding[] {\n return getPluginChannelBindings(pluginRegistry);\n}\n\nexport class ChannelCommands {\n private readonly channelListView = new ChannelListViewService();\n\n constructor(\n private deps: {\n logo: string;\n getBridgeDir: () => string;\n requestRestart: (params: RequestRestartParams) => Promise<void>;\n }\n ) {}\n\n status = (): void => {\n const config = loadConfig();\n const workspaceDir = getWorkspacePath(config.agents.defaults.workspace);\n const pluginRegistry = loadPluginRegistry(config, workspaceDir);\n const channelConfig = resolveChannelConfigView(config, resolveChannelBindings(pluginRegistry));\n\n console.log(\"Channel Status\");\n const channels = channelConfig.channels as Record<string, { enabled?: boolean }>;\n for (const channelId of BUILTIN_CHANNEL_PLUGIN_IDS) {\n const label = CHANNEL_LABELS[channelId] ?? channelId;\n const enabled = channels[channelId]?.enabled === true;\n console.log(`${label}: ${enabled ? \"✓\" : \"✗\"}`);\n }\n\n const report = buildPluginStatusReport({\n config,\n workspaceDir,\n reservedChannelIds: [],\n reservedProviderIds: RESERVED_PROVIDER_IDS\n });\n\n const pluginChannels = report.plugins.filter((plugin) => plugin.status === \"loaded\" && plugin.channelIds.length > 0);\n if (pluginChannels.length > 0) {\n console.log(\"Plugin Channels:\");\n for (const plugin of pluginChannels) {\n const channels = plugin.channelIds.join(\", \");\n console.log(`- ${channels} (plugin: ${plugin.id})`);\n }\n }\n };\n\n list = (opts: ChannelsListOptions = {}): void => {\n const output = this.buildChannelListOutput();\n if (opts.json) {\n console.log(JSON.stringify(output, null, 2));\n return;\n }\n\n console.log(\"Channels\");\n for (const channel of output.channels) {\n const flags = [\n channel.enabled ? \"enabled\" : \"disabled\",\n channel.defaultAccountId ? `defaultAccountId=${channel.defaultAccountId}` : undefined,\n ].filter(Boolean);\n console.log(`- ${channel.id} [${flags.join(\", \")}]`);\n }\n };\n\n login = async (opts: ChannelsLoginOptions = {}): Promise<void> => {\n const channelId = opts.channel?.trim();\n if (!channelId) {\n this.runLegacyBridgeLogin();\n return;\n }\n\n const config = loadConfig();\n const channelContext = this.resolvePluginChannelContext(config, channelId);\n if (!channelContext) {\n console.error(`No plugin channel found for: ${channelId}`);\n process.exit(1);\n }\n\n const result = await this.loginPluginChannel(config, channelContext, opts);\n if (!result) {\n return;\n }\n\n saveConfig(this.buildNextConfigAfterChannelLogin(config, channelContext.binding, result));\n this.printPluginChannelLoginResult(channelContext.binding, result);\n await this.deps.requestRestart({\n mode: \"notify\",\n reason: `channel login via plugin: ${channelContext.binding.pluginId}`,\n manualMessage: \"渠道配置已保存,等待你手动重启后生效。\"\n });\n };\n\n private runLegacyBridgeLogin = (): void => {\n const bridgeDir = this.deps.getBridgeDir();\n console.log(`${this.deps.logo} Starting bridge...`);\n console.log(\"Scan the QR code to connect.\\n\");\n const result = spawnSync(\"npm\", [\"start\"], { cwd: bridgeDir, stdio: \"inherit\" });\n if (result.status !== 0) {\n console.error(`Bridge failed: ${result.status ?? 1}`);\n }\n };\n\n private resolvePluginChannelContext = (config: ReturnType<typeof loadConfig>, channelId: string): PluginChannelContext | null => {\n const workspaceDir = getWorkspacePath(config.agents.defaults.workspace);\n const pluginRegistry = loadPluginRegistry(config, workspaceDir);\n const bindings = resolveChannelBindings(pluginRegistry);\n const binding = bindings.find((entry) => entry.channelId === channelId || entry.pluginId === channelId);\n if (!binding) {\n return null;\n }\n return { binding, bindings };\n };\n\n private buildChannelListOutput = () => {\n const config = loadConfig();\n const workspaceDir = getWorkspacePath(config.agents.defaults.workspace);\n const pluginRegistry = loadPluginRegistry(config, workspaceDir);\n return this.channelListView.build({\n config,\n workspaceDir,\n pluginBindings: resolveChannelBindings(pluginRegistry),\n });\n };\n\n private loginPluginChannel = async (\n config: ReturnType<typeof loadConfig>,\n channelContext: PluginChannelContext,\n opts: ChannelsLoginOptions,\n ): Promise<PluginLoginResult | null> => {\n const { binding, bindings } = channelContext;\n const login = binding.channel.auth?.login;\n if (!login) {\n if (binding.channelId === \"whatsapp\") {\n this.runLegacyBridgeLogin();\n return null;\n }\n console.error(`Channel \"${binding.channelId}\" does not support login.`);\n process.exit(1);\n }\n\n const configView = resolveChannelConfigView(config, bindings);\n const result = await login({\n cfg: configView,\n pluginId: binding.pluginId,\n channelId: binding.channelId,\n pluginConfig: this.clonePluginConfig(configView.channels?.[binding.channelId]),\n accountId: opts.account?.trim() || null,\n baseUrl: opts.url?.trim() || opts.httpUrl?.trim() || null,\n verbose: Boolean(opts.verbose)\n });\n this.assertValidPluginLoginResult(result);\n return result;\n };\n\n private clonePluginConfig = (value: unknown): Record<string, unknown> | undefined => {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) {\n return undefined;\n }\n return JSON.parse(JSON.stringify(value)) as Record<string, unknown>;\n };\n\n private assertValidPluginLoginResult: (result: unknown) => asserts result is PluginLoginResult = (result) => {\n if (!result || typeof result !== \"object\" || Array.isArray(result)) {\n console.error(\"Channel login returned an invalid result.\");\n process.exit(1);\n }\n const record = result as Record<string, unknown>;\n if (!record.pluginConfig || typeof record.pluginConfig !== \"object\" || Array.isArray(record.pluginConfig)) {\n console.error(\"Channel login returned an invalid plugin config.\");\n process.exit(1);\n }\n };\n\n private buildNextConfigAfterChannelLogin = (\n config: ReturnType<typeof loadConfig>,\n binding: PluginChannelBinding,\n result: PluginLoginResult,\n ): ReturnType<typeof loadConfig> => {\n const nextConfig = {\n ...config,\n channels: {\n ...config.channels,\n [binding.channelId]: result.pluginConfig as ReturnType<typeof loadConfig>[\"channels\"][keyof ReturnType<typeof loadConfig>[\"channels\"]]\n }\n };\n return enablePluginInConfig(nextConfig, binding.pluginId);\n };\n\n private printPluginChannelLoginResult = (binding: PluginChannelBinding, result: PluginLoginResult): void => {\n console.log(`Logged into channel \"${binding.channelId}\" via plugin \"${binding.pluginId}\".`);\n if (result.accountId) {\n console.log(`Active account: ${result.accountId}`);\n }\n for (const note of result.notes ?? []) {\n console.log(note);\n }\n };\n\n add = async (opts: ChannelsAddOptions): Promise<void> => {\n const channelId = this.requireChannelId(opts);\n const config = loadConfig();\n const workspaceDir = getWorkspacePath(config.agents.defaults.workspace);\n const pluginRegistry = loadPluginRegistry(config, workspaceDir);\n const { binding, bindings } = this.resolveRequiredChannelBinding(pluginRegistry, channelId);\n const setup = this.resolveRequiredChannelSetup(binding);\n const input = this.buildChannelSetupInput(opts);\n\n const currentView = toPluginConfigView(config, bindings);\n const accountId = binding.channel.config?.defaultAccountId?.(currentView) ?? \"default\";\n\n const validateError = setup.validateInput?.({\n cfg: currentView,\n input,\n accountId\n });\n if (validateError) {\n console.error(`Channel setup validation failed: ${validateError}`);\n process.exit(1);\n }\n\n const nextView = setup.applyAccountConfig({\n cfg: currentView,\n input,\n accountId\n });\n\n if (!nextView || typeof nextView !== \"object\" || Array.isArray(nextView)) {\n console.error(\"Channel setup returned invalid config payload.\");\n process.exit(1);\n }\n\n let next = mergePluginConfigView(config, nextView as Record<string, unknown>, bindings);\n next = enablePluginInConfig(next, binding.pluginId);\n saveConfig(next);\n\n console.log(`Configured channel \"${binding.channelId}\" via plugin \"${binding.pluginId}\".`);\n await this.deps.requestRestart({\n mode: \"notify\",\n reason: `channel configured via plugin: ${binding.pluginId}`,\n manualMessage: \"渠道配置已保存,等待你手动重启后生效。\"\n });\n };\n\n private requireChannelId = (opts: ChannelsAddOptions): string => {\n const channelId = opts.channel?.trim();\n if (!channelId) {\n console.error(\"--channel is required\");\n process.exit(1);\n }\n return channelId;\n };\n\n private resolveRequiredChannelBinding = (\n pluginRegistry: ReturnType<typeof loadPluginRegistry>,\n channelId: string,\n ): PluginChannelContext => {\n const bindings = resolveChannelBindings(pluginRegistry);\n const binding = bindings.find((entry) => entry.channelId === channelId || entry.pluginId === channelId);\n if (!binding) {\n console.error(`No plugin channel found for: ${channelId}`);\n process.exit(1);\n }\n return { binding, bindings };\n };\n\n private resolveRequiredChannelSetup = (binding: PluginChannelBinding): RequiredChannelSetup => {\n const setup = binding.channel.setup;\n if (!setup?.applyAccountConfig) {\n console.error(`Channel \"${binding.channelId}\" does not support setup.`);\n process.exit(1);\n }\n return setup as RequiredChannelSetup;\n };\n\n private buildChannelSetupInput = (opts: ChannelsAddOptions): Record<string, string | undefined> => {\n return {\n name: opts.name,\n token: opts.token,\n code: opts.code,\n url: opts.url,\n httpUrl: opts.httpUrl\n };\n };\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../../src/commands/channel/index.ts"],"sourcesContent":["import { getWorkspacePath, loadConfig, saveConfig } from \"@nextclaw/core\";\nimport { BUILTIN_CHANNEL_IDS } from \"@nextclaw/runtime\";\nimport { listExtensionChannelIds } from \"@nextclaw/kernel\";\nimport { resolveChannelConfigView } from \"./channel-config-view.utils.js\";\nimport { ChannelListViewService } from \"./channel-list-view.service.js\";\nimport type { ChannelsAddOptions, ChannelsListOptions, ChannelsLoginOptions, RequestRestartParams } from \"../../shared/types/cli.types.js\";\n\nexport { resolveChannelConfigView } from \"./channel-config-view.utils.js\";\n\nconst CHANNEL_LABELS: Record<string, string> = {\n telegram: \"Telegram\",\n whatsapp: \"WhatsApp\",\n discord: \"Discord\",\n feishu: \"Feishu\",\n dingtalk: \"DingTalk\",\n wecom: \"WeCom\",\n email: \"Email\",\n slack: \"Slack\",\n qq: \"QQ\",\n weixin: \"Weixin\"\n};\nexport class ChannelCommands {\n private readonly channelListView = new ChannelListViewService();\n\n constructor(\n private deps: {\n requestRestart: (params: RequestRestartParams) => Promise<void>;\n }\n ) {}\n\n status = (): void => {\n const config = loadConfig();\n const workspaceDir = getWorkspacePath(config.agents.defaults.workspace);\n const channelConfig = resolveChannelConfigView(config);\n\n console.log(\"Channel Status\");\n const channels = channelConfig.channels as Record<string, { enabled?: boolean }>;\n for (const channelId of BUILTIN_CHANNEL_IDS) {\n const label = CHANNEL_LABELS[channelId] ?? channelId;\n const enabled = channels[channelId]?.enabled === true;\n console.log(`${label}: ${enabled ? \"✓\" : \"✗\"}`);\n }\n\n const extensionChannels = listExtensionChannelIds({ config, workspace: workspaceDir });\n if (extensionChannels.length > 0) {\n console.log(\"Extension Channels:\");\n for (const channelId of extensionChannels) {\n console.log(`- ${channelId}`);\n }\n }\n };\n\n list = (opts: ChannelsListOptions = {}): void => {\n const output = this.buildChannelListOutput();\n if (opts.json) {\n console.log(JSON.stringify(output, null, 2));\n return;\n }\n\n console.log(\"Channels\");\n for (const channel of output.channels) {\n const flags = [\n channel.enabled ? \"enabled\" : \"disabled\",\n channel.defaultAccountId ? `defaultAccountId=${channel.defaultAccountId}` : undefined,\n ].filter(Boolean);\n console.log(`- ${channel.id} [${flags.join(\", \")}]`);\n }\n };\n\n login = async (opts: ChannelsLoginOptions = {}): Promise<void> => {\n const channelId = opts.channel?.trim();\n if (!channelId) {\n console.error(\"Channel login is handled by the running UI extension auth flow. Pass --channel <id> and use the UI login flow.\");\n process.exit(1);\n }\n\n console.error(`Channel \"${channelId}\" login is handled by the running UI extension auth flow.`);\n process.exit(1);\n };\n\n private buildChannelListOutput = () => {\n const config = loadConfig();\n const workspaceDir = getWorkspacePath(config.agents.defaults.workspace);\n return this.channelListView.build({\n config,\n workspaceDir,\n });\n };\n\n add = async (opts: ChannelsAddOptions): Promise<void> => {\n const channelId = this.requireChannelId(opts);\n const config = loadConfig();\n const next = {\n ...config,\n channels: {\n ...config.channels,\n [channelId]: {\n ...((config.channels as Record<string, Record<string, unknown>>)[channelId] ?? {}),\n ...this.buildChannelSetupInput(opts),\n enabled: true,\n },\n },\n };\n saveConfig(next);\n\n console.log(`Configured channel \"${channelId}\".`);\n await this.deps.requestRestart({\n mode: \"notify\",\n reason: `channel configured: ${channelId}`,\n manualMessage: \"渠道配置已保存,等待你手动重启后生效。\"\n });\n };\n\n private requireChannelId = (opts: ChannelsAddOptions): string => {\n const channelId = opts.channel?.trim();\n if (!channelId) {\n console.error(\"--channel is required\");\n process.exit(1);\n }\n return channelId;\n };\n\n private buildChannelSetupInput = (opts: ChannelsAddOptions): Record<string, string | undefined> => {\n return {\n name: opts.name,\n token: opts.token,\n code: opts.code,\n url: opts.url,\n httpUrl: opts.httpUrl\n };\n };\n}\n"],"mappings":";;;;;;AASA,MAAM,iBAAyC;CAC7C,UAAU;CACV,UAAU;CACV,SAAS;CACT,QAAQ;CACR,UAAU;CACV,OAAO;CACP,OAAO;CACP,OAAO;CACP,IAAI;CACJ,QAAQ;CACT;AACD,IAAa,kBAAb,MAA6B;CAC3B,kBAAmC,IAAI,wBAAwB;CAE/D,YACE,MAGA;AAHQ,OAAA,OAAA;;CAKV,eAAqB;EACnB,MAAM,SAAS,YAAY;EAC3B,MAAM,eAAe,iBAAiB,OAAO,OAAO,SAAS,UAAU;EACvE,MAAM,gBAAgB,yBAAyB,OAAO;AAEtD,UAAQ,IAAI,iBAAiB;EAC7B,MAAM,WAAW,cAAc;AAC/B,OAAK,MAAM,aAAa,qBAAqB;GAC3C,MAAM,QAAQ,eAAe,cAAc;GAC3C,MAAM,UAAU,SAAS,YAAY,YAAY;AACjD,WAAQ,IAAI,GAAG,MAAM,IAAI,UAAU,MAAM,MAAM;;EAGjD,MAAM,oBAAoB,wBAAwB;GAAE;GAAQ,WAAW;GAAc,CAAC;AACtF,MAAI,kBAAkB,SAAS,GAAG;AAChC,WAAQ,IAAI,sBAAsB;AAClC,QAAK,MAAM,aAAa,kBACtB,SAAQ,IAAI,KAAK,YAAY;;;CAKnC,QAAQ,OAA4B,EAAE,KAAW;EAC/C,MAAM,SAAS,KAAK,wBAAwB;AAC5C,MAAI,KAAK,MAAM;AACb,WAAQ,IAAI,KAAK,UAAU,QAAQ,MAAM,EAAE,CAAC;AAC5C;;AAGF,UAAQ,IAAI,WAAW;AACvB,OAAK,MAAM,WAAW,OAAO,UAAU;GACrC,MAAM,QAAQ,CACZ,QAAQ,UAAU,YAAY,YAC9B,QAAQ,mBAAmB,oBAAoB,QAAQ,qBAAqB,KAAA,EAC7E,CAAC,OAAO,QAAQ;AACjB,WAAQ,IAAI,KAAK,QAAQ,GAAG,IAAI,MAAM,KAAK,KAAK,CAAC,GAAG;;;CAIxD,QAAQ,OAAO,OAA6B,EAAE,KAAoB;EAChE,MAAM,YAAY,KAAK,SAAS,MAAM;AACtC,MAAI,CAAC,WAAW;AACd,WAAQ,MAAM,iHAAiH;AAC/H,WAAQ,KAAK,EAAE;;AAGjB,UAAQ,MAAM,YAAY,UAAU,2DAA2D;AAC/F,UAAQ,KAAK,EAAE;;CAGjB,+BAAuC;EACrC,MAAM,SAAS,YAAY;EAC3B,MAAM,eAAe,iBAAiB,OAAO,OAAO,SAAS,UAAU;AACvE,SAAO,KAAK,gBAAgB,MAAM;GAChC;GACA;GACD,CAAC;;CAGJ,MAAM,OAAO,SAA4C;EACvD,MAAM,YAAY,KAAK,iBAAiB,KAAK;EAC7C,MAAM,SAAS,YAAY;AAY3B,aAXa;GACX,GAAG;GACH,UAAU;IACR,GAAG,OAAO;KACT,YAAY;KACX,GAAK,OAAO,SAAqD,cAAc,EAAE;KACjF,GAAG,KAAK,uBAAuB,KAAK;KACpC,SAAS;KACV;IACF;GACF,CACe;AAEhB,UAAQ,IAAI,uBAAuB,UAAU,IAAI;AACjD,QAAM,KAAK,KAAK,eAAe;GAC7B,MAAM;GACN,QAAQ,uBAAuB;GAC/B,eAAe;GAChB,CAAC;;CAGJ,oBAA4B,SAAqC;EAC/D,MAAM,YAAY,KAAK,SAAS,MAAM;AACtC,MAAI,CAAC,WAAW;AACd,WAAQ,MAAM,wBAAwB;AACtC,WAAQ,KAAK,EAAE;;AAEjB,SAAO;;CAGT,0BAAkC,SAAiE;AACjG,SAAO;GACL,MAAM,KAAK;GACX,OAAO,KAAK;GACZ,MAAM,KAAK;GACX,KAAK,KAAK;GACV,SAAS,KAAK;GACf"}
@@ -15,7 +15,6 @@ import { StopCommands } from "./cli/commands/stop/index.js";
15
15
  import { UiCommands } from "./cli/commands/ui/index.js";
16
16
  import { LlmUsageCommandService } from "./cli/commands/usage/services/llm-usage-command.service.js";
17
17
  import { ChannelCommands } from "./commands/channel/index.js";
18
- import { PluginCommands } from "./commands/plugin/index.js";
19
18
  import { ServiceCommands } from "./commands/service/index.js";
20
19
  import { RemoteRuntimeActions } from "@nextclaw/remote";
21
20
 
@@ -40,7 +39,6 @@ type NextclawServiceCommands = {
40
39
  config: ConfigCommands;
41
40
  mcp: McpCommands;
42
41
  secrets: SecretsCommands;
43
- plugins: PluginCommands;
44
42
  agents: AgentCommands;
45
43
  channels: ChannelCommands;
46
44
  cron: CronCommands;
@@ -1 +1 @@
1
- {"version":3,"file":"service-runtime.service.d.ts","names":[],"sources":["../src/service-runtime.service.ts"],"mappings":";;;;;;;;;;;;;;;;;;;;;;KA8CY,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,OAAA,EAAS,cAAA;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,IA+DJ,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;EAoD3C,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;EAsB3C,MAAA,GAAgB,IAAA,EAAM,oBAAA,KAAuB,OAAA;AAAA;AAAA,cAkBlC,6BAAA,GACX,IAAA"}
@@ -9,7 +9,6 @@ import { NextclawDistributionService } from "./shared/services/runtime/nextclaw-
9
9
  import { NpmRuntimeUpdateCommandService } from "./launcher/npm-runtime-update-command.service.js";
10
10
  import { NpmRuntimeLauncher } from "./launcher/npm-runtime-launcher.service.js";
11
11
  import { managedServiceStateStore } from "./shared/stores/managed-service-state.store.js";
12
- import { PluginCommands, mergePluginConfigView, toPluginConfigView as toPluginConfigView$1 } from "./commands/plugin/index.js";
13
12
  import { ChannelCommands } from "./commands/channel/index.js";
14
13
  import { ConfigCommands } from "./cli/commands/config/services/config-commands.service.js";
15
14
  import "./cli/commands/config/index.js";
@@ -40,10 +39,9 @@ import { ServeCommands } from "./cli/commands/serve/index.js";
40
39
  import { StopCommands } from "./cli/commands/stop/index.js";
41
40
  import { LlmUsageCommandService } from "./cli/commands/usage/services/llm-usage-command.service.js";
42
41
  import "./cli/commands/usage/index.js";
43
- import { APP_NAME, getConfigPath, getDataDir, loadConfig, resolveConfigSecrets, resolveWorkspacePath, saveConfig } from "@nextclaw/core";
42
+ import { APP_NAME, getConfigPath, getDataDir, loadConfig, resolveWorkspacePath } from "@nextclaw/core";
44
43
  import { NextclawKernel } from "@nextclaw/kernel";
45
44
  import { RemoteRuntimeActions } from "@nextclaw/remote";
46
- import { setPluginRuntimeBridge } from "@nextclaw/openclaw-compat";
47
45
  import { existsSync, mkdirSync } from "node:fs";
48
46
  import { spawn } from "node:child_process";
49
47
  //#region src/service-runtime.service.ts
@@ -63,7 +61,7 @@ var NextclawServiceRuntime = class {
63
61
  constructor(options) {
64
62
  logStartupTrace("cli.runtime.constructor.begin");
65
63
  this.logo = options.logo ?? "🤖";
66
- this.workspaceManager = measureStartupSync("cli.runtime.workspace_manager", () => new WorkspaceManager(this.logo));
64
+ this.workspaceManager = measureStartupSync("cli.runtime.workspace_manager", () => new WorkspaceManager());
67
65
  this.runtimeCommandService = measureStartupSync("cli.runtime.runtime_command_service", () => new RuntimeCommandService({
68
66
  requestRestart: (params) => this.requestRestart(params),
69
67
  initializeAgentHomeDirectory: (homeDirectory) => this.workspaceManager.createWorkspaceTemplates(homeDirectory)
@@ -126,13 +124,8 @@ var NextclawServiceRuntime = class {
126
124
  config: measureStartupSync("cli.runtime.config_commands", () => new ConfigCommands({ requestRestart: (params) => this.requestRestart(params) })),
127
125
  mcp: measureStartupSync("cli.runtime.mcp_commands", () => new McpCommands()),
128
126
  secrets: measureStartupSync("cli.runtime.secrets_commands", () => new SecretsCommands({ requestRestart: (params) => this.requestRestart(params) })),
129
- plugins: measureStartupSync("cli.runtime.plugin_commands", () => new PluginCommands()),
130
127
  agents: measureStartupSync("cli.runtime.agent_commands", () => new AgentCommands({ initializeAgentHomeDirectory: (homeDirectory) => this.workspaceManager.createWorkspaceTemplates(homeDirectory) })),
131
- channels: measureStartupSync("cli.runtime.channel_commands", () => new ChannelCommands({
132
- logo: this.logo,
133
- getBridgeDir: () => this.workspaceManager.getBridgeDir(),
134
- requestRestart: (params) => this.requestRestart(params)
135
- })),
128
+ channels: measureStartupSync("cli.runtime.channel_commands", () => new ChannelCommands({ requestRestart: (params) => this.requestRestart(params) })),
136
129
  cron: measureStartupSync("cli.runtime.cron_commands", () => new CronCommands()),
137
130
  diagnostics: measureStartupSync("cli.runtime.diagnostics_commands", () => new DiagnosticsCommands({ logo: this.logo })),
138
131
  logs: measureStartupSync("cli.runtime.logs_commands", () => new LogsCommands()),
@@ -340,25 +333,14 @@ var NextclawServiceRuntime = class {
340
333
  configPath
341
334
  });
342
335
  const config = kernel.configManager.config;
343
- setPluginRuntimeBridge({
344
- loadConfig: () => toPluginConfigView$1(resolveConfigSecrets(loadConfig(), { configPath }), kernel.extensions.getChannelBindings()),
345
- writeConfigFile: async (nextConfigView) => {
346
- if (!nextConfigView || typeof nextConfigView !== "object" || Array.isArray(nextConfigView)) throw new Error("plugin runtime writeConfigFile expects an object config");
347
- saveConfig(mergePluginConfigView(loadConfig(), nextConfigView, kernel.extensions.getChannelBindings()));
348
- }
336
+ const providerManager = kernel.llmUsage.observeProviderManager(kernel.llmProviders, "cli-agent");
337
+ await runCliAgentCommand({
338
+ logo: this.logo,
339
+ opts,
340
+ config,
341
+ kernel,
342
+ providerManager
349
343
  });
350
- try {
351
- const providerManager = kernel.llmUsage.observeProviderManager(kernel.llmProviders, "cli-agent");
352
- await runCliAgentCommand({
353
- logo: this.logo,
354
- opts,
355
- config,
356
- kernel,
357
- providerManager
358
- });
359
- } finally {
360
- setPluginRuntimeBridge(null);
361
- }
362
344
  };
363
345
  update = async (opts) => {
364
346
  const versionBefore = this.version;
@@ -1 +1 @@
1
- {"version":3,"file":"service-runtime.service.js","names":["toPluginConfigView"],"sources":["../src/service-runtime.service.ts"],"sourcesContent":["import { loadConfig, saveConfig, getConfigPath, getDataDir, resolveWorkspacePath, resolveConfigSecrets, APP_NAME } from \"@nextclaw/core\";\nimport { NextclawKernel } from \"@nextclaw/kernel\";\nimport { RemoteRuntimeActions } from \"@nextclaw/remote\";\nimport {\n setPluginRuntimeBridge,\n} from \"@nextclaw/openclaw-compat\";\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 { mergePluginConfigView, toPluginConfigView, PluginCommands } from \"@nextclaw-service/commands/plugin/index.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 plugins: PluginCommands;\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(this.logo));\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 plugins: measureStartupSync(\"cli.runtime.plugin_commands\", () => new PluginCommands()),\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 logo: this.logo,\n getBridgeDir: () => this.workspaceManager.getBridgeDir(),\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 setPluginRuntimeBridge({\n loadConfig: () =>\n toPluginConfigView(\n resolveConfigSecrets(loadConfig(), { configPath }),\n kernel.extensions.getChannelBindings(),\n ),\n writeConfigFile: async (nextConfigView) => {\n if (\n !nextConfigView ||\n typeof nextConfigView !== \"object\" ||\n Array.isArray(nextConfigView)\n ) {\n throw new Error(\n \"plugin runtime writeConfigFile expects an object config\",\n );\n }\n const current = loadConfig();\n const next = mergePluginConfigView(\n current,\n nextConfigView,\n kernel.extensions.getChannelBindings(),\n );\n saveConfig(next);\n },\n });\n\n try {\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 } finally {\n setPluginRuntimeBridge(null);\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 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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"}
@@ -0,0 +1,23 @@
1
+ import { NextclawGatewayRuntime } from "../nextclaw-gateway-runtime.service.js";
2
+ import { Config, ExtensionChannelBinding, ExtensionUiMetadata } from "@nextclaw/core";
3
+
4
+ //#region src/shared/services/gateway/managers/gateway-extension.manager.d.ts
5
+ declare class GatewayExtensionManager {
6
+ private readonly gateway;
7
+ constructor(gateway: NextclawGatewayRuntime);
8
+ getChannelBindings: () => ExtensionChannelBinding[];
9
+ getUiMetadata: () => ExtensionUiMetadata[];
10
+ load: () => Promise<void>;
11
+ reloadForConfigChange: (params: {
12
+ config: Config;
13
+ changedPaths: string[];
14
+ }) => Promise<{
15
+ restartChannels: boolean;
16
+ }>;
17
+ reloadForDevHotReload: (changedPaths: string[]) => Promise<void>;
18
+ publishConfigChanges: () => void;
19
+ private logDiagnostics;
20
+ }
21
+ //#endregion
22
+ export { GatewayExtensionManager };
23
+ //# sourceMappingURL=gateway-extension.manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gateway-extension.manager.d.ts","names":[],"sources":["../../../../../src/shared/services/gateway/managers/gateway-extension.manager.ts"],"mappings":";;;;cAIa,uBAAA;EAAA,iBACkB,OAAA;cAAA,OAAA,EAAS,sBAAA;EAEtC,kBAAA,QAAyB,uBAAA;EAEzB,aAAA,QAAoB,mBAAA;EAEpB,IAAA,QAAiB,OAAA;EAiCjB,qBAAA,GAA+B,MAAA;IAC7B,MAAA,EAAQ,MAAA;IACR,YAAA;EAAA,MACE,OAAA;IAAU,eAAA;EAAA;EAUd,qBAAA,GAA+B,YAAA,eAAyB,OAAA;EAWxD,oBAAA;EAAA,QAWQ,cAAA;AAAA"}
@@ -0,0 +1,77 @@
1
+ import { eventKeys } from "@nextclaw/shared";
2
+ //#region src/shared/services/gateway/managers/gateway-extension.manager.ts
3
+ var GatewayExtensionManager = class {
4
+ constructor(gateway) {
5
+ this.gateway = gateway;
6
+ }
7
+ getChannelBindings = () => this.gateway.kernel.extensions.getChannelBindings();
8
+ getUiMetadata = () => this.gateway.kernel.extensions.getUiMetadata();
9
+ load = async () => {
10
+ const config = this.gateway.configManager.loadConfig();
11
+ this.gateway.bootstrapStatus.markChannelsPending();
12
+ try {
13
+ const result = await this.gateway.kernel.extensions.load({
14
+ config,
15
+ onLoadStart: ({ totalExtensionCount }) => {
16
+ this.gateway.bootstrapStatus.markExtensionLoadingRunning({ totalExtensionCount });
17
+ },
18
+ onExtensionProcessed: ({ loadedExtensionCount, totalExtensionCount }) => {
19
+ this.gateway.bootstrapStatus.markExtensionLoadingProgress({
20
+ loadedExtensionCount,
21
+ totalExtensionCount
22
+ });
23
+ }
24
+ });
25
+ this.logDiagnostics(result.diagnostics);
26
+ if (result.shouldRestartChannels) await this.gateway.configManager.rebuildChannels(config, { start: false });
27
+ this.publishConfigChanges();
28
+ this.gateway.bootstrapStatus.markExtensionLoadingReady({
29
+ loadedExtensionCount: result.loadedExtensionCount,
30
+ totalExtensionCount: result.totalExtensionCount
31
+ });
32
+ } catch (error) {
33
+ this.gateway.bootstrapStatus.markExtensionLoadingError(error instanceof Error ? error.message : String(error));
34
+ throw error;
35
+ }
36
+ };
37
+ reloadForConfigChange = async (params) => {
38
+ const result = await this.gateway.kernel.extensions.reloadForConfigChange({
39
+ config: params.config,
40
+ changedPaths: params.changedPaths
41
+ });
42
+ this.logDiagnostics(result.diagnostics);
43
+ this.publishConfigChanges();
44
+ return { restartChannels: result.shouldRestartChannels };
45
+ };
46
+ reloadForDevHotReload = async (changedPaths) => {
47
+ const config = this.gateway.configManager.loadConfig();
48
+ if ((await this.reloadForConfigChange({
49
+ config,
50
+ changedPaths
51
+ })).restartChannels) await this.gateway.configManager.rebuildChannels(config, { start: true });
52
+ };
53
+ publishConfigChanges = () => {
54
+ this.gateway.appEventBus.emit(eventKeys.configUpdated, { path: "channels" }, {
55
+ emittedAt: (/* @__PURE__ */ new Date()).toISOString(),
56
+ source: "backend"
57
+ });
58
+ this.gateway.appEventBus.emit(eventKeys.configUpdated, { path: "extensions" }, {
59
+ emittedAt: (/* @__PURE__ */ new Date()).toISOString(),
60
+ source: "backend"
61
+ });
62
+ };
63
+ logDiagnostics = (diagnostics) => {
64
+ for (const diagnostic of diagnostics) {
65
+ const message = `${diagnostic.extensionId ? `${diagnostic.extensionId}: ` : ""}${diagnostic.message}`;
66
+ if (diagnostic.level === "error") {
67
+ console.error(`[extensions] ${message}`);
68
+ continue;
69
+ }
70
+ console.warn(`[extensions] ${message}`);
71
+ }
72
+ };
73
+ };
74
+ //#endregion
75
+ export { GatewayExtensionManager };
76
+
77
+ //# sourceMappingURL=gateway-extension.manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gateway-extension.manager.js","names":[],"sources":["../../../../../src/shared/services/gateway/managers/gateway-extension.manager.ts"],"sourcesContent":["import type { Config, ExtensionChannelBinding, ExtensionUiMetadata } from \"@nextclaw/core\";\nimport { eventKeys } from \"@nextclaw/shared\";\nimport type { NextclawGatewayRuntime } from \"@nextclaw-service/shared/services/gateway/nextclaw-gateway-runtime.service.js\";\n\nexport class GatewayExtensionManager {\n constructor(private readonly gateway: NextclawGatewayRuntime) {}\n\n getChannelBindings = (): ExtensionChannelBinding[] => this.gateway.kernel.extensions.getChannelBindings();\n\n getUiMetadata = (): ExtensionUiMetadata[] => this.gateway.kernel.extensions.getUiMetadata();\n\n load = async (): Promise<void> => {\n const config = this.gateway.configManager.loadConfig();\n this.gateway.bootstrapStatus.markChannelsPending();\n\n try {\n const result = await this.gateway.kernel.extensions.load({\n config,\n onLoadStart: ({ totalExtensionCount }) => {\n this.gateway.bootstrapStatus.markExtensionLoadingRunning({ totalExtensionCount });\n },\n onExtensionProcessed: ({ loadedExtensionCount, totalExtensionCount }) => {\n this.gateway.bootstrapStatus.markExtensionLoadingProgress({\n loadedExtensionCount,\n totalExtensionCount,\n });\n },\n });\n this.logDiagnostics(result.diagnostics);\n\n if (result.shouldRestartChannels) {\n await this.gateway.configManager.rebuildChannels(config, { start: false });\n }\n this.publishConfigChanges();\n this.gateway.bootstrapStatus.markExtensionLoadingReady({\n loadedExtensionCount: result.loadedExtensionCount,\n totalExtensionCount: result.totalExtensionCount,\n });\n } catch (error) {\n this.gateway.bootstrapStatus.markExtensionLoadingError(error instanceof Error ? error.message : String(error));\n throw error;\n }\n };\n\n reloadForConfigChange = async (params: {\n config: Config;\n changedPaths: string[];\n }): Promise<{ restartChannels: boolean }> => {\n const result = await this.gateway.kernel.extensions.reloadForConfigChange({\n config: params.config,\n changedPaths: params.changedPaths,\n });\n this.logDiagnostics(result.diagnostics);\n this.publishConfigChanges();\n return { restartChannels: result.shouldRestartChannels };\n };\n\n reloadForDevHotReload = async (changedPaths: string[]): Promise<void> => {\n const config = this.gateway.configManager.loadConfig();\n const result = await this.reloadForConfigChange({\n config,\n changedPaths,\n });\n if (result.restartChannels) {\n await this.gateway.configManager.rebuildChannels(config, { start: true });\n }\n };\n\n publishConfigChanges = (): void => {\n this.gateway.appEventBus.emit(eventKeys.configUpdated, { path: \"channels\" }, {\n emittedAt: new Date().toISOString(),\n source: \"backend\",\n });\n this.gateway.appEventBus.emit(eventKeys.configUpdated, { path: \"extensions\" }, {\n emittedAt: new Date().toISOString(),\n source: \"backend\",\n });\n };\n\n private logDiagnostics = (\n diagnostics: Array<{ level: \"warn\" | \"error\"; message: string; extensionId?: string; source?: string }>,\n ): void => {\n for (const diagnostic of diagnostics) {\n const prefix = diagnostic.extensionId ? `${diagnostic.extensionId}: ` : \"\";\n const message = `${prefix}${diagnostic.message}`;\n if (diagnostic.level === \"error\") {\n console.error(`[extensions] ${message}`);\n continue;\n }\n console.warn(`[extensions] ${message}`);\n }\n };\n}\n"],"mappings":";;AAIA,IAAa,0BAAb,MAAqC;CACnC,YAAY,SAAkD;AAAjC,OAAA,UAAA;;CAE7B,2BAAsD,KAAK,QAAQ,OAAO,WAAW,oBAAoB;CAEzG,sBAA6C,KAAK,QAAQ,OAAO,WAAW,eAAe;CAE3F,OAAO,YAA2B;EAChC,MAAM,SAAS,KAAK,QAAQ,cAAc,YAAY;AACtD,OAAK,QAAQ,gBAAgB,qBAAqB;AAElD,MAAI;GACF,MAAM,SAAS,MAAM,KAAK,QAAQ,OAAO,WAAW,KAAK;IACvD;IACA,cAAc,EAAE,0BAA0B;AACxC,UAAK,QAAQ,gBAAgB,4BAA4B,EAAE,qBAAqB,CAAC;;IAEnF,uBAAuB,EAAE,sBAAsB,0BAA0B;AACvE,UAAK,QAAQ,gBAAgB,6BAA6B;MACxD;MACA;MACD,CAAC;;IAEL,CAAC;AACF,QAAK,eAAe,OAAO,YAAY;AAEvC,OAAI,OAAO,sBACT,OAAM,KAAK,QAAQ,cAAc,gBAAgB,QAAQ,EAAE,OAAO,OAAO,CAAC;AAE5E,QAAK,sBAAsB;AAC3B,QAAK,QAAQ,gBAAgB,0BAA0B;IACrD,sBAAsB,OAAO;IAC7B,qBAAqB,OAAO;IAC7B,CAAC;WACK,OAAO;AACd,QAAK,QAAQ,gBAAgB,0BAA0B,iBAAiB,QAAQ,MAAM,UAAU,OAAO,MAAM,CAAC;AAC9G,SAAM;;;CAIV,wBAAwB,OAAO,WAGc;EAC3C,MAAM,SAAS,MAAM,KAAK,QAAQ,OAAO,WAAW,sBAAsB;GACxE,QAAQ,OAAO;GACf,cAAc,OAAO;GACtB,CAAC;AACF,OAAK,eAAe,OAAO,YAAY;AACvC,OAAK,sBAAsB;AAC3B,SAAO,EAAE,iBAAiB,OAAO,uBAAuB;;CAG1D,wBAAwB,OAAO,iBAA0C;EACvE,MAAM,SAAS,KAAK,QAAQ,cAAc,YAAY;AAKtD,OAJe,MAAM,KAAK,sBAAsB;GAC9C;GACA;GACD,CAAC,EACS,gBACT,OAAM,KAAK,QAAQ,cAAc,gBAAgB,QAAQ,EAAE,OAAO,MAAM,CAAC;;CAI7E,6BAAmC;AACjC,OAAK,QAAQ,YAAY,KAAK,UAAU,eAAe,EAAE,MAAM,YAAY,EAAE;GAC3E,4BAAW,IAAI,MAAM,EAAC,aAAa;GACnC,QAAQ;GACT,CAAC;AACF,OAAK,QAAQ,YAAY,KAAK,UAAU,eAAe,EAAE,MAAM,cAAc,EAAE;GAC7E,4BAAW,IAAI,MAAM,EAAC,aAAa;GACnC,QAAQ;GACT,CAAC;;CAGJ,kBACE,gBACS;AACT,OAAK,MAAM,cAAc,aAAa;GAEpC,MAAM,UAAU,GADD,WAAW,cAAc,GAAG,WAAW,YAAY,MAAM,KAC5C,WAAW;AACvC,OAAI,WAAW,UAAU,SAAS;AAChC,YAAQ,MAAM,gBAAgB,UAAU;AACxC;;AAEF,WAAQ,KAAK,gBAAgB,UAAU"}
@@ -1 +1 @@
1
- {"version":3,"file":"nextclaw-app.service.d.ts","names":[],"sources":["../../../../src/shared/services/gateway/nextclaw-app.service.ts"],"mappings":";;;KAIY,eAAA;EACV,QAAA;AAAA;AAAA,cAQW,WAAA;EAAA,iBAGkB,OAAA;EAAA,iBAFZ,MAAA;cAEY,OAAA,EAAS,sBAAA;EAItC,KAAA,QAAkB,OAAA;EAalB,eAAA,QAA4B,OAAA;EAc5B,4BAAA,QAAyC,OAAA;EAAA,iBAoBxB,wBAAA;AAAA"}
1
+ {"version":3,"file":"nextclaw-app.service.d.ts","names":[],"sources":["../../../../src/shared/services/gateway/nextclaw-app.service.ts"],"mappings":";;;KAIY,eAAA;EACV,QAAA;AAAA;AAAA,cAQW,WAAA;EAAA,iBAGkB,OAAA;EAAA,iBAFZ,MAAA;cAEY,OAAA,EAAS,sBAAA;EAItC,KAAA,QAAkB,OAAA;EAalB,eAAA,QAA4B,OAAA;EAc5B,4BAAA,QAAyC,OAAA;EAAA,iBAgBxB,wBAAA;AAAA"}
@@ -14,7 +14,7 @@ var NextclawApp = class {
14
14
  this.handleKernelStartupError(error);
15
15
  }
16
16
  await this.startDeferredRuntimeServices();
17
- console.log("✓ Deferred startup: plugin gateways and channels settled");
17
+ console.log("✓ Deferred startup: extensions and channels settled");
18
18
  logStartupTrace("service.deferred_startup.end");
19
19
  };
20
20
  bootstrapKernel = async () => {
@@ -28,8 +28,7 @@ var NextclawApp = class {
28
28
  console.log("✓ Service NCP agent: ready");
29
29
  };
30
30
  startDeferredRuntimeServices = async () => {
31
- await measureStartupAsync("service.deferred_startup.load_plugins", this.gateway.plugins.load);
32
- await measureStartupAsync("service.deferred_startup.start_plugin_gateways", this.gateway.plugins.startGateways);
31
+ await measureStartupAsync("service.deferred_startup.load_extensions", this.gateway.extensions.load);
33
32
  await measureStartupAsync("service.deferred_startup.start_extensions", async () => await this.kernel.extensions.start({ endpoint: this.gateway.uiStartup.endpoint }));
34
33
  await measureStartupAsync("service.deferred_startup.start_channels", this.gateway.startDeferredChannels);
35
34
  await measureStartupAsync("service.deferred_startup.wake_restart_sentinel", this.gateway.restartWake.wakeFromRestartSentinel);
@@ -1 +1 @@
1
- {"version":3,"file":"nextclaw-app.service.js","names":[],"sources":["../../../../src/shared/services/gateway/nextclaw-app.service.ts"],"sourcesContent":["import type { NextclawKernel } from \"@nextclaw/kernel\";\nimport { logStartupTrace, measureStartupAsync } from \"@nextclaw-service/shared/utils/startup-trace.js\";\nimport type { NextclawGatewayRuntime } from \"@nextclaw-service/shared/services/gateway/nextclaw-gateway-runtime.service.js\";\n\nexport type UiStartupHandle = {\n endpoint: string;\n};\n\ntype NextclawAppKernel = Pick<\n NextclawKernel,\n \"extensions\" | \"start\"\n>;\n\nexport class NextclawApp {\n private readonly kernel: NextclawAppKernel;\n\n constructor(private readonly gateway: NextclawGatewayRuntime) {\n this.kernel = gateway.kernel;\n }\n\n start = async (): Promise<void> => {\n logStartupTrace(\"service.deferred_startup.begin\");\n try {\n await this.bootstrapKernel();\n } catch (error) {\n this.handleKernelStartupError(error);\n }\n\n await this.startDeferredRuntimeServices();\n console.log(\"✓ Deferred startup: plugin gateways and channels settled\");\n logStartupTrace(\"service.deferred_startup.end\");\n };\n\n bootstrapKernel = async (): Promise<void> => {\n this.gateway.bootstrapStatus.markNcpAgentRunning();\n await measureStartupAsync(\n \"service.deferred_startup.bootstrap_kernel\",\n async () => await this.kernel.start(),\n );\n this.gateway.bootstrapStatus.markNcpAgentReady();\n if (this.gateway.uiConfig.enabled) {\n console.log(\"✓ UI NCP agent: ready\");\n return;\n }\n console.log(\"✓ Service NCP agent: ready\");\n };\n\n startDeferredRuntimeServices = async (): Promise<void> => {\n await measureStartupAsync(\n \"service.deferred_startup.load_plugins\",\n this.gateway.plugins.load,\n );\n await measureStartupAsync(\n \"service.deferred_startup.start_plugin_gateways\",\n this.gateway.plugins.startGateways,\n );\n await measureStartupAsync(\n \"service.deferred_startup.start_extensions\",\n async () => await this.kernel.extensions.start({ endpoint: this.gateway.uiStartup.endpoint }),\n );\n await measureStartupAsync(\"service.deferred_startup.start_channels\", this.gateway.startDeferredChannels);\n await measureStartupAsync(\n \"service.deferred_startup.wake_restart_sentinel\",\n this.gateway.restartWake.wakeFromRestartSentinel,\n );\n };\n\n private readonly handleKernelStartupError = (error: unknown): void => {\n this.gateway.bootstrapStatus.markNcpAgentError(\n error instanceof Error ? error.message : String(error),\n );\n console.error(\n `UI NCP agent startup failed: ${error instanceof Error ? error.message : String(error)}`,\n );\n };\n}\n"],"mappings":";;AAaA,IAAa,cAAb,MAAyB;CACvB;CAEA,YAAY,SAAkD;AAAjC,OAAA,UAAA;AAC3B,OAAK,SAAS,QAAQ;;CAGxB,QAAQ,YAA2B;AACjC,kBAAgB,iCAAiC;AACjD,MAAI;AACF,SAAM,KAAK,iBAAiB;WACrB,OAAO;AACd,QAAK,yBAAyB,MAAM;;AAGtC,QAAM,KAAK,8BAA8B;AACzC,UAAQ,IAAI,2DAA2D;AACvE,kBAAgB,+BAA+B;;CAGjD,kBAAkB,YAA2B;AAC3C,OAAK,QAAQ,gBAAgB,qBAAqB;AAClD,QAAM,oBACJ,6CACA,YAAY,MAAM,KAAK,OAAO,OAAO,CACtC;AACD,OAAK,QAAQ,gBAAgB,mBAAmB;AAChD,MAAI,KAAK,QAAQ,SAAS,SAAS;AACjC,WAAQ,IAAI,wBAAwB;AACpC;;AAEF,UAAQ,IAAI,6BAA6B;;CAG3C,+BAA+B,YAA2B;AACxD,QAAM,oBACJ,yCACA,KAAK,QAAQ,QAAQ,KACtB;AACD,QAAM,oBACJ,kDACA,KAAK,QAAQ,QAAQ,cACtB;AACD,QAAM,oBACJ,6CACA,YAAY,MAAM,KAAK,OAAO,WAAW,MAAM,EAAE,UAAU,KAAK,QAAQ,UAAU,UAAU,CAAC,CAC9F;AACD,QAAM,oBAAoB,2CAA2C,KAAK,QAAQ,sBAAsB;AACxG,QAAM,oBACJ,kDACA,KAAK,QAAQ,YAAY,wBAC1B;;CAGH,4BAA6C,UAAyB;AACpE,OAAK,QAAQ,gBAAgB,kBAC3B,iBAAiB,QAAQ,MAAM,UAAU,OAAO,MAAM,CACvD;AACD,UAAQ,MACN,gCAAgC,iBAAiB,QAAQ,MAAM,UAAU,OAAO,MAAM,GACvF"}
1
+ {"version":3,"file":"nextclaw-app.service.js","names":[],"sources":["../../../../src/shared/services/gateway/nextclaw-app.service.ts"],"sourcesContent":["import type { NextclawKernel } from \"@nextclaw/kernel\";\nimport { logStartupTrace, measureStartupAsync } from \"@nextclaw-service/shared/utils/startup-trace.js\";\nimport type { NextclawGatewayRuntime } from \"@nextclaw-service/shared/services/gateway/nextclaw-gateway-runtime.service.js\";\n\nexport type UiStartupHandle = {\n endpoint: string;\n};\n\ntype NextclawAppKernel = Pick<\n NextclawKernel,\n \"extensions\" | \"start\"\n>;\n\nexport class NextclawApp {\n private readonly kernel: NextclawAppKernel;\n\n constructor(private readonly gateway: NextclawGatewayRuntime) {\n this.kernel = gateway.kernel;\n }\n\n start = async (): Promise<void> => {\n logStartupTrace(\"service.deferred_startup.begin\");\n try {\n await this.bootstrapKernel();\n } catch (error) {\n this.handleKernelStartupError(error);\n }\n\n await this.startDeferredRuntimeServices();\n console.log(\"✓ Deferred startup: extensions and channels settled\");\n logStartupTrace(\"service.deferred_startup.end\");\n };\n\n bootstrapKernel = async (): Promise<void> => {\n this.gateway.bootstrapStatus.markNcpAgentRunning();\n await measureStartupAsync(\n \"service.deferred_startup.bootstrap_kernel\",\n async () => await this.kernel.start(),\n );\n this.gateway.bootstrapStatus.markNcpAgentReady();\n if (this.gateway.uiConfig.enabled) {\n console.log(\"✓ UI NCP agent: ready\");\n return;\n }\n console.log(\"✓ Service NCP agent: ready\");\n };\n\n startDeferredRuntimeServices = async (): Promise<void> => {\n await measureStartupAsync(\n \"service.deferred_startup.load_extensions\",\n this.gateway.extensions.load,\n );\n await measureStartupAsync(\n \"service.deferred_startup.start_extensions\",\n async () => await this.kernel.extensions.start({ endpoint: this.gateway.uiStartup.endpoint }),\n );\n await measureStartupAsync(\"service.deferred_startup.start_channels\", this.gateway.startDeferredChannels);\n await measureStartupAsync(\n \"service.deferred_startup.wake_restart_sentinel\",\n this.gateway.restartWake.wakeFromRestartSentinel,\n );\n };\n\n private readonly handleKernelStartupError = (error: unknown): void => {\n this.gateway.bootstrapStatus.markNcpAgentError(\n error instanceof Error ? error.message : String(error),\n );\n console.error(\n `UI NCP agent startup failed: ${error instanceof Error ? error.message : String(error)}`,\n );\n };\n}\n"],"mappings":";;AAaA,IAAa,cAAb,MAAyB;CACvB;CAEA,YAAY,SAAkD;AAAjC,OAAA,UAAA;AAC3B,OAAK,SAAS,QAAQ;;CAGxB,QAAQ,YAA2B;AACjC,kBAAgB,iCAAiC;AACjD,MAAI;AACF,SAAM,KAAK,iBAAiB;WACrB,OAAO;AACd,QAAK,yBAAyB,MAAM;;AAGtC,QAAM,KAAK,8BAA8B;AACzC,UAAQ,IAAI,sDAAsD;AAClE,kBAAgB,+BAA+B;;CAGjD,kBAAkB,YAA2B;AAC3C,OAAK,QAAQ,gBAAgB,qBAAqB;AAClD,QAAM,oBACJ,6CACA,YAAY,MAAM,KAAK,OAAO,OAAO,CACtC;AACD,OAAK,QAAQ,gBAAgB,mBAAmB;AAChD,MAAI,KAAK,QAAQ,SAAS,SAAS;AACjC,WAAQ,IAAI,wBAAwB;AACpC;;AAEF,UAAQ,IAAI,6BAA6B;;CAG3C,+BAA+B,YAA2B;AACxD,QAAM,oBACJ,4CACA,KAAK,QAAQ,WAAW,KACzB;AACD,QAAM,oBACJ,6CACA,YAAY,MAAM,KAAK,OAAO,WAAW,MAAM,EAAE,UAAU,KAAK,QAAQ,UAAU,UAAU,CAAC,CAC9F;AACD,QAAM,oBAAoB,2CAA2C,KAAK,QAAQ,sBAAsB;AACxG,QAAM,oBACJ,kDACA,KAAK,QAAQ,YAAY,wBAC1B;;CAGH,4BAA6C,UAAyB;AACpE,OAAK,QAAQ,gBAAgB,kBAC3B,iBAAiB,QAAQ,MAAM,UAAU,OAAO,MAAM,CACvD;AACD,UAAQ,MACN,gCAAgC,iBAAiB,QAAQ,MAAM,UAAU,OAAO,MAAM,GACvF"}
@@ -1,14 +1,14 @@
1
1
  import { RequestRestartParams } from "../../types/cli.types.js";
2
2
  import { NextclawDistribution } from "../../types/distribution.types.js";
3
3
  import { GatewayControllerImpl } from "../../controllers/gateway.controller.js";
4
- import { GatewayPluginManager } from "./managers/gateway-plugin.manager.js";
4
+ import { GatewayExtensionManager } from "./managers/gateway-extension.manager.js";
5
5
  import { GatewayRemoteManager } from "./managers/gateway-remote.manager.js";
6
6
  import { UiStartupHandle } from "./nextclaw-app.service.js";
7
7
  import { ServiceBootstrapStatusStore } from "./service-bootstrap-status.service.js";
8
8
  import { ServiceFileWatcherRegistry } from "./service-startup-support.service.js";
9
9
  import { GatewayRestartWakeService } from "./gateway-restart-wake.service.js";
10
10
  import * as NextclawCore from "@nextclaw/core";
11
- import { AutomationManager, ConfigManager, LlmProviderManager, NextclawKernel } from "@nextclaw/kernel";
11
+ import { AgentRunClient, AutomationManager, ConfigManager, LlmProviderManager, NextclawKernel } from "@nextclaw/kernel";
12
12
  import { MarketplaceApiConfig, UiRuntimeControlHost, UiRuntimeUpdateHost } from "@nextclaw/server";
13
13
  import { EventBus, Ingress } from "@nextclaw/shared";
14
14
 
@@ -42,6 +42,7 @@ declare class NextclawGatewayRuntime {
42
42
  readonly messageBus: MessageBus$1;
43
43
  readonly sessionManager: SessionManager$1;
44
44
  readonly automation: AutomationManager;
45
+ readonly agentRunClient: AgentRunClient;
45
46
  readonly runtimeControl: UiRuntimeControlHost;
46
47
  readonly runtimeUpdate: UiRuntimeUpdateHost | null;
47
48
  readonly ingress: Ingress;
@@ -55,7 +56,7 @@ declare class NextclawGatewayRuntime {
55
56
  readonly workspace: string;
56
57
  readonly remoteManager: GatewayRemoteManager;
57
58
  readonly marketplace: MarketplaceApiConfig;
58
- readonly plugins: GatewayPluginManager;
59
+ readonly extensions: GatewayExtensionManager;
59
60
  readonly restartWake: GatewayRestartWakeService;
60
61
  bootstrapStatus: ServiceBootstrapStatusStore;
61
62
  uiStartup: UiStartupHandle;
@@ -71,14 +72,12 @@ declare class NextclawGatewayRuntime {
71
72
  private runRuntimeLoop;
72
73
  private startDeferredRuntime;
73
74
  readonly startDeferredChannels: () => Promise<void>;
74
- private installChannelDevHotReload;
75
75
  private readonly startChannels;
76
76
  private createMarketplace;
77
77
  private cleanup;
78
78
  private markUiRuntimeReady;
79
79
  private createGatewayController;
80
80
  private startSupportServices;
81
- private configurePluginRuntime;
82
81
  private installConfigHostHooks;
83
82
  private configureIngressHandlers;
84
83
  }
@@ -1 +1 @@
1
- {"version":3,"file":"nextclaw-gateway-runtime.service.d.ts","names":[],"sources":["../../../../src/shared/services/gateway/nextclaw-gateway-runtime.service.ts"],"mappings":";;;;;;;;;;;;;;;KAkEK,QAAA,GAAS,YAAA,CAAa,MAAA;AAAA,KACtB,YAAA,GAAa,YAAA,CAAa,UAAA;AAAA,KAC1B,gBAAA,GAAiB,YAAA,CAAa,cAAA;AAAA,KAE9B,qBAAA;EACH,WAAA,GAAc,OAAA,CAAQ,QAAA;EACtB,WAAA;AAAA;AAAA,KAGU,kBAAA;EACV,cAAA,GAAiB,MAAA,EAAQ,oBAAA,KAAyB,OAAA;EAClD,4BAAA,GAA+B,aAAA;EAC/B,YAAA,GAAe,OAAA;IAAW,WAAA,EAAa,MAAA;IAAyB,IAAA;EAAA,MAAoB,OAAA;EACpF,WAAA,QAAmB,OAAA;EACnB,gBAAA,GAAmB,IAAA,eAAmB,OAAA;EACtC,8BAAA,GAAiC,IAAA,UAAc,KAAA;IAAiC,OAAA;IAAiB,MAAA;EAAA;AAAA;AAAA,cAGtF,sBAAA;EAAA,iBA4BQ,IAAA;EAAA,iBACA,OAAA;EAAA,SA5BV,MAAA,EAAQ,cAAA;EAAA,SACR,WAAA,EAAa,QAAA;EAAA,SACb,UAAA,EAAY,YAAA;EAAA,SACZ,cAAA,EAAgB,gBAAA;EAAA,SAChB,UAAA,EAAY,iBAAA;EAAA,SACZ,cAAA,EAAgB,oBAAA;EAAA,SAChB,aAAA,EAAe,mBAAA;EAAA,SACf,OAAA,EAAS,OAAA;EAAA,SACT,YAAA,EADgB,oBAAA;EAAA,SAEhB,cAAA;EAAA,SACA,eAAA,EAAiB,kBAAA;EAAA,SACjB,iBAAA,EAAmB,qBAAA;EAAA,SAEnB,aAAA,EAAe,aAAA;EAAA,SACf,QAAA,EAAU,QAAA;EAAA,SACV,WAAA;EAAA,SACA,SAAA;EAAA,SACA,aAAA,EAAe,oBAAA;EAAA,SACf,WAAA,EAAa,oBAAA;EAAA,SACb,OAAA,EAAS,oBAAA;EAAA,SACT,WAAA,EAAa,yBAAA;EACtB,eAAA,EAAiB,2BAAA;EACjB,SAAA,EAAW,eAAA;EAAA,SACF,YAAA,EAAY,0BAAA;EAAA,QACb,sBAAA;cAGW,IAAA,EAAM,kBAAA,EACN,OAAA,EAAS,qBAAA;EAyD5B,KAAA,QAAkB,OAAA;EAAA,QAcV,KAAA;EAAA,QAOA,qBAAA;EAAA,QAOA,uBAAA;EAAA,QAIA,cAAA;EAAA,QAiCA,qBAAA;EAAA,QAkBA,cAAA;EAAA,QAmBA,oBAAA;EAAA,SAKC,qBAAA,QAAkC,OAAA;EAAA,QAInC,0BAAA;EAAA,iBAcS,aAAA;EAAA,QAWT,iBAAA;EAAA,QASA,OAAA;EAAA,QASA,kBAAA;EAAA,QAKA,uBAAA;EAAA,QAqBA,oBAAA;EAAA,QAiBA,sBAAA;EAAA,QAIA,sBAAA;EAAA,QA2BA,wBAAA;AAAA"}
1
+ {"version":3,"file":"nextclaw-gateway-runtime.service.d.ts","names":[],"sources":["../../../../src/shared/services/gateway/nextclaw-gateway-runtime.service.ts"],"mappings":";;;;;;;;;;;;;;;KA4DK,QAAA,GAAS,YAAA,CAAa,MAAA;AAAA,KACtB,YAAA,GAAa,YAAA,CAAa,UAAA;AAAA,KAC1B,gBAAA,GAAiB,YAAA,CAAa,cAAA;AAAA,KAE9B,qBAAA;EACH,WAAA,GAAc,OAAA,CAAQ,QAAA;EACtB,WAAA;AAAA;AAAA,KAGU,kBAAA;EACV,cAAA,GAAiB,MAAA,EAAQ,oBAAA,KAAyB,OAAA;EAClD,4BAAA,GAA+B,aAAA;EAC/B,YAAA,GAAe,OAAA;IAAW,WAAA,EAAa,MAAA;IAAyB,IAAA;EAAA,MAAoB,OAAA;EACpF,WAAA,QAAmB,OAAA;EACnB,gBAAA,GAAmB,IAAA,eAAmB,OAAA;EACtC,8BAAA,GAAiC,IAAA,UAAc,KAAA;IAAiC,OAAA;IAAiB,MAAA;EAAA;AAAA;AAAA,cAGtF,sBAAA;EAAA,iBA6BQ,IAAA;EAAA,iBACA,OAAA;EAAA,SA7BV,MAAA,EAAQ,cAAA;EAAA,SACR,WAAA,EAAa,QAAA;EAAA,SACb,UAAA,EAAY,YAAA;EAAA,SACZ,cAAA,EAAgB,gBAAA;EAAA,SAChB,UAAA,EAAY,iBAAA;EAAA,SACZ,cAAA,EAAgB,cAAA;EAAA,SAChB,cAAA,EAAgB,oBAAA;EAAA,SAChB,aAAA,EAAe,mBAAA;EAAA,SACf,OAAA,EAAS,OAAA;EAAA,SACT,YAAA,EADgB,oBAAA;EAAA,SAEhB,cAAA;EAAA,SACA,eAAA,EAAiB,kBAAA;EAAA,SACjB,iBAAA,EAAmB,qBAAA;EAAA,SAEnB,aAAA,EAAe,aAAA;EAAA,SACf,QAAA,EAAU,QAAA;EAAA,SACV,WAAA;EAAA,SACA,SAAA;EAAA,SACA,aAAA,EAAe,oBAAA;EAAA,SACf,WAAA,EAAa,oBAAA;EAAA,SACb,UAAA,EAAY,uBAAA;EAAA,SACZ,WAAA,EAAa,yBAAA;EACtB,eAAA,EAAiB,2BAAA;EACjB,SAAA,EAAW,eAAA;EAAA,SACF,YAAA,EAAY,0BAAA;EAAA,QACb,sBAAA;cAGW,IAAA,EAAM,kBAAA,EACN,OAAA,EAAS,qBAAA;EA6D5B,KAAA,QAAkB,OAAA;EAAA,QAaV,KAAA;EAAA,QAOA,qBAAA;EAAA,QAOA,uBAAA;EAAA,QAIA,cAAA;EAAA,QAiCA,qBAAA;EAAA,QAkBA,cAAA;EAAA,QAmBA,oBAAA;EAAA,SAKC,qBAAA,QAAkC,OAAA;EAAA,iBAI1B,aAAA;EAAA,QAWT,iBAAA;EAAA,QASA,OAAA;EAAA,QAOA,kBAAA;EAAA,QAKA,uBAAA;EAAA,QAqBA,oBAAA;EAAA,QAgBA,sBAAA;EAAA,QAiBA,wBAAA;AAAA"}