@odla-ai/cli 0.25.22 → 0.26.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.
package/README.md CHANGED
@@ -156,15 +156,36 @@ therefore compares that verified expectation with the Worker answering now and
156
156
  reports `matched`, `drifted`, or `unknown`; an empty or unavailable receipt
157
157
  ledger degrades instead of silently treating observed health as intended state.
158
158
 
159
+ Platform maintainers can rotate the built-in Discussion responder without
160
+ minting an unrestricted app key or exposing the replacement in argv/output:
161
+
162
+ ```bash
163
+ npx @odla-ai/cli platform chat-credentials rotate \
164
+ --wrangler-config packages/chat-agent/wrangler.jsonc \
165
+ --expected-version <deployed-chat-version-id> \
166
+ --email <odla-admin-account> \
167
+ --yes --json
168
+ ```
169
+
170
+ The command requests only `platform:chat:credential:write`, mints an
171
+ `agent_odla` key restricted to the Discussion namespaces and write envelope,
172
+ pipes the nested `ODLA_BOT_TOKENS` map to Wrangler over stdin, and succeeds only
173
+ after the service-binding health bridge advances from the pre-rotation Worker
174
+ version to a healthy secret-change deployment. `--expected-version` fences the
175
+ pre-rotation version before any credential is minted. Superseded keys are
176
+ revoked separately after that health proof.
177
+
159
178
  For repository-managed settings, compare checked-in intent with the live
160
179
  owner-visible Registry projection before provisioning:
161
180
 
162
181
  ```bash
163
182
  npx odla-ai config diff --json
164
- npx odla-ai config plan --json
183
+ npx odla-ai config plan --json > .odla/config-plan.json
184
+ npx odla-ai config apply --plan .odla/config-plan.json --json
185
+ npx odla-ai operations wait <operation-id> --json
165
186
  ```
166
187
 
167
- Both commands are read-only and request only a short-lived,
188
+ `diff` and `plan` are read-only and request only a short-lived,
168
189
  owner-approvable `app:config:read` capability. It opens only exact-id
169
190
  `GET /registry/apps/<appId>` reads for apps the approver owns; app listing,
170
191
  writes, PM, Discussions, directory access, data-plane delegation, and every
@@ -174,14 +195,33 @@ status, field provenance, and a bounded coverage declaration. Runtime auth or
174
195
  links omitted from project config stay visible as `unmanaged` rather than
175
196
  being silently overwritten.
176
197
 
177
- `plan` freezes those revisions plus ordered actions into a stable plan digest.
198
+ `plan` v2 freezes those content revisions, the monotonic Registry
199
+ `registry:<number>` revision, and ordered actions into a stable digest.
178
200
  Enable/configure actions are dependency-first; proposed disablements are
179
- dependent-first, high-risk, approval-required, and Studio-only. Conditional,
180
- resumable `config apply` is intentionally not exposed yet. The plan names the
181
- existing provision, rename, and Studio steps that can be reviewed separately,
182
- and explicitly excludes schema, rules, integration seeds, credentials, vault
183
- or Worker secrets, OAuth connection state, and opaque controller-assigned
184
- service fields rather than claiming whole-system convergence.
201
+ dependent-first, high-risk, approval-required, and Studio-only.
202
+
203
+ `config apply` accepts only that saved JSON plan. Before requesting authority it
204
+ recomputes the digest, verifies the selected app/platform, confirms checked-in
205
+ intent has not changed, and rejects every production, destructive,
206
+ approval-marked, high-risk, Studio, auth, creation, or disable action. The
207
+ short-lived `app:config:write` grant reaches only this app's operation
208
+ reserve/resume/read routes; it cannot enumerate apps or call direct mutation
209
+ routes. A deterministic default idempotency key makes retrying the same plan
210
+ resume the same durable journal entry, while the Registry CAS revision rejects
211
+ stale state.
212
+
213
+ Apply prints the operation receipt, including ordered step attempts and its
214
+ canonical environment-settings recovery URL. Studio preserves the exact
215
+ operation id in that URL and renders the matching
216
+ `operations get <id> --json` recovery command. Plans that require Studio now
217
+ link to the explicit app/environment settings scope instead of an ambiguous
218
+ app-level Settings page. `operations get` reads one exact id without replaying it;
219
+ `operations wait` polls that id for 60 seconds by default (`--timeout` and
220
+ `--interval` are explicit seconds). A still-running bounded wait exits 75 after
221
+ printing its last receipt. Every terminal receipt is independently
222
+ digest-verified by the CLI before success. Schema, rules, integration seeds,
223
+ credentials, vault or Worker secrets, OAuth connection state, and opaque
224
+ controller-assigned service fields remain outside this boundary.
185
225
 
186
226
  **Runbooks are procedure; JSDoc is API.** What a function takes, returns, and
187
227
  guarantees is documented on the export itself, ships in the installed
@@ -210,7 +250,10 @@ npx @odla-ai/cli runbook edit db --note "retract replaced the null write"
210
250
 
211
251
  Platform runbook edits need admin or the `platform:runbook:write` capability,
212
252
  which the CLI requests for you; a plain handshake token is never admin by
213
- design, and `odla-ai whoami` reports what this terminal actually holds.
253
+ design. `odla-ai whoami` reports the actual credential-bound principal by
254
+ friendly name, handle, and kind; an agent's manager; the credential kind; and
255
+ the accountable human owner separately. Manager metadata explains organization
256
+ but never grants authority.
214
257
 
215
258
  **Is the corpus itself still true?**
216
259
 
@@ -284,7 +327,10 @@ npx odla-ai setup
284
327
  npx odla-ai init --app-id my-app --name "My App"
285
328
  npx odla-ai doctor
286
329
  npx odla-ai config diff --json
287
- npx odla-ai config plan --json
330
+ npx odla-ai config plan --json > .odla/config-plan.json
331
+ npx odla-ai config apply --plan .odla/config-plan.json --json
332
+ npx odla-ai operations get <operation-id> --json
333
+ npx odla-ai operations wait <operation-id> --timeout 60 --json
288
334
  npx odla-ai calendar status --env dev
289
335
  npx odla-ai calendar calendars --env dev
290
336
  npx odla-ai calendar connect --env dev
@@ -483,6 +529,10 @@ claimable Studio request, and the public start/poll shape intentionally does not
483
529
  reveal whether an account exists. The signed-in matching user must explicitly
484
530
  review the exact code before it becomes pending, and only one claimed pending
485
531
  or approved-but-uncollected request can be active for that user.
532
+ For an ordinary request, Studio also requires at least one exact project
533
+ selection. The credential receives project metadata, PM, discussion, and
534
+ brand-candidate editing grants only for those projects, never ambient owner
535
+ access, app administration, or brand approval.
486
536
 
487
537
  Developer grants are tracked by id, owner, label, scopes, creation/expiry,
488
538
  last use, and revocation state. The plaintext token is delivered once to the