wizards 0.5.0 → 0.5.2

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 (160) hide show
  1. package/README.md +45 -42
  2. package/apps/runtime/dist/agents/studio-assistant.js +3 -3
  3. package/apps/runtime/dist/app.js +7 -4
  4. package/apps/runtime/dist/auth/index.js +2 -2
  5. package/apps/runtime/dist/authoring/guide.js +1 -1
  6. package/apps/runtime/dist/cli/account.js +31 -28
  7. package/apps/runtime/dist/cli/autostart.js +5 -3
  8. package/apps/runtime/dist/cli/clients.js +1 -1
  9. package/apps/runtime/dist/cli/connect.js +24 -24
  10. package/apps/runtime/dist/cli/features.js +6 -6
  11. package/apps/runtime/dist/cli/main.js +51 -39
  12. package/apps/runtime/dist/cli/mcp.js +5 -4
  13. package/apps/runtime/dist/cli/menu.js +32 -30
  14. package/apps/runtime/dist/cli/report.js +7 -9
  15. package/apps/runtime/dist/cli/setup.js +42 -38
  16. package/apps/runtime/dist/cli/start.js +16 -15
  17. package/apps/runtime/dist/cli/status.js +20 -20
  18. package/apps/runtime/dist/cli/ui.js +9 -2
  19. package/apps/runtime/dist/cli/update.js +6 -6
  20. package/apps/runtime/dist/cli/validate.js +1 -1
  21. package/apps/runtime/dist/connectors/external.js +3 -2
  22. package/apps/runtime/dist/connectors/index.js +5 -5
  23. package/apps/runtime/dist/connectors/plugin-connections.js +2 -2
  24. package/apps/runtime/dist/connectors/via-account.js +5 -5
  25. package/apps/runtime/dist/db/control-schema.js +14 -0
  26. package/apps/runtime/dist/db/migrations/control/0009_plugin_claim.sql +9 -0
  27. package/apps/runtime/dist/db/migrations/control/meta/0009_snapshot.json +561 -0
  28. package/apps/runtime/dist/db/migrations/control/meta/_journal.json +7 -0
  29. package/apps/runtime/dist/docs/dev/index.md +16 -14
  30. package/apps/runtime/dist/docs/dev/plugins/connections.md +27 -24
  31. package/apps/runtime/dist/docs/dev/plugins/events.md +19 -17
  32. package/apps/runtime/dist/docs/dev/plugins/examples.md +13 -12
  33. package/apps/runtime/dist/docs/dev/plugins/index.md +29 -24
  34. package/apps/runtime/dist/docs/dev/plugins/layout.md +20 -19
  35. package/apps/runtime/dist/docs/dev/plugins/quick-start.md +16 -15
  36. package/apps/runtime/dist/docs/dev/plugins/reference.md +52 -40
  37. package/apps/runtime/dist/docs/dev/plugins/reloading.md +24 -23
  38. package/apps/runtime/dist/docs/dev/plugins/routes.md +26 -22
  39. package/apps/runtime/dist/docs/dev/plugins/runners.md +49 -44
  40. package/apps/runtime/dist/docs/dev/plugins/server.md +95 -43
  41. package/apps/runtime/dist/docs/dev/plugins/shipping.md +19 -16
  42. package/apps/runtime/dist/docs/dev/plugins/space.md +75 -69
  43. package/apps/runtime/dist/docs/dev/plugins/starters.md +22 -17
  44. package/apps/runtime/dist/docs/dev/plugins/studio.md +80 -37
  45. package/apps/runtime/dist/docs/dev/plugins/styling.md +44 -41
  46. package/apps/runtime/dist/docs/dev/plugins/tables.md +11 -11
  47. package/apps/runtime/dist/docs/dev/plugins/tools.md +26 -25
  48. package/apps/runtime/dist/docs/dev/wizard-format.md +35 -23
  49. package/apps/runtime/dist/docs/user/ai-apps.md +46 -43
  50. package/apps/runtime/dist/docs/user/assistant.md +41 -36
  51. package/apps/runtime/dist/docs/user/build-a-wizard.md +64 -39
  52. package/apps/runtime/dist/docs/user/command-line.md +47 -44
  53. package/apps/runtime/dist/docs/user/connectors.md +40 -35
  54. package/apps/runtime/dist/docs/user/create-account.md +27 -22
  55. package/apps/runtime/dist/docs/user/data.md +29 -29
  56. package/apps/runtime/dist/docs/user/first-start.md +26 -28
  57. package/apps/runtime/dist/docs/user/index.md +16 -17
  58. package/apps/runtime/dist/docs/user/install.md +28 -27
  59. package/apps/runtime/dist/docs/user/local-only.md +21 -17
  60. package/apps/runtime/dist/docs/user/models.md +92 -84
  61. package/apps/runtime/dist/docs/user/plugins.md +28 -23
  62. package/apps/runtime/dist/docs/user/run.md +51 -50
  63. package/apps/runtime/dist/docs/user/server.md +9 -9
  64. package/apps/runtime/dist/docs/user/space.md +87 -65
  65. package/apps/runtime/dist/docs/user/steps.md +73 -69
  66. package/apps/runtime/dist/docs/user/test-and-share.md +127 -105
  67. package/apps/runtime/dist/docs/user/troubleshooting.md +40 -38
  68. package/apps/runtime/dist/docs/user/wordpress.md +62 -54
  69. package/apps/runtime/dist/documents/parse.js +2 -2
  70. package/apps/runtime/dist/engenty/shims/web-ingest.js +17 -1
  71. package/apps/runtime/dist/engine/input.js +4 -4
  72. package/apps/runtime/dist/engine/push.js +2 -2
  73. package/apps/runtime/dist/engine/runner.js +8 -8
  74. package/apps/runtime/dist/engine/steps.js +2 -2
  75. package/apps/runtime/dist/engine/surface.js +1 -1
  76. package/apps/runtime/dist/film/step.js +3 -3
  77. package/apps/runtime/dist/harness/claude.js +1 -1
  78. package/apps/runtime/dist/harness/codex.js +1 -1
  79. package/apps/runtime/dist/harness/model.js +2 -2
  80. package/apps/runtime/dist/harness/terminal.js +3 -3
  81. package/apps/runtime/dist/mcp/handler.js +2 -2
  82. package/apps/runtime/dist/mcp/tools.js +9 -9
  83. package/apps/runtime/dist/models.js +15 -15
  84. package/apps/runtime/dist/plugins/claims.js +56 -0
  85. package/apps/runtime/dist/plugins/loader.js +2 -0
  86. package/apps/runtime/dist/plugins/public.js +2 -3
  87. package/apps/runtime/dist/plugins/runs.js +13 -8
  88. package/apps/runtime/dist/render/chromium.js +24 -11
  89. package/apps/runtime/dist/routes/api.js +15 -9
  90. package/apps/runtime/dist/routes/debug.js +1 -1
  91. package/apps/runtime/dist/routes/delivery.js +46 -0
  92. package/apps/runtime/dist/routes/lang.js +7 -0
  93. package/apps/runtime/dist/routes/marketplace.js +2 -1
  94. package/apps/runtime/dist/routes/plugin-public.js +2 -1
  95. package/apps/runtime/dist/routes/plugins.js +13 -14
  96. package/apps/runtime/dist/routes/runs.js +59 -49
  97. package/apps/runtime/dist/routes/studio.js +53 -23
  98. package/apps/runtime/dist/services/access.js +3 -3
  99. package/apps/runtime/dist/services/assistant-chats.js +1 -1
  100. package/apps/runtime/dist/services/brand.js +2 -2
  101. package/apps/runtime/dist/services/cloud.js +5 -4
  102. package/apps/runtime/dist/services/errors.js +2 -1
  103. package/apps/runtime/dist/services/knowledge-model.js +2 -2
  104. package/apps/runtime/dist/services/marketplace.js +2 -2
  105. package/apps/runtime/dist/services/package-file.js +12 -9
  106. package/apps/runtime/dist/services/package.js +2 -2
  107. package/apps/runtime/dist/services/project-files.js +10 -12
  108. package/apps/runtime/dist/services/projects.js +13 -8
  109. package/apps/runtime/dist/services/runners.js +4 -3
  110. package/apps/runtime/dist/services/runs.js +3 -3
  111. package/apps/runtime/dist/services/site.js +2 -2
  112. package/apps/runtime/dist/services/space-categories.js +4 -4
  113. package/apps/runtime/dist/services/space-data.js +13 -13
  114. package/apps/runtime/dist/services/space-origin.js +1 -1
  115. package/apps/runtime/dist/services/spaces.js +7 -7
  116. package/apps/runtime/dist/services/wizards.js +5 -5
  117. package/apps/runtime/dist/tools/net-guard.js +135 -24
  118. package/apps/runtime/dist/tools/plugin.js +1 -1
  119. package/apps/runtime/dist/tools/store.js +1 -1
  120. package/apps/runtime/dist/widgets/step.js +1 -1
  121. package/apps/web/dist/assets/AboutDialog-hRgrS60N.js +1 -0
  122. package/apps/web/dist/assets/{ChangelogDialog-BXpkgatF.js → ChangelogDialog-BUSpLhC6.js} +1 -1
  123. package/apps/web/dist/assets/{ChatView-t7z44uFN.js → ChatView-DO7P5Vv_.js} +1 -1
  124. package/apps/web/dist/assets/EditorPage-BabV35Bj.js +3 -0
  125. package/apps/web/dist/assets/{FlowPreview-WpS8DCPl.js → FlowPreview-CKrwLPN0.js} +1 -1
  126. package/apps/web/dist/assets/{Harness-DL7Bse40.js → Harness-o8IIQXZp.js} +1 -1
  127. package/apps/web/dist/assets/{NewWizardChannels-Crt6PzH2.js → NewWizardChannels-DqU79Myj.js} +1 -1
  128. package/apps/web/dist/assets/{NewWizardPage-COiVmNsl.js → NewWizardPage-D1UCvmDp.js} +1 -1
  129. package/apps/web/dist/assets/{OnboardingPage-BwluEqXq.js → OnboardingPage-C70bqPnq.js} +1 -1
  130. package/apps/web/dist/assets/{ProjectPage-BIRU_AlN.js → ProjectPage-BOLvmQWZ.js} +1 -1
  131. package/apps/web/dist/assets/{PublicRunner-BxMb4gEt.js → PublicRunner-B0PGyHI9.js} +1 -1
  132. package/apps/web/dist/assets/{ReadOnly-D9r5ze5S.js → ReadOnly-B0mJBD1q.js} +1 -1
  133. package/apps/web/dist/assets/{RunDrawer-DmJl2QOJ.js → RunDrawer-BsnsIJ0Y.js} +1 -1
  134. package/apps/web/dist/assets/{RunnerView-CF_1rC-7.js → RunnerView-B56i3nKO.js} +1 -1
  135. package/apps/web/dist/assets/SettingsPage-BvfRUqb2.js +1 -0
  136. package/apps/web/dist/assets/{SetupPage-BGKtbS7j.js → SetupPage-BvAFPu1J.js} +1 -1
  137. package/apps/web/dist/assets/{SharePage-C4MqXKDA.js → SharePage-hV5pYrO2.js} +1 -1
  138. package/apps/web/dist/assets/changelog-BftXQzUA.js +1 -0
  139. package/apps/web/dist/assets/{esm-CsY8TkyE.js → esm-DfapVSy6.js} +1 -1
  140. package/apps/web/dist/assets/{index-BjQvGQp_.js → index-BuFrRzvG.js} +4 -4
  141. package/apps/web/dist/assets/{index-Bi2x2g7n.css → index-DSbQiZY8.css} +1 -1
  142. package/apps/web/dist/assets/{lock-CI6TpWL-.js → lock-B-tJwE4p.js} +1 -1
  143. package/apps/web/dist/assets/oss-credits-BJrR7BR1.js +1 -0
  144. package/apps/web/dist/assets/{phone-BrtQz-fG.js → phone-DRHxY0l_.js} +1 -1
  145. package/apps/web/dist/assets/{settings-menu-BtEKL72n.js → settings-menu-OPrJTW8a.js} +1 -1
  146. package/apps/web/dist/assets/{ui-4IaTD7LB.js → ui-DftgEA2k.js} +3 -3
  147. package/apps/web/dist/assets/{upload-CWJAtPRo.js → upload-B73coFNw.js} +1 -1
  148. package/apps/web/dist/index.html +3 -3
  149. package/apps/web/dist/mcp/flow.html +4 -4
  150. package/bin/wizards.mjs +1 -1
  151. package/node_modules/@engenty-wizards/plugin-sdk/dist/index.d.ts +21 -2
  152. package/node_modules/@engenty-wizards/shared/dist/projects.js +1 -1
  153. package/node_modules/@engenty-wizards/shared/dist/run.d.ts +48 -48
  154. package/node_modules/@engenty-wizards/shared/dist/run.js +48 -48
  155. package/package.json +5 -4
  156. package/apps/web/dist/assets/AboutDialog-A_ILyeue.js +0 -1
  157. package/apps/web/dist/assets/EditorPage-4qxNJgKr.js +0 -3
  158. package/apps/web/dist/assets/SettingsPage-3xSInE-A.js +0 -1
  159. package/apps/web/dist/assets/changelog-CM_GdIVI.js +0 -1
  160. package/apps/web/dist/assets/oss-credits-BQQX0kvk.js +0 -1
