@odla-ai/cli 0.27.6 → 0.27.8

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
@@ -466,7 +466,10 @@ shown-once credential.
466
466
  Studio shows the immutable project-derived agent handle, project, and
467
467
  capability request without mutation controls. The owner approves that exact
468
468
  request or declines it with an explanation which the CLI returns to the
469
- calling agent; a different identity or access set requires a new request.
469
+ calling agent; a different identity or access set requires a new request. If
470
+ the exact project id does not exist yet, approval reserves that id for this
471
+ credential instead of failing: the credential may create only that app once,
472
+ and Registry binds its reviewed grant to the new app incarnation.
470
473
  Every real CLI handshake prints exactly one canonical `/studio?code=…` URL
471
474
  and attempts to open it — including from CI, SSH, display-less, scripted,
472
475
  and agent-driven shells. Only `--no-open` suppresses the attempt. Browser
@@ -477,7 +480,8 @@ shown-once credential.
477
480
  Outside an interactive terminal the approval wait is capped (90 seconds by
478
481
  default; `--wait <seconds>` overrides), and a still-pending handshake exits
479
482
  with code 75 — approve at the URL, then re-run to collect the token.
480
- 2. Creates the platform app if needed.
483
+ 2. Creates the platform app if needed. For a new id, this consumes the exact-id
484
+ reservation approved in step 1; it is not ambient project-creation authority.
481
485
  3. Enables configured services in every configured environment. Calendar
482
486
  config is normalized per env and fixed to Google read-only access.
483
487
  4. Mints or reuses each env's configured service credentials: an odla-db app
@@ -554,7 +558,13 @@ or approved-but-uncollected request can be active for that user.
554
558
  For an ordinary request, Studio also requires at least one exact project
555
559
  selection. The credential receives project metadata, PM, discussion, and
556
560
  brand-candidate editing grants only for those projects, never ambient owner
557
- access, app administration, or brand approval.
561
+ access, app administration, or brand approval. A selected id that does not yet
562
+ exist is a one-time bootstrap reservation: the credential may create that exact
563
+ app, after which the grant is bound to its new lifetime. A 404 from the approve
564
+ action is a routing regression; missing, archived, foreign, changed, or raced
565
+ requests must produce a specific conflict or denial. The reservation authorizes
566
+ only that bootstrap creation; later service, configuration, and administrative
567
+ mutations still require their normal capabilities and human checkpoints.
558
568
 
559
569
  Developer grants are tracked by id, owner, label, scopes, creation/expiry,
560
570
  last use, and revocation state. The plaintext token is delivered once to the
package/REQUIREMENTS.md CHANGED
@@ -46,6 +46,11 @@ Agnacl, but none should mention or special-case Agnacl.
46
46
  controls. Approval accepts the request digest exactly; denial requires a
47
47
  bounded, non-secret explanation returned to the polling agent. Any changed
48
48
  scope, project, or capability requires a fresh request.
49
+ - An approved exact project id may be absent at review time. Collection must
50
+ reserve that id for the approved credential, which may create only that app
51
+ once; creation binds the reviewed grant to the new app incarnation. Existing
52
+ foreign or archived ids remain unapprovable. Approval precondition failures
53
+ must return an actionable conflict—never a route-like 404.
49
54
  - Only one claimed pending or approved-but-uncollected request may be active per
50
55
  user. Unclaimed issued codes must not occupy that slot.
51
56
  - Every real CLI handshake must attempt to open that canonical approval URL,
package/dist/bin.cjs CHANGED
@@ -518,7 +518,7 @@ var SCOPE_PURPOSE = {
518
518
  "platform:status:read": "read the platform fleet health and deployment snapshot",
519
519
  "app:config:read": "compare checked-in intent with an exact-id app Registry configuration",
520
520
  "app:config:write": "apply or inspect one revision-bound configuration operation for an app you own",
521
- "platform:runbook:write": "add or edit odla's operational runbooks",
521
+ "platform:runbook:write": "read and edit all of odla's operational runbooks, including admin-visible content",
522
522
  "platform:ai:policy:write": "change System AI model routing",
523
523
  "platform:ai:policy:read": "read System AI model routing",
524
524
  "platform:ai:credential:write": "replace a stored AI provider key",
@@ -12067,8 +12067,13 @@ async function whoamiCommand(parsed, deps = {}) {
12067
12067
  out.log(`admin: ${identity.admin ? "yes" : "no"}`);
12068
12068
  if (identity.scopes.length) out.log(`scopes: ${identity.scopes.join(", ")}`);
12069
12069
  if (!identity.admin) {
12070
- out.log("\nYou can read platform runbooks but not edit them. A handshake-minted");
12071
- out.log("device token never carries admin \u2014 sign in to Studio as an admin to edit.");
12070
+ if (identity.scopes.includes("platform:runbook:write")) {
12071
+ out.log("\nThis exact scope can read and edit all platform runbook content.");
12072
+ out.log("The device token is not ambient admin and cannot change visibility.");
12073
+ } else {
12074
+ out.log("\nYou can read operator-visible platform runbooks but not edit them.");
12075
+ out.log("Use a platform-admin-approved runbook write request to edit.");
12076
+ }
12072
12077
  }
12073
12078
  }
12074
12079