@opensoha/contracts 0.1.23 → 0.1.25

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 (415) hide show
  1. package/COMPATIBILITY.md +95 -0
  2. package/README.md +24 -6
  3. package/agent/environment/README.md +55 -0
  4. package/agent/environment/export.go +139 -0
  5. package/agent/environment/export_test.go +62 -0
  6. package/agent/environment/preflight.go +62 -0
  7. package/agent/environment/preflight_test.go +41 -0
  8. package/agent/environment/protocol.go +221 -0
  9. package/agent/environment/protocol_test.go +81 -0
  10. package/agent/environment-lease.schema.json +2 -2
  11. package/agent/environment-template.schema.json +1 -1
  12. package/agent/guest/browser_network.go +77 -0
  13. package/agent/guest/data.go +62 -0
  14. package/agent/guest/protocol.go +235 -0
  15. package/agent/guest/protocol_test.go +142 -0
  16. package/agent/guest/renewal.go +56 -0
  17. package/agent/guest/renewal_test.go +53 -0
  18. package/agent/guest/runtime.go +315 -0
  19. package/agent/guest/runtime_json.go +75 -0
  20. package/agent/guest/runtime_test.go +110 -0
  21. package/agent/personal-browser-network-request.schema.json +40 -0
  22. package/agent/personal-browser-network-response.schema.json +44 -0
  23. package/agent/personal-environment-export.schema.json +55 -0
  24. package/agent/personal-environment-preflight-request.schema.json +52 -0
  25. package/agent/personal-environment-preflight-result.schema.json +69 -0
  26. package/agent/personal-environment-request.schema.json +137 -0
  27. package/agent/personal-environment-result.schema.json +101 -0
  28. package/agent/personal-guest-binding.schema.json +92 -0
  29. package/agent/personal-guest-data-plan.schema.json +32 -0
  30. package/agent/personal-guest-enrollment.schema.json +21 -0
  31. package/agent/personal-guest-heartbeat.schema.json +44 -0
  32. package/agent/personal-guest-provisioning.schema.json +71 -0
  33. package/agent/personal-guest-renewal.schema.json +33 -0
  34. package/agent/personal-guest-runtime-result.schema.json +164 -0
  35. package/agent/personal-guest-runtime.schema.json +304 -0
  36. package/agent/personal-guest-tools.schema.json +75 -0
  37. package/auth/catalog_generated.go +2 -2
  38. package/auth/gateway_permissions_test.go +48 -0
  39. package/auth/permission-catalog.json +331 -1
  40. package/auth/token-claims.schema.json +5 -0
  41. package/compat/consumer-revisions.json +3 -2
  42. package/compat/json-schema-ecosystem-0.1.0.json +1 -1
  43. package/compat/openapi-loose-boundaries-0.1.0.json +1 -1
  44. package/connectors/connector-action.schema.json +138 -0
  45. package/fixtures/json-schema/connector-action/invalid/empty-values.json +11 -0
  46. package/fixtures/json-schema/connector-action/invalid/invalid-expiry.json +16 -0
  47. package/fixtures/json-schema/connector-action/invalid/lowercase-alias.json +16 -0
  48. package/fixtures/json-schema/connector-action/invalid/unknown-entry-field.json +17 -0
  49. package/fixtures/json-schema/connector-action/invalid/unknown-frame-field.json +17 -0
  50. package/fixtures/json-schema/connector-action/invalid/unknown-version.json +16 -0
  51. package/fixtures/json-schema/connector-action/invalid/unversioned-reference.json +16 -0
  52. package/fixtures/json-schema/connector-action/invalid/zero-version.json +16 -0
  53. package/fixtures/json-schema/connector-action/valid/pinned.json +16 -0
  54. package/fixtures/json-schema/connector-definition/invalid/credential-userinfo.json +8 -0
  55. package/fixtures/json-schema/connector-definition/invalid/reference-traversal.json +8 -0
  56. package/fixtures/json-schema/connector-definition/invalid/zero-version.json +8 -0
  57. package/fixtures/json-schema/connector-definition/valid/canonical.json +8 -0
  58. package/fixtures/json-schema/connector-definition/valid/pinned.json +8 -0
  59. package/fixtures/json-schema/personal-browser-network-request/invalid/bounded.json +4 -0
  60. package/fixtures/json-schema/personal-browser-network-request/valid/bounded.json +4 -0
  61. package/fixtures/json-schema/personal-browser-network-response/invalid/bounded.json +5 -0
  62. package/fixtures/json-schema/personal-browser-network-response/valid/bounded.json +5 -0
  63. package/fixtures/json-schema/personal-environment-export/invalid/extra.json +11 -0
  64. package/fixtures/json-schema/personal-environment-export/invalid/ownerId.json +10 -0
  65. package/fixtures/json-schema/personal-environment-export/invalid/sha256.json +10 -0
  66. package/fixtures/json-schema/personal-environment-export/invalid/sizeBytes.json +10 -0
  67. package/fixtures/json-schema/personal-environment-export/valid/complete.json +10 -0
  68. package/fixtures/json-schema/personal-environment-preflight-request/invalid/disk.json +11 -0
  69. package/fixtures/json-schema/personal-environment-preflight-request/invalid/network.json +11 -0
  70. package/fixtures/json-schema/personal-environment-preflight-request/invalid/node.json +12 -0
  71. package/fixtures/json-schema/personal-environment-preflight-request/invalid/owner.json +12 -0
  72. package/fixtures/json-schema/personal-environment-preflight-request/valid/bounded.json +11 -0
  73. package/fixtures/json-schema/personal-environment-preflight-result/invalid/disk.json +15 -0
  74. package/fixtures/json-schema/personal-environment-preflight-result/invalid/network.json +15 -0
  75. package/fixtures/json-schema/personal-environment-preflight-result/invalid/no-hard-quota.json +15 -0
  76. package/fixtures/json-schema/personal-environment-preflight-result/invalid/node.json +16 -0
  77. package/fixtures/json-schema/personal-environment-preflight-result/invalid/not-ready.json +15 -0
  78. package/fixtures/json-schema/personal-environment-preflight-result/invalid/owner.json +16 -0
  79. package/fixtures/json-schema/personal-environment-preflight-result/valid/bounded.json +15 -0
  80. package/fixtures/json-schema/personal-environment-request/invalid/delete-data-argv.json +24 -0
  81. package/fixtures/json-schema/personal-environment-request/invalid/delete-data-createData.json +22 -0
  82. package/fixtures/json-schema/personal-environment-request/invalid/delete-data-taskId.json +22 -0
  83. package/fixtures/json-schema/personal-environment-request/invalid/export-argv.json +22 -0
  84. package/fixtures/json-schema/personal-environment-request/invalid/export-createData.json +22 -0
  85. package/fixtures/json-schema/personal-environment-request/invalid/export-taskId.json +22 -0
  86. package/fixtures/json-schema/personal-environment-request/invalid/extra-command.json +24 -0
  87. package/fixtures/json-schema/personal-environment-request/invalid/host-workspace.json +22 -0
  88. package/fixtures/json-schema/personal-environment-request/invalid/image-injection.json +22 -0
  89. package/fixtures/json-schema/personal-environment-request/invalid/network-egress.json +21 -0
  90. package/fixtures/json-schema/personal-environment-request/invalid/no-command.json +21 -0
  91. package/fixtures/json-schema/personal-environment-request/invalid/recreate-on-release.json +22 -0
  92. package/fixtures/json-schema/personal-environment-request/invalid/relative-command.json +24 -0
  93. package/fixtures/json-schema/personal-environment-request/invalid/released-identity.json +22 -0
  94. package/fixtures/json-schema/personal-environment-request/invalid/task-empty.json +27 -0
  95. package/fixtures/json-schema/personal-environment-request/invalid/task-host-path.json +27 -0
  96. package/fixtures/json-schema/personal-environment-request/invalid/task-noncanonical.json +27 -0
  97. package/fixtures/json-schema/personal-environment-request/invalid/task-null.json +27 -0
  98. package/fixtures/json-schema/personal-environment-request/invalid/task-on-inspection.json +22 -0
  99. package/fixtures/json-schema/personal-environment-request/invalid/unbounded-quota.json +21 -0
  100. package/fixtures/json-schema/personal-environment-request/valid/acquire.json +21 -0
  101. package/fixtures/json-schema/personal-environment-request/valid/delete-data.json +21 -0
  102. package/fixtures/json-schema/personal-environment-request/valid/execute.json +26 -0
  103. package/fixtures/json-schema/personal-environment-request/valid/export-data.json +21 -0
  104. package/fixtures/json-schema/personal-environment-request/valid/inspect.json +21 -0
  105. package/fixtures/json-schema/personal-environment-request/valid/provision.json +22 -0
  106. package/fixtures/json-schema/personal-environment-request/valid/release.json +21 -0
  107. package/fixtures/json-schema/personal-environment-request/valid/task-workspace.json +27 -0
  108. package/fixtures/json-schema/personal-environment-result/invalid/active-without-observation.json +7 -0
  109. package/fixtures/json-schema/personal-environment-result/invalid/deleted-output.json +8 -0
  110. package/fixtures/json-schema/personal-environment-result/invalid/deleted-snapshot.json +8 -0
  111. package/fixtures/json-schema/personal-environment-result/invalid/deleted-taskId.json +8 -0
  112. package/fixtures/json-schema/personal-environment-result/invalid/private-handle.json +8 -0
  113. package/fixtures/json-schema/personal-environment-result/invalid/stopped-fake-observation.json +20 -0
  114. package/fixtures/json-schema/personal-environment-result/invalid/task-empty.json +22 -0
  115. package/fixtures/json-schema/personal-environment-result/invalid/task-host-path.json +22 -0
  116. package/fixtures/json-schema/personal-environment-result/invalid/task-null.json +22 -0
  117. package/fixtures/json-schema/personal-environment-result/invalid/task-on-stopped.json +8 -0
  118. package/fixtures/json-schema/personal-environment-result/invalid/task-without-command-output.json +21 -0
  119. package/fixtures/json-schema/personal-environment-result/valid/active.json +21 -0
  120. package/fixtures/json-schema/personal-environment-result/valid/deleted.json +7 -0
  121. package/fixtures/json-schema/personal-environment-result/valid/expired.json +7 -0
  122. package/fixtures/json-schema/personal-environment-result/valid/missing.json +7 -0
  123. package/fixtures/json-schema/personal-environment-result/valid/released.json +7 -0
  124. package/fixtures/json-schema/personal-environment-result/valid/task-workspace.json +22 -0
  125. package/fixtures/json-schema/personal-guest-binding/invalid/host-path.json +17 -0
  126. package/fixtures/json-schema/personal-guest-binding/invalid/invalid-policy.json +17 -0
  127. package/fixtures/json-schema/personal-guest-binding/invalid/invalid-serial.json +17 -0
  128. package/fixtures/json-schema/personal-guest-binding/invalid/legacy-version.json +17 -0
  129. package/fixtures/json-schema/personal-guest-binding/invalid/missing-generation.json +17 -0
  130. package/fixtures/json-schema/personal-guest-binding/invalid/missing-identity.json +16 -0
  131. package/fixtures/json-schema/personal-guest-binding/invalid/missing-provider-identity.json +16 -0
  132. package/fixtures/json-schema/personal-guest-binding/invalid/raw-provider-identity.json +17 -0
  133. package/fixtures/json-schema/personal-guest-binding/valid/minimal.json +17 -0
  134. package/fixtures/json-schema/personal-guest-data-plan/invalid/quota.json +1 -0
  135. package/fixtures/json-schema/personal-guest-data-plan/valid/basic.json +1 -0
  136. package/fixtures/json-schema/personal-guest-enrollment/invalid/capabilities.json +7 -0
  137. package/fixtures/json-schema/personal-guest-enrollment/invalid/legacy-version.json +4 -0
  138. package/fixtures/json-schema/personal-guest-enrollment/invalid/missing-identity.json +3 -0
  139. package/fixtures/json-schema/personal-guest-enrollment/invalid/ownerId.json +5 -0
  140. package/fixtures/json-schema/personal-guest-enrollment/invalid/token.json +5 -0
  141. package/fixtures/json-schema/personal-guest-enrollment/valid/minimal.json +4 -0
  142. package/fixtures/json-schema/personal-guest-heartbeat/invalid/argv.json +11 -0
  143. package/fixtures/json-schema/personal-guest-heartbeat/invalid/legacy-version.json +8 -0
  144. package/fixtures/json-schema/personal-guest-heartbeat/invalid/missing-identity.json +7 -0
  145. package/fixtures/json-schema/personal-guest-heartbeat/invalid/owner.json +9 -0
  146. package/fixtures/json-schema/personal-guest-heartbeat/invalid/self-ready.json +9 -0
  147. package/fixtures/json-schema/personal-guest-heartbeat/invalid/zero-sequence.json +8 -0
  148. package/fixtures/json-schema/personal-guest-heartbeat/valid/minimal.json +8 -0
  149. package/fixtures/json-schema/personal-guest-provisioning/invalid/network.json +1 -0
  150. package/fixtures/json-schema/personal-guest-provisioning/valid/basic.json +1 -0
  151. package/fixtures/json-schema/personal-guest-renewal/invalid/unknown.json +1 -0
  152. package/fixtures/json-schema/personal-guest-renewal/valid/basic.json +1 -0
  153. package/fixtures/json-schema/personal-guest-runtime/invalid/minimal.json +45 -0
  154. package/fixtures/json-schema/personal-guest-runtime/valid/minimal.json +45 -0
  155. package/fixtures/json-schema/personal-guest-runtime-result/invalid/minimal.json +28 -0
  156. package/fixtures/json-schema/personal-guest-runtime-result/valid/minimal.json +27 -0
  157. package/fixtures/json-schema/personal-guest-tools/invalid/minimal.json +31 -0
  158. package/fixtures/json-schema/personal-guest-tools/valid/minimal.json +30 -0
  159. package/fixtures/json-schema/source-import-policy/invalid/case-variant-scope.json +4 -0
  160. package/fixtures/json-schema/source-import-policy/invalid/case-variant-version.json +4 -0
  161. package/fixtures/json-schema/source-import-policy/invalid/duplicate-grant.json +4 -0
  162. package/fixtures/json-schema/source-import-policy/invalid/empty-id.json +4 -0
  163. package/fixtures/json-schema/source-import-policy/invalid/future-version.json +4 -0
  164. package/fixtures/json-schema/source-import-policy/invalid/unknown-field.json +4 -0
  165. package/fixtures/json-schema/source-import-policy/valid/deny-all.json +4 -0
  166. package/fixtures/json-schema/source-import-policy/valid/shared.json +4 -0
  167. package/fixtures/json-schema/token-claims/invalid/authz-negative.json +23 -0
  168. package/fixtures/json-schema/token-claims/invalid/authz-string.json +23 -0
  169. package/fixtures/json-schema/token-claims/invalid/authz-zero.json +23 -0
  170. package/fixtures/json-schema/token-claims/valid/versioned-session.json +23 -0
  171. package/fixtures/openapi/AgentRunEventListEnvelope/invalid/basic.json +8 -0
  172. package/fixtures/openapi/AgentRunEventListEnvelope/valid/basic.json +8 -0
  173. package/fixtures/openapi/AgentRunEventListEnvelope/valid/native.json +1 -0
  174. package/fixtures/openapi/AgentRunResumeRequest/invalid/basic.json +3 -0
  175. package/fixtures/openapi/AgentRunResumeRequest/valid/basic.json +3 -0
  176. package/fixtures/openapi/AgentSSHCommandRequest/invalid/task51.json +24 -0
  177. package/fixtures/openapi/AgentSSHCommandRequest/valid/task51.json +23 -0
  178. package/fixtures/openapi/AgentSSHCommandResult/invalid/task51.json +8 -0
  179. package/fixtures/openapi/AgentSSHCommandResult/valid/task51.json +7 -0
  180. package/fixtures/openapi/AgentSSHSessionRequest/invalid/task51.json +20 -0
  181. package/fixtures/openapi/AgentSSHSessionRequest/valid/task51.json +19 -0
  182. package/fixtures/openapi/CapabilityTaskInput/invalid/duplicate-scope.json +36 -0
  183. package/fixtures/openapi/CapabilityTaskInput/valid/scoped.json +32 -0
  184. package/fixtures/openapi/DockerQuickCreateHostInput/invalid/guest-access.json +7 -0
  185. package/fixtures/openapi/DockerQuickCreateHostInput/valid/guest-access.json +9 -0
  186. package/fixtures/openapi/KnowledgeSourceDocument/invalid/tombstone-with-content.json +1 -0
  187. package/fixtures/openapi/KnowledgeSourceDocument/valid/tombstone.json +1 -0
  188. package/fixtures/openapi/KubernetesAgentActionCheck/invalid/unproven-state.json +6 -0
  189. package/fixtures/openapi/KubernetesAgentActionCheck/valid/configured-denied.json +9 -0
  190. package/fixtures/openapi/KubernetesAgentActionProfile/invalid/wildcard.json +1 -0
  191. package/fixtures/openapi/KubernetesAgentActionProfile/valid/workbench.json +1 -0
  192. package/fixtures/openapi/KubernetesClusterRegistrationRequest/invalid/action-profile.json +3 -0
  193. package/fixtures/openapi/KubernetesClusterRegistrationRequest/valid/action-profile.json +5 -0
  194. package/fixtures/openapi/KubernetesNodeListEnvelope/invalid/condition-status-boolean.json +17 -0
  195. package/fixtures/openapi/KubernetesNodeListEnvelope/invalid/taint-effect-missing.json +16 -0
  196. package/fixtures/openapi/KubernetesNodeListEnvelope/valid/legacy-fields-absent.json +11 -0
  197. package/fixtures/openapi/KubernetesNodeListEnvelope/valid/no-taints.json +13 -0
  198. package/fixtures/openapi/KubernetesNodeListEnvelope/valid/ready-cordoned-tainted.json +28 -0
  199. package/fixtures/openapi/KubernetesNodeListEnvelope/valid/unknown-fields-null.json +13 -0
  200. package/fixtures/openapi/KubernetesResourceUpdatePlanRequest/invalid/missing-required.json +1 -0
  201. package/fixtures/openapi/KubernetesResourceYaml/invalid/missing-required.json +1 -0
  202. package/fixtures/openapi/KubernetesTopologyCoverage/invalid/empty-as-success.json +5 -0
  203. package/fixtures/openapi/KubernetesTopologyCoverage/valid/not-installed.json +6 -0
  204. package/fixtures/openapi/KubernetesTopologyGraphEdge/invalid/negative-weight.json +8 -0
  205. package/fixtures/openapi/KubernetesTopologyGraphEdge/valid/zero-weight.json +20 -0
  206. package/fixtures/openapi/KubernetesTopologyGraphNode/invalid/fake-flow-kind.json +42 -0
  207. package/fixtures/openapi/KubernetesTopologyGraphNode/valid/rule.json +42 -0
  208. package/fixtures/openapi/KubernetesTopologySnapshot/invalid/raw-source-field.json +33 -0
  209. package/fixtures/openapi/KubernetesTopologySnapshot/valid/projected-source.json +32 -0
  210. package/fixtures/openapi/KubernetesTopologySnapshotRequest/invalid/arbitrary-gvr.json +8 -0
  211. package/fixtures/openapi/KubernetesTopologySnapshotRequest/valid/bounded-sources.json +11 -0
  212. package/fixtures/openapi/KubernetesTopologySourceQuery/invalid/cluster-namespace.json +4 -0
  213. package/fixtures/openapi/KubernetesTopologySourceQuery/valid/all-namespaces.json +4 -0
  214. package/fixtures/openapi/ObservabilityDataSource/invalid/missing-required.json +1 -0
  215. package/fixtures/openapi/PersonalAgentAccess/invalid/invalid.json +1 -0
  216. package/fixtures/openapi/PersonalAgentAccess/valid/valid.json +1 -0
  217. package/fixtures/openapi/PersonalAgentAccessDecision/invalid/invalid.json +1 -0
  218. package/fixtures/openapi/PersonalAgentAccessDecision/valid/valid.json +1 -0
  219. package/fixtures/openapi/PersonalAssistantArtifactListEnvelope/invalid/owner.json +8 -0
  220. package/fixtures/openapi/PersonalAssistantArtifactListEnvelope/valid/side-chat.json +9 -0
  221. package/fixtures/openapi/PersonalAssistantAvatarRequest/invalid/motion.json +1 -0
  222. package/fixtures/openapi/PersonalAssistantAvatarRequest/invalid/owner.json +1 -0
  223. package/fixtures/openapi/PersonalAssistantAvatarRequest/invalid/remote.json +1 -0
  224. package/fixtures/openapi/PersonalAssistantAvatarRequest/invalid/svg.json +1 -0
  225. package/fixtures/openapi/PersonalAssistantAvatarRequest/valid/raster.json +1 -0
  226. package/fixtures/openapi/PersonalAssistantAvatarRequest/valid/reset.json +1 -0
  227. package/fixtures/openapi/PersonalAssistantUpdateRequest/invalid/empty.json +1 -0
  228. package/fixtures/openapi/PersonalAssistantUpdateRequest/invalid/owner.json +1 -0
  229. package/fixtures/openapi/PersonalAssistantUpdateRequest/valid/name.json +1 -0
  230. package/fixtures/openapi/PersonalDockerEnvironmentPolicy/invalid/host-url.json +12 -0
  231. package/fixtures/openapi/PersonalDockerEnvironmentPolicy/invalid/lifetime.json +11 -0
  232. package/fixtures/openapi/PersonalDockerEnvironmentPolicy/invalid/unknown-agent.json +11 -0
  233. package/fixtures/openapi/PersonalDockerEnvironmentPolicy/valid/basic.json +11 -0
  234. package/fixtures/openapi/PersonalEnvironment/invalid/invented-state.json +6 -0
  235. package/fixtures/openapi/PersonalEnvironment/invalid/missing-state.json +5 -0
  236. package/fixtures/openapi/PersonalEnvironment/invalid/negative-generation.json +7 -0
  237. package/fixtures/openapi/PersonalEnvironment/invalid/network.json +23 -0
  238. package/fixtures/openapi/PersonalEnvironment/invalid/private-node.json +24 -0
  239. package/fixtures/openapi/PersonalEnvironment/invalid/unsupported-backend.json +7 -0
  240. package/fixtures/openapi/PersonalEnvironment/valid/deleted.json +23 -0
  241. package/fixtures/openapi/PersonalEnvironment/valid/deleting.json +23 -0
  242. package/fixtures/openapi/PersonalEnvironment/valid/deletion_unknown.json +23 -0
  243. package/fixtures/openapi/PersonalEnvironment/valid/frozen-binding.json +13 -0
  244. package/fixtures/openapi/PersonalEnvironment/valid/ready.json +23 -0
  245. package/fixtures/openapi/PersonalEnvironment/valid/unknown.json +23 -0
  246. package/fixtures/openapi/PersonalEnvironment/valid/unprovisioned.json +6 -0
  247. package/fixtures/openapi/PersonalEnvironmentActionRequest/invalid/command.json +3 -0
  248. package/fixtures/openapi/PersonalEnvironmentActionRequest/invalid/node.json +4 -0
  249. package/fixtures/openapi/PersonalEnvironmentActionRequest/invalid/owner.json +4 -0
  250. package/fixtures/openapi/PersonalEnvironmentActionRequest/invalid/quota.json +10 -0
  251. package/fixtures/openapi/PersonalEnvironmentActionRequest/valid/reconcile.json +3 -0
  252. package/fixtures/openapi/PersonalEnvironmentActionRequest/valid/sleep.json +3 -0
  253. package/fixtures/openapi/PersonalEnvironmentActionRequest/valid/wake.json +4 -0
  254. package/fixtures/openapi/PersonalEnvironmentDataDeletionRequest/invalid/empty-name.json +5 -0
  255. package/fixtures/openapi/PersonalEnvironmentDataDeletionRequest/invalid/long-name.json +5 -0
  256. package/fixtures/openapi/PersonalEnvironmentDataDeletionRequest/invalid/missing-name.json +4 -0
  257. package/fixtures/openapi/PersonalEnvironmentDataDeletionRequest/invalid/owner.json +6 -0
  258. package/fixtures/openapi/PersonalEnvironmentDataDeletionRequest/invalid/stale-version.json +5 -0
  259. package/fixtures/openapi/PersonalEnvironmentDataDeletionRequest/valid/confirmed.json +5 -0
  260. package/fixtures/openapi/PersonalEnvironmentDataExportRequest/invalid/assistantId.json +4 -0
  261. package/fixtures/openapi/PersonalEnvironmentDataExportRequest/invalid/environmentVersion.json +4 -0
  262. package/fixtures/openapi/PersonalEnvironmentDataExportRequest/invalid/ownerId.json +5 -0
  263. package/fixtures/openapi/PersonalEnvironmentDataExportRequest/valid/current.json +4 -0
  264. package/fixtures/openapi/PersonalEnvironmentEnvelope/invalid/missing-data.json +1 -0
  265. package/fixtures/openapi/PersonalEnvironmentEnvelope/valid/state.json +8 -0
  266. package/fixtures/openapi/PersonalEnvironmentQuota/invalid/cpu.json +7 -0
  267. package/fixtures/openapi/PersonalEnvironmentQuota/invalid/disk.json +7 -0
  268. package/fixtures/openapi/PersonalEnvironmentQuota/invalid/network.json +7 -0
  269. package/fixtures/openapi/PersonalEnvironmentQuota/invalid/processes.json +7 -0
  270. package/fixtures/openapi/PersonalEnvironmentQuota/valid/basic.json +7 -0
  271. package/fixtures/openapi/PersonalEnvironmentTemplate/invalid/mode.json +13 -0
  272. package/fixtures/openapi/PersonalEnvironmentTemplate/invalid/network.json +13 -0
  273. package/fixtures/openapi/PersonalEnvironmentTemplate/invalid/node.json +14 -0
  274. package/fixtures/openapi/PersonalEnvironmentTemplate/valid/template.json +13 -0
  275. package/fixtures/openapi/PersonalEnvironmentTemplateListEnvelope/invalid/missing.json +1 -0
  276. package/fixtures/openapi/PersonalEnvironmentTemplateListEnvelope/invalid/unbounded.json +1317 -0
  277. package/fixtures/openapi/PersonalEnvironmentTemplateListEnvelope/valid/choices.json +17 -0
  278. package/fixtures/openapi/PersonalEnvironmentTemplateListEnvelope/valid/empty.json +3 -0
  279. package/fixtures/openapi/PersonalEnvironmentUsage/invalid/negative.json +6 -0
  280. package/fixtures/openapi/PersonalEnvironmentUsage/valid/usage.json +6 -0
  281. package/fixtures/openapi/PersonalFeedFeedback/invalid/owner.json +4 -0
  282. package/fixtures/openapi/PersonalFeedFeedback/valid/liked.json +3 -0
  283. package/fixtures/openapi/PersonalFeedItem/invalid/no-source.json +9 -0
  284. package/fixtures/openapi/PersonalFeedItem/valid/post.json +15 -0
  285. package/fixtures/openapi/PersonalFeedSettings/invalid/owner.json +6 -0
  286. package/fixtures/openapi/PersonalFeedSettings/valid/default.json +5 -0
  287. package/fixtures/openapi/PersonalGuestPreparationInput/invalid/foreign-owner.json +5 -0
  288. package/fixtures/openapi/PersonalGuestPreparationInput/invalid/unsafe-counter.json +4 -0
  289. package/fixtures/openapi/PersonalGuestPreparationInput/valid/ed25519-csr.json +4 -0
  290. package/fixtures/openapi/PersonalGuestRuntimeEnvelope/invalid/minimal.json +10 -0
  291. package/fixtures/openapi/PersonalGuestRuntimeEnvelope/valid/minimal.json +9 -0
  292. package/fixtures/openapi/PersonalGuestRuntimeInput/invalid/minimal.json +6 -0
  293. package/fixtures/openapi/PersonalGuestRuntimeInput/valid/minimal.json +8 -0
  294. package/fixtures/openapi/PersonalGuestToolsInput/invalid/minimal.json +5 -0
  295. package/fixtures/openapi/PersonalGuestToolsInput/valid/minimal.json +4 -0
  296. package/fixtures/openapi/PersonalVMEnvironmentPolicy/invalid/device.json +15 -0
  297. package/fixtures/openapi/PersonalVMEnvironmentPolicy/invalid/fractional-size.json +15 -0
  298. package/fixtures/openapi/PersonalVMEnvironmentPolicy/invalid/network.json +15 -0
  299. package/fixtures/openapi/PersonalVMEnvironmentPolicy/invalid/owner.json +15 -0
  300. package/fixtures/openapi/PersonalVMEnvironmentPolicy/invalid/provider.json +15 -0
  301. package/fixtures/openapi/PersonalVMEnvironmentPolicy/invalid/unknown.json +16 -0
  302. package/fixtures/openapi/PersonalVMEnvironmentPolicy/valid/pve.json +15 -0
  303. package/fixtures/openapi/PersonalWorkspaceRuntime/invalid/shared.json +3 -0
  304. package/fixtures/openapi/PersonalWorkspaceRuntime/valid/shared.json +4 -0
  305. package/fixtures/openapi/PersonalWorkspaceRuntimeEnvelope/invalid/shared.json +5 -0
  306. package/fixtures/openapi/PersonalWorkspaceRuntimeEnvelope/valid/shared.json +6 -0
  307. package/fixtures/openapi/ResourceMonitoringPanel/invalid/unknown-quality.json +7 -0
  308. package/fixtures/openapi/ResourceMonitoringPanel/valid/not-collected.json +7 -0
  309. package/fixtures/openapi/ResourceMonitoringPoint/invalid/string-zero.json +4 -0
  310. package/fixtures/openapi/ResourceMonitoringPoint/valid/missing.json +4 -0
  311. package/fixtures/openapi/ResourceMonitoringPoint/valid/zero.json +4 -0
  312. package/fixtures/openapi/ResourceMonitoringView/invalid/raw-query.json +12 -0
  313. package/fixtures/openapi/ResourceMonitoringView/valid/unconfigured.json +12 -0
  314. package/fixtures/openapi/SecretGenerateSSHKeyRequest/invalid/task51.json +6 -0
  315. package/fixtures/openapi/SecretGenerateSSHKeyRequest/valid/task51.json +12 -0
  316. package/fixtures/openapi/SecretReferenceUsage/invalid/version.json +6 -0
  317. package/fixtures/openapi/SecretReferenceUsage/valid/version.json +8 -0
  318. package/fixtures/openapi/VMSSHCredentialRedemptionInput/invalid/task51.json +7 -0
  319. package/fixtures/openapi/VMSSHCredentialRedemptionInput/valid/task51.json +6 -0
  320. package/fixtures/openapi/VirtualMachineAccessBindingInput/invalid/task51.json +10 -0
  321. package/fixtures/openapi/VirtualMachineAccessBindingInput/valid/task51.json +10 -0
  322. package/fixtures/openapi/VirtualMachineActionInput/invalid/capacity-not-boolean.json +1 -0
  323. package/fixtures/openapi/VirtualMachineActionInput/valid/new-data-with-admission.json +1 -0
  324. package/fixtures/openapi/VirtualMachineCreateInput/valid/cloud-image.json +12 -0
  325. package/fixtures/openapi/VirtualMachineDiskChange/invalid/serial-config-injection.json +1 -0
  326. package/fixtures/openapi/VirtualMachineDiskChange/invalid/serial-existing-disk.json +1 -0
  327. package/fixtures/openapi/VirtualMachineDiskChange/invalid/serial-too-long.json +1 -0
  328. package/fixtures/openapi/VirtualMachineDiskChange/valid/personal-data.json +1 -0
  329. package/fixtures/openapi/VirtualMachineGuestAccessInput/invalid/task51.json +4 -0
  330. package/fixtures/openapi/VirtualMachineGuestAccessInput/valid/task51.json +6 -0
  331. package/fixtures/openapi/VirtualMachineSSHCommand/invalid/task51.json +9 -0
  332. package/fixtures/openapi/VirtualMachineSSHCommand/valid/task51.json +8 -0
  333. package/fixtures/openapi/VirtualMachineSSHCommandInput/invalid/task51.json +5 -0
  334. package/fixtures/openapi/VirtualMachineSSHCommandInput/valid/task51.json +5 -0
  335. package/fixtures/openapi/VirtualMachineSSHFrame/invalid/encoding.json +5 -0
  336. package/fixtures/openapi/VirtualMachineSSHFrame/invalid/task51.json +4 -0
  337. package/fixtures/openapi/VirtualMachineSSHFrame/valid/binary.json +5 -0
  338. package/fixtures/openapi/VirtualMachineSSHFrame/valid/task51.json +5 -0
  339. package/fixtures/openapi/VirtualMachineSSHSessionInput/invalid/task51.json +4 -0
  340. package/fixtures/openapi/VirtualMachineSSHSessionInput/valid/task51.json +5 -0
  341. package/fixtures/openapi/VirtualizationCapacityPolicyInput/invalid/task51.json +12 -0
  342. package/fixtures/openapi/VirtualizationCapacityPolicyInput/valid/task51.json +13 -0
  343. package/fixtures/openapi/VirtualizationImageInput/invalid/cloud-image-config-type.json +6 -0
  344. package/fixtures/openapi/VirtualizationImageInput/valid/cloud-image.json +11 -0
  345. package/fixtures/openapi/WorkbenchAssistantTask/invalid/kind.json +1 -0
  346. package/fixtures/openapi/WorkbenchAssistantTask/invalid/owner.json +1 -0
  347. package/fixtures/openapi/WorkbenchAssistantTask/valid/generate.json +1 -0
  348. package/fixtures/openapi/WorkbenchAssistantTask/valid/undo.json +1 -0
  349. package/fixtures/openapi/WorkbenchContextSelection/invalid/remote-image.json +1 -0
  350. package/fixtures/openapi/WorkbenchContextSelection/invalid/too-many-images.json +1 -0
  351. package/fixtures/openapi/WorkbenchContextSelection/valid/chat-image.json +9 -0
  352. package/fixtures/openapi/WorkbenchContextUsage/invalid/fractional-capacity.json +1 -0
  353. package/fixtures/openapi/WorkbenchContextUsage/invalid/negative.json +1 -0
  354. package/fixtures/openapi/WorkbenchContextUsage/valid/reported.json +1 -0
  355. package/fixtures/openapi/WorkbenchContextUsage/valid/unknown.json +1 -0
  356. package/fixtures/openapi/WorkbenchMainSessionRequest/invalid/owner.json +1 -0
  357. package/fixtures/openapi/WorkbenchMainSessionRequest/invalid/provider.json +1 -0
  358. package/fixtures/openapi/WorkbenchMainSessionRequest/valid/empty.json +1 -0
  359. package/fixtures/openapi/WorkbenchMainSessionRequest/valid/provider.json +1 -0
  360. package/fixtures/openapi/WorkbenchMessageSearchPage/invalid/role.json +12 -0
  361. package/fixtures/openapi/WorkbenchMessageSearchPage/valid/page.json +12 -0
  362. package/fixtures/openapi/WorkbenchMessageWindow/invalid/missing.json +1 -0
  363. package/fixtures/openapi/WorkbenchMessageWindow/valid/empty.json +3 -0
  364. package/fixtures/openapi/WorkbenchModelOption/invalid/zero-capacity.json +1 -0
  365. package/fixtures/openapi/WorkbenchModelOption/valid/capacity.json +1 -0
  366. package/fixtures/openapi/WorkbenchModelOption/valid/unknown.json +1 -0
  367. package/fixtures/openapi/WorkbenchProfessionalCapabilityInput/invalid/basic.json +7 -0
  368. package/fixtures/openapi/WorkbenchProfessionalCapabilityInput/valid/basic.json +11 -0
  369. package/fixtures/openapi/WorkbenchProfessionalCapabilityInput/valid/selected-profile.json +23 -0
  370. package/fixtures/openapi/WorkbenchSendMessageStreamRequest/invalid/missing-required.json +1 -0
  371. package/fixtures/openapi/WorkbenchSendMessageStreamRequest/valid/mixed-professional-task.json +22 -0
  372. package/fixtures/openapi/WorkbenchTaskIntent/invalid/basic.json +5 -0
  373. package/fixtures/openapi/WorkbenchTaskIntent/invalid/oversized-capability-source.json +3 -0
  374. package/fixtures/openapi/WorkbenchTaskIntent/valid/basic.json +9 -0
  375. package/fixtures/openapi/WorkbenchTaskIntent/valid/independent-sources.json +17 -0
  376. package/gen/go/sohaapi/client.go +1 -1
  377. package/gen/go/sohaapi/kubernetes_monitoring_test.go +67 -0
  378. package/gen/go/sohaapi/personal_environment_test.go +25 -0
  379. package/gen/go/sohaapi/types.go +3460 -433
  380. package/gen/go/sohaapi/vm_disk_test.go +21 -0
  381. package/gen/ts/sohaapi/index.ts +5454 -1397
  382. package/go.mod +61 -49
  383. package/go.sum +202 -176
  384. package/knowledge/connector-definition.schema.json +6 -1
  385. package/knowledge/source-import-policy.schema.json +32 -0
  386. package/memory/memory-record.schema.json +1 -1
  387. package/openapi/soha-api.json +24199 -16810
  388. package/openapi/soha-api.yaml +2537 -14
  389. package/openapi/spec_generated.go +3 -3
  390. package/openapi/spec_test.go +34 -0
  391. package/package.json +19 -3
  392. package/resource/agent_access.go +12 -0
  393. package/resource/agent_profiles.go +62 -0
  394. package/resource/agent_profiles_test.go +36 -0
  395. package/resource/kubernetes_kinds.go +73 -0
  396. package/resource/kubernetes_kinds_test.go +38 -0
  397. package/resource/models.go +23 -14
  398. package/resource/network_topology.go +166 -0
  399. package/resource/network_topology_projection.go +208 -0
  400. package/resource/network_topology_projection_test.go +53 -0
  401. package/resource/network_topology_test.go +51 -0
  402. package/resource/network_topology_validation.go +29 -0
  403. package/resource/node_drain.go +34 -0
  404. package/resource/resource_monitoring.go +99 -0
  405. package/resource/runtime/network_topology.go +232 -0
  406. package/resource/runtime/network_topology_test.go +62 -0
  407. package/resource/runtime/node_drain.go +124 -0
  408. package/resource/runtime/node_drain_test.go +95 -0
  409. package/resource/runtime/resource_edit.go +128 -0
  410. package/resource/runtime/resource_edit_test.go +183 -0
  411. package/resource/runtime/resource_monitoring.go +243 -0
  412. package/resource/runtime/resource_monitoring_test.go +88 -0
  413. /package/fixtures/openapi/DeliveryExecutionHistoryPage/{invalid-kind.json → invalid/invalid-kind.json} +0 -0
  414. /package/fixtures/openapi/DeliveryExecutionHistoryPage/{valid-build.json → valid/valid-build.json} +0 -0
  415. /package/fixtures/openapi/DeliveryExecutionHistoryPage/{valid-empty.json → valid/valid-empty.json} +0 -0
