@playcraft/common 0.1.24 → 0.1.26

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 (297) hide show
  1. package/README.md +1 -1
  2. package/dist/agent/session-title.d.ts +1 -1
  3. package/dist/agent/session-title.js +1 -1
  4. package/dist/agent-messages/db-message-converter.d.ts +10 -0
  5. package/dist/agent-messages/db-message-converter.d.ts.map +1 -1
  6. package/dist/agent-messages/db-message-converter.js +13 -0
  7. package/dist/agent-messages/db-message-converter.js.map +1 -1
  8. package/dist/agent-tools/index.d.ts +5 -0
  9. package/dist/agent-tools/index.d.ts.map +1 -1
  10. package/dist/agent-tools/index.js +5 -0
  11. package/dist/agent-tools/index.js.map +1 -1
  12. package/dist/agent-tools/operation-protocol.d.ts +10 -0
  13. package/dist/agent-tools/operation-protocol.d.ts.map +1 -0
  14. package/dist/agent-tools/operation-protocol.js +13 -0
  15. package/dist/agent-tools/operation-protocol.js.map +1 -0
  16. package/dist/agent-tools/replica-recording.d.ts +283 -0
  17. package/dist/agent-tools/replica-recording.d.ts.map +1 -0
  18. package/dist/agent-tools/replica-recording.js +109 -0
  19. package/dist/agent-tools/replica-recording.js.map +1 -0
  20. package/dist/agent-tools/replica-validation.d.ts +972 -0
  21. package/dist/agent-tools/replica-validation.d.ts.map +1 -0
  22. package/dist/agent-tools/replica-validation.js +254 -0
  23. package/dist/agent-tools/replica-validation.js.map +1 -0
  24. package/dist/agent-tools/types.d.ts +9 -7
  25. package/dist/agent-tools/types.d.ts.map +1 -1
  26. package/dist/agent-tools/types.js.map +1 -1
  27. package/dist/agent-tools/video-model-proxy.d.ts +113 -0
  28. package/dist/agent-tools/video-model-proxy.d.ts.map +1 -0
  29. package/dist/agent-tools/video-model-proxy.js +49 -0
  30. package/dist/agent-tools/video-model-proxy.js.map +1 -0
  31. package/dist/agent-tools/video-replication.d.ts +421 -0
  32. package/dist/agent-tools/video-replication.d.ts.map +1 -0
  33. package/dist/agent-tools/video-replication.js +95 -0
  34. package/dist/agent-tools/video-replication.js.map +1 -0
  35. package/dist/cloud-workspace/runtime/agent-background-processes.d.ts +68 -0
  36. package/dist/cloud-workspace/runtime/agent-background-processes.d.ts.map +1 -0
  37. package/dist/cloud-workspace/runtime/agent-background-processes.js +60 -0
  38. package/dist/cloud-workspace/runtime/agent-background-processes.js.map +1 -0
  39. package/dist/cloud-workspace/runtime/agent-chat-flush.d.ts +55 -0
  40. package/dist/cloud-workspace/runtime/agent-chat-flush.d.ts.map +1 -0
  41. package/dist/cloud-workspace/runtime/agent-chat-flush.js +51 -0
  42. package/dist/cloud-workspace/runtime/agent-chat-flush.js.map +1 -0
  43. package/dist/cloud-workspace/runtime/agent-command.d.ts +152 -0
  44. package/dist/cloud-workspace/runtime/agent-command.d.ts.map +1 -0
  45. package/dist/cloud-workspace/runtime/agent-command.js +90 -0
  46. package/dist/cloud-workspace/runtime/agent-command.js.map +1 -0
  47. package/dist/cloud-workspace/runtime/agent-competitor-report.d.ts +143 -0
  48. package/dist/cloud-workspace/runtime/agent-competitor-report.d.ts.map +1 -0
  49. package/dist/cloud-workspace/runtime/agent-competitor-report.js +115 -0
  50. package/dist/cloud-workspace/runtime/agent-competitor-report.js.map +1 -0
  51. package/dist/cloud-workspace/runtime/agent-connection.d.ts +76 -0
  52. package/dist/cloud-workspace/runtime/agent-connection.d.ts.map +1 -0
  53. package/dist/cloud-workspace/runtime/agent-connection.js +59 -0
  54. package/dist/cloud-workspace/runtime/agent-connection.js.map +1 -0
  55. package/dist/cloud-workspace/runtime/agent-issue-artifacts.d.ts +90 -0
  56. package/dist/cloud-workspace/runtime/agent-issue-artifacts.d.ts.map +1 -0
  57. package/dist/cloud-workspace/runtime/agent-issue-artifacts.js +60 -0
  58. package/dist/cloud-workspace/runtime/agent-issue-artifacts.js.map +1 -0
  59. package/dist/cloud-workspace/runtime/agent-lifecycle.d.ts +87 -0
  60. package/dist/cloud-workspace/runtime/agent-lifecycle.d.ts.map +1 -0
  61. package/dist/cloud-workspace/runtime/agent-lifecycle.js +75 -0
  62. package/dist/cloud-workspace/runtime/agent-lifecycle.js.map +1 -0
  63. package/dist/cloud-workspace/runtime/agent-mutation.d.ts +197 -0
  64. package/dist/cloud-workspace/runtime/agent-mutation.d.ts.map +1 -0
  65. package/dist/cloud-workspace/runtime/agent-mutation.js +114 -0
  66. package/dist/cloud-workspace/runtime/agent-mutation.js.map +1 -0
  67. package/dist/cloud-workspace/runtime/agent-opencode-gateway.d.ts +210 -0
  68. package/dist/cloud-workspace/runtime/agent-opencode-gateway.d.ts.map +1 -0
  69. package/dist/cloud-workspace/runtime/agent-opencode-gateway.js +180 -0
  70. package/dist/cloud-workspace/runtime/agent-opencode-gateway.js.map +1 -0
  71. package/dist/cloud-workspace/runtime/agent-opencode.d.ts +406 -0
  72. package/dist/cloud-workspace/runtime/agent-opencode.d.ts.map +1 -0
  73. package/dist/cloud-workspace/runtime/agent-opencode.js +237 -0
  74. package/dist/cloud-workspace/runtime/agent-opencode.js.map +1 -0
  75. package/dist/cloud-workspace/runtime/agent-promotion.d.ts +21 -0
  76. package/dist/cloud-workspace/runtime/agent-promotion.d.ts.map +1 -0
  77. package/dist/cloud-workspace/runtime/agent-promotion.js +23 -0
  78. package/dist/cloud-workspace/runtime/agent-promotion.js.map +1 -0
  79. package/dist/cloud-workspace/runtime/agent-read.d.ts +343 -0
  80. package/dist/cloud-workspace/runtime/agent-read.d.ts.map +1 -0
  81. package/dist/cloud-workspace/runtime/agent-read.js +159 -0
  82. package/dist/cloud-workspace/runtime/agent-read.js.map +1 -0
  83. package/dist/cloud-workspace/runtime/agent-source-project.d.ts +126 -0
  84. package/dist/cloud-workspace/runtime/agent-source-project.d.ts.map +1 -0
  85. package/dist/cloud-workspace/runtime/agent-source-project.js +95 -0
  86. package/dist/cloud-workspace/runtime/agent-source-project.js.map +1 -0
  87. package/dist/cloud-workspace/runtime/agent-tool-claim.d.ts +18 -0
  88. package/dist/cloud-workspace/runtime/agent-tool-claim.d.ts.map +1 -0
  89. package/dist/cloud-workspace/runtime/agent-tool-claim.js +16 -0
  90. package/dist/cloud-workspace/runtime/agent-tool-claim.js.map +1 -0
  91. package/dist/cloud-workspace/runtime/agent-variant-chat.d.ts +9 -0
  92. package/dist/cloud-workspace/runtime/agent-variant-chat.d.ts.map +1 -0
  93. package/dist/cloud-workspace/runtime/agent-variant-chat.js +23 -0
  94. package/dist/cloud-workspace/runtime/agent-variant-chat.js.map +1 -0
  95. package/dist/cloud-workspace/runtime/agent-variant-git.d.ts +75 -0
  96. package/dist/cloud-workspace/runtime/agent-variant-git.d.ts.map +1 -0
  97. package/dist/cloud-workspace/runtime/agent-variant-git.js +62 -0
  98. package/dist/cloud-workspace/runtime/agent-variant-git.js.map +1 -0
  99. package/dist/cloud-workspace/runtime/artifacts.d.ts +233 -0
  100. package/dist/cloud-workspace/runtime/artifacts.d.ts.map +1 -0
  101. package/dist/cloud-workspace/runtime/artifacts.js +94 -0
  102. package/dist/cloud-workspace/runtime/artifacts.js.map +1 -0
  103. package/dist/cloud-workspace/runtime/attachments.d.ts +28 -0
  104. package/dist/cloud-workspace/runtime/attachments.d.ts.map +1 -0
  105. package/dist/cloud-workspace/runtime/attachments.js +34 -0
  106. package/dist/cloud-workspace/runtime/attachments.js.map +1 -0
  107. package/dist/cloud-workspace/runtime/batch-generation.d.ts +229 -0
  108. package/dist/cloud-workspace/runtime/batch-generation.d.ts.map +1 -0
  109. package/dist/cloud-workspace/runtime/batch-generation.js +244 -0
  110. package/dist/cloud-workspace/runtime/batch-generation.js.map +1 -0
  111. package/dist/cloud-workspace/runtime/batch-production.d.ts +474 -0
  112. package/dist/cloud-workspace/runtime/batch-production.d.ts.map +1 -0
  113. package/dist/cloud-workspace/runtime/batch-production.js +61 -0
  114. package/dist/cloud-workspace/runtime/batch-production.js.map +1 -0
  115. package/dist/cloud-workspace/runtime/capabilities.d.ts +40 -0
  116. package/dist/cloud-workspace/runtime/capabilities.d.ts.map +1 -0
  117. package/dist/cloud-workspace/runtime/capabilities.js +53 -0
  118. package/dist/cloud-workspace/runtime/capabilities.js.map +1 -0
  119. package/dist/cloud-workspace/runtime/chat-realtime-admission.d.ts +53 -0
  120. package/dist/cloud-workspace/runtime/chat-realtime-admission.d.ts.map +1 -0
  121. package/dist/cloud-workspace/runtime/chat-realtime-admission.js +95 -0
  122. package/dist/cloud-workspace/runtime/chat-realtime-admission.js.map +1 -0
  123. package/dist/cloud-workspace/runtime/chat-realtime.d.ts +197 -0
  124. package/dist/cloud-workspace/runtime/chat-realtime.d.ts.map +1 -0
  125. package/dist/cloud-workspace/runtime/chat-realtime.js +299 -0
  126. package/dist/cloud-workspace/runtime/chat-realtime.js.map +1 -0
  127. package/dist/cloud-workspace/runtime/checkpoints.d.ts +35 -0
  128. package/dist/cloud-workspace/runtime/checkpoints.d.ts.map +1 -0
  129. package/dist/cloud-workspace/runtime/checkpoints.js +35 -0
  130. package/dist/cloud-workspace/runtime/checkpoints.js.map +1 -0
  131. package/dist/cloud-workspace/runtime/config.d.ts +47 -0
  132. package/dist/cloud-workspace/runtime/config.d.ts.map +1 -0
  133. package/dist/cloud-workspace/runtime/config.js +125 -0
  134. package/dist/cloud-workspace/runtime/config.js.map +1 -0
  135. package/dist/cloud-workspace/runtime/connectivity.d.ts +205 -0
  136. package/dist/cloud-workspace/runtime/connectivity.d.ts.map +1 -0
  137. package/dist/cloud-workspace/runtime/connectivity.js +46 -0
  138. package/dist/cloud-workspace/runtime/connectivity.js.map +1 -0
  139. package/dist/cloud-workspace/runtime/errors.d.ts +26 -0
  140. package/dist/cloud-workspace/runtime/errors.d.ts.map +1 -0
  141. package/dist/cloud-workspace/runtime/errors.js +40 -0
  142. package/dist/cloud-workspace/runtime/errors.js.map +1 -0
  143. package/dist/cloud-workspace/runtime/events.d.ts +107 -0
  144. package/dist/cloud-workspace/runtime/events.d.ts.map +1 -0
  145. package/dist/cloud-workspace/runtime/events.js +70 -0
  146. package/dist/cloud-workspace/runtime/events.js.map +1 -0
  147. package/dist/cloud-workspace/runtime/execution-grant.d.ts +36 -0
  148. package/dist/cloud-workspace/runtime/execution-grant.d.ts.map +1 -0
  149. package/dist/cloud-workspace/runtime/execution-grant.js +102 -0
  150. package/dist/cloud-workspace/runtime/execution-grant.js.map +1 -0
  151. package/dist/cloud-workspace/runtime/files.d.ts +74 -0
  152. package/dist/cloud-workspace/runtime/files.d.ts.map +1 -0
  153. package/dist/cloud-workspace/runtime/files.js +93 -0
  154. package/dist/cloud-workspace/runtime/files.js.map +1 -0
  155. package/dist/cloud-workspace/runtime/generations.d.ts +18 -0
  156. package/dist/cloud-workspace/runtime/generations.d.ts.map +1 -0
  157. package/dist/cloud-workspace/runtime/generations.js +39 -0
  158. package/dist/cloud-workspace/runtime/generations.js.map +1 -0
  159. package/dist/cloud-workspace/runtime/git-auth-mode.d.ts +35 -0
  160. package/dist/cloud-workspace/runtime/git-auth-mode.d.ts.map +1 -0
  161. package/dist/cloud-workspace/runtime/git-auth-mode.js +73 -0
  162. package/dist/cloud-workspace/runtime/git-auth-mode.js.map +1 -0
  163. package/dist/cloud-workspace/runtime/git.d.ts +103 -0
  164. package/dist/cloud-workspace/runtime/git.d.ts.map +1 -0
  165. package/dist/cloud-workspace/runtime/git.js +91 -0
  166. package/dist/cloud-workspace/runtime/git.js.map +1 -0
  167. package/dist/cloud-workspace/runtime/handshake.d.ts +47 -0
  168. package/dist/cloud-workspace/runtime/handshake.d.ts.map +1 -0
  169. package/dist/cloud-workspace/runtime/handshake.js +31 -0
  170. package/dist/cloud-workspace/runtime/handshake.js.map +1 -0
  171. package/dist/cloud-workspace/runtime/index.d.ts +48 -0
  172. package/dist/cloud-workspace/runtime/index.d.ts.map +1 -0
  173. package/dist/cloud-workspace/runtime/index.js +48 -0
  174. package/dist/cloud-workspace/runtime/index.js.map +1 -0
  175. package/dist/cloud-workspace/runtime/native-history.d.ts +66 -0
  176. package/dist/cloud-workspace/runtime/native-history.d.ts.map +1 -0
  177. package/dist/cloud-workspace/runtime/native-history.js +127 -0
  178. package/dist/cloud-workspace/runtime/native-history.js.map +1 -0
  179. package/dist/cloud-workspace/runtime/operations.d.ts +208 -0
  180. package/dist/cloud-workspace/runtime/operations.d.ts.map +1 -0
  181. package/dist/cloud-workspace/runtime/operations.js +198 -0
  182. package/dist/cloud-workspace/runtime/operations.js.map +1 -0
  183. package/dist/cloud-workspace/runtime/parameters.d.ts +38 -0
  184. package/dist/cloud-workspace/runtime/parameters.d.ts.map +1 -0
  185. package/dist/cloud-workspace/runtime/parameters.js +75 -0
  186. package/dist/cloud-workspace/runtime/parameters.js.map +1 -0
  187. package/dist/cloud-workspace/runtime/platform-endpoints.d.ts +24 -0
  188. package/dist/cloud-workspace/runtime/platform-endpoints.d.ts.map +1 -0
  189. package/dist/cloud-workspace/runtime/platform-endpoints.js +36 -0
  190. package/dist/cloud-workspace/runtime/platform-endpoints.js.map +1 -0
  191. package/dist/cloud-workspace/runtime/previews.d.ts +59 -0
  192. package/dist/cloud-workspace/runtime/previews.d.ts.map +1 -0
  193. package/dist/cloud-workspace/runtime/previews.js +63 -0
  194. package/dist/cloud-workspace/runtime/previews.js.map +1 -0
  195. package/dist/cloud-workspace/runtime/project-native-skills.d.ts +40 -0
  196. package/dist/cloud-workspace/runtime/project-native-skills.d.ts.map +1 -0
  197. package/dist/cloud-workspace/runtime/project-native-skills.js +45 -0
  198. package/dist/cloud-workspace/runtime/project-native-skills.js.map +1 -0
  199. package/dist/cloud-workspace/runtime/protocol.d.ts +23 -0
  200. package/dist/cloud-workspace/runtime/protocol.d.ts.map +1 -0
  201. package/dist/cloud-workspace/runtime/protocol.js +30 -0
  202. package/dist/cloud-workspace/runtime/protocol.js.map +1 -0
  203. package/dist/cloud-workspace/runtime/resource-grant.d.ts +62 -0
  204. package/dist/cloud-workspace/runtime/resource-grant.d.ts.map +1 -0
  205. package/dist/cloud-workspace/runtime/resource-grant.js +87 -0
  206. package/dist/cloud-workspace/runtime/resource-grant.js.map +1 -0
  207. package/dist/cloud-workspace/runtime/skills.d.ts +39 -0
  208. package/dist/cloud-workspace/runtime/skills.d.ts.map +1 -0
  209. package/dist/cloud-workspace/runtime/skills.js +33 -0
  210. package/dist/cloud-workspace/runtime/skills.js.map +1 -0
  211. package/dist/cloud-workspace/runtime/terminal-session.d.ts +78 -0
  212. package/dist/cloud-workspace/runtime/terminal-session.d.ts.map +1 -0
  213. package/dist/cloud-workspace/runtime/terminal-session.js +178 -0
  214. package/dist/cloud-workspace/runtime/terminal-session.js.map +1 -0
  215. package/dist/cloud-workspace/runtime/terminals.d.ts +90 -0
  216. package/dist/cloud-workspace/runtime/terminals.d.ts.map +1 -0
  217. package/dist/cloud-workspace/runtime/terminals.js +111 -0
  218. package/dist/cloud-workspace/runtime/terminals.js.map +1 -0
  219. package/dist/cloud-workspace/runtime/variant-workspace.d.ts +221 -0
  220. package/dist/cloud-workspace/runtime/variant-workspace.d.ts.map +1 -0
  221. package/dist/cloud-workspace/runtime/variant-workspace.js +75 -0
  222. package/dist/cloud-workspace/runtime/variant-workspace.js.map +1 -0
  223. package/dist/cloud-workspace/runtime/workspace-binding.d.ts +208 -0
  224. package/dist/cloud-workspace/runtime/workspace-binding.d.ts.map +1 -0
  225. package/dist/cloud-workspace/runtime/workspace-binding.js +176 -0
  226. package/dist/cloud-workspace/runtime/workspace-binding.js.map +1 -0
  227. package/dist/cloud-workspace/runtime/workspace-directories.d.ts +44 -0
  228. package/dist/cloud-workspace/runtime/workspace-directories.d.ts.map +1 -0
  229. package/dist/cloud-workspace/runtime/workspace-directories.js +34 -0
  230. package/dist/cloud-workspace/runtime/workspace-directories.js.map +1 -0
  231. package/dist/database/operators.d.ts +2 -0
  232. package/dist/database/operators.d.ts.map +1 -0
  233. package/dist/database/operators.js +2 -0
  234. package/dist/database/operators.js.map +1 -0
  235. package/dist/database/postgres-adapter.js +1 -1
  236. package/dist/database/postgres-adapter.js.map +1 -1
  237. package/dist/database/schema.d.ts +1 -1
  238. package/dist/database/schema.js +1 -1
  239. package/dist/model-proxy/index.d.ts +26 -0
  240. package/dist/model-proxy/index.d.ts.map +1 -0
  241. package/dist/model-proxy/index.js +81 -0
  242. package/dist/model-proxy/index.js.map +1 -0
  243. package/dist/project-skills/bundle-archive.d.ts +21 -0
  244. package/dist/project-skills/bundle-archive.d.ts.map +1 -0
  245. package/dist/project-skills/bundle-archive.js +165 -0
  246. package/dist/project-skills/bundle-archive.js.map +1 -0
  247. package/dist/project-skills/bundle-path.d.ts +3 -0
  248. package/dist/project-skills/bundle-path.d.ts.map +1 -0
  249. package/dist/project-skills/bundle-path.js +17 -0
  250. package/dist/project-skills/bundle-path.js.map +1 -0
  251. package/dist/project-skills/evidence.d.ts +15 -0
  252. package/dist/project-skills/evidence.d.ts.map +1 -0
  253. package/dist/project-skills/evidence.js +33 -0
  254. package/dist/project-skills/evidence.js.map +1 -0
  255. package/dist/project-skills/index.d.ts +7 -0
  256. package/dist/project-skills/index.d.ts.map +1 -0
  257. package/dist/project-skills/index.js +7 -0
  258. package/dist/project-skills/index.js.map +1 -0
  259. package/dist/project-skills/inventory.d.ts +23 -0
  260. package/dist/project-skills/inventory.d.ts.map +1 -0
  261. package/dist/project-skills/inventory.js +150 -0
  262. package/dist/project-skills/inventory.js.map +1 -0
  263. package/dist/project-skills/local-snapshot.d.ts +12 -0
  264. package/dist/project-skills/local-snapshot.d.ts.map +1 -0
  265. package/dist/project-skills/local-snapshot.js +66 -0
  266. package/dist/project-skills/local-snapshot.js.map +1 -0
  267. package/dist/project-skills/protocol.d.ts +31 -0
  268. package/dist/project-skills/protocol.d.ts.map +1 -0
  269. package/dist/project-skills/protocol.js +197 -0
  270. package/dist/project-skills/protocol.js.map +1 -0
  271. package/dist/project-skills/runtime-plugin.d.ts +66 -0
  272. package/dist/project-skills/runtime-plugin.d.ts.map +1 -0
  273. package/dist/project-skills/runtime-plugin.js +102 -0
  274. package/dist/project-skills/runtime-plugin.js.map +1 -0
  275. package/dist/project-skills/types.d.ts +63 -0
  276. package/dist/project-skills/types.d.ts.map +1 -0
  277. package/dist/project-skills/types.js +13 -0
  278. package/dist/project-skills/types.js.map +1 -0
  279. package/dist/recommend/types.d.ts +1 -1
  280. package/dist/recommend/types.js +1 -1
  281. package/dist/remix/auto-name.d.ts +24 -0
  282. package/dist/remix/auto-name.d.ts.map +1 -0
  283. package/dist/remix/auto-name.js +40 -0
  284. package/dist/remix/auto-name.js.map +1 -0
  285. package/dist/remix/index.d.ts +2 -0
  286. package/dist/remix/index.d.ts.map +1 -0
  287. package/dist/remix/index.js +2 -0
  288. package/dist/remix/index.js.map +1 -0
  289. package/dist/skill-evaluation.d.ts +152 -0
  290. package/dist/skill-evaluation.d.ts.map +1 -0
  291. package/dist/skill-evaluation.js +14 -0
  292. package/dist/skill-evaluation.js.map +1 -0
  293. package/dist/storage/cos.d.ts +11 -0
  294. package/dist/storage/cos.d.ts.map +1 -1
  295. package/dist/storage/cos.js +29 -0
  296. package/dist/storage/cos.js.map +1 -1
  297. package/package.json +29 -1
