@capybara-hq/kernel 0.1.0-rc.5 → 0.1.0-rc.7

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 (362) hide show
  1. package/bootstrap.json +27 -3
  2. package/dist/admin/admin.controller.d.ts +21 -74
  3. package/dist/admin/admin.controller.js +50 -50
  4. package/dist/admin/admin.schemas.d.ts +57 -0
  5. package/dist/admin/admin.schemas.js +50 -0
  6. package/dist/admin/extensions.controller.d.ts +10 -0
  7. package/dist/admin/extensions.controller.js +18 -0
  8. package/dist/admin/extensions.schemas.d.ts +7 -0
  9. package/dist/admin/extensions.schemas.js +10 -0
  10. package/dist/admin/limit-defaults.d.ts +20 -0
  11. package/dist/admin/limit-defaults.js +10 -0
  12. package/dist/agents/agent-profile.service.d.ts +7 -5
  13. package/dist/agents/agent-profile.service.js +14 -9
  14. package/dist/agents/agents.controller.d.ts +7 -287
  15. package/dist/agents/agents.controller.js +7 -67
  16. package/dist/agents/agents.schemas.d.ts +389 -0
  17. package/dist/agents/agents.schemas.js +126 -0
  18. package/dist/agents/agents.service.d.ts +16 -6
  19. package/dist/agents/agents.service.js +75 -19
  20. package/dist/agents/definition.d.ts +47 -19
  21. package/dist/agents/definition.js +119 -38
  22. package/dist/agents/from-template.d.ts +2 -2
  23. package/dist/agents/from-template.js +76 -45
  24. package/dist/agents/from-template.service.d.ts +12 -0
  25. package/dist/agents/from-template.service.js +23 -6
  26. package/dist/agents/models.controller.d.ts +33 -5
  27. package/dist/agents/models.controller.js +50 -6
  28. package/dist/agents/org-templates.d.ts +13 -3
  29. package/dist/agents/org-templates.js +69 -28
  30. package/dist/agents/pending-connector-requests.d.ts +2 -0
  31. package/dist/agents/pending-connector-requests.js +1 -1
  32. package/dist/agents/pending-connectors.controller.d.ts +1 -1
  33. package/dist/agents/pending-connectors.controller.js +2 -2
  34. package/dist/agents/pending-connectors.service.d.ts +2 -2
  35. package/dist/agents/pending-connectors.service.js +19 -19
  36. package/dist/agents/profile.d.ts +18 -0
  37. package/dist/agents/profile.js +5 -1
  38. package/dist/agents/readiness.controller.d.ts +5 -5
  39. package/dist/agents/readiness.controller.js +6 -6
  40. package/dist/agents/templates.controller.d.ts +8 -17
  41. package/dist/agents/templates.controller.js +13 -31
  42. package/dist/agents/templates.schemas.d.ts +20 -0
  43. package/dist/agents/templates.schemas.js +45 -0
  44. package/dist/background/background.controller.js +3 -2
  45. package/dist/background/background.schemas.d.ts +10 -0
  46. package/dist/background/background.schemas.js +16 -0
  47. package/dist/background/tasks.service.d.ts +1 -1
  48. package/dist/background/tasks.service.js +7 -2
  49. package/dist/catalog/admin-catalog.controller.d.ts +4 -57
  50. package/dist/catalog/admin-catalog.controller.js +8 -45
  51. package/dist/catalog/admin-catalog.schemas.d.ts +72 -0
  52. package/dist/catalog/admin-catalog.schemas.js +92 -0
  53. package/dist/catalog/catalog-content.d.ts +12 -2
  54. package/dist/catalog/catalog-scope.service.js +8 -2
  55. package/dist/catalog/catalog.service.d.ts +2 -0
  56. package/dist/catalog/catalog.service.js +3 -0
  57. package/dist/catalog/component-scope.controller.d.ts +3 -65
  58. package/dist/catalog/component-scope.controller.js +3 -56
  59. package/dist/catalog/component-scope.schemas.d.ts +114 -0
  60. package/dist/catalog/component-scope.schemas.js +97 -0
  61. package/dist/catalog/component-scope.service.d.ts +28 -4
  62. package/dist/catalog/component-scope.service.js +55 -3
  63. package/dist/catalog/component-state.d.ts +9 -2
  64. package/dist/catalog/component-state.js +22 -13
  65. package/dist/catalog/marketplaces.controller.d.ts +5 -35
  66. package/dist/catalog/marketplaces.controller.js +6 -34
  67. package/dist/catalog/marketplaces.schemas.d.ts +48 -0
  68. package/dist/catalog/marketplaces.schemas.js +53 -0
  69. package/dist/catalog/marketplaces.service.d.ts +15 -1
  70. package/dist/catalog/marketplaces.service.js +22 -1
  71. package/dist/catalog/org-catalog.controller.d.ts +6 -62
  72. package/dist/catalog/org-catalog.controller.js +12 -66
  73. package/dist/catalog/org-catalog.schemas.d.ts +79 -0
  74. package/dist/catalog/org-catalog.schemas.js +82 -0
  75. package/dist/catalog/org-catalog.service.d.ts +9 -2
  76. package/dist/catalog/org-catalog.service.js +38 -5
  77. package/dist/catalog/org-extension.controller.d.ts +1 -12
  78. package/dist/catalog/org-extension.controller.js +1 -10
  79. package/dist/catalog/org-extension.schemas.d.ts +15 -0
  80. package/dist/catalog/org-extension.schemas.js +22 -0
  81. package/dist/catalog/org-plugin-uploads.controller.d.ts +2 -19
  82. package/dist/catalog/org-plugin-uploads.controller.js +15 -28
  83. package/dist/catalog/org-plugin-uploads.schemas.d.ts +20 -0
  84. package/dist/catalog/org-plugin-uploads.schemas.js +32 -0
  85. package/dist/catalog/owned-items.d.ts +6 -2
  86. package/dist/catalog/owned-items.js +16 -4
  87. package/dist/catalog/platform-components.d.ts +2 -0
  88. package/dist/catalog/platform-components.js +2 -0
  89. package/dist/catalog/plugin-import.js +1 -0
  90. package/dist/catalog/plugin-install.js +1 -1
  91. package/dist/catalog/requests.service.d.ts +2 -1
  92. package/dist/catalog/requests.service.js +6 -2
  93. package/dist/channels/channels.schemas.d.ts +33 -0
  94. package/dist/channels/channels.schemas.js +34 -0
  95. package/dist/channels/connections.controller.d.ts +2 -29
  96. package/dist/channels/connections.controller.js +1 -23
  97. package/dist/channels/connections.service.d.ts +8 -2
  98. package/dist/channels/connections.service.js +23 -5
  99. package/dist/channels/inbound.js +4 -0
  100. package/dist/config/schema.d.ts +4 -0
  101. package/dist/config/schema.js +24 -0
  102. package/dist/conversations/conversations.controller.d.ts +16 -37
  103. package/dist/conversations/conversations.controller.js +16 -56
  104. package/dist/conversations/conversations.schemas.d.ts +52 -0
  105. package/dist/conversations/conversations.schemas.js +79 -0
  106. package/dist/conversations/conversations.service.d.ts +13 -4
  107. package/dist/conversations/conversations.service.js +32 -26
  108. package/dist/conversations/events.d.ts +80 -6
  109. package/dist/conversations/events.js +60 -5
  110. package/dist/conversations/message-context.d.ts +28 -0
  111. package/dist/conversations/message-context.js +56 -0
  112. package/dist/conversations/queue.d.ts +2 -1
  113. package/dist/conversations/queue.js +11 -2
  114. package/dist/ctx/create-ctx.d.ts +15 -1
  115. package/dist/ctx/create-ctx.js +23 -2
  116. package/dist/db/kernel-schema.d.ts +44 -0
  117. package/dist/environments/environments.schemas.d.ts +3 -0
  118. package/dist/environments/environments.schemas.js +14 -0
  119. package/dist/environments/environments.service.d.ts +16 -4
  120. package/dist/environments/environments.service.js +58 -13
  121. package/dist/errors.d.ts +6 -0
  122. package/dist/errors.js +6 -0
  123. package/dist/evals/evals.schemas.d.ts +110 -0
  124. package/dist/evals/evals.schemas.js +107 -0
  125. package/dist/evals/reconstruct.js +18 -11
  126. package/dist/evals/recorded-tools.d.ts +2 -1
  127. package/dist/evals/recorded-tools.js +11 -3
  128. package/dist/evals/run-replay.d.ts +8 -1
  129. package/dist/evals/run-replay.js +17 -2
  130. package/dist/evals/runs.controller.d.ts +2 -57
  131. package/dist/evals/runs.controller.js +1 -42
  132. package/dist/evals/runs.service.d.ts +8 -7
  133. package/dist/evals/runs.service.js +45 -30
  134. package/dist/evals/sets.controller.d.ts +2 -28
  135. package/dist/evals/sets.controller.js +1 -31
  136. package/dist/evals/sets.service.d.ts +7 -7
  137. package/dist/evals/sets.service.js +23 -17
  138. package/dist/evals/snapshot.d.ts +3 -2
  139. package/dist/evals/snapshot.js +17 -4
  140. package/dist/evals/step-replay.d.ts +2 -1
  141. package/dist/evals/step-replay.js +3 -2
  142. package/dist/extensions/admin-ops.d.ts +5 -3
  143. package/dist/extensions/admin-ops.js +17 -12
  144. package/dist/extensions/config-hash.d.ts +10 -0
  145. package/dist/extensions/config-hash.js +38 -0
  146. package/dist/extensions/deployment-config.d.ts +16 -1
  147. package/dist/extensions/deployment-config.js +83 -0
  148. package/dist/extensions/extensions.module.js +9 -12
  149. package/dist/extensions/host.d.ts +39 -12
  150. package/dist/extensions/host.js +129 -51
  151. package/dist/extensions/installs.d.ts +5 -0
  152. package/dist/extensions/installs.js +12 -0
  153. package/dist/extensions/org-config.d.ts +17 -2
  154. package/dist/extensions/org-config.js +23 -4
  155. package/dist/extensions/point-defaults.controller.d.ts +2 -8
  156. package/dist/extensions/point-defaults.controller.js +1 -3
  157. package/dist/extensions/point-defaults.d.ts +3 -1
  158. package/dist/extensions/point-defaults.js +4 -2
  159. package/dist/extensions/point-defaults.schemas.d.ts +9 -0
  160. package/dist/extensions/point-defaults.schemas.js +14 -0
  161. package/dist/extensions/state.module.d.ts +9 -0
  162. package/dist/extensions/state.module.js +38 -0
  163. package/dist/extensions/unavailable.d.ts +49 -0
  164. package/dist/extensions/unavailable.js +113 -0
  165. package/dist/files/previewers.controller.js +2 -3
  166. package/dist/files/previewers.d.ts +1 -1
  167. package/dist/files/previewers.js +4 -4
  168. package/dist/files/previewers.schemas.d.ts +10 -0
  169. package/dist/files/previewers.schemas.js +9 -0
  170. package/dist/http/api.module.js +4 -0
  171. package/dist/http/plugin-dispatch.d.ts +4 -1
  172. package/dist/http/plugin-dispatch.js +14 -2
  173. package/dist/identity/accounts.d.ts +43 -4
  174. package/dist/identity/accounts.js +74 -6
  175. package/dist/identity/auth.guard.js +10 -1
  176. package/dist/identity/cookies.d.ts +6 -0
  177. package/dist/identity/cookies.js +14 -0
  178. package/dist/identity/identity.module.js +3 -0
  179. package/dist/identity/initial-passwords.controller.d.ts +22 -0
  180. package/dist/identity/initial-passwords.controller.js +49 -0
  181. package/dist/identity/initial-passwords.d.ts +61 -0
  182. package/dist/identity/initial-passwords.job.d.ts +16 -0
  183. package/dist/identity/initial-passwords.job.js +46 -0
  184. package/dist/identity/initial-passwords.js +159 -0
  185. package/dist/identity/me.controller.d.ts +14 -0
  186. package/dist/identity/me.controller.js +39 -1
  187. package/dist/identity/principal.d.ts +8 -0
  188. package/dist/identity/principal.js +8 -0
  189. package/dist/identity/settings.d.ts +3 -1
  190. package/dist/identity/settings.js +6 -4
  191. package/dist/inbox/inbox.schemas.d.ts +8 -0
  192. package/dist/inbox/inbox.schemas.js +11 -0
  193. package/dist/inbox/platform-inbox.controller.d.ts +1 -1
  194. package/dist/inbox/platform-inbox.controller.js +2 -2
  195. package/dist/index.d.ts +4 -0
  196. package/dist/index.js +6 -0
  197. package/dist/infra/config/kernel-config.service.js +3 -0
  198. package/dist/infra/events/kernel-events.d.ts +8 -0
  199. package/dist/lifecycle/kernel-lifecycle.js +4 -0
  200. package/dist/models/embeddings.d.ts +82 -0
  201. package/dist/models/embeddings.js +326 -0
  202. package/dist/models/enablement.controller.d.ts +40 -0
  203. package/dist/models/enablement.controller.js +74 -0
  204. package/dist/models/enablement.d.ts +101 -0
  205. package/dist/models/enablement.js +264 -0
  206. package/dist/models/models.module.d.ts +5 -1
  207. package/dist/models/models.module.js +16 -4
  208. package/dist/models/org-models.schemas.d.ts +8 -0
  209. package/dist/models/org-models.schemas.js +22 -0
  210. package/dist/models/prices.d.ts +3 -1
  211. package/dist/models/prices.js +7 -5
  212. package/dist/models/purposes.d.ts +30 -6
  213. package/dist/models/purposes.js +68 -17
  214. package/dist/orgs/orgs.controller.d.ts +2 -5
  215. package/dist/orgs/orgs.controller.js +3 -6
  216. package/dist/orgs/orgs.schemas.d.ts +8 -0
  217. package/dist/orgs/orgs.schemas.js +16 -0
  218. package/dist/orgs/orgs.service.d.ts +3 -1
  219. package/dist/orgs/orgs.service.js +6 -4
  220. package/dist/orgs/settings.service.d.ts +9 -1
  221. package/dist/orgs/settings.service.js +20 -5
  222. package/dist/overrides.d.ts +4 -0
  223. package/dist/overrides.js +2 -0
  224. package/dist/platform/errors.d.ts +21 -4
  225. package/dist/platform/errors.js +45 -6
  226. package/dist/platform/exclusions.d.ts +2 -3
  227. package/dist/platform/exclusions.js +68 -831
  228. package/dist/platform/method.js +1 -1
  229. package/dist/platform/operation.d.ts +82 -5
  230. package/dist/platform/operation.js +62 -7
  231. package/dist/platform/ops/accounts.ops.d.ts +32 -0
  232. package/dist/platform/ops/accounts.ops.js +291 -0
  233. package/dist/platform/ops/admin.ops.d.ts +36 -0
  234. package/dist/platform/ops/admin.ops.js +389 -0
  235. package/dist/platform/ops/agent-skills.ops.d.ts +24 -0
  236. package/dist/platform/ops/agent-skills.ops.js +226 -0
  237. package/dist/platform/ops/agent-templates.ops.d.ts +4 -1
  238. package/dist/platform/ops/agent-templates.ops.js +194 -14
  239. package/dist/platform/ops/agents.ops.d.ts +19 -1
  240. package/dist/platform/ops/agents.ops.js +481 -58
  241. package/dist/platform/ops/approvals.ops.d.ts +30 -0
  242. package/dist/platform/ops/approvals.ops.js +116 -0
  243. package/dist/platform/ops/background.ops.d.ts +14 -0
  244. package/dist/platform/ops/background.ops.js +134 -0
  245. package/dist/platform/ops/catalog-admin.ops.d.ts +74 -0
  246. package/dist/platform/ops/catalog-admin.ops.js +587 -0
  247. package/dist/platform/ops/channels.ops.d.ts +16 -0
  248. package/dist/platform/ops/channels.ops.js +195 -0
  249. package/dist/platform/ops/components.ops.d.ts +46 -0
  250. package/dist/platform/ops/components.ops.js +853 -0
  251. package/dist/platform/ops/connectors.ops.d.ts +4 -2
  252. package/dist/platform/ops/connectors.ops.js +68 -6
  253. package/dist/platform/ops/conversations.ops.d.ts +30 -0
  254. package/dist/platform/ops/conversations.ops.js +470 -0
  255. package/dist/platform/ops/environments.ops.d.ts +26 -0
  256. package/dist/platform/ops/environments.ops.js +289 -0
  257. package/dist/platform/ops/errors.d.ts +10 -5
  258. package/dist/platform/ops/errors.js +19 -11
  259. package/dist/platform/ops/evals.ops.d.ts +28 -0
  260. package/dist/platform/ops/evals.ops.js +783 -0
  261. package/dist/platform/ops/extensions-admin.ops.d.ts +25 -0
  262. package/dist/platform/ops/extensions-admin.ops.js +344 -0
  263. package/dist/platform/ops/extensions.ops.d.ts +7 -1
  264. package/dist/platform/ops/extensions.ops.js +248 -17
  265. package/dist/platform/ops/inbox.ops.d.ts +25 -0
  266. package/dist/platform/ops/inbox.ops.js +378 -0
  267. package/dist/platform/ops/marketplaces.ops.d.ts +7 -1
  268. package/dist/platform/ops/marketplaces.ops.js +326 -17
  269. package/dist/platform/ops/models.ops.d.ts +25 -0
  270. package/dist/platform/ops/models.ops.js +232 -0
  271. package/dist/platform/ops/org-plugins.ops.d.ts +29 -0
  272. package/dist/platform/ops/org-plugins.ops.js +329 -0
  273. package/dist/platform/ops/org-settings.ops.d.ts +16 -0
  274. package/dist/platform/ops/org-settings.ops.js +102 -0
  275. package/dist/platform/ops/orgs.ops.d.ts +28 -0
  276. package/dist/platform/ops/orgs.ops.js +295 -0
  277. package/dist/platform/ops/other-orgs.d.ts +20 -0
  278. package/dist/platform/ops/other-orgs.js +72 -0
  279. package/dist/platform/ops/platform.ops.d.ts +4 -4
  280. package/dist/platform/ops/platform.ops.js +23 -24
  281. package/dist/platform/ops/plugins.ops.d.ts +10 -8
  282. package/dist/platform/ops/plugins.ops.js +176 -77
  283. package/dist/platform/ops/previewers.ops.d.ts +14 -0
  284. package/dist/platform/ops/previewers.ops.js +109 -0
  285. package/dist/platform/ops/requests.ops.js +57 -19
  286. package/dist/platform/ops/skills.ops.d.ts +5 -1
  287. package/dist/platform/ops/skills.ops.js +129 -11
  288. package/dist/platform/ops/unavailable.d.ts +23 -0
  289. package/dist/platform/ops/unavailable.js +111 -0
  290. package/dist/platform/parity.d.ts +33 -0
  291. package/dist/platform/parity.js +272 -0
  292. package/dist/platform/platform-ops.module.d.ts +32 -0
  293. package/dist/platform/platform-ops.module.js +78 -11
  294. package/dist/platform/route-schemas.d.ts +18 -0
  295. package/dist/platform/route-schemas.js +60 -0
  296. package/dist/roles/worker.module.js +2 -0
  297. package/dist/runtime/context/build.d.ts +2 -0
  298. package/dist/runtime/context/build.js +28 -2
  299. package/dist/runtime/context/compaction.js +10 -1
  300. package/dist/runtime/context/run-context.d.ts +65 -0
  301. package/dist/runtime/context/run-context.js +215 -0
  302. package/dist/runtime/hook-calls.d.ts +8 -1
  303. package/dist/runtime/hook-calls.js +40 -9
  304. package/dist/runtime/model-call.d.ts +8 -3
  305. package/dist/runtime/model-call.js +30 -6
  306. package/dist/runtime/providers.d.ts +146 -32
  307. package/dist/runtime/providers.js +328 -67
  308. package/dist/runtime/run-context.service.d.ts +65 -0
  309. package/dist/runtime/run-context.service.js +220 -0
  310. package/dist/runtime/run-worker.d.ts +6 -1
  311. package/dist/runtime/run-worker.js +35 -10
  312. package/dist/runtime/runtime.module.js +2 -0
  313. package/dist/runtime/subagents/definition.d.ts +15 -15
  314. package/dist/runtime/subagents/definition.js +49 -118
  315. package/dist/runtime/usage-report-jobs.d.ts +88 -0
  316. package/dist/runtime/usage-report-jobs.js +158 -0
  317. package/dist/runtime/usage-report.d.ts +33 -38
  318. package/dist/runtime/usage-report.js +152 -84
  319. package/dist/skills/changes.controller.js +2 -1
  320. package/dist/skills/changes.service.d.ts +1 -1
  321. package/dist/skills/changes.service.js +4 -4
  322. package/dist/skills/invocable.controller.d.ts +1 -1
  323. package/dist/skills/invocable.controller.js +2 -2
  324. package/dist/skills/invoke.d.ts +2 -2
  325. package/dist/skills/invoke.js +8 -1
  326. package/dist/skills/skills.controller.d.ts +4 -13
  327. package/dist/skills/skills.controller.js +8 -24
  328. package/dist/skills/skills.schemas.d.ts +48 -0
  329. package/dist/skills/skills.schemas.js +61 -0
  330. package/dist/skills/skills.service.d.ts +11 -1
  331. package/dist/skills/skills.service.js +37 -14
  332. package/dist/time-zone.d.ts +5 -0
  333. package/dist/time-zone.js +19 -0
  334. package/dist/tools/approvals.controller.js +2 -3
  335. package/dist/tools/approvals.schemas.d.ts +21 -0
  336. package/dist/tools/approvals.schemas.js +15 -0
  337. package/dist/tools/builtin-names.d.ts +10 -8
  338. package/dist/tools/builtin-names.js +16 -11
  339. package/dist/tools/builtins/builtin-tools.d.ts +3 -1
  340. package/dist/tools/builtins/builtin-tools.js +15 -3
  341. package/dist/tools/builtins/current-time.d.ts +26 -0
  342. package/dist/tools/builtins/current-time.js +99 -0
  343. package/dist/tools/builtins/platform.d.ts +19 -2
  344. package/dist/tools/builtins/platform.js +105 -16
  345. package/dist/tools/connectors.controller.d.ts +1 -2
  346. package/dist/tools/connectors.controller.js +1 -4
  347. package/dist/tools/connectors.schemas.d.ts +12 -0
  348. package/dist/tools/connectors.schemas.js +19 -0
  349. package/dist/tools/connectors.service.d.ts +5 -2
  350. package/dist/tools/connectors.service.js +7 -5
  351. package/dist/tools/org-tool-switches.d.ts +16 -2
  352. package/dist/tools/org-tool-switches.js +26 -9
  353. package/dist/tools/pipeline.js +9 -1
  354. package/dist/tools/registry.d.ts +48 -51
  355. package/dist/tools/registry.js +222 -233
  356. package/package.json +3 -3
  357. package/src/migrations/0089_model_kinds_usage.sql +38 -0
  358. package/src/migrations/0090_initial_passwords.sql +27 -0
  359. package/src/migrations/0091_account_time_zone.sql +4 -0
  360. package/src/migrations/0092_tools_default_on.sql +27 -0
  361. package/dist/platform/redact-orgs.d.ts +0 -7
  362. package/dist/platform/redact-orgs.js +0 -52