@@ -1,7 +1,7 @@
1
1
  openapi: 3.1.0
2
2
  info:
3
3
  title: Soha API
4
- version: 0.1.23
4
+ version: 0.1.25
5
5
  description: >
6
6
  Public OpenSoha core API contract. This first contract focuses on stable
7
7
  cross-repository boundaries: auth, health, runner-facing control-plane
@@ -5366,6 +5366,307 @@ paths:
5366
5366
  application/json:
5367
5367
  schema:
5368
5368
  $ref: "#/components/schemas/ExecutionTaskEnvelope"
5369
+ /virtualization/clusters/{connectionID}/capacity-policy:
5370
+ get:
5371
+ tags: [Virtualization]
5372
+ operationId: getVirtualizationCapacityPolicy
5373
+ x-soha-implementation-status: implemented
5374
+ parameters:
5375
+ - { name: connectionID, in: path, required: true, schema: { type: string } }
5376
+ responses:
5377
+ "200":
5378
+ description: Successful operation.
5379
+ content:
5380
+ application/json:
5381
+ schema: { $ref: "#/components/schemas/VirtualizationCapacityPolicyEnvelope" }
5382
+ "400": { $ref: "#/components/responses/Error" }
5383
+ "403": { $ref: "#/components/responses/Error" }
5384
+ "404": { $ref: "#/components/responses/Error" }
5385
+ "409": { $ref: "#/components/responses/Error" }
5386
+ put:
5387
+ tags: [Virtualization]
5388
+ operationId: updateVirtualizationCapacityPolicy
5389
+ x-soha-implementation-status: implemented
5390
+ parameters:
5391
+ - { name: connectionID, in: path, required: true, schema: { type: string } }
5392
+ requestBody:
5393
+ required: true
5394
+ content:
5395
+ application/json:
5396
+ schema: { $ref: "#/components/schemas/VirtualizationCapacityPolicyInput" }
5397
+ responses:
5398
+ "200":
5399
+ description: Successful operation.
5400
+ content:
5401
+ application/json:
5402
+ schema: { $ref: "#/components/schemas/VirtualizationCapacityPolicyEnvelope" }
5403
+ "400": { $ref: "#/components/responses/Error" }
5404
+ "403": { $ref: "#/components/responses/Error" }
5405
+ "404": { $ref: "#/components/responses/Error" }
5406
+ "409": { $ref: "#/components/responses/Error" }
5407
+ /virtualization/vms/{vmID}/access-binding:
5408
+ get:
5409
+ tags: [Virtualization]
5410
+ operationId: getVirtualMachineAccessBinding
5411
+ x-soha-implementation-status: implemented
5412
+ parameters:
5413
+ - { name: vmID, in: path, required: true, schema: { type: string } }
5414
+ responses:
5415
+ "200":
5416
+ description: Successful operation.
5417
+ content:
5418
+ application/json:
5419
+ schema: { $ref: "#/components/schemas/VirtualMachineAccessBindingEnvelope" }
5420
+ "400": { $ref: "#/components/responses/Error" }
5421
+ "403": { $ref: "#/components/responses/Error" }
5422
+ "404": { $ref: "#/components/responses/Error" }
5423
+ "409": { $ref: "#/components/responses/Error" }
5424
+ put:
5425
+ tags: [Virtualization]
5426
+ operationId: updateVirtualMachineAccessBinding
5427
+ x-soha-implementation-status: implemented
5428
+ parameters:
5429
+ - { name: vmID, in: path, required: true, schema: { type: string } }
5430
+ requestBody:
5431
+ required: true
5432
+ content:
5433
+ application/json:
5434
+ schema: { $ref: "#/components/schemas/VirtualMachineAccessBindingInput" }
5435
+ responses:
5436
+ "200":
5437
+ description: Successful operation.
5438
+ content:
5439
+ application/json:
5440
+ schema: { $ref: "#/components/schemas/VirtualMachineAccessBindingEnvelope" }
5441
+ "400": { $ref: "#/components/responses/Error" }
5442
+ "403": { $ref: "#/components/responses/Error" }
5443
+ "404": { $ref: "#/components/responses/Error" }
5444
+ "409": { $ref: "#/components/responses/Error" }
5445
+ /virtualization/vms/{vmID}/ssh-sessions:
5446
+ post:
5447
+ tags: [Virtualization]
5448
+ operationId: createVirtualMachineSSHSession
5449
+ x-soha-implementation-status: implemented
5450
+ parameters:
5451
+ - { name: vmID, in: path, required: true, schema: { type: string } }
5452
+ requestBody:
5453
+ required: true
5454
+ content:
5455
+ application/json:
5456
+ schema: { $ref: "#/components/schemas/VirtualMachineSSHSessionInput" }
5457
+ responses:
5458
+ "200":
5459
+ description: Successful operation.
5460
+ content:
5461
+ application/json:
5462
+ schema: { $ref: "#/components/schemas/VirtualMachineSSHSessionEnvelope" }
5463
+ "400": { $ref: "#/components/responses/Error" }
5464
+ "403": { $ref: "#/components/responses/Error" }
5465
+ "404": { $ref: "#/components/responses/Error" }
5466
+ "409": { $ref: "#/components/responses/Error" }
5467
+ /virtualization/vms/{vmID}/ssh-commands:
5468
+ post:
5469
+ tags: [Virtualization]
5470
+ operationId: createVirtualMachineSSHCommand
5471
+ x-soha-implementation-status: implemented
5472
+ parameters:
5473
+ - { name: vmID, in: path, required: true, schema: { type: string } }
5474
+ requestBody:
5475
+ required: true
5476
+ content:
5477
+ application/json:
5478
+ schema: { $ref: "#/components/schemas/VirtualMachineSSHCommandInput" }
5479
+ responses:
5480
+ "200":
5481
+ description: Successful operation.
5482
+ content:
5483
+ application/json:
5484
+ schema: { $ref: "#/components/schemas/VirtualMachineSSHCommandEnvelope" }
5485
+ "400": { $ref: "#/components/responses/Error" }
5486
+ "403": { $ref: "#/components/responses/Error" }
5487
+ "404": { $ref: "#/components/responses/Error" }
5488
+ "409": { $ref: "#/components/responses/Error" }
5489
+ /virtualization/ssh-commands/{commandID}:
5490
+ parameters:
5491
+ - { name: commandID, in: path, required: true, schema: { type: string } }
5492
+ get:
5493
+ tags: [Virtualization]
5494
+ operationId: getVMSSHCommand
5495
+ x-soha-implementation-status: implemented
5496
+ responses:
5497
+ "200":
5498
+ description: Original owner's bounded command receipt under current VM permission.
5499
+ content:
5500
+ application/json:
5501
+ schema: { $ref: "#/components/schemas/VirtualMachineSSHCommandEnvelope" }
5502
+ "403": { $ref: "#/components/responses/Error" }
5503
+ delete:
5504
+ tags: [Virtualization]
5505
+ operationId: cancelVMSSHCommand
5506
+ x-soha-implementation-status: implemented
5507
+ responses:
5508
+ "200":
5509
+ description: Cancellation fences the original task. Dispatched effects remain unknown until independently verified.
5510
+ content:
5511
+ application/json:
5512
+ schema: { $ref: "#/components/schemas/VirtualMachineSSHCommandEnvelope" }
5513
+ "403": { $ref: "#/components/responses/Error" }
5514
+ /virtualization/ssh-sessions/{sessionID}/execution-status:
5515
+ post:
5516
+ tags: [Agent]
5517
+ operationId: checkVMSSHCommandAuthorization
5518
+ x-soha-implementation-status: implemented
5519
+ parameters:
5520
+ - { name: sessionID, in: path, required: true, schema: { type: string } }
5521
+ description: Bound execution Agent rechecks current owner, approval, VM identity and lease before and during a command. Returns no command or credential material.
5522
+ requestBody:
5523
+ required: true
5524
+ content:
5525
+ application/json:
5526
+ schema: { $ref: "#/components/schemas/VMSSHCredentialRedemptionInput" }
5527
+ responses:
5528
+ "200":
5529
+ description: Authorization and original task remain active.
5530
+ content:
5531
+ application/json:
5532
+ schema: { $ref: "#/components/schemas/VirtualMachineSSHCommandEnvelope" }
5533
+ "400": { $ref: "#/components/responses/Error" }
5534
+ "403": { $ref: "#/components/responses/Error" }
5535
+ "404": { $ref: "#/components/responses/Error" }
5536
+ "409": { $ref: "#/components/responses/Error" }
5537
+ /virtualization/ssh-sessions/{sessionID}:
5538
+ get:
5539
+ tags: [Virtualization]
5540
+ operationId: getVirtualMachineSSHSession
5541
+ x-soha-implementation-status: implemented
5542
+ parameters:
5543
+ - { name: sessionID, in: path, required: true, schema: { type: string } }
5544
+ responses:
5545
+ "200":
5546
+ description: Successful operation.
5547
+ content:
5548
+ application/json:
5549
+ schema: { $ref: "#/components/schemas/VirtualMachineSSHSessionEnvelope" }
5550
+ "400": { $ref: "#/components/responses/Error" }
5551
+ "403": { $ref: "#/components/responses/Error" }
5552
+ "404": { $ref: "#/components/responses/Error" }
5553
+ "409": { $ref: "#/components/responses/Error" }
5554
+ delete:
5555
+ tags: [Virtualization]
5556
+ operationId: closeVirtualMachineSSHSession
5557
+ x-soha-implementation-status: implemented
5558
+ parameters:
5559
+ - { name: sessionID, in: path, required: true, schema: { type: string } }
5560
+ responses:
5561
+ "200":
5562
+ description: Successful operation.
5563
+ content:
5564
+ application/json:
5565
+ schema: { $ref: "#/components/schemas/VirtualMachineSSHSessionEnvelope" }
5566
+ "400": { $ref: "#/components/responses/Error" }
5567
+ "403": { $ref: "#/components/responses/Error" }
5568
+ "404": { $ref: "#/components/responses/Error" }
5569
+ "409": { $ref: "#/components/responses/Error" }
5570
+ /virtualization/ssh-sessions/{sessionID}/stream:
5571
+ get:
5572
+ tags: [Virtualization]
5573
+ operationId: streamVirtualMachineSSHSession
5574
+ x-soha-implementation-status: implemented
5575
+ description: Origin-bound, one-use authenticated WebSocket stream of VirtualMachineSSHFrame messages. Maximum lifetime is 30 minutes; idle timeout is 5 minutes. Private keys remain on the execution Agent.
5576
+ parameters:
5577
+ - { name: sessionID, in: path, required: true, schema: { type: string } }
5578
+ - { name: stream_ticket, in: query, required: false, schema: { type: string }, description: One-use browser stream ticket scoped to this session. CLI clients use bearer authentication. }
5579
+ responses:
5580
+ "101":
5581
+ description: WebSocket upgraded; JSON messages use this schema.
5582
+ content:
5583
+ application/json:
5584
+ schema: { $ref: "#/components/schemas/VirtualMachineSSHFrame" }
5585
+ "403": { $ref: "#/components/responses/Error" }
5586
+ "409": { $ref: "#/components/responses/Error" }
5587
+ /ssh/capability:
5588
+ get:
5589
+ tags: [Agent]
5590
+ operationId: getAgentSSHCapability
5591
+ x-soha-implementation-status: implemented
5592
+ description: Standalone Agent route /api/v1/ssh/capability; requires its configured bearer token.
5593
+ responses:
5594
+ "200":
5595
+ description: SSH execution capability.
5596
+ content:
5597
+ application/json:
5598
+ schema: { $ref: "#/components/schemas/AgentSSHCapability" }
5599
+ "403": { $ref: "#/components/responses/Error" }
5600
+ /ssh/sessions:
5601
+ post:
5602
+ tags: [Agent]
5603
+ operationId: prepareAgentSSHSession
5604
+ x-soha-implementation-status: implemented
5605
+ description: Standalone Agent route /api/v1/ssh/sessions; stages a one-use request for its session WebSocket.
5606
+ requestBody:
5607
+ required: true
5608
+ content:
5609
+ application/json:
5610
+ schema: { $ref: "#/components/schemas/AgentSSHSessionRequest" }
5611
+ responses:
5612
+ "200": { description: Session staged. }
5613
+ "403": { $ref: "#/components/responses/Error" }
5614
+ /ssh/sessions/{sessionID}/stream:
5615
+ get:
5616
+ tags: [Agent]
5617
+ operationId: streamAgentSSHSession
5618
+ x-soha-implementation-status: implemented
5619
+ description: Agent bearer authentication. Each staged session can be claimed once.
5620
+ parameters:
5621
+ - { name: sessionID, in: path, required: true, schema: { type: string } }
5622
+ responses:
5623
+ "101":
5624
+ description: Authorized SSH PTY byte stream.
5625
+ content:
5626
+ application/json:
5627
+ schema: { $ref: "#/components/schemas/VirtualMachineSSHFrame" }
5628
+ "403": { $ref: "#/components/responses/Error" }
5629
+ "409": { $ref: "#/components/responses/Error" }
5630
+ /virtualization/ssh-sessions/{sessionID}/credentials:
5631
+ post:
5632
+ tags: [Virtualization]
5633
+ operationId: redeemVMSSHCredentials
5634
+ x-soha-implementation-status: implemented
5635
+ description: Execution Agent bearer authentication plus one-use lease, session and Agent identity checks. No human or model credential read endpoint.
5636
+ parameters:
5637
+ - { name: sessionID, in: path, required: true, schema: { type: string } }
5638
+ requestBody:
5639
+ required: true
5640
+ content:
5641
+ application/json:
5642
+ schema: { $ref: "#/components/schemas/VMSSHCredentialRedemptionInput" }
5643
+ responses:
5644
+ "200":
5645
+ description: In-memory Agent credential material.
5646
+ content:
5647
+ application/json:
5648
+ schema: { $ref: "#/components/schemas/SecretLeaseRedemptionEnvelope" }
5649
+ "403": { $ref: "#/components/responses/Error" }
5650
+ /secrets/generate-ssh-key:
5651
+ post:
5652
+ tags: [Secrets]
5653
+ operationId: generateSecretSSHKey
5654
+ x-soha-implementation-status: implemented
5655
+ requestBody:
5656
+ required: true
5657
+ content:
5658
+ application/json:
5659
+ schema: { $ref: "#/components/schemas/SecretGenerateSSHKeyRequest" }
5660
+ responses:
5661
+ "200":
5662
+ description: Successful operation.
5663
+ content:
5664
+ application/json:
5665
+ schema: { $ref: "#/components/schemas/SecretMetadataEnvelope" }
5666
+ "400": { $ref: "#/components/responses/Error" }
5667
+ "403": { $ref: "#/components/responses/Error" }
5668
+ "404": { $ref: "#/components/responses/Error" }
5669
+ "409": { $ref: "#/components/responses/Error" }
5369
5670
  /virtualization/clusters:
5370
5671
  get:
5371
5672
  tags: [Virtualization]
@@ -6607,6 +6908,71 @@ paths:
6607
6908
  $ref: "#/components/responses/Error"
6608
6909
  "404":
6609
6910
  $ref: "#/components/responses/Error"
6911
+ /copilot/sessions/{sessionID}/native-request:
6912
+ get:
6913
+ tags: [AI Workbench]
6914
+ operationId: findNativeRequest
6915
+ description: Read the original Native run by the current user's session and client request ID after a lost creation response. This never creates or resumes a run. A 404 is only absence at the time of the read and does not prove that an in-flight submission cannot commit later.
6916
+ parameters:
6917
+ - $ref: "#/components/parameters/SessionID"
6918
+ - name: requestId
6919
+ in: query
6920
+ required: true
6921
+ schema: { type: string, minLength: 1, maxLength: 128 }
6922
+ responses:
6923
+ "200":
6924
+ description: The original authorized Native run, including its current state.
6925
+ content:
6926
+ application/json:
6927
+ schema: { $ref: "#/components/schemas/WorkbenchAgentRunEnvelope" }
6928
+ "400":
6929
+ $ref: "#/components/responses/Error"
6930
+ "403":
6931
+ $ref: "#/components/responses/Error"
6932
+ "404":
6933
+ $ref: "#/components/responses/Error"
6934
+ /copilot/agent-runs/{runID}/events:
6935
+ get:
6936
+ tags: [AI Workbench]
6937
+ operationId: listAgentRunEvents
6938
+ description: Read durable Native events owned by the current user. Reconnection only reads; it never resubmits a run or action.
6939
+ parameters:
6940
+ - { name: runID, in: path, required: true, schema: { type: string, minLength: 1 } }
6941
+ - { name: afterSequence, in: query, schema: { type: integer, minimum: 0, default: 0 } }
6942
+ responses:
6943
+ "200":
6944
+ description: Ordered events and the next cursor.
6945
+ content:
6946
+ application/json:
6947
+ schema: { $ref: "#/components/schemas/AgentRunEventListEnvelope" }
6948
+ "403":
6949
+ $ref: "#/components/responses/Error"
6950
+ "404":
6951
+ $ref: "#/components/responses/Error"
6952
+ /copilot/agent-runs/{runID}/resume:
6953
+ post:
6954
+ tags: [AI Workbench]
6955
+ operationId: resumeAgentRun
6956
+ description: Resume the same paused Native run after current authorization and waiting-object checks. Unknown write outcomes cannot be replayed by this operation.
6957
+ parameters:
6958
+ - { name: runID, in: path, required: true, schema: { type: string, minLength: 1 } }
6959
+ requestBody:
6960
+ required: true
6961
+ content:
6962
+ application/json:
6963
+ schema: { $ref: "#/components/schemas/AgentRunResumeRequest" }
6964
+ responses:
6965
+ "200":
6966
+ description: Current run after an idempotent resume.
6967
+ content:
6968
+ application/json:
6969
+ schema: { $ref: "#/components/schemas/WorkbenchAgentRunEnvelope" }
6970
+ "400":
6971
+ $ref: "#/components/responses/Error"
6972
+ "403":
6973
+ $ref: "#/components/responses/Error"
6974
+ "409":
6975
+ $ref: "#/components/responses/Error"
6610
6976
  /copilot/global-assistant/events:
6611
6977
  post:
6612
6978
  tags: [AI Workbench]
@@ -6996,6 +7362,455 @@ paths:
6996
7362
  $ref: "#/components/responses/Error"
6997
7363
  "404":
6998
7364
  $ref: "#/components/responses/Error"
7365
+ /copilot/assistant/access:
7366
+ get:
7367
+ tags: [AI Workbench]
7368
+ operationId: getPersonalAgentAccess
7369
+ description: Current user's activation state. Ordinary chat permission allows viewing and requesting activation, never approves it.
7370
+ responses:
7371
+ "200":
7372
+ description: Operation result.
7373
+ content:
7374
+ application/json:
7375
+ schema:
7376
+ $ref: "#/components/schemas/PersonalAgentAccessEnvelope"
7377
+ "403":
7378
+ $ref: "#/components/responses/Error"
7379
+ "409":
7380
+ $ref: "#/components/responses/Error"
7381
+ post:
7382
+ tags: [AI Workbench]
7383
+ operationId: requestPersonalAgentAccess
7384
+ description: Idempotently requests activation. Rejected or revoked requests may be submitted again. Does not create or wake compute.
7385
+ responses:
7386
+ "200":
7387
+ description: Operation result.
7388
+ content:
7389
+ application/json:
7390
+ schema:
7391
+ $ref: "#/components/schemas/PersonalAgentAccessEnvelope"
7392
+ "403":
7393
+ $ref: "#/components/responses/Error"
7394
+ "409":
7395
+ $ref: "#/components/responses/Error"
7396
+ /copilot/assistant/access/requests:
7397
+ get:
7398
+ tags: [AI Workbench]
7399
+ operationId: listPersonalAgentAccessRequests
7400
+ description: Activation applications, restricted to ai.environments.update.
7401
+ responses:
7402
+ "200":
7403
+ description: Operation result.
7404
+ content:
7405
+ application/json:
7406
+ schema:
7407
+ $ref: "#/components/schemas/PersonalAgentAccessListEnvelope"
7408
+ "403":
7409
+ $ref: "#/components/responses/Error"
7410
+ "409":
7411
+ $ref: "#/components/responses/Error"
7412
+ /copilot/assistant/access/requests/{userId}:
7413
+ patch:
7414
+ tags: [AI Workbench]
7415
+ operationId: decidePersonalAgentAccess
7416
+ description: Approve or reject a pending request, or revoke approved access. Requires ai.environments.update and the current revision. No self-service approval.
7417
+ parameters:
7418
+ - name: userId
7419
+ in: path
7420
+ required: true
7421
+ schema: { type: string, minLength: 1, maxLength: 128 }
7422
+ requestBody:
7423
+ required: true
7424
+ content:
7425
+ application/json:
7426
+ schema: { $ref: "#/components/schemas/PersonalAgentAccessDecision" }
7427
+ responses:
7428
+ "200":
7429
+ description: Operation result.
7430
+ content:
7431
+ application/json:
7432
+ schema:
7433
+ $ref: "#/components/schemas/PersonalAgentAccessEnvelope"
7434
+ "403":
7435
+ $ref: "#/components/responses/Error"
7436
+ "409":
7437
+ $ref: "#/components/responses/Error"
7438
+ /copilot/assistant/sessions:
7439
+ get:
7440
+ tags: [AI Workbench]
7441
+ operationId: listPersonalAgentSessions
7442
+ description: Only the authenticated activated user's Heya sessions.
7443
+ responses:
7444
+ "200":
7445
+ description: Operation result.
7446
+ content:
7447
+ application/json:
7448
+ schema:
7449
+ $ref: "#/components/schemas/WorkbenchSessionListEnvelope"
7450
+ "403":
7451
+ $ref: "#/components/responses/Error"
7452
+ "409":
7453
+ $ref: "#/components/responses/Error"
7454
+ post:
7455
+ tags: [AI Workbench]
7456
+ operationId: createPersonalAgentSession
7457
+ description: Creates a Heya side chat after activation. Ownership and conversation kind are assigned by the server.
7458
+ requestBody:
7459
+ required: true
7460
+ content:
7461
+ application/json:
7462
+ schema: { $ref: "#/components/schemas/WorkbenchCreateSessionRequest" }
7463
+ responses:
7464
+ "200":
7465
+ description: Operation result.
7466
+ content:
7467
+ application/json:
7468
+ schema:
7469
+ $ref: "#/components/schemas/WorkbenchSessionEnvelope"
7470
+ "403":
7471
+ $ref: "#/components/responses/Error"
7472
+ "409":
7473
+ $ref: "#/components/responses/Error"
7474
+ /copilot/assistant:
7475
+ post:
7476
+ tags: [AI Workbench]
7477
+ operationId: ensurePersonalAssistant
7478
+ description: Idempotently returns the authenticated user's persistent assistant identity and dedicated Heya main chat after approved activation. Existing ordinary chat history is retained separately. No owner, workspace or runtime identity is accepted from the client.
7479
+ responses:
7480
+ "200":
7481
+ description: Personal assistant.
7482
+ content:
7483
+ application/json:
7484
+ schema:
7485
+ $ref: "#/components/schemas/PersonalAssistantEnvelope"
7486
+ "403":
7487
+ $ref: "#/components/responses/Error"
7488
+ patch:
7489
+ tags: [AI Workbench]
7490
+ operationId: updatePersonalAssistant
7491
+ requestBody:
7492
+ required: true
7493
+ content:
7494
+ application/json:
7495
+ schema:
7496
+ $ref: "#/components/schemas/PersonalAssistantUpdateRequest"
7497
+ responses:
7498
+ "200":
7499
+ description: Updated personal assistant.
7500
+ content:
7501
+ application/json:
7502
+ schema:
7503
+ $ref: "#/components/schemas/PersonalAssistantEnvelope"
7504
+ "400":
7505
+ $ref: "#/components/responses/Error"
7506
+ "403":
7507
+ $ref: "#/components/responses/Error"
7508
+ /copilot/assistant/avatar:
7509
+ patch:
7510
+ tags: [AI Workbench]
7511
+ operationId: updatePersonalAssistantAvatar
7512
+ description: Updates only the authenticated user's assistant image and motion preference; never changes account profile or assistant name. Empty image values restore the default image. Animated formats require a static PNG/JPEG poster. Requires observe.ai.chat permission.
7513
+ requestBody:
7514
+ required: true
7515
+ content:
7516
+ application/json:
7517
+ schema:
7518
+ $ref: "#/components/schemas/PersonalAssistantAvatarRequest"
7519
+ responses:
7520
+ "200":
7521
+ description: Updated personal assistant.
7522
+ content:
7523
+ application/json:
7524
+ schema:
7525
+ $ref: "#/components/schemas/PersonalAssistantEnvelope"
7526
+ "400":
7527
+ $ref: "#/components/responses/Error"
7528
+ "403":
7529
+ $ref: "#/components/responses/Error"
7530
+ /copilot/assistant/environment:
7531
+ get:
7532
+ tags: [AI Workbench]
7533
+ operationId: getPersonalEnvironment
7534
+ summary: Read the authenticated assistant's latest environment receipt
7535
+ description: Does not contact the provider or dispatch work. Expired or unconfirmed receipts are unknown. Node credentials and Docker handles remain private.
7536
+ responses:
7537
+ "200":
7538
+ description: Personal environment state
7539
+ content:
7540
+ application/json:
7541
+ schema:
7542
+ $ref: "#/components/schemas/PersonalEnvironmentEnvelope"
7543
+ default:
7544
+ $ref: "#/components/responses/Error"
7545
+ post:
7546
+ tags: [AI Workbench]
7547
+ operationId: changePersonalEnvironment
7548
+ summary: Wake, sleep or reconcile the authenticated assistant's environment
7549
+ description: Select an administrator-configured template on first wake. Owner, node, quota and original lease are server-derived and immutable. Lost receipts become unknown; reconciliation inspects the original lease without replaying commands. Sleeping retains persistent data. This operation does not delete data.
7550
+ requestBody:
7551
+ required: true
7552
+ content:
7553
+ application/json:
7554
+ schema:
7555
+ $ref: "#/components/schemas/PersonalEnvironmentActionRequest"
7556
+ responses:
7557
+ "200":
7558
+ description: Actual environment receipt
7559
+ content:
7560
+ application/json:
7561
+ schema:
7562
+ $ref: "#/components/schemas/PersonalEnvironmentEnvelope"
7563
+ default:
7564
+ $ref: "#/components/responses/Error"
7565
+ delete:
7566
+ tags: [AI Workbench]
7567
+ operationId: deletePersonalEnvironmentData
7568
+ summary: Explicitly delete the authenticated assistant's personal files
7569
+ description: Requires the current assistant ID, exact full name and environment version, a stopped environment and no active task or operation. Deletion retains a private non-recreation marker. Unknown deletion remains unconfirmed; reconciliation never implies that files were deleted. No automatic recreation or request retry.
7570
+ requestBody:
7571
+ required: true
7572
+ content:
7573
+ application/json:
7574
+ schema:
7575
+ $ref: "#/components/schemas/PersonalEnvironmentDataDeletionRequest"
7576
+ responses:
7577
+ "200":
7578
+ description: Actual deletion receipt
7579
+ content:
7580
+ application/json:
7581
+ schema:
7582
+ $ref: "#/components/schemas/PersonalEnvironmentEnvelope"
7583
+ default:
7584
+ $ref: "#/components/responses/Error"
7585
+ /copilot/assistant/environment/runtime:
7586
+ get:
7587
+ tags: [AI Workbench]
7588
+ operationId: getPersonalWorkspaceRuntime
7589
+ summary: Read shared workspace runtime state across Web and App
7590
+ description: Reloads approved owner authorization, VM connect scope and current guest identity. Returns the latest retained human operation and authoritative browser control generation, without dispatching work. Browser frames are historical observations; only the current unexpired control can authorize a new action.
7591
+ responses:
7592
+ "200":
7593
+ description: Current workspace identity, latest receipt and browser control.
7594
+ content:
7595
+ application/json:
7596
+ schema: { $ref: "#/components/schemas/PersonalWorkspaceRuntimeEnvelope" }
7597
+ "401": { $ref: "#/components/responses/Error" }
7598
+ "403": { $ref: "#/components/responses/Error" }
7599
+ "409": { $ref: "#/components/responses/Error" }
7600
+ "503": { $ref: "#/components/responses/Error" }
7601
+ post:
7602
+ tags: [AI Workbench]
7603
+ operationId: startPersonalGuestRuntime
7604
+ summary: Start one bounded owner-authorized VM workspace operation
7605
+ description: Requires approved personal Agent access, current owned VM connect permission and resource scope, verified runtime readiness and an exact environment revision. Core freezes owner, data, quota, argv and control identity; a durable managed SSH operation only launches the fixed mTLS broker. Client input cannot select a VM, host path, image or credential. Commands and Docker containers have no host credentials, socket or network; files use bounded UTF-8 content and content CAS. Lost receipts are recovered by GET, never by replaying work. A human browser action uses current user control; Agent writes use the separate Gateway approval path.
7606
+ requestBody:
7607
+ required: true
7608
+ content:
7609
+ application/json:
7610
+ schema: { $ref: "#/components/schemas/PersonalGuestRuntimeInput" }
7611
+ responses:
7612
+ "202":
7613
+ description: Original durable runtime operation.
7614
+ content:
7615
+ application/json:
7616
+ schema: { $ref: "#/components/schemas/PersonalGuestRuntimeEnvelope" }
7617
+ "400": { $ref: "#/components/responses/Error" }
7618
+ "401": { $ref: "#/components/responses/Error" }
7619
+ "403": { $ref: "#/components/responses/Error" }
7620
+ "409": { $ref: "#/components/responses/Error" }
7621
+ "503": { $ref: "#/components/responses/Error" }
7622
+ /copilot/assistant/environment/runtime/{operationId}:
7623
+ get:
7624
+ tags: [AI Workbench]
7625
+ operationId: getPersonalGuestRuntime
7626
+ summary: Read the original owner's retained workspace receipt
7627
+ description: Reloads current authorization and scope and correlates the original frozen operation; never dispatches a command, navigates or recreates files. Stale or unconfirmed outcomes remain unknown. A receipt for an older browser control generation cannot mutate the current control.
7628
+ parameters:
7629
+ - name: operationId
7630
+ in: path
7631
+ required: true
7632
+ schema: { type: string, format: uuid }
7633
+ responses:
7634
+ "200":
7635
+ description: Original runtime state and bounded owner result.
7636
+ content:
7637
+ application/json:
7638
+ schema: { $ref: "#/components/schemas/PersonalGuestRuntimeEnvelope" }
7639
+ "401": { $ref: "#/components/responses/Error" }
7640
+ "403": { $ref: "#/components/responses/Error" }
7641
+ "404": { $ref: "#/components/responses/Error" }
7642
+ /copilot/assistant/environment/guest-tools:
7643
+ post:
7644
+ tags: [AI Workbench]
7645
+ operationId: installPersonalGuestTools
7646
+ summary: Install the owned VM's fixed execution tools without initializing data
7647
+ description: Requires the current approved owner, VM connect/resize permissions and resource scope, initialized data, the exact environment revision and no active task. Core freezes signed Debian package versions, a digest-pinned Docker image, artifact and quota; the durable provider task executes only the fixed installer on this VM. No commands, paths, format, delete or other VM configuration are accepted. The same idempotency key reads the original operation; uncertain effects never trigger automatic redispatch. Installation leaves execution readiness pending until a current isolated runtime probe is verified.
7648
+ requestBody:
7649
+ required: true
7650
+ content:
7651
+ application/json:
7652
+ schema: { $ref: "#/components/schemas/PersonalGuestToolsInput" }
7653
+ responses:
7654
+ "202":
7655
+ description: Original owner-bound retained tools operation.
7656
+ headers:
7657
+ Cache-Control: { schema: { type: string, const: no-store } }
7658
+ content:
7659
+ application/json:
7660
+ schema: { $ref: "#/components/schemas/VirtualizationOperationEnvelope" }
7661
+ "400": { $ref: "#/components/responses/Error" }
7662
+ "401": { $ref: "#/components/responses/Error" }
7663
+ "403": { $ref: "#/components/responses/Error" }
7664
+ "409": { $ref: "#/components/responses/Error" }
7665
+ "503": { $ref: "#/components/responses/Error" }
7666
+ /copilot/assistant/environment/guest-provisioning:
7667
+ post:
7668
+ tags: [AI Workbench]
7669
+ operationId: provisionPersonalGuest
7670
+ summary: Initialize the current owner's personal VM data and managed guest service
7671
+ description: Requires approved personal Agent access, VM connect and resize permissions and resource scope for the frozen owned VM. An Ed25519 public CSR is the only key input; the matching private key remains in the VM at the fixed bootstrap path. Core atomically reserves the environment CAS, certificate and encrypted durable task. The provider executes a fixed privileged installer with a Core-pinned artifact; no arbitrary command, path, resource deletion or other VM configuration change is accepted. Initialization is dispatched once; uncertain outcomes retain the original operation and cannot be automatically retried or canceled. A verified data receipt does not grant task/tool execution readiness. Recover a lost response by reading the current environment and operations rather than repeating the POST.
7672
+ x-soha-implementation-status: implemented
7673
+ requestBody:
7674
+ required: true
7675
+ content:
7676
+ application/json:
7677
+ schema: { $ref: "#/components/schemas/PersonalGuestPreparationInput" }
7678
+ responses:
7679
+ "202":
7680
+ description: Owner-bound durable provisioning operation; no private key or bootstrap challenge is returned.
7681
+ headers:
7682
+ Cache-Control: { schema: { type: string, const: no-store } }
7683
+ content:
7684
+ application/json:
7685
+ schema: { $ref: "#/components/schemas/VirtualizationOperationEnvelope" }
7686
+ "400": { $ref: "#/components/responses/Error" }
7687
+ "401": { $ref: "#/components/responses/Error" }
7688
+ "403": { $ref: "#/components/responses/Error" }
7689
+ "409": { $ref: "#/components/responses/Error" }
7690
+ "503": { $ref: "#/components/responses/Error" }
7691
+ /copilot/assistant/environment/guest-provisioning/{operationId}/reconcile:
7692
+ post:
7693
+ tags: [AI Workbench]
7694
+ operationId: reconcilePersonalGuestProvisioning
7695
+ summary: Explicitly reconcile the original retained personal guest operation
7696
+ description: Requires the current approved owner, VM connect/resize permission, resource scope, exact environment CAS and the original failed/timed-out owned operation. At most three total dispatch attempts are permitted. Core retains operation and frozen data identity, prepares a fresh guest identity and encrypted bootstrap, and records explicit reconciliation. A root bootstrap lock prevents concurrent installers. The protected original format receipt remains authoritative; a dispatched format never repeats, even if the disk still looks blank. A matching filesystem UUID permits completion; mismatched/absent evidence fails closed. No resource is deleted and no generic root command is accepted.
7697
+ x-soha-implementation-status: implemented
7698
+ parameters:
7699
+ - name: operationId
7700
+ in: path
7701
+ required: true
7702
+ schema: { type: string, format: uuid }
7703
+ requestBody:
7704
+ required: true
7705
+ content:
7706
+ application/json:
7707
+ schema: { $ref: "#/components/schemas/PersonalGuestPreparationInput" }
7708
+ responses:
7709
+ "202":
7710
+ description: The same retained operation queued for explicit reconciliation.
7711
+ headers:
7712
+ Cache-Control: { schema: { type: string, const: no-store } }
7713
+ content:
7714
+ application/json:
7715
+ schema: { $ref: "#/components/schemas/VirtualizationOperationEnvelope" }
7716
+ "400": { $ref: "#/components/responses/Error" }
7717
+ "401": { $ref: "#/components/responses/Error" }
7718
+ "403": { $ref: "#/components/responses/Error" }
7719
+ "409": { $ref: "#/components/responses/Error" }
7720
+ "503": { $ref: "#/components/responses/Error" }
7721
+ /copilot/assistant/environment/guest-enrollment:
7722
+ post:
7723
+ tags: [AI Workbench]
7724
+ operationId: preparePersonalGuestEnrollment
7725
+ summary: Prepare the current owner's dedicated personal VM guest identity
7726
+ description: Requires an approved current personal Agent owner and the frozen personal VM, provider and independent disk proof. Core derives the binding identity and revision and signs only the submitted Ed25519 public key for dedicated guest mTLS. Returns a short single-use challenge without granting readiness or task execution. Private keys remain in the VM. Do not automatically retry an uncertain response; explicit preparation supersedes the previous guest revision while retaining its audit history.
7727
+ x-soha-implementation-status: implemented
7728
+ requestBody:
7729
+ required: true
7730
+ content:
7731
+ application/json:
7732
+ schema: { $ref: "#/components/schemas/PersonalGuestPreparationInput" }
7733
+ responses:
7734
+ "201":
7735
+ description: Owner-bound public certificate and private one-time bootstrap challenge; response must not be cached or logged.
7736
+ headers:
7737
+ Cache-Control: { schema: { type: string, const: no-store } }
7738
+ content:
7739
+ application/json:
7740
+ schema: { $ref: "#/components/schemas/PersonalGuestPreparationEnvelope" }
7741
+ "400": { $ref: "#/components/responses/Error" }
7742
+ "401": { $ref: "#/components/responses/Error" }
7743
+ "403": { $ref: "#/components/responses/Error" }
7744
+ "409": { $ref: "#/components/responses/Error" }
7745
+ "503": { $ref: "#/components/responses/Error" }
7746
+ /copilot/assistant/environment/export:
7747
+ post:
7748
+ tags: [AI Workbench]
7749
+ operationId: exportPersonalEnvironmentData
7750
+ summary: Download the authenticated assistant's retained personal files
7751
+ description: Requires the current assistant ID and environment version, a sleeping environment and no active task. Returns a verified TAR archive up to 256 MiB after the Agent stream and SHA-256 receipt are complete. Symlinks are stored as links and never followed. Does not wake, delete, extract or publish data. Temporary server files are removed when the response ends; no server export history is retained. No automatic retry.
7752
+ requestBody:
7753
+ required: true
7754
+ content:
7755
+ application/json:
7756
+ schema:
7757
+ $ref: "#/components/schemas/PersonalEnvironmentDataExportRequest"
7758
+ responses:
7759
+ "200":
7760
+ description: Complete verified personal data archive
7761
+ headers:
7762
+ X-Content-SHA256:
7763
+ schema: { type: string, pattern: "^[a-f0-9]{64}$" }
7764
+ X-Assistant-ID:
7765
+ schema: { type: string, minLength: 1 }
7766
+ content:
7767
+ application/x-tar:
7768
+ schema: { type: string, format: binary }
7769
+ default:
7770
+ $ref: "#/components/responses/Error"
7771
+ /copilot/assistant/environment/templates:
7772
+ get:
7773
+ tags: [AI Workbench]
7774
+ operationId: listPersonalEnvironmentTemplates
7775
+ summary: List personal Docker template choices within the current user's node scope
7776
+ description: Returns active supported administrator templates without node IDs, credentials or internal policies. A choice describes configuration only; acquisition must obtain a fresh Agent receipt before readiness is claimed.
7777
+ responses:
7778
+ "200":
7779
+ description: Authorized template choices
7780
+ content:
7781
+ application/json:
7782
+ schema:
7783
+ $ref: "#/components/schemas/PersonalEnvironmentTemplateListEnvelope"
7784
+ default:
7785
+ $ref: "#/components/responses/Error"
7786
+ /copilot/assistant/tasks:
7787
+ get:
7788
+ tags: [AI Workbench]
7789
+ operationId: listPersonalAssistantTasks
7790
+ description: Returns at most 50 recent tasks belonging to the authenticated user across their conversations. Requires chat access; does not grant access to other users or platform-wide AI administration.
7791
+ responses:
7792
+ "200":
7793
+ description: Recent personal tasks.
7794
+ content:
7795
+ application/json:
7796
+ schema:
7797
+ $ref: "#/components/schemas/WorkbenchAgentRunListEnvelope"
7798
+ "403":
7799
+ $ref: "#/components/responses/Error"
7800
+ /copilot/assistant/artifacts:
7801
+ get:
7802
+ tags: [AI Workbench]
7803
+ operationId: listPersonalAssistantArtifacts
7804
+ description: Returns at most 50 recent saved artifacts owned by the authenticated user across chats and background tasks. A task result mirrored into a message appears once. Requires chat access.
7805
+ responses:
7806
+ "200":
7807
+ description: Recent personal artifacts.
7808
+ content:
7809
+ application/json:
7810
+ schema:
7811
+ $ref: "#/components/schemas/PersonalAssistantArtifactListEnvelope"
7812
+ "403":
7813
+ $ref: "#/components/responses/Error"
6999
7814
  /copilot/sessions:
7000
7815
  get:
7001
7816
  tags: [AI Workbench]
@@ -7029,6 +7844,28 @@ paths:
7029
7844
  $ref: "#/components/responses/Error"
7030
7845
  "403":
7031
7846
  $ref: "#/components/responses/Error"
7847
+ /copilot/sessions/main:
7848
+ post:
7849
+ tags: [AI Workbench]
7850
+ operationId: ensureWorkbenchMainSession
7851
+ description: Returns the current user's persistent main chat, creating it only once. Concurrent requests return the same session. Existing sessions remain separate. The initial provider is applied only when creating the main chat.
7852
+ requestBody:
7853
+ required: true
7854
+ content:
7855
+ application/json:
7856
+ schema:
7857
+ $ref: "#/components/schemas/WorkbenchMainSessionRequest"
7858
+ responses:
7859
+ "200":
7860
+ description: The current user's main chat.
7861
+ content:
7862
+ application/json:
7863
+ schema:
7864
+ $ref: "#/components/schemas/WorkbenchSessionEnvelope"
7865
+ "400":
7866
+ $ref: "#/components/responses/Error"
7867
+ "403":
7868
+ $ref: "#/components/responses/Error"
7032
7869
  /copilot/sessions/{sessionID}:
7033
7870
  get:
7034
7871
  tags: [AI Workbench]
@@ -7070,6 +7907,8 @@ paths:
7070
7907
  $ref: "#/components/responses/Error"
7071
7908
  "404":
7072
7909
  $ref: "#/components/responses/Error"
7910
+ "409":
7911
+ $ref: "#/components/responses/Error"
7073
7912
  delete:
7074
7913
  tags: [AI Workbench]
7075
7914
  operationId: deleteWorkbenchSession
@@ -7082,6 +7921,21 @@ paths:
7082
7921
  $ref: "#/components/responses/Error"
7083
7922
  "404":
7084
7923
  $ref: "#/components/responses/Error"
