apps 0.0.1-beta.5 → 0.0.1-beta.54

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 (185) hide show
  1. package/README.md +68 -44
  2. package/framework-reference.json +1 -1
  3. package/js/chunk-5FHWNLCI.js +88 -0
  4. package/js/{chunk-M3B3DE4K.js → chunk-74YVXBKY.js} +463 -218
  5. package/js/chunk-7UUHJR2Q.js +49 -0
  6. package/js/{chunk-CYYBFC2K.js → chunk-AQU56EPI.js} +9 -5
  7. package/js/chunk-CDXQDN7W.js +92 -0
  8. package/js/{chunk-UDDE5KOR.js → chunk-D45JTD6N.js} +148 -34
  9. package/js/{chunk-UK573G7W.js → chunk-EOPQ727L.js} +87 -51
  10. package/js/chunk-GDYPM7RS.js +266 -0
  11. package/js/{chunk-27F7W2LG.js → chunk-H2CJWXA3.js} +2 -2
  12. package/js/{chunk-JU7VHODU.js → chunk-H72MEDMN.js} +65 -10
  13. package/js/{chunk-CDL5PM2Q.js → chunk-IFJU5SYQ.js} +19082 -18402
  14. package/js/{chunk-RJDDBDSN.js → chunk-JM7LOD2W.js} +628 -85
  15. package/js/{chunk-VFZKSM3T.js → chunk-JPEUKEV4.js} +3 -3
  16. package/js/{chunk-DQAZTA4I.js → chunk-JY56GVSV.js} +1324 -209
  17. package/js/{chunk-FWQC6I3C.js → chunk-KGCTYL2S.js} +523 -63
  18. package/js/{chunk-KUMBKVJD.js → chunk-KLYSEHUD.js} +2 -2
  19. package/js/chunk-LTDHQJ2Z.js +171 -0
  20. package/js/chunk-MWKHKOTL.js +240 -0
  21. package/js/chunk-OD3KFKZD.js +1617 -0
  22. package/js/{chunk-57RKNWL2.js → chunk-PD6I2SDG.js} +4 -4
  23. package/js/chunk-PO5NPRFT.js +1885 -0
  24. package/js/chunk-QKHTRD6G.js +42 -0
  25. package/js/chunk-SVHI6AKV.js +729 -0
  26. package/js/{chunk-IJX4CYZO.js → chunk-TUMGL2OC.js} +228 -264
  27. package/js/{chunk-XHO2ZX6W.js → chunk-UM62MBJQ.js} +96 -41
  28. package/js/chunk-X5U5KIWQ.js +221 -0
  29. package/js/{chunk-IPI4MFSN.js → chunk-XBG7HHXC.js} +2 -2
  30. package/js/chunk-YQD2MLFY.js +340 -0
  31. package/js/client.js +142 -94
  32. package/js/contracts.js +123 -33
  33. package/js/effect.js +19 -21
  34. package/js/{es-APDZKREY.js → es-DIULA3ZF.js} +62 -1659
  35. package/js/graphql.js +63 -60
  36. package/js/host.js +83 -60
  37. package/js/index.js +262 -222
  38. package/js/mcp/effect.js +23 -23
  39. package/js/mcp/stdio.js +48 -40
  40. package/js/mcp.js +109 -72
  41. package/js/openapi.js +4129 -1419
  42. package/js/react.js +2 -3
  43. package/js/skills/effect.js +6 -3
  44. package/js/skills.js +208 -82
  45. package/js/storage/facet.js +1 -540
  46. package/js/ui/auth/contracts.js +2 -2
  47. package/js/ui/auth.js +5 -5
  48. package/js/ui/contracts.js +5 -4
  49. package/js/ui/serving.js +8517 -214
  50. package/package.json +2 -3
  51. package/runtime.json +1 -1
  52. package/types/app-cache/src/index.d.ts +10 -1
  53. package/types/apps/src/contracts/api-response-error.d.ts +4 -0
  54. package/types/apps/src/contracts/app.d.ts +9 -8
  55. package/types/apps/src/contracts/cache.d.ts +20 -0
  56. package/types/apps/src/contracts/context.d.ts +19 -11
  57. package/types/apps/src/contracts/elicitation.d.ts +6 -6
  58. package/types/apps/src/contracts/events.d.ts +93 -0
  59. package/types/apps/src/contracts/failure.d.ts +30 -1
  60. package/types/apps/src/contracts/graphql.d.ts +2 -1
  61. package/types/apps/src/contracts/host.d.ts +55 -16
  62. package/types/apps/src/contracts/live.d.ts +2 -0
  63. package/types/apps/src/contracts/mcp.d.ts +96 -10
  64. package/types/apps/src/contracts/network.d.ts +84 -0
  65. package/types/apps/src/contracts/openapi-compile.d.ts +32 -3
  66. package/types/apps/src/contracts/openapi.d.ts +45 -9
  67. package/types/apps/src/contracts/operations.d.ts +8 -9
  68. package/types/apps/src/contracts/protocol-version.d.ts +2 -2
  69. package/types/apps/src/contracts/protocols/1.d.ts +248 -73
  70. package/types/apps/src/contracts/protocols/10.d.ts +1450 -0
  71. package/types/apps/src/contracts/protocols/11.d.ts +1098 -0
  72. package/types/apps/src/contracts/protocols/2.d.ts +65 -23
  73. package/types/apps/src/contracts/protocols/3.d.ts +65 -26
  74. package/types/apps/src/contracts/protocols/4.d.ts +1297 -0
  75. package/types/apps/src/contracts/protocols/5.d.ts +1174 -0
  76. package/types/apps/src/contracts/protocols/6.d.ts +1620 -0
  77. package/types/apps/src/contracts/protocols/7.d.ts +1784 -0
  78. package/types/apps/src/contracts/protocols/8.d.ts +1130 -0
  79. package/types/apps/src/contracts/protocols/9.d.ts +1106 -0
  80. package/types/apps/src/contracts/protocols/oauth.d.ts +89 -0
  81. package/types/apps/src/contracts/provider-error.d.ts +9 -0
  82. package/types/apps/src/contracts/provider.d.ts +115 -10
  83. package/types/apps/src/contracts/router.d.ts +59 -0
  84. package/types/apps/src/contracts/skills.d.ts +50 -13
  85. package/types/apps/src/contracts/sql.d.ts +58 -0
  86. package/types/apps/src/contracts/ui.d.ts +19 -1
  87. package/types/apps/src/contracts/workflows.d.ts +6 -0
  88. package/types/apps/src/facet.d.ts +4 -5
  89. package/types/apps/src/graphql.d.ts +1 -3
  90. package/types/apps/src/host.d.ts +5 -0
  91. package/types/apps/src/implementation/account-router.d.ts +13 -0
  92. package/types/apps/src/implementation/app.d.ts +5 -4
  93. package/types/apps/src/implementation/authoring.d.ts +25 -5
  94. package/types/apps/src/implementation/browser-scripts.gen.d.ts +6 -0
  95. package/types/apps/src/implementation/cache.d.ts +4 -0
  96. package/types/apps/src/implementation/catalog-cache.d.ts +43 -5
  97. package/types/apps/src/implementation/elicitation.d.ts +18 -15
  98. package/types/apps/src/implementation/events.d.ts +59 -0
  99. package/types/apps/src/implementation/failure-detail.d.ts +25 -3
  100. package/types/apps/src/implementation/graphql-catalog.d.ts +4 -7
  101. package/types/apps/src/implementation/graphql.d.ts +4 -3
  102. package/types/apps/src/implementation/input-problems.d.ts +6 -2
  103. package/types/apps/src/implementation/invocation-timing.d.ts +16 -0
  104. package/types/apps/src/implementation/live.d.ts +2 -2
  105. package/types/apps/src/implementation/mcp-call.d.ts +6 -5
  106. package/types/apps/src/implementation/mcp-catalog.d.ts +7 -8
  107. package/types/apps/src/implementation/mcp-client.d.ts +49 -25
  108. package/types/apps/src/implementation/mcp-stdio.d.ts +1 -1
  109. package/types/apps/src/implementation/mcp-tools.d.ts +2 -1
  110. package/types/apps/src/implementation/mcp.d.ts +52 -25
  111. package/types/apps/src/implementation/network.d.ts +16 -0
  112. package/types/apps/src/implementation/openapi-compile.d.ts +27 -6
  113. package/types/apps/src/implementation/openapi-document.d.ts +46 -19
  114. package/types/apps/src/implementation/openapi-names.d.ts +9 -4
  115. package/types/apps/src/implementation/openapi-request.d.ts +10 -2
  116. package/types/apps/src/implementation/openapi-source.d.ts +8 -6
  117. package/types/apps/src/implementation/openapi-upgrade.d.ts +4 -0
  118. package/types/apps/src/implementation/operations.d.ts +43 -5
  119. package/types/apps/src/implementation/optimistic.d.ts +1 -1
  120. package/types/apps/src/implementation/protocol-operations.d.ts +6 -4
  121. package/types/apps/src/implementation/provider-error.d.ts +28 -1
  122. package/types/apps/src/implementation/provider.d.ts +19 -5
  123. package/types/apps/src/implementation/query-commit.d.ts +1 -1
  124. package/types/apps/src/implementation/router-catalog.d.ts +223 -0
  125. package/types/apps/src/implementation/router.d.ts +70 -0
  126. package/types/apps/src/implementation/runtime-yield.d.ts +7 -0
  127. package/types/apps/src/implementation/schema.d.ts +95 -11
  128. package/types/apps/src/implementation/skills.d.ts +18 -24
  129. package/types/apps/src/implementation/sql.d.ts +71 -0
  130. package/types/apps/src/implementation/ui-account-notice.d.ts +9 -0
  131. package/types/apps/src/implementation/ui-auth.d.ts +1 -1
  132. package/types/apps/src/implementation/ui-client.d.ts +2 -2
  133. package/types/apps/src/implementation/ui-document.d.ts +5 -0
  134. package/types/apps/src/implementation/ui-errors.d.ts +1 -1
  135. package/types/apps/src/implementation/ui-serving.d.ts +11 -5
  136. package/types/apps/src/implementation/ui-watch.d.ts +1 -1
  137. package/types/apps/src/implementation/upstream-error.d.ts +7 -0
  138. package/types/apps/src/implementation/workflow-context.d.ts +1 -1
  139. package/types/apps/src/implementation/workflows.d.ts +1 -1
  140. package/types/apps/src/index.d.ts +32 -13
  141. package/types/apps/src/mcp-stdio.d.ts +2 -5
  142. package/types/apps/src/mcp.d.ts +25 -5
  143. package/types/apps/src/openapi.d.ts +6 -6
  144. package/types/apps/src/react.d.ts +1 -1
  145. package/types/apps/src/skills.d.ts +10 -8
  146. package/types/telemetry/src/app-records.d.ts +42 -0
  147. package/types/telemetry/src/browser-operations.d.ts +7 -4
  148. package/types/telemetry/src/browser.d.ts +8 -3
  149. package/types/telemetry/src/config.d.ts +2 -2
  150. package/types/telemetry/src/index.d.ts +1 -0
  151. package/types/telemetry/src/layer.d.ts +2 -2
  152. package/types/telemetry/src/ownership.d.ts +56 -0
  153. package/types/telemetry/src/recorded-failure.d.ts +29 -0
  154. package/types/telemetry/src/relay.d.ts +2 -2
  155. package/types/telemetry/src/transport.d.ts +8 -1
  156. package/types/utils/src/api-error.d.ts +55 -0
  157. package/types/utils/src/connection-failure.d.ts +33 -0
  158. package/types/utils/src/recorded-message.d.ts +18 -0
  159. package/types/utils/src/user-facing-error.d.ts +83 -0
  160. package/js/chunk-3XKZDQLM.js +0 -93
  161. package/js/chunk-4M277YTM.js +0 -136
  162. package/js/chunk-67EVWIGJ.js +0 -224
  163. package/js/chunk-C3VAOK5B.js +0 -215
  164. package/js/chunk-G7T27IWB.js +0 -63
  165. package/js/chunk-LUVSFETN.js +0 -1347
  166. package/js/chunk-N7YDVXYJ.js +0 -186
  167. package/js/chunk-PJJ24GU7.js +0 -877
  168. package/js/chunk-PZB6T6KU.js +0 -19
  169. package/js/chunk-SB3V4YVR.js +0 -18
  170. package/js/chunk-TDNYXSIX.js +0 -29
  171. package/js/chunk-W4DMKWAB.js +0 -35
  172. package/js/chunk-YEPYT6SD.js +0 -85
  173. package/js/chunk-ZQINWV4W.js +0 -630
  174. package/types/app-data/src/implementation/cursor.d.ts +0 -10
  175. package/types/app-data/src/implementation/index-key.d.ts +0 -7
  176. package/types/app-data/src/implementation/promise.d.ts +0 -68
  177. package/types/app-data/src/implementation/range.d.ts +0 -8
  178. package/types/app-data/src/implementation/schema.d.ts +0 -18
  179. package/types/app-data/src/implementation/sqlite.d.ts +0 -11
  180. package/types/app-data/src/index.d.ts +0 -4
  181. package/types/apps/src/contracts/dynamic-tools.d.ts +0 -13
  182. package/types/apps/src/contracts/storage.d.ts +0 -68
  183. package/types/apps/src/implementation/account-operations.d.ts +0 -151
  184. package/types/apps/src/implementation/dynamic-tools.d.ts +0 -8
  185. package/types/apps/src/implementation/storage.d.ts +0 -15
