@everfir/az8-cli 0.3.0 → 0.4.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.
package/CHANGELOG.md CHANGED
@@ -5,6 +5,41 @@ it does not inherit the Web application or monorepo root version.
5
5
 
6
6
  ## Unreleased
7
7
 
8
+ ## 0.4.0 - 2026-07-24
9
+
10
+ ### Added
11
+
12
+ - Browser-assisted local authentication through `az8 login`, account inspection through
13
+ `az8 whoami`, and local sign-out through `az8 logout`.
14
+ - Environment-isolated local credential storage with atomic writes, restrictive filesystem
15
+ permissions, authenticated account metadata, and automatic persistence of rotated tokens.
16
+ - A standalone Studio authorization page that requires an explicit approve or deny decision and
17
+ never exposes the delivered credential to browser JavaScript.
18
+
19
+ ### Changed
20
+
21
+ - Capability discovery can select one exact Operation schema with `--operation-name`; Workflow
22
+ Definition discovery always uses compact target counts, target filtering, and opaque cursor
23
+ pagination.
24
+ - The built-in Skill uses focused capability detail and bounded Workflow catalog pages instead of
25
+ loading full catalogs into agent context.
26
+ - Persistent Canvas protocol `1.1` removes selector-free capability detail and full Workflow
27
+ catalog responses. Callers must select one Operation detail and page Workflow summaries.
28
+ - Credential resolution now prefers explicit process and env-file tokens before the local login
29
+ credential, while reporting which non-secret source is active.
30
+ - Daemon Session descriptors retain only the credential source and account identity so logout can
31
+ close affected local-token Sessions without recording a secret.
32
+ - Agent onboarding recommends browser login by default and explains the at-most-once exchange
33
+ failure boundary: an ambiguous exchange must begin a new authorization rather than retry.
34
+
35
+ ### Safety and compatibility
36
+
37
+ - Browser authorization uses PKCE, a short-lived user code, explicit CSRF intent, and at-most-once
38
+ token delivery. A consumed exchange is never replayed after a lost response or local save
39
+ failure.
40
+ - `logout` clears only local CLI state; it does not promise server-side revocation. Existing
41
+ environment and env-file provisioning remains supported and is never rewritten by the CLI.
42
+
8
43
  ## 0.3.0 - 2026-07-23
9
44
 
10
45
  ### Added
package/README.md CHANGED
@@ -18,7 +18,7 @@ az8 guide
18
18
  For a supplied release artifact, install the exact immutable tarball instead:
19
19
 
20
20
  ```bash
21
- npm install --global ./everfir-az8-cli-0.3.0.tgz
21
+ npm install --global ./everfir-az8-cli-0.4.0.tgz
22
22
  az8 --version
23
23
  ```
24
24
 
@@ -40,15 +40,30 @@ az8 guide --format json
40
40
  ```
41
41
 
42
42
  The guide teaches discovery; it does not freeze dynamic product schemas. After selecting a Project,
43
- the agent must query `capabilities.summary` and `capabilities.detail` for the effective Operations,
44
- permissions, input schema, History, completion, and retry semantics of the installed version and
45
- current account. Workflow Definition queries and `planGeneration` remain authoritative for current
46
- generation inputs.
43
+ the agent must query `capabilities.summary`, then focused `capabilities.detail --operation-name`
44
+ responses for the effective Operations, permissions, input schema, History, completion, and retry
45
+ semantics of the installed version and current account. Workflow Definition queries and
46
+ `planGeneration` remain authoritative for current generation inputs.
47
47
 
48
48
  ## Credentials and environment
49
49
 
50
- Credentials must be provisioned outside the agent's recorded interaction. Use an ignored
51
- `.env.local`, an explicit env-file path, or an inherited process environment:
50
+ Use browser authorization for the default local account:
51
+
52
+ ```bash
53
+ az8 login --environment test
54
+ az8 whoami --environment test
55
+ az8 logout --environment test
56
+ ```
57
+
58
+ `login` opens `studio.az8.studio` or `studio.az8.art`, waits for explicit approval, validates the
59
+ issued account, and stores the credential in the current operating-system user's private AZ8 CLI
60
+ state directory. `whoami` reports the active account and credential source without exposing the
61
+ token. `logout` closes daemon Sessions that depend on that local credential and removes it locally;
62
+ it does not revoke copies on other machines. Use `login --no-open` when the browser must be opened
63
+ manually; the verification URL is emitted as structured progress on stderr.
64
+
65
+ Externally provisioned credentials remain supported for automation. Use an ignored `.env.local`,
66
+ an explicit env-file path, or an inherited process environment:
52
67
 
53
68
  ```dotenv
