@opengeni/sdk 3.3.2-canary.1 → 3.4.0

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 (295) hide show
  1. package/README.md +1007 -72
  2. package/dist/adapters/express.d.ts +31 -0
  3. package/dist/adapters/express.js +87 -0
  4. package/dist/adapters/express.js.map +1 -0
  5. package/dist/adapters/hono.d.ts +16 -0
  6. package/dist/adapters/hono.js +8 -0
  7. package/dist/adapters/hono.js.map +1 -0
  8. package/dist/adapters/next.d.ts +29 -0
  9. package/dist/adapters/next.js +22 -0
  10. package/dist/adapters/next.js.map +1 -0
  11. package/dist/allowance-refusal.d.ts +2 -0
  12. package/dist/allowance-refusal.js +50 -0
  13. package/dist/allowance-refusal.js.map +1 -0
  14. package/dist/app-links.d.ts +42 -0
  15. package/dist/app-links.js +66 -0
  16. package/dist/app-links.js.map +1 -0
  17. package/dist/artifact-catalog.d.ts +40 -0
  18. package/dist/artifact-client.d.ts +20 -8
  19. package/dist/artifacts.d.ts +1 -1
  20. package/dist/artifacts.js +8 -6
  21. package/dist/automations.js +8 -2
  22. package/dist/automations.js.map +1 -1
  23. package/dist/azure-live-transport.d.ts +32 -0
  24. package/dist/browser.d.ts +6 -2
  25. package/dist/browser.js +25 -5
  26. package/dist/chat/fold.d.ts +75 -0
  27. package/dist/chat/handler.d.ts +41 -0
  28. package/dist/chat/http.d.ts +67 -0
  29. package/dist/chat/ids.d.ts +34 -0
  30. package/dist/chat/index.d.ts +9 -0
  31. package/dist/chat/index.js +1369 -0
  32. package/dist/chat/index.js.map +1 -0
  33. package/dist/chat/openai.d.ts +30 -0
  34. package/dist/chat/opengeni.d.ts +129 -0
  35. package/dist/chat/types.d.ts +207 -0
  36. package/dist/chat/vercel.d.ts +49 -0
  37. package/dist/chats.d.ts +8 -0
  38. package/dist/chunk-4AHR4KGA.js +301 -0
  39. package/dist/chunk-4AHR4KGA.js.map +1 -0
  40. package/dist/chunk-6GYGMLX4.js +332 -0
  41. package/dist/chunk-6GYGMLX4.js.map +1 -0
  42. package/dist/chunk-7EWT3PV6.js +368 -0
  43. package/dist/chunk-7EWT3PV6.js.map +1 -0
  44. package/dist/chunk-FTWVVPR6.js +1665 -0
  45. package/dist/chunk-FTWVVPR6.js.map +1 -0
  46. package/dist/{chunk-VYCTL62C.js → chunk-GZQSWAKD.js} +1 -1
  47. package/dist/chunk-GZQSWAKD.js.map +1 -0
  48. package/dist/chunk-KGEABAID.js +71 -0
  49. package/dist/chunk-KGEABAID.js.map +1 -0
  50. package/dist/{chunk-YKZME56C.js → chunk-KWADQ227.js} +3 -3
  51. package/dist/{chunk-YKZME56C.js.map → chunk-KWADQ227.js.map} +1 -1
  52. package/dist/{chunk-E5BNEG2D.js → chunk-NCU5OAN7.js} +27 -2
  53. package/dist/chunk-NCU5OAN7.js.map +1 -0
  54. package/dist/{chunk-BESZFWMU.js → chunk-OI5YLASH.js} +73 -2
  55. package/dist/chunk-OI5YLASH.js.map +1 -0
  56. package/dist/chunk-OV3POE62.js +359 -0
  57. package/dist/chunk-OV3POE62.js.map +1 -0
  58. package/dist/chunk-P7UWKORG.js +561 -0
  59. package/dist/chunk-P7UWKORG.js.map +1 -0
  60. package/dist/chunk-QGEIL4TR.js +195 -0
  61. package/dist/chunk-QGEIL4TR.js.map +1 -0
  62. package/dist/{chunk-GY6RQPCG.js → chunk-S2NLS3ES.js} +3598 -1278
  63. package/dist/chunk-S2NLS3ES.js.map +1 -0
  64. package/dist/chunk-UM4ZXXJR.js +9 -0
  65. package/dist/chunk-UM4ZXXJR.js.map +1 -0
  66. package/dist/{chunk-TFCLHRZK.js → chunk-UME3X7CP.js} +28 -32
  67. package/dist/chunk-UME3X7CP.js.map +1 -0
  68. package/dist/chunk-VT4YM4XQ.js +210 -0
  69. package/dist/chunk-VT4YM4XQ.js.map +1 -0
  70. package/dist/chunk-WSYYXONG.js +1602 -0
  71. package/dist/chunk-WSYYXONG.js.map +1 -0
  72. package/dist/{chunk-6NEPJ7NC.js → chunk-WVCJRSGJ.js} +119 -14
  73. package/dist/chunk-WVCJRSGJ.js.map +1 -0
  74. package/dist/chunk-X5ITQVXE.js +15 -0
  75. package/dist/chunk-X5ITQVXE.js.map +1 -0
  76. package/dist/chunk-XA7HVIHI.js +126 -0
  77. package/dist/chunk-XA7HVIHI.js.map +1 -0
  78. package/dist/{chunk-QTBAMHEF.js → chunk-YJCHB7R3.js} +60 -12
  79. package/dist/chunk-YJCHB7R3.js.map +1 -0
  80. package/dist/chunk-YKIHNLWD.js +153 -0
  81. package/dist/chunk-YKIHNLWD.js.map +1 -0
  82. package/dist/chunk-ZDUBPV33.js +277 -0
  83. package/dist/chunk-ZDUBPV33.js.map +1 -0
  84. package/dist/client.d.ts +1056 -118
  85. package/dist/codex-realtime-controller.d.ts +13 -0
  86. package/dist/codex-realtime-controller.js +4 -2
  87. package/dist/codex-realtime-v3-wire.d.ts +3 -2
  88. package/dist/codex-realtime.d.ts +5 -1
  89. package/dist/company-brain.d.ts +1 -11
  90. package/dist/core.d.ts +6 -2
  91. package/dist/core.js +23 -6
  92. package/dist/deprecation.d.ts +47 -0
  93. package/dist/document-authority-client.d.ts +24 -2
  94. package/dist/document-authority.js +7 -5
  95. package/dist/editable-artifacts/index.d.ts +1 -1
  96. package/dist/editable-artifacts/types.d.ts +12 -2
  97. package/dist/editable-artifacts.js +19 -3
  98. package/dist/editable-artifacts.js.map +1 -1
  99. package/dist/embedding-client.d.ts +129 -0
  100. package/dist/errors.d.ts +64 -1
  101. package/dist/external-vault-receiver.d.ts +203 -0
  102. package/dist/external-vault-receiver.js +564 -0
  103. package/dist/external-vault-receiver.js.map +1 -0
  104. package/dist/feedback.d.ts +23 -0
  105. package/dist/gateway-realtime-transport.js +1 -1
  106. package/dist/github-repositories.d.ts +10 -0
  107. package/dist/github-repositories.js +36 -0
  108. package/dist/github-repositories.js.map +1 -0
  109. package/dist/index.d.ts +61 -11
  110. package/dist/index.js +555 -338
  111. package/dist/index.js.map +1 -1
  112. package/dist/insights-usage.d.ts +33 -0
  113. package/dist/insights-usage.js +7 -0
  114. package/dist/insights-usage.js.map +1 -0
  115. package/dist/interaction.d.ts +165 -71
  116. package/dist/interaction.js +2 -2
  117. package/dist/knowledge.d.ts +7 -0
  118. package/dist/knowledge.js +20 -0
  119. package/dist/knowledge.js.map +1 -0
  120. package/dist/known-tools.d.ts +4 -0
  121. package/dist/message-links.d.ts +68 -0
  122. package/dist/model-context.d.ts +68 -0
  123. package/dist/model-display.d.ts +2 -0
  124. package/dist/model-display.js +17 -0
  125. package/dist/model-display.js.map +1 -0
  126. package/dist/organization-integration-policy.d.ts +26 -0
  127. package/dist/organization-integration-policy.js +26 -0
  128. package/dist/organization-integration-policy.js.map +1 -0
  129. package/dist/pr-review-client.d.ts +1 -1
  130. package/dist/pr-review.d.ts +1 -1
  131. package/dist/pr-review.js.map +1 -1
  132. package/dist/preference-registry.d.ts +1 -1
  133. package/dist/prepared-mcp-setup.d.ts +5 -0
  134. package/dist/proxy.d.ts +13 -11
  135. package/dist/realtime.d.ts +1 -1
  136. package/dist/realtime.js +253 -7
  137. package/dist/realtime.js.map +1 -1
  138. package/dist/session-history-import.d.ts +22 -0
  139. package/dist/session-history-import.js +36 -0
  140. package/dist/session-history-import.js.map +1 -0
  141. package/dist/session-list-entries.d.ts +1 -0
  142. package/dist/session-list-entries.js +7 -0
  143. package/dist/session-list-entries.js.map +1 -0
  144. package/dist/session-message-search.d.ts +53 -0
  145. package/dist/session-proxy-client.d.ts +28 -0
  146. package/dist/session-proxy.d.ts +334 -0
  147. package/dist/session-proxy.js +24 -0
  148. package/dist/session-proxy.js.map +1 -0
  149. package/dist/session-titles.d.ts +2 -28
  150. package/dist/session-usage-limits.d.ts +10 -0
  151. package/dist/session-usage-limits.js +43 -0
  152. package/dist/session-usage-limits.js.map +1 -0
  153. package/dist/shared-catalog-loader.d.ts +34 -0
  154. package/dist/site-ai.d.ts +35 -0
  155. package/dist/site-bridge-host.d.ts +112 -0
  156. package/dist/site-bridge-host.js +286 -0
  157. package/dist/site-bridge-host.js.map +1 -0
  158. package/dist/site-browser-entry.d.ts +1 -0
  159. package/dist/site-browser-runtime.gen.d.ts +1 -0
  160. package/dist/site-data.d.ts +178 -0
  161. package/dist/site-document.d.ts +5 -0
  162. package/dist/site-document.js +20 -0
  163. package/dist/site-document.js.map +1 -0
  164. package/dist/site-document.test.d.ts +1 -0
  165. package/dist/site-http.d.ts +17 -0
  166. package/dist/site-sql.d.ts +31 -0
  167. package/dist/site-tool-bridge.d.ts +57 -0
  168. package/dist/site.d.ts +186 -0
  169. package/dist/site.js +63 -0
  170. package/dist/site.js.map +1 -0
  171. package/dist/skills.d.ts +75 -0
  172. package/dist/sse.d.ts +1 -1
  173. package/dist/stream.d.ts +2 -0
  174. package/dist/tenant-workspaces.d.ts +47 -0
  175. package/dist/tenant-workspaces.js +8 -0
  176. package/dist/tenant-workspaces.js.map +1 -0
  177. package/dist/tool-auth.d.ts +87 -0
  178. package/dist/tool-auth.js +23 -0
  179. package/dist/tool-auth.js.map +1 -0
  180. package/dist/tool-display-metadata.d.ts +3 -0
  181. package/dist/tools-37DCTCNZ.js +12 -0
  182. package/dist/tools-37DCTCNZ.js.map +1 -0
  183. package/dist/tools.d.ts +81 -0
  184. package/dist/transcription.d.ts +1 -1
  185. package/dist/types.d.ts +2785 -592
  186. package/dist/usage-allowances.d.ts +36 -0
  187. package/dist/usage-allowances.js +80 -0
  188. package/dist/usage-allowances.js.map +1 -0
  189. package/dist/vault-types.d.ts +324 -0
  190. package/dist/vaults-api.d.ts +65 -0
  191. package/dist/workspace-artifacts.d.ts +47 -5
  192. package/dist/workspace-instruction-policies.d.ts +2 -2
  193. package/dist/workspace-integrations.d.ts +74 -0
  194. package/dist/workspace-integrations.js +67 -0
  195. package/dist/workspace-integrations.js.map +1 -0
  196. package/dist/workspace-state.d.ts +8 -71
  197. package/package.json +99 -5
  198. package/src/adapters/express.ts +136 -0
  199. package/src/adapters/hono.ts +18 -0
  200. package/src/adapters/next.ts +42 -0
  201. package/src/allowance-refusal.ts +5 -0
  202. package/src/app-links.ts +117 -0
  203. package/src/artifact-catalog.ts +51 -0
  204. package/src/artifact-client.ts +40 -49
  205. package/src/artifacts.ts +1 -0
  206. package/src/automations-client.ts +8 -2
  207. package/src/azure-live-transport.ts +286 -0
  208. package/src/browser.ts +35 -0
  209. package/src/chat/fold.ts +431 -0
  210. package/src/chat/handler.ts +240 -0
  211. package/src/chat/http.ts +257 -0
  212. package/src/chat/ids.ts +85 -0
  213. package/src/chat/index.ts +88 -0
  214. package/src/chat/openai.ts +439 -0
  215. package/src/chat/opengeni.ts +737 -0
  216. package/src/chat/types.ts +219 -0
  217. package/src/chat/vercel.ts +204 -0
  218. package/src/chats.ts +16 -0
  219. package/src/client.ts +5595 -1847
  220. package/src/codex-realtime-controller.ts +163 -8
  221. package/src/codex-realtime-v3-wire.ts +4 -3
  222. package/src/codex-realtime-v3.ts +12 -3
  223. package/src/codex-realtime.ts +11 -3
  224. package/src/company-brain.ts +0 -40
  225. package/src/core.ts +18 -0
  226. package/src/deprecation.ts +149 -0
  227. package/src/document-authority-client.ts +104 -1
  228. package/src/editable-artifacts/controller.ts +36 -2
  229. package/src/editable-artifacts/index.ts +1 -0
  230. package/src/editable-artifacts/types.ts +29 -16
  231. package/src/embedding-client.ts +519 -0
  232. package/src/errors.ts +281 -5
  233. package/src/external-vault-receiver.ts +914 -0
  234. package/src/feedback.ts +20 -0
  235. package/src/gateway-realtime-transport.ts +3 -3
  236. package/src/github-repositories.ts +60 -0
  237. package/src/index.ts +592 -65
  238. package/src/insights-usage.ts +64 -0
  239. package/src/interaction.ts +315 -93
  240. package/src/knowledge.ts +72 -0
  241. package/src/known-tools.ts +279 -0
  242. package/src/message-links.ts +178 -0
  243. package/src/model-context.ts +113 -0
  244. package/src/model-display.ts +11 -0
  245. package/src/organization-integration-policy.ts +54 -0
  246. package/src/pr-review-client.ts +1 -1
  247. package/src/pr-review.ts +1 -1
  248. package/src/preference-registry.ts +2 -0
  249. package/src/prepared-mcp-setup.ts +123 -0
  250. package/src/proxy.ts +23 -12
  251. package/src/realtime.ts +15 -6
  252. package/src/session-history-import.ts +84 -0
  253. package/src/session-list-entries.ts +1 -0
  254. package/src/session-message-search.ts +47 -0
  255. package/src/session-proxy-client.ts +68 -0
  256. package/src/session-proxy.ts +2098 -0
  257. package/src/session-titles.ts +8 -82
  258. package/src/session-usage-limits.ts +71 -0
  259. package/src/shared-catalog-loader.ts +169 -0
  260. package/src/site-ai.ts +284 -0
  261. package/src/site-bridge-host.ts +422 -0
  262. package/src/site-browser-entry.ts +6 -0
  263. package/src/site-browser-runtime.gen.ts +2 -0
  264. package/src/site-data.ts +372 -0
  265. package/src/site-document.test.ts +64 -0
  266. package/src/site-document.ts +18 -0
  267. package/src/site-http.ts +171 -0
  268. package/src/site-sql.ts +153 -0
  269. package/src/site-tool-bridge.ts +401 -0
  270. package/src/site.ts +878 -0
  271. package/src/skills.ts +69 -0
  272. package/src/sse.ts +9 -3
  273. package/src/stream.ts +33 -10
  274. package/src/tenant-workspaces.ts +148 -0
  275. package/src/tool-auth.ts +301 -0
  276. package/src/tool-display-metadata.ts +27 -0
  277. package/src/tools.ts +452 -0
  278. package/src/transcription.ts +3 -0
  279. package/src/types.ts +3142 -594
  280. package/src/usage-allowances.ts +189 -0
  281. package/src/vault-types.ts +379 -0
  282. package/src/vaults-api.ts +339 -0
  283. package/src/workspace-artifacts.ts +55 -6
  284. package/src/workspace-instruction-policies.ts +2 -1
  285. package/src/workspace-integrations.ts +402 -0
  286. package/src/workspace-state.ts +8 -82
  287. package/dist/chunk-6NEPJ7NC.js.map +0 -1
  288. package/dist/chunk-BESZFWMU.js.map +0 -1
  289. package/dist/chunk-E5BNEG2D.js.map +0 -1
  290. package/dist/chunk-GY6RQPCG.js.map +0 -1
  291. package/dist/chunk-OO5LPTO7.js +0 -132
  292. package/dist/chunk-OO5LPTO7.js.map +0 -1
  293. package/dist/chunk-QTBAMHEF.js.map +0 -1
  294. package/dist/chunk-TFCLHRZK.js.map +0 -1
  295. package/dist/chunk-VYCTL62C.js.map +0 -1
