@indigoai-us/hq-cloud 5.22.0 → 5.23.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 (58) hide show
  1. package/dist/index.d.ts +9 -3
  2. package/dist/index.d.ts.map +1 -1
  3. package/dist/index.js +9 -1
  4. package/dist/index.js.map +1 -1
  5. package/dist/journal.d.ts +76 -1
  6. package/dist/journal.d.ts.map +1 -1
  7. package/dist/journal.js +148 -1
  8. package/dist/journal.js.map +1 -1
  9. package/dist/journal.test.js +251 -5
  10. package/dist/journal.test.js.map +1 -1
  11. package/dist/prefix-coalesce.d.ts +38 -0
  12. package/dist/prefix-coalesce.d.ts.map +1 -0
  13. package/dist/prefix-coalesce.js +69 -0
  14. package/dist/prefix-coalesce.js.map +1 -0
  15. package/dist/prefix-coalesce.test.d.ts +2 -0
  16. package/dist/prefix-coalesce.test.d.ts.map +1 -0
  17. package/dist/prefix-coalesce.test.js +77 -0
  18. package/dist/prefix-coalesce.test.js.map +1 -0
  19. package/dist/public-surface.test.d.ts +15 -0
  20. package/dist/public-surface.test.d.ts.map +1 -0
  21. package/dist/public-surface.test.js +105 -0
  22. package/dist/public-surface.test.js.map +1 -0
  23. package/dist/remote-pull.d.ts +145 -1
  24. package/dist/remote-pull.d.ts.map +1 -1
  25. package/dist/remote-pull.js +258 -1
  26. package/dist/remote-pull.js.map +1 -1
  27. package/dist/remote-pull.test.js +470 -2
  28. package/dist/remote-pull.test.js.map +1 -1
  29. package/dist/scope-shrink.d.ts +109 -0
  30. package/dist/scope-shrink.d.ts.map +1 -0
  31. package/dist/scope-shrink.js +196 -0
  32. package/dist/scope-shrink.js.map +1 -0
  33. package/dist/scope-shrink.test.d.ts +13 -0
  34. package/dist/scope-shrink.test.d.ts.map +1 -0
  35. package/dist/scope-shrink.test.js +342 -0
  36. package/dist/scope-shrink.test.js.map +1 -0
  37. package/dist/types.d.ts +48 -1
  38. package/dist/types.d.ts.map +1 -1
  39. package/dist/vault-client.d.ts +178 -0
  40. package/dist/vault-client.d.ts.map +1 -1
  41. package/dist/vault-client.js +73 -0
  42. package/dist/vault-client.js.map +1 -1
  43. package/dist/vault-client.test.js +226 -0
  44. package/dist/vault-client.test.js.map +1 -1
  45. package/package.json +1 -1
  46. package/src/index.ts +67 -0
  47. package/src/journal.test.ts +284 -5
  48. package/src/journal.ts +167 -2
  49. package/src/prefix-coalesce.test.ts +95 -0
  50. package/src/prefix-coalesce.ts +72 -0
  51. package/src/public-surface.test.ts +112 -0
  52. package/src/remote-pull.test.ts +540 -3
  53. package/src/remote-pull.ts +419 -2
  54. package/src/scope-shrink.test.ts +402 -0
  55. package/src/scope-shrink.ts +264 -0
  56. package/src/types.ts +49 -1
  57. package/src/vault-client.test.ts +335 -0
  58. package/src/vault-client.ts +223 -0