54
69
  AZ8_TOKEN=<operator-provisioned-secret>
@@ -58,9 +73,10 @@ AZ8_ENVIRONMENT=test
58
73
  `AZ8_ENVIRONMENT` accepts `test` or `production`. Command-line `--environment` overrides the env
59
74
  value. Without `--env-file`, the CLI searches from the working directory upward for `.env.local`.
60
75
  An explicit file is selected by path, for example
61
- `--environment test --env-file /secure/path/.env.local`. Agents must not read, print, edit, or ask
62
- users to paste credential contents; verify authentication with a bounded `projects list` read.
63
- Tokens must not be passed through argv or stdio protocol payloads.
76
+ `--environment test --env-file /secure/path/.env.local`. Process-environment credentials take
77
+ precedence over env files, which take precedence over the locally saved login. The CLI never
78
+ rewrites an env file or inherited environment. Agents must not read, print, edit, or ask users to
79
+ paste credential contents. Tokens must not be passed through argv or stdio protocol payloads.
64
80
 
65
81
  ## CLI architecture
66
82
 
@@ -69,7 +85,8 @@ validation boundary. CLI-specific code is organized by responsibility:
69
85
 
70
86
  - `src/cli/` owns program assembly, runtime config, persistent stdio transport, output framing, and
71
87
  package version resolution.
72
- - `src/commands/` declares Project, Canvas, and guide commands.
88
+ - `src/auth/` owns browser authorization, account-service exchange, and private local credentials.
89
+ - `src/commands/` declares account, Project, Canvas, and guide commands.
73
90
  - `src/agent-session/` owns isolated daemon lifecycles, local Session discovery, the private RPC
74
91
  carrier, Watch delivery, and current-context selection.
75
92
  - `src/canvas/` owns collaboration sessions, one-shot execution, awareness, and the NDJSON
@@ -100,10 +117,11 @@ indeterminate.
100
117
 
101
118
  ## First agent loop
102
119
 
103
- A new agent needs only the installed package, a token, and this document. Start by creating its own
104
- Project, then open one daemon-backed Agent Collaboration Session:
120
+ A new agent needs only the installed package, an authorized account, and this document. Confirm the
121
+ active identity, then create its own Project and open one daemon-backed Agent Collaboration Session:
105
122
 
106
123
  ```bash
124
+ az8 whoami --environment test
107
125
  az8 projects create --name "Agent preview workspace"
108
126
  az8 session open <project-id> --environment test
109
127
  az8 session query capabilities.summary
@@ -294,7 +312,7 @@ az8 canvas open <project-id> --write --format ndjson [--client-name codex]
294
312
  The process writes one `hello` frame, then waits for an `initialize` request on stdin:
295
313
 
296
314
  ```json
