@opensoha/contracts 0.1.23 → 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 (360) 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 +3 -2
  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 +2195 -205
  347. package/gen/go/sohaapi/vm_disk_test.go +21 -0
  348. package/gen/ts/sohaapi/index.ts +3427 -485
  349. package/go.mod +61 -49
  350. package/go.sum +202 -176
  351. package/knowledge/connector-definition.schema.json +6 -1
  352. package/knowledge/source-import-policy.schema.json +32 -0
  353. package/memory/memory-record.schema.json +1 -1
  354. package/openapi/soha-api.json +12645 -7451
  355. package/openapi/soha-api.yaml +1806 -12
  356. package/openapi/spec_generated.go +3 -3
  357. package/package.json +19 -3
  358. /package/fixtures/openapi/DeliveryExecutionHistoryPage/{invalid-kind.json → invalid/invalid-kind.json} +0 -0
  359. /package/fixtures/openapi/DeliveryExecutionHistoryPage/{valid-build.json → valid/valid-build.json} +0 -0
  360. /package/fixtures/openapi/DeliveryExecutionHistoryPage/{valid-empty.json → valid/valid-empty.json} +0 -0
@@ -1,7 +1,7 @@
1
1
  openapi: 3.1.0
2
2
  info:
3
3
  title: Soha API
4
- version: 0.1.23
4
+ version: 0.1.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]
@@ -11244,6 +12098,32 @@ paths:
11244
12098
  $ref: "#/components/responses/Error"
11245
12099
  "404":
11246
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"
11247
12127
  /secrets/{secretID}/versions:
11248
12128
  get:
11249
12129
  tags: [Secrets]
@@ -24417,9 +25297,13 @@ components:
24417
25297
  name: { type: string, minLength: 1, maxLength: 160 }
24418
25298
  kind: { type: string, enum: [inline, http, git, object] }
24419
25299
  version: { type: string, maxLength: 64 }
24420
- 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."
24421
25304
  config:
24422
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.
24423
25307
  additionalProperties: true
24424
25308
  syncPolicy: { $ref: "#/components/schemas/KnowledgeSyncPolicy" }
24425
25309
  additionalProperties: false
@@ -24785,6 +25669,7 @@ components:
24785
25669
  sourceType: { type: string, enum: [explicit_user, curated_extractor] }
24786
25670
  sourceRefs:
24787
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.'
24788
25673
  maxItems: 32
24789
25674
  items: { type: string }
24790
25675
  confidence: { type: number, minimum: 0, maximum: 1 }
@@ -25050,14 +25935,53 @@ components:
25050
25935
  createdAt: { type: string, format: date-time }
25051
25936
  updatedAt: { type: string, format: date-time }
25052
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
25053
25972
  AIEnvironmentTemplateInput:
25054
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.
25055
25975
  required: [id, name, backend, isolationMode]
25056
25976
  properties:
25057
25977
  id: { type: string, minLength: 1 }
25058
25978
  name: { type: string, minLength: 1 }
25059
- backend: { type: string, enum: [container, kubernetes] }
25979
+ backend: { type: string, enum: [container, kubernetes, vm] }
25060
25980
  isolationMode: { type: string, enum: [read-only, disposable-write] }
25981
+ personalDocker:
25982
+ $ref: "#/components/schemas/PersonalDockerEnvironmentPolicy"
25983
+ personalVM:
25984
+ $ref: "#/components/schemas/PersonalVMEnvironmentPolicy"
25061
25985
  resourcePolicy:
25062
25986
  type: object
25063
25987
  additionalProperties: true
@@ -25067,12 +25991,17 @@ components:
25067
25991
  additionalProperties: false
25068
25992
  AIEnvironmentTemplate:
25069
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.
25070
25995
  required: [id, name, backend, isolationMode, status, createdAt, updatedAt]
25071
25996
  properties:
25072
25997
  id: { type: string, minLength: 1 }
25073
25998
  name: { type: string, minLength: 1 }
25074
- backend: { type: string, enum: [container, kubernetes] }
25999
+ backend: { type: string, enum: [container, kubernetes, vm] }
25075
26000
  isolationMode: { type: string, enum: [read-only, disposable-write] }
26001
+ personalDocker:
26002
+ $ref: "#/components/schemas/PersonalDockerEnvironmentPolicy"
26003
+ personalVM:
26004
+ $ref: "#/components/schemas/PersonalVMEnvironmentPolicy"
25076
26005
  resourcePolicy:
25077
26006
  type: object
25078
26007
  additionalProperties: true
@@ -25319,7 +26248,18 @@ components:
25319
26248
  content: { type: string }
25320
26249
  uri: { type: string }
25321
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.
25322
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 }
25323
26263
  additionalProperties: false
