@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,119 +0,0 @@
1
- import { resolve, sep } from "node:path";
2
- import chokidar from "chokidar";
3
- //#region src/shared/services/plugin/utils/plugin-dev-hot-reload.utils.ts
4
- const DEV_PLUGIN_HOT_RELOAD_TARGETS_ENV = "NEXTCLAW_DEV_PLUGIN_HOT_RELOAD_TARGETS";
5
- function isRecord(value) {
6
- return Boolean(value) && typeof value === "object" && !Array.isArray(value);
7
- }
8
- function readOptionalString(value) {
9
- if (typeof value !== "string") return null;
10
- const trimmed = value.trim();
11
- return trimmed.length > 0 ? trimmed : null;
12
- }
13
- function normalizeWatchPaths(value) {
14
- if (!Array.isArray(value)) return [];
15
- const watchPaths = [];
16
- for (const entry of value) {
17
- const normalized = readOptionalString(entry);
18
- if (!normalized) continue;
19
- const resolvedPath = resolve(normalized);
20
- if (!watchPaths.includes(resolvedPath)) watchPaths.push(resolvedPath);
21
- }
22
- return watchPaths;
23
- }
24
- function resolveDevPluginHotReloadTargets(rawValue = process.env[DEV_PLUGIN_HOT_RELOAD_TARGETS_ENV]) {
25
- if (typeof rawValue !== "string" || rawValue.trim().length === 0) return [];
26
- let parsed;
27
- try {
28
- parsed = JSON.parse(rawValue);
29
- } catch (error) {
30
- throw new Error(`[dev-plugin-hot-reload] failed to parse ${DEV_PLUGIN_HOT_RELOAD_TARGETS_ENV}: ${error instanceof Error ? error.message : String(error)}`);
31
- }
32
- if (!Array.isArray(parsed)) throw new Error(`[dev-plugin-hot-reload] ${DEV_PLUGIN_HOT_RELOAD_TARGETS_ENV} must be a JSON array`);
33
- const seenPluginIds = /* @__PURE__ */ new Set();
34
- const targets = [];
35
- for (const entry of parsed) {
36
- if (!isRecord(entry)) continue;
37
- const pluginId = readOptionalString(entry.pluginId);
38
- const pluginPath = readOptionalString(entry.pluginPath);
39
- const watchPaths = normalizeWatchPaths(entry.watchPaths);
40
- if (!pluginId || !pluginPath || watchPaths.length === 0) continue;
41
- if (seenPluginIds.has(pluginId)) throw new Error(`[dev-plugin-hot-reload] duplicate plugin target for "${pluginId}"`);
42
- seenPluginIds.add(pluginId);
43
- targets.push({
44
- pluginId,
45
- pluginPath: resolve(pluginPath),
46
- watchPaths
47
- });
48
- }
49
- return targets;
50
- }
51
- function startDevPluginHotReloadWatcher(params) {
52
- const targets = params.targets ?? resolveDevPluginHotReloadTargets();
53
- if (targets.length === 0) return;
54
- const pendingPluginIds = /* @__PURE__ */ new Set();
55
- let flushTimer = null;
56
- let reloadRunning = false;
57
- let reloadPending = false;
58
- const flushReload = async () => {
59
- if (reloadRunning) {
60
- reloadPending = true;
61
- return;
62
- }
63
- const pluginIds = [...pendingPluginIds];
64
- pendingPluginIds.clear();
65
- if (pluginIds.length === 0) return;
66
- reloadRunning = true;
67
- try {
68
- console.log(`[dev] Plugin dist updated: ${pluginIds.join(", ")}`);
69
- await params.reloadPlugins(pluginIds);
70
- console.log(`[dev] Plugin hot reload applied: ${pluginIds.join(", ")}`);
71
- } catch (error) {
72
- console.error(`[dev] Plugin hot reload failed: ${error instanceof Error ? error.message : String(error)}`);
73
- } finally {
74
- reloadRunning = false;
75
- if (reloadPending || pendingPluginIds.size > 0) {
76
- reloadPending = false;
77
- await flushReload();
78
- }
79
- }
80
- };
81
- const scheduleReload = (pluginId) => {
82
- pendingPluginIds.add(pluginId);
83
- if (flushTimer) clearTimeout(flushTimer);
84
- flushTimer = setTimeout(() => {
85
- flushTimer = null;
86
- flushReload();
87
- }, 150);
88
- };
89
- const watcher = chokidar.watch(targets.flatMap((entry) => entry.watchPaths), {
90
- ignoreInitial: true,
91
- awaitWriteFinish: {
92
- stabilityThreshold: 200,
93
- pollInterval: 50
94
- }
95
- });
96
- params.watcherRegistry.remember(watcher);
97
- watcher.on("all", (_event, changedPath) => {
98
- const normalizedChangedPath = resolve(changedPath);
99
- for (const target of targets) if (target.watchPaths.some((watchPath) => normalizedChangedPath === watchPath || normalizedChangedPath.startsWith(`${watchPath}${sep}`))) scheduleReload(target.pluginId);
100
- });
101
- console.log(`[dev] Plugin hot reload watcher: ${targets.map((entry) => entry.pluginId).join(", ")}`);
102
- }
103
- function wrapStartChannelsWithDevPluginHotReload(params) {
104
- return async () => {
105
- await params.startChannels();
106
- console.log(`[dev] Plugin hot reload watcher will arm after ${params.startupSettleMs}ms startup settle window.`);
107
- setTimeout(() => {
108
- if (!params.isRuntimeActive()) return;
109
- startDevPluginHotReloadWatcher({
110
- watcherRegistry: params.watcherRegistry,
111
- reloadPlugins: params.reloadPlugins
112
- });
113
- }, params.startupSettleMs).unref?.();
114
- };
115
- }
116
- //#endregion
117
- export { DEV_PLUGIN_HOT_RELOAD_TARGETS_ENV, resolveDevPluginHotReloadTargets, startDevPluginHotReloadWatcher, wrapStartChannelsWithDevPluginHotReload };
118
-
119
- //# sourceMappingURL=plugin-dev-hot-reload.utils.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"plugin-dev-hot-reload.utils.js","names":[],"sources":["../../../../../src/shared/services/plugin/utils/plugin-dev-hot-reload.utils.ts"],"sourcesContent":["import chokidar from \"chokidar\";\nimport { resolve, sep } from \"node:path\";\nimport type { ServiceFileWatcherRegistry } from \"@nextclaw-service/shared/services/gateway/service-startup-support.service.js\";\n\nexport const DEV_PLUGIN_HOT_RELOAD_TARGETS_ENV = \"NEXTCLAW_DEV_PLUGIN_HOT_RELOAD_TARGETS\";\n\nexport type DevPluginHotReloadTarget = {\n pluginId: string;\n pluginPath: string;\n watchPaths: string[];\n};\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return Boolean(value) && typeof value === \"object\" && !Array.isArray(value);\n}\n\nfunction readOptionalString(value: unknown): string | null {\n if (typeof value !== \"string\") {\n return null;\n }\n const trimmed = value.trim();\n return trimmed.length > 0 ? trimmed : null;\n}\n\nfunction normalizeWatchPaths(value: unknown): string[] {\n if (!Array.isArray(value)) {\n return [];\n }\n const watchPaths: string[] = [];\n for (const entry of value) {\n const normalized = readOptionalString(entry);\n if (!normalized) {\n continue;\n }\n const resolvedPath = resolve(normalized);\n if (!watchPaths.includes(resolvedPath)) {\n watchPaths.push(resolvedPath);\n }\n }\n return watchPaths;\n}\n\nexport function resolveDevPluginHotReloadTargets(\n rawValue = process.env[DEV_PLUGIN_HOT_RELOAD_TARGETS_ENV],\n): DevPluginHotReloadTarget[] {\n if (typeof rawValue !== \"string\" || rawValue.trim().length === 0) {\n return [];\n }\n\n let parsed: unknown;\n try {\n parsed = JSON.parse(rawValue);\n } catch (error) {\n throw new Error(\n `[dev-plugin-hot-reload] failed to parse ${DEV_PLUGIN_HOT_RELOAD_TARGETS_ENV}: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n\n if (!Array.isArray(parsed)) {\n throw new Error(\n `[dev-plugin-hot-reload] ${DEV_PLUGIN_HOT_RELOAD_TARGETS_ENV} must be a JSON array`,\n );\n }\n\n const seenPluginIds = new Set<string>();\n const targets: DevPluginHotReloadTarget[] = [];\n for (const entry of parsed) {\n if (!isRecord(entry)) {\n continue;\n }\n const pluginId = readOptionalString(entry.pluginId);\n const pluginPath = readOptionalString(entry.pluginPath);\n const watchPaths = normalizeWatchPaths(entry.watchPaths);\n if (!pluginId || !pluginPath || watchPaths.length === 0) {\n continue;\n }\n if (seenPluginIds.has(pluginId)) {\n throw new Error(\n `[dev-plugin-hot-reload] duplicate plugin target for \"${pluginId}\"`,\n );\n }\n seenPluginIds.add(pluginId);\n targets.push({\n pluginId,\n pluginPath: resolve(pluginPath),\n watchPaths,\n });\n }\n return targets;\n}\n\nexport function startDevPluginHotReloadWatcher(params: {\n watcherRegistry: ServiceFileWatcherRegistry;\n reloadPlugins: (pluginIds: string[]) => Promise<void>;\n targets?: DevPluginHotReloadTarget[];\n}): void {\n const targets = params.targets ?? resolveDevPluginHotReloadTargets();\n if (targets.length === 0) {\n return;\n }\n\n const pendingPluginIds = new Set<string>();\n let flushTimer: ReturnType<typeof setTimeout> | null = null;\n let reloadRunning = false;\n let reloadPending = false;\n\n const flushReload = async (): Promise<void> => {\n if (reloadRunning) {\n reloadPending = true;\n return;\n }\n const pluginIds = [...pendingPluginIds];\n pendingPluginIds.clear();\n if (pluginIds.length === 0) {\n return;\n }\n\n reloadRunning = true;\n try {\n console.log(`[dev] Plugin dist updated: ${pluginIds.join(\", \")}`);\n await params.reloadPlugins(pluginIds);\n console.log(`[dev] Plugin hot reload applied: ${pluginIds.join(\", \")}`);\n } catch (error) {\n console.error(\n `[dev] Plugin hot reload failed: ${error instanceof Error ? error.message : String(error)}`,\n );\n } finally {\n reloadRunning = false;\n if (reloadPending || pendingPluginIds.size > 0) {\n reloadPending = false;\n await flushReload();\n }\n }\n };\n\n const scheduleReload = (pluginId: string): void => {\n pendingPluginIds.add(pluginId);\n if (flushTimer) {\n clearTimeout(flushTimer);\n }\n flushTimer = setTimeout(() => {\n flushTimer = null;\n void flushReload();\n }, 150);\n };\n\n const watcher = chokidar.watch(\n targets.flatMap((entry) => entry.watchPaths),\n {\n ignoreInitial: true,\n awaitWriteFinish: { stabilityThreshold: 200, pollInterval: 50 },\n },\n );\n params.watcherRegistry.remember(watcher);\n watcher.on(\"all\", (_event, changedPath) => {\n const normalizedChangedPath = resolve(changedPath);\n for (const target of targets) {\n if (\n target.watchPaths.some((watchPath) =>\n normalizedChangedPath === watchPath ||\n normalizedChangedPath.startsWith(`${watchPath}${sep}`),\n )\n ) {\n scheduleReload(target.pluginId);\n }\n }\n });\n\n console.log(\n `[dev] Plugin hot reload watcher: ${targets.map((entry) => entry.pluginId).join(\", \")}`,\n );\n}\n\nexport function wrapStartChannelsWithDevPluginHotReload(params: {\n startChannels: () => Promise<void>;\n watcherRegistry: ServiceFileWatcherRegistry;\n isRuntimeActive: () => boolean;\n reloadPlugins: (pluginIds: string[]) => Promise<void>;\n startupSettleMs: number;\n}): () => Promise<void> {\n return async () => {\n await params.startChannels();\n console.log(\n `[dev] Plugin hot reload watcher will arm after ${params.startupSettleMs}ms startup settle window.`,\n );\n const timer = setTimeout(() => {\n if (!params.isRuntimeActive()) {\n return;\n }\n startDevPluginHotReloadWatcher({\n watcherRegistry: params.watcherRegistry,\n reloadPlugins: params.reloadPlugins,\n });\n }, params.startupSettleMs);\n timer.unref?.();\n };\n}\n"],"mappings":";;;AAIA,MAAa,oCAAoC;AAQjD,SAAS,SAAS,OAAkD;AAClE,QAAO,QAAQ,MAAM,IAAI,OAAO,UAAU,YAAY,CAAC,MAAM,QAAQ,MAAM;;AAG7E,SAAS,mBAAmB,OAA+B;AACzD,KAAI,OAAO,UAAU,SACnB,QAAO;CAET,MAAM,UAAU,MAAM,MAAM;AAC5B,QAAO,QAAQ,SAAS,IAAI,UAAU;;AAGxC,SAAS,oBAAoB,OAA0B;AACrD,KAAI,CAAC,MAAM,QAAQ,MAAM,CACvB,QAAO,EAAE;CAEX,MAAM,aAAuB,EAAE;AAC/B,MAAK,MAAM,SAAS,OAAO;EACzB,MAAM,aAAa,mBAAmB,MAAM;AAC5C,MAAI,CAAC,WACH;EAEF,MAAM,eAAe,QAAQ,WAAW;AACxC,MAAI,CAAC,WAAW,SAAS,aAAa,CACpC,YAAW,KAAK,aAAa;;AAGjC,QAAO;;AAGT,SAAgB,iCACd,WAAW,QAAQ,IAAI,oCACK;AAC5B,KAAI,OAAO,aAAa,YAAY,SAAS,MAAM,CAAC,WAAW,EAC7D,QAAO,EAAE;CAGX,IAAI;AACJ,KAAI;AACF,WAAS,KAAK,MAAM,SAAS;UACtB,OAAO;AACd,QAAM,IAAI,MACR,2CAA2C,kCAAkC,IAAI,iBAAiB,QAAQ,MAAM,UAAU,OAAO,MAAM,GACxI;;AAGH,KAAI,CAAC,MAAM,QAAQ,OAAO,CACxB,OAAM,IAAI,MACR,2BAA2B,kCAAkC,uBAC9D;CAGH,MAAM,gCAAgB,IAAI,KAAa;CACvC,MAAM,UAAsC,EAAE;AAC9C,MAAK,MAAM,SAAS,QAAQ;AAC1B,MAAI,CAAC,SAAS,MAAM,CAClB;EAEF,MAAM,WAAW,mBAAmB,MAAM,SAAS;EACnD,MAAM,aAAa,mBAAmB,MAAM,WAAW;EACvD,MAAM,aAAa,oBAAoB,MAAM,WAAW;AACxD,MAAI,CAAC,YAAY,CAAC,cAAc,WAAW,WAAW,EACpD;AAEF,MAAI,cAAc,IAAI,SAAS,CAC7B,OAAM,IAAI,MACR,wDAAwD,SAAS,GAClE;AAEH,gBAAc,IAAI,SAAS;AAC3B,UAAQ,KAAK;GACX;GACA,YAAY,QAAQ,WAAW;GAC/B;GACD,CAAC;;AAEJ,QAAO;;AAGT,SAAgB,+BAA+B,QAItC;CACP,MAAM,UAAU,OAAO,WAAW,kCAAkC;AACpE,KAAI,QAAQ,WAAW,EACrB;CAGF,MAAM,mCAAmB,IAAI,KAAa;CAC1C,IAAI,aAAmD;CACvD,IAAI,gBAAgB;CACpB,IAAI,gBAAgB;CAEpB,MAAM,cAAc,YAA2B;AAC7C,MAAI,eAAe;AACjB,mBAAgB;AAChB;;EAEF,MAAM,YAAY,CAAC,GAAG,iBAAiB;AACvC,mBAAiB,OAAO;AACxB,MAAI,UAAU,WAAW,EACvB;AAGF,kBAAgB;AAChB,MAAI;AACF,WAAQ,IAAI,8BAA8B,UAAU,KAAK,KAAK,GAAG;AACjE,SAAM,OAAO,cAAc,UAAU;AACrC,WAAQ,IAAI,oCAAoC,UAAU,KAAK,KAAK,GAAG;WAChE,OAAO;AACd,WAAQ,MACN,mCAAmC,iBAAiB,QAAQ,MAAM,UAAU,OAAO,MAAM,GAC1F;YACO;AACR,mBAAgB;AAChB,OAAI,iBAAiB,iBAAiB,OAAO,GAAG;AAC9C,oBAAgB;AAChB,UAAM,aAAa;;;;CAKzB,MAAM,kBAAkB,aAA2B;AACjD,mBAAiB,IAAI,SAAS;AAC9B,MAAI,WACF,cAAa,WAAW;AAE1B,eAAa,iBAAiB;AAC5B,gBAAa;AACR,gBAAa;KACjB,IAAI;;CAGT,MAAM,UAAU,SAAS,MACvB,QAAQ,SAAS,UAAU,MAAM,WAAW,EAC5C;EACE,eAAe;EACf,kBAAkB;GAAE,oBAAoB;GAAK,cAAc;GAAI;EAChE,CACF;AACD,QAAO,gBAAgB,SAAS,QAAQ;AACxC,SAAQ,GAAG,QAAQ,QAAQ,gBAAgB;EACzC,MAAM,wBAAwB,QAAQ,YAAY;AAClD,OAAK,MAAM,UAAU,QACnB,KACE,OAAO,WAAW,MAAM,cACtB,0BAA0B,aAC1B,sBAAsB,WAAW,GAAG,YAAY,MAAM,CACvD,CAED,gBAAe,OAAO,SAAS;GAGnC;AAEF,SAAQ,IACN,oCAAoC,QAAQ,KAAK,UAAU,MAAM,SAAS,CAAC,KAAK,KAAK,GACtF;;AAGH,SAAgB,wCAAwC,QAMhC;AACtB,QAAO,YAAY;AACjB,QAAM,OAAO,eAAe;AAC5B,UAAQ,IACN,kDAAkD,OAAO,gBAAgB,2BAC1E;AACa,mBAAiB;AAC7B,OAAI,CAAC,OAAO,iBAAiB,CAC3B;AAEF,kCAA+B;IAC7B,iBAAiB,OAAO;IACxB,eAAe,OAAO;IACvB,CAAC;KACD,OAAO,gBAAgB,CACpB,SAAS"}
@@ -1,7 +0,0 @@
1
- import { NextclawGatewayRuntime } from "../../gateway/nextclaw-gateway-runtime.service.js";
2
-
3
- //#region src/shared/services/plugin/utils/plugin-runtime-bridge.utils.d.ts
4
- declare function installPluginRuntimeBridge(gateway: NextclawGatewayRuntime): void;
5
- //#endregion
6
- export { installPluginRuntimeBridge };
7
- //# sourceMappingURL=plugin-runtime-bridge.utils.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"plugin-runtime-bridge.utils.d.ts","names":[],"sources":["../../../../../src/shared/services/plugin/utils/plugin-runtime-bridge.utils.ts"],"mappings":";;;iBAwBgB,0BAAA,CAA2B,OAAA,EAAS,sBAAA"}
@@ -1,97 +0,0 @@
1
- import { loadConfig, saveConfig } from "@nextclaw/core";
2
- import { dispatchPromptOverNcp } from "@nextclaw/kernel";
3
- import { setPluginRuntimeBridge } from "@nextclaw/openclaw-compat";
4
- //#region src/shared/services/plugin/utils/plugin-runtime-bridge.utils.ts
5
- function installPluginRuntimeBridge(gateway) {
6
- setPluginRuntimeBridge({
7
- loadConfig: () => gateway.kernel.extensions.toConfigView(gateway.configManager.loadConfig()),
8
- writeConfigFile: async (nextConfigView) => {
9
- if (!nextConfigView || typeof nextConfigView !== "object" || Array.isArray(nextConfigView)) throw new Error("plugin runtime writeConfigFile expects an object config");
10
- const current = loadConfig();
11
- saveConfig(gateway.kernel.extensions.mergeConfigView(current, nextConfigView));
12
- },
13
- dispatchReplyWithBufferedBlockDispatcher: async ({ ctx, dispatcherOptions }) => {
14
- const request = resolvePluginRuntimeRequest(ctx);
15
- if (!request) return;
16
- try {
17
- await dispatcherOptions.onReplyStart?.();
18
- const response = await dispatchPromptOverNcp({
19
- config: gateway.configManager.loadConfig(),
20
- agentRunRequests: gateway.kernel.agentRunRequestManager,
21
- ...request
22
- });
23
- const replyText = typeof response === "string" ? response : String(response ?? "");
24
- if (replyText.trim()) await dispatcherOptions.deliver({ text: replyText }, { kind: "final" });
25
- } catch (error) {
26
- dispatcherOptions.onError?.(error);
27
- throw error;
28
- }
29
- }
30
- });
31
- }
32
- function resolvePluginRuntimeRequest(ctx) {
33
- const bodyForAgent = typeof ctx.BodyForAgent === "string" ? ctx.BodyForAgent : "";
34
- const body = typeof ctx.Body === "string" ? ctx.Body : "";
35
- const content = (bodyForAgent || body).trim();
36
- const attachments = resolvePluginRuntimeAttachments(ctx);
37
- if (!content && attachments.length === 0) return null;
38
- const sessionKey = typeof ctx.SessionKey === "string" && ctx.SessionKey.trim().length > 0 ? ctx.SessionKey : void 0;
39
- const channel = typeof ctx.OriginatingChannel === "string" && ctx.OriginatingChannel.trim().length > 0 ? ctx.OriginatingChannel : "cli";
40
- const chatId = typeof ctx.OriginatingTo === "string" && ctx.OriginatingTo.trim().length > 0 ? ctx.OriginatingTo : typeof ctx.SenderId === "string" && ctx.SenderId.trim().length > 0 ? ctx.SenderId : "direct";
41
- const agentId = typeof ctx.AgentId === "string" ? ctx.AgentId : void 0;
42
- const modelOverride = resolveModelOverride(ctx);
43
- const accountId = typeof ctx.AccountId === "string" && ctx.AccountId.trim().length > 0 ? ctx.AccountId : void 0;
44
- return {
45
- content,
46
- sessionKey,
47
- channel,
48
- chatId,
49
- agentId,
50
- attachments,
51
- metadata: {
52
- ...accountId ? { account_id: accountId } : {},
53
- ...modelOverride ? { model: modelOverride } : {}
54
- }
55
- };
56
- }
57
- function resolveModelOverride(ctx) {
58
- if (typeof ctx.Model === "string" && ctx.Model.trim().length > 0) return ctx.Model.trim();
59
- if (typeof ctx.AgentModel === "string" && ctx.AgentModel.trim().length > 0) return ctx.AgentModel.trim();
60
- }
61
- function readStringList(value) {
62
- if (!Array.isArray(value)) return [];
63
- return value.map((entry) => typeof entry === "string" ? entry.trim() : "").filter(Boolean);
64
- }
65
- function readOptionalString(value) {
66
- if (typeof value !== "string") return;
67
- return value.trim() || void 0;
68
- }
69
- function resolvePluginRuntimeAttachments(ctx) {
70
- const mediaPaths = readStringList(ctx.MediaPaths);
71
- const mediaUrls = readStringList(ctx.MediaUrls);
72
- const fallbackPath = readOptionalString(ctx.MediaPath);
73
- const fallbackUrl = readOptionalString(ctx.MediaUrl);
74
- const mediaTypes = readStringList(ctx.MediaTypes);
75
- const fallbackType = readOptionalString(ctx.MediaType);
76
- const entryCount = Math.max(mediaPaths.length, mediaUrls.length, fallbackPath ? 1 : 0, fallbackUrl ? 1 : 0);
77
- const attachments = [];
78
- for (let index = 0; index < entryCount; index += 1) {
79
- const path = mediaPaths[index] ?? (index === 0 ? fallbackPath : void 0);
80
- const rawUrl = mediaUrls[index] ?? (index === 0 ? fallbackUrl : void 0);
81
- const url = rawUrl && rawUrl !== path ? rawUrl : void 0;
82
- const mimeType = mediaTypes[index] ?? fallbackType;
83
- if (!path && !url) continue;
84
- attachments.push({
85
- path,
86
- url,
87
- mimeType,
88
- source: "plugin-runtime",
89
- status: path ? "ready" : "remote-only"
90
- });
91
- }
92
- return attachments;
93
- }
94
- //#endregion
95
- export { installPluginRuntimeBridge };
96
-
97
- //# sourceMappingURL=plugin-runtime-bridge.utils.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"plugin-runtime-bridge.utils.js","names":[],"sources":["../../../../../src/shared/services/plugin/utils/plugin-runtime-bridge.utils.ts"],"sourcesContent":["import { loadConfig, saveConfig, type InboundAttachment } from \"@nextclaw/core\";\nimport { setPluginRuntimeBridge } from \"@nextclaw/openclaw-compat\";\nimport { dispatchPromptOverNcp } from \"@nextclaw/kernel\";\nimport type { NextclawGatewayRuntime } from \"@nextclaw-service/shared/services/gateway/nextclaw-gateway-runtime.service.js\";\n\ntype PluginRuntimeDispatchContext = {\n BodyForAgent?: unknown;\n Body?: unknown;\n SessionKey?: unknown;\n OriginatingChannel?: unknown;\n OriginatingTo?: unknown;\n SenderId?: unknown;\n AccountId?: unknown;\n AgentId?: unknown;\n Model?: unknown;\n AgentModel?: unknown;\n MediaPath?: unknown;\n MediaPaths?: unknown;\n MediaUrl?: unknown;\n MediaUrls?: unknown;\n MediaType?: unknown;\n MediaTypes?: unknown;\n};\n\nexport function installPluginRuntimeBridge(gateway: NextclawGatewayRuntime): void {\n setPluginRuntimeBridge({\n loadConfig: () =>\n gateway.kernel.extensions.toConfigView(gateway.configManager.loadConfig()),\n writeConfigFile: async (nextConfigView) => {\n if (!nextConfigView || typeof nextConfigView !== \"object\" || Array.isArray(nextConfigView)) {\n throw new Error(\"plugin runtime writeConfigFile expects an object config\");\n }\n const current = loadConfig();\n const next = gateway.kernel.extensions.mergeConfigView(current, nextConfigView);\n saveConfig(next);\n },\n dispatchReplyWithBufferedBlockDispatcher: async ({ ctx, dispatcherOptions }) => {\n const request = resolvePluginRuntimeRequest(ctx as PluginRuntimeDispatchContext);\n if (!request) {\n return;\n }\n\n try {\n await dispatcherOptions.onReplyStart?.();\n const response = await dispatchPromptOverNcp({\n config: gateway.configManager.loadConfig(),\n agentRunRequests: gateway.kernel.agentRunRequestManager,\n ...request,\n });\n const replyText = typeof response === \"string\" ? response : String(response ?? \"\");\n if (replyText.trim()) {\n await dispatcherOptions.deliver({ text: replyText }, { kind: \"final\" });\n }\n } catch (error) {\n dispatcherOptions.onError?.(error);\n throw error;\n }\n }\n });\n}\n\nfunction resolvePluginRuntimeRequest(ctx: PluginRuntimeDispatchContext) {\n const bodyForAgent = typeof ctx.BodyForAgent === \"string\" ? ctx.BodyForAgent : \"\";\n const body = typeof ctx.Body === \"string\" ? ctx.Body : \"\";\n const content = (bodyForAgent || body).trim();\n const attachments = resolvePluginRuntimeAttachments(ctx);\n if (!content && attachments.length === 0) {\n return null;\n }\n\n const sessionKey = typeof ctx.SessionKey === \"string\" && ctx.SessionKey.trim().length > 0 ? ctx.SessionKey : undefined;\n const channel =\n typeof ctx.OriginatingChannel === \"string\" && ctx.OriginatingChannel.trim().length > 0\n ? ctx.OriginatingChannel\n : \"cli\";\n const chatId =\n typeof ctx.OriginatingTo === \"string\" && ctx.OriginatingTo.trim().length > 0\n ? ctx.OriginatingTo\n : typeof ctx.SenderId === \"string\" && ctx.SenderId.trim().length > 0\n ? ctx.SenderId\n : \"direct\";\n const agentId = typeof ctx.AgentId === \"string\" ? ctx.AgentId : undefined;\n const modelOverride = resolveModelOverride(ctx);\n const accountId = typeof ctx.AccountId === \"string\" && ctx.AccountId.trim().length > 0 ? ctx.AccountId : undefined;\n\n return {\n content,\n sessionKey,\n channel,\n chatId,\n agentId,\n attachments,\n metadata: {\n ...(accountId ? { account_id: accountId } : {}),\n ...(modelOverride ? { model: modelOverride } : {})\n }\n };\n}\n\nfunction resolveModelOverride(ctx: PluginRuntimeDispatchContext): string | undefined {\n if (typeof ctx.Model === \"string\" && ctx.Model.trim().length > 0) {\n return ctx.Model.trim();\n }\n if (typeof ctx.AgentModel === \"string\" && ctx.AgentModel.trim().length > 0) {\n return ctx.AgentModel.trim();\n }\n return undefined;\n}\n\nfunction readStringList(value: unknown): string[] {\n if (!Array.isArray(value)) {\n return [];\n }\n return value\n .map((entry) => (typeof entry === \"string\" ? entry.trim() : \"\"))\n .filter(Boolean);\n}\n\nfunction readOptionalString(value: unknown): string | undefined {\n if (typeof value !== \"string\") {\n return undefined;\n }\n const trimmed = value.trim();\n return trimmed || undefined;\n}\n\nfunction resolvePluginRuntimeAttachments(ctx: PluginRuntimeDispatchContext): InboundAttachment[] {\n const mediaPaths = readStringList(ctx.MediaPaths);\n const mediaUrls = readStringList(ctx.MediaUrls);\n const fallbackPath = readOptionalString(ctx.MediaPath);\n const fallbackUrl = readOptionalString(ctx.MediaUrl);\n const mediaTypes = readStringList(ctx.MediaTypes);\n const fallbackType = readOptionalString(ctx.MediaType);\n const entryCount = Math.max(\n mediaPaths.length,\n mediaUrls.length,\n fallbackPath ? 1 : 0,\n fallbackUrl ? 1 : 0,\n );\n\n const attachments: InboundAttachment[] = [];\n for (let index = 0; index < entryCount; index += 1) {\n const path = mediaPaths[index] ?? (index === 0 ? fallbackPath : undefined);\n const rawUrl = mediaUrls[index] ?? (index === 0 ? fallbackUrl : undefined);\n const url = rawUrl && rawUrl !== path ? rawUrl : undefined;\n const mimeType = mediaTypes[index] ?? fallbackType;\n if (!path && !url) {\n continue;\n }\n attachments.push({\n path,\n url,\n mimeType,\n source: \"plugin-runtime\",\n status: path ? \"ready\" : \"remote-only\",\n });\n }\n\n return attachments;\n}\n"],"mappings":"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"}