297
- {"protocolVersion":"1.0","requestId":"init-1","type":"initialize","payload":{"projectId":"<project-id>","client":{"name":"my-agent"},"observationPreset":"compact"}}
315
+ {"protocolVersion":"1.1","requestId":"init-1","type":"initialize","payload":{"projectId":"<project-id>","client":{"name":"my-agent"},"observationPreset":"compact"}}
298
316
  ```
299
317
 
300
318
  Before readiness the client hydrates the current authenticated account profile. Canvas Operations use
@@ -315,17 +333,25 @@ Node hierarchy operations, and the Stage 3 Core Node creative loop. Note operati
315
333
  `createGenerationTarget`, the compatible non-text `createMediaTarget`, `planGeneration`,
316
334
  `importExternalMedia`, `uploadMedia`, `editGenerationDraft`,
317
335
  `addVisualReference`, `removeVisualReference`, `startGeneration`, `getWorkflowRun`, and
318
- `waitWorkflowRun`. Capability detail is discoverable through `capabilities.detail`; callers should
319
- use it instead of hard-coding input schemas. Workflow Definitions are available through
320
- `workflowDefinitions.summary` and `workflowDefinition.detail` queries. Summary discovery, default
321
- Drafts, planning, and generation start use only Definitions available to the authenticated account.
322
- Detail may retain an unavailable historical Definition for diagnosis with
323
- `availableForAccount: false` and an `accessReason`.
336
+ `waitWorkflowRun`. Capability detail is discoverable through
337
+ `capabilities.detail --operation-name <operation-name>`; callers should select only the Operation
338
+ they plan to invoke instead of loading every schema or hard-coding inputs. Workflow Definitions are
339
+ available through `workflowDefinitions.summary` and `workflowDefinition.detail` queries.
340
+ `workflowDefinitions.summary` always returns a compact paginated catalog with a default page size of
341
+ 10, target counts, and an opaque next cursor; use `--workflow-target`, `--page-size`, and `--cursor`
342
+ to narrow or continue it. Summary discovery, default Drafts, planning, and generation start use only
343
+ Definitions available to the authenticated account. Detail may retain an unavailable historical
344
+ Definition for diagnosis with `availableForAccount: false` and an `accessReason`.
324
345
 
325
346
  Workflow tags describe classification, compatibility, access, and rollout rather than price.
326
347
  `available:free` means a free-tier account may select the Workflow; it does not mean zero-credit
327
348
  generation. Credit claims must come from planning/start estimates or terminal usage records.
328
349
 
350
+ `getCoreNode` requires a non-empty unique `coreNodeIds` batch and returns `coreNodes` in the same
351
+ order. If any requested Core Node does not exist, the whole read fails instead of returning an
352
+ ambiguous partial result. The CLI adapter uses the backend's batch endpoint and transparently chunks
353
+ large requests.
354
+
329
355
  Before editing a Draft, an agent can call the read-only `planGeneration` Operation for an existing
330
356
  generation target. It recommends a Definition from the target and resolved generation-reference modalities,
331
357
  constructs configuration defaults, validates required inputs, and returns compact alternatives plus
@@ -334,15 +360,18 @@ field metadata, including dynamic enum options. Planning never creates a Core No
334
360
  Canvas; returned Operations still execute independently and stop at the first failure.
335
361
 
336
362
  Generation references always identify visible Canvas placements. Public planning and
337
- `addVisualReference` accept only a View Node ID. If desired content exists only as a Core Node, call
363
+ `addVisualReference` accept only View Node IDs. `addVisualReference` requires a non-empty unique
364
+ `referenceViewNodeIds` batch; `removeVisualReference` requires a non-empty unique `referenceIds`
365
+ batch. Both Operations validate the complete batch before one atomic Draft write, so a failure never
366
+ leaves a partial batch. If desired content exists only as a Core Node, call
338
367
  `placeCoreNode` first, wait for its successful Receipt, and reference the returned View Node. This
339
368
  preserves the same visible inferred connection as Web and avoids guessing when one Core Node has
340
369
  multiple Canvas placements. Manual Text Resources are valid prompt references even though they do
341
370
  not have a Core Node before generation starts. Their View Node binding remains in the launch history
342
371
  for Web lineage and inferred-edge rendering; estimation uses the current text and materialization
343
372
  creates the Text Core Node only after the estimate succeeds. The published operation names
344
- `addVisualReference` and `removeVisualReference` are retained for compatibility and also carry these
345
- planned Text bindings.
373
+ `addVisualReference` and `removeVisualReference` cover these planned Text bindings as well as image
374
+ and video bindings.
346
375
 
347
376
  `insertPromptReference` additionally places the platform-owned At token at `start`, `end`, or
348
377
  before/after an exact text anchor such as
@@ -351,7 +380,7 @@ only for a unique anchor. Missing or ambiguous anchors fail without writing. Cal
351
380
  At syntax, binding IDs, or slot indexes.
352
381
 
353
382
  ```json
