@uluops/ops-sdk 6.3.1 → 6.5.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 (64) hide show
  1. package/CHANGELOG.md +69 -0
  2. package/README.md +273 -2
  3. package/dist/client.d.ts +110 -3
  4. package/dist/client.d.ts.map +1 -1
  5. package/dist/client.js +94 -5
  6. package/dist/client.js.map +1 -1
  7. package/dist/config/constants.d.ts +1 -1
  8. package/dist/config/generated-version.d.ts +1 -1
  9. package/dist/config/generated-version.js +1 -1
  10. package/dist/config/validators.d.ts +25 -1
  11. package/dist/config/validators.d.ts.map +1 -1
  12. package/dist/config/validators.js +31 -1
  13. package/dist/config/validators.js.map +1 -1
  14. package/dist/config/workspace-org.d.ts +25 -4
  15. package/dist/config/workspace-org.d.ts.map +1 -1
  16. package/dist/config/workspace-org.js +71 -18
  17. package/dist/config/workspace-org.js.map +1 -1
  18. package/dist/errors/errors.d.ts +71 -0
  19. package/dist/errors/errors.d.ts.map +1 -1
  20. package/dist/errors/errors.js +99 -0
  21. package/dist/errors/errors.js.map +1 -1
  22. package/dist/index.d.ts +2 -2
  23. package/dist/index.d.ts.map +1 -1
  24. package/dist/index.js +1 -1
  25. package/dist/index.js.map +1 -1
  26. package/dist/operations/admin.d.ts +100 -0
  27. package/dist/operations/admin.d.ts.map +1 -0
  28. package/dist/operations/admin.js +130 -0
  29. package/dist/operations/admin.js.map +1 -0
  30. package/dist/operations/auth.d.ts +21 -1
  31. package/dist/operations/auth.d.ts.map +1 -1
  32. package/dist/operations/auth.js +49 -3
  33. package/dist/operations/auth.js.map +1 -1
  34. package/dist/operations/orgs.d.ts +45 -0
  35. package/dist/operations/orgs.d.ts.map +1 -0
  36. package/dist/operations/orgs.js +57 -0
  37. package/dist/operations/orgs.js.map +1 -0
  38. package/dist/operations/projects.d.ts +74 -0
  39. package/dist/operations/projects.d.ts.map +1 -1
  40. package/dist/operations/projects.js +115 -1
  41. package/dist/operations/projects.js.map +1 -1
  42. package/dist/types/auth.d.ts +10 -0
  43. package/dist/types/auth.d.ts.map +1 -1
  44. package/dist/types/index.d.ts +2 -0
  45. package/dist/types/index.d.ts.map +1 -1
  46. package/dist/types/index.js +2 -0
  47. package/dist/types/index.js.map +1 -1
  48. package/dist/types/log.d.ts +410 -0
  49. package/dist/types/log.d.ts.map +1 -0
  50. package/dist/types/log.js +191 -0
  51. package/dist/types/log.js.map +1 -0
  52. package/dist/types/rehome.d.ts +234 -0
  53. package/dist/types/rehome.d.ts.map +1 -0
  54. package/dist/types/rehome.js +171 -0
  55. package/dist/types/rehome.js.map +1 -0
  56. package/dist/types/response-schemas.d.ts +19 -0
  57. package/dist/types/response-schemas.d.ts.map +1 -1
  58. package/dist/types/response-schemas.js +19 -0
  59. package/dist/types/response-schemas.js.map +1 -1
  60. package/dist/types/schemas.d.ts +20 -0
  61. package/dist/types/schemas.d.ts.map +1 -1
  62. package/dist/types/schemas.js +22 -0
  63. package/dist/types/schemas.js.map +1 -1
  64. package/package.json +1 -1
package/CHANGELOG.md CHANGED
@@ -4,6 +4,75 @@ All notable changes to `@uluops/ops-sdk` will be documented in this file.
4
4
 
5
5
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).
6
6
 