25324
26264
  KnowledgeDocument:
25325
26265
  type: object
@@ -25417,6 +26357,9 @@ components:
25417
26357
  uri: { type: string }
25418
26358
  score: { type: number }
25419
26359
  contentHash: { type: string }
26360
+ documentVersionId: { type: string }
26361
+ indexRevisionId: { type: string }
26362
+ retrievedAt: { type: string, format: date-time }
25420
26363
  additionalProperties: false
25421
26364
  KnowledgeSearchHit:
25422
26365
  type: object
@@ -25447,6 +26390,8 @@ components:
25447
26390
  timingMs: { type: integer, format: int64, minimum: 0 }
25448
26391
  noAnswer: { type: boolean }
25449
26392
  traceId: { type: string }
26393
+ retrievalMode: { type: string, enum: [lexical, hybrid] }
26394
+ degradationReason: { type: string }
25450
26395
  additionalProperties: false
25451
26396
  EvaluationDatasetSample:
25452
26397
  type: object
@@ -26170,10 +27115,32 @@ components:
26170
27115
  reasoningEfforts:
26171
27116
  type: array
26172
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 }
26173
27135
  additionalProperties: false
26174
27136
  WorkbenchSessionMetadata:
26175
27137
  type: object
26176
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.
26177
27144
  modelPreferences:
26178
27145
  $ref: "#/components/schemas/WorkbenchModelPreferences"
26179
27146
  mode:
@@ -26220,6 +27187,340 @@ components:
26220
27187
  createdAt: { type: string, format: date-time }
26221
27188
  updatedAt: { type: string, format: date-time }
26222
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
26223
27524
  WorkbenchCreateSessionRequest:
26224
27525
  type: object
26225
27526
  properties:
@@ -26274,9 +27575,11 @@ components:
26274
27575
  role:
26275
27576
  type: string
26276
27577
  enum: [user, assistant, system]
27578
+ x-enum-varnames: [WorkbenchMessageRoleUser, WorkbenchMessageRoleAssistant, WorkbenchMessageRoleSystem]
26277
27579
  content: { type: string }
26278
27580
  metadata:
26279
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.
26280
27583
  additionalProperties: {}
26281
27584
  createdAt: { type: string, format: date-time }
26282
27585
  additionalProperties: false
@@ -26886,6 +28189,11 @@ components:
26886
28189
  rootCauseRunId: { type: string }
26887
28190
  createdBy: { type: string }
26888
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 }
26889
28197
  scope:
26890
28198
  $ref: "#/components/schemas/WorkbenchSessionScope"
26891
28199
  toolset:
@@ -27337,10 +28645,31 @@ components:
27337
28645
  ok:
27338
28646
  type: boolean
27339
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
27340
28660
  WorkbenchSendMessageStreamRequest:
27341
28661
  type: object
27342
28662
  required: [content]
27343
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"
27344
28673
  contextSelection:
27345
28674
  $ref: "#/components/schemas/WorkbenchContextSelection"
27346
28675
  knowledgeContext:
@@ -27377,10 +28706,82 @@ components:
27377
28706
  type: object
27378
28707
  additionalProperties: {}
27379
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}
27380
28780
  WorkbenchContextSelection:
27381
- description: Explicit references and UTF-8 text attachments for this request only. The server rechecks source access and records used content hashes and truncations. Not inherited by subsequent requests.
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.
27382
28782
  type: object
27383
28783
  properties:
28784
+ feedItemId: { type: string, minLength: 1, maxLength: 128, description: Owned personal feed post, reloaded and checked by the server before discussion. }
27384
28785
  memoryIds:
27385
28786
  type: array
27386
28787
  maxItems: 20
@@ -27397,6 +28798,23 @@ components:
27397
28798
  maxItems: 8
27398
28799
  items:
27399
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}$'
27400
28818
  additionalProperties: false
27401
28819
  WorkbenchContextReference:
27402
28820
  type: object
@@ -27570,7 +28988,7 @@ components:
27570
28988
  type: string
27571
28989
  providerKind:
27572
28990
  type: string
27573
- 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]
27574
28992
  status:
27575
28993
  type: string
27576
28994
  enum: [queued, running, succeeded, failed, cancelled]
@@ -27712,6 +29130,7 @@ components:
27712
29130
  role:
27713
29131
  type: string
27714
29132
  enum: [assistant]
29133
+ x-enum-varnames: [AgentRunCallbackWorkbenchMessageDeltaEventRoleAssistant]
27715
29134
  contentDelta:
27716
29135
  type: string
27717
29136
  unevaluatedProperties: false
@@ -27727,6 +29146,7 @@ components:
27727
29146
  role:
27728
29147
  type: string
27729
29148
  enum: [assistant]
