@opensoha/contracts 0.1.22 → 0.1.24

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 (361) 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/permission-catalog.json +32 -1
  39. package/auth/token-claims.schema.json +5 -0
  40. package/compat/consumer-revisions.json +4 -3
  41. package/compat/json-schema-ecosystem-0.1.0.json +1 -1
  42. package/compat/openapi-loose-boundaries-0.1.0.json +1 -1
  43. package/connectors/connector-action.schema.json +138 -0
  44. package/fixtures/json-schema/connector-action/invalid/empty-values.json +11 -0
  45. package/fixtures/json-schema/connector-action/invalid/invalid-expiry.json +16 -0
  46. package/fixtures/json-schema/connector-action/invalid/lowercase-alias.json +16 -0
  47. package/fixtures/json-schema/connector-action/invalid/unknown-entry-field.json +17 -0
  48. package/fixtures/json-schema/connector-action/invalid/unknown-frame-field.json +17 -0
  49. package/fixtures/json-schema/connector-action/invalid/unknown-version.json +16 -0
  50. package/fixtures/json-schema/connector-action/invalid/unversioned-reference.json +16 -0
  51. package/fixtures/json-schema/connector-action/invalid/zero-version.json +16 -0
  52. package/fixtures/json-schema/connector-action/valid/pinned.json +16 -0
  53. package/fixtures/json-schema/connector-definition/invalid/credential-userinfo.json +8 -0
  54. package/fixtures/json-schema/connector-definition/invalid/reference-traversal.json +8 -0
  55. package/fixtures/json-schema/connector-definition/invalid/zero-version.json +8 -0
  56. package/fixtures/json-schema/connector-definition/valid/canonical.json +8 -0
  57. package/fixtures/json-schema/connector-definition/valid/pinned.json +8 -0
  58. package/fixtures/json-schema/personal-browser-network-request/invalid/bounded.json +4 -0
  59. package/fixtures/json-schema/personal-browser-network-request/valid/bounded.json +4 -0
  60. package/fixtures/json-schema/personal-browser-network-response/invalid/bounded.json +5 -0
  61. package/fixtures/json-schema/personal-browser-network-response/valid/bounded.json +5 -0
  62. package/fixtures/json-schema/personal-environment-export/invalid/extra.json +11 -0
  63. package/fixtures/json-schema/personal-environment-export/invalid/ownerId.json +10 -0
  64. package/fixtures/json-schema/personal-environment-export/invalid/sha256.json +10 -0
  65. package/fixtures/json-schema/personal-environment-export/invalid/sizeBytes.json +10 -0
  66. package/fixtures/json-schema/personal-environment-export/valid/complete.json +10 -0
  67. package/fixtures/json-schema/personal-environment-preflight-request/invalid/disk.json +11 -0
  68. package/fixtures/json-schema/personal-environment-preflight-request/invalid/network.json +11 -0
  69. package/fixtures/json-schema/personal-environment-preflight-request/invalid/node.json +12 -0
  70. package/fixtures/json-schema/personal-environment-preflight-request/invalid/owner.json +12 -0
  71. package/fixtures/json-schema/personal-environment-preflight-request/valid/bounded.json +11 -0
  72. package/fixtures/json-schema/personal-environment-preflight-result/invalid/disk.json +15 -0
  73. package/fixtures/json-schema/personal-environment-preflight-result/invalid/network.json +15 -0
  74. package/fixtures/json-schema/personal-environment-preflight-result/invalid/no-hard-quota.json +15 -0
  75. package/fixtures/json-schema/personal-environment-preflight-result/invalid/node.json +16 -0
  76. package/fixtures/json-schema/personal-environment-preflight-result/invalid/not-ready.json +15 -0
  77. package/fixtures/json-schema/personal-environment-preflight-result/invalid/owner.json +16 -0
  78. package/fixtures/json-schema/personal-environment-preflight-result/valid/bounded.json +15 -0
  79. package/fixtures/json-schema/personal-environment-request/invalid/delete-data-argv.json +24 -0
  80. package/fixtures/json-schema/personal-environment-request/invalid/delete-data-createData.json +22 -0
  81. package/fixtures/json-schema/personal-environment-request/invalid/delete-data-taskId.json +22 -0
  82. package/fixtures/json-schema/personal-environment-request/invalid/export-argv.json +22 -0
  83. package/fixtures/json-schema/personal-environment-request/invalid/export-createData.json +22 -0
  84. package/fixtures/json-schema/personal-environment-request/invalid/export-taskId.json +22 -0
  85. package/fixtures/json-schema/personal-environment-request/invalid/extra-command.json +24 -0
  86. package/fixtures/json-schema/personal-environment-request/invalid/host-workspace.json +22 -0
  87. package/fixtures/json-schema/personal-environment-request/invalid/image-injection.json +22 -0
  88. package/fixtures/json-schema/personal-environment-request/invalid/network-egress.json +21 -0
  89. package/fixtures/json-schema/personal-environment-request/invalid/no-command.json +21 -0
  90. package/fixtures/json-schema/personal-environment-request/invalid/recreate-on-release.json +22 -0
  91. package/fixtures/json-schema/personal-environment-request/invalid/relative-command.json +24 -0
  92. package/fixtures/json-schema/personal-environment-request/invalid/released-identity.json +22 -0
  93. package/fixtures/json-schema/personal-environment-request/invalid/task-empty.json +27 -0
  94. package/fixtures/json-schema/personal-environment-request/invalid/task-host-path.json +27 -0
  95. package/fixtures/json-schema/personal-environment-request/invalid/task-noncanonical.json +27 -0
  96. package/fixtures/json-schema/personal-environment-request/invalid/task-null.json +27 -0
  97. package/fixtures/json-schema/personal-environment-request/invalid/task-on-inspection.json +22 -0
  98. package/fixtures/json-schema/personal-environment-request/invalid/unbounded-quota.json +21 -0
  99. package/fixtures/json-schema/personal-environment-request/valid/acquire.json +21 -0
  100. package/fixtures/json-schema/personal-environment-request/valid/delete-data.json +21 -0
  101. package/fixtures/json-schema/personal-environment-request/valid/execute.json +26 -0
  102. package/fixtures/json-schema/personal-environment-request/valid/export-data.json +21 -0
  103. package/fixtures/json-schema/personal-environment-request/valid/inspect.json +21 -0
  104. package/fixtures/json-schema/personal-environment-request/valid/provision.json +22 -0
  105. package/fixtures/json-schema/personal-environment-request/valid/release.json +21 -0
  106. package/fixtures/json-schema/personal-environment-request/valid/task-workspace.json +27 -0
  107. package/fixtures/json-schema/personal-environment-result/invalid/active-without-observation.json +7 -0
  108. package/fixtures/json-schema/personal-environment-result/invalid/deleted-output.json +8 -0
  109. package/fixtures/json-schema/personal-environment-result/invalid/deleted-snapshot.json +8 -0
  110. package/fixtures/json-schema/personal-environment-result/invalid/deleted-taskId.json +8 -0
  111. package/fixtures/json-schema/personal-environment-result/invalid/private-handle.json +8 -0
  112. package/fixtures/json-schema/personal-environment-result/invalid/stopped-fake-observation.json +20 -0
  113. package/fixtures/json-schema/personal-environment-result/invalid/task-empty.json +22 -0
  114. package/fixtures/json-schema/personal-environment-result/invalid/task-host-path.json +22 -0
  115. package/fixtures/json-schema/personal-environment-result/invalid/task-null.json +22 -0
  116. package/fixtures/json-schema/personal-environment-result/invalid/task-on-stopped.json +8 -0
  117. package/fixtures/json-schema/personal-environment-result/invalid/task-without-command-output.json +21 -0
  118. package/fixtures/json-schema/personal-environment-result/valid/active.json +21 -0
  119. package/fixtures/json-schema/personal-environment-result/valid/deleted.json +7 -0
  120. package/fixtures/json-schema/personal-environment-result/valid/expired.json +7 -0
  121. package/fixtures/json-schema/personal-environment-result/valid/missing.json +7 -0
  122. package/fixtures/json-schema/personal-environment-result/valid/released.json +7 -0
  123. package/fixtures/json-schema/personal-environment-result/valid/task-workspace.json +22 -0
  124. package/fixtures/json-schema/personal-guest-binding/invalid/host-path.json +17 -0
  125. package/fixtures/json-schema/personal-guest-binding/invalid/invalid-policy.json +17 -0
  126. package/fixtures/json-schema/personal-guest-binding/invalid/invalid-serial.json +17 -0
  127. package/fixtures/json-schema/personal-guest-binding/invalid/legacy-version.json +17 -0
  128. package/fixtures/json-schema/personal-guest-binding/invalid/missing-generation.json +17 -0
  129. package/fixtures/json-schema/personal-guest-binding/invalid/missing-identity.json +16 -0
  130. package/fixtures/json-schema/personal-guest-binding/invalid/missing-provider-identity.json +16 -0
  131. package/fixtures/json-schema/personal-guest-binding/invalid/raw-provider-identity.json +17 -0
  132. package/fixtures/json-schema/personal-guest-binding/valid/minimal.json +17 -0
  133. package/fixtures/json-schema/personal-guest-data-plan/invalid/quota.json +1 -0
  134. package/fixtures/json-schema/personal-guest-data-plan/valid/basic.json +1 -0
  135. package/fixtures/json-schema/personal-guest-enrollment/invalid/capabilities.json +7 -0
  136. package/fixtures/json-schema/personal-guest-enrollment/invalid/legacy-version.json +4 -0
  137. package/fixtures/json-schema/personal-guest-enrollment/invalid/missing-identity.json +3 -0
  138. package/fixtures/json-schema/personal-guest-enrollment/invalid/ownerId.json +5 -0
  139. package/fixtures/json-schema/personal-guest-enrollment/invalid/token.json +5 -0
  140. package/fixtures/json-schema/personal-guest-enrollment/valid/minimal.json +4 -0
  141. package/fixtures/json-schema/personal-guest-heartbeat/invalid/argv.json +11 -0
  142. package/fixtures/json-schema/personal-guest-heartbeat/invalid/legacy-version.json +8 -0
  143. package/fixtures/json-schema/personal-guest-heartbeat/invalid/missing-identity.json +7 -0
  144. package/fixtures/json-schema/personal-guest-heartbeat/invalid/owner.json +9 -0
  145. package/fixtures/json-schema/personal-guest-heartbeat/invalid/self-ready.json +9 -0
  146. package/fixtures/json-schema/personal-guest-heartbeat/invalid/zero-sequence.json +8 -0
  147. package/fixtures/json-schema/personal-guest-heartbeat/valid/minimal.json +8 -0
  148. package/fixtures/json-schema/personal-guest-provisioning/invalid/network.json +1 -0
  149. package/fixtures/json-schema/personal-guest-provisioning/valid/basic.json +1 -0
  150. package/fixtures/json-schema/personal-guest-renewal/invalid/unknown.json +1 -0
  151. package/fixtures/json-schema/personal-guest-renewal/valid/basic.json +1 -0
  152. package/fixtures/json-schema/personal-guest-runtime/invalid/minimal.json +45 -0
  153. package/fixtures/json-schema/personal-guest-runtime/valid/minimal.json +45 -0
  154. package/fixtures/json-schema/personal-guest-runtime-result/invalid/minimal.json +28 -0
  155. package/fixtures/json-schema/personal-guest-runtime-result/valid/minimal.json +27 -0
  156. package/fixtures/json-schema/personal-guest-tools/invalid/minimal.json +31 -0
  157. package/fixtures/json-schema/personal-guest-tools/valid/minimal.json +30 -0
  158. package/fixtures/json-schema/source-import-policy/invalid/case-variant-scope.json +4 -0
  159. package/fixtures/json-schema/source-import-policy/invalid/case-variant-version.json +4 -0
  160. package/fixtures/json-schema/source-import-policy/invalid/duplicate-grant.json +4 -0
  161. package/fixtures/json-schema/source-import-policy/invalid/empty-id.json +4 -0
  162. package/fixtures/json-schema/source-import-policy/invalid/future-version.json +4 -0
  163. package/fixtures/json-schema/source-import-policy/invalid/unknown-field.json +4 -0
  164. package/fixtures/json-schema/source-import-policy/valid/deny-all.json +4 -0
  165. package/fixtures/json-schema/source-import-policy/valid/shared.json +4 -0
  166. package/fixtures/json-schema/token-claims/invalid/authz-negative.json +23 -0
  167. package/fixtures/json-schema/token-claims/invalid/authz-string.json +23 -0
  168. package/fixtures/json-schema/token-claims/invalid/authz-zero.json +23 -0
  169. package/fixtures/json-schema/token-claims/valid/versioned-session.json +23 -0
  170. package/fixtures/openapi/AgentRunEventListEnvelope/invalid/basic.json +8 -0
  171. package/fixtures/openapi/AgentRunEventListEnvelope/valid/basic.json +8 -0
  172. package/fixtures/openapi/AgentRunEventListEnvelope/valid/native.json +1 -0
  173. package/fixtures/openapi/AgentRunResumeRequest/invalid/basic.json +3 -0
  174. package/fixtures/openapi/AgentRunResumeRequest/valid/basic.json +3 -0
  175. package/fixtures/openapi/AgentSSHCommandRequest/invalid/task51.json +24 -0
  176. package/fixtures/openapi/AgentSSHCommandRequest/valid/task51.json +23 -0
  177. package/fixtures/openapi/AgentSSHCommandResult/invalid/task51.json +8 -0
  178. package/fixtures/openapi/AgentSSHCommandResult/valid/task51.json +7 -0
  179. package/fixtures/openapi/AgentSSHSessionRequest/invalid/task51.json +20 -0
  180. package/fixtures/openapi/AgentSSHSessionRequest/valid/task51.json +19 -0
  181. package/fixtures/openapi/CapabilityTaskInput/invalid/duplicate-scope.json +36 -0
  182. package/fixtures/openapi/CapabilityTaskInput/valid/scoped.json +32 -0
  183. package/fixtures/openapi/DockerQuickCreateHostInput/invalid/guest-access.json +7 -0
  184. package/fixtures/openapi/DockerQuickCreateHostInput/valid/guest-access.json +9 -0
  185. package/fixtures/openapi/KnowledgeSourceDocument/invalid/tombstone-with-content.json +1 -0
  186. package/fixtures/openapi/KnowledgeSourceDocument/valid/tombstone.json +1 -0
  187. package/fixtures/openapi/KubernetesResourceUpdatePlanRequest/invalid/missing-required.json +1 -0
  188. package/fixtures/openapi/KubernetesResourceYaml/invalid/missing-required.json +1 -0
  189. package/fixtures/openapi/ObservabilityDataSource/invalid/missing-required.json +1 -0
  190. package/fixtures/openapi/PersonalAgentAccess/invalid/invalid.json +1 -0
  191. package/fixtures/openapi/PersonalAgentAccess/valid/valid.json +1 -0
  192. package/fixtures/openapi/PersonalAgentAccessDecision/invalid/invalid.json +1 -0
  193. package/fixtures/openapi/PersonalAgentAccessDecision/valid/valid.json +1 -0
  194. package/fixtures/openapi/PersonalAssistantArtifactListEnvelope/invalid/owner.json +8 -0
  195. package/fixtures/openapi/PersonalAssistantArtifactListEnvelope/valid/side-chat.json +9 -0
  196. package/fixtures/openapi/PersonalAssistantAvatarRequest/invalid/motion.json +1 -0
  197. package/fixtures/openapi/PersonalAssistantAvatarRequest/invalid/owner.json +1 -0
  198. package/fixtures/openapi/PersonalAssistantAvatarRequest/invalid/remote.json +1 -0
  199. package/fixtures/openapi/PersonalAssistantAvatarRequest/invalid/svg.json +1 -0
  200. package/fixtures/openapi/PersonalAssistantAvatarRequest/valid/raster.json +1 -0
  201. package/fixtures/openapi/PersonalAssistantAvatarRequest/valid/reset.json +1 -0
  202. package/fixtures/openapi/PersonalAssistantUpdateRequest/invalid/empty.json +1 -0
  203. package/fixtures/openapi/PersonalAssistantUpdateRequest/invalid/owner.json +1 -0
  204. package/fixtures/openapi/PersonalAssistantUpdateRequest/valid/name.json +1 -0
  205. package/fixtures/openapi/PersonalDockerEnvironmentPolicy/invalid/host-url.json +12 -0
  206. package/fixtures/openapi/PersonalDockerEnvironmentPolicy/invalid/lifetime.json +11 -0
  207. package/fixtures/openapi/PersonalDockerEnvironmentPolicy/invalid/unknown-agent.json +11 -0
  208. package/fixtures/openapi/PersonalDockerEnvironmentPolicy/valid/basic.json +11 -0
  209. package/fixtures/openapi/PersonalEnvironment/invalid/invented-state.json +6 -0
  210. package/fixtures/openapi/PersonalEnvironment/invalid/missing-state.json +5 -0
  211. package/fixtures/openapi/PersonalEnvironment/invalid/negative-generation.json +7 -0
  212. package/fixtures/openapi/PersonalEnvironment/invalid/network.json +23 -0
  213. package/fixtures/openapi/PersonalEnvironment/invalid/private-node.json +24 -0
  214. package/fixtures/openapi/PersonalEnvironment/invalid/unsupported-backend.json +7 -0
  215. package/fixtures/openapi/PersonalEnvironment/valid/deleted.json +23 -0
  216. package/fixtures/openapi/PersonalEnvironment/valid/deleting.json +23 -0
  217. package/fixtures/openapi/PersonalEnvironment/valid/deletion_unknown.json +23 -0
  218. package/fixtures/openapi/PersonalEnvironment/valid/frozen-binding.json +13 -0
  219. package/fixtures/openapi/PersonalEnvironment/valid/ready.json +23 -0
  220. package/fixtures/openapi/PersonalEnvironment/valid/unknown.json +23 -0
  221. package/fixtures/openapi/PersonalEnvironment/valid/unprovisioned.json +6 -0
  222. package/fixtures/openapi/PersonalEnvironmentActionRequest/invalid/command.json +3 -0
  223. package/fixtures/openapi/PersonalEnvironmentActionRequest/invalid/node.json +4 -0
  224. package/fixtures/openapi/PersonalEnvironmentActionRequest/invalid/owner.json +4 -0
  225. package/fixtures/openapi/PersonalEnvironmentActionRequest/invalid/quota.json +10 -0
  226. package/fixtures/openapi/PersonalEnvironmentActionRequest/valid/reconcile.json +3 -0
  227. package/fixtures/openapi/PersonalEnvironmentActionRequest/valid/sleep.json +3 -0
  228. package/fixtures/openapi/PersonalEnvironmentActionRequest/valid/wake.json +4 -0
  229. package/fixtures/openapi/PersonalEnvironmentDataDeletionRequest/invalid/empty-name.json +5 -0
  230. package/fixtures/openapi/PersonalEnvironmentDataDeletionRequest/invalid/long-name.json +5 -0
  231. package/fixtures/openapi/PersonalEnvironmentDataDeletionRequest/invalid/missing-name.json +4 -0
  232. package/fixtures/openapi/PersonalEnvironmentDataDeletionRequest/invalid/owner.json +6 -0
  233. package/fixtures/openapi/PersonalEnvironmentDataDeletionRequest/invalid/stale-version.json +5 -0
  234. package/fixtures/openapi/PersonalEnvironmentDataDeletionRequest/valid/confirmed.json +5 -0
  235. package/fixtures/openapi/PersonalEnvironmentDataExportRequest/invalid/assistantId.json +4 -0
  236. package/fixtures/openapi/PersonalEnvironmentDataExportRequest/invalid/environmentVersion.json +4 -0
  237. package/fixtures/openapi/PersonalEnvironmentDataExportRequest/invalid/ownerId.json +5 -0
  238. package/fixtures/openapi/PersonalEnvironmentDataExportRequest/valid/current.json +4 -0
  239. package/fixtures/openapi/PersonalEnvironmentEnvelope/invalid/missing-data.json +1 -0
  240. package/fixtures/openapi/PersonalEnvironmentEnvelope/valid/state.json +8 -0
  241. package/fixtures/openapi/PersonalEnvironmentQuota/invalid/cpu.json +7 -0
  242. package/fixtures/openapi/PersonalEnvironmentQuota/invalid/disk.json +7 -0
  243. package/fixtures/openapi/PersonalEnvironmentQuota/invalid/network.json +7 -0
  244. package/fixtures/openapi/PersonalEnvironmentQuota/invalid/processes.json +7 -0
  245. package/fixtures/openapi/PersonalEnvironmentQuota/valid/basic.json +7 -0
  246. package/fixtures/openapi/PersonalEnvironmentTemplate/invalid/mode.json +13 -0
  247. package/fixtures/openapi/PersonalEnvironmentTemplate/invalid/network.json +13 -0
  248. package/fixtures/openapi/PersonalEnvironmentTemplate/invalid/node.json +14 -0
  249. package/fixtures/openapi/PersonalEnvironmentTemplate/valid/template.json +13 -0
  250. package/fixtures/openapi/PersonalEnvironmentTemplateListEnvelope/invalid/missing.json +1 -0
  251. package/fixtures/openapi/PersonalEnvironmentTemplateListEnvelope/invalid/unbounded.json +1317 -0
  252. package/fixtures/openapi/PersonalEnvironmentTemplateListEnvelope/valid/choices.json +17 -0
  253. package/fixtures/openapi/PersonalEnvironmentTemplateListEnvelope/valid/empty.json +3 -0
  254. package/fixtures/openapi/PersonalEnvironmentUsage/invalid/negative.json +6 -0
  255. package/fixtures/openapi/PersonalEnvironmentUsage/valid/usage.json +6 -0
  256. package/fixtures/openapi/PersonalFeedFeedback/invalid/owner.json +4 -0
  257. package/fixtures/openapi/PersonalFeedFeedback/valid/liked.json +3 -0
  258. package/fixtures/openapi/PersonalFeedItem/invalid/no-source.json +9 -0
  259. package/fixtures/openapi/PersonalFeedItem/valid/post.json +15 -0
  260. package/fixtures/openapi/PersonalFeedSettings/invalid/owner.json +6 -0
  261. package/fixtures/openapi/PersonalFeedSettings/valid/default.json +5 -0
  262. package/fixtures/openapi/PersonalGuestPreparationInput/invalid/foreign-owner.json +5 -0
  263. package/fixtures/openapi/PersonalGuestPreparationInput/invalid/unsafe-counter.json +4 -0
  264. package/fixtures/openapi/PersonalGuestPreparationInput/valid/ed25519-csr.json +4 -0
  265. package/fixtures/openapi/PersonalGuestRuntimeEnvelope/invalid/minimal.json +10 -0
  266. package/fixtures/openapi/PersonalGuestRuntimeEnvelope/valid/minimal.json +9 -0
  267. package/fixtures/openapi/PersonalGuestRuntimeInput/invalid/minimal.json +6 -0
  268. package/fixtures/openapi/PersonalGuestRuntimeInput/valid/minimal.json +8 -0
  269. package/fixtures/openapi/PersonalGuestToolsInput/invalid/minimal.json +5 -0
  270. package/fixtures/openapi/PersonalGuestToolsInput/valid/minimal.json +4 -0
  271. package/fixtures/openapi/PersonalVMEnvironmentPolicy/invalid/device.json +15 -0
  272. package/fixtures/openapi/PersonalVMEnvironmentPolicy/invalid/fractional-size.json +15 -0
  273. package/fixtures/openapi/PersonalVMEnvironmentPolicy/invalid/network.json +15 -0
  274. package/fixtures/openapi/PersonalVMEnvironmentPolicy/invalid/owner.json +15 -0
  275. package/fixtures/openapi/PersonalVMEnvironmentPolicy/invalid/provider.json +15 -0
  276. package/fixtures/openapi/PersonalVMEnvironmentPolicy/invalid/unknown.json +16 -0
  277. package/fixtures/openapi/PersonalVMEnvironmentPolicy/valid/pve.json +15 -0
  278. package/fixtures/openapi/PersonalWorkspaceRuntime/invalid/shared.json +3 -0
  279. package/fixtures/openapi/PersonalWorkspaceRuntime/valid/shared.json +4 -0
  280. package/fixtures/openapi/PersonalWorkspaceRuntimeEnvelope/invalid/shared.json +5 -0
  281. package/fixtures/openapi/PersonalWorkspaceRuntimeEnvelope/valid/shared.json +6 -0
  282. package/fixtures/openapi/SecretGenerateSSHKeyRequest/invalid/task51.json +6 -0
  283. package/fixtures/openapi/SecretGenerateSSHKeyRequest/valid/task51.json +12 -0
  284. package/fixtures/openapi/SecretReferenceUsage/invalid/version.json +6 -0
  285. package/fixtures/openapi/SecretReferenceUsage/valid/version.json +8 -0
  286. package/fixtures/openapi/VMSSHCredentialRedemptionInput/invalid/task51.json +7 -0
  287. package/fixtures/openapi/VMSSHCredentialRedemptionInput/valid/task51.json +6 -0
  288. package/fixtures/openapi/VirtualMachineAccessBindingInput/invalid/task51.json +10 -0
  289. package/fixtures/openapi/VirtualMachineAccessBindingInput/valid/task51.json +10 -0
  290. package/fixtures/openapi/VirtualMachineActionInput/invalid/capacity-not-boolean.json +1 -0
  291. package/fixtures/openapi/VirtualMachineActionInput/valid/new-data-with-admission.json +1 -0
  292. package/fixtures/openapi/VirtualMachineCreateInput/valid/cloud-image.json +12 -0
  293. package/fixtures/openapi/VirtualMachineDiskChange/invalid/serial-config-injection.json +1 -0
  294. package/fixtures/openapi/VirtualMachineDiskChange/invalid/serial-existing-disk.json +1 -0
  295. package/fixtures/openapi/VirtualMachineDiskChange/invalid/serial-too-long.json +1 -0
  296. package/fixtures/openapi/VirtualMachineDiskChange/valid/personal-data.json +1 -0
  297. package/fixtures/openapi/VirtualMachineGuestAccessInput/invalid/task51.json +4 -0
  298. package/fixtures/openapi/VirtualMachineGuestAccessInput/valid/task51.json +6 -0
  299. package/fixtures/openapi/VirtualMachineSSHCommand/invalid/task51.json +9 -0
  300. package/fixtures/openapi/VirtualMachineSSHCommand/valid/task51.json +8 -0
  301. package/fixtures/openapi/VirtualMachineSSHCommandInput/invalid/task51.json +5 -0
  302. package/fixtures/openapi/VirtualMachineSSHCommandInput/valid/task51.json +5 -0
  303. package/fixtures/openapi/VirtualMachineSSHFrame/invalid/encoding.json +5 -0
  304. package/fixtures/openapi/VirtualMachineSSHFrame/invalid/task51.json +4 -0
  305. package/fixtures/openapi/VirtualMachineSSHFrame/valid/binary.json +5 -0
  306. package/fixtures/openapi/VirtualMachineSSHFrame/valid/task51.json +5 -0
  307. package/fixtures/openapi/VirtualMachineSSHSessionInput/invalid/task51.json +4 -0
  308. package/fixtures/openapi/VirtualMachineSSHSessionInput/valid/task51.json +5 -0
  309. package/fixtures/openapi/VirtualizationCapacityPolicyInput/invalid/task51.json +12 -0
  310. package/fixtures/openapi/VirtualizationCapacityPolicyInput/valid/task51.json +13 -0
  311. package/fixtures/openapi/VirtualizationImageInput/invalid/cloud-image-config-type.json +6 -0
  312. package/fixtures/openapi/VirtualizationImageInput/valid/cloud-image.json +11 -0
  313. package/fixtures/openapi/WorkbenchAssistantTask/invalid/kind.json +1 -0
  314. package/fixtures/openapi/WorkbenchAssistantTask/invalid/owner.json +1 -0
  315. package/fixtures/openapi/WorkbenchAssistantTask/valid/generate.json +1 -0
  316. package/fixtures/openapi/WorkbenchAssistantTask/valid/undo.json +1 -0
  317. package/fixtures/openapi/WorkbenchContextSelection/invalid/remote-image.json +1 -0
  318. package/fixtures/openapi/WorkbenchContextSelection/invalid/too-many-images.json +1 -0
  319. package/fixtures/openapi/WorkbenchContextSelection/valid/chat-image.json +9 -0
  320. package/fixtures/openapi/WorkbenchContextUsage/invalid/fractional-capacity.json +1 -0
  321. package/fixtures/openapi/WorkbenchContextUsage/invalid/negative.json +1 -0
  322. package/fixtures/openapi/WorkbenchContextUsage/valid/reported.json +1 -0
  323. package/fixtures/openapi/WorkbenchContextUsage/valid/unknown.json +1 -0
  324. package/fixtures/openapi/WorkbenchMainSessionRequest/invalid/owner.json +1 -0
  325. package/fixtures/openapi/WorkbenchMainSessionRequest/invalid/provider.json +1 -0
  326. package/fixtures/openapi/WorkbenchMainSessionRequest/valid/empty.json +1 -0
  327. package/fixtures/openapi/WorkbenchMainSessionRequest/valid/provider.json +1 -0
  328. package/fixtures/openapi/WorkbenchMessageSearchPage/invalid/role.json +12 -0
  329. package/fixtures/openapi/WorkbenchMessageSearchPage/valid/page.json +12 -0
  330. package/fixtures/openapi/WorkbenchMessageWindow/invalid/missing.json +1 -0
  331. package/fixtures/openapi/WorkbenchMessageWindow/valid/empty.json +3 -0
  332. package/fixtures/openapi/WorkbenchModelOption/invalid/zero-capacity.json +1 -0
  333. package/fixtures/openapi/WorkbenchModelOption/valid/capacity.json +1 -0
  334. package/fixtures/openapi/WorkbenchModelOption/valid/unknown.json +1 -0
  335. package/fixtures/openapi/WorkbenchProfessionalCapabilityInput/invalid/basic.json +7 -0
  336. package/fixtures/openapi/WorkbenchProfessionalCapabilityInput/valid/basic.json +11 -0
  337. package/fixtures/openapi/WorkbenchProfessionalCapabilityInput/valid/selected-profile.json +23 -0
  338. package/fixtures/openapi/WorkbenchSendMessageStreamRequest/invalid/missing-required.json +1 -0
  339. package/fixtures/openapi/WorkbenchSendMessageStreamRequest/valid/mixed-professional-task.json +22 -0
  340. package/fixtures/openapi/WorkbenchTaskIntent/invalid/basic.json +5 -0
  341. package/fixtures/openapi/WorkbenchTaskIntent/invalid/oversized-capability-source.json +3 -0
  342. package/fixtures/openapi/WorkbenchTaskIntent/valid/basic.json +9 -0
  343. package/fixtures/openapi/WorkbenchTaskIntent/valid/independent-sources.json +17 -0
  344. package/gen/go/sohaapi/client.go +1 -1
  345. package/gen/go/sohaapi/personal_environment_test.go +25 -0
  346. package/gen/go/sohaapi/types.go +2679 -240
  347. package/gen/go/sohaapi/types_test.go +30 -30
  348. package/gen/go/sohaapi/vm_disk_test.go +21 -0
  349. package/gen/ts/sohaapi/index.ts +4150 -169
  350. package/go.mod +61 -49
  351. package/go.sum +202 -176
  352. package/knowledge/connector-definition.schema.json +6 -1
  353. package/knowledge/source-import-policy.schema.json +32 -0
  354. package/memory/memory-record.schema.json +1 -1
  355. package/openapi/soha-api.json +22230 -15693
  356. package/openapi/soha-api.yaml +2495 -12
  357. package/openapi/spec_generated.go +3 -3
  358. package/package.json +19 -3
  359. /package/fixtures/openapi/DeliveryExecutionHistoryPage/{invalid-kind.json → invalid/invalid-kind.json} +0 -0
  360. /package/fixtures/openapi/DeliveryExecutionHistoryPage/{valid-build.json → valid/valid-build.json} +0 -0
  361. /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.22
