wizards 0.2.27 → 0.2.29
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/apps/runtime/dist/authoring/guide.js +8 -2
- package/apps/runtime/dist/credits/estimate.js +4 -0
- package/apps/runtime/dist/engine/requirements.js +4 -0
- package/apps/runtime/dist/engine/steps.js +42 -1
- package/apps/runtime/dist/mcp/tools.js +2 -0
- package/apps/runtime/dist/routes/marketplace.js +2 -1
- package/apps/runtime/dist/services/marketplace.js +35 -4
- package/apps/runtime/dist/tools/plugin.js +49 -25
- package/apps/web/dist/assets/Account-BaOouMw9.js +1 -0
- package/apps/web/dist/assets/{ChangelogDialog-BdZ1SmEd.js → ChangelogDialog-3t_EKUPH.js} +1 -1
- package/apps/web/dist/assets/{CreditsDialog-fOYdoev3.js → CreditsDialog-BW-RETl-.js} +1 -1
- package/apps/web/dist/assets/EditorPage-DrJhgEHO.js +3 -0
- package/apps/web/dist/assets/{FlowPreview-U2AEnKlX.js → FlowPreview-Wu5ovKrU.js} +1 -1
- package/apps/web/dist/assets/{Harness-CtDlm_2b.js → Harness-Oh4MEjiK.js} +1 -1
- package/apps/web/dist/assets/HomePage-eYqUUwzG.js +1 -0
- package/apps/web/dist/assets/{ImportWizard-BMPGjd_t.js → ImportWizard-BSjp83g0.js} +1 -1
- package/apps/web/dist/assets/LocalRuntime-CqBfKp8q.js +1 -0
- package/apps/web/dist/assets/NewWizardPage-Bpqk-BwW.js +2 -0
- package/apps/web/dist/assets/{ProjectPage-_LAtG3tn.js → ProjectPage-SK7e8kxV.js} +2 -2
- package/apps/web/dist/assets/PublicRunner-Cu056QMy.js +1 -0
- package/apps/web/dist/assets/{RunDrawer-CtQoY3Ha.js → RunDrawer-BdcgNjPZ.js} +3 -3
- package/apps/web/dist/assets/RunnerView-JOMD-e27.js +2 -0
- package/apps/web/dist/assets/SettingsPage-BSu-2gL5.js +1 -0
- package/apps/web/dist/assets/SetupPage-DdWIlUCF.js +1 -0
- package/apps/web/dist/assets/SharePage-C5JlCg9u.js +1 -0
- package/apps/web/dist/assets/arrow-right-hy38IBRU.js +1 -0
- package/apps/web/dist/assets/changelog-C2q3P5lJ.js +1 -0
- package/apps/web/dist/assets/{circle-alert-BC6xmJ9r.js → circle-alert-BG9P3ewL.js} +1 -1
- package/apps/web/dist/assets/definition-CwX2olVF.js +1 -0
- package/apps/web/dist/assets/{esm-FEWi61F_.js → esm-MDvpTvd_.js} +1 -1
- package/apps/web/dist/assets/{external-link-wKL1HE6G.js → external-link-BwCtn1nW.js} +1 -1
- package/apps/web/dist/assets/{image-BMdSChOR.js → image-DG4q2P1H.js} +1 -1
- package/apps/web/dist/assets/index-knnf98Fv.js +78 -0
- package/apps/web/dist/assets/{lock-BpqzLMuv.js → lock-DH_BntP_.js} +1 -1
- package/apps/web/dist/assets/{meta-BqZ7SlZz.js → meta-cFJejpIa.js} +1 -1
- package/apps/web/dist/assets/{pen-line-DM-u0dES.js → pen-line-B1dsy3Sr.js} +1 -1
- package/apps/web/dist/assets/{refresh-cw-Bk7HkOIM.js → refresh-cw-B9M1g3SH.js} +1 -1
- package/apps/web/dist/assets/{settings-menu-BM_NfZfn.js → settings-menu-DC825gd1.js} +1 -1
- package/apps/web/dist/assets/{star-JHzYYl5R.js → star-axQV_3EC.js} +1 -1
- package/apps/web/dist/assets/surface-D7bnQtqR.js +56 -0
- package/apps/web/dist/assets/{trash-CdLg-Ela.js → trash-3S1_XpVa.js} +1 -1
- package/apps/web/dist/assets/{ui-8QmvuC9u.js → ui-BZ01zr3i.js} +1 -1
- package/apps/web/dist/assets/{upload-CL1R6shM.js → upload-U0i8fAW3.js} +1 -1
- package/apps/web/dist/assets/{video-BioLmXNO.js → video-Db4o719f.js} +1 -1
- package/apps/web/dist/assets/{volume-2-_IOfPNCv.js → volume-2-6f7qN_LM.js} +1 -1
- package/apps/web/dist/assets/{wand-sparkles-DYtDQSJZ.js → wand-sparkles-MelvBtiK.js} +1 -1
- package/apps/web/dist/index.html +3 -3
- package/apps/web/dist/mcp/flow.html +49 -49
- package/node_modules/@engenty-wizards/shared/dist/definition.d.ts +15 -3
- package/node_modules/@engenty-wizards/shared/dist/definition.js +38 -9
- package/node_modules/@engenty-wizards/shared/dist/marketplace-search.js +4 -1
- package/node_modules/@engenty-wizards/shared/dist/marketplace.d.ts +38 -1
- package/node_modules/@engenty-wizards/shared/dist/marketplace.js +34 -0
- package/package.json +1 -1
- package/apps/web/dist/assets/Account-DW396ig5.js +0 -1
- package/apps/web/dist/assets/EditorPage-CAARFsaI.js +0 -3
- package/apps/web/dist/assets/HomePage-Bd-mkLxW.js +0 -1
- package/apps/web/dist/assets/LocalRuntime-DjSNCRnV.js +0 -1
- package/apps/web/dist/assets/NewWizardPage-DZPcDR9i.js +0 -2
- package/apps/web/dist/assets/PublicRunner-6Iqp0DmU.js +0 -1
- package/apps/web/dist/assets/RunnerView-BLOCNZaZ.js +0 -2
- package/apps/web/dist/assets/SettingsPage-Z6skBf6I.js +0 -1
- package/apps/web/dist/assets/SetupPage-4-Lic4pT.js +0 -1
- package/apps/web/dist/assets/SharePage-DfdhXxZm.js +0 -1
- package/apps/web/dist/assets/arrow-right-BOtqnsA1.js +0 -1
- package/apps/web/dist/assets/brand-CCAI9p0f.js +0 -2
- package/apps/web/dist/assets/changelog-DQM0oz9S.js +0 -1
- package/apps/web/dist/assets/definition-D5V79jHA.js +0 -1
- package/apps/web/dist/assets/index-YJMooz0J.js +0 -132
|
@@ -114,12 +114,18 @@ type Field = {
|
|
|
114
114
|
// {{field}} → asset://ID, used as <img src="asset://ID">.
|
|
115
115
|
// slot: the person picks one appointment time, shown by day. Options are ISO 8601 date-times with their offset
|
|
116
116
|
// ("2026-10-12T09:00:00+02:00"), nearly always from optionsFrom; {{field}} is the chosen one, as offered.
|
|
117
|
-
// Booking: agent step "free" with
|
|
117
|
+
// Booking: agent step "free" with call { tool: "appointments.availability", input: { duration_minutes: 30, days: 14 } }
|
|
118
|
+
// and output { format: "json", fields: [{ id: "slots", kind: "table", columns: ["start","end","label"] }] };
|
|
118
119
|
// then a page { kind: "slot", optionsFrom: "steps.free.slots.start" }; then an agent step with appointments.book.
|
|
119
120
|
|
|
120
121
|
type AgentStep = {
|
|
121
122
|
type: "agent"
|
|
122
|
-
instructions: string // the task, with {{templates}}
|
|
123
|
+
instructions: string // the task, with {{templates}} ("" with call)
|
|
124
|
+
call?: { tool: "<plugin>.<tool>", input: { … } }
|
|
125
|
+
// NO MODEL: one plugin tool called once with this input; its answer IS the json output
|
|
126
|
+
// (fields name the keys later steps read). Use it where a model would only fetch and copy
|
|
127
|
+
// data (free appointment times) — it answers in a second instead of half a minute.
|
|
128
|
+
// String inputs are templates; a filled-in whole number or true/false is passed as one.
|
|
123
129
|
tools: ("web_search"|"web_fetch"|"browser"|"sandbox"|"image"|"http"|"pages")[]
|
|
124
130
|
mcp?: string[] // ids of the project's MCP servers this step may use
|
|
125
131
|
connections?: string[] // ids of wizard connections this step may read (mail → mail_search, mail_read, mail_save)
|
|
@@ -37,6 +37,10 @@ function formula(step, catalog) {
|
|
|
37
37
|
function stepFormula(step, catalog) {
|
|
38
38
|
const cls = (c) => catalog.classes[c];
|
|
39
39
|
if (step.type === "agent") {
|
|
40
|
+
// A call runs one tool and no model: nothing to pay for.
|
|
41
|
+
if (step.call) {
|
|
42
|
+
return 0;
|
|
43
|
+
}
|
|
40
44
|
// A decision is one small call to the classifier class.
|
|
41
45
|
if (isDecisionStep(step)) {
|
|
42
46
|
return textCredits(cls("classifier"), TOKENS.decision);
|
|
@@ -11,7 +11,7 @@ import { markMedia } from "../media/marking.js";
|
|
|
11
11
|
import { attachTools, costOf, isHarnessVendor, textModel } from "../models.js";
|
|
12
12
|
import { knowledgeBlock } from "../services/knowledge.js";
|
|
13
13
|
import { buildStepTools } from "../tools/index.js";
|
|
14
|
-
import { spaceContextOf } from "../tools/plugin.js";
|
|
14
|
+
import { callPluginTool, spaceContextOf } from "../tools/plugin.js";
|
|
15
15
|
import { personUploads } from "../tools/store.js";
|
|
16
16
|
import { runWidgetStep } from "../widgets/step.js";
|
|
17
17
|
import { decide } from "./decide.js";
|
|
@@ -338,7 +338,48 @@ async function runAgentEach(step, ctx) {
|
|
|
338
338
|
at: new Date().toISOString(),
|
|
339
339
|
};
|
|
340
340
|
}
|
|
341
|
+
/**
|
|
342
|
+
* A call's input as the step's answers fill it: string values are templates; a filled-in whole
|
|
343
|
+
* number or true/false becomes one, an empty value is left out.
|
|
344
|
+
*/
|
|
345
|
+
function callInput(value, ctx) {
|
|
346
|
+
if (typeof value === "string") {
|
|
347
|
+
const text = renderTemplate(value, ctx.scope).trim();
|
|
348
|
+
if (!text) {
|
|
349
|
+
return undefined;
|
|
350
|
+
}
|
|
351
|
+
if (/^-?\d+(\.\d+)?$/.test(text)) {
|
|
352
|
+
return Number(text);
|
|
353
|
+
}
|
|
354
|
+
return text === "true" ? true : text === "false" ? false : text;
|
|
355
|
+
}
|
|
356
|
+
if (Array.isArray(value)) {
|
|
357
|
+
return value.map((v) => callInput(v, ctx)).filter((v) => v !== undefined);
|
|
358
|
+
}
|
|
359
|
+
if (value && typeof value === "object") {
|
|
360
|
+
return Object.fromEntries(Object.entries(value)
|
|
361
|
+
.map(([k, v]) => [k, callInput(v, ctx)])
|
|
362
|
+
.filter(([, v]) => v !== undefined));
|
|
363
|
+
}
|
|
364
|
+
return value;
|
|
365
|
+
}
|
|
366
|
+
/** A step's `call`: one plugin tool, no model; its answer is the step's json output as it is. */
|
|
367
|
+
async function runCallStep(step, ctx) {
|
|
368
|
+
// What it is doing is the step's `working` line, shown as it starts, and what the tool says.
|
|
369
|
+
const answer = await callPluginTool(step.call.tool, callInput(step.call.input, ctx), ctx);
|
|
370
|
+
if (answer &&
|
|
371
|
+
typeof answer === "object" &&
|
|
372
|
+
"error" in answer &&
|
|
373
|
+
Object.keys(answer).length === 1) {
|
|
374
|
+
throw new StepError(String(answer.error));
|
|
375
|
+
}
|
|
376
|
+
const json = answer && typeof answer === "object" && !Array.isArray(answer) ? answer : { result: answer };
|
|
377
|
+
return { json, at: new Date().toISOString() };
|
|
378
|
+
}
|
|
341
379
|
export async function runAgentStep(step, ctx) {
|
|
380
|
+
if (step.call) {
|
|
381
|
+
return runCallStep({ ...step, call: step.call }, ctx);
|
|
382
|
+
}
|
|
342
383
|
if (step.each) {
|
|
343
384
|
return runAgentEach(step, ctx);
|
|
344
385
|
}
|
|
@@ -156,6 +156,8 @@ export function registerTools(server, who) {
|
|
|
156
156
|
useCases: s.useCases,
|
|
157
157
|
capabilities: s.capabilities,
|
|
158
158
|
...(s.plugin ? { plugin: s.plugin.name } : {}),
|
|
159
|
+
// Not startable here: its plugins come with the Pro plan.
|
|
160
|
+
...(s.needs?.length ? { needsPro: s.needs } : {}),
|
|
159
161
|
})));
|
|
160
162
|
tool("get_starter", "wizards:read", {
|
|
161
163
|
title: "Get starter",
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { CAPABILITY_IDS, INDUSTRY_IDS, ITEM_FORMAT_IDS, USE_CASE_IDS, } from "@engenty-wizards/shared/marketplace";
|
|
1
|
+
import { CAPABILITY_IDS, INDUSTRY_IDS, ITEM_FORMAT_IDS, MARKETPLACE_PLAN_IDS, USE_CASE_IDS, } from "@engenty-wizards/shared/marketplace";
|
|
2
2
|
import { Hono } from "hono";
|
|
3
3
|
import { z } from "zod";
|
|
4
4
|
import { asLang, marketplaceDetail, searchMarketplace, starEntry, } from "../services/marketplace.js";
|
|
@@ -9,6 +9,7 @@ const searchSchema = z.object({
|
|
|
9
9
|
industry: z.enum(INDUSTRY_IDS).optional(),
|
|
10
10
|
format: z.enum(ITEM_FORMAT_IDS).optional(),
|
|
11
11
|
capability: z.enum(CAPABILITY_IDS).optional(),
|
|
12
|
+
plan: z.enum(MARKETPLACE_PLAN_IDS).optional(),
|
|
12
13
|
starred: z
|
|
13
14
|
.enum(["1", "0"])
|
|
14
15
|
.optional()
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { createHash } from "node:crypto";
|
|
2
2
|
import { statSync } from "node:fs";
|
|
3
3
|
import { DEFINITION_VERSION, readable, wizardSchema, } from "@engenty-wizards/shared/definition";
|
|
4
|
-
import { capabilitiesOf, costTierOf, effortOf, formatsOf, MARKETPLACE_LANGS, } from "@engenty-wizards/shared/marketplace";
|
|
4
|
+
import { capabilitiesOf, costTierOf, effortOf, formatsOf, MARKETPLACE_LANGS, pluginsOf, } from "@engenty-wizards/shared/marketplace";
|
|
5
5
|
import { wizardOutline } from "@engenty-wizards/shared/marketplace-entry";
|
|
6
6
|
import { searchEntries } from "@engenty-wizards/shared/marketplace-search";
|
|
7
7
|
import { and, eq, inArray, notInArray } from "drizzle-orm";
|
|
@@ -11,7 +11,7 @@ import { missingCapabilities, optionalCapabilities, stepsWithoutModel, } from ".
|
|
|
11
11
|
import { env } from "../env.js";
|
|
12
12
|
import { managed } from "../manage.js";
|
|
13
13
|
import { classCatalog, imageCostUsd, tokenCostUsd, videoCostUsd, WEB_SEARCH_COST_USD, } from "../models.js";
|
|
14
|
-
import { pluginStartersOf } from "../plugins/registry.js";
|
|
14
|
+
import { pluginIdsOf, pluginStartersOf } from "../plugins/registry.js";
|
|
15
15
|
import { readSetting, writeSetting } from "../settings.js";
|
|
16
16
|
import { currentTenant, LOCAL_TENANT } from "../tenants/tenant.js";
|
|
17
17
|
import { ServiceError } from "./errors.js";
|
|
@@ -128,6 +128,8 @@ function pluginSummary({ id, plugin, starter }) {
|
|
|
128
128
|
costTier: costTierOf(capabilities),
|
|
129
129
|
steps: definition.steps.length,
|
|
130
130
|
version: definition.version,
|
|
131
|
+
plugins: [plugin.source.id],
|
|
132
|
+
plan: "pro",
|
|
131
133
|
};
|
|
132
134
|
}
|
|
133
135
|
/** A plugin's starter as this app shows it: never starred, and marked with its plugin. */
|
|
@@ -152,8 +154,31 @@ function addFacets(a, b) {
|
|
|
152
154
|
industry: add(a.industry, b.industry),
|
|
153
155
|
format: add(a.format, b.format),
|
|
154
156
|
capability: add(a.capability, b.capability),
|
|
157
|
+
plan: add(a.plan, b.plan),
|
|
155
158
|
};
|
|
156
159
|
}
|
|
160
|
+
/**
|
|
161
|
+
* The marketplace's entries as this tenant sees them: an entry that stands for a starter of a
|
|
162
|
+
* plugin it has is left out (the plugin's own is listed), and the others say which plugins they
|
|
163
|
+
* need that it does not have.
|
|
164
|
+
*/
|
|
165
|
+
async function withPlugins(entries) {
|
|
166
|
+
if (!entries.some((e) => e.plugins?.length || e.pluginStarter)) {
|
|
167
|
+
return entries;
|
|
168
|
+
}
|
|
169
|
+
const tenant = currentTenant();
|
|
170
|
+
const [have, starters] = await Promise.all([
|
|
171
|
+
pluginIdsOf(tenant),
|
|
172
|
+
pluginStartersOf(tenant).then((list) => new Set(list.map((s) => s.id))),
|
|
173
|
+
]);
|
|
174
|
+
return entries.flatMap((e) => {
|
|
175
|
+
if (e.pluginStarter && starters.has(e.pluginStarter)) {
|
|
176
|
+
return [];
|
|
177
|
+
}
|
|
178
|
+
const needs = (e.plugins ?? []).filter((id) => !have.has(id));
|
|
179
|
+
return [needs.length ? { ...e, needs } : e];
|
|
180
|
+
});
|
|
181
|
+
}
|
|
157
182
|
// --- searching -----------------------------------------------------------------------------
|
|
158
183
|
/** A summary as this app shows it: whether it can read and run it, and whether it is starred. */
|
|
159
184
|
function asEntry(summary, starred, unavailable, optional = new Set()) {
|
|
@@ -252,7 +277,7 @@ async function searchListed(search) {
|
|
|
252
277
|
const optional = await keptOptional(remote.entries.map((e) => e.id), lang, unavailable);
|
|
253
278
|
return {
|
|
254
279
|
...remote,
|
|
255
|
-
entries: remote.entries.map((e) => asEntry(e, starred, unavailable, optional.get(e.id))),
|
|
280
|
+
entries: await withPlugins(remote.entries.map((e) => asEntry(e, starred, unavailable, optional.get(e.id)))),
|
|
256
281
|
offline: false,
|
|
257
282
|
unavailable: [...unavailable],
|
|
258
283
|
};
|
|
@@ -264,7 +289,7 @@ async function searchListed(search) {
|
|
|
264
289
|
const optional = await keptOptional(page.entries.map((e) => e.id), lang, unavailable);
|
|
265
290
|
return {
|
|
266
291
|
...page,
|
|
267
|
-
entries: page.entries.map((e) => asEntry(e, starred, unavailable, optional.get(e.id))),
|
|
292
|
+
entries: await withPlugins(page.entries.map((e) => asEntry(e, starred, unavailable, optional.get(e.id)))),
|
|
268
293
|
offline: true,
|
|
269
294
|
unavailable: [...unavailable],
|
|
270
295
|
};
|
|
@@ -380,6 +405,12 @@ export async function marketplaceWizard(id, lang) {
|
|
|
380
405
|
if (!readable(found.definition)) {
|
|
381
406
|
throw new ServiceError("refused", "Diese Vorlage braucht eine neuere Version der App. Bitte aktualisiere die App.");
|
|
382
407
|
}
|
|
408
|
+
// A wizard whose plugins are not here would stop at its first step that uses them.
|
|
409
|
+
const have = await pluginIdsOf(currentTenant());
|
|
410
|
+
const needs = pluginsOf(wizardSchema.parse(found.definition)).filter((p) => !have.has(p));
|
|
411
|
+
if (needs.length) {
|
|
412
|
+
throw new ServiceError("refused", `Diese Vorlage braucht ${needs.length === 1 ? "das Plugin" : "die Plugins"} ${needs.join(", ")}: mit Pro auf engenty.ai dabei.`);
|
|
413
|
+
}
|
|
383
414
|
return {
|
|
384
415
|
id: found.id,
|
|
385
416
|
revision: found.revision,
|
|
@@ -7,44 +7,68 @@ import { attempt, clip } from "./shared.js";
|
|
|
7
7
|
export function pluginToolName(plugin, tool) {
|
|
8
8
|
return `${plugin.replaceAll("-", "_")}_${tool}`;
|
|
9
9
|
}
|
|
10
|
+
/** What a plugin's tool learns of the step that calls it. */
|
|
11
|
+
function toolContext(ctx) {
|
|
12
|
+
const space = { id: ctx.project.id, name: ctx.project.name };
|
|
13
|
+
return {
|
|
14
|
+
runId: ctx.runId,
|
|
15
|
+
stepId: ctx.stepId,
|
|
16
|
+
tenantId: ctx.tenantId,
|
|
17
|
+
space,
|
|
18
|
+
project: space,
|
|
19
|
+
wizard: { id: ctx.store.wizardId, title: ctx.def.title },
|
|
20
|
+
mode: ctx.test ? "test" : "live",
|
|
21
|
+
signal: ctx.signal,
|
|
22
|
+
emit: (message) => ctx.emit("tool", message),
|
|
23
|
+
};
|
|
24
|
+
}
|
|
10
25
|
/** A plugin's tool as an agent step calls it. */
|
|
11
26
|
function stepTool(plugin, tool, ctx) {
|
|
12
|
-
const id = pluginToolName(plugin, tool.name);
|
|
13
|
-
const space = { id: ctx.project.id, name: ctx.project.name };
|
|
14
27
|
return createTool({
|
|
15
|
-
id,
|
|
28
|
+
id: pluginToolName(plugin, tool.name),
|
|
16
29
|
description: tool.description,
|
|
17
30
|
inputSchema: tool.inputSchema,
|
|
18
|
-
execute: (input) => attempt(async () => tool.execute(input,
|
|
19
|
-
runId: ctx.runId,
|
|
20
|
-
stepId: ctx.stepId,
|
|
21
|
-
tenantId: ctx.tenantId,
|
|
22
|
-
space,
|
|
23
|
-
project: space,
|
|
24
|
-
wizard: { id: ctx.store.wizardId, title: ctx.def.title },
|
|
25
|
-
mode: ctx.test ? "test" : "live",
|
|
26
|
-
signal: ctx.signal,
|
|
27
|
-
emit: (message) => ctx.emit("tool", message),
|
|
28
|
-
})),
|
|
31
|
+
execute: (input) => attempt(async () => tool.execute(input, toolContext(ctx))),
|
|
29
32
|
});
|
|
30
33
|
}
|
|
34
|
+
/** A plugin's tool by its `<plugin>.<tool>` id, as this tenant has it; a StepError where it does not. */
|
|
35
|
+
async function toolOf(id, ctx) {
|
|
36
|
+
const named = pluginToolOf(id);
|
|
37
|
+
const has = named ? await pluginIdsOf(ctx.tenantId) : new Set();
|
|
38
|
+
const found = named && has.has(named.plugin) ? loadedPlugin(named.plugin)?.tools.get(named.tool) : undefined;
|
|
39
|
+
if (!(named && found)) {
|
|
40
|
+
const plugin = named?.plugin ?? id;
|
|
41
|
+
throw new StepError(`Dieser Schritt braucht das Werkzeug „${id}“. Das Plugin „${plugin}“ ist hier nicht installiert.`);
|
|
42
|
+
}
|
|
43
|
+
return { plugin: named.plugin, tool: found };
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Calls one plugin tool with its input as it is, no model between: a step's `call`. The input
|
|
47
|
+
* is checked against the tool's schema; what the tool throws is the step's error.
|
|
48
|
+
*/
|
|
49
|
+
export async function callPluginTool(id, input, ctx) {
|
|
50
|
+
const { tool } = await toolOf(id, ctx);
|
|
51
|
+
const parsed = tool.inputSchema.safeParse(input);
|
|
52
|
+
if (!parsed.success) {
|
|
53
|
+
const issue = parsed.error.issues[0];
|
|
54
|
+
throw new StepError(`„${id}“ bekam ungültige Angaben: ${issue?.path.join(".") || "input"} – ${issue?.message}`);
|
|
55
|
+
}
|
|
56
|
+
try {
|
|
57
|
+
return await tool.execute(parsed.data, toolContext(ctx));
|
|
58
|
+
}
|
|
59
|
+
catch (err) {
|
|
60
|
+
throw new StepError(String(err?.message ?? err).slice(0, 400));
|
|
61
|
+
}
|
|
62
|
+
}
|
|
31
63
|
/**
|
|
32
64
|
* The tools of plugins a step allowlists as `<plugin>.<tool>`. A step that names a tool this
|
|
33
65
|
* tenant does not have fails: the wizard was written for a runtime with that plugin.
|
|
34
66
|
*/
|
|
35
67
|
export async function pluginTools(step, ctx) {
|
|
36
|
-
const wanted = step.tools.map(pluginToolOf).filter((named) => named !== null);
|
|
37
|
-
if (!wanted.length) {
|
|
38
|
-
return {};
|
|
39
|
-
}
|
|
40
68
|
const tools = {};
|
|
41
|
-
const
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
if (!found) {
|
|
45
|
-
throw new StepError(`Dieser Schritt braucht das Werkzeug „${plugin}.${tool}“. Das Plugin „${plugin}“ ist hier nicht installiert.`);
|
|
46
|
-
}
|
|
47
|
-
tools[pluginToolName(plugin, tool)] = stepTool(plugin, found, ctx);
|
|
69
|
+
for (const id of step.tools.filter((t) => pluginToolOf(t) !== null)) {
|
|
70
|
+
const { plugin, tool } = await toolOf(id, ctx);
|
|
71
|
+
tools[pluginToolName(plugin, tool.name)] = stepTool(plugin, tool, ctx);
|
|
48
72
|
}
|
|
49
73
|
return tools;
|
|
50
74
|
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{a as e,n as t,t as n}from"./jsx-runtime-D3jfb0Ew.js";import{D as r,Q as i}from"./surface-D7bnQtqR.js";import{D as a,G as o,H as s,c,f as l,g as u,h as d,j as f,k as p,n as ee,o as m,r as h,s as g,t as _,x as v}from"./ui-BZ01zr3i.js";import{n as y,r as b}from"./upload-U0i8fAW3.js";import{t as x}from"./external-link-BwCtn1nW.js";import{B as te,H as S,I as C,U as w,W as T,_t as E,at as D,ft as O}from"./index-knnf98Fv.js";import{n as k}from"./LocalRuntime-CqBfKp8q.js";var A={name:`hard-drive`,size:24,node:[[`path`,{d:`M10 16h.01`,key:`1bzywj`}],[`path`,{d:`M2.212 11.577a2 2 0 0 0-.212.896V18a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2v-5.527a2 2 0 0 0-.212-.896L18.55 5.11A2 2 0 0 0 16.76 4H7.24a2 2 0 0 0-1.79 1.11z`,key:`18tbho`}],[`path`,{d:`M21.946 12.013H2.054`,key:`zqlbp7`}],[`path`,{d:`M6 16h.01`,key:`1pmjb7`}]]};A.node;var j=o(A),M={name:`layout-grid`,size:24,node:[[`rect`,{width:`7`,height:`7`,x:`3`,y:`3`,rx:`1`,key:`1g98yp`}],[`rect`,{width:`7`,height:`7`,x:`14`,y:`3`,rx:`1`,key:`6d4xhi`}],[`rect`,{width:`7`,height:`7`,x:`14`,y:`14`,rx:`1`,key:`nxv5o0`}],[`rect`,{width:`7`,height:`7`,x:`3`,y:`14`,rx:`1`,key:`1bb6yr`}]]};M.node;var N=o(M),P={name:`list`,size:24,node:[[`path`,{d:`M3 5h.01`,key:`18ugdj`}],[`path`,{d:`M3 12h.01`,key:`nlz23k`}],[`path`,{d:`M3 19h.01`,key:`noohij`}],[`path`,{d:`M8 5h13`,key:`1pao27`}],[`path`,{d:`M8 12h13`,key:`1za7za`}],[`path`,{d:`M8 19h13`,key:`m83p4d`}]]};P.node;var F=o(P),I=e(t(),1),L=e=>[`project-files`,e];function R(e){return r({queryKey:L(e),queryFn:()=>v.get(`/api/studio/projects/${e}/files`),refetchInterval:e=>e.state.data?.files.some(e=>e.status===`pending`)?2e3:!1})}function z(e,t){return a(`/api/studio/projects/${e}/files/${t}/content`)}function B(e,t=!1){let n=i(),[r,a]=(0,I.useState)(!1),[o,s]=(0,I.useState)(null),c=()=>n.invalidateQueries({queryKey:L(e)}),l=async e=>{s(null);try{await e()}catch(e){s(e.message)}finally{await c()}};return{busy:r,error:o,readOnly:t,upload:async(t,n)=>{a(!0),await l(async()=>{for(let r of n)await v.upload(`/api/studio/projects/${e}/files?kind=${t}`,r),await c()}),a(!1)},describe:(t,n)=>l(()=>v.patch(`/api/studio/projects/${e}/files/${t}`,{description:n})),remove:t=>l(()=>v.del(`/api/studio/projects/${e}/files/${t}`)),reindex:t=>l(()=>v.post(`/api/studio/projects/${e}/files/${t}/reindex`)),order:(t,n)=>l(()=>v.put(`/api/studio/projects/${e}/files/order`,{kind:t,ids:n}))}}function V(e,t){let n=`wz.layout.${e}`,[r,i]=(0,I.useState)(()=>{try{let e=localStorage.getItem(n);return e===`list`||e===`cards`?e:t}catch{return t}});return[r,()=>i(e=>{let t=e===`list`?`cards`:`list`;try{localStorage.setItem(n,t)}catch{}return t})]}function H(e,t,n=700){let[r,i]=(0,I.useState)(`idle`),[a,o]=(0,I.useState)(null),s=JSON.stringify(e),c=(0,I.useRef)(s),l=(0,I.useRef)({value:e,json:s,save:t});l.current={value:e,json:s,save:t};let u=(0,I.useRef)(Promise.resolve()),d=(0,I.useCallback)(()=>{let e=l.current;e.json!==c.current&&(c.current=e.json,i(`saving`),u.current=u.current.then(async()=>{try{await e.save(e.value),o(null),i(`saved`)}catch(e){c.current=``,o(e.message),i(`error`)}}))},[]);return(0,I.useEffect)(()=>{if(s===c.current)return;let e=setTimeout(d,n);return()=>clearTimeout(e)},[s,n,d]),(0,I.useEffect)(()=>d,[d]),{state:r,error:a}}function U(e){return e<1e6?`${Math.max(1,Math.round(e/1e3))} KB`:`${(e/1e6).toFixed(1)} MB`}var W=e(n(),1);function G({id:e,children:t}){return(0,W.jsx)(`div`,{id:e,className:`scroll-mt-24 max-md:scroll-mt-36`,children:t})}function K({title:e,hint:t,save:n,action:r,locked:i,plain:a,children:o}){return(0,W.jsxs)(`section`,{className:`flex flex-col gap-2.5`,children:[(0,W.jsxs)(`div`,{className:`flex items-start justify-between gap-4 px-1`,children:[(0,W.jsxs)(`div`,{className:`min-w-0`,children:[(0,W.jsxs)(`div`,{className:`flex items-center gap-3`,children:[(0,W.jsx)(`h2`,{className:`font-display font-semibold text-lg leading-tight`,children:e}),n?.state===`saving`?(0,W.jsxs)(`span`,{className:`inline-flex items-center gap-1.5 text-[0.75rem] text-ink-3`,children:[(0,W.jsx)(l,{className:`size-3`}),` `,f(`project.saving`)]}):n?.state===`saved`?(0,W.jsxs)(`span`,{className:`inline-flex items-center gap-1 text-[0.75rem] text-moss`,children:[(0,W.jsx)(s,{className:`size-3.5`}),` `,f(`settings.saved`)]}):null]}),t?(0,W.jsx)(`p`,{className:`mt-1 text-[0.875rem] text-ink-3 leading-snug`,children:t}):null]}),r?(0,W.jsx)(`div`,{className:`shrink-0`,children:r}):null]}),a?o:(0,W.jsxs)(ee,{className:`p-3.5 sm:p-5`,children:[i?(0,W.jsx)(`fieldset`,{disabled:!0,className:`min-w-0`,children:o}):o,n?.state===`error`&&n.error?(0,W.jsx)(`p`,{className:`mt-4 text-[0.875rem] text-rose`,children:n.error}):null]})]})}function q({children:e,layout:t,onToggle:n}){return(0,W.jsxs)(`div`,{className:`mb-3 flex items-start gap-2`,children:[(0,W.jsx)(`div`,{className:`min-w-0 flex-1`,children:(0,W.jsx)(`div`,{className:`w-56 max-w-full transition-[width] duration-200 focus-within:w-full has-[input:not(:placeholder-shown)]:w-full`,children:e})}),(0,W.jsx)(m,{label:f(t===`list`?`project.viewCards`:`project.viewList`),onClick:n,children:t===`list`?(0,W.jsx)(N,{className:`size-4`}):(0,W.jsx)(F,{className:`size-4`})})]})}function J({value:e,onChange:t,onEnter:n,placeholder:r,busy:i}){return(0,W.jsxs)(`div`,{className:`relative`,children:[(0,W.jsx)(y,{className:`-translate-y-1/2 pointer-events-none absolute top-1/2 left-3 size-4 text-ink-4`}),(0,W.jsx)(`input`,{type:`search`,value:e,placeholder:r,onChange:e=>t(e.target.value),onKeyDown:e=>e.key===`Enter`&&n?.(),className:`h-9 w-full rounded-lg border border-input bg-card pr-3 pl-9 text-[0.875rem] text-ink outline-none transition placeholder:text-ink-4 focus:border-focus focus:ring-4 focus:ring-focus-glow`}),i?(0,W.jsx)(l,{className:`-translate-y-1/2 absolute top-1/2 right-3 size-4 text-ink-3`}):null]})}function Y({onFiles:e,accept:t,multiple:n=!0,className:r,children:i}){return(0,W.jsxs)(`label`,{onDragOver:e=>{e.preventDefault(),e.currentTarget.dataset.over=`1`},onDragLeave:e=>{delete e.currentTarget.dataset.over},onDrop:t=>{t.preventDefault(),delete t.currentTarget.dataset.over;let r=Array.from(t.dataTransfer.files);r.length&&e(n?r:r.slice(0,1))},className:u(`flex cursor-pointer items-center justify-center gap-2 rounded-lg border border-input border-dashed text-[0.875rem] text-ink-3 transition focus-within:border-focus focus-within:ring-4 focus-within:ring-focus-glow hover:border-ink-4 hover:text-ink data-[over]:border-focus data-[over]:bg-paper-2 data-[over]:text-ink`,r),children:[i,(0,W.jsx)(`input`,{className:`sr-only`,type:`file`,accept:t,multiple:n,onChange:t=>{let n=Array.from(t.target.files??[]);t.target.value=``,n.length&&e(n)}})]})}var X=`mt-1.5 text-[0.8125rem] text-ink-3`;function Z(e){let t=i(),[n,r]=(0,I.useState)(!1),a=E({mutationFn:e=>v.post(`/api/studio/account/link`,e),onSuccess:({url:e})=>{k(e),r(!0)}});return(0,I.useEffect)(()=>{if(!n)return;let e=setInterval(()=>void t.invalidateQueries({queryKey:[`me`]}),2e3),i=setTimeout(()=>r(!1),3e5);return()=>{clearInterval(e),clearTimeout(i)}},[n,t]),(0,I.useEffect)(()=>{e&&r(!1)},[e]),{link:a,waiting:n}}function Q({link:e,waiting:t}){return e.isError?(0,W.jsx)(`p`,{className:`text-[0.8125rem] text-rose`,children:f(`local.accountFailed`)}):t?(0,W.jsxs)(`p`,{className:`flex items-center gap-2 text-[0.8125rem] text-ink-3`,children:[(0,W.jsx)(l,{className:`size-3.5`}),` `,f(`local.accountWaiting`)]}):null}function ne(){let e=Z(!1),{link:t}=e,[n,r]=(0,I.useState)(``);return(0,W.jsxs)(`div`,{className:`flex flex-col divide-y divide-border-soft`,children:[(0,W.jsxs)(`div`,{className:`flex items-start gap-4 py-5 first:pt-0 last:pb-0`,children:[(0,W.jsx)(`div`,{className:`flex size-11 shrink-0 items-center justify-center rounded-full bg-paper-2 text-ink-2`,children:(0,W.jsx)(j,{className:`size-5`})}),(0,W.jsxs)(`div`,{className:`min-w-0`,children:[(0,W.jsx)(`div`,{className:`font-medium text-[0.9375rem]`,children:f(`account.local`)}),(0,W.jsx)(`p`,{className:`mt-1 text-[0.875rem] text-ink-3 leading-relaxed`,children:f(`account.localText`)})]})]}),w.account?(0,W.jsxs)(`div`,{className:`flex flex-col gap-4 py-5 last:pb-0`,children:[(0,W.jsxs)(`div`,{children:[(0,W.jsx)(`div`,{className:`font-medium text-[0.9375rem]`,children:f(`account.with`)}),(0,W.jsxs)(`ul`,{className:`mt-2 flex flex-col gap-2 text-[0.875rem] text-ink-2 leading-snug`,children:[(0,W.jsxs)(`li`,{className:`flex items-start gap-2.5`,children:[(0,W.jsx)(b,{className:`mt-0.5 size-4 shrink-0 text-amber`}),f(`account.withCredits`)]}),(0,W.jsxs)(`li`,{className:`flex items-start gap-2.5`,children:[(0,W.jsx)(O,{className:`mt-0.5 size-4 shrink-0 text-cobalt`}),f(`account.withCloud`)]})]})]}),(0,W.jsx)(`div`,{children:(0,W.jsx)(_,{busy:t.isPending&&!t.variables?.signup,onClick:()=>t.mutate({}),children:f(`account.signIn`)})})]}):null,w.account?(0,W.jsxs)(`form`,{className:`flex flex-col gap-3 py-5 last:pb-0`,onSubmit:e=>{e.preventDefault(),t.mutate({signup:!0,code:n.trim()||void 0})},children:[(0,W.jsxs)(`div`,{children:[(0,W.jsx)(`div`,{className:`font-medium text-[0.9375rem]`,children:f(`account.new`)}),(0,W.jsx)(`p`,{className:`mt-1 text-[0.875rem] text-ink-3 leading-relaxed`,children:f(`account.newHint`)})]}),(0,W.jsxs)(`div`,{className:`flex flex-wrap gap-2`,children:[(0,W.jsx)(g,{value:n,maxLength:64,autoComplete:`off`,spellCheck:!1,placeholder:f(`account.code`),"aria-label":f(`account.code`),onChange:e=>r(e.target.value),className:`w-56 font-mono text-[0.875rem]`}),(0,W.jsx)(_,{type:`submit`,variant:`secondary`,className:`h-11`,busy:t.isPending&&!!t.variables?.signup,children:f(`account.create`)})]}),(0,W.jsx)(Q,{...e})]}):null]})}var $={start:`account.kind.start`,monthly:`account.kind.monthly`,gift:`account.kind.gift`};function re({account:e}){let t=i(),n=Z(e.signedIn),r=E({mutationFn:()=>v.del(`/api/studio/account`),onSuccess:()=>t.invalidateQueries({queryKey:[`me`]})}),a=new Intl.DateTimeFormat(p,{dateStyle:`medium`});return(0,W.jsxs)(`div`,{className:`flex flex-col divide-y divide-border-soft`,children:[(0,W.jsxs)(`div`,{className:`flex flex-wrap items-center gap-x-4 gap-y-3 py-5 first:pt-0`,children:[(0,W.jsxs)(`div`,{className:`min-w-0 flex-1`,children:[(0,W.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,W.jsx)(`span`,{className:`truncate font-medium text-[0.9375rem]`,children:e.name||e.email}),e.signedIn?(0,W.jsx)(h,{tone:`live`,children:f(`account.linked`)}):null]}),(0,W.jsx)(`div`,{className:`truncate text-[0.875rem] text-ink-3`,children:e.email})]}),(0,W.jsxs)(`div`,{className:`flex flex-wrap items-center gap-2`,children:[(0,W.jsxs)(_,{variant:`secondary`,onClick:()=>k(e.url),children:[f(`setup.openAccount`),` `,(0,W.jsx)(x,{className:`size-4`})]}),(0,W.jsxs)(_,{variant:`ghost`,busy:r.isPending,onClick:()=>r.mutate(),children:[(0,W.jsx)(D,{className:`size-4`}),` `,f(`nav.logout`)]})]})]}),e.signedIn?null:(0,W.jsxs)(`div`,{className:`flex flex-col gap-3 py-5`,children:[(0,W.jsx)(`p`,{className:`text-[0.875rem] text-ink-2`,children:f(`local.accountExpired`)}),(0,W.jsx)(`div`,{children:(0,W.jsx)(_,{busy:n.link.isPending,onClick:()=>n.link.mutate({}),children:f(`account.signInAgain`)})}),(0,W.jsx)(Q,{...n})]}),e.credits===null?null:(0,W.jsxs)(`div`,{className:`py-5`,children:[(0,W.jsxs)(`div`,{className:`flex flex-wrap items-center gap-x-4 gap-y-3`,children:[(0,W.jsxs)(`div`,{className:`min-w-0 flex-1`,children:[(0,W.jsx)(`div`,{className:`text-[0.8125rem] text-ink-3`,children:f(`account.credits`)}),(0,W.jsx)(`div`,{className:`font-display font-semibold text-[1.375rem] tabular-nums leading-tight`,children:f(`nav.credits`,{n:Math.floor(e.credits).toLocaleString()})})]}),(0,W.jsxs)(_,{variant:`secondary`,onClick:()=>k(`${e.url}/billing`),children:[f(`account.topUp`),` `,(0,W.jsx)(x,{className:`size-4`})]})]}),e.expiring.length?(0,W.jsx)(`ul`,{className:`mt-3 flex flex-col gap-1 text-[0.8125rem] text-ink-3 tabular-nums`,children:e.expiring.map(e=>(0,W.jsxs)(`li`,{children:[f(`account.expires`,{n:Math.floor(e.credits).toLocaleString(),date:a.format(new Date(e.expiresAt))}),$[e.kind]?(0,W.jsxs)(`span`,{className:`text-ink-4`,children:[` · `,f($[e.kind])]}):null]},`${e.kind}:${e.expiresAt}`))}):null]}),(0,W.jsxs)(`div`,{className:`flex items-start gap-2.5 py-5 text-[0.875rem] text-ink-2 leading-snug last:pb-0`,children:[(0,W.jsx)(O,{className:`mt-0.5 size-4 shrink-0 text-cobalt`}),(0,W.jsx)(`p`,{children:f(`account.cloud`,{host:C(e.cloudUrl)})})]})]})}function ie({me:e,fromAccount:t}){let n=i(),[r,a]=(0,I.useState)(e.profile),o=e=>a(t=>({...t,...e})),s=H(r,async e=>{await v.put(`/api/studio/profile`,e),await n.invalidateQueries({queryKey:[`me`]})});return(0,W.jsx)(K,{title:f(`account.profile`),hint:f(`account.hint`),save:s,children:(0,W.jsxs)(`div`,{className:`flex flex-col gap-6 sm:flex-row sm:gap-8`,children:[(0,W.jsxs)(`div`,{className:`flex shrink-0 flex-col items-center gap-2 sm:w-32`,children:[(0,W.jsx)(`div`,{className:`flex size-20 items-center justify-center overflow-hidden rounded-full bg-ember-tint font-semibold text-[1.75rem] text-ember-strong ring-1 ring-border-soft`,children:e.user.image?(0,W.jsx)(`img`,{src:e.user.image,alt:``,className:`size-full object-cover`}):T(r.name)||`?`}),(0,W.jsx)(`p`,{className:`text-center text-[0.75rem] text-ink-3 leading-snug`,children:f(`account.initials`)})]}),(0,W.jsxs)(`div`,{className:`flex min-w-0 flex-1 flex-col gap-5`,children:[(0,W.jsxs)(`div`,{children:[(0,W.jsx)(c,{children:f(`account.name`)}),(0,W.jsx)(g,{value:r.name,maxLength:80,disabled:t,onChange:e=>o({name:e.target.value})}),(0,W.jsx)(`p`,{className:X,children:f(t?`account.fromAccount`:`account.nameHint`)})]}),(0,W.jsxs)(`div`,{children:[(0,W.jsx)(c,{children:f(`account.about`)}),(0,W.jsx)(d,{minRows:3,maxLength:2e3,value:r.about,onChange:e=>o({about:e.target.value})}),(0,W.jsx)(`p`,{className:X,children:f(`account.aboutHint`)})]}),(0,W.jsxs)(`div`,{className:`grid gap-5 sm:grid-cols-2`,children:[(0,W.jsxs)(`div`,{children:[(0,W.jsx)(c,{children:f(`account.email`)}),(0,W.jsx)(g,{type:`email`,value:r.email,maxLength:200,disabled:t,onChange:e=>o({email:e.target.value})})]}),(0,W.jsxs)(`div`,{children:[(0,W.jsx)(c,{children:f(`account.phone`)}),(0,W.jsx)(g,{type:`tel`,value:r.phone,maxLength:40,onChange:e=>o({phone:e.target.value})})]})]})]})]})})}function ae({me:e}){let t=e.mode===`managed`,n=t||!!e.account;return(0,W.jsxs)(`div`,{className:`flex flex-col gap-9`,children:[(0,W.jsx)(K,{title:f(`account.connection`),hint:f(`account.connectionHint`),children:t?(0,W.jsxs)(`div`,{className:`flex flex-wrap items-center gap-4`,children:[(0,W.jsxs)(`div`,{className:`min-w-0 flex-1`,children:[(0,W.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,W.jsx)(`span`,{className:`truncate font-medium text-[0.9375rem]`,children:e.user.name}),(0,W.jsx)(h,{tone:`live`,children:f(`account.linked`)})]}),(0,W.jsx)(`div`,{className:`truncate text-[0.875rem] text-ink-3`,children:e.user.email})]}),e.manageUrl?(0,W.jsxs)(_,{variant:`secondary`,onClick:()=>k(`${e.manageUrl}/account`),children:[f(`setup.openAccount`),` `,(0,W.jsx)(x,{className:`size-4`})]}):null]}):e.account?(0,W.jsx)(re,{account:e.account}):(0,W.jsx)(ne,{})}),(0,W.jsx)(ie,{me:e,fromAccount:n},n?`account`:`own`),(0,W.jsx)(K,{title:f(`account.look`),hint:f(`account.lookHint`),children:(0,W.jsxs)(`div`,{className:`flex flex-col divide-y divide-border-soft`,children:[(0,W.jsxs)(`div`,{className:`flex items-center justify-between gap-4 pb-4`,children:[(0,W.jsx)(`span`,{className:`font-medium text-[0.875rem]`,children:f(`nav.language`)}),(0,W.jsx)(S,{tone:`surface`})]}),(0,W.jsxs)(`div`,{className:`flex items-center justify-between gap-4 pt-4`,children:[(0,W.jsx)(`span`,{className:`font-medium text-[0.875rem]`,children:f(`nav.theme`)}),(0,W.jsx)(te,{})]})]})})]})}export{Y as a,K as c,H as d,B as f,N as h,G as i,U as l,R as m,Q as n,q as o,V as p,Z as r,J as s,ae as t,z as u};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{a as e,n as t,t as n}from"./jsx-runtime-D3jfb0Ew.js";import{t as r}from"./preload-helper-CNEI7N0N.js";import{a as i,f as a,g as o,i as s,j as c,s as l}from"./ui-
|
|
1
|
+
import{a as e,n as t,t as n}from"./jsx-runtime-D3jfb0Ew.js";import{t as r}from"./preload-helper-CNEI7N0N.js";import{a as i,f as a,g as o,i as s,j as c,s as l}from"./ui-BZ01zr3i.js";var u=e(t(),1),d=e(n(),1);function f(e){switch(e.group){case`Added`:return{label:`NEW`,dot:`bg-moss`};case`Fixed`:return{label:`FIXED`,dot:`bg-amber`};case`Changed`:return{label:`CHANGED`,dot:`bg-cobalt`};case`Performance`:return{label:`PERFORMANCE`,dot:`bg-ember`};case`Deploy`:return{label:`DEPLOY`,dot:`bg-ink-4`};case`Docs`:return{label:`DOCS`,dot:`bg-ink-4`};default:return{label:`OTHER`,dot:`bg-ink-4`}}}var p=e=>e.version?e.version.replace(/^v/,``):c(`about.unreleased`),m=e=>e.timestamp?new Date(e.timestamp*1e3).toISOString().slice(0,10):``,h=e=>e.charAt(0).toUpperCase()+e.slice(1);function g(e,t){let n=t.trim().toLowerCase();if(!n)return e;let r=[];for(let t of e){if(`${p(t)} ${m(t)}`.toLowerCase().includes(n)){r.push(t);continue}let e=t.commits.filter(e=>`${f(e).label} ${e.scope??``} ${e.message}`.toLowerCase().includes(n));e.length>0&&r.push({...t,commits:e})}return r}async function _(e){if(e)try{let t=await fetch(`https://raw.githubusercontent.com/engenty/engenty-wizards/v${e}/apps/web/src/about/changelog.json`,{signal:AbortSignal.timeout(5e3)});if(t.ok)return await t.json()}catch{}return(await r(async()=>{let{default:e}=await import(`./changelog-C2q3P5lJ.js`);return{default:e}},[])).default}function v({open:e,onClose:t,version:n}){let[r,v]=(0,u.useState)(null),[y,b]=(0,u.useState)(``);(0,u.useEffect)(()=>{if(!e||r)return;let t=!1;return _(n).then(e=>{t||v(e)}),()=>{t=!0}},[e,r,n]),(0,u.useEffect)(()=>{e||b(``)},[e]);let x=r?g(r,y):[];return(0,d.jsxs)(s,{open:e,onClose:t,title:c(`about.changelog`),wide:!0,children:[(0,d.jsx)(`p`,{className:`-mt-3 mb-4 text-[0.875rem] text-ink-3`,children:c(`about.changelogHint`)}),r===null?(0,d.jsx)(`div`,{className:`flex justify-center py-10 text-ink-3`,children:(0,d.jsx)(a,{})}):r.length===0?(0,d.jsx)(i,{children:c(`about.changelogEmpty`)}):(0,d.jsxs)(d.Fragment,{children:[(0,d.jsx)(l,{type:`search`,value:y,placeholder:c(`about.search`),onChange:e=>b(e.target.value)}),x.length===0?(0,d.jsx)(i,{children:c(`about.noMatches`)}):null,x.map(e=>(0,d.jsxs)(`section`,{className:`mt-6`,children:[(0,d.jsxs)(`h3`,{className:`flex items-baseline gap-3 border-border-soft border-b pb-2 font-display font-semibold text-[1rem]`,children:[p(e),(0,d.jsx)(`span`,{className:`font-normal font-sans text-[0.8125rem] text-ink-3 tabular-nums`,children:m(e)})]}),(0,d.jsx)(`ul`,{className:`mt-3 flex flex-col gap-2`,children:e.commits.map(e=>{let t=f(e);return(0,d.jsxs)(`li`,{className:`flex items-start gap-2.5 text-[0.875rem]`,children:[(0,d.jsx)(`span`,{className:o(`mt-[7px] size-1.5 shrink-0 rounded-full`,t.dot)}),(0,d.jsxs)(`span`,{className:`min-w-0 text-ink-2`,children:[(0,d.jsxs)(`span`,{className:`font-semibold text-[0.75rem] text-ink tracking-wide`,children:[t.label,e.scope?` [${e.scope}]`:``]}),` `,h(e.message),e.breaking?(0,d.jsx)(`span`,{className:`ml-1.5 rounded-full bg-rose-tint px-1.5 py-0.5 font-medium text-[0.75rem] text-rose`,children:c(`about.breaking`)}):null]})]},e.id)})})]},e.version??`unreleased`))]})]})}export{v as ChangelogDialog};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{a as e,n as t,t as n}from"./jsx-runtime-D3jfb0Ew.js";import{t as r}from"./preload-helper-CNEI7N0N.js";import{a as i,f as a,i as o,j as s,k as c,s as l}from"./ui-
|
|
1
|
+
import{a as e,n as t,t as n}from"./jsx-runtime-D3jfb0Ew.js";import{t as r}from"./preload-helper-CNEI7N0N.js";import{a as i,f as a,i as o,j as s,k as c,s as l}from"./ui-BZ01zr3i.js";import{t as u}from"./external-link-BwCtn1nW.js";var d=e(t(),1),f=[{name:`engenty wizards`,description:{de:`KI-Wizards aus einer Beschreibung, mit einem Link geteilt.`,en:`AI wizards built from a description, shared with a link.`},homepage:`https://github.com/engenty/engenty-wizards`,license:`FSL-1.1-MIT`},{name:`engenty`,description:{de:`Konnektoren, Datentabellen, Suche und die Engenties stammen aus dem engenty-Framework.`,en:`Connectors, data tables, search and the engenties come from the engenty framework.`},homepage:`https://github.com/engenty/engenty`,license:`FSL-1.1-MIT`}],p=[{name:`Mastra`,description:{de:`Agent-Framework hinter den KI-Schritten.`,en:`Agent framework behind the AI steps.`},homepage:`https://github.com/mastra-ai/mastra`,license:`Apache-2.0`},{name:`AI SDK`,description:{de:`Modell-Aufrufe für Text, Bild, Video und Sprache.`,en:`Model calls for text, image, video and speech.`},homepage:`https://github.com/vercel/ai`,license:`Apache-2.0`},{name:`Model Context Protocol`,description:{de:`MCP-Server zum Bauen von Wizards, MCP-Client für Werkzeuge der Schritte.`,en:`MCP server for building wizards, MCP client for the steps' tools.`},homepage:`https://github.com/modelcontextprotocol/typescript-sdk`,license:`MIT`},{name:`Hono`,description:{de:`HTTP-API der Runtime.`,en:`The runtime's HTTP API.`},homepage:`https://github.com/honojs/hono`,license:`MIT`},{name:`Drizzle ORM`,description:{de:`Schema und Migrationen der Datenbanken.`,en:`Schema and migrations of the databases.`},homepage:`https://github.com/drizzle-team/drizzle-orm`,license:`Apache-2.0`},{name:`libSQL`,description:{de:`Eine Datenbank je Mandant, lokal als Datei oder bei Turso.`,en:`One database per tenant, a local file or at Turso.`},homepage:`https://github.com/tursodatabase/libsql`,license:`MIT`},{name:`Playwright`,description:{de:`Browser-Schritte sowie PDF- und PNG-Export.`,en:`Browser steps and the PDF and PNG export.`},homepage:`https://github.com/microsoft/playwright`,license:`Apache-2.0`},{name:`agentOS`,description:{de:`Sandbox für Code-Schritte ohne Docker.`,en:`Sandbox for code steps without Docker.`},homepage:`https://github.com/rivet-dev/agentos`,license:`Apache-2.0`},{name:`React`,description:{de:`UI-Bibliothek der Web-App.`,en:`UI library of the web app.`},homepage:`https://github.com/facebook/react`,license:`MIT`},{name:`Vite`,description:{de:`Build-Werkzeug der Web-App.`,en:`Build tool of the web app.`},homepage:`https://github.com/vitejs/vite`,license:`MIT`},{name:`Tailwind CSS`,description:{de:`Styling der Oberfläche.`,en:`Styling of the interface.`},homepage:`https://github.com/tailwindlabs/tailwindcss`,license:`MIT`},{name:`React Flow`,description:{de:`Das Diagramm der Schritte im Editor.`,en:`The diagram of steps in the editor.`},homepage:`https://github.com/xyflow/xyflow`,license:`MIT`},{name:`TanStack Query`,description:{de:`Server-Daten in der Web-App.`,en:`Server data in the web app.`},homepage:`https://github.com/TanStack/query`,license:`MIT`},{name:`xterm.js`,description:{de:`Das Terminal auf der Seite, in dem sich KI-Clients anmelden.`,en:`The terminal on the page where AI clients sign in.`},homepage:`https://github.com/xtermjs/xterm.js`,license:`MIT`},{name:`Lucide`,description:{de:`Icons.`,en:`Icons.`},homepage:`https://github.com/lucide-icons/lucide`,license:`ISC`},{name:`Geist & Geist Mono`,description:{de:`Schrift der Oberfläche.`,en:`Typeface of the interface.`},homepage:`https://github.com/vercel/geist-font`,license:`OFL-1.1`},{name:`Space Grotesk`,description:{de:`Schrift der Überschriften.`,en:`Typeface of the headings.`},homepage:`https://github.com/floriankarsten/space-grotesk`,license:`OFL-1.1`},{name:`git-cliff`,description:{de:`Erzeugt den Changelog aus den Commits.`,en:`Generates the changelog from the commits.`},homepage:`https://github.com/orhun/git-cliff`,license:`MIT OR Apache-2.0`}],m=e(n(),1),h=(e,...t)=>t.some(t=>t?.toLowerCase().includes(e));function g({name:e,homepage:t,version:n,license:r,description:i}){return(0,m.jsxs)(`li`,{className:`py-2.5`,children:[(0,m.jsxs)(`div`,{className:`flex flex-wrap items-baseline gap-x-2.5 gap-y-0.5`,children:[t?(0,m.jsxs)(`a`,{href:t,target:`_blank`,rel:`noreferrer`,className:`inline-flex items-center gap-1 font-medium text-[0.875rem] text-ink underline-offset-4 hover:underline`,children:[e,(0,m.jsx)(u,{"aria-hidden":!0,className:`size-3 text-ink-4`})]}):(0,m.jsx)(`span`,{className:`font-medium text-[0.875rem] text-ink`,children:e}),n?(0,m.jsx)(`span`,{className:`text-[0.75rem] text-ink-3 tabular-nums`,children:n}):null,(0,m.jsx)(`span`,{className:`text-[0.75rem] text-ink-3`,children:r})]}),i?(0,m.jsx)(`p`,{className:`mt-0.5 text-[0.8125rem] text-ink-3`,children:i}):null]})}function _({title:e,hint:t,children:n}){return(0,m.jsxs)(`section`,{className:`mt-6`,children:[(0,m.jsx)(`h3`,{className:`border-border-soft border-b pb-2 font-display font-semibold text-[1rem]`,children:e}),t?(0,m.jsx)(`p`,{className:`mt-2 text-[0.8125rem] text-ink-3`,children:t}):null,n]})}function v({credits:e}){return(0,m.jsx)(`ul`,{className:`divide-y divide-border-soft`,children:e.map(e=>(0,m.jsx)(g,{name:e.name,homepage:e.homepage,license:e.license,description:e.description[c]},e.name))})}function y({label:e,packages:t}){return(0,m.jsxs)(`div`,{className:`mt-4`,children:[(0,m.jsx)(`h4`,{className:`font-medium text-[0.75rem] text-ink-3 tracking-wide`,children:e}),(0,m.jsx)(`ul`,{className:`divide-y divide-border-soft`,children:t.map(e=>(0,m.jsx)(g,{...e},e.name))})]})}function b({open:e,onClose:t}){let[n,c]=(0,d.useState)(null),[u,g]=(0,d.useState)(``);(0,d.useEffect)(()=>{if(!e||n)return;let t=!1;return r(()=>import(`./oss-credits-CIxnNZor.js`).then(e=>{t||c(e.default)}),[]),()=>{t=!0}},[e,n]),(0,d.useEffect)(()=>{e||g(``)},[e]);let b=u.trim().toLowerCase(),x=e=>b?e.filter(e=>h(b,e.name,e.license,e.description.de,e.description.en)):e,S=e=>b?e.filter(e=>h(b,e.name,e.license,e.version)):e,C=x(f),w=x(p),T=n?[{id:`shared`,label:s(`about.creditsShared`),packages:S(n.shared)},...n.groups.map(e=>({id:e.id,label:e.label,packages:S(e.packages)}))].filter(e=>e.packages.length>0):[],E=C.length===0&&w.length===0&&T.length===0;return(0,m.jsxs)(o,{open:e,onClose:t,title:s(`about.credits`),wide:!0,children:[(0,m.jsx)(`p`,{className:`-mt-3 mb-4 text-[0.875rem] text-ink-3`,children:s(`about.creditsHint`)}),(0,m.jsx)(l,{type:`search`,value:u,placeholder:s(`about.search`),onChange:e=>g(e.target.value)}),C.length>0?(0,m.jsx)(_,{title:s(`about.creditsProduct`),children:(0,m.jsx)(v,{credits:C})}):null,w.length>0?(0,m.jsx)(_,{title:s(`about.creditsBuiltWith`),children:(0,m.jsx)(v,{credits:w})}):null,n===null?(0,m.jsx)(`div`,{className:`flex justify-center py-10 text-ink-3`,children:(0,m.jsx)(a,{})}):T.length>0?(0,m.jsx)(_,{title:s(`about.creditsDeps`),hint:b?void 0:s(`about.creditsDepsHint`),children:T.map(e=>(0,m.jsx)(y,{label:e.label,packages:e.packages},e.id))}):null,n!==null&&E?(0,m.jsx)(i,{children:s(`about.noMatches`)}):null]})}export{b as CreditsDialog};
|