@@ -1,5 +1,13 @@
1
+ import type { CompanyBrainOkfDownload, CompanyBrainOkfPackage } from "./company-brain";
1
2
  import { OpenGeniClient as OpenGeniCoreClient } from "./client";
2
3
  import type {
4
+ ApiKey,
5
+ UpdateOrganizationApiKeyRequest,
6
+ Document,
7
+ IssueUserResourceGrantRequest,
8
+ UserResourceGrantMutationResponse,
9
+ DocumentBase,
10
+ FileDownloadUrlResponse,
3
11
  DocumentAuthorityReclassification,
4
12
  DocumentDefaultCollectionBackfill,
5
13
  DocumentDefaultCollectionBackfillAudit,
@@ -13,13 +21,108 @@ import type {
13
21
  } from "./types";
14
22
 
15
23
  /**
16
- * Operator-only Document authority and tenancy-backfill surface.
24
+ * Operator-only authority administration and Document tenancy-backfill surface.
17
25
  *
18
26
  * The public root and legacy `core` clients extend this class for compatibility.
19
27
  * Browser consoles that import `@opengeni/sdk/browser` do not retain these
20
28
  * methods or their routes.
21
29
  */
22
30
  export class OpenGeniDocumentAuthorityClient extends OpenGeniCoreClient {
31
+ /** Read organization-key metadata and policy; never returns the secret token. */
32
+ async getOrganizationApiKey(organizationId: string, apiKeyId: string): Promise<ApiKey> {
33
+ return await this.requestJson<ApiKey>(
34
+ "GET",
35
+ `/v1/organizations/${organizationId}/api-keys/${apiKeyId}`,
36
+ );
37
+ }
38
+
39
+ /** Update metadata or replace the policy. Policy narrowing applies on the next request. */
40
+ async updateOrganizationApiKey(
41
+ organizationId: string,
42
+ apiKeyId: string,
43
+ request: UpdateOrganizationApiKeyRequest,
44
+ ): Promise<ApiKey> {
45
+ return await this.requestJson<ApiKey>(
46
+ "PATCH",
47
+ `/v1/organizations/${organizationId}/api-keys/${apiKeyId}`,
48
+ request,
49
+ );
50
+ }
51
+
52
+ /** Issue an exact-session or standing personal-resource grant. */
53
+ async issueUserResourceGrant(
54
+ workspaceId: string,
55
+ authorityId: string,
56
+ request: IssueUserResourceGrantRequest,
57
+ ): Promise<UserResourceGrantMutationResponse> {
58
+ return await this.requestJson<UserResourceGrantMutationResponse>(
59
+ "POST",
60
+ `/v1/workspaces/${workspaceId}/user-resource-authorities/${authorityId}/grants`,
61
+ request,
62
+ );
63
+ }
64
+
65
+ async listDocumentBases(workspaceId: string): Promise<DocumentBase[]> {
66
+ return await this.requestJson<DocumentBase[]>(
67
+ "GET",
68
+ `/v1/workspaces/${workspaceId}/document-bases`,
69
+ );
70
+ }
71
+
72
+ /**
73
+ * List every Document the current human can manage from this workspace,
74
+ * including portable personal and organization-scoped Documents whose
75
+ * immutable ingestion workspace is different.
76
+ */
77
+ async listAccessibleDocuments(workspaceId: string): Promise<Document[]> {
78
+ return await this.requestJson<Document[]>("GET", `/v1/workspaces/${workspaceId}/documents`);
79
+ }
80
+
81
+ /** Mint a source-file URL through the Document's effective authority. */
82
+ async createDocumentOriginalFileDownloadUrl(
83
+ workspaceId: string,
84
+ documentId: string,
85
+ ): Promise<FileDownloadUrlResponse> {
86
+ return await this.requestJson<FileDownloadUrlResponse>(
87
+ "POST",
88
+ `/v1/workspaces/${workspaceId}/documents/${documentId}/original-file/download-url`,
89
+ );
90
+ }
91
+
92
+ /** Retry indexing for a failed document. */
93
+ async reindexDocument(
94
+ workspaceId: string,
95
+ baseId: string,
96
+ documentId: string,
97
+ ): Promise<Document> {
98
+ return await this.requestJson<Document>(
99
+ "POST",
100
+ `/v1/workspaces/${workspaceId}/document-bases/${baseId}/documents/${documentId}/reindex`,
101
+ );
102
+ }
103
+
104
+ /** Permission-filtered Company Brain package with authorized guidance bodies. */
105
+ getCompanyBrain(workspaceId: string): Promise<CompanyBrainOkfPackage> {
106
+ return this.requestJson<CompanyBrainOkfPackage>(
107
+ "GET",
108
+ `/v1/workspaces/${workspaceId}/company-brain`,
109
+ );
110
+ }
111
+
112
+ /** Download the deterministic Markdown/YAML Company Brain package. */
113
+ async exportCompanyBrainOkf(workspaceId: string): Promise<CompanyBrainOkfDownload> {
114
+ const response = await this.requestResponse(
115
+ "GET",
116
+ `/v1/workspaces/${workspaceId}/company-brain/export`,
117
+ );
118
+ const headers = response.headers;
119
+ return {
120
+ content: await response.text(),
121
+ contentType: headers.get("content-type") ?? "text/markdown",
122
+ filename: headers.get("content-disposition")?.split('"')[1] ?? "company-brain.okf.md",
123
+ };
124
+ }
125
+
23
126
  /**
24
127
  * Atomically reclassify a Document's authority and every indexed chunk.
25
128
  * The operation is replay-safe and rejects a stale expected authority tuple.
@@ -378,6 +378,15 @@ class EditableArtifactSyncControllerImpl implements EditableArtifactSyncControll
378
378
  }
379
379
 
380
380
  getView(): EditableArtifactSyncView {
381
+ const blockedPending = this.allBlockedPending();
382
+ const authoringBlockedReason =
383
+ this.modality !== "spreadsheet" && blockedPending.length > 0
384
+ ? "pending_conflict"
385
+ : this.orderedPending().some(
386
+ (transaction) => transaction.replicaId !== this.writerReplicaId,
387
+ )
388
+ ? "prior_writer"
389
+ : undefined;
381
390
  return {
382
391
  artifactId: this.artifactId,
383
392
  modality: this.modality,
@@ -386,7 +395,8 @@ class EditableArtifactSyncControllerImpl implements EditableArtifactSyncControll
386
395
  headSequence: this.headSequence,
387
396
  writable: this.writable,
388
397
  pendingTransactions: this.pending.size,
389
- blockedPending: this.allBlockedPending(),
398
+ blockedPending,
399
+ authoringBlockedReason,
390
400
  queuedMessages: this.liveQueue.length,
391
401
  reconnectAttempt: this.reconnectAttempt,
392
402
  lastError: this.lastError,
@@ -714,8 +724,15 @@ class EditableArtifactSyncControllerImpl implements EditableArtifactSyncControll
714
724
  stored.snapshot.modality === "spreadsheet" ? stored.snapshot.causalFrontier : null;
715
725
  let nativeRevision =
716
726
  stored.snapshot.modality === "spreadsheet" ? null : stored.snapshot.nativeRevision;
727
+ const retainedAcceptances: {
728
+ transaction: EditableArtifactCommittedTransaction;
729
+ pending: Pick<
730
+ EditableArtifactPendingTransaction,
731
+ "clientTransactionId" | "requestHash" | "intentBytes"
732
+ >;
733
+ }[] = [];
717
734
  for (const transaction of stored.tail) {
718
- validateCommittedTransaction(
735
+ const embeddedPending = validateCommittedTransaction(
719
736
  transaction,
720
737
  this.artifactId,
721
738
  this.modality,
@@ -728,6 +745,15 @@ class EditableArtifactSyncControllerImpl implements EditableArtifactSyncControll
728
745
  requireStateHash(transaction.priorStateHash, stateHash, "retained transaction prior state");
729
746
  const applied = await this.kernel.applyRecovered(transaction);
730
747
  requireStateHash(applied.stateHash, transaction.stateHash, "retained transaction");
748
+ if (embeddedPending) {
749
+ const pending = this.pending.get(embeddedPending.clientTransactionId);
750
+ if (
751
+ pending?.requestHash === embeddedPending.requestHash &&
752
+ bytesEqual(pending.intentBytes, embeddedPending.intentBytes)
753
+ ) {
754
+ retainedAcceptances.push({ transaction, pending: embeddedPending });
755
+ }
756
+ }
731
757
  cursor = transaction.endSequence;
732
758
  stateHash = transaction.stateHash;
733
759
  if (transaction.modality === "spreadsheet") {
@@ -763,6 +789,14 @@ class EditableArtifactSyncControllerImpl implements EditableArtifactSyncControll
763
789
  this.retainedTailTransactions = stored.tail.length;
764
790
  this.cursor = cursor;
765
791
  this.headSequence = cursor;
792
+ // Reload may interrupt between retaining a commit and deleting its WAL entry.
793
+ // Only settle exact embedded identities after the entire retained head verifies;
794
+ // otherwise speculative replay mistakes our own committed edit for a conflict.
795
+ // Callers restore the pending overlay after this confirmed projection is ready.
796
+ for (const { transaction, pending } of retainedAcceptances) {
797
+ this.recordAcceptedMappingIdentity(transaction.transactionId, pending);
798
+ await this.settlePending(transaction, true);
799
+ }
766
800
  }
767
801
 
768
802
  private async run(): Promise<void> {
@@ -99,6 +99,7 @@ export type {
99
99
  EditablePresentationSlideCatalogProjection,
100
100
  EditablePresentationSlideCatalogQuery,
101
101
  EditableSpreadsheetCellValue,
102
+ EditableSpreadsheetDimensions,
102
103
  EditableSpreadsheetFormulaError,
103
104
  EditableSpreadsheetMetadataProjection,
104
105
  EditableSpreadsheetMetadataQuery,
@@ -176,18 +176,28 @@ export type EditableSpreadsheetProjectedCell = Readonly<{
176
176
  * Immutable projection of one exact speculative kernel revision. Cells are
177
177
  * sparse, strictly row-major, unique, and all inside the requested rectangle.
178
178
  */
179
- export type EditableSpreadsheetViewportProjection = Readonly<{
180
- revision: bigint;
181
- sheetId: string;
182
- /** Creation operation that pins the live CRDT generation, if collaborative. */
183
- generationId: string | null;
184
- startRow: number;
185
- startColumn: number;
186
- rowCount: number;
187
- columnCount: number;
188
- cells: readonly EditableSpreadsheetProjectedCell[];
179
+ export type EditableSpreadsheetDimensions = Readonly<{
180
+ /** Integer CSS pixels. Present when the kernel models dimensions. */
181
+ defaultRowHeight?: number;
182
+ defaultColumnWidth?: number;
183
+ /** Sorted sparse absolute zero-based indices and non-default pixel sizes. */
184
+ rowHeights?: readonly (readonly [number, number])[];
185
+ columnWidths?: readonly (readonly [number, number])[];
189
186
  }>;
190
187
 
188
+ export type EditableSpreadsheetViewportProjection = EditableSpreadsheetDimensions &
189
+ Readonly<{
190
+ revision: bigint;
191
+ sheetId: string;
192
+ /** Creation operation that pins the live CRDT generation, if collaborative. */
193
+ generationId: string | null;
194
+ startRow: number;
195
+ startColumn: number;
196
+ rowCount: number;
197
+ columnCount: number;
198
+ cells: readonly EditableSpreadsheetProjectedCell[];
199
+ }>;
200
+
191
201
  export type EditableSpreadsheetUsedBounds = Readonly<{
192
202
  startRow: number;
193
203
  startColumn: number;
@@ -197,12 +207,13 @@ export type EditableSpreadsheetUsedBounds = Readonly<{
197
207
  endColumn: number;
198
208
  }>;
199
209
 
200
- export type EditableSpreadsheetSheetMetadata = Readonly<{
201
- sheetId: string;
202
- generationId: string | null;
203
- name: string;
204
- usedBounds: EditableSpreadsheetUsedBounds | null;
205
- }>;
210
+ export type EditableSpreadsheetSheetMetadata = EditableSpreadsheetDimensions &
211
+ Readonly<{
212
+ sheetId: string;
213
+ generationId: string | null;
214
+ name: string;
215
+ usedBounds: EditableSpreadsheetUsedBounds | null;
216
+ }>;
206
217
 
207
218
  /**
208
219
  * Bounded workbook catalog from the Worker-owned kernel. False feature flags
@@ -479,6 +490,8 @@ export type EditableArtifactSyncView = {
479
490
  writable: boolean;
480
491
  pendingTransactions: number;
481
492
  blockedPending: readonly EditableArtifactBlockedPending[];
493
+ /** A command barrier independent of the artifact's edit permission. */
494
+ authoringBlockedReason?: "pending_conflict" | "prior_writer" | undefined;
482
495
  queuedMessages: number;
483
496
  reconnectAttempt: number;
484
497
  lastError: Error | null;