4
+ version: 0.1.24
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]
@@ -7544,6 +8398,40 @@ paths:
7544
8398
  $ref: "#/components/responses/Error"
7545
8399
  "503":
7546
8400
  $ref: "#/components/responses/Error"
8401
+ post:
8402
+ tags:
8403
+ - Platform
8404
+ operationId: createKubernetesNamespace
8405
+ x-soha-permissions:
8406
+ mode: all
8407
+ keys:
8408
+ - platform.namespaces.create
8409
+ x-soha-implementation-status: implemented
8410
+ parameters:
8411
+ - $ref: "#/components/parameters/ClusterID"
8412
+ requestBody:
8413
+ required: true
8414
+ content:
8415
+ application/json:
8416
+ schema:
8417
+ $ref: "#/components/schemas/KubernetesNamespaceCreateInput"
8418
+ responses:
8419
+ "201":
8420
+ description: Kubernetes operation result.
8421
+ content:
8422
+ application/json:
8423
+ schema:
8424
+ $ref: "#/components/schemas/KubernetesNamespaceEnvelope"
8425
+ "400":
8426
+ $ref: "#/components/responses/Error"
8427
+ "403":
8428
+ $ref: "#/components/responses/Error"
8429
+ "404":
8430
+ $ref: "#/components/responses/Error"
8431
+ "409":
8432
+ $ref: "#/components/responses/Error"
8433
+ "503":
8434
+ $ref: "#/components/responses/Error"
7547
8435
  /clusters/{clusterID}/infrastructure/nodes:
7548
8436
  get:
7549
8437
  tags: [Platform]
@@ -9548,6 +10436,39 @@ paths:
9548
10436
  "403": { $ref: "#/components/responses/Error" }
9549
10437
  "404": { $ref: "#/components/responses/Error" }
9550
10438
  "503": { $ref: "#/components/responses/Error" }
10439
+ /clusters/{clusterID}/extensions/crds/{crdName}:
10440
+ delete:
10441
+ tags: [Platform]
10442
+ operationId: deleteKubernetesCustomResourceDefinition
10443
+ x-soha-permissions: { mode: all, keys: [platform.extensions.crds.delete] }
10444
+ x-soha-implementation-status: implemented
10445
+ description: Delete one cluster-scoped CRD definition and all of its custom resource instances. This does not uninstall its operator or Helm release. UID and resourceVersion preconditions protect against replacement; finalizers may delay removal.
10446
+ parameters:
10447
+ - $ref: "#/components/parameters/ClusterID"
10448
+ - $ref: "#/components/parameters/KubernetesCRDName"
10449
+ - name: expectedUid
10450
+ in: query
10451
+ required: true
10452
+ description: UID observed in the CRD catalog. A same-name replacement is rejected.
10453
+ schema: { type: string, minLength: 1, maxLength: 128 }
10454
+ responses:
10455
+ "204": { description: Deletion requested. Refresh the catalog to confirm disappearance; finalizers may still be pending. }
10456
+ "400": { $ref: "#/components/responses/Error" }
10457
+ "403": { $ref: "#/components/responses/Error" }
10458
+ "404": { $ref: "#/components/responses/Error" }
10459
+ "409": { $ref: "#/components/responses/Error" }
10460
+ "503": { $ref: "#/components/responses/Error" }
10461
+ /clusters/{clusterID}/extensions/crds/{crdName}/access:
10462
+ get:
10463
+ tags: [Platform]
10464
+ operationId: getKubernetesCustomResourceAccess
10465
+ x-soha-permissions: { mode: all, keys: [platform.extensions.view] }
10466
+ parameters: [{ $ref: "#/components/parameters/ClusterID" }, { $ref: "#/components/parameters/KubernetesCRDName" }, { $ref: "#/components/parameters/KubernetesNamespaceQuery" }]
10467
+ responses:
10468
+ "200": { description: Soha and runtime permissions for this custom resource collection., content: { application/json: { schema: { $ref: "#/components/schemas/KubernetesCustomResourceAccessEnvelope" } } } }
10469
+ "403": { $ref: "#/components/responses/Error" }
10470
+ "404": { $ref: "#/components/responses/Error" }
10471
+ "503": { $ref: "#/components/responses/Error" }
9551
10472
  /clusters/{clusterID}/extensions/crds/{crdName}/resources:
9552
10473
  get:
9553
10474
  tags: [Platform]
@@ -10193,6 +11114,65 @@ paths:
10193
11114
  $ref: "#/components/responses/Error"
10194
11115
  "409":
10195
11116
  $ref: "#/components/responses/Error"
11117
+ /clusters/{clusterID}/agent-upgrade:
11118
+ get:
11119
+ tags: [Platform]
11120
+ operationId: getClusterAgentUpgradeStatus
11121
+ description: Read the running Agent version and standard Agent Deployment rollout through the existing cluster connection.
11122
+ x-soha-permissions:
11123
+ mode: all
11124
+ keys: [platform.clusters.view]
11125
+ parameters:
11126
+ - $ref: "#/components/parameters/ClusterID"
11127
+ responses:
11128
+ "200":
11129
+ description: Agent version, recommended version bundled with this server, and rollout status. The recommendation is not a live latest-release lookup.
11130
+ content:
11131
+ application/json:
11132
+ schema:
11133
+ $ref: "#/components/schemas/ClusterAgentUpgradeStatusEnvelope"
11134
+ "400":
11135
+ $ref: "#/components/responses/Error"
11136
+ "403":
11137
+ $ref: "#/components/responses/Error"
11138
+ "404":
11139
+ $ref: "#/components/responses/Error"
11140
+ "409":
11141
+ $ref: "#/components/responses/Error"
11142
+ "503":
11143
+ $ref: "#/components/responses/Error"
11144
+ post:
11145
+ tags: [Platform]
11146
+ operationId: upgradeClusterAgent
11147
+ description: Update only the standard Agent container to an explicit official release version using the Agent connection. Kubernetes owns the rollout; HTTP 202 means the image update was accepted, not that rollout completed. Non-direct resource owners must use their owning delivery tool.
11148
+ x-soha-permissions:
11149
+ mode: all
11150
+ keys: [platform.clusters.update]
11151
+ parameters:
11152
+ - $ref: "#/components/parameters/ClusterID"
11153
+ requestBody:
11154
+ required: true
11155
+ content:
11156
+ application/json:
11157
+ schema:
11158
+ $ref: "#/components/schemas/ClusterAgentUpgradeInput"
11159
+ responses:
11160
+ "202":
11161
+ description: Image update accepted. Read upgrade status until the target version reconnects and rollout is healthy.
11162
+ content:
11163
+ application/json:
11164
+ schema:
11165
+ $ref: "#/components/schemas/ClusterAgentUpgradeResultEnvelope"
11166
+ "400":
11167
+ $ref: "#/components/responses/Error"
11168
+ "403":
11169
+ $ref: "#/components/responses/Error"
11170
+ "404":
11171
+ $ref: "#/components/responses/Error"
11172
+ "409":
11173
+ $ref: "#/components/responses/Error"
11174
+ "503":
11175
+ $ref: "#/components/responses/Error"
10196
11176
  /kubernetes/agent-installations/{installTicket}/manifest.yaml:
10197
11177
  get:
10198
11178
  tags: [Platform]
@@ -11118,6 +12098,32 @@ paths:
11118
12098
  $ref: "#/components/responses/Error"
11119
12099
  "404":
11120
12100
  $ref: "#/components/responses/Error"
12101
+ /secrets/{secretID}/references:
12102
+ get:
12103
+ tags: [Secrets]
12104
+ operationId: listSecretReferences
12105
+ x-soha-implementation-status: implemented
12106
+ security:
12107
+ - bearerAuth: []
12108
+ parameters:
12109
+ - name: secretID
12110
+ in: path
12111
+ required: true
12112
+ schema:
12113
+ type: string
12114
+ responses:
12115
+ "200":
12116
+ description: Visible VM login bindings and initialization operations using fixed secret versions; no secret values.
12117
+ content:
12118
+ application/json:
12119
+ schema:
12120
+ $ref: "#/components/schemas/SecretReferenceUsageListEnvelope"
12121
+ "401":
12122
+ $ref: "#/components/responses/Error"
12123
+ "403":
12124
+ $ref: "#/components/responses/Error"
12125
+ "404":
12126
+ $ref: "#/components/responses/Error"
11121
12127
  /secrets/{secretID}/versions:
11122
12128
  get:
11123
12129
  tags: [Secrets]
@@ -17740,6 +18746,141 @@ paths:
17740
18746
  schema: { $ref: "#/components/schemas/OperationStatus" }
17741
18747
  "403": { $ref: "#/components/responses/Error" }
17742
18748
  "404": { $ref: "#/components/responses/Error" }
18749
+ /network-access/proxy-instances:
18750
+ get:
18751
+ tags: [Network Access]
18752
+ operationId: listNetworkProxyInstances
18753
+ x-soha-permissions:
18754
+ mode: all
18755
+ keys: [network_access.proxy_instances.view]
18756
+ parameters:
18757
+ - { name: search, in: query, schema: { type: string, maxLength: 200 } }
18758
+ - { name: engine, in: query, schema: { $ref: "#/components/schemas/NetworkProxyEngine" } }
18759
+ - { name: limit, in: query, schema: { type: integer, minimum: 1, maximum: 200, default: 100 } }
18760
+ responses:
18761
+ "200":
18762
+ description: Registered server proxy instances and observed state.
18763
+ content:
18764
+ application/json:
18765
+ schema: { $ref: "#/components/schemas/NetworkProxyInstanceListEnvelope" }
18766
+ "403": { $ref: "#/components/responses/Error" }
18767
+ post:
18768
+ tags: [Network Access]
18769
+ operationId: createNetworkProxyInstance
18770
+ x-soha-permissions:
18771
+ mode: all
18772
+ keys: [network_access.proxy_instances.create]
18773
+ requestBody:
18774
+ required: true
18775
+ content:
18776
+ application/json:
18777
+ schema: { $ref: "#/components/schemas/NetworkProxyInstanceInput" }
18778
+ responses:
18779
+ "201":
18780
+ description: Created proxy instance. A separate one-time proxy runtime enrollment is required before it can report state.
18781
+ content:
18782
+ application/json:
18783
+ schema: { $ref: "#/components/schemas/NetworkProxyInstanceEnvelope" }
18784
+ "400": { $ref: "#/components/responses/Error" }
18785
+ "403": { $ref: "#/components/responses/Error" }
18786
+ "409": { $ref: "#/components/responses/Error" }
18787
+ /network-access/proxy-instances/{instanceID}:
18788
+ get:
18789
+ tags: [Network Access]
18790
+ operationId: getNetworkProxyInstance
18791
+ x-soha-permissions:
18792
+ mode: all
18793
+ keys: [network_access.proxy_instances.view]
18794
+ parameters:
18795
+ - { name: instanceID, in: path, required: true, schema: { type: string, minLength: 1, maxLength: 128 } }
18796
+ responses:
18797
+ "200":
18798
+ description: Proxy instance metadata. Configuration contents and controller credentials are excluded.
18799
+ content:
18800
+ application/json:
18801
+ schema: { $ref: "#/components/schemas/NetworkProxyInstanceEnvelope" }
18802
+ "403": { $ref: "#/components/responses/Error" }
18803
+ "404": { $ref: "#/components/responses/Error" }
18804
+ /network-access/proxy-instances/{instanceID}/configuration:
18805
+ put:
18806
+ tags: [Network Access]
18807
+ operationId: updateNetworkProxyConfiguration
18808
+ x-soha-permissions:
18809
+ mode: all
18810
+ keys: [network_access.proxy_instances.update]
18811
+ parameters:
18812
+ - { name: instanceID, in: path, required: true, schema: { type: string, minLength: 1, maxLength: 128 } }
18813
+ requestBody:
18814
+ required: true
18815
+ content:
18816
+ application/json:
18817
+ schema: { $ref: "#/components/schemas/NetworkProxyConfigurationInput" }
18818
+ responses:
18819
+ "200":
18820
+ description: Desired revision saved; runtime application is asynchronous. Configuration contents are not returned.
18821
+ content:
18822
+ application/json:
18823
+ schema: { $ref: "#/components/schemas/NetworkProxyInstanceEnvelope" }
18824
+ "400": { $ref: "#/components/responses/Error" }
18825
+ "403": { $ref: "#/components/responses/Error" }
18826
+ "404": { $ref: "#/components/responses/Error" }
18827
+ "409": { $ref: "#/components/responses/Error" }
18828
+ /network-access/proxy-instances/{instanceID}/traffic:
18829
+ get:
18830
+ tags: [Network Access]
18831
+ operationId: getNetworkProxyTraffic
18832
+ x-soha-permissions:
18833
+ mode: all
18834
+ keys: [network_access.proxy_instances.view]
18835
+ parameters:
18836
+ - { name: instanceID, in: path, required: true, schema: { type: string, minLength: 1, maxLength: 128 } }
18837
+ - { name: from, in: query, schema: { type: string, format: date-time } }
18838
+ - { name: to, in: query, schema: { type: string, format: date-time } }
18839
+ responses:
18840
+ "200":
18841
+ description: Bounded samples; speed is derived from adjacent cumulative counters within one runtime uptime epoch.
18842
+ content:
18843
+ application/json:
18844
+ schema: { $ref: "#/components/schemas/NetworkProxyTrafficEnvelope" }
18845
+ "400": { $ref: "#/components/responses/Error" }
18846
+ "403": { $ref: "#/components/responses/Error" }
18847
+ "404": { $ref: "#/components/responses/Error" }
18848
+ /network-access/proxy-instances/{instanceID}/connections:
18849
+ get:
18850
+ tags: [Network Access]
18851
+ operationId: getNetworkProxyConnections
18852
+ x-soha-permissions:
18853
+ mode: all
18854
+ keys: [network_access.proxy_connections.view]
18855
+ parameters:
18856
+ - { name: instanceID, in: path, required: true, schema: { type: string, minLength: 1, maxLength: 128 } }
18857
+ responses:
18858
+ "200":
18859
+ description: Latest short-lived connection snapshot, or an explicit unsupported/unavailable state.
18860
+ content:
18861
+ application/json:
18862
+ schema: { $ref: "#/components/schemas/NetworkProxyConnectionsEnvelope" }
18863
+ "403": { $ref: "#/components/responses/Error" }
18864
+ "404": { $ref: "#/components/responses/Error" }
18865
+ /network-access/proxy-instances/{instanceID}/connections/{connectionID}/close:
18866
+ post:
18867
+ tags: [Network Access]
18868
+ operationId: closeNetworkProxyConnection
18869
+ x-soha-permissions:
18870
+ mode: all
18871
+ keys: [network_access.proxy_connections.close]
18872
+ parameters:
18873
+ - { name: instanceID, in: path, required: true, schema: { type: string, minLength: 1, maxLength: 128 } }
18874
+ - { name: connectionID, in: path, required: true, schema: { type: string, minLength: 1, maxLength: 128 } }
18875
+ responses:
18876
+ "202":
18877
+ description: Expiring close command queued for the enrolled runtime. The action is audited.
18878
+ content:
18879
+ application/json:
18880
+ schema: { $ref: "#/components/schemas/NetworkProxyCloseCommandEnvelope" }
18881
+ "403": { $ref: "#/components/responses/Error" }
18882
+ "404": { $ref: "#/components/responses/Error" }
18883
+ "409": { $ref: "#/components/responses/Error" }
17743
18884
  /network-access/connection-options:
17744
18885
  get:
17745
18886
  tags: [Network Access]
@@ -18458,6 +19599,434 @@ paths:
18458
19599
  "400": { $ref: "#/components/responses/Error" }
18459
19600
  "403": { $ref: "#/components/responses/Error" }
18460
19601
  "404": { $ref: "#/components/responses/Error" }