7924
+ "409":
7925
+ $ref: "#/components/responses/Error"
7926
+ /copilot/messages/search:
7927
+ get: {"tags":["AI Workbench"],"operationId":"searchWorkbenchMessages","description":"Search owned, unarchived user and assistant messages. Current source ACL applies before matching and snippets; opaque cursor follows stable descending message time and ID.","responses":{"200":{"description":"Search owned, unarchived user and assistant messages. Current source ACL applies before matching and snippets; opaque cursor follows stable descending message time and ID.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkbenchMessageSearchEnvelope"}}}},"400":{"$ref":"#/components/responses/Error"},"403":{"$ref":"#/components/responses/Error"},"404":{"$ref":"#/components/responses/Error"},"409":{"$ref":"#/components/responses/Error"},"503":{"$ref":"#/components/responses/Error"}},"parameters":[{"in":"query","name":"q","required":true,"schema":{"type":"string","minLength":1,"maxLength":120}},{"in":"query","name":"cursor","required":false,"schema":{"type":"string","maxLength":512}},{"in":"query","name":"limit","required":false,"schema":{"type":"integer","minimum":1,"maximum":50,"default":20}},{"in":"query","name":"workspace","required":false,"schema":{"type":"string","enum":["chat","heya"],"default":"chat"}}]}
7928
+ /copilot/sessions/{sessionID}/messages/window:
7929
+ get: {"tags":["AI Workbench"],"operationId":"getWorkbenchMessageWindow","description":"Read a chronological message window, latest by default. around, before and after are mutually exclusive owned message IDs; cursors allow stable adjacent windows. Does not change the legacy message list.","responses":{"200":{"description":"Read a chronological message window, latest by default. around, before and after are mutually exclusive owned message IDs; cursors allow stable adjacent windows. Does not change the legacy message list.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkbenchMessageWindowEnvelope"}}}},"400":{"$ref":"#/components/responses/Error"},"403":{"$ref":"#/components/responses/Error"},"404":{"$ref":"#/components/responses/Error"},"409":{"$ref":"#/components/responses/Error"},"503":{"$ref":"#/components/responses/Error"}},"parameters":[{"$ref":"#/components/parameters/SessionID"},{"in":"query","name":"around","required":false,"schema":{"type":"string","maxLength":128}},{"in":"query","name":"before","required":false,"schema":{"type":"string","maxLength":128}},{"in":"query","name":"after","required":false,"schema":{"type":"string","maxLength":128}},{"in":"query","name":"limit","required":false,"schema":{"type":"integer","minimum":3,"maximum":100,"default":40}}]}
7930
+ /copilot/assistant/feed:
7931
+ get: {"tags":["AI Workbench"],"operationId":"listPersonalFeed","description":"Read owned content feed, settings, refresh state and eligible search sources. Does not enqueue work on read.","responses":{"200":{"description":"Read owned content feed, settings, refresh state and eligible search sources. Does not enqueue work on read.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PersonalFeedEnvelope"}}}},"400":{"$ref":"#/components/responses/Error"},"403":{"$ref":"#/components/responses/Error"},"404":{"$ref":"#/components/responses/Error"},"409":{"$ref":"#/components/responses/Error"},"503":{"$ref":"#/components/responses/Error"}},"parameters":[{"in":"query","name":"before","required":false,"schema":{"type":"string","maxLength":128}},{"in":"query","name":"limit","required":false,"schema":{"type":"integer","minimum":1,"maximum":50,"default":20}}]}
7932
+ /copilot/assistant/feed/settings:
7933
+ put: {"tags":["AI Workbench"],"operationId":"updatePersonalFeedSettings","description":"Update owned content instructions/source and optional daily updates. Automatic updates are disabled by default; changes invalidate unfinished refreshes.","responses":{"200":{"description":"Update owned content instructions/source and optional daily updates. Automatic updates are disabled by default; changes invalidate unfinished refreshes.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PersonalFeedEnvelope"}}}},"400":{"$ref":"#/components/responses/Error"},"403":{"$ref":"#/components/responses/Error"},"404":{"$ref":"#/components/responses/Error"},"409":{"$ref":"#/components/responses/Error"},"503":{"$ref":"#/components/responses/Error"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PersonalFeedSettings"}}}}}
7934
+ /copilot/assistant/feed/refresh:
7935
+ post: {"tags":["AI Workbench"],"operationId":"refreshPersonalFeed","description":"Queue one bounded refresh; duplicate active refreshes coalesce. User scoped cooldown prevents repeated paid calls. A valid read-only synchronous search source is required.","responses":{"202":{"description":"Queue one bounded refresh; duplicate active refreshes coalesce. User scoped cooldown prevents repeated paid calls. A valid read-only synchronous search source is required.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PersonalFeedEnvelope"}}}},"400":{"$ref":"#/components/responses/Error"},"403":{"$ref":"#/components/responses/Error"},"404":{"$ref":"#/components/responses/Error"},"409":{"$ref":"#/components/responses/Error"},"503":{"$ref":"#/components/responses/Error"}}}
7936
+ /copilot/assistant/feed/items/{itemID}:
7937
+ get: {"tags":["AI Workbench"],"operationId":"getPersonalFeedItem","description":"Read an owned post for discussion context.","responses":{"200":{"description":"Read an owned post for discussion context.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PersonalFeedItemEnvelope"}}}},"400":{"$ref":"#/components/responses/Error"},"403":{"$ref":"#/components/responses/Error"},"404":{"$ref":"#/components/responses/Error"},"409":{"$ref":"#/components/responses/Error"},"503":{"$ref":"#/components/responses/Error"}},"parameters":[{"in":"path","name":"itemID","required":true,"schema":{"type":"string","maxLength":128}}]}
7938
+ patch: {"tags":["AI Workbench"],"operationId":"updatePersonalFeedFeedback","description":"Save liked/hidden feedback for an owned post. Hidden posts remain stored and can be referenced by their owner.","responses":{"200":{"description":"Save liked/hidden feedback for an owned post. Hidden posts remain stored and can be referenced by their owner.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PersonalFeedItemEnvelope"}}}},"400":{"$ref":"#/components/responses/Error"},"403":{"$ref":"#/components/responses/Error"},"404":{"$ref":"#/components/responses/Error"},"409":{"$ref":"#/components/responses/Error"},"503":{"$ref":"#/components/responses/Error"}},"parameters":[{"in":"path","name":"itemID","required":true,"schema":{"type":"string","maxLength":128}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PersonalFeedFeedback"}}}}}
7085
7939
  /copilot/sessions/{sessionID}/messages:
7086
7940
  get:
7087
7941
  tags: [AI Workbench]
@@ -9232,6 +10086,36 @@ paths:
9232
10086
  "403": { $ref: "#/components/responses/Error" }
9233
10087
  "404": { $ref: "#/components/responses/Error" }
9234
10088
  "503": { $ref: "#/components/responses/Error" }
10089
+ /clusters/{clusterID}/resource-monitoring:
10090
+ get:
10091
+ tags: [Platform]
10092
+ operationId: getKubernetesResourceMonitoring
10093
+ description: Fixed bounded monitoring templates. The selected view requires its exact permission plus cluster-wide nodes.view. Raw PromQL is never accepted. Current snapshots and historical series have separate observation times.
10094
+ x-soha-permissions:
10095
+ mode: all
10096
+ keys: [platform.nodes.view]
10097
+ byQuery:
10098
+ view:
10099
+ overview: platform.resource-monitoring.overview.view
10100
+ cpu: platform.resource-monitoring.cpu.view
10101
+ memory: platform.resource-monitoring.memory.view
10102
+ conntrack: platform.resource-monitoring.conntrack.view
10103
+ pods: platform.resource-monitoring.pods.view
10104
+ x-soha-implementation-status: implemented
10105
+ parameters:
10106
+ - { $ref: "#/components/parameters/ClusterID" }
10107
+ - { name: view, in: query, required: true, schema: { $ref: "#/components/schemas/ResourceMonitoringViewName" } }
10108
+ - { name: node, in: query, schema: { type: string, maxLength: 253 } }
10109
+ - { name: from, in: query, schema: { type: string, format: date-time } }
10110
+ - { name: to, in: query, schema: { type: string, format: date-time } }
10111
+ - { name: rangeMinutes, in: query, schema: { type: integer, minimum: 1, maximum: 1440, default: 60 } }
10112
+ - { name: stepSeconds, in: query, schema: { type: integer, minimum: 15, maximum: 3600, default: 60 } }
10113
+ responses:
10114
+ "200": { description: Per-panel quality and bounded node series., content: { application/json: { schema: { $ref: "#/components/schemas/ResourceMonitoringEnvelope" } } } }
10115
+ "400": { $ref: "#/components/responses/Error" }
10116
+ "403": { $ref: "#/components/responses/Error" }
10117
+ "404": { $ref: "#/components/responses/Error" }
10118
+ "503": { $ref: "#/components/responses/Error" }
9235
10119
  /clusters/{clusterID}/network/topology:
9236
10120
  get:
9237
10121
  tags: [Platform]
@@ -9243,7 +10127,7 @@ paths:
9243
10127
  x-soha-implementation-status: implemented
9244
10128
  parameters: [{ $ref: "#/components/parameters/ClusterID" }, { $ref: "#/components/parameters/KubernetesNamespaceQuery" }]
9245
10129
  responses:
9246
- "200": { description: Resolved ingress and Gateway API topology for the selected scope., content: { application/json: { schema: { $ref: "#/components/schemas/KubernetesNetworkTopologyEnvelope" } } } }
10130
+ "200": { description: "Bounded permission-filtered Kubernetes, Gateway API, Traefik and APISIX topology, with per-source coverage and explicit unresolved relationships.", content: { application/json: { schema: { $ref: "#/components/schemas/KubernetesNetworkTopologyEnvelope" } } } }
9247
10131
  "403": { $ref: "#/components/responses/Error" }
9248
10132
  "404": { $ref: "#/components/responses/Error" }
9249
10133
  "503": { $ref: "#/components/responses/Error" }
@@ -11244,6 +12128,32 @@ paths:
11244
12128
  $ref: "#/components/responses/Error"
11245
12129
  "404":
11246
12130
  $ref: "#/components/responses/Error"
12131
+ /secrets/{secretID}/references:
12132
+ get:
12133
+ tags: [Secrets]
12134
+ operationId: listSecretReferences
12135
+ x-soha-implementation-status: implemented
12136
+ security:
12137
+ - bearerAuth: []
12138
+ parameters:
12139
+ - name: secretID
12140
+ in: path
12141
+ required: true
12142
+ schema:
12143
+ type: string
12144
+ responses:
12145
+ "200":
12146
+ description: Visible VM login bindings and initialization operations using fixed secret versions; no secret values.
12147
+ content:
12148
+ application/json:
12149
+ schema:
12150
+ $ref: "#/components/schemas/SecretReferenceUsageListEnvelope"
12151
+ "401":
12152
+ $ref: "#/components/responses/Error"
12153
+ "403":
12154
+ $ref: "#/components/responses/Error"
12155
+ "404":
12156
+ $ref: "#/components/responses/Error"
11247
12157
  /secrets/{secretID}/versions:
11248
12158
  get:
11249
12159
  tags: [Secrets]
@@ -18884,6 +19794,12 @@ paths:
18884
19794
  tags:
18885
19795
  - Platform
18886
19796
  operationId: drainKubernetesNode
19797
+ description: >-
19798
+ Cordon the node and evict eligible pods. A 409 with node_drain_pdb_blocked,
19799
+ node_drain_eviction_blocked, node_drain_timeout, node_drain_canceled,
19800
+ node_drain_pod_selection or node_drain_failed means this drain did not complete.
19801
+ Inspect current node schedulability and remaining pods before retrying or
19802
+ explicitly restoring scheduling. Transport failure leaves the outcome unknown.
18887
19803
  x-soha-permissions:
18888
19804
  mode: all
18889
19805
  keys:
@@ -19147,6 +20063,458 @@ paths:
19147
20063
  $ref: "#/components/responses/Error"
19148
20064
  "503":
19149
20065
  $ref: "#/components/responses/Error"
20066
+ /clusters/{clusterID}/network/httproutes/{name}:
20067
+ delete:
20068
+ tags: [Platform]
20069
+ operationId: deleteKubernetesHTTPRoute
20070
+ x-soha-permissions:
20071
+ mode: all
20072
+ keys: [platform.network.http-routes.delete]
20073
+ x-soha-implementation-status: implemented
20074
+ parameters:
20075
+ - $ref: "#/components/parameters/ClusterID"
20076
+ - $ref: "#/components/parameters/KubernetesResourceName"
20077
+ - $ref: "#/components/parameters/KubernetesNamespaceQuery"
20078
+ responses:
20079
+ "204": { description: Resource deleted. }
20080
+ "400": { $ref: "#/components/responses/Error" }
20081
+ "403": { $ref: "#/components/responses/Error" }
20082
+ "404": { $ref: "#/components/responses/Error" }
20083
+ "409": { $ref: "#/components/responses/Error" }
20084
+ "503": { $ref: "#/components/responses/Error" }
20085
+ /clusters/{clusterID}/network/httproutes/{name}/yaml:
20086
+ get:
20087
+ tags: [Platform]
20088
+ operationId: getKubernetesHTTPRouteYaml
20089
+ x-soha-permissions:
20090
+ mode: all
20091
+ keys: [platform.network.http-routes.view]
20092
+ x-soha-implementation-status: implemented
20093
+ parameters:
20094
+ - $ref: "#/components/parameters/ClusterID"
20095
+ - $ref: "#/components/parameters/KubernetesResourceName"
20096
+ - $ref: "#/components/parameters/KubernetesNamespaceQuery"
20097
+ responses:
20098
+ "200":
20099
+ description: Authorized Kubernetes resource YAML.
20100
+ content:
20101
+ application/json:
20102
+ schema:
20103
+ $ref: "#/components/schemas/KubernetesResourceYamlEnvelope"
20104
+ "400": { $ref: "#/components/responses/Error" }
20105
+ "403": { $ref: "#/components/responses/Error" }
20106
+ "404": { $ref: "#/components/responses/Error" }
20107
+ "409": { $ref: "#/components/responses/Error" }
20108
+ "503": { $ref: "#/components/responses/Error" }
20109
+ put:
20110
+ tags: [Platform]
20111
+ operationId: applyKubernetesHTTPRouteYaml
20112
+ x-soha-permissions:
20113
+ mode: all
20114
+ keys: [platform.network.http-routes.update]
20115
+ x-soha-implementation-status: implemented
20116
+ parameters:
20117
+ - $ref: "#/components/parameters/ClusterID"
20118
+ - $ref: "#/components/parameters/KubernetesResourceName"
20119
+ - $ref: "#/components/parameters/KubernetesNamespaceQuery"
20120
+ requestBody:
20121
+ required: true
20122
+ content:
20123
+ application/json:
20124
+ schema:
20125
+ $ref: "#/components/schemas/KubernetesResourceYamlInput"
20126
+ responses:
20127
+ "200":
20128
+ description: Authorized Kubernetes resource YAML.
20129
+ content:
20130
+ application/json:
20131
+ schema:
20132
+ $ref: "#/components/schemas/KubernetesResourceYamlEnvelope"
20133
+ "400": { $ref: "#/components/responses/Error" }
20134
+ "403": { $ref: "#/components/responses/Error" }
20135
+ "404": { $ref: "#/components/responses/Error" }
20136
+ "409": { $ref: "#/components/responses/Error" }
20137
+ "503": { $ref: "#/components/responses/Error" }
20138
+ /clusters/{clusterID}/network/grpcroutes/{name}:
20139
+ delete:
20140
+ tags: [Platform]
20141
+ operationId: deleteKubernetesGRPCRoute
20142
+ x-soha-permissions:
20143
+ mode: all
20144
+ keys: [platform.network.grpc-routes.delete]
20145
+ x-soha-implementation-status: implemented
20146
+ parameters:
20147
+ - $ref: "#/components/parameters/ClusterID"
20148
+ - $ref: "#/components/parameters/KubernetesResourceName"
20149
+ - $ref: "#/components/parameters/KubernetesNamespaceQuery"
20150
+ responses:
20151
+ "204": { description: Resource deleted. }
20152
+ "400": { $ref: "#/components/responses/Error" }
20153
+ "403": { $ref: "#/components/responses/Error" }
20154
+ "404": { $ref: "#/components/responses/Error" }
20155
+ "409": { $ref: "#/components/responses/Error" }
20156
+ "503": { $ref: "#/components/responses/Error" }
20157
+ /clusters/{clusterID}/network/grpcroutes/{name}/yaml:
20158
+ get:
20159
+ tags: [Platform]
20160
+ operationId: getKubernetesGRPCRouteYaml
20161
+ x-soha-permissions:
20162
+ mode: all
20163
+ keys: [platform.network.grpc-routes.view]
20164
+ x-soha-implementation-status: implemented
20165
+ parameters:
20166
+ - $ref: "#/components/parameters/ClusterID"
20167
+ - $ref: "#/components/parameters/KubernetesResourceName"
20168
+ - $ref: "#/components/parameters/KubernetesNamespaceQuery"
20169
+ responses:
20170
+ "200":
20171
+ description: Authorized Kubernetes resource YAML.
20172
+ content:
20173
+ application/json:
20174
+ schema:
20175
+ $ref: "#/components/schemas/KubernetesResourceYamlEnvelope"
20176
+ "400": { $ref: "#/components/responses/Error" }
20177
+ "403": { $ref: "#/components/responses/Error" }
20178
+ "404": { $ref: "#/components/responses/Error" }
20179
+ "409": { $ref: "#/components/responses/Error" }
20180
+ "503": { $ref: "#/components/responses/Error" }
20181
+ put:
20182
+ tags: [Platform]
20183
+ operationId: applyKubernetesGRPCRouteYaml
20184
+ x-soha-permissions:
20185
+ mode: all
20186
+ keys: [platform.network.grpc-routes.update]
20187
+ x-soha-implementation-status: implemented
20188
+ parameters:
20189
+ - $ref: "#/components/parameters/ClusterID"
20190
+ - $ref: "#/components/parameters/KubernetesResourceName"
20191
+ - $ref: "#/components/parameters/KubernetesNamespaceQuery"
20192
+ requestBody:
20193
+ required: true
20194
+ content:
20195
+ application/json:
20196
+ schema:
20197
+ $ref: "#/components/schemas/KubernetesResourceYamlInput"
20198
+ responses:
20199
+ "200":
20200
+ description: Authorized Kubernetes resource YAML.
20201
+ content:
20202
+ application/json:
20203
+ schema:
20204
+ $ref: "#/components/schemas/KubernetesResourceYamlEnvelope"
20205
+ "400": { $ref: "#/components/responses/Error" }
20206
+ "403": { $ref: "#/components/responses/Error" }
20207
+ "404": { $ref: "#/components/responses/Error" }
20208
+ "409": { $ref: "#/components/responses/Error" }
20209
+ "503": { $ref: "#/components/responses/Error" }
20210
+ /clusters/{clusterID}/network/backendtlspolicies/{name}:
20211
+ delete:
20212
+ tags: [Platform]
20213
+ operationId: deleteKubernetesBackendTLSPolicy
20214
+ x-soha-permissions:
20215
+ mode: all
20216
+ keys: [platform.network.backend-tls-policies.delete]
20217
+ x-soha-implementation-status: implemented
20218
+ parameters:
20219
+ - $ref: "#/components/parameters/ClusterID"
20220
+ - $ref: "#/components/parameters/KubernetesResourceName"
20221
+ - $ref: "#/components/parameters/KubernetesNamespaceQuery"
20222
+ responses:
20223
+ "204": { description: Resource deleted. }
20224
+ "400": { $ref: "#/components/responses/Error" }
20225
+ "403": { $ref: "#/components/responses/Error" }
20226
+ "404": { $ref: "#/components/responses/Error" }
20227
+ "409": { $ref: "#/components/responses/Error" }
20228
+ "503": { $ref: "#/components/responses/Error" }
20229
+ /clusters/{clusterID}/network/backendtlspolicies/{name}/yaml:
20230
+ get:
20231
+ tags: [Platform]
20232
+ operationId: getKubernetesBackendTLSPolicyYaml
20233
+ x-soha-permissions:
20234
+ mode: all
20235
+ keys: [platform.network.backend-tls-policies.view]
20236
+ x-soha-implementation-status: implemented
20237
+ parameters:
20238
+ - $ref: "#/components/parameters/ClusterID"
20239
+ - $ref: "#/components/parameters/KubernetesResourceName"
20240
+ - $ref: "#/components/parameters/KubernetesNamespaceQuery"
20241
+ responses:
20242
+ "200":
20243
+ description: Authorized Kubernetes resource YAML.
20244
+ content:
20245
+ application/json:
20246
+ schema:
20247
+ $ref: "#/components/schemas/KubernetesResourceYamlEnvelope"
20248
+ "400": { $ref: "#/components/responses/Error" }
20249
+ "403": { $ref: "#/components/responses/Error" }
20250
+ "404": { $ref: "#/components/responses/Error" }
20251
+ "409": { $ref: "#/components/responses/Error" }
20252
+ "503": { $ref: "#/components/responses/Error" }
20253
+ put:
20254
+ tags: [Platform]
20255
+ operationId: applyKubernetesBackendTLSPolicyYaml
20256
+ x-soha-permissions:
20257
+ mode: all
20258
+ keys: [platform.network.backend-tls-policies.update]
20259
+ x-soha-implementation-status: implemented
20260
+ parameters:
20261
+ - $ref: "#/components/parameters/ClusterID"
20262
+ - $ref: "#/components/parameters/KubernetesResourceName"
20263
+ - $ref: "#/components/parameters/KubernetesNamespaceQuery"
20264
+ requestBody:
20265
+ required: true
20266
+ content:
20267
+ application/json:
20268
+ schema:
20269
+ $ref: "#/components/schemas/KubernetesResourceYamlInput"
20270
+ responses:
20271
+ "200":
20272
+ description: Authorized Kubernetes resource YAML.
20273
+ content:
20274
+ application/json:
20275
+ schema:
20276
+ $ref: "#/components/schemas/KubernetesResourceYamlEnvelope"
20277
+ "400": { $ref: "#/components/responses/Error" }
20278
+ "403": { $ref: "#/components/responses/Error" }
20279
+ "404": { $ref: "#/components/responses/Error" }
20280
+ "409": { $ref: "#/components/responses/Error" }
20281
+ "503": { $ref: "#/components/responses/Error" }
20282
+ /clusters/{clusterID}/network/referencegrants/{name}:
20283
+ delete:
20284
+ tags: [Platform]
20285
+ operationId: deleteKubernetesReferenceGrant
20286
+ x-soha-permissions:
20287
+ mode: all
20288
+ keys: [platform.network.reference-grants.delete]
20289
+ x-soha-implementation-status: implemented
20290
+ parameters:
20291
+ - $ref: "#/components/parameters/ClusterID"
20292
+ - $ref: "#/components/parameters/KubernetesResourceName"
20293
+ - $ref: "#/components/parameters/KubernetesNamespaceQuery"
20294
+ responses:
20295
+ "204": { description: Resource deleted. }
20296
+ "400": { $ref: "#/components/responses/Error" }
20297
+ "403": { $ref: "#/components/responses/Error" }
20298
+ "404": { $ref: "#/components/responses/Error" }
20299
+ "409": { $ref: "#/components/responses/Error" }
20300
+ "503": { $ref: "#/components/responses/Error" }
20301
+ /clusters/{clusterID}/network/referencegrants/{name}/yaml:
20302
+ get:
20303
+ tags: [Platform]
20304
+ operationId: getKubernetesReferenceGrantYaml
20305
+ x-soha-permissions:
20306
+ mode: all
20307
+ keys: [platform.network.reference-grants.view]
20308
+ x-soha-implementation-status: implemented
20309
+ parameters:
20310
+ - $ref: "#/components/parameters/ClusterID"
20311
+ - $ref: "#/components/parameters/KubernetesResourceName"
20312
+ - $ref: "#/components/parameters/KubernetesNamespaceQuery"
20313
+ responses:
20314
+ "200":
20315
+ description: Authorized Kubernetes resource YAML.
20316
+ content:
20317
+ application/json:
20318
+ schema:
20319
+ $ref: "#/components/schemas/KubernetesResourceYamlEnvelope"
20320
+ "400": { $ref: "#/components/responses/Error" }
20321
+ "403": { $ref: "#/components/responses/Error" }
20322
+ "404": { $ref: "#/components/responses/Error" }
20323
+ "409": { $ref: "#/components/responses/Error" }
20324
+ "503": { $ref: "#/components/responses/Error" }
20325
+ put:
20326
+ tags: [Platform]
20327
+ operationId: applyKubernetesReferenceGrantYaml
20328
+ x-soha-permissions:
20329
+ mode: all
20330
+ keys: [platform.network.reference-grants.update]
20331
+ x-soha-implementation-status: implemented
20332
+ parameters:
20333
+ - $ref: "#/components/parameters/ClusterID"
20334
+ - $ref: "#/components/parameters/KubernetesResourceName"
20335
+ - $ref: "#/components/parameters/KubernetesNamespaceQuery"
20336
+ requestBody:
20337
+ required: true
20338
+ content:
20339
+ application/json:
20340
+ schema:
20341
+ $ref: "#/components/schemas/KubernetesResourceYamlInput"
20342
+ responses:
20343
+ "200":
20344
+ description: Authorized Kubernetes resource YAML.
20345
+ content:
20346
+ application/json:
20347
+ schema:
20348
+ $ref: "#/components/schemas/KubernetesResourceYamlEnvelope"
20349
+ "400": { $ref: "#/components/responses/Error" }
20350
+ "403": { $ref: "#/components/responses/Error" }
20351
+ "404": { $ref: "#/components/responses/Error" }
20352
+ "409": { $ref: "#/components/responses/Error" }
20353
+ "503": { $ref: "#/components/responses/Error" }
20354
+ /clusters/{clusterID}/configuration/hpas/{name}:
20355
+ delete:
20356
+ tags: [Platform]
20357
+ operationId: deleteKubernetesHorizontalPodAutoscaler
20358
+ x-soha-permissions:
20359
+ mode: all
20360
+ keys: [platform.configuration.horizontal-pod-autoscalers.delete]
20361
+ x-soha-implementation-status: implemented
20362
+ parameters:
20363
+ - $ref: "#/components/parameters/ClusterID"
20364
+ - $ref: "#/components/parameters/KubernetesResourceName"
20365
+ - $ref: "#/components/parameters/KubernetesNamespaceQuery"
20366
+ responses:
20367
+ "204": { description: Resource deleted. }
20368
+ "400": { $ref: "#/components/responses/Error" }
20369
+ "403": { $ref: "#/components/responses/Error" }
20370
+ "404": { $ref: "#/components/responses/Error" }
20371
+ "409": { $ref: "#/components/responses/Error" }
20372
+ "503": { $ref: "#/components/responses/Error" }
20373
+ /clusters/{clusterID}/configuration/hpas/{name}/yaml:
20374
+ get:
20375
+ tags: [Platform]
20376
+ operationId: getKubernetesHorizontalPodAutoscalerYaml
20377
+ x-soha-permissions:
20378
+ mode: all
20379
+ keys: [platform.configuration.horizontal-pod-autoscalers.view]
20380
+ x-soha-implementation-status: implemented
20381
+ parameters:
20382
+ - $ref: "#/components/parameters/ClusterID"
20383
+ - $ref: "#/components/parameters/KubernetesResourceName"
20384
+ - $ref: "#/components/parameters/KubernetesNamespaceQuery"
20385
+ responses:
20386
+ "200":
20387
+ description: Authorized Kubernetes resource YAML.
20388
+ content:
20389
+ application/json:
20390
+ schema:
20391
+ $ref: "#/components/schemas/KubernetesResourceYamlEnvelope"
20392
+ "400": { $ref: "#/components/responses/Error" }
20393
+ "403": { $ref: "#/components/responses/Error" }
20394
+ "404": { $ref: "#/components/responses/Error" }
20395
+ "409": { $ref: "#/components/responses/Error" }
20396
+ "503": { $ref: "#/components/responses/Error" }
20397
+ put:
20398
+ tags: [Platform]
20399
+ operationId: applyKubernetesHorizontalPodAutoscalerYaml
20400
+ x-soha-permissions:
20401
+ mode: all
20402
+ keys: [platform.configuration.horizontal-pod-autoscalers.update]
20403
+ x-soha-implementation-status: implemented
20404
+ parameters:
20405
+ - $ref: "#/components/parameters/ClusterID"
20406
+ - $ref: "#/components/parameters/KubernetesResourceName"
20407
+ - $ref: "#/components/parameters/KubernetesNamespaceQuery"
20408
+ requestBody:
20409
+ required: true
20410
+ content:
20411
+ application/json:
20412
+ schema:
20413
+ $ref: "#/components/schemas/KubernetesResourceYamlInput"
20414
+ responses:
20415
+ "200":
20416
+ description: Authorized Kubernetes resource YAML.
20417
+ content:
20418
+ application/json:
20419
+ schema:
20420
+ $ref: "#/components/schemas/KubernetesResourceYamlEnvelope"
20421
+ "400": { $ref: "#/components/responses/Error" }
20422
+ "403": { $ref: "#/components/responses/Error" }
20423
+ "404": { $ref: "#/components/responses/Error" }
20424
+ "409": { $ref: "#/components/responses/Error" }
20425
+ "503": { $ref: "#/components/responses/Error" }
20426
+ /clusters/{clusterID}/configuration/poddisruptionbudgets/{name}:
20427
+ delete:
20428
+ tags: [Platform]
20429
+ operationId: deleteKubernetesPodDisruptionBudget
20430
+ x-soha-permissions:
20431
+ mode: all
20432
+ keys: [platform.configuration.pod-disruption-budgets.delete]
20433
+ x-soha-implementation-status: implemented
20434
+ parameters:
20435
+ - $ref: "#/components/parameters/ClusterID"
20436
+ - $ref: "#/components/parameters/KubernetesResourceName"
20437
+ - $ref: "#/components/parameters/KubernetesNamespaceQuery"
20438
+ responses:
20439
+ "204": { description: Resource deleted. }
20440
+ "400": { $ref: "#/components/responses/Error" }
20441
+ "403": { $ref: "#/components/responses/Error" }
20442
+ "404": { $ref: "#/components/responses/Error" }
20443
+ "409": { $ref: "#/components/responses/Error" }
20444
+ "503": { $ref: "#/components/responses/Error" }
20445
+ /clusters/{clusterID}/configuration/poddisruptionbudgets/{name}/yaml:
20446
+ get:
20447
+ tags: [Platform]
20448
+ operationId: getKubernetesPodDisruptionBudgetYaml
20449
+ x-soha-permissions:
20450
+ mode: all
20451
+ keys: [platform.configuration.pod-disruption-budgets.view]
20452
+ x-soha-implementation-status: implemented
20453
+ parameters:
20454
+ - $ref: "#/components/parameters/ClusterID"
20455
+ - $ref: "#/components/parameters/KubernetesResourceName"
20456
+ - $ref: "#/components/parameters/KubernetesNamespaceQuery"
20457
+ responses:
20458
+ "200":
20459
+ description: Authorized Kubernetes resource YAML.
20460
+ content:
20461
+ application/json:
20462
+ schema:
20463
+ $ref: "#/components/schemas/KubernetesResourceYamlEnvelope"
20464
+ "400": { $ref: "#/components/responses/Error" }
20465
+ "403": { $ref: "#/components/responses/Error" }
20466
+ "404": { $ref: "#/components/responses/Error" }
20467
+ "409": { $ref: "#/components/responses/Error" }
20468
+ "503": { $ref: "#/components/responses/Error" }
20469
+ put:
20470
+ tags: [Platform]
20471
+ operationId: applyKubernetesPodDisruptionBudgetYaml
20472
+ x-soha-permissions:
20473
+ mode: all
20474
+ keys: [platform.configuration.pod-disruption-budgets.update]
20475
+ x-soha-implementation-status: implemented
20476
+ parameters:
20477
+ - $ref: "#/components/parameters/ClusterID"
20478
+ - $ref: "#/components/parameters/KubernetesResourceName"
20479
+ - $ref: "#/components/parameters/KubernetesNamespaceQuery"
20480
+ requestBody:
20481
+ required: true
20482
+ content:
20483
+ application/json:
20484
+ schema:
20485
+ $ref: "#/components/schemas/KubernetesResourceYamlInput"
20486
+ responses:
20487
+ "200":
20488
+ description: Authorized Kubernetes resource YAML.
20489
+ content:
20490
+ application/json:
20491
+ schema:
20492
+ $ref: "#/components/schemas/KubernetesResourceYamlEnvelope"
20493
+ "400": { $ref: "#/components/responses/Error" }
20494
+ "403": { $ref: "#/components/responses/Error" }
20495
+ "404": { $ref: "#/components/responses/Error" }
20496
+ "409": { $ref: "#/components/responses/Error" }
20497
+ "503": { $ref: "#/components/responses/Error" }
20498
+ /clusters/{clusterID}/workloads/replicationcontrollers/{name}:
20499
+ delete:
20500
+ tags: [Platform]
20501
+ operationId: deleteKubernetesReplicationController
20502
+ x-soha-permissions:
20503
+ mode: all
20504
+ keys: [platform.workloads.replication-controllers.delete]
20505
+ x-soha-implementation-status: implemented
20506
+ parameters:
20507
+ - $ref: "#/components/parameters/ClusterID"
20508
+ - $ref: "#/components/parameters/KubernetesResourceName"
20509
+ - $ref: "#/components/parameters/KubernetesNamespaceQuery"
20510
+ responses:
20511
+ "204": { description: Resource deleted. }
20512
+ "400": { $ref: "#/components/responses/Error" }
20513
+ "403": { $ref: "#/components/responses/Error" }
20514
+ "404": { $ref: "#/components/responses/Error" }
20515
+ "409": { $ref: "#/components/responses/Error" }
20516
+ "503": { $ref: "#/components/responses/Error" }
20517
+
19150
20518
  components:
19151
20519
  securitySchemes:
19152
20520
  bearerAuth:
@@ -20062,6 +21430,7 @@ components:
20062
21430
  schema:
20063
21431
  type: string
20064
21432
  enum: [default, bypass, read-only, refresh]
21433
+ x-enum-varnames: [CreateAIGatewayOpenAICompatibleProviderResponseParamsXSohaCacheModeDefault, CreateAIGatewayOpenAICompatibleProviderResponseParamsXSohaCacheModeBypass, CreateAIGatewayOpenAICompatibleProviderResponseParamsXSohaCacheModeReadOnly, CreateAIGatewayOpenAICompatibleProviderResponseParamsXSohaCacheModeRefresh]
20065
21434
  description: Optional relay cache behavior hint.
20066
21435
  headers:
20067
21436
  SohaRouteIDHeader:
@@ -24417,9 +25786,13 @@ components:
24417
25786
  name: { type: string, minLength: 1, maxLength: 160 }
24418
25787
  kind: { type: string, enum: [inline, http, git, object] }
24419
25788
  version: { type: string, maxLength: 64 }
24420
- secretRef: { type: string, maxLength: 512 }
25789
+ secretRef:
25790
+ type: string
25791
+ maxLength: 512
25792
+ description: "Gateway execution uses soha://secrets/<id> with an optional /versions/<n>. Legacy secret: references remain readable but require explicit configuration migration before execution."
24421
25793
  config:
24422
25794
  type: object
25795
+ description: External connector config may include importPolicy conforming to knowledge/source-import-policy.schema.json. Core uses this trusted ceiling; fetched ACLs cannot expand it. Omission defaults to the knowledge-base owner. Credentials use secretRef and Gateway authorization, never config values.
24423
25796
  additionalProperties: true
24424
25797
  syncPolicy: { $ref: "#/components/schemas/KnowledgeSyncPolicy" }
24425
25798
  additionalProperties: false
@@ -24785,6 +26158,7 @@ components:
24785
26158
  sourceType: { type: string, enum: [explicit_user, curated_extractor] }
24786
26159
  sourceRefs:
24787
26160
  type: array
26161
+ description: 'Source receipts. Workbench model context supports soha://session/<sessionId>/message/<messageId> and rechecks current ownership and source access. Unsupported historical references remain stored but are withheld from model context.'
24788
26162
  maxItems: 32
24789
26163
  items: { type: string }
24790
26164
  confidence: { type: number, minimum: 0, maximum: 1 }
@@ -25050,14 +26424,53 @@ components:
25050
26424
  createdAt: { type: string, format: date-time }
25051
26425
  updatedAt: { type: string, format: date-time }
25052
26426
  additionalProperties: false
26427
+ PersonalDockerEnvironmentPolicy:
26428
+ type: object
26429
+ description: Administrator-selected registered Agent connection and hard personal-data quota. No user-entered URL, Docker handle, image or credential. Only container templates can use this policy; existing bindings freeze it and cannot silently move or resize their data. Runtime readiness still requires real Agent receipts.
26430
+ required: [agentClusterId, quota, leaseSeconds]
26431
+ properties:
26432
+ agentClusterId: { type: string, format: uuid }
26433
+ quota:
26434
+ $ref: "#/components/schemas/PersonalEnvironmentQuota"
26435
+ leaseSeconds: { type: integer, minimum: 60, maximum: 3600 }
26436
+ additionalProperties: false
26437
+ PersonalVMEnvironmentPolicy:
26438
+ type: object
26439
+ description: Administrator assignment of an existing Soha-managed PVE VM and independent data disk to one user. The server checks administrator VM access update scope and the current approved owner's VM view scope. Binding freezes fresh provider and disk identity; saving or binding does not initialize data or grant runtime readiness. No provider URL, credential, root disk or arbitrary device path is accepted.
26440
+ required: [ownerId, computeRef, provider, dataDiskSerial, dataDiskBytes, quota, leaseSeconds]
26441
+ properties:
26442
+ ownerId: { type: string, format: uuid }
26443
+ computeRef: { type: string, format: uuid, description: Soha VM ID, not a provider VM number. }
26444
+ provider: { type: string, enum: [pve] }
26445
+ dataDiskSerial: { type: string, pattern: '^[A-Za-z0-9_-]{1,20}$' }
26446
+ dataDiskBytes: { type: integer, format: int64, minimum: 1073741824, maximum: 1099511627776, multipleOf: 1073741824, description: Exact independent disk size in whole GiB. }
26447
+ quota:
26448
+ $ref: "#/components/schemas/PersonalEnvironmentQuota"
26449
+ leaseSeconds: { type: integer, minimum: 60, maximum: 3600 }
26450
+ additionalProperties: false
26451
+ PersonalEnvironmentQuota:
26452
+ type: object
26453
+ required: [diskBytes, memoryBytes, cpuUnits, maxProcesses, networkEgress]
26454
+ properties:
26455
+ diskBytes: { type: integer, format: int64, minimum: 16777216, maximum: 1099511627776, description: Hard charged persistent-data bytes; temporary mounts charge memory instead. }
26456
+ memoryBytes: { type: integer, format: int64, minimum: 33554432, maximum: 17179869184 }
26457
+ cpuUnits: { type: integer, format: int64, minimum: 1, maximum: 8000, description: CPU millicores; 1000 is one CPU. }
26458
+ maxProcesses: { type: integer, minimum: 4, maximum: 256 }
26459
+ networkEgress: { type: boolean, const: false, description: Direct network access is not supported by this personal environment policy. }
26460
+ additionalProperties: false
25053
26461
  AIEnvironmentTemplateInput:
25054
26462
  type: object
26463
+ description: Personal policies are mutually exclusive and require matching container or vm backend, an ID of at most 128 characters, and empty legacy resourcePolicy/networkPolicy maps. VM backend requires personalVM; its quota cannot exceed the independent disk size. The server checks current resource scope and explicit owner assignment; saving configuration is not an environment readiness receipt.
25055
26464
  required: [id, name, backend, isolationMode]
25056
26465
  properties:
25057
26466
  id: { type: string, minLength: 1 }
25058
26467
  name: { type: string, minLength: 1 }
25059
- backend: { type: string, enum: [container, kubernetes] }
26468
+ backend: { type: string, enum: [container, kubernetes, vm] }
25060
26469
  isolationMode: { type: string, enum: [read-only, disposable-write] }
26470
+ personalDocker:
26471
+ $ref: "#/components/schemas/PersonalDockerEnvironmentPolicy"
26472
+ personalVM:
26473
+ $ref: "#/components/schemas/PersonalVMEnvironmentPolicy"
25061
26474
  resourcePolicy:
25062
26475
  type: object
25063
26476
  additionalProperties: true
@@ -25067,12 +26480,17 @@ components:
25067
26480
  additionalProperties: false
25068
26481
  AIEnvironmentTemplate:
25069
26482
  type: object
26483
+ description: Personal policies are mutually exclusive and require matching container or vm backend, an ID of at most 128 characters, and empty legacy resourcePolicy/networkPolicy maps. VM backend requires personalVM; its quota cannot exceed the independent disk size. The server checks current resource scope and explicit owner assignment; saving configuration is not an environment readiness receipt.
25070
26484
  required: [id, name, backend, isolationMode, status, createdAt, updatedAt]
25071
26485
  properties:
25072
26486
  id: { type: string, minLength: 1 }
25073
26487
  name: { type: string, minLength: 1 }
25074
- backend: { type: string, enum: [container, kubernetes] }
26488
+ backend: { type: string, enum: [container, kubernetes, vm] }
25075
26489
  isolationMode: { type: string, enum: [read-only, disposable-write] }
26490
+ personalDocker:
26491
+ $ref: "#/components/schemas/PersonalDockerEnvironmentPolicy"
26492
+ personalVM:
26493
+ $ref: "#/components/schemas/PersonalVMEnvironmentPolicy"
25076
26494
  resourcePolicy:
25077
26495
  type: object
25078
26496
  additionalProperties: true
@@ -25319,7 +26737,18 @@ components:
25319
26737
  content: { type: string }
25320
26738
  uri: { type: string }
25321
26739
  version: { type: string }
26740
+ deleted:
26741
+ type: boolean
26742
+ description: Explicit source tombstone for this externalId. Missing documents in a partial fetch do not imply deletion. A tombstone has empty content.
25322
26743
  acl: { $ref: "#/components/schemas/KnowledgeAccessScope" }
26744
+ allOf:
26745
+ - if:
26746
+ required: [deleted]
26747
+ properties:
26748
+ deleted: { const: true }
26749
+ then:
26750
+ properties:
26751
+ content: { maxLength: 0 }
25323
26752
  additionalProperties: false
25324
26753
  KnowledgeDocument:
25325
26754
  type: object
@@ -25417,6 +26846,9 @@ components:
25417
26846
  uri: { type: string }
25418
26847
  score: { type: number }
25419
26848
  contentHash: { type: string }
26849
+ documentVersionId: { type: string }
26850
+ indexRevisionId: { type: string }
26851
+ retrievedAt: { type: string, format: date-time }
25420
26852
  additionalProperties: false
25421
26853
  KnowledgeSearchHit:
25422
26854
  type: object
@@ -25447,6 +26879,8 @@ components:
25447
26879
  timingMs: { type: integer, format: int64, minimum: 0 }
25448
26880
  noAnswer: { type: boolean }
25449
26881
  traceId: { type: string }
26882
+ retrievalMode: { type: string, enum: [lexical, hybrid] }
26883
+ degradationReason: { type: string }
25450
26884
  additionalProperties: false
25451
26885
  EvaluationDatasetSample:
25452
26886
  type: object
@@ -26160,7 +27594,10 @@ components:
26160
27594
  type: object
26161
27595
  properties:
26162
27596
  publicModel: { type: string, maxLength: 200 }
26163
- reasoningEffort: { type: string, enum: [auto, low, medium, high] }
27597
+ reasoningEffort:
27598
+ type: string
27599
+ enum: [auto, low, medium, high]
27600
+ x-enum-varnames: [WorkbenchModelPreferencesReasoningEffortAuto, WorkbenchModelPreferencesReasoningEffortLow, WorkbenchModelPreferencesReasoningEffortMedium, WorkbenchModelPreferencesReasoningEffortHigh]
26164
27601
  additionalProperties: false
26165
27602
  WorkbenchModelOption:
26166
27603
  type: object
@@ -26170,10 +27607,32 @@ components:
26170
27607
  reasoningEfforts:
26171
27608
  type: array
26172
27609
  items: { type: string, enum: [low, medium, high] }
27610
+ contextWindowTokens:
27611
+ type: integer
27612
+ format: int64
27613
+ minimum: 1
27614
+ description: Configured model window in tokens. Omitted when any eligible route has no valid capacity; otherwise the smallest eligible route capacity. Never inferred from the model name.
27615
+ additionalProperties: false
27616
+ WorkbenchContextUsage:
27617
+ type: object
27618
+ required: [measurement]
27619
+ description: Latest single model invocation, not cumulative Agent task consumption or selected evidence size. Missing counts and capacity are unknown, not zero. Capacity is snapshotted from the actual resolved route.
27620
+ properties:
27621
+ measurement: { type: string, enum: [reported, estimated, unavailable] }
27622
+ model: { type: string }
27623
+ inputTokens: { type: integer, format: int64, minimum: 0 }
27624
+ outputTokens: { type: integer, format: int64, minimum: 0 }
27625
+ totalTokens: { type: integer, format: int64, minimum: 0 }
27626
+ contextWindowTokens: { type: integer, format: int64, minimum: 1 }
26173
27627
  additionalProperties: false
26174
27628
  WorkbenchSessionMetadata:
26175
27629
  type: object
26176
27630
  properties:
27631
+ conversationKind:
27632
+ type: string
27633
+ enum: [main, side, personal_main, personal_side]
27634
+ readOnly: true
27635
+ description: Server-owned chat role. Older sessions without a role remain side chats. Main chats cannot be archived or deleted through the ordinary session operations.
26177
27636
  modelPreferences:
26178
27637
  $ref: "#/components/schemas/WorkbenchModelPreferences"
26179
27638
  mode:
@@ -26220,6 +27679,340 @@ components:
26220
27679
  createdAt: { type: string, format: date-time }
26221
27680
  updatedAt: { type: string, format: date-time }
26222
27681
  additionalProperties: false
27682
+ PersonalAgentAccess:
27683
+ type: object
27684
+ required: [userId, status, version]
27685
+ properties:
27686
+ userId: { type: string }
27687
+ status:
27688
+ type: string
27689
+ enum: [not_requested, pending, approved, rejected, revoked]
27690
+ version: { type: integer, format: int64, minimum: 0 }
27691
+ requestedAt: { type: string, format: date-time }
27692
+ decidedAt: { type: string, format: date-time }
27693
+ decidedBy: { type: string }
27694
+ additionalProperties: false
27695
+ PersonalAgentAccessDecision:
27696
+ type: object
27697
+ required: [status, version]
27698
+ properties:
27699
+ status: { type: string, enum: [approved, rejected, revoked] }
27700
+ version: { type: integer, format: int64, minimum: 1 }
27701
+ additionalProperties: false
27702
+ PersonalAgentAccessEnvelope:
27703
+ type: object
27704
+ required: [data]
27705
+ properties:
27706
+ data: { $ref: "#/components/schemas/PersonalAgentAccess" }
27707
+ additionalProperties: false
27708
+ PersonalAgentAccessListEnvelope:
27709
+ type: object
27710
+ required: [data]
27711
+ properties:
27712
+ data:
27713
+ type: array
27714
+ items: { $ref: "#/components/schemas/PersonalAgentAccess" }
27715
+ additionalProperties: false
27716
+ PersonalAssistant:
27717
+ type: object
27718
+ required: [id, name, mainSessionId, createdAt, updatedAt]
27719
+ properties:
27720
+ id: { type: string, readOnly: true }
27721
+ name: { type: string, minLength: 1, maxLength: 60 }
27722
+ avatarUrl:
27723
+ description: Bounded raster data URL belonging to this assistant, not the login account. Empty or absent uses the default image.
27724
+ type: string
27725
+ maxLength: 700000
27726
+ avatarPosterUrl:
27727
+ description: Static PNG/JPEG data URL used when motion is disabled or reduced.
27728
+ type: string
27729
+ maxLength: 150000
27730
+ avatarMotion: { type: string, enum: [auto, off] }
27731
+ mainSessionId: { type: string, readOnly: true }
27732
+ createdAt: { type: string, format: date-time, readOnly: true }
27733
+ updatedAt: { type: string, format: date-time, readOnly: true }
27734
+ additionalProperties: false
27735
+ PersonalAssistantAvatarRequest:
27736
+ type: object
27737
+ required: [avatarUrl]
27738
+ properties:
27739
+ avatarUrl:
27740
+ type: string
27741
+ maxLength: 700000
27742
+ pattern: '^(data:image/(png|jpeg|gif|webp);base64,[A-Za-z0-9+/]+={0,2})?$'
27743
+ avatarPosterUrl:
27744
+ type: string
27745
+ maxLength: 150000
27746
+ pattern: '^(data:image/(png|jpeg);base64,[A-Za-z0-9+/]+={0,2})?$'
27747
+ avatarMotion: { type: string, enum: [auto, off], default: auto }
27748
+ additionalProperties: false
27749
+ PersonalEnvironmentActionRequest:
27750
+ type: object
27751
+ required: [action]
27752
+ properties:
27753
+ action: { type: string, enum: [wake, sleep, reconcile] }
27754
+ templateId:
27755
+ description: Required on first wake; may only select the already bound template afterward. Only wake accepts this field.
27756
+ type: string
27757
+ minLength: 1
27758
+ maxLength: 128
27759
+ additionalProperties: false
27760
+ PersonalEnvironmentUsage:
27761
+ type: object
27762
+ required: [diskBytes, memoryBytes, cpuTimeNanos, processes]
27763
+ properties:
27764
+ diskBytes: { type: integer, format: int64, minimum: 0 }
27765
+ memoryBytes: { type: integer, format: int64, minimum: 0 }
27766
+ cpuTimeNanos: { type: integer, format: int64, minimum: 0 }
27767
+ processes: { type: integer, minimum: 0 }
27768
+ additionalProperties: false
27769
+ PersonalEnvironment:
27770
+ type: object
27771
+ required: [assistantId, state, version, dataInitialized]
27772
+ properties:
27773
+ assistantId: { type: string, minLength: 1, readOnly: true }
27774
+ templateId: { type: string, minLength: 1, maxLength: 128, readOnly: true }
27775
+ backend: { type: string, enum: [container, vm], readOnly: true, description: Frozen execution backend of this binding; never inferred from the current template. }
27776
+ provider: { type: string, enum: [docker, pve, kubevirt], readOnly: true }
27777
+ policyRevision: { type: string, minLength: 1, maxLength: 128, readOnly: true, description: Frozen policy identity. legacy-docker-v1 preserves the original stored lease and quota. }
27778
+ computeRef: { type: string, minLength: 1, maxLength: 128, readOnly: true, description: Opaque execution reference; not a physical handle or readiness proof. }
27779
+ computeGeneration: { type: integer, format: int64, minimum: 0, readOnly: true, description: Reserved execution generation; zero means no execution has been reserved. }
27780
+ dataRef: { type: string, minLength: 1, maxLength: 128, readOnly: true, description: Stable logical personal-data identity. Existence requires a fresh authorized receipt. }
27781
+ state:
27782
+ type: string
27783
+ enum: [unprovisioned, pending, ready, sleeping, missing, expired, unknown, quota_exceeded, deleting, deletion_unknown, deleted]
27784
+ readOnly: true
27785
+ version: { type: integer, format: int64, minimum: 0, readOnly: true }
27786
+ dataInitialized:
27787
+ description: A successful past data receipt; does not prove that data currently exists or that the environment is ready.
27788
+ type: boolean
27789
+ readOnly: true
27790
+ quota:
27791
+ $ref: "#/components/schemas/PersonalEnvironmentQuota"
27792
+ usage:
27793
+ $ref: "#/components/schemas/PersonalEnvironmentUsage"
27794
+ observedAt: { type: string, format: date-time, readOnly: true }
27795
+ expiresAt: { type: string, format: date-time, readOnly: true }
27796
+ updatedAt: { type: string, format: date-time, readOnly: true }
27797
+ additionalProperties: false
27798
+ PersonalEnvironmentTemplate:
27799
+ type: object
27800
+ required: [id, name, mode, leaseSeconds, quota]
27801
+ properties:
27802
+ id: { type: string, minLength: 1, maxLength: 128 }
27803
+ name: { type: string, minLength: 1, maxLength: 200 }
27804
+ backend: { type: string, enum: [container, vm] }
27805
+ provider: { type: string, enum: [docker, pve, kubevirt] }
27806
+ policyRevision: { type: string, minLength: 1, maxLength: 128 }
27807
+ mode: { type: string, enum: [observe-only, restricted-write] }
27808
+ leaseSeconds: { type: integer, minimum: 60, maximum: 3600 }
27809
+ quota:
27810
+ $ref: "#/components/schemas/PersonalEnvironmentQuota"
27811
+ additionalProperties: false
27812
+ PersonalEnvironmentTemplateListEnvelope:
27813
+ type: object
27814
+ required: [data]
27815
+ properties:
27816
+ data:
27817
+ type: array
27818
+ maxItems: 100
27819
+ items:
27820
+ $ref: "#/components/schemas/PersonalEnvironmentTemplate"
27821
+ additionalProperties: false
27822
+ PersonalEnvironmentEnvelope:
27823
+ type: object
27824
+ required: [data]
27825
+ properties:
27826
+ data:
27827
+ $ref: "#/components/schemas/PersonalEnvironment"
27828
+ additionalProperties: false
27829
+ PersonalGuestRuntimeInput:
27830
+ type: object
27831
+ additionalProperties: false
27832
+ required: [environmentVersion, idempotencyKey, kind]
27833
+ properties:
27834
+ environmentVersion: { type: integer, format: int64, minimum: 1, maximum: 9007199254740991 }
27835
+ idempotencyKey: { type: string, minLength: 8, maxLength: 128, pattern: "^[a-zA-Z0-9_-]+$" }
27836
+ kind: { type: string, enum: [execute, file_read, file_write, docker, browser] }
27837
+ argv:
27838
+ type: array
27839
+ minItems: 1
27840
+ maxItems: 64
27841
+ items: { type: string, maxLength: 4096 }
27842
+ file:
27843
+ type: object
27844
+ additionalProperties: false
27845
+ required: [path]
27846
+ properties:
27847
+ path: { type: string, minLength: 1, maxLength: 1024 }
27848
+ contentBase64: { type: string, maxLength: 60076 }
27849
+ expectedSHA256: { type: string, pattern: "^[a-f0-9]{64}$" }
27850
+ browser:
27851
+ type: object
27852
+ additionalProperties: false
27853
+ required: [action]
27854
+ properties:
27855
+ action: { type: string, enum: [acquire, snapshot, navigate, click, type, pointer, takeover, return, release] }
27856
+ controlId: { type: string, format: uuid }
27857
+ generation: { type: integer, format: int64, minimum: 1, maximum: 9007199254740991 }
27858
+ url: { type: string, maxLength: 4096 }
27859
+ selector: { type: string, maxLength: 2048 }
27860
+ text: { type: string, maxLength: 4096 }
27861
+ x: { type: integer, minimum: 0, maximum: 799 }
27862
+ y: { type: integer, minimum: 0, maximum: 599 }
27863
+ PersonalGuestRuntime:
27864
+ type: object
27865
+ additionalProperties: false
27866
+ required: [id, kind, status, assistantId, environmentVersion]
27867
+ properties:
27868
+ id: { type: string, format: uuid }
27869
+ kind: { type: string, enum: [execute, file_read, file_write, docker, browser] }
27870
+ status: { type: string, enum: [queued, running, succeeded, failed, canceled, unknown] }
27871
+ assistantId: { type: string, format: uuid }
27872
+ environmentVersion: { type: integer, format: int64, minimum: 1, maximum: 9007199254740991 }
27873
+ output: { type: string, maxLength: 65536 }
27874
+ exitCode: { type: integer, minimum: 0, maximum: 255 }
27875
+ file:
27876
+ type: object
27877
+ additionalProperties: false
27878
+ required: [path, sha256, size]
27879
+ properties:
27880
+ path: { type: string, maxLength: 1024 }
27881
+ contentBase64: { type: string, maxLength: 60076 }
27882
+ sha256: { type: string, pattern: "^[a-f0-9]{64}$" }
27883
+ size: { type: integer, format: int64, minimum: 0, maximum: 45056 }
27884
+ browser:
27885
+ type: object
27886
+ additionalProperties: false
27887
+ required: [controlId, generation, instanceId, width, height]
27888
+ properties:
27889
+ controlId: { type: string, format: uuid }
27890
+ generation: { type: integer, format: int64, minimum: 1, maximum: 9007199254740991 }
27891
+ instanceId: { type: string, format: uuid }
27892
+ url: { type: string, maxLength: 4096 }
27893
+ title: { type: string, maxLength: 512 }
27894
+ text: { type: string, maxLength: 4096 }
27895
+ jpegBase64: { type: string, maxLength: 49152 }
27896
+ width: { type: integer, const: 800 }
27897
+ height: { type: integer, const: 600 }
27898
+ PersonalWorkspaceRuntime:
27899
+ type: object
27900
+ additionalProperties: false
27901
+ required: [assistantId, environmentVersion]
27902
+ properties:
27903
+ assistantId: { type: string, format: uuid }
27904
+ environmentVersion: { type: integer, format: int64, minimum: 1, maximum: 9007199254740991 }
27905
+ latest: { $ref: "#/components/schemas/PersonalGuestRuntime" }
27906
+ browserControl:
27907
+ type: object
27908
+ additionalProperties: false
27909
+ required: [controlId, generation, owner, expiresAt]
27910
+ properties:
27911
+ controlId: { type: string, format: uuid }
27912
+ generation: { type: integer, format: int64, minimum: 1, maximum: 9007199254740991 }
27913
+ owner: { type: string, enum: [user, agent, released] }
27914
+ taskId: { type: string, format: uuid }
27915
+ instanceId: { type: string, format: uuid }
27916
+ expiresAt: { type: string, format: date-time }
27917
+ PersonalWorkspaceRuntimeEnvelope:
27918
+ type: object
27919
+ additionalProperties: false
27920
+ required: [data]
27921
+ properties:
27922
+ data: { $ref: "#/components/schemas/PersonalWorkspaceRuntime" }
27923
+ PersonalGuestRuntimeEnvelope:
27924
+ type: object
27925
+ additionalProperties: false
27926
+ required: [data]
27927
+ properties:
27928
+ data: { $ref: "#/components/schemas/PersonalGuestRuntime" }
27929
+ PersonalGuestToolsInput:
27930
+ type: object
27931
+ additionalProperties: false
27932
+ required: [environmentVersion, idempotencyKey]
27933
+ properties:
27934
+ environmentVersion: { type: integer, format: int64, minimum: 1, maximum: 9007199254740991 }
27935
+ idempotencyKey: { type: string, minLength: 8, maxLength: 128, pattern: "^[a-zA-Z0-9_-]+$" }
27936
+ PersonalGuestPreparationInput:
27937
+ type: object
27938
+ required: [environmentVersion, csrPEM]
27939
+ properties:
27940
+ environmentVersion: { type: integer, format: int64, minimum: 1, maximum: 9007199254740991 }
27941
+ csrPEM: { type: string, minLength: 1, maxLength: 4096, description: Signed Ed25519 CSR containing only a public key. Requested subject and identity never grant authority. }
27942
+ additionalProperties: false
27943
+ PersonalGuestPreparation:
27944
+ type: object
27945
+ required: [bindingId, enrollmentId, challenge, endpoint, certificatePEM, clientCAPEM, expiresAt]
27946
+ properties:
27947
+ bindingId: { type: string, format: uuid }
27948
+ enrollmentId: { type: string, format: uuid }
27949
+ challenge: { type: string, pattern: "^[A-Za-z0-9_-]{43}$", x-soha-sensitive: true, description: One-time 32-byte unpadded base64url token. Must not enter logs, audits, events or command receipts. }
27950
+ endpoint: { type: string, format: uri, maxLength: 512, description: Core-configured HTTPS guest endpoint; never a caller-selected destination. }
27951
+ certificatePEM: { type: string, minLength: 1, maxLength: 8192 }
27952
+ clientCAPEM: { type: string, minLength: 1, maxLength: 8192 }
27953
+ expiresAt: { type: string, format: date-time, description: The bootstrap challenge expiry, not an environment readiness or execution lease. }
27954
+ additionalProperties: false
27955
+ PersonalGuestPreparationEnvelope:
27956
+ type: object
27957
+ required: [data]
27958
+ properties:
27959
+ data: { $ref: "#/components/schemas/PersonalGuestPreparation" }
27960
+ additionalProperties: false
27961
+ PersonalEnvironmentDataExportRequest:
27962
+ type: object
27963
+ required: [assistantId, environmentVersion]
27964
+ properties:
27965
+ assistantId: { type: string, minLength: 1, maxLength: 128 }
27966
+ environmentVersion: { type: integer, format: int64, minimum: 1 }
27967
+ additionalProperties: false
27968
+ PersonalEnvironmentDataDeletionRequest:
27969
+ type: object
27970
+ required: [assistantId, environmentVersion, confirmationName]
27971
+ properties:
27972
+ assistantId: { type: string, minLength: 1, maxLength: 128 }
27973
+ environmentVersion: { type: integer, format: int64, minimum: 1 }
27974
+ confirmationName: { type: string, minLength: 1, maxLength: 60 }
27975
+ additionalProperties: false
27976
+ PersonalAssistantUpdateRequest:
27977
+ type: object
27978
+ required: [name]
27979
+ properties:
27980
+ name: { type: string, minLength: 1, maxLength: 60 }
27981
+ additionalProperties: false
27982
+ PersonalAssistantArtifact:
27983
+ type: object
27984
+ required: [id, artifact, createdAt]
27985
+ properties:
27986
+ id: { type: string, readOnly: true }
27987
+ sessionId: { type: string, readOnly: true }
27988
+ messageId: { type: string, readOnly: true }
27989
+ taskId: { type: string, readOnly: true }
27990
+ artifact:
27991
+ $ref: "#/components/schemas/WorkbenchAnalysisArtifact"
27992
+ createdAt: { type: string, format: date-time, readOnly: true }
27993
+ additionalProperties: false
27994
+ PersonalAssistantArtifactListEnvelope:
27995
+ type: object
27996
+ required: [data]
27997
+ properties:
27998
+ data:
27999
+ type: array
28000
+ maxItems: 50
28001
+ items:
28002
+ $ref: "#/components/schemas/PersonalAssistantArtifact"
28003
+ additionalProperties: false
28004
+ PersonalAssistantEnvelope:
28005
+ type: object
28006
+ required: [data]
28007
+ properties:
28008
+ data:
28009
+ $ref: "#/components/schemas/PersonalAssistant"
28010
+ additionalProperties: false
28011
+ WorkbenchMainSessionRequest:
28012
+ type: object
28013
+ properties:
28014
+ agentProviderId: { type: string, maxLength: 200 }
28015
+ additionalProperties: false
26223
28016
  WorkbenchCreateSessionRequest:
26224
28017
  type: object
26225
28018
  properties:
@@ -26274,9 +28067,11 @@ components:
26274
28067
  role:
26275
28068
  type: string
26276
28069
  enum: [user, assistant, system]
28070
+ x-enum-varnames: [WorkbenchMessageRoleUser, WorkbenchMessageRoleAssistant, WorkbenchMessageRoleSystem]
26277
28071
  content: { type: string }
26278
28072
  metadata:
26279
28073
  type: object
28074
+ description: Background provenance is stored in contextSnapshot (legacy contextEnvelope is readable). contextUsage describes the latest single model call; Native usage is cumulative task consumption. User metadata.images contains WorkbenchImageAttachment items. Completed assistant metadata may contain assistantReaction (one of 👋 👍 ❤️ 😊 🎉 💡 👀 🤔 ✅ 🙏) and server-bound requestMessageId for that reaction. Reactions are social acknowledgements, never approval or execution evidence.
26280
28075
  additionalProperties: {}
26281
28076
  createdAt: { type: string, format: date-time }
26282
28077
  additionalProperties: false
@@ -26886,6 +28681,11 @@ components:
26886
28681
  rootCauseRunId: { type: string }
26887
28682
  createdBy: { type: string }
26888
28683
  status: { type: string }
28684
+ executionOwner: { type: string, enum: [native, external] }
28685
+ phase: { type: string }
28686
+ stopReason: { type: string }
28687
+ eventSequence: { type: integer, minimum: 0 }
28688
+ usageKnown: { type: boolean }
26889
28689
  scope:
26890
28690
  $ref: "#/components/schemas/WorkbenchSessionScope"
26891
28691
  toolset:
@@ -27337,10 +29137,31 @@ components:
27337
29137
  ok:
27338
29138
  type: boolean
27339
29139
  additionalProperties: false
29140
+ WorkbenchAssistantTask:
29141
+ description: An explicit, owner-scoped assistant appearance task executed through chat. Images are bounded inline avatar assets, never arbitrary remote URLs. The instruction remains in content. No account identity or resource permissions change. Undo references a successful profile reply in the same owned session and rejects stale replacements.
29142
+ type: object
29143
+ required: [kind]
29144
+ properties:
29145
+ kind: { type: string, enum: [avatar, undo] }
29146
+ image:
29147
+ $ref: "#/components/schemas/PersonalAssistantAvatarRequest"
29148
+ useCurrentAvatar: { type: boolean }
29149
+ publicModel: { type: string, minLength: 1, maxLength: 128 }
29150
+ messageId: { type: string, minLength: 1, maxLength: 128 }
29151
+ additionalProperties: false
27340
29152
  WorkbenchSendMessageStreamRequest:
27341
29153
  type: object
27342
29154
  required: [content]
27343
29155
  properties:
29156
+ requestId:
29157
+ type: string
29158
+ minLength: 1
29159
+ maxLength: 128
29160
+ description: A stable per-turn idempotency key. Reusing it with different content or selections is rejected.
29161
+ taskIntent:
29162
+ $ref: "#/components/schemas/WorkbenchTaskIntent"
29163
+ assistantTask:
29164
+ $ref: "#/components/schemas/WorkbenchAssistantTask"
27344
29165
  contextSelection:
27345
29166
  $ref: "#/components/schemas/WorkbenchContextSelection"
27346
29167
  knowledgeContext:
@@ -27377,10 +29198,82 @@ components:
27377
29198
  type: object
27378
29199
  additionalProperties: {}
27379
29200
  additionalProperties: false
29201
+ WorkbenchTaskIntent:
29202
+ description: Capability preferences and explicit query parameters for this turn only. Does not change session mode, grant permission, or create scheduled inspections.
29203
+ type: object
29204
+ properties:
29205
+ capabilities:
29206
+ type: array
29207
+ maxItems: 4
29208
+ uniqueItems: true
29209
+ items: { type: string, enum: [root_cause, performance, trace, inspection_review] }
29210
+ dataSourceId:
29211
+ description: Legacy shared selection. A capability-specific data source takes precedence for that capability.
29212
+ type: string
29213
+ maxLength: 256
29214
+ performanceDataSourceId: { type: string, maxLength: 256 }
29215
+ traceDataSourceId: { type: string, maxLength: 256 }
29216
+ rootCauseProfileId: { type: string, maxLength: 256 }
29217
+ metricKey: { type: string, maxLength: 256 }
29218
+ traceId: { type: string, maxLength: 256 }
29219
+ minDurationMs: { type: integer, minimum: 0, maximum: 86400000, x-go-type-skip-optional-pointer: false }
29220
+ inspectionRunIds:
29221
+ type: array
29222
+ maxItems: 20
29223
+ uniqueItems: true
29224
+ items: { type: string, minLength: 1, maxLength: 128 }
29225
+ additionalProperties: false
29226
+ WorkbenchProfessionalCapabilityInput:
29227
+ type: object
29228
+ required: [sessionId, question, scope, intent]
29229
+ properties:
29230
+ sessionId: { type: string, minLength: 1, maxLength: 128 }
29231
+ question: { type: string, minLength: 1, maxLength: 16384 }
29232
+ locale: { type: string, maxLength: 35 }
29233
+ scope: { $ref: "#/components/schemas/WorkbenchSessionScope" }
29234
+ toolset: { $ref: "#/components/schemas/WorkbenchSessionToolset" }
29235
+ intent: { $ref: "#/components/schemas/WorkbenchTaskIntent" }
29236
+ additionalProperties: false
29237
+ AgentRunResumeRequest:
29238
+ type: object
29239
+ properties:
29240
+ input: { type: string, maxLength: 16384 }
29241
+ additionalProperties: false
29242
+ AgentRunEventListEnvelope:
29243
+ type: object
29244
+ required: [data]
29245
+ properties:
29246
+ data: { $ref: "#/components/schemas/AgentRunEventPage" }
29247
+ additionalProperties: false
29248
+ AgentRunEventPage:
29249
+ type: object
29250
+ required: [items, nextSequence, hasMore, resyncRequired]
29251
+ properties:
29252
+ items:
29253
+ type: array
29254
+ items: { $ref: "#/components/schemas/WorkbenchStreamEvent" }
29255
+ nextSequence: { type: integer, minimum: 0 }
29256
+ hasMore: { type: boolean }
29257
+ resyncRequired: { type: boolean }
29258
+ additionalProperties: false
29259
+ WorkbenchMessageSearchHit: {"type":"object","required":["sessionId","sessionTitle","messageId","role","snippet","createdAt"],"properties":{"sessionId":{"type":"string","maxLength":128},"sessionTitle":{"type":"string","maxLength":200},"messageId":{"type":"string","maxLength":128},"role":{"type":"string","enum":["user","assistant"],"x-enum-varnames":["WorkbenchMessageSearchHitRoleUser","WorkbenchMessageSearchHitRoleAssistant"]},"snippet":{"type":"string","maxLength":400},"createdAt":{"type":"string","format":"date-time"}},"additionalProperties":false}
29260
+ WorkbenchMessageSearchPage: {"type":"object","required":["items"],"properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/WorkbenchMessageSearchHit"}},"nextCursor":{"type":"string","maxLength":512}},"additionalProperties":false}
29261
+ WorkbenchMessageSearchEnvelope: {"type":"object","required":["data"],"properties":{"data":{"$ref":"#/components/schemas/WorkbenchMessageSearchPage"}},"additionalProperties":false}
29262
+ WorkbenchMessageWindow: {"type":"object","required":["messages"],"properties":{"messages":{"type":"array","items":{"$ref":"#/components/schemas/WorkbenchMessage"}},"beforeCursor":{"type":"string","maxLength":128},"afterCursor":{"type":"string","maxLength":128}},"additionalProperties":false}
29263
+ WorkbenchMessageWindowEnvelope: {"type":"object","required":["data"],"properties":{"data":{"$ref":"#/components/schemas/WorkbenchMessageWindow"}},"additionalProperties":false}
29264
+ PersonalFeedSettings: {"type":"object","required":["instructions","searchTool","autoUpdate"],"properties":{"instructions":{"type":"string","maxLength":2000},"searchTool":{"type":"string","maxLength":256},"autoUpdate":{"type":"boolean"}},"additionalProperties":false}
29265
+ PersonalFeedSource: {"type":"object","required":["url","title","excerpt"],"properties":{"url":{"type":"string","format":"uri","maxLength":2048,"pattern":"^https://"},"title":{"type":"string","maxLength":256},"excerpt":{"type":"string","maxLength":4000}},"additionalProperties":false}
29266
+ PersonalFeedItem: {"type":"object","required":["id","title","body","reason","sources","liked","createdAt"],"properties":{"id":{"type":"string","maxLength":128},"title":{"type":"string","maxLength":200},"body":{"type":"string","maxLength":4000},"reason":{"type":"string","maxLength":1000},"sources":{"type":"array","minItems":1,"maxItems":5,"items":{"$ref":"#/components/schemas/PersonalFeedSource"}},"liked":{"type":"boolean"},"createdAt":{"type":"string","format":"date-time"}},"additionalProperties":false}
29267
+ PersonalFeedSearchTool: {"type":"object","required":["name","title"],"properties":{"name":{"type":"string","maxLength":256},"title":{"type":"string","maxLength":256}},"additionalProperties":false}
29268
+ PersonalFeedPage: {"type":"object","required":["items","settings","state","searchTools"],"properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/PersonalFeedItem"}},"settings":{"$ref":"#/components/schemas/PersonalFeedSettings"},"state":{"type":"string","enum":["idle","queued","running","failed"]},"error":{"type":"string","maxLength":1000},"lastUpdatedAt":{"type":"string","format":"date-time"},"nextCursor":{"type":"string","maxLength":128},"searchTools":{"type":"array","items":{"$ref":"#/components/schemas/PersonalFeedSearchTool"}}},"additionalProperties":false}
29269
+ PersonalFeedEnvelope: {"type":"object","required":["data"],"properties":{"data":{"$ref":"#/components/schemas/PersonalFeedPage"}},"additionalProperties":false}
29270
+ PersonalFeedItemEnvelope: {"type":"object","required":["data"],"properties":{"data":{"$ref":"#/components/schemas/PersonalFeedItem"}},"additionalProperties":false}
29271
+ PersonalFeedFeedback: {"type":"object","required":[],"properties":{"liked":{"type":"boolean"},"hidden":{"type":"boolean"}},"additionalProperties":false}
27380
29272
  WorkbenchContextSelection:
27381
- description: Explicit references and UTF-8 text attachments for this request only. The server rechecks source access and records used content hashes and truncations. Not inherited by subsequent requests.
29273
+ description: Explicit references, UTF-8 text attachments and a bounded inline chat image for this request. Images are ordinary message content and never imply an assistant appearance change. Images are retained with the owned message; references are rechecked on use.
27382
29274
  type: object
27383
29275
  properties:
29276
+ feedItemId: { type: string, minLength: 1, maxLength: 128, description: Owned personal feed post, reloaded and checked by the server before discussion. }
27384
29277
  memoryIds:
27385
29278
  type: array
27386
29279
  maxItems: 20
@@ -27397,6 +29290,23 @@ components:
27397
29290
  maxItems: 8
27398
29291
  items:
27399
29292
  $ref: "#/components/schemas/WorkbenchTextAttachment"
29293
+ images:
29294
+ type: array
29295
+ maxItems: 1
29296
+ items:
29297
+ $ref: "#/components/schemas/WorkbenchImageAttachment"
29298
+ additionalProperties: false
29299
+ WorkbenchImageAttachment:
29300
+ description: Ordinary chat image, preserved without square cropping. Inline PNG/JPEG only, at most 700000 data URL characters and 1024 pixels on each edge. The server verifies MIME, decoded bytes and dimensions before storage or model invocation. No remote URL fetch. Message metadata.images retains the attachment for history and retry.
29301
+ type: object
29302
+ required: [id, name, dataUrl]
29303
+ properties:
29304
+ id: { type: string, minLength: 1, maxLength: 128 }
29305
+ name: { type: string, minLength: 1, maxLength: 256 }
29306
+ dataUrl:
29307
+ type: string
29308
+ maxLength: 700000
29309
+ pattern: '^data:image/(png|jpeg);base64,[A-Za-z0-9+/]+={0,2}$'
27400
29310
  additionalProperties: false
27401
29311
  WorkbenchContextReference:
27402
29312
  type: object
@@ -27570,7 +29480,7 @@ components:
27570
29480
  type: string
27571
29481
  providerKind:
27572
29482
  type: string
27573
- enum: [internal, hermes, openclaw, general, openai, anthropic, openai-compatible, deepseek, qwen, openrouter, azure-openai, gemini, cohere]
29483
+ enum: [internal, native, hermes, openclaw, general, openai, anthropic, openai-compatible, deepseek, qwen, openrouter, azure-openai, gemini, cohere]
27574
29484
  status:
27575
29485
  type: string
27576
29486
  enum: [queued, running, succeeded, failed, cancelled]
@@ -27712,6 +29622,7 @@ components:
27712
29622
  role:
27713
29623
  type: string
27714
29624
  enum: [assistant]
29625
+ x-enum-varnames: [AgentRunCallbackWorkbenchMessageDeltaEventRoleAssistant]
27715
29626
  contentDelta:
27716
29627
  type: string
27717
29628
  unevaluatedProperties: false
@@ -27727,6 +29638,7 @@ components:
27727
29638
  role:
27728
29639
  type: string
27729
29640
  enum: [assistant]
29641
+ x-enum-varnames: [AgentRunCallbackWorkbenchMessageDeltaEventRoleAssistant]
27730
29642
  content:
27731
29643
  type: string
27732
29644
  metadata:
@@ -33666,12 +35578,14 @@ components:
33666
35578
  type: object
33667
35579
  properties:
33668
35580
  helm: { $ref: "#/components/schemas/HelmExecutionTaskPayload" }
35581
+ sshCommand: { $ref: "#/components/schemas/AgentSSHCommandRequest" }
33669
35582
  additionalProperties: true
33670
35583
  x-go-type: map[string]any
33671
35584
  result:
33672
35585
  type: object
33673
35586
  properties:
33674
35587
  helm: { $ref: "#/components/schemas/HelmExecutionTaskResult" }
35588
+ sshCommand: { $ref: "#/components/schemas/AgentSSHCommandResult" }
33675
35589
  additionalProperties: true
33676
35590
  x-go-type: map[string]any