@@ -26,7 +26,7 @@ export async function googleThroughAccount() {
26
26
  async function call(path, body) {
27
27
  const token = await accountToken();
28
28
  if (!token) {
29
- throw new AccountConnectError(bilingual("Verbinde zuerst dein engenty-Konto (Einstellungen → Konto), dann lässt sich Google hier verbinden.", "Connect your engenty account first (Settings → Account); then Google can be connected here."));
29
+ throw new AccountConnectError(bilingual("Verbinde zuerst dein engenty-Konto (Einstellungen → Konto). Dann kannst du Google hier verbinden.", "Connect your engenty account first (Settings → Account). Then you can connect Google here."));
30
30
  }
31
31
  const res = await fetch(`${base()}${path}`, {
32
32
  method: "POST",
@@ -35,15 +35,15 @@ async function call(path, body) {
35
35
  signal: AbortSignal.timeout(20_000),
36
36
  }).catch(() => null);
37
37
  if (!res) {
38
- throw new AccountConnectError(bilingual("Dein engenty-Konto ist gerade nicht erreichbar. Bitte später noch einmal.", "Your engenty account cannot be reached right now. Please try again later."));
38
+ throw new AccountConnectError(bilingual("Dein engenty-Konto ist gerade nicht erreichbar. Versuch es später noch einmal.", "Your engenty account can’t be reached right now. Try again later."));
39
39
  }
40
40
  const data = (await res.json().catch(() => ({})));
41
41
  if (!res.ok) {
42
42
  throw new AccountConnectError(data.code === "invalid_grant"
43
- ? bilingual("Google nimmt diese Verbindung nicht mehr an. Bitte das Konto neu verbinden.", "Google no longer accepts this connection. Please connect the account again.")
43
+ ? bilingual("Google nimmt diese Verbindung nicht mehr an. Verbinde das Konto neu.", "Google no longer accepts this connection. Connect the account again.")
44
44
  : data.code === "not_configured"
45
- ? bilingual("Google lässt sich über dein engenty-Konto gerade nicht verbinden.", "Google cannot be connected through your engenty account right now.")
46
- : bilingual(`Verbinden über dein engenty-Konto hat nicht geklappt (${data.code ?? res.status}).`, `Connecting through your engenty account did not work (${data.code ?? res.status}).`));
45
+ ? bilingual("Google lässt sich über dein engenty-Konto gerade nicht verbinden.", "Google can’t be connected through your engenty account right now.")
46
+ : bilingual(`Verbinden über dein engenty-Konto hat nicht geklappt (${data.code ?? res.status}).`, `Connecting through your engenty account didn’t work (${data.code ?? res.status}).`));
47
47
  }
48
48
  return data;
49
49
  }
@@ -107,3 +107,17 @@ export const pluginAddress = sqliteTable("plugin_address", {
107
107
  plugin: text("plugin").notNull(),
108
108
  createdAt: createdAt(),
109
109
  }, (t) => [uniqueIndex("plugin_address_tenant").on(t.tenantId, t.plugin)]);
110
+ /**
111
+ * Keys a plugin holds across tenants (`server.claims`), each for one tenant at a time: a keyword
112
+ * on a number every tenant shares, who writes to it, a number a tenant connected. What a shared
113
+ * route asks to find the tenant of a call.
114
+ */
115
+ export const pluginClaim = sqliteTable("plugin_claim", {
116
+ plugin: text("plugin").notNull(),
117
+ key: text("key").notNull(),
118
+ tenantId: text("tenant_id").notNull(),
119
+ updatedAt: integer("updated_at", { mode: "timestamp_ms" }).notNull().default(now),
120
+ }, (t) => [
121
+ primaryKey({ columns: [t.plugin, t.key] }),
122
+ index("plugin_claim_tenant").on(t.tenantId, t.plugin),
123
+ ]);
@@ -0,0 +1,9 @@
1
+ CREATE TABLE `plugin_claim` (
2
+ `plugin` text NOT NULL,
3
+ `key` text NOT NULL,
4
+ `tenant_id` text NOT NULL,
5
+ `updated_at` integer DEFAULT (unixepoch() * 1000) NOT NULL,
6
+ PRIMARY KEY(`plugin`, `key`)
7
+ );
8
+ --> statement-breakpoint
9
+ CREATE INDEX `plugin_claim_tenant` ON `plugin_claim` (`tenant_id`,`plugin`);
@@ -0,0 +1,561 @@
1
+ {
2
+ "version": "6",
3
+ "dialect": "sqlite",
4
+ "id": "9991e82d-196a-4a7b-9c90-df39a12f3aa2",
5
+ "prevId": "47fe3107-ea98-40f9-878c-9b504bc89e9a",
6
+ "tables": {
7
+ "link": {
8
+ "name": "link",
9
+ "columns": {
10
+ "token": {
11
+ "name": "token",
12
+ "type": "text",
13
+ "primaryKey": true,
14
+ "notNull": true,
15
+ "autoincrement": false
16
+ },
17
+ "tenant_id": {
18
+ "name": "tenant_id",
19
+ "type": "text",
20
+ "primaryKey": false,
21
+ "notNull": true,
22
+ "autoincrement": false
23
+ },
24
+ "kind": {
25
+ "name": "kind",
26
+ "type": "text",
27
+ "primaryKey": false,
28
+ "notNull": true,
29
+ "autoincrement": false
30
+ },
31
+ "ref": {
32
+ "name": "ref",
33
+ "type": "text",
34
+ "primaryKey": false,
35
+ "notNull": true,
36
+ "autoincrement": false
37
+ },
38
+ "created_at": {
39
+ "name": "created_at",
40
+ "type": "integer",
41
+ "primaryKey": false,
42
+ "notNull": true,
43
+ "autoincrement": false,
44
+ "default": "(unixepoch() * 1000)"
45
+ }
46
+ },
47
+ "indexes": {
48
+ "link_tenant": {
49
+ "name": "link_tenant",
50
+ "columns": [
51
+ "tenant_id"
52
+ ],
53
+ "isUnique": false
54
+ },
55
+ "link_ref": {
56
+ "name": "link_ref",
57
+ "columns": [
58
+ "kind",
59
+ "ref"
60
+ ],
61
+ "isUnique": false
62
+ }
63
+ },
64
+ "foreignKeys": {},
65
+ "compositePrimaryKeys": {},
66
+ "uniqueConstraints": {},
67
+ "checkConstraints": {}
68
+ },
69
+ "marketplace_cache": {
70
+ "name": "marketplace_cache",
71
+ "columns": {
72
+ "id": {
73
+ "name": "id",
74
+ "type": "text",
75
+ "primaryKey": true,
76
+ "notNull": true,
77
+ "autoincrement": false
78
+ },
79
+ "hash": {
80
+ "name": "hash",
81
+ "type": "text",
82
+ "primaryKey": false,
83
+ "notNull": true,
84
+ "autoincrement": false
85
+ },
86
+ "entry": {
87
+ "name": "entry",
88
+ "type": "text",
89
+ "primaryKey": false,
90
+ "notNull": true,
91
+ "autoincrement": false
92
+ },
93
+ "fetched_at": {
94
+ "name": "fetched_at",
95
+ "type": "integer",
96
+ "primaryKey": false,
97
+ "notNull": true,
98
+ "autoincrement": false,
99
+ "default": "(unixepoch() * 1000)"
100
+ }
101
+ },
102
+ "indexes": {},
103
+ "foreignKeys": {},
104
+ "compositePrimaryKeys": {},
105
+ "uniqueConstraints": {},
106
+ "checkConstraints": {}
107
+ },
108
+ "plugin_address": {
109
+ "name": "plugin_address",
110
+ "columns": {
111
+ "ref": {
112
+ "name": "ref",
113
+ "type": "text",
114
+ "primaryKey": true,
115
+ "notNull": true,
116
+ "autoincrement": false
117
+ },
118
+ "tenant_id": {
119
+ "name": "tenant_id",
120
+ "type": "text",
121
+ "primaryKey": false,
122
+ "notNull": true,
123
+ "autoincrement": false
124
+ },
125
+ "plugin": {
126
+ "name": "plugin",
127
+ "type": "text",
128
+ "primaryKey": false,
129
+ "notNull": true,
130
+ "autoincrement": false
131
+ },
132
+ "created_at": {
133
+ "name": "created_at",
134
+ "type": "integer",
135
+ "primaryKey": false,
136
+ "notNull": true,
137
+ "autoincrement": false,
138
+ "default": "(unixepoch() * 1000)"
139
+ }
140
+ },
141
+ "indexes": {
142
+ "plugin_address_tenant": {
143
+ "name": "plugin_address_tenant",
144
+ "columns": [
145
+ "tenant_id",
146
+ "plugin"
147
+ ],
148
+ "isUnique": true
149
+ }
150
+ },
151
+ "foreignKeys": {},
152
+ "compositePrimaryKeys": {},
153
+ "uniqueConstraints": {},
154
+ "checkConstraints": {}
155
+ },
156
+ "plugin_claim": {
157
+ "name": "plugin_claim",
158
+ "columns": {
159
+ "plugin": {
160
+ "name": "plugin",
161
+ "type": "text",
162
+ "primaryKey": false,
163
+ "notNull": true,
164
+ "autoincrement": false
165
+ },
166
+ "key": {
167
+ "name": "key",
168
+ "type": "text",
169
+ "primaryKey": false,
170
+ "notNull": true,
171
+ "autoincrement": false
172
+ },
173
+ "tenant_id": {
174
+ "name": "tenant_id",
175
+ "type": "text",
176
+ "primaryKey": false,
177
+ "notNull": true,
178
+ "autoincrement": false
179
+ },
180
+ "updated_at": {
181
+ "name": "updated_at",
182
+ "type": "integer",
183
+ "primaryKey": false,
184
+ "notNull": true,
185
+ "autoincrement": false,
186
+ "default": "(unixepoch() * 1000)"
187
+ }
188
+ },
189
+ "indexes": {
190
+ "plugin_claim_tenant": {
191
+ "name": "plugin_claim_tenant",
192
+ "columns": [
193
+ "tenant_id",
194
+ "plugin"
195
+ ],
196
+ "isUnique": false
197
+ }
198
+ },
199
+ "foreignKeys": {},
200
+ "compositePrimaryKeys": {
201
+ "plugin_claim_plugin_key_pk": {
202
+ "columns": [
203
+ "plugin",
204
+ "key"
205
+ ],
206
+ "name": "plugin_claim_plugin_key_pk"
207
+ }
208
+ },
209
+ "uniqueConstraints": {},
210
+ "checkConstraints": {}
211
+ },
212
+ "plugin_job": {
213
+ "name": "plugin_job",
214
+ "columns": {
215
+ "tenant_id": {
216
+ "name": "tenant_id",
217
+ "type": "text",
218
+ "primaryKey": false,
219
+ "notNull": true,
220
+ "autoincrement": false
221
+ },
222
+ "plugin": {
223
+ "name": "plugin",
224
+ "type": "text",
225
+ "primaryKey": false,
226
+ "notNull": true,
227
+ "autoincrement": false
228
+ },
229
+ "name": {
230
+ "name": "name",
231
+ "type": "text",
232
+ "primaryKey": false,
233
+ "notNull": true,
234
+ "autoincrement": false
235
+ },
236
+ "last_run_at": {
237
+ "name": "last_run_at",
238
+ "type": "integer",
239
+ "primaryKey": false,
240
+ "notNull": true,
241
+ "autoincrement": false
242
+ }
243
+ },
244
+ "indexes": {},
245
+ "foreignKeys": {},
246
+ "compositePrimaryKeys": {
247
+ "plugin_job_tenant_id_plugin_name_pk": {
248
+ "columns": [
249
+ "tenant_id",
250
+ "plugin",
251
+ "name"
252
+ ],
253
+ "name": "plugin_job_tenant_id_plugin_name_pk"
254
+ }
255
+ },
256
+ "uniqueConstraints": {},
257
+ "checkConstraints": {}
258
+ },
259
+ "run_index": {
260
+ "name": "run_index",
261
+ "columns": {
262
+ "run_id": {
263
+ "name": "run_id",
264
+ "type": "text",
265
+ "primaryKey": true,
266
+ "notNull": true,
267
+ "autoincrement": false
268
+ },
269
+ "tenant_id": {
270
+ "name": "tenant_id",
271
+ "type": "text",
272
+ "primaryKey": false,
273
+ "notNull": true,
274
+ "autoincrement": false
275
+ },
276
+ "visitor_id": {
277
+ "name": "visitor_id",
278
+ "type": "text",
279
+ "primaryKey": false,
280
+ "notNull": false,
281
+ "autoincrement": false
282
+ },
283
+ "ip_hash": {
284
+ "name": "ip_hash",
285
+ "type": "text",
286
+ "primaryKey": false,
287
+ "notNull": false,
288
+ "autoincrement": false
289
+ },
290
+ "active": {
291
+ "name": "active",
292
+ "type": "integer",
293
+ "primaryKey": false,
294
+ "notNull": true,
295
+ "autoincrement": false,
296
+ "default": false
297
+ },
298
+ "owner": {
299
+ "name": "owner",
300
+ "type": "text",
301
+ "primaryKey": false,
302
+ "notNull": false,
303
+ "autoincrement": false
304
+ },
305
+ "seen": {
306
+ "name": "seen",
307
+ "type": "integer",
308
+ "primaryKey": false,
309
+ "notNull": false,
310
+ "autoincrement": false
311
+ },
312
+ "push": {
313
+ "name": "push",
314
+ "type": "text",
315
+ "primaryKey": false,
316
+ "notNull": false,
317
+ "autoincrement": false
318
+ },
319
+ "created_at": {
320
+ "name": "created_at",
321
+ "type": "integer",
322
+ "primaryKey": false,
323
+ "notNull": true,
324
+ "autoincrement": false,
325
+ "default": "(unixepoch() * 1000)"
326
+ }
327
+ },
328
+ "indexes": {
329
+ "run_index_visitor": {
330
+ "name": "run_index_visitor",
331
+ "columns": [
332
+ "visitor_id",
333
+ "created_at"
334
+ ],
335
+ "isUnique": false
336
+ },
337
+ "run_index_ip": {
338
+ "name": "run_index_ip",
339
+ "columns": [
340
+ "ip_hash",
341
+ "created_at"
342
+ ],
343
+ "isUnique": false
344
+ },
345
+ "run_index_active": {
346
+ "name": "run_index_active",
347
+ "columns": [
348
+ "active",
349
+ "tenant_id"
350
+ ],
351
+ "isUnique": false
352
+ }
353
+ },
354
+ "foreignKeys": {},
355
+ "compositePrimaryKeys": {},
356
+ "uniqueConstraints": {},
357
+ "checkConstraints": {}
358
+ },
359
+ "runner": {
360
+ "name": "runner",
361
+ "columns": {
362
+ "id": {
363
+ "name": "id",
364
+ "type": "text",
365
+ "primaryKey": true,
366
+ "notNull": true,
367
+ "autoincrement": false
368
+ },
369
+ "url": {
370
+ "name": "url",
371
+ "type": "text",
372
+ "primaryKey": false,
373
+ "notNull": false,
374
+ "autoincrement": false
375
+ },
376
+ "seen": {
377
+ "name": "seen",
378
+ "type": "integer",
379
+ "primaryKey": false,
380
+ "notNull": true,
381
+ "autoincrement": false
382
+ }
383
+ },
384
+ "indexes": {},
385
+ "foreignKeys": {},
386
+ "compositePrimaryKeys": {},
387
+ "uniqueConstraints": {},
388
+ "checkConstraints": {}
389
+ },
390
+ "session": {
391
+ "name": "session",
392
+ "columns": {
393
+ "id": {
394
+ "name": "id",
395
+ "type": "text",
396
+ "primaryKey": true,
397
+ "notNull": true,
398
+ "autoincrement": false
399
+ },
400
+ "user_id": {
401
+ "name": "user_id",
402
+ "type": "text",
403
+ "primaryKey": false,
404
+ "notNull": true,
405
+ "autoincrement": false
406
+ },
407
+ "tenant_id": {
408
+ "name": "tenant_id",
409
+ "type": "text",
410
+ "primaryKey": false,
411
+ "notNull": true,
412
+ "autoincrement": false
413
+ },
414
+ "role": {
415
+ "name": "role",
416
+ "type": "text",
417
+ "primaryKey": false,
418
+ "notNull": true,
419
+ "autoincrement": false
420
+ },
421
+ "name": {
422
+ "name": "name",
423
+ "type": "text",
424
+ "primaryKey": false,
425
+ "notNull": true,
426
+ "autoincrement": false
427
+ },
428
+ "email": {
429
+ "name": "email",
430
+ "type": "text",
431
+ "primaryKey": false,
432
+ "notNull": true,
433
+ "autoincrement": false
434
+ },
435
+ "image": {
436
+ "name": "image",
437
+ "type": "text",
438
+ "primaryKey": false,
439
+ "notNull": false,
440
+ "autoincrement": false
441
+ },
442
+ "refresh_token": {
443
+ "name": "refresh_token",
444
+ "type": "text",
445
+ "primaryKey": false,
446
+ "notNull": false,
447
+ "autoincrement": false
448
+ },
449
+ "claims_expire_at": {
450
+ "name": "claims_expire_at",
451
+ "type": "integer",
452
+ "primaryKey": false,
453
+ "notNull": true,
454
+ "autoincrement": false
455
+ },
456
+ "expires_at": {
457
+ "name": "expires_at",
458
+ "type": "integer",
459
+ "primaryKey": false,
460
+ "notNull": true,
461
+ "autoincrement": false
462
+ },
463
+ "created_at": {
464
+ "name": "created_at",
465
+ "type": "integer",
466
+ "primaryKey": false,
467
+ "notNull": true,
468
+ "autoincrement": false,
469
+ "default": "(unixepoch() * 1000)"
470
+ }
471
+ },
472
+ "indexes": {
473
+ "session_expires": {
474
+ "name": "session_expires",
475
+ "columns": [
476
+ "expires_at"
477
+ ],
478
+ "isUnique": false
479
+ }
480
+ },
481
+ "foreignKeys": {},
482
+ "compositePrimaryKeys": {},
483
+ "uniqueConstraints": {},
484
+ "checkConstraints": {}
485
+ },
486
+ "setting": {
487
+ "name": "setting",
488
+ "columns": {
489
+ "key": {
490
+ "name": "key",
491
+ "type": "text",
492
+ "primaryKey": true,
493
+ "notNull": true,
494
+ "autoincrement": false
495
+ },
496
+ "value": {
497
+ "name": "value",
498
+ "type": "text",
499
+ "primaryKey": false,
500
+ "notNull": true,
501
+ "autoincrement": false
502
+ }
503
+ },
504
+ "indexes": {},
505
+ "foreignKeys": {},
506
+ "compositePrimaryKeys": {},
507
+ "uniqueConstraints": {},
508
+ "checkConstraints": {}
509
+ },
510
+ "tenant": {
511
+ "name": "tenant",
512
+ "columns": {
513
+ "id": {
514
+ "name": "id",
515
+ "type": "text",
516
+ "primaryKey": true,
517
+ "notNull": true,
518
+ "autoincrement": false
519
+ },
520
+ "status": {
521
+ "name": "status",
522
+ "type": "text",
523
+ "primaryKey": false,
524
+ "notNull": true,
525
+ "autoincrement": false,
526
+ "default": "'active'"
527
+ },
528
+ "db_url": {
529
+ "name": "db_url",
530
+ "type": "text",
531
+ "primaryKey": false,
532
+ "notNull": false,
533
+ "autoincrement": false
534
+ },
535
+ "created_at": {
536
+ "name": "created_at",
537
+ "type": "integer",
538
+ "primaryKey": false,
539
+ "notNull": true,
540
+ "autoincrement": false,
541
+ "default": "(unixepoch() * 1000)"
542
+ }
543
+ },
544
+ "indexes": {},
545
+ "foreignKeys": {},
546
+ "compositePrimaryKeys": {},
547
+ "uniqueConstraints": {},
548
+ "checkConstraints": {}
549
+ }
550
+ },
551
+ "views": {},
552
+ "enums": {},
553
+ "_meta": {
554
+ "schemas": {},
555
+ "tables": {},
556
+ "columns": {}
557
+ },
558
+ "internal": {
559
+ "indexes": {}
560
+ }
561
+ }
@@ -64,6 +64,13 @@
64
64
  "when": 1791752213925,
65
65
  "tag": "0008_runner",
66
66
  "breakpoints": true
67
+ },
68
+ {
69
+ "idx": 9,
70
+ "version": "6",
71
+ "when": 1791988069253,
72
+ "tag": "0009_plugin_claim",
73
+ "breakpoints": true
67
74
  }