19602
+ /clusters/{clusterID}/namespaces/{namespaceName}:
19603
+ put:
19604
+ tags:
19605
+ - Platform
19606
+ operationId: updateKubernetesNamespace
19607
+ x-soha-permissions:
19608
+ mode: all
19609
+ keys:
19610
+ - platform.namespaces.update
19611
+ x-soha-implementation-status: implemented
19612
+ parameters:
19613
+ - $ref: "#/components/parameters/ClusterID"
19614
+ - &a1
19615
+ name: namespaceName
19616
+ in: path
19617
+ required: true
19618
+ schema:
19619
+ type: string
19620
+ minLength: 1
19621
+ requestBody:
19622
+ required: true
19623
+ content:
19624
+ application/json:
19625
+ schema:
19626
+ $ref: "#/components/schemas/KubernetesNamespaceInput"
19627
+ responses:
19628
+ "200":
19629
+ description: Kubernetes operation result.
19630
+ content:
19631
+ application/json:
19632
+ schema:
19633
+ $ref: "#/components/schemas/KubernetesNamespaceEnvelope"
19634
+ "400":
19635
+ $ref: "#/components/responses/Error"
19636
+ "403":
19637
+ $ref: "#/components/responses/Error"
19638
+ "404":
19639
+ $ref: "#/components/responses/Error"
19640
+ "409":
19641
+ $ref: "#/components/responses/Error"
19642
+ "503":
19643
+ $ref: "#/components/responses/Error"
19644
+ delete:
19645
+ tags:
19646
+ - Platform
19647
+ operationId: deleteKubernetesNamespace
19648
+ x-soha-permissions:
19649
+ mode: all
19650
+ keys:
19651
+ - platform.namespaces.delete
19652
+ x-soha-implementation-status: implemented
19653
+ parameters:
19654
+ - $ref: "#/components/parameters/ClusterID"
19655
+ - *a1
19656
+ responses:
19657
+ "204":
19658
+ description: Operation completed.
19659
+ "400":
19660
+ $ref: "#/components/responses/Error"
19661
+ "403":
19662
+ $ref: "#/components/responses/Error"
19663
+ "404":
19664
+ $ref: "#/components/responses/Error"
19665
+ "409":
19666
+ $ref: "#/components/responses/Error"
19667
+ "503":
19668
+ $ref: "#/components/responses/Error"
19669
+ /clusters/{clusterID}/infrastructure/nodes/{nodeName}:
19670
+ put:
19671
+ tags:
19672
+ - Platform
19673
+ operationId: updateKubernetesNode
19674
+ x-soha-permissions:
19675
+ mode: all
19676
+ keys:
19677
+ - platform.nodes.update
19678
+ x-soha-implementation-status: implemented
19679
+ parameters:
19680
+ - $ref: "#/components/parameters/ClusterID"
19681
+ - $ref: "#/components/parameters/KubernetesNodeName"
19682
+ requestBody:
19683
+ required: true
19684
+ content:
19685
+ application/json:
19686
+ schema:
19687
+ $ref: "#/components/schemas/KubernetesNodeUpdateInput"
19688
+ responses:
19689
+ "200":
19690
+ description: Kubernetes operation result.
19691
+ content:
19692
+ application/json:
19693
+ schema:
19694
+ $ref: "#/components/schemas/KubernetesNodeDetailEnvelope"
19695
+ "400":
19696
+ $ref: "#/components/responses/Error"
19697
+ "403":
19698
+ $ref: "#/components/responses/Error"
19699
+ "404":
19700
+ $ref: "#/components/responses/Error"
19701
+ "409":
19702
+ $ref: "#/components/responses/Error"
19703
+ "503":
19704
+ $ref: "#/components/responses/Error"
19705
+ delete:
19706
+ tags:
19707
+ - Platform
19708
+ operationId: deleteKubernetesNode
19709
+ x-soha-permissions:
19710
+ mode: all
19711
+ keys:
19712
+ - platform.nodes.delete
19713
+ x-soha-implementation-status: implemented
19714
+ parameters:
19715
+ - $ref: "#/components/parameters/ClusterID"
19716
+ - $ref: "#/components/parameters/KubernetesNodeName"
19717
+ responses:
19718
+ "204":
19719
+ description: Operation completed.
19720
+ "400":
19721
+ $ref: "#/components/responses/Error"
19722
+ "403":
19723
+ $ref: "#/components/responses/Error"
19724
+ "404":
19725
+ $ref: "#/components/responses/Error"
19726
+ "409":
19727
+ $ref: "#/components/responses/Error"
19728
+ "503":
19729
+ $ref: "#/components/responses/Error"
19730
+ /clusters/{clusterID}/infrastructure/nodes/{nodeName}/schedulability:
19731
+ put:
19732
+ tags:
19733
+ - Platform
19734
+ operationId: setKubernetesNodeSchedulability
19735
+ x-soha-permissions:
19736
+ mode: all
19737
+ keys:
19738
+ - platform.nodes.update
19739
+ x-soha-implementation-status: implemented
19740
+ parameters:
19741
+ - $ref: "#/components/parameters/ClusterID"
19742
+ - $ref: "#/components/parameters/KubernetesNodeName"
19743
+ requestBody:
19744
+ required: true
19745
+ content:
19746
+ application/json:
19747
+ schema:
19748
+ $ref: "#/components/schemas/KubernetesNodeSchedulabilityInput"
19749
+ responses:
19750
+ "204":
19751
+ description: Operation completed.
19752
+ "400":
19753
+ $ref: "#/components/responses/Error"
19754
+ "403":
19755
+ $ref: "#/components/responses/Error"
19756
+ "404":
19757
+ $ref: "#/components/responses/Error"
19758
+ "409":
19759
+ $ref: "#/components/responses/Error"
19760
+ "503":
19761
+ $ref: "#/components/responses/Error"
19762
+ /clusters/{clusterID}/infrastructure/nodes/{nodeName}/drain:
19763
+ post:
19764
+ tags:
19765
+ - Platform
19766
+ operationId: drainKubernetesNode
19767
+ x-soha-permissions:
19768
+ mode: all
19769
+ keys:
19770
+ - platform.nodes.drain
19771
+ x-soha-implementation-status: implemented
19772
+ parameters:
19773
+ - $ref: "#/components/parameters/ClusterID"
19774
+ - $ref: "#/components/parameters/KubernetesNodeName"
19775
+ requestBody:
19776
+ required: true
19777
+ content:
19778
+ application/json:
19779
+ schema:
19780
+ $ref: "#/components/schemas/KubernetesNodeDrainInput"
19781
+ responses:
19782
+ "204":
19783
+ description: Operation completed.
19784
+ "400":
19785
+ $ref: "#/components/responses/Error"
19786
+ "403":
19787
+ $ref: "#/components/responses/Error"
19788
+ "404":
19789
+ $ref: "#/components/responses/Error"
19790
+ "409":
19791
+ $ref: "#/components/responses/Error"
19792
+ "503":
19793
+ $ref: "#/components/responses/Error"
19794
+ /clusters/{clusterID}/infrastructure/nodes/{nodeName}/yaml:
19795
+ get:
19796
+ tags:
19797
+ - Platform
19798
+ operationId: getKubernetesNodeYaml
19799
+ x-soha-permissions:
19800
+ mode: all
19801
+ keys:
19802
+ - platform.nodes.view
19803
+ x-soha-implementation-status: implemented
19804
+ parameters:
19805
+ - $ref: "#/components/parameters/ClusterID"
19806
+ - $ref: "#/components/parameters/KubernetesNodeName"
19807
+ responses:
19808
+ "200":
19809
+ description: Kubernetes operation result.
19810
+ content:
19811
+ application/json:
19812
+ schema:
19813
+ $ref: "#/components/schemas/KubernetesResourceYamlEnvelope"
19814
+ "400":
19815
+ $ref: "#/components/responses/Error"
19816
+ "403":
19817
+ $ref: "#/components/responses/Error"
19818
+ "404":
19819
+ $ref: "#/components/responses/Error"
19820
+ "409":
19821
+ $ref: "#/components/responses/Error"
19822
+ "503":
19823
+ $ref: "#/components/responses/Error"
19824
+ put:
19825
+ tags:
19826
+ - Platform
19827
+ operationId: applyKubernetesNodeYaml
19828
+ x-soha-permissions:
19829
+ mode: all
19830
+ keys:
19831
+ - platform.nodes.update
19832
+ x-soha-implementation-status: implemented
19833
+ parameters:
19834
+ - $ref: "#/components/parameters/ClusterID"
19835
+ - $ref: "#/components/parameters/KubernetesNodeName"
19836
+ requestBody:
19837
+ required: true
19838
+ content:
19839
+ application/json:
19840
+ schema:
19841
+ $ref: "#/components/schemas/KubernetesResourceYamlInput"
19842
+ responses:
19843
+ "200":
19844
+ description: Kubernetes operation result.
19845
+ content:
19846
+ application/json:
19847
+ schema:
19848
+ $ref: "#/components/schemas/KubernetesResourceYamlEnvelope"
19849
+ "400":
19850
+ $ref: "#/components/responses/Error"
19851
+ "403":
19852
+ $ref: "#/components/responses/Error"
19853
+ "404":
19854
+ $ref: "#/components/responses/Error"
19855
+ "409":
19856
+ $ref: "#/components/responses/Error"
19857
+ "503":
19858
+ $ref: "#/components/responses/Error"
19859
+ /clusters/{clusterID}/configuration/configmaps/{name}/data:
19860
+ put:
19861
+ tags:
19862
+ - Platform
19863
+ operationId: updateKubernetesConfigMapData
19864
+ x-soha-permissions:
19865
+ mode: all
19866
+ keys:
19867
+ - platform.configuration.config-maps.update
19868
+ x-soha-implementation-status: implemented
19869
+ parameters:
19870
+ - $ref: "#/components/parameters/ClusterID"
19871
+ - $ref: "#/components/parameters/KubernetesResourceName"
19872
+ - $ref: "#/components/parameters/KubernetesNamespaceQuery"
19873
+ requestBody:
19874
+ required: true
19875
+ content:
19876
+ application/json:
19877
+ schema:
19878
+ $ref: "#/components/schemas/KubernetesConfigMapDataInput"
19879
+ responses:
19880
+ "200":
19881
+ description: Kubernetes operation result.
19882
+ content:
19883
+ application/json:
19884
+ schema:
19885
+ $ref: "#/components/schemas/KubernetesConfigMapDetailEnvelope"
19886
+ "400":
19887
+ $ref: "#/components/responses/Error"
19888
+ "403":
19889
+ $ref: "#/components/responses/Error"
19890
+ "404":
19891
+ $ref: "#/components/responses/Error"
19892
+ "409":
19893
+ $ref: "#/components/responses/Error"
19894
+ "503":
19895
+ $ref: "#/components/responses/Error"
19896
+ /clusters/{clusterID}/configuration/secrets/{name}/detail:
19897
+ get:
19898
+ tags:
19899
+ - Platform
19900
+ operationId: getKubernetesSecretDetail
19901
+ x-soha-permissions:
19902
+ mode: all
19903
+ keys:
19904
+ - platform.configuration.secret-data.view
19905
+ - platform.configuration.secrets.view
19906
+ x-soha-implementation-status: implemented
19907
+ parameters:
19908
+ - $ref: "#/components/parameters/ClusterID"
19909
+ - $ref: "#/components/parameters/KubernetesResourceName"
19910
+ - $ref: "#/components/parameters/KubernetesNamespaceQuery"
19911
+ responses:
19912
+ "200":
19913
+ description: Kubernetes operation result.
19914
+ content:
19915
+ application/json:
19916
+ schema:
19917
+ $ref: "#/components/schemas/KubernetesSecretDetailEnvelope"
19918
+ "400":
19919
+ $ref: "#/components/responses/Error"
19920
+ "403":
19921
+ $ref: "#/components/responses/Error"
19922
+ "404":
19923
+ $ref: "#/components/responses/Error"
19924
+ "409":
19925
+ $ref: "#/components/responses/Error"
19926
+ "503":
19927
+ $ref: "#/components/responses/Error"
19928
+ /clusters/{clusterID}/configuration/secrets/{name}/data:
19929
+ put:
19930
+ tags:
19931
+ - Platform
19932
+ operationId: updateKubernetesSecretData
19933
+ x-soha-permissions:
19934
+ mode: all
19935
+ keys:
19936
+ - platform.configuration.secret-data.view
19937
+ - platform.configuration.secrets.update
19938
+ x-soha-implementation-status: implemented
19939
+ parameters:
19940
+ - $ref: "#/components/parameters/ClusterID"
19941
+ - $ref: "#/components/parameters/KubernetesResourceName"
19942
+ - $ref: "#/components/parameters/KubernetesNamespaceQuery"
19943
+ requestBody:
19944
+ required: true
19945
+ content:
19946
+ application/json:
19947
+ schema:
19948
+ $ref: "#/components/schemas/KubernetesSecretDataInput"
19949
+ responses:
19950
+ "200":
19951
+ description: Kubernetes operation result.
19952
+ content:
19953
+ application/json:
19954
+ schema:
19955
+ $ref: "#/components/schemas/KubernetesSecretDetailEnvelope"
19956
+ "400":
19957
+ $ref: "#/components/responses/Error"
19958
+ "403":
19959
+ $ref: "#/components/responses/Error"
19960
+ "404":
19961
+ $ref: "#/components/responses/Error"
19962
+ "409":
19963
+ $ref: "#/components/responses/Error"
19964
+ "503":
19965
+ $ref: "#/components/responses/Error"
19966
+ /clusters/{clusterID}/workloads/pods/{podName}:
19967
+ delete:
19968
+ tags:
19969
+ - Platform
19970
+ operationId: deleteKubernetesPod
19971
+ x-soha-permissions:
19972
+ mode: all
19973
+ keys:
19974
+ - platform.pods.delete
19975
+ x-soha-implementation-status: implemented
19976
+ parameters:
19977
+ - $ref: "#/components/parameters/ClusterID"
19978
+ - $ref: "#/components/parameters/KubernetesPodName"
19979
+ - $ref: "#/components/parameters/KubernetesNamespaceQuery"
19980
+ responses:
19981
+ "204":
19982
+ description: Operation completed.
19983
+ "400":
19984
+ $ref: "#/components/responses/Error"
19985
+ "403":
19986
+ $ref: "#/components/responses/Error"
19987
+ "404":
19988
+ $ref: "#/components/responses/Error"
19989
+ "409":
19990
+ $ref: "#/components/responses/Error"
19991
+ "503":
19992
+ $ref: "#/components/responses/Error"
19993
+ /clusters/{clusterID}/workloads/cronjobs/{cronJobName}/suspend:
19994
+ post:
19995
+ tags:
19996
+ - Platform
19997
+ operationId: setKubernetesCronJobSuspend
19998
+ x-soha-permissions:
19999
+ mode: all
20000
+ keys:
20001
+ - platform.workloads.cron-jobs.suspend
20002
+ x-soha-implementation-status: implemented
20003
+ parameters:
20004
+ - $ref: "#/components/parameters/ClusterID"
20005
+ - $ref: "#/components/parameters/KubernetesCronJobName"
20006
+ - $ref: "#/components/parameters/KubernetesNamespaceQuery"
20007
+ requestBody:
20008
+ required: true
20009
+ content:
20010
+ application/json:
20011
+ schema:
20012
+ $ref: "#/components/schemas/KubernetesCronJobSuspendInput"
20013
+ responses:
20014
+ "200":
20015
+ description: Kubernetes operation result.
20016
+ content:
20017
+ application/json:
20018
+ schema:
20019
+ $ref: "#/components/schemas/KubernetesCronJobDetailEnvelope"
20020
+ "400":
20021
+ $ref: "#/components/responses/Error"
20022
+ "403":
20023
+ $ref: "#/components/responses/Error"
20024
+ "404":
20025
+ $ref: "#/components/responses/Error"
20026
+ "409":
20027
+ $ref: "#/components/responses/Error"
20028
+ "503":
20029
+ $ref: "#/components/responses/Error"
18461
20030
  components:
18462
20031
  securitySchemes:
18463
20032
  bearerAuth:
@@ -23728,9 +25297,13 @@ components:
23728
25297
  name: { type: string, minLength: 1, maxLength: 160 }
23729
25298
  kind: { type: string, enum: [inline, http, git, object] }
23730
25299
  version: { type: string, maxLength: 64 }