354
- {"protocolVersion":"1.0","requestId":"plan-1","type":"operation","payload":{"name":"planGeneration","input":{"targetViewNodeId":"<target-id>","prompt":"A quiet observatory","references":[{"viewNodeId":"<reference-id>"}],"detail":"detail"}}}
383
+ {"protocolVersion":"1.1","requestId":"plan-1","type":"operation","payload":{"name":"planGeneration","input":{"targetViewNodeId":"<target-id>","prompt":"A quiet observatory","references":[{"viewNodeId":"<reference-id>"}],"detail":"detail"}}}
355
384
  ```
356
385
 
357
386
  `editNoteContent`, `setNoteColor`, `editTextContent`, `renameViewNode`, and `resizeViewNodes` match
@@ -370,41 +399,41 @@ is scoped to siblings with the same parent. Decoration, Asset, and all World tar
370
399
  Example write:
371
400
 
372
401
  ```json
373
- {"protocolVersion":"1.0","requestId":"create-1","type":"operation","payload":{"name":"createNote","input":{"text":"idea","position":{"x":160,"y":160}}}}
402
+ {"protocolVersion":"1.1","requestId":"create-1","type":"operation","payload":{"name":"createNote","input":{"text":"idea","position":{"x":160,"y":160}}}}
374
403
  ```
375
404
 
376
405
  Example Stage 2 edits:
377
406
 
378
407
  ```json
379
- {"protocolVersion":"1.0","requestId":"edit-1","type":"operation","payload":{"name":"editNoteContent","input":{"viewNodeId":"view_node_1","text":"revised idea"}}}
380
- {"protocolVersion":"1.0","requestId":"color-1","type":"operation","payload":{"name":"setNoteColor","input":{"viewNodeId":"view_node_1","color":"purple"}}}
381
- {"protocolVersion":"1.0","requestId":"text-1","type":"operation","payload":{"name":"createTextNode","input":{"text":"A manual Text Resource","name":"Draft copy","position":{"x":520,"y":160}}}}}
382
- {"protocolVersion":"1.0","requestId":"resize-1","type":"operation","payload":{"name":"resizeViewNodes","input":{"resizes":[{"viewNodeId":"view_node_1","size":{"width":420,"height":360}}]}}}
383
- {"protocolVersion":"1.0","requestId":"duplicate-1","type":"operation","payload":{"name":"duplicateViewNodes","input":{"viewNodeIds":["view_node_1"]}}}
408
+ {"protocolVersion":"1.1","requestId":"edit-1","type":"operation","payload":{"name":"editNoteContent","input":{"viewNodeId":"view_node_1","text":"revised idea"}}}
409
+ {"protocolVersion":"1.1","requestId":"color-1","type":"operation","payload":{"name":"setNoteColor","input":{"viewNodeId":"view_node_1","color":"purple"}}}
410
+ {"protocolVersion":"1.1","requestId":"text-1","type":"operation","payload":{"name":"createTextNode","input":{"text":"A manual Text Resource","name":"Draft copy","position":{"x":520,"y":160}}}}}
411
+ {"protocolVersion":"1.1","requestId":"resize-1","type":"operation","payload":{"name":"resizeViewNodes","input":{"resizes":[{"viewNodeId":"view_node_1","size":{"width":420,"height":360}}]}}}
412
+ {"protocolVersion":"1.1","requestId":"duplicate-1","type":"operation","payload":{"name":"duplicateViewNodes","input":{"viewNodeIds":["view_node_1"]}}}
384
413
  ```
385
414
 
386
415
  Example hierarchy sequence (each successful write is one independent undoable interaction):
387
416
 
388
417
  ```json
389
- {"protocolVersion":"1.0","requestId":"group-1","type":"operation","payload":{"name":"groupViewNodes","input":{"viewNodeIds":["view_node_1","view_node_2"],"name":"References"}}}
390
- {"protocolVersion":"1.0","requestId":"reparent-1","type":"operation","payload":{"name":"moveViewNodes","input":{"moves":[{"id":"view_node_3","position":{"x":640,"y":360},"targetParentId":"<group-id>"}]}}}
391
- {"protocolVersion":"1.0","requestId":"front-1","type":"operation","payload":{"name":"updateViewNodeStacking","input":{"viewNodeId":"view_node_3","direction":"front"}}}
392
- {"protocolVersion":"1.0","requestId":"ungroup-1","type":"operation","payload":{"name":"ungroupViewNode","input":{"groupViewNodeId":"<group-id>"}}}
418
+ {"protocolVersion":"1.1","requestId":"group-1","type":"operation","payload":{"name":"groupViewNodes","input":{"viewNodeIds":["view_node_1","view_node_2"],"name":"References"}}}
419
+ {"protocolVersion":"1.1","requestId":"reparent-1","type":"operation","payload":{"name":"moveViewNodes","input":{"moves":[{"id":"view_node_3","position":{"x":640,"y":360},"targetParentId":"<group-id>"}]}}}
420
+ {"protocolVersion":"1.1","requestId":"front-1","type":"operation","payload":{"name":"updateViewNodeStacking","input":{"viewNodeId":"view_node_3","direction":"front"}}}
421
+ {"protocolVersion":"1.1","requestId":"ungroup-1","type":"operation","payload":{"name":"ungroupViewNode","input":{"groupViewNodeId":"<group-id>"}}}
393
422
  ```
394
423
 
395
424
  Example Stage 3 generation sequence (each line is a separate ordered interaction):
396
425
 
397
426
  ```json
