@akanjs/cli 3.0.0-alpha.34 → 3.0.0-alpha.35

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/.build-stamp CHANGED
@@ -1 +1 @@
1
- 1ba5af5f113a1c106187a2b639d58cebb76b91f2b81154ec5fd690e268026a8e
1
+ 19d013737b1748d534b589ea7399041a437db6f36d396f7ce0e2617c8883bf31
@@ -681,6 +681,10 @@ apps and libs never import it directly (`no-import-external-library`) — everyt
681
681
  providers the way middleware is applied: `option.applyAdaptor(LlmAdaptorRole, ClaudeLlm)`, where the
682
682
  implementation is an `adapt()` class in a `srvkit/` implementing `LlmAdaptor.chat(request, onDelta?)` — ignore
683
683
  `onDelta` and the chat still answers whole.
684
+ - **A dialog's close is the dialog's own dismissal, not a state flip.** `closeDialogIn<Ns>` (and `Dialog.Close`)
685
+ run through whatever `Dialog.Modal` registered, so the agent takes the exact path the X button takes —
686
+ `confirmClose` still prompts and `onCancel` still fires. A close that only set `open` to false would skip both,
687
+ which is a different action wearing the same name.
684
688
  - **`<Agent.Zone id="comments">` runs a second agent over one section, in parallel with the root.** Everything
685
689
  mounted inside — `st.use` subscriptions, hook tools, Guides — belongs to that zone's own conversation *and*
686
690
  stays visible to the root agent: **zones are views, never walls**, so wrapping a section costs the root nothing.
@@ -718,17 +722,36 @@ apps and libs never import it directly (`no-import-external-library`) — everyt
718
722
  callable still drives the click a person makes. It does not throw: a tool schema is built during render, and an
719
723
  agent-tooling mistake that aborted the render would cost the route its server rendering. `st.useState`'s `set`
720
724
  degrades the same way, to read-only.
721
- - **A component that renders once per row publishes nothing.** A tool registered under one name by fifty rows is
722
- forty-nine collisions and one survivor. The container publishes one tool taking the id instead
723
- `removeTask(taskId)`, never fifty `removeTask` and the agent reads the ids from the `<slice>.items` resource
724
- `Load.Units` and `Data.ListContainer` already expose.
725
+ - **A component that renders once per row never closes over its row's id it takes the id as an argument.** A
726
+ tool that captured its own row would be fifty registrations of one name, forty-nine of them shadowed, and the
727
+ survivor would remove whichever row happened to mount last. Take the id instead `removeTask(taskId)`, never
728
+ fifty `removeTask` and every row's registration is then interchangeable, so a row component may publish after
729
+ all: say so with `shared: true` and the repeats are one declaration rather than a warned-about clash. The ids
730
+ come from the `<slice>.items` resource `Load.Units` and `Data.ListContainer` already expose. `shared` is a claim
731
+ about the *tool*, not a way to quiet a console: two rows whose tools would do different things (a different
732
+ `modal`, a different redirect) are not interchangeable, and that one wants a `namespace` or nothing at all.
725
733
  - **`akanjs/ui` publishes its own controls, so an app writes nothing for them.** `Data.ListContainer` (and every
726
- `Model.AdminPanel`) publishes its toolbar and its row and modal verbs; `Load.Units`, `Load.Pagination` and
727
- `Data.Pagination` publish `setPageOf<Model>`; `Layout.Sider`, `System.SelectLanguage`, `Link.Back` and
728
- `System.ThemeToggle` publish the shell. **A component that can render twice on one screen takes a
729
- `namespace` prop and publishes nothing without it** — `Tab`, `Dialog`, `ScreenNavigator`. Pass one
730
- (`<Tab namespace="detail">`) and the tool becomes `switchTabInDetail`; leave it off and that tab is invisible to
731
- the agent, because two tabs answering to `switchTab` would mean the first to mount loses.
734
+ `Model.AdminPanel`) publishes its toolbar and its row verbs; `Model.NewWrapper` (so `Model.New` too) publishes
735
+ `new<Model>`; `Load.Units`, `Load.Pagination` and `Data.Pagination` publish `setPageOf<Model>`; `Layout.Sider`,
736
+ `System.SelectLanguage`, `Link.Back` and `System.ThemeToggle` publish the shell. **A component that can render
737
+ twice on one screen takes a `namespace` prop and publishes nothing without it** — `Tab`, `Dialog`,
738
+ `ScreenNavigator`. Pass one (`<Tab namespace="detail">`) and the tool becomes `switchTabInDetail`; leave it off
739
+ and that tab is invisible to the agent, because two tabs answering to `switchTab` would mean the first to mount
740
+ loses. `Model.NewWrapper` takes the same prop but publishes without one, because its slice already names it —
741
+ a second create trigger for the same slice, opening a form seeded differently, is what needs the suffix.
742
+ - **The `Model.*` row wrappers publish their verb, taking the id.** `Model.EditWrapper`, `Model.ViewWrapper`,
743
+ `Model.RemoveWrapper` and `Model.Remove` publish `edit<Model>` / `view<Model>` / `remove<Model>` with a
744
+ `modelId` argument, so a list built from `Load.Units` and an app's own `Unit` reaches the same verbs an
745
+ `AdminPanel` does. `Model.SureToRemove` publishes the same — except under `typeNameToRemove`, where it
746
+ publishes nothing: that gate makes a person retype the model's name, an approval card is one click, and
747
+ offering the lever at a friction the screen does not have is not the same control.
748
+ - **A modal publishes its verbs while it is open, and only then.** `Model.EditModal` publishes `submit<Model>`
749
+ and `cancelEditOf<Model>`, `Model.ViewModal` publishes `closeViewOf<Model>`, and `Model.ViewEditModal`
750
+ publishes `edit<Model>` / `submit<Model>` / `closeViewOf<Model>` — each from a subtree that mounts with the
751
+ open modal, never from the component that merely holds it. That is what makes a list legal: `Data.CardList`
752
+ renders one editor per row, and at most one of them is ever open, so one name is registered rather than fifty.
753
+ It also means the verb is absent from the catalogue while nothing is open, which is honest — and costs the
754
+ agent nothing, because the catalogue is re-read on the turn that follows the tool call that opened the form.
732
755
  - **A form control publishes its own setter, and reading a form publishes one tool that fills several at once.**
733
756
  Both are free: an app writes no `st.tool` for a form. A `Field.*` / `Input.*` / `Select` / `Switch` handed
734
757
  `onChange={st.do.setTitleOnTask}` **by reference** publishes `setTitleOnTask` while it is on screen — the same
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@akanjs/cli",
3
- "version": "3.0.0-alpha.34",
3
+ "version": "3.0.0-alpha.35",
4
4
  "sourceType": "module",
5
5
  "type": "module",
6
6
  "publishConfig": {
@@ -34,7 +34,7 @@
34
34
  "@langchain/openai": "^1.4.6",
35
35
  "@tailwindcss/node": "^4.3.0",
36
36
  "@trapezedev/project": "^7.1.4",
37
- "akanjs": "3.0.0-alpha.34",
37
+ "akanjs": "3.0.0-alpha.35",
38
38
  "chalk": "^5.6.2",
39
39
  "commander": "^14.0.3",
40
40
  "dayjs": "^1.11.20",