23731
- secretRef: { type: string, maxLength: 512 }
25300
+ secretRef:
25301
+ type: string
25302
+ maxLength: 512
25303
+ description: "Gateway execution uses soha://secrets/<id> with an optional /versions/<n>. Legacy secret: references remain readable but require explicit configuration migration before execution."
23732
25304
  config:
23733
25305
  type: object
25306
+ 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.
23734
25307
  additionalProperties: true
23735
25308
  syncPolicy: { $ref: "#/components/schemas/KnowledgeSyncPolicy" }
23736
25309
  additionalProperties: false
@@ -24096,6 +25669,7 @@ components:
24096
25669
  sourceType: { type: string, enum: [explicit_user, curated_extractor] }
24097
25670
  sourceRefs:
24098
25671
  type: array
25672
+ 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.'
24099
25673
  maxItems: 32
24100
25674
  items: { type: string }
24101
25675
  confidence: { type: number, minimum: 0, maximum: 1 }
@@ -24361,14 +25935,53 @@ components:
24361
25935
  createdAt: { type: string, format: date-time }
24362
25936
  updatedAt: { type: string, format: date-time }
24363
25937
  additionalProperties: false
25938
+ PersonalDockerEnvironmentPolicy:
25939
+ type: object
25940
+ 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.
25941
+ required: [agentClusterId, quota, leaseSeconds]
25942
+ properties:
25943
+ agentClusterId: { type: string, format: uuid }
25944
+ quota:
25945
+ $ref: "#/components/schemas/PersonalEnvironmentQuota"
25946
+ leaseSeconds: { type: integer, minimum: 60, maximum: 3600 }
25947
+ additionalProperties: false
25948
+ PersonalVMEnvironmentPolicy:
25949
+ type: object
25950
+ 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.
25951
+ required: [ownerId, computeRef, provider, dataDiskSerial, dataDiskBytes, quota, leaseSeconds]
25952
+ properties:
25953
+ ownerId: { type: string, format: uuid }
25954
+ computeRef: { type: string, format: uuid, description: Soha VM ID, not a provider VM number. }
25955
+ provider: { type: string, enum: [pve] }
25956
+ dataDiskSerial: { type: string, pattern: '^[A-Za-z0-9_-]{1,20}$' }
25957
+ dataDiskBytes: { type: integer, format: int64, minimum: 1073741824, maximum: 1099511627776, multipleOf: 1073741824, description: Exact independent disk size in whole GiB. }
25958
+ quota:
25959
+ $ref: "#/components/schemas/PersonalEnvironmentQuota"
25960
+ leaseSeconds: { type: integer, minimum: 60, maximum: 3600 }
25961
+ additionalProperties: false
25962
+ PersonalEnvironmentQuota:
25963
+ type: object
25964
+ required: [diskBytes, memoryBytes, cpuUnits, maxProcesses, networkEgress]
25965
+ properties:
25966
+ diskBytes: { type: integer, format: int64, minimum: 16777216, maximum: 1099511627776, description: Hard charged persistent-data bytes; temporary mounts charge memory instead. }
25967
+ memoryBytes: { type: integer, format: int64, minimum: 33554432, maximum: 17179869184 }
25968
+ cpuUnits: { type: integer, format: int64, minimum: 1, maximum: 8000, description: CPU millicores; 1000 is one CPU. }
25969
+ maxProcesses: { type: integer, minimum: 4, maximum: 256 }
25970
+ networkEgress: { type: boolean, const: false, description: Direct network access is not supported by this personal environment policy. }
25971
+ additionalProperties: false
24364
25972
  AIEnvironmentTemplateInput:
24365
25973
  type: object
25974
+ 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.
24366
25975
  required: [id, name, backend, isolationMode]
24367
25976
  properties:
24368
25977
  id: { type: string, minLength: 1 }
24369
25978
  name: { type: string, minLength: 1 }
24370
- backend: { type: string, enum: [container, kubernetes] }
25979
+ backend: { type: string, enum: [container, kubernetes, vm] }
24371
25980
  isolationMode: { type: string, enum: [read-only, disposable-write] }
25981
+ personalDocker:
25982
+ $ref: "#/components/schemas/PersonalDockerEnvironmentPolicy"
25983
+ personalVM:
25984
+ $ref: "#/components/schemas/PersonalVMEnvironmentPolicy"
24372
25985
  resourcePolicy:
24373
25986
  type: object
24374
25987
  additionalProperties: true
@@ -24378,12 +25991,17 @@ components:
24378
25991
  additionalProperties: false
24379
25992
  AIEnvironmentTemplate:
24380
25993
  type: object
25994
+ 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.
24381
25995
  required: [id, name, backend, isolationMode, status, createdAt, updatedAt]
24382
25996
  properties:
24383
25997
  id: { type: string, minLength: 1 }
24384
25998
  name: { type: string, minLength: 1 }
24385
- backend: { type: string, enum: [container, kubernetes] }
25999
+ backend: { type: string, enum: [container, kubernetes, vm] }
24386
26000
  isolationMode: { type: string, enum: [read-only, disposable-write] }
26001
+ personalDocker:
26002
+ $ref: "#/components/schemas/PersonalDockerEnvironmentPolicy"
26003
+ personalVM:
26004
+ $ref: "#/components/schemas/PersonalVMEnvironmentPolicy"
24387
26005
  resourcePolicy:
24388
26006
  type: object
24389
26007
  additionalProperties: true
@@ -24630,7 +26248,18 @@ components:
24630
26248
  content: { type: string }
24631
26249
  uri: { type: string }
24632
26250
  version: { type: string }
26251
+ deleted:
26252
+ type: boolean
26253
+ description: Explicit source tombstone for this externalId. Missing documents in a partial fetch do not imply deletion. A tombstone has empty content.
24633
26254
  acl: { $ref: "#/components/schemas/KnowledgeAccessScope" }
26255
+ allOf:
26256
+ - if:
26257
+ required: [deleted]
26258
+ properties:
26259
+ deleted: { const: true }
26260
+ then:
26261
+ properties:
26262
+ content: { maxLength: 0 }
24634
26263
  additionalProperties: false
24635
26264
  KnowledgeDocument:
24636
26265
  type: object
@@ -24728,6 +26357,9 @@ components:
24728
26357
  uri: { type: string }
24729
26358
  score: { type: number }
24730
26359
  contentHash: { type: string }
26360
+ documentVersionId: { type: string }
26361
+ indexRevisionId: { type: string }
26362
+ retrievedAt: { type: string, format: date-time }
24731
26363
  additionalProperties: false
24732
26364
  KnowledgeSearchHit:
24733
26365
  type: object
@@ -24758,6 +26390,8 @@ components:
24758
26390
  timingMs: { type: integer, format: int64, minimum: 0 }
24759
26391
  noAnswer: { type: boolean }
24760
26392
  traceId: { type: string }
26393
+ retrievalMode: { type: string, enum: [lexical, hybrid] }
26394
+ degradationReason: { type: string }
24761
26395
  additionalProperties: false
24762
26396
  EvaluationDatasetSample:
24763
26397
  type: object
@@ -25481,10 +27115,32 @@ components:
25481
27115
  reasoningEfforts:
25482
27116
  type: array
25483
27117
  items: { type: string, enum: [low, medium, high] }
27118
+ contextWindowTokens:
27119
+ type: integer
27120
+ format: int64
27121
+ minimum: 1
27122
+ 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.
27123
+ additionalProperties: false
27124
+ WorkbenchContextUsage:
27125
+ type: object
27126
+ required: [measurement]
27127
+ 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.
27128
+ properties:
27129
+ measurement: { type: string, enum: [reported, estimated, unavailable] }
27130
+ model: { type: string }
27131
+ inputTokens: { type: integer, format: int64, minimum: 0 }
27132
+ outputTokens: { type: integer, format: int64, minimum: 0 }
27133
+ totalTokens: { type: integer, format: int64, minimum: 0 }
27134
+ contextWindowTokens: { type: integer, format: int64, minimum: 1 }
25484
27135
  additionalProperties: false
25485
27136
  WorkbenchSessionMetadata:
25486
27137
  type: object
25487
27138
  properties:
27139
+ conversationKind:
27140
+ type: string
27141
+ enum: [main, side, personal_main, personal_side]
27142
+ readOnly: true
27143
+ 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.
25488
27144
  modelPreferences:
25489
27145
  $ref: "#/components/schemas/WorkbenchModelPreferences"
25490
27146
  mode:
@@ -25531,6 +27187,340 @@ components:
25531
27187
  createdAt: { type: string, format: date-time }
25532
27188
  updatedAt: { type: string, format: date-time }
25533
27189
  additionalProperties: false