29149
+ x-enum-varnames: [AgentRunCallbackWorkbenchMessageDeltaEventRoleAssistant]
27730
29150
  content:
27731
29151
  type: string
27732
29152
  metadata:
@@ -33666,12 +35086,14 @@ components:
33666
35086
  type: object
33667
35087
  properties:
33668
35088
  helm: { $ref: "#/components/schemas/HelmExecutionTaskPayload" }
35089
+ sshCommand: { $ref: "#/components/schemas/AgentSSHCommandRequest" }
33669
35090
  additionalProperties: true
33670
35091
  x-go-type: map[string]any
33671
35092
  result:
33672
35093
  type: object
33673
35094
  properties:
33674
35095
  helm: { $ref: "#/components/schemas/HelmExecutionTaskResult" }
35096
+ sshCommand: { $ref: "#/components/schemas/AgentSSHCommandResult" }
33675
35097
  additionalProperties: true
33676
35098
  x-go-type: map[string]any
33677
35099
  x-go-type-skip-optional-pointer: true
@@ -33795,8 +35217,19 @@ components:
33795
35217
  name: { type: string }
33796
35218
  storage: { type: string }
33797
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.
33798
35226
  sizeGiB: { type: integer, minimum: 1 }
33799
35227
  add: { type: boolean }
35228
+ if: { required: [serial] }
35229
+ then:
35230
+ required: [add]
35231
+ properties:
35232
+ add: { const: true }
33800
35233
  additionalProperties: false
33801
35234
  VirtualMachineNetworkChange:
33802
35235
  type: object
@@ -33895,10 +35328,298 @@ components:
33895
35328
  poolRevision: { type: integer, minimum: 1 }
33896
35329
  idempotencyKey: { type: string, minLength: 8, maxLength: 128 }
33897
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
33898
35618
  VirtualizationCapacityInput:
33899
35619
  type: object
33900
35620
  required: [connectionId, cpu, memoryMiB, diskGiB]
33901
35621
  properties:
35622
+ startAfterCreate: { type: boolean, default: true, x-go-type-skip-optional-pointer: false }
33902
35623
  connectionId: { type: string, minLength: 1 }
33903
35624
  cpu: { type: integer, minimum: 1, maximum: 65536, description: Dedicated CPU cores for a running VM. }
33904
35625
  memoryMiB: { type: integer, minimum: 1, maximum: 1099511627776, description: Guest memory in MiB; configured hypervisor overhead is added by the server. }
@@ -33913,6 +35634,12 @@ components:
33913
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.
33914
35635
  required: [connectionId, status, reason]
33915
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" }
33916
35643
  connectionId: { type: string }
33917
35644
  provider: { type: string }
33918
35645
  status:
@@ -33936,12 +35663,13 @@ components:
33936
35663
  type: object
33937
35664
  required: [connectionId, name]
33938
35665
  properties:
35666
+ guestAccess: { $ref: "#/components/schemas/VirtualMachineGuestAccessInput" }
33939
35667
  connectionId: { type: string, minLength: 1 }
33940
35668
  name: { type: string, minLength: 1 }
33941
35669
  requireCapacity:
33942
35670
  type: boolean
33943
35671
  default: false
33944
- description: Require fresh provider capacity and reserve node CPU, memory and storage atomically with this operation. Missing inventory or unsupported placement fails closed. This controls concurrent Soha admission; provider admission and runtime readiness remain authoritative.
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.
33945
35673
  architecture: { type: string }
33946
35674
  namespace: { type: string }
33947
35675
  node: { type: string }
@@ -33949,7 +35677,7 @@ components:
33949
35677
  memoryMiB: { type: integer, minimum: 1 }
33950
35678
  bootImageId: { type: string }
33951
35679
  imageId: { type: string }
33952
- 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." }
33953
35681
  sourceId: { type: string }
33954
35682
  flavorId: { type: string }
33955
35683
  diskGiB: { type: integer, minimum: 1 }
@@ -34212,6 +35940,9 @@ components:
34212
35940
  cpu: { type: integer, minimum: 0 }
34213
35941
  memoryMiB: { type: integer, minimum: 0 }
34214
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.
34215
35946
  disks:
34216
35947
  type: array
34217
35948
  maxItems: 64
@@ -34343,8 +36074,8 @@ components:
34343
36074
  architecture: { type: string }
34344
36075
  sizeBytes: { type: integer, format: int64, minimum: 0 }
34345
36076
  sizeGiB: { type: integer, format: int64, minimum: 0 }
34346
- sourceKind: { type: string }
34347
- 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." }
34348
36079
  namespace: { type: string }
34349
36080
  storageClass: { type: string }
34350
36081
  url: { type: string }
