plugin-agent-orchestrator 1.0.13 → 1.0.14

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 (251) hide show
  1. package/README.md +16 -291
  2. package/dist/client/AIEmployeesContext.d.ts +7 -0
  3. package/dist/client/OrchestratorSettings.d.ts +2 -1
  4. package/dist/client/index.js +1 -1
  5. package/dist/client/plugin.d.ts +1 -0
  6. package/dist/client/skill-hub/components/ExecutionHistory.d.ts +2 -0
  7. package/dist/client/skill-hub/components/ExecutionProgress.d.ts +20 -0
  8. package/dist/client/skill-hub/components/GitSkillImport.d.ts +7 -0
  9. package/dist/client/skill-hub/components/SkillEditor.d.ts +7 -0
  10. package/dist/client/skill-hub/components/SkillManager.d.ts +2 -0
  11. package/dist/client/skill-hub/components/SkillMetrics.d.ts +2 -0
  12. package/dist/client/skill-hub/components/SkillTestPanel.d.ts +7 -0
  13. package/dist/client/skill-hub/index.d.ts +10 -0
  14. package/dist/client/skill-hub/locale.d.ts +3 -0
  15. package/dist/client/skill-hub/tools/InteractionSchemasProvider.d.ts +19 -0
  16. package/dist/client/skill-hub/tools/SkillHubCard.d.ts +3 -0
  17. package/dist/client/skill-hub/utils/jsonFields.d.ts +3 -0
  18. package/dist/externalVersion.js +6 -6
  19. package/dist/node_modules/adm-zip/LICENSE +21 -0
  20. package/dist/node_modules/adm-zip/adm-zip.js +1 -0
  21. package/dist/node_modules/adm-zip/headers/entryHeader.js +377 -0
  22. package/dist/node_modules/adm-zip/headers/index.js +2 -0
  23. package/dist/node_modules/adm-zip/headers/mainHeader.js +130 -0
  24. package/dist/node_modules/adm-zip/methods/deflater.js +33 -0
  25. package/dist/node_modules/adm-zip/methods/index.js +3 -0
  26. package/dist/node_modules/adm-zip/methods/inflater.js +34 -0
  27. package/dist/node_modules/adm-zip/methods/zipcrypto.js +175 -0
  28. package/dist/node_modules/adm-zip/package.json +1 -0
  29. package/dist/node_modules/adm-zip/util/constants.js +142 -0
  30. package/dist/node_modules/adm-zip/util/decoder.js +5 -0
  31. package/dist/node_modules/adm-zip/util/errors.js +63 -0
  32. package/dist/node_modules/adm-zip/util/fattr.js +76 -0
  33. package/dist/node_modules/adm-zip/util/index.js +5 -0
  34. package/dist/node_modules/adm-zip/util/utils.js +339 -0
  35. package/dist/node_modules/adm-zip/zipEntry.js +405 -0
  36. package/dist/node_modules/adm-zip/zipFile.js +446 -0
  37. package/dist/node_modules/simple-git/dist/cjs/index.js +7399 -0
  38. package/dist/node_modules/simple-git/dist/esm/index.js +4745 -0
  39. package/dist/node_modules/simple-git/dist/esm/package.json +3 -0
  40. package/dist/node_modules/simple-git/dist/src/lib/api.d.ts +13 -0
  41. package/dist/node_modules/simple-git/dist/src/lib/args/log-format.d.ts +9 -0
  42. package/dist/node_modules/simple-git/dist/src/lib/errors/git-construct-error.d.ts +15 -0
  43. package/dist/node_modules/simple-git/dist/src/lib/errors/git-error.d.ts +30 -0
  44. package/dist/node_modules/simple-git/dist/src/lib/errors/git-plugin-error.d.ts +7 -0
  45. package/dist/node_modules/simple-git/dist/src/lib/errors/git-response-error.d.ts +32 -0
  46. package/dist/node_modules/simple-git/dist/src/lib/errors/task-configuration-error.d.ts +12 -0
  47. package/dist/node_modules/simple-git/dist/src/lib/git-factory.d.ts +15 -0
  48. package/dist/node_modules/simple-git/dist/src/lib/git-logger.d.ts +21 -0
  49. package/dist/node_modules/simple-git/dist/src/lib/parsers/parse-branch-delete.d.ts +5 -0
  50. package/dist/node_modules/simple-git/dist/src/lib/parsers/parse-branch.d.ts +2 -0
  51. package/dist/node_modules/simple-git/dist/src/lib/parsers/parse-commit.d.ts +2 -0
  52. package/dist/node_modules/simple-git/dist/src/lib/parsers/parse-diff-summary.d.ts +3 -0
  53. package/dist/node_modules/simple-git/dist/src/lib/parsers/parse-fetch.d.ts +2 -0
  54. package/dist/node_modules/simple-git/dist/src/lib/parsers/parse-list-log-summary.d.ts +6 -0
  55. package/dist/node_modules/simple-git/dist/src/lib/parsers/parse-merge.d.ts +11 -0
  56. package/dist/node_modules/simple-git/dist/src/lib/parsers/parse-move.d.ts +2 -0
  57. package/dist/node_modules/simple-git/dist/src/lib/parsers/parse-pull.d.ts +6 -0
  58. package/dist/node_modules/simple-git/dist/src/lib/parsers/parse-push.d.ts +4 -0
  59. package/dist/node_modules/simple-git/dist/src/lib/parsers/parse-remote-messages.d.ts +5 -0
  60. package/dist/node_modules/simple-git/dist/src/lib/parsers/parse-remote-objects.d.ts +3 -0
  61. package/dist/node_modules/simple-git/dist/src/lib/plugins/abort-plugin.d.ts +3 -0
  62. package/dist/node_modules/simple-git/dist/src/lib/plugins/block-unsafe-operations-plugin.d.ts +3 -0
  63. package/dist/node_modules/simple-git/dist/src/lib/plugins/command-config-prefixing-plugin.d.ts +2 -0
  64. package/dist/node_modules/simple-git/dist/src/lib/plugins/completion-detection.plugin.d.ts +3 -0
  65. package/dist/node_modules/simple-git/dist/src/lib/plugins/custom-binary.plugin.d.ts +3 -0
  66. package/dist/node_modules/simple-git/dist/src/lib/plugins/error-detection.plugin.d.ts +7 -0
  67. package/dist/node_modules/simple-git/dist/src/lib/plugins/index.d.ts +11 -0
  68. package/dist/node_modules/simple-git/dist/src/lib/plugins/plugin-store.d.ts +11 -0
  69. package/dist/node_modules/simple-git/dist/src/lib/plugins/progress-monitor-plugin.d.ts +3 -0
  70. package/dist/node_modules/simple-git/dist/src/lib/plugins/simple-git-plugin.d.ts +48 -0
  71. package/dist/node_modules/simple-git/dist/src/lib/plugins/spawn-options-plugin.d.ts +3 -0
  72. package/dist/node_modules/simple-git/dist/src/lib/plugins/suffix-paths.plugin.d.ts +2 -0
  73. package/dist/node_modules/simple-git/dist/src/lib/plugins/timout-plugin.d.ts +3 -0
  74. package/dist/node_modules/simple-git/dist/src/lib/responses/BranchDeleteSummary.d.ts +12 -0
  75. package/dist/node_modules/simple-git/dist/src/lib/responses/BranchSummary.d.ts +14 -0
  76. package/dist/node_modules/simple-git/dist/src/lib/responses/CheckIgnore.d.ts +4 -0
  77. package/dist/node_modules/simple-git/dist/src/lib/responses/CleanSummary.d.ts +9 -0
  78. package/dist/node_modules/simple-git/dist/src/lib/responses/ConfigList.d.ts +13 -0
  79. package/dist/node_modules/simple-git/dist/src/lib/responses/DiffSummary.d.ts +10 -0
  80. package/dist/node_modules/simple-git/dist/src/lib/responses/FileStatusSummary.d.ts +9 -0
  81. package/dist/node_modules/simple-git/dist/src/lib/responses/GetRemoteSummary.d.ts +11 -0
  82. package/dist/node_modules/simple-git/dist/src/lib/responses/InitSummary.d.ts +9 -0
  83. package/dist/node_modules/simple-git/dist/src/lib/responses/MergeSummary.d.ts +16 -0
  84. package/dist/node_modules/simple-git/dist/src/lib/responses/PullSummary.d.ts +25 -0
  85. package/dist/node_modules/simple-git/dist/src/lib/responses/StatusSummary.d.ts +19 -0
  86. package/dist/node_modules/simple-git/dist/src/lib/responses/TagList.d.ts +7 -0
  87. package/dist/node_modules/simple-git/dist/src/lib/runners/git-executor-chain.d.ts +25 -0
  88. package/dist/node_modules/simple-git/dist/src/lib/runners/git-executor.d.ts +14 -0
  89. package/dist/node_modules/simple-git/dist/src/lib/runners/promise-wrapped.d.ts +2 -0
  90. package/dist/node_modules/simple-git/dist/src/lib/runners/scheduler.d.ts +11 -0
  91. package/dist/node_modules/simple-git/dist/src/lib/runners/tasks-pending-queue.d.ts +23 -0
  92. package/dist/node_modules/simple-git/dist/src/lib/simple-git-api.d.ts +20 -0
  93. package/dist/node_modules/simple-git/dist/src/lib/task-callback.d.ts +2 -0
  94. package/dist/node_modules/simple-git/dist/src/lib/tasks/apply-patch.d.ts +3 -0
  95. package/dist/node_modules/simple-git/dist/src/lib/tasks/branch.d.ts +7 -0
  96. package/dist/node_modules/simple-git/dist/src/lib/tasks/change-working-directory.d.ts +2 -0
  97. package/dist/node_modules/simple-git/dist/src/lib/tasks/check-ignore.d.ts +2 -0
  98. package/dist/node_modules/simple-git/dist/src/lib/tasks/check-is-repo.d.ts +9 -0
  99. package/dist/node_modules/simple-git/dist/src/lib/tasks/checkout.d.ts +2 -0
  100. package/dist/node_modules/simple-git/dist/src/lib/tasks/clean.d.ts +25 -0
  101. package/dist/node_modules/simple-git/dist/src/lib/tasks/clone.d.ts +9 -0
  102. package/dist/node_modules/simple-git/dist/src/lib/tasks/commit.d.ts +4 -0
  103. package/dist/node_modules/simple-git/dist/src/lib/tasks/config.d.ts +8 -0
  104. package/dist/node_modules/simple-git/dist/src/lib/tasks/count-objects.d.ts +12 -0
  105. package/dist/node_modules/simple-git/dist/src/lib/tasks/diff-name-status.d.ts +12 -0
  106. package/dist/node_modules/simple-git/dist/src/lib/tasks/diff.d.ts +5 -0
  107. package/dist/node_modules/simple-git/dist/src/lib/tasks/fetch.d.ts +4 -0
  108. package/dist/node_modules/simple-git/dist/src/lib/tasks/first-commit.d.ts +2 -0
  109. package/dist/node_modules/simple-git/dist/src/lib/tasks/grep.d.ts +12 -0
  110. package/dist/node_modules/simple-git/dist/src/lib/tasks/hash-object.d.ts +5 -0
  111. package/dist/node_modules/simple-git/dist/src/lib/tasks/init.d.ts +3 -0
  112. package/dist/node_modules/simple-git/dist/src/lib/tasks/log.d.ts +32 -0
  113. package/dist/node_modules/simple-git/dist/src/lib/tasks/merge.d.ts +4 -0
  114. package/dist/node_modules/simple-git/dist/src/lib/tasks/move.d.ts +3 -0
  115. package/dist/node_modules/simple-git/dist/src/lib/tasks/pull.d.ts +3 -0
  116. package/dist/node_modules/simple-git/dist/src/lib/tasks/push.d.ts +9 -0
  117. package/dist/node_modules/simple-git/dist/src/lib/tasks/remote.d.ts +8 -0
  118. package/dist/node_modules/simple-git/dist/src/lib/tasks/reset.d.ts +11 -0
  119. package/dist/node_modules/simple-git/dist/src/lib/tasks/show.d.ts +2 -0
  120. package/dist/node_modules/simple-git/dist/src/lib/tasks/stash-list.d.ts +4 -0
  121. package/dist/node_modules/simple-git/dist/src/lib/tasks/status.d.ts +3 -0
  122. package/dist/node_modules/simple-git/dist/src/lib/tasks/sub-module.d.ts +5 -0
  123. package/dist/node_modules/simple-git/dist/src/lib/tasks/tag.d.ts +18 -0
  124. package/dist/node_modules/simple-git/dist/src/lib/tasks/task.d.ts +14 -0
  125. package/dist/node_modules/simple-git/dist/src/lib/tasks/version.d.ts +9 -0
  126. package/dist/node_modules/simple-git/dist/src/lib/types/handlers.d.ts +21 -0
  127. package/dist/node_modules/simple-git/dist/src/lib/types/index.d.ts +136 -0
  128. package/dist/node_modules/simple-git/dist/src/lib/types/tasks.d.ts +19 -0
  129. package/dist/node_modules/simple-git/dist/src/lib/utils/argument-filters.d.ts +14 -0
  130. package/dist/node_modules/simple-git/dist/src/lib/utils/exit-codes.d.ts +10 -0
  131. package/dist/node_modules/simple-git/dist/src/lib/utils/git-output-streams.d.ts +7 -0
  132. package/dist/node_modules/simple-git/dist/src/lib/utils/index.d.ts +8 -0
  133. package/dist/node_modules/simple-git/dist/src/lib/utils/line-parser.d.ts +15 -0
  134. package/dist/node_modules/simple-git/dist/src/lib/utils/simple-git-options.d.ts +2 -0
  135. package/dist/node_modules/simple-git/dist/src/lib/utils/task-options.d.ts +13 -0
  136. package/dist/node_modules/simple-git/dist/src/lib/utils/task-parser.d.ts +5 -0
  137. package/dist/node_modules/simple-git/dist/src/lib/utils/util.d.ts +47 -0
  138. package/dist/node_modules/simple-git/dist/typings/errors.d.ts +5 -0
  139. package/dist/node_modules/simple-git/dist/typings/index.d.ts +14 -0
  140. package/dist/node_modules/simple-git/dist/typings/response.d.ts +556 -0
  141. package/dist/node_modules/simple-git/dist/typings/simple-git.d.ts +1033 -0
  142. package/dist/node_modules/simple-git/dist/typings/types.d.ts +22 -0
  143. package/dist/node_modules/simple-git/node_modules/debug/package.json +64 -0
  144. package/dist/node_modules/simple-git/node_modules/debug/src/browser.js +272 -0
  145. package/dist/node_modules/simple-git/node_modules/debug/src/common.js +292 -0
  146. package/dist/node_modules/simple-git/node_modules/debug/src/index.js +10 -0
  147. package/dist/node_modules/simple-git/node_modules/debug/src/node.js +263 -0
  148. package/dist/node_modules/simple-git/package.json +1 -0
  149. package/dist/node_modules/simple-git/promise.js +17 -0
  150. package/dist/server/collections/agent-execution-spans.d.ts +9 -0
  151. package/dist/server/collections/agent-execution-spans.js +152 -0
  152. package/dist/server/collections/orchestrator-config.js +6 -0
  153. package/dist/server/collections/skill-definitions.d.ts +3 -0
  154. package/dist/server/collections/skill-definitions.js +158 -0
  155. package/dist/server/collections/skill-executions.d.ts +3 -0
  156. package/dist/server/collections/skill-executions.js +123 -0
  157. package/dist/server/collections/skill-worker-configs.d.ts +3 -0
  158. package/dist/server/collections/skill-worker-configs.js +115 -0
  159. package/dist/server/migrations/20260423000000-add-progress-fields.d.ts +4 -0
  160. package/dist/server/migrations/20260423000000-add-progress-fields.js +69 -0
  161. package/dist/server/migrations/20260425000000-add-interaction-schema.d.ts +4 -0
  162. package/dist/server/migrations/20260425000000-add-interaction-schema.js +61 -0
  163. package/dist/server/migrations/20260427000000-change-packages-to-text.d.ts +4 -0
  164. package/dist/server/migrations/20260427000000-change-packages-to-text.js +70 -0
  165. package/dist/server/migrations/20260427000001-change-other-json-to-text.d.ts +4 -0
  166. package/dist/server/migrations/20260427000001-change-other-json-to-text.js +80 -0
  167. package/dist/server/migrations/20260429000000-add-llm-fields.js +8 -0
  168. package/dist/server/migrations/20260429000000-fix-inputargs-json-to-text.d.ts +16 -0
  169. package/dist/server/migrations/20260429000000-fix-inputargs-json-to-text.js +51 -0
  170. package/dist/server/migrations/20260503000000-add-orchestrator-trace-fields.d.ts +7 -0
  171. package/dist/server/migrations/20260503000000-add-orchestrator-trace-fields.js +57 -0
  172. package/dist/server/plugin.d.ts +3 -0
  173. package/dist/server/plugin.js +37 -1
  174. package/dist/server/resources/tracing.js +154 -11
  175. package/dist/server/services/CodeValidator.d.ts +32 -0
  176. package/dist/server/services/CodeValidator.js +205 -0
  177. package/dist/server/services/ExecutionSpanService.d.ts +44 -0
  178. package/dist/server/services/ExecutionSpanService.js +104 -0
  179. package/dist/server/services/FileManager.d.ts +28 -0
  180. package/dist/server/services/FileManager.js +151 -0
  181. package/dist/server/services/SandboxRunner.d.ts +41 -0
  182. package/dist/server/services/SandboxRunner.js +167 -0
  183. package/dist/server/services/SkillManager.d.ts +6 -0
  184. package/dist/server/services/SkillManager.js +640 -0
  185. package/dist/server/services/SkillRepositoryService.d.ts +22 -0
  186. package/dist/server/services/SkillRepositoryService.js +157 -0
  187. package/dist/server/services/WorkerEnvManager.d.ts +26 -0
  188. package/dist/server/services/WorkerEnvManager.js +120 -0
  189. package/dist/server/skill-hub/actions/git-import.d.ts +21 -0
  190. package/dist/server/skill-hub/actions/git-import.js +413 -0
  191. package/dist/server/skill-hub/mcp/McpController.d.ts +15 -0
  192. package/dist/server/skill-hub/mcp/McpController.js +111 -0
  193. package/dist/server/skill-hub/plugin.d.ts +58 -0
  194. package/dist/server/skill-hub/plugin.js +694 -0
  195. package/dist/server/skill-hub/sandbox-config.json +6 -0
  196. package/dist/server/skill-hub/tasks/SkillExecutionTask.d.ts +14 -0
  197. package/dist/server/skill-hub/tasks/SkillExecutionTask.js +267 -0
  198. package/dist/server/skill-hub/utils/json-fields.d.ts +7 -0
  199. package/dist/server/skill-hub/utils/json-fields.js +88 -0
  200. package/dist/server/tools/delegate-task.d.ts +4 -0
  201. package/dist/server/tools/delegate-task.js +606 -104
  202. package/dist/server/tools/skill-execute.d.ts +36 -0
  203. package/dist/server/tools/skill-execute.js +167 -0
  204. package/package.json +3 -1
  205. package/src/client/AIEmployeeSelect.tsx +1 -3
  206. package/src/client/AIEmployeesContext.tsx +28 -13
  207. package/src/client/OrchestratorSettings.tsx +43 -5
  208. package/src/client/RulesTab.tsx +253 -32
  209. package/src/client/TracingTab.tsx +277 -213
  210. package/src/client/plugin.tsx +39 -0
  211. package/src/client/skill-hub/components/ExecutionHistory.tsx +201 -0
  212. package/src/client/skill-hub/components/ExecutionProgress.tsx +55 -0
  213. package/src/client/skill-hub/components/GitSkillImport.tsx +555 -0
  214. package/src/client/skill-hub/components/SkillEditor.tsx +456 -0
  215. package/src/client/skill-hub/components/SkillManager.tsx +181 -0
  216. package/src/client/skill-hub/components/SkillMetrics.tsx +124 -0
  217. package/src/client/skill-hub/components/SkillTestPanel.tsx +144 -0
  218. package/src/client/skill-hub/index.tsx +75 -0
  219. package/src/client/skill-hub/locale.ts +16 -0
  220. package/src/client/skill-hub/tools/InteractionSchemasProvider.tsx +59 -0
  221. package/src/client/skill-hub/tools/SkillHubCard.tsx +78 -0
  222. package/src/client/skill-hub/utils/jsonFields.ts +37 -0
  223. package/src/server/collections/agent-execution-spans.ts +129 -0
  224. package/src/server/collections/orchestrator-config.ts +7 -0
  225. package/src/server/collections/skill-definitions.ts +128 -0
  226. package/src/server/collections/skill-executions.ts +94 -0
  227. package/src/server/collections/skill-worker-configs.ts +86 -0
  228. package/src/server/migrations/20260423000000-add-progress-fields.ts +50 -0
  229. package/src/server/migrations/20260425000000-add-interaction-schema.ts +35 -0
  230. package/src/server/migrations/20260427000000-change-packages-to-text.ts +47 -0
  231. package/src/server/migrations/20260427000001-change-other-json-to-text.ts +57 -0
  232. package/src/server/migrations/20260429000000-add-llm-fields.ts +9 -0
  233. package/src/server/migrations/20260429000000-fix-inputargs-json-to-text.ts +38 -0
  234. package/src/server/migrations/20260503000000-add-orchestrator-trace-fields.ts +32 -0
  235. package/src/server/plugin.ts +51 -3
  236. package/src/server/resources/tracing.ts +182 -15
  237. package/src/server/services/CodeValidator.ts +159 -0
  238. package/src/server/services/ExecutionSpanService.ts +106 -0
  239. package/src/server/services/FileManager.ts +144 -0
  240. package/src/server/services/SandboxRunner.ts +205 -0
  241. package/src/server/services/SkillManager.ts +623 -0
  242. package/src/server/services/SkillRepositoryService.ts +142 -0
  243. package/src/server/services/WorkerEnvManager.ts +113 -0
  244. package/src/server/skill-hub/actions/git-import.ts +486 -0
  245. package/src/server/skill-hub/mcp/McpController.ts +86 -0
  246. package/src/server/skill-hub/plugin.ts +771 -0
  247. package/src/server/skill-hub/sandbox-config.json +6 -0
  248. package/src/server/skill-hub/tasks/SkillExecutionTask.ts +297 -0
  249. package/src/server/skill-hub/utils/json-fields.ts +57 -0
  250. package/src/server/tools/delegate-task.ts +803 -127
  251. package/src/server/tools/skill-execute.ts +157 -0