68
75
  ]
69
76
  }
@@ -1,39 +1,41 @@
1
1
  ---
2
2
  title: Developer
3
- description: Extend engenty wizards with plugins — tools for AI steps, routes with their own tables, pages in the studio.
4
- version: 0.3.2
3
+ description: Extend engenty wizards with plugins – tools for AI steps, routes with their own tables, pages in the studio.
4
+ version: 0.5.0
5
5
  ---
6
6
 
7
- engenty wizards is extended with **plugins**. A plugin adds to a runtime without changing its
8
- code, and it loads from its files while the app runs.
7
+ You extend engenty wizards with **plugins**. A plugin adds to a runtime without changing its
8
+ code, and the runtime loads it from its files while it runs.
9
9
 
10
10
  ## Start here
11
11
 
12
12
  | | |
13
13
  |---|---|
14
- | [What a plugin is](./plugins/index.md) | The two halves, what each can add, what a plugin may touch |
15
- | [Quick start](./plugins/quick-start.md) | A tool for AI steps in one file, working in two minutes |
14
+ | [What a plugin is](./plugins/index.md) | The two halves, what each can add and what a plugin may touch |
15
+ | [Quick start](./plugins/quick-start.md) | A tool for AI steps in one file that works in two minutes |
16
16
  | [Reference](./plugins/reference.md) | Every call, type, address and setting |