@@ -10,9 +10,11 @@ import { KernelConfigService } from "../infra/config/kernel-config.service.js";
10
10
  import { KernelDb } from "../infra/database/kernel-db.js";
11
11
  import { LockService } from "../infra/lock/lock.service.js";
12
12
  import type { KernelLogger } from "../log.js";
13
+ import { ModelEmbeddings } from "../models/embeddings.js";
13
14
  import { EmbedTokens } from "../ui/embed-token.js";
14
15
  import type { UiActionHandler, UiRender } from "../ui/registry.js";
15
16
  import { ExtensionApprovals, type PendingExtension } from "./approvals.js";
17
+ import { deploymentConfigHash } from "./config-hash.js";
16
18
  import { EffectiveConfigs } from "./effective-config.js";
17
19
  import { HookRegistry } from "./hooks.js";
18
20
  import type { InflightTracker } from "./inflight.js";
@@ -21,15 +23,7 @@ import { type ExtensionInstance } from "./instance.js";
21
23
  import { type PermissionSet } from "./permission-set.js";
22
24
  import { type ExtensionPointEntry, ExtensionRegistry } from "./registry.js";
23
25
  import { type ExtensionSource, ReplicaStatusStore } from "./sources.js";
24
- /**
25
- * 插件部署配置(校验后)中非密钥部分的摘要:先把 schema 里所有 secret 叶子(`configFields` 可达路径,
26
- * 加载时 `assertSecretsReachable` 已保证密钥都在这些路径上)换成固定占位值,再取 sha256(键排序 JSON) 前 16 位十六进制。
27
- * 给需要「配置变了就失效」的缓存键用(如模型列表)。密钥不参与摘要:不加盐的短摘要写进 Redis 键名后,
28
- * 低熵密钥可被离线猜测、泄露的密钥可被确认;代价是轮换密钥不会让缓存失效(缓存内容本来就不该依赖密钥)。
29
- * 没有部署配置 schema 时无从得知哪些是密钥,摘要不按配置区分。同一份配置在各副本上得到同一摘要。
30
- * 函数自己按 schema 遮蔽,调用方不必(也不能忘记)先打码。
31
- */
32
- export declare function deploymentConfigHash(schema: core.$ZodType | undefined, config: unknown): string;
26
+ export { deploymentConfigHash };
33
27
  /** One item of {@link ExtensionHost.uiContributions}: a UI contribution from the manifest with its registered view / action (embeds have none). */