27190
+ PersonalAgentAccess:
27191
+ type: object
27192
+ required: [userId, status, version]
27193
+ properties:
27194
+ userId: { type: string }
27195
+ status:
27196
+ type: string
27197
+ enum: [not_requested, pending, approved, rejected, revoked]
27198
+ version: { type: integer, format: int64, minimum: 0 }
27199
+ requestedAt: { type: string, format: date-time }
27200
+ decidedAt: { type: string, format: date-time }
27201
+ decidedBy: { type: string }
27202
+ additionalProperties: false
27203
+ PersonalAgentAccessDecision:
27204
+ type: object
27205
+ required: [status, version]
27206
+ properties:
27207
+ status: { type: string, enum: [approved, rejected, revoked] }
27208
+ version: { type: integer, format: int64, minimum: 1 }
27209
+ additionalProperties: false
27210
+ PersonalAgentAccessEnvelope:
27211
+ type: object
27212
+ required: [data]
27213
+ properties:
27214
+ data: { $ref: "#/components/schemas/PersonalAgentAccess" }
27215
+ additionalProperties: false
27216
+ PersonalAgentAccessListEnvelope:
27217
+ type: object
27218
+ required: [data]
27219
+ properties:
27220
+ data:
27221
+ type: array
27222
+ items: { $ref: "#/components/schemas/PersonalAgentAccess" }
27223
+ additionalProperties: false
27224
+ PersonalAssistant:
27225
+ type: object
27226
+ required: [id, name, mainSessionId, createdAt, updatedAt]
27227
+ properties:
27228
+ id: { type: string, readOnly: true }
27229
+ name: { type: string, minLength: 1, maxLength: 60 }
27230
+ avatarUrl:
27231
+ description: Bounded raster data URL belonging to this assistant, not the login account. Empty or absent uses the default image.
27232
+ type: string
27233
+ maxLength: 700000
27234
+ avatarPosterUrl:
27235
+ description: Static PNG/JPEG data URL used when motion is disabled or reduced.
27236
+ type: string
27237
+ maxLength: 150000
27238
+ avatarMotion: { type: string, enum: [auto, off] }
27239
+ mainSessionId: { type: string, readOnly: true }
27240
+ createdAt: { type: string, format: date-time, readOnly: true }
27241
+ updatedAt: { type: string, format: date-time, readOnly: true }
27242
+ additionalProperties: false
27243
+ PersonalAssistantAvatarRequest:
27244
+ type: object
27245
+ required: [avatarUrl]
27246
+ properties:
27247
+ avatarUrl:
27248
+ type: string
27249
+ maxLength: 700000
27250
+ pattern: '^(data:image/(png|jpeg|gif|webp);base64,[A-Za-z0-9+/]+={0,2})?$'
27251
+ avatarPosterUrl:
27252
+ type: string
27253
+ maxLength: 150000
27254
+ pattern: '^(data:image/(png|jpeg);base64,[A-Za-z0-9+/]+={0,2})?$'
27255
+ avatarMotion: { type: string, enum: [auto, off], default: auto }
27256
+ additionalProperties: false
27257
+ PersonalEnvironmentActionRequest:
27258
+ type: object
27259
+ required: [action]
27260
+ properties:
27261
+ action: { type: string, enum: [wake, sleep, reconcile] }
27262
+ templateId:
27263
+ description: Required on first wake; may only select the already bound template afterward. Only wake accepts this field.
27264
+ type: string
27265
+ minLength: 1
27266
+ maxLength: 128
27267
+ additionalProperties: false
27268
+ PersonalEnvironmentUsage:
27269
+ type: object
27270
+ required: [diskBytes, memoryBytes, cpuTimeNanos, processes]
27271
+ properties:
27272
+ diskBytes: { type: integer, format: int64, minimum: 0 }
27273
+ memoryBytes: { type: integer, format: int64, minimum: 0 }
27274
+ cpuTimeNanos: { type: integer, format: int64, minimum: 0 }
27275
+ processes: { type: integer, minimum: 0 }
27276
+ additionalProperties: false
27277
+ PersonalEnvironment:
27278
+ type: object
27279
+ required: [assistantId, state, version, dataInitialized]
27280
+ properties:
27281
+ assistantId: { type: string, minLength: 1, readOnly: true }
27282
+ templateId: { type: string, minLength: 1, maxLength: 128, readOnly: true }
27283
+ backend: { type: string, enum: [container, vm], readOnly: true, description: Frozen execution backend of this binding; never inferred from the current template. }
27284
+ provider: { type: string, enum: [docker, pve, kubevirt], readOnly: true }
27285
+ policyRevision: { type: string, minLength: 1, maxLength: 128, readOnly: true, description: Frozen policy identity. legacy-docker-v1 preserves the original stored lease and quota. }
27286
+ computeRef: { type: string, minLength: 1, maxLength: 128, readOnly: true, description: Opaque execution reference; not a physical handle or readiness proof. }
27287
+ computeGeneration: { type: integer, format: int64, minimum: 0, readOnly: true, description: Reserved execution generation; zero means no execution has been reserved. }
27288
+ dataRef: { type: string, minLength: 1, maxLength: 128, readOnly: true, description: Stable logical personal-data identity. Existence requires a fresh authorized receipt. }
27289
+ state:
27290
+ type: string
27291
+ enum: [unprovisioned, pending, ready, sleeping, missing, expired, unknown, quota_exceeded, deleting, deletion_unknown, deleted]
27292
+ readOnly: true
27293
+ version: { type: integer, format: int64, minimum: 0, readOnly: true }
27294
+ dataInitialized:
27295
+ description: A successful past data receipt; does not prove that data currently exists or that the environment is ready.
27296
+ type: boolean
27297
+ readOnly: true
27298
+ quota:
27299
+ $ref: "#/components/schemas/PersonalEnvironmentQuota"
27300
+ usage:
27301
+ $ref: "#/components/schemas/PersonalEnvironmentUsage"
27302
+ observedAt: { type: string, format: date-time, readOnly: true }
27303
+ expiresAt: { type: string, format: date-time, readOnly: true }
27304
+ updatedAt: { type: string, format: date-time, readOnly: true }
27305
+ additionalProperties: false
27306
+ PersonalEnvironmentTemplate:
27307
+ type: object
27308
+ required: [id, name, mode, leaseSeconds, quota]
27309
+ properties:
27310
+ id: { type: string, minLength: 1, maxLength: 128 }
27311
+ name: { type: string, minLength: 1, maxLength: 200 }
27312
+ backend: { type: string, enum: [container, vm] }
27313
+ provider: { type: string, enum: [docker, pve, kubevirt] }
27314
+ policyRevision: { type: string, minLength: 1, maxLength: 128 }
27315
+ mode: { type: string, enum: [observe-only, restricted-write] }
27316
+ leaseSeconds: { type: integer, minimum: 60, maximum: 3600 }
27317
+ quota:
27318
+ $ref: "#/components/schemas/PersonalEnvironmentQuota"
27319
+ additionalProperties: false
27320
+ PersonalEnvironmentTemplateListEnvelope:
27321
+ type: object
27322
+ required: [data]
27323
+ properties:
27324
+ data:
27325
+ type: array
27326
+ maxItems: 100
27327
+ items:
27328
+ $ref: "#/components/schemas/PersonalEnvironmentTemplate"
27329
+ additionalProperties: false
27330
+ PersonalEnvironmentEnvelope:
27331
+ type: object
27332
+ required: [data]
27333
+ properties:
27334
+ data:
27335
+ $ref: "#/components/schemas/PersonalEnvironment"
27336
+ additionalProperties: false
27337
+ PersonalGuestRuntimeInput:
27338
+ type: object
27339
+ additionalProperties: false
27340
+ required: [environmentVersion, idempotencyKey, kind]
27341
+ properties:
27342
+ environmentVersion: { type: integer, format: int64, minimum: 1, maximum: 9007199254740991 }
27343
+ idempotencyKey: { type: string, minLength: 8, maxLength: 128, pattern: "^[a-zA-Z0-9_-]+$" }
27344
+ kind: { type: string, enum: [execute, file_read, file_write, docker, browser] }
27345
+ argv:
27346
+ type: array
27347
+ minItems: 1
27348
+ maxItems: 64
27349
+ items: { type: string, maxLength: 4096 }
27350
+ file:
27351
+ type: object
27352
+ additionalProperties: false
27353
+ required: [path]
27354
+ properties:
27355
+ path: { type: string, minLength: 1, maxLength: 1024 }
27356
+ contentBase64: { type: string, maxLength: 60076 }
27357
+ expectedSHA256: { type: string, pattern: "^[a-f0-9]{64}$" }
27358
+ browser:
27359
+ type: object
27360
+ additionalProperties: false
27361
+ required: [action]
27362
+ properties:
27363
+ action: { type: string, enum: [acquire, snapshot, navigate, click, type, pointer, takeover, return, release] }
27364
+ controlId: { type: string, format: uuid }
27365
+ generation: { type: integer, format: int64, minimum: 1, maximum: 9007199254740991 }
27366
+ url: { type: string, maxLength: 4096 }
27367
+ selector: { type: string, maxLength: 2048 }
27368
+ text: { type: string, maxLength: 4096 }
27369
+ x: { type: integer, minimum: 0, maximum: 799 }
27370
+ y: { type: integer, minimum: 0, maximum: 599 }
27371
+ PersonalGuestRuntime:
27372
+ type: object
27373
+ additionalProperties: false
27374
+ required: [id, kind, status, assistantId, environmentVersion]
27375
+ properties:
27376
+ id: { type: string, format: uuid }
27377
+ kind: { type: string, enum: [execute, file_read, file_write, docker, browser] }
27378
+ status: { type: string, enum: [queued, running, succeeded, failed, canceled, unknown] }
27379
+ assistantId: { type: string, format: uuid }
27380
+ environmentVersion: { type: integer, format: int64, minimum: 1, maximum: 9007199254740991 }
27381
+ output: { type: string, maxLength: 65536 }
27382
+ exitCode: { type: integer, minimum: 0, maximum: 255 }
27383
+ file:
27384
+ type: object
27385
+ additionalProperties: false
27386
+ required: [path, sha256, size]
27387
+ properties:
27388
+ path: { type: string, maxLength: 1024 }
27389
+ contentBase64: { type: string, maxLength: 60076 }
27390
+ sha256: { type: string, pattern: "^[a-f0-9]{64}$" }
27391
+ size: { type: integer, format: int64, minimum: 0, maximum: 45056 }
27392
+ browser:
27393
+ type: object
27394
+ additionalProperties: false
27395
+ required: [controlId, generation, instanceId, width, height]
27396
+ properties:
27397
+ controlId: { type: string, format: uuid }
27398
+ generation: { type: integer, format: int64, minimum: 1, maximum: 9007199254740991 }
27399
+ instanceId: { type: string, format: uuid }
27400
+ url: { type: string, maxLength: 4096 }
27401
+ title: { type: string, maxLength: 512 }
27402
+ text: { type: string, maxLength: 4096 }
27403
+ jpegBase64: { type: string, maxLength: 49152 }
27404
+ width: { type: integer, const: 800 }
27405
+ height: { type: integer, const: 600 }
27406
+ PersonalWorkspaceRuntime:
27407
+ type: object
27408
+ additionalProperties: false
27409
+ required: [assistantId, environmentVersion]
27410
+ properties:
27411
+ assistantId: { type: string, format: uuid }
27412
+ environmentVersion: { type: integer, format: int64, minimum: 1, maximum: 9007199254740991 }
27413
+ latest: { $ref: "#/components/schemas/PersonalGuestRuntime" }
27414
+ browserControl:
27415
+ type: object
27416
+ additionalProperties: false
27417
+ required: [controlId, generation, owner, expiresAt]
27418
+ properties:
27419
+ controlId: { type: string, format: uuid }
27420
+ generation: { type: integer, format: int64, minimum: 1, maximum: 9007199254740991 }
27421
+ owner: { type: string, enum: [user, agent, released] }
27422
+ taskId: { type: string, format: uuid }
27423
+ instanceId: { type: string, format: uuid }
27424
+ expiresAt: { type: string, format: date-time }
27425
+ PersonalWorkspaceRuntimeEnvelope:
27426
+ type: object
27427
+ additionalProperties: false
27428
+ required: [data]
27429
+ properties:
27430
+ data: { $ref: "#/components/schemas/PersonalWorkspaceRuntime" }
27431
+ PersonalGuestRuntimeEnvelope:
27432
+ type: object
27433
+ additionalProperties: false
27434
+ required: [data]
27435
+ properties:
27436
+ data: { $ref: "#/components/schemas/PersonalGuestRuntime" }
27437
+ PersonalGuestToolsInput:
27438
+ type: object
27439
+ additionalProperties: false
27440
+ required: [environmentVersion, idempotencyKey]
27441
+ properties:
27442
+ environmentVersion: { type: integer, format: int64, minimum: 1, maximum: 9007199254740991 }
27443
+ idempotencyKey: { type: string, minLength: 8, maxLength: 128, pattern: "^[a-zA-Z0-9_-]+$" }
27444
+ PersonalGuestPreparationInput:
27445
+ type: object
27446
+ required: [environmentVersion, csrPEM]
27447
+ properties:
27448
+ environmentVersion: { type: integer, format: int64, minimum: 1, maximum: 9007199254740991 }
27449
+ csrPEM: { type: string, minLength: 1, maxLength: 4096, description: Signed Ed25519 CSR containing only a public key. Requested subject and identity never grant authority. }
27450
+ additionalProperties: false
27451
+ PersonalGuestPreparation:
27452
+ type: object
27453
+ required: [bindingId, enrollmentId, challenge, endpoint, certificatePEM, clientCAPEM, expiresAt]
27454
+ properties:
27455
+ bindingId: { type: string, format: uuid }
27456
+ enrollmentId: { type: string, format: uuid }
27457
+ 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. }
27458
+ endpoint: { type: string, format: uri, maxLength: 512, description: Core-configured HTTPS guest endpoint; never a caller-selected destination. }
27459
+ certificatePEM: { type: string, minLength: 1, maxLength: 8192 }
27460
+ clientCAPEM: { type: string, minLength: 1, maxLength: 8192 }
27461
+ expiresAt: { type: string, format: date-time, description: The bootstrap challenge expiry, not an environment readiness or execution lease. }
27462
+ additionalProperties: false
27463
+ PersonalGuestPreparationEnvelope:
27464
+ type: object
27465
+ required: [data]
27466
+ properties:
27467
+ data: { $ref: "#/components/schemas/PersonalGuestPreparation" }
27468
+ additionalProperties: false
27469
+ PersonalEnvironmentDataExportRequest:
27470
+ type: object
27471
+ required: [assistantId, environmentVersion]
27472
+ properties:
27473
+ assistantId: { type: string, minLength: 1, maxLength: 128 }
27474
+ environmentVersion: { type: integer, format: int64, minimum: 1 }
27475
+ additionalProperties: false
27476
+ PersonalEnvironmentDataDeletionRequest:
27477
+ type: object
27478
+ required: [assistantId, environmentVersion, confirmationName]
27479
+ properties:
27480
+ assistantId: { type: string, minLength: 1, maxLength: 128 }
27481
+ environmentVersion: { type: integer, format: int64, minimum: 1 }
27482
+ confirmationName: { type: string, minLength: 1, maxLength: 60 }
27483
+ additionalProperties: false
27484
+ PersonalAssistantUpdateRequest:
27485
+ type: object
27486
+ required: [name]
27487
+ properties:
27488
+ name: { type: string, minLength: 1, maxLength: 60 }
27489
+ additionalProperties: false
27490
+ PersonalAssistantArtifact:
27491
+ type: object
27492
+ required: [id, artifact, createdAt]
27493
+ properties:
27494
+ id: { type: string, readOnly: true }
27495
+ sessionId: { type: string, readOnly: true }
27496
+ messageId: { type: string, readOnly: true }
27497
+ taskId: { type: string, readOnly: true }
27498
+ artifact:
27499
+ $ref: "#/components/schemas/WorkbenchAnalysisArtifact"
27500
+ createdAt: { type: string, format: date-time, readOnly: true }
27501
+ additionalProperties: false
27502
+ PersonalAssistantArtifactListEnvelope:
27503
+ type: object
27504
+ required: [data]
27505
+ properties:
27506
+ data:
27507
+ type: array
27508
+ maxItems: 50
27509
+ items:
27510
+ $ref: "#/components/schemas/PersonalAssistantArtifact"
27511
+ additionalProperties: false
27512
+ PersonalAssistantEnvelope:
27513
+ type: object
27514
+ required: [data]
27515
+ properties:
27516
+ data:
27517
+ $ref: "#/components/schemas/PersonalAssistant"
27518
+ additionalProperties: false
27519
+ WorkbenchMainSessionRequest:
27520
+ type: object
27521
+ properties:
27522
+ agentProviderId: { type: string, maxLength: 200 }
27523
+ additionalProperties: false
25534
27524
  WorkbenchCreateSessionRequest:
25535
27525
  type: object
25536
27526
  properties:
@@ -25585,9 +27575,11 @@ components:
25585
27575
  role:
25586
27576
  type: string
25587
27577
  enum: [user, assistant, system]
27578
+ x-enum-varnames: [WorkbenchMessageRoleUser, WorkbenchMessageRoleAssistant, WorkbenchMessageRoleSystem]
25588
27579
  content: { type: string }
25589
27580
  metadata:
25590
27581
  type: object
27582
+ 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.
25591
27583
  additionalProperties: {}
25592
27584
  createdAt: { type: string, format: date-time }
25593
27585
  additionalProperties: false
@@ -26197,6 +28189,11 @@ components:
26197
28189
  rootCauseRunId: { type: string }
26198
28190
  createdBy: { type: string }
26199
28191
  status: { type: string }
28192
+ executionOwner: { type: string, enum: [native, external] }
28193
+ phase: { type: string }
28194
+ stopReason: { type: string }
28195
+ eventSequence: { type: integer, minimum: 0 }
28196
+ usageKnown: { type: boolean }
26200
28197
  scope:
26201
28198
  $ref: "#/components/schemas/WorkbenchSessionScope"
26202
28199
  toolset:
@@ -26648,10 +28645,31 @@ components:
26648
28645
  ok:
26649
28646
  type: boolean
26650
28647
  additionalProperties: false
28648
+ WorkbenchAssistantTask:
28649
+ 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.
28650
+ type: object
28651
+ required: [kind]
28652
+ properties:
28653
+ kind: { type: string, enum: [avatar, undo] }
28654
+ image:
28655
+ $ref: "#/components/schemas/PersonalAssistantAvatarRequest"
28656
+ useCurrentAvatar: { type: boolean }
28657
+ publicModel: { type: string, minLength: 1, maxLength: 128 }
28658
+ messageId: { type: string, minLength: 1, maxLength: 128 }
28659
+ additionalProperties: false
26651
28660
  WorkbenchSendMessageStreamRequest:
26652
28661
  type: object
26653
28662
  required: [content]
26654
28663
  properties:
28664
+ requestId:
28665
+ type: string
28666
+ minLength: 1
28667
+ maxLength: 128
28668
+ description: A stable per-turn idempotency key. Reusing it with different content or selections is rejected.
28669
+ taskIntent:
28670
+ $ref: "#/components/schemas/WorkbenchTaskIntent"
28671
+ assistantTask:
28672
+ $ref: "#/components/schemas/WorkbenchAssistantTask"
26655
28673
  contextSelection:
26656
28674
  $ref: "#/components/schemas/WorkbenchContextSelection"
26657
28675
  knowledgeContext:
@@ -26688,10 +28706,82 @@ components:
26688
28706
  type: object
26689
28707
  additionalProperties: {}
26690
28708
  additionalProperties: false
28709
+ WorkbenchTaskIntent:
28710
+ description: Capability preferences and explicit query parameters for this turn only. Does not change session mode, grant permission, or create scheduled inspections.
28711
+ type: object
28712
+ properties:
28713
+ capabilities:
28714
+ type: array
28715
+ maxItems: 4
28716
+ uniqueItems: true
28717
+ items: { type: string, enum: [root_cause, performance, trace, inspection_review] }
28718
+ dataSourceId:
28719
+ description: Legacy shared selection. A capability-specific data source takes precedence for that capability.
28720
+ type: string
28721
+ maxLength: 256
28722
+ performanceDataSourceId: { type: string, maxLength: 256 }
28723
+ traceDataSourceId: { type: string, maxLength: 256 }
28724
+ rootCauseProfileId: { type: string, maxLength: 256 }
28725
+ metricKey: { type: string, maxLength: 256 }
28726
+ traceId: { type: string, maxLength: 256 }
28727
+ minDurationMs: { type: integer, minimum: 0, maximum: 86400000, x-go-type-skip-optional-pointer: false }
28728
+ inspectionRunIds:
28729
+ type: array
28730
+ maxItems: 20
28731
+ uniqueItems: true
28732
+ items: { type: string, minLength: 1, maxLength: 128 }
28733
+ additionalProperties: false
28734
+ WorkbenchProfessionalCapabilityInput:
28735
+ type: object
28736
+ required: [sessionId, question, scope, intent]
28737
+ properties:
28738
+ sessionId: { type: string, minLength: 1, maxLength: 128 }
28739
+ question: { type: string, minLength: 1, maxLength: 16384 }
28740
+ locale: { type: string, maxLength: 35 }
28741
+ scope: { $ref: "#/components/schemas/WorkbenchSessionScope" }
28742
+ toolset: { $ref: "#/components/schemas/WorkbenchSessionToolset" }
28743
+ intent: { $ref: "#/components/schemas/WorkbenchTaskIntent" }
28744
+ additionalProperties: false
28745
+ AgentRunResumeRequest:
28746
+ type: object
28747
+ properties:
28748
+ input: { type: string, maxLength: 16384 }
28749
+ additionalProperties: false
28750
+ AgentRunEventListEnvelope:
28751
+ type: object
28752
+ required: [data]
28753
+ properties:
28754
+ data: { $ref: "#/components/schemas/AgentRunEventPage" }
28755
+ additionalProperties: false
28756
+ AgentRunEventPage:
28757
+ type: object
28758
+ required: [items, nextSequence, hasMore, resyncRequired]
28759
+ properties:
28760
+ items:
28761
+ type: array
28762
+ items: { $ref: "#/components/schemas/WorkbenchStreamEvent" }
28763
+ nextSequence: { type: integer, minimum: 0 }
28764
+ hasMore: { type: boolean }
28765
+ resyncRequired: { type: boolean }
28766
+ additionalProperties: false
28767
+ 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}
28768
+ WorkbenchMessageSearchPage: {"type":"object","required":["items"],"properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/WorkbenchMessageSearchHit"}},"nextCursor":{"type":"string","maxLength":512}},"additionalProperties":false}
28769
+ WorkbenchMessageSearchEnvelope: {"type":"object","required":["data"],"properties":{"data":{"$ref":"#/components/schemas/WorkbenchMessageSearchPage"}},"additionalProperties":false}
28770
+ 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}
28771
+ WorkbenchMessageWindowEnvelope: {"type":"object","required":["data"],"properties":{"data":{"$ref":"#/components/schemas/WorkbenchMessageWindow"}},"additionalProperties":false}
28772
+ PersonalFeedSettings: {"type":"object","required":["instructions","searchTool","autoUpdate"],"properties":{"instructions":{"type":"string","maxLength":2000},"searchTool":{"type":"string","maxLength":256},"autoUpdate":{"type":"boolean"}},"additionalProperties":false}
28773
+ 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}
28774
+ 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}
28775
+ PersonalFeedSearchTool: {"type":"object","required":["name","title"],"properties":{"name":{"type":"string","maxLength":256},"title":{"type":"string","maxLength":256}},"additionalProperties":false}
28776
+ 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}
28777
+ PersonalFeedEnvelope: {"type":"object","required":["data"],"properties":{"data":{"$ref":"#/components/schemas/PersonalFeedPage"}},"additionalProperties":false}
28778
+ PersonalFeedItemEnvelope: {"type":"object","required":["data"],"properties":{"data":{"$ref":"#/components/schemas/PersonalFeedItem"}},"additionalProperties":false}
28779
+ PersonalFeedFeedback: {"type":"object","required":[],"properties":{"liked":{"type":"boolean"},"hidden":{"type":"boolean"}},"additionalProperties":false}
26691
28780
  WorkbenchContextSelection:
26692
- 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.
28781
+ 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.
26693
28782
  type: object
26694
28783
  properties:
28784
+ feedItemId: { type: string, minLength: 1, maxLength: 128, description: Owned personal feed post, reloaded and checked by the server before discussion. }
26695
28785
  memoryIds:
26696
28786
  type: array
26697
28787
  maxItems: 20
@@ -26708,6 +28798,23 @@ components:
26708
28798
  maxItems: 8
26709
28799
  items:
26710
28800
  $ref: "#/components/schemas/WorkbenchTextAttachment"
28801
+ images:
28802
+ type: array
28803
+ maxItems: 1
28804
+ items:
28805
+ $ref: "#/components/schemas/WorkbenchImageAttachment"
28806
+ additionalProperties: false
28807
+ WorkbenchImageAttachment:
28808
+ 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.
28809
+ type: object
28810
+ required: [id, name, dataUrl]
28811
+ properties:
28812
+ id: { type: string, minLength: 1, maxLength: 128 }
28813
+ name: { type: string, minLength: 1, maxLength: 256 }
28814
+ dataUrl:
28815
+ type: string
28816
+ maxLength: 700000
28817
+ pattern: '^data:image/(png|jpeg);base64,[A-Za-z0-9+/]+={0,2}$'
26711
28818
  additionalProperties: false
26712
28819
  WorkbenchContextReference:
26713
28820
  type: object
@@ -26881,7 +28988,7 @@ components:
26881
28988
  type: string
26882
28989
  providerKind:
26883
28990
  type: string
26884
- enum: [internal, hermes, openclaw, general, openai, anthropic, openai-compatible, deepseek, qwen, openrouter, azure-openai, gemini, cohere]
28991
+ enum: [internal, native, hermes, openclaw, general, openai, anthropic, openai-compatible, deepseek, qwen, openrouter, azure-openai, gemini, cohere]
26885
28992
  status:
26886
28993
  type: string
26887
28994
  enum: [queued, running, succeeded, failed, cancelled]
@@ -27023,6 +29130,7 @@ components:
27023
29130
  role:
27024
29131
  type: string
27025
29132
  enum: [assistant]
29133
+ x-enum-varnames: [AgentRunCallbackWorkbenchMessageDeltaEventRoleAssistant]
27026
29134
  contentDelta:
27027
29135
  type: string
27028
29136
  unevaluatedProperties: false
@@ -27038,6 +29146,7 @@ components:
27038
29146
  role:
27039
29147
  type: string
27040
29148
  enum: [assistant]
29149
+ x-enum-varnames: [AgentRunCallbackWorkbenchMessageDeltaEventRoleAssistant]
27041
29150
  content:
27042
29151
  type: string
27043
29152
  metadata:
@@ -32977,12 +35086,14 @@ components:
32977
35086
  type: object
32978
35087
  properties:
32979
35088
  helm: { $ref: "#/components/schemas/HelmExecutionTaskPayload" }
35089
+ sshCommand: { $ref: "#/components/schemas/AgentSSHCommandRequest" }
32980
35090
  additionalProperties: true
32981
35091
  x-go-type: map[string]any
32982
35092
  result:
32983
35093
  type: object
32984
35094
  properties:
32985
35095
  helm: { $ref: "#/components/schemas/HelmExecutionTaskResult" }
35096
+ sshCommand: { $ref: "#/components/schemas/AgentSSHCommandResult" }
32986
35097
  additionalProperties: true
32987
35098
  x-go-type: map[string]any
32988
35099
  x-go-type-skip-optional-pointer: true
@@ -33106,8 +35217,19 @@ components:
33106
35217
  name: { type: string }
33107
35218
  storage: { type: string }
33108
35219
  bus: { type: string }
35220
+ serial:
35221
+ type: string
35222
+ minLength: 1
35223
+ maxLength: 20
35224
+ pattern: '^[A-Za-z0-9_-]+$'
35225
+ 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.
33109
35226
  sizeGiB: { type: integer, minimum: 1 }
33110
35227
  add: { type: boolean }
35228
+ if: { required: [serial] }
35229
+ then:
35230
+ required: [add]
35231
+ properties:
35232
+ add: { const: true }
33111
35233
  additionalProperties: false
33112
35234
  VirtualMachineNetworkChange:
33113
35235
  type: object
@@ -33206,10 +35328,298 @@ components:
33206
35328
  poolRevision: { type: integer, minimum: 1 }
33207
35329
  idempotencyKey: { type: string, minLength: 8, maxLength: 128 }
33208
35330
  additionalProperties: false
35331
+ VirtualizationCapacityPolicyMode:
35332
+ type: string
35333
+ enum: [unconfigured, observing, enforced]
35334
+ x-enum-varnames: [CapacityPolicyUnconfigured, CapacityPolicyObserving, CapacityPolicyEnforced]
35335
+ VirtualizationOvercommitPolicy:
35336
+ type: object
35337
+ required: [enabled, percent]
35338
+ properties:
35339
+ enabled: { type: boolean }
35340
+ percent: { type: integer, minimum: 100, maximum: 800 }
35341
+ additionalProperties: false
35342
+ VirtualizationMemoryOvercommitPolicy:
35343
+ type: object
35344
+ required: [enabled, percent]
35345
+ properties:
35346
+ enabled: { type: boolean }
35347
+ percent: { type: integer, minimum: 100, maximum: 150 }
35348
+ additionalProperties: false
35349
+ VirtualizationCapacityPolicyInput:
35350
+ type: object
35351
+ required: [expectedRevision, mode, cpu, memory]
35352
+ properties:
35353
+ expectedRevision: { type: integer, minimum: 0 }
35354
+ physicalSourceId:
35355
+ type: string
35356
+ minLength: 1
35357
+ maxLength: 128
35358
+ pattern: "^[A-Za-z0-9][A-Za-z0-9._-]*$"
35359
+ description: Administrator-confirmed identity of one physical PVE source. All aliases must join this identity before admission. Ordinary VM callers cannot choose a source.
35360
+ mode: { type: string, enum: [observing, enforced], x-enum-varnames: [CapacityPolicyInputObserving, CapacityPolicyInputEnforced] }
35361
+ cpu: { $ref: "#/components/schemas/VirtualizationOvercommitPolicy" }
35362
+ memory: { $ref: "#/components/schemas/VirtualizationMemoryOvercommitPolicy" }
35363
+ additionalProperties: false
35364
+ VirtualizationCapacityPolicy:
35365
+ type: object
35366
+ required: [sourceId, revision, mode, cpu, memory]
35367
+ properties:
35368
+ sourceConfirmed: { type: boolean, description: New PVE sources use a strict 100 percent policy and cannot admit until an administrator confirms their physical source identity. }
35369
+ sourceId: { type: string }
35370
+ revision: { type: integer, minimum: 0 }
35371
+ mode: { $ref: "#/components/schemas/VirtualizationCapacityPolicyMode" }
35372
+ cpu: { $ref: "#/components/schemas/VirtualizationOvercommitPolicy" }
35373
+ memory: { $ref: "#/components/schemas/VirtualizationMemoryOvercommitPolicy" }
35374
+ updatedAt: { type: string, format: date-time }
35375
+ updatedBy: { type: string }
35376
+ additionalProperties: false
35377
+ VirtualizationCapacityPolicyEnvelope:
35378
+ type: object
35379
+ required: [data]
35380
+ properties:
35381
+ data: { $ref: "#/components/schemas/VirtualizationCapacityPolicy" }
35382
+ additionalProperties: false
35383
+ VirtualizationCapacityCheckDiagnostic:
35384
+ type: object
35385
+ required: [check, dimension, status, limit, committed, pending, demand, available, reason]
35386
+ properties:
35387
+ check: { type: string, enum: [budget, runtime, storage], x-enum-varnames: [VirtualizationCapacityCheckDiagnosticCheckBudget, VirtualizationCapacityCheckDiagnosticCheckRuntime, VirtualizationCapacityCheckDiagnosticCheckStorage] }
35388
+ dimension: { type: string, enum: [cpu, memory, disk], x-enum-varnames: [VirtualizationCapacityCheckDiagnosticDimensionCpu, VirtualizationCapacityCheckDiagnosticDimensionMemory, VirtualizationCapacityCheckDiagnosticDimensionDisk] }
35389
+ status: { type: string, enum: [available, unavailable, unknown], x-enum-varnames: [VirtualizationCapacityCheckDiagnosticStatusAvailable, VirtualizationCapacityCheckDiagnosticStatusUnavailable, VirtualizationCapacityCheckDiagnosticStatusUnknown] }
35390
+ limit: { type: integer, minimum: 0 }
35391
+ committed: { type: integer, minimum: 0 }
35392
+ pending: { type: integer, minimum: 0 }
35393
+ demand: { type: integer, minimum: 0 }
35394
+ available: { type: integer, minimum: 0 }
35395
+ reason: { type: string }
35396
+ additionalProperties: false
35397
+ VirtualizationCapacityNodeDiagnostic:
35398
+ type: object
35399
+ required: [node, checks]
35400
+ properties:
35401
+ node: { type: string }
35402
+ storage: { type: string }
35403
+ checks:
35404
+ type: array
35405
+ items: { $ref: "#/components/schemas/VirtualizationCapacityCheckDiagnostic" }
35406
+ additionalProperties: false
35407
+ SecretKind:
35408
+ type: string
35409
+ enum: [opaque, ssh_keypair, ssh_public_key, ssh_password]
35410
+ x-enum-varnames: [SecretKindOpaque, SecretKindSSHKeypair, SecretKindSSHPublicKey, SecretKindSSHPassword]
35411
+ SecretPurpose:
35412
+ type: string
35413
+ enum: [vm_cloud_init, vm_auth, vm_exec]
35414
+ x-enum-varnames: [SecretPurposeVMCloudInit, SecretPurposeVMAuth, SecretPurposeVMExec]
35415
+ SecretSSHPublicKey:
35416
+ type: object
35417
+ required: [authorizedKey, algorithm, fingerprint]
35418
+ properties:
35419
+ authorizedKey: { type: string, maxLength: 16384 }
35420
+ algorithm: { type: string }
35421
+ fingerprint: { type: string }
35422
+ additionalProperties: false
35423
+ SecretGenerateSSHKeyRequest:
35424
+ type: object
35425
+ required: [name, scopeType, scopeId, bindings]
35426
+ properties:
35427
+ name: { type: string, minLength: 1, maxLength: 128 }
35428
+ description: { type: string, maxLength: 1024 }
35429
+ scopeType: { $ref: "#/components/schemas/SecretScopeType" }
35430
+ scopeId: { type: string, minLength: 1, maxLength: 128 }
35431
+ bindings:
35432
+ type: array
35433
+ minItems: 1
35434
+ maxItems: 100
35435
+ items: { $ref: "#/components/schemas/SecretBinding" }
35436
+ additionalProperties: false
35437
+ VirtualMachineGuestAccessInput:
35438
+ type: object
35439
+ 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.
35440
+ required: [username, publicKeyRefs]
35441
+ properties:
35442
+ username: { type: string, pattern: "^[a-z_][a-z0-9_-]{0,31}$" }
35443
+ publicKeyRefs:
35444
+ type: array
35445
+ minItems: 1
35446
+ maxItems: 16
35447
+ uniqueItems: true
35448
+ items: { type: string, pattern: "^soha://secrets/[A-Za-z0-9._-]+(?:/versions/[1-9][0-9]*)?$" }
35449
+ additionalProperties: false
35450
+ VirtualMachineAccessBindingInput:
35451
+ type: object
35452
+ 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.
35453
+ required: [expectedRevision, username, port, address, credentialRef, executionClusterId, executionAgentId, trustedHostKey]
35454
+ properties:
35455
+ expectedRevision: { type: integer, minimum: 0 }
35456
+ username: { type: string, pattern: "^[a-z_][a-z0-9_-]{0,31}$" }
35457
+ port: { type: integer, minimum: 1, maximum: 65535 }
35458
+ address: { type: string, minLength: 1, maxLength: 253 }
35459
+ credentialRef: { type: string, pattern: "^soha://secrets/[A-Za-z0-9._-]+(?:/versions/[1-9][0-9]*)?$" }
35460
+ executionClusterId: { type: string, minLength: 1 }
35461
+ executionAgentId: { type: string, minLength: 1 }
35462
+ trustedHostKey: { type: string, minLength: 1, maxLength: 16384 }
35463
+ additionalProperties: false
35464
+ VirtualMachineAccessBinding:
35465
+ type: object
35466
+ required: [vmId, revision, providerVmId, sourceId, generation, username, port, address, credentialRef, executionClusterId, executionAgentId, hostKeyFingerprint, status]
35467
+ properties:
35468
+ vmId: { type: string }
35469
+ revision: { type: integer, minimum: 1 }
35470
+ providerVmId: { type: string }
35471
+ sourceId: { type: string }
35472
+ generation: { type: string }
35473
+ username: { type: string }
35474
+ port: { type: integer }
35475
+ address: { type: string }
35476
+ credentialRef: { type: string }
35477
+ executionClusterId: { type: string }
35478
+ executionAgentId: { type: string }
35479
+ hostKeyFingerprint: { type: string }
35480
+ status: { type: string, enum: [ready, unavailable, stale], x-enum-varnames: [VirtualMachineAccessBindingStatusReady, VirtualMachineAccessBindingStatusUnavailable, VirtualMachineAccessBindingStatusStale] }
35481
+ reason: { type: string }
35482
+ updatedAt: { type: string, format: date-time }
35483
+ additionalProperties: false
35484
+ VirtualMachineAccessBindingEnvelope:
35485
+ type: object
35486
+ required: [data]
35487
+ properties:
35488
+ data: { $ref: "#/components/schemas/VirtualMachineAccessBinding" }
35489
+ additionalProperties: false
35490
+ VirtualMachineSSHSessionInput:
35491
+ type: object
35492
+ required: [bindingRevision]
35493
+ properties:
35494
+ bindingRevision: { type: integer, minimum: 1 }
35495
+ cols: { type: integer, minimum: 1, maximum: 512, default: 80 }
35496
+ rows: { type: integer, minimum: 1, maximum: 512, default: 24 }
35497
+ additionalProperties: false
35498
+ VirtualMachineSSHSession:
35499
+ type: object
35500
+ required: [id, vmId, bindingRevision, status, expiresAt]
35501
+ properties:
35502
+ id: { type: string }
35503
+ vmId: { type: string }
35504
+ bindingRevision: { type: integer, minimum: 1 }
35505
+ status: { type: string, enum: [pending, active, closed, revoked, unknown], x-enum-varnames: [VirtualMachineSSHSessionStatusPending, VirtualMachineSSHSessionStatusActive, VirtualMachineSSHSessionStatusClosed, VirtualMachineSSHSessionStatusRevoked, VirtualMachineSSHSessionStatusUnknown] }
35506
+ expiresAt: { type: string, format: date-time }
35507
+ reason: { type: string }
35508
+ additionalProperties: false
35509
+ VirtualMachineSSHSessionEnvelope:
35510
+ type: object
35511
+ required: [data]
35512
+ properties:
35513
+ data: { $ref: "#/components/schemas/VirtualMachineSSHSession" }
35514
+ additionalProperties: false
35515
+ VirtualMachineSSHCommandInput:
35516
+ type: object
35517
+ required: [bindingRevision, command, idempotencyKey]
35518
+ properties:
35519
+ bindingRevision: { type: integer, minimum: 1 }
35520
+ command: { type: string, minLength: 1, maxLength: 16384, x-soha-sensitive: true }
35521
+ idempotencyKey: { type: string, minLength: 8, maxLength: 128 }
35522
+ timeoutSeconds: { type: integer, minimum: 1, maximum: 300, default: 60 }
35523
+ additionalProperties: false
35524
+ VirtualMachineSSHCommand:
35525
+ type: object
35526
+ required: [id, vmId, bindingRevision, status, outcome, terminal]
35527
+ properties:
35528
+ id: { type: string }
35529
+ vmId: { type: string }
35530
+ bindingRevision: { type: integer, minimum: 1 }
35531
+ status: { type: string }
35532
+ outcome: { type: string, enum: [unknown, succeeded, failed, canceled], x-enum-varnames: [VirtualMachineSSHCommandOutcomeUnknown, VirtualMachineSSHCommandOutcomeSucceeded, VirtualMachineSSHCommandOutcomeFailed, VirtualMachineSSHCommandOutcomeCanceled] }
35533
+ terminal: { type: boolean }
35534
+ exitCode: { type: integer, minimum: 0, maximum: 255, x-go-type-skip-optional-pointer: false }
35535
+ stdout: { type: string, maxLength: 1048576 }
35536
+ stderr: { type: string, maxLength: 1048576 }
35537
+ outputDigest: { type: string }
35538
+ outputTruncated: { type: boolean }
35539
+ finishedAt: { type: string, format: date-time }
35540
+ additionalProperties: false
35541
+ VirtualMachineSSHCommandEnvelope:
35542
+ type: object
35543
+ required: [data]
35544
+ properties:
35545
+ data: { $ref: "#/components/schemas/VirtualMachineSSHCommand" }
35546
+ additionalProperties: false
35547
+ AgentSSHCommandRequest:
35548
+ type: object
35549
+ required: [session, command, timeoutSeconds]
35550
+ properties:
35551
+ session: { $ref: "#/components/schemas/AgentSSHSessionRequest" }
35552
+ command: { type: string, minLength: 1, maxLength: 16384, x-soha-sensitive: true }
35553
+ timeoutSeconds: { type: integer, minimum: 1, maximum: 300 }
35554
+ additionalProperties: false
35555
+ AgentSSHCommandResult:
35556
+ type: object
35557
+ required: [sessionId, agentId, commandDigest, effect, stopped]
35558
+ properties:
35559
+ sessionId: { type: string }
35560
+ agentId: { type: string }
35561
+ commandDigest: { type: string }
35562
+ effect: { type: string, enum: [not_started, exited, unknown], x-enum-varnames: [AgentSSHCommandResultEffectNotStarted, AgentSSHCommandResultEffectExited, AgentSSHCommandResultEffectUnknown] }
35563
+ stopped: { type: boolean }
35564
+ exitCode: { type: integer, minimum: 0, maximum: 255, x-go-type-skip-optional-pointer: false }
35565
+ stdout: { type: string, maxLength: 1048576 }
35566
+ stderr: { type: string, maxLength: 1048576 }
35567
+ outputTruncated: { type: boolean }
35568
+ outputDigest: { type: string }
35569
+ additionalProperties: false
35570
+ VirtualMachineSSHFrame:
35571
+ type: object
35572
+ required: [type]
35573
+ properties:
35574
+ type: { type: string, enum: [input, resize, output, error, close], x-enum-varnames: [VirtualMachineSSHFrameTypeInput, VirtualMachineSSHFrameTypeResize, VirtualMachineSSHFrameTypeOutput, VirtualMachineSSHFrameTypeError, VirtualMachineSSHFrameTypeClose] }
35575
+ data: { type: string, maxLength: 87384 }
35576
+ 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. }
35577
+ exitCode: { type: integer, minimum: 0, maximum: 255, x-go-type-skip-optional-pointer: false }
35578
+ cols: { type: integer, minimum: 1, maximum: 512 }
35579
+ rows: { type: integer, minimum: 1, maximum: 512 }
35580
+ message: { type: string, maxLength: 1024 }
35581
+ additionalProperties: false
35582
+ AgentSSHSessionRequest:
35583
+ type: object
35584
+ required: [sessionId, agentId, executionClusterId, address, port, username, trustedHostKey, credentialKind, lease, controlPlaneEndpoint, expiresAt, cols, rows]
35585
+ properties:
35586
+ sessionId: { type: string }
35587
+ agentId: { type: string }
35588
+ executionClusterId: { type: string, minLength: 1 }
35589
+ address: { type: string }
35590
+ port: { type: integer, minimum: 1, maximum: 65535 }
35591
+ username: { type: string }
35592
+ trustedHostKey: { type: string, maxLength: 16384 }
35593
+ credentialKind: { $ref: "#/components/schemas/SecretKind" }
35594
+ lease: { $ref: "#/components/schemas/SecretLeaseGrant" }
35595
+ controlPlaneEndpoint: { type: string, format: uri }
35596
+ expiresAt: { type: string, format: date-time }
35597
+ cols: { type: integer, minimum: 1, maximum: 512 }
35598
+ rows: { type: integer, minimum: 1, maximum: 512 }
35599
+ additionalProperties: false
35600
+ VMSSHCredentialRedemptionInput:
35601
+ type: object
35602
+ required: [clusterId, agentId, leaseId, token]
35603
+ properties:
35604
+ clusterId: { type: string, minLength: 1 }
35605
+ agentId: { type: string, minLength: 1 }
35606
+ leaseId: { type: string, minLength: 1 }
35607
+ token: { type: string, minLength: 16, maxLength: 256, writeOnly: true }
35608
+ additionalProperties: false
35609
+ AgentSSHCapability:
35610
+ type: object
35611
+ required: [agentId, protocolVersion, available]
35612
+ properties:
35613
+ agentId: { type: string }
35614
+ protocolVersion: { type: integer, const: 1 }
35615
+ available: { type: boolean }
35616
+ commandsAvailable: { type: boolean }
35617
+ additionalProperties: false
33209
35618
  VirtualizationCapacityInput:
33210
35619
  type: object
33211
35620
  required: [connectionId, cpu, memoryMiB, diskGiB]
33212
35621
  properties:
35622
+ startAfterCreate: { type: boolean, default: true, x-go-type-skip-optional-pointer: false }
33213
35623
  connectionId: { type: string, minLength: 1 }
33214
35624
  cpu: { type: integer, minimum: 1, maximum: 65536, description: Dedicated CPU cores for a running VM. }
33215
35625
  memoryMiB: { type: integer, minimum: 1, maximum: 1099511627776, description: Guest memory in MiB; configured hypervisor overhead is added by the server. }
@@ -33224,6 +35634,12 @@ components:
33224
35634
  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.
33225
35635
  required: [connectionId, status, reason]
33226
35636
  properties:
35637
+ sourceId: { type: string }
35638
+ policyRevision: { type: integer, minimum: 0 }
35639
+ policyMode: { $ref: "#/components/schemas/VirtualizationCapacityPolicyMode" }
35640
+ diagnostics:
35641
+ type: array
35642
+ items: { $ref: "#/components/schemas/VirtualizationCapacityNodeDiagnostic" }
33227
35643
  connectionId: { type: string }
33228
35644
  provider: { type: string }
33229
35645
  status:
@@ -33247,12 +35663,13 @@ components:
33247
35663
  type: object
33248
35664
  required: [connectionId, name]
33249
35665
  properties:
35666
+ guestAccess: { $ref: "#/components/schemas/VirtualMachineGuestAccessInput" }
33250
35667
  connectionId: { type: string, minLength: 1 }
33251
35668
  name: { type: string, minLength: 1 }
33252
35669
  requireCapacity:
33253
35670
  type: boolean
33254
35671
  default: false
33255
- 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.
35672
+ 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.
33256
35673
  architecture: { type: string }
33257
35674
  namespace: { type: string }
33258
35675
  node: { type: string }
@@ -33260,7 +35677,7 @@ components:
33260
35677
  memoryMiB: { type: integer, minimum: 1 }
33261
35678
  bootImageId: { type: string }
33262
35679
  imageId: { type: string }
33263
- sourceMode: { type: string }
35680
+ 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." }
33264
35681
  sourceId: { type: string }
33265
35682
  flavorId: { type: string }
33266
35683
  diskGiB: { type: integer, minimum: 1 }
@@ -33523,6 +35940,9 @@ components:
33523
35940
  cpu: { type: integer, minimum: 0 }
33524
35941
  memoryMiB: { type: integer, minimum: 0 }
33525
35942
  diskGiB: { type: integer, minimum: 0 }
35943
+ requireCapacity:
35944
+ type: boolean
35945
+ 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.
33526
35946
  disks:
33527
35947
  type: array
33528
35948
  maxItems: 64
@@ -33654,8 +36074,8 @@ components:
33654
36074
  architecture: { type: string }
33655
36075
  sizeBytes: { type: integer, format: int64, minimum: 0 }
33656
36076
  sizeGiB: { type: integer, format: int64, minimum: 0 }
33657
- sourceKind: { type: string }
33658
- sourceRef: { type: string }
36077
+ sourceKind: { type: string, description: "PVE cloud_image declares an already staged QCOW2 import volume. cloudInitSupported must be explicitly true for managed guest initialization." }
36078
+ 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." }
33659
36079
  namespace: { type: string }
33660
36080
  storageClass: { type: string }
33661
36081
  url: { type: string }
@@ -33862,6 +36282,8 @@ components:
33862
36282
  maxLength: 1048576
33863
36283
  description: Sensitive bootstrap content. It is never returned by plan or audit responses.
33864
36284
  x-soha-sensitive: true
36285
+ guestAccess:
36286
+ $ref: "#/components/schemas/VirtualMachineGuestAccessInput"
33865
36287
  cpuCoreCount: { type: integer, minimum: 1 }
33866
36288
  memoryBytes: { type: integer, minimum: 1 }
33867
36289
  diskBytes: { type: integer, minimum: 1 }
@@ -34268,6 +36690,11 @@ components:
34268
36690
  type: string
34269
36691
  status:
34270
36692
  type: string
36693
+ executionOwner: { type: string, enum: [native, external] }
36694
+ phase: { type: string }
36695
+ stopReason: { type: string }
36696
+ eventSequence: { type: integer, minimum: 0 }
36697
+ usageKnown: { type: boolean }
34271
36698
  scope:
34272
36699
  type: object
34273
36700
  additionalProperties: true
@@ -41546,6 +43973,19 @@ components:
41546
43973
  plan: { $ref: "#/components/schemas/CapabilityPlan" }
41547
43974
  aiClientId: { type: string }
41548
43975
  skillId: { type: string }
43976
+ scopeConstraints:
43977
+ type: array
43978
+ maxItems: 20
43979
+ uniqueItems: true
43980
+ description: Immutable exact target constraints for every resolved invocation, approval replay, status read and cancellation. These narrow scope and never grant permission.
43981
+ items: { $ref: "#/components/schemas/CapabilityScopeConstraint" }
43982
+ additionalProperties: false
43983
+ CapabilityScopeConstraint:
43984
+ type: object
43985
+ required: [dimension, value]
43986
+ properties:
43987
+ dimension: { type: string, minLength: 1, maxLength: 64, pattern: '^[A-Za-z][A-Za-z0-9_]{0,63}$' }
43988
+ value: { type: string, minLength: 1, maxLength: 512 }
41549
43989
  additionalProperties: false
41550
43990
  CapabilityTaskRevisionInput:
41551
43991
  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.
@@ -41566,6 +44006,10 @@ components:
41566
44006
  status: { type: string }
41567
44007
  createdBy: { type: string }
41568
44008
  plan: { $ref: "#/components/schemas/CapabilityPlan" }
44009
+ scopeConstraints:
44010
+ type: array
44011
+ maxItems: 20
44012
+ items: { $ref: "#/components/schemas/CapabilityScopeConstraint" }
41569
44013
  nodes:
41570
44014
  type: array
41571
44015
  items: { $ref: "#/components/schemas/CapabilityTaskNode" }
@@ -41769,10 +44213,11 @@ components:
41769
44213
  type: object
41770
44214
  required: [targetType, targetRef]
41771
44215
  properties:
44216
+ purpose: { $ref: "#/components/schemas/SecretPurpose" }
41772
44217
  targetType:
41773
44218
  type: string
41774
- enum: [capability, project, connection]
41775
- x-enum-varnames: [SecretBindingCapability, SecretBindingProject, SecretBindingConnection]
44219
+ enum: [capability, project, connection, vm, vm_create]
44220
+ x-enum-varnames: [SecretBindingCapability, SecretBindingProject, SecretBindingConnection, SecretBindingVM, SecretBindingVMCreate]
41776
44221
  targetRef:
41777
44222
  type: string
41778
44223
  minLength: 1
@@ -41808,10 +44253,41 @@ components:
41808
44253
  type: integer
41809
44254
  minimum: 1
41810
44255
  additionalProperties: false
44256
+ SecretReferenceUsage:
44257
+ type: object
44258
+ required: [targetId, usage, version, status]
44259
+ properties:
44260
+ targetId:
44261
+ type: string
44262
+ vmId:
44263
+ type: string
44264
+ usage:
44265
+ type: string
44266
+ description: login_binding, ssh_session or cloud_init_operation. Historical initialization does not assert that the guest still trusts this key.
44267
+ version:
44268
+ type: integer
44269
+ minimum: 1
44270
+ bindingRevision:
44271
+ type: integer
44272
+ minimum: 1
44273
+ status:
44274
+ type: string
44275
+ additionalProperties: false
44276
+ SecretReferenceUsageListEnvelope:
44277
+ type: object
44278
+ required: [items]
44279
+ properties:
44280
+ items:
44281
+ type: array
44282
+ items:
44283
+ $ref: "#/components/schemas/SecretReferenceUsage"
44284
+ additionalProperties: false
41811
44285
  SecretMetadata:
41812
44286
  type: object
41813
44287
  required: [id, name, scopeType, scopeId, status, currentVersion, bindings, createdBy, createdAt, updatedAt]
41814
44288
  properties:
44289
+ kind: { $ref: "#/components/schemas/SecretKind" }
44290
+ publicKey: { $ref: "#/components/schemas/SecretSSHPublicKey" }
41815
44291
  id:
41816
44292
  type: string
41817
44293
  name:
@@ -41852,6 +44328,8 @@ components:
41852
44328
  else:
41853
44329
  required: [vaultKv2]
41854
44330
  properties:
44331
+ kind: { $ref: "#/components/schemas/SecretKind" }
44332
+ sshPassphrase: { type: string, maxLength: 4096, writeOnly: true, x-soha-sensitive: true }
41855
44333
  name:
41856
44334
  type: string
41857
44335
  minLength: 1
@@ -41908,6 +44386,7 @@ components:
41908
44386
  else:
41909
44387
  required: [vaultKv2]
41910
44388
  properties:
44389
+ sshPassphrase: { type: string, maxLength: 4096, writeOnly: true, x-soha-sensitive: true }
41911
44390
  value:
41912
44391
  type: string
41913
44392
  minLength: 1
@@ -41920,6 +44399,8 @@ components:
41920
44399
  type: object
41921
44400
  required: [secretId, version, status, createdBy, createdAt]
41922
44401
  properties:
44402
+ kind: { $ref: "#/components/schemas/SecretKind" }
44403
+ publicKey: { $ref: "#/components/schemas/SecretSSHPublicKey" }
41923
44404
  secretId:
41924
44405
  type: string
41925
44406
  version:
@@ -42503,6 +44984,7 @@ components:
42503
44984
  rateLimitProfileId:
42504
44985
  type: string
42505
44986
  metadata:
44987
+ 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.
42506
44988
  type: object
42507
44989
  additionalProperties: true
42508
44990
  createdAt:
@@ -42557,6 +45039,7 @@ components:
42557
45039
  rateLimitProfileId:
42558
45040
  type: string
42559
45041
  metadata:
45042
+ 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.
42560
45043
  type: object
42561
45044
  additionalProperties: true
42562
45045
  additionalProperties: false