@claudian-collab/protocol 1.0.0 → 2.0.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.
package/README.md CHANGED
@@ -19,14 +19,14 @@ or compatibility rules.
19
19
  `collabMemberRef`)
20
20
  - Shared limits that client and server must agree on (`COLLAB_LIMITS`)
21
21
  - Protocol-version negotiation (`COLLAB_PROTOCOL_VERSION`, envelope decoding)
22
- - Cloud binding v1 route construction/matching, capability negotiation, strict success/error envelopes, private-development bootstrap, Project snapshot, and redacted event contracts
22
+ - Canonical Project checkpoint profiles, logical records, authority-generation transfer, exact membership claims, target-signed redemption receipts, and Project retirement contracts
23
+ - Cloud binding v2 route construction/matching, bounded checkpoint streams, capability negotiation, strict success/error envelopes, private-development bootstrap, Project snapshot, and redacted event contracts
23
24
  - Markdown-derived Ticket-reference and Member-mention semantics shared by
24
25
  client rendering and authority derivation
25
26
 
26
27
  The package owns the declarative Cloud HTTP/WebSocket/Git binding contract, but no transport runtime, request dispatch, trust policy, authentication, authorization, persistence, Git execution, or client-local recovery. It contains no LAN Host admission, invitation trust, mDNS/TLS/discovery, or Host-transfer transport; no Obsidian, Vault, UI, Agent, provider, SQL, or filesystem behavior; and no `IngressPrincipal` or other deployment-ingress contracts.
27
28
 
28
- The current registry contains only the decision-complete, transport-neutral
29
- request, Ticket, metadata, and Accept operations. Detail DTOs embed the first
29
+ The current registry contains the decision-complete, transport-neutral request, Ticket, metadata, Accept, Project authority-transfer, transferred-membership claim, and Project retirement operations. Detail DTOs embed the first
30
30
  page of their comments and accepted relations; `listRequestComments`,
31
31
  `listTicketComments`, and `listTicketAcceptedRelations` page the remainder
32
32
  with stable opaque cursors, and producers bound pages by the shared count and
@@ -37,7 +37,7 @@ fixed part of the detail so the whole detail stays within
37
37
  has one compatible final-serialization limit. Request comments and Ticket
38
38
  accepted relations also have shared authority-enforced total limits; summary
39
39
  counts let complete consumers reject partial or cross-snapshot assembly.
40
- Cloud binding v1 adds the authority-neutral Project snapshot, six redacted durable event kinds plus `snapshot.required`, eight capability tokens, the exact ordinary Project/Git route catalog, and six private-development bootstrap bindings. Existing LAN v9 Join, invitation, endpoint, membership lifecycle, Host-transfer, retirement, snapshot, event, and HTTP bindings remain independently application-owned.
40
+ Cloud binding v2 adds the authority-neutral Project snapshot, nine redacted durable event kinds plus `snapshot.required`, eleven capability tokens, the exact ordinary Project/Git route catalog, bounded authority-transfer artifact routes, and six private-development bootstrap bindings. The shared checkpoint container is exactly `checkpoint.json`, `coordination.ndjson`, and `repository.bundle`; portable profiles exclude engine storage, paths, credentials, tokens, private keys, and operational refs, while the backup profile may carry only protected claim-envelope metadata and ciphertext. Domain-separated canonical UTF-8 inputs define protected-claim AEAD associated data and bind every declared field of transferred-membership redemption receipts and authority-relinquishment proofs before consumer-owned Ed25519 signing or verification. Existing LAN v9 Join, invitation, endpoint, membership lifecycle, Host-transfer, snapshot, event, and HTTP bindings remain independently application-owned; the dedicated LAN authority-transfer transport binds these shared payloads without creating another shared operation registry.
41
41
 
42
42
  ## Usage
43
43
 
@@ -62,18 +62,18 @@ part of the public surface.
62
62
 
63
63
  Package SemVer, canonical wire version, and Cloud binding version are independent concepts.
64
64
 
65
- - **Package version** (this `package.json`): `1.0.0`. Patch releases preserve
65
+ - **Package version** (this `package.json`): `2.0.0`. Patch releases preserve
66
66
  every existing public declaration and runtime behavior baseline. Minor
