@opengeni/core 0.21.10 → 0.28.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 (132) hide show
  1. package/dist/access/index.d.ts +1 -1
  2. package/dist/application/new-session-drafts.d.ts +1 -1
  3. package/dist/application/session-commands.d.ts +2 -2
  4. package/dist/billing/limits.d.ts +1 -1
  5. package/dist/canonical-human-identities.d.ts +12 -0
  6. package/dist/canonical-human-identities.js +23 -0
  7. package/dist/canonical-human-identities.js.map +1 -0
  8. package/dist/chunk-6WKPWE5S.js +2380 -0
  9. package/dist/chunk-6WKPWE5S.js.map +1 -0
  10. package/dist/chunk-IBOEYG6N.js +34 -0
  11. package/dist/chunk-IBOEYG6N.js.map +1 -0
  12. package/dist/chunk-JJU6I5XD.js +2713 -0
  13. package/dist/chunk-JJU6I5XD.js.map +1 -0
  14. package/dist/chunk-NYPMQ7NO.js +2270 -0
  15. package/dist/chunk-NYPMQ7NO.js.map +1 -0
  16. package/dist/dependencies.d.ts +30 -6
  17. package/dist/domain/capabilities.d.ts +28 -3
  18. package/dist/domain/company-profile-durable-learning-adapter.d.ts +39 -0
  19. package/dist/domain/conversation-integrations.d.ts +225 -0
  20. package/dist/domain/durable-learning-slack-publication.d.ts +72 -0
  21. package/dist/domain/editable-artifacts/agent-application.d.ts +192 -0
  22. package/dist/domain/editable-artifacts/durable-export-postgres.d.ts +4 -0
  23. package/dist/domain/editable-artifacts/durable-export.d.ts +212 -0
  24. package/dist/domain/editable-artifacts/errors.d.ts +47 -0
  25. package/dist/domain/editable-artifacts/hash.d.ts +11 -0
  26. package/dist/domain/editable-artifacts/in-memory.d.ts +99 -0
  27. package/dist/domain/editable-artifacts/index.d.ts +14 -0
  28. package/dist/domain/editable-artifacts/ports.d.ts +341 -0
  29. package/dist/domain/editable-artifacts/postgres-adapters.d.ts +13 -0
  30. package/dist/domain/editable-artifacts/service.d.ts +105 -0
  31. package/dist/domain/editable-artifacts/snapshot-compaction.d.ts +44 -0
  32. package/dist/domain/editable-artifacts/snapshot-verifier-genesis.d.ts +50 -0
  33. package/dist/domain/editable-artifacts/snapshot-verifier-materialization.d.ts +21 -0
  34. package/dist/domain/editable-artifacts/snapshot-verifier.d.ts +118 -0
  35. package/dist/domain/editable-artifacts/types.d.ts +410 -0
  36. package/dist/domain/fiken.d.ts +35 -0
  37. package/dist/domain/memory-slack-delivery.d.ts +19 -0
  38. package/dist/domain/packs.d.ts +29 -1
  39. package/dist/domain/personal-connection-delegations.d.ts +9 -1
  40. package/dist/domain/scheduled-tasks.d.ts +2 -2
  41. package/dist/domain/session-tool-policy.d.ts +2 -2
  42. package/dist/domain/sessions.d.ts +24 -8
  43. package/dist/domain/skill-imports.d.ts +32 -0
  44. package/dist/domain/slack-publication-secret-safety.d.ts +8 -0
  45. package/dist/domain/timeline-annotations.d.ts +5 -0
  46. package/dist/domain/video-generation-capabilities.d.ts +10 -0
  47. package/dist/domain/video-generation.d.ts +47 -0
  48. package/dist/editable-artifact-live/application.d.ts +69 -0
  49. package/dist/editable-artifact-live/errors.d.ts +1 -0
  50. package/dist/editable-artifact-live/index.d.ts +8 -0
  51. package/dist/editable-artifact-live/outbox-dispatcher.d.ts +162 -0
  52. package/dist/editable-artifact-live/ports.d.ts +100 -0
  53. package/dist/editable-artifact-live/server.d.ts +71 -0
  54. package/dist/editable-artifact-live/ticket.d.ts +40 -0
  55. package/dist/editable-artifact-live/types.d.ts +213 -0
  56. package/dist/editable-artifact-live/wire.d.ts +34 -0
  57. package/dist/editable-artifact-live.d.ts +2 -0
  58. package/dist/editable-artifact-live.js +58 -0
  59. package/dist/editable-artifact-live.js.map +1 -0
  60. package/dist/editable-artifacts.d.ts +2 -0
  61. package/dist/editable-artifacts.js +179 -0
  62. package/dist/editable-artifacts.js.map +1 -0
  63. package/dist/index.d.ts +37 -26
  64. package/dist/index.js +4145 -959
  65. package/dist/index.js.map +1 -1
  66. package/dist/managed-session.d.ts +6 -2
  67. package/dist/rigs/index.d.ts +1 -1
  68. package/dist/rigs/provider-images.d.ts +31 -0
  69. package/dist/sandbox/fleet.d.ts +8 -5
  70. package/dist/sandbox/routing.d.ts +1 -0
  71. package/dist/session-authorization.d.ts +4 -2
  72. package/dist/transcription.d.ts +5 -0
  73. package/dist/workflow-wake-contract.d.ts +7 -0
  74. package/package.json +22 -10
  75. package/src/access/index.ts +14 -2
  76. package/src/application/new-session-drafts.ts +2 -0
  77. package/src/application/session-commands.ts +188 -107
  78. package/src/canonical-human-identities.ts +27 -0
  79. package/src/dependencies.ts +34 -2
  80. package/src/domain/capabilities.ts +729 -408
  81. package/src/domain/company-profile-durable-learning-adapter.ts +221 -0
  82. package/src/domain/conversation-integrations.ts +1238 -0
  83. package/src/domain/durable-learning-slack-publication.ts +202 -0
  84. package/src/domain/editable-artifacts/agent-application.ts +687 -0
  85. package/src/domain/editable-artifacts/durable-export-postgres.ts +139 -0
  86. package/src/domain/editable-artifacts/durable-export.ts +734 -0
  87. package/src/domain/editable-artifacts/errors.ts +115 -0
  88. package/src/domain/editable-artifacts/hash.ts +131 -0
  89. package/src/domain/editable-artifacts/in-memory.ts +1662 -0
  90. package/src/domain/editable-artifacts/index.ts +14 -0
  91. package/src/domain/editable-artifacts/ports.ts +462 -0
  92. package/src/domain/editable-artifacts/postgres-adapters.ts +49 -0
  93. package/src/domain/editable-artifacts/service.ts +2402 -0
  94. package/src/domain/editable-artifacts/snapshot-compaction.ts +246 -0
  95. package/src/domain/editable-artifacts/snapshot-verifier-genesis.ts +235 -0
  96. package/src/domain/editable-artifacts/snapshot-verifier-materialization.ts +74 -0
  97. package/src/domain/editable-artifacts/snapshot-verifier.ts +687 -0
  98. package/src/domain/editable-artifacts/types.ts +835 -0
  99. package/src/domain/fiken.ts +88 -0
  100. package/src/domain/insights.ts +163 -50
  101. package/src/domain/memory-slack-delivery.ts +204 -0
  102. package/src/domain/memory-slack-publication.ts +5 -2
  103. package/src/domain/packs.ts +266 -5
  104. package/src/domain/personal-connection-delegations.ts +97 -6
  105. package/src/domain/scheduled-tasks.ts +171 -29
  106. package/src/domain/session-tool-policy.ts +8 -2
  107. package/src/domain/sessions.ts +395 -148
  108. package/src/domain/skill-imports.ts +350 -0
  109. package/src/domain/slack-publication-secret-safety.ts +42 -0
  110. package/src/domain/timeline-annotations.ts +204 -0
  111. package/src/domain/video-generation-capabilities.ts +104 -0
  112. package/src/domain/video-generation.ts +249 -0
  113. package/src/editable-artifact-live/application.ts +182 -0
  114. package/src/editable-artifact-live/errors.ts +4 -0
  115. package/src/editable-artifact-live/index.ts +8 -0
  116. package/src/editable-artifact-live/outbox-dispatcher.ts +916 -0
  117. package/src/editable-artifact-live/ports.ts +139 -0
  118. package/src/editable-artifact-live/server.ts +1707 -0
  119. package/src/editable-artifact-live/ticket.ts +217 -0
  120. package/src/editable-artifact-live/types.ts +286 -0
  121. package/src/editable-artifact-live/wire.ts +95 -0
  122. package/src/editable-artifact-live.ts +2 -0
  123. package/src/editable-artifacts.ts +2 -0
  124. package/src/index.ts +15 -0
  125. package/src/managed-session.ts +19 -2
  126. package/src/rigs/index.ts +26 -19
  127. package/src/rigs/provider-images.ts +110 -0
  128. package/src/sandbox/fleet.ts +72 -66
  129. package/src/sandbox/routing.ts +6 -3
  130. package/src/session-authorization.ts +187 -52
  131. package/src/transcription.ts +5 -0
  132. package/src/workflow-wake-contract.ts +8 -0
