@noodleseed/one 0.129.2 → 0.131.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (231) hide show
  1. package/dist/bin.js +0 -0
  2. package/dist/cli.d.ts.map +1 -1
  3. package/dist/cli.js +3 -0
  4. package/dist/cli.js.map +1 -1
  5. package/dist/commands/intents-ops.d.ts +3 -0
  6. package/dist/commands/intents-ops.d.ts.map +1 -0
  7. package/dist/commands/intents-ops.js +147 -0
  8. package/dist/commands/intents-ops.js.map +1 -0
  9. package/node_modules/@noodle-borg/agent-kit/dist/curated/command-groups.d.ts.map +1 -1
  10. package/node_modules/@noodle-borg/agent-kit/dist/curated/command-groups.js +4 -0
  11. package/node_modules/@noodle-borg/agent-kit/dist/curated/command-groups.js.map +1 -1
  12. package/node_modules/@noodle-borg/agent-kit/dist/curated/error-fixes.js +1 -1
  13. package/node_modules/@noodle-borg/agent-kit/dist/curated/error-fixes.js.map +1 -1
  14. package/node_modules/@noodle-borg/agent-kit/dist/generated/example-files.js +1 -1
  15. package/node_modules/@noodle-borg/agent-kit/dist/generated/example-files.js.map +1 -1
  16. package/node_modules/@noodle-borg/agent-kit/dist/generated/surface.d.ts.map +1 -1
  17. package/node_modules/@noodle-borg/agent-kit/dist/generated/surface.js +1 -0
  18. package/node_modules/@noodle-borg/agent-kit/dist/generated/surface.js.map +1 -1
  19. package/node_modules/@noodle-borg/agent-kit/dist/skill-content.d.ts.map +1 -1
  20. package/node_modules/@noodle-borg/agent-kit/dist/skill-content.js +1 -0
  21. package/node_modules/@noodle-borg/agent-kit/dist/skill-content.js.map +1 -1
  22. package/node_modules/@noodle-borg/agent-kit/dist/skill-embedded-assistant-ref.js +1 -1
  23. package/node_modules/@noodle-borg/agent-kit/dist/skill-embedded-assistant-ref.js.map +1 -1
  24. package/node_modules/@noodle-borg/agent-kit/package.json +1 -1
  25. package/node_modules/@noodle-borg/assistant-gateway/dist/assistant-store.d.ts +21 -0
  26. package/node_modules/@noodle-borg/assistant-gateway/dist/assistant-store.d.ts.map +1 -1
  27. package/node_modules/@noodle-borg/assistant-gateway/dist/assistant-store.js +10 -0
  28. package/node_modules/@noodle-borg/assistant-gateway/dist/assistant-store.js.map +1 -1
  29. package/node_modules/@noodle-borg/assistant-gateway/dist/elevation.d.ts +7 -1
  30. package/node_modules/@noodle-borg/assistant-gateway/dist/elevation.d.ts.map +1 -1
  31. package/node_modules/@noodle-borg/assistant-gateway/dist/elevation.js +5 -0
  32. package/node_modules/@noodle-borg/assistant-gateway/dist/elevation.js.map +1 -1
  33. package/node_modules/@noodle-borg/assistant-gateway/dist/embed-store.d.ts +5 -1
  34. package/node_modules/@noodle-borg/assistant-gateway/dist/embed-store.d.ts.map +1 -1
  35. package/node_modules/@noodle-borg/assistant-gateway/dist/embed-store.js.map +1 -1
  36. package/node_modules/@noodle-borg/assistant-gateway/dist/index.d.ts +1 -0
  37. package/node_modules/@noodle-borg/assistant-gateway/dist/index.d.ts.map +1 -1
  38. package/node_modules/@noodle-borg/assistant-gateway/dist/index.js +1 -0
  39. package/node_modules/@noodle-borg/assistant-gateway/dist/index.js.map +1 -1
  40. package/node_modules/@noodle-borg/assistant-gateway/dist/postgres-assistant.d.ts +8 -1
  41. package/node_modules/@noodle-borg/assistant-gateway/dist/postgres-assistant.d.ts.map +1 -1
  42. package/node_modules/@noodle-borg/assistant-gateway/dist/postgres-assistant.js +24 -1
  43. package/node_modules/@noodle-borg/assistant-gateway/dist/postgres-assistant.js.map +1 -1
  44. package/node_modules/@noodle-borg/assistant-gateway/dist/session-resume.d.ts +22 -0
  45. package/node_modules/@noodle-borg/assistant-gateway/dist/session-resume.d.ts.map +1 -0
  46. package/node_modules/@noodle-borg/assistant-gateway/dist/session-resume.js +28 -0
  47. package/node_modules/@noodle-borg/assistant-gateway/dist/session-resume.js.map +1 -0
  48. package/node_modules/@noodle-borg/assistant-gateway/package.json +1 -1
  49. package/node_modules/@noodle-borg/cli-catalog/dist/catalog-data-hosted-observability.d.ts.map +1 -1
  50. package/node_modules/@noodle-borg/cli-catalog/dist/catalog-data-hosted-observability.js +66 -1
  51. package/node_modules/@noodle-borg/cli-catalog/dist/catalog-data-hosted-observability.js.map +1 -1
  52. package/node_modules/@noodle-borg/compiler/dist/compile.d.ts.map +1 -1
  53. package/node_modules/@noodle-borg/compiler/dist/compile.js +9 -0
  54. package/node_modules/@noodle-borg/compiler/dist/compile.js.map +1 -1
  55. package/node_modules/@noodle-borg/knowledge/dist/fusion.d.ts +2 -1
  56. package/node_modules/@noodle-borg/knowledge/dist/fusion.d.ts.map +1 -1
  57. package/node_modules/@noodle-borg/knowledge/dist/fusion.js +3 -2
  58. package/node_modules/@noodle-borg/knowledge/dist/fusion.js.map +1 -1
  59. package/node_modules/@noodle-borg/knowledge-operations/dist/crawl-lifecycle.d.ts.map +1 -1
  60. package/node_modules/@noodle-borg/knowledge-operations/dist/crawl-lifecycle.js +7 -2
  61. package/node_modules/@noodle-borg/knowledge-operations/dist/crawl-lifecycle.js.map +1 -1
  62. package/node_modules/@noodle-borg/module/dist/index.d.ts +1 -0
  63. package/node_modules/@noodle-borg/module/dist/index.d.ts.map +1 -1
  64. package/node_modules/@noodle-borg/module/dist/index.js +1 -0
  65. package/node_modules/@noodle-borg/module/dist/index.js.map +1 -1
  66. package/node_modules/@noodle-borg/module/dist/intent.d.ts +54 -0
  67. package/node_modules/@noodle-borg/module/dist/intent.d.ts.map +1 -0
  68. package/node_modules/@noodle-borg/module/dist/intent.js +11 -0
  69. package/node_modules/@noodle-borg/module/dist/intent.js.map +1 -0
  70. package/node_modules/@noodle-borg/observability/dist/index.d.ts +6 -0
  71. package/node_modules/@noodle-borg/observability/dist/index.d.ts.map +1 -0
  72. package/node_modules/@noodle-borg/observability/dist/index.js +6 -0
  73. package/node_modules/@noodle-borg/observability/dist/index.js.map +1 -0
  74. package/node_modules/@noodle-borg/observability/dist/intent-capture.d.ts +65 -0
  75. package/node_modules/@noodle-borg/observability/dist/intent-capture.d.ts.map +1 -0
  76. package/node_modules/@noodle-borg/observability/dist/intent-capture.js +327 -0
  77. package/node_modules/@noodle-borg/observability/dist/intent-capture.js.map +1 -0
  78. package/node_modules/@noodle-borg/observability/dist/request-event-buffer.d.ts.map +1 -0
  79. package/node_modules/@noodle-borg/observability/dist/request-event-buffer.js.map +1 -0
  80. package/node_modules/@noodle-borg/observability/dist/request-events-postgres.d.ts.map +1 -0
  81. package/node_modules/@noodle-borg/observability/dist/request-events-postgres.js.map +1 -0
  82. package/node_modules/@noodle-borg/observability/dist/request-events.d.ts.map +1 -0
  83. package/node_modules/@noodle-borg/observability/dist/request-events.js.map +1 -0
  84. package/node_modules/@noodle-borg/observability/dist/runtime.d.ts +11 -0
  85. package/node_modules/@noodle-borg/observability/dist/runtime.d.ts.map +1 -0
  86. package/node_modules/@noodle-borg/observability/dist/runtime.js +29 -0
  87. package/node_modules/@noodle-borg/observability/dist/runtime.js.map +1 -0
  88. package/node_modules/@noodle-borg/observability/package.json +32 -0
  89. package/node_modules/@noodle-borg/protocol/dist/handlers/tools.d.ts.map +1 -1
  90. package/node_modules/@noodle-borg/protocol/dist/handlers/tools.js +22 -3
  91. package/node_modules/@noodle-borg/protocol/dist/handlers/tools.js.map +1 -1
  92. package/node_modules/@noodle-borg/protocol/dist/index.d.ts +1 -0
  93. package/node_modules/@noodle-borg/protocol/dist/index.d.ts.map +1 -1
  94. package/node_modules/@noodle-borg/protocol/dist/index.js +1 -0
  95. package/node_modules/@noodle-borg/protocol/dist/index.js.map +1 -1
  96. package/node_modules/@noodle-borg/protocol/dist/intent-capture.d.ts +47 -0
  97. package/node_modules/@noodle-borg/protocol/dist/intent-capture.d.ts.map +1 -0
  98. package/node_modules/@noodle-borg/protocol/dist/intent-capture.js +101 -0
  99. package/node_modules/@noodle-borg/protocol/dist/intent-capture.js.map +1 -0
  100. package/node_modules/@noodle-borg/protocol/dist/mapping.d.ts +5 -2
  101. package/node_modules/@noodle-borg/protocol/dist/mapping.d.ts.map +1 -1
  102. package/node_modules/@noodle-borg/protocol/dist/mapping.js +9 -7
  103. package/node_modules/@noodle-borg/protocol/dist/mapping.js.map +1 -1
  104. package/node_modules/@noodle-borg/protocol/dist/observation.d.ts +3 -0
  105. package/node_modules/@noodle-borg/protocol/dist/observation.d.ts.map +1 -1
  106. package/node_modules/@noodle-borg/protocol/dist/observation.js.map +1 -1
  107. package/node_modules/@noodle-borg/protocol/dist/sdk-server.d.ts +4 -0
  108. package/node_modules/@noodle-borg/protocol/dist/sdk-server.d.ts.map +1 -1
  109. package/node_modules/@noodle-borg/protocol/dist/sdk-server.js.map +1 -1
  110. package/node_modules/@noodle-borg/protocol/dist/v2/server.d.ts.map +1 -1
  111. package/node_modules/@noodle-borg/protocol/dist/v2/server.js +23 -4
  112. package/node_modules/@noodle-borg/protocol/dist/v2/server.js.map +1 -1
  113. package/node_modules/@noodle-borg/protocol/package.json +1 -0
  114. package/node_modules/@noodle-borg/service/dist/archive-preflight.d.ts +5 -0
  115. package/node_modules/@noodle-borg/service/dist/archive-preflight.d.ts.map +1 -0
  116. package/node_modules/@noodle-borg/service/dist/archive-preflight.js +19 -0
  117. package/node_modules/@noodle-borg/service/dist/archive-preflight.js.map +1 -0
  118. package/node_modules/@noodle-borg/service/dist/index.d.ts +1 -3
  119. package/node_modules/@noodle-borg/service/dist/index.d.ts.map +1 -1
  120. package/node_modules/@noodle-borg/service/dist/index.js +1 -3
  121. package/node_modules/@noodle-borg/service/dist/index.js.map +1 -1
  122. package/node_modules/@noodle-borg/service/dist/main.js +2 -0
  123. package/node_modules/@noodle-borg/service/dist/main.js.map +1 -1
  124. package/node_modules/@noodle-borg/service/dist/observability-runtime.d.ts +25 -0
  125. package/node_modules/@noodle-borg/service/dist/observability-runtime.d.ts.map +1 -0
  126. package/node_modules/@noodle-borg/service/dist/observability-runtime.js +61 -0
  127. package/node_modules/@noodle-borg/service/dist/observability-runtime.js.map +1 -0
  128. package/node_modules/@noodle-borg/service/dist/options.d.ts +10 -1
  129. package/node_modules/@noodle-borg/service/dist/options.d.ts.map +1 -1
  130. package/node_modules/@noodle-borg/service/dist/routes/assistant-elevation.d.ts +2 -0
  131. package/node_modules/@noodle-borg/service/dist/routes/assistant-elevation.d.ts.map +1 -1
  132. package/node_modules/@noodle-borg/service/dist/routes/assistant-elevation.js +3 -0
  133. package/node_modules/@noodle-borg/service/dist/routes/assistant-elevation.js.map +1 -1
  134. package/node_modules/@noodle-borg/service/dist/routes/assistant-embeds.d.ts.map +1 -1
  135. package/node_modules/@noodle-borg/service/dist/routes/assistant-embeds.js +1 -1
  136. package/node_modules/@noodle-borg/service/dist/routes/assistant-embeds.js.map +1 -1
  137. package/node_modules/@noodle-borg/service/dist/routes/assistant.d.ts.map +1 -1
  138. package/node_modules/@noodle-borg/service/dist/routes/assistant.js +70 -30
  139. package/node_modules/@noodle-borg/service/dist/routes/assistant.js.map +1 -1
  140. package/node_modules/@noodle-borg/service/dist/routes/intent-capture-dispatch.d.ts +11 -0
  141. package/node_modules/@noodle-borg/service/dist/routes/intent-capture-dispatch.d.ts.map +1 -0
  142. package/node_modules/@noodle-borg/service/dist/routes/intent-capture-dispatch.js +22 -0
  143. package/node_modules/@noodle-borg/service/dist/routes/intent-capture-dispatch.js.map +1 -0
  144. package/node_modules/@noodle-borg/service/dist/routes/intent-capture.d.ts +20 -0
  145. package/node_modules/@noodle-borg/service/dist/routes/intent-capture.d.ts.map +1 -0
  146. package/node_modules/@noodle-borg/service/dist/routes/intent-capture.js +158 -0
  147. package/node_modules/@noodle-borg/service/dist/routes/intent-capture.js.map +1 -0
  148. package/node_modules/@noodle-borg/service/dist/routes/paths.d.ts +3 -1
  149. package/node_modules/@noodle-borg/service/dist/routes/paths.d.ts.map +1 -1
  150. package/node_modules/@noodle-borg/service/dist/routes/paths.js +6 -0
  151. package/node_modules/@noodle-borg/service/dist/routes/paths.js.map +1 -1
  152. package/node_modules/@noodle-borg/service/dist/serve.d.ts.map +1 -1
  153. package/node_modules/@noodle-borg/service/dist/serve.js +16 -16
  154. package/node_modules/@noodle-borg/service/dist/serve.js.map +1 -1
  155. package/node_modules/@noodle-borg/service/dist/service-resource-cleanup.d.ts +2 -0
  156. package/node_modules/@noodle-borg/service/dist/service-resource-cleanup.d.ts.map +1 -1
  157. package/node_modules/@noodle-borg/service/dist/service-resource-cleanup.js +3 -0
  158. package/node_modules/@noodle-borg/service/dist/service-resource-cleanup.js.map +1 -1
  159. package/node_modules/@noodle-borg/service/dist/service.d.ts.map +1 -1
  160. package/node_modules/@noodle-borg/service/dist/service.js +25 -32
  161. package/node_modules/@noodle-borg/service/dist/service.js.map +1 -1
  162. package/node_modules/@noodle-borg/service/dist/store/postgres-schema.d.ts.map +1 -1
  163. package/node_modules/@noodle-borg/service/dist/store/postgres-schema.js +1 -1
  164. package/node_modules/@noodle-borg/service/dist/store/postgres-schema.js.map +1 -1
  165. package/node_modules/@noodle-borg/service/package.json +2 -1
  166. package/node_modules/@noodle-borg/transport-http/dist/handler.d.ts +6 -1
  167. package/node_modules/@noodle-borg/transport-http/dist/handler.d.ts.map +1 -1
  168. package/node_modules/@noodle-borg/transport-http/dist/handler.js +4 -0
  169. package/node_modules/@noodle-borg/transport-http/dist/handler.js.map +1 -1
  170. package/node_modules/@noodle-borg/transport-http/dist/request-capture.d.ts +15 -1
  171. package/node_modules/@noodle-borg/transport-http/dist/request-capture.d.ts.map +1 -1
  172. package/node_modules/@noodle-borg/transport-http/dist/request-capture.js +51 -3
  173. package/node_modules/@noodle-borg/transport-http/dist/request-capture.js.map +1 -1
  174. package/node_modules/@noodle-borg/transport-http/dist/serve-request.d.ts +3 -1
  175. package/node_modules/@noodle-borg/transport-http/dist/serve-request.d.ts.map +1 -1
  176. package/node_modules/@noodle-borg/transport-http/dist/serve-request.js +21 -5
  177. package/node_modules/@noodle-borg/transport-http/dist/serve-request.js.map +1 -1
  178. package/node_modules/@noodle-borg/wire-contracts/dist/assistant.d.ts +40 -2
  179. package/node_modules/@noodle-borg/wire-contracts/dist/assistant.d.ts.map +1 -1
  180. package/node_modules/@noodle-borg/wire-contracts/dist/assistant.js +26 -2
  181. package/node_modules/@noodle-borg/wire-contracts/dist/assistant.js.map +1 -1
  182. package/node_modules/@noodleseed/assistant/README.md +23 -1
  183. package/node_modules/@noodleseed/assistant/dist/{chunk-DLUINP4W.js → chunk-LEKEIHJV.js} +61 -33
  184. package/node_modules/@noodleseed/assistant/dist/{chunk-DLUINP4W.js.map → chunk-LEKEIHJV.js.map} +1 -1
  185. package/node_modules/@noodleseed/assistant/dist/{chunk-52XT7BLR.js → chunk-ZPZHPXIQ.js} +129 -82
  186. package/node_modules/@noodleseed/assistant/dist/chunk-ZPZHPXIQ.js.map +1 -0
  187. package/node_modules/@noodleseed/assistant/dist/{client-7o7n2nqw.d.cts → client-BZ7xPwfW.d.cts} +14 -5
  188. package/node_modules/@noodleseed/assistant/dist/{client-CysBQBdd.d.ts → client-BkJlpN5N.d.ts} +14 -5
  189. package/node_modules/@noodleseed/assistant/dist/client.cjs +127 -80
  190. package/node_modules/@noodleseed/assistant/dist/client.cjs.map +1 -1
  191. package/node_modules/@noodleseed/assistant/dist/client.d.cts +1 -1
  192. package/node_modules/@noodleseed/assistant/dist/client.d.ts +1 -1
  193. package/node_modules/@noodleseed/assistant/dist/client.js +1 -1
  194. package/node_modules/@noodleseed/assistant/dist/embed.global.js +65 -65
  195. package/node_modules/@noodleseed/assistant/dist/index.cjs +186 -111
  196. package/node_modules/@noodleseed/assistant/dist/index.cjs.map +1 -1
  197. package/node_modules/@noodleseed/assistant/dist/index.d.cts +2 -2
  198. package/node_modules/@noodleseed/assistant/dist/index.d.ts +2 -2
  199. package/node_modules/@noodleseed/assistant/dist/index.js +2 -2
  200. package/node_modules/@noodleseed/assistant/dist/react/client.cjs +127 -80
  201. package/node_modules/@noodleseed/assistant/dist/react/client.cjs.map +1 -1
  202. package/node_modules/@noodleseed/assistant/dist/react/client.d.cts +1 -1
  203. package/node_modules/@noodleseed/assistant/dist/react/client.d.ts +1 -1
  204. package/node_modules/@noodleseed/assistant/dist/react/client.js +1 -1
  205. package/node_modules/@noodleseed/assistant/dist/react.cjs +187 -111
  206. package/node_modules/@noodleseed/assistant/dist/react.cjs.map +1 -1
  207. package/node_modules/@noodleseed/assistant/dist/react.d.cts +8 -1
  208. package/node_modules/@noodleseed/assistant/dist/react.d.ts +8 -1
  209. package/node_modules/@noodleseed/assistant/dist/react.js +3 -2
  210. package/node_modules/@noodleseed/assistant/dist/react.js.map +1 -1
  211. package/node_modules/@noodleseed/assistant/dist/server.cjs +1 -0
  212. package/node_modules/@noodleseed/assistant/dist/server.cjs.map +1 -1
  213. package/node_modules/@noodleseed/assistant/dist/server.d.cts +15 -0
  214. package/node_modules/@noodleseed/assistant/dist/server.d.ts +15 -0
  215. package/node_modules/@noodleseed/assistant/dist/server.js +1 -0
  216. package/node_modules/@noodleseed/assistant/dist/server.js.map +1 -1
  217. package/node_modules/@noodleseed/assistant/package.json +1 -1
  218. package/package.json +3 -2
  219. package/node_modules/@noodle-borg/service/dist/store/request-event-buffer.d.ts.map +0 -1
  220. package/node_modules/@noodle-borg/service/dist/store/request-event-buffer.js.map +0 -1
  221. package/node_modules/@noodle-borg/service/dist/store/request-events-postgres.d.ts.map +0 -1
  222. package/node_modules/@noodle-borg/service/dist/store/request-events-postgres.js.map +0 -1
  223. package/node_modules/@noodle-borg/service/dist/store/request-events.d.ts.map +0 -1
  224. package/node_modules/@noodle-borg/service/dist/store/request-events.js.map +0 -1
  225. package/node_modules/@noodleseed/assistant/dist/chunk-52XT7BLR.js.map +0 -1
  226. /package/node_modules/@noodle-borg/{service/dist/store → observability/dist}/request-event-buffer.d.ts +0 -0
  227. /package/node_modules/@noodle-borg/{service/dist/store → observability/dist}/request-event-buffer.js +0 -0
  228. /package/node_modules/@noodle-borg/{service/dist/store → observability/dist}/request-events-postgres.d.ts +0 -0
  229. /package/node_modules/@noodle-borg/{service/dist/store → observability/dist}/request-events-postgres.js +0 -0
  230. /package/node_modules/@noodle-borg/{service/dist/store → observability/dist}/request-events.d.ts +0 -0
  231. /package/node_modules/@noodle-borg/{service/dist/store → observability/dist}/request-events.js +0 -0