@@ -0,0 +1,176 @@
1
+ import { z } from 'zod';
2
+ import { isLocalWorkspaceGitAuthMode, workspaceGitAuthModeSchema, workspaceGitDirectAccessSchema } from './git-auth-mode.js';
3
+ import { workspaceDirectoryRegistrationSchema } from './workspace-directories.js';
4
+ /** Trusted control-plane registration; never merge this with a browser operation payload. */
5
+ const boundWorkspaceRegistrationSchema = z
6
+ .object({
7
+ workspaceId: z.string().uuid(),
8
+ projectId: z.string().uuid(),
9
+ targetKind: z.enum(['main', 'remix']),
10
+ remixId: z.string().uuid().nullable(),
11
+ repositoryUrl: z.string().min(1).max(2048),
12
+ branchName: z.string().min(1).max(512),
13
+ directories: z.array(workspaceDirectoryRegistrationSchema).optional(),
14
+ /** A batch may bind repository metadata while retaining the original local basic checkout. */
15
+ preserveLocalBasic: z.boolean().optional(),
16
+ /** Present only while the remix draft has not been pushed. Checkout creates the branch from this commit. */
17
+ pendingFork: z.object({
18
+ sourceBranchName: z.string().min(1).max(512),
19
+ sourceCommit: z.string().regex(/^[a-f0-9]{40,64}$/),
20
+ }).strict().optional(),
21
+ })
22
+ .strict()
23
+ .refine((value) => (value.targetKind === 'main') === (value.remixId === null));
24
+ export const workspaceRegistrationSchema = z.union([
25
+ boundWorkspaceRegistrationSchema,
26
+ z.object({
27
+ workspaceId: z.string().uuid(),
28
+ projectId: z.null(),
29
+ targetKind: z.literal('standalone'),
30
+ remixId: z.null(),
31
+ repositoryUrl: z.null(),
32
+ branchName: z.null(),
33
+ directories: z.array(workspaceDirectoryRegistrationSchema).optional(),
34
+ }).strict(),
35
+ ]);
36
+ /**
37
+ * Checkout instructions for an unpushed remix draft. Present only until that draft is pushed,
38
+ * so two registrations of the same workspace can differ here without being different bindings.
39
+ */
40
+ export function remixPendingFork(input) {
41
+ if (input.targetKind !== 'remix' || input.pushedAt != null)
42
+ return undefined;
43
+ if (typeof input.sourceBranchName !== 'string' || !input.sourceBranchName)
44
+ return undefined;
45
+ if (typeof input.sourceCommit !== 'string' || !input.sourceCommit)
46
+ return undefined;
47
+ return { sourceBranchName: input.sourceBranchName, sourceCommit: input.sourceCommit };
48
+ }
49
+ /** Identity of a workspace binding. `pendingFork` is excluded because it appears and disappears. */
50
+ export function sameWorkspaceRegistration(left, right) {
51
+ return (left.workspaceId === right.workspaceId &&
52
+ left.projectId === right.projectId &&
53
+ left.targetKind === right.targetKind &&
54
+ left.remixId === right.remixId &&
55
+ left.repositoryUrl === right.repositoryUrl &&
56
+ left.branchName === right.branchName &&
57
+ ('preserveLocalBasic' in left ? left.preserveLocalBasic : undefined) === ('preserveLocalBasic' in right ? right.preserveLocalBasic : undefined));
58
+ }
59
+ /** Ephemeral clone access, never part of a persisted Workspace binding or operation. */
60
+ export const workspaceGitAccessSchema = z
61
+ .object({
62
+ username: z
63
+ .string()
64
+ .min(1)
65
+ .max(256)
66
+ .regex(/^[^:\r\n\0]+$/),
67
+ password: z
68
+ .string()
69
+ .min(1)
70
+ .max(8192)
71
+ .regex(/^[^\r\n\0]+$/),
72
+ issuedAt: z.string().datetime(),
73
+ expiresAt: z.string().datetime(),
74
+ })
75
+ .strict()
76
+ .refine((value) => {
77
+ const lifetime = Date.parse(value.expiresAt) - Date.parse(value.issuedAt);
78
+ return lifetime > 0 && lifetime <= 15 * 60_000;
79
+ });
80
+ /** Controlled read entry. The canonical repository URL stays on the remote. */
81
+ export const workspaceGitTransportSchema = z
82
+ .object({
83
+ kind: z.enum(['git-read-gateway-v1', 'git-gateway-v2']),
84
+ cloneUrl: z.string().min(1).max(2048),
85
+ })
86
+ .strict();
87
+ const cloneWorkspacePreparationSchema = z
88
+ .object({
89
+ mode: z.literal('clone'),
90
+ authMode: workspaceGitAuthModeSchema.optional(),
91
+ directAccess: workspaceGitDirectAccessSchema.nullable().optional(),
92
+ gitAccess: workspaceGitAccessSchema.optional(),
93
+ transport: workspaceGitTransportSchema.optional(),
94
+ })
95
+ .strict()
96
+ .refine((value) => value.transport === undefined || value.gitAccess !== undefined)
97
+ .refine(value => isLocalWorkspaceGitAuthMode(value.authMode)
98
+ ? value.directAccess !== undefined && !value.gitAccess && !value.transport
99
+ : value.directAccess === undefined);
100
+ export const workspacePreparationSchema = z.union([
101
+ cloneWorkspacePreparationSchema,
102
+ z.object({ mode: z.literal('empty') }).strict(),
103
+ ]);
104
+ const LOOPBACK_HOSTS = new Set(['localhost', '127.0.0.1', '[::1]']);
105
+ export function parseWorkspaceGitGatewayOrigin(value) {
106
+ const url = new URL(value);
107
+ if (url.username ||
108
+ url.password ||
109
+ url.search ||
110
+ url.hash ||
111
+ (url.pathname !== '/' && url.pathname !== '') ||
112
+ (url.protocol !== 'https:' &&
113
+ !(url.protocol === 'http:' && LOOPBACK_HOSTS.has(url.hostname)))) {
114
+ throw new Error('invalid_git_gateway_origin');
115
+ }
116
+ return url.origin;
117
+ }
118
+ export function parseWorkspaceGitGatewayOrigins(value) {
119
+ if (!value?.trim())
120
+ return [];
121
+ return [
122
+ ...new Set(value
123
+ .split(',')
124
+ .map((item) => item.trim())
125
+ .filter(Boolean)
126
+ .map((item) => parseWorkspaceGitGatewayOrigin(item))),
127
+ ];
128
+ }
129
+ /** Proxy mode is rejected when no allowlisted origin is configured. */
130
+ export function matchWorkspaceGitGatewayCloneUrl(cloneUrl, allowedOrigins, repositoryUrl) {
131
+ if (allowedOrigins.length === 0)
132
+ return { ok: false, reason: 'capability_missing' };
133
+ let gateway;
134
+ let repository;
135
+ try {
136
+ gateway = new URL(cloneUrl);
137
+ repository = new URL(repositoryUrl);
138
+ }
139
+ catch {
140
+ return { ok: false, reason: 'rejected' };
141
+ }
142
+ const allowed = new Set();
143
+ for (const origin of allowedOrigins) {
144
+ try {
145
+ allowed.add(parseWorkspaceGitGatewayOrigin(origin));
146
+ }
147
+ catch {
148
+ return { ok: false, reason: 'rejected' };
149
+ }
150
+ }
151
+ const request = /^\/workspace-git\/([a-f0-9]{64}|v2\/[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12})$/.exec(gateway.pathname);
152
+ if (!request ||
153
+ gateway.username ||
154
+ gateway.password ||
155
+ gateway.search ||
156
+ gateway.hash ||
157
+ gateway.href !== `${gateway.origin}${gateway.pathname}` ||
158
+ gateway.origin === repository.origin ||
159
+ !allowed.has(gateway.origin) ||
160
+ (gateway.protocol !== 'https:' &&
161
+ !(gateway.protocol === 'http:' && LOOPBACK_HOSTS.has(gateway.hostname)))) {
162
+ return { ok: false, reason: 'rejected' };
163
+ }
164
+ return { ok: true, origin: gateway.origin, requestId: request[1] };
165
+ }
166
+ export const workspaceRegistrationRequestSchema = z
167
+ .object({
168
+ binding: workspaceRegistrationSchema,
169
+ generation: z.number().int().nonnegative(),
170
+ runtimeEpoch: z.number().int().nonnegative(),
171
+ leaseFence: z.number().int().nonnegative(),
172
+ preparation: workspacePreparationSchema.optional(),
173
+ cliCredentials: z.boolean().optional(),
174
+ })
175
+ .strict();
176
+ //# sourceMappingURL=workspace-binding.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workspace-binding.js","sourceRoot":"","sources":["../../../src/cloud-workspace/runtime/workspace-binding.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,44 @@
1
+ import { z } from 'zod';
2
+ /** Stable directory identities never contain a branch name or a relative path. */
3
+ export declare const workspaceDirectoryNameSchema: z.ZodString;
4
+ export type WorkspaceDirectoryName = z.infer<typeof workspaceDirectoryNameSchema>;
5
+ /** The workspace root is an orchestration session, never an engineering checkout. */
6
+ export declare const workspaceSessionScopeSchema: z.ZodUnion<readonly [z.ZodString, z.ZodLiteral<"root">]>;
7
+ export type WorkspaceSessionScope = z.infer<typeof workspaceSessionScopeSchema>;
8
+ export declare const workspaceDirectoryRegistrationSchema: z.ZodObject<{
9
+ workspaceId: z.ZodString;
10
+ directoryName: z.ZodString;
11
+ remixId: z.ZodNullable<z.ZodString>;
12
+ branchName: z.ZodString;
13
+ sourceCommit: z.ZodOptional<z.ZodString>;
14
+ status: z.ZodOptional<z.ZodEnum<{
15
+ pending: "pending";
16
+ failed: "failed";
17
+ ready: "ready";
18
+ reclaimed: "reclaimed";
19
+ }>>;
20
+ }, z.core.$strict>;
21
+ export type WorkspaceDirectoryRegistration = z.infer<typeof workspaceDirectoryRegistrationSchema>;
22
+ export declare const workspaceDiskAdmissionSchema: z.ZodObject<{
23
+ usagePercent: z.ZodNumber;
24
+ collectedAt: z.ZodString;
25
+ }, z.core.$strict>;
26
+ export declare function workspaceDiskAdmission(usagePercent: number): 'allowed' | 'warning' | 'paused';
27
+ /** Collected on demand; reclaimed checkouts retain identity without consuming local bytes. */
28
+ export declare const workspaceDirectoryStatsSchema: z.ZodObject<{
29
+ workspaceId: z.ZodString;
30
+ sizeBytes: z.ZodNumber;
31
+ lastUsedAt: z.ZodNullable<z.ZodString>;
32
+ directories: z.ZodArray<z.ZodObject<{
33
+ directoryName: z.ZodString;
34
+ sizeBytes: z.ZodNumber;
35
+ lastUsedAt: z.ZodNullable<z.ZodString>;
36
+ status: z.ZodEnum<{
37
+ present: "present";
38
+ reclaimed: "reclaimed";
39
+ missing: "missing";
40
+ }>;
41
+ }, z.core.$strict>>;
42
+ }, z.core.$strict>;
43
+ export type WorkspaceDirectoryStats = z.infer<typeof workspaceDirectoryStatsSchema>;
44
+ //# sourceMappingURL=workspace-directories.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workspace-directories.d.ts","sourceRoot":"","sources":["../../../src/cloud-workspace/runtime/workspace-directories.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,kFAAkF;AAClF,eAAO,MAAM,4BAA4B,aAAwE,CAAC;AAClH,MAAM,MAAM,sBAAsB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,4BAA4B,CAAC,CAAC;AAElF,qFAAqF;AACrF,eAAO,MAAM,2BAA2B,0DAA6D,CAAC;AACtG,MAAM,MAAM,qBAAqB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,2BAA2B,CAAC,CAAC;AAEhF,eAAO,MAAM,oCAAoC;;;;;;;;;;;;kBAOtC,CAAC;AACZ,MAAM,MAAM,8BAA8B,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oCAAoC,CAAC,CAAC;AAElG,eAAO,MAAM,4BAA4B;;;kBAG9B,CAAC;AAEZ,wBAAgB,sBAAsB,CAAC,YAAY,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS,GAAG,QAAQ,CAG7F;AAED,8FAA8F;AAC9F,eAAO,MAAM,6BAA6B;;;;;;;;;;;;;;kBAU/B,CAAC;AACZ,MAAM,MAAM,uBAAuB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,6BAA6B,CAAC,CAAC"}
@@ -0,0 +1,34 @@
1
+ import { z } from 'zod';
2
+ /** Stable directory identities never contain a branch name or a relative path. */
3
+ export const workspaceDirectoryNameSchema = z.string().max(80).regex(/^(?:basic|remix-[a-z0-9][a-z0-9-]{3,63})$/);
4
+ /** The workspace root is an orchestration session, never an engineering checkout. */
5
+ export const workspaceSessionScopeSchema = z.union([workspaceDirectoryNameSchema, z.literal('root')]);
6
+ export const workspaceDirectoryRegistrationSchema = z.object({
7
+ workspaceId: z.string().uuid(),
8
+ directoryName: workspaceDirectoryNameSchema,
9
+ remixId: z.string().uuid().nullable(),
10
+ branchName: z.string().trim().min(1).max(512),
11
+ sourceCommit: z.string().regex(/^(?:[a-f0-9]{40}|[a-f0-9]{64})$/).optional(),
12
+ status: z.enum(['pending', 'ready', 'reclaimed', 'failed']).optional(),
13
+ }).strict();
14
+ export const workspaceDiskAdmissionSchema = z.object({
15
+ usagePercent: z.number().finite().min(0).max(100),
16
+ collectedAt: z.string().datetime(),
17
+ }).strict();
18
+ export function workspaceDiskAdmission(usagePercent) {
19
+ const percent = workspaceDiskAdmissionSchema.shape.usagePercent.parse(usagePercent);
20
+ return percent >= 90 ? 'paused' : percent >= 70 ? 'warning' : 'allowed';
21
+ }
22
+ /** Collected on demand; reclaimed checkouts retain identity without consuming local bytes. */
23
+ export const workspaceDirectoryStatsSchema = z.object({
24
+ workspaceId: z.string().uuid(),
25
+ sizeBytes: z.number().int().nonnegative().safe(),
26
+ lastUsedAt: z.string().datetime().nullable(),
27
+ directories: z.array(z.object({
28
+ directoryName: workspaceDirectoryNameSchema,
29
+ sizeBytes: z.number().int().nonnegative().safe(),
30
+ lastUsedAt: z.string().datetime().nullable(),
31
+ status: z.enum(['present', 'reclaimed', 'missing']),
32
+ }).strict()),
33
+ }).strict();
34
+ //# sourceMappingURL=workspace-directories.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workspace-directories.js","sourceRoot":"","sources":["../../../src/cloud-workspace/runtime/workspace-directories.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,kFAAkF;AAClF,MAAM,CAAC,MAAM,4BAA4B,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,2CAA2C,CAAC,CAAC;AAGlH,qFAAqF;AACrF,MAAM,CAAC,MAAM,2BAA2B,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,4BAA4B,EAAE,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;AAGtG,MAAM,CAAC,MAAM,oCAAoC,GAAG,CAAC,CAAC,MAAM,CAAC;IAC3D,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE;IAC9B,aAAa,EAAE,4BAA4B;IAC3C,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,QAAQ,EAAE;IACrC,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC;IAC7C,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,iCAAiC,CAAC,CAAC,QAAQ,EAAE;IAC5E,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,OAAO,EAAE,WAAW,EAAE,QAAQ,CAAC,CAAC,CAAC,QAAQ,EAAE;CACvE,CAAC,CAAC,MAAM,EAAE,CAAC;AAGZ,MAAM,CAAC,MAAM,4BAA4B,GAAG,CAAC,CAAC,MAAM,CAAC;IACnD,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC;IACjD,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;CACnC,CAAC,CAAC,MAAM,EAAE,CAAC;AAEZ,MAAM,UAAU,sBAAsB,CAAC,YAAoB;IACzD,MAAM,OAAO,GAAG,4BAA4B,CAAC,KAAK,CAAC,YAAY,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;IACpF,OAAO,OAAO,IAAI,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC;AAC1E,CAAC;AAED,8FAA8F;AAC9F,MAAM,CAAC,MAAM,6BAA6B,GAAG,CAAC,CAAC,MAAM,CAAC;IACpD,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE;IAC9B,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE;IAChD,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE;IAC5C,WAAW,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC;QAC5B,aAAa,EAAE,4BAA4B;QAC3C,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE;QAChD,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE;QAC5C,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,WAAW,EAAE,SAAS,CAAC,CAAC;KACpD,CAAC,CAAC,MAAM,EAAE,CAAC;CACb,CAAC,CAAC,MAAM,EAAE,CAAC"}
@@ -0,0 +1,2 @@
1
+ export { eq, inArray } from 'drizzle-orm';
2
+ //# sourceMappingURL=operators.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"operators.d.ts","sourceRoot":"","sources":["../../src/database/operators.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC"}
@@ -0,0 +1,2 @@
1
+ export { eq, inArray } from 'drizzle-orm';
2
+ //# sourceMappingURL=operators.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"operators.js","sourceRoot":"","sources":["../../src/database/operators.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC"}
@@ -2,7 +2,7 @@
2
2
  // 现有 backend 已有自己的数据库初始化逻辑;common 这里提供一个可选 adapter,
