@noodleseed/one 0.151.1 → 0.153.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 (379) hide show
  1. package/dist/agent-product-skill-state.d.ts +2 -2
  2. package/dist/agent-product-skill-state.d.ts.map +1 -1
  3. package/dist/agent-product-skill-state.js.map +1 -1
  4. package/dist/agent-skills-state.d.ts +2 -2
  5. package/dist/agent-skills-state.d.ts.map +1 -1
  6. package/dist/agent-skills-state.js +1 -1
  7. package/dist/agent-skills-state.js.map +1 -1
  8. package/dist/agents.d.ts +2 -3
  9. package/dist/agents.d.ts.map +1 -1
  10. package/dist/agents.js.map +1 -1
  11. package/dist/assistant-embed-scaffold-template.d.ts +1 -0
  12. package/dist/assistant-embed-scaffold-template.d.ts.map +1 -1
  13. package/dist/assistant-embed-scaffold-template.js +80 -12
  14. package/dist/assistant-embed-scaffold-template.js.map +1 -1
  15. package/dist/checklist.d.ts +2 -1
  16. package/dist/checklist.d.ts.map +1 -1
  17. package/dist/commands/apps-ops.d.ts +0 -4
  18. package/dist/commands/apps-ops.d.ts.map +1 -1
  19. package/dist/commands/apps-ops.js +3 -3
  20. package/dist/commands/apps-ops.js.map +1 -1
  21. package/dist/commands/assistant-embed-ops.d.ts.map +1 -1
  22. package/dist/commands/assistant-embed-ops.js +141 -4
  23. package/dist/commands/assistant-embed-ops.js.map +1 -1
  24. package/dist/commands/assistant-ops.js +1 -1
  25. package/dist/commands/assistant-ops.js.map +1 -1
  26. package/dist/commands/auth-ops.d.ts +0 -14
  27. package/dist/commands/auth-ops.d.ts.map +1 -1
  28. package/dist/commands/auth-ops.js +1 -1
  29. package/dist/commands/auth-ops.js.map +1 -1
  30. package/dist/commands/author-loop.d.ts +0 -2
  31. package/dist/commands/author-loop.d.ts.map +1 -1
  32. package/dist/commands/author-loop.js +2 -2
  33. package/dist/commands/author-loop.js.map +1 -1
  34. package/dist/commands/catalog.d.ts +1 -7
  35. package/dist/commands/catalog.d.ts.map +1 -1
  36. package/dist/commands/catalog.js +3 -3
  37. package/dist/commands/catalog.js.map +1 -1
  38. package/dist/commands/config-values.d.ts +1 -47
  39. package/dist/commands/config-values.d.ts.map +1 -1
  40. package/dist/commands/config-values.js +11 -11
  41. package/dist/commands/config-values.js.map +1 -1
  42. package/dist/commands/connect-oauth.d.ts +0 -1
  43. package/dist/commands/connect-oauth.d.ts.map +1 -1
  44. package/dist/commands/connect-oauth.js +1 -1
  45. package/dist/commands/connect-oauth.js.map +1 -1
  46. package/dist/commands/connect.d.ts +0 -1
  47. package/dist/commands/connect.d.ts.map +1 -1
  48. package/dist/commands/connect.js +1 -1
  49. package/dist/commands/connect.js.map +1 -1
  50. package/dist/commands/customer-auth-smoke.d.ts +2 -1
  51. package/dist/commands/customer-auth-smoke.d.ts.map +1 -1
  52. package/dist/commands/customer-auth-smoke.js +3 -2
  53. package/dist/commands/customer-auth-smoke.js.map +1 -1
  54. package/dist/commands/deploy-ops.d.ts +0 -9
  55. package/dist/commands/deploy-ops.d.ts.map +1 -1
  56. package/dist/commands/deploy-ops.js +3 -4
  57. package/dist/commands/deploy-ops.js.map +1 -1
  58. package/dist/commands/deploy-resume.d.ts +0 -1
  59. package/dist/commands/deploy-resume.d.ts.map +1 -1
  60. package/dist/commands/deploy-resume.js +1 -1
  61. package/dist/commands/deploy-resume.js.map +1 -1
  62. package/dist/commands/deploy-version-resolution.d.ts +0 -2
  63. package/dist/commands/deploy-version-resolution.d.ts.map +1 -1
  64. package/dist/commands/deploy-version-resolution.js +1 -1
  65. package/dist/commands/deploy-version-resolution.js.map +1 -1
  66. package/dist/commands/deployments-ops.d.ts +0 -2
  67. package/dist/commands/deployments-ops.d.ts.map +1 -1
  68. package/dist/commands/deployments-ops.js +2 -2
  69. package/dist/commands/deployments-ops.js.map +1 -1
  70. package/dist/commands/envs-ops.d.ts +0 -3
  71. package/dist/commands/envs-ops.d.ts.map +1 -1
  72. package/dist/commands/envs-ops.js +3 -3
  73. package/dist/commands/envs-ops.js.map +1 -1
  74. package/dist/commands/feedback-ops.d.ts +0 -8
  75. package/dist/commands/feedback-ops.d.ts.map +1 -1
  76. package/dist/commands/feedback-ops.js +1 -1
  77. package/dist/commands/feedback-ops.js.map +1 -1
  78. package/dist/commands/github-ops.d.ts +0 -2
  79. package/dist/commands/github-ops.d.ts.map +1 -1
  80. package/dist/commands/github-ops.js +2 -2
  81. package/dist/commands/github-ops.js.map +1 -1
  82. package/dist/commands/mcp-apps.d.ts +0 -1
  83. package/dist/commands/mcp-apps.d.ts.map +1 -1
  84. package/dist/commands/org-admin.d.ts +0 -17
  85. package/dist/commands/org-admin.d.ts.map +1 -1
  86. package/dist/commands/org-admin.js +1 -2
  87. package/dist/commands/org-admin.js.map +1 -1
  88. package/dist/commands/output.d.ts +3 -12
  89. package/dist/commands/output.d.ts.map +1 -1
  90. package/dist/commands/output.js.map +1 -1
  91. package/dist/commands/platform-account-reset-files.d.ts +0 -3
  92. package/dist/commands/platform-account-reset-files.d.ts.map +1 -1
  93. package/dist/commands/platform-account-reset-files.js +1 -1
  94. package/dist/commands/platform-account-reset-files.js.map +1 -1
  95. package/dist/commands/platform-auth-rollout-acceleration-files.d.ts +0 -3
  96. package/dist/commands/platform-auth-rollout-acceleration-files.d.ts.map +1 -1
  97. package/dist/commands/platform-auth-rollout-acceleration-files.js +1 -1
  98. package/dist/commands/platform-auth-rollout-acceleration-files.js.map +1 -1
  99. package/dist/commands/project-setup.d.ts +0 -1
  100. package/dist/commands/project-setup.d.ts.map +1 -1
  101. package/dist/commands/project-setup.js +1 -1
  102. package/dist/commands/project-setup.js.map +1 -1
  103. package/dist/commands/resource-shared.d.ts +0 -6
  104. package/dist/commands/resource-shared.d.ts.map +1 -1
  105. package/dist/commands/resource-shared.js +1 -1
  106. package/dist/commands/resource-shared.js.map +1 -1
  107. package/dist/commands/session.d.ts +3 -13
  108. package/dist/commands/session.d.ts.map +1 -1
  109. package/dist/commands/session.js +2 -2
  110. package/dist/commands/session.js.map +1 -1
  111. package/dist/commands/target-picker.d.ts +0 -2
  112. package/dist/commands/target-picker.d.ts.map +1 -1
  113. package/dist/commands/target-picker.js +1 -1
  114. package/dist/commands/target-picker.js.map +1 -1
  115. package/dist/commands/update-ops.d.ts +0 -8
  116. package/dist/commands/update-ops.d.ts.map +1 -1
  117. package/dist/commands/update-ops.js +1 -1
  118. package/dist/commands/update-ops.js.map +1 -1
  119. package/dist/control-plane.d.ts +1 -1
  120. package/dist/control-plane.d.ts.map +1 -1
  121. package/dist/control-plane.js.map +1 -1
  122. package/dist/deploy.d.ts +0 -12
  123. package/dist/deploy.d.ts.map +1 -1
  124. package/dist/deploy.js +2 -2
  125. package/dist/deploy.js.map +1 -1
  126. package/dist/dev.d.ts.map +1 -1
  127. package/dist/dev.js +2 -3
  128. package/dist/dev.js.map +1 -1
  129. package/dist/devtools-auth-session.d.ts +0 -1
  130. package/dist/devtools-auth-session.d.ts.map +1 -1
  131. package/dist/devtools-auth-session.js.map +1 -1
  132. package/dist/devtools-chat.d.ts +1 -1
  133. package/dist/devtools-chat.d.ts.map +1 -1
  134. package/dist/devtools-chat.js.map +1 -1
  135. package/dist/devtools-delegated-exchange-state.d.ts +1 -1
  136. package/dist/devtools-delegated-exchange-state.d.ts.map +1 -1
  137. package/dist/devtools-design-contract.d.ts +3 -3
  138. package/dist/devtools-design-contract.d.ts.map +1 -1
  139. package/dist/devtools-design-contract.js +1 -1
  140. package/dist/devtools-design-contract.js.map +1 -1
  141. package/dist/devtools-preview.d.ts +1 -1
  142. package/dist/devtools-preview.d.ts.map +1 -1
  143. package/dist/devtools-rpc-forwarder.d.ts +2 -1
  144. package/dist/devtools-rpc-forwarder.d.ts.map +1 -1
  145. package/dist/devtools-rpc-forwarder.js +11 -12
  146. package/dist/devtools-rpc-forwarder.js.map +1 -1
  147. package/dist/gradient.d.ts +0 -3
  148. package/dist/gradient.d.ts.map +1 -1
  149. package/dist/gradient.js +1 -3
  150. package/dist/gradient.js.map +1 -1
  151. package/dist/local-compile.d.ts +2 -1
  152. package/dist/local-compile.d.ts.map +1 -1
  153. package/dist/local-target.d.ts +2 -1
  154. package/dist/local-target.d.ts.map +1 -1
  155. package/dist/node-version.d.ts +0 -2
  156. package/dist/node-version.d.ts.map +1 -1
  157. package/dist/node-version.js +2 -2
  158. package/dist/node-version.js.map +1 -1
  159. package/dist/plugin-mode/build-readiness-tools.d.ts +5 -4
  160. package/dist/plugin-mode/build-readiness-tools.d.ts.map +1 -1
  161. package/dist/plugin-mode/plugin-operation-contract.d.ts +0 -35
  162. package/dist/plugin-mode/plugin-operation-contract.d.ts.map +1 -1
  163. package/dist/plugin-mode/plugin-operation-contract.js +1 -1
  164. package/dist/plugin-mode/plugin-operation-contract.js.map +1 -1
  165. package/dist/project-entrypoint.d.ts +2 -1
  166. package/dist/project-entrypoint.d.ts.map +1 -1
  167. package/dist/project.d.ts +3 -3
  168. package/dist/project.d.ts.map +1 -1
  169. package/dist/project.js.map +1 -1
  170. package/dist/skills-update.d.ts +0 -1
  171. package/dist/skills-update.d.ts.map +1 -1
  172. package/dist/skills-update.js +1 -1
  173. package/dist/skills-update.js.map +1 -1
  174. package/dist/status.d.ts +0 -9
  175. package/dist/status.d.ts.map +1 -1
  176. package/dist/status.js +0 -16
  177. package/dist/status.js.map +1 -1
  178. package/dist/update-binary.d.ts +3 -2
  179. package/dist/update-binary.d.ts.map +1 -1
  180. package/dist/update-check.d.ts +0 -3
  181. package/dist/update-check.d.ts.map +1 -1
  182. package/dist/update-check.js +1 -1
  183. package/dist/update-check.js.map +1 -1
  184. package/dist/validate.d.ts +2 -1
  185. package/dist/validate.d.ts.map +1 -1
  186. package/node_modules/@noodle-borg/agent-kit/dist/behavior-skills.js +10 -10
  187. package/node_modules/@noodle-borg/agent-kit/dist/generated/example-files.js +11 -8
  188. package/node_modules/@noodle-borg/agent-kit/dist/index.js +13 -1
  189. package/node_modules/@noodle-borg/agent-kit/dist/plugin-bootstrap-skill.d.ts +0 -2
  190. package/node_modules/@noodle-borg/agent-kit/dist/plugin-bootstrap-skill.js +1 -1
  191. package/node_modules/@noodle-borg/agent-kit/dist/plugin-bundle.d.ts +1 -1
  192. package/node_modules/@noodle-borg/agent-kit/dist/skill-authoring-refs.js +8 -0
  193. package/node_modules/@noodle-borg/agent-kit/dist/skill-content.js +6 -6
  194. package/node_modules/@noodle-borg/agent-kit/dist/skill-embedded-assistant-operations-ref.js +78 -0
  195. package/node_modules/@noodle-borg/agent-kit/dist/skill-embedded-assistant-ref.js +156 -135
  196. package/node_modules/@noodle-borg/agent-kit/dist/skill-embedded-assistant-renderer-ref.js +109 -0
  197. package/node_modules/@noodle-borg/agent-kit/dist/skill-router.d.ts +2 -3
  198. package/node_modules/@noodle-borg/agent-kit/dist/skill-router.js +1 -1
  199. package/node_modules/@noodle-borg/agent-kit/package.json +1 -1
  200. package/node_modules/@noodle-borg/agent-packaging/dist/host-package-assets.js +1 -1
  201. package/node_modules/@noodle-borg/assistant-gateway/dist/assistant-browser-fields.d.ts +3 -0
  202. package/node_modules/@noodle-borg/assistant-gateway/dist/assistant-browser-fields.js +15 -0
  203. package/node_modules/@noodle-borg/assistant-gateway/dist/assistant-configuration.d.ts +1 -1
  204. package/node_modules/@noodle-borg/assistant-gateway/dist/assistant-configuration.js +3 -2
  205. package/node_modules/@noodle-borg/assistant-gateway/dist/assistant-store.d.ts +19 -11
  206. package/node_modules/@noodle-borg/assistant-gateway/dist/assistant-store.js +24 -23
  207. package/node_modules/@noodle-borg/assistant-gateway/dist/assistant-transcript-events.d.ts +24 -0
  208. package/node_modules/@noodle-borg/assistant-gateway/dist/assistant-transcript-events.js +39 -0
  209. package/node_modules/@noodle-borg/assistant-gateway/dist/assistant-transcript.d.ts +6 -2
  210. package/node_modules/@noodle-borg/assistant-gateway/dist/assistant-transcript.js +11 -0
  211. package/node_modules/@noodle-borg/assistant-gateway/dist/assistant-view-availability.d.ts +8 -0
  212. package/node_modules/@noodle-borg/assistant-gateway/dist/assistant-view-availability.js +8 -0
  213. package/node_modules/@noodle-borg/assistant-gateway/dist/elevation-store.d.ts +3 -0
  214. package/node_modules/@noodle-borg/assistant-gateway/dist/elevation.d.ts +7 -1
  215. package/node_modules/@noodle-borg/assistant-gateway/dist/elevation.js +1 -0
  216. package/node_modules/@noodle-borg/assistant-gateway/dist/in-memory-elevation-store.d.ts +1 -0
  217. package/node_modules/@noodle-borg/assistant-gateway/dist/in-memory-elevation-store.js +1 -0
  218. package/node_modules/@noodle-borg/assistant-gateway/dist/portable.d.ts +1 -0
  219. package/node_modules/@noodle-borg/assistant-gateway/dist/portable.js +1 -0
  220. package/node_modules/@noodle-borg/assistant-gateway/package.json +2 -1
  221. package/node_modules/@noodle-borg/authoring/dist/assistant.d.ts +2 -1
  222. package/node_modules/@noodle-borg/authoring/dist/connections.d.ts +0 -2
  223. package/node_modules/@noodle-borg/authoring/dist/connections.js +1 -1
  224. package/node_modules/@noodle-borg/authoring/dist/load-authored.js +2 -2
  225. package/node_modules/@noodle-borg/authoring/dist/react/bridge.d.ts +3 -2
  226. package/node_modules/@noodle-borg/authoring/dist/react/form-components.d.ts +0 -8
  227. package/node_modules/@noodle-borg/authoring/dist/react/form-components.js +2 -4
  228. package/node_modules/@noodle-borg/authoring/dist/react/hooks.d.ts +2 -2
  229. package/node_modules/@noodle-borg/authoring/dist/server.d.ts +2 -0
  230. package/node_modules/@noodle-borg/authoring/dist/server.js +3 -0
  231. package/node_modules/@noodle-borg/compiler/dist/artifact/types.d.ts +12 -11
  232. package/node_modules/@noodle-borg/compiler/dist/artifact/version.d.ts +4 -1
  233. package/node_modules/@noodle-borg/compiler/dist/artifact/version.js +4 -1
  234. package/node_modules/@noodle-borg/compiler/dist/compile.d.ts +0 -1
  235. package/node_modules/@noodle-borg/compiler/dist/fulfilment-structural.d.ts +1 -1
  236. package/node_modules/@noodle-borg/compiler/dist/manifest/expression.d.ts +14 -14
  237. package/node_modules/@noodle-borg/compiler/dist/manifest/naming.d.ts +0 -2
  238. package/node_modules/@noodle-borg/compiler/dist/manifest/naming.js +1 -1
  239. package/node_modules/@noodle-borg/compiler/dist/manifest/schema.d.ts +4 -0
  240. package/node_modules/@noodle-borg/compiler/dist/manifest/schema.js +20 -1
  241. package/node_modules/@noodle-borg/compiler/dist/manifest/website-projection.d.ts +2 -1
  242. package/node_modules/@noodle-borg/compiler/dist/state-handles.js +1 -0
  243. package/node_modules/@noodle-borg/compiler/package.json +1 -4
  244. package/node_modules/@noodle-borg/connector-defs/dist/credential-profiles.js +1 -1
  245. package/node_modules/@noodle-borg/connector-defs/dist/schema.d.ts +0 -6
  246. package/node_modules/@noodle-borg/connector-http/dist/http-connector.d.ts +2 -2
  247. package/node_modules/@noodle-borg/connector-http/dist/http-response.d.ts +2 -1
  248. package/node_modules/@noodle-borg/connector-http/dist/mcp/config.js +1 -1
  249. package/node_modules/@noodle-borg/control-plane/dist/deploy-auth.d.ts +0 -1
  250. package/node_modules/@noodle-borg/developer-mcp/dist/widgets/shared.js +1 -1
  251. package/node_modules/@noodle-borg/knowledge-operations/dist/crawl-lifecycle.d.ts +2 -1
  252. package/node_modules/@noodle-borg/knowledge-operations/package.json +1 -2
  253. package/node_modules/@noodle-borg/observability/dist/request-events-postgres.js +3 -1
  254. package/node_modules/@noodle-borg/plugin-distribution/dist/openai-submission-render.js +1 -1
  255. package/node_modules/@noodle-borg/protocol/dist/index.d.ts +1 -1
  256. package/node_modules/@noodle-borg/protocol/dist/index.js +1 -1
  257. package/node_modules/@noodle-borg/protocol/dist/interaction-envelope.js +2 -2
  258. package/node_modules/@noodle-borg/protocol/dist/jsonrpc.d.ts +1 -1
  259. package/node_modules/@noodle-borg/protocol/dist/jsonrpc.js +1 -1
  260. package/node_modules/@noodle-borg/protocol/dist/mapping.d.ts +4 -6
  261. package/node_modules/@noodle-borg/protocol/dist/mapping.js +1 -1
  262. package/node_modules/@noodle-borg/protocol/dist/observation.d.ts +0 -9
  263. package/node_modules/@noodle-borg/protocol/dist/observation.js +1 -1
  264. package/node_modules/@noodle-borg/protocol/dist/v2/handler.d.ts +2 -1
  265. package/node_modules/@noodle-borg/protocol/dist/v2/versions.d.ts +4 -0
  266. package/node_modules/@noodle-borg/protocol/dist/v2/versions.js +2 -0
  267. package/node_modules/@noodle-borg/protocol/dist/widget/domain-projection.d.ts +2 -1
  268. package/node_modules/@noodle-borg/protocol/package.json +0 -1
  269. package/node_modules/@noodle-borg/runtime/dist/broker/types.d.ts +2 -2
  270. package/node_modules/@noodle-borg/runtime/dist/index.d.ts +1 -0
  271. package/node_modules/@noodle-borg/runtime/dist/index.js +1 -0
  272. package/node_modules/@noodle-borg/runtime/dist/state-handle-ownership.d.ts +21 -0
  273. package/node_modules/@noodle-borg/runtime/dist/state-handle-ownership.js +10 -0
  274. package/node_modules/@noodle-borg/runtime/package.json +6 -1
  275. package/node_modules/@noodle-borg/service/dist/app-package-snapshot.d.ts +1 -2
  276. package/node_modules/@noodle-borg/service/dist/app-package-snapshot.js +1 -2
  277. package/node_modules/@noodle-borg/service/dist/archive-preflight.js +1 -1
  278. package/node_modules/@noodle-borg/service/dist/assets.js +1 -1
  279. package/node_modules/@noodle-borg/service/dist/assistant-bindings.js +2 -2
  280. package/node_modules/@noodle-borg/service/dist/client-compatibility.js +1 -2
  281. package/node_modules/@noodle-borg/service/dist/developer-mcp/mount.js +2 -2
  282. package/node_modules/@noodle-borg/service/dist/external-credential-exchange.d.ts +0 -1
  283. package/node_modules/@noodle-borg/service/dist/external-credential-exchange.js +1 -1
  284. package/node_modules/@noodle-borg/service/dist/http-util.js +1 -72
  285. package/node_modules/@noodle-borg/service/dist/managed-config-expressions.d.ts +0 -1
  286. package/node_modules/@noodle-borg/service/dist/managed-config-expressions.js +1 -1
  287. package/node_modules/@noodle-borg/service/dist/oauth/customer-bridge.js +1 -1
  288. package/node_modules/@noodle-borg/service/dist/oauth/developer-grant.js +2 -2
  289. package/node_modules/@noodle-borg/service/dist/observability-runtime.js +2 -3
  290. package/node_modules/@noodle-borg/service/dist/registry-targets.js +3 -3
  291. package/node_modules/@noodle-borg/service/dist/routes/access-mode.js +0 -4
  292. package/node_modules/@noodle-borg/service/dist/routes/access.js +1 -1
  293. package/node_modules/@noodle-borg/service/dist/routes/alerts.js +3 -2
  294. package/node_modules/@noodle-borg/service/dist/routes/analytics.js +2 -1
  295. package/node_modules/@noodle-borg/service/dist/routes/apps.js +1 -1
  296. package/node_modules/@noodle-borg/service/dist/routes/archive.js +2 -1
  297. package/node_modules/@noodle-borg/service/dist/routes/asset-control-plane.js +2 -1
  298. package/node_modules/@noodle-borg/service/dist/routes/assistant-agent.js +7 -2
  299. package/node_modules/@noodle-borg/service/dist/routes/assistant-appearance.js +2 -1
  300. package/node_modules/@noodle-borg/service/dist/routes/assistant-clients.js +2 -1
  301. package/node_modules/@noodle-borg/service/dist/routes/assistant-doctor.js +2 -1
  302. package/node_modules/@noodle-borg/service/dist/routes/assistant-elevation.js +15 -8
  303. package/node_modules/@noodle-borg/service/dist/routes/assistant-embeds.js +2 -1
  304. package/node_modules/@noodle-borg/service/dist/routes/assistant-interaction-replay.js +5 -3
  305. package/node_modules/@noodle-borg/service/dist/routes/assistant-interactions.js +5 -3
  306. package/node_modules/@noodle-borg/service/dist/routes/assistant-public-configuration.js +1 -1
  307. package/node_modules/@noodle-borg/service/dist/routes/assistant-public-session.js +1 -1
  308. package/node_modules/@noodle-borg/service/dist/routes/assistant-route-http.js +4 -3
  309. package/node_modules/@noodle-borg/service/dist/routes/assistant-sandbox.js +1 -1
  310. package/node_modules/@noodle-borg/service/dist/routes/assistant-suggestions.js +1 -1
  311. package/node_modules/@noodle-borg/service/dist/routes/assistant-transcript.js +48 -9
  312. package/node_modules/@noodle-borg/service/dist/routes/assistant-usage.js +2 -1
  313. package/node_modules/@noodle-borg/service/dist/routes/assistant.js +2 -1
  314. package/node_modules/@noodle-borg/service/dist/routes/auth-discovery.js +2 -2
  315. package/node_modules/@noodle-borg/service/dist/routes/auth-doctor-live.js +1 -1
  316. package/node_modules/@noodle-borg/service/dist/routes/config-values-paths.js +1 -1
  317. package/node_modules/@noodle-borg/service/dist/routes/config-values.js +2 -1
  318. package/node_modules/@noodle-borg/service/dist/routes/control-plane.js +2 -3
  319. package/node_modules/@noodle-borg/service/dist/routes/deploy-preflight.js +1 -1
  320. package/node_modules/@noodle-borg/service/dist/routes/deployment-activation-response.js +1 -1
  321. package/node_modules/@noodle-borg/service/dist/routes/deployment-lock.js +1 -1
  322. package/node_modules/@noodle-borg/service/dist/routes/deployment-package.js +1 -1
  323. package/node_modules/@noodle-borg/service/dist/routes/deployments.js +1 -1
  324. package/node_modules/@noodle-borg/service/dist/routes/diagnostics.js +2 -1
  325. package/node_modules/@noodle-borg/service/dist/routes/environment-production.js +2 -1
  326. package/node_modules/@noodle-borg/service/dist/routes/envs.js +1 -1
  327. package/node_modules/@noodle-borg/service/dist/routes/google-workload-identity.js +1 -1
  328. package/node_modules/@noodle-borg/service/dist/routes/intent-capture.js +2 -1
  329. package/node_modules/@noodle-borg/service/dist/routes/logs.js +2 -1
  330. package/node_modules/@noodle-borg/service/dist/routes/openai-apps-challenge.js +1 -2
  331. package/node_modules/@noodle-borg/service/dist/routes/org-admin.js +2 -1
  332. package/node_modules/@noodle-borg/service/dist/routes/org-domains.js +2 -1
  333. package/node_modules/@noodle-borg/service/dist/routes/org-mcp-subdomain.js +1 -1
  334. package/node_modules/@noodle-borg/service/dist/routes/paths.js +0 -39
  335. package/node_modules/@noodle-borg/service/dist/routes/protected-resource-metadata.js +3 -3
  336. package/node_modules/@noodle-borg/service/dist/routes/rollback.js +2 -1
  337. package/node_modules/@noodle-borg/service/dist/routes/service-principals-dispatch.js +2 -3
  338. package/node_modules/@noodle-borg/service/dist/routes/service-principals.js +1 -1
  339. package/node_modules/@noodle-borg/service/dist/service-config.d.ts +3 -2
  340. package/node_modules/@noodle-borg/service/dist/service-config.js +1 -1
  341. package/node_modules/@noodle-borg/service/dist/service.js +5 -2
  342. package/node_modules/@noodle-borg/service/dist/store/alert-rules.js +1 -1
  343. package/node_modules/@noodle-borg/service/dist/store/audit.js +1 -1
  344. package/node_modules/@noodle-borg/service/dist/store/records.js +1 -1
  345. package/node_modules/@noodle-borg/service/dist/store/validate.d.ts +1 -1
  346. package/node_modules/@noodle-borg/service/dist/store/validate.js +1 -1
  347. package/node_modules/@noodle-borg/service/dist/store.d.ts +2 -2
  348. package/node_modules/@noodle-borg/service/dist/store.js +1 -1
  349. package/node_modules/@noodle-borg/service/package.json +1 -1
  350. package/node_modules/@noodle-borg/transport-http/dist/client-identity.js +1 -1
  351. package/node_modules/@noodle-borg/transport-http/dist/handler.d.ts +1 -2
  352. package/node_modules/@noodle-borg/transport-http/dist/identity-authorization.d.ts +51 -0
  353. package/node_modules/@noodle-borg/transport-http/dist/identity-authorization.js +7 -7
  354. package/node_modules/@noodle-borg/transport-http/dist/index.d.ts +4 -2
  355. package/node_modules/@noodle-borg/transport-http/dist/index.js +3 -1
  356. package/node_modules/@noodle-borg/transport-http/dist/request-body.d.ts +29 -0
  357. package/node_modules/@noodle-borg/transport-http/dist/request-body.js +64 -0
  358. package/node_modules/@noodle-borg/transport-http/dist/responses.d.ts +28 -0
  359. package/node_modules/@noodle-borg/transport-http/dist/routing.d.ts +2 -4
  360. package/node_modules/@noodle-borg/transport-http/dist/routing.js +3 -3
  361. package/node_modules/@noodle-borg/transport-http/dist/serve-request.js +2 -13
  362. package/node_modules/@noodle-borg/transport-http/package.json +0 -1
  363. package/node_modules/@noodle-borg/wire-contracts/dist/assistant.d.ts +19 -25
  364. package/node_modules/@noodle-borg/wire-contracts/dist/assistant.js +20 -34
  365. package/node_modules/@noodleseed/assistant/README.md +1 -1
  366. package/node_modules/@noodleseed/assistant/package.json +2 -1
  367. package/package.json +2 -2
  368. package/dist/commands/catalog-data-billing.d.ts +0 -3
  369. package/dist/commands/catalog-data-billing.d.ts.map +0 -1
  370. package/dist/commands/catalog-data-billing.js +0 -3
  371. package/dist/commands/catalog-data-billing.js.map +0 -1
  372. package/dist/commands/catalog-data-policy.d.ts +0 -3
  373. package/dist/commands/catalog-data-policy.d.ts.map +0 -1
  374. package/dist/commands/catalog-data-policy.js +0 -3
  375. package/dist/commands/catalog-data-policy.js.map +0 -1
  376. package/node_modules/@noodle-borg/compiler/dist/artifact/catalog-emission.d.ts +0 -50
  377. package/node_modules/@noodle-borg/compiler/dist/context-compile.d.ts +0 -17
  378. package/node_modules/@noodle-borg/transport-http/dist/module-http.d.ts +0 -13
  379. package/node_modules/@noodle-borg/transport-http/dist/module-http.js +0 -28
