@playcraft/common 0.0.56 → 0.0.58

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 (252) hide show
  1. package/README.md +1 -1
  2. package/dist/agent/gamepilot.d.ts +17 -0
  3. package/dist/agent/gamepilot.d.ts.map +1 -0
  4. package/dist/agent/gamepilot.js +37 -0
  5. package/dist/agent/gamepilot.js.map +1 -0
  6. package/dist/agent/index.d.ts +2 -0
  7. package/dist/agent/index.d.ts.map +1 -1
  8. package/dist/agent/index.js +2 -0
  9. package/dist/agent/index.js.map +1 -1
  10. package/dist/agent/openai-responses-api.d.ts +30 -0
  11. package/dist/agent/openai-responses-api.d.ts.map +1 -0
  12. package/dist/agent/openai-responses-api.js +58 -0
  13. package/dist/agent/openai-responses-api.js.map +1 -0
  14. package/dist/agent/runtime-failure.d.ts +3 -1
  15. package/dist/agent/runtime-failure.d.ts.map +1 -1
  16. package/dist/agent/runtime-failure.js +6 -1
  17. package/dist/agent/runtime-failure.js.map +1 -1
  18. package/dist/agent/session-title.d.ts +1 -1
  19. package/dist/agent/session-title.js +1 -1
  20. package/dist/agent-messages/db-message-converter.d.ts +12 -0
  21. package/dist/agent-messages/db-message-converter.d.ts.map +1 -1
  22. package/dist/agent-messages/db-message-converter.js +28 -0
  23. package/dist/agent-messages/db-message-converter.js.map +1 -1
  24. package/dist/agent-messages/runtime-user-messages.d.ts +3 -0
  25. package/dist/agent-messages/runtime-user-messages.d.ts.map +1 -1
  26. package/dist/agent-messages/runtime-user-messages.js +36 -2
  27. package/dist/agent-messages/runtime-user-messages.js.map +1 -1
  28. package/dist/agent-tools/index.d.ts +1 -0
  29. package/dist/agent-tools/index.d.ts.map +1 -1
  30. package/dist/agent-tools/index.js +1 -0
  31. package/dist/agent-tools/index.js.map +1 -1
  32. package/dist/agent-tools/operation-protocol.d.ts +10 -0
  33. package/dist/agent-tools/operation-protocol.d.ts.map +1 -0
  34. package/dist/agent-tools/operation-protocol.js +13 -0
  35. package/dist/agent-tools/operation-protocol.js.map +1 -0
  36. package/dist/agent-tools/types.d.ts +1 -1
  37. package/dist/agent-tools/types.d.ts.map +1 -1
  38. package/dist/agent-tools/types.js +8 -1
  39. package/dist/agent-tools/types.js.map +1 -1
  40. package/dist/auth/index.d.ts +2 -0
  41. package/dist/auth/index.d.ts.map +1 -1
  42. package/dist/auth/index.js +2 -0
  43. package/dist/auth/index.js.map +1 -1
  44. package/dist/auth/jwt.d.ts.map +1 -1
  45. package/dist/auth/jwt.js +2 -7
  46. package/dist/auth/jwt.js.map +1 -1
  47. package/dist/auth/project-access-checker.d.ts +42 -0
  48. package/dist/auth/project-access-checker.d.ts.map +1 -0
  49. package/dist/auth/project-access-checker.js +81 -0
  50. package/dist/auth/project-access-checker.js.map +1 -0
  51. package/dist/auth/resolve-secret.d.ts +18 -0
  52. package/dist/auth/resolve-secret.d.ts.map +1 -0
  53. package/dist/auth/resolve-secret.js +33 -0
  54. package/dist/auth/resolve-secret.js.map +1 -0
  55. package/dist/auth/signature.d.ts +6 -1
  56. package/dist/auth/signature.d.ts.map +1 -1
  57. package/dist/auth/signature.js +8 -3
  58. package/dist/auth/signature.js.map +1 -1
  59. package/dist/cloud-workspace/runtime/agent-chat-flush.d.ts +57 -0
  60. package/dist/cloud-workspace/runtime/agent-chat-flush.d.ts.map +1 -0
  61. package/dist/cloud-workspace/runtime/agent-chat-flush.js +55 -0
  62. package/dist/cloud-workspace/runtime/agent-chat-flush.js.map +1 -0
  63. package/dist/cloud-workspace/runtime/agent-codebuddy.d.ts +266 -0
  64. package/dist/cloud-workspace/runtime/agent-codebuddy.d.ts.map +1 -0
  65. package/dist/cloud-workspace/runtime/agent-codebuddy.js +189 -0
  66. package/dist/cloud-workspace/runtime/agent-codebuddy.js.map +1 -0
  67. package/dist/cloud-workspace/runtime/agent-command.d.ts +130 -0
  68. package/dist/cloud-workspace/runtime/agent-command.d.ts.map +1 -0
  69. package/dist/cloud-workspace/runtime/agent-command.js +75 -0
  70. package/dist/cloud-workspace/runtime/agent-command.js.map +1 -0
  71. package/dist/cloud-workspace/runtime/agent-connection.d.ts +76 -0
  72. package/dist/cloud-workspace/runtime/agent-connection.d.ts.map +1 -0
  73. package/dist/cloud-workspace/runtime/agent-connection.js +59 -0
  74. package/dist/cloud-workspace/runtime/agent-connection.js.map +1 -0
  75. package/dist/cloud-workspace/runtime/agent-lifecycle.d.ts +85 -0
  76. package/dist/cloud-workspace/runtime/agent-lifecycle.d.ts.map +1 -0
  77. package/dist/cloud-workspace/runtime/agent-lifecycle.js +70 -0
  78. package/dist/cloud-workspace/runtime/agent-lifecycle.js.map +1 -0
  79. package/dist/cloud-workspace/runtime/agent-mutation.d.ts +197 -0
  80. package/dist/cloud-workspace/runtime/agent-mutation.d.ts.map +1 -0
  81. package/dist/cloud-workspace/runtime/agent-mutation.js +114 -0
  82. package/dist/cloud-workspace/runtime/agent-mutation.js.map +1 -0
  83. package/dist/cloud-workspace/runtime/agent-opencode-gateway.d.ts +156 -0
  84. package/dist/cloud-workspace/runtime/agent-opencode-gateway.d.ts.map +1 -0
  85. package/dist/cloud-workspace/runtime/agent-opencode-gateway.js +141 -0
  86. package/dist/cloud-workspace/runtime/agent-opencode-gateway.js.map +1 -0
  87. package/dist/cloud-workspace/runtime/agent-opencode.d.ts +240 -0
  88. package/dist/cloud-workspace/runtime/agent-opencode.d.ts.map +1 -0
  89. package/dist/cloud-workspace/runtime/agent-opencode.js +176 -0
  90. package/dist/cloud-workspace/runtime/agent-opencode.js.map +1 -0
  91. package/dist/cloud-workspace/runtime/agent-promotion.d.ts +20 -0
  92. package/dist/cloud-workspace/runtime/agent-promotion.d.ts.map +1 -0
  93. package/dist/cloud-workspace/runtime/agent-promotion.js +19 -0
  94. package/dist/cloud-workspace/runtime/agent-promotion.js.map +1 -0
  95. package/dist/cloud-workspace/runtime/agent-read.d.ts +343 -0
  96. package/dist/cloud-workspace/runtime/agent-read.d.ts.map +1 -0
  97. package/dist/cloud-workspace/runtime/agent-read.js +159 -0
  98. package/dist/cloud-workspace/runtime/agent-read.js.map +1 -0
  99. package/dist/cloud-workspace/runtime/agent-tool-claim.d.ts +18 -0
  100. package/dist/cloud-workspace/runtime/agent-tool-claim.d.ts.map +1 -0
  101. package/dist/cloud-workspace/runtime/agent-tool-claim.js +16 -0
  102. package/dist/cloud-workspace/runtime/agent-tool-claim.js.map +1 -0
  103. package/dist/cloud-workspace/runtime/capabilities.d.ts +40 -0
  104. package/dist/cloud-workspace/runtime/capabilities.d.ts.map +1 -0
  105. package/dist/cloud-workspace/runtime/capabilities.js +53 -0
  106. package/dist/cloud-workspace/runtime/capabilities.js.map +1 -0
  107. package/dist/cloud-workspace/runtime/checkpoints.d.ts +60 -0
  108. package/dist/cloud-workspace/runtime/checkpoints.d.ts.map +1 -0
  109. package/dist/cloud-workspace/runtime/checkpoints.js +33 -0
  110. package/dist/cloud-workspace/runtime/checkpoints.js.map +1 -0
  111. package/dist/cloud-workspace/runtime/config.d.ts +42 -0
  112. package/dist/cloud-workspace/runtime/config.d.ts.map +1 -0
  113. package/dist/cloud-workspace/runtime/config.js +89 -0
  114. package/dist/cloud-workspace/runtime/config.js.map +1 -0
  115. package/dist/cloud-workspace/runtime/errors.d.ts +26 -0
  116. package/dist/cloud-workspace/runtime/errors.d.ts.map +1 -0
  117. package/dist/cloud-workspace/runtime/errors.js +40 -0
  118. package/dist/cloud-workspace/runtime/errors.js.map +1 -0
  119. package/dist/cloud-workspace/runtime/events.d.ts +107 -0
  120. package/dist/cloud-workspace/runtime/events.d.ts.map +1 -0
  121. package/dist/cloud-workspace/runtime/events.js +70 -0
  122. package/dist/cloud-workspace/runtime/events.js.map +1 -0
  123. package/dist/cloud-workspace/runtime/execution-grant.d.ts +36 -0
  124. package/dist/cloud-workspace/runtime/execution-grant.d.ts.map +1 -0
  125. package/dist/cloud-workspace/runtime/execution-grant.js +102 -0
  126. package/dist/cloud-workspace/runtime/execution-grant.js.map +1 -0
  127. package/dist/cloud-workspace/runtime/file-snapshot.d.ts +62 -0
  128. package/dist/cloud-workspace/runtime/file-snapshot.d.ts.map +1 -0
  129. package/dist/cloud-workspace/runtime/file-snapshot.js +147 -0
  130. package/dist/cloud-workspace/runtime/file-snapshot.js.map +1 -0
  131. package/dist/cloud-workspace/runtime/files.d.ts +58 -0
  132. package/dist/cloud-workspace/runtime/files.d.ts.map +1 -0
  133. package/dist/cloud-workspace/runtime/files.js +78 -0
  134. package/dist/cloud-workspace/runtime/files.js.map +1 -0
  135. package/dist/cloud-workspace/runtime/generations.d.ts +18 -0
  136. package/dist/cloud-workspace/runtime/generations.d.ts.map +1 -0
  137. package/dist/cloud-workspace/runtime/generations.js +39 -0
  138. package/dist/cloud-workspace/runtime/generations.js.map +1 -0
  139. package/dist/cloud-workspace/runtime/git.d.ts +46 -0
  140. package/dist/cloud-workspace/runtime/git.d.ts.map +1 -0
  141. package/dist/cloud-workspace/runtime/git.js +44 -0
  142. package/dist/cloud-workspace/runtime/git.js.map +1 -0
  143. package/dist/cloud-workspace/runtime/handshake.d.ts +47 -0
  144. package/dist/cloud-workspace/runtime/handshake.d.ts.map +1 -0
  145. package/dist/cloud-workspace/runtime/handshake.js +31 -0
  146. package/dist/cloud-workspace/runtime/handshake.js.map +1 -0
  147. package/dist/cloud-workspace/runtime/http-object-store.d.ts +15 -0
  148. package/dist/cloud-workspace/runtime/http-object-store.d.ts.map +1 -0
  149. package/dist/cloud-workspace/runtime/http-object-store.js +108 -0
  150. package/dist/cloud-workspace/runtime/http-object-store.js.map +1 -0
  151. package/dist/cloud-workspace/runtime/index.d.ts +32 -0
  152. package/dist/cloud-workspace/runtime/index.d.ts.map +1 -0
  153. package/dist/cloud-workspace/runtime/index.js +32 -0
  154. package/dist/cloud-workspace/runtime/index.js.map +1 -0
  155. package/dist/cloud-workspace/runtime/instance-rebuild.d.ts +59 -0
  156. package/dist/cloud-workspace/runtime/instance-rebuild.d.ts.map +1 -0
  157. package/dist/cloud-workspace/runtime/instance-rebuild.js +51 -0
  158. package/dist/cloud-workspace/runtime/instance-rebuild.js.map +1 -0
  159. package/dist/cloud-workspace/runtime/operations.d.ts +142 -0
  160. package/dist/cloud-workspace/runtime/operations.d.ts.map +1 -0
  161. package/dist/cloud-workspace/runtime/operations.js +134 -0
  162. package/dist/cloud-workspace/runtime/operations.js.map +1 -0
  163. package/dist/cloud-workspace/runtime/parameters.d.ts +38 -0
  164. package/dist/cloud-workspace/runtime/parameters.d.ts.map +1 -0
  165. package/dist/cloud-workspace/runtime/parameters.js +75 -0
  166. package/dist/cloud-workspace/runtime/parameters.js.map +1 -0
  167. package/dist/cloud-workspace/runtime/project-native-skills.d.ts +40 -0
  168. package/dist/cloud-workspace/runtime/project-native-skills.d.ts.map +1 -0
  169. package/dist/cloud-workspace/runtime/project-native-skills.js +45 -0
  170. package/dist/cloud-workspace/runtime/project-native-skills.js.map +1 -0
  171. package/dist/cloud-workspace/runtime/protocol.d.ts +23 -0
  172. package/dist/cloud-workspace/runtime/protocol.d.ts.map +1 -0
  173. package/dist/cloud-workspace/runtime/protocol.js +30 -0
  174. package/dist/cloud-workspace/runtime/protocol.js.map +1 -0
  175. package/dist/cloud-workspace/runtime/resource-grant.d.ts +54 -0
  176. package/dist/cloud-workspace/runtime/resource-grant.d.ts.map +1 -0
  177. package/dist/cloud-workspace/runtime/resource-grant.js +80 -0
  178. package/dist/cloud-workspace/runtime/resource-grant.js.map +1 -0
  179. package/dist/cloud-workspace/runtime/terminals.d.ts +52 -0
  180. package/dist/cloud-workspace/runtime/terminals.d.ts.map +1 -0
  181. package/dist/cloud-workspace/runtime/terminals.js +62 -0
  182. package/dist/cloud-workspace/runtime/terminals.js.map +1 -0
  183. package/dist/cloud-workspace/runtime/variant-workspace.d.ts +221 -0
  184. package/dist/cloud-workspace/runtime/variant-workspace.d.ts.map +1 -0
  185. package/dist/cloud-workspace/runtime/variant-workspace.js +75 -0
  186. package/dist/cloud-workspace/runtime/variant-workspace.js.map +1 -0
  187. package/dist/cloud-workspace/runtime/workspace-binding.d.ts +84 -0
  188. package/dist/cloud-workspace/runtime/workspace-binding.d.ts.map +1 -0
  189. package/dist/cloud-workspace/runtime/workspace-binding.js +121 -0
  190. package/dist/cloud-workspace/runtime/workspace-binding.js.map +1 -0
  191. package/dist/database/postgres-adapter.js +1 -1
  192. package/dist/database/postgres-adapter.js.map +1 -1
  193. package/dist/database/schema.d.ts +1 -1
  194. package/dist/database/schema.js +1 -1
  195. package/dist/messenger/server.d.ts +14 -1
  196. package/dist/messenger/server.d.ts.map +1 -1
  197. package/dist/messenger/server.js +5 -1
  198. package/dist/messenger/server.js.map +1 -1
  199. package/dist/playable-ads-filename.d.ts +16 -0
  200. package/dist/playable-ads-filename.d.ts.map +1 -1
  201. package/dist/playable-ads-filename.js +18 -0
  202. package/dist/playable-ads-filename.js.map +1 -1
  203. package/dist/prefab/mime-type-list.d.ts.map +1 -1
  204. package/dist/prefab/mime-type-list.js +8 -0
  205. package/dist/prefab/mime-type-list.js.map +1 -1
  206. package/dist/project-skills/bundle-archive.d.ts +21 -0
  207. package/dist/project-skills/bundle-archive.d.ts.map +1 -0
  208. package/dist/project-skills/bundle-archive.js +161 -0
  209. package/dist/project-skills/bundle-archive.js.map +1 -0
  210. package/dist/project-skills/bundle-path.d.ts +3 -0
  211. package/dist/project-skills/bundle-path.d.ts.map +1 -0
  212. package/dist/project-skills/bundle-path.js +17 -0
  213. package/dist/project-skills/bundle-path.js.map +1 -0
  214. package/dist/project-skills/evidence.d.ts +15 -0
  215. package/dist/project-skills/evidence.d.ts.map +1 -0
  216. package/dist/project-skills/evidence.js +33 -0
  217. package/dist/project-skills/evidence.js.map +1 -0
  218. package/dist/project-skills/index.d.ts +7 -0
  219. package/dist/project-skills/index.d.ts.map +1 -0
  220. package/dist/project-skills/index.js +7 -0
  221. package/dist/project-skills/index.js.map +1 -0
  222. package/dist/project-skills/inventory.d.ts +23 -0
  223. package/dist/project-skills/inventory.d.ts.map +1 -0
  224. package/dist/project-skills/inventory.js +150 -0
  225. package/dist/project-skills/inventory.js.map +1 -0
  226. package/dist/project-skills/local-snapshot.d.ts +12 -0
  227. package/dist/project-skills/local-snapshot.d.ts.map +1 -0
  228. package/dist/project-skills/local-snapshot.js +66 -0
  229. package/dist/project-skills/local-snapshot.js.map +1 -0
  230. package/dist/project-skills/protocol.d.ts +31 -0
  231. package/dist/project-skills/protocol.d.ts.map +1 -0
  232. package/dist/project-skills/protocol.js +197 -0
  233. package/dist/project-skills/protocol.js.map +1 -0
  234. package/dist/project-skills/runtime-plugin.d.ts +66 -0
  235. package/dist/project-skills/runtime-plugin.d.ts.map +1 -0
  236. package/dist/project-skills/runtime-plugin.js +102 -0
  237. package/dist/project-skills/runtime-plugin.js.map +1 -0
  238. package/dist/project-skills/types.d.ts +63 -0
  239. package/dist/project-skills/types.d.ts.map +1 -0
  240. package/dist/project-skills/types.js +13 -0
  241. package/dist/project-skills/types.js.map +1 -0
  242. package/dist/recommend/types.d.ts +1 -1
  243. package/dist/recommend/types.js +1 -1
  244. package/dist/sharedb/server.d.ts +12 -0
  245. package/dist/sharedb/server.d.ts.map +1 -1
  246. package/dist/sharedb/server.js +27 -6
  247. package/dist/sharedb/server.js.map +1 -1
  248. package/dist/skill-evaluation.d.ts +152 -0
  249. package/dist/skill-evaluation.d.ts.map +1 -0
  250. package/dist/skill-evaluation.js +14 -0
  251. package/dist/skill-evaluation.js.map +1 -0
  252. package/package.json +25 -1
