@agentproto/app-kit 1.2.1 → 1.3.1

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 CHANGED
@@ -99,7 +99,20 @@ runtime app registry:
99
99
 
100
100
  - **`ui`** — an HTML dashboard/panel. `html` is written to
101
101
  `.agentproto/ui/index.html`; `APP.md` frontmatter carries the relative path
102
- plus optional `title`, `description`, `tools`, and `csp`.
102
+ plus optional `title`, `description`, `tools`, `csp`, and `build`.
103
+ - **`ui.build`** — how to (re)build `ui.path` when it's missing or stale,
104
+ so the bundle doesn't have to be committed. `{ command, cwd?, sources? }`:
105
+ `command` is a shell command line run with cwd `cwd` (default: the app
106
+ dir); `sources` is a list of globs (relative to `cwd`, default
107
+ `["src/**"]`) whose newest mtime is compared against `ui.path`'s to decide
108
+ staleness. The daemon/CLI run it — `app_install`, the first `GET
109
+ /apps/:appId/ui`, the MCP panel cache, and `agentproto app serve` all call
110
+ the same `ensureAppUiBuilt` (`@agentproto/runtime/app-ui-build`) before
111
+ serving, single-flight per bundle path so concurrent first requests only
112
+ build once. Output is captured to `<appDir>/.agentproto/ui-build.log`; a
113
+ failing build surfaces that log's tail as the tool/route error instead of
114
+ a bare 404. No `ui.build` declared ⇒ today's behavior: the bundle must
115
+ already exist on disk.
103
116
  - **`artifact`** — a persistent HTML dashboard (Cowork artifact). The app
104
117
  provides a path to an HTML file on disk; `emit` copies it to
105
118
  `.agentproto/artifact/index.html`. The daemon never writes the host manifest
@@ -169,10 +182,38 @@ serve`) and receives a `window.McpApp` bridge:
169
182
  - `openLink(url)` — ask the host to open a URL.
170
183
  - `onTeardown(cb)` — register a cleanup callback fired when the host tears down
171
184
  the panel.
185
+ - `getHostContext()` / `onHostContext(cb)` — the host context (display mode,
186
+ theme, safe-area insets, …), merged on every `host-context-changed`.
187
+ - `displayMode` — the fullscreen toggle, also on `window.McpApp.displayMode`.
172
188
 
173
189
  In a standalone browser tab, `callTool` proxies to the daemon's `/mcp` endpoint,
174
190
  while `sendMessage` and `updateModelContext` reject (there is no chat host).
175
191
 
192
+ #### Display mode (⤢ Agrandir)
193
+
194
+ Every `ui` panel gets a floating fullscreen toggle for free, placed clear of
195
+ the host's own chrome (`hostContext.safeAreaInsets`) and themed from
196
+ `hostContext.theme`. It appears **only** for modes the host advertises in
197
+ `hostContext.availableDisplayModes` — a host with its own native control
198
+ (Claude Desktop) advertises none and gets no second button.
199
+
200
+ To place it yourself, opt the floating one out and mount it where you want:
201
+
202
+ ```html
203
+ <meta name="agentproto-display-toggle" content="none">
204
+ <script>
205
+ const app = await window.McpApp.connect()
206
+ app.displayMode.mountToggle(document.querySelector("header"))
207
+ app.displayMode.onChange(mode => console.log("now", mode))
208
+ </script>
209
+ ```
210
+
211
+ `content="optimistic"` instead shows the button against a host that
212
+ advertises nothing but may still honour `ui/request-display-mode`; the first
213
+ refusal hides it permanently. `connect({ displayToggle: … })` is the
214
+ programmatic equivalent and wins over the meta tag. Full API and the
215
+ `--agentproto-dm-*` CSS variables: `@agentproto/app-client/display-mode`.
216
+
176
217
  ### Skill surface flow
177
218
 
178
219
  1. The app declares `skill: { path: "/abs/path/to/skill-dir", title?, description? }`
@@ -197,6 +238,14 @@ export const dashboardApp = defineApp({
197
238
  html: "<!doctype html><html>…</html>",
198
239
  title: "Ops Dashboard",
199
240
  tools: ["terminal_start", "agent_start"],
241
+ // Only needed when `ui.path`'s bundle isn't committed to the repo —
242
+ // the daemon/CLI build it on demand before serving. See the APP.md
243
+ // frontmatter equivalent below.
244
+ build: {
245
+ command: "pnpm run build",
246
+ cwd: "ui",
247
+ sources: ["ui/src/**", "ui/index.html", "ui/vite.config.ts"],
248
+ },
200
249
  },
201
250
  artifact: {
202
251
  path: "/path/to/dashboard.html",
@@ -293,6 +342,31 @@ const app = await loadAppHandle("/path/to/emitted/app")
293
342
  app.agents.map((e) => e.agent.id) // ["@agentik/reviewer", "fixer"]
294
343
  ```
295
344
 
345
+ ### `ui.build` — don't commit the generated bundle
346
+
347
+ Add a `build` block under `ui` in `APP.md`'s frontmatter and gitignore
348
+ `.agentproto/ui/index.html` — the daemon builds it on demand instead:
349
+
350
+ ```yaml
351
+ ui:
352
+ path: .agentproto/ui/index.html
353
+ build:
354
+ command: pnpm run build
355
+ cwd: ui
356
+ sources:
357
+ - ui/src/**
358
+ - ui/index.html
359
+ - ui/vite.config.ts
360
+ ```
361
+
362
+ `app_install`, the first `GET /apps/:appId/ui`, the MCP panel, and
363
+ `agentproto app serve` all resolve this the same way (`peekAppUi` +
364
+ `ensureAppUiBuilt` from `@agentproto/runtime/app-ui-build`): missing or
365
+ older than the newest matching source → run `command` once (single-flight
366
+ per bundle path, output captured to `.agentproto/ui-build.log`) → serve.
367
+ Omit `build` to keep committing the bundle, unchanged from before this
368
+ existed.
369
+
296
370
  ## Runtime note
297
371
 
298
372
  `toMastraAgents` is the path where a `body` becomes a **true** model