@@ -1,3 +1,5 @@
1
+ import { renderEmbeddedAssistantOperationsReference } from './skill-embedded-assistant-operations-ref.js';
2
+ import { renderEmbeddedAssistantRendererReference } from './skill-embedded-assistant-renderer-ref.js';
1
3
  /** Curated external-developer workflow for embedding a deployed Noodle assistant in a SaaS app. */
2
4
  export function renderEmbeddedAssistantReference() {
3
5
  return [
@@ -6,7 +8,7 @@ export function renderEmbeddedAssistantReference() {
6
8
  '## Contents',
7
9
  '',
8
10
  '- Architecture',
9
- '- Choose the host experience',
11
+ '- Select the architecture before code',
10
12
  '- Author and validate',
11
13
  '- Product workflow guidance',
12
14
  '- Customize the presentation',
@@ -19,6 +21,7 @@ export function renderEmbeddedAssistantReference() {
19
21
  '- The session response',
20
22
  '- Choose a browser renderer',
21
23
  '- Host readiness and promotion',
24
+ '- Launch and qualified-usage proof',
22
25
  '- Toolchain requirements',
23
26
  '- Verify the boundary',
24
27
  '- Troubleshooting: symptom to diagnosis',
@@ -38,9 +41,32 @@ export function renderEmbeddedAssistantReference() {
38
41
  '| SaaS backend | `NOODLE_SERVICE_URL`, `NOODLE_ASSISTANT_CLIENT_ID`, `NOODLE_ASSISTANT_CLIENT_SECRET`, `PUBLIC_APP_ORIGIN` | Backend-only environment or secret manager; never browser code or public-prefixed variables |',
39
42
  '| Browser | Short-lived assistant session only | In memory; never a client secret, model key, connector credential, or raw application session |',
40
43
  '',
41
- '## Choose the host experience',
44
+ '## Select the architecture before code',
42
45
  '',
43
- 'Before choosing code, ask the user which experience belongs in the existing product: the built-in floating, inline, or drawer assistant; a custom chat-first renderer; or a headless client feeding application-owned UI. Default to the built-in floating assistant only when the user has no preference. Preserve the host application until the user opens or submits into the assistant; do not copy one flagship layout into every product.',
46
+ 'Do not edit either codebase until one architecture brief is decision-complete. Name the external end user, the conversational job, one to three workflows, the exact access mode, renderer, existing host framework, identity/session boundary, server-owned routing authority, model owner, exact origin and mount point, and requested evidence level.',
47
+ '',
48
+ 'If the external user, job, or workflow set is still vague, hand off to `designing-mcp-products` before code. Preserve its bounded product outcome and resume this workflow only when the value path and one representative success path are explicit.',
49
+ '',
50
+ 'Treat the MCP application and embedding application as two code ownership roots, usually two repositories and sometimes two explicitly separate directories in one repository:',
51
+ '',
52
+ '| Code owner | Owns | Must not own |',
53
+ '| --- | --- | --- |',
54
+ '| MCP application | `server.ts`, tools, App views, access surfaces, portable branding defaults, model declaration, validation, and deployment | Host cookies, login UI, application middleware, or browser mounting |',
55
+ '| Embedding application | Existing framework and package manager, user authentication, same-origin session route when required, browser mount, CSP, cookies/CSRF, and production build | MCP tool semantics, model keys, assistant client secrets in browser code, or caller-selected tenant routing |',
56
+ '',
57
+ 'Develop locally as two local processes: `noodle dev` serves the MCP application, while the embedding application runs its existing development command at the exact authored loopback origin. Do not replace either process with a second scaffold, package manager, chat transport, or copied flagship shell.',
58
+ '',
59
+ 'Select exactly one recommended topology; do not return an unranked menu:',
60
+ '',
61
+ '| User boundary | Recommended topology | Identity and routing consequence |',
62
+ '| --- | --- | --- |',
63
+ '| Anonymous public visitor | `publicWebsite(...)` plus the hosted embed ID and managed renderer | No backend session route, `${user}`, roles/scopes, delegated credentials, or customer routing. Require the explicit capability allowlist and confirmation for side effects. |',
64
+ '| Signed-in application user | `authenticatedWebsite(...)` plus a same-origin backend session route and the managed renderer | The host backend authenticates the user, calls `createAssistantSession`, and supplies only verified identity, claims, preferences, and server-owned routing. |',
65
+ '| Visitor who may sign in mid-conversation | `publicWebsite({ signIn: true })` plus the hosted embed ID, host application login, and ticket elevation | Anonymous capabilities remain bounded; the host backend spends the ticket after login and continues through a same-origin session endpoint on an allowed origin. |',
66
+ '',
67
+ 'Use the existing host framework and its package manager. Recommend the managed renderer unless the product names a concrete UI or integration benefit that requires the headless client; a custom renderer accepts the complete transcript-part obligation described below. Recommend `noodleManaged()` when Noodle owns the managed-cloud model for the exact eligible target; recommend `openAICompatible(...)` only when the operator or self-hosted deployment owns that model endpoint and credentials. Never present both as unfinished choices.',
68
+ '',
69
+ 'The architecture brief must state the selected topology, why it fits the named user and job, the two code owners and two local processes, credential and identity flow, routing authority, model owner, files expected to change, and the first requested evidence boundary. If identity/session ownership, exact origin, tenant-routing authority, model ownership, or evidence target is unavailable, return a blocked architecture brief naming the missing owner or decision and do not edit either codebase.',
44
70
  '',
45
71
  '## Author and validate',
46
72
  '',
@@ -120,11 +146,17 @@ export function renderEmbeddedAssistantReference() {
120
146
  '',
121
147
  'The sign-in card renders on the same themed chrome as every proposal card and follows the server `branding`. Authoring `signUpAction` adds a second button; leaving it out renders none. Both buttons raise the same `assistant-sign-in-requested` event with the same single-use ticket — the detail adds `intent: "sign-in" | "sign-up"` so the page routes `sign-up` to its registration page instead of its login. The ticket spend after account creation is identical to the one after sign-in; the service does not care which path produced the session. Headless renderers receive the same moment as a `data-sign-in` transcript part from `subscribeChat` (it has no status and is not respondable through `client.respond` — resolution is the elevated session).',
122
148
  '',
123
- 'Elevation runs through the **host application own login**, never a Noodle-operated one. The widget raises `assistant-sign-in-requested` with a single-use `signInTicket` in its detail; the page signs the visitor in as it already does, then its backend spends the ticket with `createAssistantSession({ ..., signInTicket })` from `@noodleseed/assistant/server` — the same session exchange, its own client credentials. A refused spend throws a typed `AssistantSessionExchangeError`: branch on `elevationRefusal` (`elevation_ticket_expired` re-prompt; `elevation_tenant_mismatch` alert, never retry). Possession of the ticket alone elevates nothing, and the service checks the client tenant owns that conversation. The ticket is not the server-held interaction continuation — that value never reaches browser code; this one exists to travel through the page.',
149
+ '#### Complete mixed-mode handoff',
150
+ '',
151
+ '1. **Capture the ticket.** The widget raises `assistant-sign-in-requested` with a single-use `signInTicket`. POST it to the host application same-origin backend and bind it to the short-lived login transaction; keep it out of query strings, logs, analytics, and durable browser storage.',
152
+ '2. **Use the existing login.** Send the visitor through the host application full-page redirect for sign-in or sign-up. Noodle never becomes the customer identity provider.',
153
+ '3. **Elevate on the backend.** After authentication, recover the bound ticket and call `createAssistantSession({ ..., signInTicket })` with the verified user, server-owned routing, backend client credentials, and the exact **origin the conversation will continue on**. The allowed destination may differ from the anonymous marketing origin; successful elevation rebinds the session to it.',
154
+ '4. **Reattach on the destination origin.** Forward the helper response unchanged through the customer-owned same-origin session endpoint. The widget uses `credentials: "same-origin"`; pointing it at a cross-origin endpoint guarantees a cookie-less `401`. The elevated token replaces the anonymous token, which is dead.',
155
+ '5. **Resume and replay.** The widget repaints the bounded visible transcript from `endpoints.transcript`, emits one secure-continuation status, re-resolves the latest linked App view against the current surface, restores at most one live pending confirmation/input request, and then shows follow-up suggestions. Restoring an interaction suppresses auto-resume. Replay includes only rows the panel showed, never tool internals or a spent ticket, and never App HTML, a DOM snapshot, or exact scroll/focus. On an older service without that endpoint the panel starts visually fresh while the model still remembers, so promise only that "the assistant remembers". Pass `restoreConversation: false` when a privacy-sensitive application must suppress browser replay while retaining bounded server/model continuity.',
124
156
  '',
125
- 'The conversation is kept server-side: same session, new token, the anonymous one dead. By default the pending request also completes itself: the service re-attempts the intercepted tool under the new principal and streams it as the elevated session first turn (one-shot; mooted if the visitor types first; confirm-gated tools stop at their confirmation card; pass `resume: false` beside the ticket to disable). On a backend-exchanged reattach the widget also repaints the bounded visible transcript (`endpoints.transcript`) before the resume runs only rows the panel actually showed replay, never tool internals or a spent ticket. On an older service without the endpoint the panel starts visually fresh while the model still remembers, so keep copy honest either way: "the assistant remembers". Do not build a second identity provider or client-side resume scaffolding for this.',
157
+ 'Possession of the ticket alone elevates nothing, and the service checks that the backend client tenant owns the conversation. A refused spend throws a typed `AssistantSessionExchangeError`: branch on `elevationRefusal` (`elevation_ticket_expired` re-prompt; `elevation_tenant_mismatch` alert and never retry; `elevation_state_conflict` means the ticket is spent, so open or restart the signed-in flow and never merge generic state). A refused origin does not burn the ticket. The ticket is not the server-held interaction continuation that value never reaches browser code.',
126
158
  '',
127
- 'When the login lives on a different origin (marketing site + app), the flow is: the visitor signs in via full-page redirect as the site already does; the backend spends the ticket presenting the **origin the conversation will continue on** (any origin in the deployment allowlist elevation re-pins the session there, and CORS follows); the token reaches the widget through the customer own **same-origin** session endpoint on that origin. The redirect handoff is mandatory, not stylistic: the widget calls the session endpoint with `credentials: "same-origin"`, so pointing a marketing page at a cross-origin endpoint is a guaranteed cookie-less 401. Persist the ticket across the login redirect (single-use, expires in minutes); a refused origin does not burn it.',
159
+ 'By default the pending request completes itself: the service re-attempts the intercepted tool under the new principal and streams it as the elevated session first turn. This is one-shot, is mooted if the visitor types first, and stops at the confirmation card for a confirm-gated tool. Pass `resume: false` beside the ticket only when the application deliberately owns that affordance. Do not build client-side resume scaffolding or a second identity provider.',
128
160
  '',
129
161
  'A connector-backed side effect needs **two** independent declarations to be reachable from a public or mixed surface: inclusion in `capabilities` **and** `{ confirm: true }` on the operation. Signing in proves who the visitor is; it does not pre-authorize an effect, so confirmation still applies on a mixed surface. Confirmation is never authentication or business authorization — the customer backend still owns payload validation, abuse controls, and idempotency. Local or session-only widget state needs no confirmation.',
130
162
  '',
@@ -219,6 +251,10 @@ export function renderEmbeddedAssistantReference() {
219
251
  '',
220
252
  'Create an authenticated same-origin backend route:',
221
253
  '',
254
+ 'The route must return a JSON `401` for a signed-out caller rather than an HTML login redirect, require JSON, and compare the request against the exact configured Origin before exchange. The managed renderer sends same-origin cookies but does not invent an application CSRF token. Treat JSON plus exact Origin as the minimum cookie/CSRF boundary; when the host keeps token-based CSRF middleware, use the DOM-free client with an injected `fetch` that supplies the token instead of exempting the route. Resolve claims and connector routes from the authenticated user and server-owned membership only.',
255
+ '',
256
+ 'For the complete framework-neutral server-to-server HTTP exchange in a non-Node host, link to the [Django and Vue guide](https://docs.noodleseed.dev/docs/guides/embedded-assistant-django-vue); keep its framework-specific middleware and mounting mechanics there rather than copying them into agent instructions.',
257
+ '',
222
258
  '```ts',
223
259
  'import { createAssistantSession } from "@noodleseed/assistant/server";',
224
260
  '',
@@ -396,7 +432,9 @@ export function renderEmbeddedAssistantReference() {
396
432
  '',
397
433
  'The component renders a custom element and must mount client-side. In a Next.js App Router tree, put the mount in a `"use client"` component; from a server component or the Pages Router, load it with `next/dynamic` and `ssr: false`.',
398
434
  '',
399
- 'For a customer-owned React renderer, use the renderer-free hook. It owns client lifetime and React subscription while `client` remains the one command surface:',
435
+ '### Minimal fail-closed custom renderer skeleton',
436
+ '',
437
+ 'Use the renderer-free hook only when the product has a concrete reason to own the conversation UI. This is a minimal fail-closed skeleton, not a production-complete renderer: it keeps one client and App host, renders safe transcript content, and refuses interactions whose complete business presentation the host has not implemented. Start from the managed renderer unless the application accepts the full obligation checklist below.',
400
438
  '',
401
439
  '```tsx',
402
440
  '"use client";',
@@ -405,9 +443,22 @@ export function renderEmbeddedAssistantReference() {
405
443
  'import { NoodleAppView } from "@noodleseed/assistant/react";',
406
444
  'import { useNoodleAssistant } from "@noodleseed/assistant/react/client";',
407
445
  '',
408
- 'export function CustomAssistant({ principalKey, resolvedTheme }: { principalKey: string; resolvedTheme: "light" | "dark" }) {',
446
+ 'type SignInRequest = { readonly signInTicket: string; readonly expiresAt: string };',
447
+ '',
448
+ 'export function CustomAssistant({',
449
+ ' principalKey,',
450
+ ' resolvedTheme,',
451
+ ' onSignInRequested,',
452
+ '}: {',
453
+ ' principalKey: string;',
454
+ ' resolvedTheme: "light" | "dark";',
455
+ ' onSignInRequested: (request: SignInRequest) => Promise<"started" | "cancelled">;',
456
+ '}) {',
409
457
  ' const [draft, setDraft] = useState("");',
410
- ' const { client, messages, status, error } = useNoodleAssistant({',
458
+ ' const [sessionNotice, setSessionNotice] = useState("");',
459
+ ' const [turnNotice, setTurnNotice] = useState("");',
460
+ ' const [pendingSignInTicket, setPendingSignInTicket] = useState<string>();',
461
+ ' const { client, messages, suggestions, status, error } = useNoodleAssistant({',
411
462
  ' sessionEndpoint: "/api/assistant/session",',
412
463
  ' principalKey,',
413
464
  ' clientContext: () => ({',
@@ -421,6 +472,16 @@ export function renderEmbeddedAssistantReference() {
421
472
  ' // The hook exposes this same structured failure through `error`.',
422
473
  ' });',
423
474
  ' };',
475
+ ' useEffect(',
476
+ ' () =>',
477
+ ' client.subscribe((event) => {',
478
+ ' if (event.event === "session_expired") setSessionNotice("Session expired.");',
479
+ ' if (event.event === "session_started" || event.event === "session_reset") {',
480
+ ' setSessionNotice("");',
481
+ ' }',
482
+ ' }),',
483
+ ' [client],',
484
+ ' );',
424
485
  '',
425
486
  ' return (',
426
487
  ' <section aria-label="Assistant" aria-busy={busy}>',
@@ -434,20 +495,18 @@ export function renderEmbeddedAssistantReference() {
434
495
  ' <section key={review.id} aria-label="Review proposed action">',
435
496
  ' <h3>{review.title ?? "Review proposed action"}</h3>',
436
497
  ' {review.description ? <p>{review.description}</p> : null}',
437
- ' <pre aria-label="Proposed action arguments">',
438
- ' {JSON.stringify(review.arguments ?? {}, null, 2)}',
439
- ' </pre>',
498
+ ' <p>This custom renderer has not implemented a complete schema-aware review.</p>',
440
499
  ' <button',
441
500
  ' disabled={busy || review.status !== "pending"}',
442
- ' onClick={() => settle(client.respond(review.id, { action: "accept" }))}',
501
+ ' onClick={() => settle(client.respond(review.id, { action: "decline" }))}',
443
502
  ' >',
444
- ' Confirm',
503
+ " Don't proceed",
445
504
  ' </button>',
446
505
  ' <button',
447
506
  ' disabled={busy || review.status !== "pending"}',
448
- ' onClick={() => settle(client.respond(review.id, { action: "decline" }))}',
507
+ ' onClick={() => settle(client.respond(review.id, { action: "cancel" }))}',
449
508
  ' >',
450
- " Don't proceed",
509
+ ' Cancel',
451
510
  ' </button>',
452
511
  ' </section>',
453
512
  ' );',
@@ -457,21 +516,28 @@ export function renderEmbeddedAssistantReference() {
457
516
  ' return (',
458
517
  ' <section key={request.id} aria-label="Assistant needs input">',
459
518
  ' <p>{request.message}</p>',
460
- ' <p>This renderer has not implemented the requested form.</p>',
519
+ ' {/* request.requestedSchema is the sole input-form contract. */}',
520
+ ' <p>This custom renderer has not implemented the requested schema form.</p>',
461
521
  ' <button',
462
522
  ' disabled={busy || request.status !== "pending"}',
463
523
  ' onClick={() => settle(client.respond(request.id, { action: "decline" }))}',
464
524
  ' >',
465
- ' Cancel request',
525
+ " Don't proceed",
526
+ ' </button>',
527
+ ' <button',
528
+ ' disabled={busy || request.status !== "pending"}',
529
+ ' onClick={() => settle(client.respond(request.id, { action: "cancel" }))}',
530
+ ' >',
531
+ ' Cancel',
466
532
  ' </button>',
467
533
  ' </section>',
468
534
  ' );',
469
535
  ' }',
470
536
  ' if (part.type === "data-tool-result") {',
471
537
  ' return (',
472
- ' <pre key={part.data.id} aria-label={`${part.data.tool} result`}>',
473
- ' {JSON.stringify(part.data.result, null, 2)}',
474
- ' </pre>',
538
+ ' <p key={part.data.id} role="status">',
539
+ ' A result is available, but this renderer has no trusted presentation for it.',
540
+ ' </p>',
475
541
  ' );',
476
542
  ' }',
477
543
  ' if (part.type === "data-view") {',
@@ -484,17 +550,67 @@ export function renderEmbeddedAssistantReference() {
484
550
  ' />',
485
551
  ' );',
486
552
  ' }',
553
+ ' if (part.type === "data-sign-in") {',
554
+ ' const request = part.data;',
555
+ ' return (',
556
+ ' <section key={request.id} aria-label="Sign in required">',
557
+ ' <p>Continue with your account to use this capability.</p>',
558
+ ' <button',
559
+ ' disabled={busy || pendingSignInTicket !== undefined}',
560
+ ' onClick={() => {',
561
+ ' setPendingSignInTicket(request.signInTicket);',
562
+ ' void Promise.resolve()',
563
+ ' .then(() =>',
564
+ ' onSignInRequested({',
565
+ ' signInTicket: request.signInTicket,',
566
+ ' expiresAt: request.expiresAt,',
567
+ ' }),',
568
+ ' )',
569
+ ' .then(',
570
+ ' (result) => {',
571
+ ' if (result === "cancelled") setPendingSignInTicket(undefined);',
572
+ ' },',
573
+ ' () => setPendingSignInTicket(undefined),',
574
+ ' );',
575
+ ' }}',
576
+ ' >',
577
+ ' Sign in',
578
+ ' </button>',
579
+ ' </section>',
580
+ ' );',
581
+ ' }',
487
582
  ' return <p key={index}>Unsupported assistant content.</p>;',
488
583
  ' })}',
489
584
  ' </article>',
490
585
  ' ))}',
491
- ' {error ? <p role="alert">{error.message}</p> : null}',
586
+ ' <p role="status" aria-live="polite">',
587
+ ' {sessionNotice || turnNotice || (busy ? "Assistant is working" : "")}',
588
+ ' </p>',
589
+ ' {suggestions?.prompts.length ? (',
590
+ ' <nav aria-label="Suggested messages">',
591
+ ' {suggestions.prompts.map((prompt) => (',
592
+ ' <button',
593
+ ' key={prompt}',
594
+ ' type="button"',
595
+ ' disabled={busy}',
596
+ ' onClick={() => {',
597
+ ' setTurnNotice("");',
598
+ ' settle(client.sendMessage(prompt));',
599
+ ' }}',
600
+ ' >',
601
+ ' {prompt}',
602
+ ' </button>',
603
+ ' ))}',
604
+ ' </nav>',
605
+ ' ) : null}',
606
+ ' {error ? <p role="alert">The assistant could not complete that request.</p> : null}',
492
607
  ' <form',
493
608
  ' onSubmit={(event) => {',
494
609
  ' event.preventDefault();',
495
610
  ' const message = draft.trim();',
496
611
  ' if (!message) return;',
497
612
  ' setDraft("");',
613
+ ' setTurnNotice("");',
498
614
  ' settle(client.sendMessage(message));',
499
615
  ' }}',
500
616
  ' >',
@@ -504,7 +620,15 @@ export function renderEmbeddedAssistantReference() {
504
620
  ' onChange={(event) => setDraft(event.currentTarget.value)}',
505
621
  ' />',
506
622
  ' {busy ? (',
507
- ' <button type="button" onClick={() => client.abort()}>Stop</button>',
623
+ ' <button',
624
+ ' type="button"',
625
+ ' onClick={() => {',
626
+ ' client.abort();',
627
+ ' setTurnNotice("Response stopped. This does not undo a started action.");',
628
+ ' }}',
629
+ ' >',
630
+ ' Stop',
631
+ ' </button>',
508
632
  ' ) : (',
509
633
  ' <button type="submit">Send</button>',
510
634
  ' )}',
@@ -514,128 +638,25 @@ export function renderEmbeddedAssistantReference() {
514
638
  '}',
515
639
  '```',
516
640
  '',
517
- '`principalKey` is a browser-local identity for the authenticated user/tenant and is never sent to Noodle. Change it whenever that principal changes; the hook then aborts and clears the previous session and transcript. The hook does not register `<noodle-assistant>` or render Noodle markup.',
641
+ '`principalKey` is a browser-local identity for the authenticated user/tenant and is never sent to Noodle. Change it whenever that principal changes; the hook then aborts and clears the previous session and transcript. The hook does not register `<noodle-assistant>` or render Noodle markup. `suggestions` is hook-owned state: each prompt starts an ordinary message through the same guarded `client.sendMessage` path and disappears when the client clears it.',
518
642
  '',
519
- 'If the product deliberately sends a first turn on mount, make the effect cleanup-aware. React Strict Mode discards the provisional effect, so a persistent "already sent" ref can suppress the stable remount:',
520
- '',
521
- '```tsx',
522
- 'useEffect(() => {',
523
- ' let active = true;',
524
- ' queueMicrotask(() => {',
525
- ' if (active) settle(client.sendMessage(initialMessage));',
526
- ' });',
527
- ' return () => {',
528
- ' active = false;',
529
- ' };',
530
- '}, [client, initialMessage]);',
531
- '```',
643
+ 'Do not send a first turn on mount by default. React effect cleanup can suppress one provisional Strict Mode effect, but it cannot make a remount, dependency change, or client replacement idempotent. Require an explicit user action unless the host owns a durable one-shot state and an application idempotency key that makes repeated sends safe.',
532
644
  '',
533
645
  '`settle` must await or catch the command promise; the same structured failure also appears in the hook `error` state.',
534
646
  '',
535
- 'The sample fails closed on input requests until you replace that branch with a form generated from `requestedSchema`. A custom renderer must show the complete confirmation review and both decisions, handle every part it supports, and surface an explicit unsupported state for the rest. For `data-view`, use the canonical `<noodle-app-view>` host (or its React `NoodleAppView` adapter) to render the linked App, or deliberately map `resourceUri`/tool plus the bounded redacted `result` to an application-trusted native component. JSON result data is not the linked App UI. Never inject `part.data.html`, assign it to `srcdoc`, fetch a `ui://` URI, or reproduce the bridge with a direct Ext Apps dependency. Do not wrap this client in another chat transport or invent user messages for interaction continuations.',
536
- '',
537
- '`<noodle-app-view>` owns one bridge for the semantic view identity: client + `view.id` + `view.resourceUri`; `NoodleAppView` delegates to it. The host retains the iframe across fresh payload/callback/theme rerenders, publishes later resolved-theme changes through MCP Apps host context, and sends standard App teardown when that semantic identity changes, the element disconnects, or the App requests teardown. App views remain inline by default; the host advertises only inline presentation and rejects widget fullscreen requests. Opt in with `allowFullscreen` on `NoodleAppView` or `allow-fullscreen` on `<noodle-app-view>` only when fullscreen is an intentional part of the customer-owned experience. When fullscreen is accepted, the shared host adds an accessible top-right exit control that returns the same mounted App to inline mode without losing its state. Pass the same resolved application theme used by the conversation shell. Do not key an ancestor by a view object or callback. If the embedding page sets Content-Security-Policy, include the Noodle service origin in both `connect-src` and `frame-src`.',
538
- '',
539
- 'Outside React, use the same DOM-free client directly and import the isolated App-view entry only when rendering linked Apps. The client keeps the session token in memory, the transcript stays React-free, and the element owns only App presentation:',
540
- '',
541
- '```html',
542
- '<noodle-app-view id="assistant-app-view"></noodle-app-view>',
543
- '```',
544
- '',
545
- '```ts',
546
- 'import { createAssistantClient } from "@noodleseed/assistant/client";',
547
- 'import "@noodleseed/assistant/app-view";',
548
- '',
549
- 'const assistant = createAssistantClient({',
550
- ' sessionEndpoint: "/api/assistant/session",',
551
- ' clientContext: () => ({',
552
- ' locale: navigator.language,',
553
- ' timeZone: Intl.DateTimeFormat().resolvedOptions().timeZone,',
554
- ' }),',
555
- '});',
556
- '',
557
- 'const appView = document.querySelector("#assistant-app-view");',
558
- 'if (!appView) throw new Error("Missing App view host");',
559
- 'appView.client = assistant;',
560
- "appView.theme = document.documentElement.classList.contains('dark') ? 'dark' : 'light';",
561
- '',
562
- 'assistant.updateModelContext({',
563
- " content: [{ type: 'text', text: 'The time-off form is mounted.' }],",
564
- " structuredContent: { widget: { name: 'time-off', lifecycle: 'mounted' } },",
565
- '});',
566
- '',
567
- 'let pending: { id: string; requestedSchema?: Readonly<Record<string, unknown>> } | undefined;',
568
- 'assistant.subscribeChat((state) => {',
569
- ' renderUIMessageState(state);',
570
- ' pending = undefined;',
571
- ' for (const message of state.messages) {',
572
- ' for (const part of message.parts) {',
573
- " if (part.type === 'data-confirmation' && part.data.status === 'pending') {",
574
- ' pending = { id: part.data.id };',
575
- ' }',
576
- " if (part.type === 'data-input-request' && part.data.status === 'pending') {",
577
- ' pending = { id: part.data.id, requestedSchema: part.data.requestedSchema };',
578
- ' }',
579
- " if (part.type === 'data-view') {",
580
- ' appView.view = part.data;',
581
- ' }',
582
- ' }',
583
- ' }',
584
- '});',
647
+ 'This sample deliberately does not render Confirm until the application supplies a complete schema-aware review of every non-sensitive business field. It also refuses accepted elicitation until a form covers the compiler-approved portable `requestedSchema` subset; decline and cancel remain available and distinct. Use the managed renderer instead of shipping either unsupported branch. A production custom renderer must handle text, suggestions, sign-in, confirmation, elicitation, tool results, linked views, streaming, cancellation, terminal interaction states, and unknown future parts without silently dropping content.',
585
648
  '',
586
- 'await assistant.sendMessage("Book next Thursday and Friday off");',
587
- 'if (pending) {',
588
- ' const requestedSchema = pending.requestedSchema;',
589
- ' const resolution = requestedSchema',
590
- " ? { action: 'accept' as const, content: await renderPortableForm(requestedSchema) }",
591
- " : { action: 'accept' as const };",
592
- ' await assistant.respond(pending.id, resolution);',
593
- '}',
594
- "// The same pending id also accepts { action: 'decline' } or { action: 'cancel' }.",
595
- '```',
649
+ "`data-sign-in` is not an interaction and has no status: never pass its id to `client.respond`. Give `signInTicket` to an application callback that binds it to the host's existing short-lived login transaction; the authenticated backend spends it after login. Resolve the callback as `started` only after the host owns one active login transaction. Resolve it as `cancelled`, or reject it, when no transaction was started so the renderer can restore the sign-in affordance. A mixed custom renderer uses separate public and authenticated client mounts: the public shell starts with `embedId`, `serviceUrl`, and its visitor `principalKey`; after login, the authenticated destination mounts a new client against the same-origin `sessionEndpoint` with the user/tenant `principalKey`. Never pass both source options or mutate the public client source in place. The elevated session response owns bounded transcript repaint and optional resume. Never put the ticket in a query string, log, analytics event, or durable browser storage.",
596
650
  '',
597
- '`subscribeChat` immediately emits a detached `{ messages, status, error? }` snapshot and then emits as `UIMessage.parts` change. Text uses `text`; Noodle confirmations, input requests, tool results, and linked views use `data-confirmation`, `data-input-request`, `data-tool-result`, and `data-view`. Interaction data moves through pending/submitting/accepted/declined/cancelled. Use raw `subscribe(...)` only for transport/session lifecycle events that are not transcript content.',
651
+ 'The `session_expired` notice is observational. The client owns its one pre-execution `401` re-exchange and message retry; never rebuild tokens or replay an interaction in renderer code. A retryable transport detail is diagnostic, not proof that resending an ordinary message or business action is safe, so the skeleton never offers a generic Retry button. Reconcile a lost interaction response only by repeating the same id and the same decision through an explicit application recovery affordance. Budget exhaustion and tenant-mismatch elevation never retry.',
598
652
  '',
599
- 'For a chat-first custom host, raw `tool_started` carries the direct invocation call `id` and technical `tool` name before execution. Map known tools through a finite application-owned label table and use a neutral fallback such as "Working"; never mechanically expose an internal identifier as customer copy. Reserve one stable region with `role="status"` and `aria-live="polite"` for thinking, the mapped activity label, and the linked-view skeleton. `view_available` makes the view ready; raw `error` or chat `error` replaces it with `role="alert"`. Mark decorative skeleton shapes `aria-hidden="true"` and disable shimmer/transitions under `@media (prefers-reduced-motion: reduce)`.',
653
+ 'For `data-tool-result`, do not expose technical tool names or raw JSON as customer UI. Prefer the linked `data-view`; otherwise map a known bounded result to an application-trusted native component or keep the explicit unsupported-result state. For `data-view`, use the canonical `<noodle-app-view>` host (or its React `NoodleAppView` adapter). Never inject `part.data.html`, assign it to `srcdoc`, fetch a `ui://` URI, reproduce the bridge, wrap the client in another chat transport, or invent user messages for continuations.',
600
654
  '',
601
- '```ts',
602
- 'const activityByTool: Readonly<Record<string, string>> = {',
603
- ' list_open_items: "Loading open items",',
604
- '};',
605
- 'const viewSlots = new Map([["ui://workspace/current", "current-workspace"]]);',
606
- '',
607
- 'assistant.subscribe((event) => {',
608
- ' if (event.event === "tool_started") {',
609
- ' showActivity(event.data.id, activityByTool[event.data.tool] ?? "Working");',
610
- ' }',
611
- ' if (event.event === "view_available") {',
612
- ' const key = viewSlots.get(event.data.resourceUri) ?? `${event.data.id}:${event.data.resourceUri}`;',
613
- ' showReadyView(key, event.data);',
614
- ' }',
615
- ' if (event.event === "error") showActivityError(event.data.code);',
616
- '});',
617
- '```',
618
- '',
619
- '`data-view` means a completed tool has a linked MCP App view. Pass that typed part and the existing client to `<noodle-app-view>` in Vue, Angular, or plain DOM, or to its `NoodleAppView` React adapter. It retains one bridge for client + `view.id` + `view.resourceUri` and requests standard App teardown on semantic replacement, disconnect, or App request. That pair is transport identity: different call ids are distinct invocations and must not be deduplicated generically. If the product intentionally owns one current panel for a known resource, declare an application-owned slot map and replace only that slot. Deliberately map the bounded result to an application-trusted native component only when replacing the linked App UI.',
655
+ '`<noodle-app-view>` owns one bridge for the semantic view identity: client + `view.id` + `view.resourceUri`; `NoodleAppView` delegates to it. The host retains the iframe across fresh payload/callback/theme rerenders, publishes later resolved-theme changes through MCP Apps host context, and sends standard App teardown when that semantic identity changes, the element disconnects, or the App requests teardown. App views remain inline by default; the host advertises only inline presentation and rejects widget fullscreen requests. Opt in with `allowFullscreen` on `NoodleAppView` or `allow-fullscreen` on `<noodle-app-view>` only when fullscreen is an intentional part of the customer-owned experience. When fullscreen is accepted, the shared host adds an accessible top-right exit control that returns the same mounted App to inline mode without losing its state. Pass the same resolved application theme used by the conversation shell. Do not key an ancestor by a view object or callback. If the embedding page sets Content-Security-Policy, include the Noodle service origin in both `connect-src` and `frame-src`.',
620
656
  '',
657
+ ...renderEmbeddedAssistantRendererReference(),
621
658
  '`clientContext` and typed `pageContext` are recomputed for each turn. `updateContext(...)` remains the legacy session-exchange context; `updatePageContext(...)` replaces the fresh per-turn application hint. `updateModelContext({ content, structuredContent })` publishes one cohesive renderer snapshot for later message turns without starting a turn; every call replaces the prior snapshot rather than merging fields. These are untrusted data, not conversation history or authorization input, and the boundaries reject credential-shaped or unbounded updates. A message may re-exchange once after a pre-execution `401`; the client never auto-retries interaction decisions. `tool_proposed.arguments` is a complete schema-aware review projection and, for connector-backed tools, names the sole exact connector version/operation/resolved arguments. Sensitive/write-only fields are redacted; truncating or omitting any non-sensitive action field fails closed. Accept is bound to the server-held action and claims at most one execution attempt—clients cannot replace it. Normal terminal outcomes scrub private arguments and continuations immediately; only an accepted action still executing retains them for the one-hour unknown-outcome recovery window, after which it records `interaction_outcome_unknown` and scrubs. Without downstream idempotency this is not an exactly-once business-effect guarantee. To reconcile a lost response, explicitly repeat the same id and decision: the service returns its durable stored outcome without re-execution.',
622
- '',
623
- '## Host readiness and promotion',
624
- '',
625
- 'Run the non-mutating host preflight from the embedding application before its production build:',
626
- '',
627
- '```sh',
628
- 'noodle assistant embed --check --json',
629
- 'noodle assistant embed --check --json --require-env EXAMPLE_DELEG_CLIENT_SECRET',
630
- '```',
631
- '',
632
- 'The check reports only required and missing environment names, never their values. Pass `--surface public|mixed|authenticated` to match the deployment: `public` drops the backend client id/secret requirement (a public embed has neither), and `public`/`mixed` additionally require `script-src` — the one directive whose failure runs no widget code at all, so nothing can report it from inside the page. CSP directives verify against the service origin exactly, via the env placeholder, or through a covering wildcard (`https://*.example.com`); a dynamic expression is marked unverified instead of guessed. Additional `--require-env` names are application-owned; `--env-alias NAME=HOST_NAME` follows a host repo that names an env var differently.',
633
- '',
634
- 'Inspect the host repository for generated environment bindings after adding names. Run its existing generator, review the diff, commit generated types only when that repository requires them, then run the production-equivalent host build. Do not invent a framework command or add a second generator.',
635
- '',
636
- 'Promotion checklist: provision each environment in the backend secret manager; map names through the CI environment and any secret allowlist or secrets file; run the presence-only host preflight; run the canonical deploy so its configuration preflight completes before asset upload; run the post-deploy probes from the JSON contract; rotate the assistant client and delegated credential independently, then rerun the same checks.',
637
- '',
638
- "Devtools privacy gate: default model and connector exercises to synthetic or mock data. Before Devtools Chat sends real connector data to an external model, disclose the data flow and obtain the user's approval. A local validation pass is not that approval.",
659
+ ...renderEmbeddedAssistantOperationsReference(),
639
660
  '',
640
661
  '## Toolchain requirements',
641
662
  '',
@@ -0,0 +1,109 @@
1
+ /** Framework-neutral browser-client and linked-App renderer guidance. */
2
+ export function renderEmbeddedAssistantRendererReference() {
3
+ return [
4
+ '### Framework-neutral DOM client',
5
+ '',
6
+ 'Use the same DOM-free client directly without a component wrapper, and import the isolated App-view entry only when rendering linked Apps. The client keeps the session token in memory, and the element owns only App presentation:',
7
+ '',
8
+ '```html',
9
+ '<div id="assistant-app-views"></div>',
10
+ '```',
11
+ '',
12
+ '```ts',
13
+ 'import { createAssistantClient } from "@noodleseed/assistant/client";',
14
+ 'import "@noodleseed/assistant/app-view";',
15
+ 'import {',
16
+ ' type AssistantViewAvailableDetail,',
17
+ ' type NoodleAppViewElement,',
18
+ '} from "@noodleseed/assistant/app-view";',
19
+ '',
20
+ 'const assistant = createAssistantClient({',
21
+ ' sessionEndpoint: "/api/assistant/session",',
22
+ ' clientContext: () => ({',
23
+ ' locale: navigator.language,',
24
+ ' timeZone: Intl.DateTimeFormat().resolvedOptions().timeZone,',
25
+ ' }),',
26
+ '});',
27
+ '',
28
+ 'const appViews = document.querySelector("#assistant-app-views");',
29
+ 'if (!appViews) throw new Error("Missing App views host");',
30
+ 'const mountedViews = new Map<string, NoodleAppViewElement>();',
31
+ 'const readResolvedTheme = (): "light" | "dark" =>',
32
+ ' document.documentElement.classList.contains("dark") ? "dark" : "light";',
33
+ 'let resolvedTheme: "light" | "dark" = readResolvedTheme();',
34
+ 'const syncResolvedTheme = () => {',
35
+ ' resolvedTheme = readResolvedTheme();',
36
+ ' for (const mountedView of mountedViews.values()) mountedView.theme = resolvedTheme;',
37
+ '};',
38
+ 'new MutationObserver(syncResolvedTheme).observe(document.documentElement, {',
39
+ ' attributes: true,',
40
+ ' attributeFilter: ["class"],',
41
+ '});',
42
+ 'const appViewFor = (view: AssistantViewAvailableDetail) => {',
43
+ ' const key = `${view.id}:${view.resourceUri}`;',
44
+ ' let appView = mountedViews.get(key);',
45
+ ' if (!appView) {',
46
+ ' appView = document.createElement("noodle-app-view") as NoodleAppViewElement;',
47
+ ' appView.client = assistant;',
48
+ ' mountedViews.set(key, appView);',
49
+ ' appViews.append(appView);',
50
+ ' }',
51
+ ' appView.theme = resolvedTheme;',
52
+ ' return appView;',
53
+ '};',
54
+ '',
55
+ 'assistant.updateModelContext({',
56
+ " content: [{ type: 'text', text: 'The time-off form is mounted.' }],",
57
+ " structuredContent: { widget: { name: 'time-off', lifecycle: 'mounted' } },",
58
+ '});',
59
+ '',
60
+ 'assistant.subscribeChat((state) => {',
61
+ ' renderUIMessageState(state, {',
62
+ ' respond: (id, response) => assistant.respond(id, response),',
63
+ ' });',
64
+ ' const activeViewKeys = new Set<string>();',
65
+ ' for (const message of state.messages) {',
66
+ ' for (const part of message.parts) {',
67
+ " if (part.type === 'data-view') {",
68
+ ' const key = `${part.data.id}:${part.data.resourceUri}`;',
69
+ ' activeViewKeys.add(key);',
70
+ ' appViewFor(part.data).view = part.data;',
71
+ ' }',
72
+ ' }',
73
+ ' }',
74
+ ' for (const [key, mountedView] of mountedViews) {',
75
+ ' if (!activeViewKeys.has(key)) {',
76
+ ' mountedView.remove();',
77
+ ' mountedViews.delete(key);',
78
+ ' }',
79
+ ' }',
80
+ '});',
81
+ '```',
82
+ '',
83
+ '`subscribeChat` immediately emits a detached `{ messages, status, error? }` snapshot and then emits as `UIMessage.parts` change. Text uses `text`; Noodle confirmations, input requests, sign-in requests, tool results, and linked views use `data-confirmation`, `data-input-request`, `data-sign-in`, `data-tool-result`, and `data-view`. `renderUIMessageState` is application code: it must show a complete schema-aware review or requested form and require an explicit user gesture before calling the supplied `respond`. Never call `respond` while scanning a transcript snapshot. Interaction data moves through pending/submitting/accepted/declined/cancelled. Use raw `subscribe(...)` only for transport/session lifecycle events that are not transcript content.',
84
+ '',
85
+ 'For a chat-first custom host, raw `tool_started` carries the direct invocation call `id` and technical `tool` name before execution. Map known tools through a finite application-owned label table and use a neutral fallback such as "Working"; never mechanically expose an internal identifier as customer copy. Reserve one stable region with `role="status"` and `aria-live="polite"` for thinking, the mapped activity label, and the linked-view skeleton. `view_available` makes the view ready; raw `error` or chat `error` replaces it with `role="alert"`. Mark decorative skeleton shapes `aria-hidden="true"` and disable shimmer/transitions under `@media (prefers-reduced-motion: reduce)`.',
86
+ '',
87
+ '```ts',
88
+ 'const activityByTool: Readonly<Record<string, string>> = {',
89
+ ' list_open_items: "Loading open items",',
90
+ '};',
91
+ 'const viewSlots = new Map([["ui://workspace/current", "current-workspace"]]);',
92
+ '',
93
+ 'assistant.subscribe((event) => {',
94
+ ' if (event.event === "tool_started") {',
95
+ ' showActivity(event.data.id, activityByTool[event.data.tool] ?? "Working");',
96
+ ' }',
97
+ ' if (event.event === "view_available") {',
98
+ ' const key = viewSlots.get(event.data.resourceUri) ?? `${event.data.id}:${event.data.resourceUri}`;',
99
+ ' showReadyView(key, event.data);',
100
+ ' }',
101
+ ' if (event.event === "error") showActivityError(event.data.code);',
102
+ '});',
103
+ '```',
104
+ '',
105
+ '`data-view` means a completed tool has a linked MCP App view. Pass that typed part and the existing client to `<noodle-app-view>` in another component framework or plain DOM, or to its `NoodleAppView` React adapter. It retains one bridge for client + `view.id` + `view.resourceUri` and requests standard App teardown on semantic replacement, disconnect, or App request. That pair is transport identity: different call ids are distinct invocations and must not be deduplicated generically. If the product intentionally owns one current panel for a known resource, declare an application-owned slot map and replace only that slot. Deliberately map the bounded result to an application-trusted native component only when replacing the linked App UI.',
106
+ '',
107
+ ];
108
+ }
109
+ //# sourceMappingURL=skill-embedded-assistant-renderer-ref.js.map
@@ -3,7 +3,7 @@ import type { AgentTarget } from './index.js';
3
3
  export declare const SKILL_DESCRIPTION: string;
4
4
  export type SkillReferencePath = `references/${string}.md`;
5
5
  export declare const APP_DIRECTORY_COMPLIANCE_REFERENCE: SkillReferencePath;
6
- export type SkillRouteId = 'design-product' | 'create-product-guide' | 'wrap-existing-app' | 'build-server' | 'connect-api' | 'build-app' | 'verify-recover' | 'debug-recover' | 'inspect-hosted' | 'deploy-hosted' | 'embed-assistant' | 'publish' | 'feedback';
6
+ type SkillRouteId = 'design-product' | 'create-product-guide' | 'wrap-existing-app' | 'build-server' | 'connect-api' | 'build-app' | 'verify-recover' | 'debug-recover' | 'inspect-hosted' | 'deploy-hosted' | 'embed-assistant' | 'publish' | 'feedback';
7
7
  export interface SkillRoute {
8
8
  readonly id: SkillRouteId;
9
9
  readonly intent: string;
@@ -11,7 +11,6 @@ export interface SkillRoute {
11
11
  readonly exitCondition: string;
12
12
  }
13
13
  export declare const SKILL_ROUTES: readonly SkillRoute[];
14
- /** Complete lookup catalog. Routes above, not this inventory, own discovery. */
15
- export declare const REFERENCE_INDEX_LINES: readonly string[];
16
14
  export declare function skillRouterBody(_target: AgentTarget): string;
15
+ export {};
17
16
  //# sourceMappingURL=skill-router.d.ts.map
@@ -86,7 +86,7 @@ export const SKILL_ROUTES = [
86
86
  },
87
87
  ];
88
88
  /** Complete lookup catalog. Routes above, not this inventory, own discovery. */
89
- export const REFERENCE_INDEX_LINES = [
89
+ const REFERENCE_INDEX_LINES = [
90
90
  '- `references/agent-contract.md` — the `--json` envelope, exit codes, and the three output modes.',
91
91
  '- `references/product-agent-guides.md` — decide, interview, propose, prove, preview, and explicitly install one host-neutral product guide.',
92
92
  '- `references/sdk-surface.md` — what to import from `@noodleseed/one` and which builder to use.',
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@noodle-borg/agent-kit",
3
- "version": "0.91.0",
3
+ "version": "0.92.0",
4
4
  "license": "Apache-2.0",
5
5
  "type": "module",
6
6
  "engines": {