@engenty/wizards-runtime 0.7.6 → 0.7.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.
Files changed (85) hide show
  1. package/apps/runtime/dist/authoring/guide.js +12 -3
  2. package/apps/runtime/dist/browser/fast/classifier.js +9 -4
  3. package/apps/runtime/dist/cli/main.js +1 -1
  4. package/apps/runtime/dist/cli/menu.js +5 -1
  5. package/apps/runtime/dist/cli/ollama.js +302 -0
  6. package/apps/runtime/dist/cli/setup.js +102 -2
  7. package/apps/runtime/dist/decision-model.js +33 -0
  8. package/apps/runtime/dist/docs/dev/index.md +6 -1
  9. package/apps/runtime/dist/docs/dev/integration/channels.md +11 -0
  10. package/apps/runtime/dist/docs/dev/integration/claude-code-plugin.md +10 -0
  11. package/apps/runtime/dist/docs/dev/integration/embed.md +10 -0
  12. package/apps/runtime/dist/docs/dev/integration/index.md +36 -0
  13. package/apps/runtime/dist/docs/dev/integration/link-and-share.md +10 -0
  14. package/apps/runtime/dist/docs/dev/integration/mcp-apps.md +10 -0
  15. package/apps/runtime/dist/docs/dev/integration/mcp.md +10 -0
  16. package/apps/runtime/dist/docs/dev/integration/meta.json +20 -0
  17. package/apps/runtime/dist/docs/dev/integration/openui.md +181 -0
  18. package/apps/runtime/dist/docs/dev/integration/own-ui.md +10 -0
  19. package/apps/runtime/dist/docs/dev/integration/results.md +11 -0
  20. package/apps/runtime/dist/docs/dev/integration/wordpress.md +10 -0
  21. package/apps/runtime/dist/docs/dev/meta.json +1 -1
  22. package/apps/runtime/dist/docs/user/command-line.md +1 -1
  23. package/apps/runtime/dist/docs/user/install.md +1 -0
  24. package/apps/runtime/dist/engine/decide.js +3 -1
  25. package/apps/runtime/dist/engine/steps.js +2 -1
  26. package/apps/runtime/dist/film/project.js +221 -65
  27. package/apps/runtime/dist/film/step.js +16 -5
  28. package/apps/runtime/dist/models.js +43 -3
  29. package/apps/runtime/dist/routes/runs.js +14 -1
  30. package/apps/runtime/dist/tools/code.js +173 -0
  31. package/apps/runtime/dist/tools/connector.js +6 -0
  32. package/apps/runtime/dist/tools/index.js +14 -3
  33. package/apps/web/dist/assets/{AboutDialog-DYgXPagX.js → AboutDialog-ByZyHXDj.js} +1 -1
  34. package/apps/web/dist/assets/{ChangelogDialog-BXqBW8j3.js → ChangelogDialog-QHYP0jAv.js} +1 -1
  35. package/apps/web/dist/assets/{ChatView-CK2--tsE.js → ChatView-DupTtI8K.js} +1 -1
  36. package/apps/web/dist/assets/EditorPage-k6qouLeS.js +4 -0
  37. package/apps/web/dist/assets/{FlowPreview-CusP7ci9.js → FlowPreview-Dx8AjXvE.js} +1 -1
  38. package/apps/web/dist/assets/{Harness-CV9uYzbv.js → Harness-NvIb36TG.js} +1 -1
  39. package/apps/web/dist/assets/{NewWizardChannels-BakW5q6s.js → NewWizardChannels-B2YgtJlt.js} +1 -1
  40. package/apps/web/dist/assets/{NewWizardPage-BoA-LJuW.js → NewWizardPage-BgLY6SL6.js} +1 -1
  41. package/apps/web/dist/assets/{OnboardingPage-DaD1XnOe.js → OnboardingPage-CxhwefJU.js} +1 -1
  42. package/apps/web/dist/assets/{ProjectPage-BFgk1DEv.js → ProjectPage-6ceSSS7W.js} +1 -1
  43. package/apps/web/dist/assets/{PublicRunner-C9MwEvxy.js → PublicRunner-6lQvReDx.js} +1 -1
  44. package/apps/web/dist/assets/{ReadOnly-DC2Kp7l8.js → ReadOnly-CGNHlgUT.js} +1 -1
  45. package/apps/web/dist/assets/{RunDrawer-CY6NZSrI.js → RunDrawer-TVGNnWyx.js} +2 -2
  46. package/apps/web/dist/assets/{RunnerView-BT26XgcY.js → RunnerView-DInSK0VZ.js} +1 -1
  47. package/apps/web/dist/assets/SettingsPage-D3k5pXN5.js +1 -0
  48. package/apps/web/dist/assets/{SetupPage-DtFYAbwJ.js → SetupPage-Bj5frdzY.js} +1 -1
  49. package/apps/web/dist/assets/{SharePage-t2xwNS61.js → SharePage-hG7Z6SLy.js} +1 -1
  50. package/apps/web/dist/assets/changelog-CO9vKjV0.js +1 -0
  51. package/apps/web/dist/assets/{esm-DXeMu8Lb.js → esm-DVk3RJij.js} +1 -1
  52. package/apps/web/dist/assets/index-DfaoPjNW.css +1 -0
  53. package/apps/web/dist/assets/index-DlDsr9Lc.js +14 -0
  54. package/apps/web/dist/assets/oss-credits-X2JPiMOR.js +1 -0
  55. package/apps/web/dist/assets/{phone-CgrIS4_-.js → phone-CXXHXYnA.js} +1 -1
  56. package/apps/web/dist/assets/{settings-menu-2IMOOlLl.js → settings-menu-DXzZCIMx.js} +1 -1
  57. package/apps/web/dist/assets/{ui-dzGvc3xk.js → ui-DQ4L2npj.js} +2 -2
  58. package/apps/web/dist/assets/{upload-BSuTilFF.js → upload-BnYHIfu5.js} +1 -1
  59. package/apps/web/dist/assets/{lock-R_CfU0Xo.js → wrench-BrUJ7SV6.js} +1 -1
  60. package/apps/web/dist/index.html +3 -3
  61. package/apps/web/dist/install.sh +2 -2
  62. package/apps/web/dist/mcp/flow.html +4 -4
  63. package/node_modules/@engenty/wizards/dist/openui/Wizard.d.ts +20 -0
  64. package/node_modules/@engenty/wizards/dist/openui/Wizard.js +62 -0
  65. package/node_modules/@engenty/wizards/dist/openui/index.d.ts +9 -0
  66. package/node_modules/@engenty/wizards/dist/openui/index.js +9 -0
  67. package/node_modules/@engenty/wizards/dist/openui/message.d.ts +11 -0
  68. package/node_modules/@engenty/wizards/dist/openui/message.js +69 -0
  69. package/node_modules/@engenty/wizards/dist/openui/run.d.ts +8 -0
  70. package/node_modules/@engenty/wizards/dist/openui/run.js +137 -0
  71. package/node_modules/@engenty/wizards/dist/openui/server.d.ts +37 -0
  72. package/node_modules/@engenty/wizards/dist/openui/server.js +77 -0
  73. package/node_modules/@engenty/wizards/package.json +4 -1
  74. package/node_modules/@engenty-wizards/shared/dist/definition.d.ts +7 -1
  75. package/node_modules/@engenty-wizards/shared/dist/definition.js +16 -0
  76. package/node_modules/@engenty-wizards/shared/dist/fit.js +7 -2
  77. package/node_modules/@engenty-wizards/shared/dist/run.d.ts +14 -0
  78. package/node_modules/@engenty-wizards/shared/dist/run.js +2 -0
  79. package/package.json +4 -3
  80. package/apps/web/dist/assets/EditorPage-jvcwyXbU.js +0 -3
  81. package/apps/web/dist/assets/SettingsPage-AFt9IDLt.js +0 -1
  82. package/apps/web/dist/assets/changelog-CATQFxCQ.js +0 -1
  83. package/apps/web/dist/assets/index-AfUa8xKD.css +0 -1
  84. package/apps/web/dist/assets/index-Drw7FMTQ.js +0 -14
  85. package/apps/web/dist/assets/oss-credits-cZ9NUaLZ.js +0 -1