7
+ ## [6.5.0] - 2026-09-15
8
+
9
+ ulu log, Phase 3 (spec v0.1.13 §3.2/§3.3/§3.5/§3.6; checklist Phase 3). Additive — nothing existing changes shape or signature; one existing function changes what it *accepts* (below, under Changed, because that is the kind of change a signature does not show).
10
+
11
+ ### Added
12
+
13
+ - **`projects.getLog(idOrName, query?, options?)`** — the project log: `run`, `decision` and `regression` events interleaved newest first, keyset-paged (`{ data, count, hasMore, nextCursor? }`; pass `nextCursor` back verbatim). The event union is closed (`LogEvent`, discriminated on `type`) and parsed strictly; `counts` on a `run` is typed `... | null` and IS null on runs saved before migration 065. **Query keys go to the wire as named** (`workflowType`, `includeArchived`) — the API's log schema is camelCase and non-strict, so a snake_cased key is silently ignored with a 200 (the filter vanishes); this call therefore does not use the SDK's generic `toApiQuery`, and the test carries the control showing the generic path would have produced `workflow_type`.
14
+ - **`projects.getLogStat(idOrName, query?, options?)`** — the rollup (`ProjectLogStat`): two frames on two clocks, `decided` = current status of the found issues (sums to `found.issues`), D12's `cameBack.detected` / `reopened` as distinct issues with row counts beside them, D13's `activity.restated`, D14's seven-key `byStatus`.
15
+ - **`orgs.list()`** — `GET /orgs`: the orgs the key holder belongs to, personal included (`OrgListEntry`). What `ulu log --orgs` iterates.
16
+ - **`orgs.getLogStat(slug, query?)`** — the org rollup (`OrgLogStat`): the same body over the org's live projects plus `projects[]` (D15's summary shape, capped at 100 with `hasMoreProjects`) and **`computedAt`** — the org rollup is served from a 60 s TTL cache per (org, window) (D16), and this field is required by the parse: an older API that omits it fails loudly rather than reporting numbers of unknown age.
17
+ - **`readWorkspaceFile(path, uid?)`** → `{ org?, project? } | undefined` — the full workspace file, beside the unchanged `readWorkspaceOrgFile`, which now delegates to it. `project` is validated like the API validates a project name (1–200 chars, no control characters) and is **not** trimmed — a name is matched exactly. **A file carrying `project` without `org` throws** (`"project" requires "org"; use "personal" for no org`), so a project-only file can never shadow an outer org. No resolver is added here: the read-only ladder (`--project` → file → `ULUOPS_PROJECT` → error) belongs to the one command that reads it (D5).
18
+ - Types: `LogEvent` / `LogRunEvent` / `LogDecisionEvent` / `LogRegressionEvent`, `ProjectLogPage`, `ProjectLogQuery`, `LogStatQuery`, `LogStatBody`, `ProjectLogStat`, `OrgLogStat`, `OrgLogProjectSummary`, `OrgListEntry`, `WorkspaceFile`; the Zod schemas beside them.
19
+
20
+ ### Changed
21
+
22
+ - **`readWorkspaceOrgFile` no longer throws on a `.uluops.json` that carries `project`** — the allowlist is `org`, `project`, `$schema` (was `org`, `$schema`), and the refusal message now names all three. Same signature, same return; a file that was refused in 6.4.x is read in 6.5.0. This is a semantics-without-signature change and this entry is the only place it shows. **Rollout rule (spec §3.5, by provenance):** because every 6.4.x-and-older reader throws on the key — for every command, not only `ulu log` — `project` may not be written into any checkout, and no docs may describe writing it, until every *installed* copy of this package in that tree is ≥ 6.5.0. The checklist carries the enumeration (`find … -path '*/@uluops/ops-sdk/dist/config/workspace-org.js'`) and the 13-consumer census.
23
+
24
+ ## [6.4.1] - 2026-09-15
25
+
26
+ 6.4.0 reached Verdaccio only; the review of that change set (anxiety-reader 84 / docs-validator 81 / dx-validator 83 / code-auditor 98, all on the `feat/rehome-surfaces` diff) folded into this release before npm. What changed against 6.4.0:
27
+
28
+ ### Added
29
+
30
+ - **`login(email, password, { autoRefresh })`.** The default (`true`) is unchanged; `false` installs the session without the password so a 401 surfaces untouched. Why it exists: sdk-core's refresh is a *fresh login*, and under the API's default single-session policy a login **revokes the user's other sessions**; the mutation that hit the 401 is then *not* retried, and the budget is one. A script that must treat 401 as "stop" (spec §4.7) was having the SDK act first. Tested both ways: no `/auth/login` on a 401 with the option, exactly one without.
31
+ - **`isInsufficientRoleError`** — the fifth 403 code gains the guard every other one has.
32
+ - `admin.rehomeProject` / `admin.releaseProjectRehome` **refuse a non-UUID client-side** (`InputValidationError`) — `validateUuid` existed and was dead code; the admin route is id-only and answers 400 to a name, and the whole `projects.*` surface trains callers to pass names.
33
+ - TSDoc `@param`/`@returns`/`@example` on the new operations and validators; `@throws {MfaRequiredError}` on `login`.
34
+
35
+ ### Changed
36
+
37
+ - **`admin.releaseProjectRehome` shape failure is a `ZodError`**, like every other shape failure in this SDK, not a bare `Error` — and the doc says what it means: the server answers 200 after the row is gone, so a shape failure is most likely a *completed* release.
38
+ - The admin path's missing-`reason` message says why it is required ("the target org's only standing for the move") instead of Zod's "expected nonoptional".
39
+ - `OrgAuditFeedQuery.limit` is documented as **1–100, not clamped** (the API answers 400) — the JSDoc said "1–200 (API-clamped)", which was false on both counts.
40
+
41
+ ### Fixed — documentation that overclaimed
42
+
43
+ - The 6.4.0 entry said "an MFA-enrolled account could not log in through the SDK … Fixed". True for `login()`/`auth.login()` only: a client constructed with `{ email, password }` (or autoloaded credentials) logs in inside sdk-core, which cannot see the challenge and surfaces a generic `UnauthorizedError`. Documented on `OpsClientConfig`, `MfaRequiredError` and in the README; not fixable from this package without intercepting sdk-core's strategy.
44
+ - The MFA challenge token is **single-use and consumed before the code is verified** (API `totp-service.verifyLogin`) — a mistyped code burns it. The README example read as retryable; it no longer does.
45
+ - **`same_org` is the idempotence signal of the ADMIN path only.** The member path's lookup is source-scoped, so a re-run after the move answers 404, not `same_org`. `projects.rehome`'s doc, the README table and `rehomeRefusalReason`'s doc now say so, and the table gained the two missing reasons (`project_soft_deleted`, `project_has_no_org`) plus a row for *no HTTP answer* (`null` from `rehomeRefusalReason` is "not a refusal I can name", not "safe to retry").
46
+ - README "automatic token refresh" is now qualified with the three properties above.
47
+
48
+ ### Known, not fixed here
49
+
50
+ - sdk-core's 401 branch inspects the *client's* auth strategy, not the request's `skipAuth`, so a wrong TOTP code on a bare client says "Set ULUOPS_API_KEY" — the one remedy D20 forbids. Filed against sdk-core.
51
+ - A TOTP-installed session's expiry message ("credentials were cleared after login") is sdk-core's and wrong for this path; `JwtSessionAuth` has no way to be handed `expiresAt`.
52
+
53
+ ## [6.4.0] - 2026-09-15 (Verdaccio only)
54
+
55
+ ### Added
56
+
57
+ The client side of project re-home (project-org-routing-and-rehome spec §4; API deployed 2026-09-15). Three surfaces for three audiences — a member capability, a member feed, and a platform-admin namespace — plus the login branch the admin path made unavoidable.
58
+
59
+ - **`projects.rehome(idOrName, { targetOrg, reason? }, options?)`** — the member path (`POST /projects/:id/rehome`). The SOURCE is the call's org scope (`options.org` / client `orgSlug`); the project is looked up there, so a work-org project moved without scope is a 404, not a silent personal-org lookup. Returns `RehomeResponse`: the project after the move plus `rehome.{from_org, to_org, audit_ids}` (snake_case by contract; `audit_ids` is `[]` today because the platform ACL returns no ids — the ledger is the durable record). Body is built as the API's `.strict()` schema wants it: `reason` is omitted, never sent as null.
60
+ - **`rehomeRefusalReason(err)`** and `REHOME_REFUSAL_REASONS` — reads `details.reason` on the 400/409 refusals (`same_org`, `moved_during_request`, `deadlock_retry`, `concurrent_modification`, `name_collision`, `soft_deleted_conflict`, `rehomed_away_conflict`, `export_in_progress`, `project_soft_deleted`, `project_has_no_org`) and returns `null` for anything else, an unknown reason included. Enumerated because the Phase 4 runbook (spec §4.7) assigns each a disposition and a script that types the strings itself will misspell one.
61
+ - **`orgs.getVisibleAuditLog(slug, { cursor?, limit? })`** — the D19 feed (`GET /orgs/:slug/audit-log/global`): rows a writer marked `visibility: 'org'`, readable by any member; today, projects leaving the org for a personal org. New `orgs` namespace (reads only). **`readRehomeAuditDetails(entry)`** narrows an entry's `details` to the re-home writer's shape (`RehomeAuditDetails`) or `null`, so a renderer can print a move in one line and everything else raw.
62
+ - **`admin.*` namespace** — `rehomeProject(projectId, { targetOrg, reason })` (the D8 platform path: any project, any orgs, by UUID, `reason` REQUIRED), `listProjectRehomes(query?)` (the reservation/redirect table), `listProjectRehomeEvents(query?)` (the D21 append-only ledger, paged by `seq`; unknown event kinds parse verbatim), `releaseProjectRehome(rehomeId)`. All four need the PLATFORM admin role (`403 INSUFFICIENT_ROLE` otherwise); the two writes are session-only (D20). This is the Phase 4 migration script's substrate; no MCP tool wraps it, on purpose.
63
+ - **`SESSION_REQUIRED`** / **`isSessionRequiredError`** and **`INSUFFICIENT_ROLE`** — the two 403 codes the admin path adds to the org-routing set.
64
+ - **MFA login.** `login()` / `auth.login()` now throw **`MfaRequiredError`** (`mfaChallengeToken`, `expiresAt`, `mfaMethods`; guard `isMfaRequiredError`) when `POST /auth/login` answers the challenge shape, and **`OpsClient.loginWithTotp(challengeToken, code)`** / `auth.totpLogin()` complete it (`POST /auth/totp/login`) and install the session. Not a nice-to-have: D20 makes the admin re-home route session-only and the operator account may be MFA-enrolled, and the SDK could not log such an account in at all — see Fixed. A TOTP-installed session carries no password, so it is NOT auto-refreshed; on expiry requests fail 401 and the caller logs in again (a migration script treats that as "stop", never "retry with the key").
65
+ - `ProjectResponseSchema` gains **`orgId`** (nullable, optional). The API has emitted it on every project read since org scoping landed; `z.object()` was stripping it, so a re-homed project's new org was invisible through the SDK.
66
+
67
+ ### Fixed
68
+
69
+ - **An MFA-enrolled account could not log in through the SDK.** `LoginResponseSchema` required `sessionToken`, and the API's `200 { mfa_required: true, mfa_challenge_token, ... }` challenge body therefore surfaced as a raw `ZodError` on `sessionToken` — a parse failure on a successful request, with the challenge token discarded. The challenge is now parsed first (narrower literal) and thrown as `MfaRequiredError`; a session body still parses (tested as the control).
70
+
71
+ ### Notes
72
+
73
+ - Live-verified 2026-09-15 against the current API build on a prod-copy database, not only against nock: member round trip personal → team → personal, `410 PROJECT_REHOMED` at the vacated address on a write (reads there 404 — D14 is a write-path check), `same_org`, the source-scope 404, C6 (owner moving into their own personal org), annihilation on reversal, the D19 feed on both orgs with a non-member `ORG_ACCESS_DENIED` control, and the key→session login ladder. The admin ledger schemas were checked against the controller and nock only — the smoke user was not a platform admin (`INSUFFICIENT_ROLE` on all four, which also fixes the middleware order: platform role before the session gate).
74
+ - Spec §4.1 says the response carries `orgSlug`; the API emits `orgId` and the slug inside `rehome.to_org`. The schema follows the wire; the spec changelog records the drift.
75
+
7
76
  ## [6.3.1] - 2026-09-13
