@cotal-ai/workspace 0.13.2 → 0.14.1

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.
@@ -1,19 +1,50 @@
1
- import { type SecretStore, type SpaceAuth } from "@cotal-ai/core";
1
+ import { type BrokerAuth, type SecretStore, type SpaceAccountAuth, type SpaceAuth } from "@cotal-ai/core";
2
2
  export declare function authDir(root: string): string;
3
- /** THE per-space path/key segment the single guarded encoder every space-keyed surface consumes
4
- * (this state dir AND the auth secret-store key builders). `encodeURIComponent` keeps any real
5
- * name one flat segment (`a/b` `a%2Fb`) but leaves dots alone, so `.`/`..`/empty would alias a
6
- * parent (`auth/..` normalizes OUT of the space's own segment) refused HERE, before any path is
7
- * built or state touched. Two independently-guarded encoders were the defect generator (one gains
8
- * a rule the other doesn't); keep exactly one. */
3
+ /** The ONE injective, case-safe space key: lowercase hex of the space's UTF-8 bytes. Every
4
+ * tenant-keyed namespace derives its key from this the account filename, the user-auth state
5
+ * dir, the auth secret-store keys, and the machine mesh registry because every namespace that
6
+ * invented its own encoding (raw name, `encodeURIComponent`) turned out to alias: ASCII case is
7
+ * preserved by those, so on a case-insensitive filesystem (the macOS/Windows default) `alpha` and
8
+ * `Alpha` addressed ONE path and the second tenant silently absorbed the first. Hex over
9
+ * `[0-9a-f]` cannot case-fold-collide, cannot contain a separator, and round-trips exactly. */
10
+ export declare function spaceKey(space: string): string;
11
+ /** THE per-space path/key segment — `space.<hex>`, the {@link spaceKey} under a fixed prefix so a
12
+ * segment is self-describing on disk and can never collide with a reserved sibling of the auth
13
+ * dir (`broker.json`, `account.<hex>.json`, `server.conf`, `creds/`): none of those start with
14
+ * `space.`, and the hex body cannot smuggle one in. Consumed by the state dir AND the auth
15
+ * secret-store key builders; two independently-guarded encoders were the defect generator (one
16
+ * gains a rule the other doesn't), so keep exactly one. */
9
17
  export declare function spaceSegment(space: string): string;
10
- /** The SPACE-SCOPED user-auth state dir (`<root>/.cotal/auth/<space>`) the one layout fact the
11
- * workstation layer owns about user auth: the auth provider persists its material under this dir
12
- * (opaque to us), and its EXISTENCE marks the space as user-auth-enabled on disk. Space-keyed now
13
- * so multi-space-per-root is a caller change, never an on-disk migration; a (broker, space) key
14
- * later extends the same shape. Fails loud on a degenerate space (see {@link spaceSegment}) —
15
- * BEFORE any caller can mutate at an aliased path. */
18
+ /** The space a canonical segment encodes, or undefined when the name is not one {@link spaceSegment}
19
+ * wrote (wrong prefix, non-hex body, or a body that does not round-trip). Enumeration and the
20
+ * legacy-layout shim both need this to tell the canonical namespace from strays. */
21
+ export declare function spaceFromSegment(name: string): string | undefined;
22
+ /** The SPACE-SCOPED user-auth state dir (`<root>/.cotal/auth/space.<hex>`) the one layout fact
23
+ * the workstation layer owns about user auth: the auth provider persists its material under this
24
+ * dir (opaque to us), and its EXISTENCE marks the space as user-auth-enabled on disk. Keyed by
25
+ * {@link spaceSegment} so two case-differing tenants can never share one state dir and no space
26
+ * name can alias a reserved sibling of the auth dir. Fails loud on a degenerate space — BEFORE
27
+ * any caller can mutate at an aliased path.
28
+ *
29
+ * Also the ONE migration point for pre-hex layouts (`<authDir>/<encodeURIComponent(space)>`):
30
+ * every consumer of a space's user-auth state — the marker check, the provider's `dir`, and the
31
+ * secret-store keys resolved beside it — obtains this path first, so renaming the legacy dir to
32
+ * the canonical segment HERE means no flow can ever read (or worse, `ensure*`-REGENERATE) beside
33
+ * material the old layout still holds. Deliberately not in {@link hasUserAuthState} alone: a
34
+ * user-mode connect through a registry record never consults the marker before minting. */
16
35
  export declare function userAuthStateDir(root: string, space: string): string;