17
17
  | [Examples](./plugins/examples.md) | Two plugins to read and copy |
18
18
 
19
19
  ## Wizards as files
20
20
 
21
- A wizard is JSON, and it travels as a `.wizard` package. Its format, the JSON Schema for your
22
- editor and `wizards validate` are on [The wizard format](./wizard-format.md).
21
+ A wizard is JSON, and it travels as a `.wizard` file. [The wizard format](./wizard-format.md)
22
+ describes the format, the JSON Schema for your editor and `wizards validate`.
23
23
 
24
24
  ## What you need
25
25
 
26
- - An install of engenty wizards, or a checkout of
26
+ - engenty wizards on your computer, or a checkout of
27
27
  [engenty/wizards](https://github.com/engenty/wizards).
28
- - TypeScript. A plugin's server half is read as TypeScript, without a build.
29
- - A checkout, if your plugin draws in the studio: its studio half is built with the studio's
28
+ - TypeScript. The runtime reads a plugin’s server half as TypeScript, without a build.
29
+ - A checkout, if your plugin draws in the studio: you build its studio half with the studio’s
30
30
  own tools.
31
31
 
32
32
  ## Working on engenty wizards itself
33
33
 
34
- These pages are about extending it. The code's own documents are in the repository:
34
+ These pages are about extending engenty wizards. The documents about its own code are in the
35
+ repository:
35
36
 
36
37
  | | |
37
38
  |---|---|
38
- | [docs/development.md](https://github.com/engenty/wizards/blob/main/docs/development.md) | Run it from source, the checks, how it is built, releases |
39
- | [docs/marketplace-contract.md](https://github.com/engenty/wizards/blob/main/docs/marketplace-contract.md) | What a runtime and the marketplace speak |
39
+ | [docs/development.md](https://github.com/engenty/wizards/blob/main/docs/development.md) | How to run it from source, the checks, how it is built and how it is released |
40
+ | [docs/marketplace-contract.md](https://github.com/engenty/wizards/blob/main/docs/marketplace-contract.md) | What a runtime and the marketplace say to each other |
41
+ | [docs/copy-style.md](https://github.com/engenty/wizards/blob/main/docs/copy-style.md) | How the app talks to people: the voice, the glossary and the rules for every string |