8
77
 
9
78
  ### Security
package/README.md CHANGED
@@ -95,6 +95,8 @@ for (const [domain, trend] of Object.entries(burndown.trends)) {
95
95
  - [Issue Operations](#issue-operations)
96
96
  - [Analytics Operations](#analytics-operations)
97
97
  - [Taxonomy Operations](#taxonomy-operations)
98
+ - [Org Operations](#org-operations)
99
+ - [Admin Operations](#admin-operations)
98
100
  - [Health Check](#health-check)
99
101
  - [Environment Variables](#environment-variables)
100
102
  - [Error Handling](#error-handling)
@@ -170,7 +172,7 @@ console.log(client.getAuthType()); // 'api_key'
170
172
 
171
173
  ### Session-Based Authentication
172
174
 
173
- For interactive applications, use `client.login()` which automatically configures token auto-refresh:
175
+ For interactive applications, use `client.login()` which installs the session and, by default, re-logs in on a 401:
174
176
 
175
177
  ```typescript
176
178
  import { OpsClient } from '@uluops/ops-sdk';
@@ -192,6 +194,43 @@ await client.logout();
192
194
 
193
195
  > **Note:** Prefer `client.login()` over `client.auth.login()`. The latter only returns the token without installing it, requiring manual client construction.
194
196
 
197
+ **Accounts with MFA (6.4.0).** For an account with TOTP or a passkey enrolled, `POST /auth/login`
198
+ answers a *challenge*, not a session, and `client.login()` throws `MfaRequiredError` carrying
199
+ `mfaChallengeToken`, `expiresAt` and `mfaMethods`. Complete it with the current code:
200
+
201
+ ```typescript
202
+ import { isMfaRequiredError } from '@uluops/ops-sdk';
203
+
204
+ try {
205
+ await client.login(email, password);
206
+ } catch (err) {
207
+ if (!isMfaRequiredError(err)) throw err;
208
+ await client.loginWithTotp(err.mfaChallengeToken, '123456'); // installs the session
209
+ }
210
+ ```
211
+
212
+ **The challenge token is single-use and is consumed before the code is checked** — a mistyped
213
+ code burns it; do not loop on `loginWithTotp` with the same token, call `login()` again for a fresh
214
+ challenge. A TOTP-installed session has no password to re-login with, so it is **not**
215
+ auto-refreshed: when it expires, requests fail `401` and you log in again. (Before 6.4.0 an MFA
216
+ account could not log in through `login()` at all — the challenge body failed the session schema
217
+ with a `ZodError`.) `MfaRequiredError` is raised by `login()` / `auth.login()` **only**: a client
218
+ constructed with `{ email, password }` (or autoloaded credentials) logs in inside sdk-core, which
219
+ cannot see the challenge and surfaces a generic `UnauthorizedError` — MFA accounts must use the
220
+ two-step path. WebAuthn completion is not offered here.
221
+
222
+ **What "auto-refresh" does — read before scripting against a session.** With the default
223
+ `login()`, the password is kept so sdk-core can re-login when a request answers 401. That refresh
224
+ is a *fresh login*: under the API's default single-session policy it **revokes the user's other
225
+ sessions** (your dashboard tab); **mutations are not retried** afterwards (the POST that hit the 401
226
+ still throws it); and the budget is **one** (the password is cleared after the first re-login).
227
+ For a script — the Phase 4 migration, anything that shares the account with a dashboard — pass
228
+ `{ autoRefresh: false }` so a 401 means *stop*, untouched:
229
+
230
+ ```typescript
231
+ await client.login(email, password, { autoRefresh: false }); // session without a password → no re-login
232
+ ```
233
+
195
234
  ### Credential Priority Chain
196
235
 
197
236
  The SDK loads credentials in the following order:
@@ -347,6 +386,8 @@ Three org-routing errors are worth branching on (all exported with type guards):
347
386
  | `INSUFFICIENT_ORG_ROLE` | 403 | `isInsufficientOrgRoleError` | Your role in that org is below `publisher`. **Do not retry without `org`** — an org-less retry files the work in your personal org; the API says so in the body (`details.applied: false`). |
348
387
  | `ORG_ACCESS_DENIED` | 403 | `isOrgAccessDeniedError` | Not a member of that org, or your key is bound to a different one. Terminal. |
349
388
  | `PROJECT_REHOMED` | 410 | `isProjectRehomedError` | The project moved orgs. `err.details.target_org.slug` is where it lives — pass it as `org` and retry the same call. |
389
+ | `SESSION_REQUIRED` | 403 | `isSessionRequiredError` | A session-only admin route refused an API key (D20). Log in; never mint another key to get past it. |
390
+ | `INSUFFICIENT_ROLE` | 403 | `isInsufficientRoleError` | The admin path needs the *platform* role (`users.role = admin`); no `org` argument changes it. Terminal. |
350
391
 
351
392
  Low-level: `new OpsHttpClient(cfg).withOrg('acme')` returns a view of the client scoped to that org.
352
393
 
@@ -354,7 +395,14 @@ Low-level: `new OpsHttpClient(cfg).withOrg('acme')` returns a view of the client
354
395
  MCP), `resolveWorkspaceOrg({ explicit, cwd })` implements the spec's D13 rule: an explicit value
355
396
  wins; else the nearest `.uluops.json` above `cwd` (`{ "org": "ulu-labs" }`, or `{ "org": "personal" }`
356
397
  to stop the walk in a personal repo nested under a work tree); else `ULUOPS_ORG_SLUG`; else your
357
- personal org. The file may carry only `org` (and `$schema`) — any other key is refused, not ignored.
398
+ personal org. The file may carry only `org`, `project` and `$schema` — any other key is refused, not ignored.
399
+ **`project` (6.5.0, ulu log D5)** is the project name a *read* command resolves when given none —
400
+ `ulu log` today; it governs reads only (no write path consumes it; `ulu exec` keeps flag → env →
401
+ inferred basename). Read it with `readWorkspaceFile(path)` → `{ org?, project? }`; a file carrying
402
+ `project` **must** carry `org` (`"personal"` allowed) or the reader throws, so a project-only file can
403
+ never shadow an outer org. `readWorkspaceOrgFile(path)` keeps its signature and now returns the org
404
+ of such a file instead of refusing it. **Do not write `project` into a checkout until every installed
405
+ `@uluops/ops-sdk` in that tree is ≥ 6.5.0** — older readers throw on the key, for every command.
358
406
  Two more refusals since 6.3.1 (security audit run #187): the walk never rises above your home
359
407
  directory (a file at `/` or `/Users` cannot become everyone's default), and a file owned by another
360
408
  user is refused (a shared parent directory is the planting vector). `"personal"` is also honoured as
@@ -731,6 +779,58 @@ for (const point of trends) {
731
779
  }
732
780
  ```
733
781
 
782
+ #### `client.projects.getLog(idOrName, query?, options?)` — the project log (ulu log §3.2)
783
+
784
+ The project's second history: `run` events (what was examined) and `decision` / `regression`
785
+ events (what was decided, with reasons — and what came back) interleaved newest first,
786
+ keyset-paged. Pass `nextCursor` back verbatim. Three things to keep straight when rendering:
787
+ `reason: null` is *no reason recorded*; `source: null` is *unattributed*, never *human*; a
788
+ `regression` is a row a **run** re-detected, while a `resolved → open` `decision` with no run is
789
+ *reopened by decision* (D12) — the SDK types both and does not collapse them. `counts` is `null`
790
+ on runs saved before migration 065.
791
+
792
+ | Parameter | Type | Required | Description |
793
+ |-----------|------|----------|-------------|
794
+ | `since` / `until` | `string` | No | ISO 8601 window; `since <= until` or 400 |
795
+ | `limit` | `number` | No | 1–500, default 50; outside the range is a 400 |
796
+ | `cursor` | `string` | No | A `nextCursor` from the previous page, verbatim |
797
+ | `kind` | `('run'\|'decision'\|'regression')[]` | No | Subset of event kinds |
798
+ | `workflowType` | `string` | No | Filters `run` events only |
799
+ | `agent` | `string` | No | Runs by snapshot agent name; ledger rows by `issues.agent` |
800
+ | `includeArchived` | `boolean` | No | Archived runs are excluded unless `true` |
801
+
802
+ Query keys go to the wire as named (`workflowType`, not `workflow_type`): the API's schema is
803
+ camelCase and silently ignores a snake_cased key, so this call does not use the SDK's generic
804
+ snake_casing.
805
+
806
+ ```typescript
807
+ let cursor: string | undefined;
808
+ do {
809
+ const page = await client.projects.getLog('my-project', { limit: 100, cursor }, { org: 'ulu-labs' });
810
+ for (const e of page.data) {
811
+ if (e.type === 'run') console.log(e.at, `run #${e.runNumber}`, e.workflowType, e.counts ?? '-');
812
+ else if (e.type === 'decision') console.log(e.at, e.fingerprint, `${e.from} -> ${e.to}`, e.reason ?? 'no reason recorded');
813
+ else console.log(e.at, e.fingerprint, 'regressed', e.viaRunNumber === null ? 'via run ?' : `via run #${e.viaRunNumber}`);
814
+ }
815
+ cursor = page.hasMore ? page.nextCursor : undefined;
816
+ } while (cursor);
817
+ ```
818
+
819
+ #### `client.projects.getLogStat(idOrName, query?, options?)` — the rollup (§3.3)
820
+
821
+ `{ projectId, window, examined, found, decided, cameBack, activity }`. Two frames on two clocks:
822
+ the **cohort** frame (`examined`, `found`, `decided`) windows on run timestamps; the **activity**
823
+ frame (`activity`, `cameBack`) on ledger timestamps. `decided` is the *current* status of each
824
+ found issue and sums to `found.issues` — it is not "decisions made in the window"; that is
825
+ `activity.decisions`. `activity.byStatus.open` counts transitions **into** open (render it
826
+ *reopened*). `cameBack.detected` / `reopened` are distinct issues with the row counts beside
827
+ them; `lastDetectedAtAllTime` ignores the window by definition. `since` / `until` as above.
828
+
829
+ ```typescript
830
+ const stat = await client.projects.getLogStat('my-project');
831
+ console.log(`${stat.examined.runs} runs, ${stat.found.issues} findings, ${stat.decided.completed} fixed, ${stat.cameBack.detected} regressions caught by re-running`);
832
+ ```
833
+
734
834
  #### `client.projects.listIssues(idOrName, query)`
735
835
 
736
836
  List issues for a project with filters.
@@ -809,6 +909,52 @@ const result = await client.projects.mergeIssues('my-project', {
809
909
  });
810
910
  ```
811
911
 
912
+ #### `client.projects.rehome(idOrName, input, options?)` — move a project to another org
913
+
914
+ Moves the project and its whole history (runs, issues, analytics) into another org
915
+ (project-org-routing-and-rehome spec §4.1, D14). **The source org is this call's org scope** —
916
+ pass `{ org: '<source>' }` (or set the client `orgSlug`) unless the project is in your personal
917
+ org; the project is looked up *there*, and an unscoped call for a work-org project is a 404. You
918
+ need `admin`/`owner` in both orgs; a personal org as *target* only when it is yours.
919
+
920
+ | Parameter | Type | Required | Description |
921
+ |-----------|------|----------|-------------|
922
+ | `targetOrg` | `string` | Yes | Slug of the destination org |
923
+ | `reason` | `string` | No | ≤ 500 chars; stored on the tombstone, never rendered into an error |
924
+
925
+ ```typescript
926
+ const moved = await client.projects.rehome('billing', { targetOrg: 'ulu-labs', reason: 'team took it over' }, { org: 'acme' });
927
+ moved.orgId; // the target org's id
928
+ moved.rehome.from_org; // { id, slug: 'acme' }
929
+ moved.rehome.to_org; // { id, slug: 'ulu-labs' }
930
+ moved.rehome.audit_ids; // [] today — the ledger, not this array, is the durable record
931
+ ```
932
+
933
+ After the move the old `(org, name)` address is a **tombstone**: an org-less *write* naming the
934
+ project there (a `save` or a `create`) gets `410 PROJECT_REHOMED` naming the target
935
+ (`isProjectRehomedError`) instead of silently forking a new project. Reads at the old address 404.
936
+ Moving back is an ordinary `rehome` the other way and annihilates the tombstone.
937
+
938
+ Refusals a caller branches on — `rehomeRefusalReason(err)` reads the enumerated
939
+ `details.reason` values and returns `null` for anything else:
940
+
941
+ | Answer | Meaning | Disposition |
942
+ |---|---|---|
943
+ | `400` `same_org` | already there | done (idempotent re-run) |
944
+ | `409` `moved_during_request` / `deadlock_retry` / `concurrent_modification` | lost a race | re-read, retry once |
945
+ | `409` `name_collision` / `soft_deleted_conflict` / `rehomed_away_conflict` | the name is taken in the target (live, soft-deleted, or reserved by another move) | skip and report |
946
+ | `409` `export_in_progress` | an export holds one of the orgs | wait, retry |
947
+ | `409` `project_soft_deleted` | the project is soft-deleted in the source | restore it there first, then move |
948
+ | `400` `project_has_no_org` | pre-org legacy row | stop; an operator repairs the row |
949
+ | `403` `INSUFFICIENT_ORG_ROLE` / `ORG_ACCESS_DENIED` / `ORG_SUSPENDED` | authority (source role, target membership or a personal target, C3) | stop |
950
+ | `402` `PROJECT_LIMIT` | target org at its project cap | stop |
951
+ | *no HTTP answer* (`isTimeoutError` / `isNetworkError`; `rehomeRefusalReason` → `null`) | the server may have committed the move before the response was lost | do **not** retry blind — read the project with `{ org: targetOrg }` (or the admin ledger); on the member path a blind retry is a 404, not `same_org` |
952
+
953
+ **Re-runs.** `same_org` is the idempotence signal of the **admin** path (lookup by id, unscoped).
954
+ On the member path the lookup is source-scoped, so the same call after the move answers **404**
955
+ (the source address is a tombstone) — not `same_org`. A member-path script that wants "already
956
+ done" checks the target org, not the refusal code.
957
+
812
958
  ---
813
959
 
814
960
  ### Run Operations
@@ -1823,6 +1969,131 @@ console.log('Priorities:', taxonomy.priorities);
1823
1969
 
1824
1970
  ---
1825
1971
 
1972
+ ### Org Operations
1973
+
1974
+ Reads any **member** of an org can make. (Org CRUD, membership and invitations are dashboard
1975
+ surfaces and are not wrapped by this SDK.)
1976
+
1977
+ #### `client.orgs.getVisibleAuditLog(slug, query?)` — the org-visible audit feed (D19)
1978
+
1979
+ The subset of an org's audit log that any member may read: rows whose writer marked
1980
+ `details.visibility = 'org'`. Today that is one class — a project **leaving this org for someone's
1981
+ personal org** (an org admin may do that; before D19 the org's owner could not see it). The full
1982
+ audit log stays admin+ and is not wrapped here.
1983
+
1984
+ | Parameter | Type | Description |
1985
+ |-----------|------|-------------|
1986
+ | `cursor` | `string` | Opaque keyset cursor — pass a prior page's `nextCursor` back verbatim |
1987
+ | `limit` | `number` | Page size, 1–100 — the API answers 400 outside that range (it does not clamp) |
1988
+
1989
+ ```typescript
1990
+ import { readRehomeAuditDetails } from '@uluops/ops-sdk';
1991
+
1992
+ const feed = await client.orgs.getVisibleAuditLog('acme', { limit: 50 });
1993
+ for (const entry of feed.data.entries) {
1994
+ const move = readRehomeAuditDetails(entry); // null for rows written by anything else
1995
+ if (move) console.log(`${move.project_name}: ${move.from_org.slug} → ${move.to_org.slug} (${move.action})`);
1996
+ }
1997
+ // feed.count is the page size, feed.hasMore / feed.nextCursor page it
1998
+ ```
1999
+
2000
+ `action` on every row is the platform's closed enum (`org.updated`); the real event is
2001
+ `details.action` (`project.rehome_out` on the source org's feed, `project.rehome_in` on the
2002
+ target's). A non-member gets `403 ORG_ACCESS_DENIED`.
2003
+
2004
+ ---
2005
+
2006
+ #### `client.orgs.list()` — the orgs you belong to
2007
+
2008
+ `GET /orgs`: every org the key holder is a member of, personal org included (`isPersonal: true`),
2009
+ each with `slug`, `role`, `memberCount`, `subscriptionTier`. A key bound to one org still lists all
2010
+ of its holder's orgs; the binding governs what it may *read*.
2011
+
2012
+ #### `client.orgs.getLogStat(slug, query?)` — the org rollup (ulu log §3.6)
2013
+
2014
+ The same body as `projects.getLogStat` computed over the org's live projects, plus `projects[]` —
2015
+ the summary shape `{ name, runs, issues, fixed, regressions, lastRunAt }` where each column is that
2016
+ project's own rollup measure (`regressions` = `cameBack.detected`, run-caught only), ordered by last
2017
+ run desc then name, capped at 100 with `hasMoreProjects`. Any member reads. Served from a **60 s
2018
+ TTL cache** per (org, window) — `computedAt` says how old the numbers are. Unknown slug → 404
2019
+ `ORG_NOT_FOUND`; a key bound to another org → 403 `ORG_ACCESS_DENIED`. The slug in the path is the
2020
+ org — no `OrgScopedOptions` here.
2021
+
2022
+ ```typescript
2023
+ for (const org of await client.orgs.list()) {
2024
+ const s = await client.orgs.getLogStat(org.slug);
2025
+ console.log(org.slug, `${s.projects.length}${s.hasMoreProjects ? '+' : ''} projects`, `${s.examined.runs} runs`, `${s.found.issues} findings`, `${s.decided.completed} fixed`, `${s.cameBack.detected} regressions`, `(as of ${s.computedAt})`);
2026
+ }
2027
+ ```
2028
+
2029
+ ### Admin Operations
2030
+
2031
+ The **platform-admin** surface (`users.role = 'admin'` — a platform role, not an org role). The two
2032
+ writes additionally require a **login-issued session**: an API key, even an admin's, answers
2033
+ `403 SESSION_REQUIRED` (`isSessionRequiredError`) — that is D20, the compensation for a stolen
2034
+ admin key being able to move any project anywhere in one call. Log in with `client.login()` (and
2035
+ `loginWithTotp()` if challenged) and the session bearer is what these calls send. A non-admin
2036
+ principal gets `403 INSUFFICIENT_ROLE` on all four. There is deliberately no MCP tool for any of
2037
+ this.
2038
+
2039
+ #### `client.admin.rehomeProject(projectId, { targetOrg, reason })` — session only
2040
+
2041
+ Move **any** project between **any** two orgs by UUID; no source- or target-membership
2042
+ requirement, so `reason` is **required** (on this path the target org's only standing is the audit
2043
+ row plus that text). Resolves the project unscoped — the route takes a UUID and the SDK refuses a
2044
+ name client-side (`InputValidationError`). Answers the same refusals as the member path; here
2045
+ `same_org` does mean "already done" (the lookup is by id, so the moved project is found wherever
2046
+ it is), which is what makes a scripted pass over a list idempotent.
2047
+
2048
+ ```typescript
2049
+ await client.login(email, password, { autoRefresh: false }); // or loginWithTotp(...) after an MfaRequiredError
2050
+ try {
2051
+ const moved = await client.admin.rehomeProject(projectId, { targetOrg: 'ulu-labs', reason: 'OQ-4 row 7' });
2052
+ console.log(moved.rehome.from_org.slug, '→', moved.rehome.to_org.slug);
2053
+ } catch (err) {
2054
+ if (rehomeRefusalReason(err) === 'same_org') { /* done on a previous run */ }
2055
+ else throw err;
2056
+ }
2057
+ ```
2058
+
2059
+ #### `client.admin.listProjectRehomes(query?)` — key-readable
2060
+
2061
+ The **current redirect table**: one row per vacated `(sourceOrgId, name)` and the `targetOrgId` it
2062
+ points at. A reversal annihilates its row and a release deletes it, so this is state, not history.
2063
+ `org` takes a UUID or a slug; `total` is the matching count and `returned` the page.
2064
+
2065
+ ```typescript
2066
+ const { data, total } = await client.admin.listProjectRehomes({ org: 'system', limit: 100 });
2067
+ // data[0] → { id, sourceOrgId, name, projectId, targetOrgId, actorId, reason, createdAt }
2068
+ ```
2069
+
2070
+ #### `client.admin.listProjectRehomeEvents(query?)` — key-readable
2071
+
2072
+ The **append-only ledger** (D21): every `moved`, `repointed`, `annihilated`, `degenerate_dropped`,
2073
+ `released` and `hard_deleted` event, written in the same transaction as the change; nothing the API
2074
+ offers removes a row. Pages by `seq` (insertion order) — `nextCursor` is the `seq` to continue
2075
+ below; pass it back verbatim. **Reconcile a migration against this**, not against the reservation
2076
+ table and not against the script's own log. Unknown future event kinds parse verbatim
2077
+ (`PROJECT_REHOME_EVENT_KINDS` lists the known six).
2078
+
2079
+ ```typescript
2080
+ const page = await client.admin.listProjectRehomeEvents({ org: 'ulu-labs', event: 'moved', limit: 100 });
2081
+ page.data[0]; // { seq, event, projectId, projectName, fromOrgId, toOrgId, viaAdminPath, reason, createdAt, ... }
2082
+ ```
2083
+
2084
+ #### `client.admin.releaseProjectRehome(rehomeId)` — session only
2085
+
2086
+ Release a vacated address so the old `(org, name)` is creatable again — a by-name writer there then
2087
+ gets a **new** project instead of a 410. Audited (a `released` ledger row); never done by time.
2088
+
2089
+ ```typescript
2090
+ await client.admin.releaseProjectRehome(reservationId); // → { released: true }
2091
+ ```
2092
+ A `ZodError` here means the 200 body was not `{ released: true }` — and since the server answers
2093
+ after the row is gone, the release most likely happened; re-read the listing before retrying.
2094
+
2095
+ ---
2096
+
1826
2097
  ### Health Check
1827
2098
 
1828
2099
  Check API server status. This endpoint does not require authentication.
package/dist/client.d.ts CHANGED
@@ -1,17 +1,48 @@
1
1
  import { type HttpClientConfig } from './http/http-client.js';
2
2
  import * as analyticsOps from './operations/analytics.js';
3
- import type { RegisterInput, LoginInput, LoginResponse, RegisterResponse, UpdateProfileInput, ChangePasswordInput, ResetPasswordInput, CreateApiKeyInput, ApiKeyCreatedResponse, PublicApiKey, PublicSession, AuthUser, PublicUser } from './types/auth.js';
3
+ import type { RegisterInput, LoginInput, TotpLoginInput, LoginResponse, RegisterResponse, UpdateProfileInput, ChangePasswordInput, ResetPasswordInput, CreateApiKeyInput, ApiKeyCreatedResponse, PublicApiKey, PublicSession, AuthUser, PublicUser } from './types/auth.js';
4
4
  import type { Project, CreateProjectInput, UpdateProjectInput, DeleteProjectInput, RenameProjectInput, ProjectSummaryResponse, ProjectTrends, ProjectTrendsQuery, ListProjectIssuesQuery, BulkIssueStatusUpdate, BulkIssueStatusResult, MergeIssuesInput, MergeIssuesResult, MergeProjectsInput, MergeProjectsResult } from './types/projects.js';
5
+ import type { ProjectLogQuery, ProjectLogPage, LogStatQuery, ProjectLogStat, OrgLogStat, OrgListEntry } from './types/log.js';
5
6
  import type { Run, RunSummary, RunAnalysis, ProjectAnalysisList, AnalysisRecordsList, AgentRunsAnalysis, SaveRunInput, SaveRunResponse, ValidateRunResponse, RunDiffQuery, RunDiffResult, ArchiveRunsInput, ArchiveRunsResult, UpdateRunInput, UpdateRunByNumberInput, UpdateRunPreviewInput, UpdateRunPreviewByNumberInput, RunUpdatePreview, UpdateRunWithEchoResult, ListRunsQuery, RunDetails, ProjectAnalysisQuery, AnalysisRecordsQuery, AgentRunsAnalysisQuery, RunWriteEcho } from './types/runs.js';
6
7
  import type { Issue, CreateUserIssueInput, UpdateIssueInput, UpdateIssueStatusInput, CreateIssueNoteInput, IssueNote, IssueDetails, IssueHistoryEnvelope, IssueSearchQuery, ListIssuesQuery, BulkStatusUpdateItem, StatusUpdateResult } from './types/issues.js';
7
8
  import type { AnalyticsQuery, AgentPerformance, AgentInfo, AgentLifecycleEntry, AgentReliabilityQuery, BurndownQuery, VelocityQuery, DiscoveryQuery, AgentMatrixQuery, TaxonomyResponse, AgentReliabilityResult, ResolutionRateResult, FileHotspotResult, TaxonomyDistributionResult, FullTaxonomyAnalyticsResult, BurndownResultResponse, VelocityResultResponse, DiscoveryResultResponse, AgentMatrixResultResponse, TrendSummaryResult } from './types/analytics.js';
8
9
  import type { MessageResponse, DeleteResult } from './types/responses.js';
9
10
  import type { OrgScopedOptions, RunCallOptions } from './types/org.js';
11
+ import type { RehomeProjectInput, AdminRehomeProjectInput, RehomeResponse, ProjectRehomeList, ProjectRehomeListQuery, ProjectRehomeEventList, ProjectRehomeEventListQuery, OrgAuditFeed, OrgAuditFeedQuery } from './types/rehome.js';
10
12
  /**
11
13
  * OpsClient configuration options.
12
14
  * All HTTP-level options (baseUrl, timeout, retries, debug, auth) are available.
15
+ *
16
+ * Note on `email`/`password` in the constructor: the login then happens inside
17
+ * sdk-core, which cannot see an MFA challenge — an MFA-enrolled account gets a
18
+ * generic `UnauthorizedError`, not `MfaRequiredError`. Use `login()` /
19
+ * `loginWithTotp()` for those accounts.
13
20
  */
14
21
  export type OpsClientConfig = HttpClientConfig;
22
+ /**
23
+ * Options for `OpsClient.login`.
24
+ *
25
+ * `autoRefresh` (default `true`) keeps the password on the installed session
26
+ * so sdk-core can re-login when a request answers 401. Three properties of
27
+ * that refresh are not obvious from the word "automatic", and they matter for
28
+ * a script driving admin writes under a session (spec §4.7):
29
+ *
30
+ * - it is a **fresh login**, and under the API's default single-session
31
+ * policy (`AUTH_ALLOW_CONCURRENT_SESSIONS` unset) a login **revokes the
32
+ * user's other sessions** — the operator's dashboard tab dies each time;
33
+ * - **mutations are not retried** after a refresh: the POST/DELETE that hit
34
+ * the 401 still throws it, so the caller sees the failure anyway;
35
+ * - the budget is **one**: the password is cleared after the first re-login,
36
+ * so the second 401 is terminal with a different message.
37
+ *
38
+ * Pass `{ autoRefresh: false }` when a 401 must mean "stop" (a migration
39
+ * script, anything sharing the account with a dashboard). The session is
40
+ * then installed without credentials, exactly as `loginWithTotp` installs
41
+ * its session, and a 401 surfaces untouched.
42
+ */
43
+ export interface LoginOptions {
44
+ autoRefresh?: boolean;
45
+ }
15
46
  /**
16
47
  * Main SDK client for the UluOps platform API.
17
48
  *
@@ -45,7 +76,19 @@ export declare class OpsClient {
45
76
  * the client for authenticated requests with token auto-refresh. `client.auth.login()`
46
77
  * only returns the token without installing it.
47
78
  */
48
- login(email: string, password: string): Promise<LoginResponse>;
79
+ login(email: string, password: string, options?: LoginOptions): Promise<LoginResponse>;
80
+ /**
81
+ * Complete an MFA-challenged login with a TOTP code and install the session.
82
+ *
83
+ * `login()` throws `MfaRequiredError` for an account with TOTP or a passkey
84
+ * enrolled; pass its `mfaChallengeToken` here with the current six-digit code
85
+ * before `expiresAt`. The installed session has NO password to re-login with
86
+ * (a re-login would only produce another challenge), so it is not
87
+ * auto-refreshed: when it expires, requests fail `401` and the caller logs in
88
+ * again. A Phase 4 migration script should treat that 401 as "stop", not
89
+ * "retry with the key" (spec §4.7).
90
+ */
91
+ loginWithTotp(mfaChallengeToken: string, code: string, rememberMe?: boolean): Promise<LoginResponse>;
49
92
  /**
50
93
  * Logout current session (revokes all sessions for this user).
51
94
  *
@@ -78,8 +121,10 @@ export declare class OpsClient {
78
121
  readonly auth: {
79
122
  /** Register a new user account. */
80
123
  register: (input: RegisterInput) => Promise<RegisterResponse>;
81
- /** Log in with email + password, returning a session token. */
124
+ /** Log in with email + password, returning a session token. Throws `MfaRequiredError` for an MFA-enrolled account. */
82
125
  login: (input: LoginInput) => Promise<LoginResponse>;
126
+ /** Complete an MFA challenge with a TOTP code, returning the session (not installed — see `OpsClient.loginWithTotp`). */
127
+ totpLogin: (input: TotpLoginInput) => Promise<LoginResponse>;
83
128
  /** Revoke all active sessions for the current user. */
84
129
  logoutAll: () => Promise<{
85
130
  sessionsRevoked: number;
@@ -163,6 +208,68 @@ export declare class OpsClient {
163
208
  * Pairwise only. Dry-run first: `{ ...input, dryRun: true }`.
164
209
  */
165
210
  mergeProjects: (input: MergeProjectsInput, options?: OrgScopedOptions) => Promise<MergeProjectsResult>;
211
+ /**
212
+ * Move a project to another org (project-org-routing-and-rehome §4.1, D14).
213
+ * The SOURCE is this call's org scope — pass `{ org: '<source>' }` (or set
214
+ * the client `orgSlug`) when the project is not in your personal org; the
215
+ * project is looked up THERE. Needs `admin`/`owner` in both orgs. Old
216
+ * address becomes a `410 PROJECT_REHOMED` tombstone, not a fork.
217
+ */
218
+ rehome: (idOrName: string, input: RehomeProjectInput, options?: OrgScopedOptions) => Promise<RehomeResponse>;
219
+ /**
220
+ * The project log (ulu log spec §3.2) — runs, decisions and regressions
221
+ * interleaved newest first, keyset-paged; pass `nextCursor` back verbatim.
222
+ * A `regression` is a row a run re-detected; a `resolved → open` decision
223
+ * with no run is *reopened by decision* (D12) — keep them apart.
224
+ */
225
+ getLog: (idOrName: string, query?: ProjectLogQuery, options?: OrgScopedOptions) => Promise<ProjectLogPage>;
226
+ /**
227
+ * The log's rollup (§3.3): examined / found / decided / cameBack /
228
+ * activity — a cohort frame on run timestamps and an activity frame on
229
+ * ledger timestamps; `decided` is the CURRENT status of the found issues.
230
+ */
231
+ getLogStat: (idOrName: string, query?: LogStatQuery, options?: OrgScopedOptions) => Promise<ProjectLogStat>;
232
+ };
233
+ /** Org reads a member can make. (Org CRUD and membership are dashboard/platform surfaces, not wrapped here.) */
234
+ readonly orgs: {
235
+ /**
236
+ * The org-visible audit feed (D19) — rows a writer marked `visibility: 'org'`,
237
+ * readable by any member; today, projects leaving this org for a personal
238
+ * org. `nextCursor` is opaque; pass it back verbatim. Narrow entries with
239
+ * `readRehomeAuditDetails()`.
240
+ */
241
+ getVisibleAuditLog: (slug: string, query?: OrgAuditFeedQuery) => Promise<OrgAuditFeed>;
242
+ /** The orgs the caller belongs to (personal included) — what `ulu log --orgs` iterates. */
243
+ list: () => Promise<OrgListEntry[]>;
244
+ /**
245
+ * The org rollup (ulu log §3.6): the §3.3 body over the org's live projects
246
+ * plus a per-project table (`projects[]`, capped at 100). Any member reads;
247
+ * cached 60 s server-side — `computedAt` says how old. The slug in the
248
+ * path is the org; no `OrgScopedOptions` here for the same reason as
249
+ * `getVisibleAuditLog`.
250
+ */
251
+ getLogStat: (slug: string, query?: LogStatQuery) => Promise<OrgLogStat>;
252
+ };
253
+ /**
254
+ * Platform-admin surface. Requires `users.role = 'admin'`; the writes also
255
+ * require a login-issued SESSION (D20) — an API key gets `403 SESSION_REQUIRED`
256
+ * (`isSessionRequiredError`). Log in with `login()` / `loginWithTotp()` first.
257
+ * Deliberately not exposed as MCP tools.
258
+ */
259
+ readonly admin: {
260
+ /**
261
+ * Move ANY project between ANY orgs by UUID — `reason` required, session
262
+ * only. `same_org` (via `rehomeRefusalReason`) means already done.
263
+ */
264
+ rehomeProject: (projectId: string, input: AdminRehomeProjectInput) => Promise<RehomeResponse>;
265
+ /** The current redirect table: every vacated `(org, name)` and where it points. Key-readable. */
266
+ listProjectRehomes: (query?: ProjectRehomeListQuery) => Promise<ProjectRehomeList>;
267
+ /** The append-only re-home ledger (D21), paged by `seq`. Key-readable. Reconcile migrations against THIS. */
268
+ listProjectRehomeEvents: (query?: ProjectRehomeEventListQuery) => Promise<ProjectRehomeEventList>;
269
+ /** Release a vacated address so the old name is creatable again (audited; never by time). Session only. */
270
+ releaseProjectRehome: (rehomeId: string) => Promise<{
271
+ released: true;
272
+ }>;
166
273
  };
167
274
  /** Execution run save, preview, diff, archive, and retrieval */
168
275
  readonly runs: {
@@ -1 +1 @@
1
- {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}