@noodleseed/agent-kit 0.85.0 → 0.86.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 (38) hide show
  1. package/manifest.json +265 -265
  2. package/package.json +1 -1
  3. package/skills/claude-code/SKILL.md +1 -1
  4. package/skills/claude-code/authoring-mcp-servers/SKILL.md +1 -1
  5. package/skills/claude-code/building-mcp-apps/SKILL.md +1 -1
  6. package/skills/claude-code/connecting-apis-to-mcp/SKILL.md +1 -1
  7. package/skills/claude-code/creating-product-agent-guides/SKILL.md +1 -1
  8. package/skills/claude-code/debugging-mcp-delivery/SKILL.md +1 -1
  9. package/skills/claude-code/deploying-mcp-services/SKILL.md +1 -1
  10. package/skills/claude-code/designing-mcp-products/SKILL.md +1 -1
  11. package/skills/claude-code/embedding-mcp-assistants/SKILL.md +1 -1
  12. package/skills/claude-code/examples/customer-auth/README.md +9 -1
  13. package/skills/claude-code/examples/customer-auth/src/server.ts +11 -3
  14. package/skills/claude-code/examples/customer-auth/test/server.test.ts +1 -1
  15. package/skills/claude-code/executing-noodle-plans/SKILL.md +1 -1
  16. package/skills/claude-code/publishing-mcp-integrations/SKILL.md +1 -1
  17. package/skills/claude-code/references/embedded-assistant.md +25 -18
  18. package/skills/claude-code/reporting-noodle-feedback/SKILL.md +1 -1
  19. package/skills/claude-code/verifying-mcp-delivery/SKILL.md +1 -1
  20. package/skills/claude-code/wrapping-existing-applications/SKILL.md +1 -1
  21. package/skills/codex/SKILL.md +1 -1
  22. package/skills/codex/authoring-mcp-servers/SKILL.md +1 -1
  23. package/skills/codex/building-mcp-apps/SKILL.md +1 -1
  24. package/skills/codex/connecting-apis-to-mcp/SKILL.md +1 -1
  25. package/skills/codex/creating-product-agent-guides/SKILL.md +1 -1
  26. package/skills/codex/debugging-mcp-delivery/SKILL.md +1 -1
  27. package/skills/codex/deploying-mcp-services/SKILL.md +1 -1
  28. package/skills/codex/designing-mcp-products/SKILL.md +1 -1
  29. package/skills/codex/embedding-mcp-assistants/SKILL.md +1 -1
  30. package/skills/codex/examples/customer-auth/README.md +9 -1
  31. package/skills/codex/examples/customer-auth/src/server.ts +11 -3
  32. package/skills/codex/examples/customer-auth/test/server.test.ts +1 -1
  33. package/skills/codex/executing-noodle-plans/SKILL.md +1 -1
  34. package/skills/codex/publishing-mcp-integrations/SKILL.md +1 -1
  35. package/skills/codex/references/embedded-assistant.md +25 -18
  36. package/skills/codex/reporting-noodle-feedback/SKILL.md +1 -1
  37. package/skills/codex/verifying-mcp-delivery/SKILL.md +1 -1
  38. package/skills/codex/wrapping-existing-applications/SKILL.md +1 -1
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@noodleseed/agent-kit",
3
- "version": "0.85.0",
3
+ "version": "0.86.0",
4
4
  "private": false,
5
5
  "description": "Self-checking, self-updating agent skills for the Noodle Seed CLI. Authored in this repo by @noodle-borg/agent-kit; this is the published, independently-versioned canonical skills artifact the CLI fetches and verifies.",
6
6
  "license": "Apache-2.0",
@@ -3,7 +3,7 @@ name: noodle-seed
3
3
  description: "Use when building, validating, testing, deploying, or operating a local or hosted Noodle Seed MCP server or app authored in TypeScript with the noodle CLI."
4
4
  ---
5
5
 
6
- <!-- noodle-skill version:0.85.0 hash:13ddce01769caae4 -->
6
+ <!-- noodle-skill version:0.86.0 hash:13ddce01769caae4 -->
7
7
 
8
8
  # Noodle Seed
9
9
 
@@ -3,7 +3,7 @@ name: authoring-mcp-servers
3
3
  description: "Use when creating or extending a headless Noodle Seed MCP server, tool, resource, prompt, or typed model-facing capability."
4
4
  ---
5
5
 
6
- <!-- noodle-skill version:0.85.0 hash:11523cb33b9473c0 -->
6
+ <!-- noodle-skill version:0.86.0 hash:11523cb33b9473c0 -->
7
7
 
8
8
  # authoring-mcp-servers
9
9
 
@@ -3,7 +3,7 @@ name: building-mcp-apps
3
3
  description: "Use when a Noodle Seed MCP App, widget, interactive card, visual interaction, or host-visible UI is the primary requested outcome."
4
4
  ---
5
5
 
6
- <!-- noodle-skill version:0.85.0 hash:9fd67d4d24328e15 -->
6
+ <!-- noodle-skill version:0.86.0 hash:9fd67d4d24328e15 -->
7
7
 
8
8
  # building-mcp-apps
9
9
 
@@ -3,7 +3,7 @@ name: connecting-apis-to-mcp
3
3
  description: "Use when all four API-evidence inputs exist—and only then: API base URL, authentication scheme, representative safe read, and observed response."
4
4
  ---
5
5
 
6
- <!-- noodle-skill version:0.85.0 hash:21bbd3ec441ffd30 -->
6
+ <!-- noodle-skill version:0.86.0 hash:21bbd3ec441ffd30 -->
7
7
 
8
8
  # connecting-apis-to-mcp
9
9
 