33677
35591
  x-go-type-skip-optional-pointer: true
@@ -33795,8 +35709,19 @@ components:
33795
35709
  name: { type: string }
33796
35710
  storage: { type: string }
33797
35711
  bus: { type: string }
35712
+ serial:
35713
+ type: string
35714
+ minLength: 1
35715
+ maxLength: 20
35716
+ pattern: '^[A-Za-z0-9_-]+$'
35717
+ description: Immutable guest-visible identity for a newly added PVE disk. Only accepted with add=true; resizing an existing disk preserves its identity. Providers without disk-identity support reject the request before modifying resources.
33798
35718
  sizeGiB: { type: integer, minimum: 1 }
33799
35719
  add: { type: boolean }
35720
+ if: { required: [serial] }
35721
+ then:
35722
+ required: [add]
35723
+ properties:
35724
+ add: { const: true }
33800
35725
  additionalProperties: false
33801
35726
  VirtualMachineNetworkChange:
33802
35727
  type: object
@@ -33895,10 +35820,298 @@ components:
33895
35820
  poolRevision: { type: integer, minimum: 1 }
33896
35821
  idempotencyKey: { type: string, minLength: 8, maxLength: 128 }
33897
35822
  additionalProperties: false
35823
+ VirtualizationCapacityPolicyMode:
35824
+ type: string
35825
+ enum: [unconfigured, observing, enforced]
35826
+ x-enum-varnames: [CapacityPolicyUnconfigured, CapacityPolicyObserving, CapacityPolicyEnforced]
35827
+ VirtualizationOvercommitPolicy:
35828
+ type: object
35829
+ required: [enabled, percent]
35830
+ properties:
35831
+ enabled: { type: boolean }
35832
+ percent: { type: integer, minimum: 100, maximum: 800 }
35833
+ additionalProperties: false
35834
+ VirtualizationMemoryOvercommitPolicy:
35835
+ type: object
35836
+ required: [enabled, percent]
35837
+ properties:
35838
+ enabled: { type: boolean }
35839
+ percent: { type: integer, minimum: 100, maximum: 150 }
35840
+ additionalProperties: false
35841
+ VirtualizationCapacityPolicyInput:
35842
+ type: object
35843
+ required: [expectedRevision, mode, cpu, memory]
35844
+ properties:
35845
+ expectedRevision: { type: integer, minimum: 0 }
35846
+ physicalSourceId:
35847
+ type: string
35848
+ minLength: 1
35849
+ maxLength: 128
35850
+ pattern: "^[A-Za-z0-9][A-Za-z0-9._-]*$"
35851
+ description: Administrator-confirmed identity of one physical PVE source. All aliases must join this identity before admission. Ordinary VM callers cannot choose a source.
35852
+ mode: { type: string, enum: [observing, enforced], x-enum-varnames: [CapacityPolicyInputObserving, CapacityPolicyInputEnforced] }
35853
+ cpu: { $ref: "#/components/schemas/VirtualizationOvercommitPolicy" }
35854
+ memory: { $ref: "#/components/schemas/VirtualizationMemoryOvercommitPolicy" }
35855
+ additionalProperties: false
35856
+ VirtualizationCapacityPolicy:
35857
+ type: object
35858
+ required: [sourceId, revision, mode, cpu, memory]
35859
+ properties:
35860
+ sourceConfirmed: { type: boolean, description: New PVE sources use a strict 100 percent policy and cannot admit until an administrator confirms their physical source identity. }
35861
+ sourceId: { type: string }
35862
+ revision: { type: integer, minimum: 0 }
35863
+ mode: { $ref: "#/components/schemas/VirtualizationCapacityPolicyMode" }
35864
+ cpu: { $ref: "#/components/schemas/VirtualizationOvercommitPolicy" }
35865
+ memory: { $ref: "#/components/schemas/VirtualizationMemoryOvercommitPolicy" }
35866
+ updatedAt: { type: string, format: date-time }
35867
+ updatedBy: { type: string }
35868
+ additionalProperties: false
35869
+ VirtualizationCapacityPolicyEnvelope:
35870
+ type: object
35871
+ required: [data]
35872
+ properties:
35873
+ data: { $ref: "#/components/schemas/VirtualizationCapacityPolicy" }
35874
+ additionalProperties: false
35875
+ VirtualizationCapacityCheckDiagnostic:
35876
+ type: object
35877
+ required: [check, dimension, status, limit, committed, pending, demand, available, reason]
35878
+ properties:
35879
+ check: { type: string, enum: [budget, runtime, storage], x-enum-varnames: [VirtualizationCapacityCheckDiagnosticCheckBudget, VirtualizationCapacityCheckDiagnosticCheckRuntime, VirtualizationCapacityCheckDiagnosticCheckStorage] }
35880
+ dimension: { type: string, enum: [cpu, memory, disk], x-enum-varnames: [VirtualizationCapacityCheckDiagnosticDimensionCpu, VirtualizationCapacityCheckDiagnosticDimensionMemory, VirtualizationCapacityCheckDiagnosticDimensionDisk] }
35881
+ status: { type: string, enum: [available, unavailable, unknown], x-enum-varnames: [VirtualizationCapacityCheckDiagnosticStatusAvailable, VirtualizationCapacityCheckDiagnosticStatusUnavailable, VirtualizationCapacityCheckDiagnosticStatusUnknown] }
35882
+ limit: { type: integer, minimum: 0 }
35883
+ committed: { type: integer, minimum: 0 }
35884
+ pending: { type: integer, minimum: 0 }
35885
+ demand: { type: integer, minimum: 0 }
35886
+ available: { type: integer, minimum: 0 }
35887
+ reason: { type: string }
35888
+ additionalProperties: false
35889
+ VirtualizationCapacityNodeDiagnostic:
35890
+ type: object
35891
+ required: [node, checks]
35892
+ properties:
35893
+ node: { type: string }
35894
+ storage: { type: string }
35895
+ checks:
35896
+ type: array
35897
+ items: { $ref: "#/components/schemas/VirtualizationCapacityCheckDiagnostic" }
35898
+ additionalProperties: false
35899
+ SecretKind:
35900
+ type: string
35901
+ enum: [opaque, ssh_keypair, ssh_public_key, ssh_password]
35902
+ x-enum-varnames: [SecretKindOpaque, SecretKindSSHKeypair, SecretKindSSHPublicKey, SecretKindSSHPassword]
35903
+ SecretPurpose:
35904
+ type: string
35905
+ enum: [vm_cloud_init, vm_auth, vm_exec]
35906
+ x-enum-varnames: [SecretPurposeVMCloudInit, SecretPurposeVMAuth, SecretPurposeVMExec]
35907
+ SecretSSHPublicKey:
35908
+ type: object
35909
+ required: [authorizedKey, algorithm, fingerprint]
35910
+ properties:
35911
+ authorizedKey: { type: string, maxLength: 16384 }
35912
+ algorithm: { type: string }
35913
+ fingerprint: { type: string }
35914
+ additionalProperties: false
35915
+ SecretGenerateSSHKeyRequest:
35916
+ type: object
35917
+ required: [name, scopeType, scopeId, bindings]
35918
+ properties:
35919
+ name: { type: string, minLength: 1, maxLength: 128 }
35920
+ description: { type: string, maxLength: 1024 }
35921
+ scopeType: { $ref: "#/components/schemas/SecretScopeType" }
35922
+ scopeId: { type: string, minLength: 1, maxLength: 128 }
35923
+ bindings:
35924
+ type: array
35925
+ minItems: 1
35926
+ maxItems: 100
35927
+ items: { $ref: "#/components/schemas/SecretBinding" }
35928
+ additionalProperties: false
35929
+ VirtualMachineGuestAccessInput:
35930
+ type: object
35931
+ description: Managed first-boot public-key initialization. Requires a verified cloud-init image and excludes raw cloudInit and native sshkeys/cicustom fields. The server freezes each Secret version; private keys are never sent to the guest.
35932
+ required: [username, publicKeyRefs]
35933
+ properties:
35934
+ username: { type: string, pattern: "^[a-z_][a-z0-9_-]{0,31}$" }
35935
+ publicKeyRefs:
35936
+ type: array
35937
+ minItems: 1
35938
+ maxItems: 16
35939
+ uniqueItems: true
35940
+ items: { type: string, pattern: "^soha://secrets/[A-Za-z0-9._-]+(?:/versions/[1-9][0-9]*)?$" }
35941
+ additionalProperties: false
35942
+ VirtualMachineAccessBindingInput:
35943
+ type: object
35944
+ description: Metadata binding only; it does not install guest keys or alter VM configuration. Host keys must be independently verified by an authorized human before binding.
35945
+ required: [expectedRevision, username, port, address, credentialRef, executionClusterId, executionAgentId, trustedHostKey]
35946
+ properties:
35947
+ expectedRevision: { type: integer, minimum: 0 }
35948
+ username: { type: string, pattern: "^[a-z_][a-z0-9_-]{0,31}$" }
35949
+ port: { type: integer, minimum: 1, maximum: 65535 }
35950
+ address: { type: string, minLength: 1, maxLength: 253 }
35951
+ credentialRef: { type: string, pattern: "^soha://secrets/[A-Za-z0-9._-]+(?:/versions/[1-9][0-9]*)?$" }
35952
+ executionClusterId: { type: string, minLength: 1 }
35953
+ executionAgentId: { type: string, minLength: 1 }
35954
+ trustedHostKey: { type: string, minLength: 1, maxLength: 16384 }
35955
+ additionalProperties: false
35956
+ VirtualMachineAccessBinding:
35957
+ type: object
35958
+ required: [vmId, revision, providerVmId, sourceId, generation, username, port, address, credentialRef, executionClusterId, executionAgentId, hostKeyFingerprint, status]
35959
+ properties:
35960
+ vmId: { type: string }
35961
+ revision: { type: integer, minimum: 1 }
35962
+ providerVmId: { type: string }
35963
+ sourceId: { type: string }
35964
+ generation: { type: string }
35965
+ username: { type: string }
35966
+ port: { type: integer }
35967
+ address: { type: string }
35968
+ credentialRef: { type: string }
35969
+ executionClusterId: { type: string }
35970
+ executionAgentId: { type: string }
35971
+ hostKeyFingerprint: { type: string }
35972
+ status: { type: string, enum: [ready, unavailable, stale], x-enum-varnames: [VirtualMachineAccessBindingStatusReady, VirtualMachineAccessBindingStatusUnavailable, VirtualMachineAccessBindingStatusStale] }
35973
+ reason: { type: string }
35974
+ updatedAt: { type: string, format: date-time }
35975
+ additionalProperties: false
35976
+ VirtualMachineAccessBindingEnvelope:
35977
+ type: object
35978
+ required: [data]
35979
+ properties:
35980
+ data: { $ref: "#/components/schemas/VirtualMachineAccessBinding" }
35981
+ additionalProperties: false
35982
+ VirtualMachineSSHSessionInput:
35983
+ type: object
35984
+ required: [bindingRevision]
35985
+ properties:
35986
+ bindingRevision: { type: integer, minimum: 1 }
35987
+ cols: { type: integer, minimum: 1, maximum: 512, default: 80 }
35988
+ rows: { type: integer, minimum: 1, maximum: 512, default: 24 }
35989
+ additionalProperties: false
35990
+ VirtualMachineSSHSession:
35991
+ type: object
35992
+ required: [id, vmId, bindingRevision, status, expiresAt]
35993
+ properties:
35994
+ id: { type: string }
35995
+ vmId: { type: string }
35996
+ bindingRevision: { type: integer, minimum: 1 }
35997
+ status: { type: string, enum: [pending, active, closed, revoked, unknown], x-enum-varnames: [VirtualMachineSSHSessionStatusPending, VirtualMachineSSHSessionStatusActive, VirtualMachineSSHSessionStatusClosed, VirtualMachineSSHSessionStatusRevoked, VirtualMachineSSHSessionStatusUnknown] }
35998
+ expiresAt: { type: string, format: date-time }
35999
+ reason: { type: string }
36000
+ additionalProperties: false
36001
+ VirtualMachineSSHSessionEnvelope:
36002
+ type: object
36003
+ required: [data]
36004
+ properties:
36005
+ data: { $ref: "#/components/schemas/VirtualMachineSSHSession" }
36006
+ additionalProperties: false
36007
+ VirtualMachineSSHCommandInput:
36008
+ type: object
36009
+ required: [bindingRevision, command, idempotencyKey]
36010
+ properties:
36011
+ bindingRevision: { type: integer, minimum: 1 }
36012
+ command: { type: string, minLength: 1, maxLength: 16384, x-soha-sensitive: true }
36013
+ idempotencyKey: { type: string, minLength: 8, maxLength: 128 }
36014
+ timeoutSeconds: { type: integer, minimum: 1, maximum: 300, default: 60 }
36015
+ additionalProperties: false
36016
+ VirtualMachineSSHCommand:
36017
+ type: object
36018
+ required: [id, vmId, bindingRevision, status, outcome, terminal]
36019
+ properties:
36020
+ id: { type: string }
36021
+ vmId: { type: string }
36022
+ bindingRevision: { type: integer, minimum: 1 }
36023
+ status: { type: string }
36024
+ outcome: { type: string, enum: [unknown, succeeded, failed, canceled], x-enum-varnames: [VirtualMachineSSHCommandOutcomeUnknown, VirtualMachineSSHCommandOutcomeSucceeded, VirtualMachineSSHCommandOutcomeFailed, VirtualMachineSSHCommandOutcomeCanceled] }
36025
+ terminal: { type: boolean }
36026
+ exitCode: { type: integer, minimum: 0, maximum: 255, x-go-type-skip-optional-pointer: false }
36027
+ stdout: { type: string, maxLength: 1048576 }
36028
+ stderr: { type: string, maxLength: 1048576 }
36029
+ outputDigest: { type: string }
36030
+ outputTruncated: { type: boolean }
36031
+ finishedAt: { type: string, format: date-time }
36032
+ additionalProperties: false
36033
+ VirtualMachineSSHCommandEnvelope:
36034
+ type: object
36035
+ required: [data]
36036
+ properties:
36037
+ data: { $ref: "#/components/schemas/VirtualMachineSSHCommand" }
36038
+ additionalProperties: false
36039
+ AgentSSHCommandRequest:
36040
+ type: object
36041
+ required: [session, command, timeoutSeconds]
36042
+ properties:
36043
+ session: { $ref: "#/components/schemas/AgentSSHSessionRequest" }
36044
+ command: { type: string, minLength: 1, maxLength: 16384, x-soha-sensitive: true }
36045
+ timeoutSeconds: { type: integer, minimum: 1, maximum: 300 }
36046
+ additionalProperties: false
36047
+ AgentSSHCommandResult:
36048
+ type: object
36049
+ required: [sessionId, agentId, commandDigest, effect, stopped]
36050
+ properties:
36051
+ sessionId: { type: string }
36052
+ agentId: { type: string }
36053
+ commandDigest: { type: string }
36054
+ effect: { type: string, enum: [not_started, exited, unknown], x-enum-varnames: [AgentSSHCommandResultEffectNotStarted, AgentSSHCommandResultEffectExited, AgentSSHCommandResultEffectUnknown] }
36055
+ stopped: { type: boolean }
36056
+ exitCode: { type: integer, minimum: 0, maximum: 255, x-go-type-skip-optional-pointer: false }
36057
+ stdout: { type: string, maxLength: 1048576 }
36058
+ stderr: { type: string, maxLength: 1048576 }
36059
+ outputTruncated: { type: boolean }
36060
+ outputDigest: { type: string }
36061
+ additionalProperties: false
36062
+ VirtualMachineSSHFrame:
36063
+ type: object
36064
+ required: [type]
36065
+ properties:
36066
+ type: { type: string, enum: [input, resize, output, error, close], x-enum-varnames: [VirtualMachineSSHFrameTypeInput, VirtualMachineSSHFrameTypeResize, VirtualMachineSSHFrameTypeOutput, VirtualMachineSSHFrameTypeError, VirtualMachineSSHFrameTypeClose] }
36067
+ data: { type: string, maxLength: 87384 }
36068
+ dataEncoding: { type: string, enum: [utf8, base64], x-enum-varnames: [VirtualMachineSSHFrameDataEncodingUTF8, VirtualMachineSSHFrameDataEncodingBase64], description: Base64 carries exact terminal bytes including split UTF-8 sequences. Omitted means utf8 for legacy inputs. }
36069
+ exitCode: { type: integer, minimum: 0, maximum: 255, x-go-type-skip-optional-pointer: false }
36070
+ cols: { type: integer, minimum: 1, maximum: 512 }
36071
+ rows: { type: integer, minimum: 1, maximum: 512 }
36072
+ message: { type: string, maxLength: 1024 }
36073
+ additionalProperties: false
36074
+ AgentSSHSessionRequest:
36075
+ type: object
36076
+ required: [sessionId, agentId, executionClusterId, address, port, username, trustedHostKey, credentialKind, lease, controlPlaneEndpoint, expiresAt, cols, rows]
36077
+ properties:
36078
+ sessionId: { type: string }
36079
+ agentId: { type: string }
36080
+ executionClusterId: { type: string, minLength: 1 }
36081
+ address: { type: string }
36082
+ port: { type: integer, minimum: 1, maximum: 65535 }
36083
+ username: { type: string }
36084
+ trustedHostKey: { type: string, maxLength: 16384 }
36085
+ credentialKind: { $ref: "#/components/schemas/SecretKind" }
36086
+ lease: { $ref: "#/components/schemas/SecretLeaseGrant" }
36087
+ controlPlaneEndpoint: { type: string, format: uri }
36088
+ expiresAt: { type: string, format: date-time }
36089
+ cols: { type: integer, minimum: 1, maximum: 512 }
36090
+ rows: { type: integer, minimum: 1, maximum: 512 }
36091
+ additionalProperties: false
36092
+ VMSSHCredentialRedemptionInput:
36093
+ type: object
36094
+ required: [clusterId, agentId, leaseId, token]
36095
+ properties:
36096
+ clusterId: { type: string, minLength: 1 }
36097
+ agentId: { type: string, minLength: 1 }
36098
+ leaseId: { type: string, minLength: 1 }
36099
+ token: { type: string, minLength: 16, maxLength: 256, writeOnly: true }
36100
+ additionalProperties: false
36101
+ AgentSSHCapability:
36102
+ type: object
36103
+ required: [agentId, protocolVersion, available]
36104
+ properties:
36105
+ agentId: { type: string }
36106
+ protocolVersion: { type: integer, const: 1 }
36107
+ available: { type: boolean }
36108
+ commandsAvailable: { type: boolean }
36109
+ additionalProperties: false
33898
36110
  VirtualizationCapacityInput:
33899
36111
  type: object
33900
36112
  required: [connectionId, cpu, memoryMiB, diskGiB]
33901
36113
  properties:
36114
+ startAfterCreate: { type: boolean, default: true, x-go-type-skip-optional-pointer: false }
33902
36115
  connectionId: { type: string, minLength: 1 }
33903
36116
  cpu: { type: integer, minimum: 1, maximum: 65536, description: Dedicated CPU cores for a running VM. }
33904
36117
  memoryMiB: { type: integer, minimum: 1, maximum: 1099511627776, description: Guest memory in MiB; configured hypervisor overhead is added by the server. }
@@ -33913,6 +36126,12 @@ components:
33913
36126
  description: A read-only, expiring placement suggestion for one running VM and root disk. Missing or unsupported inventory remains unknown. Creation must independently require atomic capacity admission; this result is not a reservation or a readiness assessment.
33914
36127
  required: [connectionId, status, reason]
33915
36128
  properties:
36129
+ sourceId: { type: string }
36130
+ policyRevision: { type: integer, minimum: 0 }
36131
+ policyMode: { $ref: "#/components/schemas/VirtualizationCapacityPolicyMode" }
36132
+ diagnostics:
36133
+ type: array
36134
+ items: { $ref: "#/components/schemas/VirtualizationCapacityNodeDiagnostic" }
33916
36135
  connectionId: { type: string }
33917
36136
  provider: { type: string }
33918
36137
  status:
@@ -33936,12 +36155,13 @@ components:
33936
36155
  type: object
33937
36156
  required: [connectionId, name]
33938
36157
  properties:
36158
+ guestAccess: { $ref: "#/components/schemas/VirtualMachineGuestAccessInput" }
33939
36159
  connectionId: { type: string, minLength: 1 }
33940
36160
  name: { type: string, minLength: 1 }
33941
36161
  requireCapacity:
33942
36162
  type: boolean
33943
36163
  default: false
33944
- description: Require fresh provider capacity and reserve node CPU, memory and storage atomically with this operation. Missing inventory or unsupported placement fails closed. This controls concurrent Soha admission; provider admission and runtime readiness remain authoritative.
36164
+ description: Require fresh provider capacity and reserve node CPU, memory and storage atomically with this operation. Missing inventory or unsupported placement fails closed. An enforced source policy always requires admission, including when this field is false. Unconfigured legacy sources retain the explicit opt-in behavior. Provider admission and runtime readiness remain authoritative.
33945
36165
  architecture: { type: string }
33946
36166
  namespace: { type: string }
33947
36167
  node: { type: string }
@@ -33949,7 +36169,7 @@ components:
33949
36169
  memoryMiB: { type: integer, minimum: 1 }
33950
36170
  bootImageId: { type: string }
33951
36171
  imageId: { type: string }
33952
- sourceMode: { type: string }
36172
+ sourceMode: { type: string, description: "PVE supports template_clone, vm_clone, iso_install and cloud_image. cloud_image imports a verified catalog QCOW2 volume into this new VM; it does not create or modify a source VM." }
33953
36173
  sourceId: { type: string }
33954
36174
  flavorId: { type: string }
33955
36175
  diskGiB: { type: integer, minimum: 1 }
@@ -34212,6 +36432,9 @@ components:
34212
36432
  cpu: { type: integer, minimum: 0 }
34213
36433
  memoryMiB: { type: integer, minimum: 0 }
34214
36434
  diskGiB: { type: integer, minimum: 0 }
36435
+ requireCapacity:
36436
+ type: boolean
36437
+ description: Require fresh atomic capacity admission for start, reboot or resize even when cluster policy is unconfigured. False never bypasses an enforced policy. New disks require fixed slots, storage and serial identity; multiple storage pools require separate operations.
34215
36438
  disks:
34216
36439
  type: array
34217
36440
  maxItems: 64
@@ -34343,8 +36566,8 @@ components:
34343
36566
  architecture: { type: string }
34344
36567
  sizeBytes: { type: integer, format: int64, minimum: 0 }
34345
36568
  sizeGiB: { type: integer, format: int64, minimum: 0 }
34346
- sourceKind: { type: string }
34347
- sourceRef: { type: string }
36569
+ sourceKind: { type: string, description: "PVE cloud_image declares an already staged QCOW2 import volume. cloudInitSupported must be explicitly true for managed guest initialization." }
36570
+ sourceRef: { type: string, description: "For PVE cloud_image use storage:import/<SHA256>.qcow2 sealed with the filesystem immutable flag. The provider verifies immutability, format, digest, absence of backing files and requested root size before dispatch. Catalog creation registers metadata and does not itself upload a file." }
34348
36571
  namespace: { type: string }
34349
36572
  storageClass: { type: string }
34350
36573
  url: { type: string }
@@ -34551,6 +36774,8 @@ components:
34551
36774
  maxLength: 1048576
34552
36775
  description: Sensitive bootstrap content. It is never returned by plan or audit responses.
34553
36776
  x-soha-sensitive: true
36777
+ guestAccess:
36778
+ $ref: "#/components/schemas/VirtualMachineGuestAccessInput"
34554
36779
  cpuCoreCount: { type: integer, minimum: 1 }
34555
36780
  memoryBytes: { type: integer, minimum: 1 }
34556
36781
  diskBytes: { type: integer, minimum: 1 }
@@ -34957,6 +37182,11 @@ components:
34957
37182
  type: string
34958
37183
  status:
34959
37184
  type: string
37185
+ executionOwner: { type: string, enum: [native, external] }
37186
+ phase: { type: string }
37187
+ stopReason: { type: string }
37188
+ eventSequence: { type: integer, minimum: 0 }
37189
+ usageKnown: { type: boolean }
34960
37190
  scope:
34961
37191
  type: object
34962
37192
  additionalProperties: true
@@ -35241,6 +37471,10 @@ components:
35241
37471
  type: object
35242
37472
  required: [transport, syncStrategy, cacheStatus, cacheReady, connectionState]
35243
37473
  properties:
37474
+ actionChecks:
37475
+ type: array
37476
+ maxItems: 64
37477
+ items: { $ref: "#/components/schemas/KubernetesAgentActionCheck" }
35244
37478
  transport:
35245
37479
  type: string
35246
37480
  syncStrategy:
@@ -35261,6 +37495,22 @@ components:
35261
37495
  message:
35262
37496
  type: string
35263
37497
  additionalProperties: false
37498
+ KubernetesAgentActionCheck:
37499
+ type: object
37500
+ required: [action, implementation, configured, kubernetesRBAC]
37501
+ properties:
37502
+ action: { type: string }
37503
+ implementation: { type: string, enum: [supported, unsupported, unknown] }
37504
+ configured: { type: string, enum: [allowed, denied, unknown] }
37505
+ kubernetesRBAC: { type: string, enum: [allowed, denied, unknown, not_applicable] }
37506
+ checkedAt: { type: string, format: date-time }
37507
+ reasonCode: { type: string }
37508
+ scope: { type: string, enum: [cluster], x-enum-varnames: [KubernetesAgentActionCheckScopeCluster] }
37509
+ additionalProperties: false
37510
+ KubernetesAgentActionProfile:
37511
+ type: string
37512
+ enum: [legacy, workbench, read-only]
37513
+ description: Installation preset only. Legacy preserves existing permissions; selecting workbench or read-only requires regenerating and reviewing the installation manifest.
35264
37514
  KubernetesClusterConnectionDetail:
35265
37515
  type: object
35266
37516
  required: [mode, credentialType, sourceType, hasInlineKubeconfig, hasToken, usesInformerCache]
@@ -35283,6 +37533,7 @@ components:
35283
37533
  type: boolean
35284
37534
  usesInformerCache:
35285
37535
  type: boolean
37536
+ actionProfile: { $ref: "#/components/schemas/KubernetesAgentActionProfile" }
35286
37537
  customResourceRules:
35287
37538
  type: array
35288
37539
  maxItems: 50
@@ -35324,6 +37575,7 @@ components:
35324
37575
  prometheusClusterLabel: { type: string }
35325
37576
  grafanaBaseUrl: { type: string }
35326
37577
  prometheusTransport: { $ref: "#/components/schemas/KubernetesPrometheusTransport" }