3
3
  // 方便后续统一数据访问层。
4
4
  //
5
- // Pool 参数对齐 `packages/backend/src/core/database/index.ts`:
5
+ // Pool 参数对齐 `packages/backend-business-server/src/core/database/index.ts`:
6
6
  // - keepAlive:阻止云 LB (Load Balancer, 负载均衡) 静默 RST 空闲连接
7
7
  // - idleTimeoutMillis:Pool 自身主动回收空闲连接,远短于云 LB idle timeout
8
8
  // - statement_timeout / query_timeout:查询兜底,防止请求挂死
@@ -1 +1 @@
1
- {"version":3,"file":"postgres-adapter.js","sourceRoot":"","sources":["../../src/database/postgres-adapter.ts"],"names":[],"mappings":"AAAA,qBAAqB;AACrB,oDAAoD;AACpD,eAAe;AACf,EAAE;AACF,2DAA2D;AAC3D,uDAAuD;AACvD,2DAA2D;AAC3D,kDAAkD;AAElD,OAAO,EAAE,OAAO,EAAE,MAAM,2BAA2B,CAAC;AACpD,OAAO,EAAE,IAAI,EAAE,MAAM,IAAI,CAAC;AAO1B,MAAM,UAAU,qBAAqB,CAAC,gBAAwB;IAC5D,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC;QACpB,gBAAgB;QAChB,GAAG,EAAE,EAAE;QACP,iBAAiB,EAAE,MAAM;QACzB,uBAAuB,EAAE,MAAM;QAC/B,SAAS,EAAE,IAAI;QACf,2BAA2B,EAAE,MAAM;QACnC,iBAAiB,EAAE,MAAM;QACzB,aAAa,EAAE,MAAM;KACtB,CAAC,CAAC;IACH,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACzB,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC;AACtB,CAAC"}
1
+ {"version":3,"file":"postgres-adapter.js","sourceRoot":"","sources":["../../src/database/postgres-adapter.ts"],"names":[],"mappings":"AAAA,qBAAqB;AACrB,oDAAoD;AACpD,eAAe;AACf,EAAE;AACF,2EAA2E;AAC3E,uDAAuD;AACvD,2DAA2D;AAC3D,kDAAkD;AAElD,OAAO,EAAE,OAAO,EAAE,MAAM,2BAA2B,CAAC;AACpD,OAAO,EAAE,IAAI,EAAE,MAAM,IAAI,CAAC;AAO1B,MAAM,UAAU,qBAAqB,CAAC,gBAAwB;IAC5D,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC;QACpB,gBAAgB;QAChB,GAAG,EAAE,EAAE;QACP,iBAAiB,EAAE,MAAM;QACzB,uBAAuB,EAAE,MAAM;QAC/B,SAAS,EAAE,IAAI;QACf,2BAA2B,EAAE,MAAM;QACnC,iBAAiB,EAAE,MAAM;QACzB,aAAa,EAAE,MAAM;KACtB,CAAC,CAAC;IACH,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACzB,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC;AACtB,CAAC"}
@@ -2,7 +2,7 @@
2
2
  * SQLite Schema for CLI Offline Mode