@@ -27030,6 +27030,12 @@ var AssistantChatStateStore = class {
27030
27030
  case "interaction_started":
27031
27031
  this.#beginInteraction(event.data.id);
27032
27032
  return;
27033
+ case "resume_started":
27034
+ this.#status = "submitted";
27035
+ this.#error = void 0;
27036
+ this.#startOperation();
27037
+ this.#notify();
27038
+ return;
27033
27039
  case "content":
27034
27040
  this.#writeText(event.data.delta);
27035
27041
  return;
@@ -27285,6 +27291,78 @@ function isRecord(value) {
27285
27291
  return typeof value === "object" && value !== null && !Array.isArray(value);
27286
27292
  }
27287
27293
 
27294
+ // src/client-errors.ts
27295
+ async function refusalCode(response) {
27296
+ try {
27297
+ const body = await response.clone().json();
27298
+ const code = body.code;
27299
+ return typeof code === "string" ? code : void 0;
27300
+ } catch {
27301
+ return void 0;
27302
+ }
27303
+ }
27304
+ var UNRETRYABLE_SERVICE_CODES = /* @__PURE__ */ new Set([
27305
+ "daily_turn_budget_exhausted",
27306
+ "daily_session_budget_exhausted"
27307
+ ]);
27308
+ var AssistantClientError = class extends Error {
27309
+ detail;
27310
+ constructor(detail, message, options) {
27311
+ super(message, options);
27312
+ this.name = "AssistantClientError";
27313
+ this.detail = detail;
27314
+ }
27315
+ };
27316
+ function parseSession(value) {
27317
+ if (!isRecord2(value) || !isRecord2(value.endpoints)) {
27318
+ throw clientError("session_failed", "Assistant session response is invalid", true);
27319
+ }
27320
+ const interactions = value.endpoints.interactions;
27321
+ const apps = value.endpoints.apps;
27322
+ const sandbox = value.endpoints.sandbox;
27323
+ if (typeof value.token !== "string" || typeof value.expiresAt !== "string" || typeof value.endpoints.turns !== "string" || typeof value.endpoints.toolConfirmations !== "string" || interactions !== void 0 && typeof interactions !== "string" || apps !== void 0 && typeof apps !== "string" || sandbox !== void 0 && typeof sandbox !== "string") {
27324
+ throw clientError("session_failed", "Assistant session response is invalid", true);
27325
+ }
27326
+ return {
27327
+ token: value.token,
27328
+ expiresAt: value.expiresAt,
27329
+ endpoints: {
27330
+ turns: value.endpoints.turns,
27331
+ toolConfirmations: value.endpoints.toolConfirmations,
27332
+ ...typeof interactions === "string" ? { interactions } : {},
27333
+ ...typeof apps === "string" ? { apps } : {},
27334
+ ...typeof sandbox === "string" ? { sandbox } : {}
27335
+ },
27336
+ ...isRecord2(value.configuration) ? { configuration: value.configuration } : {},
27337
+ ...isRecord2(value.resume) && typeof value.resume.tool === "string" ? { resume: { tool: value.resume.tool } } : {}
27338
+ };
27339
+ }
27340
+ function isRecord2(value) {
27341
+ return typeof value === "object" && value !== null && !Array.isArray(value);
27342
+ }
27343
+ async function readStableErrorCode(response) {
27344
+ let value;
27345
+ try {
27346
+ value = await response.json();
27347
+ } catch {
27348
+ return void 0;
27349
+ }
27350
+ if (!isRecord2(value) || typeof value.code !== "string") return void 0;
27351
+ return /^[A-Za-z0-9_.-]{1,64}$/.test(value.code) ? value.code : void 0;
27352
+ }
27353
+ function clientError(code, message, retryable, status, options, serviceCode) {
27354
+ return new AssistantClientError(
27355
+ {
27356
+ code,
27357
+ ...status === void 0 ? {} : { status },
27358
+ retryable,
27359
+ ...serviceCode === void 0 ? {} : { serviceCode }
27360
+ },
27361
+ message,
27362
+ options
27363
+ );
27364
+ }
27365
+
27288
27366
  // src/events.ts
27289
27367
  function toAssistantClientEvent(event) {
27290
27368
  const value = event.data;
@@ -27300,12 +27378,12 @@ function toAssistantClientEvent(event) {
27300
27378
  }
27301
27379
  break;
27302
27380
  case "tool_proposed":
27303
- if (hasString(value, "id") && hasString(value, "tool") && hasOptionalString(value.title) && hasOptionalString(value.description) && hasOptionalJson(value.arguments) && (value.reviewSchema === void 0 || isRecord2(value.reviewSchema)) && hasOptionalString(value.expiresAt) && (value.requiresConfirmation === void 0 || value.requiresConfirmation === true) && hasOptionalTurnId(value)) {
27381
+ if (hasString(value, "id") && hasString(value, "tool") && hasOptionalString(value.title) && hasOptionalString(value.description) && hasOptionalJson(value.arguments) && (value.reviewSchema === void 0 || isRecord3(value.reviewSchema)) && hasOptionalString(value.expiresAt) && (value.requiresConfirmation === void 0 || value.requiresConfirmation === true) && hasOptionalTurnId(value)) {
27304
27382
  return event;
27305
27383
  }
27306
27384
  break;
27307
27385
  case "input_requested":
27308
- if (hasString(value, "id") && hasString(value, "message") && isRecord2(value.requestedSchema) && hasString(value, "expiresAt") && hasOptionalTurnId(value)) {
27386
+ if (hasString(value, "id") && hasString(value, "message") && isRecord3(value.requestedSchema) && hasString(value, "expiresAt") && hasOptionalTurnId(value)) {
27309
27387
  return event;
27310
27388
  }
27311
27389
  break;
@@ -27349,7 +27427,7 @@ function toAssistantClientEvent(event) {
27349
27427
  return { event: "unrecognized", data: { name: event.event, payload: value } };
27350
27428
  }
27351
27429
  function isViewAvailableDetail(value) {
27352
- return hasString(value, "id") && hasString(value, "tool") && typeof value.resourceUri === "string" && value.resourceUri.startsWith("ui://") && hasOptionalString(value.title) && (value.replayed === void 0 || value.replayed === true) && isJsonValue(value.result, 0) && hasOptionalJson(value.arguments) && hasOptionalString(value.html) && (value.resourceMeta === void 0 || isRecord2(value.resourceMeta)) && (value.allowedOpenDomains === void 0 || Array.isArray(value.allowedOpenDomains) && value.allowedOpenDomains.every(isHttpsUrl)) && hasOptionalTurnId(value);
27430
+ return hasString(value, "id") && hasString(value, "tool") && typeof value.resourceUri === "string" && value.resourceUri.startsWith("ui://") && hasOptionalString(value.title) && (value.replayed === void 0 || value.replayed === true) && isJsonValue(value.result, 0) && hasOptionalJson(value.arguments) && hasOptionalString(value.html) && (value.resourceMeta === void 0 || isRecord3(value.resourceMeta)) && (value.allowedOpenDomains === void 0 || Array.isArray(value.allowedOpenDomains) && value.allowedOpenDomains.every(isHttpsUrl)) && hasOptionalTurnId(value);
27353
27431
  }
27354
27432
  function isHttpsUrl(value) {
27355
27433
  if (typeof value !== "string") return false;
@@ -27382,11 +27460,11 @@ function isJsonValue(value, depth) {
27382
27460
  if (Array.isArray(value)) {
27383
27461
  return value.length <= 256 && value.every((entry) => isJsonValue(entry, depth + 1));
27384
27462
  }
27385
- if (!isRecord2(value)) return false;
27463
+ if (!isRecord3(value)) return false;
27386
27464
  const entries2 = Object.entries(value);
27387
27465
  return entries2.length <= 256 && entries2.every(([, entry]) => isJsonValue(entry, depth + 1));
27388
27466
  }
27389
- function isRecord2(value) {
27467
+ function isRecord3(value) {
27390
27468
  return typeof value === "object" && value !== null && !Array.isArray(value);
27391
27469
  }
27392
27470
 
@@ -27516,15 +27594,15 @@ function parseFrame(frame) {
27516
27594
  if (event === "done" && !isValidDonePayload(parsed)) {
27517
27595
  throw invalidStream("assistant event stream contained an invalid done event");
27518
27596
  }
27519
- return { event, data: isRecord3(parsed) ? parsed : { value: parsed } };
27597
+ return { event, data: isRecord4(parsed) ? parsed : { value: parsed } };
27520
27598
  }
27521
27599
  function normalizeLineEndings(input) {
27522
27600
  return input.replaceAll("\r\n", "\n").replaceAll("\r", "\n");
27523
27601
  }
27524
27602
  function isValidDonePayload(value) {
27525
- return isRecord3(value) && (value.turnId === void 0 || typeof value.turnId === "string" && value.turnId.length > 0);
27603
+ return isRecord4(value) && (value.turnId === void 0 || typeof value.turnId === "string" && value.turnId.length > 0);
27526
27604
  }
27527
- function isRecord3(value) {
27605
+ function isRecord4(value) {
27528
27606
  return typeof value === "object" && value !== null && !Array.isArray(value);
27529
27607
  }
27530
27608
  function invalidStream(message, cause) {
@@ -27535,27 +27613,6 @@ function isAbortError2(error51) {
27535
27613
  }
27536
27614
 
27537
27615
  // src/client.ts
27538
- async function refusalCode(response) {
27539
- try {
27540
- const body = await response.clone().json();
27541
- const code = body.code;
27542
- return typeof code === "string" ? code : void 0;
27543
- } catch {
27544
- return void 0;
27545
- }
27546
- }
27547
- var UNRETRYABLE_SERVICE_CODES = /* @__PURE__ */ new Set([
27548
- "daily_turn_budget_exhausted",
27549
- "daily_session_budget_exhausted"
27550
- ]);
27551
- var AssistantClientError = class extends Error {
27552
- detail;
27553
- constructor(detail, message, options) {
27554
- super(message, options);
27555
- this.name = "AssistantClientError";
27556
- this.detail = detail;
27557
- }
27558
- };
27559
27616
  var DefaultAssistantClient = class {
27560
27617
  #source;
27561
27618
  #fetch;
@@ -27590,12 +27647,50 @@ var DefaultAssistantClient = class {
27590
27647
  hasSession() {
27591
27648
  return this.#session !== void 0;
27592
27649
  }
27650
+ /** Whether a request holds the single-flight slot, so callers can refuse before mutating UI. */
27651
+ isBusy() {
27652
+ return this.#active !== void 0;
27653
+ }
27593
27654
  async connect() {
27594
27655
  if (this.#session) return;
27595
27656
  await this.#singleFlight(async (signal) => {
27596
- if (!this.#session) await this.#createSession(signal);
27657
+ if (this.#session) return;
27658
+ const session = await this.#createSession(signal);
27659
+ if (session.resume) {
27660
+ try {
27661
+ await this.#runChatOperation(signal, () => this.#resumeTurn(session, signal));
27662
+ } catch {
27663
+ }
27664
+ }
27597
27665
  });
27598
27666
  }
27667
+ /** POST the one-shot resume trigger; a 409 means nothing was pending, which renders as silence. */
27668
+ async #resumeTurn(session, signal) {
27669
+ const response = await this.#request(
27670
+ session.endpoints.turns,
27671
+ {
27672
+ method: "POST",
27673
+ headers: authorizedHeaders(session.token, "text/event-stream"),
27674
+ body: JSON.stringify({ resume: true }),
27675
+ signal
27676
+ },
27677
+ "turn_failed"
27678
+ );
27679
+ if (response.status === 409) return;
27680
+ if (!response.ok) {
27681
+ throw clientError(
27682
+ "turn_failed",
27683
+ `Assistant turn failed (${response.status})`,
27684
+ false,
27685
+ response.status,
27686
+ void 0,
27687
+ await refusalCode(response)
27688
+ );
27689
+ }
27690
+ this.#emit({ event: "resume_started", data: { tool: session.resume?.tool ?? "" } });
27691
+ await this.#consume(response);
27692
+ this.#emit({ event: "message_completed", data: {} });
27693
+ }
27599
27694
  async sendMessage(text3) {
27600
27695
  const message = text3.trim();
27601
27696
  if (!message) return;
@@ -28000,10 +28095,10 @@ function authorizedHeaders(token, accept) {
28000
28095
  };
28001
28096
  }
28002
28097
  function parseAppInteraction(value) {
28003
- if (!isRecord4(value) || !isRecord4(value.interaction)) return void 0;
28098
+ if (!isRecord2(value) || !isRecord2(value.interaction)) return void 0;
28004
28099
  const event = value.interaction.event;
28005
28100
  const data = value.interaction.data;
28006
- if (event !== "tool_proposed" && event !== "input_requested" || !isRecord4(data)) {
28101
+ if (event !== "tool_proposed" && event !== "input_requested" || !isRecord2(data)) {
28007
28102
  return void 0;
28008
28103
  }
28009
28104
  const parsed = toAssistantClientEvent({ event, data });
@@ -28023,54 +28118,6 @@ function appInteractionStopped(action) {
28023
28118
  isError: true
28024
28119
  };
28025
28120
  }
28026
- function parseSession(value) {
28027
- if (!isRecord4(value) || !isRecord4(value.endpoints)) {
28028
- throw clientError("session_failed", "Assistant session response is invalid", true);
28029
- }
28030
- const interactions = value.endpoints.interactions;
28031
- const apps = value.endpoints.apps;
28032
- const sandbox = value.endpoints.sandbox;
28033
- if (typeof value.token !== "string" || typeof value.expiresAt !== "string" || typeof value.endpoints.turns !== "string" || typeof value.endpoints.toolConfirmations !== "string" || interactions !== void 0 && typeof interactions !== "string" || apps !== void 0 && typeof apps !== "string" || sandbox !== void 0 && typeof sandbox !== "string") {
28034
- throw clientError("session_failed", "Assistant session response is invalid", true);
28035
- }
28036
- return {
28037
- token: value.token,
28038
- expiresAt: value.expiresAt,
28039
- endpoints: {
28040
- turns: value.endpoints.turns,
28041
- toolConfirmations: value.endpoints.toolConfirmations,
28042
- ...typeof interactions === "string" ? { interactions } : {},
28043
- ...typeof apps === "string" ? { apps } : {},
28044
- ...typeof sandbox === "string" ? { sandbox } : {}
28045
- },
28046
- ...isRecord4(value.configuration) ? { configuration: value.configuration } : {}
28047
- };
28048
- }
28049
- function isRecord4(value) {
28050
- return typeof value === "object" && value !== null && !Array.isArray(value);
28051
- }
28052
- async function readStableErrorCode(response) {
28053
- let value;
28054
- try {
28055
- value = await response.json();
28056
- } catch {
28057
- return void 0;
28058
- }
28059
- if (!isRecord4(value) || typeof value.code !== "string") return void 0;
28060
- return /^[A-Za-z0-9_.-]{1,64}$/.test(value.code) ? value.code : void 0;
28061
- }
28062
- function clientError(code, message, retryable, status, options, serviceCode) {
28063
- return new AssistantClientError(
28064
- {
28065
- code,
28066
- ...status === void 0 ? {} : { status },
28067
- retryable,
28068
- ...serviceCode === void 0 ? {} : { serviceCode }
28069
- },
28070
- message,
28071
- options
28072
- );
28073
- }
28074
28121
 
28075
28122
  // src/input-request-card.ts
28076
28123
  function createInputRequestCard(options) {
@@ -31255,6 +31302,11 @@ var AssistantElementEventController = class {
31255
31302
  this.#completedTool = void 0;
31256
31303
  return;
31257
31304
  }
31305
+ if (name21 === "resume_started") {
31306
+ this.#startStream("message");
31307
+ this.#host.element.dispatchEvent(new CustomEvent("assistant-message-started"));
31308
+ return;
31309
+ }
31258
31310
  if (name21 === "interaction_completed") {
31259
31311
  if (this.#streamKind !== "interaction") return;
31260
31312
  this.#finishInteraction(String(data.id ?? ""), String(data.action ?? "accept"));
@@ -31473,6 +31525,36 @@ function queryRequired(root, selector) {
31473
31525
  if (!element) throw new Error(`assistant renderer is missing ${selector}`);
31474
31526
  return element;
31475
31527
  }
31528
+ function assistantElementMarkup(appearance, open, styles) {
31529
+ return `${styles}
31530
+ <button class="launcher" type="button" aria-label="${escapeAttribute(appearance.labels.open)}" aria-controls="assistant-panel" aria-expanded="${String(open)}"><slot name="launcher-icon"></slot><span class="visually-hidden" data-session-status aria-live="polite" hidden></span></button>
31531
+ <section class="panel" id="assistant-panel" role="dialog" aria-label="${escapeAttribute(appearance.brand.name)}">
31532
+ <header><slot name="header-leading"></slot><img class="brand-logo" alt=""><strong></strong><slot name="header-actions"></slot><button class="close" type="button" aria-label="${escapeAttribute(appearance.labels.close)}"></button></header>
31533
+ <div class="welcome"><slot name="empty-state"></slot></div>
31534
+ <div class="suggested-prompts"></div>
31535
+ <div class="messages-region">
31536
+ <div class="messages" aria-live="polite"></div>
31537
+ <button class="new-messages" type="button" aria-label="${escapeAttribute(appearance.labels.newMessages)}" hidden></button>
31538
+ </div>
31539
+ <form><slot name="composer-leading"></slot><textarea rows="1"></textarea><button class="send" type="submit"></button><slot name="composer-trailing"></slot></form>
31540
+ <nav class="legal" aria-label="Legal"></nav>
31541
+ <slot name="conversation-footer"></slot>
31542
+ </section>`;
31543
+ }
31544
+ function appendLegalLinks(legal, appearance) {
31545
+ for (const [label, href] of [
31546
+ ["Privacy", appearance.privacyUrl],
31547
+ ["Terms", appearance.termsUrl]
31548
+ ]) {
31549
+ if (!href) continue;
31550
+ const link = document.createElement("a");
31551
+ link.href = href;
31552
+ link.target = "_blank";
31553
+ link.rel = "noopener noreferrer";
31554
+ link.textContent = label;
31555
+ legal.append(link);
31556
+ }
31557
+ }
31476
31558
 
31477
31559
  // src/element-page-context-controller.ts
31478
31560
  var AssistantElementPageContextController = class {
@@ -32260,6 +32342,8 @@ var NoodleAssistantElement = class extends HTMLElementBase {
32260
32342
  #pendingUserEcho;
32261
32343
  #sessionState = "idle";
32262
32344
  #startOpenApplied = false;
32345
+ #readyDispatched = false;
32346
+ #turnInFlight = false;
32263
32347
  #hostAppearance;
32264
32348
  #appearanceWarningKeys = /* @__PURE__ */ new Set();
32265
32349
  #appearanceStyleSnapshot = /* @__PURE__ */ new Map();
@@ -32331,7 +32415,10 @@ var NoodleAssistantElement = class extends HTMLElementBase {
32331
32415
  document.addEventListener("pointerdown", this.#handleDocumentPointerDown);
32332
32416
  if (this.#appearance.behavior.startOpen) this.#applyStartOpenPolicy();
32333
32417
  this.#render();
32334
- this.dispatchEvent(new CustomEvent("assistant-ready"));
32418
+ if (!this.#readyDispatched) {
32419
+ this.#readyDispatched = true;
32420
+ this.dispatchEvent(new CustomEvent("assistant-ready"));
32421
+ }
32335
32422
  if (this.hasAttribute("start-open")) {
32336
32423
  this.setAttribute("open", "");
32337
32424
  this.#startOpenApplied = true;
@@ -32445,7 +32532,14 @@ var NoodleAssistantElement = class extends HTMLElementBase {
32445
32532
  async sendMessage(text3) {
32446
32533
  const message = text3.trim();
32447
32534
  if (!message) return;
32535
+ if (this.#turnInFlight) {
32536
+ throw new AssistantClientError(
32537
+ { code: "request_in_progress", retryable: true },
32538
+ "an assistant request is already in progress"
32539
+ );
32540
+ }
32448
32541
  const generation = this.#conversationGeneration;
32542
+ this.#turnInFlight = true;
32449
32543
  this.#pendingUserEcho = message;
32450
32544
  this.#appendMessage("user", message);
32451
32545
  this.#setBusy(true);
@@ -32462,6 +32556,7 @@ var NoodleAssistantElement = class extends HTMLElementBase {
32462
32556
  this.#dispatchClientError(error51, "turn_failed");
32463
32557
  throw error51;
32464
32558
  } finally {
32559
+ this.#turnInFlight = false;
32465
32560
  if (this.#pendingUserEcho === message) this.#pendingUserEcho = void 0;
32466
32561
  if (generation === this.#conversationGeneration) this.#setBusy(false);
32467
32562
  }
@@ -32530,6 +32625,7 @@ var NoodleAssistantElement = class extends HTMLElementBase {
32530
32625
  #primeSession() {
32531
32626
  if (!this.sessionEndpoint && !this.embedId) return;
32532
32627
  if (this.#sessionBootstrap || this.#client?.hasSession()) return;
32628
+ if (this.#client?.isBusy?.() === true) return;
32533
32629
  if (this.embedId && !this.#pageContext) void this.#automaticPageContext.refresh();
32534
32630
  const client = this.#ensureClient();
32535
32631
  const generation = this.#conversationGeneration;
@@ -32559,6 +32655,8 @@ var NoodleAssistantElement = class extends HTMLElementBase {
32559
32655
  if (event.event === "content" || event.event === "message_completed" || event.event === "interaction_completed" || event.event === "error") {
32560
32656
  this.#removeThinking();
32561
32657
  }
32658
+ if (event.event === "resume_started") this.#setBusy(true);
32659
+ if (event.event === "message_completed" || event.event === "error") this.#setBusy(false);
32562
32660
  }
32563
32661
  #setBusy(busy) {
32564
32662
  this.toggleAttribute("busy", busy);
@@ -32767,7 +32865,7 @@ var NoodleAssistantElement = class extends HTMLElementBase {
32767
32865
  queryRequired(this.shadowRoot, "header").hidden = !appearance.behavior.showHeader;
32768
32866
  const legal = queryRequired(this.shadowRoot, ".legal");
32769
32867
  legal.replaceChildren();
32770
- this.#appendLegalLinks(legal);
32868
+ appendLegalLinks(legal, this.#appearance);
32771
32869
  this.#applyTheme();
32772
32870
  }
32773
32871
  #render() {
@@ -32783,20 +32881,11 @@ var NoodleAssistantElement = class extends HTMLElementBase {
32783
32881
  this.dataset.position = appearance.layout.position;
32784
32882
  this.dataset.density = appearance.layout.density;
32785
32883
  this.toggleAttribute("mobile-fullscreen", appearance.layout.mobileFullscreen);
32786
- this.shadowRoot.innerHTML = `${ASSISTANT_ELEMENT_STYLES}${presentationStyles}
32787
- <button class="launcher" type="button" aria-label="${escapeAttribute(appearance.labels.open)}" aria-controls="assistant-panel" aria-expanded="${String(this.hasAttribute("open"))}"><slot name="launcher-icon"></slot><span class="visually-hidden" data-session-status aria-live="polite" hidden></span></button>
32788
- <section class="panel" id="assistant-panel" role="dialog" aria-label="${escapeAttribute(appearance.brand.name)}">
32789
- <header><slot name="header-leading"></slot><img class="brand-logo" alt=""><strong></strong><slot name="header-actions"></slot><button class="close" type="button" aria-label="${escapeAttribute(appearance.labels.close)}"></button></header>
32790
- <div class="welcome"><slot name="empty-state"></slot></div>
32791
- <div class="suggested-prompts"></div>
32792
- <div class="messages-region">
32793
- <div class="messages" aria-live="polite"></div>
32794
- <button class="new-messages" type="button" aria-label="${escapeAttribute(appearance.labels.newMessages)}" hidden></button>
32795
- </div>
32796
- <form><slot name="composer-leading"></slot><textarea rows="1"></textarea><button class="send" type="submit"></button><slot name="composer-trailing"></slot></form>
32797
- <nav class="legal" aria-label="Legal"></nav>
32798
- <slot name="conversation-footer"></slot>
32799
- </section>`;
32884
+ this.shadowRoot.innerHTML = assistantElementMarkup(
32885
+ appearance,
32886
+ this.hasAttribute("open"),
32887
+ `${ASSISTANT_ELEMENT_STYLES}${presentationStyles}`
32888
+ );
32800
32889
  queryRequired(this.shadowRoot, "strong").textContent = appearance.brand.name;
32801
32890
  const logo = queryRequired(this.shadowRoot, ".brand-logo");
32802
32891
  const logoUrl = appearance.brand.logo[this.#resolvedMode()];
@@ -32823,7 +32912,7 @@ var NoodleAssistantElement = class extends HTMLElementBase {
32823
32912
  if (!appearance.behavior.showHeader)
32824
32913
  queryRequired(this.shadowRoot, "header").hidden = true;
32825
32914
  const legal = queryRequired(this.shadowRoot, ".legal");
32826
- this.#appendLegalLinks(legal);
32915
+ appendLegalLinks(legal, this.#appearance);
32827
32916
  this.#messages = this.shadowRoot.querySelector(".messages") ?? void 0;
32828
32917
  this.#messages?.append(...conversation);
32829
32918
  this.#thinking = this.#messages?.querySelector(".thinking") ?? void 0;
@@ -32862,20 +32951,6 @@ var NoodleAssistantElement = class extends HTMLElementBase {
32862
32951
  });
32863
32952
  this.#applyTheme();
32864
32953
  }
32865
- #appendLegalLinks(legal) {
32866
- for (const [label, href] of [
32867
- ["Privacy", this.#appearance.privacyUrl],
32868
- ["Terms", this.#appearance.termsUrl]
32869
- ]) {
32870
- if (!href) continue;
32871
- const link = document.createElement("a");
32872
- link.href = href;
32873
- link.target = "_blank";
32874
- link.rel = "noopener noreferrer";
32875
- link.textContent = label;
32876
- legal.append(link);
32877
- }
32878
- }
32879
32954
  };
32880
32955
  function registerNoodleAssistant() {
32881
32956
  if (globalThis.customElements && !customElements.get(ASSISTANT_TAG_NAME)) {