398
- {"protocolVersion":"1.0","requestId":"target-1","type":"operation","payload":{"name":"createGenerationTarget","input":{"contentType":"image"}}}
399
- {"protocolVersion":"1.0","requestId":"draft-1","type":"operation","payload":{"name":"editGenerationDraft","input":{"viewNodeId":"<target-id>","definitionId":"<definition-id>","prompt":"A quiet observatory","config":{"aspect_ratio":"16:9"}}}}
400
- {"protocolVersion":"1.0","requestId":"start-1","type":"operation","payload":{"name":"startGeneration","input":{"viewNodeId":"<target-id>"}}}
401
- {"protocolVersion":"1.0","requestId":"wait-1","type":"operation","payload":{"name":"waitWorkflowRun","input":{"workflowRunId":"<run-id>"},"timeoutMs":120000}}
427
+ {"protocolVersion":"1.1","requestId":"target-1","type":"operation","payload":{"name":"createGenerationTarget","input":{"contentType":"image"}}}
428
+ {"protocolVersion":"1.1","requestId":"draft-1","type":"operation","payload":{"name":"editGenerationDraft","input":{"viewNodeId":"<target-id>","definitionId":"<definition-id>","prompt":"A quiet observatory","config":{"aspect_ratio":"16:9"}}}}
429
+ {"protocolVersion":"1.1","requestId":"start-1","type":"operation","payload":{"name":"startGeneration","input":{"viewNodeId":"<target-id>"}}}
430
+ {"protocolVersion":"1.1","requestId":"wait-1","type":"operation","payload":{"name":"waitWorkflowRun","input":{"workflowRunId":"<run-id>"},"timeoutMs":120000}}
402
431
  ```
403
432
 
404
433
  Example public media URL import:
405
434
 
406
435
  ```json
407
- {"protocolVersion":"1.0","requestId":"import-1","type":"operation","payload":{"name":"importExternalMedia","input":{"contentType":"image","idempotencyKey":"reference-image-1","url":"https://example.com/reference.png","name":"Reference image","position":{"x":640,"y":160}}}}
436
+ {"protocolVersion":"1.1","requestId":"import-1","type":"operation","payload":{"name":"importExternalMedia","input":{"contentType":"image","idempotencyKey":"reference-image-1","url":"https://example.com/reference.png","name":"Reference image","position":{"x":640,"y":160}}}}
408
437
  ```
409
438
 
410
439
  `idempotencyKey` is required. Repeating the same normalized input returns the existing View Node and
package/RELEASE.md CHANGED
@@ -57,11 +57,11 @@ Before publishing, also run the test-environment acceptance checklist in the pac
57
57
  repository-wide `pnpm verify`. Publishing is an external action and requires explicit operator
58
58
  authorization:
59
59
 
60
- For the `0.3.0` stable candidate, publish the exact retained artifact to the stable channel only
60
+ For the `0.4.0` stable candidate, publish the exact retained artifact to the stable channel only
61
61
  after its test-environment acceptance succeeds:
62
62
 
63
63
  ```bash
64
- npm publish ./tmp/az8-cli-release/everfir-az8-cli-0.3.0.tgz --tag latest
64
+ npm publish ./tmp/az8-cli-release/everfir-az8-cli-0.4.0.tgz --tag latest
65
65
  npm view @everfir/az8-cli dist-tags versions --json
66
66
  ```
67
67