@@ -1 +1 @@
1
- {"version":3,"file":"define-app.d.ts","sourceRoot":"","sources":["../src/define-app.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAQH,OAAO,KAAK,EAEV,aAAa,EACb,SAAS,EACT,aAAa,EAGd,MAAM,YAAY,CAAA;AAInB,qBAAa,kBAAmB,SAAQ,KAAK;gBAC/B,OAAO,EAAE,MAAM;CAI5B;AAED,wBAAgB,SAAS,CAAC,GAAG,EAAE,aAAa,GAAG,SAAS,CAsIvD;AAqHD,YAAY,EAAE,aAAa,EAAE,CAAA"}
1
+ {"version":3,"file":"define-app.d.ts","sourceRoot":"","sources":["../src/define-app.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAQH,OAAO,KAAK,EAEV,aAAa,EACb,SAAS,EACT,aAAa,EAGd,MAAM,YAAY,CAAA;AAInB,qBAAa,kBAAmB,SAAQ,KAAK;gBAC/B,OAAO,EAAE,MAAM;CAI5B;AAED,wBAAgB,SAAS,CAAC,GAAG,EAAE,aAAa,GAAG,SAAS,CA8IvD;AAiID,YAAY,EAAE,aAAa,EAAE,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"emit.d.ts","sourceRoot":"","sources":["../src/emit.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AAKH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AAC1D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAA;AAC5D,OAAO,KAAK,EAAE,UAAU,EAAE,eAAe,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,eAAe,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA;AAGpK,UAAU,SAAS;IACjB,QAAQ,CAAC,MAAM,EAAE,SAAS,UAAU,EAAE,CAAA;IACtC,QAAQ,CAAC,SAAS,EAAE,SAAS,cAAc,EAAE,CAAA;IAC7C,QAAQ,CAAC,SAAS,CAAC,EAAE,eAAe,CAAA;IACpC,QAAQ,CAAC,EAAE,CAAC,EAAE,MAAM,CAAA;IACpB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAA;IACzB,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAA;IAC7B,QAAQ,CAAC,QAAQ,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;IACrC,QAAQ,CAAC,EAAE,CAAC,EAAE,eAAe,CAAA;IAC7B,QAAQ,CAAC,QAAQ,CAAC,EAAE,kBAAkB,CAAA;IACtC,QAAQ,CAAC,KAAK,CAAC,EAAE,eAAe,CAAA;IAChC,QAAQ,CAAC,SAAS,CAAC,EAAE,SAAS,eAAe,EAAE,CAAA;IAC/C,QAAQ,CAAC,GAAG,CAAC,EAAE,gBAAgB,CAAA;IAC/B,QAAQ,CAAC,IAAI,CAAC,EAAE,iBAAiB,CAAA;IACjC,QAAQ,CAAC,iBAAiB,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;IAC9C,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAC3B;AAED,wBAAsB,OAAO,CAAC,GAAG,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAgH9E"}
1
+ {"version":3,"file":"emit.d.ts","sourceRoot":"","sources":["../src/emit.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AAKH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AAC1D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAA;AAC5D,OAAO,KAAK,EAAE,UAAU,EAAE,eAAe,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,eAAe,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA;AAGpK,UAAU,SAAS;IACjB,QAAQ,CAAC,MAAM,EAAE,SAAS,UAAU,EAAE,CAAA;IACtC,QAAQ,CAAC,SAAS,EAAE,SAAS,cAAc,EAAE,CAAA;IAC7C,QAAQ,CAAC,SAAS,CAAC,EAAE,eAAe,CAAA;IACpC,QAAQ,CAAC,EAAE,CAAC,EAAE,MAAM,CAAA;IACpB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAA;IACzB,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAA;IAC7B,QAAQ,CAAC,QAAQ,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;IACrC,QAAQ,CAAC,EAAE,CAAC,EAAE,eAAe,CAAA;IAC7B,QAAQ,CAAC,QAAQ,CAAC,EAAE,kBAAkB,CAAA;IACtC,QAAQ,CAAC,KAAK,CAAC,EAAE,eAAe,CAAA;IAChC,QAAQ,CAAC,SAAS,CAAC,EAAE,SAAS,eAAe,EAAE,CAAA;IAC/C,QAAQ,CAAC,GAAG,CAAC,EAAE,gBAAgB,CAAA;IAC/B,QAAQ,CAAC,IAAI,CAAC,EAAE,iBAAiB,CAAA;IACjC,QAAQ,CAAC,iBAAiB,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;IAC9C,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAC3B;AAED,wBAAsB,OAAO,CAAC,GAAG,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAiH9E"}
@@ -0,0 +1,6 @@
1
+ /** Thrown by `loadAppHandle` and its helpers (`loadAppBundledTools`, …) on
2
+ * any disk/parse/validation failure while reading an app bundle off disk. */
3
+ export declare class AppLoadError extends Error {
4
+ constructor(message: string);
5
+ }
6
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA;8EAC8E;AAC9E,qBAAa,YAAa,SAAQ,KAAK;gBACzB,OAAO,EAAE,MAAM;CAI5B"}
package/dist/index.d.ts CHANGED
@@ -38,7 +38,9 @@
38
38
  */
39
39
  export { defineApp, AppDefinitionError } from "./define-app.js";
40
40
  export { emitApp } from "./emit.js";
41
- export { loadAppHandle, AppLoadError, resolveAppUIRoot } from "./load-app.js";
41
+ export { loadAppHandle, AppLoadError, resolveAppUIRoot, peekAppUi } from "./load-app.js";
42
+ export type { AppUiPeek } from "./load-app.js";
43
+ export { loadAppBundledTools } from "./load-app-tools.js";
42
44
  export { refKey, stripOwner } from "./refs.js";
43
- export type { AppDefinition, AppHandle, AgentEntry, DoctypeHandle, WorkspaceShorthand, WorkspaceInput, AppUiDefinition, AppArtifactSurface, AppSkillSurface, AppArtifactDecl, AppDevLaunchConfig, AppDataDefinition, AppDevDefinition, ToMastraAgentOptions, EmittedApp, } from "./types.js";
45
+ export type { AppDefinition, AppHandle, AgentEntry, DoctypeHandle, WorkspaceShorthand, WorkspaceInput, AppUiDefinition, AppUiBuildConfig, AppArtifactSurface, AppSkillSurface, AppArtifactDecl, AppDevLaunchConfig, AppDataDefinition, AppDevDefinition, ToMastraAgentOptions, EmittedApp, } from "./types.js";
44
46
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqCG;AAEH,OAAO,EAAE,SAAS,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAA;AAC/D,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACnC,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAA;AAC7E,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,WAAW,CAAA;AAC9C,YAAY,EACV,aAAa,EACb,SAAS,EACT,UAAU,EACV,aAAa,EACb,kBAAkB,EAClB,cAAc,EACd,eAAe,EACf,kBAAkB,EAClB,eAAe,EACf,eAAe,EACf,kBAAkB,EAClB,iBAAiB,EACjB,gBAAgB,EAChB,oBAAoB,EACpB,UAAU,GACX,MAAM,YAAY,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqCG;AAEH,OAAO,EAAE,SAAS,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAA;AAC/D,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACnC,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,gBAAgB,EAAE,SAAS,EAAE,MAAM,eAAe,CAAA;AACxF,YAAY,EAAE,SAAS,EAAE,MAAM,eAAe,CAAA;AAC9C,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAA;AACzD,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,WAAW,CAAA;AAC9C,YAAY,EACV,aAAa,EACb,SAAS,EACT,UAAU,EACV,aAAa,EACb,kBAAkB,EAClB,cAAc,EACd,eAAe,EACf,gBAAgB,EAChB,kBAAkB,EAClB,eAAe,EACf,eAAe,EACf,kBAAkB,EAClB,iBAAiB,EACjB,gBAAgB,EAChB,oBAAoB,EACpB,UAAU,GACX,MAAM,YAAY,CAAA"}
package/dist/index.mjs CHANGED
@@ -1,10 +1,15 @@
1
- import { join, relative, isAbsolute, dirname } from 'path';
1
+ import { join, relative, isAbsolute, dirname, resolve } from 'path';
2
2
  import { defineWorkspace } from '@agentproto/workspace';
3
- import { mkdir, writeFile, copyFile, cp, readFile } from 'fs/promises';
3
+ import { mkdir, writeFile, copyFile, cp, readFile, readdir } from 'fs/promises';
4
4
  import matter2 from 'gray-matter';
5
5
  import { parseAgentManifest, agentFromManifest } from '@agentproto/agent/manifest';
6
6
  import { loadWorkflowHandle } from '@agentproto/workflow-loader';
7
7
  import { workspaceFromManifest, parseWorkspaceManifest } from '@agentproto/workspace/manifest';
8
+ import { toolFromManifestOnly, parseToolManifest } from '@agentproto/tool';
9
+ import { parseDriverManifest, driverDefinitionFromManifest, driverFromManifest } from '@agentproto/driver/manifest';
10
+ import { normalizeToolId } from '@agentproto/driver';
11
+ import { defineCliDriver } from '@agentproto/driver-cli';
12
+ import { defineHttpDriver } from '@agentproto/driver-http';
8
13
 
9
14
  /**
10
15
  * @agentproto/app-kit v0.1.0
@@ -53,7 +58,8 @@ async function emitApp(app, dir) {
53
58
  ...app.ui.description !== void 0 ? { description: app.ui.description } : {},
54
59
  ...app.ui.tools !== void 0 ? { tools: app.ui.tools } : {},
55
60
  ...app.ui.port !== void 0 ? { port: app.ui.port } : {},
56
- ...app.ui.csp !== void 0 ? { csp: app.ui.csp } : {}
61
+ ...app.ui.csp !== void 0 ? { csp: app.ui.csp } : {},
62
+ ...app.ui.build !== void 0 ? { build: app.ui.build } : {}
57
63
  };
58
64
  }
59
65
  let artifactPath;
@@ -180,6 +186,8 @@ function defineApp(def) {
180
186
  }
181
187
  const agents = (def.agents ?? []).map(normalizeEntry);
182
188
  const workflows = def.workflows ?? [];
189
+ const tools = def.tools ?? [];
190
+ const drivers = def.drivers ?? [];
183
191
  const attachments = def.attach ?? [];
184
192
  const workspace = def.workspace ? toWorkspaceHandle(def.workspace) : void 0;
185
193
  const id = def.id;
@@ -196,12 +204,18 @@ function defineApp(def) {
196
204
  const data = def.data ? Object.freeze({ ...def.data }) : void 0;
197
205
  const category = def.category;
198
206
  validateAttachment(agents, workflows);
207
+ validateUniqueIds(tools, "tool");
208
+ validateUniqueIds(drivers, "driver");
199
209
  const frozenAgents = Object.freeze(agents.map((e) => Object.freeze({ ...e })));
200
210
  const frozenWorkflows = Object.freeze([...workflows]);
211
+ const frozenTools = Object.freeze([...tools]);
212
+ const frozenDrivers = Object.freeze([...drivers]);
201
213
  const frozenAttachments = Object.freeze([...attachments]);
202
214
  const handle = {
203
215
  agents: frozenAgents,
204
216
  workflows: frozenWorkflows,
217
+ tools: frozenTools,
218
+ drivers: frozenDrivers,
205
219
  attachments: frozenAttachments,
206
220
  ...workspace ? { workspace } : {},
207
221
  ...id !== void 0 ? { id } : {},
@@ -332,12 +346,163 @@ function validateAttachment(agents, workflows) {
332
346
  function workflowRefs(agent) {
333
347
  return agent.workflows ?? [];
334
348
  }
349
+ function validateUniqueIds(items, kind) {
350
+ const seen = /* @__PURE__ */ new Set();
351
+ for (const item of items) {
352
+ if (seen.has(item.id)) {
353
+ throw new AppDefinitionError(`duplicate ${kind} id '${item.id}' in the bundle.`);
354
+ }
355
+ seen.add(item.id);
356
+ }
357
+ }
358
+
359
+ // src/errors.ts
335
360
  var AppLoadError = class extends Error {
336
361
  constructor(message) {
337
362
  super(`loadAppHandle: ${message}`);
338
363
  this.name = "AppLoadError";
339
364
  }
340
365
  };
366
+ async function listBundleIds(base) {
367
+ let entries;
368
+ try {
369
+ entries = await readdir(base, { withFileTypes: true });
370
+ } catch {
371
+ return [];
372
+ }
373
+ return entries.filter((e) => e.isDirectory()).map((e) => e.name).sort();
374
+ }
375
+ function errMsg(err) {
376
+ return err instanceof Error ? err.message : String(err);
377
+ }
378
+ async function loadToolEntry(id, toolPath) {
379
+ let source;
380
+ try {
381
+ source = await readFile(toolPath, "utf8");
382
+ } catch (err) {
383
+ throw new AppLoadError(`tool '${id}': cannot read '${toolPath}': ${errMsg(err)}`);
384
+ }
385
+ try {
386
+ return toolFromManifestOnly(parseToolManifest(source));
387
+ } catch (err) {
388
+ throw new AppLoadError(`tool '${id}' at '${toolPath}': ${errMsg(err)}`);
389
+ }
390
+ }
391
+ function requiredSecretNames(fm) {
392
+ const auth = fm.auth;
393
+ const env = auth?.state?.env;
394
+ return Array.isArray(env) ? env.filter((e) => typeof e === "string") : [];
395
+ }
396
+ function wrapExecuteWithSecretCheck(driverId, execute, secretNames) {
397
+ if (secretNames.length === 0) return execute;
398
+ const wrapped = {};
399
+ for (const [toolId, fn] of Object.entries(execute)) {
400
+ wrapped[toolId] = async (args) => {
401
+ const resolved = {};
402
+ for (const name of secretNames) {
403
+ const value = process.env[name];
404
+ if (!value) {
405
+ throw new Error(
406
+ `driver '${driverId}': missing required secret '${name}' (declared in DRIVER.md 'auth.state.env').`
407
+ );
408
+ }
409
+ resolved[name] = value;
410
+ }
411
+ const priorSecrets = args.driverCtx.secrets ?? {};
412
+ return fn({ ...args, driverCtx: { ...args.driverCtx, secrets: { ...resolved, ...priorSecrets } } });
413
+ };
414
+ }
415
+ return wrapped;
416
+ }
417
+ function resolveCliCwd(appRoot, driverId, cwd) {
418
+ const absoluteAppRoot = resolve(appRoot);
419
+ if (cwd === void 0) return absoluteAppRoot;
420
+ if (typeof cwd !== "string" || cwd.trim() === "") {
421
+ throw new Error(`driver '${driverId}': 'metadata.cli.cwd' must be a non-empty string.`);
422
+ }
423
+ const resolved = isAbsolute(cwd) ? resolve(cwd) : resolve(absoluteAppRoot, cwd);
424
+ const rel = relative(absoluteAppRoot, resolved);
425
+ if (rel !== "" && (rel.startsWith("..") || isAbsolute(rel))) {
426
+ throw new Error(
427
+ `driver '${driverId}': 'metadata.cli.cwd' (${cwd}) resolves to '${resolved}', outside the app root '${absoluteAppRoot}'.`
428
+ );
429
+ }
430
+ return resolved;
431
+ }
432
+ function driverHandleFromManifest(manifest, appRoot) {
433
+ const fm = manifest.frontmatter;
434
+ const secretNames = requiredSecretNames(fm);
435
+ if (fm.kind === "cli") {
436
+ const cliMeta = fm.metadata?.cli ?? {};
437
+ if (typeof cliMeta.bin !== "string" || cliMeta.bin.trim() === "") {
438
+ throw new Error(
439
+ "kind:cli DRIVER.md requires a non-empty 'metadata.cli.bin' frontmatter field naming the binary."
440
+ );
441
+ }
442
+ const handle = defineCliDriver({
443
+ ...driverDefinitionFromManifest(manifest),
444
+ bin: cliMeta.bin,
445
+ binArgs: cliMeta.binArgs,
446
+ output: cliMeta.output,
447
+ tty: cliMeta.tty,
448
+ sandbox: cliMeta.sandbox,
449
+ cwd: resolveCliCwd(appRoot, fm.id, cliMeta.cwd)
450
+ });
451
+ return { ...handle, execute: wrapExecuteWithSecretCheck(fm.id, handle.execute, secretNames) };
452
+ }
453
+ if (fm.kind === "http") {
454
+ const httpMeta = fm.metadata?.http ?? {};
455
+ if (typeof httpMeta.baseUrl !== "string" || httpMeta.baseUrl.trim() === "") {
456
+ throw new Error("kind:http DRIVER.md requires a non-empty 'metadata.http.baseUrl' frontmatter field.");
457
+ }
458
+ const handle = defineHttpDriver({
459
+ ...driverDefinitionFromManifest(manifest),
460
+ baseUrl: httpMeta.baseUrl,
461
+ defaultHeaders: httpMeta.defaultHeaders,
462
+ defaultMethod: httpMeta.defaultMethod,
463
+ streaming: httpMeta.streaming
464
+ });
465
+ return { ...handle, execute: wrapExecuteWithSecretCheck(fm.id, handle.execute, secretNames) };
466
+ }
467
+ const execute = {};
468
+ for (const entry of fm.implements) {
469
+ const toolId = normalizeToolId(entry.tool);
470
+ execute[toolId] = async () => {
471
+ throw new Error(
472
+ `driver '${fm.id}': kind '${fm.kind}' is not supported by this host \u2014 only 'cli' and 'http' drivers dispatch.`
473
+ );
474
+ };
475
+ }
476
+ return driverFromManifest({ manifest, execute });
477
+ }
478
+ async function loadDriverEntry(id, driverPath, appRoot) {
479
+ let source;
480
+ try {
481
+ source = await readFile(driverPath, "utf8");
482
+ } catch (err) {
483
+ throw new AppLoadError(`driver '${id}': cannot read '${driverPath}': ${errMsg(err)}`);
484
+ }
485
+ try {
486
+ return driverHandleFromManifest(parseDriverManifest(source), appRoot);
487
+ } catch (err) {
488
+ throw new AppLoadError(`driver '${id}' at '${driverPath}': ${errMsg(err)}`);
489
+ }
490
+ }
491
+ async function loadAppBundledTools(dir) {
492
+ const toolsDir = join(dir, ".agentproto", "tools");
493
+ const driversDir = join(dir, ".agentproto", "drivers");
494
+ const tools = [];
495
+ for (const id of await listBundleIds(toolsDir)) {
496
+ tools.push(await loadToolEntry(id, join(toolsDir, id, "TOOL.md")));
497
+ }
498
+ const drivers = [];
499
+ for (const id of await listBundleIds(driversDir)) {
500
+ drivers.push(await loadDriverEntry(id, join(driversDir, id, "DRIVER.md"), dir));
501
+ }
502
+ return { tools, drivers };
503
+ }
504
+
505
+ // src/load-app.ts
341
506
  function resolveRef(dir, path) {
342
507
  return isAbsolute(path) ? path : join(dir, path);
343
508
  }
@@ -363,6 +528,54 @@ async function resolveAppUIRoot(appDir) {
363
528
  }
364
529
  return dirname(resolveRef(appDir, path));
365
530
  }
531
+ function parseUiBuildFrontmatter(raw, appMdPath) {
532
+ if (raw === void 0) return void 0;
533
+ if (typeof raw !== "object" || raw === null || Array.isArray(raw)) {
534
+ throw new AppLoadError(`'${appMdPath}': frontmatter 'ui.build' must be an object.`);
535
+ }
536
+ const command = raw.command;
537
+ if (typeof command !== "string" || command.trim() === "") {
538
+ throw new AppLoadError(`'${appMdPath}': frontmatter 'ui.build.command' must be a non-empty string.`);
539
+ }
540
+ const cwd = raw.cwd;
541
+ if (cwd !== void 0 && (typeof cwd !== "string" || cwd.trim() === "")) {
542
+ throw new AppLoadError(`'${appMdPath}': frontmatter 'ui.build.cwd' must be a non-empty string.`);
543
+ }
544
+ const sources = raw.sources;
545
+ if (sources !== void 0 && (!Array.isArray(sources) || !sources.every((s) => typeof s === "string" && s.trim() !== ""))) {
546
+ throw new AppLoadError(
547
+ `'${appMdPath}': frontmatter 'ui.build.sources' must be an array of non-empty strings.`
548
+ );
549
+ }
550
+ return {
551
+ command,
552
+ ...cwd !== void 0 ? { cwd } : {},
553
+ ...sources !== void 0 ? { sources } : {}
554
+ };
555
+ }
556
+ async function peekAppUi(appDir) {
557
+ const appMdPath = join(appDir, ".agentproto", "APP.md");
558
+ let source;
559
+ try {
560
+ source = await readFile(appMdPath, "utf8");
561
+ } catch {
562
+ return void 0;
563
+ }
564
+ const data = matter2(source).data;
565
+ const ui = data.ui;
566
+ if (ui === void 0) return void 0;
567
+ if (typeof ui !== "object" || ui === null || Array.isArray(ui)) {
568
+ throw new AppLoadError(`'${appMdPath}': frontmatter 'ui' must be an object.`);
569
+ }
570
+ const path = ui.path;
571
+ if (typeof path !== "string" || path.trim() === "") {
572
+ throw new AppLoadError(
573
+ `'${appMdPath}': frontmatter 'ui.path' must be a non-empty string.`
574
+ );
575
+ }
576
+ const build = parseUiBuildFrontmatter(ui.build, appMdPath);
577
+ return { path: resolveRef(appDir, path), ...build ? { build } : {} };
578
+ }
366
579
  function isRefArray(v) {
367
580
  return Array.isArray(v) && v.every(
368
581
  (e) => typeof e === "object" && e !== null && typeof e.id === "string" && typeof e.path === "string"
@@ -459,6 +672,7 @@ async function loadAppHandle(dir) {
459
672
  for (const ref of fm.workflows) {
460
673
  workflows.push(await loadWorkflowRef(dir, ref));
461
674
  }
675
+ const { tools, drivers } = await loadAppBundledTools(dir);
462
676
  let workspace;
463
677
  if (fm.workspace) {
464
678
  const workspacePath = join(dir, "WORKSPACE.md");
@@ -489,18 +703,22 @@ async function loadAppHandle(dir) {
489
703
  `ui: cannot read '${uiPath}': ${err instanceof Error ? err.message : String(err)}`
490
704
  );
491
705
  }
706
+ const build = parseUiBuildFrontmatter(fm.ui.build, appPath);
492
707
  ui = {
493
708
  html,
494
709
  ...fm.ui.title !== void 0 ? { title: fm.ui.title } : {},
495
710
  ...fm.ui.description !== void 0 ? { description: fm.ui.description } : {},
496
711
  ...fm.ui.tools !== void 0 ? { tools: fm.ui.tools } : {},
497
712
  ...fm.ui.port !== void 0 ? { port: fm.ui.port } : {},
498
- ...fm.ui.csp !== void 0 ? { csp: fm.ui.csp } : {}
713
+ ...fm.ui.csp !== void 0 ? { csp: fm.ui.csp } : {},
714
+ ...build !== void 0 ? { build } : {}
499
715
  };
500
716
  }
501
717
  return defineApp({
502
718
  agents,
503
719
  workflows,
720
+ tools,
721
+ drivers,
504
722
  ...workspace ? { workspace } : {},
505
723
  ...fm.id !== void 0 ? { id: fm.id } : {},
506
724
  ...fm.name !== void 0 ? { name: fm.name } : {},
@@ -518,6 +736,6 @@ async function loadAppHandle(dir) {
518
736
  });
519
737
  }
520
738
 
521
- export { AppDefinitionError, AppLoadError, defineApp, emitApp, loadAppHandle, refKey, resolveAppUIRoot, stripOwner };
739
+ export { AppDefinitionError, AppLoadError, defineApp, emitApp, loadAppBundledTools, loadAppHandle, peekAppUi, refKey, resolveAppUIRoot, stripOwner };
522
740
  //# sourceMappingURL=index.mjs.map
523
741
  //# sourceMappingURL=index.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/refs.ts","../src/emit.ts","../src/define-app.ts","../src/load-app.ts"],"names":["workflowRefs","matter","isAbsolute","join"],"mappings":"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","file":"index.mjs","sourcesContent":["/**\n * Ref-key extraction, shared with the same convention `buildMastraAgent`\n * uses (`packages/mastra/src/build-agent.ts` `refKey`). An AIP-27 ref is\n * a string shorthand or `{ ref | file | inline }`; the key is the string,\n * else `.ref`, else `.file`, else a stable JSON of the inline payload.\n */\n\nimport type { AnyRef } from \"@agentproto/agent\"\n\nexport function refKey(ref: AnyRef): string {\n if (typeof ref === \"string\") return ref\n return ref.ref ?? ref.file ?? JSON.stringify(ref.inline ?? ref)\n}\n\n/** `@agentik/writer` → `writer`; bare ids untouched. */\nexport function stripOwner(id: string): string {\n const m = id.match(/^@[^/]+\\/(.+)$/)\n return m ? m[1]! : id\n}\n","/**\n * `emitApp(app, dir)` — write an app's agents + workflows to disk under an\n * agentproto-owned base, so the manifests don't squat the shared root\n * `.agents/` convention:\n *\n * <dir>/WORKSPACE.md (when the app has a\n * workspace — AIP-34 root\n * manifest; owner = tenant)\n * <dir>/.agentproto/agents/<id>/AGENT.md (one per agent)\n * <dir>/.agentproto/workflows/<wf.id>/WORKFLOW.md (shared — a workflow may\n * be run by several agents)\n * <dir>/.agentproto/APP.md (root index — always\n * written, so a future\n * `app_install` can\n * discover the bundle)\n *\n * The \"tenant\" isn't a `tenants/<t>/…` path segment — it's the `owner` of\n * the AIP-34 WORKSPACE.md (guild / user / org), and local storage is its\n * AIP-35 `storage` block. So there is no bespoke tenant folder to invent.\n *\n * All manifests are plain markdown: frontmatter = the validated handle (or,\n * for APP.md, the identity + a manifest of `{ id, path }` refs to every\n * agent/workflow it bundles), body = the agent's `body` (its system prompt),\n * the workflow description, or the app description. Because a\n * `defineWorkflow` handle is pure data, the WORKFLOW.md needs no `entry:`\n * module — the manifest *is* the workflow, so `loadWorkflowHandle` returns\n * it directly with nothing to reconcile against.\n *\n * `emitApp` stays dependency-light on purpose (no Mastra import) — that\n * split lets a host write/discover an app without paying for the Mastra\n * build path.\n */\n\nimport { copyFile, cp, mkdir, writeFile } from \"node:fs/promises\"\nimport { join, relative } from \"node:path\"\nimport matter from \"gray-matter\"\nimport type { WorkflowHandle } from \"@agentproto/workflow\"\nimport type { WorkspaceHandle } from \"@agentproto/workspace\"\nimport type { AgentEntry, AppArtifactDecl, AppArtifactSurface, AppDataDefinition, AppDevDefinition, AppSkillSurface, AppUiDefinition, EmittedApp } from \"./types.js\"\nimport { stripOwner } from \"./refs.js\"\n\ninterface EmitInput {\n readonly agents: readonly AgentEntry[]\n readonly workflows: readonly WorkflowHandle[]\n readonly workspace?: WorkspaceHandle\n readonly id?: string\n readonly name?: string\n readonly version?: string\n readonly description?: string\n readonly requires?: readonly string[]\n readonly ui?: AppUiDefinition\n readonly artifact?: AppArtifactSurface\n readonly skill?: AppSkillSurface\n readonly artifacts?: readonly AppArtifactDecl[]\n readonly dev?: AppDevDefinition\n readonly data?: AppDataDefinition\n readonly externalReadRoots?: readonly string[]\n readonly category?: string\n}\n\nexport async function emitApp(app: EmitInput, dir: string): Promise<EmittedApp> {\n let workspacePath: string | undefined\n if (app.workspace) {\n await mkdir(dir, { recursive: true })\n workspacePath = join(dir, \"WORKSPACE.md\")\n await writeFile(\n workspacePath,\n toManifest(app.workspace, app.workspace.description ?? app.workspace.name),\n \"utf8\",\n )\n }\n\n const agentPaths: Record<string, string> = {}\n for (const { agent, body } of app.agents) {\n const agentDir = join(dir, \".agentproto\", \"agents\", stripOwner(agent.id))\n await mkdir(agentDir, { recursive: true })\n const agentPath = join(agentDir, \"AGENT.md\")\n await writeFile(agentPath, toManifest(agent, body ?? \"\"), \"utf8\")\n agentPaths[agent.id] = agentPath\n }\n\n let uiPath: string | undefined\n let uiFrontmatter: Record<string, unknown> | undefined\n if (app.ui) {\n const uiDir = join(dir, \".agentproto\", \"ui\")\n await mkdir(uiDir, { recursive: true })\n uiPath = join(uiDir, \"index.html\")\n await writeFile(uiPath, app.ui.html, \"utf8\")\n uiFrontmatter = {\n path: relative(dir, uiPath),\n ...(app.ui.title !== undefined ? { title: app.ui.title } : {}),\n ...(app.ui.description !== undefined ? { description: app.ui.description } : {}),\n ...(app.ui.tools !== undefined ? { tools: app.ui.tools } : {}),\n ...(app.ui.port !== undefined ? { port: app.ui.port } : {}),\n ...(app.ui.csp !== undefined ? { csp: app.ui.csp } : {}),\n }\n }\n\n let artifactPath: string | undefined\n let artifactFrontmatter: Record<string, unknown> | undefined\n if (app.artifact) {\n const artifactDir = join(dir, \".agentproto\", \"artifact\")\n await mkdir(artifactDir, { recursive: true })\n artifactPath = join(artifactDir, \"index.html\")\n await copyFile(app.artifact.path, artifactPath)\n artifactFrontmatter = {\n path: relative(dir, artifactPath),\n ...(app.artifact.title !== undefined ? { title: app.artifact.title } : {}),\n ...(app.artifact.description !== undefined ? { description: app.artifact.description } : {}),\n }\n }\n\n let skillPath: string | undefined\n let skillFrontmatter: Record<string, unknown> | undefined\n if (app.skill) {\n skillPath = join(dir, \".agentproto\", \"skill\")\n await mkdir(skillPath, { recursive: true })\n await cp(app.skill.path, skillPath, { recursive: true })\n skillFrontmatter = {\n path: relative(dir, skillPath),\n ...(app.skill.title !== undefined ? { title: app.skill.title } : {}),\n ...(app.skill.description !== undefined ? { description: app.skill.description } : {}),\n }\n }\n\n const workflowPaths: string[] = []\n const workflowRefs: { id: string; path: string }[] = []\n for (const wf of app.workflows) {\n const wfDir = join(dir, \".agentproto\", \"workflows\", wf.id)\n await mkdir(wfDir, { recursive: true })\n const wfPath = join(wfDir, \"WORKFLOW.md\")\n await writeFile(wfPath, toManifest(wf, wf.description ?? \"\"), \"utf8\")\n workflowPaths.push(wfPath)\n workflowRefs.push({ id: wf.id, path: relative(dir, wfPath) })\n }\n\n await mkdir(join(dir, \".agentproto\"), { recursive: true })\n const appPath = join(dir, \".agentproto\", \"APP.md\")\n const agentRefs = app.agents.map(({ agent }) => ({\n id: agent.id,\n path: relative(dir, agentPaths[agent.id]!),\n }))\n const appFrontmatter: Record<string, unknown> = {\n schema: \"app/v1\",\n ...(app.id !== undefined ? { id: app.id } : {}),\n ...(app.name !== undefined ? { name: app.name } : {}),\n version: app.version ?? \"0.1.0\",\n ...(app.description !== undefined ? { description: app.description } : {}),\n agents: agentRefs,\n workflows: workflowRefs,\n ...(app.workspace ? { workspace: app.workspace.id } : {}),\n ...(app.requires !== undefined ? { requires: app.requires } : {}),\n ...(uiFrontmatter !== undefined ? { ui: uiFrontmatter } : {}),\n ...(artifactFrontmatter !== undefined ? { artifact: artifactFrontmatter } : {}),\n ...(skillFrontmatter !== undefined ? { skill: skillFrontmatter } : {}),\n ...(app.artifacts !== undefined ? { artifacts: app.artifacts } : {}),\n ...(app.dev !== undefined ? { dev: app.dev } : {}),\n ...(app.data !== undefined ? { data: app.data } : {}),\n ...(app.externalReadRoots !== undefined ? { externalReadRoots: app.externalReadRoots } : {}),\n ...(app.category !== undefined ? { category: app.category } : {}),\n }\n await writeFile(appPath, toManifest(appFrontmatter, app.description ?? \"\"), \"utf8\")\n\n return {\n agentPaths,\n workflowPaths,\n appPath,\n ...(workspacePath ? { workspacePath } : {}),\n ...(uiPath ? { uiPath } : {}),\n ...(artifactPath ? { artifactPath } : {}),\n ...(skillPath ? { skillPath } : {}),\n }\n}\n\nfunction toManifest(handle: object, body: string): string {\n const data: Record<string, unknown> = JSON.parse(JSON.stringify(handle))\n return matter.stringify(`\\n${body}\\n`, data)\n}\n","/**\n * `defineApp({ agents, workflows, attach })` — bundle one or more AIP-42\n * agents, the AIP-15 workflows they run, and any other AIP artifacts into\n * one cross-linked, frozen handle.\n *\n * The only new invariant app-kit adds is *attachment*: the agents and the\n * bundled workflows must reference each other. Everything else (field\n * validation) already ran when the caller built the handles with\n * `defineAgent` / `defineWorkflow`, so `defineApp` validates the coupling,\n * not the fields.\n *\n * - agent ids are unique within the app.\n * - every `agent.workflows[]` ref MUST resolve to a bundled workflow id.\n * - every bundled workflow MUST be referenced by at least one agent.\n *\n * A dangling ref (an agent points at a workflow the app didn't bundle) or\n * an orphan (a bundled workflow no agent lists) throws — that is what \"an\n * agent attached to its workflows\" means, made checkable.\n */\n\nimport { isAbsolute } from \"node:path\"\nimport { defineWorkspace } from \"@agentproto/workspace\"\nimport type { AgentHandle, AnyRef } from \"@agentproto/agent\"\nimport type { BuildMastraAgentResult } from \"@agentproto/mastra\"\nimport type { WorkflowHandle } from \"@agentproto/workflow\"\nimport type { WorkspaceHandle } from \"@agentproto/workspace\"\nimport type {\n AgentEntry,\n AppDefinition,\n AppHandle,\n DoctypeHandle,\n ToMastraAgentOptions,\n WorkspaceInput,\n} from \"./types.js\"\nimport { refKey } from \"./refs.js\"\nimport { emitApp } from \"./emit.js\"\n\nexport class AppDefinitionError extends Error {\n constructor(message: string) {\n super(`defineApp (app-kit): ${message}`)\n this.name = \"AppDefinitionError\"\n }\n}\n\nexport function defineApp(def: AppDefinition): AppHandle {\n if (def.id !== undefined && def.id.trim() === \"\") {\n throw new AppDefinitionError(\"`id` must be non-empty when present.\")\n }\n if (def.ui !== undefined && (typeof def.ui.html !== \"string\" || def.ui.html.trim() === \"\")) {\n throw new AppDefinitionError(\"`ui.html` must be a non-empty string when `ui` is present.\")\n }\n if ((def.agents === undefined || def.agents.length === 0) && def.ui === undefined) {\n throw new AppDefinitionError(\n \"an app needs at least one agent, or a `ui` block for a UI-only app — got neither.\",\n )\n }\n if (def.dev !== undefined && (!Array.isArray(def.dev.launch) || def.dev.launch.length === 0)) {\n throw new AppDefinitionError(\"`dev.launch` must be a non-empty array when `dev` is present.\")\n }\n if (def.data !== undefined && def.data.dir !== undefined && (typeof def.data.dir !== \"string\" || def.data.dir.trim() === \"\")) {\n throw new AppDefinitionError(\"`data.dir` must be a non-empty string when present.\")\n }\nif (def.artifact !== undefined && (typeof def.artifact.path !== \"string\" || def.artifact.path.trim() === \"\")) {\n throw new AppDefinitionError(\"`artifact.path` must be a non-empty string when `artifact` is present.\")\n }\n // AIP-53 rule 7: `artifact.path` / `skill.path` MUST be absolute —\n // `emit` copies from them at write time and a relative path has no\n // defined base to resolve against.\n if (def.artifact !== undefined && !isAbsolute(def.artifact.path)) {\n throw new AppDefinitionError(\n `\\`artifact.path\\` must be an absolute filesystem path, got '${def.artifact.path}' — a relative path has no defined base to resolve against (AIP-53 rule 7).`,\n )\n }\n if (def.skill !== undefined && (typeof def.skill.path !== \"string\" || def.skill.path.trim() === \"\")) {\n throw new AppDefinitionError(\"`skill.path` must be a non-empty string when `skill` is present.\")\n }\n if (def.skill !== undefined && !isAbsolute(def.skill.path)) {\n throw new AppDefinitionError(\n `\\`skill.path\\` must be an absolute filesystem path, got '${def.skill.path}' — a relative path has no defined base to resolve against (AIP-53 rule 7).`,\n )\n }\n if (def.category !== undefined && def.category.trim() === \"\") {\n throw new AppDefinitionError(\"`category` must be a non-empty string when present.\")\n }\n\n const agents = (def.agents ?? []).map(normalizeEntry)\n const workflows = def.workflows ?? []\n const attachments = def.attach ?? []\n const workspace = def.workspace ? toWorkspaceHandle(def.workspace) : undefined\n const id = def.id\n const name = def.name\n const version = def.version ?? (id ? \"0.1.0\" : undefined)\n const description = def.description\n const requires = def.requires ? Object.freeze([...def.requires]) : undefined\n const ui = def.ui ? Object.freeze({ ...def.ui }) : undefined\n const artifact = def.artifact ? Object.freeze({ ...def.artifact }) : undefined\n const skill = def.skill ? Object.freeze({ ...def.skill }) : undefined\n const artifacts = def.artifacts ? Object.freeze(def.artifacts.map(a => Object.freeze({ ...a }))) : undefined\n const dev = def.dev\n ? Object.freeze({ launch: Object.freeze(def.dev.launch.map(l => Object.freeze({ ...l }))) })\n : undefined\n const externalReadRoots = def.externalReadRoots ? Object.freeze([...def.externalReadRoots]) : undefined\n const data = def.data ? Object.freeze({ ...def.data }) : undefined\n const category = def.category\n\n validateAttachment(agents, workflows)\n\n const frozenAgents = Object.freeze(agents.map((e) => Object.freeze({ ...e })))\n const frozenWorkflows = Object.freeze([...workflows])\n const frozenAttachments = Object.freeze([...attachments])\n\n const handle: AppHandle = {\n agents: frozenAgents,\n workflows: frozenWorkflows,\n attachments: frozenAttachments,\n ...(workspace ? { workspace } : {}),\n ...(id !== undefined ? { id } : {}),\n ...(name !== undefined ? { name } : {}),\n ...(version !== undefined ? { version } : {}),\n ...(description !== undefined ? { description } : {}),\n ...(requires !== undefined ? { requires } : {}),\n ...(ui !== undefined ? { ui } : {}),\n ...(artifact !== undefined ? { artifact } : {}),\n ...(skill !== undefined ? { skill } : {}),\n ...(artifacts !== undefined ? { artifacts } : {}),\n ...(dev !== undefined ? { dev } : {}),\n ...(data !== undefined ? { data } : {}),\n ...(externalReadRoots !== undefined ? { externalReadRoots } : {}),\n ...(category !== undefined ? { category } : {}),\n\n async toMastraAgents(opts: ToMastraAgentOptions, only?: readonly string[]) {\n const targets = only ? selectAgents(frozenAgents, only) : frozenAgents\n const out: Record<string, BuildMastraAgentResult> = {}\n for (const entry of targets) {\n out[entry.agent.id] = await buildOne(entry, opts)\n }\n return out\n },\n\n pick(ids: readonly string[]) {\n return selectAgents(frozenAgents, ids)\n },\n\n async toMastraAgent(opts: ToMastraAgentOptions) {\n if (frozenAgents.length !== 1) {\n throw new AppDefinitionError(\n `toMastraAgent requires exactly one agent (app has ${frozenAgents.length}); use toMastraAgents.`,\n )\n }\n return buildOne(frozenAgents[0]!, opts)\n },\n\n emit(dir: string) {\n return emitApp(\n {\n agents: frozenAgents,\n workflows: frozenWorkflows,\n ...(workspace ? { workspace } : {}),\n ...(id !== undefined ? { id } : {}),\n ...(name !== undefined ? { name } : {}),\n ...(version !== undefined ? { version } : {}),\n ...(description !== undefined ? { description } : {}),\n ...(requires !== undefined ? { requires } : {}),\n ...(ui !== undefined ? { ui } : {}),\n ...(artifact !== undefined ? { artifact } : {}),\n ...(skill !== undefined ? { skill } : {}),\n ...(artifacts !== undefined ? { artifacts } : {}),\n ...(dev !== undefined ? { dev } : {}),\n ...(data !== undefined ? { data } : {}),\n ...(externalReadRoots !== undefined ? { externalReadRoots } : {}),\n ...(category !== undefined ? { category } : {}),\n },\n dir,\n )\n },\n }\n\n return Object.freeze(handle)\n}\n\n/**\n * Normalize the `workspace` input to an AIP-34 `WorkspaceHandle`. A built\n * handle (already run through `defineWorkspace`) carries `schema:\n * \"workspace/v1\"` and passes straight through; a `WorkspaceShorthand` is\n * completed with a local-fs storage default and a `0.1.0` version, then\n * validated by `defineWorkspace` — so a malformed shorthand fails with the\n * same AIP-34 diagnostic as a malformed WORKSPACE.md.\n */\nfunction toWorkspaceHandle(input: WorkspaceInput): WorkspaceHandle {\n if (\"schema\" in input) return input\n return defineWorkspace({\n schema: \"workspace/v1\",\n version: input.version ?? \"0.1.0\",\n id: input.id,\n name: input.name,\n owner: input.owner,\n storage: input.storage ?? { inline: { provider: \"local-fs\", config: {} } },\n ...(input.description ? { description: input.description } : {}),\n })\n}\n\n/**\n * Resolve `ids` to their app entries, preserving the caller's order. Throws\n * `AppDefinitionError` on any id the app doesn't bundle — a hand-picked list\n * that names a missing agent is a bug, not a silent no-op.\n */\nfunction selectAgents(\n agents: readonly AgentEntry[],\n ids: readonly string[],\n): readonly AgentEntry[] {\n const byId = new Map(agents.map((e) => [e.agent.id, e]))\n return ids.map((id) => {\n const entry = byId.get(id)\n if (!entry) {\n throw new AppDefinitionError(\n `agent '${id}' is not in this app. Bundled: [${[...byId.keys()].join(\", \")}].`,\n )\n }\n return entry\n })\n}\n\nasync function buildOne(entry: AgentEntry, opts: ToMastraAgentOptions): Promise<BuildMastraAgentResult> {\n // Dynamic import, not a static top-level one: `@agentproto/mastra` pulls in\n // `@mastra/core` (a documented peer dependency — see index.ts), which a\n // bundler would otherwise inline into ANY host that merely calls\n // `defineApp()` without ever calling `toMastraAgent(s)` (e.g. a UI-only app\n // consumer). Loading it lazily, only from the one place it's actually used,\n // keeps `defineApp()`/the rest of this module free of that cost.\n const { buildMastraAgent } = await import(\"@agentproto/mastra\")\n // `entry.body` (the AGENT.md body) wins as instructions; an explicit\n // `opts.body` still overrides, matching buildMastraAgent's contract.\n return buildMastraAgent(entry.agent, { body: entry.body, ...opts })\n}\n\nfunction normalizeEntry(input: AgentEntry | AgentHandle): AgentEntry {\n // An AgentEntry has an `.agent`; a bare AgentHandle has `.id`/`.schema`.\n if (\"agent\" in input) return input\n return { agent: input }\n}\n\n/**\n * The attachment invariant across all agents: bundled workflow ids and\n * the union of every agent's `workflows[]` refs must be the same set.\n * External/registry workflow refs are out of scope for an app bundle —\n * if an agent lists it, the app must ship it.\n */\nfunction validateAttachment(\n agents: readonly AgentEntry[],\n workflows: readonly WorkflowHandle[],\n): void {\n const seenAgentIds = new Set<string>()\n for (const { agent } of agents) {\n if (seenAgentIds.has(agent.id)) {\n throw new AppDefinitionError(`duplicate agent id '${agent.id}' in the bundle.`)\n }\n seenAgentIds.add(agent.id)\n }\n\n const bundledIds = new Set<string>()\n for (const wf of workflows) {\n if (bundledIds.has(wf.id)) {\n throw new AppDefinitionError(`duplicate workflow id '${wf.id}' in the bundle.`)\n }\n bundledIds.add(wf.id)\n }\n\n const referenced = new Set<string>()\n for (const { agent } of agents) {\n for (const ref of workflowRefs(agent)) {\n const key = refKey(ref)\n referenced.add(key)\n if (!bundledIds.has(key)) {\n throw new AppDefinitionError(\n `agent '${agent.id}' references workflow '${key}' but the app does not bundle it. ` +\n `Bundled: [${[...bundledIds].join(\", \") || \"none\"}].`,\n )\n }\n }\n }\n\n for (const id of bundledIds) {\n if (!referenced.has(id)) {\n throw new AppDefinitionError(\n `workflow '${id}' is bundled but no agent lists it in workflows[]. ` +\n `Add { ref: \"${id}\" } to an agent, or drop the workflow.`,\n )\n }\n }\n}\n\nfunction workflowRefs(agent: AgentHandle): readonly AnyRef[] {\n return agent.workflows ?? []\n}\n\nexport type { DoctypeHandle }\n","/**\n * `loadAppHandle(dir)` — read a root `APP.md` off disk into an `AppHandle`.\n *\n * Mirror of `@agentproto/workflow-loader`'s `loadWorkflowHandle`: this is\n * the host-side seam that touches the filesystem so the pure packages\n * (`@agentproto/agent`, `@agentproto/workflow`, `@agentproto/workspace`)\n * don't have to.\n *\n * `<dir>/.agentproto/APP.md` lists every agent + workflow the app bundles\n * as `{ id, path }` refs (relative to `dir`, the shape `emitApp` writes).\n * Each is loaded with its own package's manifest reader — `AGENT.md` via\n * `@agentproto/agent/manifest`, `WORKFLOW.md` via\n * `@agentproto/workflow-loader` (which itself resolves an `entry:` module\n * when present) — then the whole bundle is re-run through `defineApp` so\n * the attachment invariant (every agent/workflow ref resolves both ways)\n * re-validates exactly as it did at authoring time. A stale or hand-edited\n * APP.md that drifted from its AGENT.md/WORKFLOW.md refs fails the same\n * way a bad `defineApp({...})` call would.\n *\n * Frontmatter validation here is deliberately minimal, and that is now an\n * AIP-53 conformance decision, not an accident of app having \"no AIP yet\":\n * AIP-53 (Draft) freezes the loader contract at the checks below — schema\n * MUST be exactly `app/v1`, `agents`/`workflows` MUST be `{ id, path }`\n * ref arrays, every ref MUST resolve, and the bundle MUST re-run through\n * `defineApp` — and it does NOT require rejecting unknown frontmatter\n * keys. Staying permissive past the frozen checks lets a future frontmatter\n * key (e.g. a later WP's addition) round-trip through this loader without\n * hosts that haven't upgraded rejecting the whole app; tightening beyond\n * the spec would break that forward compatibility for no conformance gain.\n */\n\nimport { readFile } from \"node:fs/promises\"\nimport { dirname, isAbsolute, join } from \"node:path\"\nimport matter from \"gray-matter\"\nimport { agentFromManifest, parseAgentManifest } from \"@agentproto/agent/manifest\"\nimport { loadWorkflowHandle } from \"@agentproto/workflow-loader\"\nimport { parseWorkspaceManifest, workspaceFromManifest } from \"@agentproto/workspace/manifest\"\nimport type { AgentEntry, AppArtifactDecl, AppDataDefinition, AppDevDefinition, AppHandle } from \"./types.js\"\nimport { defineApp } from \"./define-app.js\"\n\nexport class AppLoadError extends Error {\n constructor(message: string) {\n super(`loadAppHandle: ${message}`)\n this.name = \"AppLoadError\"\n }\n}\n\ninterface AppRef {\n readonly id: string\n readonly path: string\n}\n\ninterface AppFrontmatterUi {\n readonly path: string\n readonly title?: string\n readonly description?: string\n readonly tools?: readonly string[]\n readonly port?: number\n readonly csp?: {\n readonly connectDomains?: readonly string[]\n readonly resourceDomains?: readonly string[]\n readonly frameDomains?: readonly string[]\n }\n}\n\ninterface AppFrontmatterArtifact {\n readonly path: string\n readonly title?: string\n readonly description?: string\n}\n\ninterface AppFrontmatterSkill {\n readonly path: string\n readonly title?: string\n readonly description?: string\n}\n\ninterface AppFrontmatter {\n readonly schema: string\n readonly id?: string\n readonly name?: string\n readonly version?: string\n readonly description?: string\n readonly agents: readonly AppRef[]\n readonly workflows: readonly AppRef[]\n readonly workspace?: string\n readonly requires?: readonly string[]\n readonly ui?: AppFrontmatterUi\n readonly artifact?: AppFrontmatterArtifact\n readonly skill?: AppFrontmatterSkill\n readonly artifacts?: readonly AppArtifactDecl[]\n readonly dev?: AppDevDefinition\n readonly data?: AppDataDefinition\n readonly externalReadRoots?: readonly string[]\n readonly category?: string\n}\n\nfunction resolveRef(dir: string, path: string): string {\n return isAbsolute(path) ? path : join(dir, path)\n}\n\n/**\n * Resolve the UI ROOT directory an app's UI should be served from — the\n * same resolution `app_install`/`loadAppHandle` uses for `ui.path`, so\n * `app serve` and install agree on where the UI lives.\n *\n * Reads `<appDir>/.agentproto/APP.md` frontmatter: when a `ui.path` is\n * declared, the UI root is the directory CONTAINING that entry file (e.g.\n * `ui.path: ui/index.html` → `<appDir>/ui`); when `ui` is absent, returns\n * `undefined` and callers fall back to the legacy `<appDir>/.agentproto/ui/`.\n * Throws {@link AppLoadError} on a `ui` that isn't an object or whose `path`\n * isn't a non-empty string — the same shape `loadAppHandle` would reject.\n * Returns `undefined` (not a throw) when APP.md itself is unreadable, since\n * callers check APP.md existence separately.\n */\nexport async function resolveAppUIRoot(appDir: string): Promise<string | undefined> {\n const appMdPath = join(appDir, \".agentproto\", \"APP.md\")\n let source: string\n try {\n source = await readFile(appMdPath, \"utf8\")\n } catch {\n return undefined\n }\n const data = matter(source).data as Record<string, unknown>\n const ui = data.ui\n if (ui === undefined) return undefined\n if (typeof ui !== \"object\" || ui === null || Array.isArray(ui)) {\n throw new AppLoadError(`'${appMdPath}': frontmatter 'ui' must be an object.`)\n }\n const path = (ui as Record<string, unknown>).path\n if (typeof path !== \"string\" || path.trim() === \"\") {\n throw new AppLoadError(\n `'${appMdPath}': frontmatter 'ui.path' must be a non-empty string.`,\n )\n }\n return dirname(resolveRef(appDir, path))\n}\n\nfunction isRefArray(v: unknown): v is AppRef[] {\n return (\n Array.isArray(v) &&\n v.every(\n (e) =>\n typeof e === \"object\" &&\n e !== null &&\n typeof (e as { id?: unknown }).id === \"string\" &&\n typeof (e as { path?: unknown }).path === \"string\",\n )\n )\n}\n\n/** Minimal shape check — see the module doc for why this stays loose. */\nfunction parseAppFrontmatter(data: Record<string, unknown>, appPath: string): AppFrontmatter {\n if (data.schema !== \"app/v1\") {\n throw new AppLoadError(\n `'${appPath}': expected frontmatter 'schema: app/v1', got ${JSON.stringify(data.schema)}.`,\n )\n }\n if (!isRefArray(data.agents)) {\n throw new AppLoadError(`'${appPath}': frontmatter 'agents' must be an array of { id, path }.`)\n }\n if (!isRefArray(data.workflows)) {\n throw new AppLoadError(\n `'${appPath}': frontmatter 'workflows' must be an array of { id, path }.`,\n )\n }\n if (data.requires !== undefined) {\n if (!Array.isArray(data.requires) || !data.requires.every((e) => typeof e === \"string\")) {\n throw new AppLoadError(`'${appPath}': frontmatter 'requires' must be an array of strings.`)\n }\n }\n if (data.data !== undefined) {\n const d = data.data as { dir?: unknown } | null\n if (\n typeof d !== \"object\" ||\n d === null ||\n (d.dir !== undefined && (typeof d.dir !== \"string\" || d.dir.trim() === \"\"))\n ) {\n throw new AppLoadError(\n `'${appPath}': frontmatter 'data' must be an object whose optional 'dir' is a non-empty string.`,\n )\n }\n }\n if (data.externalReadRoots !== undefined) {\n if (\n !Array.isArray(data.externalReadRoots) ||\n !data.externalReadRoots.every((e) => typeof e === \"string\" && e.trim() !== \"\")\n ) {\n throw new AppLoadError(\n `'${appPath}': frontmatter 'externalReadRoots' must be an array of non-empty strings.`,\n )\n }\n }\n if (data.category !== undefined && (typeof data.category !== \"string\" || data.category.trim() === \"\")) {\n throw new AppLoadError(`'${appPath}': frontmatter 'category' must be a non-empty string.`)\n }\n return data as unknown as AppFrontmatter\n}\n\nasync function loadAgentEntry(dir: string, ref: AppRef): Promise<AgentEntry> {\n const agentPath = resolveRef(dir, ref.path)\n let source: string\n try {\n source = await readFile(agentPath, \"utf8\")\n } catch (err) {\n throw new AppLoadError(\n `agent '${ref.id}': cannot read '${agentPath}': ${err instanceof Error ? err.message : String(err)}`,\n )\n }\n let body: string\n let manifest: ReturnType<typeof parseAgentManifest>\n try {\n manifest = parseAgentManifest(source)\n body = manifest.body.trim()\n } catch (err) {\n throw new AppLoadError(\n `agent '${ref.id}' at '${agentPath}': ${err instanceof Error ? err.message : String(err)}`,\n )\n }\n return { agent: agentFromManifest(manifest), ...(body ? { body } : {}) }\n}\n\nasync function loadWorkflowRef(dir: string, ref: AppRef) {\n const wfPath = resolveRef(dir, ref.path)\n try {\n return await loadWorkflowHandle(wfPath)\n } catch (err) {\n throw new AppLoadError(\n `workflow '${ref.id}' at '${wfPath}': ${err instanceof Error ? err.message : String(err)}`,\n )\n }\n}\n\n/**\n * Load `<dir>/.agentproto/APP.md` and every AGENT.md/WORKFLOW.md (and, if\n * declared, `<dir>/WORKSPACE.md`) it references, then re-run `defineApp` on\n * the result. Throws {@link AppLoadError} naming the offending path on a\n * missing APP.md, a missing referenced file, or a frontmatter/schema\n * mismatch; throws `AppDefinitionError` (from `defineApp`) if the loaded\n * bundle fails the attachment invariant.\n */\nexport async function loadAppHandle(dir: string): Promise<AppHandle> {\n const appPath = join(dir, \".agentproto\", \"APP.md\")\n let source: string\n try {\n source = await readFile(appPath, \"utf8\")\n } catch (err) {\n throw new AppLoadError(\n `cannot read '${appPath}': ${err instanceof Error ? err.message : String(err)}`,\n )\n }\n\n const parsed = matter(source)\n const fm = parseAppFrontmatter(parsed.data, appPath)\n\n const agents: AgentEntry[] = []\n for (const ref of fm.agents) {\n agents.push(await loadAgentEntry(dir, ref))\n }\n\n const workflows = []\n for (const ref of fm.workflows) {\n workflows.push(await loadWorkflowRef(dir, ref))\n }\n\n let workspace\n if (fm.workspace) {\n const workspacePath = join(dir, \"WORKSPACE.md\")\n let workspaceSource: string\n try {\n workspaceSource = await readFile(workspacePath, \"utf8\")\n } catch (err) {\n throw new AppLoadError(\n `workspace '${fm.workspace}': cannot read '${workspacePath}': ${err instanceof Error ? err.message : String(err)}`,\n )\n }\n try {\n workspace = workspaceFromManifest(parseWorkspaceManifest(workspaceSource))\n } catch (err) {\n throw new AppLoadError(\n `workspace '${fm.workspace}' at '${workspacePath}': ${err instanceof Error ? err.message : String(err)}`,\n )\n }\n }\n\n let ui\n if (fm.ui) {\n const uiPath = resolveRef(dir, fm.ui.path)\n let html: string\n try {\n html = await readFile(uiPath, \"utf8\")\n } catch (err) {\n throw new AppLoadError(\n `ui: cannot read '${uiPath}': ${err instanceof Error ? err.message : String(err)}`,\n )\n }\n ui = {\n html,\n ...(fm.ui.title !== undefined ? { title: fm.ui.title } : {}),\n ...(fm.ui.description !== undefined ? { description: fm.ui.description } : {}),\n ...(fm.ui.tools !== undefined ? { tools: fm.ui.tools } : {}),\n ...(fm.ui.port !== undefined ? { port: fm.ui.port } : {}),\n ...(fm.ui.csp !== undefined ? { csp: fm.ui.csp } : {}),\n }\n }\n\n return defineApp({\n agents,\n workflows,\n ...(workspace ? { workspace } : {}),\n ...(fm.id !== undefined ? { id: fm.id } : {}),\n ...(fm.name !== undefined ? { name: fm.name } : {}),\n ...(fm.version !== undefined ? { version: fm.version } : {}),\n ...(fm.description !== undefined ? { description: fm.description } : {}),\n ...(fm.requires !== undefined ? { requires: fm.requires } : {}),\n ...(ui !== undefined ? { ui } : {}),\n ...(fm.artifact !== undefined\n ? { artifact: { path: resolveRef(dir, fm.artifact.path), ...(fm.artifact.title !== undefined ? { title: fm.artifact.title } : {}), ...(fm.artifact.description !== undefined ? { description: fm.artifact.description } : {}) } }\n : {}),\n ...(fm.skill !== undefined\n ? { skill: { path: resolveRef(dir, fm.skill.path), ...(fm.skill.title !== undefined ? { title: fm.skill.title } : {}), ...(fm.skill.description !== undefined ? { description: fm.skill.description } : {}) } }\n : {}),\n ...(fm.artifacts !== undefined ? { artifacts: fm.artifacts } : {}),\n ...(fm.dev !== undefined ? { dev: fm.dev } : {}),\n ...(fm.data !== undefined ? { data: fm.data } : {}),\n ...(fm.externalReadRoots !== undefined ? { externalReadRoots: fm.externalReadRoots } : {}),\n ...(fm.category !== undefined ? { category: fm.category } : {}),\n })\n}\n"]}
1
+ {"version":3,"sources":["../src/refs.ts","../src/emit.ts","../src/define-app.ts","../src/errors.ts","../src/load-app-tools.ts","../src/load-app.ts"],"names":["workflowRefs","matter","isAbsolute","relative","join","readFile"],"mappings":";;;;;;;;;;;;;;;;;;;;AASO,SAAS,OAAO,GAAA,EAAqB;AAC1C,EAAA,IAAI,OAAO,GAAA,KAAQ,QAAA,EAAU,OAAO,GAAA;AACpC,EAAA,OAAO,GAAA,CAAI,OAAO,GAAA,CAAI,IAAA,IAAQ,KAAK,SAAA,CAAU,GAAA,CAAI,UAAU,GAAG,CAAA;AAChE;AAGO,SAAS,WAAW,EAAA,EAAoB;AAC7C,EAAA,MAAM,CAAA,GAAI,EAAA,CAAG,KAAA,CAAM,gBAAgB,CAAA;AACnC,EAAA,OAAO,CAAA,GAAI,CAAA,CAAE,CAAC,CAAA,GAAK,EAAA;AACrB;AC0CA,eAAsB,OAAA,CAAQ,KAAgB,GAAA,EAAkC;AAC9E,EAAA,IAAI,aAAA;AACJ,EAAA,IAAI,IAAI,SAAA,EAAW;AACjB,IAAA,MAAM,KAAA,CAAM,GAAA,EAAK,EAAE,SAAA,EAAW,MAAM,CAAA;AACpC,IAAA,aAAA,GAAgB,IAAA,CAAK,KAAK,cAAc,CAAA;AACxC,IAAA,MAAM,SAAA;AAAA,MACJ,aAAA;AAAA,MACA,UAAA,CAAW,IAAI,SAAA,EAAW,GAAA,CAAI,UAAU,WAAA,IAAe,GAAA,CAAI,UAAU,IAAI,CAAA;AAAA,MACzE;AAAA,KACF;AAAA,EACF;AAEA,EAAA,MAAM,aAAqC,EAAC;AAC5C,EAAA,KAAA,MAAW,EAAE,KAAA,EAAO,IAAA,EAAK,IAAK,IAAI,MAAA,EAAQ;AACxC,IAAA,MAAM,QAAA,GAAW,KAAK,GAAA,EAAK,aAAA,EAAe,UAAU,UAAA,CAAW,KAAA,CAAM,EAAE,CAAC,CAAA;AACxE,IAAA,MAAM,KAAA,CAAM,QAAA,EAAU,EAAE,SAAA,EAAW,MAAM,CAAA;AACzC,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,QAAA,EAAU,UAAU,CAAA;AAC3C,IAAA,MAAM,UAAU,SAAA,EAAW,UAAA,CAAW,OAAO,IAAA,IAAQ,EAAE,GAAG,MAAM,CAAA;AAChE,IAAA,UAAA,CAAW,KAAA,CAAM,EAAE,CAAA,GAAI,SAAA;AAAA,EACzB;AAEA,EAAA,IAAI,MAAA;AACJ,EAAA,IAAI,aAAA;AACJ,EAAA,IAAI,IAAI,EAAA,EAAI;AACV,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,GAAA,EAAK,aAAA,EAAe,IAAI,CAAA;AAC3C,IAAA,MAAM,KAAA,CAAM,KAAA,EAAO,EAAE,SAAA,EAAW,MAAM,CAAA;AACtC,IAAA,MAAA,GAAS,IAAA,CAAK,OAAO,YAAY,CAAA;AACjC,IAAA,MAAM,SAAA,CAAU,MAAA,EAAQ,GAAA,CAAI,EAAA,CAAG,MAAM,MAAM,CAAA;AAC3C,IAAA,aAAA,GAAgB;AAAA,MACd,IAAA,EAAM,QAAA,CAAS,GAAA,EAAK,MAAM,CAAA;AAAA,MAC1B,GAAI,GAAA,CAAI,EAAA,CAAG,KAAA,KAAU,MAAA,GAAY,EAAE,KAAA,EAAO,GAAA,CAAI,EAAA,CAAG,KAAA,EAAM,GAAI,EAAC;AAAA,MAC5D,GAAI,GAAA,CAAI,EAAA,CAAG,WAAA,KAAgB,MAAA,GAAY,EAAE,WAAA,EAAa,GAAA,CAAI,EAAA,CAAG,WAAA,EAAY,GAAI,EAAC;AAAA,MAC9E,GAAI,GAAA,CAAI,EAAA,CAAG,KAAA,KAAU,MAAA,GAAY,EAAE,KAAA,EAAO,GAAA,CAAI,EAAA,CAAG,KAAA,EAAM,GAAI,EAAC;AAAA,MAC5D,GAAI,GAAA,CAAI,EAAA,CAAG,IAAA,KAAS,MAAA,GAAY,EAAE,IAAA,EAAM,GAAA,CAAI,EAAA,CAAG,IAAA,EAAK,GAAI,EAAC;AAAA,MACzD,GAAI,GAAA,CAAI,EAAA,CAAG,GAAA,KAAQ,MAAA,GAAY,EAAE,GAAA,EAAK,GAAA,CAAI,EAAA,CAAG,GAAA,EAAI,GAAI,EAAC;AAAA,MACtD,GAAI,GAAA,CAAI,EAAA,CAAG,KAAA,KAAU,MAAA,GAAY,EAAE,KAAA,EAAO,GAAA,CAAI,EAAA,CAAG,KAAA,EAAM,GAAI;AAAC,KAC9D;AAAA,EACF;AAEA,EAAA,IAAI,YAAA;AACJ,EAAA,IAAI,mBAAA;AACJ,EAAA,IAAI,IAAI,QAAA,EAAU;AAChB,IAAA,MAAM,WAAA,GAAc,IAAA,CAAK,GAAA,EAAK,aAAA,EAAe,UAAU,CAAA;AACvD,IAAA,MAAM,KAAA,CAAM,WAAA,EAAa,EAAE,SAAA,EAAW,MAAM,CAAA;AAC5C,IAAA,YAAA,GAAe,IAAA,CAAK,aAAa,YAAY,CAAA;AAC7C,IAAA,MAAM,QAAA,CAAS,GAAA,CAAI,QAAA,CAAS,IAAA,EAAM,YAAY,CAAA;AAC9C,IAAA,mBAAA,GAAsB;AAAA,MACpB,IAAA,EAAM,QAAA,CAAS,GAAA,EAAK,YAAY,CAAA;AAAA,MAChC,GAAI,GAAA,CAAI,QAAA,CAAS,KAAA,KAAU,MAAA,GAAY,EAAE,KAAA,EAAO,GAAA,CAAI,QAAA,CAAS,KAAA,EAAM,GAAI,EAAC;AAAA,MACxE,GAAI,GAAA,CAAI,QAAA,CAAS,WAAA,KAAgB,MAAA,GAAY,EAAE,WAAA,EAAa,GAAA,CAAI,QAAA,CAAS,WAAA,EAAY,GAAI;AAAC,KAC5F;AAAA,EACF;AAEA,EAAA,IAAI,SAAA;AACJ,EAAA,IAAI,gBAAA;AACJ,EAAA,IAAI,IAAI,KAAA,EAAO;AACb,IAAA,SAAA,GAAY,IAAA,CAAK,GAAA,EAAK,aAAA,EAAe,OAAO,CAAA;AAC5C,IAAA,MAAM,KAAA,CAAM,SAAA,EAAW,EAAE,SAAA,EAAW,MAAM,CAAA;AAC1C,IAAA,MAAM,EAAA,CAAG,IAAI,KAAA,CAAM,IAAA,EAAM,WAAW,EAAE,SAAA,EAAW,MAAM,CAAA;AACvD,IAAA,gBAAA,GAAmB;AAAA,MACjB,IAAA,EAAM,QAAA,CAAS,GAAA,EAAK,SAAS,CAAA;AAAA,MAC7B,GAAI,GAAA,CAAI,KAAA,CAAM,KAAA,KAAU,MAAA,GAAY,EAAE,KAAA,EAAO,GAAA,CAAI,KAAA,CAAM,KAAA,EAAM,GAAI,EAAC;AAAA,MAClE,GAAI,GAAA,CAAI,KAAA,CAAM,WAAA,KAAgB,MAAA,GAAY,EAAE,WAAA,EAAa,GAAA,CAAI,KAAA,CAAM,WAAA,EAAY,GAAI;AAAC,KACtF;AAAA,EACF;AAEA,EAAA,MAAM,gBAA0B,EAAC;AACjC,EAAA,MAAMA,gBAA+C,EAAC;AACtD,EAAA,KAAA,MAAW,EAAA,IAAM,IAAI,SAAA,EAAW;AAC9B,IAAA,MAAM,QAAQ,IAAA,CAAK,GAAA,EAAK,aAAA,EAAe,WAAA,EAAa,GAAG,EAAE,CAAA;AACzD,IAAA,MAAM,KAAA,CAAM,KAAA,EAAO,EAAE,SAAA,EAAW,MAAM,CAAA;AACtC,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,EAAO,aAAa,CAAA;AACxC,IAAA,MAAM,SAAA,CAAU,QAAQ,UAAA,CAAW,EAAA,EAAI,GAAG,WAAA,IAAe,EAAE,GAAG,MAAM,CAAA;AACpE,IAAA,aAAA,CAAc,KAAK,MAAM,CAAA;AACzB,IAAAA,aAAAA,CAAa,IAAA,CAAK,EAAE,EAAA,EAAI,EAAA,CAAG,EAAA,EAAI,IAAA,EAAM,QAAA,CAAS,GAAA,EAAK,MAAM,CAAA,EAAG,CAAA;AAAA,EAC9D;AAEA,EAAA,MAAM,KAAA,CAAM,KAAK,GAAA,EAAK,aAAa,GAAG,EAAE,SAAA,EAAW,MAAM,CAAA;AACzD,EAAA,MAAM,OAAA,GAAU,IAAA,CAAK,GAAA,EAAK,aAAA,EAAe,QAAQ,CAAA;AACjD,EAAA,MAAM,YAAY,GAAA,CAAI,MAAA,CAAO,IAAI,CAAC,EAAE,OAAM,MAAO;AAAA,IAC/C,IAAI,KAAA,CAAM,EAAA;AAAA,IACV,MAAM,QAAA,CAAS,GAAA,EAAK,UAAA,CAAW,KAAA,CAAM,EAAE,CAAE;AAAA,GAC3C,CAAE,CAAA;AACF,EAAA,MAAM,cAAA,GAA0C;AAAA,IAC9C,MAAA,EAAQ,QAAA;AAAA,IACR,GAAI,IAAI,EAAA,KAAO,MAAA,GAAY,EAAE,EAAA,EAAI,GAAA,CAAI,EAAA,EAAG,GAAI,EAAC;AAAA,IAC7C,GAAI,IAAI,IAAA,KAAS,MAAA,GAAY,EAAE,IAAA,EAAM,GAAA,CAAI,IAAA,EAAK,GAAI,EAAC;AAAA,IACnD,OAAA,EAAS,IAAI,OAAA,IAAW,OAAA;AAAA,IACxB,GAAI,IAAI,WAAA,KAAgB,MAAA,GAAY,EAAE,WAAA,EAAa,GAAA,CAAI,WAAA,EAAY,GAAI,EAAC;AAAA,IACxE,MAAA,EAAQ,SAAA;AAAA,IACR,SAAA,EAAWA,aAAAA;AAAA,IACX,GAAI,IAAI,SAAA,GAAY,EAAE,WAAW,GAAA,CAAI,SAAA,CAAU,EAAA,EAAG,GAAI,EAAC;AAAA,IACvD,GAAI,IAAI,QAAA,KAAa,MAAA,GAAY,EAAE,QAAA,EAAU,GAAA,CAAI,QAAA,EAAS,GAAI,EAAC;AAAA,IAC/D,GAAI,aAAA,KAAkB,MAAA,GAAY,EAAE,EAAA,EAAI,aAAA,KAAkB,EAAC;AAAA,IAC3D,GAAI,mBAAA,KAAwB,MAAA,GAAY,EAAE,QAAA,EAAU,mBAAA,KAAwB,EAAC;AAAA,IAC7E,GAAI,gBAAA,KAAqB,MAAA,GAAY,EAAE,KAAA,EAAO,gBAAA,KAAqB,EAAC;AAAA,IACpE,GAAI,IAAI,SAAA,KAAc,MAAA,GAAY,EAAE,SAAA,EAAW,GAAA,CAAI,SAAA,EAAU,GAAI,EAAC;AAAA,IAClE,GAAI,IAAI,GAAA,KAAQ,MAAA,GAAY,EAAE,GAAA,EAAK,GAAA,CAAI,GAAA,EAAI,GAAI,EAAC;AAAA,IAChD,GAAI,IAAI,IAAA,KAAS,MAAA,GAAY,EAAE,IAAA,EAAM,GAAA,CAAI,IAAA,EAAK,GAAI,EAAC;AAAA,IACnD,GAAI,IAAI,iBAAA,KAAsB,MAAA,GAAY,EAAE,iBAAA,EAAmB,GAAA,CAAI,iBAAA,EAAkB,GAAI,EAAC;AAAA,IAC1F,GAAI,IAAI,QAAA,KAAa,MAAA,GAAY,EAAE,QAAA,EAAU,GAAA,CAAI,QAAA,EAAS,GAAI;AAAC,GACjE;AACA,EAAA,MAAM,SAAA,CAAU,SAAS,UAAA,CAAW,cAAA,EAAgB,IAAI,WAAA,IAAe,EAAE,GAAG,MAAM,CAAA;AAElF,EAAA,OAAO;AAAA,IACL,UAAA;AAAA,IACA,aAAA;AAAA,IACA,OAAA;AAAA,IACA,GAAI,aAAA,GAAgB,EAAE,aAAA,KAAkB,EAAC;AAAA,IACzC,GAAI,MAAA,GAAS,EAAE,MAAA,KAAW,EAAC;AAAA,IAC3B,GAAI,YAAA,GAAe,EAAE,YAAA,KAAiB,EAAC;AAAA,IACvC,GAAI,SAAA,GAAY,EAAE,SAAA,KAAc;AAAC,GACnC;AACF;AAEA,SAAS,UAAA,CAAW,QAAgB,IAAA,EAAsB;AACxD,EAAA,MAAM,OAAgC,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,SAAA,CAAU,MAAM,CAAC,CAAA;AACvE,EAAA,OAAOC,QAAO,SAAA,CAAU;AAAA,EAAK,IAAI;AAAA,CAAA,EAAM,IAAI,CAAA;AAC7C;;;AC7IO,IAAM,kBAAA,GAAN,cAAiC,KAAA,CAAM;AAAA,EAC5C,YAAY,OAAA,EAAiB;AAC3B,IAAA,KAAA,CAAM,CAAA,qBAAA,EAAwB,OAAO,CAAA,CAAE,CAAA;AACvC,IAAA,IAAA,CAAK,IAAA,GAAO,oBAAA;AAAA,EACd;AACF;AAEO,SAAS,UAAU,GAAA,EAA+B;AACvD,EAAA,IAAI,IAAI,EAAA,KAAO,MAAA,IAAa,IAAI,EAAA,CAAG,IAAA,OAAW,EAAA,EAAI;AAChD,IAAA,MAAM,IAAI,mBAAmB,sCAAsC,CAAA;AAAA,EACrE;AACA,EAAA,IAAI,GAAA,CAAI,EAAA,KAAO,MAAA,KAAc,OAAO,GAAA,CAAI,EAAA,CAAG,IAAA,KAAS,QAAA,IAAY,GAAA,CAAI,EAAA,CAAG,IAAA,CAAK,IAAA,OAAW,EAAA,CAAA,EAAK;AAC1F,IAAA,MAAM,IAAI,mBAAmB,4DAA4D,CAAA;AAAA,EAC3F;AACA,EAAA,IAAA,CAAK,GAAA,CAAI,WAAW,MAAA,IAAa,GAAA,CAAI,OAAO,MAAA,KAAW,CAAA,KAAM,GAAA,CAAI,EAAA,KAAO,MAAA,EAAW;AACjF,IAAA,MAAM,IAAI,kBAAA;AAAA,MACR;AAAA,KACF;AAAA,EACF;AACA,EAAA,IAAI,GAAA,CAAI,GAAA,KAAQ,MAAA,KAAc,CAAC,MAAM,OAAA,CAAQ,GAAA,CAAI,GAAA,CAAI,MAAM,CAAA,IAAK,GAAA,CAAI,GAAA,CAAI,MAAA,CAAO,WAAW,CAAA,CAAA,EAAI;AAC5F,IAAA,MAAM,IAAI,mBAAmB,+DAA+D,CAAA;AAAA,EAC9F;AACA,EAAA,IAAI,IAAI,IAAA,KAAS,MAAA,IAAa,GAAA,CAAI,IAAA,CAAK,QAAQ,MAAA,KAAc,OAAO,GAAA,CAAI,IAAA,CAAK,QAAQ,QAAA,IAAY,GAAA,CAAI,KAAK,GAAA,CAAI,IAAA,OAAW,EAAA,CAAA,EAAK;AAC5H,IAAA,MAAM,IAAI,mBAAmB,qDAAqD,CAAA;AAAA,EACpF;AACF,EAAA,IAAI,GAAA,CAAI,QAAA,KAAa,MAAA,KAAc,OAAO,GAAA,CAAI,QAAA,CAAS,IAAA,KAAS,QAAA,IAAY,GAAA,CAAI,QAAA,CAAS,IAAA,CAAK,IAAA,OAAW,EAAA,CAAA,EAAK;AAC1G,IAAA,MAAM,IAAI,mBAAmB,wEAAwE,CAAA;AAAA,EACvG;AAIA,EAAA,IAAI,GAAA,CAAI,aAAa,MAAA,IAAa,CAAC,WAAW,GAAA,CAAI,QAAA,CAAS,IAAI,CAAA,EAAG;AAChE,IAAA,MAAM,IAAI,kBAAA;AAAA,MACR,CAAA,4DAAA,EAA+D,GAAA,CAAI,QAAA,CAAS,IAAI,CAAA,gFAAA;AAAA,KAClF;AAAA,EACF;AACA,EAAA,IAAI,GAAA,CAAI,KAAA,KAAU,MAAA,KAAc,OAAO,GAAA,CAAI,KAAA,CAAM,IAAA,KAAS,QAAA,IAAY,GAAA,CAAI,KAAA,CAAM,IAAA,CAAK,IAAA,OAAW,EAAA,CAAA,EAAK;AACnG,IAAA,MAAM,IAAI,mBAAmB,kEAAkE,CAAA;AAAA,EACjG;AACA,EAAA,IAAI,GAAA,CAAI,UAAU,MAAA,IAAa,CAAC,WAAW,GAAA,CAAI,KAAA,CAAM,IAAI,CAAA,EAAG;AAC1D,IAAA,MAAM,IAAI,kBAAA;AAAA,MACR,CAAA,yDAAA,EAA4D,GAAA,CAAI,KAAA,CAAM,IAAI,CAAA,gFAAA;AAAA,KAC5E;AAAA,EACF;AACA,EAAA,IAAI,IAAI,QAAA,KAAa,MAAA,IAAa,IAAI,QAAA,CAAS,IAAA,OAAW,EAAA,EAAI;AAC5D,IAAA,MAAM,IAAI,mBAAmB,qDAAqD,CAAA;AAAA,EACpF;AAEA,EAAA,MAAM,UAAU,GAAA,CAAI,MAAA,IAAU,EAAC,EAAG,IAAI,cAAc,CAAA;AACpD,EAAA,MAAM,SAAA,GAAY,GAAA,CAAI,SAAA,IAAa,EAAC;AACpC,EAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,KAAA,IAAS,EAAC;AAC5B,EAAA,MAAM,OAAA,GAAU,GAAA,CAAI,OAAA,IAAW,EAAC;AAChC,EAAA,MAAM,WAAA,GAAc,GAAA,CAAI,MAAA,IAAU,EAAC;AACnC,EAAA,MAAM,YAAY,GAAA,CAAI,SAAA,GAAY,iBAAA,CAAkB,GAAA,CAAI,SAAS,CAAA,GAAI,MAAA;AACrE,EAAA,MAAM,KAAK,GAAA,CAAI,EAAA;AACf,EAAA,MAAM,OAAO,GAAA,CAAI,IAAA;AACjB,EAAA,MAAM,OAAA,GAAU,GAAA,CAAI,OAAA,KAAY,EAAA,GAAK,OAAA,GAAU,MAAA,CAAA;AAC/C,EAAA,MAAM,cAAc,GAAA,CAAI,WAAA;AACxB,EAAA,MAAM,QAAA,GAAW,GAAA,CAAI,QAAA,GAAW,MAAA,CAAO,MAAA,CAAO,CAAC,GAAG,GAAA,CAAI,QAAQ,CAAC,CAAA,GAAI,MAAA;AACnE,EAAA,MAAM,EAAA,GAAK,GAAA,CAAI,EAAA,GAAK,MAAA,CAAO,MAAA,CAAO,EAAE,GAAG,GAAA,CAAI,EAAA,EAAI,CAAA,GAAI,MAAA;AACnD,EAAA,MAAM,QAAA,GAAW,GAAA,CAAI,QAAA,GAAW,MAAA,CAAO,MAAA,CAAO,EAAE,GAAG,GAAA,CAAI,QAAA,EAAU,CAAA,GAAI,MAAA;AACrE,EAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,KAAA,GAAQ,MAAA,CAAO,MAAA,CAAO,EAAE,GAAG,GAAA,CAAI,KAAA,EAAO,CAAA,GAAI,MAAA;AAC5D,EAAA,MAAM,YAAY,GAAA,CAAI,SAAA,GAAY,MAAA,CAAO,MAAA,CAAO,IAAI,SAAA,CAAU,GAAA,CAAI,CAAA,CAAA,KAAK,MAAA,CAAO,OAAO,EAAE,GAAG,GAAG,CAAC,CAAC,CAAA,GAAI,MAAA;AACnG,EAAA,MAAM,GAAA,GAAM,GAAA,CAAI,GAAA,GACZ,MAAA,CAAO,MAAA,CAAO,EAAE,MAAA,EAAQ,MAAA,CAAO,MAAA,CAAO,GAAA,CAAI,GAAA,CAAI,MAAA,CAAO,IAAI,CAAA,CAAA,KAAK,MAAA,CAAO,MAAA,CAAO,EAAE,GAAG,CAAA,EAAG,CAAC,CAAC,CAAA,EAAG,CAAA,GACzF,MAAA;AACJ,EAAA,MAAM,iBAAA,GAAoB,GAAA,CAAI,iBAAA,GAAoB,MAAA,CAAO,MAAA,CAAO,CAAC,GAAG,GAAA,CAAI,iBAAiB,CAAC,CAAA,GAAI,MAAA;AAC9F,EAAA,MAAM,IAAA,GAAO,GAAA,CAAI,IAAA,GAAO,MAAA,CAAO,MAAA,CAAO,EAAE,GAAG,GAAA,CAAI,IAAA,EAAM,CAAA,GAAI,MAAA;AACzD,EAAA,MAAM,WAAW,GAAA,CAAI,QAAA;AAErB,EAAA,kBAAA,CAAmB,QAAQ,SAAS,CAAA;AACpC,EAAA,iBAAA,CAAkB,OAAO,MAAM,CAAA;AAC/B,EAAA,iBAAA,CAAkB,SAAS,QAAQ,CAAA;AAEnC,EAAA,MAAM,YAAA,GAAe,MAAA,CAAO,MAAA,CAAO,MAAA,CAAO,IAAI,CAAC,CAAA,KAAM,MAAA,CAAO,MAAA,CAAO,EAAE,GAAG,CAAA,EAAG,CAAC,CAAC,CAAA;AAC7E,EAAA,MAAM,kBAAkB,MAAA,CAAO,MAAA,CAAO,CAAC,GAAG,SAAS,CAAC,CAAA;AACpD,EAAA,MAAM,cAAc,MAAA,CAAO,MAAA,CAAO,CAAC,GAAG,KAAK,CAAC,CAAA;AAC5C,EAAA,MAAM,gBAAgB,MAAA,CAAO,MAAA,CAAO,CAAC,GAAG,OAAO,CAAC,CAAA;AAChD,EAAA,MAAM,oBAAoB,MAAA,CAAO,MAAA,CAAO,CAAC,GAAG,WAAW,CAAC,CAAA;AAExD,EAAA,MAAM,MAAA,GAAoB;AAAA,IACxB,MAAA,EAAQ,YAAA;AAAA,IACR,SAAA,EAAW,eAAA;AAAA,IACX,KAAA,EAAO,WAAA;AAAA,IACP,OAAA,EAAS,aAAA;AAAA,IACT,WAAA,EAAa,iBAAA;AAAA,IACb,GAAI,SAAA,GAAY,EAAE,SAAA,KAAc,EAAC;AAAA,IACjC,GAAI,EAAA,KAAO,MAAA,GAAY,EAAE,EAAA,KAAO,EAAC;AAAA,IACjC,GAAI,IAAA,KAAS,MAAA,GAAY,EAAE,IAAA,KAAS,EAAC;AAAA,IACrC,GAAI,OAAA,KAAY,MAAA,GAAY,EAAE,OAAA,KAAY,EAAC;AAAA,IAC3C,GAAI,WAAA,KAAgB,MAAA,GAAY,EAAE,WAAA,KAAgB,EAAC;AAAA,IACnD,GAAI,QAAA,KAAa,MAAA,GAAY,EAAE,QAAA,KAAa,EAAC;AAAA,IAC7C,GAAI,EAAA,KAAO,MAAA,GAAY,EAAE,EAAA,KAAO,EAAC;AAAA,IACjC,GAAI,QAAA,KAAa,MAAA,GAAY,EAAE,QAAA,KAAa,EAAC;AAAA,IAC7C,GAAI,KAAA,KAAU,MAAA,GAAY,EAAE,KAAA,KAAU,EAAC;AAAA,IACvC,GAAI,SAAA,KAAc,MAAA,GAAY,EAAE,SAAA,KAAc,EAAC;AAAA,IAC/C,GAAI,GAAA,KAAQ,MAAA,GAAY,EAAE,GAAA,KAAQ,EAAC;AAAA,IACnC,GAAI,IAAA,KAAS,MAAA,GAAY,EAAE,IAAA,KAAS,EAAC;AAAA,IACrC,GAAI,iBAAA,KAAsB,MAAA,GAAY,EAAE,iBAAA,KAAsB,EAAC;AAAA,IAC/D,GAAI,QAAA,KAAa,MAAA,GAAY,EAAE,QAAA,KAAa,EAAC;AAAA,IAE7C,MAAM,cAAA,CAAe,IAAA,EAA4B,IAAA,EAA0B;AACzE,MAAA,MAAM,OAAA,GAAU,IAAA,GAAO,YAAA,CAAa,YAAA,EAAc,IAAI,CAAA,GAAI,YAAA;AAC1D,MAAA,MAAM,MAA8C,EAAC;AACrD,MAAA,KAAA,MAAW,SAAS,OAAA,EAAS;AAC3B,QAAA,GAAA,CAAI,MAAM,KAAA,CAAM,EAAE,IAAI,MAAM,QAAA,CAAS,OAAO,IAAI,CAAA;AAAA,MAClD;AACA,MAAA,OAAO,GAAA;AAAA,IACT,CAAA;AAAA,IAEA,KAAK,GAAA,EAAwB;AAC3B,MAAA,OAAO,YAAA,CAAa,cAAc,GAAG,CAAA;AAAA,IACvC,CAAA;AAAA,IAEA,MAAM,cAAc,IAAA,EAA4B;AAC9C,MAAA,IAAI,YAAA,CAAa,WAAW,CAAA,EAAG;AAC7B,QAAA,MAAM,IAAI,kBAAA;AAAA,UACR,CAAA,kDAAA,EAAqD,aAAa,MAAM,CAAA,sBAAA;AAAA,SAC1E;AAAA,MACF;AACA,MAAA,OAAO,QAAA,CAAS,YAAA,CAAa,CAAC,CAAA,EAAI,IAAI,CAAA;AAAA,IACxC,CAAA;AAAA,IAEA,KAAK,GAAA,EAAa;AAChB,MAAA,OAAO,OAAA;AAAA,QACL;AAAA,UACE,MAAA,EAAQ,YAAA;AAAA,UACR,SAAA,EAAW,eAAA;AAAA,UACX,GAAI,SAAA,GAAY,EAAE,SAAA,KAAc,EAAC;AAAA,UACjC,GAAI,EAAA,KAAO,MAAA,GAAY,EAAE,EAAA,KAAO,EAAC;AAAA,UACjC,GAAI,IAAA,KAAS,MAAA,GAAY,EAAE,IAAA,KAAS,EAAC;AAAA,UACrC,GAAI,OAAA,KAAY,MAAA,GAAY,EAAE,OAAA,KAAY,EAAC;AAAA,UAC3C,GAAI,WAAA,KAAgB,MAAA,GAAY,EAAE,WAAA,KAAgB,EAAC;AAAA,UACnD,GAAI,QAAA,KAAa,MAAA,GAAY,EAAE,QAAA,KAAa,EAAC;AAAA,UAC7C,GAAI,EAAA,KAAO,MAAA,GAAY,EAAE,EAAA,KAAO,EAAC;AAAA,UACjC,GAAI,QAAA,KAAa,MAAA,GAAY,EAAE,QAAA,KAAa,EAAC;AAAA,UAC7C,GAAI,KAAA,KAAU,MAAA,GAAY,EAAE,KAAA,KAAU,EAAC;AAAA,UACvC,GAAI,SAAA,KAAc,MAAA,GAAY,EAAE,SAAA,KAAc,EAAC;AAAA,UAC/C,GAAI,GAAA,KAAQ,MAAA,GAAY,EAAE,GAAA,KAAQ,EAAC;AAAA,UACnC,GAAI,IAAA,KAAS,MAAA,GAAY,EAAE,IAAA,KAAS,EAAC;AAAA,UACrC,GAAI,iBAAA,KAAsB,MAAA,GAAY,EAAE,iBAAA,KAAsB,EAAC;AAAA,UAC/D,GAAI,QAAA,KAAa,MAAA,GAAY,EAAE,QAAA,KAAa;AAAC,SAC/C;AAAA,QACA;AAAA,OACF;AAAA,IACF;AAAA,GACF;AAEA,EAAA,OAAO,MAAA,CAAO,OAAO,MAAM,CAAA;AAC7B;AAUA,SAAS,kBAAkB,KAAA,EAAwC;AACjE,EAAA,IAAI,QAAA,IAAY,OAAO,OAAO,KAAA;AAC9B,EAAA,OAAO,eAAA,CAAgB;AAAA,IACrB,MAAA,EAAQ,cAAA;AAAA,IACR,OAAA,EAAS,MAAM,OAAA,IAAW,OAAA;AAAA,IAC1B,IAAI,KAAA,CAAM,EAAA;AAAA,IACV,MAAM,KAAA,CAAM,IAAA;AAAA,IACZ,OAAO,KAAA,CAAM,KAAA;AAAA,IACb,OAAA,EAAS,KAAA,CAAM,OAAA,IAAW,EAAE,MAAA,EAAQ,EAAE,QAAA,EAAU,UAAA,EAAY,MAAA,EAAQ,EAAC,EAAE,EAAE;AAAA,IACzE,GAAI,MAAM,WAAA,GAAc,EAAE,aAAa,KAAA,CAAM,WAAA,KAAgB;AAAC,GAC/D,CAAA;AACH;AAOA,SAAS,YAAA,CACP,QACA,GAAA,EACuB;AACvB,EAAA,MAAM,IAAA,GAAO,IAAI,GAAA,CAAI,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA,KAAM,CAAC,CAAA,CAAE,KAAA,CAAM,EAAA,EAAI,CAAC,CAAC,CAAC,CAAA;AACvD,EAAA,OAAO,GAAA,CAAI,GAAA,CAAI,CAAC,EAAA,KAAO;AACrB,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,GAAA,CAAI,EAAE,CAAA;AACzB,IAAA,IAAI,CAAC,KAAA,EAAO;AACV,MAAA,MAAM,IAAI,kBAAA;AAAA,QACR,CAAA,OAAA,EAAU,EAAE,CAAA,gCAAA,EAAmC,CAAC,GAAG,IAAA,CAAK,IAAA,EAAM,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC,CAAA,EAAA;AAAA,OAC5E;AAAA,IACF;AACA,IAAA,OAAO,KAAA;AAAA,EACT,CAAC,CAAA;AACH;AAEA,eAAe,QAAA,CAAS,OAAmB,IAAA,EAA6D;AAOtG,EAAA,MAAM,EAAE,gBAAA,EAAiB,GAAI,MAAM,OAAO,oBAAoB,CAAA;AAG9D,EAAA,OAAO,gBAAA,CAAiB,MAAM,KAAA,EAAO,EAAE,MAAM,KAAA,CAAM,IAAA,EAAM,GAAG,IAAA,EAAM,CAAA;AACpE;AAEA,SAAS,eAAe,KAAA,EAA6C;AAEnE,EAAA,IAAI,OAAA,IAAW,OAAO,OAAO,KAAA;AAC7B,EAAA,OAAO,EAAE,OAAO,KAAA,EAAM;AACxB;AAQA,SAAS,kBAAA,CACP,QACA,SAAA,EACM;AACN,EAAA,MAAM,YAAA,uBAAmB,GAAA,EAAY;AACrC,EAAA,KAAA,MAAW,EAAE,KAAA,EAAM,IAAK,MAAA,EAAQ;AAC9B,IAAA,IAAI,YAAA,CAAa,GAAA,CAAI,KAAA,CAAM,EAAE,CAAA,EAAG;AAC9B,MAAA,MAAM,IAAI,kBAAA,CAAmB,CAAA,oBAAA,EAAuB,KAAA,CAAM,EAAE,CAAA,gBAAA,CAAkB,CAAA;AAAA,IAChF;AACA,IAAA,YAAA,CAAa,GAAA,CAAI,MAAM,EAAE,CAAA;AAAA,EAC3B;AAEA,EAAA,MAAM,UAAA,uBAAiB,GAAA,EAAY;AACnC,EAAA,KAAA,MAAW,MAAM,SAAA,EAAW;AAC1B,IAAA,IAAI,UAAA,CAAW,GAAA,CAAI,EAAA,CAAG,EAAE,CAAA,EAAG;AACzB,MAAA,MAAM,IAAI,kBAAA,CAAmB,CAAA,uBAAA,EAA0B,EAAA,CAAG,EAAE,CAAA,gBAAA,CAAkB,CAAA;AAAA,IAChF;AACA,IAAA,UAAA,CAAW,GAAA,CAAI,GAAG,EAAE,CAAA;AAAA,EACtB;AAEA,EAAA,MAAM,UAAA,uBAAiB,GAAA,EAAY;AACnC,EAAA,KAAA,MAAW,EAAE,KAAA,EAAM,IAAK,MAAA,EAAQ;AAC9B,IAAA,KAAA,MAAW,GAAA,IAAO,YAAA,CAAa,KAAK,CAAA,EAAG;AACrC,MAAA,MAAM,GAAA,GAAM,OAAO,GAAG,CAAA;AACtB,MAAA,UAAA,CAAW,IAAI,GAAG,CAAA;AAClB,MAAA,IAAI,CAAC,UAAA,CAAW,GAAA,CAAI,GAAG,CAAA,EAAG;AACxB,QAAA,MAAM,IAAI,kBAAA;AAAA,UACR,CAAA,OAAA,EAAU,KAAA,CAAM,EAAE,CAAA,uBAAA,EAA0B,GAAG,CAAA,4CAAA,EAChC,CAAC,GAAG,UAAU,CAAA,CAAE,IAAA,CAAK,IAAI,KAAK,MAAM,CAAA,EAAA;AAAA,SACrD;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,EAAA,KAAA,MAAW,MAAM,UAAA,EAAY;AAC3B,IAAA,IAAI,CAAC,UAAA,CAAW,GAAA,CAAI,EAAE,CAAA,EAAG;AACvB,MAAA,MAAM,IAAI,kBAAA;AAAA,QACR,CAAA,UAAA,EAAa,EAAE,CAAA,+DAAA,EACE,EAAE,CAAA,sCAAA;AAAA,OACrB;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,aAAa,KAAA,EAAuC;AAC3D,EAAA,OAAO,KAAA,CAAM,aAAa,EAAC;AAC7B;AAIA,SAAS,iBAAA,CAAkB,OAAkC,IAAA,EAAoB;AAC/E,EAAA,MAAM,IAAA,uBAAW,GAAA,EAAY;AAC7B,EAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,IAAA,IAAI,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,EAAE,CAAA,EAAG;AACrB,MAAA,MAAM,IAAI,kBAAA,CAAmB,CAAA,UAAA,EAAa,IAAI,CAAA,KAAA,EAAQ,IAAA,CAAK,EAAE,CAAA,gBAAA,CAAkB,CAAA;AAAA,IACjF;AACA,IAAA,IAAA,CAAK,GAAA,CAAI,KAAK,EAAE,CAAA;AAAA,EAClB;AACF;;;ACvTO,IAAM,YAAA,GAAN,cAA2B,KAAA,CAAM;AAAA,EACtC,YAAY,OAAA,EAAiB;AAC3B,IAAA,KAAA,CAAM,CAAA,eAAA,EAAkB,OAAO,CAAA,CAAE,CAAA;AACjC,IAAA,IAAA,CAAK,IAAA,GAAO,cAAA;AAAA,EACd;AACF;AC6CA,eAAe,cAAc,IAAA,EAAiC;AAC5D,EAAA,IAAI,OAAA;AACJ,EAAA,IAAI;AACF,IAAA,OAAA,GAAU,MAAM,OAAA,CAAQ,IAAA,EAAM,EAAE,aAAA,EAAe,MAAM,CAAA;AAAA,EACvD,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,EAAC;AAAA,EACV;AACA,EAAA,OAAO,OAAA,CACJ,MAAA,CAAO,CAAC,CAAA,KAAM,EAAE,WAAA,EAAa,CAAA,CAC7B,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,IAAI,EACjB,IAAA,EAAK;AACV;AAEA,SAAS,OAAO,GAAA,EAAsB;AACpC,EAAA,OAAO,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,OAAO,GAAG,CAAA;AACxD;AAEA,eAAe,aAAA,CAAc,IAAY,QAAA,EAAuC;AAC9E,EAAA,IAAI,MAAA;AACJ,EAAA,IAAI;AACF,IAAA,MAAA,GAAS,MAAM,QAAA,CAAS,QAAA,EAAU,MAAM,CAAA;AAAA,EAC1C,SAAS,GAAA,EAAK;AACZ,IAAA,MAAM,IAAI,YAAA,CAAa,CAAA,MAAA,EAAS,EAAE,CAAA,gBAAA,EAAmB,QAAQ,CAAA,GAAA,EAAM,MAAA,CAAO,GAAG,CAAC,CAAA,CAAE,CAAA;AAAA,EAClF;AACA,EAAA,IAAI;AACF,IAAA,OAAO,oBAAA,CAAqB,iBAAA,CAAkB,MAAM,CAAC,CAAA;AAAA,EACvD,SAAS,GAAA,EAAK;AACZ,IAAA,MAAM,IAAI,YAAA,CAAa,CAAA,MAAA,EAAS,EAAE,CAAA,MAAA,EAAS,QAAQ,CAAA,GAAA,EAAM,MAAA,CAAO,GAAG,CAAC,CAAA,CAAE,CAAA;AAAA,EACxE;AACF;AAMA,SAAS,oBAAoB,EAAA,EAAsD;AACjF,EAAA,MAAM,OAAO,EAAA,CAAG,IAAA;AAChB,EAAA,MAAM,GAAA,GAAM,MAAM,KAAA,EAAO,GAAA;AACzB,EAAA,OAAO,KAAA,CAAM,OAAA,CAAQ,GAAG,CAAA,GAAI,GAAA,CAAI,MAAA,CAAO,CAAC,CAAA,KAAmB,OAAO,CAAA,KAAM,QAAQ,CAAA,GAAI,EAAC;AACvF;AAYA,SAAS,0BAAA,CACP,QAAA,EACA,OAAA,EACA,WAAA,EAC2B;AAC3B,EAAA,IAAI,WAAA,CAAY,MAAA,KAAW,CAAA,EAAG,OAAO,OAAA;AACrC,EAAA,MAAM,UAAqC,EAAC;AAC5C,EAAA,KAAA,MAAW,CAAC,MAAA,EAAQ,EAAE,KAAK,MAAA,CAAO,OAAA,CAAQ,OAAO,CAAA,EAAG;AAClD,IAAA,OAAA,CAAQ,MAAM,CAAA,GAAI,OAAO,IAAA,KAAS;AAChC,MAAA,MAAM,WAAmC,EAAC;AAC1C,MAAA,KAAA,MAAW,QAAQ,WAAA,EAAa;AAC9B,QAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,GAAA,CAAI,IAAI,CAAA;AAC9B,QAAA,IAAI,CAAC,KAAA,EAAO;AACV,UAAA,MAAM,IAAI,KAAA;AAAA,YACR,CAAA,QAAA,EAAW,QAAQ,CAAA,4BAAA,EAA+B,IAAI,CAAA,2CAAA;AAAA,WACxD;AAAA,QACF;AACA,QAAA,QAAA,CAAS,IAAI,CAAA,GAAI,KAAA;AAAA,MACnB;AACA,MAAA,MAAM,YAAA,GAAgB,IAAA,CAAK,SAAA,CAAmD,OAAA,IAAW,EAAC;AAC1F,MAAA,OAAO,GAAG,EAAE,GAAG,IAAA,EAAM,SAAA,EAAW,EAAE,GAAG,IAAA,CAAK,SAAA,EAAW,OAAA,EAAS,EAAE,GAAG,QAAA,EAAU,GAAG,YAAA,EAAa,IAAK,CAAA;AAAA,IACpG,CAAA;AAAA,EACF;AACA,EAAA,OAAO,OAAA;AACT;AAYA,SAAS,aAAA,CAAc,OAAA,EAAiB,QAAA,EAAkB,GAAA,EAAsB;AAC9E,EAAA,MAAM,eAAA,GAAkB,QAAQ,OAAO,CAAA;AACvC,EAAA,IAAI,GAAA,KAAQ,QAAW,OAAO,eAAA;AAC9B,EAAA,IAAI,OAAO,GAAA,KAAQ,QAAA,IAAY,GAAA,CAAI,IAAA,OAAW,EAAA,EAAI;AAChD,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,QAAA,EAAW,QAAQ,CAAA,iDAAA,CAAmD,CAAA;AAAA,EACxF;AACA,EAAA,MAAM,QAAA,GAAWC,WAAW,GAAG,CAAA,GAAI,QAAQ,GAAG,CAAA,GAAI,OAAA,CAAQ,eAAA,EAAiB,GAAG,CAAA;AAC9E,EAAA,MAAM,GAAA,GAAMC,QAAAA,CAAS,eAAA,EAAiB,QAAQ,CAAA;AAC9C,EAAA,IAAI,GAAA,KAAQ,OAAO,GAAA,CAAI,UAAA,CAAW,IAAI,CAAA,IAAKD,UAAAA,CAAW,GAAG,CAAA,CAAA,EAAI;AAC3D,IAAA,MAAM,IAAI,KAAA;AAAA,MACR,WAAW,QAAQ,CAAA,uBAAA,EAA0B,GAAG,CAAA,eAAA,EAAkB,QAAQ,4BAA4B,eAAe,CAAA,EAAA;AAAA,KACvH;AAAA,EACF;AACA,EAAA,OAAO,QAAA;AACT;AAMA,SAAS,wBAAA,CAAyB,UAA0B,OAAA,EAA+B;AACzF,EAAA,MAAM,KAAK,QAAA,CAAS,WAAA;AACpB,EAAA,MAAM,WAAA,GAAc,oBAAoB,EAAE,CAAA;AAE1C,EAAA,IAAI,EAAA,CAAG,SAAS,KAAA,EAAO;AACrB,IAAA,MAAM,OAAA,GAAW,EAAA,CAAG,QAAA,EAAU,GAAA,IAAO,EAAC;AACtC,IAAA,IAAI,OAAO,QAAQ,GAAA,KAAQ,QAAA,IAAY,QAAQ,GAAA,CAAI,IAAA,OAAW,EAAA,EAAI;AAChE,MAAA,MAAM,IAAI,KAAA;AAAA,QACR;AAAA,OACF;AAAA,IACF;AACA,IAAA,MAAM,SAAS,eAAA,CAAgB;AAAA,MAC7B,GAAG,6BAA6B,QAAQ,CAAA;AAAA,MACxC,KAAK,OAAA,CAAQ,GAAA;AAAA,MACb,SAAS,OAAA,CAAQ,OAAA;AAAA,MACjB,QAAQ,OAAA,CAAQ,MAAA;AAAA,MAChB,KAAK,OAAA,CAAQ,GAAA;AAAA,MACb,SAAS,OAAA,CAAQ,OAAA;AAAA,MACjB,KAAK,aAAA,CAAc,OAAA,EAAS,EAAA,CAAG,EAAA,EAAI,QAAQ,GAAG;AAAA,KAC/C,CAAA;AACD,IAAA,OAAO,EAAE,GAAG,MAAA,EAAQ,OAAA,EAAS,0BAAA,CAA2B,GAAG,EAAA,EAAI,MAAA,CAAO,OAAA,EAAS,WAAW,CAAA,EAAE;AAAA,EAC9F;AAEA,EAAA,IAAI,EAAA,CAAG,SAAS,MAAA,EAAQ;AACtB,IAAA,MAAM,QAAA,GAAY,EAAA,CAAG,QAAA,EAAU,IAAA,IAAQ,EAAC;AACxC,IAAA,IAAI,OAAO,SAAS,OAAA,KAAY,QAAA,IAAY,SAAS,OAAA,CAAQ,IAAA,OAAW,EAAA,EAAI;AAC1E,MAAA,MAAM,IAAI,MAAM,qFAAqF,CAAA;AAAA,IACvG;AACA,IAAA,MAAM,SAAS,gBAAA,CAAiB;AAAA,MAC9B,GAAG,6BAA6B,QAAQ,CAAA;AAAA,MACxC,SAAS,QAAA,CAAS,OAAA;AAAA,MAClB,gBAAgB,QAAA,CAAS,cAAA;AAAA,MACzB,eAAe,QAAA,CAAS,aAAA;AAAA,MACxB,WAAW,QAAA,CAAS;AAAA,KACrB,CAAA;AACD,IAAA,OAAO,EAAE,GAAG,MAAA,EAAQ,OAAA,EAAS,0BAAA,CAA2B,GAAG,EAAA,EAAI,MAAA,CAAO,OAAA,EAAS,WAAW,CAAA,EAAE;AAAA,EAC9F;AAMA,EAAA,MAAM,UAAqC,EAAC;AAC5C,EAAA,KAAA,MAAW,KAAA,IAAS,GAAG,UAAA,EAAY;AACjC,IAAA,MAAM,MAAA,GAAS,eAAA,CAAgB,KAAA,CAAM,IAAI,CAAA;AACzC,IAAA,OAAA,CAAQ,MAAM,IAAI,YAAY;AAC5B,MAAA,MAAM,IAAI,KAAA;AAAA,QACR,CAAA,QAAA,EAAW,EAAA,CAAG,EAAE,CAAA,SAAA,EAAY,GAAG,IAAI,CAAA,8EAAA;AAAA,OACrC;AAAA,IACF,CAAA;AAAA,EACF;AACA,EAAA,OAAO,kBAAA,CAAmB,EAAE,QAAA,EAAU,OAAA,EAAS,CAAA;AACjD;AAEA,eAAe,eAAA,CAAgB,EAAA,EAAY,UAAA,EAAoB,OAAA,EAAwC;AACrG,EAAA,IAAI,MAAA;AACJ,EAAA,IAAI;AACF,IAAA,MAAA,GAAS,MAAM,QAAA,CAAS,UAAA,EAAY,MAAM,CAAA;AAAA,EAC5C,SAAS,GAAA,EAAK;AACZ,IAAA,MAAM,IAAI,YAAA,CAAa,CAAA,QAAA,EAAW,EAAE,CAAA,gBAAA,EAAmB,UAAU,CAAA,GAAA,EAAM,MAAA,CAAO,GAAG,CAAC,CAAA,CAAE,CAAA;AAAA,EACtF;AACA,EAAA,IAAI;AACF,IAAA,OAAO,wBAAA,CAAyB,mBAAA,CAAoB,MAAM,CAAA,EAAG,OAAO,CAAA;AAAA,EACtE,SAAS,GAAA,EAAK;AACZ,IAAA,MAAM,IAAI,YAAA,CAAa,CAAA,QAAA,EAAW,EAAE,CAAA,MAAA,EAAS,UAAU,CAAA,GAAA,EAAM,MAAA,CAAO,GAAG,CAAC,CAAA,CAAE,CAAA;AAAA,EAC5E;AACF;AAUA,eAAsB,oBACpB,GAAA,EAC2D;AAC3D,EAAA,MAAM,QAAA,GAAWE,IAAAA,CAAK,GAAA,EAAK,aAAA,EAAe,OAAO,CAAA;AACjD,EAAA,MAAM,UAAA,GAAaA,IAAAA,CAAK,GAAA,EAAK,aAAA,EAAe,SAAS,CAAA;AAErD,EAAA,MAAM,QAAsB,EAAC;AAC7B,EAAA,KAAA,MAAW,EAAA,IAAM,MAAM,aAAA,CAAc,QAAQ,CAAA,EAAG;AAC9C,IAAA,KAAA,CAAM,IAAA,CAAK,MAAM,aAAA,CAAc,EAAA,EAAIA,KAAK,QAAA,EAAU,EAAA,EAAI,SAAS,CAAC,CAAC,CAAA;AAAA,EACnE;AAEA,EAAA,MAAM,UAA0B,EAAC;AACjC,EAAA,KAAA,MAAW,EAAA,IAAM,MAAM,aAAA,CAAc,UAAU,CAAA,EAAG;AAChD,IAAA,OAAA,CAAQ,IAAA,CAAK,MAAM,eAAA,CAAgB,EAAA,EAAIA,IAAAA,CAAK,YAAY,EAAA,EAAI,WAAW,CAAA,EAAG,GAAG,CAAC,CAAA;AAAA,EAChF;AAEA,EAAA,OAAO,EAAE,OAAO,OAAA,EAAQ;AAC1B;;;ACjJA,SAAS,UAAA,CAAW,KAAa,IAAA,EAAsB;AACrD,EAAA,OAAOF,WAAW,IAAI,CAAA,GAAI,IAAA,GAAOE,IAAAA,CAAK,KAAK,IAAI,CAAA;AACjD;AAgBA,eAAsB,iBAAiB,MAAA,EAA6C;AAClF,EAAA,MAAM,SAAA,GAAYA,IAAAA,CAAK,MAAA,EAAQ,aAAA,EAAe,QAAQ,CAAA;AACtD,EAAA,IAAI,MAAA;AACJ,EAAA,IAAI;AACF,IAAA,MAAA,GAAS,MAAMC,QAAAA,CAAS,SAAA,EAAW,MAAM,CAAA;AAAA,EAC3C,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,MAAA;AAAA,EACT;AACA,EAAA,MAAM,IAAA,GAAOJ,OAAAA,CAAO,MAAM,CAAA,CAAE,IAAA;AAC5B,EAAA,MAAM,KAAK,IAAA,CAAK,EAAA;AAChB,EAAA,IAAI,EAAA,KAAO,QAAW,OAAO,MAAA;AAC7B,EAAA,IAAI,OAAO,OAAO,QAAA,IAAY,EAAA,KAAO,QAAQ,KAAA,CAAM,OAAA,CAAQ,EAAE,CAAA,EAAG;AAC9D,IAAA,MAAM,IAAI,YAAA,CAAa,CAAA,CAAA,EAAI,SAAS,CAAA,sCAAA,CAAwC,CAAA;AAAA,EAC9E;AACA,EAAA,MAAM,OAAQ,EAAA,CAA+B,IAAA;AAC7C,EAAA,IAAI,OAAO,IAAA,KAAS,QAAA,IAAY,IAAA,CAAK,IAAA,OAAW,EAAA,EAAI;AAClD,IAAA,MAAM,IAAI,YAAA;AAAA,MACR,IAAI,SAAS,CAAA,oDAAA;AAAA,KACf;AAAA,EACF;AACA,EAAA,OAAO,OAAA,CAAQ,UAAA,CAAW,MAAA,EAAQ,IAAI,CAAC,CAAA;AACzC;AAQA,SAAS,uBAAA,CAAwB,KAAc,SAAA,EAAiD;AAC9F,EAAA,IAAI,GAAA,KAAQ,QAAW,OAAO,MAAA;AAC9B,EAAA,IAAI,OAAO,QAAQ,QAAA,IAAY,GAAA,KAAQ,QAAQ,KAAA,CAAM,OAAA,CAAQ,GAAG,CAAA,EAAG;AACjE,IAAA,MAAM,IAAI,YAAA,CAAa,CAAA,CAAA,EAAI,SAAS,CAAA,4CAAA,CAA8C,CAAA;AAAA,EACpF;AACA,EAAA,MAAM,UAAW,GAAA,CAAgC,OAAA;AACjD,EAAA,IAAI,OAAO,OAAA,KAAY,QAAA,IAAY,OAAA,CAAQ,IAAA,OAAW,EAAA,EAAI;AACxD,IAAA,MAAM,IAAI,YAAA,CAAa,CAAA,CAAA,EAAI,SAAS,CAAA,6DAAA,CAA+D,CAAA;AAAA,EACrG;AACA,EAAA,MAAM,MAAO,GAAA,CAAgC,GAAA;AAC7C,EAAA,IAAI,GAAA,KAAQ,WAAc,OAAO,GAAA,KAAQ,YAAY,GAAA,CAAI,IAAA,OAAW,EAAA,CAAA,EAAK;AACvE,IAAA,MAAM,IAAI,YAAA,CAAa,CAAA,CAAA,EAAI,SAAS,CAAA,yDAAA,CAA2D,CAAA;AAAA,EACjG;AACA,EAAA,MAAM,UAAW,GAAA,CAAgC,OAAA;AACjD,EAAA,IACE,YAAY,MAAA,KACX,CAAC,MAAM,OAAA,CAAQ,OAAO,KAAK,CAAC,OAAA,CAAQ,KAAA,CAAM,CAAA,CAAA,KAAK,OAAO,CAAA,KAAM,QAAA,IAAY,EAAE,IAAA,EAAK,KAAM,EAAE,CAAA,CAAA,EACxF;AACA,IAAA,MAAM,IAAI,YAAA;AAAA,MACR,IAAI,SAAS,CAAA,wEAAA;AAAA,KACf;AAAA,EACF;AACA,EAAA,OAAO;AAAA,IACL,OAAA;AAAA,IACA,GAAI,GAAA,KAAQ,MAAA,GAAY,EAAE,GAAA,KAAuB,EAAC;AAAA,IAClD,GAAI,OAAA,KAAY,MAAA,GAAY,EAAE,OAAA,KAAiC;AAAC,GAClE;AACF;AAkBA,eAAsB,UAAU,MAAA,EAAgD;AAC9E,EAAA,MAAM,SAAA,GAAYG,IAAAA,CAAK,MAAA,EAAQ,aAAA,EAAe,QAAQ,CAAA;AACtD,EAAA,IAAI,MAAA;AACJ,EAAA,IAAI;AACF,IAAA,MAAA,GAAS,MAAMC,QAAAA,CAAS,SAAA,EAAW,MAAM,CAAA;AAAA,EAC3C,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,MAAA;AAAA,EACT;AACA,EAAA,MAAM,IAAA,GAAOJ,OAAAA,CAAO,MAAM,CAAA,CAAE,IAAA;AAC5B,EAAA,MAAM,KAAK,IAAA,CAAK,EAAA;AAChB,EAAA,IAAI,EAAA,KAAO,QAAW,OAAO,MAAA;AAC7B,EAAA,IAAI,OAAO,OAAO,QAAA,IAAY,EAAA,KAAO,QAAQ,KAAA,CAAM,OAAA,CAAQ,EAAE,CAAA,EAAG;AAC9D,IAAA,MAAM,IAAI,YAAA,CAAa,CAAA,CAAA,EAAI,SAAS,CAAA,sCAAA,CAAwC,CAAA;AAAA,EAC9E;AACA,EAAA,MAAM,OAAQ,EAAA,CAA+B,IAAA;AAC7C,EAAA,IAAI,OAAO,IAAA,KAAS,QAAA,IAAY,IAAA,CAAK,IAAA,OAAW,EAAA,EAAI;AAClD,IAAA,MAAM,IAAI,YAAA;AAAA,MACR,IAAI,SAAS,CAAA,oDAAA;AAAA,KACf;AAAA,EACF;AACA,EAAA,MAAM,KAAA,GAAQ,uBAAA,CAAyB,EAAA,CAA+B,KAAA,EAAO,SAAS,CAAA;AACtF,EAAA,OAAO,EAAE,IAAA,EAAM,UAAA,CAAW,MAAA,EAAQ,IAAI,CAAA,EAAG,GAAI,KAAA,GAAQ,EAAE,KAAA,EAAM,GAAI,EAAC,EAAG;AACvE;AAEA,SAAS,WAAW,CAAA,EAA2B;AAC7C,EAAA,OACE,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAA,IACf,CAAA,CAAE,KAAA;AAAA,IACA,CAAC,CAAA,KACC,OAAO,CAAA,KAAM,QAAA,IACb,CAAA,KAAM,IAAA,IACN,OAAQ,CAAA,CAAuB,EAAA,KAAO,QAAA,IACtC,OAAQ,EAAyB,IAAA,KAAS;AAAA,GAC9C;AAEJ;AAGA,SAAS,mBAAA,CAAoB,MAA+B,OAAA,EAAiC;AAC3F,EAAA,IAAI,IAAA,CAAK,WAAW,QAAA,EAAU;AAC5B,IAAA,MAAM,IAAI,YAAA;AAAA,MACR,IAAI,OAAO,CAAA,8CAAA,EAAiD,KAAK,SAAA,CAAU,IAAA,CAAK,MAAM,CAAC,CAAA,CAAA;AAAA,KACzF;AAAA,EACF;AACA,EAAA,IAAI,CAAC,UAAA,CAAW,IAAA,CAAK,MAAM,CAAA,EAAG;AAC5B,IAAA,MAAM,IAAI,YAAA,CAAa,CAAA,CAAA,EAAI,OAAO,CAAA,yDAAA,CAA2D,CAAA;AAAA,EAC/F;AACA,EAAA,IAAI,CAAC,UAAA,CAAW,IAAA,CAAK,SAAS,CAAA,EAAG;AAC/B,IAAA,MAAM,IAAI,YAAA;AAAA,MACR,IAAI,OAAO,CAAA,4DAAA;AAAA,KACb;AAAA,EACF;AACA,EAAA,IAAI,IAAA,CAAK,aAAa,MAAA,EAAW;AAC/B,IAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,IAAA,CAAK,QAAQ,CAAA,IAAK,CAAC,IAAA,CAAK,QAAA,CAAS,MAAM,CAAC,CAAA,KAAM,OAAO,CAAA,KAAM,QAAQ,CAAA,EAAG;AACvF,MAAA,MAAM,IAAI,YAAA,CAAa,CAAA,CAAA,EAAI,OAAO,CAAA,sDAAA,CAAwD,CAAA;AAAA,IAC5F;AAAA,EACF;AACA,EAAA,IAAI,IAAA,CAAK,SAAS,MAAA,EAAW;AAC3B,IAAA,MAAM,IAAI,IAAA,CAAK,IAAA;AACf,IAAA,IACE,OAAO,CAAA,KAAM,QAAA,IACb,CAAA,KAAM,IAAA,IACL,EAAE,GAAA,KAAQ,MAAA,KAAc,OAAO,CAAA,CAAE,QAAQ,QAAA,IAAY,CAAA,CAAE,GAAA,CAAI,IAAA,OAAW,EAAA,CAAA,EACvE;AACA,MAAA,MAAM,IAAI,YAAA;AAAA,QACR,IAAI,OAAO,CAAA,mFAAA;AAAA,OACb;AAAA,IACF;AAAA,EACF;AACA,EAAA,IAAI,IAAA,CAAK,sBAAsB,MAAA,EAAW;AACxC,IAAA,IACE,CAAC,KAAA,CAAM,OAAA,CAAQ,KAAK,iBAAiB,CAAA,IACrC,CAAC,IAAA,CAAK,iBAAA,CAAkB,MAAM,CAAC,CAAA,KAAM,OAAO,CAAA,KAAM,QAAA,IAAY,EAAE,IAAA,EAAK,KAAM,EAAE,CAAA,EAC7E;AACA,MAAA,MAAM,IAAI,YAAA;AAAA,QACR,IAAI,OAAO,CAAA,yEAAA;AAAA,OACb;AAAA,IACF;AAAA,EACF;AACA,EAAA,IAAI,IAAA,CAAK,QAAA,KAAa,MAAA,KAAc,OAAO,IAAA,CAAK,QAAA,KAAa,QAAA,IAAY,IAAA,CAAK,QAAA,CAAS,IAAA,EAAK,KAAM,EAAA,CAAA,EAAK;AACrG,IAAA,MAAM,IAAI,YAAA,CAAa,CAAA,CAAA,EAAI,OAAO,CAAA,qDAAA,CAAuD,CAAA;AAAA,EAC3F;AACA,EAAA,OAAO,IAAA;AACT;AAEA,eAAe,cAAA,CAAe,KAAa,GAAA,EAAkC;AAC3E,EAAA,MAAM,SAAA,GAAY,UAAA,CAAW,GAAA,EAAK,GAAA,CAAI,IAAI,CAAA;AAC1C,EAAA,IAAI,MAAA;AACJ,EAAA,IAAI;AACF,IAAA,MAAA,GAAS,MAAMI,QAAAA,CAAS,SAAA,EAAW,MAAM,CAAA;AAAA,EAC3C,SAAS,GAAA,EAAK;AACZ,IAAA,MAAM,IAAI,YAAA;AAAA,MACR,CAAA,OAAA,EAAU,GAAA,CAAI,EAAE,CAAA,gBAAA,EAAmB,SAAS,CAAA,GAAA,EAAM,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,MAAA,CAAO,GAAG,CAAC,CAAA;AAAA,KACpG;AAAA,EACF;AACA,EAAA,IAAI,IAAA;AACJ,EAAA,IAAI,QAAA;AACJ,EAAA,IAAI;AACF,IAAA,QAAA,GAAW,mBAAmB,MAAM,CAAA;AACpC,IAAA,IAAA,GAAO,QAAA,CAAS,KAAK,IAAA,EAAK;AAAA,EAC5B,SAAS,GAAA,EAAK;AACZ,IAAA,MAAM,IAAI,YAAA;AAAA,MACR,CAAA,OAAA,EAAU,GAAA,CAAI,EAAE,CAAA,MAAA,EAAS,SAAS,CAAA,GAAA,EAAM,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,MAAA,CAAO,GAAG,CAAC,CAAA;AAAA,KAC1F;AAAA,EACF;AACA,EAAA,OAAO,EAAE,KAAA,EAAO,iBAAA,CAAkB,QAAQ,CAAA,EAAG,GAAI,IAAA,GAAO,EAAE,IAAA,EAAK,GAAI,EAAC,EAAG;AACzE;AAEA,eAAe,eAAA,CAAgB,KAAa,GAAA,EAAa;AACvD,EAAA,MAAM,MAAA,GAAS,UAAA,CAAW,GAAA,EAAK,GAAA,CAAI,IAAI,CAAA;AACvC,EAAA,IAAI;AACF,IAAA,OAAO,MAAM,mBAAmB,MAAM,CAAA;AAAA,EACxC,SAAS,GAAA,EAAK;AACZ,IAAA,MAAM,IAAI,YAAA;AAAA,MACR,CAAA,UAAA,EAAa,GAAA,CAAI,EAAE,CAAA,MAAA,EAAS,MAAM,CAAA,GAAA,EAAM,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,MAAA,CAAO,GAAG,CAAC,CAAA;AAAA,KAC1F;AAAA,EACF;AACF;AAUA,eAAsB,cAAc,GAAA,EAAiC;AACnE,EAAA,MAAM,OAAA,GAAUD,IAAAA,CAAK,GAAA,EAAK,aAAA,EAAe,QAAQ,CAAA;AACjD,EAAA,IAAI,MAAA;AACJ,EAAA,IAAI;AACF,IAAA,MAAA,GAAS,MAAMC,QAAAA,CAAS,OAAA,EAAS,MAAM,CAAA;AAAA,EACzC,SAAS,GAAA,EAAK;AACZ,IAAA,MAAM,IAAI,YAAA;AAAA,MACR,CAAA,aAAA,EAAgB,OAAO,CAAA,GAAA,EAAM,GAAA,YAAe,QAAQ,GAAA,CAAI,OAAA,GAAU,MAAA,CAAO,GAAG,CAAC,CAAA;AAAA,KAC/E;AAAA,EACF;AAEA,EAAA,MAAM,MAAA,GAASJ,QAAO,MAAM,CAAA;AAC5B,EAAA,MAAM,EAAA,GAAK,mBAAA,CAAoB,MAAA,CAAO,IAAA,EAAM,OAAO,CAAA;AAEnD,EAAA,MAAM,SAAuB,EAAC;AAC9B,EAAA,KAAA,MAAW,GAAA,IAAO,GAAG,MAAA,EAAQ;AAC3B,IAAA,MAAA,CAAO,IAAA,CAAK,MAAM,cAAA,CAAe,GAAA,EAAK,GAAG,CAAC,CAAA;AAAA,EAC5C;AAEA,EAAA,MAAM,YAAY,EAAC;AACnB,EAAA,KAAA,MAAW,GAAA,IAAO,GAAG,SAAA,EAAW;AAC9B,IAAA,SAAA,CAAU,IAAA,CAAK,MAAM,eAAA,CAAgB,GAAA,EAAK,GAAG,CAAC,CAAA;AAAA,EAChD;AASA,EAAA,MAAM,EAAE,KAAA,EAAO,OAAA,EAAQ,GAAI,MAAM,oBAAoB,GAAG,CAAA;AAExD,EAAA,IAAI,SAAA;AACJ,EAAA,IAAI,GAAG,SAAA,EAAW;AAChB,IAAA,MAAM,aAAA,GAAgBG,IAAAA,CAAK,GAAA,EAAK,cAAc,CAAA;AAC9C,IAAA,IAAI,eAAA;AACJ,IAAA,IAAI;AACF,MAAA,eAAA,GAAkB,MAAMC,QAAAA,CAAS,aAAA,EAAe,MAAM,CAAA;AAAA,IACxD,SAAS,GAAA,EAAK;AACZ,MAAA,MAAM,IAAI,YAAA;AAAA,QACR,CAAA,WAAA,EAAc,EAAA,CAAG,SAAS,CAAA,gBAAA,EAAmB,aAAa,CAAA,GAAA,EAAM,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,MAAA,CAAO,GAAG,CAAC,CAAA;AAAA,OAClH;AAAA,IACF;AACA,IAAA,IAAI;AACF,MAAA,SAAA,GAAY,qBAAA,CAAsB,sBAAA,CAAuB,eAAe,CAAC,CAAA;AAAA,IAC3E,SAAS,GAAA,EAAK;AACZ,MAAA,MAAM,IAAI,YAAA;AAAA,QACR,CAAA,WAAA,EAAc,EAAA,CAAG,SAAS,CAAA,MAAA,EAAS,aAAa,CAAA,GAAA,EAAM,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,MAAA,CAAO,GAAG,CAAC,CAAA;AAAA,OACxG;AAAA,IACF;AAAA,EACF;AAEA,EAAA,IAAI,EAAA;AACJ,EAAA,IAAI,GAAG,EAAA,EAAI;AACT,IAAA,MAAM,MAAA,GAAS,UAAA,CAAW,GAAA,EAAK,EAAA,CAAG,GAAG,IAAI,CAAA;AACzC,IAAA,IAAI,IAAA;AACJ,IAAA,IAAI;AACF,MAAA,IAAA,GAAO,MAAMA,QAAAA,CAAS,MAAA,EAAQ,MAAM,CAAA;AAAA,IACtC,SAAS,GAAA,EAAK;AACZ,MAAA,MAAM,IAAI,YAAA;AAAA,QACR,CAAA,iBAAA,EAAoB,MAAM,CAAA,GAAA,EAAM,GAAA,YAAe,QAAQ,GAAA,CAAI,OAAA,GAAU,MAAA,CAAO,GAAG,CAAC,CAAA;AAAA,OAClF;AAAA,IACF;AACA,IAAA,MAAM,KAAA,GAAQ,uBAAA,CAAwB,EAAA,CAAG,EAAA,CAAG,OAAO,OAAO,CAAA;AAC1D,IAAA,EAAA,GAAK;AAAA,MACH,IAAA;AAAA,MACA,GAAI,EAAA,CAAG,EAAA,CAAG,KAAA,KAAU,MAAA,GAAY,EAAE,KAAA,EAAO,EAAA,CAAG,EAAA,CAAG,KAAA,EAAM,GAAI,EAAC;AAAA,MAC1D,GAAI,EAAA,CAAG,EAAA,CAAG,WAAA,KAAgB,MAAA,GAAY,EAAE,WAAA,EAAa,EAAA,CAAG,EAAA,CAAG,WAAA,EAAY,GAAI,EAAC;AAAA,MAC5E,GAAI,EAAA,CAAG,EAAA,CAAG,KAAA,KAAU,MAAA,GAAY,EAAE,KAAA,EAAO,EAAA,CAAG,EAAA,CAAG,KAAA,EAAM,GAAI,EAAC;AAAA,MAC1D,GAAI,EAAA,CAAG,EAAA,CAAG,IAAA,KAAS,MAAA,GAAY,EAAE,IAAA,EAAM,EAAA,CAAG,EAAA,CAAG,IAAA,EAAK,GAAI,EAAC;AAAA,MACvD,GAAI,EAAA,CAAG,EAAA,CAAG,GAAA,KAAQ,MAAA,GAAY,EAAE,GAAA,EAAK,EAAA,CAAG,EAAA,CAAG,GAAA,EAAI,GAAI,EAAC;AAAA,MACpD,GAAI,KAAA,KAAU,MAAA,GAAY,EAAE,KAAA,KAAU;AAAC,KACzC;AAAA,EACF;AAEA,EAAA,OAAO,SAAA,CAAU;AAAA,IACf,MAAA;AAAA,IACA,SAAA;AAAA,IACA,KAAA;AAAA,IACA,OAAA;AAAA,IACA,GAAI,SAAA,GAAY,EAAE,SAAA,KAAc,EAAC;AAAA,IACjC,GAAI,GAAG,EAAA,KAAO,MAAA,GAAY,EAAE,EAAA,EAAI,EAAA,CAAG,EAAA,EAAG,GAAI,EAAC;AAAA,IAC3C,GAAI,GAAG,IAAA,KAAS,MAAA,GAAY,EAAE,IAAA,EAAM,EAAA,CAAG,IAAA,EAAK,GAAI,EAAC;AAAA,IACjD,GAAI,GAAG,OAAA,KAAY,MAAA,GAAY,EAAE,OAAA,EAAS,EAAA,CAAG,OAAA,EAAQ,GAAI,EAAC;AAAA,IAC1D,GAAI,GAAG,WAAA,KAAgB,MAAA,GAAY,EAAE,WAAA,EAAa,EAAA,CAAG,WAAA,EAAY,GAAI,EAAC;AAAA,IACtE,GAAI,GAAG,QAAA,KAAa,MAAA,GAAY,EAAE,QAAA,EAAU,EAAA,CAAG,QAAA,EAAS,GAAI,EAAC;AAAA,IAC7D,GAAI,EAAA,KAAO,MAAA,GAAY,EAAE,EAAA,KAAO,EAAC;AAAA,IACjC,GAAI,EAAA,CAAG,QAAA,KAAa,SAChB,EAAE,QAAA,EAAU,EAAE,IAAA,EAAM,UAAA,CAAW,KAAK,EAAA,CAAG,QAAA,CAAS,IAAI,CAAA,EAAG,GAAI,GAAG,QAAA,CAAS,KAAA,KAAU,SAAY,EAAE,KAAA,EAAO,EAAA,CAAG,QAAA,CAAS,OAAM,GAAI,IAAK,GAAI,EAAA,CAAG,SAAS,WAAA,KAAgB,MAAA,GAAY,EAAE,WAAA,EAAa,EAAA,CAAG,SAAS,WAAA,EAAY,GAAI,EAAC,EAAG,KAC5N,EAAC;AAAA,IACL,GAAI,EAAA,CAAG,KAAA,KAAU,SACb,EAAE,KAAA,EAAO,EAAE,IAAA,EAAM,UAAA,CAAW,KAAK,EAAA,CAAG,KAAA,CAAM,IAAI,CAAA,EAAG,GAAI,GAAG,KAAA,CAAM,KAAA,KAAU,SAAY,EAAE,KAAA,EAAO,EAAA,CAAG,KAAA,CAAM,OAAM,GAAI,IAAK,GAAI,EAAA,CAAG,MAAM,WAAA,KAAgB,MAAA,GAAY,EAAE,WAAA,EAAa,EAAA,CAAG,MAAM,WAAA,EAAY,GAAI,EAAC,EAAG,KAC1M,EAAC;AAAA,IACL,GAAI,GAAG,SAAA,KAAc,MAAA,GAAY,EAAE,SAAA,EAAW,EAAA,CAAG,SAAA,EAAU,GAAI,EAAC;AAAA,IAChE,GAAI,GAAG,GAAA,KAAQ,MAAA,GAAY,EAAE,GAAA,EAAK,EAAA,CAAG,GAAA,EAAI,GAAI,EAAC;AAAA,IAC9C,GAAI,GAAG,IAAA,KAAS,MAAA,GAAY,EAAE,IAAA,EAAM,EAAA,CAAG,IAAA,EAAK,GAAI,EAAC;AAAA,IACjD,GAAI,GAAG,iBAAA,KAAsB,MAAA,GAAY,EAAE,iBAAA,EAAmB,EAAA,CAAG,iBAAA,EAAkB,GAAI,EAAC;AAAA,IACxF,GAAI,GAAG,QAAA,KAAa,MAAA,GAAY,EAAE,QAAA,EAAU,EAAA,CAAG,QAAA,EAAS,GAAI;AAAC,GAC9D,CAAA;AACH","file":"index.mjs","sourcesContent":["/**\n * Ref-key extraction, shared with the same convention `buildMastraAgent`\n * uses (`packages/mastra/src/build-agent.ts` `refKey`). An AIP-27 ref is\n * a string shorthand or `{ ref | file | inline }`; the key is the string,\n * else `.ref`, else `.file`, else a stable JSON of the inline payload.\n */\n\nimport type { AnyRef } from \"@agentproto/agent\"\n\nexport function refKey(ref: AnyRef): string {\n if (typeof ref === \"string\") return ref\n return ref.ref ?? ref.file ?? JSON.stringify(ref.inline ?? ref)\n}\n\n/** `@agentik/writer` → `writer`; bare ids untouched. */\nexport function stripOwner(id: string): string {\n const m = id.match(/^@[^/]+\\/(.+)$/)\n return m ? m[1]! : id\n}\n","/**\n * `emitApp(app, dir)` — write an app's agents + workflows to disk under an\n * agentproto-owned base, so the manifests don't squat the shared root\n * `.agents/` convention:\n *\n * <dir>/WORKSPACE.md (when the app has a\n * workspace — AIP-34 root\n * manifest; owner = tenant)\n * <dir>/.agentproto/agents/<id>/AGENT.md (one per agent)\n * <dir>/.agentproto/workflows/<wf.id>/WORKFLOW.md (shared — a workflow may\n * be run by several agents)\n * <dir>/.agentproto/APP.md (root index — always\n * written, so a future\n * `app_install` can\n * discover the bundle)\n *\n * The \"tenant\" isn't a `tenants/<t>/…` path segment — it's the `owner` of\n * the AIP-34 WORKSPACE.md (guild / user / org), and local storage is its\n * AIP-35 `storage` block. So there is no bespoke tenant folder to invent.\n *\n * All manifests are plain markdown: frontmatter = the validated handle (or,\n * for APP.md, the identity + a manifest of `{ id, path }` refs to every\n * agent/workflow it bundles), body = the agent's `body` (its system prompt),\n * the workflow description, or the app description. Because a\n * `defineWorkflow` handle is pure data, the WORKFLOW.md needs no `entry:`\n * module — the manifest *is* the workflow, so `loadWorkflowHandle` returns\n * it directly with nothing to reconcile against.\n *\n * `emitApp` stays dependency-light on purpose (no Mastra import) — that\n * split lets a host write/discover an app without paying for the Mastra\n * build path.\n */\n\nimport { copyFile, cp, mkdir, writeFile } from \"node:fs/promises\"\nimport { join, relative } from \"node:path\"\nimport matter from \"gray-matter\"\nimport type { WorkflowHandle } from \"@agentproto/workflow\"\nimport type { WorkspaceHandle } from \"@agentproto/workspace\"\nimport type { AgentEntry, AppArtifactDecl, AppArtifactSurface, AppDataDefinition, AppDevDefinition, AppSkillSurface, AppUiDefinition, EmittedApp } from \"./types.js\"\nimport { stripOwner } from \"./refs.js\"\n\ninterface EmitInput {\n readonly agents: readonly AgentEntry[]\n readonly workflows: readonly WorkflowHandle[]\n readonly workspace?: WorkspaceHandle\n readonly id?: string\n readonly name?: string\n readonly version?: string\n readonly description?: string\n readonly requires?: readonly string[]\n readonly ui?: AppUiDefinition\n readonly artifact?: AppArtifactSurface\n readonly skill?: AppSkillSurface\n readonly artifacts?: readonly AppArtifactDecl[]\n readonly dev?: AppDevDefinition\n readonly data?: AppDataDefinition\n readonly externalReadRoots?: readonly string[]\n readonly category?: string\n}\n\nexport async function emitApp(app: EmitInput, dir: string): Promise<EmittedApp> {\n let workspacePath: string | undefined\n if (app.workspace) {\n await mkdir(dir, { recursive: true })\n workspacePath = join(dir, \"WORKSPACE.md\")\n await writeFile(\n workspacePath,\n toManifest(app.workspace, app.workspace.description ?? app.workspace.name),\n \"utf8\",\n )\n }\n\n const agentPaths: Record<string, string> = {}\n for (const { agent, body } of app.agents) {\n const agentDir = join(dir, \".agentproto\", \"agents\", stripOwner(agent.id))\n await mkdir(agentDir, { recursive: true })\n const agentPath = join(agentDir, \"AGENT.md\")\n await writeFile(agentPath, toManifest(agent, body ?? \"\"), \"utf8\")\n agentPaths[agent.id] = agentPath\n }\n\n let uiPath: string | undefined\n let uiFrontmatter: Record<string, unknown> | undefined\n if (app.ui) {\n const uiDir = join(dir, \".agentproto\", \"ui\")\n await mkdir(uiDir, { recursive: true })\n uiPath = join(uiDir, \"index.html\")\n await writeFile(uiPath, app.ui.html, \"utf8\")\n uiFrontmatter = {\n path: relative(dir, uiPath),\n ...(app.ui.title !== undefined ? { title: app.ui.title } : {}),\n ...(app.ui.description !== undefined ? { description: app.ui.description } : {}),\n ...(app.ui.tools !== undefined ? { tools: app.ui.tools } : {}),\n ...(app.ui.port !== undefined ? { port: app.ui.port } : {}),\n ...(app.ui.csp !== undefined ? { csp: app.ui.csp } : {}),\n ...(app.ui.build !== undefined ? { build: app.ui.build } : {}),\n }\n }\n\n let artifactPath: string | undefined\n let artifactFrontmatter: Record<string, unknown> | undefined\n if (app.artifact) {\n const artifactDir = join(dir, \".agentproto\", \"artifact\")\n await mkdir(artifactDir, { recursive: true })\n artifactPath = join(artifactDir, \"index.html\")\n await copyFile(app.artifact.path, artifactPath)\n artifactFrontmatter = {\n path: relative(dir, artifactPath),\n ...(app.artifact.title !== undefined ? { title: app.artifact.title } : {}),\n ...(app.artifact.description !== undefined ? { description: app.artifact.description } : {}),\n }\n }\n\n let skillPath: string | undefined\n let skillFrontmatter: Record<string, unknown> | undefined\n if (app.skill) {\n skillPath = join(dir, \".agentproto\", \"skill\")\n await mkdir(skillPath, { recursive: true })\n await cp(app.skill.path, skillPath, { recursive: true })\n skillFrontmatter = {\n path: relative(dir, skillPath),\n ...(app.skill.title !== undefined ? { title: app.skill.title } : {}),\n ...(app.skill.description !== undefined ? { description: app.skill.description } : {}),\n }\n }\n\n const workflowPaths: string[] = []\n const workflowRefs: { id: string; path: string }[] = []\n for (const wf of app.workflows) {\n const wfDir = join(dir, \".agentproto\", \"workflows\", wf.id)\n await mkdir(wfDir, { recursive: true })\n const wfPath = join(wfDir, \"WORKFLOW.md\")\n await writeFile(wfPath, toManifest(wf, wf.description ?? \"\"), \"utf8\")\n workflowPaths.push(wfPath)\n workflowRefs.push({ id: wf.id, path: relative(dir, wfPath) })\n }\n\n await mkdir(join(dir, \".agentproto\"), { recursive: true })\n const appPath = join(dir, \".agentproto\", \"APP.md\")\n const agentRefs = app.agents.map(({ agent }) => ({\n id: agent.id,\n path: relative(dir, agentPaths[agent.id]!),\n }))\n const appFrontmatter: Record<string, unknown> = {\n schema: \"app/v1\",\n ...(app.id !== undefined ? { id: app.id } : {}),\n ...(app.name !== undefined ? { name: app.name } : {}),\n version: app.version ?? \"0.1.0\",\n ...(app.description !== undefined ? { description: app.description } : {}),\n agents: agentRefs,\n workflows: workflowRefs,\n ...(app.workspace ? { workspace: app.workspace.id } : {}),\n ...(app.requires !== undefined ? { requires: app.requires } : {}),\n ...(uiFrontmatter !== undefined ? { ui: uiFrontmatter } : {}),\n ...(artifactFrontmatter !== undefined ? { artifact: artifactFrontmatter } : {}),\n ...(skillFrontmatter !== undefined ? { skill: skillFrontmatter } : {}),\n ...(app.artifacts !== undefined ? { artifacts: app.artifacts } : {}),\n ...(app.dev !== undefined ? { dev: app.dev } : {}),\n ...(app.data !== undefined ? { data: app.data } : {}),\n ...(app.externalReadRoots !== undefined ? { externalReadRoots: app.externalReadRoots } : {}),\n ...(app.category !== undefined ? { category: app.category } : {}),\n }\n await writeFile(appPath, toManifest(appFrontmatter, app.description ?? \"\"), \"utf8\")\n\n return {\n agentPaths,\n workflowPaths,\n appPath,\n ...(workspacePath ? { workspacePath } : {}),\n ...(uiPath ? { uiPath } : {}),\n ...(artifactPath ? { artifactPath } : {}),\n ...(skillPath ? { skillPath } : {}),\n }\n}\n\nfunction toManifest(handle: object, body: string): string {\n const data: Record<string, unknown> = JSON.parse(JSON.stringify(handle))\n return matter.stringify(`\\n${body}\\n`, data)\n}\n","/**\n * `defineApp({ agents, workflows, attach })` — bundle one or more AIP-42\n * agents, the AIP-15 workflows they run, and any other AIP artifacts into\n * one cross-linked, frozen handle.\n *\n * The only new invariant app-kit adds is *attachment*: the agents and the\n * bundled workflows must reference each other. Everything else (field\n * validation) already ran when the caller built the handles with\n * `defineAgent` / `defineWorkflow`, so `defineApp` validates the coupling,\n * not the fields.\n *\n * - agent ids are unique within the app.\n * - every `agent.workflows[]` ref MUST resolve to a bundled workflow id.\n * - every bundled workflow MUST be referenced by at least one agent.\n *\n * A dangling ref (an agent points at a workflow the app didn't bundle) or\n * an orphan (a bundled workflow no agent lists) throws — that is what \"an\n * agent attached to its workflows\" means, made checkable.\n */\n\nimport { isAbsolute } from \"node:path\"\nimport { defineWorkspace } from \"@agentproto/workspace\"\nimport type { AgentHandle, AnyRef } from \"@agentproto/agent\"\nimport type { BuildMastraAgentResult } from \"@agentproto/mastra\"\nimport type { WorkflowHandle } from \"@agentproto/workflow\"\nimport type { WorkspaceHandle } from \"@agentproto/workspace\"\nimport type {\n AgentEntry,\n AppDefinition,\n AppHandle,\n DoctypeHandle,\n ToMastraAgentOptions,\n WorkspaceInput,\n} from \"./types.js\"\nimport { refKey } from \"./refs.js\"\nimport { emitApp } from \"./emit.js\"\n\nexport class AppDefinitionError extends Error {\n constructor(message: string) {\n super(`defineApp (app-kit): ${message}`)\n this.name = \"AppDefinitionError\"\n }\n}\n\nexport function defineApp(def: AppDefinition): AppHandle {\n if (def.id !== undefined && def.id.trim() === \"\") {\n throw new AppDefinitionError(\"`id` must be non-empty when present.\")\n }\n if (def.ui !== undefined && (typeof def.ui.html !== \"string\" || def.ui.html.trim() === \"\")) {\n throw new AppDefinitionError(\"`ui.html` must be a non-empty string when `ui` is present.\")\n }\n if ((def.agents === undefined || def.agents.length === 0) && def.ui === undefined) {\n throw new AppDefinitionError(\n \"an app needs at least one agent, or a `ui` block for a UI-only app — got neither.\",\n )\n }\n if (def.dev !== undefined && (!Array.isArray(def.dev.launch) || def.dev.launch.length === 0)) {\n throw new AppDefinitionError(\"`dev.launch` must be a non-empty array when `dev` is present.\")\n }\n if (def.data !== undefined && def.data.dir !== undefined && (typeof def.data.dir !== \"string\" || def.data.dir.trim() === \"\")) {\n throw new AppDefinitionError(\"`data.dir` must be a non-empty string when present.\")\n }\nif (def.artifact !== undefined && (typeof def.artifact.path !== \"string\" || def.artifact.path.trim() === \"\")) {\n throw new AppDefinitionError(\"`artifact.path` must be a non-empty string when `artifact` is present.\")\n }\n // AIP-53 rule 7: `artifact.path` / `skill.path` MUST be absolute —\n // `emit` copies from them at write time and a relative path has no\n // defined base to resolve against.\n if (def.artifact !== undefined && !isAbsolute(def.artifact.path)) {\n throw new AppDefinitionError(\n `\\`artifact.path\\` must be an absolute filesystem path, got '${def.artifact.path}' — a relative path has no defined base to resolve against (AIP-53 rule 7).`,\n )\n }\n if (def.skill !== undefined && (typeof def.skill.path !== \"string\" || def.skill.path.trim() === \"\")) {\n throw new AppDefinitionError(\"`skill.path` must be a non-empty string when `skill` is present.\")\n }\n if (def.skill !== undefined && !isAbsolute(def.skill.path)) {\n throw new AppDefinitionError(\n `\\`skill.path\\` must be an absolute filesystem path, got '${def.skill.path}' — a relative path has no defined base to resolve against (AIP-53 rule 7).`,\n )\n }\n if (def.category !== undefined && def.category.trim() === \"\") {\n throw new AppDefinitionError(\"`category` must be a non-empty string when present.\")\n }\n\n const agents = (def.agents ?? []).map(normalizeEntry)\n const workflows = def.workflows ?? []\n const tools = def.tools ?? []\n const drivers = def.drivers ?? []\n const attachments = def.attach ?? []\n const workspace = def.workspace ? toWorkspaceHandle(def.workspace) : undefined\n const id = def.id\n const name = def.name\n const version = def.version ?? (id ? \"0.1.0\" : undefined)\n const description = def.description\n const requires = def.requires ? Object.freeze([...def.requires]) : undefined\n const ui = def.ui ? Object.freeze({ ...def.ui }) : undefined\n const artifact = def.artifact ? Object.freeze({ ...def.artifact }) : undefined\n const skill = def.skill ? Object.freeze({ ...def.skill }) : undefined\n const artifacts = def.artifacts ? Object.freeze(def.artifacts.map(a => Object.freeze({ ...a }))) : undefined\n const dev = def.dev\n ? Object.freeze({ launch: Object.freeze(def.dev.launch.map(l => Object.freeze({ ...l }))) })\n : undefined\n const externalReadRoots = def.externalReadRoots ? Object.freeze([...def.externalReadRoots]) : undefined\n const data = def.data ? Object.freeze({ ...def.data }) : undefined\n const category = def.category\n\n validateAttachment(agents, workflows)\n validateUniqueIds(tools, \"tool\")\n validateUniqueIds(drivers, \"driver\")\n\n const frozenAgents = Object.freeze(agents.map((e) => Object.freeze({ ...e })))\n const frozenWorkflows = Object.freeze([...workflows])\n const frozenTools = Object.freeze([...tools])\n const frozenDrivers = Object.freeze([...drivers])\n const frozenAttachments = Object.freeze([...attachments])\n\n const handle: AppHandle = {\n agents: frozenAgents,\n workflows: frozenWorkflows,\n tools: frozenTools,\n drivers: frozenDrivers,\n attachments: frozenAttachments,\n ...(workspace ? { workspace } : {}),\n ...(id !== undefined ? { id } : {}),\n ...(name !== undefined ? { name } : {}),\n ...(version !== undefined ? { version } : {}),\n ...(description !== undefined ? { description } : {}),\n ...(requires !== undefined ? { requires } : {}),\n ...(ui !== undefined ? { ui } : {}),\n ...(artifact !== undefined ? { artifact } : {}),\n ...(skill !== undefined ? { skill } : {}),\n ...(artifacts !== undefined ? { artifacts } : {}),\n ...(dev !== undefined ? { dev } : {}),\n ...(data !== undefined ? { data } : {}),\n ...(externalReadRoots !== undefined ? { externalReadRoots } : {}),\n ...(category !== undefined ? { category } : {}),\n\n async toMastraAgents(opts: ToMastraAgentOptions, only?: readonly string[]) {\n const targets = only ? selectAgents(frozenAgents, only) : frozenAgents\n const out: Record<string, BuildMastraAgentResult> = {}\n for (const entry of targets) {\n out[entry.agent.id] = await buildOne(entry, opts)\n }\n return out\n },\n\n pick(ids: readonly string[]) {\n return selectAgents(frozenAgents, ids)\n },\n\n async toMastraAgent(opts: ToMastraAgentOptions) {\n if (frozenAgents.length !== 1) {\n throw new AppDefinitionError(\n `toMastraAgent requires exactly one agent (app has ${frozenAgents.length}); use toMastraAgents.`,\n )\n }\n return buildOne(frozenAgents[0]!, opts)\n },\n\n emit(dir: string) {\n return emitApp(\n {\n agents: frozenAgents,\n workflows: frozenWorkflows,\n ...(workspace ? { workspace } : {}),\n ...(id !== undefined ? { id } : {}),\n ...(name !== undefined ? { name } : {}),\n ...(version !== undefined ? { version } : {}),\n ...(description !== undefined ? { description } : {}),\n ...(requires !== undefined ? { requires } : {}),\n ...(ui !== undefined ? { ui } : {}),\n ...(artifact !== undefined ? { artifact } : {}),\n ...(skill !== undefined ? { skill } : {}),\n ...(artifacts !== undefined ? { artifacts } : {}),\n ...(dev !== undefined ? { dev } : {}),\n ...(data !== undefined ? { data } : {}),\n ...(externalReadRoots !== undefined ? { externalReadRoots } : {}),\n ...(category !== undefined ? { category } : {}),\n },\n dir,\n )\n },\n }\n\n return Object.freeze(handle)\n}\n\n/**\n * Normalize the `workspace` input to an AIP-34 `WorkspaceHandle`. A built\n * handle (already run through `defineWorkspace`) carries `schema:\n * \"workspace/v1\"` and passes straight through; a `WorkspaceShorthand` is\n * completed with a local-fs storage default and a `0.1.0` version, then\n * validated by `defineWorkspace` — so a malformed shorthand fails with the\n * same AIP-34 diagnostic as a malformed WORKSPACE.md.\n */\nfunction toWorkspaceHandle(input: WorkspaceInput): WorkspaceHandle {\n if (\"schema\" in input) return input\n return defineWorkspace({\n schema: \"workspace/v1\",\n version: input.version ?? \"0.1.0\",\n id: input.id,\n name: input.name,\n owner: input.owner,\n storage: input.storage ?? { inline: { provider: \"local-fs\", config: {} } },\n ...(input.description ? { description: input.description } : {}),\n })\n}\n\n/**\n * Resolve `ids` to their app entries, preserving the caller's order. Throws\n * `AppDefinitionError` on any id the app doesn't bundle — a hand-picked list\n * that names a missing agent is a bug, not a silent no-op.\n */\nfunction selectAgents(\n agents: readonly AgentEntry[],\n ids: readonly string[],\n): readonly AgentEntry[] {\n const byId = new Map(agents.map((e) => [e.agent.id, e]))\n return ids.map((id) => {\n const entry = byId.get(id)\n if (!entry) {\n throw new AppDefinitionError(\n `agent '${id}' is not in this app. Bundled: [${[...byId.keys()].join(\", \")}].`,\n )\n }\n return entry\n })\n}\n\nasync function buildOne(entry: AgentEntry, opts: ToMastraAgentOptions): Promise<BuildMastraAgentResult> {\n // Dynamic import, not a static top-level one: `@agentproto/mastra` pulls in\n // `@mastra/core` (a documented peer dependency — see index.ts), which a\n // bundler would otherwise inline into ANY host that merely calls\n // `defineApp()` without ever calling `toMastraAgent(s)` (e.g. a UI-only app\n // consumer). Loading it lazily, only from the one place it's actually used,\n // keeps `defineApp()`/the rest of this module free of that cost.\n const { buildMastraAgent } = await import(\"@agentproto/mastra\")\n // `entry.body` (the AGENT.md body) wins as instructions; an explicit\n // `opts.body` still overrides, matching buildMastraAgent's contract.\n return buildMastraAgent(entry.agent, { body: entry.body, ...opts })\n}\n\nfunction normalizeEntry(input: AgentEntry | AgentHandle): AgentEntry {\n // An AgentEntry has an `.agent`; a bare AgentHandle has `.id`/`.schema`.\n if (\"agent\" in input) return input\n return { agent: input }\n}\n\n/**\n * The attachment invariant across all agents: bundled workflow ids and\n * the union of every agent's `workflows[]` refs must be the same set.\n * External/registry workflow refs are out of scope for an app bundle —\n * if an agent lists it, the app must ship it.\n */\nfunction validateAttachment(\n agents: readonly AgentEntry[],\n workflows: readonly WorkflowHandle[],\n): void {\n const seenAgentIds = new Set<string>()\n for (const { agent } of agents) {\n if (seenAgentIds.has(agent.id)) {\n throw new AppDefinitionError(`duplicate agent id '${agent.id}' in the bundle.`)\n }\n seenAgentIds.add(agent.id)\n }\n\n const bundledIds = new Set<string>()\n for (const wf of workflows) {\n if (bundledIds.has(wf.id)) {\n throw new AppDefinitionError(`duplicate workflow id '${wf.id}' in the bundle.`)\n }\n bundledIds.add(wf.id)\n }\n\n const referenced = new Set<string>()\n for (const { agent } of agents) {\n for (const ref of workflowRefs(agent)) {\n const key = refKey(ref)\n referenced.add(key)\n if (!bundledIds.has(key)) {\n throw new AppDefinitionError(\n `agent '${agent.id}' references workflow '${key}' but the app does not bundle it. ` +\n `Bundled: [${[...bundledIds].join(\", \") || \"none\"}].`,\n )\n }\n }\n }\n\n for (const id of bundledIds) {\n if (!referenced.has(id)) {\n throw new AppDefinitionError(\n `workflow '${id}' is bundled but no agent lists it in workflows[]. ` +\n `Add { ref: \"${id}\" } to an agent, or drop the workflow.`,\n )\n }\n }\n}\n\nfunction workflowRefs(agent: AgentHandle): readonly AnyRef[] {\n return agent.workflows ?? []\n}\n\n/** Duplicate-id guard for `tools`/`drivers` — mirrors the agent/workflow id\n * uniqueness `validateAttachment` already enforces. */\nfunction validateUniqueIds(items: readonly { id: string }[], kind: string): void {\n const seen = new Set<string>()\n for (const item of items) {\n if (seen.has(item.id)) {\n throw new AppDefinitionError(`duplicate ${kind} id '${item.id}' in the bundle.`)\n }\n seen.add(item.id)\n }\n}\n\nexport type { DoctypeHandle }\n","/** Thrown by `loadAppHandle` and its helpers (`loadAppBundledTools`, …) on\n * any disk/parse/validation failure while reading an app bundle off disk. */\nexport class AppLoadError extends Error {\n constructor(message: string) {\n super(`loadAppHandle: ${message}`)\n this.name = \"AppLoadError\"\n }\n}\n","/**\n * Loader for an app's bundled AIP-14 TOOL.md contracts and AIP-30 DRIVER.md\n * implementations — the deterministic-step half of WORKFLOW.md `tool` steps\n * (yt-dlp, an STT HTTP call, a PDF render, …), as opposed to `agent` steps.\n *\n * Neither AIP-53 (app, still Draft with no scaffolded spec) nor AIP-14/30\n * declare a bundle location for these, so this is a convention this loader\n * defines: `<dir>/.agentproto/tools/<id>/TOOL.md` and\n * `<dir>/.agentproto/drivers/<id>/DRIVER.md`, one manifest per `<id>`\n * subdirectory, discovered by listing — not declared as APP.md frontmatter\n * refs like `agents`/`workflows` are. An absent `tools`/`drivers` directory\n * is not an error (most apps have neither); a subdirectory that exists but\n * fails to parse, or is missing its TOOL.md/DRIVER.md, fails the whole load\n * — `loadAppHandle` never silently drops a broken tool/driver bundle.\n *\n * Only `kind: cli` and `kind: http` drivers dispatch (the two\n * `@agentproto/driver-cli` / `@agentproto/driver-http` sugars this package\n * already depends on). Any other `kind` (`mcp`, `sdk`, `builtin`) still\n * loads — a malformed manifest still fails the app load — but its execute\n * body refuses clearly instead of silently no-oping or crashing on a\n * dispatch mechanism this host doesn't implement yet.\n *\n * A `kind: cli` driver's subprocess `cwd` defaults to the app root (`dir`,\n * the directory containing `.agentproto/`) rather than the host process's\n * own cwd — relative paths in an app-bundled cli driver (DRIVER.md argv,\n * `--out-dir`-style flags, …) resolve against the app root. A DRIVER.md can\n * override this with `metadata.cli.cwd`; a relative value there is itself\n * resolved against the app root, and a value that escapes the app root\n * (`../..`) is a load error, not a silent escape.\n */\n\nimport { readdir, readFile } from \"node:fs/promises\"\nimport type { Dirent } from \"node:fs\"\nimport { isAbsolute, join, relative, resolve } from \"node:path\"\nimport {\n parseToolManifest,\n toolFromManifestOnly,\n type ToolHandle,\n} from \"@agentproto/tool\"\nimport {\n driverFromManifest,\n driverDefinitionFromManifest,\n parseDriverManifest,\n type DriverManifest,\n} from \"@agentproto/driver/manifest\"\nimport { normalizeToolId, type DriverHandle, type ExecuteFn } from \"@agentproto/driver\"\nimport { defineCliDriver, type CliDriverDefinition } from \"@agentproto/driver-cli\"\nimport { defineHttpDriver, type HttpDriverDefinition } from \"@agentproto/driver-http\"\nimport { AppLoadError } from \"./errors.js\"\n\n/** List `<id>` subdirectory names under `base`, sorted. Missing `base` (the\n * common case — most apps ship neither tools nor drivers) is not an error. */\nasync function listBundleIds(base: string): Promise<string[]> {\n let entries: Dirent[]\n try {\n entries = await readdir(base, { withFileTypes: true })\n } catch {\n return []\n }\n return entries\n .filter((e) => e.isDirectory())\n .map((e) => e.name)\n .sort()\n}\n\nfunction errMsg(err: unknown): string {\n return err instanceof Error ? err.message : String(err)\n}\n\nasync function loadToolEntry(id: string, toolPath: string): Promise<ToolHandle> {\n let source: string\n try {\n source = await readFile(toolPath, \"utf8\")\n } catch (err) {\n throw new AppLoadError(`tool '${id}': cannot read '${toolPath}': ${errMsg(err)}`)\n }\n try {\n return toolFromManifestOnly(parseToolManifest(source))\n } catch (err) {\n throw new AppLoadError(`tool '${id}' at '${toolPath}': ${errMsg(err)}`)\n }\n}\n\n/** Env var names DRIVER.md declares as required secrets — `auth.state.env`,\n * the existing AIP-30 field for \"env var names this provider's auth needs\".\n * Loosely typed at the manifest layer (`auth: z.unknown()`), so this reads\n * defensively rather than trusting a shape. */\nfunction requiredSecretNames(fm: DriverManifest[\"frontmatter\"]): readonly string[] {\n const auth = fm.auth as { state?: { env?: unknown } } | undefined\n const env = auth?.state?.env\n return Array.isArray(env) ? env.filter((e): e is string => typeof e === \"string\") : []\n}\n\n/**\n * Wrap every execute body so a declared-but-unresolved secret fails the\n * STEP with a clear `driver-error` naming the secret — never at app\n * install (secrets are resolved lazily, only when the tool actually\n * dispatches). Resolved values are merged into `driverCtx.secrets` ahead of\n * whatever the caller already put there (a workflow tool step's compiled\n * `secrets` is empty today — see BRIEF-D — so this is the only source for\n * an app-bundled driver), letting `${secrets.X}` templating in\n * `defineCliDriver`/`defineHttpDriver` resolve as authors expect.\n */\nfunction wrapExecuteWithSecretCheck(\n driverId: string,\n execute: Record<string, ExecuteFn>,\n secretNames: readonly string[],\n): Record<string, ExecuteFn> {\n if (secretNames.length === 0) return execute\n const wrapped: Record<string, ExecuteFn> = {}\n for (const [toolId, fn] of Object.entries(execute)) {\n wrapped[toolId] = async (args) => {\n const resolved: Record<string, string> = {}\n for (const name of secretNames) {\n const value = process.env[name]\n if (!value) {\n throw new Error(\n `driver '${driverId}': missing required secret '${name}' (declared in DRIVER.md 'auth.state.env').`,\n )\n }\n resolved[name] = value\n }\n const priorSecrets = (args.driverCtx as { secrets?: Record<string, string> }).secrets ?? {}\n return fn({ ...args, driverCtx: { ...args.driverCtx, secrets: { ...resolved, ...priorSecrets } } })\n }\n }\n return wrapped\n}\n\n/**\n * Resolve a kind:cli DRIVER.md's working directory. Relative paths in an\n * app-bundled cli driver resolve against the app root (the dir containing\n * `.agentproto/`) — not the daemon's own cwd, which is what `runSubprocess`\n * fell back to before this existed and is almost never what a DRIVER.md\n * author means (see `@agentproto/driver-cli`'s README). Defaults to the app\n * root itself when `metadata.cli.cwd` is unset; an explicit value — relative\n * or absolute — that resolves outside the app root is a load error rather\n * than silently escaping the bundle.\n */\nfunction resolveCliCwd(appRoot: string, driverId: string, cwd: unknown): string {\n const absoluteAppRoot = resolve(appRoot)\n if (cwd === undefined) return absoluteAppRoot\n if (typeof cwd !== \"string\" || cwd.trim() === \"\") {\n throw new Error(`driver '${driverId}': 'metadata.cli.cwd' must be a non-empty string.`)\n }\n const resolved = isAbsolute(cwd) ? resolve(cwd) : resolve(absoluteAppRoot, cwd)\n const rel = relative(absoluteAppRoot, resolved)\n if (rel !== \"\" && (rel.startsWith(\"..\") || isAbsolute(rel))) {\n throw new Error(\n `driver '${driverId}': 'metadata.cli.cwd' (${cwd}) resolves to '${resolved}', outside the app root '${absoluteAppRoot}'.`,\n )\n }\n return resolved\n}\n\n/** Build a working {@link DriverHandle} from a parsed DRIVER.md, dispatching\n * on `kind`. Throws a plain `Error` (wrapped in `AppLoadError` by the\n * caller, which has the file path) on a `cli`/`http` manifest missing its\n * dispatch config. */\nfunction driverHandleFromManifest(manifest: DriverManifest, appRoot: string): DriverHandle {\n const fm = manifest.frontmatter\n const secretNames = requiredSecretNames(fm)\n\n if (fm.kind === \"cli\") {\n const cliMeta = (fm.metadata?.cli ?? {}) as Partial<CliDriverDefinition> & { cwd?: unknown }\n if (typeof cliMeta.bin !== \"string\" || cliMeta.bin.trim() === \"\") {\n throw new Error(\n \"kind:cli DRIVER.md requires a non-empty 'metadata.cli.bin' frontmatter field naming the binary.\",\n )\n }\n const handle = defineCliDriver({\n ...driverDefinitionFromManifest(manifest),\n bin: cliMeta.bin,\n binArgs: cliMeta.binArgs,\n output: cliMeta.output,\n tty: cliMeta.tty,\n sandbox: cliMeta.sandbox,\n cwd: resolveCliCwd(appRoot, fm.id, cliMeta.cwd),\n })\n return { ...handle, execute: wrapExecuteWithSecretCheck(fm.id, handle.execute, secretNames) }\n }\n\n if (fm.kind === \"http\") {\n const httpMeta = (fm.metadata?.http ?? {}) as Partial<HttpDriverDefinition>\n if (typeof httpMeta.baseUrl !== \"string\" || httpMeta.baseUrl.trim() === \"\") {\n throw new Error(\"kind:http DRIVER.md requires a non-empty 'metadata.http.baseUrl' frontmatter field.\")\n }\n const handle = defineHttpDriver({\n ...driverDefinitionFromManifest(manifest),\n baseUrl: httpMeta.baseUrl,\n defaultHeaders: httpMeta.defaultHeaders,\n defaultMethod: httpMeta.defaultMethod,\n streaming: httpMeta.streaming,\n })\n return { ...handle, execute: wrapExecuteWithSecretCheck(fm.id, handle.execute, secretNames) }\n }\n\n // mcp / sdk / builtin: load (so a malformed manifest still fails the app\n // load), but refuse at resolve/dispatch — every implements[] entry gets\n // an execute body that fails with a clear message instead of silently\n // no-oping or throwing an opaque \"no dispatch mechanism\" error.\n const execute: Record<string, ExecuteFn> = {}\n for (const entry of fm.implements) {\n const toolId = normalizeToolId(entry.tool)\n execute[toolId] = async () => {\n throw new Error(\n `driver '${fm.id}': kind '${fm.kind}' is not supported by this host — only 'cli' and 'http' drivers dispatch.`,\n )\n }\n }\n return driverFromManifest({ manifest, execute })\n}\n\nasync function loadDriverEntry(id: string, driverPath: string, appRoot: string): Promise<DriverHandle> {\n let source: string\n try {\n source = await readFile(driverPath, \"utf8\")\n } catch (err) {\n throw new AppLoadError(`driver '${id}': cannot read '${driverPath}': ${errMsg(err)}`)\n }\n try {\n return driverHandleFromManifest(parseDriverManifest(source), appRoot)\n } catch (err) {\n throw new AppLoadError(`driver '${id}' at '${driverPath}': ${errMsg(err)}`)\n }\n}\n\n/**\n * Scan `<dir>/.agentproto/tools/*` and `<dir>/.agentproto/drivers/*` for\n * TOOL.md / DRIVER.md bundles and load them into live handles. Used by\n * `loadAppHandle` (install-time validation, via `defineApp`) and reusable\n * directly by a host that needs an already-installed app's tools/drivers\n * without re-walking its agents/workflows (see `@agentproto/runtime`'s\n * workflow `compileWorkflow` seam).\n */\nexport async function loadAppBundledTools(\n dir: string,\n): Promise<{ tools: ToolHandle[]; drivers: DriverHandle[] }> {\n const toolsDir = join(dir, \".agentproto\", \"tools\")\n const driversDir = join(dir, \".agentproto\", \"drivers\")\n\n const tools: ToolHandle[] = []\n for (const id of await listBundleIds(toolsDir)) {\n tools.push(await loadToolEntry(id, join(toolsDir, id, \"TOOL.md\")))\n }\n\n const drivers: DriverHandle[] = []\n for (const id of await listBundleIds(driversDir)) {\n drivers.push(await loadDriverEntry(id, join(driversDir, id, \"DRIVER.md\"), dir))\n }\n\n return { tools, drivers }\n}\n","/**\n * `loadAppHandle(dir)` — read a root `APP.md` off disk into an `AppHandle`.\n *\n * Mirror of `@agentproto/workflow-loader`'s `loadWorkflowHandle`: this is\n * the host-side seam that touches the filesystem so the pure packages\n * (`@agentproto/agent`, `@agentproto/workflow`, `@agentproto/workspace`)\n * don't have to.\n *\n * `<dir>/.agentproto/APP.md` lists every agent + workflow the app bundles\n * as `{ id, path }` refs (relative to `dir`, the shape `emitApp` writes).\n * Each is loaded with its own package's manifest reader — `AGENT.md` via\n * `@agentproto/agent/manifest`, `WORKFLOW.md` via\n * `@agentproto/workflow-loader` (which itself resolves an `entry:` module\n * when present) — then the whole bundle is re-run through `defineApp` so\n * the attachment invariant (every agent/workflow ref resolves both ways)\n * re-validates exactly as it did at authoring time. A stale or hand-edited\n * APP.md that drifted from its AGENT.md/WORKFLOW.md refs fails the same\n * way a bad `defineApp({...})` call would.\n *\n * The app may also ship AIP-14 TOOL.md / AIP-30 DRIVER.md bundles under\n * `.agentproto/tools/<id>/TOOL.md` and `.agentproto/drivers/<id>/DRIVER.md`\n * — discovered by directory convention (see `loadAppBundledTools`), not\n * declared as APP.md frontmatter refs like agents/workflows are.\n *\n * Frontmatter validation here is deliberately minimal, and that is now an\n * AIP-53 conformance decision, not an accident of app having \"no AIP yet\":\n * AIP-53 (Draft) freezes the loader contract at the checks below — schema\n * MUST be exactly `app/v1`, `agents`/`workflows` MUST be `{ id, path }`\n * ref arrays, every ref MUST resolve, and the bundle MUST re-run through\n * `defineApp` — and it does NOT require rejecting unknown frontmatter\n * keys. Staying permissive past the frozen checks lets a future frontmatter\n * key (e.g. a later WP's addition) round-trip through this loader without\n * hosts that haven't upgraded rejecting the whole app; tightening beyond\n * the spec would break that forward compatibility for no conformance gain.\n */\n\nimport { readFile } from \"node:fs/promises\"\nimport { dirname, isAbsolute, join } from \"node:path\"\nimport matter from \"gray-matter\"\nimport { agentFromManifest, parseAgentManifest } from \"@agentproto/agent/manifest\"\nimport { loadWorkflowHandle } from \"@agentproto/workflow-loader\"\nimport { parseWorkspaceManifest, workspaceFromManifest } from \"@agentproto/workspace/manifest\"\nimport type {\n AgentEntry,\n AppArtifactDecl,\n AppDataDefinition,\n AppDevDefinition,\n AppHandle,\n AppUiBuildConfig,\n} from \"./types.js\"\nimport { defineApp } from \"./define-app.js\"\nimport { AppLoadError } from \"./errors.js\"\nimport { loadAppBundledTools } from \"./load-app-tools.js\"\n\nexport { AppLoadError }\n\ninterface AppRef {\n readonly id: string\n readonly path: string\n}\n\ninterface AppFrontmatterUi {\n readonly path: string\n readonly title?: string\n readonly description?: string\n readonly tools?: readonly string[]\n readonly port?: number\n readonly csp?: {\n readonly connectDomains?: readonly string[]\n readonly resourceDomains?: readonly string[]\n readonly frameDomains?: readonly string[]\n }\n readonly build?: AppUiBuildConfig\n}\n\ninterface AppFrontmatterArtifact {\n readonly path: string\n readonly title?: string\n readonly description?: string\n}\n\ninterface AppFrontmatterSkill {\n readonly path: string\n readonly title?: string\n readonly description?: string\n}\n\ninterface AppFrontmatter {\n readonly schema: string\n readonly id?: string\n readonly name?: string\n readonly version?: string\n readonly description?: string\n readonly agents: readonly AppRef[]\n readonly workflows: readonly AppRef[]\n readonly workspace?: string\n readonly requires?: readonly string[]\n readonly ui?: AppFrontmatterUi\n readonly artifact?: AppFrontmatterArtifact\n readonly skill?: AppFrontmatterSkill\n readonly artifacts?: readonly AppArtifactDecl[]\n readonly dev?: AppDevDefinition\n readonly data?: AppDataDefinition\n readonly externalReadRoots?: readonly string[]\n readonly category?: string\n}\n\nfunction resolveRef(dir: string, path: string): string {\n return isAbsolute(path) ? path : join(dir, path)\n}\n\n/**\n * Resolve the UI ROOT directory an app's UI should be served from — the\n * same resolution `app_install`/`loadAppHandle` uses for `ui.path`, so\n * `app serve` and install agree on where the UI lives.\n *\n * Reads `<appDir>/.agentproto/APP.md` frontmatter: when a `ui.path` is\n * declared, the UI root is the directory CONTAINING that entry file (e.g.\n * `ui.path: ui/index.html` → `<appDir>/ui`); when `ui` is absent, returns\n * `undefined` and callers fall back to the legacy `<appDir>/.agentproto/ui/`.\n * Throws {@link AppLoadError} on a `ui` that isn't an object or whose `path`\n * isn't a non-empty string — the same shape `loadAppHandle` would reject.\n * Returns `undefined` (not a throw) when APP.md itself is unreadable, since\n * callers check APP.md existence separately.\n */\nexport async function resolveAppUIRoot(appDir: string): Promise<string | undefined> {\n const appMdPath = join(appDir, \".agentproto\", \"APP.md\")\n let source: string\n try {\n source = await readFile(appMdPath, \"utf8\")\n } catch {\n return undefined\n }\n const data = matter(source).data as Record<string, unknown>\n const ui = data.ui\n if (ui === undefined) return undefined\n if (typeof ui !== \"object\" || ui === null || Array.isArray(ui)) {\n throw new AppLoadError(`'${appMdPath}': frontmatter 'ui' must be an object.`)\n }\n const path = (ui as Record<string, unknown>).path\n if (typeof path !== \"string\" || path.trim() === \"\") {\n throw new AppLoadError(\n `'${appMdPath}': frontmatter 'ui.path' must be a non-empty string.`,\n )\n }\n return dirname(resolveRef(appDir, path))\n}\n\n/** Validated `ui.path` + `ui.build`, as returned by {@link peekAppUi}. */\nexport interface AppUiPeek {\n readonly path: string\n readonly build?: AppUiBuildConfig\n}\n\nfunction parseUiBuildFrontmatter(raw: unknown, appMdPath: string): AppUiBuildConfig | undefined {\n if (raw === undefined) return undefined\n if (typeof raw !== \"object\" || raw === null || Array.isArray(raw)) {\n throw new AppLoadError(`'${appMdPath}': frontmatter 'ui.build' must be an object.`)\n }\n const command = (raw as Record<string, unknown>).command\n if (typeof command !== \"string\" || command.trim() === \"\") {\n throw new AppLoadError(`'${appMdPath}': frontmatter 'ui.build.command' must be a non-empty string.`)\n }\n const cwd = (raw as Record<string, unknown>).cwd\n if (cwd !== undefined && (typeof cwd !== \"string\" || cwd.trim() === \"\")) {\n throw new AppLoadError(`'${appMdPath}': frontmatter 'ui.build.cwd' must be a non-empty string.`)\n }\n const sources = (raw as Record<string, unknown>).sources\n if (\n sources !== undefined &&\n (!Array.isArray(sources) || !sources.every(s => typeof s === \"string\" && s.trim() !== \"\"))\n ) {\n throw new AppLoadError(\n `'${appMdPath}': frontmatter 'ui.build.sources' must be an array of non-empty strings.`,\n )\n }\n return {\n command,\n ...(cwd !== undefined ? { cwd: cwd as string } : {}),\n ...(sources !== undefined ? { sources: sources as string[] } : {}),\n }\n}\n\n/**\n * Peek `<appDir>/.agentproto/APP.md`'s `ui.path` + `ui.build` WITHOUT\n * reading the ui html itself.\n *\n * `loadAppHandle` reads `ui.path` eagerly and throws {@link AppLoadError}\n * when it's missing — exactly the case a declared `ui.build` exists to\n * recover from. A caller that wants to build the bundle before it's\n * expected to exist (the daemon's `app_install`, `app serve`, first UI\n * serve — see `@agentproto/runtime`'s `ensureAppUiBuilt`) resolves this\n * first, runs the build if declared, then calls `loadAppHandle` as usual.\n *\n * Returns `undefined` when APP.md is unreadable or declares no `ui` block\n * — same \"caller checks existence separately\" contract as\n * `resolveAppUIRoot`. Throws on a malformed `ui`/`ui.build` shape, same\n * validation `loadAppHandle` would eventually hit.\n */\nexport async function peekAppUi(appDir: string): Promise<AppUiPeek | undefined> {\n const appMdPath = join(appDir, \".agentproto\", \"APP.md\")\n let source: string\n try {\n source = await readFile(appMdPath, \"utf8\")\n } catch {\n return undefined\n }\n const data = matter(source).data as Record<string, unknown>\n const ui = data.ui\n if (ui === undefined) return undefined\n if (typeof ui !== \"object\" || ui === null || Array.isArray(ui)) {\n throw new AppLoadError(`'${appMdPath}': frontmatter 'ui' must be an object.`)\n }\n const path = (ui as Record<string, unknown>).path\n if (typeof path !== \"string\" || path.trim() === \"\") {\n throw new AppLoadError(\n `'${appMdPath}': frontmatter 'ui.path' must be a non-empty string.`,\n )\n }\n const build = parseUiBuildFrontmatter((ui as Record<string, unknown>).build, appMdPath)\n return { path: resolveRef(appDir, path), ...(build ? { build } : {}) }\n}\n\nfunction isRefArray(v: unknown): v is AppRef[] {\n return (\n Array.isArray(v) &&\n v.every(\n (e) =>\n typeof e === \"object\" &&\n e !== null &&\n typeof (e as { id?: unknown }).id === \"string\" &&\n typeof (e as { path?: unknown }).path === \"string\",\n )\n )\n}\n\n/** Minimal shape check — see the module doc for why this stays loose. */\nfunction parseAppFrontmatter(data: Record<string, unknown>, appPath: string): AppFrontmatter {\n if (data.schema !== \"app/v1\") {\n throw new AppLoadError(\n `'${appPath}': expected frontmatter 'schema: app/v1', got ${JSON.stringify(data.schema)}.`,\n )\n }\n if (!isRefArray(data.agents)) {\n throw new AppLoadError(`'${appPath}': frontmatter 'agents' must be an array of { id, path }.`)\n }\n if (!isRefArray(data.workflows)) {\n throw new AppLoadError(\n `'${appPath}': frontmatter 'workflows' must be an array of { id, path }.`,\n )\n }\n if (data.requires !== undefined) {\n if (!Array.isArray(data.requires) || !data.requires.every((e) => typeof e === \"string\")) {\n throw new AppLoadError(`'${appPath}': frontmatter 'requires' must be an array of strings.`)\n }\n }\n if (data.data !== undefined) {\n const d = data.data as { dir?: unknown } | null\n if (\n typeof d !== \"object\" ||\n d === null ||\n (d.dir !== undefined && (typeof d.dir !== \"string\" || d.dir.trim() === \"\"))\n ) {\n throw new AppLoadError(\n `'${appPath}': frontmatter 'data' must be an object whose optional 'dir' is a non-empty string.`,\n )\n }\n }\n if (data.externalReadRoots !== undefined) {\n if (\n !Array.isArray(data.externalReadRoots) ||\n !data.externalReadRoots.every((e) => typeof e === \"string\" && e.trim() !== \"\")\n ) {\n throw new AppLoadError(\n `'${appPath}': frontmatter 'externalReadRoots' must be an array of non-empty strings.`,\n )\n }\n }\n if (data.category !== undefined && (typeof data.category !== \"string\" || data.category.trim() === \"\")) {\n throw new AppLoadError(`'${appPath}': frontmatter 'category' must be a non-empty string.`)\n }\n return data as unknown as AppFrontmatter\n}\n\nasync function loadAgentEntry(dir: string, ref: AppRef): Promise<AgentEntry> {\n const agentPath = resolveRef(dir, ref.path)\n let source: string\n try {\n source = await readFile(agentPath, \"utf8\")\n } catch (err) {\n throw new AppLoadError(\n `agent '${ref.id}': cannot read '${agentPath}': ${err instanceof Error ? err.message : String(err)}`,\n )\n }\n let body: string\n let manifest: ReturnType<typeof parseAgentManifest>\n try {\n manifest = parseAgentManifest(source)\n body = manifest.body.trim()\n } catch (err) {\n throw new AppLoadError(\n `agent '${ref.id}' at '${agentPath}': ${err instanceof Error ? err.message : String(err)}`,\n )\n }\n return { agent: agentFromManifest(manifest), ...(body ? { body } : {}) }\n}\n\nasync function loadWorkflowRef(dir: string, ref: AppRef) {\n const wfPath = resolveRef(dir, ref.path)\n try {\n return await loadWorkflowHandle(wfPath)\n } catch (err) {\n throw new AppLoadError(\n `workflow '${ref.id}' at '${wfPath}': ${err instanceof Error ? err.message : String(err)}`,\n )\n }\n}\n\n/**\n * Load `<dir>/.agentproto/APP.md` and every AGENT.md/WORKFLOW.md (and, if\n * declared, `<dir>/WORKSPACE.md`) it references, then re-run `defineApp` on\n * the result. Throws {@link AppLoadError} naming the offending path on a\n * missing APP.md, a missing referenced file, or a frontmatter/schema\n * mismatch; throws `AppDefinitionError` (from `defineApp`) if the loaded\n * bundle fails the attachment invariant.\n */\nexport async function loadAppHandle(dir: string): Promise<AppHandle> {\n const appPath = join(dir, \".agentproto\", \"APP.md\")\n let source: string\n try {\n source = await readFile(appPath, \"utf8\")\n } catch (err) {\n throw new AppLoadError(\n `cannot read '${appPath}': ${err instanceof Error ? err.message : String(err)}`,\n )\n }\n\n const parsed = matter(source)\n const fm = parseAppFrontmatter(parsed.data, appPath)\n\n const agents: AgentEntry[] = []\n for (const ref of fm.agents) {\n agents.push(await loadAgentEntry(dir, ref))\n }\n\n const workflows = []\n for (const ref of fm.workflows) {\n workflows.push(await loadWorkflowRef(dir, ref))\n }\n\n // AIP-14/AIP-30 tool + driver bundles — not enumerated in APP.md\n // frontmatter like agents/workflows are; discovered by convention under\n // `.agentproto/tools/<id>/TOOL.md` and `.agentproto/drivers/<id>/DRIVER.md`.\n // No declared bundle location exists yet in AIP-53/14/30 (spec gap) — see\n // `loadAppBundledTools` for the loader and its error-handling contract\n // (a parse/read failure fails the whole app load, naming the file path;\n // an absent `tools`/`drivers` directory is not an error).\n const { tools, drivers } = await loadAppBundledTools(dir)\n\n let workspace\n if (fm.workspace) {\n const workspacePath = join(dir, \"WORKSPACE.md\")\n let workspaceSource: string\n try {\n workspaceSource = await readFile(workspacePath, \"utf8\")\n } catch (err) {\n throw new AppLoadError(\n `workspace '${fm.workspace}': cannot read '${workspacePath}': ${err instanceof Error ? err.message : String(err)}`,\n )\n }\n try {\n workspace = workspaceFromManifest(parseWorkspaceManifest(workspaceSource))\n } catch (err) {\n throw new AppLoadError(\n `workspace '${fm.workspace}' at '${workspacePath}': ${err instanceof Error ? err.message : String(err)}`,\n )\n }\n }\n\n let ui\n if (fm.ui) {\n const uiPath = resolveRef(dir, fm.ui.path)\n let html: string\n try {\n html = await readFile(uiPath, \"utf8\")\n } catch (err) {\n throw new AppLoadError(\n `ui: cannot read '${uiPath}': ${err instanceof Error ? err.message : String(err)}`,\n )\n }\n const build = parseUiBuildFrontmatter(fm.ui.build, appPath)\n ui = {\n html,\n ...(fm.ui.title !== undefined ? { title: fm.ui.title } : {}),\n ...(fm.ui.description !== undefined ? { description: fm.ui.description } : {}),\n ...(fm.ui.tools !== undefined ? { tools: fm.ui.tools } : {}),\n ...(fm.ui.port !== undefined ? { port: fm.ui.port } : {}),\n ...(fm.ui.csp !== undefined ? { csp: fm.ui.csp } : {}),\n ...(build !== undefined ? { build } : {}),\n }\n }\n\n return defineApp({\n agents,\n workflows,\n tools,\n drivers,\n ...(workspace ? { workspace } : {}),\n ...(fm.id !== undefined ? { id: fm.id } : {}),\n ...(fm.name !== undefined ? { name: fm.name } : {}),\n ...(fm.version !== undefined ? { version: fm.version } : {}),\n ...(fm.description !== undefined ? { description: fm.description } : {}),\n ...(fm.requires !== undefined ? { requires: fm.requires } : {}),\n ...(ui !== undefined ? { ui } : {}),\n ...(fm.artifact !== undefined\n ? { artifact: { path: resolveRef(dir, fm.artifact.path), ...(fm.artifact.title !== undefined ? { title: fm.artifact.title } : {}), ...(fm.artifact.description !== undefined ? { description: fm.artifact.description } : {}) } }\n : {}),\n ...(fm.skill !== undefined\n ? { skill: { path: resolveRef(dir, fm.skill.path), ...(fm.skill.title !== undefined ? { title: fm.skill.title } : {}), ...(fm.skill.description !== undefined ? { description: fm.skill.description } : {}) } }\n : {}),\n ...(fm.artifacts !== undefined ? { artifacts: fm.artifacts } : {}),\n ...(fm.dev !== undefined ? { dev: fm.dev } : {}),\n ...(fm.data !== undefined ? { data: fm.data } : {}),\n ...(fm.externalReadRoots !== undefined ? { externalReadRoots: fm.externalReadRoots } : {}),\n ...(fm.category !== undefined ? { category: fm.category } : {}),\n })\n}\n"]}
@@ -0,0 +1,45 @@
1
+ /**
2
+ * Loader for an app's bundled AIP-14 TOOL.md contracts and AIP-30 DRIVER.md
3
+ * implementations — the deterministic-step half of WORKFLOW.md `tool` steps
4
+ * (yt-dlp, an STT HTTP call, a PDF render, …), as opposed to `agent` steps.
5
+ *
6
+ * Neither AIP-53 (app, still Draft with no scaffolded spec) nor AIP-14/30
7
+ * declare a bundle location for these, so this is a convention this loader
8
+ * defines: `<dir>/.agentproto/tools/<id>/TOOL.md` and
9
+ * `<dir>/.agentproto/drivers/<id>/DRIVER.md`, one manifest per `<id>`
10
+ * subdirectory, discovered by listing — not declared as APP.md frontmatter
11
+ * refs like `agents`/`workflows` are. An absent `tools`/`drivers` directory
12
+ * is not an error (most apps have neither); a subdirectory that exists but
13
+ * fails to parse, or is missing its TOOL.md/DRIVER.md, fails the whole load
14
+ * — `loadAppHandle` never silently drops a broken tool/driver bundle.
15
+ *
16
+ * Only `kind: cli` and `kind: http` drivers dispatch (the two
17
+ * `@agentproto/driver-cli` / `@agentproto/driver-http` sugars this package
18
+ * already depends on). Any other `kind` (`mcp`, `sdk`, `builtin`) still
19
+ * loads — a malformed manifest still fails the app load — but its execute
20
+ * body refuses clearly instead of silently no-oping or crashing on a
21
+ * dispatch mechanism this host doesn't implement yet.
22
+ *
23
+ * A `kind: cli` driver's subprocess `cwd` defaults to the app root (`dir`,
24
+ * the directory containing `.agentproto/`) rather than the host process's
25
+ * own cwd — relative paths in an app-bundled cli driver (DRIVER.md argv,
26
+ * `--out-dir`-style flags, …) resolve against the app root. A DRIVER.md can
27
+ * override this with `metadata.cli.cwd`; a relative value there is itself
28
+ * resolved against the app root, and a value that escapes the app root
29
+ * (`../..`) is a load error, not a silent escape.
30
+ */
31
+ import { type ToolHandle } from "@agentproto/tool";
32
+ import { type DriverHandle } from "@agentproto/driver";
33
+ /**
34
+ * Scan `<dir>/.agentproto/tools/*` and `<dir>/.agentproto/drivers/*` for
35
+ * TOOL.md / DRIVER.md bundles and load them into live handles. Used by
36
+ * `loadAppHandle` (install-time validation, via `defineApp`) and reusable
37
+ * directly by a host that needs an already-installed app's tools/drivers
38
+ * without re-walking its agents/workflows (see `@agentproto/runtime`'s
39
+ * workflow `compileWorkflow` seam).
40
+ */
41
+ export declare function loadAppBundledTools(dir: string): Promise<{
42
+ tools: ToolHandle[];
43
+ drivers: DriverHandle[];
44
+ }>;
45
+ //# sourceMappingURL=load-app-tools.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"load-app-tools.d.ts","sourceRoot":"","sources":["../src/load-app-tools.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AAKH,OAAO,EAGL,KAAK,UAAU,EAChB,MAAM,kBAAkB,CAAA;AAOzB,OAAO,EAAmB,KAAK,YAAY,EAAkB,MAAM,oBAAoB,CAAA;AAsLvF;;;;;;;GAOG;AACH,wBAAsB,mBAAmB,CACvC,GAAG,EAAE,MAAM,GACV,OAAO,CAAC;IAAE,KAAK,EAAE,UAAU,EAAE,CAAC;IAAC,OAAO,EAAE,YAAY,EAAE,CAAA;CAAE,CAAC,CAe3D"}
@@ -17,6 +17,11 @@
17
17
  * APP.md that drifted from its AGENT.md/WORKFLOW.md refs fails the same
18
18
  * way a bad `defineApp({...})` call would.
19
19
  *
20
+ * The app may also ship AIP-14 TOOL.md / AIP-30 DRIVER.md bundles under
21
+ * `.agentproto/tools/<id>/TOOL.md` and `.agentproto/drivers/<id>/DRIVER.md`
22
+ * — discovered by directory convention (see `loadAppBundledTools`), not
23
+ * declared as APP.md frontmatter refs like agents/workflows are.
24
+ *
20
25
  * Frontmatter validation here is deliberately minimal, and that is now an
21
26
  * AIP-53 conformance decision, not an accident of app having "no AIP yet":
22
27
  * AIP-53 (Draft) freezes the loader contract at the checks below — schema
@@ -28,10 +33,9 @@
28
33
  * hosts that haven't upgraded rejecting the whole app; tightening beyond
29
34
  * the spec would break that forward compatibility for no conformance gain.
30
35
  */
31
- import type { AppHandle } from "./types.js";
32
- export declare class AppLoadError extends Error {
33
- constructor(message: string);
34
- }
36
+ import type { AppHandle, AppUiBuildConfig } from "./types.js";
37
+ import { AppLoadError } from "./errors.js";
38
+ export { AppLoadError };
35
39
  /**
36
40
  * Resolve the UI ROOT directory an app's UI should be served from — the
37
41
  * same resolution `app_install`/`loadAppHandle` uses for `ui.path`, so
@@ -47,6 +51,28 @@ export declare class AppLoadError extends Error {
47
51
  * callers check APP.md existence separately.
48
52
  */
49
53
  export declare function resolveAppUIRoot(appDir: string): Promise<string | undefined>;
54
+ /** Validated `ui.path` + `ui.build`, as returned by {@link peekAppUi}. */
55
+ export interface AppUiPeek {
56
+ readonly path: string;
57
+ readonly build?: AppUiBuildConfig;
58
+ }
59
+ /**
60
+ * Peek `<appDir>/.agentproto/APP.md`'s `ui.path` + `ui.build` WITHOUT
61
+ * reading the ui html itself.
62
+ *
63
+ * `loadAppHandle` reads `ui.path` eagerly and throws {@link AppLoadError}
64
+ * when it's missing — exactly the case a declared `ui.build` exists to
65
+ * recover from. A caller that wants to build the bundle before it's
66
+ * expected to exist (the daemon's `app_install`, `app serve`, first UI
67
+ * serve — see `@agentproto/runtime`'s `ensureAppUiBuilt`) resolves this
68
+ * first, runs the build if declared, then calls `loadAppHandle` as usual.
69
+ *
70
+ * Returns `undefined` when APP.md is unreadable or declares no `ui` block
71
+ * — same "caller checks existence separately" contract as
72
+ * `resolveAppUIRoot`. Throws on a malformed `ui`/`ui.build` shape, same
73
+ * validation `loadAppHandle` would eventually hit.
74
+ */
75
+ export declare function peekAppUi(appDir: string): Promise<AppUiPeek | undefined>;
50
76
  /**
51
77
  * Load `<dir>/.agentproto/APP.md` and every AGENT.md/WORKFLOW.md (and, if
52
78
  * declared, `<dir>/WORKSPACE.md`) it references, then re-run `defineApp` on
@@ -1 +1 @@
1
- {"version":3,"file":"load-app.d.ts","sourceRoot":"","sources":["../src/load-app.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AAQH,OAAO,KAAK,EAAoE,SAAS,EAAE,MAAM,YAAY,CAAA;AAG7G,qBAAa,YAAa,SAAQ,KAAK;gBACzB,OAAO,EAAE,MAAM;CAI5B;AAwDD;;;;;;;;;;;;;GAaG;AACH,wBAAsB,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAqBlF;AAiGD;;;;;;;GAOG;AACH,wBAAsB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC,CAuFnE"}
1
+ {"version":3,"file":"load-app.d.ts","sourceRoot":"","sources":["../src/load-app.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AAQH,OAAO,KAAK,EAKV,SAAS,EACT,gBAAgB,EACjB,MAAM,YAAY,CAAA;AAEnB,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAG1C,OAAO,EAAE,YAAY,EAAE,CAAA;AAyDvB;;;;;;;;;;;;;GAaG;AACH,wBAAsB,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAqBlF;AAED,0EAA0E;AAC1E,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,KAAK,CAAC,EAAE,gBAAgB,CAAA;CAClC;AA+BD;;;;;;;;;;;;;;;GAeG;AACH,wBAAsB,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,GAAG,SAAS,CAAC,CAsB9E;AAiGD;;;;;;;GAOG;AACH,wBAAsB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC,CAoGnE"}
package/dist/types.d.ts CHANGED
@@ -19,6 +19,8 @@ import type { AgentHandle } from "@agentproto/agent";
19
19
  import type { WorkflowHandle } from "@agentproto/workflow";
20
20
  import type { WorkspaceHandle, WorkspaceDefinition } from "@agentproto/workspace";
21
21
  import type { BuildMastraAgentResult, BuildMastraAgentOptions } from "@agentproto/mastra";
22
+ import type { ToolHandle } from "@agentproto/tool";
23
+ import type { DriverHandle } from "@agentproto/driver";
22
24
  /**
23
25
  * An agent paired with the prose that becomes its system prompt. `body`
24
26
  * is the AGENT.md body (AIP-42) — the only place free-text instructions
@@ -64,6 +66,29 @@ export interface WorkspaceShorthand {
64
66
  * structurally — a built handle carries `schema: "workspace/v1"`.
65
67
  */
66
68
  export type WorkspaceInput = WorkspaceHandle | WorkspaceShorthand;
69
+ /**
70
+ * How to (re)build an `AppUiDefinition`'s on-disk bundle when it's missing
71
+ * or stale, so a repo can ship an APP.md that declares a build step instead
72
+ * of committing the generated `.agentproto/ui/index.html`. Carried verbatim
73
+ * in APP.md frontmatter (`ui.build`); app-kit itself never runs `command` —
74
+ * it stays host-agnostic (see load-app.ts's module doc) — the daemon/CLI
75
+ * do, via `@agentproto/runtime`'s `ensureAppUiBuilt` (app-ui-build.ts).
76
+ */
77
+ export interface AppUiBuildConfig {
78
+ /** Shell command line to build the UI bundle, e.g. `"pnpm run build"`. */
79
+ readonly command: string;
80
+ /** Working directory for `command` — absolute, or relative to the app
81
+ * dir. Defaults to the app dir. */
82
+ readonly cwd?: string;
83
+ /**
84
+ * Glob patterns (relative to `cwd`) whose newest mtime is compared
85
+ * against the built file's to decide staleness. Defaults to `["src/**"]`.
86
+ * Supports `**` (any number of path segments) and `*` (any characters
87
+ * within one segment) — not full glob syntax (no brace expansion, no
88
+ * negation).
89
+ */
90
+ readonly sources?: readonly string[];
91
+ }
67
92
  /**
68
93
  * A single HTML surface an app ships alongside its agents — the artifact a
69
94
  * host renders (e.g. an embedded panel). `html` is the full document; `emit`
@@ -86,6 +111,9 @@ export interface AppUiDefinition {
86
111
  readonly resourceDomains?: readonly string[];
87
112
  readonly frameDomains?: readonly string[];
88
113
  };
114
+ /** How to (re)build this UI's bundle when it's missing or stale. Absent
115
+ * means today's behavior: the bundle must already exist on disk. */
116
+ readonly build?: AppUiBuildConfig;
89
117
  }
90
118
  /**
91
119
  * A persistent HTML dashboard (Cowork artifact) the app ships alongside its
@@ -152,6 +180,17 @@ export interface AppDataDefinition {
152
180
  export interface AppDefinition {
153
181
  readonly agents?: readonly (AgentEntry | AgentHandle)[];
154
182
  readonly workflows?: readonly WorkflowHandle[];
183
+ /**
184
+ * AIP-14 TOOL.md contracts the app bundles. Normally populated by
185
+ * `loadAppHandle` from `.agentproto/tools/<id>/TOOL.md` (see
186
+ * `loadAppBundledTools`) rather than set directly by a TS author.
187
+ */
188
+ readonly tools?: readonly ToolHandle[];
189
+ /**
190
+ * AIP-30 DRIVER.md implementations the app bundles. Normally populated by
191
+ * `loadAppHandle` from `.agentproto/drivers/<id>/DRIVER.md`.
192
+ */
193
+ readonly drivers?: readonly DriverHandle[];
155
194
  /** Any other AIP handles to carry with the app (AIP-6/25/47/…). */
156
195
  readonly attach?: readonly DoctypeHandle[];
157
196
  /**
@@ -237,6 +276,10 @@ export interface EmittedApp {
237
276
  export interface AppHandle {
238
277
  readonly agents: readonly AgentEntry[];
239
278
  readonly workflows: readonly WorkflowHandle[];
279
+ /** AIP-14 TOOL.md contracts the app bundles (see {@link AppDefinition.tools}). */
280
+ readonly tools: readonly ToolHandle[];
281
+ /** AIP-30 DRIVER.md implementations the app bundles (see {@link AppDefinition.drivers}). */
282
+ readonly drivers: readonly DriverHandle[];
240
283
  readonly attachments: readonly DoctypeHandle[];
241
284
  /** The app's home workspace (AIP-34), normalized to a handle. Absent if none. */
242
285
  readonly workspace?: WorkspaceHandle;
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agentproto/app-kit",
3
- "version": "1.2.1",
3
+ "version": "1.3.1",
4
4
  "description": "@agentproto/app-kit — declare an agent (with its system prompt) and its workflows in one TypeScript module and import them anywhere. A thin umbrella over AIP-42 defineAgent + AIP-15 defineWorkflow: defineApp cross-links the two (every workflow agent-step must target the app's agent, every agent workflow ref must resolve), toMastraAgent turns the AGENT.md body into a real Mastra `instructions` field, and emit writes the .agents/<id>/AGENT.md + WORKFLOW.md(+entry) pair that runs through the agentproto-run lane unchanged.",
5
5
  "keywords": [
6
6
  "agentproto",
@@ -44,10 +44,14 @@
44
44
  "dependencies": {
45
45
  "gray-matter": "^4.0.3",
46
46
  "@agentproto/agent": "0.2.4",
47
- "@agentproto/workflow": "0.6.1",
48
- "@agentproto/workflow-loader": "0.2.3",
49
- "@agentproto/workspace": "0.1.3",
50
- "@agentproto/mastra": "0.2.14"
47
+ "@agentproto/driver": "0.2.4",
48
+ "@agentproto/driver-cli": "0.2.0",
49
+ "@agentproto/driver-http": "0.1.8",
50
+ "@agentproto/mastra": "0.2.15",
51
+ "@agentproto/tool": "0.3.1",
52
+ "@agentproto/workflow": "0.7.0",
53
+ "@agentproto/workflow-loader": "0.2.4",
54
+ "@agentproto/workspace": "0.1.3"
51
55
  },
52
56
  "peerDependencies": {
53
57
  "@mastra/core": ">=1.0.0"