67
67
  releases may add backward-compatible API. Removing or changing an existing
68
68
  declaration, export, runtime behavior, codec, error, limit, ref rule,
69
69
  operation, or compatibility rule requires a major release. The package
70
70
  version never signals wire compatibility by itself.
71
- - **Wire version** (`COLLAB_PROTOCOL_VERSION`): currently `4`. The supported
72
- range is exactly `[4, 4]`. This is independent from Cloud binding version `1` and the existing application
71
+ - **Wire version** (`COLLAB_PROTOCOL_VERSION`): currently `5`. The supported
72
+ range is exactly `[5, 5]`. This is independent from Cloud binding version `2` and the existing application
73
73
  LAN control version `9`. Any change to an envelope, DTO, or operation
74
74
  payload shape, or to the operation inventory, is wire-breaking and requires
75
75
  a new wire-protocol version.
76
- - **Cloud binding version** (`COLLAB_CLOUD_BINDING_VERSION`): currently `1`. It versions Cloud routes and capabilities independently from package and wire versions.
76
+ - **Cloud binding version** (`COLLAB_CLOUD_BINDING_VERSION`): currently `2`. It versions Cloud routes, bounded transfer streams, and capabilities independently from package and wire versions. Binding v1 and wire v4 are unsupported rather than translated or dual-interpreted.
77
77
 
78
78
  ### Compatibility behavior
79
79
 