36
+ /** Whether `space` is user-auth-enabled ON DISK under `root` — the authoritative marker, NOT a bare
37
+ * `existsSync` on {@link userAuthStateDir}: only a real provider pin inside a real directory
38
+ * counts. The state-dir read goes through {@link userAuthStateDir}, so a pre-hex legacy layout
39
+ * has already been migrated by the time the marker is checked. */
40
+ export declare function hasUserAuthState(root: string, space: string): boolean;
41
+ /** Every space with user-auth state under this auth dir, detectable WITHOUT `broker.json`/accounts:
42
+ * each enabled space is a `space.<hex>` subdirectory carrying a provider pin. The enumerating
43
+ * companion to {@link hasUserAuthState}; both share {@link pathHasUserAuthMarker} so a single
44
+ * space and the whole-dir sweep can never disagree on what "user-auth on disk" means. Pre-hex
45
+ * legacy dirs are reported too (decoded from their verbatim names), so a guard reading this stays
46
+ * fail-closed before the one-time migration has run. */
47
+ export declare function userAuthSpacesOnDisk(dir: string): string[];
17
48
  /** The dir every per-agent standing secret materializes under (`<root>/.cotal/auth/creds`) —
18
49
  * space-INDEPENDENT today (one root serves one space); multi-space-per-root re-keys this layout
19
50
  * as a caller change, same as {@link userAuthStateDir}'s note. */
