@vibesdotdev/code-sessions 0.0.0-stage → 1.0.0-rc.1

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 (217) hide show
  1. package/LICENSE +18 -0
  2. package/README.md +165 -2
  3. package/dist/agent/coordinator.agent.descriptor.d.ts +69 -0
  4. package/dist/agent/coordinator.agent.descriptor.d.ts.map +1 -0
  5. package/dist/agent/coordinator.agent.descriptor.js +60 -0
  6. package/dist/agent/coordinator.agent.descriptor.js.map +1 -0
  7. package/dist/agent/coordinator.prompt.descriptor.d.ts +135 -0
  8. package/dist/agent/coordinator.prompt.descriptor.d.ts.map +1 -0
  9. package/dist/agent/coordinator.prompt.descriptor.js +29 -0
  10. package/dist/agent/coordinator.prompt.descriptor.js.map +1 -0
  11. package/dist/agent/coordinator.system-prompt.d.ts +3 -0
  12. package/dist/agent/coordinator.system-prompt.d.ts.map +1 -0
  13. package/dist/agent/coordinator.system-prompt.js +18 -0
  14. package/dist/agent/coordinator.system-prompt.js.map +1 -0
  15. package/dist/agent/developer.agent.descriptor.d.ts +74 -0
  16. package/dist/agent/developer.agent.descriptor.d.ts.map +1 -0
  17. package/dist/agent/developer.agent.descriptor.js +138 -0
  18. package/dist/agent/developer.agent.descriptor.js.map +1 -0
  19. package/dist/agent/developer.prompt.descriptor.d.ts +137 -0
  20. package/dist/agent/developer.prompt.descriptor.d.ts.map +1 -0
  21. package/dist/agent/developer.prompt.descriptor.js +29 -0
  22. package/dist/agent/developer.prompt.descriptor.js.map +1 -0
  23. package/dist/agent/reviewer.agent.descriptor.d.ts +69 -0
  24. package/dist/agent/reviewer.agent.descriptor.d.ts.map +1 -0
  25. package/dist/agent/reviewer.agent.descriptor.js +60 -0
  26. package/dist/agent/reviewer.agent.descriptor.js.map +1 -0
  27. package/dist/agent/reviewer.prompt.descriptor.d.ts +135 -0
  28. package/dist/agent/reviewer.prompt.descriptor.d.ts.map +1 -0
  29. package/dist/agent/reviewer.prompt.descriptor.js +29 -0
  30. package/dist/agent/reviewer.prompt.descriptor.js.map +1 -0
  31. package/dist/agent/reviewer.system-prompt.d.ts +3 -0
  32. package/dist/agent/reviewer.system-prompt.d.ts.map +1 -0
  33. package/dist/agent/reviewer.system-prompt.js +17 -0
  34. package/dist/agent/reviewer.system-prompt.js.map +1 -0
  35. package/dist/agent/system-prompt.d.ts +12 -0
  36. package/dist/agent/system-prompt.d.ts.map +1 -0
  37. package/dist/agent/system-prompt.js +28 -0
  38. package/dist/agent/system-prompt.js.map +1 -0
  39. package/dist/api/code-sessions.api-client.descriptor.d.ts +25 -0
  40. package/dist/api/code-sessions.api-client.descriptor.d.ts.map +1 -0
  41. package/dist/api/code-sessions.api-client.descriptor.js +26 -0
  42. package/dist/api/code-sessions.api-client.descriptor.js.map +1 -0
  43. package/dist/api/code-sessions.api-client.impl.d.ts +156 -0
  44. package/dist/api/code-sessions.api-client.impl.d.ts.map +1 -0
  45. package/dist/api/code-sessions.api-client.impl.js +852 -0
  46. package/dist/api/code-sessions.api-client.impl.js.map +1 -0
  47. package/dist/api/code-sessions.api-client.schemas.d.ts +2 -0
  48. package/dist/api/code-sessions.api-client.schemas.d.ts.map +1 -0
  49. package/dist/api/code-sessions.api-client.schemas.js +2 -0
  50. package/dist/api/code-sessions.api-client.schemas.js.map +1 -0
  51. package/dist/api/code-sessions.api-client.types.d.ts +252 -0
  52. package/dist/api/code-sessions.api-client.types.d.ts.map +1 -0
  53. package/dist/api/code-sessions.api-client.types.js +77 -0
  54. package/dist/api/code-sessions.api-client.types.js.map +1 -0
  55. package/dist/api/index.d.ts +13 -0
  56. package/dist/api/index.d.ts.map +1 -0
  57. package/dist/api/index.js +20 -0
  58. package/dist/api/index.js.map +1 -0
  59. package/dist/capability.d.ts +9 -0
  60. package/dist/capability.d.ts.map +1 -0
  61. package/dist/capability.js +9 -0
  62. package/dist/capability.js.map +1 -0
  63. package/dist/catalog/index.d.ts +2 -0
  64. package/dist/catalog/index.d.ts.map +1 -0
  65. package/dist/catalog/index.js +2 -0
  66. package/dist/catalog/index.js.map +1 -0
  67. package/dist/catalog/session-catalog.d.ts +131 -0
  68. package/dist/catalog/session-catalog.d.ts.map +1 -0
  69. package/dist/catalog/session-catalog.impl.consumer.worker.d.ts +113 -0
  70. package/dist/catalog/session-catalog.impl.consumer.worker.d.ts.map +1 -0
  71. package/dist/catalog/session-catalog.impl.consumer.worker.js +32 -0
  72. package/dist/catalog/session-catalog.impl.consumer.worker.js.map +1 -0
  73. package/dist/catalog/session-catalog.js +126 -0
  74. package/dist/catalog/session-catalog.js.map +1 -0
  75. package/dist/clock/clock.client.d.ts +18 -0
  76. package/dist/clock/clock.client.d.ts.map +1 -0
  77. package/dist/clock/clock.client.js +43 -0
  78. package/dist/clock/clock.client.js.map +1 -0
  79. package/dist/code-sessions.consumer.plugin.d.ts +4 -0
  80. package/dist/code-sessions.consumer.plugin.d.ts.map +1 -0
  81. package/dist/code-sessions.consumer.plugin.js +16 -0
  82. package/dist/code-sessions.consumer.plugin.js.map +1 -0
  83. package/dist/code-sessions.plugin.d.ts +15 -0
  84. package/dist/code-sessions.plugin.d.ts.map +1 -0
  85. package/dist/code-sessions.plugin.js +65 -0
  86. package/dist/code-sessions.plugin.js.map +1 -0
  87. package/dist/config/index.d.ts +9 -0
  88. package/dist/config/index.d.ts.map +1 -0
  89. package/dist/config/index.js +9 -0
  90. package/dist/config/index.js.map +1 -0
  91. package/dist/config/preparation.d.ts +2 -0
  92. package/dist/config/preparation.d.ts.map +1 -0
  93. package/dist/config/preparation.js +2 -0
  94. package/dist/config/preparation.js.map +1 -0
  95. package/dist/docs/code-sessions.docs.descriptor.d.ts +4 -0
  96. package/dist/docs/code-sessions.docs.descriptor.d.ts.map +1 -0
  97. package/dist/docs/code-sessions.docs.descriptor.js +241 -0
  98. package/dist/docs/code-sessions.docs.descriptor.js.map +1 -0
  99. package/dist/index.d.ts +26 -0
  100. package/dist/index.d.ts.map +1 -0
  101. package/dist/index.js +28 -0
  102. package/dist/index.js.map +1 -0
  103. package/dist/pull-request-plan.d.ts +68 -0
  104. package/dist/pull-request-plan.d.ts.map +1 -0
  105. package/dist/pull-request-plan.js +94 -0
  106. package/dist/pull-request-plan.js.map +1 -0
  107. package/dist/schemas/preparation.d.ts +51 -0
  108. package/dist/schemas/preparation.d.ts.map +1 -0
  109. package/dist/schemas/preparation.js +20 -0
  110. package/dist/schemas/preparation.js.map +1 -0
  111. package/dist/schemas/requests.d.ts +411 -0
  112. package/dist/schemas/requests.d.ts.map +1 -0
  113. package/dist/schemas/requests.js +87 -0
  114. package/dist/schemas/requests.js.map +1 -0
  115. package/dist/schemas/responses.d.ts +275 -0
  116. package/dist/schemas/responses.d.ts.map +1 -0
  117. package/dist/schemas/responses.js +90 -0
  118. package/dist/schemas/responses.js.map +1 -0
  119. package/dist/svelte/actions.d.ts +70 -0
  120. package/dist/svelte/actions.d.ts.map +1 -0
  121. package/dist/svelte/actions.js +280 -0
  122. package/dist/svelte/clock.svelte.d.ts +6 -0
  123. package/dist/svelte/clock.svelte.d.ts.map +1 -0
  124. package/dist/svelte/clock.svelte.js +33 -0
  125. package/dist/svelte/components/CreateSessionDialog.svelte +470 -0
  126. package/dist/svelte/components/CreateSessionDialog.svelte.d.ts +57 -0
  127. package/dist/svelte/components/CreateSessionDialog.svelte.d.ts.map +1 -0
  128. package/dist/svelte/components/SessionCard.svelte +216 -0
  129. package/dist/svelte/components/SessionCard.svelte.d.ts +27 -0
  130. package/dist/svelte/components/SessionCard.svelte.d.ts.map +1 -0
  131. package/dist/svelte/components/SessionList.svelte +86 -0
  132. package/dist/svelte/components/SessionList.svelte.d.ts +23 -0
  133. package/dist/svelte/components/SessionList.svelte.d.ts.map +1 -0
  134. package/dist/svelte/components/SessionSeed.svelte +60 -0
  135. package/dist/svelte/components/SessionSeed.svelte.d.ts +9 -0
  136. package/dist/svelte/components/SessionSeed.svelte.d.ts.map +1 -0
  137. package/dist/svelte/components/TranscriptView.svelte +360 -0
  138. package/dist/svelte/components/TranscriptView.svelte.d.ts +26 -0
  139. package/dist/svelte/components/TranscriptView.svelte.d.ts.map +1 -0
  140. package/dist/svelte/create-session-form.d.ts +84 -0
  141. package/dist/svelte/create-session-form.d.ts.map +1 -0
  142. package/dist/svelte/create-session-form.js +107 -0
  143. package/dist/svelte/index.d.ts +20 -0
  144. package/dist/svelte/index.d.ts.map +1 -0
  145. package/dist/svelte/index.js +18 -0
  146. package/dist/svelte/live-session.d.ts +156 -0
  147. package/dist/svelte/live-session.d.ts.map +1 -0
  148. package/dist/svelte/live-session.js +152 -0
  149. package/dist/svelte/loaders.d.ts +74 -0
  150. package/dist/svelte/loaders.d.ts.map +1 -0
  151. package/dist/svelte/loaders.js +124 -0
  152. package/dist/svelte/outcome.d.ts +46 -0
  153. package/dist/svelte/outcome.d.ts.map +1 -0
  154. package/dist/svelte/outcome.js +49 -0
  155. package/dist/svelte/relative-time.d.ts +32 -0
  156. package/dist/svelte/relative-time.d.ts.map +1 -0
  157. package/dist/svelte/relative-time.js +51 -0
  158. package/dist/svelte/session-list-item.d.ts +23 -0
  159. package/dist/svelte/session-list-item.d.ts.map +1 -0
  160. package/dist/svelte/session-list-item.js +1 -0
  161. package/dist/svelte/styles.css +8 -0
  162. package/dist/svelte/transcript-input.d.ts +45 -0
  163. package/dist/svelte/transcript-input.d.ts.map +1 -0
  164. package/dist/svelte/transcript-input.js +188 -0
  165. package/dist/tui/code-sessions-tui.plugin.d.ts +10 -0
  166. package/dist/tui/code-sessions-tui.plugin.d.ts.map +1 -0
  167. package/dist/tui/code-sessions-tui.plugin.js +29 -0
  168. package/dist/tui/code-sessions-tui.plugin.js.map +1 -0
  169. package/dist/tui/code-sessions.tui-app.descriptor.d.ts +7 -0
  170. package/dist/tui/code-sessions.tui-app.descriptor.d.ts.map +1 -0
  171. package/dist/tui/code-sessions.tui-app.descriptor.js +30 -0
  172. package/dist/tui/code-sessions.tui-app.descriptor.js.map +1 -0
  173. package/dist/tui/code-sessions.tui-app.impl.consumer.d.ts +14 -0
  174. package/dist/tui/code-sessions.tui-app.impl.consumer.d.ts.map +1 -0
  175. package/dist/tui/code-sessions.tui-app.impl.consumer.js +453 -0
  176. package/dist/tui/code-sessions.tui-app.impl.consumer.js.map +1 -0
  177. package/dist/tui/code-sessions.tui-client.d.ts +22 -0
  178. package/dist/tui/code-sessions.tui-client.d.ts.map +1 -0
  179. package/dist/tui/code-sessions.tui-client.js +95 -0
  180. package/dist/tui/code-sessions.tui-client.js.map +1 -0
  181. package/dist/tui/code-sessions.tui-open.descriptor.d.ts +7 -0
  182. package/dist/tui/code-sessions.tui-open.descriptor.d.ts.map +1 -0
  183. package/dist/tui/code-sessions.tui-open.descriptor.js +16 -0
  184. package/dist/tui/code-sessions.tui-open.descriptor.js.map +1 -0
  185. package/dist/tui/code-sessions.tui-open.impl.consumer.d.ts +7 -0
  186. package/dist/tui/code-sessions.tui-open.impl.consumer.d.ts.map +1 -0
  187. package/dist/tui/code-sessions.tui-open.impl.consumer.js +11 -0
  188. package/dist/tui/code-sessions.tui-open.impl.consumer.js.map +1 -0
  189. package/dist/tui/code-sessions.tui-state.descriptor.d.ts +16 -0
  190. package/dist/tui/code-sessions.tui-state.descriptor.d.ts.map +1 -0
  191. package/dist/tui/code-sessions.tui-state.descriptor.js +50 -0
  192. package/dist/tui/code-sessions.tui-state.descriptor.js.map +1 -0
  193. package/dist/tui/code-sessions.tui-state.impl.consumer.d.ts +30 -0
  194. package/dist/tui/code-sessions.tui-state.impl.consumer.d.ts.map +1 -0
  195. package/dist/tui/code-sessions.tui-state.impl.consumer.js +533 -0
  196. package/dist/tui/code-sessions.tui-state.impl.consumer.js.map +1 -0
  197. package/dist/tui/code-sessions.tui-state.key.d.ts +322 -0
  198. package/dist/tui/code-sessions.tui-state.key.d.ts.map +1 -0
  199. package/dist/tui/code-sessions.tui-state.key.js +104 -0
  200. package/dist/tui/code-sessions.tui-state.key.js.map +1 -0
  201. package/dist/tui/index.d.ts +9 -0
  202. package/dist/tui/index.d.ts.map +1 -0
  203. package/dist/tui/index.js +8 -0
  204. package/dist/tui/index.js.map +1 -0
  205. package/dist/workspace/index.d.ts +2 -0
  206. package/dist/workspace/index.d.ts.map +1 -0
  207. package/dist/workspace/index.js +2 -0
  208. package/dist/workspace/index.js.map +1 -0
  209. package/dist/workspace/workspace-binding.d.ts +74 -0
  210. package/dist/workspace/workspace-binding.d.ts.map +1 -0
  211. package/dist/workspace/workspace-binding.impl.consumer.worker.d.ts +17 -0
  212. package/dist/workspace/workspace-binding.impl.consumer.worker.d.ts.map +1 -0
  213. package/dist/workspace/workspace-binding.impl.consumer.worker.js +134 -0
  214. package/dist/workspace/workspace-binding.impl.consumer.worker.js.map +1 -0
  215. package/dist/workspace/workspace-binding.js +72 -0
  216. package/dist/workspace/workspace-binding.js.map +1 -0
  217. package/package.json +238 -4