@@ -0,0 +1,36 @@
1
+ ---
2
+ title: Integration
3
+ description: Bring a published wizard into other systems – for people, for AI apps and for your own code.
4
+ version: 0.7.4
5
+ ---
6
+
7
+ A published wizard runs wherever a person can reach it. These pages show how to bring it into
8
+ other systems, from a plain link to a chat that starts the wizard by itself.
9
+
10
+ ## For people
11
+
12
+ | | |
13
+ |---|---|
14
+ | [Link and QR code](./link-and-share.md) | The wizard’s own page, as a link or a QR code |
15
+ | [Embed](./embed.md) | The wizard on your website, inline, as a button or a chat |
16
+ | [WordPress](./wordpress.md) | The plugin “engenty wizards” places wizards and reads their results |
17
+ | [Channels](./channels.md) | A chat, a conversation or a call, and WhatsApp, SMS or the phone |
18
+
19
+ ## For AI apps
20
+
21
+ | | |
22
+ |---|---|
23
+ | [MCP](./mcp.md) | AI apps list, run and build wizards over the Model Context Protocol |
24
+ | [MCP Apps](./mcp-apps.md) | AI apps that support MCP Apps show the wizard itself, page by page |
25
+ | [Claude Code plugin](./claude-code-plugin.md) | The `/wizard` command and the skills to build and use wizards |
26
+ | [OpenUI](./openui.md) | A chat built with OpenUI runs the wizard inside the conversation |
27
+
28
+ ## For your code
29
+
30
+ | | |
31
+ |---|---|
32
+ | [Your own UI](./own-ui.md) | Your app draws the run with `@engenty-wizards/runner` |
33
+ | [Results to your systems](./results.md) | What a run produces goes on to your own systems |
34
+
35
+ Each way starts from a published wizard. [Test and share](../../user/test-and-share.md) in the
36
+ user guide explains how you publish one.
@@ -0,0 +1,10 @@
1
+ ---
2
+ title: Link and QR code
3
+ description: Hand out a published wizard as a link or a QR code.
4
+ version: 0.7.4
5
+ ---
6
+
7
+ This page is not written yet.
8
+
9
+ Until then, [Share](../../user/test-and-share.md#share) in the user guide describes the link, the
10
+ QR code and who can open them.
@@ -0,0 +1,10 @@
1
+ ---
2
+ title: MCP Apps
3
+ description: AI apps that support MCP Apps show the wizard itself as a widget, page by page.
4
+ version: 0.7.4
5
+ ---
6
+
7
+ This page is not written yet.
8
+
9
+ Until then, [What an app can do](../../user/ai-apps.md#what-an-app-can-do) in the user guide lists
10
+ what an app with MCP Apps shows.
@@ -0,0 +1,10 @@
1
+ ---
2
+ title: MCP
3
+ description: AI apps list, run and build wizards over the Model Context Protocol.
4
+ version: 0.7.4
5
+ ---
6
+
7
+ This page is not written yet.
8
+
9
+ Until then, [AI apps](../../user/ai-apps.md) in the user guide shows how you add engenty wizards
10
+ to Claude Desktop, Cursor, Codex and other AI apps.
@@ -0,0 +1,20 @@
1
+ {
2
+ "title": "Integration",
3
+ "defaultOpen": true,
4
+ "pages": [
5
+ "index",
6
+ "---For people---",
7
+ "link-and-share",
8
+ "embed",
9
+ "wordpress",
10
+ "channels",
11
+ "---For AI apps---",
12
+ "mcp",
13
+ "mcp-apps",
14
+ "claude-code-plugin",
15
+ "openui",
16
+ "---For your code---",
17
+ "own-ui",
18
+ "results"
19
+ ]
20
+ }
@@ -0,0 +1,181 @@
1
+ ---
2
+ title: Wizards in OpenUI chats
3
+ description: A Wizard component for OpenUI’s React renderer. The chat’s model decides that a wizard runs, and the wizard runs its own pages inside the conversation.
4
+ version: 0.7.4
5
+ ---
6
+
7
+ A chat built with [OpenUI](https://github.com/thesysdev/openui) composes its answers as it
8
+ goes: cards, charts, forms and buttons, whatever the model finds fitting. A wizard is the one
9
+ thing in such a chat that runs the same way every time, with the pages, steps and result its
10
+ author defined. `@engenty/wizards/openui` puts the two together: the chat decides that a wizard
11
+ fits and what it already knows, the wizard then runs inside the conversation, and the chat
12
+ hears the result.
13
+
14
+ It is part of `@engenty/wizards`, the package for code outside engenty wizards
15
+ ([`packages/wizards/src/openui`](https://github.com/engenty/wizards/tree/main/packages/wizards/src/openui)
16
+ in the repository, under the MIT licence). A whole chat to try it with is `examples/openui-chat`.
17
+
18
+ ## What OpenUI is
19
+
20
+ OpenUI (Thesys, MIT) is a way to let a model draw. Three parts matter here:
21
+
22
+ - **A language the model writes.** An answer is a short program: `root = Card([…])` with
23
+ components as calls, such as `TextContent("…")` or `Form(…)`. The model streams it like text.
24
+ - **A React renderer** (`@openuidev/react-lang`) that parses the program as it streams and draws
25
+ it with a **component library**: React components with a name, a description and typed props.
26
+ - **A chat kit** (`@openuidev/react-ui`): the library of chat components, the thread, the
27
+ composer and an `AgentInterface` that puts them together.
28
+
29
+ The model learns the language from the system prompt the library makes. The chat library’s
30
+ prompt is about 14,000 tokens: every component with its props and description, the rules, and
31
+ 5 worked examples of whole answers. The model imitates the examples. Nothing in that prompt is
32
+ a fixed flow: every answer, and every form in it, is composed anew.
33
+
34
+ A wizard is the only fixed definition in such a chat. The model writes one line, and from then
35
+ on the wizard’s pages, AI steps, review and result run as its author defined them.
36
+
37
+ ## How the Wizard component works
38
+
39
+ ```mermaid
40
+ sequenceDiagram
41
+ participant S as Chat server
42
+ participant M as Model
43
+ participant B as Browser (OpenUI renderer)
44
+ participant R as Runtime
45
+ S->>R: GET /api/public/wizards/:token
46
+ R-->>S: title, description, fields
47
+ S->>M: system prompt + wizard rules
48
+ M-->>B: root = Card([TextContent("…"), Wizard("<token>", "<note>", {plate: "W-12345"})])
49
+ B->>R: POST /api/public/wizards/:token/runs
50
+ R-->>B: run id
51
+ loop every step
52
+ R-->>B: the run’s view (stream)
53
+ B->>R: a page’s answers, a review, back
54
+ end
55
+ B->>S: continue_conversation: “The wizard finished.” + result
56
+ S->>M: the thread
57
+ M-->>B: an answer in plain words
58
+ ```
59
+
60
+ It has two halves, one for each side of the chat.
61
+
62
+ ### The server half
63
+
64
+ `@engenty/wizards/openui/server` draws nothing, so a server can import it alone.
65
+
66
+ ```ts
67
+ import { addWizard, loadWizards, wizardRules } from "@engenty/wizards/openui/server";
68
+ import { openuiChatLibrary, openuiChatPromptOptions } from "@openuidev/react-ui/genui-lib";
69
+
70
+ const wizards = await loadWizards("http://localhost:24368", ["<token>", "<token>"]);
71
+ const prompt = addWizard(openuiChatLibrary).prompt({
72
+ ...openuiChatPromptOptions,
73
+ additionalRules: [...(openuiChatPromptOptions.additionalRules ?? []), ...wizardRules(wizards)],
74
+ });
75
+ ```
76
+
77
+ - `loadWizards(runtimeUrl, tokens)` reads each published wizard from the runtime
78
+ (`GET /api/public/wizards/:token`): its title, description and the fields its pages ask, in
79
+ order. A wizard the runtime does not answer for is left out, so the chat keeps working when
80
+ one is unpublished.
81
+ - `addWizard(library)` extends an OpenUI library with the Wizard component, among a Card’s
82
+ children. Its prompt then has `Wizard(wizard: string, note?: string, prefill?: …)`.
83
+ - `wizardRules(wizards)` are the rules that go with it: when to answer with a wizard, that the
84
+ wizard asks its own questions (never a Form in its place), what may be prefilled, and the list
85
+ of wizards with their tokens and fields.
86
+
87
+ With that, the model answers a fitting request with a Card that holds one short text and
88
+ `Wizard("<token>", "<note>", {prefill})`. The prefill holds answers the person already gave in
89
+ the conversation, by field id; the person still sees and sends each page.
90
+
91
+ ### The component, in the browser
92
+
93
+ ```tsx
94
+ import "@engenty/wizards/openui/styles.css";
95
+ import { addWizard, configureWizards, Wizard } from "@engenty/wizards/openui";
96
+ import { openuiChatLibrary } from "@openuidev/react-ui/genui-lib";
97
+
98
+ configureWizards({ runtime: "/wizards-runtime" });
99
+ const library = addWizard(openuiChatLibrary, Wizard);
100
+ ```
101
+
102
+ - `configureWizards({ runtime })` names the runtime once, as the browser reaches it: a path the
103
+ host proxies to it, or the runtime’s address. A proxy on the host’s own address keeps the
104
+ runner’s visitor cookie first-party. `lang` sets the language of the runner’s own words
105
+ (`en` unless given), `Mascot` draws the wizard’s mascot above its pages.
106
+ - `addWizard(library, Wizard)` is the same extension as on the server, with the drawing
107
+ component. Both make the same prompt.
108
+
109
+ The component draws the run with the runner, the same code as the wizard’s own page
110
+ (`packages/runner`), in styles scoped to `.engenty-runner`, so the chat’s styles and the
111
+ runner’s never meet. Every field kind works as on the wizard’s own page, the camera and the
112
+ signature included. The page is not a frame, so nothing else is needed for them.
113
+
114
+ What happens in the message:
115
+
116
+ 1. **The run starts** once the model’s line has finished streaming, so a half-written token never
117
+ starts a run: `POST /api/public/wizards/:token/runs`, as a visitor of the runtime.
118
+ 2. **The run id stays with the message**, in the state OpenUI keeps for it. A message shown again
119
+ continues the same run.
120
+ 3. **The run shows live** over the runtime’s stream of the run’s view (`/api/runs/:id/stream`), and
121
+ the person’s answers go to the run’s routes (`/api/runs/:id/pages/:step`, `…/reviews/:step`,
122
+ `…/back`, `…/retry`). These are the routes the wizard’s own page uses.
123
+ 4. **The result goes back to the chat.** When the component sees the run finish, it sends OpenUI’s
124
+ `continue_conversation` action: a turn of the person that says the wizard finished, with the
125
+ result as context for the model: the wizard’s title, the run id and the texts of the result
126
+ steps, each cut at 4,000 characters. The model answers in plain words.
127
+
128
+ The chat hears of a run it saw finish. A message shown again with a done run shows the result
129
+ and tells the chat nothing new.
130
+
131
+ ### Who runs, who pays
132
+
133
+ The browser talks to the runtime as a visitor, as on the wizard’s own page: the runtime sets a
134
+ visitor cookie, lets a visitor start 6 runs an hour
135
+ ([`LIMIT_VISITOR_RUNS_PER_HOUR`](../../user/command-line.md#settings)) and spends the wizard’s own
136
+ credits or model keys. The chat’s model and the wizards’ model are two different things: the
137
+ chat picks the model that writes its answers, and each wizard’s steps run on what its space
138
+ has.
139
+
140
+ ## Try it
141
+
142
+ `examples/openui-chat` is an OpenUI chat (`AgentInterface`) with any OpenAI-compatible model,
143
+ the wizards it may start and a proxy to the runtime. In short:
144
+
145
+ 1. Start the runtime from a checkout (`pnpm dev`) and publish a wizard or two in the studio.
146
+ Each one’s token is the part of its link after `/w/`.
147
+ 2. Put an `.env.local` in `examples/openui-chat`: `WIZARDS=<token>,<token>`, `CHAT_BASE_URL`,
148
+ `CHAT_API_KEY` and `CHAT_MODEL` for the chat’s model.
149
+ 3. `pnpm --filter @engenty-wizards/example-openui-chat dev` and open `http://localhost:5190`.
150
+ 4. Ask for something a wizard does, in your own words.
151
+
152
+ The example’s README has the details, the endpoints that work and what to set while you try
153
+ things.
154
+
155
+ ## Exports
156
+
157
+ | From | Export | What it is |
158
+ |---|---|---|
159
+ | `@engenty/wizards/openui/server` | `loadWizards(runtimeUrl, tokens)` | The published wizards behind the tokens, as `WizardInfo[]` |
160
+ | | `wizardRules(wizards)` | The rules a system prompt adds |
161
+ | | `addWizard(library, component?)` | The library with the Wizard component among a Card’s children |
162
+ | | `WizardSpec`, `wizardProps`, `WizardProps` | The component as a prompt sees it, and its props |
163
+ | | `WIZARD_COMPONENT`, `WIZARD_DESCRIPTION` | Its name and description |
164
+ | `@engenty/wizards/openui` | all of the above | |
165
+ | | `configureWizards(config)` | Names the runtime, the language and the mascot |
166
+ | | `Wizard` | The drawing component |
167
+ | | `useWizardRun(runId, prefill)` | One run, live, for a host that draws runs itself |
168
+ | `@engenty/wizards/openui/styles.css` | | The runner’s styles, scoped to the wizard |
169
+
170
+ `@openuidev/react-lang`, `react`, `react-dom` and `zod` are peer dependencies: the chat brings
171
+ them. The package is written against `@openuidev/react-lang` 1.0 and the chat kit
172
+ `@openuidev/react-ui` 0.18.
173
+
174
+ ## Good to know
175
+
176
+ - **One runtime per page.** `configureWizards` names it once, before the first render.
177
+ - **Other hosts.** The component sits on the runtime’s public run routes, not on OpenUI’s
178
+ internals. A host with its own components can draw a run with `useWizardRun` and the runner’s
179
+ parts, and another UI format can follow the same way.
180
+ - **OpenUI’s Inspect button** at the bottom right of a page in development is OpenUI’s own
181
+ (`@openuidev/react-lang` adds it and loads it from jsDelivr). A production build leaves it out.
@@ -0,0 +1,10 @@
1
+ ---
2
+ title: Your own UI
3
+ description: Draw a wizard’s run in your own app with @engenty-wizards/runner and the runtime’s public run routes.
4
+ version: 0.7.4
5
+ ---
6
+
7
+ This page is not written yet.
8
+
9
+ Until then, [OpenUI](./openui.md) shows one app that does it: it draws the run with
10
+ `@engenty-wizards/runner` (`packages/runner`) over the runtime’s public run routes.
@@ -0,0 +1,11 @@
1
+ ---
2
+ title: Results to your systems
3
+ description: Send what a run produces to your own systems.
4
+ version: 0.7.4
5
+ ---
6
+
7
+ This page is not written yet.
8
+
9
+ Until then, [Results, contacts, appointments](../../user/wordpress.md#results-contacts-appointments)
10
+ shows how the WordPress plugin receives results. A plugin can also answer other services with
11
+ its own [routes](../plugins/routes.md).
@@ -0,0 +1,10 @@
1
+ ---
2
+ title: WordPress
3
+ description: Put published wizards on a WordPress site with the plugin “engenty wizards”.
4
+ version: 0.7.4
5
+ ---
6
+
7
+ This page is not written yet.
8
+
9
+ Until then, [WordPress](../../user/wordpress.md) in the user guide shows how you connect a site,
10
+ place a wizard and read its results in the admin.
@@ -3,5 +3,5 @@
3
3
  "description": "Extend engenty wizards with plugins: tools for AI steps, routes with their own tables, pages in the studio.",
4
4
  "root": true,
5
5
  "icon": "SquareTerminal",
6
- "pages": ["index", "wizard-format", "plugins"]
6
+ "pages": ["index", "wizard-format", "plugins", "integration"]
7
7
  }
@@ -11,7 +11,7 @@ version: 0.5.0
11
11
  | `wizards` | Shows what is running, and a menu. While it runs, you can open the studio, restart or stop it; while it doesn’t, “Start in the background” or “Start in this terminal”. Then “Update”, which restarts it into the new version, “Start at login”, “Connect AI apps”, “Account”, “Status”, “Setup”, “Uninstall” and “Help”. The first time, the setup runs first. It needs a terminal |
12
12
  | `wizards start` | Starts it and opens the studio. It runs in that terminal, and Ctrl-C stops it. The first time, the setup runs first |
13
13
  | `wizards studio` | Opens the studio in your browser. If it isn’t running, it starts in the background first |
14
- | `wizards setup` | Runs the guided setup again: your account, an AI client, the browser and ffmpeg, start at login, your AI apps. `--local` leaves the account out ([Local only](./local-only.md)) |
14
+ | `wizards setup` | Runs the guided setup again: your account, an AI client, the browser and ffmpeg, a decision model, start at login, your AI apps. `--local` leaves the account out ([Local only](./local-only.md)) |
15
15
  | `wizards account` | Shows the account this computer is signed in to: who, which team, the credits. `sign-in` shows a link and a code and opens your browser; `sign-out` disconnects this computer |
16
16
  | `wizards open` | Signs this browser in to the running studio. `--print` only prints the link; it works once, within a minute |
17
17
  | `wizards status` | Shows what is installed and running, with the browser it uses for PDF, PNG and websites |
@@ -32,6 +32,7 @@ have is left alone), installs engenty wizards into `~/.engenty/wizards` (about 6
32
32
  | Your engenty account | Asks “Sign in or create your account now?”. If you say yes, it shows a link and a code and opens your browser for the sign-in at account.engenty.ai; check that the page shows the same code (if you have no account yet, the page creates one with your invitation code, or puts you on the waitlist). While it waits, Enter opens the page again and Esc goes on without an account. Once you are signed in, what you publish on this computer runs in the cloud too. If you say no, `wizards account sign-in` does it any time. Setting it up again with `--local` signs an account out. `--local` leaves the account out altogether: see [Local only](./local-only.md) |
33
33
  | An AI client | Looks for Codex, Claude Code, Antigravity and Cursor Agent and offers to install the ones that are missing. It puts first the one whose app (ChatGPT, Claude, Antigravity, Cursor) is on your Mac, as you most likely have that subscription already. You can also use your account’s credits, an API key, [Ollama](https://ollama.com) or, on a Mac with Apple silicon and macOS 26, Apple Intelligence: the studio’s [first page](./first-start.md) offers them |
34
34
  | A browser and ffmpeg | Names the browser for PDF and PNG exports and steps on websites: the first of Chrome, Edge and Chromium it finds (on a Mac also Brave). engenty wizards uses that one; [`CHROME_PATH`](./command-line.md#settings) picks another. It also says whether ffmpeg is there for MP4 videos of animated widgets, and with Homebrew it offers to install it |
35
+ | A decision model (optional) | Offers to install [Ollama](https://ollama.com) if it isn’t there and to download Cloudflare’s Clef-flash into it (about 11 GB). The wizards then make their decisions, such as which branch to take, on your computer, without a key or credits. On a Mac the Ollama app goes into Applications and, when it first starts, asks once for your Mac’s password to set up its `ollama` command (cancel works too); on Linux Ollama’s own installer runs, installs `zstd` if it is missing, and asks for your password |
35
36
  | Start at login (optional) | engenty wizards starts in the background when you log in, so links and AI apps can always reach it. It is a LaunchAgent on a Mac and a systemd user service on Linux |
36
37
  | Your AI apps (optional) | Offers to add your wizards to the [AI apps](./ai-apps.md) it finds, such as Claude Desktop, Cursor or Codex |
37
38
  | The command | If `~/.local/bin` is not on your PATH, it offers to add it in your shell’s settings file |
@@ -32,7 +32,9 @@ async function askSystemOne(input, signal) {
32
32
  return readSystemOne(input.questions, await res.json());
33
33
  }
34
34
  if (!(RETRYABLE.has(res.status) && attempt < 2)) {
35
- console.warn(`[decide] the decision model answered ${res.status}`);
35
+ const why = (await res.text().catch(() => "")).trim().slice(0, 300);
36
+ access.refused?.(res.status, why);
37
+ console.warn(`[decide] the decision model answered ${res.status}${why ? `: ${why}` : ""}`);
36
38
  return {};
37
39
  }
38
40
  }
@@ -483,7 +483,7 @@ export async function runAgentStep(step, ctx) {
483
483
  }
484
484
  const resolved = await textModel(step.model ?? "high", { ...ctx.call, effort: step.effort });
485
485
  const uploads = await personUploads(ctx);
486
- const { tools, assets, close } = await buildStepTools(step, ctx, resolved, uploads);
486
+ const { tools, assets, instructions, close } = await buildStepTools(step, ctx, resolved, uploads);
487
487
  // A step without tools of its own and without uploads: the run's device may answer it alone.
488
488
  attachTools(resolved, tools, step.tools.length === 0 && uploads.length === 0);
489
489
  try {
@@ -501,6 +501,7 @@ export async function runAgentStep(step, ctx) {
501
501
  const system = [
502
502
  groundRules(ctx),
503
503
  step.tools.includes("browser") ? BROWSER_RULES : "",
504
+ instructions ?? "",
504
505
  `Today is ${today(ctx)}.`,
505
506
  brandBlock(ctx),
506
507
  // Knowledge: what the space holds for its wizards, and how to find and read it.