@@ -92,6 +92,122 @@ export interface CreateEntityInput {
92
92
  export interface CreateEntityResult {
93
93
  entity: EntityInfo;
94
94
  }
95
+ /**
96
+ * Source kind for an explicit per-company file-ACL grant. Mirrors the
97
+ * server enum in hq-pro `vault-service/handlers/files-grants.ts`.
98
+ *
99
+ * `'open'` collapses two server-side shapes that are indistinguishable to
100
+ * the caller — the legacy `acl.open === true` floor and an explicit
101
+ * `granteeType: 'company-wide'` row. Both mean "every active member of
102
+ * this company sees this prefix".
103
+ */
104
+ export type GrantSource = "person" | "email" | "group" | "open";
105
+ /** Permission level surfaced on a grant row. Matches `AclPermission`. */
106
+ export type GrantPermission = "read" | "write" | "admin";
107
+ /**
108
+ * One row in the response of `GET /v1/files/grants?company={uid}`.
109
+ *
110
+ * Role-bypass (owner/admin) entries are intentionally excluded by the
111
+ * server — this is the caller's EXPLICIT grant graph, not the full set
112
+ * of prefixes they can touch by virtue of role.
113
+ */
114
+ export interface ExplicitGrant {
115
+ companyUid: string;
116
+ path: string;
117
+ permission: GrantPermission;
118
+ source: GrantSource;
119
+ }
120
+ /**
121
+ * Effective sync mode for a single membership. Mirrors the server's
122
+ * resolved view from `GET /v1/memberships/{id}/sync-config`:
123
+ *
124
+ * - `shared` — sync only `shared/` and the caller's `personal/` prefix
125
+ * - `all` — sync every prefix the caller has read access to
126
+ * - `custom` — sync the explicit `customPaths` list (server validates)
127
+ *
128
+ * `isDefault: true` means no row exists in DDB and the server is
129
+ * falling back to its built-in default (currently `'all'` for legacy
130
+ * memberships created pre-US-003). When `true`, `updatedAt`/`updatedBy`
131
+ * are absent because there's no row to attribute.
132
+ */
133
+ export type SyncMode = "shared" | "all" | "custom";
134
+ export interface MembershipSyncConfig {
135
+ membershipId: string;
136
+ syncMode: SyncMode;
137
+ customPaths?: string[];
138
+ /**
139
+ * `true` when the server returned the built-in default because no
140
+ * sync-config row exists for this membership. PUT always returns
141
+ * `false` — writing the row is what makes it non-default.
142
+ */
143
+ isDefault: boolean;
144
+ /** Present only when a sync-config row exists (i.e. `isDefault: false`). */
145
+ updatedAt?: string;
146
+ /** Present only when a sync-config row exists. PersonUid of the writer. */
147
+ updatedBy?: string;
148
+ }
149
+ /**
150
+ * Input shape for {@link VaultClient.setMembershipSyncConfig}. The server
151
+ * validates the combination — `customPaths` is required when `syncMode`
152
+ * is `'custom'` and rejected otherwise.
153
+ */
154
+ export interface SetMembershipSyncConfigInput {
155
+ syncMode: SyncMode;
156
+ customPaths?: string[];
157
+ }
158
+ /**
159
+ * Why the caller is requesting STS-scoped credentials. Mirrors the
160
+ * hq-pro vault-service enum (`src/vault-service/policy-builder.ts`).
161
+ *
162
+ * - `'sync'` — background machine sync. Role-bypass MUST NOT widen
163
+ * the path set: credentials are scoped to exactly the requested
164
+ * paths (which the sync engine has already narrowed via US-005).
165
+ * - `'browse'` — interactive exploration (hq-console Explore,
166
+ * `hq files browse`, admin spelunking). Admin/owner role-bypass
167
+ * APPLIES — the caller may receive credentials covering paths
168
+ * beyond their explicit ACL grants.
169
+ *
170
+ * The server defaults missing/empty to `'sync'` (the safer choice).
171
+ * The client doesn't mirror that default — every caller should be
172
+ * explicit about its intent so audit rows are accurate.
173
+ */
174
+ export type VendPurpose = "sync" | "browse";
175
+ export type VaultOperation = "read-only" | "read-write" | "staged-write";
176
+ /**
177
+ * Input shape for {@link VaultClient.vend}. The server validates
178
+ * combinations — e.g. `purpose: 'sync'` rejects bucket-wide `'*'` paths
179
+ * as defense in depth against role-bypass widening on the sync path.
180
+ */
181
+ export interface VendInput {
182
+ paths: string[];
183
+ operations: VaultOperation;
184
+ /** Why these credentials are being vended. See {@link VendPurpose}. */
185
+ purpose: VendPurpose;
186
+ /** STS session lifetime in seconds. Server default is 900 (15m). */
187
+ duration?: number;
188
+ }
189
+ export interface VendCredentials {
190
+ accessKeyId: string;
191
+ secretAccessKey: string;
192
+ sessionToken: string;
193
+ /** ISO-8601 STS-native expiration string. */
194
+ expiration: string;
195
+ }
196
+ export interface VendResult {
197
+ credentials: VendCredentials;
198
+ /** Echo of the server-resolved paths after ACL intersection. */
199
+ paths: string[];
200
+ operations: VaultOperation;
201
+ /** Echo of the effective purpose (server-defaulted to 'sync' if absent). */
202
+ purpose: VendPurpose;
203
+ /**
204
+ * Size of the rendered IAM session policy in characters. Lets the
205
+ * caller detect when it's nearing the 2048-char IAM ceiling so it can
206
+ * fan out across multiple vends or shrink its path set.
207
+ */
208
+ policySize: number;
209
+ requestId?: string;
210
+ }
95
211
  export type TaskAction = "read" | "write";
96
212
  export interface TaskScope {
97
213
  /** S3 key prefixes the child may access (e.g. ["drafts/"]). */
@@ -201,6 +317,46 @@ export declare class VaultClient {
201
317
  listMembersOfCompany(companyUid: string): Promise<Membership[]>;
202
318
  updateRole(input: UpdateRoleInput): Promise<Membership>;
203
319
  listPendingInvites(companyUid: string): Promise<Membership[]>;
320
+ /**
321
+ * List the caller's EXPLICIT per-company file-ACL grants. Backed by
322
+ * `GET /v1/files/grants?company={companyUid}` (hq-pro US-002).
323
+ *
324
+ * Role-bypass (owner/admin) entries are excluded server-side — the
325
+ * response is the caller's actual grant graph, not the full set of
326
+ * prefixes they can touch by virtue of role. Used by the
327
+ * browse-vs-sync UI to render an honest grant graph and by the
328
+ * sync engine to narrow what it pulls.
329
+ *
330
+ * Returns `[]` (NOT a 404) when the caller has no explicit grants in
331
+ * this company, so call sites can treat "empty graph" as a normal
332
+ * state without catching errors.
333
+ */
334
+ listMyExplicitGrants(companyUid: string): Promise<ExplicitGrant[]>;
335
+ /**
336
+ * Read the effective sync-mode for a single membership. Backed by
337
+ * `GET /v1/memberships/{id}/sync-config` (hq-pro US-003).
338
+ *
339
+ * The server resolves the effective view — when no row exists for the
340
+ * membership it returns the built-in default with `isDefault: true`
341
+ * and omits `updatedAt`/`updatedBy`. Callers should treat `isDefault:
342
+ * true` as "no explicit config yet" rather than special-casing 404.
343
+ *
344
+ * Authorization: caller must own the membership OR hold admin/owner
345
+ * on the company that the membership belongs to. The server 404s
346
+ * tombstoned/revoked memberships.
347
+ */
348
+ getMembershipSyncConfig(membershipId: string): Promise<MembershipSyncConfig>;
349
+ /**
350
+ * Write the sync-mode for a single membership. Backed by
351
+ * `PUT /v1/memberships/{id}/sync-config` (hq-pro US-003).
352
+ *
353
+ * Server validates: `customPaths` is required when `syncMode` is
354
+ * `'custom'` and rejected otherwise. The returned row reflects the
355
+ * persisted state with `isDefault: false` (writing the row is what
356
+ * makes it non-default) and the server-assigned `updatedAt` +
357
+ * `updatedBy`.
358
+ */
359
+ setMembershipSyncConfig(membershipId: string, partial: SetMembershipSyncConfigInput): Promise<MembershipSyncConfig>;
204
360
  readonly entity: {
205
361
  get: (uid: string) => Promise<EntityInfo>;
206
362
  /**
@@ -251,6 +407,28 @@ export declare class VaultClient {
251
407
  bucketName: string;
252
408
  kmsKeyId: string;
253
409
  }>;
410
+ /**
411
+ * POST `/vend` — vend STS-scoped credentials for an explicit path list.
412
+ *
413
+ * This is the legacy raw-vend endpoint (distinct from `/sts/vend`,
414
+ * `/sts/vend-self`, and `/sts/vend-child`). Per US-009 it accepts a
415
+ * `purpose` discriminator that controls whether admin/owner
416
+ * role-bypass widens the resulting session policy beyond the
417
+ * caller's explicit ACL grants:
418
+ *
419
+ * - `purpose: 'browse'` — role-bypass APPLIES (interactive
420
+ * `hq files browse`, admin spelunking).
421
+ * - `purpose: 'sync'` — role-bypass SUPPRESSED (background sync;
422
+ * credentials are scoped to exactly what the caller has explicitly
423
+ * been granted, regardless of role).
424
+ *
425
+ * The server defaults missing/empty to `'sync'` but every first-party
426
+ * caller should be explicit so audit attribution is correct.
427
+ *
428
+ * Used by `hq files browse`/`hq files cat` (US-008) to peek at vault
429
+ * objects without ever materialising them under `companies/{co}/`.
430
+ */
431
+ vend(input: VendInput): Promise<VendResult>;
254
432
  readonly sts: {
255
433
  /**
256
434
  * Vend task-scoped child credentials strictly narrower than the caller's
@@ -1 +1 @@
1
- {"version":3,"file":"vault-client.d.ts","sourceRoot":"","sources":["../src/vault-client.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"vault-client.d.ts","sourceRoot":"","sources":["../src/vault-client.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAc,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAOjE,qBAAa,gBAAiB,SAAQ,KAAK;aAGvB,UAAU,EAAE,MAAM;aAClB,IAAI,CAAC,EAAE,MAAM;gBAF7B,OAAO,EAAE,MAAM,EACC,UAAU,EAAE,MAAM,EAClB,IAAI,CAAC,EAAE,MAAM,YAAA;CAKhC;AAED,qBAAa,cAAe,SAAQ,gBAAgB;gBACtC,OAAO,SAAuD;CAI3E;AAED,qBAAa,0BAA2B,SAAQ,gBAAgB;gBAClD,OAAO,SAA4C;CAIhE;AAED,qBAAa,kBAAmB,SAAQ,gBAAgB;gBAC1C,OAAO,SAAuB;CAI3C;AAED,qBAAa,kBAAmB,SAAQ,gBAAgB;gBAC1C,OAAO,SAA+D;CAInF;AAMD,MAAM,MAAM,cAAc,GAAG,OAAO,GAAG,OAAO,GAAG,QAAQ,GAAG,OAAO,CAAC;AACpE,MAAM,MAAM,gBAAgB,GAAG,SAAS,GAAG,QAAQ,GAAG,SAAS,CAAC;AAEhE,MAAM,WAAW,UAAU;IACzB,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,cAAc,CAAC;IACrB,MAAM,EAAE,gBAAgB,CAAC;IACzB,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;IAC3B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,iBAAiB;IAChC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,cAAc,CAAC;IACrB,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;IAC3B,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,kBAAkB;IACjC,UAAU,EAAE,UAAU,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,kBAAkB;IACjC,UAAU,EAAE,UAAU,CAAC;CACxB;AAED,MAAM,WAAW,eAAe;IAC9B,aAAa,EAAE,MAAM,CAAC;IACtB,OAAO,EAAE,cAAc,CAAC;IACxB,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;IAC3B,UAAU,EAAE,MAAM,CAAC;IACnB,qFAAqF;IACrF,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,UAAU;IACzB,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,yEAAyE;IACzE,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,wBAAgB,yBAAyB,CACvC,IAAI,EAAE,UAAU,EAAE,GACjB,UAAU,GAAG,IAAI,CAanB;AAED,MAAM,WAAW,oBAAoB;IACnC,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,cAAc,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,QAAQ,GAAG,SAAS,CAAC;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,UAAU,CAAC;CACpB;AAID;;;;;;;;GAQG;AACH,MAAM,MAAM,WAAW,GAAG,QAAQ,GAAG,OAAO,GAAG,OAAO,GAAG,MAAM,CAAC;AAEhE,yEAAyE;AACzE,MAAM,MAAM,eAAe,GAAG,MAAM,GAAG,OAAO,GAAG,OAAO,CAAC;AAEzD;;;;;;GAMG;AACH,MAAM,WAAW,aAAa;IAC5B,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,eAAe,CAAC;IAC5B,MAAM,EAAE,WAAW,CAAC;CACrB;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,MAAM,QAAQ,GAAG,QAAQ,GAAG,KAAK,GAAG,QAAQ,CAAC;AAEnD,MAAM,WAAW,oBAAoB;IACnC,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,QAAQ,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB;;;;OAIG;IACH,SAAS,EAAE,OAAO,CAAC;IACnB,4EAA4E;IAC5E,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,2EAA2E;IAC3E,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;GAIG;AACH,MAAM,WAAW,4BAA4B;IAC3C,QAAQ,EAAE,QAAQ,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;CACxB;AAID;;;;;;;;;;;;;;;GAeG;AACH,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,QAAQ,CAAC;AAE5C,MAAM,MAAM,cAAc,GAAG,WAAW,GAAG,YAAY,GAAG,cAAc,CAAC;AAEzE;;;;GAIG;AACH,MAAM,WAAW,SAAS;IACxB,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,UAAU,EAAE,cAAc,CAAC;IAC3B,uEAAuE;IACvE,OAAO,EAAE,WAAW,CAAC;IACrB,oEAAoE;IACpE,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,eAAe;IAC9B,WAAW,EAAE,MAAM,CAAC;IACpB,eAAe,EAAE,MAAM,CAAC;IACxB,YAAY,EAAE,MAAM,CAAC;IACrB,6CAA6C;IAC7C,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,UAAU;IACzB,WAAW,EAAE,eAAe,CAAC;IAC7B,gEAAgE;IAChE,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,UAAU,EAAE,cAAc,CAAC;IAC3B,4EAA4E;IAC5E,OAAO,EAAE,WAAW,CAAC;IACrB;;;;OAIG;IACH,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAID,MAAM,MAAM,UAAU,GAAG,MAAM,GAAG,OAAO,CAAC;AAE1C,MAAM,WAAW,SAAS;IACxB,+DAA+D;IAC/D,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,0EAA0E;IAC1E,cAAc,CAAC,EAAE,UAAU,EAAE,CAAC;CAC/B;AAED,MAAM,WAAW,cAAc;IAC7B,UAAU,EAAE,MAAM,CAAC;IACnB,gFAAgF;IAChF,MAAM,EAAE,MAAM,CAAC;IACf,mFAAmF;IACnF,eAAe,EAAE,MAAM,CAAC;IACxB,SAAS,EAAE,SAAS,CAAC;IACrB;;;;OAIG;IACH,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,mBAAmB;IAClC,WAAW,EAAE,MAAM,CAAC;IACpB,eAAe,EAAE,MAAM,CAAC;IACxB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,eAAe;IAC9B,WAAW,EAAE,mBAAmB,CAAC;IACjC;+EAC2E;IAC3E,WAAW,EAAE,MAAM,CAAC;IACpB,mCAAmC;IACnC,SAAS,EAAE,MAAM,CAAC;CACnB;AAMD,MAAM,WAAW,sBAAsB;IACrC,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B;AAED,MAAM,WAAW,UAAU;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,gBAAgB,EAAE,MAAM,CAAC;IACzB;;;;;;;OAOG;IACH,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;CACxC;AAED,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,OAAO,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAChE;AAqBD,qBAAa,WAAW;IACtB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAwB;IACrD,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAyB;gBAExC,MAAM,EAAE,kBAAkB;IAkBhC,YAAY,CAAC,KAAK,EAAE,iBAAiB,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAQnE,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAQjF;;;;;OAKG;IACG,gBAAgB,CAAC,aAAa,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIhF;;;;;;;;;;;;;;OAcG;IACG,iBAAiB,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;IAKhD;;;;;;;;OAQG;IACG,2BAA2B,IAAI,OAAO,CAAC,oBAAoB,EAAE,CAAC;IAOpE;;;;OAIG;IACG,0BAA0B,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAI5D,oBAAoB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;IAO/D,UAAU,CAAC,KAAK,EAAE,eAAe,GAAG,OAAO,CAAC,UAAU,CAAC;IAQvD,kBAAkB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;IASnE;;;;;;;;;;;;;OAaG;IACG,oBAAoB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC;IAOxE;;;;;;;;;;;;OAYG;IACG,uBAAuB,CAC3B,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC,oBAAoB,CAAC;IAMhC;;;;;;;;;OASG;IACG,uBAAuB,CAC3B,YAAY,EAAE,MAAM,EACpB,OAAO,EAAE,4BAA4B,GACpC,OAAO,CAAC,oBAAoB,CAAC;IAUhC,QAAQ,CAAC,MAAM;mBACI,MAAM,KAAG,OAAO,CAAC,UAAU,CAAC;QAK7C;;;;;;;;;;WAUG;2BACsB,MAAM,QAAQ,MAAM,KAAG,OAAO,CAAC,UAAU,CAAC;QAOnE;;;;;;;;;;;WAWG;kCAEK,MAAM,QACN,MAAM,KACX,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC;wBAWP,iBAAiB,KAAG,OAAO,CAAC,UAAU,CAAC;QAK7D,yEAAyE;2BAChD,MAAM,KAAG,OAAO,CAAC,UAAU,EAAE,CAAC;MAMvD;IAIF;;;;;;;;;;OAUG;IACG,oBAAoB,CAAC,KAAK,EAAE;QAChC,QAAQ,EAAE,MAAM,CAAC;QACjB,WAAW,EAAE,MAAM,CAAC;KACrB,GAAG,OAAO,CAAC,UAAU,CAAC;IAqBjB,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC;IAU5F;;;;;;;;;;;;;;;;;;;;OAoBG;IACG,IAAI,CAAC,KAAK,EAAE,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC;IAMjD,QAAQ,CAAC,GAAG;QACV;;;;;;;;;;;;WAYG;2BACsB,cAAc,KAAG,OAAO,CAAC,eAAe,CAAC;0BAI1C;YAAE,SAAS,EAAE,MAAM,CAAC;YAAC,eAAe,CAAC,EAAE,MAAM,CAAA;SAAE,KAAG,OAAO,CAAC;YAChF,WAAW,EAAE;gBAAE,WAAW,EAAE,MAAM,CAAC;gBAAC,eAAe,EAAE,MAAM,CAAC;gBAAC,YAAY,EAAE,MAAM,CAAA;aAAE,CAAC;YACpF,SAAS,EAAE,MAAM,CAAC;SACnB,CAAC;MAGF;IAUF;;;;;;OAMG;IACG,iBAAiB,IAAI,OAAO,CAAC,sBAAsB,CAAC;IAI1D;;;;;;;OAOG;IACG,SAAS,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,iBAAiB,CAAC;YAMhD,GAAG;YAIH,IAAI;YAIJ,OAAO;IAkDrB,OAAO,CAAC,QAAQ;IAiBhB,OAAO,CAAC,cAAc;CAQvB"}
@@ -162,6 +162,54 @@ export class VaultClient {
162
162
  const data = await this.get(`/membership/company/${encodeURIComponent(companyUid)}/pending`);
163
163
  return data.invites;
164
164
  }
165
+ // -- Browse-vs-sync (US-002, US-003, US-004) -----------------------------
166
+ /**
167
+ * List the caller's EXPLICIT per-company file-ACL grants. Backed by
168
+ * `GET /v1/files/grants?company={companyUid}` (hq-pro US-002).
169
+ *
170
+ * Role-bypass (owner/admin) entries are excluded server-side — the
171
+ * response is the caller's actual grant graph, not the full set of
172
+ * prefixes they can touch by virtue of role. Used by the
173
+ * browse-vs-sync UI to render an honest grant graph and by the
174
+ * sync engine to narrow what it pulls.
175
+ *
176
+ * Returns `[]` (NOT a 404) when the caller has no explicit grants in
177
+ * this company, so call sites can treat "empty graph" as a normal
178
+ * state without catching errors.
179
+ */
180
+ async listMyExplicitGrants(companyUid) {
181
+ const data = await this.get(`/v1/files/grants?company=${encodeURIComponent(companyUid)}`);
182
+ return data.grants ?? [];
183
+ }
184
+ /**
185
+ * Read the effective sync-mode for a single membership. Backed by
186
+ * `GET /v1/memberships/{id}/sync-config` (hq-pro US-003).
187
+ *
188
+ * The server resolves the effective view — when no row exists for the
189
+ * membership it returns the built-in default with `isDefault: true`
190
+ * and omits `updatedAt`/`updatedBy`. Callers should treat `isDefault:
191
+ * true` as "no explicit config yet" rather than special-casing 404.
192
+ *
193
+ * Authorization: caller must own the membership OR hold admin/owner
194
+ * on the company that the membership belongs to. The server 404s
195
+ * tombstoned/revoked memberships.
196
+ */
197
+ async getMembershipSyncConfig(membershipId) {
198
+ return this.get(`/v1/memberships/${encodeURIComponent(membershipId)}/sync-config`);
199
+ }
200
+ /**
201
+ * Write the sync-mode for a single membership. Backed by
202
+ * `PUT /v1/memberships/{id}/sync-config` (hq-pro US-003).
203
+ *
204
+ * Server validates: `customPaths` is required when `syncMode` is
205
+ * `'custom'` and rejected otherwise. The returned row reflects the
206
+ * persisted state with `isDefault: false` (writing the row is what
207
+ * makes it non-default) and the server-assigned `updatedAt` +
208
+ * `updatedBy`.
209
+ */
210
+ async setMembershipSyncConfig(membershipId, partial) {
211
+ return this.request("PUT", `/v1/memberships/${encodeURIComponent(membershipId)}/sync-config`, partial);
212
+ }
165
213
  // -- Entity operations ----------------------------------------------------
166
214
  entity = {
167
215
  get: async (uid) => {
@@ -244,6 +292,31 @@ export class VaultClient {
244
292
  const data = await this.post("/provision/bucket", { companyUid });
245
293
  return data;
246
294
  }
295
+ // -- Raw vend (POST /vend) ------------------------------------------------
296
+ /**
297
+ * POST `/vend` — vend STS-scoped credentials for an explicit path list.
298
+ *
299
+ * This is the legacy raw-vend endpoint (distinct from `/sts/vend`,
300
+ * `/sts/vend-self`, and `/sts/vend-child`). Per US-009 it accepts a
301
+ * `purpose` discriminator that controls whether admin/owner
302
+ * role-bypass widens the resulting session policy beyond the
303
+ * caller's explicit ACL grants:
304
+ *
305
+ * - `purpose: 'browse'` — role-bypass APPLIES (interactive
306
+ * `hq files browse`, admin spelunking).
307
+ * - `purpose: 'sync'` — role-bypass SUPPRESSED (background sync;
308
+ * credentials are scoped to exactly what the caller has explicitly
309
+ * been granted, regardless of role).
310
+ *
311
+ * The server defaults missing/empty to `'sync'` but every first-party
312
+ * caller should be explicit so audit attribution is correct.
313
+ *
314
+ * Used by `hq files browse`/`hq files cat` (US-008) to peek at vault
315
+ * objects without ever materialising them under `companies/{co}/`.
316
+ */
317
+ async vend(input) {
318
+ return this.post("/vend", input);
319
+ }
247
320
  // -- STS operations (VLT-8) -----------------------------------------------
248
321
  sts = {
249
322
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"vault-client.js","sourceRoot":"","sources":["../src/vault-client.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"vault-client.js","sourceRoot":"","sources":["../src/vault-client.ts"],"names":[],"mappings":"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"}
@@ -520,6 +520,168 @@ describe("VaultClient identity bootstrap", () => {
520
520
  });
521
521
  });
522
522
  // ---------------------------------------------------------------------------
523
+ // Browse-vs-sync SDK methods (US-004)
524
+ //
525
+ // listMyExplicitGrants, getMembershipSyncConfig, setMembershipSyncConfig
526
+ // wrap the US-002/US-003 hq-pro endpoints. Tests assert URL shape, payload
527
+ // shape, error mapping (401/404/network), and the empty-grants fallback
528
+ // that lets call sites treat "no grants" as a normal state.
529
+ // ---------------------------------------------------------------------------
530
+ describe("listMyExplicitGrants (US-004)", () => {
531
+ it("GETs /v1/files/grants with the company query param and returns grants[]", async () => {
532
+ const grant = {
533
+ companyUid: "cmp_abc",
534
+ path: "shared/docs",
535
+ permission: "read",
536
+ source: "person",
537
+ };
538
+ fetchSpy.mockResolvedValueOnce(jsonResponse(200, {
539
+ grants: [grant],
540
+ computedAt: "2026-05-20T12:00:00.000Z",
541
+ }));
542
+ const grants = await client.listMyExplicitGrants("cmp_abc");
543
+ expect(grants).toEqual([grant]);
544
+ const [url, init] = fetchSpy.mock.calls[0];
545
+ expect(url).toBe("https://vault.test.example.com/v1/files/grants?company=cmp_abc");
546
+ expect(init.method).toBe("GET");
547
+ expect(init.body).toBeUndefined();
548
+ });
549
+ it("URL-encodes the companyUid query parameter", async () => {
550
+ fetchSpy.mockResolvedValueOnce(jsonResponse(200, { grants: [], computedAt: "2026-05-20T12:00:00.000Z" }));
551
+ await client.listMyExplicitGrants("cmp/with spaces&weird=chars");
552
+ const [url] = fetchSpy.mock.calls[0];
553
+ expect(url).toBe("https://vault.test.example.com/v1/files/grants?company=cmp%2Fwith%20spaces%26weird%3Dchars");
554
+ });
555
+ it("returns [] when the server omits the grants key (empty graph)", async () => {
556
+ fetchSpy.mockResolvedValueOnce(jsonResponse(200, { computedAt: "2026-05-20T12:00:00.000Z" }));
557
+ const grants = await client.listMyExplicitGrants("cmp_abc");
558
+ expect(grants).toEqual([]);
559
+ });
560
+ it("maps 401 to VaultAuthError", async () => {
561
+ fetchSpy.mockResolvedValueOnce(jsonResponse(401, { error: "Missing or invalid authorization token" }));
562
+ await expect(client.listMyExplicitGrants("cmp_abc")).rejects.toThrow(VaultAuthError);
563
+ });
564
+ it("maps 404 to VaultNotFoundError", async () => {
565
+ fetchSpy.mockResolvedValueOnce(jsonResponse(404, { error: "Unknown route" }));
566
+ await expect(client.listMyExplicitGrants("cmp_abc")).rejects.toThrow(VaultNotFoundError);
567
+ });
568
+ it("surfaces transport errors after exhausting retries", async () => {
569
+ fetchSpy.mockRejectedValue(new Error("ECONNREFUSED"));
570
+ await expect(client.listMyExplicitGrants("cmp_abc")).rejects.toThrow(/ECONNREFUSED/);
571
+ // 1 initial + 3 retries = 4 attempts on a persistent network error.
572
+ expect(fetchSpy).toHaveBeenCalledTimes(4);
573
+ });
574
+ });
575
+ describe("getMembershipSyncConfig (US-004)", () => {
576
+ it("GETs /v1/memberships/{id}/sync-config and returns the row verbatim", async () => {
577
+ const row = {
578
+ membershipId: "psn_1#cmp_abc",
579
+ syncMode: "custom",
580
+ customPaths: ["shared/docs", "personal/psn_1"],
581
+ isDefault: false,
582
+ updatedAt: "2026-05-20T12:00:00.000Z",
583
+ updatedBy: "psn_admin",
584
+ };
585
+ fetchSpy.mockResolvedValueOnce(jsonResponse(200, row));
586
+ const result = await client.getMembershipSyncConfig("psn_1#cmp_abc");
587
+ expect(result).toEqual(row);
588
+ const [url, init] = fetchSpy.mock.calls[0];
589
+ expect(url).toBe(
590
+ // `#` in the membershipKey MUST be URL-encoded — otherwise the
591
+ // server sees a fragment, not a path segment.
592
+ "https://vault.test.example.com/v1/memberships/psn_1%23cmp_abc/sync-config");
593
+ expect(init.method).toBe("GET");
594
+ expect(init.body).toBeUndefined();
595
+ });
596
+ it("returns the default row (isDefault: true) without updatedAt/updatedBy", async () => {
597
+ fetchSpy.mockResolvedValueOnce(jsonResponse(200, {
598
+ membershipId: "psn_1#cmp_abc",
599
+ syncMode: "all",
600
+ isDefault: true,
601
+ }));
602
+ const result = await client.getMembershipSyncConfig("psn_1#cmp_abc");
603
+ expect(result.isDefault).toBe(true);
604
+ expect(result.updatedAt).toBeUndefined();
605
+ expect(result.updatedBy).toBeUndefined();
606
+ });
607
+ it("maps 401 to VaultAuthError", async () => {
608
+ fetchSpy.mockResolvedValueOnce(jsonResponse(401, { error: "Token expired" }));
609
+ await expect(client.getMembershipSyncConfig("psn_1#cmp_abc")).rejects.toThrow(VaultAuthError);
610
+ });
611
+ it("maps 404 to VaultNotFoundError (membership tombstoned or missing)", async () => {
612
+ fetchSpy.mockResolvedValueOnce(jsonResponse(404, {
613
+ error: "Membership not found or not active: psn_1#cmp_abc",
614
+ }));
615
+ await expect(client.getMembershipSyncConfig("psn_1#cmp_abc")).rejects.toThrow(VaultNotFoundError);
616
+ });
617
+ it("surfaces network errors after retry exhaustion", async () => {
618
+ fetchSpy.mockRejectedValue(new Error("socket hang up"));
619
+ await expect(client.getMembershipSyncConfig("psn_1#cmp_abc")).rejects.toThrow(/socket hang up/);
620
+ expect(fetchSpy).toHaveBeenCalledTimes(4);
621
+ });
622
+ });
623
+ describe("setMembershipSyncConfig (US-004)", () => {
624
+ it("PUTs the partial body to /v1/memberships/{id}/sync-config", async () => {
625
+ const persisted = {
626
+ membershipId: "psn_1#cmp_abc",
627
+ syncMode: "custom",
628
+ customPaths: ["shared/docs"],
629
+ isDefault: false,
630
+ updatedAt: "2026-05-20T12:00:00.000Z",
631
+ updatedBy: "psn_1",
632
+ };
633
+ fetchSpy.mockResolvedValueOnce(jsonResponse(200, persisted));
634
+ const result = await client.setMembershipSyncConfig("psn_1#cmp_abc", {
635
+ syncMode: "custom",
636
+ customPaths: ["shared/docs"],
637
+ });
638
+ expect(result).toEqual(persisted);
639
+ const [url, init] = fetchSpy.mock.calls[0];
640
+ expect(url).toBe("https://vault.test.example.com/v1/memberships/psn_1%23cmp_abc/sync-config");
641
+ expect(init.method).toBe("PUT");
642
+ const headers = init.headers;
643
+ expect(headers["Content-Type"]).toBe("application/json");
644
+ expect(headers.Authorization).toBe("Bearer test-jwt-token-123");
645
+ expect(JSON.parse(init.body)).toEqual({
646
+ syncMode: "custom",
647
+ customPaths: ["shared/docs"],
648
+ });
649
+ });
650
+ it("supports the shared mode without customPaths", async () => {
651
+ fetchSpy.mockResolvedValueOnce(jsonResponse(200, {
652
+ membershipId: "psn_1#cmp_abc",
653
+ syncMode: "shared",
654
+ isDefault: false,
655
+ updatedAt: "2026-05-20T12:00:00.000Z",
656
+ updatedBy: "psn_1",
657
+ }));
658
+ const result = await client.setMembershipSyncConfig("psn_1#cmp_abc", {
659
+ syncMode: "shared",
660
+ });
661
+ expect(result.syncMode).toBe("shared");
662
+ expect(result.customPaths).toBeUndefined();
663
+ const [, init] = fetchSpy.mock.calls[0];
664
+ expect(JSON.parse(init.body)).toEqual({ syncMode: "shared" });
665
+ });
666
+ it("maps 401 to VaultAuthError", async () => {
667
+ fetchSpy.mockResolvedValueOnce(jsonResponse(401, { error: "Token expired" }));
668
+ await expect(client.setMembershipSyncConfig("psn_1#cmp_abc", { syncMode: "all" })).rejects.toThrow(VaultAuthError);
669
+ });
670
+ it("maps 404 to VaultNotFoundError when the membership is gone", async () => {
671
+ fetchSpy.mockResolvedValueOnce(jsonResponse(404, { error: "Membership not found" }));
672
+ await expect(client.setMembershipSyncConfig("psn_1#cmp_abc", { syncMode: "all" })).rejects.toThrow(VaultNotFoundError);
673
+ });
674
+ it("maps 409 to VaultConflictError", async () => {
675
+ fetchSpy.mockResolvedValueOnce(jsonResponse(409, { error: "Concurrent write conflict" }));
676
+ await expect(client.setMembershipSyncConfig("psn_1#cmp_abc", { syncMode: "all" })).rejects.toThrow(VaultConflictError);
677
+ });
678
+ it("surfaces network errors after retry exhaustion", async () => {
679
+ fetchSpy.mockRejectedValue(new Error("ETIMEDOUT"));
680
+ await expect(client.setMembershipSyncConfig("psn_1#cmp_abc", { syncMode: "all" })).rejects.toThrow(/ETIMEDOUT/);
681
+ expect(fetchSpy).toHaveBeenCalledTimes(4);
682
+ });
683
+ });
684
+ // ---------------------------------------------------------------------------
523
685
  // Refreshable authToken getter
524
686
  //
525
687
  // Regression for the personal-sync 401: a captured `authToken` string can
@@ -586,4 +748,68 @@ describe("authToken getter (refreshable token)", () => {
586
748
  }
587
749
  });
588
750
  });
751
+ // ---------------------------------------------------------------------------
752
+ // Raw vend (POST /vend, purpose-aware after US-009)
753
+ // ---------------------------------------------------------------------------
754
+ describe("vend (POST /vend, purpose-aware)", () => {
755
+ it("POSTs to /vend with paths/operations/purpose and returns credentials + policySize", async () => {
756
+ fetchSpy.mockResolvedValueOnce(jsonResponse(200, {
757
+ credentials: {
758
+ accessKeyId: "AKIA-BROWSE",
759
+ secretAccessKey: "secret",
760
+ sessionToken: "token",
761
+ expiration: "2026-05-20T13:00:00.000Z",
762
+ },
763
+ paths: ["shared/docs/"],
764
+ operations: "read-only",
765
+ purpose: "browse",
766
+ policySize: 412,
767
+ requestId: "req_xyz",
768
+ }));
769
+ const out = await client.vend({
770
+ paths: ["shared/docs/"],
771
+ operations: "read-only",
772
+ purpose: "browse",
773
+ });
774
+ expect(out.purpose).toBe("browse");
775
+ expect(out.policySize).toBe(412);
776
+ expect(out.credentials.accessKeyId).toBe("AKIA-BROWSE");
777
+ expect(out.credentials.sessionToken).toBe("token");
778
+ const [url, init] = fetchSpy.mock.calls[0];
779
+ expect(url).toBe("https://vault.test.example.com/vend");
780
+ expect(init.method.toUpperCase()).toBe("POST");
781
+ expect(JSON.parse(init.body)).toEqual({
782
+ paths: ["shared/docs/"],
783
+ operations: "read-only",
784
+ purpose: "browse",
785
+ });
786
+ });
787
+ it("forwards purpose='sync' verbatim (no client-side defaulting)", async () => {
788
+ fetchSpy.mockResolvedValueOnce(jsonResponse(200, {
789
+ credentials: {
790
+ accessKeyId: "k",
791
+ secretAccessKey: "s",
792
+ sessionToken: "t",
793
+ expiration: "2026-05-20T13:00:00.000Z",
794
+ },
795
+ paths: ["shared/"],
796
+ operations: "read-only",
797
+ purpose: "sync",
798
+ policySize: 200,
799
+ }));
800
+ await client.vend({
801
+ paths: ["shared/"],
802
+ operations: "read-only",
803
+ purpose: "sync",
804
+ duration: 1800,
805
+ });
806
+ const [, init] = fetchSpy.mock.calls[0];
807
+ expect(JSON.parse(init.body)).toEqual({
808
+ paths: ["shared/"],
809
+ operations: "read-only",
810
+ purpose: "sync",
811
+ duration: 1800,
812
+ });
813
+ });
814
+ });
589
815
  //# sourceMappingURL=vault-client.test.js.map