@@ -1,26 +1,42 @@
1
+ import {
2
+ fromPromise,
3
+ method,
4
+ toPromise
5
+ } from "./chunk-LTDHQJ2Z.js";
1
6
  import {
2
7
  CacheError
3
- } from "./chunk-YEPYT6SD.js";
8
+ } from "./chunk-MWKHKOTL.js";
4
9
  import {
5
10
  wrap
6
- } from "./chunk-FWQC6I3C.js";
11
+ } from "./chunk-KGCTYL2S.js";
7
12
  import {
8
13
  JsonObject
9
- } from "./chunk-27F7W2LG.js";
14
+ } from "./chunk-H2CJWXA3.js";
10
15
  import {
16
+ Deferred_exports,
11
17
  Duration_exports,
12
18
  Effect_exports,
13
19
  Schema_exports
14
- } from "./chunk-CDL5PM2Q.js";
20
+ } from "./chunk-IFJU5SYQ.js";
15
21
 
16
22
  // src/implementation/catalog-cache.ts
23
+ var catalogScope = (options, credential, invalid) => {
24
+ const { account, cache } = options;
25
+ if (account === void 0)
26
+ return credential === void 0 ? Effect_exports.succeed(cache) : Effect_exports.fail(invalid("missing-account"));
27
+ if (cache === void 0) return Effect_exports.succeed(void 0);
28
+ return Effect_exports.try({
29
+ try: () => cache.forAccount(account),
30
+ catch: () => invalid("unselected-account")
31
+ });
32
+ };
17
33
  var schema = (decoder) => wrap(decoder, false);
