@happyvertical/smrt-cli 0.55.15 → 0.55.17

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (40) hide show
  1. package/agents/app-commands.md +10 -0
  2. package/agents/kitchen.md +24 -4
  3. package/dist/{AuditLogCollection-WDHL-_AF-Cp5NKpKo.js → AuditLogCollection-WDHL-_AF-02D9mDot.js} +1 -1
  4. package/dist/{OidcIdentity-BUblgQLs-CqMp2Smf.js → OidcIdentity-BUblgQLs-hzB0lrxA.js} +2 -2
  5. package/dist/{OidcIdentityCollection-ClOyaHeF-l1ifhCWu.js → OidcIdentityCollection-ClOyaHeF-D7aAvcYW.js} +1 -1
  6. package/dist/{ProfileAssetCollection-CRMcjLJ--Bh5AcTQv.js → ProfileAssetCollection-CRMcjLJ--CRQsOHTZ.js} +3 -3
  7. package/dist/{ProfileCollection-C4INKh7Y-DH_e1QdB.js → ProfileCollection-C4INKh7Y-DUcvwlG4.js} +17 -17
  8. package/dist/{ProfileLinkCollection-DFfZRsgv-BGLiIASL.js → ProfileLinkCollection-DFfZRsgv-4ulMzaJO.js} +2 -2
  9. package/dist/{ProfileMetadataCollection-BIYKy4Y3-DSVsCaCz.js → ProfileMetadataCollection-BIYKy4Y3-BGVdmb-k.js} +1 -1
  10. package/dist/{ProfileMetafieldCollection-Buz7gzag-cxq_JG8K.js → ProfileMetafieldCollection-Buz7gzag-Cuuzb-Yt.js} +1 -1
  11. package/dist/{ProfileRelationshipCollection-C4g_QLI4-DCxIpptB.js → ProfileRelationshipCollection-C4g_QLI4-DHnLSOex.js} +1 -1
  12. package/dist/{ProfileTypeCollection-B7kwi1mU-BzT8PP3l.js → ProfileTypeCollection-B7kwi1mU-tffgStmE.js} +2 -2
  13. package/dist/app/cli.d.ts.map +1 -1
  14. package/dist/app/operations.d.ts.map +1 -1
  15. package/dist/app.js +2 -2
  16. package/dist/{cli-OZsH5cdL.js → cli-FDpY0gCt.js} +51 -5
  17. package/dist/commands/kitchen/mcp/bridge.d.ts +3 -0
  18. package/dist/commands/kitchen/mcp/bridge.d.ts.map +1 -0
  19. package/dist/commands/kitchen/mcp/preview.d.ts +8 -0
  20. package/dist/commands/kitchen/mcp/preview.d.ts.map +1 -0
  21. package/dist/commands/kitchen/mcp/server.d.ts.map +1 -1
  22. package/dist/commands/kitchen/mcp/tools.d.ts +21 -2
  23. package/dist/commands/kitchen/mcp/tools.d.ts.map +1 -1
  24. package/dist/commands/kitchen/mcp/ui.d.ts +40 -0
  25. package/dist/commands/kitchen/mcp/ui.d.ts.map +1 -0
  26. package/dist/commands/kitchen.d.ts.map +1 -1
  27. package/dist/{commands-Cut_g1l0.js → commands-Cve0qfxc.js} +30 -4
  28. package/dist/{dist-DoeiKxBG.js → dist-BQ5ZrH9U.js} +16 -16
  29. package/dist/{dist-CSWROA_j.js → dist-BQjejZ0-.js} +3 -3
  30. package/dist/{dist-Daxp0QSv.js → dist-BtlfVNPV.js} +4 -4
  31. package/dist/{dist-DuLsatO8.js → dist-C_pNF2sM.js} +2 -2
  32. package/dist/dist-DHRli5Sc.js +21 -0
  33. package/dist/index.js +12 -12
  34. package/dist/{oidcProvisioningPrimitives-DNP9EZlU-DNut7Q6q.js → oidcProvisioningPrimitives-DNP9EZlU-B5DmitVf.js} +3 -3
  35. package/dist/{portability-CES1YC2m.js → portability-BbltyqQ-.js} +1 -1
  36. package/dist/{resolveIdentity-CkyqvctR-BBpXD0_v.js → resolveIdentity-CkyqvctR-BDafA2yA.js} +14 -14
  37. package/dist/{server-Dp096tZj.js → server-C69K3w-t.js} +682 -39
  38. package/package.json +10 -10
  39. package/scripts/verify-package-types-exports.js +6 -1
  40. package/dist/dist-Du1UPfme.js +0 -21
@@ -75,6 +75,16 @@ config loading; `bin/smrt.js` imports `dist/` in-process so SIGTERM reaches
75
75
  `/setup?token=` URL only to an interactive terminal (`io.operatorTerminal`,
76
76
  stderr when both stdio are TTYs), never to stdout/stderr logs or pipes. The
77
77
  web runtime deletes the files after a successful owner claim.