@@ -0,0 +1,296 @@
1
+ import type { CollabCheckpointAuthority, CollabCheckpointAuthorityKind } from './CollabProjectCheckpoint';
2
+ import type { CollabIsoTimestamp, CollabMemberId, CollabProjectId } from './types';
3
+ export declare const COLLAB_LAN_TO_CLOUD_TRANSFER_PHASES: readonly ["collecting-readiness", "source-quiesced", "checkpoint-received", "checkpoint-validated", "claims-retained", "repository-published", "source-relinquished", "cloud-activated", "completed"];
4
+ export declare const COLLAB_CLOUD_TO_LAN_TRANSFER_PHASES: readonly ["collecting-readiness", "cloud-quiesced", "checkpoint-captured", "target-staged", "claims-retained", "cloud-relinquished", "lan-activated", "completed"];
5
+ export declare const COLLAB_AUTHORITY_TRANSFER_CANCELLATION_PHASES: readonly ["cancel-intent", "target-invalidated", "target-cleaned", "source-reopened", "cancelled"];
6
+ export declare const COLLAB_AUTHORITY_TRANSFER_CANCELLABLE_PHASES: readonly ["collecting-readiness", "source-quiesced", "checkpoint-received", "checkpoint-validated", "claims-retained", "repository-published", "cloud-quiesced", "checkpoint-captured", "target-staged", "cancel-intent", "target-invalidated", "target-cleaned", "source-reopened"];
7
+ export type CollabLanToCloudTransferPhase = typeof COLLAB_LAN_TO_CLOUD_TRANSFER_PHASES[number];
8
+ export type CollabCloudToLanTransferPhase = typeof COLLAB_CLOUD_TO_LAN_TRANSFER_PHASES[number];
9
+ export type CollabAuthorityTransferCancellationPhase = typeof COLLAB_AUTHORITY_TRANSFER_CANCELLATION_PHASES[number];
10
+ export type CollabAuthorityTransferCancellablePhase = typeof COLLAB_AUTHORITY_TRANSFER_CANCELLABLE_PHASES[number];
11
+ export type CollabAuthorityTransferDirection = 'cloud-to-lan' | 'lan-to-cloud';
12
+ export interface CollabAuthorityTransferProposal {
13
+ readonly expectedSourceAuthority: CollabCheckpointAuthority;
14
+ readonly idempotencyKey: string;
15
+ readonly projectId: CollabProjectId;
16
+ readonly proposedByMemberId: CollabMemberId;
17
+ readonly proposedAt: CollabIsoTimestamp;
18
+ readonly targetAuthorityKind: CollabCheckpointAuthorityKind;
19
+ readonly targetUrl: string;
20
+ }
21
+ export interface CollabTransferredMembershipClaimItem {
22
+ readonly claim: string;
23
+ readonly memberId: CollabMemberId;
24
+ }
25
+ export interface CollabTransferredMembershipClaimBatch {
26
+ readonly batchRevision: number;
27
+ readonly batchSha256: string;
28
+ readonly checkpointSha256: string;
29
+ readonly claims: readonly CollabTransferredMembershipClaimItem[];
30
+ readonly expiresAt: CollabIsoTimestamp;
31
+ readonly projectId: CollabProjectId;
32
+ readonly targetAuthorityGeneration: number;
33
+ readonly transferId: string;
34
+ }
35
+ export interface CollabTransferredMembershipClaimCustodyReceipt {
36
+ readonly batchRevision: number;
37
+ readonly batchSha256: string;
38
+ readonly checkpointSha256: string;
39
+ readonly committedAt: CollabIsoTimestamp;
40
+ readonly custodyAuthority: CollabCheckpointAuthority;
41
+ readonly operationIntentId: string;
42
+ readonly projectId: CollabProjectId;
43
+ readonly receiptId: string;
44
+ readonly submittedByMemberId: CollabMemberId;
45
+ readonly targetAuthorityGeneration: number;
46
+ readonly transferId: string;
47
+ }
48
+ export interface CollabTransferredMembershipClaim {
49
+ readonly claim: string;
50
+ readonly expiresAt: CollabIsoTimestamp;
51
+ readonly memberId: CollabMemberId;
52
+ readonly projectId: CollabProjectId;
53
+ readonly targetAuthorityGeneration: number;
54
+ readonly transferId: string;
55
+ }
56
+ export interface CollabTransferredMembershipRedemptionReceiptSigningPayload {
57
+ readonly checkpointSha256: string;
58
+ readonly claimSha256: string;
59
+ readonly memberId: CollabMemberId;
60
+ readonly operationIntentId: string;
61
+ readonly projectId: CollabProjectId;
62
+ readonly receiptId: string;
63
+ readonly receiptKeyId: string;
64
+ readonly redeemedAt: CollabIsoTimestamp;
65
+ readonly signatureAlgorithm: 'ed25519';
66
+ readonly targetAuthorityGeneration: number;
67
+ readonly transferId: string;
68
+ }
69
+ export interface CollabTransferredMembershipRedemptionReceipt extends CollabTransferredMembershipRedemptionReceiptSigningPayload {
70
+ readonly signature: string;
71
+ }
72
+ interface CollabAuthorityRelinquishmentProofSigningPayloadBase {
73
+ readonly batchRevision: number;
74
+ readonly batchSha256: string;
75
+ readonly certificateAlgorithm: 'ed25519';
76
+ readonly checkpointSha256: string;
77
+ readonly committedAt: CollabIsoTimestamp;
78
+ readonly operationIntentId: string;
79
+ readonly projectId: CollabProjectId;
80
+ readonly transferId: string;
81
+ }
82
+ export type CollabAuthorityRelinquishmentProofSigningPayload = CollabAuthorityRelinquishmentProofSigningPayloadBase & ({
83
+ readonly sourceAuthority: CollabCheckpointAuthority & {
84
+ readonly kind: 'lan';
85
+ };
86
+ readonly sourceHostMemberId: CollabMemberId;
87
+ readonly targetAuthority: CollabCheckpointAuthority & {
88
+ readonly kind: 'cloud';
89
+ };
90
+ } | {
91
+ readonly sourceAuthority: CollabCheckpointAuthority & {
92
+ readonly kind: 'cloud';
93
+ };
94
+ readonly sourceHostMemberId: null;
95
+ readonly targetAuthority: CollabCheckpointAuthority & {
96
+ readonly kind: 'lan';
97
+ };
98
+ });
99
+ export type CollabAuthorityRelinquishmentProof = CollabAuthorityRelinquishmentProofSigningPayload & {
100
+ readonly certificate: string;
101
+ };
102
+ export interface CollabAuthorityTransferStatus {
103
+ readonly batchRevision: number | null;
104
+ readonly batchSha256: string | null;
105
+ readonly checkpointSha256: string | null;
106
+ readonly createdAt: CollabIsoTimestamp;
107
+ readonly direction: CollabAuthorityTransferDirection;
108
+ readonly expiresAt: CollabIsoTimestamp;
109
+ readonly phase: CollabLanToCloudTransferPhase | CollabCloudToLanTransferPhase | CollabAuthorityTransferCancellationPhase;
110
+ readonly projectId: CollabProjectId;
111
+ readonly relinquishmentProof: CollabAuthorityRelinquishmentProof | null;
112
+ readonly sourceAuthority: CollabCheckpointAuthority;
113
+ readonly state: 'active' | 'cancelled' | 'completed';
114
+ readonly targetAuthority: CollabCheckpointAuthority;
115
+ readonly targetUrl: string;
116
+ readonly transferId: string;
117
+ readonly updatedAt: CollabIsoTimestamp;
118
+ }
119
+ interface CollabAuthorityMutationRequest {
120
+ readonly idempotencyKey: string;
121
+ readonly projectId: CollabProjectId;
122
+ }
123
+ export interface RequestLanToCloudTransferRequest extends CollabAuthorityMutationRequest {
124
+ readonly expectedAuthorityGeneration: number;
125
+ readonly targetUrl: string;
126
+ }
127
+ export interface AcceptLanToCloudTransferTargetRequest extends CollabAuthorityMutationRequest {
128
+ readonly expectedAuthorityGeneration: number;
129
+ readonly targetUrl: string;
130
+ readonly transferId: string;
131
+ }
132
+ export interface BeginLanToCloudTransferRequest extends CollabAuthorityMutationRequest {
133
+ readonly checkpointManifestSha256: string;
134
+ readonly expectedSourceAuthorityGeneration: number;
135
+ readonly sourceHostMemberId: CollabMemberId;
136
+ readonly sourceProof: string;
137
+ readonly targetUrl: string;
138
+ readonly transferId: string;
139
+ }
140
+ export interface GetProjectAuthorityTransferRequest {
141
+ readonly projectId: CollabProjectId;
142
+ readonly transferId: string;
143
+ }
144
+ export interface RotateTransferredMembershipClaimsRequest extends CollabAuthorityMutationRequest {
145
+ readonly expectedBatchRevision: number;
146
+ readonly expectedBatchSha256: string;
147
+ readonly transferId: string;
148
+ }
149
+ export interface AcknowledgeTransferredMembershipClaimBatchRequest extends CollabAuthorityMutationRequest {
150
+ readonly batchRevision: number;
151
+ readonly batchSha256: string;
152
+ readonly operationIntentId: string;
153
+ readonly transferId: string;
154
+ }
155
+ export interface GetTransferredMembershipClaimRequest {
156
+ readonly projectId: CollabProjectId;
157
+ readonly transferId: string;
158
+ }
159
+ interface ClaimTransferredMembershipRequestBase extends CollabAuthorityMutationRequest {
160
+ readonly claim: string;
161
+ readonly transferId: string;
162
+ }
163
+ export interface ClaimTransferredCloudMembershipRequest extends ClaimTransferredMembershipRequestBase {
164
+ readonly credentialHash?: never;
165
+ }
166
+ export interface ClaimTransferredLanMembershipRequest extends ClaimTransferredMembershipRequestBase {
167
+ readonly credentialHash: string;
168
+ }
169
+ export type ClaimTransferredMembershipRequest = ClaimTransferredCloudMembershipRequest | ClaimTransferredLanMembershipRequest;
170
+ export interface AcknowledgeTransferredMembershipClaimRedemptionRequest extends CollabAuthorityMutationRequest {
171
+ readonly receipt: CollabTransferredMembershipRedemptionReceipt;
172
+ readonly transferId: string;
173
+ }
174
+ export interface CollabTransferredMembershipRedemptionAcknowledgement {
175
+ readonly acknowledgedAt: CollabIsoTimestamp;
176
+ readonly memberId: CollabMemberId;
177
+ readonly projectId: CollabProjectId;
178
+ readonly receiptId: string;
179
+ readonly transferId: string;
180
+ }
181
+ export interface CommitLanToCloudRelinquishmentRequest extends CollabAuthorityMutationRequest {
182
+ readonly proof: CollabAuthorityRelinquishmentProof;
183
+ readonly transferId: string;
184
+ }
185
+ export interface BeginCloudToLanTransferRequest extends CollabAuthorityMutationRequest {
186
+ readonly expectedAuthorityGeneration: number;
187
+ readonly targetHostMemberId: CollabMemberId;
188
+ readonly targetUrl: string;
189
+ }
190
+ export interface AcceptCloudToLanTransferTargetRequest extends CollabAuthorityMutationRequest {
191
+ readonly targetHostMemberId: CollabMemberId;
192
+ readonly targetProof: string;
193
+ readonly transferId: string;
194
+ }
195
+ export interface ReportCloudToLanTargetStagedRequest extends CollabAuthorityMutationRequest {
196
+ readonly checkpointSha256: string;
197
+ readonly claimBatch: CollabTransferredMembershipClaimBatch;
198
+ readonly stageSha256: string;
199
+ readonly targetAuthority: CollabCheckpointAuthority;
200
+ readonly targetProof: string;
201
+ readonly transferId: string;
202
+ }
203
+ export interface ConfirmCloudToLanTargetActiveRequest extends CollabAuthorityMutationRequest {
204
+ readonly relinquishmentProof: CollabAuthorityRelinquishmentProof;
205
+ readonly targetActivationProof: string;
206
+ readonly transferId: string;
207
+ }
208
+ export interface CancelProjectAuthorityTransferRequest extends CollabAuthorityMutationRequest {
209
+ readonly expectedPhase: CollabAuthorityTransferCancellablePhase;
210
+ readonly transferId: string;
211
+ }
212
+ export declare const COLLAB_AUTHORITY_TRANSFER_OPERATIONS: readonly ["requestLanToCloudTransfer", "acceptLanToCloudTransferTarget", "beginLanToCloudTransfer", "getProjectAuthorityTransfer", "rotateTransferredMembershipClaims", "acknowledgeTransferredMembershipClaimBatch", "getTransferredMembershipClaim", "claimTransferredMembership", "acknowledgeTransferredMembershipClaimRedemption", "commitLanToCloudRelinquishment", "beginCloudToLanTransfer", "acceptCloudToLanTransferTarget", "reportCloudToLanTargetStaged", "confirmCloudToLanTargetActive", "cancelProjectAuthorityTransfer"];
213
+ export type CollabAuthorityTransferOperation = typeof COLLAB_AUTHORITY_TRANSFER_OPERATIONS[number];
214
+ export interface CollabAuthorityTransferOperationMap {
215
+ readonly requestLanToCloudTransfer: {
216
+ readonly request: RequestLanToCloudTransferRequest;
217
+ readonly response: CollabAuthorityTransferStatus;
218
+ };
219
+ readonly acceptLanToCloudTransferTarget: {
220
+ readonly request: AcceptLanToCloudTransferTargetRequest;
221
+ readonly response: CollabAuthorityTransferStatus;
222
+ };
223
+ readonly beginLanToCloudTransfer: {
224
+ readonly request: BeginLanToCloudTransferRequest;
225
+ readonly response: CollabAuthorityTransferStatus;
226
+ };
227
+ readonly getProjectAuthorityTransfer: {
228
+ readonly request: GetProjectAuthorityTransferRequest;
229
+ readonly response: CollabAuthorityTransferStatus;
230
+ };
231
+ readonly rotateTransferredMembershipClaims: {
232
+ readonly request: RotateTransferredMembershipClaimsRequest;
233
+ readonly response: CollabTransferredMembershipClaimBatch;
234
+ };
235
+ readonly acknowledgeTransferredMembershipClaimBatch: {
236
+ readonly request: AcknowledgeTransferredMembershipClaimBatchRequest;
237
+ readonly response: CollabTransferredMembershipClaimCustodyReceipt;
238
+ };
239
+ readonly getTransferredMembershipClaim: {
240
+ readonly request: GetTransferredMembershipClaimRequest;
241
+ readonly response: CollabTransferredMembershipClaim;
242
+ };
243
+ readonly claimTransferredMembership: {
244
+ readonly request: ClaimTransferredMembershipRequest;
245
+ readonly response: CollabTransferredMembershipRedemptionReceipt;
246
+ };
247
+ readonly acknowledgeTransferredMembershipClaimRedemption: {
248
+ readonly request: AcknowledgeTransferredMembershipClaimRedemptionRequest;
249
+ readonly response: CollabTransferredMembershipRedemptionAcknowledgement;
250
+ };
251
+ readonly commitLanToCloudRelinquishment: {
252
+ readonly request: CommitLanToCloudRelinquishmentRequest;
253
+ readonly response: CollabAuthorityTransferStatus;
254
+ };
255
+ readonly beginCloudToLanTransfer: {
256
+ readonly request: BeginCloudToLanTransferRequest;
257
+ readonly response: CollabAuthorityTransferStatus;
258
+ };
259
+ readonly acceptCloudToLanTransferTarget: {
260
+ readonly request: AcceptCloudToLanTransferTargetRequest;
261
+ readonly response: CollabAuthorityTransferStatus;
262
+ };
263
+ readonly reportCloudToLanTargetStaged: {
264
+ readonly request: ReportCloudToLanTargetStagedRequest;
265
+ readonly response: CollabTransferredMembershipClaimCustodyReceipt;
266
+ };
267
+ readonly confirmCloudToLanTargetActive: {
268
+ readonly request: ConfirmCloudToLanTargetActiveRequest;
269
+ readonly response: CollabAuthorityTransferStatus;
270
+ };
271
+ readonly cancelProjectAuthorityTransfer: {
272
+ readonly request: CancelProjectAuthorityTransferRequest;
273
+ readonly response: CollabAuthorityTransferStatus;
274
+ };
275
+ }
276
+ export declare function decodeCollabAuthorityTransferProposal(value: unknown): CollabAuthorityTransferProposal;
277
+ export declare function decodeCollabTransferredMembershipClaimBatch(value: unknown): CollabTransferredMembershipClaimBatch;
278
+ export declare function encodeCollabTransferredMembershipClaimBatchDigestInput(batch: CollabTransferredMembershipClaimBatch): string;
279
+ export declare function decodeCollabTransferredMembershipClaimCustodyReceipt(value: unknown): CollabTransferredMembershipClaimCustodyReceipt;
280
+ export declare function decodeCollabTransferredMembershipClaim(value: unknown): CollabTransferredMembershipClaim;
281
+ export declare function encodeCollabTransferredMembershipRedemptionReceiptSigningInput(payload: CollabTransferredMembershipRedemptionReceiptSigningPayload): string;
282
+ export declare function decodeCollabTransferredMembershipRedemptionReceipt(value: unknown): CollabTransferredMembershipRedemptionReceipt;
283
+ export declare function encodeCollabAuthorityRelinquishmentProofSigningInput(payload: CollabAuthorityRelinquishmentProofSigningPayload): string;
284
+ export declare function decodeCollabAuthorityRelinquishmentProof(value: unknown): CollabAuthorityRelinquishmentProof;
285
+ export declare function decodeCollabAuthorityTransferLifecycleFence(value: unknown): {
286
+ batchRevision: number | null;
287
+ batchSha256: string | null;
288
+ checkpointSha256: string | null;
289
+ direction: "cloud-to-lan" | "lan-to-cloud";
290
+ phase: "collecting-readiness" | "source-quiesced" | "checkpoint-received" | "checkpoint-validated" | "claims-retained" | "repository-published" | "source-relinquished" | "cloud-activated" | "completed" | "cloud-quiesced" | "checkpoint-captured" | "target-staged" | "cloud-relinquished" | "lan-activated" | "cancel-intent" | "target-invalidated" | "target-cleaned" | "source-reopened" | "cancelled";
291
+ relinquishmentRequired: boolean;
292
+ };
293
+ export declare function decodeCollabAuthorityTransferStatus(value: unknown): CollabAuthorityTransferStatus;
294
+ export declare function decodeCollabAuthorityTransferOperationRequest<Operation extends CollabAuthorityTransferOperation>(operation: Operation, value: unknown): CollabAuthorityTransferOperationMap[Operation]['request'];
295
+ export declare function decodeCollabAuthorityTransferOperationResponse<Operation extends CollabAuthorityTransferOperation>(operation: Operation, value: unknown): CollabAuthorityTransferOperationMap[Operation]['response'];
296
+ export {};