37578
+ agentActionProfile: { $ref: "#/components/schemas/KubernetesAgentActionProfile" }
35327
37579
  agentCustomResourceRules:
35328
37580
  type: array
35329
37581
  maxItems: 50
@@ -35511,6 +37763,18 @@ components:
35511
37763
  type: string
35512
37764
  unschedulable:
35513
37765
  type: boolean
37766
+ taints:
37767
+ type: array
37768
+ nullable: true
37769
+ description: Current Node spec taints. Empty means none; null or absent means not reported.
37770
+ items:
37771
+ $ref: "#/components/schemas/KubernetesNodeTaint"
37772
+ conditions:
37773
+ type: array
37774
+ nullable: true
37775
+ description: Current Node conditions, independent of scheduling and drain operations.
37776
+ items:
37777
+ $ref: "#/components/schemas/KubernetesWorkloadCondition"
35514
37778
  roles:
35515
37779
  type: array
35516
37780
  items:
@@ -37951,6 +40215,193 @@ components:
37951
40215
  properties:
37952
40216
  data: { $ref: "#/components/schemas/KubernetesNetworkPolicyDetail" }
37953
40217
  additionalProperties: false
40218
+ KubernetesTopologyProvider:
40219
+ type: string
40220
+ enum: [kubernetes, gateway, traefik, apisix]
40221
+ x-enum-varnames: [KubernetesTopologyProviderKubernetes, KubernetesTopologyProviderGateway, KubernetesTopologyProviderTraefik, KubernetesTopologyProviderApisix]
40222
+ KubernetesTopologyResolution:
40223
+ type: string
40224
+ enum: [resolved, unresolved, not_found, not_visible, no_ready_endpoints, external, unsupported_fragment, unknown]
40225
+ x-enum-varnames: [KubernetesTopologyResolutionResolved, KubernetesTopologyResolutionUnresolved, KubernetesTopologyResolutionNotFound, KubernetesTopologyResolutionNotVisible, KubernetesTopologyResolutionNoReadyEndpoints, KubernetesTopologyResolutionExternal, KubernetesTopologyResolutionUnsupportedFragment, KubernetesTopologyResolutionUnknown]
40226
+ KubernetesTopologyProperty:
40227
+ type: object
40228
+ required: [name, value]
40229
+ properties:
40230
+ name: { type: string, maxLength: 64 }
40231
+ value: { type: string, maxLength: 1024 }
40232
+ additionalProperties: false
40233
+ KubernetesTopologyMatch:
40234
+ type: object
40235
+ required: [type]
40236
+ properties:
40237
+ type: { type: string, maxLength: 32 }
40238
+ name: { type: string, maxLength: 128 }
40239
+ operator: { type: string, maxLength: 32 }
40240
+ value: { type: string, maxLength: 1024 }
40241
+ additionalProperties: false
40242
+ KubernetesTopologyRule:
40243
+ type: object
40244
+ required: [index]
40245
+ properties:
40246
+ name: { type: string, maxLength: 253 }
40247
+ index: { type: integer, minimum: 0 }
40248
+ matchGroups:
40249
+ description: Groups are ORed; matches inside each group are ANDed. Opaque expressions remain a bounded summary and are marked unsupported_fragment.
40250
+ type: array
40251
+ maxItems: 64
40252
+ items:
40253
+ type: array
40254
+ maxItems: 64
40255
+ items: { $ref: "#/components/schemas/KubernetesTopologyMatch" }
40256
+ matchSummary: { type: string, maxLength: 2048 }
40257
+ priority: { type: integer, format: int64 }
40258
+ tlsMode: { type: string, maxLength: 64 }
40259
+ additionalProperties: false
40260
+ KubernetesTopologyCondition:
40261
+ type: object
40262
+ required: [type, status]
40263
+ properties:
40264
+ type: { type: string, maxLength: 128 }
40265
+ status: { type: string, maxLength: 32 }
40266
+ reason: { type: string, maxLength: 128 }
40267
+ observedGeneration: { type: integer, format: int64 }
40268
+ lastTransitionTime: { type: string, format: date-time }
40269
+ additionalProperties: false
40270
+ KubernetesTopologyGraphNode:
40271
+ type: object
40272
+ required: [id, type, label, provider, resolutionState]
40273
+ properties:
40274
+ id: { type: string, minLength: 1, maxLength: 2048 }
40275
+ type:
40276
+ type: string
40277
+ enum: [entry, rule, processor, backend-group, service, endpoint-group, pod, external]
40278
+ x-enum-varnames: [KubernetesTopologyGraphNodeTypeEntry, KubernetesTopologyGraphNodeTypeRule, KubernetesTopologyGraphNodeTypeProcessor, KubernetesTopologyGraphNodeTypeBackendGroup, KubernetesTopologyGraphNodeTypeService, KubernetesTopologyGraphNodeTypeEndpointGroup, KubernetesTopologyGraphNodeTypePod, KubernetesTopologyGraphNodeTypeExternal]
40279
+ label: { type: string, maxLength: 1024 }
40280
+ provider: { $ref: "#/components/schemas/KubernetesTopologyProvider" }
40281
+ protocol: { type: string, maxLength: 16 }
40282
+ resolutionState: { $ref: "#/components/schemas/KubernetesTopologyResolution" }
40283
+ resource: { $ref: "#/components/schemas/KubernetesResourceRef" }
40284
+ rule: { $ref: "#/components/schemas/KubernetesTopologyRule" }
40285
+ generation: { type: integer, format: int64 }
40286
+ properties:
40287
+ type: array
40288
+ maxItems: 64
40289
+ items: { $ref: "#/components/schemas/KubernetesTopologyProperty" }
40290
+ conditions:
40291
+ type: array
40292
+ maxItems: 64
40293
+ items: { $ref: "#/components/schemas/KubernetesTopologyCondition" }
40294
+ additionalProperties: false
40295
+ KubernetesTopologyGraphEdge:
40296
+ type: object
40297
+ required: [id, source, target, relation, resolutionState]
40298
+ properties:
40299
+ id: { type: string, minLength: 1, maxLength: 2048 }
40300
+ source: { type: string, minLength: 1, maxLength: 2048 }
40301
+ target: { type: string, minLength: 1, maxLength: 2048 }
40302
+ relation:
40303
+ type: string
40304
+ enum: [matches, processes, forwards, weights, mirrors, resolves, selects]
40305
+ x-enum-varnames: [KubernetesTopologyGraphEdgeRelationMatches, KubernetesTopologyGraphEdgeRelationProcesses, KubernetesTopologyGraphEdgeRelationForwards, KubernetesTopologyGraphEdgeRelationWeights, KubernetesTopologyGraphEdgeRelationMirrors, KubernetesTopologyGraphEdgeRelationResolves, KubernetesTopologyGraphEdgeRelationSelects]
40306
+ resolutionState: { $ref: "#/components/schemas/KubernetesTopologyResolution" }
40307
+ protocol: { type: string, maxLength: 16 }
40308
+ port: { type: string, maxLength: 64 }
40309
+ weight: { type: integer, format: int64, minimum: 0 }
40310
+ totalWeight: { type: integer, format: int64, minimum: 0 }
40311
+ mirrorPercent: { type: number, minimum: 0, maximum: 100 }
40312
+ ruleRef: { type: string, maxLength: 2048 }
40313
+ sourceRef: { $ref: "#/components/schemas/KubernetesResourceRef" }
40314
+ note: { type: string, maxLength: 2048 }
40315
+ additionalProperties: false
40316
+ KubernetesTopologyCoverage:
40317
+ type: object
40318
+ required: [provider, sourceId, state]
40319
+ properties:
40320
+ provider: { $ref: "#/components/schemas/KubernetesTopologyProvider" }
40321
+ sourceId: { type: string, maxLength: 128 }
40322
+ state:
40323
+ type: string
40324
+ enum: [available, not_installed, unsupported, denied, error, partial]
40325
+ x-enum-varnames: [KubernetesTopologyCoverageStateAvailable, KubernetesTopologyCoverageStateNotInstalled, KubernetesTopologyCoverageStateUnsupported, KubernetesTopologyCoverageStateDenied, KubernetesTopologyCoverageStateError, KubernetesTopologyCoverageStatePartial]
40326
+ namespace: { type: string, maxLength: 63 }
40327
+ supportedKinds:
40328
+ type: array
40329
+ maxItems: 32
40330
+ items: { type: string, maxLength: 128 }
40331
+ reasonCode: { type: string, maxLength: 128 }
40332
+ checkedAt: { type: string, format: date-time }
40333
+ observedAt: { type: string, format: date-time }
40334
+ truncated: { type: boolean }
40335
+ additionalProperties: false
40336
+ KubernetesTopologySourceQuery:
40337
+ type: object
40338
+ required: [sourceId]
40339
+ properties:
40340
+ sourceId:
40341
+ type: string
40342
+ enum: [kubernetes.services, kubernetes.pods, kubernetes.endpointslices, kubernetes.ingresses, kubernetes.ingressclasses, gateway.gateways, gateway.gatewayclasses, gateway.httproutes, gateway.grpcroutes, gateway.tcproutes, gateway.tlsroutes, gateway.udproutes, gateway.referencegrants, traefik.ingressroutes, traefik.ingressroutetcps, traefik.ingressrouteudps, traefik.traefikservices, traefik.middlewares, traefik.middlewaretcps, apisix.apisixroutes, apisix.apisixupstreams, apisix.apisixtls]
40343
+ x-enum-varnames: [KubernetesTopologySourceKubernetesServices, KubernetesTopologySourceKubernetesPods, KubernetesTopologySourceKubernetesEndpointslices, KubernetesTopologySourceKubernetesIngresses, KubernetesTopologySourceKubernetesIngressclasses, KubernetesTopologySourceGatewayGateways, KubernetesTopologySourceGatewayGatewayclasses, KubernetesTopologySourceGatewayHttproutes, KubernetesTopologySourceGatewayGrpcroutes, KubernetesTopologySourceGatewayTcproutes, KubernetesTopologySourceGatewayTlsroutes, KubernetesTopologySourceGatewayUdproutes, KubernetesTopologySourceGatewayReferencegrants, KubernetesTopologySourceTraefikIngressroutes, KubernetesTopologySourceTraefikIngressroutetcps, KubernetesTopologySourceTraefikIngressrouteudps, KubernetesTopologySourceTraefikTraefikservices, KubernetesTopologySourceTraefikMiddlewares, KubernetesTopologySourceTraefikMiddlewaretcps, KubernetesTopologySourceApisixApisixroutes, KubernetesTopologySourceApisixApisixupstreams, KubernetesTopologySourceApisixApisixtls]
40344
+ namespace: { type: string, maxLength: 63, pattern: '^$|^[a-z0-9]([a-z0-9-]*[a-z0-9])?$' }
40345
+ allOf:
40346
+ - if:
40347
+ properties:
40348
+ sourceId: { enum: [kubernetes.ingressclasses, gateway.gatewayclasses] }
40349
+ required: [sourceId]
40350
+ then:
40351
+ properties:
40352
+ namespace: { type: string, maxLength: 0 }
40353
+ additionalProperties: false
40354
+ KubernetesTopologySnapshotRequest:
40355
+ type: object
40356
+ required: [queries]
40357
+ properties:
40358
+ queries:
40359
+ type: array
40360
+ minItems: 1
40361
+ maxItems: 64
40362
+ uniqueItems: true
40363
+ items: { $ref: "#/components/schemas/KubernetesTopologySourceQuery" }
40364
+ additionalProperties: false
40365
+ KubernetesTopologySourceObject:
40366
+ type: object
40367
+ required: [resource, content]
40368
+ properties:
40369
+ resource: { $ref: "#/components/schemas/KubernetesResourceRef" }
40370
+ generation: { type: integer, format: int64 }
40371
+ content:
40372
+ type: string
40373
+ maxLength: 65536
40374
+ description: Fixed source-schema projection encoded as JSON. Unknown fields, raw annotations, Secret values, plugin configuration and credential material are removed before transport. This is not an original Kubernetes manifest.
40375
+ additionalProperties: false
40376
+ KubernetesTopologySourceResult:
40377
+ type: object
40378
+ required: [coverage, objects]
40379
+ properties:
40380
+ coverage: { $ref: "#/components/schemas/KubernetesTopologyCoverage" }
40381
+ objects:
40382
+ type: array
40383
+ maxItems: 200
40384
+ items: { $ref: "#/components/schemas/KubernetesTopologySourceObject" }
40385
+ additionalProperties: false
40386
+ KubernetesTopologySnapshot:
40387
+ type: object
40388
+ required: [version, sources]
40389
+ properties:
40390
+ version: { type: string, pattern: '^v1$' }
40391
+ sources:
40392
+ type: array
40393
+ maxItems: 64
40394
+ items: { $ref: "#/components/schemas/KubernetesTopologySourceResult" }
40395
+ additionalProperties: false
40396
+ ResourceMonitoringQuality: {"type":"string","enum":["valid","partial","stale","not_configured","not_collected","unsupported","denied","error","empty"],"x-enum-varnames":["ResourceMonitoringQualityValid","ResourceMonitoringQualityPartial","ResourceMonitoringQualityStale","ResourceMonitoringQualityNotConfigured","ResourceMonitoringQualityNotCollected","ResourceMonitoringQualityUnsupported","ResourceMonitoringQualityDenied","ResourceMonitoringQualityError","ResourceMonitoringQualityEmpty"]}
40397
+ ResourceMonitoringViewName: {"type":"string","enum":["overview","cpu","memory","conntrack","pods"],"x-enum-varnames":["ResourceMonitoringViewOverview","ResourceMonitoringViewCPU","ResourceMonitoringViewMemory","ResourceMonitoringViewConntrack","ResourceMonitoringViewPods"]}
40398
+ ResourceMonitoringQuantity: {"type":"object","additionalProperties":false,"required":["cpuCores","memoryBytes","podSlots"],"properties":{"cpuCores":{"type":"number","format":"double","nullable":true},"memoryBytes":{"type":"number","format":"double","nullable":true},"podSlots":{"type":"number","format":"double","nullable":true}}}
40399
+ ResourceMonitoringNode: {"type":"object","additionalProperties":false,"required":["nodeRef","ready","cordoned","memoryPressure","diskPressure","pidPressure","capacity","allocatable","requests","limits","cpuLimitsComplete","memoryLimitsComplete","boundPods","pendingPods","remainingPodSlots","overflowPodSlots","quality"],"properties":{"nodeRef":{"$ref":"#/components/schemas/KubernetesResourceRef"},"internalIP":{"type":"string"},"os":{"type":"string"},"createdAt":{"type":"string","format":"date-time"},"ready":{"type":"string"},"cordoned":{"type":"boolean"},"memoryPressure":{"type":"string"},"diskPressure":{"type":"string"},"pidPressure":{"type":"string"},"capacity":{"$ref":"#/components/schemas/ResourceMonitoringQuantity"},"allocatable":{"$ref":"#/components/schemas/ResourceMonitoringQuantity"},"requests":{"$ref":"#/components/schemas/ResourceMonitoringQuantity"},"limits":{"$ref":"#/components/schemas/ResourceMonitoringQuantity"},"cpuLimitsComplete":{"type":"boolean"},"memoryLimitsComplete":{"type":"boolean"},"boundPods":{"type":"number","format":"double","nullable":true},"pendingPods":{"type":"number","format":"double","nullable":true},"remainingPodSlots":{"type":"number","format":"double","nullable":true},"overflowPodSlots":{"type":"number","format":"double","nullable":true},"quality":{"$ref":"#/components/schemas/ResourceMonitoringQuality"},"observedAt":{"type":"string","format":"date-time"}}}
40400
+ ResourceMonitoringPoint: {"type":"object","additionalProperties":false,"required":["timestamp","value"],"properties":{"timestamp":{"type":"string","format":"date-time"},"value":{"type":"number","format":"double","nullable":true}}}
40401
+ ResourceMonitoringSeries: {"type":"object","additionalProperties":false,"required":["nodeRef","metricKey","unit","quality","source","latest","points"],"properties":{"nodeRef":{"$ref":"#/components/schemas/KubernetesResourceRef"},"metricKey":{"type":"string","maxLength":64},"unit":{"type":"string","enum":["cores","bytes","count","events/s","events","percent"],"x-enum-varnames":["ResourceMonitoringUnitCores","ResourceMonitoringUnitBytes","ResourceMonitoringUnitCount","ResourceMonitoringUnitEventsPerSecond","ResourceMonitoringUnitEvents","ResourceMonitoringUnitPercent"]},"quality":{"$ref":"#/components/schemas/ResourceMonitoringQuality"},"reasonCode":{"type":"string","maxLength":64},"source":{"type":"string"},"sampledAt":{"type":"string","format":"date-time"},"latest":{"type":"number","format":"double","nullable":true},"points":{"type":"array","maxItems":1440,"items":{"$ref":"#/components/schemas/ResourceMonitoringPoint"}}}}
40402
+ ResourceMonitoringPanel: {"type":"object","additionalProperties":false,"required":["key","label","unit","quality","series"],"properties":{"key":{"type":"string","maxLength":64},"label":{"type":"string"},"unit":{"type":"string"},"quality":{"$ref":"#/components/schemas/ResourceMonitoringQuality"},"reasonCode":{"type":"string","maxLength":64},"estimated":{"type":"boolean"},"windowSeconds":{"type":"integer","minimum":300,"maximum":3600},"series":{"type":"array","maxItems":500,"items":{"$ref":"#/components/schemas/ResourceMonitoringSeries"}}}}
40403
+ ResourceMonitoringView: {"type":"object","additionalProperties":false,"required":["clusterId","view","from","to","stepSeconds","generatedAt","snapshotQuality","unscheduledPendingPods","nodes","panels"],"properties":{"clusterId":{"type":"string"},"view":{"$ref":"#/components/schemas/ResourceMonitoringViewName"},"node":{"type":"string"},"from":{"type":"string","format":"date-time"},"to":{"type":"string","format":"date-time"},"stepSeconds":{"type":"integer","minimum":15,"maximum":3600},"generatedAt":{"type":"string","format":"date-time"},"snapshotObservedAt":{"type":"string","format":"date-time"},"snapshotQuality":{"$ref":"#/components/schemas/ResourceMonitoringQuality"},"unscheduledPendingPods":{"type":"number","format":"double","nullable":true},"nodes":{"type":"array","maxItems":500,"items":{"$ref":"#/components/schemas/ResourceMonitoringNode"}},"panels":{"type":"array","maxItems":32,"items":{"$ref":"#/components/schemas/ResourceMonitoringPanel"}},"truncated":{"type":"boolean"},"nodeOptions":{"type":"array","maxItems":500,"items":{"$ref":"#/components/schemas/KubernetesResourceRef"}}}}
40404
+ ResourceMonitoringEnvelope: {"type":"object","additionalProperties":false,"required":["data"],"properties":{"data":{"$ref":"#/components/schemas/ResourceMonitoringView"}}}
37954
40405
  KubernetesNetworkTopologySummary:
37955
40406
  type: object
37956
40407
  required: [entryCount, routeCount, serviceCount, missingServiceCount, backendPodCount, pendingRouteCount]
@@ -37999,6 +40450,21 @@ components:
37999
40450
  source: { type: string }
38000
40451
  generatedAt: { type: string }
38001
40452
  summary: { $ref: "#/components/schemas/KubernetesNetworkTopologySummary" }
40453
+ graphVersion: { type: string, pattern: '^v1$' }
40454
+ nodes:
40455
+ type: array
40456
+ maxItems: 500
40457
+ items: { $ref: "#/components/schemas/KubernetesTopologyGraphNode" }
40458
+ edges:
40459
+ type: array
40460
+ maxItems: 1000
40461
+ items: { $ref: "#/components/schemas/KubernetesTopologyGraphEdge" }
40462
+ coverage:
40463
+ type: array
40464
+ maxItems: 128
40465
+ items: { $ref: "#/components/schemas/KubernetesTopologyCoverage" }
40466
+ observedAt: { type: string, format: date-time }
40467
+ truncated: { type: boolean }
38002
40468
  traces:
38003
40469
  type: array
38004
40470
  items: { $ref: "#/components/schemas/KubernetesNetworkTopologyTrace" }
@@ -41449,6 +43915,7 @@ components:
41449
43915
  namespace: { type: string, minLength: 1 }
41450
43916
  scopeMode: { $ref: "#/components/schemas/KubernetesResourceScopeMode" }
41451
43917
  uid: { type: string }
43918
+ resourceVersion: { type: string }
41452
43919
  additionalProperties: false
41453
43920
  KubernetesResourceStreamEventType:
41454
43921
  type: string
@@ -42235,6 +44702,19 @@ components:
42235
44702
  plan: { $ref: "#/components/schemas/CapabilityPlan" }
42236
44703
  aiClientId: { type: string }
42237
44704
  skillId: { type: string }
44705
+ scopeConstraints:
44706
+ type: array
44707
+ maxItems: 20
44708
+ uniqueItems: true
44709
+ description: Immutable exact target constraints for every resolved invocation, approval replay, status read and cancellation. These narrow scope and never grant permission.
44710
+ items: { $ref: "#/components/schemas/CapabilityScopeConstraint" }
44711
+ additionalProperties: false
44712
+ CapabilityScopeConstraint:
44713
+ type: object
44714
+ required: [dimension, value]
44715
+ properties:
44716
+ dimension: { type: string, minLength: 1, maxLength: 64, pattern: '^[A-Za-z][A-Za-z0-9_]{0,63}$' }
44717
+ value: { type: string, minLength: 1, maxLength: 512 }
42238
44718
  additionalProperties: false
42239
44719
  CapabilityTaskRevisionInput:
42240
44720
  description: Retained step IDs inherit their prior SecretRefs when call.secretRefs is omitted; an explicit empty object clears them. All references remain subject to current authorization.
@@ -42255,6 +44735,10 @@ components:
42255
44735
  status: { type: string }
42256
44736
  createdBy: { type: string }
42257
44737
  plan: { $ref: "#/components/schemas/CapabilityPlan" }
44738
+ scopeConstraints:
44739
+ type: array
44740
+ maxItems: 20
44741
+ items: { $ref: "#/components/schemas/CapabilityScopeConstraint" }
42258
44742
  nodes:
42259
44743
  type: array
42260
44744
  items: { $ref: "#/components/schemas/CapabilityTaskNode" }
@@ -42458,10 +44942,11 @@ components:
42458
44942
  type: object
42459
44943
  required: [targetType, targetRef]
42460
44944
  properties:
44945
+ purpose: { $ref: "#/components/schemas/SecretPurpose" }
42461
44946
  targetType:
42462
44947
  type: string
42463
- enum: [capability, project, connection]
42464
- x-enum-varnames: [SecretBindingCapability, SecretBindingProject, SecretBindingConnection]
44948
+ enum: [capability, project, connection, vm, vm_create]
44949
+ x-enum-varnames: [SecretBindingCapability, SecretBindingProject, SecretBindingConnection, SecretBindingVM, SecretBindingVMCreate]
42465
44950
  targetRef:
42466
44951
  type: string
42467
44952
  minLength: 1
@@ -42497,10 +44982,41 @@ components:
42497
44982
  type: integer
42498
44983
  minimum: 1
42499
44984
  additionalProperties: false
44985
+ SecretReferenceUsage:
44986
+ type: object
44987
+ required: [targetId, usage, version, status]
44988
+ properties:
44989
+ targetId:
44990
+ type: string
44991
+ vmId:
44992
+ type: string
44993
+ usage:
44994
+ type: string
44995
+ description: login_binding, ssh_session or cloud_init_operation. Historical initialization does not assert that the guest still trusts this key.
44996
+ version:
44997
+ type: integer
44998
+ minimum: 1
44999
+ bindingRevision:
45000
+ type: integer
45001
+ minimum: 1
45002
+ status:
45003
+ type: string
45004
+ additionalProperties: false
45005
+ SecretReferenceUsageListEnvelope:
45006
+ type: object
45007
+ required: [items]
45008
+ properties:
45009
+ items:
45010
+ type: array
45011
+ items:
45012
+ $ref: "#/components/schemas/SecretReferenceUsage"
45013
+ additionalProperties: false
42500
45014
  SecretMetadata:
42501
45015
  type: object
42502
45016
  required: [id, name, scopeType, scopeId, status, currentVersion, bindings, createdBy, createdAt, updatedAt]
42503
45017
  properties:
45018
+ kind: { $ref: "#/components/schemas/SecretKind" }
45019
+ publicKey: { $ref: "#/components/schemas/SecretSSHPublicKey" }
42504
45020
  id:
42505
45021
  type: string
42506
45022
  name:
@@ -42541,6 +45057,8 @@ components:
42541
45057
  else:
42542
45058
  required: [vaultKv2]
42543
45059
  properties:
45060
+ kind: { $ref: "#/components/schemas/SecretKind" }
45061
+ sshPassphrase: { type: string, maxLength: 4096, writeOnly: true, x-soha-sensitive: true }
42544
45062
  name:
42545
45063
  type: string
42546
45064
  minLength: 1
@@ -42597,6 +45115,7 @@ components:
42597
45115
  else:
42598
45116
  required: [vaultKv2]
42599
45117
  properties:
45118
+ sshPassphrase: { type: string, maxLength: 4096, writeOnly: true, x-soha-sensitive: true }
42600
45119
  value:
42601
45120
  type: string
42602
45121
  minLength: 1
@@ -42609,6 +45128,8 @@ components:
42609
45128
  type: object
42610
45129
  required: [secretId, version, status, createdBy, createdAt]
42611
45130
  properties:
45131
+ kind: { $ref: "#/components/schemas/SecretKind" }
45132
+ publicKey: { $ref: "#/components/schemas/SecretSSHPublicKey" }
42612
45133
  secretId:
42613
45134
  type: string
42614
45135
  version:
@@ -43192,6 +45713,7 @@ components:
43192
45713
  rateLimitProfileId:
43193
45714
  type: string
43194
45715
  metadata:
45716
+ description: Optional contextWindowTokens declares this route model window as a positive integer token count. Missing or invalid values mean unknown capacity; model names are never used to guess it.
43195
45717
  type: object
43196
45718
  additionalProperties: true
43197
45719
  createdAt:
@@ -43246,6 +45768,7 @@ components:
43246
45768
  rateLimitProfileId:
43247
45769
  type: string
43248
45770
  metadata:
45771
+ description: Optional contextWindowTokens declares this route model window as a positive integer token count. Missing or invalid values mean unknown capacity; model names are never used to guess it.
43249
45772
  type: object
43250
45773
  additionalProperties: true
43251
45774
  additionalProperties: false