@@ -0,0 +1,128 @@
1
+ import { CollectionOptions } from '@nocobase/database';
2
+
3
+ export default {
4
+ name: 'skillDefinitions',
5
+ title: 'Skill Definitions',
6
+ fields: [
7
+ {
8
+ name: 'id',
9
+ type: 'bigInt',
10
+ autoIncrement: true,
11
+ primaryKey: true,
12
+ },
13
+ {
14
+ name: 'name',
15
+ type: 'string',
16
+ length: 100,
17
+ unique: true,
18
+ },
19
+ {
20
+ name: 'title',
21
+ type: 'string',
22
+ length: 200,
23
+ },
24
+ {
25
+ name: 'description',
26
+ type: 'text',
27
+ },
28
+ {
29
+ name: 'instructions',
30
+ type: 'text',
31
+ },
32
+ {
33
+ // 'node' | 'python'
34
+ name: 'language',
35
+ type: 'string',
36
+ length: 20,
37
+ },
38
+ {
39
+ // Code template with {{placeholder}} support
40
+ name: 'codeTemplate',
41
+ type: 'text',
42
+ },
43
+ {
44
+ // JSON Schema for input parameters (used by AI tool)
45
+ name: 'inputSchema',
46
+ type: 'text',
47
+ },
48
+ {
49
+ // Optional UI schema for human-in-the-loop interaction.
50
+ // Shape: { type: 'form'|'select'|'confirm', prompt: string,
51
+ // options?: {label,value}[], fields?: Record<string, {type,title,required,enum}> }
52
+ name: 'interactionSchema',
53
+ type: 'text',
54
+ },
55
+ {
56
+ // Pre-installed packages reference (informational)
57
+ name: 'packages',
58
+ type: 'text',
59
+ defaultValue: null,
60
+ },
61
+ {
62
+ name: 'timeoutSeconds',
63
+ type: 'integer',
64
+ defaultValue: 60,
65
+ },
66
+ {
67
+ name: 'maxOutputSizeMb',
68
+ type: 'integer',
69
+ defaultValue: 50,
70
+ },
71
+ {
72
+ name: 'enabled',
73
+ type: 'boolean',
74
+ defaultValue: true,
75
+ },
76
+ {
77
+ // 'CUSTOM' | 'GENERAL' | 'SPECIFIED'
78
+ name: 'toolScope',
79
+ type: 'string',
80
+ length: 20,
81
+ defaultValue: 'CUSTOM',
82
+ },
83
+ {
84
+ name: 'autoCall',
85
+ type: 'boolean',
86
+ defaultValue: false,
87
+ },
88
+ {
89
+ // Which plugin registered this skill. null = built-in / user-created.
90
+ // Format: plugin package name, e.g. 'plugin-skill-pptx-advanced'
91
+ name: 'pluginSource',
92
+ type: 'string',
93
+ length: 200,
94
+ defaultValue: null,
95
+ },
96
+ {
97
+ name: 'storageType',
98
+ type: 'string',
99
+ length: 20,
100
+ defaultValue: 'database', // 'database', 'local', 's3', 'plugin'
101
+ },
102
+ {
103
+ name: 'storageUrl',
104
+ type: 'string',
105
+ length: 1000,
106
+ },
107
+ {
108
+ name: 'file',
109
+ type: 'belongsTo',
110
+ target: 'attachments',
111
+ foreignKey: 'fileId',
112
+ },
113
+ {
114
+ name: 'createdAt',
115
+ type: 'date',
116
+ },
117
+ {
118
+ name: 'updatedAt',
119
+ type: 'date',
120
+ },
121
+ {
122
+ name: 'createdBy',
123
+ type: 'belongsTo',
124
+ target: 'users',
125
+ foreignKey: 'createdById',
126
+ },
127
+ ],
128
+ } as CollectionOptions;
@@ -0,0 +1,94 @@
1
+ import { CollectionOptions } from '@nocobase/database';
2
+
3
+ export default {
4
+ name: 'skillExecutions',
5
+ title: 'Skill Executions',
6
+ fields: [
7
+ {
8
+ name: 'id',
9
+ type: 'bigInt',
10
+ autoIncrement: true,
11
+ primaryKey: true,
12
+ },
13
+ {
14
+ name: 'skill',
15
+ type: 'belongsTo',
16
+ target: 'skillDefinitions',
17
+ foreignKey: 'skillId',
18
+ },
19
+ {
20
+ // 'pending' | 'running' | 'succeeded' | 'failed' | 'canceled' | 'timeout'
21
+ name: 'status',
22
+ type: 'string',
23
+ length: 20,
24
+ defaultValue: 'pending',
25
+ },
26
+ {
27
+ name: 'inputArgs',
28
+ type: 'text',
29
+ },
30
+ {
31
+ // Final code after template rendering
32
+ name: 'executedCode',
33
+ type: 'text',
34
+ },
35
+ {
36
+ name: 'stdout',
37
+ type: 'text',
38
+ },
39
+ {
40
+ name: 'stderr',
41
+ type: 'text',
42
+ },
43
+ {
44
+ // [{ name, size, mimeType }]
45
+ name: 'outputFiles',
46
+ type: 'text',
47
+ defaultValue: null,
48
+ },
49
+ {
50
+ name: 'durationMs',
51
+ type: 'integer',
52
+ },
53
+ {
54
+ name: 'sessionId',
55
+ type: 'string',
56
+ length: 100,
57
+ allowNull: true,
58
+ },
59
+ {
60
+ name: 'orchestratorRootRunId',
61
+ type: 'string',
62
+ length: 100,
63
+ allowNull: true,
64
+ },
65
+ {
66
+ name: 'orchestratorSpanId',
67
+ type: 'string',
68
+ length: 100,
69
+ allowNull: true,
70
+ },
71
+ {
72
+ name: 'orchestratorParentSpanId',
73
+ type: 'string',
74
+ length: 100,
75
+ allowNull: true,
76
+ },
77
+ {
78
+ name: 'orchestratorToolCallId',
79
+ type: 'string',
80
+ length: 100,
81
+ allowNull: true,
82
+ },
83
+ {
84
+ name: 'triggeredBy',
85
+ type: 'belongsTo',
86
+ target: 'users',
87
+ foreignKey: 'triggeredById',
88
+ },
89
+ {
90
+ name: 'createdAt',
91
+ type: 'date',
92
+ },
93
+ ],
94
+ } as CollectionOptions;
@@ -0,0 +1,86 @@
1
+ import { CollectionOptions } from '@nocobase/database';
2
+
3
+ export default {
4
+ name: 'skillWorkerConfigs',
5
+ title: 'Skill Worker Configs',
6
+ fields: [
7
+ {
8
+ name: 'id',
9
+ type: 'bigInt',
10
+ autoIncrement: true,
11
+ primaryKey: true,
12
+ },
13
+ {
14
+ name: 'retentionHours',
15
+ type: 'integer',
16
+ defaultValue: 24,
17
+ },
18
+ {
19
+ name: 'packageWhitelist',
20
+ type: 'text',
21
+ defaultValue: null,
22
+ },
23
+ {
24
+ name: 'customPackages',
25
+ type: 'text',
26
+ defaultValue: null,
27
+ },
28
+ {
29
+ name: 'npmRegistryUrl',
30
+ type: 'string',
31
+ length: 500,
32
+ },
33
+ {
34
+ name: 'npmAuthToken',
35
+ type: 'string',
36
+ length: 1000,
37
+ },
38
+ {
39
+ name: 'pypiIndexUrl',
40
+ type: 'string',
41
+ length: 500,
42
+ },
43
+ {
44
+ name: 'pypiTrustedHost',
45
+ type: 'string',
46
+ length: 255,
47
+ },
48
+ {
49
+ name: 'aptMirrorUrl',
50
+ type: 'string',
51
+ length: 500,
52
+ },
53
+ {
54
+ name: 'aptGpgKeyUrl',
55
+ type: 'string',
56
+ length: 500,
57
+ },
58
+ {
59
+ name: 'initStatus',
60
+ type: 'string',
61
+ length: 20,
62
+ defaultValue: 'idle',
63
+ },
64
+ {
65
+ name: 'lastInitLog',
66
+ type: 'text',
67
+ },
68
+ {
69
+ name: 'initProgressPercent',
70
+ type: 'integer',
71
+ defaultValue: 0,
72
+ },
73
+ {
74
+ name: 'initProgressLog',
75
+ type: 'text',
76
+ },
77
+ {
78
+ name: 'createdAt',
79
+ type: 'date',
80
+ },
81
+ {
82
+ name: 'updatedAt',
83
+ type: 'date',
84
+ },
85
+ ],
86
+ } as CollectionOptions;
@@ -0,0 +1,50 @@
1
+ import { Migration } from '@nocobase/server';
2
+
3
+ export default class AddProgressFieldsMigration extends Migration {
4
+ async up() {
5
+ const queryInterface = this.db.sequelize.getQueryInterface();
6
+ const tablePrefix = this.db.options.tablePrefix || '';
7
+ const tableName = `${tablePrefix}skillWorkerConfigs`;
8
+
9
+ try {
10
+ const tableExists = await queryInterface.tableExists(tableName);
11
+ if (!tableExists) return;
12
+
13
+ const tableDesc = await queryInterface.describeTable(tableName);
14
+
15
+ // Force NocoBase fields metadata to recognize the physical columns exists
16
+ // so it won't crash trying to ADD COLUMN during db.sync()
17
+ const fieldRepo = this.db.getRepository('fields');
18
+ const collectionName = 'skillWorkerConfigs';
19
+
20
+ const fieldsToSync = [
21
+ { name: 'initProgressPercent', type: 'integer', defaultValue: 0 },
22
+ { name: 'initProgressLog', type: 'text' }
23
+ ];
24
+
25
+ for (const f of fieldsToSync) {
26
+ const fieldMeta = await fieldRepo.findOne({
27
+ filter: { name: f.name, collectionName },
28
+ });
29
+
30
+ if (!fieldMeta && tableDesc[f.name]) {
31
+ // The physical column exists, but NocoBase metadata is missing it!
32
+ // Let's create the metadata right now BEFORE NocoBase's collection.sync()
33
+ // runs and crashes on addColumn.
34
+ await fieldRepo.create({
35
+ values: {
36
+ name: f.name,
37
+ type: f.type,
38
+ collectionName,
39
+ // Avoid trying to physically add it because it already exists
40
+ interface: f.type,
41
+ }
42
+ });
43
+ this.app.logger.info(`[skill-hub] Restored NocoBase metadata for preexisting column ${f.name}`);
44
+ }
45
+ }
46
+ } catch (error) {
47
+ this.app.logger.error(`[skill-hub] Failed to check progress fields: ${error.message}`);
48
+ }
49
+ }
50
+ }
@@ -0,0 +1,35 @@
1
+ import { Migration } from '@nocobase/server';
2
+
3
+ export default class AddInteractionSchemaMigration extends Migration {
4
+ async up() {
5
+ const queryInterface = this.db.sequelize.getQueryInterface();
6
+ const tableName = `${this.db.options.tablePrefix || ''}skillDefinitions`;
7
+
8
+ try {
9
+ const tableExists = await queryInterface.tableExists(tableName);
10
+ if (!tableExists) return;
11
+
12
+ const tableDesc = await queryInterface.describeTable(tableName);
13
+ const fieldRepo = this.db.getRepository('fields');
14
+ const collectionName = 'skillDefinitions';
15
+
16
+ const fieldMeta = await fieldRepo.findOne({
17
+ filter: { name: 'interactionSchema', collectionName },
18
+ });
19
+
20
+ if (!fieldMeta && tableDesc.interactionSchema) {
21
+ await fieldRepo.create({
22
+ values: {
23
+ name: 'interactionSchema',
24
+ type: 'text',
25
+ collectionName,
26
+ interface: 'textarea',
27
+ },
28
+ });
29
+ this.app.logger.info('[skill-hub] Restored NocoBase metadata for preexisting column interactionSchema');
30
+ }
31
+ } catch (error) {
32
+ this.app.logger.error(`[skill-hub] Failed to check interactionSchema field: ${error.message}`);
33
+ }
34
+ }
35
+ }
@@ -0,0 +1,47 @@
1
+ import { Migration } from '@nocobase/server';
2
+
3
+ export default class ChangePackagesToTextMigration extends Migration {
4
+ async up() {
5
+ const queryInterface = this.db.sequelize.getQueryInterface();
6
+ const tableName = `${this.db.options.tablePrefix || ''}skillDefinitions`;
7
+
8
+ try {
9
+ const tableExists = await queryInterface.tableExists(tableName);
10
+ if (!tableExists) return;
11
+
12
+ const tableDesc = await queryInterface.describeTable(tableName);
13
+ const columnsToChange = ['packages', 'inputSchema', 'interactionSchema'];
14
+ const fieldRepo = this.db.getRepository('fields');
15
+ const collectionName = 'skillDefinitions';
16
+
17
+ for (const col of columnsToChange) {
18
+ if (tableDesc[col]) {
19
+ // Change physical column type in Postgres if needed
20
+ const dialect = this.db.sequelize.getDialect();
21
+ if (dialect === 'postgres') {
22
+ await this.db.sequelize.query(`ALTER TABLE "${tableName}" ALTER COLUMN "${col}" TYPE text USING "${col}"::text;`);
23
+ } else {
24
+ await queryInterface.changeColumn(tableName, col, {
25
+ type: 'TEXT',
26
+ });
27
+ }
28
+
29
+ // Also update NocoBase metadata
30
+ const fieldMeta = await fieldRepo.findOne({
31
+ filter: { name: col, collectionName },
32
+ });
33
+
34
+ if (fieldMeta) {
35
+ await fieldRepo.update({
36
+ filterByTk: fieldMeta.get('id'),
37
+ values: { type: 'text' },
38
+ });
39
+ }
40
+ this.app.logger.info(`[skill-hub] Changed ${col} column type to text to support markdown`);
41
+ }
42
+ }
43
+ } catch (error) {
44
+ this.app.logger.error(`[skill-hub] Failed to change packages field type: ${error.message}`);
45
+ }
46
+ }
47
+ }
@@ -0,0 +1,57 @@
1
+ import { Migration } from '@nocobase/server';
2
+
3
+ export default class ChangeOtherJsonToTextMigration extends Migration {
4
+ async up() {
5
+ const queryInterface = this.db.sequelize.getQueryInterface();
6
+ const dialect = this.db.sequelize.getDialect();
7
+ const fieldRepo = this.db.getRepository('fields');
8
+
9
+ const tablePrefix = this.db.options.tablePrefix || '';
10
+
11
+ // 1. skillWorkerConfigs
12
+ const workerTableName = `${tablePrefix}skillWorkerConfigs`;
13
+ try {
14
+ if (await queryInterface.tableExists(workerTableName)) {
15
+ const tableDesc = await queryInterface.describeTable(workerTableName);
16
+ const columns = ['packageWhitelist', 'customPackages'];
17
+
18
+ for (const col of columns) {
19
+ if (tableDesc[col]) {
20
+ if (dialect === 'postgres') {
21
+ await this.db.sequelize.query(`ALTER TABLE "${workerTableName}" ALTER COLUMN "${col}" TYPE text USING "${col}"::text;`);
22
+ } else {
23
+ await queryInterface.changeColumn(workerTableName, col, { type: 'TEXT' });
24
+ }
25
+ const fieldMeta = await fieldRepo.findOne({ filter: { name: col, collectionName: 'skillWorkerConfigs' } });
26
+ if (fieldMeta) await fieldRepo.update({ filterByTk: fieldMeta.get('id'), values: { type: 'text' } });
27
+ this.app.logger.info(`[skill-hub] Changed ${col} in skillWorkerConfigs to text`);
28
+ }
29
+ }
30
+ }
31
+ } catch (e) {
32
+ this.app.logger.warn(`[skill-hub] Failed to migrate skillWorkerConfigs: ${e.message}`);
33
+ }
34
+
35
+ // 2. skillExecutions
36
+ const execTableName = `${tablePrefix}skillExecutions`;
37
+ try {
38
+ if (await queryInterface.tableExists(execTableName)) {
39
+ const tableDesc = await queryInterface.describeTable(execTableName);
40
+ const col = 'outputFiles';
41
+
42
+ if (tableDesc[col]) {
43
+ if (dialect === 'postgres') {
44
+ await this.db.sequelize.query(`ALTER TABLE "${execTableName}" ALTER COLUMN "${col}" TYPE text USING "${col}"::text;`);
45
+ } else {
46
+ await queryInterface.changeColumn(execTableName, col, { type: 'TEXT' });
47
+ }
48
+ const fieldMeta = await fieldRepo.findOne({ filter: { name: col, collectionName: 'skillExecutions' } });
49
+ if (fieldMeta) await fieldRepo.update({ filterByTk: fieldMeta.get('id'), values: { type: 'text' } });
50
+ this.app.logger.info(`[skill-hub] Changed ${col} in skillExecutions to text`);
51
+ }
52
+ }
53
+ } catch (e) {
54
+ this.app.logger.warn(`[skill-hub] Failed to migrate skillExecutions: ${e.message}`);
55
+ }
56
+ }
57
+ }
@@ -29,6 +29,15 @@ export default class AddLlmFieldsToOrchestratorConfig extends Migration {
29
29
  });