@@ -34551,6 +36282,8 @@ components:
34551
36282
  maxLength: 1048576
34552
36283
  description: Sensitive bootstrap content. It is never returned by plan or audit responses.
34553
36284
  x-soha-sensitive: true
36285
+ guestAccess:
36286
+ $ref: "#/components/schemas/VirtualMachineGuestAccessInput"
34554
36287
  cpuCoreCount: { type: integer, minimum: 1 }
34555
36288
  memoryBytes: { type: integer, minimum: 1 }
34556
36289
  diskBytes: { type: integer, minimum: 1 }
@@ -34957,6 +36690,11 @@ components:
34957
36690
  type: string
34958
36691
  status:
34959
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 }
34960
36698
  scope:
34961
36699
  type: object
34962
36700
  additionalProperties: true
@@ -42235,6 +43973,19 @@ components:
42235
43973
  plan: { $ref: "#/components/schemas/CapabilityPlan" }
42236
43974
  aiClientId: { type: string }
42237
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 }
42238
43989
  additionalProperties: false
42239
43990
  CapabilityTaskRevisionInput:
42240
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.
@@ -42255,6 +44006,10 @@ components:
42255
44006
  status: { type: string }
42256
44007
  createdBy: { type: string }
42257
44008
  plan: { $ref: "#/components/schemas/CapabilityPlan" }
44009
+ scopeConstraints:
44010
+ type: array
44011
+ maxItems: 20
44012
+ items: { $ref: "#/components/schemas/CapabilityScopeConstraint" }
42258
44013
  nodes:
42259
44014
  type: array
42260
44015
  items: { $ref: "#/components/schemas/CapabilityTaskNode" }
@@ -42458,10 +44213,11 @@ components:
42458
44213
  type: object
42459
44214
  required: [targetType, targetRef]
42460
44215
  properties:
44216
+ purpose: { $ref: "#/components/schemas/SecretPurpose" }
42461
44217
  targetType:
42462
44218
  type: string
42463
- enum: [capability, project, connection]
42464
- x-enum-varnames: [SecretBindingCapability, SecretBindingProject, SecretBindingConnection]
44219
+ enum: [capability, project, connection, vm, vm_create]
44220
+ x-enum-varnames: [SecretBindingCapability, SecretBindingProject, SecretBindingConnection, SecretBindingVM, SecretBindingVMCreate]
42465
44221
  targetRef:
42466
44222
  type: string
42467
44223
  minLength: 1
@@ -42497,10 +44253,41 @@ components:
42497
44253
  type: integer
42498
44254
  minimum: 1
42499
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
42500
44285
  SecretMetadata:
42501
44286
  type: object
42502
44287
  required: [id, name, scopeType, scopeId, status, currentVersion, bindings, createdBy, createdAt, updatedAt]
42503
44288
  properties:
44289
+ kind: { $ref: "#/components/schemas/SecretKind" }
44290
+ publicKey: { $ref: "#/components/schemas/SecretSSHPublicKey" }
42504
44291
  id:
42505
44292
  type: string
42506
44293
  name:
@@ -42541,6 +44328,8 @@ components:
42541
44328
  else:
42542
44329
  required: [vaultKv2]
42543
44330
  properties:
44331
+ kind: { $ref: "#/components/schemas/SecretKind" }
44332
+ sshPassphrase: { type: string, maxLength: 4096, writeOnly: true, x-soha-sensitive: true }
42544
44333
  name:
42545
44334
  type: string
42546
44335
  minLength: 1
@@ -42597,6 +44386,7 @@ components:
42597
44386
  else:
42598
44387
  required: [vaultKv2]
42599
44388
  properties:
44389
+ sshPassphrase: { type: string, maxLength: 4096, writeOnly: true, x-soha-sensitive: true }
42600
44390
  value:
42601
44391
  type: string
42602
44392
  minLength: 1
@@ -42609,6 +44399,8 @@ components:
42609
44399
  type: object
42610
44400
  required: [secretId, version, status, createdBy, createdAt]
42611
44401
  properties:
44402
+ kind: { $ref: "#/components/schemas/SecretKind" }
44403
+ publicKey: { $ref: "#/components/schemas/SecretSSHPublicKey" }
42612
44404
  secretId:
42613
44405
  type: string
42614
44406
  version:
@@ -43192,6 +44984,7 @@ components:
43192
44984
  rateLimitProfileId:
43193
44985
  type: string
43194
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.
43195
44988
  type: object
43196
44989
  additionalProperties: true
43197
44990
  createdAt:
@@ -43246,6 +45039,7 @@ components:
43246
45039
  rateLimitProfileId:
43247
45040
  type: string
43248
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.
43249
45043
  type: object
43250
45044
  additionalProperties: true
43251
45045
  additionalProperties: false