@@ -3,7 +3,7 @@ name: creating-product-agent-guides
3
3
  description: "Use when a Noodle Seed MCP server needs a new or revised product agent guide, App Package skill, or explicit product-skill regeneration."
4
4
  ---
5
5
 
6
- <!-- noodle-skill version:0.85.0 hash:0fa48a82fe836cf0 -->
6
+ <!-- noodle-skill version:0.86.0 hash:0fa48a82fe836cf0 -->
7
7
 
8
8
  # creating-product-agent-guides
9
9
 
@@ -3,7 +3,7 @@ name: debugging-mcp-delivery
3
3
  description: "Use when an existing Noodle Seed MCP project has a concrete validation, runtime, connector, App, host, deployment, or production failure."
4
4
  ---
5
5
 
6
- <!-- noodle-skill version:0.85.0 hash:aa715bae12041d7c -->
6
+ <!-- noodle-skill version:0.86.0 hash:aa715bae12041d7c -->
7
7
 
8
8
  # debugging-mcp-delivery
9
9
 
@@ -3,7 +3,7 @@ name: deploying-mcp-services
3
3
  description: "Use when the user explicitly requests a Noodle Seed hosted link, configuration write, deployment, access change, rollback, or connection write."
4
4
  ---
5
5
 
6
- <!-- noodle-skill version:0.85.0 hash:93e735b7ffb45df1 -->
6
+ <!-- noodle-skill version:0.86.0 hash:93e735b7ffb45df1 -->
7
7
 
8
8
  # deploying-mcp-services
9
9
 
@@ -3,7 +3,7 @@ name: designing-mcp-products
3
3
  description: "Use when a Noodle Seed MCP product idea needs conversational fit, user benefit, scope, interaction, or evidence design before implementation."
4
4
  ---
5
5
 
6
- <!-- noodle-skill version:0.85.0 hash:78a6f181b61f92f1 -->
6
+ <!-- noodle-skill version:0.86.0 hash:78a6f181b61f92f1 -->
7
7
 
8
8
  # designing-mcp-products
9
9
 
@@ -3,7 +3,7 @@ name: embedding-mcp-assistants
3
3
  description: "Use when embedding a Noodle assistant into an existing SaaS or web application with browser, identity, session, and credential boundaries."
4
4
  ---
5
5
 
6
- <!-- noodle-skill version:0.85.0 hash:cc54a67f21c0ecdb -->
6
+ <!-- noodle-skill version:0.86.0 hash:cc54a67f21c0ecdb -->
7
7
 
8
8
  # embedding-mcp-assistants
9
9
 
@@ -380,7 +380,15 @@ loopback development origins such as `http://localhost:3000`, `http://127.0.0.1:
380
380
 
381
381
  The bounded `presentation` object configures the panel, launcher, header, composer, and messages. Its
382
382
  primitives derive colors from shared server `branding`; raw HTML, CSS, inline SVG, renderer classes, and
383
- callbacks are not accepted.
383
+ callbacks are not accepted. This example omits `presentation.panel.surface`, so the renderer keeps the
384
+ opaque default panel treatment while the example's light/dark `branding` surfaces provide its customer colors;
385
+ set the bounded surface to `glass` only when translucency is intentional.
386
+
387
+ These TypeScript values remain the reusable developer defaults. After deployment, an environment operator
388
+ can adjust theme, logo, launcher style, position, and the bounded color palette from the Console's
389
+ **Assistant** tab or `noodle assistant appearance` without changing the customer's embed code. See the
390
+ [embedded assistant guide](https://docs.noodleseed.dev/guides/embedded-assistant) for precedence and reset
391
+ behavior.
384
392
 
385
393
  Create the backend credential after deployment. The CLI writes it to a mode-0600 file and never prints the
386
394
  secret:
@@ -173,14 +173,22 @@ export default server(
173
173
  access: authenticatedWebsite({
174
174
  origins: [assistantOrigin, 'https://dev.noodleseed.com', 'http://localhost:3000'],
175
175
  }),
176
- layout: { mode: 'floating', position: 'bottom-right', panelWidth: 420 },
176
+ theme: 'auto',
177
+ layout: { mode: 'floating', position: 'bottom-center', panelWidth: 970 },
178
+ behavior: { showPoweredBy: true },
177
179
  labels: {
178
180
  welcomeHeading: 'How can I help with Noodle Seed?',
181
+ launcherPlaceholder: 'Ask Noodle Seed anything',
179
182
  composerPlaceholder: 'Ask about your apps…',
180
183
  },
181
184
  presentation: {
182
- panel: { surface: 'glass', elevation: 'soft', border: 'subtle' },
183
- launcher: { icon: 'brand-mark', status: 'session', effect: 'pulse' },
185
+ panel: { elevation: 'soft', border: 'subtle' },
186
+ launcher: {
187
+ style: 'pill',
188
+ icon: 'brand-mark',
189
+ status: 'session',
190
+ effect: 'pulse',
191
+ },
184
192
  header: {
185
193
  mark: 'status',
186
194
  badge: { text: 'Workspace online', tone: 'success', indicator: true },
@@ -9,7 +9,7 @@ describe('customer-auth example', () => {
9
9
  model: { kind: 'openai-compatible', apiKey: 'ASSISTANT_MODEL_API_KEY' },
10
10
  layout: { mode: 'floating' },
11
11
  presentation: {
12
- panel: { surface: 'glass', elevation: 'soft', border: 'subtle' },
12
+ panel: { elevation: 'soft', border: 'subtle' },
13
13
  launcher: { icon: 'brand-mark', status: 'session', effect: 'pulse' },
14
14
  header: { mark: 'status', badge: { text: 'Workspace online', tone: 'success' } },
15
15
  },
@@ -3,7 +3,7 @@ name: executing-noodle-plans
3
3
  description: "Use when the user asks to execute an approved, decision-complete implementation plan for a Noodle Seed project task by task with test-first changes, review, recovery, and final verification."
4
4
  ---
5
5
 
6
- <!-- noodle-skill version:0.85.0 hash:6a9f132ddb79352e -->
6
+ <!-- noodle-skill version:0.86.0 hash:6a9f132ddb79352e -->
7
7
 
8
8
  # Execute a Noodle Seed implementation plan
9
9
 
@@ -3,7 +3,7 @@ name: publishing-mcp-integrations
3
3
  description: "Use when preparing, reviewing, or submitting a Noodle Seed MCP integration to a host or app directory."
4
4
  ---
5
5
 
6
- <!-- noodle-skill version:0.85.0 hash:efffbf82007f935d -->
6
+ <!-- noodle-skill version:0.86.0 hash:efffbf82007f935d -->
7
7
 
8
8
  # publishing-mcp-integrations
9
9
 
@@ -53,7 +53,7 @@ assistant: embeddedAssistant({
53
53
  access: authenticatedWebsite({
54
54
  origins: ["http://localhost:3000", "https://app.example.com"],
55
55
  }),
56
- layout: { mode: "floating", position: "bottom-right" },
56
+ layout: { mode: "floating", position: "bottom-center" },
57
57
  }),
58
58
  ```