78
+ - **`open` port resolution** (#3857): `open` probes `/api/_runtime/health` from
79
+ the configured `PORT` (default 5173) through the next ten ports (Vite's
80
+ fallback range) and takes the first whose `application` equals this app's id,
81
+ so a busy port held by another app is skipped. The printed `url` and the
82
+ retained onboarding launch file follow that port. Output carries
83
+ `serverRunning`: `false` when nothing answered (the configured port is kept).
84
+ `setup`/`recover` run before a server exists, so their retained invitation
85
+ keeps the configured port until `open` rewrites it. `smrt app <op> --help`
86
+ prints usage for every operation except `dev`/`build`/`vite` (Vite's help)
87
+ and `token` (its own).
78
88
  - **`token`** (`tokens.ts`, local only): parses every argument before touching
79
89
  state, opens `openLocalMcpTokenStore` (validated custody, uncached
80
90
  connection, no writer lease, so it runs beside `app:start`), and serializes
package/agents/kitchen.md CHANGED
@@ -92,7 +92,7 @@ Set `SMRT_PLANNER_DIR=<packaged planner checkout>` to also run the suite against
92
92
  ## `smrt kitchen mcp` (#3752)
93
93
 
94
94
  ```
95
- smrt kitchen mcp [--template <t>] [--manifests <p>]... [--no-registry] [--packages <name>]... [--library <dir>]...
95
+ smrt kitchen mcp [--template <t>] [--manifests <p>]... [--no-registry] [--packages <name>]... [--library <dir>]... [--plans-dir <dir>] [--preview-port <n> --preview-origin <local-origin>]
96
96
  ```
97
97
 
98
98
  A stdio MCP server (`@modelcontextprotocol/server`, `serveStdio`) for the local
@@ -112,10 +112,18 @@ client), `__tests__/kitchen-plugin.test.ts` (plugin files against the Agent Plug
112
112
  | `start_plan` | not read-only, not destructive | empty, or from a library cookbook; returns `planId` |
113
113
  | `run_commands` | idempotent | one atomic `engine.batch` (`id`, `expectedRevision` pass through); a lone `undo` runs as a command |
114
114
  | `get_plan`, `validate_plan`, `export_plan` | read-only | `validate_plan` = engine `validate` + `validateCookbookText` against the catalog's manifests |
115
+ | `open_preview` | read-only | URL for the same plan in the local development app shell when the preview bridge is enabled; binds the plan so the bridge will serve it |
115
116
  | `apply_plan` | destructive, idempotent, open-world | `createCookbookApplier` (= `cookbook apply`); absolute `dir`; **writes only with `confirm: true` + the preview's `confirmCode`** (sha256 of dir, server template and exported plan, so a changed plan or dir needs a new preview), otherwise (or with `dryRun`) a preview + `confirmation_required`; template is the server's `--template` only; `install` defaults to false and its output goes to stderr; templates containing symlinks are refused |
116
117
 
117
- - **Plans** live in the server process, keyed by `plan-<8 hex>` (20 kept, oldest dropped); a restart
118
- forgets them. `smrt.cookbook.json` in the project (written by apply) is the durable copy.
118
+ - **Plans** are stored in `--plans-dir` as private engine-state JSON files when set. This
119
+ retains the revision and idempotency journal across server restarts. Undo handles
120
+ remain available within the running process; a restart clears them. Writes to
121
+ a shared plans directory use a per-plan cross-process lock so stale revisions
122
+ cannot both succeed. Otherwise plans live
123
+ in server memory (20 kept, oldest dropped). `smrt.cookbook.json` in the project
124
+ (written by apply) is the applied copy.
125
+ - **Preview** binds to `127.0.0.1` and accepts only the configured loopback
126
+ browser origin. The app shell and MCP tools call the same `KitchenSession`.
119
127
  - **Catalog** is built lazily on first use, once: manifests are resolved for the library's recipes
120
128
  exactly like `cookbook validate` (`--manifests`, workspace, `node_modules`, registry unless
121
129
  `--no-registry`; `--packages` adds more) and turned into `EngineCatalog` (`catalog.ts`: recipes from
@@ -124,5 +132,17 @@ client), `__tests__/kitchen-plugin.test.ts` (plugin files against the Agent Plug
124
132
  (no recipe-id enums) so `tools/list` never waits on the network; `search_recipes` is the id source.
125
133
  - **Output**: every tool returns compact text for the model plus `structuredContent` that matches its
126
134
  `outputSchema` (`ok` always; `error {code,message,path?,details?}` when false, with `isError`).
127
- - Not here: the MCP Apps planner widget (see the plugin README), remote/HTTP transport.
135
+ - Optional UI: `--ui-smoke` registers a static capability resource and `kitchen_ui_smoke`;
136
+ `--planner-ui /absolute/path/app/mcp.html` registers a content-versioned Planner resource
137
+ and `render_plan`. The planning tools have no UI template and keep working if
138
+ the optional artifact is missing. The operator supplies self-contained HTML
139
+ built in smrt-planner. The separate preview is loopback HTTP only.
140
+ - `start_plan`, `get_plan`, and `run_commands` return `state: { snapshot, cookbook }`
141
+ atomically. Read this field for live UI state; replayed command receipts and their
142
+ original snapshots retain their previous meaning. The app bridge allows
143
+ get/run/export/validate plus its UI reload check. It sizes the app to the host frame, not its
144
+ content: `hostContext.containerDimensions.maxHeight`, else 720px; a host-fixed height or
145
+ fullscreen gets no size report.
146
+ - Not here: public or remote HTTP transport. See the plugin README for local build/install and
147
+ the explicit manual desktop capability check.
128
148
 
@@ -1,5 +1,5 @@
1
1
  import { t as __exportAll } from "./rolldown-runtime-8H4AJuhK.js";
2
- import { i as tenantId, r as TenantScoped } from "./dist-DuLsatO8.js";
2
+ import { i as tenantId, r as TenantScoped } from "./dist-C_pNF2sM.js";
3
3
  import { n as __exportAll$1 } from "./NostrIdentity-AC8fAdxe-DKxKyu_a.js";
4
4
  import { SmrtCollection, SmrtObject, field, foreignKey, smrt } from "@happyvertical/smrt-core";
5
5
  //#region ../profiles/dist/chunks/AuditLogCollection-WDHL-_AF.js
@@ -42,7 +42,7 @@ var OidcIdentity = class extends SmrtObject {
42
42
  * Find identity by issuer and subject
43
43
  */
44
44
  static async findBySubject(issuer, subject, options = {}) {
45
- const { OidcIdentityCollection } = await import("./OidcIdentityCollection-ClOyaHeF-l1ifhCWu.js").then((n) => n.r).then((n) => n.r);
45
+ const { OidcIdentityCollection } = await import("./OidcIdentityCollection-ClOyaHeF-D7aAvcYW.js").then((n) => n.r).then((n) => n.r);
46
46
  return await (await OidcIdentityCollection.create(options)).findBySubject(issuer, subject);
47
47
  }
48
48
  /** Build the collision-free natural key for one OIDC issuer subject. */
@@ -65,7 +65,7 @@ var OidcIdentity = class extends SmrtObject {
65
65
  static async findOrCreate(profile, oidcData, options = {}) {
66
66
  const profileId = profile.id;
67
67
  if (typeof profileId !== "string" || !profileId) throw new Error("OidcIdentity.findOrCreate() requires a saved Profile.");
68
- const { reuseExistingOidcIdentityForProfile } = await import("./resolveIdentity-CkyqvctR-BBpXD0_v.js").then((n) => n.i).then((n) => n.i);
68
+ const { reuseExistingOidcIdentityForProfile } = await import("./resolveIdentity-CkyqvctR-BDafA2yA.js").then((n) => n.i).then((n) => n.i);
69
69
  const profileOptions = profile.options ?? {};
70
70
  return (await reuseExistingOidcIdentityForProfile(profileId, {
71
71
  email: oidcData.email,
@@ -1,6 +1,6 @@
1
1
  import { t as __exportAll } from "./rolldown-runtime-8H4AJuhK.js";
2
2
  import { n as __exportAll$1 } from "./NostrIdentity-AC8fAdxe-DKxKyu_a.js";
3
- import { t as OidcIdentity } from "./OidcIdentity-BUblgQLs-CqMp2Smf.js";
3
+ import { t as OidcIdentity } from "./OidcIdentity-BUblgQLs-hzB0lrxA.js";
4
4
  import { SmrtCollection } from "@happyvertical/smrt-core";
5
5
  //#region ../profiles/dist/chunks/OidcIdentityCollection-ClOyaHeF.js
6
6
  var OidcIdentityCollection_ClOyaHeF_exports = /* @__PURE__ */ __exportAll({
@@ -1,7 +1,7 @@
1
1
  import { t as __exportAll } from "./rolldown-runtime-8H4AJuhK.js";
2
- import { i as tenantId, r as TenantScoped } from "./dist-DuLsatO8.js";
2
+ import { i as tenantId, r as TenantScoped } from "./dist-C_pNF2sM.js";
3
3
  import { n as __exportAll$1 } from "./NostrIdentity-AC8fAdxe-DKxKyu_a.js";
4
- import { a as getOwnedAssetsFromCollection, o as removeOwnedAssetFromCollection, t as addOwnedAssetFromCollection } from "./dist-CSWROA_j.js";
4
+ import { a as getOwnedAssetsFromCollection, o as removeOwnedAssetFromCollection, t as addOwnedAssetFromCollection } from "./dist-BQjejZ0-.js";
5
5
  import { SmrtJunction, SmrtObject, crossPackageRef, field, foreignKey, smrt } from "@happyvertical/smrt-core";
6
6
  //#region ../profiles/dist/chunks/ProfileAssetCollection-CRMcjLJ-.js
7
7
  var ProfileAssetCollection_CRMcjLJ__exports = /* @__PURE__ */ __exportAll({
@@ -84,7 +84,7 @@ var ProfileAssetCollection = class extends SmrtJunction {
84
84
  profileCollectionPromise = null;
85
85
  async getProfileCollection() {
86
86
  if (!this.profileCollectionPromise) {
87
- const { ProfileCollection } = await import("./ProfileCollection-C4INKh7Y-DH_e1QdB.js").then((n) => n.o).then((n) => n.r);
87
+ const { ProfileCollection } = await import("./ProfileCollection-C4INKh7Y-DUcvwlG4.js").then((n) => n.o).then((n) => n.r);
88
88
  this.profileCollectionPromise = ProfileCollection.create({ db: this.db });
89
89
  }
90
90
  return this.profileCollectionPromise;
@@ -1,7 +1,7 @@
1
1
  import { t as __exportAll } from "./rolldown-runtime-8H4AJuhK.js";
2
- import { a as queryGlobal, c as getTenantId, i as tenantId, n as resolvePrompt, o as queryWithGlobals, r as TenantScoped, t as definePrompt, u as withSystemContext } from "./dist-DuLsatO8.js";
2
+ import { a as queryGlobal, c as getTenantId, i as tenantId, n as resolvePrompt, o as queryWithGlobals, r as TenantScoped, t as definePrompt, u as withSystemContext } from "./dist-C_pNF2sM.js";
3
3
  import { n as __exportAll$1 } from "./NostrIdentity-AC8fAdxe-DKxKyu_a.js";
4
- import { a as getOwnedAssetsFromCollection, i as assertValidOwnedAssetSortOrder, n as assertAssetLinkable, o as removeOwnedAssetFromCollection, r as assertValidOwnedAssetRelationship, s as resolveOwnedAssetsById, t as addOwnedAssetFromCollection } from "./dist-CSWROA_j.js";
4
+ import { a as getOwnedAssetsFromCollection, i as assertValidOwnedAssetSortOrder, n as assertAssetLinkable, o as removeOwnedAssetFromCollection, r as assertValidOwnedAssetRelationship, s as resolveOwnedAssetsById, t as addOwnedAssetFromCollection } from "./dist-BQjejZ0-.js";
5
5
  import { RuntimeError, SmrtCollection, SmrtObject, ValidationError, field, foreignKey, isAbortedTransactionError, oneToMany, smrt } from "@happyvertical/smrt-core";
6
6
  import { BackfillTableUnavailableError, BackfillTracker } from "@happyvertical/smrt-core/migrations";
7
7
  //#region ../profiles/dist/chunks/ProfileCollection-C4INKh7Y.js
@@ -435,7 +435,7 @@ var Profile = class extends SmrtObject {
435
435
  async getTypeSlug() {
436
436
  const tenantId2 = this.tenantId || getTenantId();
437
437
  if (this.typeId && tenantId2) {
438
- const { ProfileTypeCollection } = await import("./ProfileTypeCollection-B7kwi1mU-BzT8PP3l.js").then((n) => n.n).then((n) => n.n);
438
+ const { ProfileTypeCollection } = await import("./ProfileTypeCollection-B7kwi1mU-tffgStmE.js").then((n) => n.n).then((n) => n.n);
439
439
  return (await (await ProfileTypeCollection.create(this.options)).getAvailableById(this.typeId, tenantId2))?.slug ?? "";
440
440
  }
441
441
  return (await this.loadRelated("typeId"))?.slug || "";
@@ -458,8 +458,8 @@ var Profile = class extends SmrtObject {
458
458
  * @param value - The value to set
459
459
  */
460
460
  async addMetadata(metafieldSlug, value) {
461
- const { ProfileMetafieldCollection } = await import("./ProfileMetafieldCollection-Buz7gzag-cxq_JG8K.js").then((n) => n.r).then((n) => n.n);
462
- const { ProfileMetadataCollection } = await import("./ProfileMetadataCollection-BIYKy4Y3-DSVsCaCz.js").then((n) => n.r).then((n) => n.n);
461
+ const { ProfileMetafieldCollection } = await import("./ProfileMetafieldCollection-Buz7gzag-Cuuzb-Yt.js").then((n) => n.r).then((n) => n.n);
462
+ const { ProfileMetadataCollection } = await import("./ProfileMetadataCollection-BIYKy4Y3-BGVdmb-k.js").then((n) => n.r).then((n) => n.n);
463
463
  const metafield = await this.resolveMetafield(await ProfileMetafieldCollection.create(this.options), metafieldSlug);
464
464
  if (!metafield) throw new Error(`Metafield '${metafieldSlug}' not found`);
465
465
  await metafield.validateValue(value);
@@ -492,7 +492,7 @@ var Profile = class extends SmrtObject {
492
492
  * @returns Object with metafield slugs as keys
493
493
  */
494
494
  async getMetadata() {
495
- const { ProfileMetadataCollection } = await import("./ProfileMetadataCollection-BIYKy4Y3-DSVsCaCz.js").then((n) => n.r).then((n) => n.n);
495
+ const { ProfileMetadataCollection } = await import("./ProfileMetadataCollection-BIYKy4Y3-BGVdmb-k.js").then((n) => n.r).then((n) => n.n);
496
496
  return await (await ProfileMetadataCollection.create(this.options)).getMetadataObject(this.id);
497
497
  }
498
498
  /**
@@ -509,8 +509,8 @@ var Profile = class extends SmrtObject {
509
509
  * @param metafieldSlug - The slug of the metafield to remove
510
510
  */
511
511
  async removeMetadata(metafieldSlug) {
512
- const { ProfileMetafieldCollection } = await import("./ProfileMetafieldCollection-Buz7gzag-cxq_JG8K.js").then((n) => n.r).then((n) => n.n);
513
- const { ProfileMetadataCollection } = await import("./ProfileMetadataCollection-BIYKy4Y3-DSVsCaCz.js").then((n) => n.r).then((n) => n.n);
512
+ const { ProfileMetafieldCollection } = await import("./ProfileMetafieldCollection-Buz7gzag-Cuuzb-Yt.js").then((n) => n.r).then((n) => n.n);
513
+ const { ProfileMetadataCollection } = await import("./ProfileMetadataCollection-BIYKy4Y3-BGVdmb-k.js").then((n) => n.r).then((n) => n.n);
514
514
  const metafield = await this.resolveMetafield(await ProfileMetafieldCollection.create(this.options), metafieldSlug);
515
515
  if (!metafield) throw new Error(`Metafield '${metafieldSlug}' not found`);
516
516
  const existing = await (await ProfileMetadataCollection.create(this.options)).list({
@@ -535,7 +535,7 @@ var Profile = class extends SmrtObject {
535
535
  return candidates.find((candidate) => ownerTenantId && candidate.tenantId === ownerTenantId) ?? candidates.find((candidate) => !candidate.tenantId) ?? null;
536
536
  }
537
537
  async getProfileLinkCollection() {
538
- const { ProfileLinkCollection } = await import("./ProfileLinkCollection-DFfZRsgv-BGLiIASL.js").then((n) => n.i).then((n) => n.r);
538
+ const { ProfileLinkCollection } = await import("./ProfileLinkCollection-DFfZRsgv-4ulMzaJO.js").then((n) => n.i).then((n) => n.r);
539
539
  return ProfileLinkCollection.create({ db: this.db });
540
540
  }
541
541
  /** This profile's web links in display order. */
@@ -552,7 +552,7 @@ var Profile = class extends SmrtObject {
552
552
  return (await this.getProfileLinkCollection()).replaceForProfile(this.id, links);
553
553
  }
554
554
  async getProfileAssetCollection() {
555
- const { ProfileAssetCollection } = await import("./ProfileAssetCollection-CRMcjLJ--Bh5AcTQv.js").then((n) => n.r).then((n) => n.n);
555
+ const { ProfileAssetCollection } = await import("./ProfileAssetCollection-CRMcjLJ--CRQsOHTZ.js").then((n) => n.r).then((n) => n.n);
556
556
  return ProfileAssetCollection.create({ db: this.db });
557
557
  }
558
558
  async getAssets(relationship) {
@@ -584,7 +584,7 @@ var Profile = class extends SmrtObject {
584
584
  */
585
585
  async addRelationship(toProfile, relationshipSlug, contextProfile) {
586
586
  const { ProfileRelationshipTypeCollection } = await import("./ProfileRelationshipTypeCollection-_n22WqTb-DiZUWvev.js").then((n) => n.n).then((n) => n.n);
587
- const { ProfileRelationshipCollection } = await import("./ProfileRelationshipCollection-C4g_QLI4-DCxIpptB.js").then((n) => n.r).then((n) => n.n);
587
+ const { ProfileRelationshipCollection } = await import("./ProfileRelationshipCollection-C4g_QLI4-DHnLSOex.js").then((n) => n.r).then((n) => n.n);
588
588
  const { ProfileRelationshipType } = await import("./ProfileRelationshipType-U7IwF6Wf-DNavf24e.js").then((n) => n.n).then((n) => n.n);
589
589
  const relationshipType = await (await ProfileRelationshipTypeCollection.create(this.options)).getBySlug(relationshipSlug);
590
590
  if (!relationshipType) throw new Error(`Relationship type '${relationshipSlug}' not found`);
@@ -609,7 +609,7 @@ var Profile = class extends SmrtObject {
609
609
  * @returns Array of ProfileRelationship instances
610
610
  */
611
611
  async getRelationships(options) {
612
- const { ProfileRelationshipCollection } = await import("./ProfileRelationshipCollection-C4g_QLI4-DCxIpptB.js").then((n) => n.r).then((n) => n.n);
612
+ const { ProfileRelationshipCollection } = await import("./ProfileRelationshipCollection-C4g_QLI4-DHnLSOex.js").then((n) => n.r).then((n) => n.n);
613
613
  const { ProfileRelationshipTypeCollection } = await import("./ProfileRelationshipTypeCollection-_n22WqTb-DiZUWvev.js").then((n) => n.n).then((n) => n.n);
614
614
  const relationshipCollection = await ProfileRelationshipCollection.create(this.options);
615
615
  const direction = options?.direction || "all";
@@ -654,7 +654,7 @@ var Profile = class extends SmrtObject {
654
654
  */
655
655
  async removeRelationship(toProfile, relationshipSlug) {
656
656
  const { ProfileRelationshipTypeCollection } = await import("./ProfileRelationshipTypeCollection-_n22WqTb-DiZUWvev.js").then((n) => n.n).then((n) => n.n);
657
- const { ProfileRelationshipCollection } = await import("./ProfileRelationshipCollection-C4g_QLI4-DCxIpptB.js").then((n) => n.r).then((n) => n.n);
657
+ const { ProfileRelationshipCollection } = await import("./ProfileRelationshipCollection-C4g_QLI4-DHnLSOex.js").then((n) => n.r).then((n) => n.n);
658
658
  const relationshipType = await (await ProfileRelationshipTypeCollection.create(this.options)).getBySlug(relationshipSlug);
659
659
  if (!relationshipType) throw new Error(`Relationship type '${relationshipSlug}' not found`);
660
660
  const relationshipCollection = await ProfileRelationshipCollection.create(this.options);
@@ -778,7 +778,7 @@ var Profile = class extends SmrtObject {
778
778
  * @returns Array of OIDC identity records
779
779
  */
780
780
  async getOidcIdentities() {
781
- const { OidcIdentityCollection } = await import("./OidcIdentityCollection-ClOyaHeF-l1ifhCWu.js").then((n) => n.r).then((n) => n.r);
781
+ const { OidcIdentityCollection } = await import("./OidcIdentityCollection-ClOyaHeF-D7aAvcYW.js").then((n) => n.r).then((n) => n.r);
782
782
  return await (await OidcIdentityCollection.create(this.options)).findByProfile(this.id);
783
783
  }
784
784
  /**
@@ -791,7 +791,7 @@ var Profile = class extends SmrtObject {
791
791
  * type, but refuses to create or rebind authority.
792
792
  */
793
793
  async linkOidcIdentity(oidcData) {
794
- const { OidcIdentityCollection } = await import("./OidcIdentityCollection-ClOyaHeF-l1ifhCWu.js").then((n) => n.r).then((n) => n.r);
794
+ const { OidcIdentityCollection } = await import("./OidcIdentityCollection-ClOyaHeF-D7aAvcYW.js").then((n) => n.r).then((n) => n.r);
795
795
  return await (await OidcIdentityCollection.create(this.options)).linkToProfile(this, oidcData);
796
796
  }
797
797
  /**
@@ -820,7 +820,7 @@ var Profile = class extends SmrtObject {
820
820
  * @returns Array of audit log entries
821
821
  */
822
822
  async getAuditLogs(limit = 50) {
823
- const { AuditLogCollection } = await import("./AuditLogCollection-WDHL-_AF-Cp5NKpKo.js").then((n) => n.r).then((n) => n.n);
823
+ const { AuditLogCollection } = await import("./AuditLogCollection-WDHL-_AF-02D9mDot.js").then((n) => n.r).then((n) => n.n);
824
824
  return await (await AuditLogCollection.create(this.options)).getRecentActivity(this.id, limit);
825
825
  }
826
826
  /**
@@ -830,7 +830,7 @@ var Profile = class extends SmrtObject {
830
830
  * @returns The created audit log entry
831
831
  */
832
832
  async recordAction(options) {
833
- const { AuditLogCollection } = await import("./AuditLogCollection-WDHL-_AF-Cp5NKpKo.js").then((n) => n.r).then((n) => n.n);
833
+ const { AuditLogCollection } = await import("./AuditLogCollection-WDHL-_AF-02D9mDot.js").then((n) => n.r).then((n) => n.n);
834
834
  return await (await AuditLogCollection.create(this.options)).record({
835
835
  profile: this,
836
836
  ...options
@@ -1,5 +1,5 @@
1
1
  import { t as __exportAll } from "./rolldown-runtime-8H4AJuhK.js";
2
- import { i as tenantId, r as TenantScoped } from "./dist-DuLsatO8.js";
2
+ import { i as tenantId, r as TenantScoped } from "./dist-C_pNF2sM.js";
3
3
  import { n as __exportAll$1 } from "./NostrIdentity-AC8fAdxe-DKxKyu_a.js";
4
4
  import { SmrtCollection, SmrtObject, field, foreignKey, isEmbeddedDatabase, smrt, withEmbeddedWriteTransaction } from "@happyvertical/smrt-core";
5
5
  //#region ../profiles/dist/chunks/ProfileLinkCollection-DFfZRsgv.js
@@ -203,7 +203,7 @@ var ProfileLinkCollection = class ProfileLinkCollection extends SmrtCollection {
203
203
  /** The profile's tenant; throws when the profile is not visible here. */
204
204
  async requireProfileTenant(profileId) {
205
205
  if (!profileId) throw new Error("A profile link needs a profile");
206
- const { ProfileCollection } = await import("./ProfileCollection-C4INKh7Y-DH_e1QdB.js").then((n) => n.o).then((n) => n.r);
206
+ const { ProfileCollection } = await import("./ProfileCollection-C4INKh7Y-DUcvwlG4.js").then((n) => n.o).then((n) => n.r);
207
207
  const profile = await (await ProfileCollection.create({ db: this.db })).get({ id: profileId });
208
208
  if (!profile) throw new Error(`Profile '${profileId}' not found`);
209
209
  return profile.tenantId ?? null;
@@ -1,5 +1,5 @@
1
1
  import { t as __exportAll } from "./rolldown-runtime-8H4AJuhK.js";
2
- import { i as tenantId, r as TenantScoped } from "./dist-DuLsatO8.js";
2
+ import { i as tenantId, r as TenantScoped } from "./dist-C_pNF2sM.js";
3
3
  import { n as __exportAll$1 } from "./NostrIdentity-AC8fAdxe-DKxKyu_a.js";
4
4
  import { SmrtCollection, SmrtObject, field, foreignKey, smrt } from "@happyvertical/smrt-core";
5
5
  //#region ../profiles/dist/chunks/ProfileMetadataCollection-BIYKy4Y3.js
@@ -1,5 +1,5 @@
1
1
  import { t as __exportAll } from "./rolldown-runtime-8H4AJuhK.js";
2
- import { i as tenantId, r as TenantScoped } from "./dist-DuLsatO8.js";
2
+ import { i as tenantId, r as TenantScoped } from "./dist-C_pNF2sM.js";
3
3
  import { n as __exportAll$1 } from "./NostrIdentity-AC8fAdxe-DKxKyu_a.js";
4
4
  import { SmrtCollection, SmrtObject, field, smrt } from "@happyvertical/smrt-core";
5
5
  //#region ../profiles/dist/chunks/ProfileMetafieldCollection-Buz7gzag.js
@@ -1,5 +1,5 @@
1
1
  import { t as __exportAll } from "./rolldown-runtime-8H4AJuhK.js";
2
- import { i as tenantId, r as TenantScoped } from "./dist-DuLsatO8.js";
2
+ import { i as tenantId, r as TenantScoped } from "./dist-C_pNF2sM.js";
3
3
  import { n as __exportAll$1 } from "./NostrIdentity-AC8fAdxe-DKxKyu_a.js";
4
4
  import { SmrtCollection, SmrtObject, foreignKey, oneToMany, smrt } from "@happyvertical/smrt-core";
5
5
  //#region ../profiles/dist/chunks/ProfileRelationshipCollection-C4g_QLI4.js
@@ -1,7 +1,7 @@
1
1
  import { t as __exportAll } from "./rolldown-runtime-8H4AJuhK.js";
2
- import { l as isSystemContext, s as withTenantGlobalRead } from "./dist-DuLsatO8.js";
2
+ import { l as isSystemContext, s as withTenantGlobalRead } from "./dist-C_pNF2sM.js";
3
3
  import { n as __exportAll$1 } from "./NostrIdentity-AC8fAdxe-DKxKyu_a.js";
4
- import { s as ProfileType } from "./ProfileCollection-C4INKh7Y-DH_e1QdB.js";
4
+ import { s as ProfileType } from "./ProfileCollection-C4INKh7Y-DUcvwlG4.js";
5
5
  import { SmrtCollection } from "@happyvertical/smrt-core";
6
6
  //#region ../profiles/dist/chunks/ProfileTypeCollection-B7kwi1mU.js
7
7
  var ProfileTypeCollection_B7kwi1mU_exports = /* @__PURE__ */ __exportAll({
@@ -1 +1 @@
1
- {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../../src/app/cli.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAiBH,OAAO,EACL,KAAK,sBAAsB,EAC3B,KAAK,YAAY,EAKlB,MAAM,cAAc,CAAC;AAGtB,qDAAqD;AACrD,eAAO,MAAM,YAAY,8DACoC,CAAC;AAE9D,8EAA8E;AAC9E,eAAO,MAAM,YAAY,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAoBxD,CAAC;AAEH,yCAAyC;AACzC,MAAM,WAAW,oBAAoB;IACnC,qDAAqD;IACrD,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,qDAAqD;IACrD,EAAE,CAAC,EAAE,OAAO,CAAC,YAAY,CAAC,CAAC;IAC3B,iDAAiD;IACjD,YAAY,CAAC,EAAE,OAAO,CAAC,sBAAsB,CAAC,CAAC;CAChD;AAED,sDAAsD;AACtD,MAAM,WAAW,gBAAgB;IAC/B,aAAa,EAAE,CAAC,CAAC;IACjB,MAAM,EAAE,OAAO,CAAC;IAChB,IAAI,EAAE,kBAAkB,CAAC;IACzB,kFAAkF;IAClF,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB;;;OAGG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,wEAAwE;IACxE,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,oBAAoB,EAAE,KAAK,CAAC;CAC7B;AAED,wEAAwE;AACxE,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG,gBAAgB,CA+B9D;AAED,+BAA+B;AAC/B,wBAAgB,aAAa,IAAI,MAAM,CAMtC;AAWD;;;;;GAKG;AACH,wBAAsB,aAAa,CACjC,IAAI,EAAE,MAAM,EAAE,EACd,OAAO,GAAE,oBAAyB,GACjC,OAAO,CAAC,MAAM,CAAC,CAkEjB"}
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../../src/app/cli.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAiBH,OAAO,EACL,KAAK,sBAAsB,EAC3B,KAAK,YAAY,EAKlB,MAAM,cAAc,CAAC;AAGtB,qDAAqD;AACrD,eAAO,MAAM,YAAY,8DACoC,CAAC;AAE9D,8EAA8E;AAC9E,eAAO,MAAM,YAAY,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAoBxD,CAAC;AAEH,yCAAyC;AACzC,MAAM,WAAW,oBAAoB;IACnC,qDAAqD;IACrD,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,qDAAqD;IACrD,EAAE,CAAC,EAAE,OAAO,CAAC,YAAY,CAAC,CAAC;IAC3B,iDAAiD;IACjD,YAAY,CAAC,EAAE,OAAO,CAAC,sBAAsB,CAAC,CAAC;CAChD;AAED,sDAAsD;AACtD,MAAM,WAAW,gBAAgB;IAC/B,aAAa,EAAE,CAAC,CAAC;IACjB,MAAM,EAAE,OAAO,CAAC;IAChB,IAAI,EAAE,kBAAkB,CAAC;IACzB,kFAAkF;IAClF,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB;;;OAGG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,wEAAwE;IACxE,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,oBAAoB,EAAE,KAAK,CAAC;CAC7B;AAED,wEAAwE;AACxE,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG,gBAAgB,CA+B9D;AAED,+BAA+B;AAC/B,wBAAgB,aAAa,IAAI,MAAM,CAMtC;AAWD;;;;;GAKG;AACH,wBAAsB,aAAa,CACjC,IAAI,EAAE,MAAM,EAAE,EACd,OAAO,GAAE,oBAAyB,GACjC,OAAO,CAAC,MAAM,CAAC,CA0EjB"}
@@ -1 +1 @@
1
- {"version":3,"file":"operations.d.ts","sourceRoot":"","sources":["../../src/app/operations.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AA6BH,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,4BAA4B,CAAC;AAY7E,OAAO,KAAK,EACV,YAAY,EACZ,YAAY,EACZ,kBAAkB,EACnB,MAAM,kBAAkB,CAAC;AAO1B,OAAO,EACL,KAAK,UAAU,EAIhB,MAAM,cAAc,CAAC;AAEtB,6CAA6C;AAC7C,eAAO,MAAM,cAAc,2GAWjB,CAAC;AAEX,qCAAqC;AACrC,MAAM,MAAM,YAAY,GAAG,CAAC,OAAO,cAAc,CAAC,CAAC,MAAM,CAAC,CAAC;AAuH3D,sDAAsD;AACtD,wBAAsB,oBAAoB,CACxC,OAAO,EAAE,UAAU,EACnB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,0BAA0B,CAAC,CAQrC;AAyPD,sEAAsE;AACtE,eAAO,MAAM,uBAAuB,QAAW,CAAC;AAiZhD,0EAA0E;AAC1E,MAAM,WAAW,kBAAkB;IACjC,iBAAiB,CAAC,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;IACtE,iBAAiB,CAAC,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;CACvE;AAkFD;;;GAGG;AACH,wBAAsB,uBAAuB,CAC3C,OAAO,EAAE,UAAU,EACnB,SAAS,EAAE,YAAY,EACvB,IAAI,EAAE,MAAM,EAAE,GACb,OAAO,CAAC,MAAM,CAAC,CAkEjB"}
1
+ {"version":3,"file":"operations.d.ts","sourceRoot":"","sources":["../../src/app/operations.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AA6BH,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,4BAA4B,CAAC;AAY7E,OAAO,KAAK,EACV,YAAY,EACZ,YAAY,EACZ,kBAAkB,EACnB,MAAM,kBAAkB,CAAC;AAO1B,OAAO,EACL,KAAK,UAAU,EAIhB,MAAM,cAAc,CAAC;AAEtB,6CAA6C;AAC7C,eAAO,MAAM,cAAc,2GAWjB,CAAC;AAEX,qCAAqC;AACrC,MAAM,MAAM,YAAY,GAAG,CAAC,OAAO,cAAc,CAAC,CAAC,MAAM,CAAC,CAAC;AAuH3D,sDAAsD;AACtD,wBAAsB,oBAAoB,CACxC,OAAO,EAAE,UAAU,EACnB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,0BAA0B,CAAC,CAQrC;AAyPD,sEAAsE;AACtE,eAAO,MAAM,uBAAuB,QAAW,CAAC;AAuchD,0EAA0E;AAC1E,MAAM,WAAW,kBAAkB;IACjC,iBAAiB,CAAC,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;IACtE,iBAAiB,CAAC,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;CACvE;AAkFD;;;GAGG;AACH,wBAAsB,uBAAuB,CAC3C,OAAO,EAAE,UAAU,EACnB,SAAS,EAAE,YAAY,EACvB,IAAI,EAAE,MAAM,EAAE,GACb,OAAO,CAAC,MAAM,CAAC,CAkEjB"}
package/dist/app.js CHANGED
@@ -1,4 +1,4 @@
1
- import { A as assertExternalArtifactPath, C as prepareMigration, D as cliExecutablePath, E as validateMcpAppsIfPresent, F as AppCommandError, I as ApplicationStartError, M as resolveApplicationId, N as resolveApplicationStateRoot, O as runtimeEnvironment, P as runtimeConfigurationFingerprint, R as redactSecrets, S as launchVite, T as runWorker, _ as sendTerminationSignal, a as renderAppHelp, b as ViteLauncherError, c as parseTokenLifetime, d as START_OUTPUT_TAIL_BYTES, f as runApplicationOperation, g as readOwnedProcess, h as matchesApplicationProcess, i as errorEnvelope, j as prepareApplicationStateRoot, k as webLauncherPath, l as runTokenOperation, m as checkOwnedProcess, n as APP_RECOVERY, o as runAppCommand, p as WEB_LAUNCHER_NAME, s as TOKEN_USAGE, t as APP_COMMANDS, u as APP_OPERATIONS, v as verifyOwnedProcess, w as resolveViteEntry, x as devServerArguments, y as writeProcessRecord } from "./cli-OZsH5cdL.js";
2
- import { C as publishFilesystemAssets, D as stageFilesystemAssets, E as rollbackFilesystemAssets, O as verifyFilesystemAssets, S as markFilesystemAssetsCommitted, T as recoverFilesystemAssets, _ as bundleContentDigest, a as manifestTables, b as finishFilesystemAssets, c as serializeExportBundle, d as AssetPortabilityError, f as MAX_ASSET_BYTES, g as assertAssetRoot, h as MAX_TOTAL_ASSET_BYTES, i as importedRowsMatchBundle, k as verifyPublishedFilesystemAssets, l as validateImportBundle, m as MAX_BUNDLE_BYTES, n as exportApplication, o as planImportTables, p as MAX_ASSET_COUNT, r as importApplication, t as executeImportPlan, u as ASSET_MANIFEST_SCHEMA_VERSION, v as collectFilesystemAssets, w as readSensitiveBundle, x as hasCommittedImportJournal, y as digestBytes } from "./portability-CES1YC2m.js";
1
+ import { A as assertExternalArtifactPath, C as prepareMigration, D as cliExecutablePath, E as validateMcpAppsIfPresent, F as AppCommandError, I as ApplicationStartError, M as resolveApplicationId, N as resolveApplicationStateRoot, O as runtimeEnvironment, P as runtimeConfigurationFingerprint, R as redactSecrets, S as launchVite, T as runWorker, _ as sendTerminationSignal, a as renderAppHelp, b as ViteLauncherError, c as parseTokenLifetime, d as START_OUTPUT_TAIL_BYTES, f as runApplicationOperation, g as readOwnedProcess, h as matchesApplicationProcess, i as errorEnvelope, j as prepareApplicationStateRoot, k as webLauncherPath, l as runTokenOperation, m as checkOwnedProcess, n as APP_RECOVERY, o as runAppCommand, p as WEB_LAUNCHER_NAME, s as TOKEN_USAGE, t as APP_COMMANDS, u as APP_OPERATIONS, v as verifyOwnedProcess, w as resolveViteEntry, x as devServerArguments, y as writeProcessRecord } from "./cli-FDpY0gCt.js";
2
+ import { C as publishFilesystemAssets, D as stageFilesystemAssets, E as rollbackFilesystemAssets, O as verifyFilesystemAssets, S as markFilesystemAssetsCommitted, T as recoverFilesystemAssets, _ as bundleContentDigest, a as manifestTables, b as finishFilesystemAssets, c as serializeExportBundle, d as AssetPortabilityError, f as MAX_ASSET_BYTES, g as assertAssetRoot, h as MAX_TOTAL_ASSET_BYTES, i as importedRowsMatchBundle, k as verifyPublishedFilesystemAssets, l as validateImportBundle, m as MAX_BUNDLE_BYTES, n as exportApplication, o as planImportTables, p as MAX_ASSET_COUNT, r as importApplication, t as executeImportPlan, u as ASSET_MANIFEST_SCHEMA_VERSION, v as collectFilesystemAssets, w as readSensitiveBundle, x as hasCommittedImportJournal, y as digestBytes } from "./portability-BbltyqQ-.js";
3
3
  import { PROVIDER_READINESS_SETTINGS, RECLAIM_MUTEX_FILE, acquireWriterLease, createProviderReadinessProbe, findInstalledPackage, isStaleOperationLock, lockOwnerPid, processExists, readActiveWriterLease, reclaimStaleRecord, resolveReadinessModule, withOperationLock } from "@happyvertical/smrt-app-runtime";
4
4
  export { APP_COMMANDS, APP_OPERATIONS, APP_RECOVERY, ASSET_MANIFEST_SCHEMA_VERSION, AppCommandError, ApplicationStartError, AssetPortabilityError, MAX_ASSET_BYTES, MAX_ASSET_COUNT, MAX_BUNDLE_BYTES, MAX_TOTAL_ASSET_BYTES, PROVIDER_READINESS_SETTINGS, RECLAIM_MUTEX_FILE, START_OUTPUT_TAIL_BYTES, TOKEN_USAGE, ViteLauncherError, WEB_LAUNCHER_NAME, acquireWriterLease, assertAssetRoot, assertExternalArtifactPath, bundleContentDigest, checkOwnedProcess, cliExecutablePath, collectFilesystemAssets, createProviderReadinessProbe, devServerArguments, digestBytes, errorEnvelope, executeImportPlan, exportApplication, findInstalledPackage, finishFilesystemAssets, hasCommittedImportJournal, importApplication, importedRowsMatchBundle, isStaleOperationLock, launchVite, lockOwnerPid, manifestTables, markFilesystemAssetsCommitted, matchesApplicationProcess, parseTokenLifetime, planImportTables, prepareApplicationStateRoot, prepareMigration, processExists, publishFilesystemAssets, readActiveWriterLease, readOwnedProcess, readSensitiveBundle, reclaimStaleRecord, recoverFilesystemAssets, redactSecrets, renderAppHelp, resolveApplicationId, resolveApplicationStateRoot, resolveReadinessModule, resolveViteEntry, rollbackFilesystemAssets, runAppCommand, runApplicationOperation, runTokenOperation, runWorker, runtimeConfigurationFingerprint, runtimeEnvironment, sendTerminationSignal, serializeExportBundle, stageFilesystemAssets, validateImportBundle, validateMcpAppsIfPresent, verifyFilesystemAssets, verifyOwnedProcess, verifyPublishedFilesystemAssets, webLauncherPath, withOperationLock, writeProcessRecord };
@@ -1065,17 +1065,54 @@ async function stop(context) {
1065
1065
  pid
1066
1066
  });
1067
1067
  }
1068
+ /** Ports above the configured one that Vite may fall back to when it is busy. */
1069
+ var DEV_PORT_FALLBACK_RANGE = 10;
1070
+ var LIVE_PROBE_TIMEOUT_MS = 1e3;
1071
+ /**
1072
+ * Find the port this application's server is actually listening on. Starts
1073
+ * at the configured port and walks the Vite fallback range, accepting only a
1074
+ * server whose runtime health answers with this application's id (so another
1075
+ * app that took the configured port is never mistaken for ours). Returns
1076
+ * `null` when no such server answers.
1077
+ */
1078
+ async function resolveLivePort(context, host, configuredPort) {
1079
+ const first = Number.parseInt(configuredPort, 10);
1080
+ if (!Number.isInteger(first) || first < 1) return null;
1081
+ for (let offset = 0; offset <= DEV_PORT_FALLBACK_RANGE; offset += 1) {
1082
+ const port = first + offset;
1083
+ if (port > 65535) break;
1084
+ try {
1085
+ const response = await context.deps.fetch(new URL("/api/_runtime/health", `http://${host}:${port}/`), {
1086
+ redirect: "manual",
1087
+ signal: AbortSignal.timeout(LIVE_PROBE_TIMEOUT_MS)
1088
+ });
1089
+ if (response.status !== 200) continue;
1090
+ if ((await response.json())?.application === context.appId) return String(port);
1091
+ } catch {}
1092
+ }
1093
+ return null;
1094
+ }
1068
1095
  async function open(context) {
1069
1096
  const runtime = await context.deps.resolveRuntime(context.sourceRoot);
1070
- const url = `http://${runtime.profile === "local" ? "127.0.0.1" : process.env.HOST || "127.0.0.1"}:${process.env.PORT || "5173"}/`;
1071
- const onboardingUrl = runtime.profile === "local" ? readOnboardingUrl(context) : null;
1072
- if (onboardingUrl) saveOnboardingLaunch(context, onboardingUrl);
1097
+ const host = runtime.profile === "local" ? "127.0.0.1" : process.env.HOST || "127.0.0.1";
1098
+ const configuredPort = process.env.PORT || "5173";
1099
+ const livePort = await resolveLivePort(context, host, configuredPort);
1100
+ const port = livePort ?? configuredPort;
1101
+ const url = `http://${host}:${port}/`;
1102
+ let onboardingUrl = runtime.profile === "local" ? readOnboardingUrl(context) : null;
1103
+ if (onboardingUrl) {
1104
+ const live = new URL(onboardingUrl);
1105
+ live.port = port;
1106
+ onboardingUrl = live.toString();
1107
+ saveOnboardingLaunch(context, onboardingUrl);
1108
+ }
1073
1109
  const destination = onboardingUrl ? pathToFileURL(onboardingLaunchPath(context)).toString() : url;
1074
1110
  context.deps.openBrowser(destination);
1075
1111
  printJson$1(context, {
1076
1112
  schemaVersion: 1,
1077
1113
  status: "opened",
1078
- url
1114
+ url,
1115
+ serverRunning: livePort !== null
1079
1116
  });
1080
1117
  }
1081
1118
  async function doctor(context) {
@@ -1254,7 +1291,7 @@ async function backup(context, args) {
1254
1291
  async function loadPortabilityAdapter(context) {
1255
1292
  const override = join(context.sourceRoot, "scripts", "smrt-portability.mjs");
1256
1293
  if (existsSync(override)) return await import(pathToFileURL(override).href);
1257
- return import("./portability-CES1YC2m.js").then((n) => n.s);
1294
+ return import("./portability-BbltyqQ-.js").then((n) => n.s);
1258
1295
  }
1259
1296
  async function portability(context, operation, args, operationLock) {
1260
1297
  const adapter = await loadPortabilityAdapter(context);
@@ -1562,6 +1599,15 @@ async function runAppCommand(argv, options = {}) {
1562
1599
  io.stdout(renderAppHelp());
1563
1600
  return 0;
1564
1601
  }
1602
+ if (![
1603
+ "dev",
1604
+ "build",
1605
+ "vite",
1606
+ "token"
1607
+ ].includes(operation) && args.some((arg) => arg === "--help" || arg === "-h")) {
1608
+ io.stdout(renderAppHelp());
1609
+ return 0;
1610
+ }
1565
1611
  try {
1566
1612
  const sourceRoot = resolve(options.cwd ?? process.cwd());
1567
1613
  if (ENV_FILE_OPERATIONS.has(operation)) loadSourceEnvironment(sourceRoot);
@@ -0,0 +1,3 @@
1
+ /** Minimal MCP Apps bridge, injected before the self-contained Planner bundle. */
2
+ export declare const KITCHEN_BRIDGE = "<script>\n(() => {\n const pending = new Map();\n const listeners = new Set();\n let sequence = 0;\n let latest;\n let hostOrigin = '*';\n let initialized = false;\n function send(message) { window.parent.postMessage({ jsonrpc: '2.0', ...message }, hostOrigin); }\n function request(method, params) {\n return new Promise((resolve, reject) => {\n const id = 'kitchen-' + ++sequence;\n const timer = setTimeout(() => {\n pending.delete(id);\n reject(new Error('The host did not answer. Refresh the plan before retrying.'));\n }, 30000);\n pending.set(id, { resolve, reject, timer });\n send({ id, method, params });\n });\n }\n // The Planner is an app shell that scrolls inside itself, so it asks for a\n // stable frame instead of its content height: the host's fixed height wins,\n // else its maxHeight, else a default. Fullscreen belongs to the host.\n const DEFAULT_HEIGHT = 720;\n let dimensions = {};\n let displayMode = 'inline';\n let reported;\n function appHeight() {\n if (displayMode === 'fullscreen' || typeof dimensions.height === 'number') return undefined;\n const max = dimensions.maxHeight;\n return typeof max === 'number' && max > 0 ? Math.round(max) : DEFAULT_HEIGHT;\n }\n function reportSize() {\n const height = appHeight();\n if (height === undefined || height === reported) return;\n reported = height;\n send({ method: 'ui/notifications/size-changed', params: { height } });\n }\n function applyHostContext(context) {\n if (!context || typeof context !== 'object') return;\n const next = context.containerDimensions;\n if (next && typeof next === 'object') dimensions = next;\n if (typeof context.displayMode === 'string') displayMode = context.displayMode;\n }\n function publish(data) {\n if (!data || typeof data.planId !== 'string' || !data.state) return;\n latest = data;\n for (const listener of listeners) listener(data);\n }\n window.addEventListener('message', (event) => {\n if (event.source !== window.parent) return;\n if (hostOrigin !== '*' && event.origin !== hostOrigin) return;\n const message = event.data;\n if (!message || message.jsonrpc !== '2.0') return;\n if (message.id !== undefined && pending.has(message.id)) {\n if (event.origin && event.origin !== 'null') hostOrigin = event.origin;\n const item = pending.get(message.id);\n clearTimeout(item.timer);\n pending.delete(message.id);\n if (message.error) item.reject(new Error(message.error.message || 'Host request failed'));\n else item.resolve(message.result);\n } else if (message.method === 'ui/notifications/host-context-changed') {\n applyHostContext(message.params);\n if (initialized) reportSize();\n } else if (message.method === 'ui/notifications/tool-result') {\n publish(message.params?.structuredContent);\n } else if (message.method === 'ping' && message.id !== undefined) {\n send({ id: message.id, result: {} });\n }\n });\n const ready = request('ui/initialize', {\n appInfo: { name: 'smrt-kitchen-planner', version: '1.0.0' },\n appCapabilities: { availableDisplayModes: ['inline', 'fullscreen'] },\n protocolVersion: '2026-01-26',\n }).then((result) => {\n if (result?.protocolVersion !== '2026-01-26') throw new Error('Unsupported MCP Apps protocol');\n send({ method: 'ui/notifications/initialized', params: {} });\n applyHostContext(result.hostContext);\n initialized = true;\n reportSize();\n return result;\n });\n ready.catch(() => {});\n window.smrtKitchen = {\n async callTool(name, args) {\n if (!['get_plan', 'run_commands', 'export_plan', 'validate_plan', 'planner_ui_update'].includes(name)) {\n throw new Error('This tool is not available from the Planner UI');\n }\n await ready;\n const result = await request('tools/call', { name, arguments: args });\n if (!result?.structuredContent) throw new Error('The host returned no structured data');\n return result.structuredContent;\n },\n subscribe(listener) {\n listeners.add(listener);\n if (latest) listener(latest);\n return () => listeners.delete(listener);\n },\n };\n ready.then(async () => {\n const resumePlanId = window.__smrtKitchenReloadPlanId;\n if (resumePlanId) {\n try {\n const result = await request('tools/call', {\n name: 'get_plan', arguments: { planId: resumePlanId },\n });\n publish(result?.structuredContent);\n } catch { /* A later render result can still supply the plan. */ }\n }\n let version = window.__smrtKitchenUiVersion;\n if (!version) return;\n let checking = false;\n let stopped = false;\n let reloadNotice;\n function showReloadNotice() {\n if (reloadNotice) return;\n reloadNotice = document.createElement('p');\n reloadNotice.setAttribute('role', 'alert');\n reloadNotice.textContent = 'The new Planner UI could not reload. Reopen this app tab to use it.';\n document.body.prepend(reloadNotice);\n }\n const check = async () => {\n if (checking || stopped || document.visibilityState === 'hidden') return;\n checking = true;\n let attemptedVersion = false;\n try {\n const result = await request('tools/call', {\n name: 'planner_ui_update',\n arguments: { version, planId: latest?.planId || resumePlanId || '' },\n });\n const update = result?.structuredContent;\n if (update?.changed && typeof update.html === 'string' && typeof update.version === 'string') {\n // A rejected artifact must not be resent every poll. A later build\n // has a different digest and can still replace it.\n version = update.version;\n attemptedVersion = true;\n const next = new DOMParser().parseFromString(update.html, 'text/html');\n const nextStyle = next.getElementById('smrt-planner-styles');\n const nextEntry = next.getElementById('smrt-planner-entry');\n const currentStyle = document.getElementById('smrt-planner-styles');\n const currentEntry = document.getElementById('smrt-planner-entry');\n if (!nextStyle || !nextEntry || !currentStyle || !currentEntry || !window.smrtKitchenUnmount) {\n throw new Error('The Planner bundle cannot be reloaded in this tab');\n }\n await window.smrtKitchenUnmount();\n const style = document.createElement('style');\n style.id = 'smrt-planner-styles';\n style.textContent = nextStyle.textContent;\n currentStyle.replaceWith(style);\n const entry = document.createElement('script');\n entry.id = 'smrt-planner-entry';\n entry.textContent = nextEntry.textContent;\n currentEntry.replaceWith(entry);\n reloadNotice?.remove();\n reloadNotice = undefined;\n }\n } catch {\n if (attemptedVersion) showReloadNotice();\n // A build may be in progress; check again for a newer digest.\n }\n checking = false;\n };\n const timer = setInterval(check, 1500);\n window.addEventListener('pagehide', () => {\n stopped = true;\n clearInterval(timer);\n }, { once: true });\n }).catch(() => {});\n})();\n</script>";
3
+ //# sourceMappingURL=bridge.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bridge.d.ts","sourceRoot":"","sources":["../../../../src/commands/kitchen/mcp/bridge.ts"],"names":[],"mappings":"AAAA,kFAAkF;AAClF,eAAO,MAAM,cAAc,6sOAyKjB,CAAC"}
@@ -0,0 +1,8 @@
1
+ /** Loopback-only bridge for the live SvelteKit preview during local development. */
2
+ import { type Server as HttpServer } from 'node:http';
3
+ import type { KitchenSession } from './tools.js';
4
+ export declare function startKitchenPreview(session: KitchenSession, port: number, origin: string): Promise<{
5
+ server: HttpServer;
6
+ url: string;
7
+ }>;
8
+ //# sourceMappingURL=preview.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"preview.d.ts","sourceRoot":"","sources":["../../../../src/commands/kitchen/mcp/preview.ts"],"names":[],"mappings":"AAAA,oFAAoF;AACpF,OAAO,EAAgB,KAAK,MAAM,IAAI,UAAU,EAAE,MAAM,WAAW,CAAC;AACpE,OAAO,KAAK,EAAE,cAAc,EAAqB,MAAM,YAAY,CAAC;AAEpE,wBAAsB,mBAAmB,CACvC,OAAO,EAAE,cAAc,EACvB,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,GACb,OAAO,CAAC;IAAE,MAAM,EAAE,UAAU,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,CAAC,CAqG9C"}
@@ -1 +1 @@
1
- {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../../../src/commands/kitchen/mcp/server.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,8BAA8B,CAAC;AAGtD,OAAO,EAEL,cAAc,EACd,KAAK,mBAAmB,EACzB,MAAM,YAAY,CAAC;AAEpB,eAAO,MAAM,WAAW,iBAAiB,CAAC;AAQ1C,oFAAoF;AACpF,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,mBAAmB,GAAG;IACpE,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,cAAc,CAAC;CACzB,CAgCA;AAED,wFAAwF;AACxF,wBAAsB,aAAa,CACjC,OAAO,EAAE,mBAAmB,GAC3B,OAAO,CAAC,IAAI,CAAC,CAaf"}
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../../../src/commands/kitchen/mcp/server.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,8BAA8B,CAAC;AAItD,OAAO,EAEL,cAAc,EACd,KAAK,mBAAmB,EACzB,MAAM,YAAY,CAAC;AAGpB,eAAO,MAAM,WAAW,iBAAiB,CAAC;AAQ1C,oFAAoF;AACpF,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,mBAAmB,GAAG;IACpE,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,cAAc,CAAC;CACzB,CAuLA;AAED,wFAAwF;AACxF,wBAAsB,aAAa,CACjC,OAAO,EAAE,mBAAmB,GAC3B,OAAO,CAAC,IAAI,CAAC,CA4Bf"}
@@ -5,14 +5,24 @@
5
5
  * with `cookbook apply`. The host reasons; nothing here calls a model or
6
6
  * holds a credential.
7
7
  *
8
- * Plans live in this process, one engine per plan id. Nothing is stored
9
- * remotely; `apply_plan` writes `smrt.cookbook.json` into the project.
8
+ * Plans may be stored on local disk, one engine state per plan id. Nothing is
9
+ * stored remotely; `apply_plan` writes `smrt.cookbook.json` into the project.
10
10
  */
11
11
  import { type JsonSchema, type PlanSnapshot } from '@happyvertical/smrt-core/cookbook/engine';
12
12
  import { type CatalogOptions, type LoadedCatalog } from './catalog.js';
13
13
  /** The most plans one server process holds; the oldest is dropped past it. */
14
14
  export declare const MAX_PLANS = 20;
15
15
  export interface KitchenToolsOptions extends CatalogOptions {
16
+ /** Opt-in static MCP Apps capability probe; does not enable Planner editing. */
17
+ uiSmoke?: boolean;
18
+ /** Self-contained Planner MCP App HTML, built by smrt-planner. */
19
+ plannerUi?: string;
20
+ /** Private local directory for plans that must survive a server restart. */
21
+ plansDir?: string;
22
+ /** Optional loopback port for the live browser preview; 0 chooses a free port. */
23
+ previewPort?: number;
24
+ /** Exact local Vite origin permitted to use the preview bridge. */
25
+ previewOrigin?: string;
16
26
  /** Default project template for `apply_plan` (default: smrt-start). */
17
27
  template?: string;
18
28
  /** Replaces the catalog loader (tests). */
@@ -49,9 +59,17 @@ export declare class KitchenSession {
49
59
  private readonly options;
50
60
  private loaded?;
51
61
  private readonly plans;
62
+ private readonly updates;
63
+ previewUrl?: string;
64
+ /** Plans `open_preview` handed to the browser; the preview bridge serves only these. */
65
+ readonly previewPlans: Set<string>;
52
66
  constructor(options: KitchenToolsOptions);
53
67
  /** Load the catalog once; a failed load is retried on the next call. */
54
68
  catalog(): Promise<LoadedCatalog>;
69
+ private planPath;
70
+ private savePlan;
71
+ /** Serialize the read/check/write transaction across Kitchen processes. */
72
+ private lockPlan;
55
73
  private plan;
56
74
  /** Validate arguments against a tool's published schema. */
57
75
  private static check;
@@ -61,6 +79,7 @@ export declare class KitchenSession {
61
79
  private searchRecipes;
62
80
  private startPlan;
63
81
  private runCommands;
82
+ private runCommandsUnlocked;
64
83
  private validatePlan;
65
84
  private exportPlan;
66
85
  private applyPlan;
@@ -1 +1 @@
1
- {"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../../../../src/commands/kitchen/mcp/tools.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAIH,OAAO,EAOL,KAAK,UAAU,EACf,KAAK,YAAY,EAElB,MAAM,0CAA0C,CAAC;AAGlD,OAAO,EACL,KAAK,cAAc,EACnB,KAAK,aAAa,EAEnB,MAAM,cAAc,CAAC;AAEtB,8EAA8E;AAC9E,eAAO,MAAM,SAAS,KAAK,CAAC;AAE5B,MAAM,WAAW,mBAAoB,SAAQ,cAAc;IACzD,uEAAuE;IACvE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,2CAA2C;IAC3C,aAAa,CAAC,EAAE,MAAM,OAAO,CAAC,aAAa,CAAC,CAAC;CAC9C;AAED,4CAA4C;AAC5C,MAAM,WAAW,sBAAsB;IACrC,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,EAAE,OAAO,CAAC;IACtB,eAAe,EAAE,OAAO,CAAC;IACzB,cAAc,EAAE,OAAO,CAAC;IACxB,aAAa,EAAE,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,UAAU,CAAC;IACxB,YAAY,EAAE,UAAU,CAAC;IACzB,WAAW,EAAE,sBAAsB,CAAC;CACrC;AAED,mFAAmF;AACnF,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG;QAAE,EAAE,EAAE,OAAO,CAAA;KAAE,CAAC;IAChD,IAAI,EAAE,MAAM,CAAC;CACd;AAiFD,eAAO,MAAM,aAAa,EAAE,SAAS,qBAAqB,EA8NzD,CAAC;AAiBF,oDAAoD;AACpD,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,YAAY,GAAG,MAAM,CAyB/D;AAwBD,mEAAmE;AACnE,qBAAa,cAAc;IAIb,OAAO,CAAC,QAAQ,CAAC,OAAO;IAHpC,OAAO,CAAC,MAAM,CAAC,CAAyB;IACxC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAA2B;gBAEpB,OAAO,EAAE,mBAAmB;IAEzD,wEAAwE;IACxE,OAAO,IAAI,OAAO,CAAC,aAAa,CAAC;IAYjC,OAAO,CAAC,IAAI;IAYZ,4DAA4D;IAC5D,OAAO,CAAC,MAAM,CAAC,KAAK;IAUd,IAAI,CACR,IAAI,EAAE,MAAM,EACZ,IAAI,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,GACjC,OAAO,CAAC,iBAAiB,CAAC;YAuBf,QAAQ;YAiCR,aAAa;YAkBb,aAAa;YA8Bb,SAAS;IAgCvB,OAAO,CAAC,WAAW;YA0DL,YAAY;IAiC1B,OAAO,CAAC,UAAU;YAqBJ,SAAS;CAgGxB"}
1
+ {"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../../../../src/commands/kitchen/mcp/tools.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAeH,OAAO,EAQL,KAAK,UAAU,EACf,KAAK,YAAY,EAElB,MAAM,0CAA0C,CAAC;AAGlD,OAAO,EACL,KAAK,cAAc,EACnB,KAAK,aAAa,EAEnB,MAAM,cAAc,CAAC;AAEtB,8EAA8E;AAC9E,eAAO,MAAM,SAAS,KAAK,CAAC;AAE5B,MAAM,WAAW,mBAAoB,SAAQ,cAAc;IACzD,gFAAgF;IAChF,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,kEAAkE;IAClE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,4EAA4E;IAC5E,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,kFAAkF;IAClF,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,mEAAmE;IACnE,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,uEAAuE;IACvE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,2CAA2C;IAC3C,aAAa,CAAC,EAAE,MAAM,OAAO,CAAC,aAAa,CAAC,CAAC;CAC9C;AAED,4CAA4C;AAC5C,MAAM,WAAW,sBAAsB;IACrC,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,EAAE,OAAO,CAAC;IACtB,eAAe,EAAE,OAAO,CAAC;IACzB,cAAc,EAAE,OAAO,CAAC;IACxB,aAAa,EAAE,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,UAAU,CAAC;IACxB,YAAY,EAAE,UAAU,CAAC;IACzB,WAAW,EAAE,sBAAsB,CAAC;CACrC;AAED,mFAAmF;AACnF,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG;QAAE,EAAE,EAAE,OAAO,CAAA;KAAE,CAAC;IAChD,IAAI,EAAE,MAAM,CAAC;CACd;AA6FD,eAAO,MAAM,aAAa,EAAE,SAAS,qBAAqB,EAgPzD,CAAC;AAiBF,oDAAoD;AACpD,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,YAAY,GAAG,MAAM,CAyB/D;AA0BD,mEAAmE;AACnE,qBAAa,cAAc;IAQb,OAAO,CAAC,QAAQ,CAAC,OAAO;IAPpC,OAAO,CAAC,MAAM,CAAC,CAAyB;IACxC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAA2B;IACjD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAoC;IAC5D,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,wFAAwF;IACxF,QAAQ,CAAC,YAAY,cAAqB;gBAEb,OAAO,EAAE,mBAAmB;IAEzD,wEAAwE;IACxE,OAAO,IAAI,OAAO,CAAC,aAAa,CAAC;IAYjC,OAAO,CAAC,QAAQ;IAOhB,OAAO,CAAC,QAAQ;IAehB,2EAA2E;YAC7D,QAAQ;YAqDR,IAAI;IA4ClB,4DAA4D;IAC5D,OAAO,CAAC,MAAM,CAAC,KAAK;IAUd,IAAI,CACR,IAAI,EAAE,MAAM,EACZ,IAAI,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,GACjC,OAAO,CAAC,iBAAiB,CAAC;YAuBf,QAAQ;YAuDR,aAAa;YAkBb,aAAa;YA8Bb,SAAS;YAmDT,WAAW;YA0BX,mBAAmB;YA6GnB,YAAY;YAiCZ,UAAU;YAuBV,SAAS;CAgGxB"}
@@ -0,0 +1,40 @@
1
+ /** Opt-in desktop capability probe. This is not the Planner UI. */
2
+ export declare const KITCHEN_UI_URI = "ui://smrt-kitchen/capability-v1.html";
3
+ export declare const KITCHEN_UI_MIME = "text/html;profile=mcp-app";
4
+ export declare const KITCHEN_UI_RESOURCE: {
5
+ uri: string;
6
+ name: string;
7
+ mimeType: string;
8
+ };
9
+ export declare const KITCHEN_UI_CONTENT: {
10
+ text: string;
11
+ _meta: {
12
+ ui: {
13
+ prefersBorder: boolean;
14
+ csp: {
15
+ connectDomains: never[];
16
+ resourceDomains: never[];
17
+ };
18
+ };
19
+ };
20
+ uri: string;
21
+ name: string;
22
+ mimeType: string;
23
+ };
24
+ /** Load only an operator-selected local artifact; tool arguments never choose files. */
25
+ export declare function loadPlannerUi(file: string, resumePlanId?: string): {
26
+ uri: string;
27
+ name: string;
28
+ text: string;
29
+ _meta: {
30
+ ui: {
31
+ prefersBorder: boolean;
32
+ csp: {
33
+ connectDomains: never[];
34
+ resourceDomains: never[];
35
+ };
36
+ };
37
+ };
38
+ mimeType: string;
39
+ };
40
+ //# sourceMappingURL=ui.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ui.d.ts","sourceRoot":"","sources":["../../../../src/commands/kitchen/mcp/ui.ts"],"names":[],"mappings":"AAIA,mEAAmE;AACnE,eAAO,MAAM,cAAc,yCAAyC,CAAC;AACrE,eAAO,MAAM,eAAe,8BAA8B,CAAC;AAE3D,eAAO,MAAM,mBAAmB;;;;CAI/B,CAAC;AAEF,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;CAgB9B,CAAC;AAEF,wFAAwF;AACxF,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM;;;;;;;;;;;;;;EAmBhE"}
@@ -1 +1 @@
1
- {"version":3,"file":"kitchen.d.ts","sourceRoot":"","sources":["../../src/commands/kitchen.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAoDtD,eAAO,MAAM,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CA0ItD,CAAC"}
1
+ {"version":3,"file":"kitchen.d.ts","sourceRoot":"","sources":["../../src/commands/kitchen.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAyDtD,eAAO,MAAM,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CA4KtD,CAAC"}