18
34
  var Manifest = Schema_exports.Struct({
19
35
  revision: Schema_exports.String,
20
36
  pages: Schema_exports.Int,
21
- summaries: Schema_exports.Int
37
+ summaries: Schema_exports.Int,
38
+ header: Schema_exports.optionalKey(JsonObject)
22
39
  });
23
- var invoke = (work) => Effect_exports.tryPromise({ try: work, catch: (error) => error });
24
40
  var catalogCache = (options) => Effect_exports.gen(function* () {
25
41
  const cache = options.cache;
26
42
  const key = [...options.prefix, "current"];
@@ -34,11 +50,42 @@ var catalogCache = (options) => Effect_exports.gen(function* () {
34
50
  const staleFor = options.staleFor ?? "1 day";
35
51
  const retention = Duration_exports.toMillis(Duration_exports.fromInputUnsafe(freshFor)) + Duration_exports.toMillis(Duration_exports.fromInputUnsafe(staleFor)) + 3e5;
36
52
  const local = yield* Effect_exports.cached(options.load());
37
- const refresh = (context) => Effect_exports.gen(function* () {
38
- const tools = yield* options.load(context);
39
- const digest = yield* invoke(
40
- () => crypto.subtle.digest("SHA-256", new TextEncoder().encode(JSON.stringify(tools)))
53
+ const pages = (cache2, revision, kind, count, decoder) => Effect_exports.gen(function* () {
54
+ const batches = yield* Effect_exports.forEach(
55
+ Array.from({ length: Math.ceil(count / 4) }, (_, batch) => batch * 4),
56
+ (offset) => fromPromise(method(cache2, "readMany"), "cache")(
57
+ Array.from(
58
+ { length: Math.min(4, count - offset) },
59
+ (_, index) => part(revision, kind, offset + index)
60
+ ),
61
+ schema(Schema_exports.Array(decoder))
62
+ ),
63
+ { concurrency: "unbounded" }
41
64
  );
65
+ const values = [];
66
+ for (const page of batches.flat()) {
67
+ if (page === void 0) return yield* new CacheError({ reason: "unavailable" });
68
+ values.push(...page);
69
+ }
70
+ return values;
71
+ });
72
+ const kept = (cache2) => fromPromise(method(cache2, "read"), "cache")(key, schema(Manifest)).pipe(
73
+ Effect_exports.map(
74
+ (manifest) => manifest === void 0 ? void 0 : {
75
+ header: manifest.header,
76
+ tools: pages(cache2, manifest.revision, "page", manifest.pages, options.schema)
77
+ }
78
+ )
79
+ );
80
+ const refresh = (context) => Effect_exports.gen(function* () {
81
+ const { tools, header } = yield* options.load(context, kept(context.cache));
82
+ const digest = yield* Effect_exports.tryPromise({
83
+ try: () => crypto.subtle.digest(
84
+ "SHA-256",
85
+ new TextEncoder().encode(JSON.stringify({ tools, header: header ?? null }))
86
+ ),
87
+ catch: (error) => error
88
+ });
42
89
  const revision = Array.from(
43
90
  new Uint8Array(digest),
44
91
  (byte) => byte.toString(16).padStart(2, "0")
@@ -58,7 +105,7 @@ var catalogCache = (options) => Effect_exports.gen(function* () {
58
105
  batch = [];
59
106
  batchBytes = 0;
60
107
  if (!entries.length) return Effect_exports.void;
61
- return invoke(() => context.cache.write(entries, retention)).pipe(
108
+ return fromPromise(method(context.cache, "write"), "cache")(entries, retention).pipe(
62
109
  Effect_exports.withSpan("app.cache.flush", {
63
110
  attributes: {
64
111
  "cache.flush.index": flushes++,
@@ -104,50 +151,56 @@ var catalogCache = (options) => Effect_exports.gen(function* () {
104
151
  yield* pageOut();
105
152
  yield* summaryOut();
106
153
  yield* flush();
107
- return { revision, pages: pages2, summaries };
154
+ return {
155
+ revision,
156
+ pages: pages2,
157
+ summaries,
158
+ ...header === void 0 ? {} : { header: yield* json(header) }
159
+ };
108
160
  });
109
161
  const getOptions = {
110
162
  key,
111
163
  schema: schema(Manifest),
112
164
  freshFor,
113
165
  staleFor,
114
- load: (context) => Effect_exports.runPromise(refresh(context), { signal: context.signal })
166
+ ...options.stale === void 0 ? {} : { stale: options.stale },
167
+ // A cache may call the loader as a Promise; its own signal cancels that load.
168
+ load: toPromise(refresh, (context) => context.signal)
115
169
  };
116
- const current = () => cache === void 0 ? Effect_exports.fail(new CacheError({ reason: "unavailable" })) : invoke(() => cache.get(getOptions));
170
+ let reading;
171
+ const current = () => Effect_exports.suspend(() => {
172
+ if (cache === void 0) return Effect_exports.fail(new CacheError({ reason: "unavailable" }));
173
+ const shared = reading;
174
+ if (shared !== void 0) return Deferred_exports.await(shared);
175
+ const deferred = Deferred_exports.makeUnsafe();
176
+ reading = deferred;
177
+ return fromPromise(
178
+ method(cache, "get"),
179
+ "cache"
180
+ )(getOptions).pipe(
181
+ Effect_exports.onExit(
182
+ (exit) => Effect_exports.sync(() => {
183
+ if (reading === deferred) reading = void 0;
184
+ }).pipe(Effect_exports.andThen(Deferred_exports.done(deferred, exit)))
185
+ )
186
+ );
187
+ });
117
188
  if (options.revalidate) {
118
189
  if (cache === void 0) yield* local;
119
- else yield* invoke(() => cache.revalidate(getOptions));
190
+ else yield* fromPromise(method(cache, "revalidate"), "cache")(getOptions);
120
191
  }
121
- const pages = (cache2, revision, kind, count, decoder) => Effect_exports.gen(function* () {
122
- const batches = yield* Effect_exports.forEach(
123
- Array.from({ length: Math.ceil(count / 4) }, (_, batch) => batch * 4),
124
- (offset) => invoke(
125
- () => cache2.readMany(
126
- Array.from(
127
- { length: Math.min(4, count - offset) },
128
- (_, index) => part(revision, kind, offset + index)
129
- ),
130
- schema(Schema_exports.Array(decoder))
131
- )
132
- ),
133
- { concurrency: "unbounded" }
134
- );
135
- const values = [];
136
- for (const page of batches.flat()) {
137
- if (page === void 0) return yield* new CacheError({ reason: "unavailable" });
138
- values.push(...page);
139
- }
140
- return values;
141
- });
142
192
  const metadata = () => Effect_exports.gen(function* () {
143
- if (cache === void 0) return yield* local;
193
+ if (cache === void 0) return (yield* local).tools;
144
194
  const manifest = yield* current();
145
195
  return yield* pages(cache, manifest.revision, "page", manifest.pages, options.schema);
146
196
  });
147
197
  return {
148
198
  list: metadata,
199
+ /** The record stored with the current revision, if the source supplied one. */
200
+ header: () => cache === void 0 ? local.pipe(Effect_exports.map(({ header }) => header)) : current().pipe(Effect_exports.map((manifest) => manifest.header)),
149
201
  summaries: () => Effect_exports.gen(function* () {
150
- if (cache === void 0) return (yield* local).map((tool) => options.summary.of(tool));
202
+ if (cache === void 0)
203
+ return (yield* local).tools.map((tool) => options.summary.of(tool));
151
204
  const manifest = yield* current();
152
205
  return yield* pages(
153
206
  cache,
@@ -157,10 +210,11 @@ var catalogCache = (options) => Effect_exports.gen(function* () {
157
210
  options.summary.schema
158
211
  );
159
212
  }),
160
- resolve: (name) => cache === void 0 ? local.pipe(Effect_exports.map((tools) => tools.find((tool) => tool.name === name))) : current().pipe(
213
+ resolve: (name) => cache === void 0 ? local.pipe(Effect_exports.map(({ tools }) => tools.find((tool) => tool.name === name))) : current().pipe(
161
214
  Effect_exports.flatMap(
162
- (manifest) => invoke(
163
- () => cache.read(part(manifest.revision, "tool", name), schema(options.schema))
215
+ (manifest) => fromPromise(method(cache, "read"), "cache")(
216
+ part(manifest.revision, "tool", name),
217
+ schema(options.schema)
164
218
  )
165
219
  )
166
220
  )
@@ -168,5 +222,6 @@ var catalogCache = (options) => Effect_exports.gen(function* () {
168
222
  });
169
223
 
170
224
  export {
225
+ catalogScope,
171
226
  catalogCache
172
227
  };
@@ -0,0 +1,221 @@
1
+ import {
2
+ fromPromise
3
+ } from "./chunk-LTDHQJ2Z.js";
4
+ import {
5
+ HostedTool,
6
+ RouterKey,
7
+ RouterMeta,
8
+ reservedRouterKeys
9
+ } from "./chunk-JY56GVSV.js";
10
+ import {
11
+ decoderOf,
12
+ schemaArgument
13
+ } from "./chunk-KGCTYL2S.js";
14
+ import {
15
+ Effect_exports,
16
+ Schema_exports
17
+ } from "./chunk-IFJU5SYQ.js";
18
+
19
+ // src/implementation/operations.ts
20
+ var NativeOperation = /* @__PURE__ */ Symbol("apps.Operation");
21
+ var NativeRouterKey = /* @__PURE__ */ Symbol("apps.Router");
22
+ var operationDeclaration = (operation) => ({
23
+ kind: operation.kind,
24
+ [NativeOperation]: operation
25
+ });
26
+ var nativeOperation = (value) => {
27
+ if (typeof value !== "object" || value === null || !(NativeOperation in value)) return void 0;
28
+ return value[NativeOperation];
29
+ };
30
+ var operationOptions = (options) => {
31
+ const approval = options.approval;
32
+ return {
33
+ ...options.description === void 0 ? {} : { description: options.description },
34
+ ...options.title === void 0 ? {} : { title: options.title },
35
+ ...options.annotations === void 0 ? {} : { annotations: options.annotations },
36
+ ...options._meta === void 0 ? {} : { _meta: options._meta },
37
+ input: decoderOf(options.input),
38
+ ...approval === void 0 ? {} : {
39
+ approval: (context) => fromPromise(async () => approval(context), "approval")()
40
+ }
41
+ };
42
+ };
43
+ var approvedOperation = (operation, approval) => {
44
+ const copy = Object.defineProperties({}, Object.getOwnPropertyDescriptors(operation));
45
+ return Object.defineProperty(copy, "approval", {
46
+ enumerable: true,
47
+ value: (context) => fromPromise(async () => approval(context), "approval")()
48
+ });
49
+ };
50
+ var withApproval = (operation, approval) => ({
51
+ ...operation,
52
+ [NativeOperation]: approvedOperation(operation[NativeOperation], approval)
53
+ });
54
+ var toolAnnotations = (operation) => nativeOperation(operation)?.annotations;
55
+ var make = (kind, options, run) => operationDeclaration({
56
+ ...operationOptions({ ...options, input: schemaArgument(options.input, `The ${kind} input`) }),
57
+ kind,
58
+ // The host always validates JSON serialization, even without a stronger output declaration.
59
+ ...options.output === void 0 ? {} : { output: decoderOf(schemaArgument(options.output, `The ${kind} output`)) },
60
+ // SAFETY: defineApp checks the handler context against its requirements.
61
+ // The host validates account bindings and creates the matching storage facade.
62
+ run: (context, input) => fromPromise(run, "handler")(context, input)
63
+ });
64
+ var query = (options, run) => make("query", options, run);
65
+ var mutation = (options, run) => make("mutation", options, run);
66
+
67
+ // src/implementation/router.ts
68
+ var routerDeclaration = (node) => ({
69
+ [NativeRouterKey]: node
70
+ });
71
+ var nativeRouter = (value) => {
72
+ if (typeof value !== "object" || value === null || !(NativeRouterKey in value)) return void 0;
73
+ return value[NativeRouterKey];
74
+ };
75
+ var nativeNode = (value) => nativeOperation(value) ?? nativeRouter(value);
76
+ var metaOf = (options) => {
77
+ if (options === void 0) return void 0;
78
+ const defined = Object.fromEntries(
79
+ Object.entries(options).filter(([, value]) => value !== void 0)
80
+ );
81
+ return Object.keys(defined).length === 0 ? void 0 : Schema_exports.decodeUnknownSync(RouterMeta)(defined);
82
+ };
83
+ var mergeMeta = (base, override) => base === void 0 ? override : override === void 0 ? base : { ...base, ...override };
84
+ function router(children, options) {
85
+ const meta = metaOf(options);
86
+ const existing = nativeRouter(children);
87
+ if (existing !== void 0)
88
+ return routerDeclaration(
89
+ existing.kind === "router" ? { ...existing, ...withMeta(mergeMeta(existing.meta, meta)) } : { ...existing, ...withOverrides(mergeMeta(existing.overrides, meta)) }
90
+ );
91
+ const nodes = {};
92
+ for (const [key, value] of Object.entries(children)) {
93
+ if (reservedRouterKeys.has(key)) throw new Error(`Router key "${key}" is reserved`);
94
+ if (!Schema_exports.is(RouterKey)(key))
95
+ throw new Error(`Router key "${key}" must start with a letter or _ and contain no dots`);
96
+ const node = nativeNode(value);
97
+ if (node === void 0)
98
+ throw new Error(`Router key "${key}" must be a query, mutation or router`);
99
+ nodes[key] = node;
100
+ }
101
+ return routerDeclaration({ kind: "router", ...withMeta(meta), children: nodes });
102
+ }
103
+ var withMeta = (meta) => meta === void 0 ? {} : { meta };
104
+ var withOverrides = (overrides) => overrides === void 0 ? {} : { overrides };
105
+ var dynamicRouter = (source) => {
106
+ const meta = source.meta;
107
+ return routerDeclaration({
108
+ kind: "dynamic",
109
+ ...meta === void 0 ? {} : {
110
+ meta: () => fromPromise(async () => meta(), "router")().pipe(
111
+ Effect_exports.flatMap((options) => Schema_exports.decodeUnknownEffect(RouterMeta)(options))
112
+ )
113
+ },
114
+ list: () => fromPromise(async () => source.list(), "router")().pipe(
115
+ Effect_exports.flatMap(Schema_exports.decodeUnknownEffect(Schema_exports.Array(HostedTool)))
116
+ ),
117
+ resolve: (name) => fromPromise(async () => source.resolve(name), "router")().pipe(
118
+ Effect_exports.map((value) => {
119
+ if (value === void 0) return void 0;
120
+ const operation = nativeOperation(value);
121
+ if (operation === void 0) throw new Error("Expected an operation declaration");
122
+ return operation;
123
+ })
124
+ )
125
+ });
126
+ };
127
+ var joinPath = (path, name) => path === "" ? name : `${path}.${name}`;
128
+ var locate = (root, name) => {
129
+ if (root?.kind === "dynamic") return { kind: "dynamic", source: root, router: "", name };
130
+ let current = root;
131
+ let path = "";
132
+ let rest = name;
133
+ while (current !== void 0) {
134
+ const dot = rest.indexOf(".");
135
+ const key = dot < 0 ? rest : rest.slice(0, dot);
136
+ const child = Object.hasOwn(current.children, key) ? current.children[key] : void 0;
137
+ if (child === void 0) return void 0;
138
+ const remaining = dot < 0 ? void 0 : rest.slice(dot + 1);
139
+ switch (child.kind) {
140
+ case "query":
141
+ case "mutation":
142
+ return remaining === void 0 ? { kind: "operation", operation: child, router: path } : void 0;
143
+ case "dynamic":
144
+ return remaining === void 0 || remaining === "" ? void 0 : { kind: "dynamic", source: child, router: joinPath(path, key), name: remaining };
145
+ case "router":
146
+ if (remaining === void 0) return void 0;
147
+ current = child;
148
+ path = joinPath(path, key);
149
+ rest = remaining;
150
+ }
151
+ }
152
+ return void 0;
153
+ };
154
+ var declaredOperations = (root, path = "") => Object.entries(root?.children ?? {}).flatMap(([key, child]) => {
155
+ const name = joinPath(path, key);
156
+ switch (child.kind) {
157
+ case "query":
158
+ case "mutation":
159
+ return [{ name, router: path, operation: child }];
160
+ case "router":
161
+ return declaredOperations(child, name);
162
+ case "dynamic":
163
+ return [];
164
+ }
165
+ });
166
+ var withApprovals = (source, policy) => {
167
+ const native = nativeRouter(source);
168
+ if (native === void 0) throw new Error("withApprovals expects a router");
169
+ const operation = (node, name) => {
170
+ const approval = policy(operationDeclaration(node), name);
171
+ return approval === void 0 ? node : approvedOperation(node, approval);
172
+ };
173
+ const child = (node, name) => {
174
+ switch (node.kind) {
175
+ case "query":
176
+ case "mutation":
177
+ return operation(node, name);
178
+ case "router":
179
+ case "dynamic":
180
+ return walk(node, name);
181
+ }
182
+ };
183
+ const walk = (node, path) => node.kind === "dynamic" ? {
184
+ ...node,
185
+ resolve: (name) => node.resolve(name).pipe(
186
+ Effect_exports.flatMap(
187
+ (resolved) => resolved === void 0 ? Effect_exports.succeed(void 0) : Effect_exports.try({
188
+ try: () => operation(resolved, joinPath(path, name)),
189
+ catch: (error) => error
190
+ })
191
+ )
192
+ )
193
+ } : {
194
+ ...node,
195
+ children: Object.fromEntries(
196
+ Object.entries(node.children).map(([key, value]) => [
197
+ key,
198
+ child(value, joinPath(path, key))
199
+ ])
200
+ )
201
+ };
202
+ return routerDeclaration(walk(native, ""));
203
+ };
204
+
205
+ export {
206
+ operationDeclaration,
207
+ nativeOperation,
208
+ withApproval,
209
+ toolAnnotations,
210
+ query,
211
+ mutation,
212
+ routerDeclaration,
213
+ nativeRouter,
214
+ mergeMeta,
215
+ router,
216
+ dynamicRouter,
217
+ joinPath,
218
+ locate,
219
+ declaredOperations,
220
+ withApprovals
221
+ };
@@ -5,11 +5,11 @@ import {
5
5
  SkillDefinitionInvalid,
6
6
  SkillFile,
7
7
  SkillFilePath
8
- } from "./chunk-JU7VHODU.js";
8
+ } from "./chunk-H72MEDMN.js";
9
9
  import {
10
10
  Effect_exports,
11
11
  Schema_exports
12
- } from "./chunk-CDL5PM2Q.js";
12
+ } from "./chunk-IFJU5SYQ.js";
13
13
 
14
14
  // src/implementation/skill-files.ts
15
15
  var skillFromFiles = (input, source = {}) => Effect_exports.gen(function* () {