34
28
  export interface LoadedUiContribution {
35
29
  plugin: string;
@@ -185,6 +179,11 @@ export declare class ExtensionHost {
185
179
  * 安装记录不在这里:每次 converge 都按 PG 期望状态重新判定。
186
180
  */
187
181
  private readonly pendingActivations;
182
+ /**
183
+ * The load parameters of each config-declared extension that loaded: when its deployment config
184
+ * is cleared and the rest is invalid it goes back to {@link pendingActivations} (pending config).
185
+ */
186
+ private readonly declaredActivations;
188
187
  /** 安装记录准备好的候选(按插件名;sha 变了就作废)。 */
189
188
  private readonly prepared;
190
189
  /** 闸门放行后导入过的安装记录真实清单(按插件名;部署配置 schema 用,含待配置而未加载的)。 */
@@ -255,7 +254,9 @@ export declare class ExtensionHost {
255
254
  * Each hook call's effective config for its organization, and the providers excluded from an
256
255
  * org's point resolution (layering spec A §6).
257
256
  */
258
- effective: Pick<EffectiveConfigs, "get">);
257
+ effective: Pick<EffectiveConfigs, "get">,
258
+ /** `ctx.models`: the embeddings broker (spec B §5.4). */
259
+ models: Pick<ModelEmbeddings, "embed" | "describe">);
259
260
  /** The startup config's `extensionConfig` (file / Nacos merged with env). */
260
261
  private get extensionConfig();
261
262
  /** `extensionPermissions.autoApprove` (development and trials only; see `planApprovals`). */
@@ -520,12 +521,38 @@ export declare class ExtensionHost {
520
521
  /**
521
522
  * 部署配置保存后(`kernel.plugin-deployment-config`)本副本重读并校验(C10;与 unload / reload 串行):
522
523
  * - 插件没在本副本生效 → `not_loaded`(配置声明的刷新后台的合法性判定;待配置的由 reconcile 加载);
523
- * - 不合法 → `invalid`:保持当前值,告警;
524
+ * - 不合法 → `invalid`:保持当前值,告警;但 PG 里已没有保存的配置(超级管理员清空了,`DELETE
525
+ * /api/v1/admin/extensions/:name/config`)、剩下的来源(启动配置、默认值)又不够时 → `unloaded`:卸下实例、
526
+ * 记为待配置(pending / config),依赖方连锁;重新配好后由 reconcile 加载;
524
527
  * - 没变 → `unchanged`;只改了 hot 字段 → `hot`:就地替换,插件经 `ctx.config` 读到新值,不重新 setup;
525
528
  * - 改了非 hot 字段 → `reload`:用新配置重新加载实例(先新后旧,排空在途调用),依赖方连锁;
526
529
  * 重新加载失败旧实例保留(`reload_failed`,记 error)。
527
530
  */
528
- applyDeploymentConfig(plugin: string): Promise<"not_loaded" | "invalid" | "unchanged" | "hot" | "reload" | "reload_failed">;
531
+ applyDeploymentConfig(plugin: string): Promise<"not_loaded" | "invalid" | "unloaded" | "unchanged" | "hot" | "reload" | "reload_failed">;
532
+ /** PG holds no deployment config for the plugin (it was cleared); a read error counts as no. */
533
+ private clearedInPg;
534
+ /**
535
+ * Unloads an extension whose deployment config was cleared and is now missing or invalid (in
536
+ * the host's serial queue): drains it, records pending / config (a config-declared one goes back
537
+ * to {@link pendingActivations}; an install record is decided again on every converge) and
538
+ * cascades to its dependents. It loads again without a restart once it is configured.
539
+ */
540
+ private unloadForMissingConfig;
541
+ /**
542
+ * Records an extension that is not loaded as pending configuration: a config-declared one goes
543
+ * back to {@link pendingActivations} (a later save loads it); an install record is decided again
544
+ * on every converge.
545
+ */
546
+ private markPendingConfig;
547
+ /**
548
+ * Before an extension unloaded for a dependency comes back ({@link cascade}): re-reads its
549
+ * deployment config, which may have been saved or cleared while it was down (applyDeploymentConfig
550
+ * only records validity then), and refreshes its load parameters, so it never returns on a stale
551
+ * config or revoked secrets. Returns false when the config is now missing or invalid and PG holds
552
+ * none: the extension is left pending configuration instead. A read error, or an invalid config
553
+ * that is still stored, keeps the previous config (as for a loaded extension).
554
+ */
555
+ private refreshConfigForRestore;
529
556
  /** 本次未加载、等待批准权限的插件(含因 `requires` 只能由它们满足而未加载的插件),按依赖拓扑序。 */
530
557
  pending(): PendingExtension[];
531
558
  /** 已加载插件的清单(按加载顺序,即依赖拓扑序)。 */
@@ -7,14 +7,13 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
7
7
  var __param = (this && this.__param) || function (paramIndex, decorator) {
8
8
  return function (target, key) { decorator(target, key, paramIndex); }
9
9
  };
10
- import { createHash } from "node:crypto";
11
10
  import { readFile } from "node:fs/promises";
12
11
  import { createRequire } from "node:module";
13
12
  import { dirname, isAbsolute, join, resolve as resolvePath } from "node:path";
14
13
  import { fileURLToPath, pathToFileURL } from "node:url";
15
14
  import { EXTENSION_POINT_CARDINALITY, parseExtensionPoint, SDK_VERSION, } from "@capybara-hq/plugin-sdk";
16
15
  import { Inject, Injectable } from "@nestjs/common";
17
- import { changedPaths, configFields, getPath, secretValues, setPath, unreachableSecrets, } from "../config/fields.js";
16
+ import { changedPaths, configFields, secretValues, unreachableSecrets } from "../config/fields.js";
18
17
  import { pluginSchemaName, queryEnabledPlugins, } from "../ctx/create-ctx.js";
19
18
  import { kernelDb } from "../db/kernel-schema.js";
20
19
  import { migrate } from "../db/migrator.js";
@@ -25,10 +24,12 @@ import { KernelDb } from "../infra/database/kernel-db.js";
25
24
  import { LockService } from "../infra/lock/lock.service.js";
26
25
  import { KERNEL_LOGGER, KEYRING, REDIS, REDIS_SUBSCRIBER } from "../infra/tokens.js";
27
26
  import { KERNEL_APP_OPTIONS } from "../lifecycle/tokens.js";
27
+ import { ModelEmbeddings } from "../models/embeddings.js";
28
28
  import { packagePath } from "../packages/tgz.js";
29
29
  import { EmbedTokens } from "../ui/embed-token.js";
30
30
  import { ExtensionApprovals, planApprovals, readSnapshots, withPreApproved, } from "./approvals.js";
31
31
  import { ExtensionBlobIntegrityError } from "./blobs.js";
32
+ import { deploymentConfigHash } from "./config-hash.js";
32
33
  import { toIssues } from "./config-issues.js";
33
34
  import { configFormSchema, describeConfigUiProblems } from "./config-json-schema.js";
34
35
  import { EffectiveConfigs } from "./effective-config.js";
@@ -42,42 +43,7 @@ import { ExtensionRegistry } from "./registry.js";
42
43
  import { ExtensionResolveError, resolveExtensions } from "./resolve.js";
43
44
  import { ReplicaStatusStore, } from "./sources.js";
44
45
  import { PackageShaMismatchError, packageRootOf } from "./sync.js";
45
- /** 键排序后的 JSON(对象键顺序不影响结果);undefined 字段与 JSON.stringify 一样省略。 */
46
- const canonicalJson = (v) => {
47
- if (Array.isArray(v))
48
- return `[${v.map((x) => (x === undefined ? "null" : canonicalJson(x))).join(",")}]`;
49
- if (v !== null && typeof v === "object") {
50
- const entries = Object.entries(v)
51
- .filter(([, x]) => x !== undefined)
52
- .sort(([a], [b]) => (a < b ? -1 : a > b ? 1 : 0));
53
- return `{${entries.map(([k, x]) => `${JSON.stringify(k)}:${canonicalJson(x)}`).join(",")}}`;
54
- }
55
- return JSON.stringify(v) ?? "null";
56
- };
57
- /** 遮蔽 secret 字段后参与摘要的固定占位值。 */
58
- const SECRET_PLACEHOLDER = "<secret>";
59
- /**
60
- * 插件部署配置(校验后)中非密钥部分的摘要:先把 schema 里所有 secret 叶子(`configFields` 可达路径,
61
- * 加载时 `assertSecretsReachable` 已保证密钥都在这些路径上)换成固定占位值,再取 sha256(键排序 JSON) 前 16 位十六进制。
62
- * 给需要「配置变了就失效」的缓存键用(如模型列表)。密钥不参与摘要:不加盐的短摘要写进 Redis 键名后,
63
- * 低熵密钥可被离线猜测、泄露的密钥可被确认;代价是轮换密钥不会让缓存失效(缓存内容本来就不该依赖密钥)。
64
- * 没有部署配置 schema 时无从得知哪些是密钥,摘要不按配置区分。同一份配置在各副本上得到同一摘要。
65
- * 函数自己按 schema 遮蔽,调用方不必(也不能忘记)先打码。
66
- */
67
- export function deploymentConfigHash(schema, config) {
68
- let redacted = null;
69
- if (schema) {
70
- redacted = structuredClone(config);
71
- if (redacted !== null && typeof redacted === "object") {
72
- for (const f of configFields(schema)) {
73
- if (f.meta?.secret && getPath(redacted, f.path) !== undefined) {
74
- setPath(redacted, f.path, SECRET_PLACEHOLDER);
75
- }
76
- }
77
- }
78
- }
79
- return createHash("sha256").update(canonicalJson(redacted)).digest("hex").slice(0, 16);
80
- }
46
+ export { deploymentConfigHash };
81
47
  const CLOSED_DURING_LOAD = "plugin host closed during load";
82
48
  /** 停机时等进行中的 unload / reload 的上限(之后直接关闭 setup 中的 ctx、撤销其余实例)。 */
83
49
  const CLOSE_LIFECYCLE_WAIT_MS = 2_000;
@@ -345,6 +311,11 @@ let ExtensionHost = class ExtensionHost {
345
311
  * 安装记录不在这里:每次 converge 都按 PG 期望状态重新判定。
346
312
  */
347
313
  pendingActivations = new Map();
314
+ /**
315
+ * The load parameters of each config-declared extension that loaded: when its deployment config
316
+ * is cleared and the rest is invalid it goes back to {@link pendingActivations} (pending config).
317
+ */
318
+ declaredActivations = new Map();
348
319
  /** 安装记录准备好的候选(按插件名;sha 变了就作废)。 */
349
320
  prepared = new Map();
350
321
  /** 闸门放行后导入过的安装记录真实清单(按插件名;部署配置 schema 用,含待配置而未加载的)。 */
@@ -415,7 +386,9 @@ let ExtensionHost = class ExtensionHost {
415
386
  * Each hook call's effective config for its organization, and the providers excluded from an
416
387
  * org's point resolution (layering spec A §6).
417
388
  */
418
- effective) {
389
+ effective,
390
+ /** `ctx.models`: the embeddings broker (spec B §5.4). */
391
+ models) {
419
392
  this.registry = registry;
420
393
  this.installs = installs;
421
394
  this.approvals = approvals;
@@ -424,6 +397,16 @@ let ExtensionHost = class ExtensionHost {
424
397
  this.log = log;
425
398
  this.effective = effective;
426
399
  const c = config.get();
400
+ this.hooks = new HookRegistry({
401
+ instances: () => this.registry.all(),
402
+ current: (plugin) => this.registry.current(plugin),
403
+ expectedPolicy: (mount) => this.expectedPolicy(mount),
404
+ enabledPlugins: (orgId) => this.enabledPlugins(orgId),
405
+ effectiveConfig: (orgId, plugin) => effective.get(orgId, plugin),
406
+ locks,
407
+ config: () => ({ hooks: { timeoutMs: this.config.get().hooks.timeoutMs } }),
408
+ log,
409
+ });
427
410
  this.deps = {
428
411
  db: kdb.pool,
429
412
  dbUrl: c.db.url,
@@ -433,20 +416,13 @@ let ExtensionHost = class ExtensionHost {
433
416
  redisUrl: c.redis.url,
434
417
  keyring,
435
418
  embedTokens,
419
+ models,
420
+ // ctx.models.embed fires model.request through the same registry (spec B §5.4)
421
+ hooks: this.hooks,
436
422
  locks,
437
423
  runWorkers: c.roles.includes("worker"),
438
424
  log,
439
425
  };
440
- this.hooks = new HookRegistry({
441
- instances: () => this.registry.all(),
442
- current: (plugin) => this.registry.current(plugin),
443
- expectedPolicy: (mount) => this.expectedPolicy(mount),
444
- enabledPlugins: (orgId) => this.enabledPlugins(orgId),
445
- effectiveConfig: (orgId, plugin) => effective.get(orgId, plugin),
446
- locks,
447
- config: () => ({ hooks: { timeoutMs: this.config.get().hooks.timeoutMs } }),
448
- log,
449
- });
450
426
  this.registry.onChange(() => {
451
427
  this.installedCache = undefined;
452
428
  });
@@ -1323,6 +1299,8 @@ let ExtensionHost = class ExtensionHost {
1323
1299
  }
1324
1300
  // 升级:替换加载参数(之后的依赖方连锁与 reload 用新版本),先登记新实例、再撤销旧实例
1325
1301
  this.specs.set(name, spec);
1302
+ if (a.source !== "install")
1303
+ this.declaredActivations.set(name, a);
1326
1304
  this.unloadedForDependency.delete(name);
1327
1305
  const old = this.registry.activate(inst);
1328
1306
  this.loggedFailures.delete(name);
@@ -1753,7 +1731,9 @@ let ExtensionHost = class ExtensionHost {
1753
1731
  /**
1754
1732
  * 部署配置保存后(`kernel.plugin-deployment-config`)本副本重读并校验(C10;与 unload / reload 串行):
1755
1733
  * - 插件没在本副本生效 → `not_loaded`(配置声明的刷新后台的合法性判定;待配置的由 reconcile 加载);
1756
- * - 不合法 → `invalid`:保持当前值,告警;
1734
+ * - 不合法 → `invalid`:保持当前值,告警;但 PG 里已没有保存的配置(超级管理员清空了,`DELETE
1735
+ * /api/v1/admin/extensions/:name/config`)、剩下的来源(启动配置、默认值)又不够时 → `unloaded`:卸下实例、
1736
+ * 记为待配置(pending / config),依赖方连锁;重新配好后由 reconcile 加载;
1757
1737
  * - 没变 → `unchanged`;只改了 hot 字段 → `hot`:就地替换,插件经 `ctx.config` 读到新值,不重新 setup;
1758
1738
  * - 改了非 hot 字段 → `reload`:用新配置重新加载实例(先新后旧,排空在途调用),依赖方连锁;
1759
1739
  * 重新加载失败旧实例保留(`reload_failed`,记 error)。
@@ -1792,6 +1772,10 @@ let ExtensionHost = class ExtensionHost {
1792
1772
  }
1793
1773
  const r = parseLoadGate(schema, raw);
1794
1774
  if (!r.success) {
1775
+ if (await this.clearedInPg(plugin)) {
1776
+ await this.unloadForMissingConfig(inst, toIssues(r.error));
1777
+ return "unloaded";
1778
+ }
1795
1779
  this.log.warn("plugin deployment config changed but is invalid on this replica; keeping the current config", {
1796
1780
  plugin,
1797
1781
  detail: toIssues(r.error)
@@ -1841,6 +1825,95 @@ let ExtensionHost = class ExtensionHost {
1841
1825
  return "reload";
1842
1826
  });
1843
1827
  }
1828
+ /** PG holds no deployment config for the plugin (it was cleared); a read error counts as no. */
1829
+ async clearedInPg(plugin) {
1830
+ try {
1831
+ return !(await this.installs.hasStoredDeploymentConfig(plugin));
1832
+ }
1833
+ catch (err) {
1834
+ this.log.warn("cannot read whether the plugin has a stored deployment config", {
1835
+ plugin,
1836
+ err,
1837
+ });
1838
+ return false;
1839
+ }
1840
+ }
1841
+ /**
1842
+ * Unloads an extension whose deployment config was cleared and is now missing or invalid (in
1843
+ * the host's serial queue): drains it, records pending / config (a config-declared one goes back
1844
+ * to {@link pendingActivations}; an install record is decided again on every converge) and
1845
+ * cascades to its dependents. It loads again without a restart once it is configured.
1846
+ */
1847
+ async unloadForMissingConfig(inst, issues) {
1848
+ const plugin = inst.name;
1849
+ const drainMs = this.drainMs();
1850
+ const gone = await this.doUnload(plugin, drainMs, null);
1851
+ if (!gone)
1852
+ return;
1853
+ await this.markPendingConfig({ plugin, version: gone.version, sha256: gone.sha256, source: gone.source }, issues, "extension unloaded: its deployment config was cleared and what remains is missing or invalid (set it in the admin console or the startup config; it loads without a restart)");
1854
+ await this.cascade(gone.manifest.provides, drainMs);
1855
+ }
1856
+ /**
1857
+ * Records an extension that is not loaded as pending configuration: a config-declared one goes
1858
+ * back to {@link pendingActivations} (a later save loads it); an install record is decided again
1859
+ * on every converge.
1860
+ */
1861
+ async markPendingConfig(p, issues, message) {
1862
+ const detail = issues.map((i) => `${i.path || "<root>"}: ${i.message}`).join("; ");
1863
+ const declared = this.declaredActivations.get(p.plugin);
1864
+ if (p.source !== "install") {
1865
+ this.configValidity.set(p.plugin, false);
1866
+ if (declared)
1867
+ this.pendingActivations.set(p.plugin, { ...declared, fatal: false });
1868
+ }
1869
+ this.configWarned.set(p.plugin, detail);
1870
+ this.log.warn(message, { plugin: p.plugin, source: p.source, detail });
1871
+ await this.writeStatus({ ...p, state: "pending", reason: "config", detail });
1872
+ }
1873
+ /**
1874
+ * Before an extension unloaded for a dependency comes back ({@link cascade}): re-reads its
1875
+ * deployment config, which may have been saved or cleared while it was down (applyDeploymentConfig
1876
+ * only records validity then), and refreshes its load parameters, so it never returns on a stale
1877
+ * config or revoked secrets. Returns false when the config is now missing or invalid and PG holds
1878
+ * none: the extension is left pending configuration instead. A read error, or an invalid config
1879
+ * that is still stored, keeps the previous config (as for a loaded extension).
1880
+ */
1881
+ async refreshConfigForRestore(name, spec) {
1882
+ const schema = spec.manifest.config?.deployment;
1883
+ if (!schema)
1884
+ return true;
1885
+ let raw;
1886
+ try {
1887
+ raw = await this.rawConfigOf(name, schema);
1888
+ }
1889
+ catch (err) {
1890
+ this.log.error("cannot read the stored deployment config of plugin; restoring it on its previous config", { plugin: name, err });
1891
+ return true;
1892
+ }
1893
+ const r = parseLoadGate(schema, raw);
1894
+ if (!r.success) {
1895
+ if (!(await this.clearedInPg(name)))
1896
+ return true;
1897
+ await this.markPendingConfig({
1898
+ plugin: name,
1899
+ version: spec.manifest.version,
1900
+ sha256: spec.sha256,
1901
+ source: spec.source,
1902
+ }, toIssues(r.error), "extension not restored after its dependency came back: its deployment config was cleared and what remains is missing or invalid (set it in the admin console or the startup config; it loads without a restart)");
1903
+ return false;
1904
+ }
1905
+ if (spec.source !== "install")
1906
+ this.configValidity.set(name, true);
1907
+ if (changedPaths(schema, spec.config, r.data).length > 0) {
1908
+ this.reportSecrets(schema, r.data);
1909
+ this.specs.set(name, {
1910
+ ...spec,
1911
+ config: r.data,
1912
+ configHash: deploymentConfigHash(schema, r.data),
1913
+ });
1914
+ }
1915
+ return true;
1916
+ }
1844
1917
  /** 本次未加载、等待批准权限的插件(含因 `requires` 只能由它们满足而未加载的插件),按依赖拓扑序。 */
1845
1918
  pending() {
1846
1919
  return structuredClone(this.pendingPlugins);
@@ -2118,6 +2191,10 @@ let ExtensionHost = class ExtensionHost {
2118
2191
  const available = providedNow();
2119
2192
  if (!(spec.manifest.requires ?? []).every((c) => available.has(c)))
2120
2193
  continue;
2194
+ if (!(await this.refreshConfigForRestore(name, spec))) {
2195
+ this.unloadedForDependency.delete(name);
2196
+ continue;
2197
+ }
2121
2198
  try {
2122
2199
  await this.doReload(name, drainMs);
2123
2200
  progress = true;
@@ -2201,6 +2278,7 @@ ExtensionHost = __decorate([
2201
2278
  __param(10, Inject(LockService)),
2202
2279
  __param(11, Inject(KERNEL_LOGGER)),
2203
2280
  __param(12, Inject(KERNEL_APP_OPTIONS)),
2204
- __param(13, Inject(EffectiveConfigs))
2281
+ __param(13, Inject(EffectiveConfigs)),
2282
+ __param(14, Inject(ModelEmbeddings))
2205
2283
  ], ExtensionHost);
2206
2284
  export { ExtensionHost };
@@ -107,6 +107,11 @@ export declare class ExtensionInstalls {
107
107
  * the fields of `schema` when it is given.
108
108
  */
109
109
  effectiveDeploymentConfig(plugin: string, fileValue: unknown, schema?: core.$ZodType): Promise<unknown>;
110
+ /**
111
+ * Whether PG holds a deployment config row for the extension (a super admin saved one and has
112
+ * not cleared it since; `DELETE /api/v1/admin/extensions/:name/config` removes it).
113
+ */
114
+ hasStoredDeploymentConfig(plugin: string): Promise<boolean>;
110
115
  /** Every install record's extension name (any desired state). */
111
116
  installedNames(): Promise<string[]>;
112
117
  /**
@@ -76,6 +76,18 @@ let ExtensionInstalls = class ExtensionInstalls {
76
76
  const fields = schema ? configFields(schema).map((f) => f.path) : undefined;
77
77
  return mergeDeploymentConfig(stored, fileValue, fields);
78
78
  }
79
+ /**
80
+ * Whether PG holds a deployment config row for the extension (a super admin saved one and has
81
+ * not cleared it since; `DELETE /api/v1/admin/extensions/:name/config` removes it).
82
+ */
83
+ async hasStoredDeploymentConfig(plugin) {
84
+ const row = await this.db
85
+ .selectFrom("extension_deployment_configs")
86
+ .select("plugin")
87
+ .where("plugin", "=", plugin)
88
+ .executeTakeFirst();
89
+ return row !== undefined;
90
+ }
79
91
  /** Every install record's extension name (any desired state). */
80
92
  async installedNames() {
81
93
  const rows = await this.db.selectFrom("extension_installs").select("name").execute();
@@ -11,7 +11,8 @@ import { type JsonSchema } from "./config-json-schema.js";
11
11
  import { EffectiveConfigs } from "./effective-config.js";
12
12
  import { ExtensionHost } from "./host.js";
13
13
  import { ExtensionInstalls } from "./installs.js";
14
- import { type PermissionGroup } from "./permission-view.js";
14
+ import { type DeploymentExtensionStatus, type PermissionGroup } from "./permission-view.js";
15
+ import { ExtensionAvailability, type ExtensionUnavailableReason } from "./unavailable.js";
15
16
  export { type ConfigIssue, toIssues };
16
17
  /** 组织视角下一个已加载插件的状态;`config` 永远不含密钥字段,密钥只回显「是否已设置」。 */
17
18
  export interface OrgExtensionView {
@@ -35,6 +36,16 @@ export interface OrgExtensionView {
35
36
  * 组织的启用开关保留不变(不能修改),其余字段为空。
36
37
  */
37
38
  available: boolean;
39
+ /**
40
+ * The extension's status on the deployment, as the admin console derives it
41
+ * (`deriveExtensionStatus`): `enabled` when it is loaded here; otherwise why not.
42
+ */
43
+ status: DeploymentExtensionStatus;
44
+ /**
45
+ * Only when unavailable: why it cannot be used (spec §14.5 item 4), e.g.
46
+ * `needs_deployment_config`. State only, never a config value or field name.
47
+ */
48
+ reason?: ExtensionUnavailableReason;
38
49
  /**
39
50
  * A required bootstrap plugin: enabled in every org (`enabled` is always true) and cannot be
40
51
  * disabled here (`extension.required`); its org config, when it has one, can still be set.
@@ -121,6 +132,8 @@ export declare class OrgExtensionConfigs {
121
132
  private readonly log;
122
133
  /** The effective deployment config of each org (spec A §6): read for `needsConfig`. */
123
134
  private readonly effective;
135
+ /** Why an installed extension is not loaded (`status` / `reason` of the unavailable ones). */
136
+ private readonly availability;
124
137
  /** Test seam only: a deterministic interleaving point after the config rows are read, before the secrets. */
125
138
  afterConfigRowRead: (() => Promise<void>) | undefined;
126
139
  constructor(kdb: KernelDb, txHost: TransactionHost, keyring: Keyring, host: ExtensionHost,
@@ -133,7 +146,9 @@ export declare class OrgExtensionConfigs {
133
146
  /** Secret values handled (written or decrypted) are masked in the logs after the commit. */
134
147
  log: KernelLogger,
135
148
  /** The effective deployment config of each org (spec A §6): read for `needsConfig`. */
136
- effective: EffectiveConfigs);
149
+ effective: EffectiveConfigs,
150
+ /** Why an installed extension is not loaded (`status` / `reason` of the unavailable ones). */
151
+ availability: ExtensionAvailability);
137
152
  /** The kernel-schema handle of the current transaction. */
138
153
  private get db();
139
154
  /** 把一份组织配置里的密钥值登记到日志打码(无密钥时无操作);调用方须在事务提交后调用。 */
@@ -29,8 +29,9 @@ import { enabledExtensionsQuery, requiredExtensions } from "./enabled.js";
29
29
  import { ExtensionHost } from "./host.js";
30
30
  import { ExtensionInstalls } from "./installs.js";
31
31
  import { fieldLevels } from "./org-levels.js";
32
- import { permissionGroups } from "./permission-view.js";
32
+ import { permissionGroups, } from "./permission-view.js";
33
33
  import { itemLocked, pluginItemsOf } from "./plugin-items.js";
34
+ import { ExtensionAvailability } from "./unavailable.js";
34
35
  export { toIssues };
35
36
  /** 内核自己的 secrets 命名空间(plugin-sdk 把 `kernel` 列为保留插件名,插件不会与之相撞)。 */
36
37
  const SECRETS_NAMESPACE = "kernel";
@@ -104,6 +105,7 @@ let OrgExtensionConfigs = class OrgExtensionConfigs {
104
105
  events;
105
106
  log;
106
107
  effective;
108
+ availability;
107
109
  /** Test seam only: a deterministic interleaving point after the config rows are read, before the secrets. */
108
110
  afterConfigRowRead;
109
111
  constructor(kdb, txHost, keyring, host,
@@ -116,7 +118,9 @@ let OrgExtensionConfigs = class OrgExtensionConfigs {
116
118
  /** Secret values handled (written or decrypted) are masked in the logs after the commit. */
117
119
  log,
118
120
  /** The effective deployment config of each org (spec A §6): read for `needsConfig`. */
119
- effective) {
121
+ effective,
122
+ /** Why an installed extension is not loaded (`status` / `reason` of the unavailable ones). */
123
+ availability) {
120
124
  this.kdb = kdb;
121
125
  this.txHost = txHost;
122
126
  this.keyring = keyring;
@@ -126,6 +130,7 @@ let OrgExtensionConfigs = class OrgExtensionConfigs {
126
130
  this.events = events;
127
131
  this.log = log;
128
132
  this.effective = effective;
133
+ this.availability = availability;
129
134
  }
130
135
  /** The kernel-schema handle of the current transaction. */
131
136
  get db() {
@@ -154,7 +159,16 @@ let OrgExtensionConfigs = class OrgExtensionConfigs {
154
159
  name: r.name,
155
160
  version: r.version,
156
161
  }));
157
- return this.withLayers(orgId, await this.listSnapshot(orgId, installed));
162
+ const views = await this.listSnapshot(orgId, installed);
163
+ const why = await this.availability.unavailable(views.filter((v) => !v.available).map((v) => v.plugin));
164
+ for (const v of views) {
165
+ const u = why.get(v.plugin);
166
+ if (v.available || u === undefined || u.status === null)
167
+ continue;
168
+ v.status = u.status;
169
+ v.reason = u.reason;
170
+ }
171
+ return this.withLayers(orgId, views);
158
172
  }
159
173
  /**
160
174
  * Fills `overrideState` and the platform half of `needsConfig` (spec A §6) for the views of
@@ -219,6 +233,9 @@ let OrgExtensionConfigs = class OrgExtensionConfigs {
219
233
  permissions: [],
220
234
  orgConfigSchema: null,
221
235
  available: false,
236
+ // filled in by `list` from the replicas' reports
237
+ status: "converging",
238
+ reason: "loading",
222
239
  required: required.has(i.name),
223
240
  ...scopeFields(items.get(i.name), required.has(i.name)),
224
241
  overrideState: "none",
@@ -619,6 +636,7 @@ let OrgExtensionConfigs = class OrgExtensionConfigs {
619
636
  permissions: permissionGroups(this.permissionsOf(m.name)),
620
637
  orgConfigSchema: schema ? this.formSchema(m.name, m.version, schema) : null,
621
638
  available: true,
639
+ status: "enabled",
622
640
  required,
623
641
  ...scopeFields(items, required),
624
642
  overrideState: [...fieldLevels(m.config?.deployment).values()].includes("override")
@@ -682,7 +700,8 @@ OrgExtensionConfigs = __decorate([
682
700
  __param(5, Inject(ExtensionInstalls)),
683
701
  __param(6, Inject(KernelEvents)),
684
702
  __param(7, Inject(KERNEL_LOGGER)),
685
- __param(8, Inject(EffectiveConfigs))
703
+ __param(8, Inject(EffectiveConfigs)),
704
+ __param(9, Inject(ExtensionAvailability))
686
705
  ], OrgExtensionConfigs);
687
706
  export { OrgExtensionConfigs };
688
707
  /**
@@ -1,13 +1,8 @@
1
- import { z } from "zod";
1
+ import type { z } from "zod";
2
2
  import { type Principal } from "../identity/principal.js";
3
3
  import { type OrgContext } from "../orgs/org.guard.js";
4
4
  import { ExtensionPointDefaults, type OrgPointDefaultView } from "./point-defaults.js";
5
- declare const PointParams: z.ZodObject<{
6
- point: z.ZodString;
7
- }, z.core.$strip>;
8
- declare const DefaultBody: z.ZodObject<{
9
- extension: z.ZodString;
10
- }, z.core.$strict>;
5
+ import { ExtensionPointDefaultBody as DefaultBody, ExtensionPointParams as PointParams } from "./point-defaults.schemas.js";
11
6
  /**
12
7
  * The org default provider of `org-default` extension points (web tools spec §6):
13
8
  * - `GET /api/v1/orgs/:orgId/extension-points` (`org.extensions.manage`) → `{ points }`: each
@@ -31,4 +26,3 @@ export declare class ExtensionPointDefaultsController {
31
26
  }>;
32
27
  setDefault(principal: Principal, org: OrgContext, { point }: z.infer<typeof PointParams>, body: z.infer<typeof DefaultBody>): Promise<void>;
33
28
  }
34
- export {};
@@ -8,14 +8,12 @@ var __param = (this && this.__param) || function (paramIndex, decorator) {
8
8
  return function (target, key) { decorator(target, key, paramIndex); }
9
9
  };
10
10
  import { Controller, Get, HttpCode, Inject, Put } from "@nestjs/common";
11
- import { z } from "zod";
12
11
  import { CurrentPrincipal, requireUser } from "../identity/principal.js";
13
12
  import { createZodDto } from "../infra/validation/create-zod-dto.js";
14
13
  import { ZBody, ZParam } from "../infra/validation/zod-params.js";
15
14
  import { CurrentOrg, OrgAction } from "../orgs/org.guard.js";
16
15
  import { ExtensionPointDefaults } from "./point-defaults.js";
17
- const PointParams = z.object({ point: z.string().min(1).max(100) });
18
- const DefaultBody = z.object({ extension: z.string().min(1).max(214) }).strict();
16
+ import { ExtensionPointDefaultBody as DefaultBody, ExtensionPointParams as PointParams, } from "./point-defaults.schemas.js";
19
17
  class ExtensionPointParamsDto extends createZodDto(PointParams, "ExtensionPointParams") {
20
18
  }
21
19
  class ExtensionPointDefaultBodyDto extends createZodDto(DefaultBody, "ExtensionPointDefaultBody") {
@@ -62,7 +62,9 @@ export declare class ExtensionPointDefaults {
62
62
  * the point is an `org-default` one and the extension provides it (loaded here) and is enabled
63
63
  * in the org. Audited as `extension_point.default_set`.
64
64
  */
65
- setDefault(orgId: string, point: string, extension: string, actorId: string): Promise<void>;
65
+ setDefault(orgId: string, point: string, extension: string, actorId: string,
66
+ /** Merged into the audit detail (a write made through the Platform tool). */
67
+ auditDetail?: Record<string, unknown>): Promise<void>;
66
68
  /** The candidates of `point` in `orgId`, by extension name. */
67
69
  private candidates;
68
70
  private choose;
@@ -100,7 +100,9 @@ let ExtensionPointDefaults = class ExtensionPointDefaults {
100
100
  * the point is an `org-default` one and the extension provides it (loaded here) and is enabled
101
101
  * in the org. Audited as `extension_point.default_set`.
102
102
  */
103
- async setDefault(orgId, point, extension, actorId) {
103
+ async setDefault(orgId, point, extension, actorId,
104
+ /** Merged into the audit detail (a write made through the Platform tool). */
105
+ auditDetail) {
104
106
  const db = this.kdb.db;
105
107
  if (!hasSelection(point)) {
106
108
  throw new ApiError("validation_failed", `${point} is not an extension point with an organization default`);
@@ -123,7 +125,7 @@ let ExtensionPointDefaults = class ExtensionPointDefaults {
123
125
  orgId,
124
126
  action: "extension_point.default_set",
125
127
  target: point,
126
- detail: { point, extension },
128
+ detail: { point, extension, ...auditDetail },
127
129
  });
128
130
  }
129
131
  /** The candidates of `point` in `orgId`, by extension name. */
@@ -0,0 +1,9 @@
1
+ import { z } from "zod";
2
+ import type { RouteSchemas } from "../platform/route-schemas.js";
3
+ export declare const ExtensionPointParams: z.ZodObject<{
4
+ point: z.ZodString;
5
+ }, z.core.$strip>;
6
+ export declare const ExtensionPointDefaultBody: z.ZodObject<{
7
+ extension: z.ZodString;
8
+ }, z.core.$strict>;
9
+ export declare const EXTENSION_POINT_ROUTES: readonly RouteSchemas[];
@@ -0,0 +1,14 @@
1
+ import { z } from "zod";
2
+ export const ExtensionPointParams = z.object({ point: z.string().min(1).max(100) });
3
+ export const ExtensionPointDefaultBody = z
4
+ .object({ extension: z.string().min(1).max(214) })
5
+ .strict();
6
+ export const EXTENSION_POINT_ROUTES = [
7
+ { route: "GET /api/v1/orgs/:orgId/extension-points" },
8
+ { route: "GET /api/v1/orgs/:orgId/extension-points/available" },
9
+ {
10
+ route: "PUT /api/v1/orgs/:orgId/extension-points/:point/default",
11
+ params: ExtensionPointParams,
12
+ body: ExtensionPointDefaultBody,
13
+ },
14
+ ];
@@ -0,0 +1,9 @@
1
+ /**
2
+ * The extension state the model domain reads below the host: the install records with their
3
+ * packages and approvals, and each extension's effective config per org. Apart from
4
+ * `ExtensionsModule` so the model provider registry (and the `ctx.models` broker the host injects)
5
+ * can depend on it without a module cycle (writing-kernel-api: a cycle is cut by moving the shared
6
+ * part into its own provider both sides inject). `ExtensionsModule` re-exports it.
7
+ */
8
+ export declare class ExtensionStateModule {
9
+ }