@@ -0,0 +1,280 @@
1
+ import { CapabilityError, CaughtFailureSchema } from '@vibesdotdev/kernel';
2
+ import { JsonValueSchema } from '@vibesdotdev/kernel/schemas/json';
3
+ import * as z from 'zod/v4';
4
+ import { readUntrusted } from "./outcome.js";
5
+ const DEFAULT_CREATE_FAILURE_MESSAGE = 'Could not start the session. Please try again.';
6
+ const DEFAULT_DELETE_FAILURE_MESSAGE = 'Could not delete session. Try again.';
7
+ const DEFAULT_PUBLISH_FAILURE_MESSAGE = 'Could not publish this branch. Try again.';
8
+ const DEFAULT_MESSAGE_FIELDS = [
9
+ 'createMessage',
10
+ 'deleteMessage',
11
+ 'publishMessage',
12
+ 'message',
13
+ 'error'
14
+ ];
15
+ const NonBlankStringSchema = z.string().refine((value) => value.trim().length > 0);
16
+ /**
17
+ * The serialized action result, each field read independently: a malformed
18
+ * `status` never hides a readable `data` message, and a hostile value is read
19
+ * once inside {@link readUntrusted}.
20
+ */
21
+ const ActionResultSchema = z.object({
22
+ type: z.string().optional().catch(undefined),
23
+ status: z.number().int().optional().catch(undefined),
24
+ data: z.unknown().optional(),
25
+ location: NonBlankStringSchema.optional().catch(undefined),
26
+ error: z.unknown().optional()
27
+ });
28
+ const MessageRecordSchema = z.record(z.string(), z.unknown());
29
+ const MessageCarrierSchema = z.union([
30
+ NonBlankStringSchema,
31
+ z.object({ message: NonBlankStringSchema }).transform((carrier) => carrier.message)
32
+ ]);
33
+ const SessionIdCarrierSchema = z.object({ sessionId: NonBlankStringSchema });
34
+ function messageFromData(result, fields = DEFAULT_MESSAGE_FIELDS) {
35
+ const direct = NonBlankStringSchema.safeParse(result.data);
36
+ if (direct.success)
37
+ return direct.data;
38
+ const record = readUntrusted(MessageRecordSchema, result.data);
39
+ if (record.outcome !== 'parsed')
40
+ return null;
41
+ for (const field of fields) {
42
+ const value = NonBlankStringSchema.safeParse(record.data[field]);
43
+ if (value.success)
44
+ return value.data;
45
+ }
46
+ return null;
47
+ }
48
+ function messageFromError(result) {
49
+ const carrier = readUntrusted(MessageCarrierSchema, result.error);
50
+ return carrier.outcome === 'parsed' ? carrier.data : null;
51
+ }
52
+ function parseActionOutcome(result, responseStatus, options) {
53
+ const read = readUntrusted(ActionResultSchema, result);
54
+ if (read.outcome !== 'parsed') {
55
+ return {
56
+ ok: false,
57
+ status: responseStatus,
58
+ message: options.fallbackMessage
59
+ };
60
+ }
61
+ const actionResult = read.data;
62
+ const status = actionResult.status ?? responseStatus;
63
+ switch (actionResult.type) {
64
+ case 'success': {
65
+ const outcome = {
66
+ ok: true,
67
+ status
68
+ };
69
+ if (actionResult.data !== undefined) {
70
+ outcome.data = actionResult.data;
71
+ }
72
+ const carrier = readUntrusted(SessionIdCarrierSchema, actionResult.data);
73
+ if (carrier.outcome === 'parsed') {
74
+ outcome.sessionId = carrier.data.sessionId;
75
+ }
76
+ return outcome;
77
+ }
78
+ case 'redirect': {
79
+ const outcome = {
80
+ ok: true,
81
+ status
82
+ };
83
+ if (actionResult.data !== undefined) {
84
+ outcome.data = actionResult.data;
85
+ }
86
+ if (actionResult.location !== undefined) {
87
+ outcome.redirectLocation = actionResult.location;
88
+ }
89
+ return outcome;
90
+ }
91
+ case 'failure':
92
+ return {
93
+ ok: false,
94
+ status,
95
+ data: actionResult.data,
96
+ resultType: 'failure',
97
+ message: messageFromData(actionResult, options.messageFields) ?? options.fallbackMessage
98
+ };
99
+ case 'error':
100
+ return {
101
+ ok: false,
102
+ status,
103
+ data: actionResult.data,
104
+ resultType: 'error',
105
+ message: messageFromError(actionResult) ??
106
+ messageFromData(actionResult, options.messageFields) ??
107
+ options.fallbackMessage
108
+ };
109
+ default:
110
+ return {
111
+ ok: false,
112
+ status,
113
+ data: actionResult.data,
114
+ resultType: actionResult.type,
115
+ message: messageFromData(actionResult, options.messageFields) ?? options.fallbackMessage
116
+ };
117
+ }
118
+ }
119
+ async function submitSvelteKitAction(fetcher, deserialize, formData, options) {
120
+ const response = await fetcher(options.action, {
121
+ method: 'POST',
122
+ headers: { accept: 'application/json' },
123
+ body: formData
124
+ });
125
+ const text = await response.text();
126
+ let result;
127
+ try {
128
+ result = deserialize(text);
129
+ }
130
+ catch (error) {
131
+ // Not an action result (a proxy's HTML page, a server crash page): the
132
+ // person sees the surface's own copy and the status, never the raw body.
133
+ return {
134
+ ok: false,
135
+ status: response.status,
136
+ message: options.fallbackMessage,
137
+ failure: new CapabilityError('The action response could not be read.', 'INTERNAL', {
138
+ reason: 'action-response-unreadable',
139
+ details: { status: response.status },
140
+ cause: CaughtFailureSchema.parse(error)
141
+ })
142
+ };
143
+ }
144
+ return parseActionOutcome(result, response.status, options);
145
+ }
146
+ export function createCodeSessionActionFormData(input) {
147
+ const body = new FormData();
148
+ body.set('hostTarget', JSON.stringify(input.hostTarget));
149
+ if ('repositoryId' in input && input.repositoryId) {
150
+ body.set('repositoryId', input.repositoryId);
151
+ }
152
+ if ('checkoutRef' in input && input.checkoutRef) {
153
+ body.set('checkoutRef', input.checkoutRef);
154
+ }
155
+ if ('ephemeral' in input && input.ephemeral) {
156
+ body.set('ephemeral', 'true');
157
+ }
158
+ // The seed is what lets a finished session say which work item it came from.
159
+ // It was absent here while the dialog and the create input both carried it, so
160
+ // the object looked correct at every unit boundary and the REAL HTTP request
161
+ // still forgot the work item — a green that stopped being true at the wire.
162
+ if (input.seed) {
163
+ body.set('seed', JSON.stringify(input.seed));
164
+ }
165
+ return body;
166
+ }
167
+ /**
168
+ * Read the seed back off an action FormData. The parser lives beside the
169
+ * serializer deliberately: the two are one contract, and a server route
170
+ * hand-rolling `JSON.parse(data.get('seed'))` is how the shapes drift apart.
171
+ *
172
+ * Absent seed → `undefined`; sessions without an originating record are normal.
173
+ * PRESENT BUT MALFORMED → throws. A caller that sent a seed meant to attach one,
174
+ * and silently dropping it would mint an untraceable session while reporting
175
+ * success — the same failure class as forgetting to serialize it.
176
+ */
177
+ export function parseCodeSessionSeedFormValue(value) {
178
+ if (value === null || value === undefined || value === '')
179
+ return undefined;
180
+ if (value instanceof File)
181
+ throw invalidSeed('seed must be a JSON string, received a file upload');
182
+ let parsed;
183
+ try {
184
+ parsed = SeedJsonSchema.parse(JSON.parse(value));
185
+ }
186
+ catch (error) {
187
+ throw invalidSeed('seed is not valid JSON', CaughtFailureSchema.parse(error));
188
+ }
189
+ const seed = readUntrusted(SeedFieldsSchema, parsed);
190
+ if (seed.outcome !== 'parsed')
191
+ throw invalidSeed('seed must be an object');
192
+ // `source` and `title` are the two the platform threads into the sandbox as
193
+ // VIBES_SEED_*; a seed missing either is not traceable and is not worth attaching.
194
+ if (seed.data.source === undefined)
195
+ throw invalidSeed('seed.source is required');
196
+ if (seed.data.title === undefined)
197
+ throw invalidSeed('seed.title is required');
198
+ const out = { source: seed.data.source, title: seed.data.title };
199
+ if (seed.data.ref !== undefined)
200
+ out.ref = seed.data.ref;
201
+ if (seed.data.body !== undefined)
202
+ out.body = seed.data.body;
203
+ return out;
204
+ }
205
+ /** JSON text as a value; any JSON parses. */
206
+ const SeedJsonSchema = JsonValueSchema;
207
+ /** Each seed field read on its own: a non-string optional field is dropped, never fatal. */
208
+ const NonEmptyStringSchema = z.string().min(1);
209
+ const SeedFieldsSchema = z.object({
210
+ source: NonEmptyStringSchema.optional().catch(undefined),
211
+ title: NonEmptyStringSchema.optional().catch(undefined),
212
+ ref: NonEmptyStringSchema.optional().catch(undefined),
213
+ body: NonEmptyStringSchema.optional().catch(undefined)
214
+ });
215
+ /** A malformed seed: `INVALID_INPUT` / `seed-invalid`. */
216
+ function invalidSeed(message, cause) {
217
+ return new CapabilityError(message, 'INVALID_INPUT', { reason: 'seed-invalid', cause });
218
+ }
219
+ export function deleteCodeSessionActionFormData(sessionId) {
220
+ const body = new FormData();
221
+ body.set('sessionId', sessionId);
222
+ return body;
223
+ }
224
+ export async function submitCodeSessionCreateAction(fetcher, deserialize, input, options = {}) {
225
+ return submitSvelteKitAction(fetcher, deserialize, createCodeSessionActionFormData(input), {
226
+ action: options.action ?? '?/create',
227
+ fallbackMessage: options.fallbackMessage ?? DEFAULT_CREATE_FAILURE_MESSAGE,
228
+ messageFields: options.messageFields ?? DEFAULT_MESSAGE_FIELDS
229
+ });
230
+ }
231
+ /**
232
+ * Form body for publishing a session's branch.
233
+ *
234
+ * `branch` is optional and OMITTED when blank rather than sent empty: the server
235
+ * treats an absent branch as "use whatever the session is actually on", which is
236
+ * the right default and the only thing a caller can honestly say without reading
237
+ * the workspace. Sending `branch=''` would look like a deliberate choice of a
238
+ * branch named nothing.
239
+ */
240
+ export function publishCodeSessionActionFormData(branch) {
241
+ const body = new FormData();
242
+ const trimmed = branch?.trim();
243
+ if (trimmed)
244
+ body.set('branch', trimmed);
245
+ return body;
246
+ }
247
+ /**
248
+ * Publish the session's branch through the surface's own `?/publish` action.
249
+ *
250
+ * A refused push — protected branch, non-fast-forward, a lapsed entitlement — is
251
+ * an ordinary outcome with a message worth reading, not an exception. It comes
252
+ * back as `{ok: false, message}` like every other action here, so the surface
253
+ * shows it instead of replacing the page the person was watching.
254
+ */
255
+ export async function submitCodeSessionPublishAction(fetcher, deserialize, branch, options = {}) {
256
+ return submitSvelteKitAction(fetcher, deserialize, publishCodeSessionActionFormData(branch), {
257
+ action: options.action ?? '?/publish',
258
+ fallbackMessage: options.fallbackMessage ?? DEFAULT_PUBLISH_FAILURE_MESSAGE,
259
+ messageFields: options.messageFields ?? DEFAULT_MESSAGE_FIELDS
260
+ });
261
+ }
262
+ const DEFAULT_CREATE_PR_FAILURE_MESSAGE = 'Could not open a pull request. Try again.';
263
+ /**
264
+ * Open a forge PR from the published session branch via `?/createPullRequest`.
265
+ * Title/body/head are re-planned on the platform — not invented by the form.
266
+ */
267
+ export async function submitCodeSessionCreatePullRequestAction(fetcher, deserialize, options = {}) {
268
+ return submitSvelteKitAction(fetcher, deserialize, new FormData(), {
269
+ action: options.action ?? '?/createPullRequest',
270
+ fallbackMessage: options.fallbackMessage ?? DEFAULT_CREATE_PR_FAILURE_MESSAGE,
271
+ messageFields: options.messageFields ?? ['prMessage', 'message', 'error']
272
+ });
273
+ }
274
+ export async function submitCodeSessionDeleteAction(fetcher, deserialize, sessionId, options = {}) {
275
+ return submitSvelteKitAction(fetcher, deserialize, deleteCodeSessionActionFormData(sessionId), {
276
+ action: options.action ?? '?/delete',
277
+ fallbackMessage: options.fallbackMessage ?? DEFAULT_DELETE_FAILURE_MESSAGE,
278
+ messageFields: options.messageFields ?? DEFAULT_MESSAGE_FIELDS
279
+ });
280
+ }
@@ -0,0 +1,6 @@
1
+ export interface SharedNow {
2
+ readonly value: number;
3
+ }
4
+ /** Subscribe after client activation. SSR runs no effect and starts no timer. */
5
+ export declare function sharedNow(): SharedNow;
6
+ //# sourceMappingURL=clock.svelte.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"clock.svelte.d.ts","sourceRoot":"","sources":["../../src/svelte/clock.svelte.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,SAAS;IAAG,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CAAE;AAEtD,iFAAiF;AACjF,wBAAgB,SAAS,IAAI,SAAS,CA2BrC"}
@@ -0,0 +1,33 @@
1
+ import { getVibesClient, tryGetVibesClient } from '@vibesdotdev/kernel/client';
2
+ import { getRuntimeSvelteContext } from '@vibesdotdev/surface-sveltekit/svelte';
3
+ import { getLogger } from '@vibesdotdev/logging';
4
+ import { attempt } from "./outcome.js";
5
+ /** Subscribe after client activation. SSR runs no effect and starts no timer. */
6
+ export function sharedNow() {
7
+ const context = getRuntimeSvelteContext();
8
+ const cell = $state({ now: Date.now() });
9
+ $effect(() => {
10
+ const runtime = context.runtime;
11
+ if (!runtime)
12
+ return;
13
+ const lifecycle = runtime.lifecycle;
14
+ let cancelled = false;
15
+ let release;
16
+ void attempt(async () => {
17
+ const clock = await getVibesClient('code-sessions.clock', runtime);
18
+ await clock.ensureLoaded();
19
+ return clock;
20
+ }).then(activated => {
21
+ if (cancelled || lifecycle.signal.aborted)
22
+ return;
23
+ if (!activated.ok) {
24
+ getLogger('code-sessions:clock', runtime).warn('Shared clock activation failed.', { error: activated.failure });
25
+ return;
26
+ }
27
+ const clock = tryGetVibesClient('code-sessions.clock', runtime);
28
+ release = clock?.subscribe(now => { cell.now = now; });
29
+ });
30
+ return () => { cancelled = true; release?.(); };
31
+ });
32
+ return { get value() { return cell.now; } };
33
+ }