@@ -60,10 +91,141 @@ export declare function materializeSecretToFile(store: SecretStore, key: string,
60
91
  * directory that *contains* `.cotal/`. Falls back to `start` when none is found up the tree (a
61
92
  * fresh setup creates `.cotal/` there). Lets `cotal` run from any subdirectory of a project. */
62
93
  export declare function findCotalRoot(start?: string): string;
63
- /** Persist the space trust material. The file holds the data-account signing seed — treat as a secret.
64
- * The system-account `sys.signingSeed` is STRIPPED before writing: it is broker-admin minting capability,
65
- * so it never lands on disk (it lives only in the in-memory {@link createSpaceAuth} result). */
94
+ /** Where the one broker trust record lives. */
95
+ export declare function brokerAuthPath(dir: string): string;
96
+ /** Where one space's own account record lives: a FLAT file beside `broker.json`, keyed by
97
+ * {@link accountFileKey}. Flat (not `<space>/account.json`) because `<authDir>/<space>/` is
98
+ * {@link userAuthStateDir}; hex-keyed because a raw space name in the filename both aliased that
99
+ * user-auth marker and case-folded on macOS/Windows. The name of a space is authoritative in the
100
+ * document, so enumeration never has to trust the filename beyond finding the record. */
101
+ export declare function spaceAccountPath(dir: string, space: string): string;
102
+ /** Persist BROKER trust. `sys.signingSeed` is STRIPPED before writing: it is broker-admin minting
103
+ * capability, so it never lands on disk (it lives only in the in-memory {@link createBrokerAuth}
104
+ * result). A composition that must add spaces after first boot has to hold that seed in a
105
+ * BROKER-scoped secret store instead; see core's `BrokerAuth`. */
106
+ export declare function saveBrokerAuth(dir: string, broker: BrokerAuth): void;
107
+ /** Load BROKER trust, or undefined if auth was never set up here. Reads the pre-W4 monolith as
108
+ * MIGRATION INPUT when the broker record does not exist yet. */
109
+ export declare function loadBrokerAuth(dir: string): BrokerAuth | undefined;
110
+ /** Persist ONE space's account record. Never carries broker material. Refuses to overwrite a record
111
+ * that already holds a DIFFERENT space: with an injective hex key that only happens on a corrupted
112
+ * or hand-swapped file, and silently replacing one tenant's signing authority with another's must
113
+ * fail loud. */
114
+ export declare function saveSpaceAccountAuth(dir: string, spaceAccount: SpaceAccountAuth): void;
115
+ /** Load ONE space's account record, or undefined. Reads the pre-W4 monolith as MIGRATION INPUT when
116
+ * the per-space record does not exist yet AND that monolith is for this same space - a monolith for
117
+ * a DIFFERENT space must never satisfy a load for this one. */
118
+ export declare function loadSpaceAccountAuth(dir: string, space: string): SpaceAccountAuth | undefined;
119
+ /** Load the COMPOSED read view of one space's trust chain, or undefined if either authority is
120
+ * missing. The space key is REQUIRED: once a broker holds N accounts, a root-wide "the auth" load is
121
+ * intrinsically ambiguous, and picking a default silently would let (for example) a manager bound to
122
+ * space B mint B's agents into space A's account. Composition also asserts that this account really
123
+ * was signed by this broker's operator. */
124
+ export declare function loadSpaceAuth(dir: string, space: string): SpaceAuth | undefined;
125
+ /** The composed trust of the ONE space this auth dir holds - the space-blind convenience for callers
126
+ * that predate multi-space (a folder's own mesh, `mint` in a checkout, a status read). Fails loud
127
+ * when the root holds several, via {@link soleSpaceOf}. Prefer {@link loadSpaceAuth} with an
128
+ * explicit space wherever the caller can know it. */
129
+ export declare function loadSoleSpaceAuth(dir: string): SpaceAuth | undefined;
130
+ /** Persist a composed value by DECOMPOSING it into its two authorities. This is the migration-era
131
+ * writer for the many existing callers that hold a composed {@link SpaceAuth}; it is safe because
132
+ * there is exactly ONE broker record, so writing broker trust through any space updates the single
133
+ * owner rather than a per-space copy. It refuses a stripped value outright: `stripSpaceAuth` blanks
134
+ * the operator and system account, and decomposing that would blank broker persistence. */
66
135
  export declare function saveSpaceAuth(dir: string, auth: SpaceAuth): void;
67
- /** Load the space trust material, or undefined if auth was never set up here. */
68
- export declare function loadSpaceAuth(dir: string): SpaceAuth | undefined;
136
+ /** The ONE space this auth dir holds, for the legacy paths that predate multi-space and carry no
137
+ * explicit space (a folder's "its own" space, a root-wide daemon remint). Undefined when the root
138
+ * has no auth at all.
139
+ *
140
+ * FAILS LOUD when the root holds several, rather than picking the first or a "current": a
141
+ * space-blind caller that silently picks is exactly how a component bound to space B mints into
142
+ * space A's account. Callers that can know their space must pass it explicitly instead of using
143
+ * this; this exists so the remaining space-blind paths become a loud error rather than a wrong
144
+ * answer the day a root holds two. */
145
+ export declare function soleSpaceOf(dir: string): string | undefined;
146
+ /** Refuse a BROKER-WIDE operation on a root that hosts several spaces - or whose tenant list cannot
147
+ * be read with certainty.
148
+ *
149
+ * Distinct from {@link soleSpaceOf}'s ambiguity, and the distinction is the whole point: the
150
+ * broker process, its JetStream store and the single `.cotal/auth` broker record are shared by
151
+ * every space on the root, so naming a space cannot scope `down`, `clean store|all`, `backup` or a
152
+ * restore - they would apply to all of them regardless. Sending the operator after a `--space` they
153
+ * cannot use (two of these commands do not even take one) is a dead end dressed as advice, so this
154
+ * refusal names the blast radius and stops, and stays a refusal until per-space teardown exists.
155
+ *
156
+ * A corrupt/foreign account record is refused too, NOT skipped: an under-count is the fail-open
157
+ * this guard exists to prevent - a file that occupies the account namespace but will not validate
158
+ * might be a real tenant, so the blast radius is unknown and a broker-wide delete must not proceed. */
159
+ export declare function assertSingleSpaceBroker(dir: string, operation: string): void;
160
+ /** The VALIDATED tenant inventory of an auth dir - the ONE read of "how many tenants" every other
161
+ * surface derives from (the broker-wide guards, `soleSpaceOf`, `cotal status`, the target
162
+ * resolver). Four surfaces each reading the disk their own way is how an under-count slips past
163
+ * exactly one of them; there must be a single answer.
164
+ *
165
+ * `spaces` are the tenants whose account records are regular files that parse, carry a `space`
166
+ * equal to their own injective filename key, and round-trip. `corrupt` is every entry that
167
+ * OCCUPIES the account namespace (`account.*.json`) yet fails any of that - including a
168
+ * non-regular entry (symlink, directory): `Dirent.isFile()` is lstat-semantics, so skipping those
169
+ * would drop a tenant whose record was symlinked while `loadSpaceAccountAuth`'s path still
170
+ * resolved it - the exact under-count the guards exist to refuse. The authoritative name is the
171
+ * record's own `space`, never inferred from the filename. `corrupt` is what turns the guards
172
+ * fail-CLOSED: an unreadable record is uncertainty about how many tenants exist, and a
173
+ * broker-wide operation must not proceed on an under-count. */
174
+ export declare function accountInventory(dir: string): {
175
+ spaces: string[];
176
+ corrupt: string[];
177
+ };
178
+ /** Every space that has a VALID account record under this auth dir. The broker's tenant list on disk;
179
+ * names come from each record's authoritative `space`. Callers that must act on the blast radius use
180
+ * {@link assertSingleSpaceBroker} / {@link soleSpaceOf}, which also refuse on an unreadable record. */
181
+ export declare function listSpaceAccounts(dir: string): string[];
182
+ /** THE store key of the broker trust record. Under the workspace store (rooted at `.cotal`) it
183
+ * resolves byte-for-byte to `.cotal/auth/broker.json`. One source for every signer-bearing tier -
184
+ * a drifted literal would silently split the kind. */
185
+ export declare const BROKER_AUTH_KEY = "auth/broker.json";
186
+ /** The LEGACY monolith store key (`auth/auth.json`) - migration INPUT and the container signer
187
+ * mount only; nothing writes this shape now (see the layout note above). */
188
+ export declare const SPACE_AUTH_KEY = "auth/auth.json";
189
+ /** THE store key of one space's account record - `auth/account.<key>.json`, the same injective
190
+ * {@link spaceKey} filename the FS layout uses. */
191
+ export declare function spaceAccountKey(space: string): string;
192
+ /** Load one space's COMPOSED trust view through the seam - THE reader for signer-bearing paths (the
193
+ * manager's signer hold, the renewal owner, CLI mint/backup/restore/…). The store is the sole
194
+ * authority for the material; the space is REQUIRED for the same reason as {@link loadSpaceAuth}'s:
195
+ * a root-wide "the auth" read is ambiguous the moment a broker holds two accounts (space-blind CLI
196
+ * paths resolve theirs first via {@link getSoleSpaceAuth}). Mirrors the FS reader's shapes exactly -
197
+ * split records compose (and verify the account really was signed by this broker's operator), either
198
+ * half may still come from the legacy monolith during migration, and with both split records absent
199
+ * the monolith is read whole (full bundle or the stripped container signer) and validated against
200
+ * the caller's space; there a wrong-space or malformed value fails LOUD rather than reading as
201
+ * absent, because the monolith names exactly one tenant. Every error names only store keys and the
202
+ * caller's own space label, never the stored bytes. */
203
+ export declare function getSpaceAuth(store: SecretStore, space: string): Promise<SpaceAuth | undefined>;
204
+ /** The seam companion of {@link loadSoleSpaceAuth} for the space-blind CLI paths: the FS inventory
205
+ * (tenant NAMES only - non-secret) supplies the one space this root holds, failing loud on several
206
+ * via {@link soleSpaceOf}, and the store stays the sole authority for the trust material itself.
207
+ * Every space-blind caller is a workstation CLI verb with the root's auth dir on this disk; a
208
+ * hosted composition knows its space and calls {@link getSpaceAuth} directly. */
209
+ export declare function getSoleSpaceAuth(store: SecretStore, dir: string): Promise<SpaceAuth | undefined>;
210
+ /** Persist a composed value through the seam by DECOMPOSING it into its two records - the seam
211
+ * writer with the SAME refusals as the FS pair ({@link saveBrokerAuth}/{@link saveSpaceAccountAuth},
212
+ * shared via {@link guardBrokerOverwrite}): a stripped value, a foreign-operator overwrite, a stale
213
+ * or rolled-back system-account generation, and another tenant's account record all refuse loud.
214
+ * All guards run BEFORE either put, so a refusal never leaves a half-written pair. `sys.signingSeed`
215
+ * never lands at rest (broker-admin minting capability; the record shape drops it).
216
+ *
217
+ * With NO broker record in the store, the FS writer's whole-inventory orphan check cannot run - a
218
+ * {@link SecretStore} has no enumeration - so it ranges over the ADDRESSABLE records instead: this
219
+ * space's own account and the legacy monolith, each of which the incoming operator must have signed.
220
+ * That is complete for a hosted store (scoped per-tenant inside its own resolve, per the seam's
221
+ * design) and for every same-space local repair; a lost broker.json beside a DIFFERENT tenant's
222
+ * account on the local FS stays covered by the FS writer wherever {@link saveSpaceAuth} is the
223
+ * writer (accepted residual, documented here rather than silently absorbed). */
224
+ export declare function putSpaceAuth(store: SecretStore, auth: SpaceAuth): Promise<void>;
225
+ /** Remove the space trust material through the seam - the authoritative delete for a non-FS store.
226
+ * BROKER-WIDE by nature (the broker record dies with its last space's account), so its one caller
227
+ * is `clean all` AFTER the failure gate and the {@link assertSingleSpaceBroker} guard - on a
228
+ * multi-tenant root that guard refuses long before this runs. Deletes the space's account record,
229
+ * the broker record, and the legacy monolith. Idempotent. */
230
+ export declare function deleteSpaceAuth(store: SecretStore, space: string): Promise<void>;
69
231
  //# sourceMappingURL=auth-paths.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"auth-paths.d.ts","sourceRoot":"","sources":["../src/auth-paths.ts"],"names":[],"mappings":"AAEA,OAAO,EAAuD,KAAK,WAAW,EAAE,KAAK,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAevH,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE5C;AAED;;;;;mDAKmD;AACnD,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAMlD;AAED;;;;;uDAKuD;AACvD,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAEpE;AAID;;mEAEmE;AACnE,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAElD;AAED;;;;mDAImD;AACnD,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAIvD;AAUD;;;;yCAIyC;AACzC,eAAO,MAAM,aAAa,GAAI,MAAM,MAAM,KAAG,MAA+C,CAAC;AAC7F,eAAO,MAAM,kBAAkB,GAAI,MAAM,MAAM,KAAG,MAAoD,CAAC;AACvG,eAAO,MAAM,qBAAqB,GAAI,MAAM,MAAM,KAAG,MAAuD,CAAC;AAE7G;;;qFAGqF;AACrF,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG;IAChE,KAAK,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,aAAa,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;CAC1E,CAQA;AAED;;;;oEAIoE;AACpE,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAmB3D;AAED;;;;;;2BAM2B;AAC3B,wBAAsB,uBAAuB,CAAC,KAAK,EAAE,WAAW,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAM1G;AAED;;iGAEiG;AACjG,wBAAgB,aAAa,CAAC,KAAK,GAAE,MAAsB,GAAG,MAAM,CAQnE;AAED;;iGAEiG;AACjG,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,GAAG,IAAI,CAIhE;AAED,iFAAiF;AACjF,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS,CAIhE"}
1
+ {"version":3,"file":"auth-paths.d.ts","sourceRoot":"","sources":["../src/auth-paths.ts"],"names":[],"mappings":"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"}