30
30
  console.log(`[AgentOrchestrator] Added model column to ${tableName}`);
31
31
  }
32
+
33
+ if (!tableDesc['recursionLimit']) {
34
+ await queryInterface.addColumn(tableName, 'recursionLimit', {
35
+ type: 'INTEGER',
36
+ allowNull: true,
37
+ defaultValue: 50,
38
+ });
39
+ console.log(`[AgentOrchestrator] Added recursionLimit column to ${tableName}`);
40
+ }
32
41
  }
33
42
 
34
43
  async down() {
@@ -0,0 +1,38 @@
1
+ import { Migration } from '@nocobase/server';
2
+
3
+ /**
4
+ * Fix: inputArgs column in skillExecutions was json type but should be text.
5
+ *
6
+ * Root cause: The column was created as `json` from an older schema version,
7
+ * but the collection defines it as `text`. The `stringifyJsonText()` utility
8
+ * wraps values in markdown code fences (```json\n...\n```) which PostgreSQL
9
+ * rejects as invalid JSON syntax, causing SequelizeDatabaseError on every
10
+ * skill execution attempt.
11
+ */
12
+ export default class FixInputArgsJsonToText extends Migration {
13
+ on = 'afterLoad';
14
+ appVersion = '>=0.1.0';
15
+
16
+ async up() {
17
+ const queryInterface = this.db.sequelize.getQueryInterface();
18
+
19
+ // Check current column type
20
+ const tableDesc = await queryInterface.describeTable('skillExecutions').catch(() => null);
21
+ if (!tableDesc) return;
22
+
23
+ const col = tableDesc['inputArgs'];
24
+ if (!col) return;
25
+
26
+ // Only migrate if still json type
27
+ if (col.type && col.type.toLowerCase().includes('json')) {
28
+ await this.db.sequelize.query(
29
+ `ALTER TABLE "skillExecutions" ALTER COLUMN "inputArgs" TYPE text USING "inputArgs"::text`,
30
+ );
31
+ console.log('[skill-hub] Migration: converted skillExecutions.inputArgs from json to text');
32
+ }
33
+ }
34
+
35
+ async down() {
36
+ // No rollback — keeping as text is safe; json is more restrictive
37
+ }
38
+ }
@@ -0,0 +1,32 @@
1
+ import { Migration } from '@nocobase/server';
2
+
3
+ export default class AddOrchestratorTraceFieldsToSkillExecutions extends Migration {
4
+ on = 'afterLoad';
5
+ appVersion = '>=0.1.0';
6
+
7
+ async up() {
8
+ const queryInterface = this.db.sequelize.getQueryInterface();
9
+ const tablePrefix = this.db.options.tablePrefix || '';
10
+ const tableName = `${tablePrefix}skillExecutions`;
11
+ const tableExists = await queryInterface.tableExists(tableName).catch(() => false);
12
+ if (!tableExists) return;
13
+
14
+ const tableDesc = await queryInterface.describeTable(tableName);
15
+ const addIfMissing = async (name: string) => {
16
+ if (tableDesc[name]) return;
17
+ await queryInterface.addColumn(tableName, name, {
18
+ type: 'VARCHAR(100)',
19
+ allowNull: true,
20
+ });
21
+ };
22
+
23
+ await addIfMissing('orchestratorRootRunId');
24
+ await addIfMissing('orchestratorSpanId');
25
+ await addIfMissing('orchestratorParentSpanId');
26
+ await addIfMissing('orchestratorToolCallId');
27
+ }
28
+
29
+ async down() {
30
+ // No rollback: keeping nullable trace-link columns is safe.
31
+ }
32
+ }
@@ -2,20 +2,33 @@ import { Plugin } from '@nocobase/server';
2
2
  import path from 'path';
3
3
  import { createDelegateToolsProvider } from './tools/delegate-task';
4
4
  import { registerTracingResource } from './resources/tracing';
5
+ import SkillHubSubFeature from './skill-hub/plugin';
5
6
 
6
7
  export class PluginAgentOrchestratorServer extends Plugin {
7
- async afterAdd() {}
8
+ skillHub: SkillHubSubFeature;
9
+
10
+ async afterAdd() {
11
+ this.skillHub = new SkillHubSubFeature(this);
12
+ }
8
13
 
9
14
  async beforeLoad() {
10
15
  // Import collection definitions
11
16
  this.db.import({ directory: path.resolve(__dirname, 'collections') });
17
+
18
+ this.db.addMigrations({
19
+ namespace: this.name,
20
+ directory: path.resolve(__dirname, 'migrations'),
21
+ context: { plugin: this },
22
+ });
12
23
  }
13
24
 
14
25
  async load() {
26
+ await this.skillHub.load();
27
+
15
28
  // --- ACL ---
16
29
  this.app.acl.registerSnippet({
17
30
  name: `pm.${this.name}`,
18
- actions: ['orchestratorConfig:*'],
31
+ actions: ['orchestratorConfig:*', 'orchestratorTracing:*', 'agentExecutionSpans:*', 'skillDefinitions:*', 'skillExecutions:*', 'skillHub:*', 'skillWorkerConfigs:*'],
19
32
  });
20
33
 
21
34
  // --- Register Dynamic Tools ---
@@ -29,18 +42,53 @@ export class PluginAgentOrchestratorServer extends Plugin {
29
42
  // Custom read-only resource for the Swarm Tracing admin page.
30
43
  registerTracingResource(this);
31
44
 
45
+ // --- Log Retention ---
46
+ // Daily prune of orchestratorLogs / agentExecutionSpans to keep tables bounded.
47
+ // Override window via env: ORCHESTRATOR_LOG_RETENTION_DAYS (default 30).
48
+ this.app.cronJobManager.addJob({
49
+ cronTime: '0 30 2 * * *',
50
+ onTick: async () => {
51
+ try {
52
+ const days = Number(process.env.ORCHESTRATOR_LOG_RETENTION_DAYS || 30);
53
+ if (!Number.isFinite(days) || days <= 0) return;
54
+ const cutoff = new Date(Date.now() - days * 86400000);
55
+ const repo = this.db.getRepository('orchestratorLogs');
56
+ const spansRepo = this.db.getRepository('agentExecutionSpans');
57
+ const deletedLogs = repo
58
+ ? await repo.destroy({
59
+ filter: { createdAt: { $lt: cutoff.toISOString() } },
60
+ })
61
+ : 0;
62
+ const deletedSpans = spansRepo
63
+ ? await spansRepo.destroy({
64
+ filter: { createdAt: { $lt: cutoff.toISOString() } },
65
+ })
66
+ : 0;
67
+ this.app.log.info(
68
+ `[AgentOrchestrator] Pruned ${deletedLogs} orchestratorLogs and ${deletedSpans} agentExecutionSpans rows older than ${days} day(s).`,
69
+ );
70
+ } catch (e) {
71
+ this.app.log.error('[AgentOrchestrator] Log retention job failed', e);
72
+ }
73
+ },
74
+ });
75
+
32
76
  // NOTE: The createReactAgent approach does NOT create aiConversation records,
33
77
  // so there is no need for a middleware to hide "headless" conversations.
34
78
  // If future versions need conversation logging, add it here.
35
79
  }
36
80
 
37
81
  async install() {
38
- // No seed data needed on first install
82
+ await this.skillHub.install();
39
83
  }
40
84
 
41
85
  async afterEnable() {}
42
86
  async afterDisable() {}
43
87
  async remove() {}
88
+
89
+ async beforeStop() {
90
+ await this.skillHub.beforeStop();
91
+ }
44
92
  }
45
93
 
46
94
  export default PluginAgentOrchestratorServer;