@@ -0,0 +1,14 @@
1
+ export * from "./errors";
2
+ export * from "./durable-export";
3
+ export * from "./agent-application";
4
+ export * from "./durable-export-postgres";
5
+ export * from "./hash";
6
+ export * from "./in-memory";
7
+ export * from "./ports";
8
+ export * from "./postgres-adapters";
9
+ export * from "./service";
10
+ export * from "./snapshot-verifier";
11
+ export * from "./snapshot-compaction";
12
+ export * from "./snapshot-verifier-genesis";
13
+ export * from "./snapshot-verifier-materialization";
14
+ export * from "./types";
@@ -0,0 +1,462 @@
1
+ import type {
2
+ EditableArtifact,
3
+ EditableArtifactActor,
4
+ EditableArtifactCausalFrontier,
5
+ EditableArtifactId,
6
+ EditableArtifactLiveOutboxRecord,
7
+ EditableArtifactMutationIntent,
8
+ EditableArtifactOperationId,
9
+ EditableArtifactOperationRecord,
10
+ EditableArtifactOriginOperation,
11
+ EditableArtifactOriginalImport,
12
+ EditableArtifactOutboxId,
13
+ EditableArtifactOutboxRetryFailureCode,
14
+ EditableArtifactOutboxDeadLetterFailureCode,
15
+ EditableArtifactPermission,
16
+ EditableArtifactReceipt,
17
+ EditableArtifactScope,
18
+ EditableArtifactSequenceCheckpoint,
19
+ EditableArtifactSnapshotId,
20
+ EditableArtifactSnapshotMetadata,
21
+ EditableArtifactStableId,
22
+ EditableArtifactStateHash,
23
+ EditableArtifactTransactionId,
24
+ EditableArtifactClientTransactionId,
25
+ EditableArtifactCommittedTransactionRecord,
26
+ EditableArtifactModality,
27
+ EditableArtifactRequestHash,
28
+ EditableArtifactSerialized,
29
+ EditableArtifactSerializedCommittedTransactionRecord,
30
+ EditableArtifactSerializedSnapshotMetadata,
31
+ EditableArtifactSpreadsheet,
32
+ EditableArtifactSpreadsheetCommittedTransactionRecord,
33
+ EditableArtifactSpreadsheetSnapshotMetadata,
34
+ CreateEditableArtifactResult,
35
+ PublishEditableArtifactSnapshotRequest,
36
+ ValidatedEditableArtifactMutationIntent,
37
+ } from "./types";
38
+
39
+ export type EditableArtifactAuthorizationRequest = Readonly<{
40
+ scope: EditableArtifactScope;
41
+ artifactId: EditableArtifactId;
42
+ actor: EditableArtifactActor;
43
+ permission: EditableArtifactPermission;
44
+ }>;
45
+
46
+ export type EditableArtifactAuthorizationDecision = Readonly<{
47
+ allowed: boolean;
48
+ /**
49
+ * Current durable local policy revision, even when access is denied.
50
+ * `create` decisions use the workspace's scope-create head. Every other
51
+ * decision uses the target artifact's authorization head. A decision is not
52
+ * commit authority by itself: the corresponding store write must compare
53
+ * this revision atomically with its durable policy head.
54
+ */
55
+ revision: number;
56
+ }>;
57
+
58
+ export interface EditableArtifactAuthorizationPort {
59
+ authorize(
60
+ request: EditableArtifactAuthorizationRequest,
61
+ ): Promise<EditableArtifactAuthorizationDecision>;
62
+ }
63
+
64
+ export type EditableArtifactKernelState =
65
+ | Readonly<{
66
+ modality: "spreadsheet";
67
+ artifact: EditableArtifactSpreadsheet;
68
+ snapshot: EditableArtifactSpreadsheetSnapshotMetadata | null;
69
+ /** Replay work after the current snapshot, used for bounded compaction admission. */
70
+ tailTransactionCount: number;
71
+ tailByteSize: number;
72
+ /** Canonical OGACO tail strictly after the snapshot coverage. */
73
+ committedTransactionTail: readonly EditableArtifactSpreadsheetCommittedTransactionRecord[];
74
+ }>
75
+ | Readonly<{
76
+ modality: "document" | "presentation";
77
+ artifact: EditableArtifactSerialized;
78
+ snapshot: EditableArtifactSerializedSnapshotMetadata | null;
79
+ /** Replay work after the current snapshot, used for bounded compaction admission. */
80
+ tailTransactionCount: number;
81
+ tailByteSize: number;
82
+ /** Native revision at the sequence boundary immediately before the tail. */
83
+ baseNativeRevision: number;
84
+ /** Canonical OGAST tail strictly after the snapshot coverage. */
85
+ committedTransactionTail: readonly EditableArtifactSerializedCommittedTransactionRecord[];
86
+ }>;
87
+
88
+ type ApplyAuthoritativeEditableArtifactKernelRequestCommon = Readonly<{
89
+ state: EditableArtifactKernelState;
90
+ actor: EditableArtifactActor;
91
+ intent: ValidatedEditableArtifactMutationIntent;
92
+ requestHash: EditableArtifactReceipt["requestHash"];
93
+ intentBytes: Uint8Array;
94
+ }>;
95
+
96
+ export type ApplyAuthoritativeEditableArtifactKernelRequest =
97
+ | (ApplyAuthoritativeEditableArtifactKernelRequestCommon &
98
+ Readonly<{
99
+ modality: "spreadsheet";
100
+ /** Authored base plus the exact resolved predecessor transaction stamp. */
101
+ resolvedCausalBase: EditableArtifactCausalFrontier;
102
+ resolvedUndoTargets: readonly EditableArtifactOperationRecord[];
103
+ }>)
104
+ | (ApplyAuthoritativeEditableArtifactKernelRequestCommon &
105
+ Readonly<{ modality: "document" | "presentation" }>);
106
+
107
+ export type ApplyAuthoritativeEditableArtifactKernelResult =
108
+ | Readonly<{
109
+ modality: "spreadsheet";
110
+ /** Exact canonical OGACO bytes returned by the authoritative native kernel. */
111
+ committedTransactionBytes: Uint8Array;
112
+ kernelVersion: string;
113
+ modelSchemaVersion: number;
114
+ }>
115
+ | Readonly<{
116
+ modality: "document" | "presentation";
117
+ /** Exact canonical OGADR/OGAPR receipt returned by the native kernel. */
118
+ nativeReceiptBytes: Uint8Array;
119
+ resultingStateHash: EditableArtifactStateHash;
120
+ kernelVersion: string;
121
+ modelSchemaVersion: number;
122
+ }>;
123
+
124
+ /**
125
+ * The only port allowed to turn untrusted commands into canonical operations.
126
+ * API/client adapters must never construct operation bytes themselves.
127
+ */
128
+ export interface AuthoritativeEditableArtifactKernelPort {
129
+ /**
130
+ * Must be side-effect free. Optimistic concurrency may discard a result and
131
+ * invoke the kernel again against a newer authoritative basis.
132
+ */
133
+ applyTransaction(
134
+ request: ApplyAuthoritativeEditableArtifactKernelRequest,
135
+ ): Promise<ApplyAuthoritativeEditableArtifactKernelResult>;
136
+ }
137
+
138
+ /** Trusted adapter over the one shared OGATX001 decoder/hash verifier. */
139
+ export interface EditableArtifactMutationIntentCodecPort {
140
+ /** Decode canonical bytes and throw request_hash_mismatch unless the exact digest matches. */
141
+ decodeAndVerify(
142
+ input: Readonly<{
143
+ intentBytes: Uint8Array;
144
+ requestHash: EditableArtifactReceipt["requestHash"];
145
+ }>,
146
+ ): Promise<EditableArtifactMutationIntent>;
147
+ }
148
+
149
+ /**
150
+ * Verifies the immutable blob itself before metadata can become the replay
151
+ * base: size/hash, canonical decode, embedded boundary, kernel/schema/protocol,
152
+ * and reconstructed state hash. `blobReference` must address immutable bytes.
153
+ */
154
+ export interface EditableArtifactSnapshotVerifierPort {
155
+ verify(
156
+ input: Readonly<{
157
+ scope: EditableArtifactScope;
158
+ artifactId: EditableArtifactId;
159
+ actor: EditableArtifactActor;
160
+ snapshot: PublishEditableArtifactSnapshotRequest;
161
+ }>,
162
+ ): Promise<void>;
163
+ }
164
+
165
+ /**
166
+ * Trusted server-side genesis pipeline. It asks the authoritative kernel for
167
+ * the canonical empty model and uploads those exact bytes to immutable object
168
+ * storage. The service still verifies the returned object before publication.
169
+ */
170
+ export interface EditableArtifactGenesisPort {
171
+ prepare(input: {
172
+ scope: EditableArtifactScope;
173
+ artifactId: EditableArtifactId;
174
+ snapshotId: EditableArtifactSnapshotId;
175
+ modality: EditableArtifactModality;
176
+ signal?: AbortSignal;
177
+ }): Promise<PublishEditableArtifactSnapshotRequest>;
178
+ }
179
+
180
+ /** Trusted native reconstruction + immutable upload used only for state-neutral maintenance. */
181
+ export interface EditableArtifactCompactionPort {
182
+ prepare(input: {
183
+ scope: EditableArtifactScope;
184
+ artifactId: EditableArtifactId;
185
+ snapshotId: EditableArtifactSnapshotId;
186
+ state: EditableArtifactKernelState;
187
+ signal?: AbortSignal;
188
+ }): Promise<PublishEditableArtifactSnapshotRequest>;
189
+ }
190
+
191
+ export interface EditableArtifactClockPort {
192
+ now(): Date;
193
+ }
194
+
195
+ export type EditableArtifactStableIdKind =
196
+ | "artifact"
197
+ | "snapshot"
198
+ | "blob"
199
+ | "receipt"
200
+ | "outbox"
201
+ | "transaction";
202
+
203
+ export interface EditableArtifactStableIdFactoryPort {
204
+ next(kind: EditableArtifactStableIdKind): EditableArtifactStableId;
205
+ }
206
+
207
+ export type CreateEditableArtifactStoreRequest = Readonly<{
208
+ scope: EditableArtifactScope;
209
+ artifactId: EditableArtifactId;
210
+ /** Rechecked by durable production stores in the creation transaction. */
211
+ authorizationActor: EditableArtifactActor;
212
+ receiptId: EditableArtifactReceipt["receiptId"];
213
+ authorityKey: string;
214
+ idempotencyKey: EditableArtifactClientTransactionId;
215
+ requestHash: EditableArtifactRequestHash;
216
+ operationKind: EditableArtifactOriginOperation;
217
+ /** Scope-create policy head observed by the authorization decision. */
218
+ expectedScopeAuthorizationRevision: number;
219
+ /** Initial per-artifact policy head installed by the successful create. */
220
+ initialArtifactAuthorizationRevision: number;
221
+ modality: EditableArtifactModality;
222
+ title: string;
223
+ createdBySubjectId: string;
224
+ genesisSnapshot: EditableArtifactSnapshotMetadata;
225
+ originalImport?: Readonly<
226
+ EditableArtifactOriginalImport & { blobRefId: EditableArtifactStableId }
227
+ >;
228
+ outbox: EditableArtifactLiveOutboxRecord;
229
+ }>;
230
+
231
+ export type CreateEditableArtifactStoreResult =
232
+ | Readonly<{
233
+ kind: "result";
234
+ value: CreateEditableArtifactResult;
235
+ }>
236
+ | Readonly<{ kind: "authorization_stale" }>;
237
+
238
+ export type AdvanceEditableArtifactScopeAuthorizationRevisionResult = Readonly<{
239
+ applied: boolean;
240
+ authorizationRevision: number;
241
+ }>;
242
+
243
+ /**
244
+ * Local durable create-policy head. Authorization adapters read this revision
245
+ * while evaluating `create`; invalidation advances it transactionally. This
246
+ * is separate from the per-artifact head because an artifact row does not yet
247
+ * exist while its genesis model is being prepared.
248
+ */
249
+ export interface EditableArtifactScopeAuthorizationRevisionPort {
250
+ readScopeCreateAuthorizationRevision(scope: EditableArtifactScope): Promise<number>;
251
+ advanceScopeCreateAuthorizationRevision(
252
+ scope: EditableArtifactScope,
253
+ expectedRevision: number,
254
+ nextRevision: number,
255
+ ): Promise<AdvanceEditableArtifactScopeAuthorizationRevisionResult>;
256
+ }
257
+
258
+ export type AdvanceEditableArtifactAuthorizationRevisionResult = Readonly<{
259
+ applied: boolean;
260
+ authorizationRevision: number;
261
+ }>;
262
+
263
+ export type ReadEditableArtifactAtAuthorizationRevisionResult =
264
+ | Readonly<{ kind: "result"; artifact: EditableArtifact | null }>
265
+ | Readonly<{ kind: "authorization_stale" }>;
266
+
267
+ /** Separate policy/invalidation capability; ordinary mutation code never owns it. */
268
+ export interface EditableArtifactAuthorizationRevisionPort {
269
+ advanceAuthorizationRevision(
270
+ scope: EditableArtifactScope,
271
+ artifactId: EditableArtifactId,
272
+ expectedRevision: number,
273
+ nextRevision: number,
274
+ ): Promise<AdvanceEditableArtifactAuthorizationRevisionResult>;
275
+ }
276
+
277
+ export type CommitAppliedEditableArtifactTransaction = Readonly<{
278
+ expectedHeadSequence: number;
279
+ serverTransactionId: EditableArtifactTransactionId;
280
+ receipt: EditableArtifactReceipt;
281
+ committedTransaction: EditableArtifactCommittedTransactionRecord;
282
+ operations: readonly EditableArtifactOperationRecord[];
283
+ outbox: EditableArtifactLiveOutboxRecord;
284
+ }>;
285
+
286
+ export type ReadEditableArtifactTransactionBasisRequest = Readonly<{
287
+ actorKey: string;
288
+ clientTransactionId: EditableArtifactReceipt["clientTransactionId"];
289
+ previousLocalTransactionId: EditableArtifactReceipt["previousLocalTransactionId"];
290
+ selectiveUndoOperationIds: readonly EditableArtifactOperationId[];
291
+ }>;
292
+
293
+ export type EditableArtifactTransactionUndoBasis = Readonly<{
294
+ operationId: EditableArtifactOperationId;
295
+ operation: EditableArtifactOperationRecord | null;
296
+ claimedBy: EditableArtifactTransactionId | null;
297
+ }>;
298
+
299
+ /**
300
+ * One detached, internally consistent read view. Implementations must copy all
301
+ * mutable byte buffers before returning; the kernel may retain this value
302
+ * after the database read transaction has closed.
303
+ */
304
+ export type EditableArtifactTransactionBasis =
305
+ | Readonly<{
306
+ /** Indexed fast path; callers decide replay versus hash collision. */
307
+ kind: "existing";
308
+ receipt: EditableArtifactReceipt;
309
+ }>
310
+ | Readonly<{
311
+ kind: "basis";
312
+ artifact: EditableArtifact;
313
+ predecessor: EditableArtifactReceipt | null;
314
+ undoTargets: readonly EditableArtifactTransactionUndoBasis[];
315
+ kernelState: EditableArtifactKernelState;
316
+ }>;
317
+
318
+ export type ExpectedEditableArtifactPredecessor = Readonly<{
319
+ receiptId: EditableArtifactReceipt["receiptId"];
320
+ serverTransactionId: EditableArtifactTransactionId;
321
+ actorKey: string;
322
+ clientTransactionId: EditableArtifactReceipt["clientTransactionId"];
323
+ replicaId: EditableArtifactReceipt["replicaId"];
324
+ replicaCounter: number;
325
+ }>;
326
+
327
+ export type TryCommitAppliedEditableArtifactTransactionRequest =
328
+ CommitAppliedEditableArtifactTransaction &
329
+ Readonly<{
330
+ scope: EditableArtifactScope;
331
+ artifactId: EditableArtifactId;
332
+ expectedLifecycle: "active";
333
+ expectedAuthorizationRevision: number;
334
+ /** Rechecked by durable production stores in the commit transaction. */
335
+ authorizationActor: EditableArtifactActor;
336
+ actorKey: string;
337
+ clientTransactionId: EditableArtifactReceipt["clientTransactionId"];
338
+ requestHash: EditableArtifactReceipt["requestHash"];
339
+ expectedPredecessor: ExpectedEditableArtifactPredecessor | null;
340
+ expectedUnclaimedUndoTargets: readonly EditableArtifactOperationId[];
341
+ }>;
342
+
343
+ export type TryCommitAppliedEditableArtifactTransactionResult =
344
+ | Readonly<{ kind: "committed"; receipt: EditableArtifactReceipt }>
345
+ | Readonly<{ kind: "replayed"; receipt: EditableArtifactReceipt }>
346
+ | Readonly<{ kind: "stale" }>;
347
+
348
+ export type CommitEditableArtifactSnapshot = Readonly<{
349
+ expectedCurrentSnapshotId: EditableArtifactSnapshotId | null;
350
+ expectedAuthorizationRevision: number;
351
+ /** Rechecked by durable production stores in the publication transaction. */
352
+ authorizationActor: EditableArtifactActor;
353
+ /** Public publication requires manage; trusted state-neutral maintenance uses caller authority. */
354
+ authorizationPermission?: "manage" | "read" | "edit";
355
+ snapshot: EditableArtifactSnapshotMetadata;
356
+ outbox: EditableArtifactLiveOutboxRecord;
357
+ }>;
358
+
359
+ export type CommitEditableArtifactSnapshotResult =
360
+ | Readonly<{ kind: "committed" }>
361
+ | Readonly<{ kind: "authorization_stale" }>;
362
+
363
+ /**
364
+ * Narrow snapshot-metadata transaction. Mutation history and kernel execution
365
+ * are deliberately absent so they cannot drift back under a database lock.
366
+ */
367
+ export interface EditableArtifactSnapshotUnitOfWorkPort {
368
+ artifact(): EditableArtifact;
369
+ checkpoint(headSequence: number): Promise<EditableArtifactSequenceCheckpoint | null>;
370
+ findSnapshot(
371
+ snapshotId: EditableArtifactSnapshotId,
372
+ ): Promise<EditableArtifactSnapshotMetadata | null>;
373
+ commitSnapshot(
374
+ input: CommitEditableArtifactSnapshot,
375
+ ): Promise<CommitEditableArtifactSnapshotResult>;
376
+ }
377
+
378
+ export type ClaimEditableArtifactLiveOutboxRequest = Readonly<{
379
+ owner: string;
380
+ leaseDurationMs: number;
381
+ limit: number;
382
+ }>;
383
+
384
+ export interface EditableArtifactStorePort {
385
+ /** Read-only idempotency fast path; `createArtifact` remains authoritative. */
386
+ findArtifactCreation(
387
+ scope: EditableArtifactScope,
388
+ operationKind: EditableArtifactOriginOperation,
389
+ authorityKey: string,
390
+ idempotencyKey: EditableArtifactClientTransactionId,
391
+ ): Promise<CreateEditableArtifactResult | null>;
392
+ createArtifact(
393
+ request: CreateEditableArtifactStoreRequest,
394
+ ): Promise<CreateEditableArtifactStoreResult>;
395
+ /** One tenant-scoped read atomically fenced by the local policy revision. */
396
+ readArtifactAtAuthorizationRevision(
397
+ scope: EditableArtifactScope,
398
+ artifactId: EditableArtifactId,
399
+ expectedAuthorizationRevision: number,
400
+ ): Promise<ReadEditableArtifactAtAuthorizationRevisionResult>;
401
+ /** Short consistent read; no write lock may remain held after it resolves. */
402
+ readTransactionBasis(
403
+ scope: EditableArtifactScope,
404
+ artifactId: EditableArtifactId,
405
+ request: ReadEditableArtifactTransactionBasisRequest,
406
+ ): Promise<EditableArtifactTransactionBasis>;
407
+ /** Detached exact-head replay basis, fenced by the authorization revision observed by core. */
408
+ readCurrentKernelState(
409
+ scope: EditableArtifactScope,
410
+ artifactId: EditableArtifactId,
411
+ expectedAuthorizationRevision: number,
412
+ ): Promise<
413
+ | Readonly<{ kind: "basis"; state: EditableArtifactKernelState }>
414
+ | Readonly<{ kind: "authorization_stale" }>
415
+ >;
416
+ /**
417
+ * Short atomic commit. Check idempotency before the head CAS. Return stale
418
+ * when any read precondition changed; never partially persist the candidate.
419
+ */
420
+ tryCommitAppliedTransaction(
421
+ request: TryCommitAppliedEditableArtifactTransactionRequest,
422
+ ): Promise<TryCommitAppliedEditableArtifactTransactionResult>;
423
+ /** Snapshot metadata publication remains the only lock-scoped callback. */
424
+ withSnapshotPublicationLock<T>(
425
+ scope: EditableArtifactScope,
426
+ artifactId: EditableArtifactId,
427
+ callback: (unitOfWork: EditableArtifactSnapshotUnitOfWorkPort) => Promise<T>,
428
+ ): Promise<T>;
429
+ claimLiveOutbox(
430
+ request: ClaimEditableArtifactLiveOutboxRequest,
431
+ ): Promise<readonly EditableArtifactLiveOutboxRecord[]>;
432
+ markLiveOutboxPublished(input: {
433
+ outboxId: EditableArtifactOutboxId;
434
+ owner: string;
435
+ /** Fences a stale attempt even when one worker identity is reused. */
436
+ attemptCount: number;
437
+ }): Promise<void>;
438
+ releaseLiveOutbox(input: {
439
+ outboxId: EditableArtifactOutboxId;
440
+ owner: string;
441
+ attemptCount: number;
442
+ }): Promise<void>;
443
+ renewLiveOutbox(input: {
444
+ outboxId: EditableArtifactOutboxId;
445
+ owner: string;
446
+ attemptCount: number;
447
+ leaseDurationMs: number;
448
+ }): Promise<void>;
449
+ retryLiveOutbox(input: {
450
+ outboxId: EditableArtifactOutboxId;
451
+ owner: string;
452
+ attemptCount: number;
453
+ retryDelayMs: number;
454
+ errorCode: EditableArtifactOutboxRetryFailureCode;
455
+ }): Promise<void>;
456
+ deadLetterLiveOutbox(input: {
457
+ outboxId: EditableArtifactOutboxId;
458
+ owner: string;
459
+ attemptCount: number;
460
+ errorCode: EditableArtifactOutboxDeadLetterFailureCode;
461
+ }): Promise<void>;
462
+ }
@@ -0,0 +1,49 @@
1
+ import type {
2
+ PostgresEditableArtifactLiveReadStore,
3
+ PostgresEditableArtifactLiveTicketStore,
4
+ PostgresEditableArtifactStore,
5
+ } from "@opengeni/db/editable-artifacts";
6
+ import type {
7
+ EditableArtifactAuthorizationRevisionPort,
8
+ EditableArtifactScopeAuthorizationRevisionPort,
9
+ EditableArtifactStorePort,
10
+ } from "./ports";
11
+ import type {
12
+ EditableArtifactLiveReadPort,
13
+ EditableArtifactLiveTicketStorePort,
14
+ } from "../../editable-artifact-live/ports";
15
+
16
+ /**
17
+ * One-way nominal adapters over DB DTOs. The PostgreSQL implementations fully
18
+ * validate and detach every returned value; only core applies branded domain
19
+ * names to those already-validated wire-identical shapes.
20
+ */
21
+ export function editableArtifactStorePortFromPostgres(
22
+ store: PostgresEditableArtifactStore,
23
+ ): EditableArtifactStorePort {
24
+ return store as unknown as EditableArtifactStorePort;
25
+ }
26
+
27
+ export function editableArtifactAuthorizationRevisionPortFromPostgres(
28
+ store: PostgresEditableArtifactStore,
29
+ ): EditableArtifactAuthorizationRevisionPort {
30
+ return store as unknown as EditableArtifactAuthorizationRevisionPort;
31
+ }
32
+
33
+ export function editableArtifactScopeAuthorizationRevisionPortFromPostgres(
34
+ store: PostgresEditableArtifactStore,
35
+ ): EditableArtifactScopeAuthorizationRevisionPort {
36
+ return store as unknown as EditableArtifactScopeAuthorizationRevisionPort;
37
+ }
38
+
39
+ export function editableArtifactLiveReadPortFromPostgres(
40
+ store: PostgresEditableArtifactLiveReadStore,
41
+ ): EditableArtifactLiveReadPort {
42
+ return store as unknown as EditableArtifactLiveReadPort;
43
+ }
44
+
45
+ export function editableArtifactLiveTicketStorePortFromPostgres(
46
+ store: PostgresEditableArtifactLiveTicketStore,
47
+ ): EditableArtifactLiveTicketStorePort {
48
+ return store as unknown as EditableArtifactLiveTicketStorePort;
49
+ }