@engenty/wizards-runtime 0.7.11 → 0.9.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/README.md +5 -1
- package/apps/runtime/dist/agents/architect.js +2 -2
- package/apps/runtime/dist/agents/studio-assistant.js +1 -1
- package/apps/runtime/dist/agents/website.js +1 -1
- package/apps/runtime/dist/app.js +1 -1
- package/apps/runtime/dist/assistant/browser.js +1 -1
- package/apps/runtime/dist/authoring/guide.js +16 -4
- package/apps/runtime/dist/authoring/ops.js +1 -1
- package/apps/runtime/dist/cli/exec.js +4 -1
- package/apps/runtime/dist/cli/features.js +1 -1
- package/apps/runtime/dist/cli/validate.js +2 -2
- package/apps/runtime/dist/connectors/builtin.js +4 -2
- package/apps/runtime/dist/connectors/external.js +1 -1
- package/apps/runtime/dist/connectors/index.js +37 -6
- package/apps/runtime/dist/connectors/smtp.js +221 -0
- package/apps/runtime/dist/connectors/via-account.js +1 -1
- package/apps/runtime/dist/credits/estimate.js +1 -1
- package/apps/runtime/dist/db/migrations/tenant/0018_share_job.sql +18 -0
- package/apps/runtime/dist/db/migrations/tenant/meta/0018_snapshot.json +3460 -0
- package/apps/runtime/dist/db/migrations/tenant/meta/_journal.json +7 -0
- package/apps/runtime/dist/db/schema.js +19 -0
- package/apps/runtime/dist/docs/dev/index.md +25 -13
- package/apps/runtime/dist/docs/dev/integration/index.md +1 -1
- package/apps/runtime/dist/docs/dev/integration/openui.md +1 -1
- package/apps/runtime/dist/docs/dev/integration/own-ui.md +2 -2
- package/apps/runtime/dist/docs/dev/meta.json +8 -2
- package/apps/runtime/dist/docs/dev/plugins/examples.md +2 -3
- package/apps/runtime/dist/docs/dev/plugins/studio.md +5 -6
- package/apps/runtime/dist/docs/dev/plugins/styling.md +10 -7
- package/apps/runtime/dist/docs/dev/wizard-format/agent-steps.md +112 -0
- package/apps/runtime/dist/docs/dev/wizard-format/branches.md +63 -0
- package/apps/runtime/dist/docs/dev/wizard-format/film-steps.md +47 -0
- package/apps/runtime/dist/docs/dev/wizard-format/generate-steps.md +57 -0
- package/apps/runtime/dist/docs/dev/wizard-format/index.md +188 -0
- package/apps/runtime/dist/docs/dev/wizard-format/lists-and-connections.md +65 -0
- package/apps/runtime/dist/docs/dev/wizard-format/meta.json +19 -0
- package/apps/runtime/dist/docs/dev/wizard-format/pages-and-fields.md +102 -0
- package/apps/runtime/dist/docs/dev/wizard-format/review-and-result.md +64 -0
- package/apps/runtime/dist/docs/dev/wizard-format/templates.md +57 -0
- package/apps/runtime/dist/docs/dev/wizard-format/validate.md +63 -0
- package/apps/runtime/dist/docs/dev/wizard-format/views-and-widgets.md +103 -0
- package/apps/runtime/dist/docs/dev/wizard-format/wizard-file.md +147 -0
- package/apps/runtime/dist/docs/user/build-a-wizard.md +2 -2
- package/apps/runtime/dist/docs/user/run.md +21 -4
- package/apps/runtime/dist/docs/user/space.md +14 -10
- package/apps/runtime/dist/docs/user/steps.md +26 -1
- package/apps/runtime/dist/docs/user/test-and-share.md +3 -2
- package/apps/runtime/dist/documents/parse.js +1 -1
- package/apps/runtime/dist/engine/decide.js +1 -1
- package/apps/runtime/dist/engine/events.js +1 -1
- package/apps/runtime/dist/engine/input.js +3 -3
- package/apps/runtime/dist/engine/prepare.js +1 -1
- package/apps/runtime/dist/engine/requirements.js +25 -10
- package/apps/runtime/dist/engine/runner.js +23 -14
- package/apps/runtime/dist/engine/steps.js +6 -6
- package/apps/runtime/dist/engine/surface.js +3 -3
- package/apps/runtime/dist/engine/template.js +4 -4
- package/apps/runtime/dist/env.js +5 -0
- package/apps/runtime/dist/features.js +1 -1
- package/apps/runtime/dist/film/project.js +2 -2
- package/apps/runtime/dist/film/step.js +2 -2
- package/apps/runtime/dist/harness/antigravity.js +2 -10
- package/apps/runtime/dist/harness/apple.js +1 -1
- package/apps/runtime/dist/harness/claude.js +3 -11
- package/apps/runtime/dist/harness/codex.js +6 -12
- package/apps/runtime/dist/harness/cursor.js +2 -10
- package/apps/runtime/dist/harness/env.js +23 -0
- package/apps/runtime/dist/harness/index.js +6 -3
- package/apps/runtime/dist/harness/model.js +1 -1
- package/apps/runtime/dist/harness/terminal.js +1 -1
- package/apps/runtime/dist/mcp/flow-app.js +1 -1
- package/apps/runtime/dist/media/conversation.js +1 -1
- package/apps/runtime/dist/media/transcribe.js +1 -1
- package/apps/runtime/dist/model-errors.js +1 -1
- package/apps/runtime/dist/models.js +3 -3
- package/apps/runtime/dist/plugin.js +1 -1
- package/apps/runtime/dist/plugins/discovery.js +1 -1
- package/apps/runtime/dist/plugins/loader.js +2 -2
- package/apps/runtime/dist/plugins/runs.js +2 -2
- package/apps/runtime/dist/render/downloads.js +2 -2
- package/apps/runtime/dist/render/shaped.js +1 -1
- package/apps/runtime/dist/routes/api.js +2 -2
- package/apps/runtime/dist/routes/lang.js +1 -1
- package/apps/runtime/dist/routes/marketplace.js +1 -1
- package/apps/runtime/dist/routes/runs.js +110 -10
- package/apps/runtime/dist/routes/studio.js +20 -8
- package/apps/runtime/dist/services/access.js +1 -1
- package/apps/runtime/dist/services/api.js +4 -4
- package/apps/runtime/dist/services/assistant-chats.js +2 -2
- package/apps/runtime/dist/services/brand.js +2 -2
- package/apps/runtime/dist/services/cloud.js +1 -1
- package/apps/runtime/dist/services/errors.js +1 -1
- package/apps/runtime/dist/services/files.js +1 -1
- package/apps/runtime/dist/services/knowledge-model.js +3 -3
- package/apps/runtime/dist/services/knowledge.js +2 -2
- package/apps/runtime/dist/services/marketplace.js +5 -5
- package/apps/runtime/dist/services/package-file.js +3 -3
- package/apps/runtime/dist/services/package.js +2 -2
- package/apps/runtime/dist/services/profile.js +1 -1
- package/apps/runtime/dist/services/project-files.js +2 -2
- package/apps/runtime/dist/services/project-index.js +1 -1
- package/apps/runtime/dist/services/projects.js +2 -2
- package/apps/runtime/dist/services/runners.js +3 -3
- package/apps/runtime/dist/services/runs.js +2 -2
- package/apps/runtime/dist/services/shares.js +1 -1
- package/apps/runtime/dist/services/site.js +2 -2
- package/apps/runtime/dist/services/space-categories.js +3 -3
- package/apps/runtime/dist/services/space-data.js +4 -4
- package/apps/runtime/dist/services/spaces.js +6 -6
- package/apps/runtime/dist/services/translations.js +5 -5
- package/apps/runtime/dist/services/widgets.js +1 -1
- package/apps/runtime/dist/services/wizards.js +3 -3
- package/apps/runtime/dist/sharing/agent.js +65 -0
- package/apps/runtime/dist/sharing/files.js +121 -0
- package/apps/runtime/dist/sharing/index.js +298 -0
- package/apps/runtime/dist/sharing/jobs.js +186 -0
- package/apps/runtime/dist/sharing/state.js +116 -0
- package/apps/runtime/dist/sharing/targets/browser.js +131 -0
- package/apps/runtime/dist/sharing/targets/connector.js +63 -0
- package/apps/runtime/dist/sharing/targets/email.js +98 -0
- package/apps/runtime/dist/sharing/targets/slack.js +54 -0
- package/apps/runtime/dist/sharing/targets/storage.js +164 -0
- package/apps/runtime/dist/sharing/types.js +13 -0
- package/apps/runtime/dist/store/index.js +3 -3
- package/apps/runtime/dist/store/shared-lists.js +1 -1
- package/apps/runtime/dist/texts.js +109 -1
- package/apps/runtime/dist/tools/browser.js +48 -0
- package/apps/runtime/dist/tools/connector.js +3 -2
- package/apps/runtime/dist/tools/index.js +1 -1
- package/apps/runtime/dist/tools/plugin.js +2 -2
- package/apps/runtime/dist/tools/project.js +1 -1
- package/apps/runtime/dist/tools/store.js +20 -3
- package/apps/runtime/dist/widgets/bundle.js +1 -1
- package/apps/runtime/dist/widgets/step.js +3 -3
- package/apps/web/dist/assets/AboutDialog-CB0EwGxP.js +1 -0
- package/apps/web/dist/assets/{ChangelogDialog-CZrd-MgC.js → ChangelogDialog-BQRBkiVD.js} +1 -1
- package/apps/web/dist/assets/ChatView-BLZkLlHi.js +10 -0
- package/apps/web/dist/assets/EditorPage-YawfYRAL.js +4 -0
- package/apps/web/dist/assets/{FlowPreview-oX_Emm7u.js → FlowPreview-B0xF8e3r.js} +1 -1
- package/apps/web/dist/assets/{Harness-DiB8CBdY.js → Harness-snRbALGd.js} +2 -2
- package/apps/web/dist/assets/NewWizardChannels-BGzp9z0m.js +1 -0
- package/apps/web/dist/assets/{NewWizardPage-C2Oh2sMM.js → NewWizardPage-cOHfwcnA.js} +2 -2
- package/apps/web/dist/assets/OnboardingPage-jB3ChKi3.js +1 -0
- package/apps/web/dist/assets/ProjectPage-hRCBquNb.js +1 -0
- package/apps/web/dist/assets/PublicRunner-D_ZkOyRV.js +1 -0
- package/apps/web/dist/assets/{ReadOnly-CD5YWvrW.js → ReadOnly-Db_odT6Y.js} +1 -1
- package/apps/web/dist/assets/RunDrawer-B6AQw90D.js +4 -0
- package/apps/web/dist/assets/RunnerView-DHUkvi_G.js +1 -0
- package/apps/web/dist/assets/SettingsPage-DleMaLz8.js +2 -0
- package/apps/web/dist/assets/SetupPage-DTvVJR1U.js +1 -0
- package/apps/web/dist/assets/{SharePage-B6u9kS12.js → SharePage-Bl-rfCji.js} +1 -1
- package/apps/web/dist/assets/changelog-BcW79fHm.js +1 -0
- package/apps/web/dist/assets/esm-Bji0ThaK.js +7 -0
- package/apps/web/dist/assets/index-CQKA-z2z.js +14 -0
- package/apps/web/dist/assets/index-Cnziz-H-.css +1 -0
- package/apps/web/dist/assets/oss-credits-BjwxLtU4.js +1 -0
- package/apps/web/dist/assets/{phone-BjmhIKuT.js → phone-DwAf8S3l.js} +1 -1
- package/apps/web/dist/assets/settings-menu-B1ND1GF3.js +1 -0
- package/apps/web/dist/assets/ui-Cdv3QUOd.js +137 -0
- package/apps/web/dist/assets/{upload-JX9BcMTq.js → upload-DCMZI6pp.js} +1 -1
- package/apps/web/dist/assets/{wrench-BSxnPs2_.js → wrench-BRYtnxti.js} +1 -1
- package/apps/web/dist/index.html +3 -3
- package/apps/web/dist/mcp/flow.html +53 -53
- package/node_modules/{@engenty-wizards/shared → @engenty/wizards-shared}/dist/definition.d.ts +22 -0
- package/node_modules/{@engenty-wizards/shared → @engenty/wizards-shared}/dist/definition.js +26 -0
- package/node_modules/{@engenty-wizards/shared → @engenty/wizards-shared}/dist/run.d.ts +6 -0
- package/node_modules/{@engenty-wizards/shared → @engenty/wizards-shared}/dist/run.js +2 -0
- package/node_modules/@engenty/wizards-shared/dist/sharing.d.ts +135 -0
- package/node_modules/@engenty/wizards-shared/dist/sharing.js +11 -0
- package/node_modules/{@engenty-wizards/shared → @engenty/wizards-shared}/dist/store.d.ts +8 -0
- package/node_modules/{@engenty-wizards/shared → @engenty/wizards-shared}/package.json +1 -1
- package/package.json +4 -3
- package/plugin/.claude-plugin/plugin.json +1 -1
- package/apps/runtime/dist/docs/dev/wizard-format.md +0 -125
- package/apps/web/dist/assets/AboutDialog-CPRAlD2H.js +0 -1
- package/apps/web/dist/assets/ChatView-DVeERQdi.js +0 -10
- package/apps/web/dist/assets/EditorPage-DhUoKcss.js +0 -4
- package/apps/web/dist/assets/NewWizardChannels-Ba3XGpro.js +0 -1
- package/apps/web/dist/assets/OnboardingPage-D_4ShWrL.js +0 -1
- package/apps/web/dist/assets/ProjectPage-C58rq50b.js +0 -1
- package/apps/web/dist/assets/PublicRunner-CE0ohzyd.js +0 -1
- package/apps/web/dist/assets/RunDrawer-Cd8-qHV7.js +0 -4
- package/apps/web/dist/assets/RunnerView-BW1h4x63.js +0 -1
- package/apps/web/dist/assets/SettingsPage-ChYLv-MG.js +0 -1
- package/apps/web/dist/assets/SetupPage-hX7deF0g.js +0 -1
- package/apps/web/dist/assets/changelog-Dn9LT4MS.js +0 -1
- package/apps/web/dist/assets/esm-C-ZWeuhU.js +0 -7
- package/apps/web/dist/assets/index-4jH2mkp7.js +0 -14
- package/apps/web/dist/assets/index-BwW652E-.css +0 -1
- package/apps/web/dist/assets/oss-credits-Bc05Qv5H.js +0 -1
- package/apps/web/dist/assets/settings-menu-Dpkp3f56.js +0 -1
- package/apps/web/dist/assets/ui-DMmT-cSO.js +0 -137
- /package/node_modules/{@engenty-wizards/shared → @engenty/wizards-shared}/dist/assistant.d.ts +0 -0
- /package/node_modules/{@engenty-wizards/shared → @engenty/wizards-shared}/dist/assistant.js +0 -0
- /package/node_modules/{@engenty-wizards/shared → @engenty/wizards-shared}/dist/changes.d.ts +0 -0
- /package/node_modules/{@engenty-wizards/shared → @engenty/wizards-shared}/dist/changes.js +0 -0
- /package/node_modules/{@engenty-wizards/shared → @engenty/wizards-shared}/dist/claude-plugin.d.ts +0 -0
- /package/node_modules/{@engenty-wizards/shared → @engenty/wizards-shared}/dist/claude-plugin.js +0 -0
- /package/node_modules/{@engenty-wizards/shared → @engenty/wizards-shared}/dist/connectors.d.ts +0 -0
- /package/node_modules/{@engenty-wizards/shared → @engenty/wizards-shared}/dist/connectors.js +0 -0
- /package/node_modules/{@engenty-wizards/shared → @engenty/wizards-shared}/dist/decision.d.ts +0 -0
- /package/node_modules/{@engenty-wizards/shared → @engenty/wizards-shared}/dist/decision.js +0 -0
- /package/node_modules/{@engenty-wizards/shared → @engenty/wizards-shared}/dist/engenty/data-tables/columns-format.d.ts +0 -0
- /package/node_modules/{@engenty-wizards/shared → @engenty/wizards-shared}/dist/engenty/data-tables/columns-format.js +0 -0
- /package/node_modules/{@engenty-wizards/shared → @engenty/wizards-shared}/dist/engenty/data-tables/columns-value.d.ts +0 -0
- /package/node_modules/{@engenty-wizards/shared → @engenty/wizards-shared}/dist/engenty/data-tables/columns-value.js +0 -0
- /package/node_modules/{@engenty-wizards/shared → @engenty/wizards-shared}/dist/engenty/data-tables/columns.d.ts +0 -0
- /package/node_modules/{@engenty-wizards/shared → @engenty/wizards-shared}/dist/engenty/data-tables/columns.js +0 -0
- /package/node_modules/{@engenty-wizards/shared → @engenty/wizards-shared}/dist/engenty/data-tables/index.d.ts +0 -0
- /package/node_modules/{@engenty-wizards/shared → @engenty/wizards-shared}/dist/engenty/data-tables/index.js +0 -0
- /package/node_modules/{@engenty-wizards/shared → @engenty/wizards-shared}/dist/engenty/search-index/catalog-lexical.d.ts +0 -0
- /package/node_modules/{@engenty-wizards/shared → @engenty/wizards-shared}/dist/engenty/search-index/catalog-lexical.js +0 -0
- /package/node_modules/{@engenty-wizards/shared → @engenty/wizards-shared}/dist/engenty/search-index/catalog-rank.d.ts +0 -0
- /package/node_modules/{@engenty-wizards/shared → @engenty/wizards-shared}/dist/engenty/search-index/catalog-rank.js +0 -0
- /package/node_modules/{@engenty-wizards/shared → @engenty/wizards-shared}/dist/feature-flags.d.ts +0 -0
- /package/node_modules/{@engenty-wizards/shared → @engenty/wizards-shared}/dist/feature-flags.js +0 -0
- /package/node_modules/{@engenty-wizards/shared → @engenty/wizards-shared}/dist/features.d.ts +0 -0
- /package/node_modules/{@engenty-wizards/shared → @engenty/wizards-shared}/dist/features.js +0 -0
- /package/node_modules/{@engenty-wizards/shared → @engenty/wizards-shared}/dist/fit.d.ts +0 -0
- /package/node_modules/{@engenty-wizards/shared → @engenty/wizards-shared}/dist/fit.js +0 -0
- /package/node_modules/{@engenty-wizards/shared → @engenty/wizards-shared}/dist/json-schema.d.ts +0 -0
- /package/node_modules/{@engenty-wizards/shared → @engenty/wizards-shared}/dist/json-schema.js +0 -0
- /package/node_modules/{@engenty-wizards/shared → @engenty/wizards-shared}/dist/knowledge.d.ts +0 -0
- /package/node_modules/{@engenty-wizards/shared → @engenty/wizards-shared}/dist/knowledge.js +0 -0
- /package/node_modules/{@engenty-wizards/shared → @engenty/wizards-shared}/dist/marketplace-entry.d.ts +0 -0
- /package/node_modules/{@engenty-wizards/shared → @engenty/wizards-shared}/dist/marketplace-entry.js +0 -0
- /package/node_modules/{@engenty-wizards/shared → @engenty/wizards-shared}/dist/marketplace-search.d.ts +0 -0
- /package/node_modules/{@engenty-wizards/shared → @engenty/wizards-shared}/dist/marketplace-search.js +0 -0
- /package/node_modules/{@engenty-wizards/shared → @engenty/wizards-shared}/dist/marketplace.d.ts +0 -0
- /package/node_modules/{@engenty-wizards/shared → @engenty/wizards-shared}/dist/marketplace.js +0 -0
- /package/node_modules/{@engenty-wizards/shared → @engenty/wizards-shared}/dist/merge.d.ts +0 -0
- /package/node_modules/{@engenty-wizards/shared → @engenty/wizards-shared}/dist/merge.js +0 -0
- /package/node_modules/{@engenty-wizards/shared → @engenty/wizards-shared}/dist/numbers.d.ts +0 -0
- /package/node_modules/{@engenty-wizards/shared → @engenty/wizards-shared}/dist/numbers.js +0 -0
- /package/node_modules/{@engenty-wizards/shared → @engenty/wizards-shared}/dist/projects.d.ts +0 -0
- /package/node_modules/{@engenty-wizards/shared → @engenty/wizards-shared}/dist/projects.js +0 -0
- /package/node_modules/{@engenty-wizards/shared → @engenty/wizards-shared}/dist/providers.d.ts +0 -0
- /package/node_modules/{@engenty-wizards/shared → @engenty/wizards-shared}/dist/providers.js +0 -0
- /package/node_modules/{@engenty-wizards/shared → @engenty/wizards-shared}/dist/runner-texts.d.ts +0 -0
- /package/node_modules/{@engenty-wizards/shared → @engenty/wizards-shared}/dist/runner-texts.js +0 -0
- /package/node_modules/{@engenty-wizards/shared → @engenty/wizards-shared}/dist/runners.d.ts +0 -0
- /package/node_modules/{@engenty-wizards/shared → @engenty/wizards-shared}/dist/runners.js +0 -0
- /package/node_modules/{@engenty-wizards/shared → @engenty/wizards-shared}/dist/shape.d.ts +0 -0
- /package/node_modules/{@engenty-wizards/shared → @engenty/wizards-shared}/dist/shape.js +0 -0
- /package/node_modules/{@engenty-wizards/shared → @engenty/wizards-shared}/dist/space-data.d.ts +0 -0
- /package/node_modules/{@engenty-wizards/shared → @engenty/wizards-shared}/dist/space-data.js +0 -0
- /package/node_modules/{@engenty-wizards/shared → @engenty/wizards-shared}/dist/store.js +0 -0
- /package/node_modules/{@engenty-wizards/shared → @engenty/wizards-shared}/dist/surface.d.ts +0 -0
- /package/node_modules/{@engenty-wizards/shared → @engenty/wizards-shared}/dist/surface.js +0 -0
- /package/node_modules/{@engenty-wizards/shared → @engenty/wizards-shared}/dist/texts.d.ts +0 -0
- /package/node_modules/{@engenty-wizards/shared → @engenty/wizards-shared}/dist/texts.js +0 -0
- /package/node_modules/{@engenty-wizards/shared → @engenty/wizards-shared}/dist/translation.d.ts +0 -0
- /package/node_modules/{@engenty-wizards/shared → @engenty/wizards-shared}/dist/translation.js +0 -0
- /package/node_modules/{@engenty-wizards/shared → @engenty/wizards-shared}/dist/wizard-package.d.ts +0 -0
- /package/node_modules/{@engenty-wizards/shared → @engenty/wizards-shared}/dist/wizard-package.js +0 -0
- /package/node_modules/{@engenty-wizards/shared → @engenty/wizards-shared}/dist/workspace.d.ts +0 -0
- /package/node_modules/{@engenty-wizards/shared → @engenty/wizards-shared}/dist/workspace.js +0 -0
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: The .wizard file
|
|
3
|
+
description: The zip a wizard travels in, its folders and manifest, how to make one by hand, and what the import does with it.
|
|
4
|
+
version: 0.7.10
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
A `.wizard` file is a zip with the wizard’s definition and its workspace. The studio exports
|
|
8
|
+
one, imports one back, and `wizards validate` checks one. Its media type is
|
|
9
|
+
`application/vnd.engenty.wizard+zip`. The file is named after the wizard’s title, such as
|
|
10
|
+
`create-an-invoice.wizard`.
|
|
11
|
+
|
|
12
|
+
## What is in the zip
|
|
13
|
+
|
|
14
|
+
```text
|
|
15
|
+
create-an-invoice.wizard
|
|
16
|
+
├── wizard.json the manifest, with the definition in it
|
|
17
|
+
└── files/ the wizard's workspace
|
|
18
|
+
├── invoice/
|
|
19
|
+
│ ├── index.html a widget step's entry
|
|
20
|
+
│ ├── app.js
|
|
21
|
+
│ └── sample.json its example data
|
|
22
|
+
├── lib/
|
|
23
|
+
│ └── chart.min.js libraries the widgets load
|
|
24
|
+
├── prices.csv reference data AI steps read
|
|
25
|
+
├── kits/explainer.zip a film step's style kit
|
|
26
|
+
├── skills/brand/SKILL.md a skill package a film step reads
|
|
27
|
+
└── knowledge/ only in a website package
|
|
28
|
+
└── services/pricing.md
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
| Path | What it holds |
|
|
32
|
+
|---|---|
|
|
33
|
+
| `wizard.json` | The manifest. See [The manifest](#the-manifest) |
|
|
34
|
+
| `files/` | The workspace: every file the wizard’s steps name by path |
|
|
35
|
+
| `files/knowledge/` | The space’s Knowledge pages, only when the export was asked for them. See [Knowledge](#knowledge) |
|
|
36
|
+
|
|
37
|
+
Only `wizard.json` is required. A wizard without widgets, kits or files has an empty `files/`
|
|
38
|
+
or none.
|
|
39
|
+
|
|
40
|
+
## The workspace
|
|
41
|
+
|
|
42
|
+
The paths under `files/` are the paths the definition uses. A widget step with
|
|
43
|
+
`"entry": "invoice/index.html"` reads `files/invoice/index.html`, and a film step with
|
|
44
|
+
`"kit": "kits/explainer.zip"` reads `files/kits/explainer.zip`. Apart from `knowledge/`, no
|
|
45
|
+
folder has a fixed meaning. The ones above are what the studio and its assistant write.
|
|
46
|
+
|
|
47
|
+
| Limit | Value |
|
|
48
|
+
|---|---|
|
|
49
|
+
| Files | 200 |
|
|
50
|
+
| One file | 5 MB |
|
|
51
|
+
| All files | 25 MB |
|
|
52
|
+
| The whole zip | 30 MB, with room for the manifest |
|
|
53
|
+
| A path | 200 characters: letters, digits, `_`, `-` and `.`, with `/` between folders |
|
|
54
|
+
|
|
55
|
+
A path starts with a letter, a digit, `_` or `-`. So hidden files such as `.env` and paths with
|
|
56
|
+
`..` are not allowed. The import refuses a file that breaks a limit, and names it.
|
|
57
|
+
|
|
58
|
+
## The manifest
|
|
59
|
+
|
|
60
|
+
```json
|
|
61
|
+
{
|
|
62
|
+
"$schema": "https://engenty.ai/schema/v1/wizard-package.json",
|
|
63
|
+
"format": "engenty-wizard",
|
|
64
|
+
"version": 1,
|
|
65
|
+
"exportedAt": "2026-10-18T09:12:00.000Z",
|
|
66
|
+
"definition": { "version": 1, "title": "Create an invoice", "steps": [ … ] },
|
|
67
|
+
"connectors": [
|
|
68
|
+
{ "id": "billomat", "name": "Billomat", "domain": "billomat.com", "sourceKind": "openapi" }
|
|
69
|
+
],
|
|
70
|
+
"mcpServers": [{ "id": "notion", "name": "Notion" }],
|
|
71
|
+
"knowledge": { "pages": 12, "truncated": false }
|
|
72
|
+
}
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
| Key | What it holds |
|
|
76
|
+
|---|---|
|
|
77
|
+
| `$schema` | The JSON Schema for editors. The app does not read it |
|
|
78
|
+
| `format` | Always `engenty-wizard`. It tells a manifest from a bare definition |
|
|
79
|
+
| `version` | The manifest’s version, `1` |
|
|
80
|
+
| `exportedAt` | When the file was made |
|
|
81
|
+
| `definition` | The wizard. See [The wizard format](./index.md) |
|
|
82
|
+
| `connectors` | Imported connectors the wizard’s connections name: `id`, `name`, `domain` and `sourceKind` (`openapi` or `mcp`), at most 50 |
|
|
83
|
+
| `mcpServers` | The space’s connected systems its agent steps name: `id` and `name`, at most 10 |
|
|
84
|
+
| `knowledge` | Only with Knowledge: how many pages, and whether the cap left some out |
|
|
85
|
+
|
|
86
|
+
`connectors` and `mcpServers` hold names, never addresses, headers or credentials. They let the
|
|
87
|
+
import tell you what the space you import into still needs.
|
|
88
|
+
|
|
89
|
+
## Knowledge
|
|
90
|
+
|
|
91
|
+
A website runs a wizard without its space. For that, the share dialog’s website package has
|
|
92
|
+
“Take the knowledge along”. The space’s Knowledge pages then come along as Markdown, one file per
|
|
93
|
+
page, at their path under `files/knowledge/`:
|
|
94
|
+
|
|
95
|
+
```markdown
|
|
96
|
+
---
|
|
97
|
+
title: "Pricing"
|
|
98
|
+
path: pages/services/pricing
|
|
99
|
+
---
|
|
100
|
+
|
|
101
|
+
Our hourly rate is …
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
A page is cut after 60,000 characters. The pages stop at about 2 MB in all, and `truncated` in the
|
|
105
|
+
manifest then says so.
|
|
106
|
+
|
|
107
|
+
## What stays out
|
|
108
|
+
|
|
109
|
+
A `.wizard` file holds the wizard, not what it collected or what the space owns:
|
|
110
|
+
|
|
111
|
+
- runs, results and uploads
|
|
112
|
+
- the rows of its lists and the accounts people connected
|
|
113
|
+
- the space’s brand, facts and Knowledge, unless Knowledge was asked for
|
|
114
|
+
- the addresses and credentials of connectors and connected systems
|
|
115
|
+
- translations and the wizard’s published versions
|
|
116
|
+
|
|
117
|
+
The studio’s export holds the draft. The website package and the export over the API hold the
|
|
118
|
+
published version.
|
|
119
|
+
|
|
120
|
+
## Making one by hand
|
|
121
|
+
|
|
122
|
+
Zip a folder that holds `wizard.json` and `files/`:
|
|
123
|
+
|
|
124
|
+
```bash
|
|
125
|
+
cd create-an-invoice && zip -r ../create-an-invoice.wizard wizard.json files
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
The zip may also hold that folder itself, as a zip made in the Finder does. The import takes the
|
|
129
|
+
`wizard.json` closest to the top, and the `files/` beside it. It leaves out folders, `__MACOSX/`
|
|
130
|
+
and `.DS_Store`.
|
|
131
|
+
|
|
132
|
+
`wizards validate` reads the unpacked folder as it is, without zipping it. See
|
|
133
|
+
[JSON Schema and validation](./validate.md).
|
|
134
|
+
|
|
135
|
+
## What the import does
|
|
136
|
+
|
|
137
|
+
The import takes a `.wizard` file, a `wizard.json` on its own, or a definition on its own. A JSON
|
|
138
|
+
file without `"format": "engenty-wizard"` is read as a definition.
|
|
139
|
+
|
|
140
|
+
1. It checks the zip against the limits before it unpacks anything.
|
|
141
|
+
2. It checks the definition and that every path it names is in the workspace.
|
|
142
|
+
3. It makes a new wizard in the space: a draft, not published, with the workspace’s files.
|
|
143
|
+
4. It tells you which connectors and connected systems the space still lacks.
|
|
144
|
+
|
|
145
|
+
What belongs to the space is checked only here, because only the space has it: its connectors
|
|
146
|
+
and their actions, its connected systems and its plugins’ tools. A manifest of a newer version
|
|
147
|
+
is refused, with a note that the file comes from a newer version of engenty wizards.
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
---
|
|
2
2
|
title: Build a wizard
|
|
3
3
|
description: Describe what the wizard should do, or start from a template. Then change it in the chat or step by step.
|
|
4
|
-
version: 0.
|
|
4
|
+
version: 0.8.0
|
|
5
5
|
---
|
|
6
6
|
|
|
7
7
|
## Start one
|
|
8
8
|
|
|
9
|
-
“New wizard” on the list of your wizards, or in the
|
|
9
|
+
“New wizard” on the list of your wizards, or in the space’s menu, opens the page “What should your
|
|
10
10
|
wizard do?”. It gives you three ways in:
|
|
11
11
|
|
|
12
12
|
| Way | How |
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
title: Run a wizard
|
|
3
3
|
description: What you see when you open a wizard's link, on a computer or a phone.
|
|
4
|
-
version: 0.
|
|
4
|
+
version: 0.7.11
|
|
5
5
|
---
|
|
6
6
|
|
|
7
7
|
## From the link to the result
|
|
@@ -90,9 +90,26 @@ everything” deletes it. Anything nobody used for 400 days is deleted by itself
|
|
|
90
90
|
|
|
91
91
|
## Share a result
|
|
92
92
|
|
|
93
|
-
“Share” on the result page
|
|
94
|
-
it to another app. When you ran the wizard over its
|
|
95
|
-
days. “Withdraw link” ends the link earlier.
|
|
93
|
+
“Share” on the result page opens the ways to pass the result on. “Link” makes a link to the
|
|
94
|
+
result: copy it, send it by email or hand it to another app. When you ran the wizard over its
|
|
95
|
+
link, the result and its link are kept for 7 days. “Withdraw link” ends the link earlier.
|
|
96
|
+
|
|
97
|
+
The other tiles send or publish the result itself. Each one walks you through its steps: the
|
|
98
|
+
account it sends with (“Account”), what goes along and where it goes (“What & where”), then
|
|
99
|
+
“Send”. What happens shows in the same window, and “Recent” lists what was sent before. An
|
|
100
|
+
account you connect is kept for your next run, encrypted. “What this wizard remembers” lists it.
|
|
101
|
+
|
|
102
|
+
| Tile | Does | Needs |
|
|
103
|
+
|---|---|---|
|
|
104
|
+
| “Email” | Sends the files you pick as attachments to one or more addresses | Your mailbox: Gmail, Outlook or any mailbox over SMTP. Where the server sends from an address of its own, no account |
|
|
105
|
+
| Google Drive, OneDrive, S3 | Saves the files into a folder, which is created if it doesn’t exist yet | The account |
|
|
106
|
+
| “Slack” | Posts your message with the link to the result in a channel | Your Slack account |
|
|
107
|
+
| A connected service | An AI agent does what you describe in the service, with its actions, and asks before every change | The account, and a few minutes |
|
|
108
|
+
| “Website” | The wizard opens the site in its browser, and an AI agent posts there what you describe. You sign in yourself, and it asks for your leave before anything goes public | A few minutes. LinkedIn, X, Facebook, Instagram and Meta Ads are ready as presets |
|
|
109
|
+
|
|
110
|
+
Which tiles a result offers is the wizard’s choice, see [The result](./steps.md#the-result).
|
|
111
|
+
Without one, every tile that needs no AI agent is there for everyone with the link. The agent
|
|
112
|
+
tiles are there for the wizard’s owner in the studio, as they spend the wizard’s credits.
|
|
96
113
|
|
|
97
114
|
Media made by a model carries an “AI-generated” label. Whoever publishes it has to label it as
|
|
98
115
|
AI-generated. The file already carries the marking.
|
|
@@ -1,29 +1,33 @@
|
|
|
1
1
|
---
|
|
2
2
|
title: Space
|
|
3
3
|
description: What your wizards share and produce – who you are, what they look things up in, and the results of their runs.
|
|
4
|
-
version: 0.
|
|
4
|
+
version: 0.8.0
|
|
5
5
|
---
|
|
6
6
|
|
|
7
7
|
Your space holds what all your wizards share, and what they produce. Every AI step knows it, so a
|
|
8
8
|
wizard never has to ask for your company’s name or address.
|
|
9
9
|
|
|
10
|
-
|
|
10
|
+
The app bar holds its places, below the space’s tile in its corner:
|
|
11
11
|
|
|
12
|
-
- The house
|
|
13
|
-
- The
|
|
14
|
-
|
|
15
|
-
closed.
|
|
12
|
+
- The house opens the space’s wizards: the list and “New wizard”.
|
|
13
|
+
- The layers below it open the space’s page.
|
|
14
|
+
- The tray below them opens the space’s results.
|
|
16
15
|
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
16
|
+
On a phone the bar floats along the bottom with the house, the layers and “More” (⋯), which
|
|
17
|
+
holds the results, the settings and the rest. The space’s tile and name sit at the top left, your
|
|
18
|
+
picture at the top right.
|
|
19
|
+
|
|
20
|
+
On the space’s page, the menu on the left shows its three parts. A part opens its own sections,
|
|
21
|
+
and the arrow at the top leads back. On a phone, the parts, a part’s sections and the page take
|
|
22
|
+
turns.
|
|
23
|
+
|
|
24
|
+
Results have no menu: the list above them picks one wizard or all of them.
|
|
20
25
|
|
|
21
26
|
| Part | Sections | Used for |
|
|
22
27
|
|---|---|---|
|
|
23
28
|
| Info & brand | Basics, Facts, Logos, Colours, Brand assets | Who you are and how you look |
|
|
24
29
|
| Knowledge | All, then each category, then the sections plugins add | What every AI step looks things up in |
|
|
25
30
|
| Data | All data, General, then each wizard | Tables and pages the wizards keep |
|
|
26
|
-
| Results | All results, then each wizard | The runs that reached their result |
|
|
27
31
|
|
|
28
32
|
## Info & brand
|
|
29
33
|
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
title: Steps
|
|
3
3
|
description: What a wizard is made of – pages, AI steps, generated media, widgets, reviews and the result.
|
|
4
|
-
version: 0.
|
|
4
|
+
version: 0.7.11
|
|
5
5
|
---
|
|
6
6
|
|
|
7
7
|
A wizard runs its steps from top to bottom. The last step is always the result.
|
|
@@ -179,6 +179,31 @@ Each entry of the result page names a step and the formats the person can downlo
|
|
|
179
179
|
| AI step, collected files | ZIP |
|
|
180
180
|
| List | Excel, CSV, JSON, Markdown; ZIP with the files its rows name |
|
|
181
181
|
|
|
182
|
+
Under “Send & publish” the step says where a person can send or publish the result with one
|
|
183
|
+
button, besides the link and the downloads (see [Share a result](./run.md#share-a-result)). Each
|
|
184
|
+
target is a row with a switch and its state: “Ready”, “AI agent · only you”, or “Not set up”.
|
|
185
|
+
A sentence above the rows says what visitors get and what only you get.
|
|
186
|
+
|
|
187
|
+
| Label | Means |
|
|
188
|
+
|---|---|
|
|
189
|
+
| “Default” | Every target that is set up and needs no AI agent. Targets with an agent only you get |
|
|
190
|
+
| “Own list” | You switched a target off, prefilled one or added one: only the targets switched on, in this order. An agent target then runs for everyone with the link, on your credits |
|
|
191
|
+
| “Off” | Every target switched off: the result has only the link and the downloads |
|
|
192
|
+
|
|
193
|
+
“Reset” brings the default back. Targets that are not set up on this server are listed under
|
|
194
|
+
“not set up”, with “Set up” to the connectors.
|
|
195
|
+
|
|
196
|
+
The arrow on a row opens its form: the name on the result page and what each field starts with.
|
|
197
|
+
“Insert” puts a placeholder where the cursor is: an answer, a written result or the brand name.
|
|
198
|
+
In the wizard file they read `{{email}}`, `{{steps.offer}}` and `{{brand.name}}`.
|
|
199
|
+
|
|
200
|
+
While the result step is chosen, the studio shows its result page beside the flow, filled from
|
|
201
|
+
the last test run. “Visitor” and “You” switch between what each of them gets. A target opens to
|
|
202
|
+
its form as the visitor sees it, with the test run’s answers in it; nothing is sent from there.
|
|
203
|
+
On a tablet or a phone, “Result page” switches the view, and “See the result page” opens it from
|
|
204
|
+
the step. The result node on the flow shows the targets too: filled for visitors, a ring for
|
|
205
|
+
you only.
|
|
206
|
+
|
|
182
207
|
## Branches
|
|
183
208
|
|
|
184
209
|
A step can send the run somewhere else when a condition holds: a field is or is not a value, is
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
title: Test and share
|
|
3
3
|
description: Try the wizard, publish it, and hand out its link or put it on a website.
|
|
4
|
-
version: 0.
|
|
4
|
+
version: 0.7.11
|
|
5
5
|
---
|
|
6
6
|
|
|
7
7
|
## Test
|
|
@@ -216,7 +216,8 @@ On WordPress the plugin writes this code for you, and its results show the page:
|
|
|
216
216
|
|
|
217
217
|
On the result page, a person can share what they got as a link. The result of a run over the
|
|
218
218
|
wizard’s link, and the link to it, are deleted after 7 days. The person can withdraw the link
|
|
219
|
-
earlier.
|
|
219
|
+
earlier. “Share” also sends the result on – by email, into a cloud folder, to Slack or onto a
|
|
220
|
+
website: see [Share a result](./run.md#share-a-result).
|
|
220
221
|
|
|
221
222
|
## Move a wizard
|
|
222
223
|
|
|
@@ -2,7 +2,7 @@ import { createHash } from "node:crypto";
|
|
|
2
2
|
import { existsSync, mkdirSync } from "node:fs";
|
|
3
3
|
import { readFile, writeFile } from "node:fs/promises";
|
|
4
4
|
import { join } from "node:path";
|
|
5
|
-
import { note } from "@engenty-
|
|
5
|
+
import { note } from "@engenty/wizards-shared/run";
|
|
6
6
|
import { generateText, Output } from "ai";
|
|
7
7
|
import PostalMime from "postal-mime";
|
|
8
8
|
import { z } from "zod";
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { decisionSchema, readObject, readSystemOne, } from "@engenty-
|
|
1
|
+
import { decisionSchema, readObject, readSystemOne, } from "@engenty/wizards-shared/decision";
|
|
2
2
|
import { generateText, Output } from "ai";
|
|
3
3
|
import { costOf, systemOneAccess, textModel } from "../models.js";
|
|
4
4
|
export class DecisionError extends Error {
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { AsyncResource } from "node:async_hooks";
|
|
2
2
|
import { EventEmitter } from "node:events";
|
|
3
|
-
import { noteText } from "@engenty-
|
|
3
|
+
import { noteText } from "@engenty/wizards-shared/run";
|
|
4
4
|
import { and, desc, eq, gt, sql } from "drizzle-orm";
|
|
5
5
|
import { db, schema } from "../db/client.js";
|
|
6
6
|
const bus = new EventEmitter();
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { isDecidedField, isLang, isLocationValue, MAX_FILES, offeredSlot, shownFields, } from "@engenty-
|
|
2
|
-
import { readNumber } from "@engenty-
|
|
3
|
-
import { note, saidText } from "@engenty-
|
|
1
|
+
import { isDecidedField, isLang, isLocationValue, MAX_FILES, offeredSlot, shownFields, } from "@engenty/wizards-shared/definition";
|
|
2
|
+
import { readNumber } from "@engenty/wizards-shared/numbers";
|
|
3
|
+
import { note, saidText } from "@engenty/wizards-shared/run";
|
|
4
4
|
/** The field errors in a language, for whoever reads them. */
|
|
5
5
|
export function fieldErrorsIn(errors, lang) {
|
|
6
6
|
return errors.map((e) => ({ field: e.field, message: saidText(e.message, lang) }));
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { allFields, isAudioValue } from "@engenty-
|
|
1
|
+
import { allFields, isAudioValue } from "@engenty/wizards-shared/definition";
|
|
2
2
|
import { extFor, loadAsset } from "../files/storage.js";
|
|
3
3
|
import { listenPieces, transcribeAudio } from "../media/transcribe.js";
|
|
4
4
|
/**
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { conditionMatches, conditionsOf, isDecidedField, isDecisionStep, isOtherwise, MODEL_CLASSES, } from "@engenty-
|
|
2
|
-
import { closedChoicesFor, openValue, otherwiseIndex, unavoidableFrom, unavoidableSteps, } from "@engenty-
|
|
3
|
-
import { note, saidText } from "@engenty-
|
|
1
|
+
import { conditionMatches, conditionsOf, isDecidedField, isDecisionStep, isOtherwise, MODEL_CLASSES, } from "@engenty/wizards-shared/definition";
|
|
2
|
+
import { closedChoicesFor, openValue, otherwiseIndex, unavoidableFrom, unavoidableSteps, } from "@engenty/wizards-shared/fit";
|
|
3
|
+
import { note, saidText } from "@engenty/wizards-shared/run";
|
|
4
4
|
import { classProblem, filmClient } from "../models.js";
|
|
5
5
|
// The steps every run passes through, and the choices that lead around a missing model, are
|
|
6
6
|
// pure and shared (packages/shared/src/fit.ts): the standalone check uses the same.
|
|
@@ -267,16 +267,31 @@ export async function missingModelsSaid(def) {
|
|
|
267
267
|
}
|
|
268
268
|
return missing;
|
|
269
269
|
}
|
|
270
|
-
/**
|
|
270
|
+
/**
|
|
271
|
+
* The message a run that cannot start gives, naming the steps and why. Classes with the same
|
|
272
|
+
* problem (a step that thinks and writes on one client that is not installed) say it once, and
|
|
273
|
+
* name each of their steps once.
|
|
274
|
+
*/
|
|
271
275
|
export function blockingMessage(missing) {
|
|
272
|
-
const
|
|
273
|
-
|
|
276
|
+
const byProblem = new Map();
|
|
277
|
+
for (const m of missing) {
|
|
278
|
+
if (!m.blocking) {
|
|
279
|
+
continue;
|
|
280
|
+
}
|
|
281
|
+
const key = JSON.stringify(m.problem);
|
|
282
|
+
const entry = byProblem.get(key) ?? { problem: m.problem, steps: new Map() };
|
|
283
|
+
for (const s of m.steps) {
|
|
284
|
+
entry.steps.set(s.id, s.title);
|
|
285
|
+
}
|
|
286
|
+
byProblem.set(key, entry);
|
|
287
|
+
}
|
|
288
|
+
if (!byProblem.size) {
|
|
274
289
|
return null;
|
|
275
290
|
}
|
|
276
|
-
return
|
|
277
|
-
.map((
|
|
278
|
-
steps:
|
|
279
|
-
problem
|
|
291
|
+
return [...byProblem.values()]
|
|
292
|
+
.map(({ problem, steps }) => note("blockedSteps", {
|
|
293
|
+
steps: [...steps.values()].map((text) => note("quoted", { text })),
|
|
294
|
+
problem,
|
|
280
295
|
}))
|
|
281
296
|
.reduce((first, second) => note("joined", { first, second }));
|
|
282
297
|
}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import { marginOf, } from "@engenty-
|
|
2
|
-
import { branchValues, cardsFromData, conditionsOf, dataRef, followRules, formatsFor, isDecidedField, LIST_FORMATS, listRef, loopKey, MAX_SHOWN_FIELDS, optionsFromData, otherwiseOf, pageNeeds, textLang, whenHolds, wizardLang, } from "@engenty-
|
|
3
|
-
import { note, saidText, } from "@engenty-
|
|
4
|
-
import { CONVERSATION_RUNNERS, DEFAULT_RUNNER_SETTINGS } from "@engenty-
|
|
5
|
-
import { fitData } from "@engenty-
|
|
6
|
-
import { machineTranslated, translateDefinition } from "@engenty-
|
|
1
|
+
import { marginOf, } from "@engenty/wizards-shared/decision";
|
|
2
|
+
import { branchValues, cardsFromData, conditionsOf, dataRef, followRules, formatsFor, isDecidedField, LIST_FORMATS, listRef, loopKey, MAX_SHOWN_FIELDS, optionsFromData, otherwiseOf, pageNeeds, textLang, whenHolds, wizardLang, } from "@engenty/wizards-shared/definition";
|
|
3
|
+
import { note, saidText, } from "@engenty/wizards-shared/run";
|
|
4
|
+
import { CONVERSATION_RUNNERS, DEFAULT_RUNNER_SETTINGS } from "@engenty/wizards-shared/runners";
|
|
5
|
+
import { fitData } from "@engenty/wizards-shared/shape";
|
|
6
|
+
import { machineTranslated, translateDefinition } from "@engenty/wizards-shared/translation";
|
|
7
7
|
import { eq } from "drizzle-orm";
|
|
8
8
|
import { nanoid } from "nanoid";
|
|
9
9
|
import { connectionViews } from "../connectors/index.js";
|
|
@@ -20,7 +20,8 @@ import { runEnded } from "../plugins/events.js";
|
|
|
20
20
|
import { projectFiles } from "../services/project-files.js";
|
|
21
21
|
import { projectProfile } from "../services/projects.js";
|
|
22
22
|
import { storedTranslation } from "../services/translations.js";
|
|
23
|
-
import {
|
|
23
|
+
import { latestShareJob } from "../sharing/state.js";
|
|
24
|
+
import { listRows, listSecrets, scopeOf } from "../store/index.js";
|
|
24
25
|
import { claimRun, disownRuns, heartbeatRuns, indexRun, restRun, waitingRuns, wakeRun, } from "../tenants/control.js";
|
|
25
26
|
import { currentTenant } from "../tenants/tenant.js";
|
|
26
27
|
import { askPerson, clearStaleAsk } from "./asks.js";
|
|
@@ -77,7 +78,7 @@ export async function projectIdOf(run) {
|
|
|
77
78
|
const w = await db.query.wizard.findFirst({ where: eq(schema.wizard.id, run.wizardId) });
|
|
78
79
|
return w?.projectId ?? "";
|
|
79
80
|
}
|
|
80
|
-
async function loadProject(run) {
|
|
81
|
+
export async function loadProject(run) {
|
|
81
82
|
const w = await db.query.wizard.findFirst({ where: eq(schema.wizard.id, run.wizardId) });
|
|
82
83
|
const p = w && (await db.query.project.findFirst({ where: eq(schema.project.id, w.projectId) }));
|
|
83
84
|
if (!p) {
|
|
@@ -340,11 +341,15 @@ async function storedLists(run) {
|
|
|
340
341
|
}
|
|
341
342
|
return out;
|
|
342
343
|
}
|
|
343
|
-
|
|
344
|
+
/**
|
|
345
|
+
* What a step works with. A share job works with the same — the run's browser, store and
|
|
346
|
+
* answers — under a step id, progress lines and questions of its own.
|
|
347
|
+
*/
|
|
348
|
+
export async function makeContext(run, project, state, signal, own = {}) {
|
|
344
349
|
const store = scopeOf(run);
|
|
345
350
|
const resources = resourcesFor(run.id);
|
|
346
351
|
resources.bind(store);
|
|
347
|
-
const stepId = run.cursor ?? "";
|
|
352
|
+
const stepId = own.stepId ?? run.cursor ?? "";
|
|
348
353
|
return {
|
|
349
354
|
runId: run.id,
|
|
350
355
|
tenantId: run.tenantId,
|
|
@@ -365,14 +370,15 @@ async function makeContext(run, project, state, signal) {
|
|
|
365
370
|
projectFiles: (await projectFiles(project.id)).filter((f) => f.status === "ready"),
|
|
366
371
|
signal,
|
|
367
372
|
resources,
|
|
368
|
-
ask:
|
|
369
|
-
|
|
373
|
+
ask: own.ask ??
|
|
374
|
+
((ask) => run.unattended ? Promise.resolve(null) : askPerson(run.id, { ...ask, stepId }, signal)),
|
|
375
|
+
emit: own.emit ?? ((type, message, asset) => emitEvent(run.id, run.cursor, type, message, asset)),
|
|
370
376
|
call: { runId: run.id, stepId },
|
|
371
377
|
chargeUsd: (usd) => addLocalCost(run.id, stepId, usd),
|
|
372
378
|
saveAsset: (input) => saveAsset({
|
|
373
379
|
...input,
|
|
374
380
|
runId: run.id,
|
|
375
|
-
stepId: input.stepId ?? run.cursor,
|
|
381
|
+
stepId: input.stepId ?? own.stepId ?? run.cursor,
|
|
376
382
|
}),
|
|
377
383
|
};
|
|
378
384
|
}
|
|
@@ -964,8 +970,11 @@ export async function runView(run, brand) {
|
|
|
964
970
|
connections: step?.type === "page" && step.fields.some((f) => f.kind === "connection")
|
|
965
971
|
? await connectionViews(def.connections ?? [], scopeOf(run), await projectIdOf(run), textLang(wizardLang(def)))
|
|
966
972
|
: [],
|
|
967
|
-
keeps: Boolean(def.lists?.length || def.connections?.length)
|
|
973
|
+
keeps: Boolean(def.lists?.length || def.connections?.length) ||
|
|
974
|
+
// An account connected for sharing is kept too, and can be deleted the same way.
|
|
975
|
+
(run.status === "done" && (await listSecrets(scopeOf(run))).length > 0),
|
|
968
976
|
shareUrl: run.shareToken ? `${env.publicUrl}/s/${run.shareToken}` : null,
|
|
969
977
|
expiresAt: run.expiresAt?.toISOString() ?? null,
|
|
978
|
+
shareJob: run.status === "done" ? await latestShareJob(run.id) : null,
|
|
970
979
|
};
|
|
971
980
|
}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import { pOf } from "@engenty-
|
|
2
|
-
import { allFields, dataRef, isDecisionStep, langNameEn, localeOf, stepShape, templateRefs, wizardLang, } from "@engenty-
|
|
3
|
-
import { mainLogo, ruleLines, runTheme } from "@engenty-
|
|
4
|
-
import { note as runNote } from "@engenty-
|
|
5
|
-
import { fitData, labelOf, recordsOf, shapeJsonSchema, shapeLines, shapeZod, titleKey, } from "@engenty-
|
|
6
|
-
import { SURFACE_GUIDE, validateSurface, } from "@engenty-
|
|
1
|
+
import { pOf } from "@engenty/wizards-shared/decision";
|
|
2
|
+
import { allFields, dataRef, isDecisionStep, langNameEn, localeOf, stepShape, templateRefs, wizardLang, } from "@engenty/wizards-shared/definition";
|
|
3
|
+
import { mainLogo, ruleLines, runTheme } from "@engenty/wizards-shared/projects";
|
|
4
|
+
import { note as runNote } from "@engenty/wizards-shared/run";
|
|
5
|
+
import { fitData, labelOf, recordsOf, shapeJsonSchema, shapeLines, shapeZod, titleKey, } from "@engenty/wizards-shared/shape";
|
|
6
|
+
import { SURFACE_GUIDE, validateSurface, } from "@engenty/wizards-shared/surface";
|
|
7
7
|
import { Agent } from "@mastra/core/agent";
|
|
8
8
|
import { generateText, jsonSchema, Output, parsePartialJson } from "ai";
|
|
9
9
|
import { extFor, loadAsset, loadAssetText } from "../files/storage.js";
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { assembleSurface, dataRef, listRef, } from "@engenty-
|
|
2
|
-
import { note } from "@engenty-
|
|
3
|
-
import { validateSurface } from "@engenty-
|
|
1
|
+
import { assembleSurface, dataRef, listRef, } from "@engenty/wizards-shared/definition";
|
|
2
|
+
import { note } from "@engenty/wizards-shared/run";
|
|
3
|
+
import { validateSurface } from "@engenty/wizards-shared/surface";
|
|
4
4
|
import { decide } from "./decide.js";
|
|
5
5
|
import { answersAsText, resolveRef } from "./template.js";
|
|
6
6
|
import { StepError } from "./types.js";
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { allFields, isAudioValue, isLocationValue, itemsTotals, localeOf, locationText, wizardLang, } from "@engenty-
|
|
2
|
-
import { formatMoney } from "@engenty-
|
|
3
|
-
import { fontLicenseWords, gradientCss, textStyleLine, } from "@engenty-
|
|
4
|
-
import { listAsMarkdown } from "@engenty-
|
|
1
|
+
import { allFields, isAudioValue, isLocationValue, itemsTotals, localeOf, locationText, wizardLang, } from "@engenty/wizards-shared/definition";
|
|
2
|
+
import { formatMoney } from "@engenty/wizards-shared/numbers";
|
|
3
|
+
import { fontLicenseWords, gradientCss, textStyleLine, } from "@engenty/wizards-shared/projects";
|
|
4
|
+
import { listAsMarkdown } from "@engenty/wizards-shared/store";
|
|
5
5
|
const TEMPLATE_RE = /\{\{\s*([^}]+?)\s*\}\}/g;
|
|
6
6
|
/** Line items as a Markdown table with their totals — what a model needs to write a document. */
|
|
7
7
|
export function itemsAsMarkdown(field, value, values, lang = "en") {
|
package/apps/runtime/dist/env.js
CHANGED
|
@@ -212,6 +212,11 @@ export const env = {
|
|
|
212
212
|
accessKeyId: str("S3_ACCESS_KEY_ID"),
|
|
213
213
|
secretAccessKey: str("S3_SECRET_ACCESS_KEY"),
|
|
214
214
|
},
|
|
215
|
+
/**
|
|
216
|
+
* An address of the server's own to send results from: with it, sharing by e-mail needs no
|
|
217
|
+
* mailbox of the person. `smtps://user:password@host:465`; empty = people send as themselves.
|
|
218
|
+
*/
|
|
219
|
+
mail: { smtpUrl: str("SMTP_URL"), from: str("MAIL_FROM") },
|
|
215
220
|
turnstile: { siteKey: str("TURNSTILE_SITE_KEY"), secret: str("TURNSTILE_SECRET_KEY") },
|
|
216
221
|
/**
|
|
217
222
|
* The mobile app (the apps repo engenty-wizards-apps, mobile/): a phone opens this runtime's `/w/` and `/s/` links in it.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { mkdirSync, readFileSync, statSync, writeFileSync } from "node:fs";
|
|
2
2
|
import { dirname, join } from "node:path";
|
|
3
|
-
import { declaredByPlugin, defaultFeatures, FEATURES, featureOn, parseFeatures, resolveFeatures, } from "@engenty-
|
|
3
|
+
import { declaredByPlugin, defaultFeatures, FEATURES, featureOn, parseFeatures, resolveFeatures, } from "@engenty/wizards-shared/features";
|
|
4
4
|
import { accountOverview } from "./auth/account.js";
|
|
5
5
|
import { isCheckout, layout, packageRoot } from "./cli/home.js";
|
|
6
6
|
import { env } from "./env.js";
|
|
@@ -2,8 +2,8 @@ import { createHash } from "node:crypto";
|
|
|
2
2
|
import { existsSync } from "node:fs";
|
|
3
3
|
import { cp, mkdir, readdir, readFile, rm, writeFile } from "node:fs/promises";
|
|
4
4
|
import { dirname, join, normalize } from "node:path";
|
|
5
|
-
import { dataRef, FILM_SIZES } from "@engenty-
|
|
6
|
-
import { gradientCss, ruleLines, textStyleLine } from "@engenty-
|
|
5
|
+
import { dataRef, FILM_SIZES } from "@engenty/wizards-shared/definition";
|
|
6
|
+
import { gradientCss, ruleLines, textStyleLine } from "@engenty/wizards-shared/projects";
|
|
7
7
|
import { unzipSync } from "fflate";
|
|
8
8
|
import { logoSectionLine, renderTemplate, resolveRef } from "../engine/template.js";
|
|
9
9
|
import { env } from "../env.js";
|
|
@@ -2,8 +2,8 @@ import { spawn } from "node:child_process";
|
|
|
2
2
|
import { existsSync } from "node:fs";
|
|
3
3
|
import { readFile, rm, stat } from "node:fs/promises";
|
|
4
4
|
import { isAbsolute, join, normalize } from "node:path";
|
|
5
|
-
import { FILM_SIZES } from "@engenty-
|
|
6
|
-
import { note as runNote } from "@engenty-
|
|
5
|
+
import { FILM_SIZES } from "@engenty/wizards-shared/definition";
|
|
6
|
+
import { note as runNote } from "@engenty/wizards-shared/run";
|
|
7
7
|
import { StepError } from "../engine/types.js";
|
|
8
8
|
import { CLAUDE_BIN, claudeEnv } from "../harness/claude.js";
|
|
9
9
|
import { failureOf } from "../harness/model.js";
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { writeFileSync } from "node:fs";
|
|
2
2
|
import { join } from "node:path";
|
|
3
|
-
import { resolveEnv, run } from "./env.js";
|
|
3
|
+
import { probeVersion, resolveEnv, run } from "./env.js";
|
|
4
4
|
import { failureOf, HarnessModel, runClient, } from "./model.js";
|
|
5
5
|
/**
|
|
6
6
|
* Antigravity CLI: `agy` answers on the Google sign-in it cached — the Google AI subscription,
|
|
@@ -114,15 +114,7 @@ export const antigravity = {
|
|
|
114
114
|
name: "Antigravity",
|
|
115
115
|
bin: AGY_BIN,
|
|
116
116
|
classes: CLASSES,
|
|
117
|
-
|
|
118
|
-
try {
|
|
119
|
-
const { stdout } = await run(AGY_BIN, ["--version"], { timeout: 10_000, env });
|
|
120
|
-
return stdout.trim().split("\n").pop()?.trim() || null;
|
|
121
|
-
}
|
|
122
|
-
catch {
|
|
123
|
-
return null;
|
|
124
|
-
}
|
|
125
|
-
},
|
|
117
|
+
version: (env) => probeVersion(AGY_BIN, env, (stdout) => stdout.trim().split("\n").pop()?.trim() || null),
|
|
126
118
|
// No login command: the client asks for the Google sign-in when it starts without one.
|
|
127
119
|
login: { args: [], interactive: true },
|
|
128
120
|
model: (alias, effort) => new AntigravityModel(antigravity, alias || CLASSES.standard, effort),
|
|
@@ -2,7 +2,7 @@ import { existsSync, mkdirSync, rmSync, writeFileSync } from "node:fs";
|
|
|
2
2
|
import { release } from "node:os";
|
|
3
3
|
import { dirname, join, resolve } from "node:path";
|
|
4
4
|
import { fileURLToPath } from "node:url";
|
|
5
|
-
import { langOf, SPEECH_LOCALES } from "@engenty-
|
|
5
|
+
import { langOf, SPEECH_LOCALES } from "@engenty/wizards-shared/definition";
|
|
6
6
|
import { nanoid } from "nanoid";
|
|
7
7
|
import { env } from "../env.js";
|
|
8
8
|
import { ffmpeg, hasFfmpeg } from "../media/ffmpeg.js";
|