59
59
 
@@ -142,13 +142,15 @@ Keep portable identity and semantic light/dark colors in the one server-level `b
142
142
 
143
143
  ```ts
144
144
  assistant: embeddedAssistant({
145
- model, allowedOrigins,
146
- layout: { panelWidth: 520, panelMinHeight: 540, panelMaxHeight: 740, edgeOffset: 24 },
147
- behavior: { showTimestamps: true },
148
- labels: { composerPlaceholder: "Message Acme Support…", sessionReady: "Acme support is online" },
145
+ model,
146
+ access: authenticatedWebsite({ origins: ["https://app.example.com"] }),
147
+ theme: "invert",
148
+ layout: { position: "bottom-right", panelWidth: 520, panelMinHeight: 540, panelMaxHeight: 740, edgeOffset: 24 },
149
+ behavior: { showTimestamps: true, showPoweredBy: false },
150
+ labels: { launcherPlaceholder: "Ask Acme anything", composerPlaceholder: "Message Acme Support…", sessionReady: "Acme support is online" },
149
151
  presentation: {
150
152
  panel: { surface: "solid", elevation: "dramatic", border: "strong", radius: 20 },
151
- launcher: { icon: "chat", size: "lg", status: "session", effect: "pulse" },
153
+ launcher: { style: "bubble", icon: "chat", size: "lg", status: "session", effect: "pulse" },
152
154
  header: {
153
155
  mark: "status",
154
156
  badge: { text: "Online", tone: "success", indicator: true },
@@ -159,9 +161,9 @@ assistant: embeddedAssistant({
159
161
  }),
160
162
  ```
161
163
 
162
- The Atlas-style product treatment above is the maximum deployment-configurable presentation. The bounded surface covers panel treatment, launcher icon/size/session pulse, header mark/status badge, composer controls, and message treatment; it does not accept custom header actions, structured empty-state layouts, footers, spectacle variants/effects, or tenant code.
164
+ The Atlas-style product treatment above is the maximum deployment-configurable presentation. The bounded surface covers panel treatment, pill/bubble launcher style plus icon/size/session pulse, header mark/status badge, composer controls, and message treatment; it does not accept custom header actions, structured empty-state layouts, footers, tenant-defined launcher variants/effects, or tenant code.
163
165
 
164
- Omitted fields retain the quiet premium baseline. For exact application-owned color roles, pass the typed React `appearance={{ light: { panel: { surface, text, border }, composer: {...}, confirmation: {...}, primaryButton: {...} }, dark: {...} }}` prop or assign the same object to `element.appearance`. CSS custom properties inherit through the assistant host, so those values may reuse existing application tokens such as `surface: "var(--app-surface)"` without copying literals. The appearance surface covers canvas, panel, header, messages, composer, suggestions, confirmation, buttons, launcher, code, and the MCP App frame; the package README publishes the complete role-to-`--ns-assistant-*` map. Exact parseable literal colors are preserved and low contrast emits `assistant-appearance-warning`; contrast for unresolved CSS references remains host-owned. Precedence is host appearance object, host slots/public variables, deployed semantic presentation, then defaults. Prefer `server.ts` configuration first so every embedding app receives the same assistant after redeploy.
166
+ Omitted UI fields retain the complete managed baseline: a bottom-center frosted prompt pill, 970px outer desktop shell with 20px side padding, 85vh/1025px height bounds, 24px panel with built-in `#F8F8F8` light and `#0C0A09` dark surfaces, bottom prompt chips and pill composer, plain assistant messages, 85%-wide user bubbles, Noodle Seed attribution, and mobile fullscreen. The pill morphs into an input before opening; `launcher.style: "bubble"` opens directly, while `panel.surface: "glass"` remains an explicit translucent alternative. `theme: "auto"` follows the host page and `"invert"` selects its opposite. The generic suggestions are defaults; an authored list, including `[]`, replaces them. The ChatGPT promotion is intentionally absent. For exact application-owned color roles, pass the typed React `appearance={{ light: { panel: { surface, text, border }, composer: {...}, confirmation: {...}, primaryButton: {...} }, dark: {...} }}` prop or assign the same object to `element.appearance`. CSS custom properties inherit through the assistant host, so those values may reuse existing application tokens such as `surface: "var(--app-surface)"` without copying literals. The appearance surface covers canvas, panel, header, messages, composer, suggestions, confirmation, buttons, launcher, code, and the MCP App frame; the package README publishes the complete role-to-`--ns-assistant-*` map. Exact parseable literal colors are preserved and low contrast emits `assistant-appearance-warning`; contrast for unresolved CSS references remains host-owned. Precedence is host appearance object, host slots/public variables, saved environment operator override, deployed semantic presentation, then defaults. Prefer reusable `server.ts` defaults; use the Console Assistant tab or `noodle assistant appearance show|apply|reset` for environment-owned changes that should reach existing embeds without a redeploy.
165
167
 
166
168
  Give every business action a portable `tool(..., { title: "Complete task", description: "This will mark the task complete for everyone.", input: z.object({ task: z.string().meta({ title: "Task" }) }) })` title. The standard confirmation uses the tool title/description plus schema field `title`, `description`, and `format`; it shows Confirm and Don't proceed and keeps technical action details secondary. Do not put JSON or implementation names in business-facing copy.
167
169
 
@@ -319,12 +321,15 @@ const session = await createAssistantSession({
319
321
 
320
322
  ```ts
321
323
  assistant: embeddedAssistant({
322
- model, allowedOrigins,
323
- sessionClaims: {
324
- displayName: { exposeToModel: true },
325
- accountTier: { exposeToModel: true },
326
- region: {}, // tools only, never in the prompt
327
- },
324
+ model,
325
+ access: authenticatedWebsite({
326
+ origins: ["https://app.example.com"],
327
+ sessionClaims: {
328
+ displayName: { exposeToModel: true },
329
+ accountTier: { exposeToModel: true },
330
+ region: {}, // tools only, never in the prompt
331
+ },
332
+ }),
328
333
  }),
329
334
  ```
330
335
 
@@ -380,7 +385,9 @@ import { NoodleAssistant } from "@noodleseed/assistant/react";
380
385
 
381
386
  Or import the package root once and mount `<noodle-assistant session-endpoint="/api/assistant/session" theme="auto"></noodle-assistant>`. Mount only inside the authenticated application surface.
382
387
 
383
- `theme="auto"` follows the browser operating-system preference. If the SaaS application owns a theme toggle, obtain its resolved application theme (`"light"` or `"dark"`), pass `theme={resolvedTheme}` to `NoodleAssistant`, and update the custom element's `theme` attribute when that value changes.
388
+ That custom element is the complete managed assistant in Vue, Angular, or plain DOM; it has no React runtime requirement. Configure the framework to accept `noodle-assistant` as a custom element. If the session exchange needs an authenticated fetch wrapper, create the element imperatively, assign `element.fetch` and then `element.sessionEndpoint`, and append it only after both properties are set.
389
+
390
+ `theme="auto"` follows an explicit host-page light/dark class or data attribute, then the browser operating-system preference; `theme="invert"` selects the opposite. If the SaaS application owns a theme toggle, obtain its resolved application theme (`"light"` or `"dark"`), pass `theme={resolvedTheme}` to `NoodleAssistant`, and update the custom element's `theme` attribute when that value changes.
384
391
 
385
392
  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`.
386
393
 
@@ -635,7 +642,7 @@ Devtools privacy gate: default model and connector exercises to synthetic or moc
635
642
 
636
643
  - Signed-out session exchange returns `401`.
637
644
  - The browser network/DOM/storage contains no client secret or model key.
638
- - The local and production origins match `allowedOrigins` character-for-character.
645
+ - The local and production origins match the authored `access.origins` character-for-character.
639
646
  - At the manifest/runtime boundary and in TypeScript action helpers, only `confirm: true` enables confirmation; omitted or `false` preserves direct execution. Action hints alone never enforce approval; `annotations.action({ confirm: false })` is equivalent to omission.
640
647
  - An expired turn re-exchanges once; interaction decisions never auto-retry. An explicit same-decision repeat returns the stored outcome without executing again.
641
648
  - Accept, decline, and cancel are single-use. Only accept executes; the server ignores replacement tool arguments.
@@ -653,9 +660,9 @@ Devtools privacy gate: default model and connector exercises to synthetic or moc
653
660
  | `assistant-error` with code `invalid_response` | The turn endpoint returned HTML or non-SSE content (auth redirect, proxy page) | Check the backend session route path and any middleware/rewrites on the embedding app |
654
661
  | Build error `Package path ./react is not exported` | Outdated package version with import-only export conditions | Update `@noodleseed/assistant`; do not add webpack aliases or type shims |
655
662
  | Deploy fails with `server_auth_required` | `--access customers` without `server.auth` | Add direct/federated OIDC or a built-in Firebase/Microsoft adapter |
656
- | Validate rejects an origin | Non-loopback HTTP origin in `allowedOrigins` | Use the exact HTTPS production origin; HTTP is only for `localhost`/`127.0.0.1` |
663
+ | Validate rejects an origin | Non-loopback HTTP origin in `access.origins` | Use the exact HTTPS production origin; HTTP is only for `localhost`/`127.0.0.1` |
657
664
  | Session exchange returns 404 | `serviceUrl` points at the deployment MCP endpoint | Use the control-plane service URL printed by `noodle assistant clients create` |
658
- | Session exchange returns 403 `origin is not allowed` | Request origin differs from `allowedOrigins` character-for-character | Align the exact scheme/host/port on both sides and redeploy |
665
+ | Session exchange returns 403 `origin is not allowed` | Request origin differs from the authored `access.origins` character-for-character | Align the exact scheme/host/port on both sides and redeploy |
659
666
  | Session exchange returns `400` with `invalid assistant routing` | The authenticated backend supplied an unknown endpoint name or a malformed/policy-disallowed URL | Resolve the route from server-owned membership, use the exact authored endpoint name, and ensure the canonical HTTPS URL satisfies its active `customerEndpoint` policy; the error never reflects the URL |
660
667
  | A routed assistant tool returns `connector_route_unavailable` | The authenticated backend omitted that endpoint during session exchange | Pass the server-verified route as `routing.endpoints.<name>` when minting a new session; keep it out of browser input |
661
668
  | Host session 503 | A required backend environment name is absent or mapped into the wrong deployment environment | Run `noodle assistant embed --check --json`, repair the host CI mapping, then probe the session route again |
@@ -3,7 +3,7 @@ name: reporting-noodle-feedback
3
3
  description: "Use when a Noodle Seed bug, misleading instruction, missing capability, or concrete product improvement should be proposed to the user."
4
4
  ---
5
5
 
6
- <!-- noodle-skill version:0.85.0 hash:0f404109f4845683 -->
6
+ <!-- noodle-skill version:0.86.0 hash:0f404109f4845683 -->
7
7
 
8
8
  # reporting-noodle-feedback
9
9
 
@@ -3,7 +3,7 @@ name: verifying-mcp-delivery
3
3
  description: "Use when proving a Noodle Seed MCP project works at a named compile, local, connector, App, host, deployment, or production evidence level."
4
4
  ---
5
5
 
6
- <!-- noodle-skill version:0.85.0 hash:6ef6ef551e26b78e -->
6
+ <!-- noodle-skill version:0.86.0 hash:6ef6ef551e26b78e -->
7
7
 
8
8
  # verifying-mcp-delivery
9
9
 
@@ -3,7 +3,7 @@ name: wrapping-existing-applications
3
3
  description: "Use when an existing application has no stable usable API and needs a read-only, identity-first Noodle Seed integration plan before implementation."
4
4
  ---
5
5
 
6
- <!-- noodle-skill version:0.85.0 hash:eccc3c158dcafba8 -->
6
+ <!-- noodle-skill version:0.86.0 hash:eccc3c158dcafba8 -->
7
7
 
8
8
  # wrapping-existing-applications
9
9
 
@@ -3,7 +3,7 @@ name: noodle-seed
3
3
  description: "Use when building, validating, testing, deploying, or operating a local or hosted Noodle Seed MCP server or app authored in TypeScript with the noodle CLI."
4
4
  ---
5
5
 
6
- <!-- noodle-skill version:0.85.0 hash:13ddce01769caae4 -->
6
+ <!-- noodle-skill version:0.86.0 hash:13ddce01769caae4 -->
7
7
 
8
8
  # Noodle Seed
9
9
 
@@ -3,7 +3,7 @@ name: authoring-mcp-servers
3
3
  description: "Use when creating or extending a headless Noodle Seed MCP server, tool, resource, prompt, or typed model-facing capability."
4
4
  ---
5
5
 
6
- <!-- noodle-skill version:0.85.0 hash:11523cb33b9473c0 -->
6
+ <!-- noodle-skill version:0.86.0 hash:11523cb33b9473c0 -->
7
7
 
8
8
  # authoring-mcp-servers
9
9
 
@@ -3,7 +3,7 @@ name: building-mcp-apps
3
3
  description: "Use when a Noodle Seed MCP App, widget, interactive card, visual interaction, or host-visible UI is the primary requested outcome."
4
4
  ---
5
5
 
6
- <!-- noodle-skill version:0.85.0 hash:9fd67d4d24328e15 -->
6
+ <!-- noodle-skill version:0.86.0 hash:9fd67d4d24328e15 -->
7
7
 
8
8
  # building-mcp-apps
9
9
 
@@ -3,7 +3,7 @@ name: connecting-apis-to-mcp
3
3
  description: "Use when all four API-evidence inputs exist—and only then: API base URL, authentication scheme, representative safe read, and observed response."
4
4
  ---
5
5
 
6
- <!-- noodle-skill version:0.85.0 hash:21bbd3ec441ffd30 -->
6
+ <!-- noodle-skill version:0.86.0 hash:21bbd3ec441ffd30 -->
7
7
 
8
8
  # connecting-apis-to-mcp
9
9
 
@@ -3,7 +3,7 @@ name: creating-product-agent-guides
3
3
  description: "Use when a Noodle Seed MCP server needs a new or revised product agent guide, App Package skill, or explicit product-skill regeneration."
4
4
  ---
5
5
 
6
- <!-- noodle-skill version:0.85.0 hash:0fa48a82fe836cf0 -->
6
+ <!-- noodle-skill version:0.86.0 hash:0fa48a82fe836cf0 -->
7
7
 
8
8
  # creating-product-agent-guides
9
9
 
@@ -3,7 +3,7 @@ name: debugging-mcp-delivery
3
3
  description: "Use when an existing Noodle Seed MCP project has a concrete validation, runtime, connector, App, host, deployment, or production failure."
4
4
  ---
5
5
 
6
- <!-- noodle-skill version:0.85.0 hash:aa715bae12041d7c -->
6
+ <!-- noodle-skill version:0.86.0 hash:aa715bae12041d7c -->
7
7
 
8
8
  # debugging-mcp-delivery
9
9
 
@@ -3,7 +3,7 @@ name: deploying-mcp-services
3
3
  description: "Use when the user explicitly requests a Noodle Seed hosted link, configuration write, deployment, access change, rollback, or connection write."
4
4
  ---
5
5
 
6
- <!-- noodle-skill version:0.85.0 hash:93e735b7ffb45df1 -->
6
+ <!-- noodle-skill version:0.86.0 hash:93e735b7ffb45df1 -->
7
7
 
8
8
  # deploying-mcp-services
9
9
 
@@ -3,7 +3,7 @@ name: designing-mcp-products
3
3
  description: "Use when a Noodle Seed MCP product idea needs conversational fit, user benefit, scope, interaction, or evidence design before implementation."
4
4
  ---
5
5
 
6
- <!-- noodle-skill version:0.85.0 hash:78a6f181b61f92f1 -->
6
+ <!-- noodle-skill version:0.86.0 hash:78a6f181b61f92f1 -->
7
7
 
8
8
  # designing-mcp-products
9
9
 
@@ -3,7 +3,7 @@ name: embedding-mcp-assistants
3
3
  description: "Use when embedding a Noodle assistant into an existing SaaS or web application with browser, identity, session, and credential boundaries."
4
4
  ---
5
5
 
6
- <!-- noodle-skill version:0.85.0 hash:cc54a67f21c0ecdb -->
6
+ <!-- noodle-skill version:0.86.0 hash:cc54a67f21c0ecdb -->
7
7
 
8
8
  # embedding-mcp-assistants
9
9
 
@@ -380,7 +380,15 @@ loopback development origins such as `http://localhost:3000`, `http://127.0.0.1:
380
380
 
381
381
  The bounded `presentation` object configures the panel, launcher, header, composer, and messages. Its
382
382
  primitives derive colors from shared server `branding`; raw HTML, CSS, inline SVG, renderer classes, and
383
- callbacks are not accepted.
383
+ callbacks are not accepted. This example omits `presentation.panel.surface`, so the renderer keeps the
384
+ opaque default panel treatment while the example's light/dark `branding` surfaces provide its customer colors;
385
+ set the bounded surface to `glass` only when translucency is intentional.
386
+
387
+ These TypeScript values remain the reusable developer defaults. After deployment, an environment operator
388
+ can adjust theme, logo, launcher style, position, and the bounded color palette from the Console's
389
+ **Assistant** tab or `noodle assistant appearance` without changing the customer's embed code. See the
390
+ [embedded assistant guide](https://docs.noodleseed.dev/guides/embedded-assistant) for precedence and reset
391
+ behavior.
384
392
 
385
393
  Create the backend credential after deployment. The CLI writes it to a mode-0600 file and never prints the
386
394
  secret:
@@ -173,14 +173,22 @@ export default server(
173
173
  access: authenticatedWebsite({
174
174
  origins: [assistantOrigin, 'https://dev.noodleseed.com', 'http://localhost:3000'],
175
175
  }),
176
- layout: { mode: 'floating', position: 'bottom-right', panelWidth: 420 },
176
+ theme: 'auto',
177
+ layout: { mode: 'floating', position: 'bottom-center', panelWidth: 970 },
178
+ behavior: { showPoweredBy: true },
177
179
  labels: {
178
180
  welcomeHeading: 'How can I help with Noodle Seed?',
181
+ launcherPlaceholder: 'Ask Noodle Seed anything',
179
182
  composerPlaceholder: 'Ask about your apps…',
180
183
  },
181
184
  presentation: {
182
- panel: { surface: 'glass', elevation: 'soft', border: 'subtle' },
183
- launcher: { icon: 'brand-mark', status: 'session', effect: 'pulse' },
185
+ panel: { elevation: 'soft', border: 'subtle' },
186
+ launcher: {
187
+ style: 'pill',
188
+ icon: 'brand-mark',
189
+ status: 'session',
190
+ effect: 'pulse',
191
+ },
184
192
  header: {
185
193
  mark: 'status',
186
194
  badge: { text: 'Workspace online', tone: 'success', indicator: true },
@@ -9,7 +9,7 @@ describe('customer-auth example', () => {
9
9
  model: { kind: 'openai-compatible', apiKey: 'ASSISTANT_MODEL_API_KEY' },
10
10
  layout: { mode: 'floating' },
11
11
  presentation: {
12
- panel: { surface: 'glass', elevation: 'soft', border: 'subtle' },
12
+ panel: { elevation: 'soft', border: 'subtle' },
13
13
  launcher: { icon: 'brand-mark', status: 'session', effect: 'pulse' },
14
14
  header: { mark: 'status', badge: { text: 'Workspace online', tone: 'success' } },
15
15
  },
@@ -3,7 +3,7 @@ name: executing-noodle-plans
3
3
  description: "Use when the user asks to execute an approved, decision-complete implementation plan for a Noodle Seed project task by task with test-first changes, review, recovery, and final verification."
4
4
  ---
5
5
 
6
- <!-- noodle-skill version:0.85.0 hash:6a9f132ddb79352e -->
6
+ <!-- noodle-skill version:0.86.0 hash:6a9f132ddb79352e -->
7
7
 
8
8
  # Execute a Noodle Seed implementation plan
9
9
 
@@ -3,7 +3,7 @@ name: publishing-mcp-integrations
3
3
  description: "Use when preparing, reviewing, or submitting a Noodle Seed MCP integration to a host or app directory."
4
4
  ---
5
5
 
6
- <!-- noodle-skill version:0.85.0 hash:efffbf82007f935d -->
6
+ <!-- noodle-skill version:0.86.0 hash:efffbf82007f935d -->
7
7
 
8
8
  # publishing-mcp-integrations
9
9
 
@@ -53,7 +53,7 @@ assistant: embeddedAssistant({
53
53
  access: authenticatedWebsite({
54
54
  origins: ["http://localhost:3000", "https://app.example.com"],
55
55
  }),
56
- layout: { mode: "floating", position: "bottom-right" },
56
+ layout: { mode: "floating", position: "bottom-center" },
57
57
  }),
58
58
  ```
59
59
 
@@ -142,13 +142,15 @@ Keep portable identity and semantic light/dark colors in the one server-level `b
142
142
 
143
143
  ```ts
144
144
  assistant: embeddedAssistant({
145
- model, allowedOrigins,
146
- layout: { panelWidth: 520, panelMinHeight: 540, panelMaxHeight: 740, edgeOffset: 24 },
147
- behavior: { showTimestamps: true },
148
- labels: { composerPlaceholder: "Message Acme Support…", sessionReady: "Acme support is online" },
145
+ model,
146
+ access: authenticatedWebsite({ origins: ["https://app.example.com"] }),
147
+ theme: "invert",
148
+ layout: { position: "bottom-right", panelWidth: 520, panelMinHeight: 540, panelMaxHeight: 740, edgeOffset: 24 },
149
+ behavior: { showTimestamps: true, showPoweredBy: false },
150
+ labels: { launcherPlaceholder: "Ask Acme anything", composerPlaceholder: "Message Acme Support…", sessionReady: "Acme support is online" },
149
151
  presentation: {
150
152
  panel: { surface: "solid", elevation: "dramatic", border: "strong", radius: 20 },
151
- launcher: { icon: "chat", size: "lg", status: "session", effect: "pulse" },
153
+ launcher: { style: "bubble", icon: "chat", size: "lg", status: "session", effect: "pulse" },
152
154
  header: {
153
155
  mark: "status",
154
156
  badge: { text: "Online", tone: "success", indicator: true },
@@ -159,9 +161,9 @@ assistant: embeddedAssistant({
159
161
  }),
160
162
  ```
161
163
 
162
- The Atlas-style product treatment above is the maximum deployment-configurable presentation. The bounded surface covers panel treatment, launcher icon/size/session pulse, header mark/status badge, composer controls, and message treatment; it does not accept custom header actions, structured empty-state layouts, footers, spectacle variants/effects, or tenant code.
164
+ The Atlas-style product treatment above is the maximum deployment-configurable presentation. The bounded surface covers panel treatment, pill/bubble launcher style plus icon/size/session pulse, header mark/status badge, composer controls, and message treatment; it does not accept custom header actions, structured empty-state layouts, footers, tenant-defined launcher variants/effects, or tenant code.
163
165
 
164
- Omitted fields retain the quiet premium baseline. For exact application-owned color roles, pass the typed React `appearance={{ light: { panel: { surface, text, border }, composer: {...}, confirmation: {...}, primaryButton: {...} }, dark: {...} }}` prop or assign the same object to `element.appearance`. CSS custom properties inherit through the assistant host, so those values may reuse existing application tokens such as `surface: "var(--app-surface)"` without copying literals. The appearance surface covers canvas, panel, header, messages, composer, suggestions, confirmation, buttons, launcher, code, and the MCP App frame; the package README publishes the complete role-to-`--ns-assistant-*` map. Exact parseable literal colors are preserved and low contrast emits `assistant-appearance-warning`; contrast for unresolved CSS references remains host-owned. Precedence is host appearance object, host slots/public variables, deployed semantic presentation, then defaults. Prefer `server.ts` configuration first so every embedding app receives the same assistant after redeploy.
166
+ Omitted UI fields retain the complete managed baseline: a bottom-center frosted prompt pill, 970px outer desktop shell with 20px side padding, 85vh/1025px height bounds, 24px panel with built-in `#F8F8F8` light and `#0C0A09` dark surfaces, bottom prompt chips and pill composer, plain assistant messages, 85%-wide user bubbles, Noodle Seed attribution, and mobile fullscreen. The pill morphs into an input before opening; `launcher.style: "bubble"` opens directly, while `panel.surface: "glass"` remains an explicit translucent alternative. `theme: "auto"` follows the host page and `"invert"` selects its opposite. The generic suggestions are defaults; an authored list, including `[]`, replaces them. The ChatGPT promotion is intentionally absent. For exact application-owned color roles, pass the typed React `appearance={{ light: { panel: { surface, text, border }, composer: {...}, confirmation: {...}, primaryButton: {...} }, dark: {...} }}` prop or assign the same object to `element.appearance`. CSS custom properties inherit through the assistant host, so those values may reuse existing application tokens such as `surface: "var(--app-surface)"` without copying literals. The appearance surface covers canvas, panel, header, messages, composer, suggestions, confirmation, buttons, launcher, code, and the MCP App frame; the package README publishes the complete role-to-`--ns-assistant-*` map. Exact parseable literal colors are preserved and low contrast emits `assistant-appearance-warning`; contrast for unresolved CSS references remains host-owned. Precedence is host appearance object, host slots/public variables, saved environment operator override, deployed semantic presentation, then defaults. Prefer reusable `server.ts` defaults; use the Console Assistant tab or `noodle assistant appearance show|apply|reset` for environment-owned changes that should reach existing embeds without a redeploy.
165
167
 
166
168
  Give every business action a portable `tool(..., { title: "Complete task", description: "This will mark the task complete for everyone.", input: z.object({ task: z.string().meta({ title: "Task" }) }) })` title. The standard confirmation uses the tool title/description plus schema field `title`, `description`, and `format`; it shows Confirm and Don't proceed and keeps technical action details secondary. Do not put JSON or implementation names in business-facing copy.
167
169
 
@@ -319,12 +321,15 @@ const session = await createAssistantSession({
319
321
 
320
322
  ```ts
321
323
  assistant: embeddedAssistant({
322
- model, allowedOrigins,
323
- sessionClaims: {
324
- displayName: { exposeToModel: true },
325
- accountTier: { exposeToModel: true },
326
- region: {}, // tools only, never in the prompt
327
- },
324
+ model,
325
+ access: authenticatedWebsite({
326
+ origins: ["https://app.example.com"],
327
+ sessionClaims: {
328
+ displayName: { exposeToModel: true },
329
+ accountTier: { exposeToModel: true },
330
+ region: {}, // tools only, never in the prompt
331
+ },
332
+ }),
328
333
  }),
329
334
  ```
330
335
 
@@ -380,7 +385,9 @@ import { NoodleAssistant } from "@noodleseed/assistant/react";
380
385
 
381
386
  Or import the package root once and mount `<noodle-assistant session-endpoint="/api/assistant/session" theme="auto"></noodle-assistant>`. Mount only inside the authenticated application surface.
382
387
 
383
- `theme="auto"` follows the browser operating-system preference. If the SaaS application owns a theme toggle, obtain its resolved application theme (`"light"` or `"dark"`), pass `theme={resolvedTheme}` to `NoodleAssistant`, and update the custom element's `theme` attribute when that value changes.
388
+ That custom element is the complete managed assistant in Vue, Angular, or plain DOM; it has no React runtime requirement. Configure the framework to accept `noodle-assistant` as a custom element. If the session exchange needs an authenticated fetch wrapper, create the element imperatively, assign `element.fetch` and then `element.sessionEndpoint`, and append it only after both properties are set.
389
+
390
+ `theme="auto"` follows an explicit host-page light/dark class or data attribute, then the browser operating-system preference; `theme="invert"` selects the opposite. If the SaaS application owns a theme toggle, obtain its resolved application theme (`"light"` or `"dark"`), pass `theme={resolvedTheme}` to `NoodleAssistant`, and update the custom element's `theme` attribute when that value changes.
384
391
 
385
392
  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`.
386
393
 
@@ -635,7 +642,7 @@ Devtools privacy gate: default model and connector exercises to synthetic or moc
635
642
 
636
643
  - Signed-out session exchange returns `401`.
637
644
  - The browser network/DOM/storage contains no client secret or model key.
638
- - The local and production origins match `allowedOrigins` character-for-character.
645
+ - The local and production origins match the authored `access.origins` character-for-character.
639
646
  - At the manifest/runtime boundary and in TypeScript action helpers, only `confirm: true` enables confirmation; omitted or `false` preserves direct execution. Action hints alone never enforce approval; `annotations.action({ confirm: false })` is equivalent to omission.
640
647
  - An expired turn re-exchanges once; interaction decisions never auto-retry. An explicit same-decision repeat returns the stored outcome without executing again.
641
648
  - Accept, decline, and cancel are single-use. Only accept executes; the server ignores replacement tool arguments.
@@ -653,9 +660,9 @@ Devtools privacy gate: default model and connector exercises to synthetic or moc
653
660
  | `assistant-error` with code `invalid_response` | The turn endpoint returned HTML or non-SSE content (auth redirect, proxy page) | Check the backend session route path and any middleware/rewrites on the embedding app |
654
661
  | Build error `Package path ./react is not exported` | Outdated package version with import-only export conditions | Update `@noodleseed/assistant`; do not add webpack aliases or type shims |
655
662
  | Deploy fails with `server_auth_required` | `--access customers` without `server.auth` | Add direct/federated OIDC or a built-in Firebase/Microsoft adapter |
656
- | Validate rejects an origin | Non-loopback HTTP origin in `allowedOrigins` | Use the exact HTTPS production origin; HTTP is only for `localhost`/`127.0.0.1` |
663
+ | Validate rejects an origin | Non-loopback HTTP origin in `access.origins` | Use the exact HTTPS production origin; HTTP is only for `localhost`/`127.0.0.1` |
657
664
  | Session exchange returns 404 | `serviceUrl` points at the deployment MCP endpoint | Use the control-plane service URL printed by `noodle assistant clients create` |
658
- | Session exchange returns 403 `origin is not allowed` | Request origin differs from `allowedOrigins` character-for-character | Align the exact scheme/host/port on both sides and redeploy |
665
+ | Session exchange returns 403 `origin is not allowed` | Request origin differs from the authored `access.origins` character-for-character | Align the exact scheme/host/port on both sides and redeploy |
659
666
  | Session exchange returns `400` with `invalid assistant routing` | The authenticated backend supplied an unknown endpoint name or a malformed/policy-disallowed URL | Resolve the route from server-owned membership, use the exact authored endpoint name, and ensure the canonical HTTPS URL satisfies its active `customerEndpoint` policy; the error never reflects the URL |
660
667
  | A routed assistant tool returns `connector_route_unavailable` | The authenticated backend omitted that endpoint during session exchange | Pass the server-verified route as `routing.endpoints.<name>` when minting a new session; keep it out of browser input |
661
668
  | Host session 503 | A required backend environment name is absent or mapped into the wrong deployment environment | Run `noodle assistant embed --check --json`, repair the host CI mapping, then probe the session route again |
@@ -3,7 +3,7 @@ name: reporting-noodle-feedback
3
3
  description: "Use when a Noodle Seed bug, misleading instruction, missing capability, or concrete product improvement should be proposed to the user."
4
4
  ---
5
5
 
6
- <!-- noodle-skill version:0.85.0 hash:0f404109f4845683 -->
6
+ <!-- noodle-skill version:0.86.0 hash:0f404109f4845683 -->
7
7
 
8
8
  # reporting-noodle-feedback
9
9
 
@@ -3,7 +3,7 @@ name: verifying-mcp-delivery
3
3
  description: "Use when proving a Noodle Seed MCP project works at a named compile, local, connector, App, host, deployment, or production evidence level."
4
4
  ---
5
5
 
6
- <!-- noodle-skill version:0.85.0 hash:6ef6ef551e26b78e -->
6
+ <!-- noodle-skill version:0.86.0 hash:6ef6ef551e26b78e -->
7
7
 
8
8
  # verifying-mcp-delivery
9
9