3
3
  *
4
4
  * ⚠️ 重要提示:
5
- * 此 schema 是 packages/backend/src/core/database/schema.ts(PostgreSQL)的简化版本。
5
+ * 此 schema 是 packages/backend-business-server/src/core/database/schema.ts(PostgreSQL)的简化版本。
6
6
  * 主要字段需要与 backend schema 保持同步,以确保项目导入/导出的兼容性。
7
7
  *
8
8
  * 主要差异:
@@ -3,7 +3,7 @@ import { sqliteTable, text, integer } from 'drizzle-orm/sqlite-core';
3
3
  * SQLite Schema for CLI Offline Mode
4
4
  *
5
5
  * ⚠️ 重要提示:
6
- * 此 schema 是 packages/backend/src/core/database/schema.ts(PostgreSQL)的简化版本。
6
+ * 此 schema 是 packages/backend-business-server/src/core/database/schema.ts(PostgreSQL)的简化版本。
7
7
  * 主要字段需要与 backend schema 保持同步,以确保项目导入/导出的兼容性。
8
8
  *
9
9
  * 主要差异:
@@ -0,0 +1,26 @@
1
+ /** Values accepted by the internal model transport; executable code never crosses it. */
2
+ export type ModelWireValue = null | boolean | number | string | ModelWireValue[] | {
3
+ [key: string]: ModelWireValue;
4
+ };
5
+ type WireHooks = {
6
+ callback?: (fn: (...args: unknown[]) => unknown) => string;
7
+ onCallback?: (id: string, args: unknown[]) => unknown;
8
+ signal?: AbortSignal;
9
+ onSignal?: (signal: AbortSignal) => void;
10
+ };
11
+ export declare function encodeModelValue(value: unknown, hooks?: WireHooks): ModelWireValue;
12
+ export declare function decodeModelValue(value: ModelWireValue, hooks?: WireHooks): unknown;
13
+ export type ModelOperationEvent = {
14
+ type: 'callback';
15
+ id: string;
16
+ args: ModelWireValue;
17
+ } | {
18
+ type: 'result';
19
+ value: ModelWireValue;
20
+ } | {
21
+ type: 'error';
22
+ status: number;
23
+ code: string;
24
+ };
25
+ export {};
26
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/model-proxy/index.ts"],"names":[],"mappings":"AAAA,yFAAyF;AACzF,MAAM,MAAM,cAAc,GAAG,IAAI,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,cAAc,EAAE,GAAG;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,cAAc,CAAA;CAAE,CAAC;AACrH,KAAK,SAAS,GAAG;IACf,QAAQ,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,OAAO,KAAK,MAAM,CAAC;IAC3D,UAAU,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,OAAO,CAAC;IACtD,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,WAAW,KAAK,IAAI,CAAC;CAC1C,CAAC;AAGF,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,GAAE,SAAc,GAAG,cAAc,CA6BtF;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,cAAc,EAAE,KAAK,GAAE,SAAc,GAAG,OAAO,CA6BtF;AAED,MAAM,MAAM,mBAAmB,GAC3B;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,cAAc,CAAA;CAAE,GACtD;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,KAAK,EAAE,cAAc,CAAA;CAAE,GACzC;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC"}
@@ -0,0 +1,81 @@
1
+ const marker = '__playcraft_model_wire_v1__';
2
+ export function encodeModelValue(value, hooks = {}) {
3
+ if (value === undefined)
4
+ return { [marker]: 'undefined' };
5
+ if (value === null || typeof value === 'string' || typeof value === 'boolean')
6
+ return value;
7
+ if (typeof value === 'number') {
8
+ if (!Number.isFinite(value))
9
+ throw new Error('invalid_model_transport_number');
10
+ return value;
11
+ }
12
+ if (typeof value === 'function') {
13
+ if (!hooks.callback)
14
+ throw new Error('model_transport_callback_not_allowed');
15
+ return { [marker]: 'callback', id: hooks.callback(value) };
16
+ }
17
+ if (value instanceof AbortSignal) {
18
+ hooks.onSignal?.(value);
19
+ return { [marker]: 'signal' };
20
+ }
21
+ if (value instanceof Date)
22
+ return { [marker]: 'date', value: value.toISOString() };
23
+ if (value instanceof URL)
24
+ return { [marker]: 'url', value: value.toString() };
25
+ if (value instanceof Error)
26
+ return { [marker]: 'error', name: value.name, message: value.message.slice(0, 2000) };
27
+ if (Buffer.isBuffer(value))
28
+ return { [marker]: 'buffer', value: value.toString('base64') };
29
+ if (value instanceof Uint8Array)
30
+ return { [marker]: 'bytes', value: Buffer.from(value).toString('base64') };
31
+ if (Array.isArray(value))
32
+ return value.map((item) => encodeModelValue(item, hooks));
33
+ if (typeof value !== 'object')
34
+ throw new Error('invalid_model_transport_value');
35
+ const result = {};
36
+ for (const [key, item] of Object.entries(value)) {
37
+ if (key === marker || key === '__proto__' || key === 'constructor' || key === 'prototype')
38
+ throw new Error('invalid_model_transport_key');
39
+ result[key] = encodeModelValue(item, hooks);
40
+ }
41
+ return result;
42
+ }
43
+ export function decodeModelValue(value, hooks = {}) {
44
+ if (value === null || typeof value !== 'object')
45
+ return value;
46
+ if (Array.isArray(value))
47
+ return value.map((item) => decodeModelValue(item, hooks));
48
+ if (marker in value) {
49
+ const kind = value[marker];
50
+ if (kind === 'undefined')
51
+ return undefined;
52
+ if (kind === 'signal')
53
+ return hooks.signal;
54
+ if (kind === 'callback' && typeof value.id === 'string' && hooks.onCallback)
55
+ return (...args) => hooks.onCallback(value.id, args);
56
+ if (kind === 'error' && typeof value.name === 'string' && typeof value.message === 'string') {
57
+ const error = new Error(value.message);
58
+ error.name = value.name;
59
+ return error;
60
+ }
61
+ if (typeof value.value === 'string') {
62
+ if (kind === 'buffer')
63
+ return Buffer.from(value.value, 'base64');
64
+ if (kind === 'bytes')
65
+ return Uint8Array.from(Buffer.from(value.value, 'base64'));
66
+ if (kind === 'date')
67
+ return new Date(value.value);
68
+ if (kind === 'url')
69
+ return new URL(value.value);
70
+ }
71
+ throw new Error('invalid_model_transport_tag');
72
+ }
73
+ const result = {};
74
+ for (const [key, item] of Object.entries(value)) {
75
+ if (key === '__proto__' || key === 'constructor' || key === 'prototype')
76
+ throw new Error('invalid_model_transport_key');
77
+ result[key] = decodeModelValue(item, hooks);
78
+ }
79
+ return result;
80
+ }
81
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/model-proxy/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ type SkillRegistryValidationIssue = {
2
+ severity: 'error' | 'warning';
3
+ code: 'bundle_too_large' | 'invalid_manifest' | 'unsafe_archive_entry' | 'unsupported_file' | 'duplicate_path';
4
+ message: string;
5
+ path?: string;
6
+ };
7
+ export type SkillBundleFile = {
8
+ path: string;
9
+ data: Buffer;
10
+ };
11
+ export declare function createCanonicalBundleArchive(files: readonly SkillBundleFile[]): Buffer;
12
+ export type BundleArchiveExtractionOptions = {
13
+ maxArchiveBytes?: number;
14
+ maxExpandedBytes?: number;
15
+ };
16
+ export declare function extractBundleArchive(archive: Buffer, options?: BundleArchiveExtractionOptions): {
17
+ files: SkillBundleFile[];
18
+ issues: SkillRegistryValidationIssue[];
19
+ };
20
+ export {};
21
+ //# sourceMappingURL=bundle-archive.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bundle-archive.d.ts","sourceRoot":"","sources":["../../src/project-skills/bundle-archive.ts"],"names":[],"mappings":"AAEA,KAAK,4BAA4B,GAAG;IAAE,QAAQ,EAAE,OAAO,GAAG,SAAS,CAAC;IAAC,IAAI,EAAE,kBAAkB,GAAG,kBAAkB,GAAG,sBAAsB,GAAG,kBAAkB,GAAG,gBAAgB,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAMtN,MAAM,MAAM,eAAe,GAAG;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd,CAAC;AAEF,wBAAgB,4BAA4B,CAAC,KAAK,EAAE,SAAS,eAAe,EAAE,GAAG,MAAM,CAetF;AAED,MAAM,MAAM,8BAA8B,GAAG;IAC3C,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B,CAAC;AAEF,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,GAAE,8BAAmC,GAAG;IACnG,KAAK,EAAE,eAAe,EAAE,CAAC;IACzB,MAAM,EAAE,4BAA4B,EAAE,CAAC;CACxC,CAyEA"}
@@ -0,0 +1,165 @@
1
+ import { gunzipSync, gzipSync } from 'node:zlib';
2
+ import { normalizeBundlePath } from './bundle-path.js';
3
+ const TAR_BLOCK_SIZE = 512;
4
+ const DEFAULT_MAX_ARCHIVE_BYTES = 64 * 1024 * 1024;
5
+ const DEFAULT_MAX_EXPANDED_BYTES = 72 * 1024 * 1024;
6
+ export function createCanonicalBundleArchive(files) {
7
+ const sorted = [...files].sort((left, right) => left.path.localeCompare(right.path));
8
+ const entries = sorted.map((file) => {
9
+ const path = normalizeBundlePath(file.path);
10
+ if (!path)
11
+ throw new Error(`Cannot archive an unsafe bundle path: ${file.path}`);
12
+ const { name, prefix } = splitTarPath(path);
13
+ const header = createTarHeader(name, prefix, file.data.length);
14
+ const padding = Buffer.alloc(paddedLength(file.data.length) - file.data.length);
15
+ return Buffer.concat([header, file.data, padding]);
16
+ });
17
+ const archive = gzipSync(Buffer.concat([...entries, Buffer.alloc(TAR_BLOCK_SIZE * 2)]));
18
+ // zlib writes the host operating system into the gzip header (macOS=19, Linux=3).
19
+ // Preserve the established Linux artifact format on every build host.
20
+ archive[9] = 3;
21
+ return archive;
22
+ }
23
+ export function extractBundleArchive(archive, options = {}) {
24
+ const issues = [];
25
+ const maxArchiveBytes = options.maxArchiveBytes ?? DEFAULT_MAX_ARCHIVE_BYTES;
26
+ const maxExpandedBytes = options.maxExpandedBytes ?? DEFAULT_MAX_EXPANDED_BYTES;
27
+ if (archive.length > maxArchiveBytes) {
28
+ return {
29
+ files: [],
30
+ issues: [{ severity: 'error', code: 'bundle_too_large', message: `The compressed bundle exceeds ${maxArchiveBytes} bytes.` }],
31
+ };
32
+ }
33
+ let contents;
34
+ try {
35
+ contents = gunzipSync(archive, { maxOutputLength: maxExpandedBytes });
36
+ }
37
+ catch {
38
+ return {
39
+ files: [],
40
+ issues: [{ severity: 'error', code: 'invalid_manifest', message: 'The bundle is not a valid gzip archive.' }],
41
+ };
42
+ }
43
+ const files = [];
44
+ const seen = new Set();
45
+ let offset = 0;
46
+ while (offset + TAR_BLOCK_SIZE <= contents.length) {
47
+ const header = contents.subarray(offset, offset + TAR_BLOCK_SIZE);
48
+ if (header.every((byte) => byte === 0))
49
+ break;
50
+ const parsed = parseTarHeader(header);
51
+ if (!parsed) {
52
+ issues.push({ severity: 'error', code: 'unsafe_archive_entry', message: 'The bundle contains an invalid tar entry.' });
53
+ break;
54
+ }
55
+ const path = normalizeBundlePath(parsed.path);
56
+ if (!path) {
57
+ issues.push({ severity: 'error', code: 'unsafe_archive_entry', message: `The bundle contains an unsafe tar path: ${parsed.path}` });
58
+ break;
59
+ }
60
+ if (parsed.type !== '0' && parsed.type !== '') {
61
+ issues.push({
62
+ severity: 'error',
63
+ code: 'unsafe_archive_entry',
64
+ message: `The bundle contains a non-regular tar entry: ${path}`,
65
+ path,
66
+ });
67
+ break;
68
+ }
69
+ if ((parsed.mode & 0o111) !== 0) {
70
+ issues.push({
71
+ severity: 'error',
72
+ code: 'unsupported_file',
73
+ message: `The bundle contains an executable tar entry: ${path}`,
74
+ path,
75
+ });
76
+ break;
77
+ }
78
+ const contentStart = offset + TAR_BLOCK_SIZE;
79
+ const contentEnd = contentStart + parsed.size;
80
+ if (parsed.size < 0 || contentEnd > contents.length) {
81
+ issues.push({ severity: 'error', code: 'unsafe_archive_entry', message: `The bundle entry is truncated: ${path}`, path });
82
+ break;
83
+ }
84
+ if (seen.has(path)) {
85
+ issues.push({ severity: 'error', code: 'duplicate_path', message: `The bundle contains a duplicate path: ${path}`, path });
86
+ break;
87
+ }
88
+ seen.add(path);
89
+ files.push({ path, data: Buffer.from(contents.subarray(contentStart, contentEnd)) });
90
+ offset = contentStart + paddedLength(parsed.size);
91
+ }
92
+ if (!issues.length && offset < contents.length && !contents.subarray(offset).every((byte) => byte === 0)) {
93
+ issues.push({ severity: 'error', code: 'unsafe_archive_entry', message: 'The bundle has trailing non-tar data.' });
94
+ }
95
+ return { files, issues };
96
+ }
97
+ function createTarHeader(name, prefix, size) {
98
+ const header = Buffer.alloc(TAR_BLOCK_SIZE);
99
+ writeString(header, 0, 100, name);
100
+ writeOctal(header, 100, 8, 0o644);
101
+ writeOctal(header, 108, 8, 0);
102
+ writeOctal(header, 116, 8, 0);
103
+ writeOctal(header, 124, 12, size);
104
+ writeOctal(header, 136, 12, 0);
105
+ header.fill(0x20, 148, 156);
106
+ writeString(header, 156, 1, '0');
107
+ writeString(header, 257, 6, 'ustar\0');
108
+ writeString(header, 263, 2, '00');
109
+ writeString(header, 345, 155, prefix);
110
+ const checksum = header.reduce((total, value) => total + value, 0);
111
+ const checksumValue = `${checksum.toString(8).padStart(6, '0')}\0 `;
112
+ writeString(header, 148, 8, checksumValue);
113
+ return header;
114
+ }
115
+ function parseTarHeader(header) {
116
+ const expectedChecksum = readOctal(header, 148, 8);
117
+ const checksumHeader = Buffer.from(header);
118
+ checksumHeader.fill(0x20, 148, 156);
119
+ const actualChecksum = checksumHeader.reduce((total, value) => total + value, 0);
120
+ const name = readString(header, 0, 100);
121
+ const prefix = readString(header, 345, 155);
122
+ const path = prefix ? `${prefix}/${name}` : name;
123
+ const size = readOctal(header, 124, 12);
124
+ const mode = readOctal(header, 100, 8);
125
+ const type = readString(header, 156, 1);
126
+ if (expectedChecksum === null || expectedChecksum !== actualChecksum || size === null || mode === null || !path)
127
+ return null;
128
+ return { path, size, mode, type };
129
+ }
130
+ function splitTarPath(path) {
131
+ if (Buffer.byteLength(path) <= 100)
132
+ return { name: path, prefix: '' };
133
+ const slash = path.lastIndexOf('/');
134
+ if (slash <= 0)
135
+ throw new Error(`Bundle path is too long for a tar archive: ${path}`);
136
+ const prefix = path.slice(0, slash);
137
+ const name = path.slice(slash + 1);
138
+ if (Buffer.byteLength(prefix) > 155 || Buffer.byteLength(name) > 100) {
139
+ throw new Error(`Bundle path is too long for a tar archive: ${path}`);
140
+ }
141
+ return { name, prefix };
142
+ }
143
+ function writeString(buffer, offset, length, value) {
144
+ const encoded = Buffer.from(value);
145
+ if (encoded.length > length)
146
+ throw new Error(`Tar header value exceeds ${length} bytes.`);
147
+ encoded.copy(buffer, offset);
148
+ }
149
+ function writeOctal(buffer, offset, length, value) {
150
+ const encoded = `${value.toString(8).padStart(length - 1, '0')}\0`;
151
+ writeString(buffer, offset, length, encoded);
152
+ }
153
+ function readString(buffer, offset, length) {
154
+ return buffer.subarray(offset, offset + length).toString('utf8').replace(/\0.*$/, '').trim();
155
+ }
156
+ function readOctal(buffer, offset, length) {
157
+ const value = readString(buffer, offset, length);
158
+ if (!value)
159
+ return 0;
160
+ return /^[0-7]+$/.test(value) ? Number.parseInt(value, 8) : null;
161
+ }
162
+ function paddedLength(length) {
163
+ return Math.ceil(length / TAR_BLOCK_SIZE) * TAR_BLOCK_SIZE;
164
+ }
165
+ //# sourceMappingURL=bundle-archive.js.map