@@ -0,0 +1,102 @@
1
+ import { randomUUID } from 'node:crypto';
2
+ import { SignJWT, jwtVerify } from 'jose';
3
+ import { z } from 'zod';
4
+ import { generationSchema, runtimeEpochSchema } from './generations.js';
5
+ export const WORKSPACE_EXECUTION_KIND = 'workspace-execution';
6
+ export const WORKSPACE_EXECUTION_AUDIENCE = 'playcraft-runtime';
7
+ const encoder = new TextEncoder();
8
+ export const workspaceExecutionGrantClaimsSchema = z
9
+ .object({
10
+ kind: z.literal(WORKSPACE_EXECUTION_KIND),
11
+ credentialType: z.literal(WORKSPACE_EXECUTION_KIND),
12
+ environment: z.string().trim().min(1).max(64),
13
+ userId: z.string().trim().min(1).max(128),
14
+ workspaceId: z.string().trim().min(1).max(128),
15
+ runtimeId: z.string().trim().min(1).max(128),
16
+ generation: generationSchema,
17
+ runtimeEpoch: runtimeEpochSchema,
18
+ grantId: z.string().trim().min(1).max(128),
19
+ aud: z.literal(WORKSPACE_EXECUTION_AUDIENCE),
20
+ })
21
+ .strict();
22
+ /** Persisted grant metadata. The JWT itself is never part of this record. */
23
+ export const workspaceExecutionGrantRecordSchema = z
24
+ .object({
25
+ grantId: z.string().trim().min(1).max(128),
26
+ environment: z.string().trim().min(1).max(64),
27
+ userId: z.string().trim().min(1).max(128),
28
+ workspaceId: z.string().trim().min(1).max(128),
29
+ runtimeId: z.string().trim().min(1).max(128),
30
+ generation: generationSchema,
31
+ runtimeEpoch: runtimeEpochSchema,
32
+ expiresAt: z.string().min(1),
33
+ revokedAt: z.string().min(1).optional(),
34
+ })
35
+ .strict();
36
+ export const GRANT_CLIENT_FORBIDDEN_FIELDS = [
37
+ 'token',
38
+ 'grantId',
39
+ 'kind',
40
+ 'credentialType',
41
+ 'aud',
42
+ 'expiresAt',
43
+ 'revokedAt',
44
+ 'runtimeId',
45
+ 'generation',
46
+ 'runtimeEpoch',
47
+ 'leaseFence',
48
+ 'rootPath',
49
+ 'workspaceRoot',
50
+ 'binding',
51
+ 'repositoryUrl',
52
+ 'branchName',
53
+ 'preparation',
54
+ 'gitAccess',
55
+ 'parentGrantId',
56
+ 'authzRevision',
57
+ 'scope',
58
+ 'modelConfigIds',
59
+ ];
60
+ export function findForbiddenGrantFields(input) {
61
+ if (!input || typeof input !== 'object' || Array.isArray(input))
62
+ return [];
63
+ return GRANT_CLIENT_FORBIDDEN_FIELDS.filter((field) => field in input);
64
+ }
65
+ export function parseWorkspaceExecutionGrantClaims(input) {
66
+ return workspaceExecutionGrantClaimsSchema.parse(input);
67
+ }
68
+ export function newGrantId() {
69
+ return `grant_${randomUUID()}`;
70
+ }
71
+ export async function mintWorkspaceExecutionGrant(claims, secret, expiresIn = '1h') {
72
+ parseWorkspaceExecutionGrantClaims(claims);
73
+ if (secret.length < 16)
74
+ throw new Error('grant_secret_required');
75
+ return new SignJWT(claims)
76
+ .setProtectedHeader({ alg: 'HS256' })
77
+ .setIssuedAt()
78
+ .setExpirationTime(expiresIn)
79
+ .setJti(claims.grantId)
80
+ .sign(encoder.encode(secret));
81
+ }
82
+ export async function verifyWorkspaceExecutionGrant(token, secret) {
83
+ if (secret.length < 16)
84
+ throw new Error('grant_secret_required');
85
+ const { payload } = await jwtVerify(token, encoder.encode(secret), {
86
+ algorithms: ['HS256'],
87
+ audience: WORKSPACE_EXECUTION_AUDIENCE,
88
+ });
89
+ return parseWorkspaceExecutionGrantClaims({
90
+ kind: payload.kind,
91
+ credentialType: payload.credentialType,
92
+ environment: payload.environment,
93
+ userId: payload.userId,
94
+ workspaceId: payload.workspaceId,
95
+ runtimeId: payload.runtimeId,
96
+ generation: payload.generation,
97
+ runtimeEpoch: payload.runtimeEpoch,
98
+ grantId: payload.grantId,
99
+ aud: payload.aud ?? WORKSPACE_EXECUTION_AUDIENCE,
100
+ });
101
+ }
102
+ //# sourceMappingURL=execution-grant.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"execution-grant.js","sourceRoot":"","sources":["../../../src/cloud-workspace/runtime/execution-grant.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,62 @@
1
+ import { z } from 'zod';
2
+ export declare const FILE_SNAPSHOT_ENTRY_KINDS: readonly ["file", "symlink", "deleted"];
3
+ export type FileSnapshotEntryKind = (typeof FILE_SNAPSHOT_ENTRY_KINDS)[number];
4
+ export declare const FILE_SNAPSHOT_STATUSES: readonly ["complete", "incomplete"];
5
+ export type FileSnapshotStatus = (typeof FILE_SNAPSHOT_STATUSES)[number];
6
+ export declare const fileSnapshotStatusSchema: z.ZodEnum<{
7
+ complete: "complete";
8
+ incomplete: "incomplete";
9
+ }>;
10
+ export declare const fileSnapshotEntrySchema: z.ZodObject<{
11
+ path: z.ZodString;
12
+ kind: z.ZodEnum<{
13
+ file: "file";
14
+ symlink: "symlink";
15
+ deleted: "deleted";
16
+ }>;
17
+ mode: z.ZodOptional<z.ZodNumber>;
18
+ contentHash: z.ZodOptional<z.ZodString>;
19
+ size: z.ZodOptional<z.ZodNumber>;
20
+ target: z.ZodOptional<z.ZodString>;
21
+ }, z.core.$strict>;
22
+ export type FileSnapshotEntry = z.infer<typeof fileSnapshotEntrySchema>;
23
+ export declare const fileSnapshotManifestSchema: z.ZodObject<{
24
+ snapshotId: z.ZodString;
25
+ workspaceId: z.ZodString;
26
+ generation: z.ZodNumber;
27
+ status: z.ZodEnum<{
28
+ complete: "complete";
29
+ incomplete: "incomplete";
30
+ }>;
31
+ entries: z.ZodArray<z.ZodObject<{
32
+ path: z.ZodString;
33
+ kind: z.ZodEnum<{
34
+ file: "file";
35
+ symlink: "symlink";
36
+ deleted: "deleted";
37
+ }>;
38
+ mode: z.ZodOptional<z.ZodNumber>;
39
+ contentHash: z.ZodOptional<z.ZodString>;
40
+ size: z.ZodOptional<z.ZodNumber>;
41
+ target: z.ZodOptional<z.ZodString>;
42
+ }, z.core.$strict>>;
43
+ digest: z.ZodString;
44
+ }, z.core.$strict>;
45
+ export type FileSnapshotManifest = z.infer<typeof fileSnapshotManifestSchema>;
46
+ export type FileSnapshotVerification = {
47
+ ok: true;
48
+ snapshotId: string;
49
+ checksum: string;
50
+ } | {
51
+ ok: false;
52
+ reason: 'incomplete' | 'mismatch' | 'unreadable';
53
+ };
54
+ export declare function fileSnapshotObjectKey(workspaceId: string, generation: number, snapshotId: string, contentHash: string): string;
55
+ export declare function fileSnapshotManifestKey(workspaceId: string, generation: number, snapshotId: string): string;
56
+ export declare function hashSnapshotBytes(body: Buffer): string;
57
+ export declare function fileSnapshotDigest(entries: readonly FileSnapshotEntry[]): string;
58
+ export declare function assertHttpObjectStoreUrl(value: string): string;
59
+ export declare function putObjectBytes(baseUrl: string, key: string, body: Buffer, client: 'cli' | 'runtime'): Promise<void>;
60
+ export declare function getObjectBytes(baseUrl: string, key: string, client: 'cli' | 'runtime'): Promise<Buffer>;
61
+ export declare function verifyFileSnapshotManifest(manifestKey: string, getObject: (key: string) => Promise<Buffer | undefined>): Promise<FileSnapshotVerification>;
62
+ //# sourceMappingURL=file-snapshot.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-snapshot.d.ts","sourceRoot":"","sources":["../../../src/cloud-workspace/runtime/file-snapshot.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,eAAO,MAAM,yBAAyB,yCAA0C,CAAC;AACjF,MAAM,MAAM,qBAAqB,GAAG,CAAC,OAAO,yBAAyB,CAAC,CAAC,MAAM,CAAC,CAAC;AAE/E,eAAO,MAAM,sBAAsB,qCAAsC,CAAC;AAC1E,MAAM,MAAM,kBAAkB,GAAG,CAAC,OAAO,sBAAsB,CAAC,CAAC,MAAM,CAAC,CAAC;AACzE,eAAO,MAAM,wBAAwB;;;EAAiC,CAAC;AAEvE,eAAO,MAAM,uBAAuB;;;;;;;;;;;kBASzB,CAAC;AAEZ,MAAM,MAAM,iBAAiB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,uBAAuB,CAAC,CAAC;AAExE,eAAO,MAAM,0BAA0B;;;;;;;;;;;;;;;;;;;;;kBAuBnC,CAAC;AAEL,MAAM,MAAM,oBAAoB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,0BAA0B,CAAC,CAAC;AAE9E,MAAM,MAAM,wBAAwB,GAChC;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,GAClD;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,YAAY,GAAG,UAAU,GAAG,YAAY,CAAA;CAAE,CAAC;AAEpE,wBAAgB,qBAAqB,CACnC,WAAW,EAAE,MAAM,EACnB,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,MAAM,EAClB,WAAW,EAAE,MAAM,GAClB,MAAM,CAER;AAED,wBAAgB,uBAAuB,CAAC,WAAW,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,CAE3G;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEtD;AAED,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,SAAS,iBAAiB,EAAE,GAAG,MAAM,CAKhF;AAED,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAW9D;AAED,wBAAsB,cAAc,CAClC,OAAO,EAAE,MAAM,EACf,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,KAAK,GAAG,SAAS,GACxB,OAAO,CAAC,IAAI,CAAC,CAWf;AAED,wBAAsB,cAAc,CAClC,OAAO,EAAE,MAAM,EACf,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,KAAK,GAAG,SAAS,GACxB,OAAO,CAAC,MAAM,CAAC,CAOjB;AAED,wBAAsB,0BAA0B,CAC9C,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,GACtD,OAAO,CAAC,wBAAwB,CAAC,CAgCnC"}
@@ -0,0 +1,147 @@
1
+ import { createHash } from 'node:crypto';
2
+ import { z } from 'zod';
3
+ import { workspaceRelativePathSchema } from './files.js';
4
+ import { generationSchema } from './generations.js';
5
+ export const FILE_SNAPSHOT_ENTRY_KINDS = ['file', 'symlink', 'deleted'];
6
+ export const FILE_SNAPSHOT_STATUSES = ['complete', 'incomplete'];
7
+ export const fileSnapshotStatusSchema = z.enum(FILE_SNAPSHOT_STATUSES);
8
+ export const fileSnapshotEntrySchema = z
9
+ .object({
10
+ path: workspaceRelativePathSchema,
11
+ kind: z.enum(FILE_SNAPSHOT_ENTRY_KINDS),
12
+ mode: z.number().int().min(0).max(0o777).optional(),
13
+ contentHash: z.string().length(64).optional(),
14
+ size: z.number().int().nonnegative().optional(),
15
+ target: z.string().min(1).max(512).optional(),
16
+ })
17
+ .strict();
18
+ export const fileSnapshotManifestSchema = z
19
+ .object({
20
+ snapshotId: z.string().min(1).max(128),
21
+ workspaceId: z.string().min(1).max(128),
22
+ generation: generationSchema,
23
+ status: fileSnapshotStatusSchema,
24
+ entries: z.array(fileSnapshotEntrySchema),
25
+ digest: z.string().length(64),
26
+ })
27
+ .strict()
28
+ .superRefine((value, context) => {
29
+ if (value.status !== 'complete')
30
+ return;
31
+ for (const entry of value.entries) {
32
+ if (entry.kind === 'file' && (!entry.contentHash || entry.mode === undefined || entry.size === undefined)) {
33
+ context.addIssue({ code: z.ZodIssueCode.custom, message: 'file_snapshot_entry_incomplete' });
34
+ }
35
+ if (entry.kind === 'symlink' && (!entry.target || entry.mode === undefined)) {
36
+ context.addIssue({ code: z.ZodIssueCode.custom, message: 'symlink_snapshot_entry_incomplete' });
37
+ }
38
+ if (entry.kind === 'deleted' && (entry.contentHash || entry.target || entry.mode !== undefined)) {
39
+ context.addIssue({ code: z.ZodIssueCode.custom, message: 'deleted_snapshot_entry_invalid' });
40
+ }
41
+ }
42
+ });
43
+ export function fileSnapshotObjectKey(workspaceId, generation, snapshotId, contentHash) {
44
+ return `workspaces/${workspaceId}/snapshots/${generation}/${snapshotId}/objects/${contentHash}`;
45
+ }
46
+ export function fileSnapshotManifestKey(workspaceId, generation, snapshotId) {
47
+ return `workspaces/${workspaceId}/snapshots/${generation}/${snapshotId}/manifest.json`;
48
+ }
49
+ export function hashSnapshotBytes(body) {
50
+ return createHash('sha256').update(body).digest('hex');
51
+ }
52
+ export function fileSnapshotDigest(entries) {
53
+ const sorted = [...entries].sort((left, right) => left.path.localeCompare(right.path) || left.kind.localeCompare(right.kind));
54
+ return createHash('sha256').update(canonicalJson(sorted)).digest('hex');
55
+ }
56
+ export function assertHttpObjectStoreUrl(value) {
57
+ let parsed;
58
+ try {
59
+ parsed = new URL(value);
60
+ }
61
+ catch {
62
+ throw new Error('object_store_url_invalid');
63
+ }
64
+ if (parsed.protocol !== 'http:' && parsed.protocol !== 'https:') {
65
+ throw new Error('object_store_url_invalid');
66
+ }
67
+ return value.replace(/\/$/, '');
68
+ }
69
+ export async function putObjectBytes(baseUrl, key, body, client) {
70
+ const response = await fetch(objectUrl(baseUrl, key), {
71
+ method: 'PUT',
72
+ headers: {
73
+ 'content-type': 'application/octet-stream',
74
+ 'x-playcraft-object-client': client,
75
+ },
76
+ body: new Uint8Array(body),
77
+ });
78
+ if (response.status === 409)
79
+ throw new Error('object_conflict');
80
+ if (response.status !== 201 && response.status !== 200)
81
+ throw new Error('object_put_failed');
82
+ }
83
+ export async function getObjectBytes(baseUrl, key, client) {
84
+ const response = await fetch(objectUrl(baseUrl, key), {
85
+ headers: { 'x-playcraft-object-client': client },
86
+ });
87
+ if (response.status === 404)
88
+ throw new Error('object_missing');
89
+ if (!response.ok)
90
+ throw new Error('object_get_failed');
91
+ return Buffer.from(await response.arrayBuffer());
92
+ }
93
+ export async function verifyFileSnapshotManifest(manifestKey, getObject) {
94
+ const raw = await getObject(manifestKey).catch(() => undefined);
95
+ if (!raw)
96
+ return { ok: false, reason: 'unreadable' };
97
+ let parsed;
98
+ try {
99
+ parsed = JSON.parse(raw.toString('utf8'));
100
+ }
101
+ catch {
102
+ return { ok: false, reason: 'mismatch' };
103
+ }
104
+ const manifest = fileSnapshotManifestSchema.safeParse(parsed);
105
+ if (!manifest.success)
106
+ return { ok: false, reason: 'mismatch' };
107
+ if (manifest.data.status !== 'complete')
108
+ return { ok: false, reason: 'incomplete' };
109
+ const digest = fileSnapshotDigest(manifest.data.entries);
110
+ if (digest !== manifest.data.digest)
111
+ return { ok: false, reason: 'mismatch' };
112
+ for (const entry of manifest.data.entries) {
113
+ if (entry.kind === 'deleted')
114
+ continue;
115
+ if (entry.kind === 'symlink') {
116
+ if (!entry.target || entry.mode === undefined)
117
+ return { ok: false, reason: 'mismatch' };
118
+ continue;
119
+ }
120
+ if (!entry.contentHash || entry.mode === undefined)
121
+ return { ok: false, reason: 'mismatch' };
122
+ const key = fileSnapshotObjectKey(manifest.data.workspaceId, manifest.data.generation, manifest.data.snapshotId, entry.contentHash);
123
+ const body = await getObject(key).catch(() => undefined);
124
+ if (!body || hashSnapshotBytes(body) !== entry.contentHash)
125
+ return { ok: false, reason: 'mismatch' };
126
+ if (entry.size !== undefined && body.byteLength !== entry.size)
127
+ return { ok: false, reason: 'mismatch' };
128
+ }
129
+ return { ok: true, snapshotId: manifest.data.snapshotId, checksum: digest };
130
+ }
131
+ function objectUrl(baseUrl, key) {
132
+ return `${assertHttpObjectStoreUrl(baseUrl)}/objects/${encodeURIComponent(key)}`;
133
+ }
134
+ function canonicalJson(value) {
135
+ return JSON.stringify(sortValue(value));
136
+ }
137
+ function sortValue(value) {
138
+ if (Array.isArray(value))
139
+ return value.map(sortValue);
140
+ if (value && typeof value === 'object') {
141
+ return Object.fromEntries(Object.entries(value)
142
+ .sort(([left], [right]) => left.localeCompare(right))
143
+ .map(([key, nested]) => [key, sortValue(nested)]));
144
+ }
145
+ return value;
146
+ }
147
+ //# sourceMappingURL=file-snapshot.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-snapshot.js","sourceRoot":"","sources":["../../../src/cloud-workspace/runtime/file-snapshot.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,58 @@
1
+ import { z } from 'zod';
2
+ export declare const WORKSPACE_RELATIVE_PATH_MAX = 512;
3
+ export declare const WORKSPACE_FILE_CONTENT_MAX: number;
4
+ export declare const workspaceRelativePathSchema: z.ZodString;
5
+ export type WorkspaceRelativePath = z.infer<typeof workspaceRelativePathSchema>;
6
+ export declare const MANAGED_WRITE_SOURCES: readonly ["manual", "agent", "background"];
7
+ export type ManagedWriteSource = (typeof MANAGED_WRITE_SOURCES)[number];
8
+ export declare const managedWriteSourceSchema: z.ZodEnum<{
9
+ background: "background";
10
+ manual: "manual";
11
+ agent: "agent";
12
+ }>;
13
+ export declare const fileWritePayloadSchema: z.ZodObject<{
14
+ path: z.ZodString;
15
+ content: z.ZodString;
16
+ expectedRevision: z.ZodOptional<z.ZodNumber>;
17
+ writer: z.ZodOptional<z.ZodEnum<{
18
+ background: "background";
19
+ manual: "manual";
20
+ agent: "agent";
21
+ }>>;
22
+ writeId: z.ZodOptional<z.ZodString>;
23
+ hold: z.ZodOptional<z.ZodBoolean>;
24
+ release: z.ZodOptional<z.ZodBoolean>;
25
+ }, z.core.$strict>;
26
+ export type FileWritePayload = z.infer<typeof fileWritePayloadSchema>;
27
+ export declare const workspaceFileRecordSchema: z.ZodObject<{
28
+ path: z.ZodString;
29
+ revision: z.ZodNumber;
30
+ contentHash: z.ZodString;
31
+ size: z.ZodNumber;
32
+ }, z.core.$strict>;
33
+ export type WorkspaceFileRecord = z.infer<typeof workspaceFileRecordSchema>;
34
+ export declare const workspaceFileListSchema: z.ZodObject<{
35
+ files: z.ZodArray<z.ZodObject<{
36
+ path: z.ZodString;
37
+ revision: z.ZodNumber;
38
+ contentHash: z.ZodString;
39
+ size: z.ZodNumber;
40
+ }, z.core.$strict>>;
41
+ }, z.core.$strict>;
42
+ export type WorkspaceFileList = z.infer<typeof workspaceFileListSchema>;
43
+ export declare const workspaceFileContentSchema: z.ZodObject<{
44
+ path: z.ZodString;
45
+ revision: z.ZodNumber;
46
+ contentHash: z.ZodString;
47
+ content: z.ZodString;
48
+ }, z.core.$strict>;
49
+ export type WorkspaceFileContent = z.infer<typeof workspaceFileContentSchema>;
50
+ export declare const checkpointFileSchema: z.ZodObject<{
51
+ path: z.ZodString;
52
+ contentHash: z.ZodString;
53
+ revision: z.ZodNumber;
54
+ }, z.core.$strict>;
55
+ export type CheckpointFile = z.infer<typeof checkpointFileSchema>;
56
+ export declare function hashWorkspaceFileContent(content: string): string;
57
+ export declare function isWorkspaceRelativePath(value: string): boolean;
58
+ //# sourceMappingURL=files.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"files.d.ts","sourceRoot":"","sources":["../../../src/cloud-workspace/runtime/files.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,eAAO,MAAM,2BAA2B,MAAM,CAAC;AAC/C,eAAO,MAAM,0BAA0B,QAAc,CAAC;AAEtD,eAAO,MAAM,2BAA2B,aAcpC,CAAC;AAEL,MAAM,MAAM,qBAAqB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,2BAA2B,CAAC,CAAC;AAEhF,eAAO,MAAM,qBAAqB,4CAA6C,CAAC;AAChF,MAAM,MAAM,kBAAkB,GAAG,CAAC,OAAO,qBAAqB,CAAC,CAAC,MAAM,CAAC,CAAC;AACxE,eAAO,MAAM,wBAAwB;;;;EAAgC,CAAC;AAEtE,eAAO,MAAM,sBAAsB;;;;;;;;;;;;kBAqB/B,CAAC;AAEL,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,sBAAsB,CAAC,CAAC;AAEtE,eAAO,MAAM,yBAAyB;;;;;kBAO3B,CAAC;AAEZ,MAAM,MAAM,mBAAmB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,yBAAyB,CAAC,CAAC;AAE5E,eAAO,MAAM,uBAAuB;;;;;;;kBAIzB,CAAC;AAEZ,MAAM,MAAM,iBAAiB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,uBAAuB,CAAC,CAAC;AAExE,eAAO,MAAM,0BAA0B;;;;;kBAO5B,CAAC;AAEZ,MAAM,MAAM,oBAAoB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,0BAA0B,CAAC,CAAC;AAE9E,eAAO,MAAM,oBAAoB;;;;kBAMtB,CAAC;AAEZ,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAElE,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAEhE;AAED,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAE9D"}
@@ -0,0 +1,78 @@
1
+ import { createHash } from 'node:crypto';
2
+ import { z } from 'zod';
3
+ export const WORKSPACE_RELATIVE_PATH_MAX = 512;
4
+ export const WORKSPACE_FILE_CONTENT_MAX = 1024 * 1024;
5
+ export const workspaceRelativePathSchema = z
6
+ .string()
7
+ .trim()
8
+ .min(1)
9
+ .max(WORKSPACE_RELATIVE_PATH_MAX)
10
+ .superRefine((value, context) => {
11
+ if (value.includes('\0') || value.includes('\\') || value.startsWith('/') || value.includes(':')) {
12
+ context.addIssue({ code: z.ZodIssueCode.custom, message: 'invalid_workspace_path' });
13
+ return;
14
+ }
15
+ const segments = value.split('/');
16
+ if (segments.some((segment) => segment === '' || segment === '.' || segment === '..')) {
17
+ context.addIssue({ code: z.ZodIssueCode.custom, message: 'invalid_workspace_path' });
18
+ }
19
+ });
20
+ export const MANAGED_WRITE_SOURCES = ['manual', 'agent', 'background'];
21
+ export const managedWriteSourceSchema = z.enum(MANAGED_WRITE_SOURCES);
22
+ export const fileWritePayloadSchema = z
23
+ .object({
24
+ path: workspaceRelativePathSchema,
25
+ content: z.string().max(WORKSPACE_FILE_CONTENT_MAX),
26
+ expectedRevision: z.number().int().nonnegative().optional(),
27
+ writer: managedWriteSourceSchema.optional(),
28
+ writeId: z.string().trim().min(1).max(128).optional(),
29
+ hold: z.boolean().optional(),
30
+ release: z.boolean().optional(),
31
+ })
32
+ .strict()
33
+ .superRefine((value, context) => {
34
+ if ((value.hold || value.release) && !value.writeId) {
35
+ context.addIssue({ code: z.ZodIssueCode.custom, message: 'write_id_required' });
36
+ }
37
+ if (value.hold && value.release) {
38
+ context.addIssue({ code: z.ZodIssueCode.custom, message: 'write_hold_conflict' });
39
+ }
40
+ if (value.writer === 'background' && value.hold !== true && value.release !== true) {
41
+ context.addIssue({ code: z.ZodIssueCode.custom, message: 'background_write_unmanaged' });
42
+ }
43
+ });
44
+ export const workspaceFileRecordSchema = z
45
+ .object({
46
+ path: workspaceRelativePathSchema,
47
+ revision: z.number().int().nonnegative(),
48
+ contentHash: z.string().length(64),
49
+ size: z.number().int().nonnegative(),
50
+ })
51
+ .strict();
52
+ export const workspaceFileListSchema = z
53
+ .object({
54
+ files: z.array(workspaceFileRecordSchema),
55
+ })
56
+ .strict();
57
+ export const workspaceFileContentSchema = z
58
+ .object({
59
+ path: workspaceRelativePathSchema,
60
+ revision: z.number().int().nonnegative(),
61
+ contentHash: z.string().length(64),
62
+ content: z.string().max(WORKSPACE_FILE_CONTENT_MAX),
63
+ })
64
+ .strict();
65
+ export const checkpointFileSchema = z
66
+ .object({
67
+ path: workspaceRelativePathSchema,
68
+ contentHash: z.string().length(64),
69
+ revision: z.number().int().nonnegative(),
70
+ })
71
+ .strict();
72
+ export function hashWorkspaceFileContent(content) {
73
+ return createHash('sha256').update(content, 'utf8').digest('hex');
74
+ }
75
+ export function isWorkspaceRelativePath(value) {
76
+ return workspaceRelativePathSchema.safeParse(value).success;
77
+ }
78
+ //# sourceMappingURL=files.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"files.js","sourceRoot":"","sources":["../../../src/cloud-workspace/runtime/files.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import { z } from 'zod';
2
+ export declare const generationSchema: z.ZodNumber;
3
+ export declare const runtimeEpochSchema: z.ZodNumber;
4
+ export declare const leaseFenceSchema: z.ZodNumber;
5
+ export declare const runtimeGenerationsSchema: z.ZodObject<{
6
+ generation: z.ZodNumber;
7
+ runtimeEpoch: z.ZodNumber;
8
+ leaseFence: z.ZodNumber;
9
+ }, z.core.$strict>;
10
+ export type RuntimeGenerations = z.infer<typeof runtimeGenerationsSchema>;
11
+ /** Fields the browser client must not choose. Trusted config or server registration fills them.
12
+ * Sandbox control HTTP still accepts dispatcher `leaseFence` and checks it separately. */
13
+ export declare const UNTRUSTED_RUNTIME_FIELDS: readonly ["userId", "runtimeId", "generation", "runtimeEpoch", "leaseFence", "rootPath", "workspaceRoot"];
14
+ export type UntrustedRuntimeField = (typeof UNTRUSTED_RUNTIME_FIELDS)[number];
15
+ export declare function findUntrustedRuntimeFields(input: unknown): UntrustedRuntimeField[];
16
+ export declare function assertTrustedGenerations(actual: RuntimeGenerations, expected: Pick<RuntimeGenerations, 'generation' | 'runtimeEpoch'>): 'ok' | 'generation_mismatch';
17
+ export declare function assertLeaseFence(actual: number, acceptedFence: number): 'ok' | 'stale_lease';
18
+ //# sourceMappingURL=generations.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generations.d.ts","sourceRoot":"","sources":["../../../src/cloud-workspace/runtime/generations.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,eAAO,MAAM,gBAAgB,aAAiC,CAAC;AAC/D,eAAO,MAAM,kBAAkB,aAAiC,CAAC;AACjE,eAAO,MAAM,gBAAgB,aAAiC,CAAC;AAE/D,eAAO,MAAM,wBAAwB;;;;kBAM1B,CAAC;AAEZ,MAAM,MAAM,kBAAkB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,wBAAwB,CAAC,CAAC;AAE1E;2FAC2F;AAC3F,eAAO,MAAM,wBAAwB,2GAQ3B,CAAC;AAEX,MAAM,MAAM,qBAAqB,GAAG,CAAC,OAAO,wBAAwB,CAAC,CAAC,MAAM,CAAC,CAAC;AAE9E,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,OAAO,GAAG,qBAAqB,EAAE,CAGlF;AAED,wBAAgB,wBAAwB,CACtC,MAAM,EAAE,kBAAkB,EAC1B,QAAQ,EAAE,IAAI,CAAC,kBAAkB,EAAE,YAAY,GAAG,cAAc,CAAC,GAChE,IAAI,GAAG,qBAAqB,CAK9B;AAED,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,IAAI,GAAG,aAAa,CAG5F"}
@@ -0,0 +1,39 @@
1
+ import { z } from 'zod';
2
+ export const generationSchema = z.number().int().nonnegative();
3
+ export const runtimeEpochSchema = z.number().int().nonnegative();
4
+ export const leaseFenceSchema = z.number().int().nonnegative();
5
+ export const runtimeGenerationsSchema = z
6
+ .object({
7
+ generation: generationSchema,
8
+ runtimeEpoch: runtimeEpochSchema,
9
+ leaseFence: leaseFenceSchema,
10
+ })
11
+ .strict();
12
+ /** Fields the browser client must not choose. Trusted config or server registration fills them.
13
+ * Sandbox control HTTP still accepts dispatcher `leaseFence` and checks it separately. */
14
+ export const UNTRUSTED_RUNTIME_FIELDS = [
15
+ 'userId',
16
+ 'runtimeId',
17
+ 'generation',
18
+ 'runtimeEpoch',
19
+ 'leaseFence',
20
+ 'rootPath',
21
+ 'workspaceRoot',
22
+ ];
23
+ export function findUntrustedRuntimeFields(input) {
24
+ if (!input || typeof input !== 'object' || Array.isArray(input))
25
+ return [];
26
+ return UNTRUSTED_RUNTIME_FIELDS.filter((field) => field in input);
27
+ }
28
+ export function assertTrustedGenerations(actual, expected) {
29
+ if (actual.generation !== expected.generation || actual.runtimeEpoch !== expected.runtimeEpoch) {
30
+ return 'generation_mismatch';
31
+ }
32
+ return 'ok';
33
+ }
34
+ export function assertLeaseFence(actual, acceptedFence) {
35
+ if (actual < acceptedFence)
36
+ return 'stale_lease';
37
+ return 'ok';
38
+ }
39
+ //# sourceMappingURL=generations.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generations.js","sourceRoot":"","sources":["../../../src/cloud-workspace/runtime/generations.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,WAAW,EAAE,CAAC;AAC/D,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,WAAW,EAAE,CAAC;AACjE,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,WAAW,EAAE,CAAC;AAE/D,MAAM,CAAC,MAAM,wBAAwB,GAAG,CAAC;KACtC,MAAM,CAAC;IACN,UAAU,EAAE,gBAAgB;IAC5B,YAAY,EAAE,kBAAkB;IAChC,UAAU,EAAE,gBAAgB;CAC7B,CAAC;KACD,MAAM,EAAE,CAAC;AAIZ;2FAC2F;AAC3F,MAAM,CAAC,MAAM,wBAAwB,GAAG;IACtC,QAAQ;IACR,WAAW;IACX,YAAY;IACZ,cAAc;IACd,YAAY;IACZ,UAAU;IACV,eAAe;CACP,CAAC;AAIX,MAAM,UAAU,0BAA0B,CAAC,KAAc;IACvD,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAC3E,OAAO,wBAAwB,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,IAAI,KAAK,CAAC,CAAC;AACpE,CAAC;AAED,MAAM,UAAU,wBAAwB,CACtC,MAA0B,EAC1B,QAAiE;IAEjE,IAAI,MAAM,CAAC,UAAU,KAAK,QAAQ,CAAC,UAAU,IAAI,MAAM,CAAC,YAAY,KAAK,QAAQ,CAAC,YAAY,EAAE,CAAC;QAC/F,OAAO,qBAAqB,CAAC;IAC/B,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,MAAc,EAAE,aAAqB;IACpE,IAAI,MAAM,GAAG,aAAa;QAAE,OAAO,aAAa,CAAC;IACjD,OAAO,IAAI,CAAC;AACd,CAAC"}
@@ -0,0 +1,46 @@
1
+ import { z } from 'zod';
2
+ export declare const gitCommitPayloadSchema: z.ZodObject<{
3
+ message: z.ZodString;
4
+ paths: z.ZodOptional<z.ZodArray<z.ZodString>>;
5
+ }, z.core.$strict>;
6
+ export type GitCommitPayload = z.infer<typeof gitCommitPayloadSchema>;
7
+ export declare const gitPushPayloadSchema: z.ZodObject<{}, z.core.$strict>;
8
+ export type GitPushPayload = z.infer<typeof gitPushPayloadSchema>;
9
+ export declare const gitStatusEntrySchema: z.ZodObject<{
10
+ path: z.ZodString;
11
+ indexStatus: z.ZodString;
12
+ worktreeStatus: z.ZodString;
13
+ }, z.core.$strict>;
14
+ export type GitStatusEntry = z.infer<typeof gitStatusEntrySchema>;
15
+ export declare const gitStatusSchema: z.ZodObject<{
16
+ initialized: z.ZodBoolean;
17
+ branch: z.ZodString;
18
+ ahead: z.ZodNumber;
19
+ behind: z.ZodNumber;
20
+ hasUpstream: z.ZodBoolean;
21
+ files: z.ZodArray<z.ZodObject<{
22
+ path: z.ZodString;
23
+ indexStatus: z.ZodString;
24
+ worktreeStatus: z.ZodString;
25
+ }, z.core.$strict>>;
26
+ }, z.core.$strict>;
27
+ export type GitStatus = z.infer<typeof gitStatusSchema>;
28
+ export declare const gitDiffSchema: z.ZodObject<{
29
+ patch: z.ZodString;
30
+ }, z.core.$strict>;
31
+ export type GitDiff = z.infer<typeof gitDiffSchema>;
32
+ export declare const gitCommitSummarySchema: z.ZodObject<{
33
+ sha: z.ZodString;
34
+ subject: z.ZodString;
35
+ committedAt: z.ZodString;
36
+ }, z.core.$strict>;
37
+ export type GitCommitSummary = z.infer<typeof gitCommitSummarySchema>;
38
+ export declare const gitGraphSchema: z.ZodObject<{
39
+ commits: z.ZodArray<z.ZodObject<{
40
+ sha: z.ZodString;
41
+ subject: z.ZodString;
42
+ committedAt: z.ZodString;
43
+ }, z.core.$strict>>;
44
+ }, z.core.$strict>;
45
+ export type GitGraph = z.infer<typeof gitGraphSchema>;
46
+ //# sourceMappingURL=git.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git.d.ts","sourceRoot":"","sources":["../../../src/cloud-workspace/runtime/git.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,eAAO,MAAM,sBAAsB;;;kBAKxB,CAAC;AAEZ,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,sBAAsB,CAAC,CAAC;AAEtE,eAAO,MAAM,oBAAoB,iCAAwB,CAAC;AAE1D,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAElE,eAAO,MAAM,oBAAoB;;;;kBAMtB,CAAC;AAEZ,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAElE,eAAO,MAAM,eAAe;;;;;;;;;;;kBASjB,CAAC;AAEZ,MAAM,MAAM,SAAS,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,eAAe,CAAC,CAAC;AAExD,eAAO,MAAM,aAAa;;kBAIf,CAAC;AAEZ,MAAM,MAAM,OAAO,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,aAAa,CAAC,CAAC;AAEpD,eAAO,MAAM,sBAAsB;;;;kBAMxB,CAAC;AAEZ,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,sBAAsB,CAAC,CAAC;AAEtE,eAAO,MAAM,cAAc;;;;;;kBAIhB,CAAC;AAEZ,MAAM,MAAM,QAAQ,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,cAAc,CAAC,CAAC"}