@noodleseed/agent-kit 0.81.0 → 0.82.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.
- package/manifest.json +261 -261
- package/package.json +1 -1
- package/skills/claude-code/SKILL.md +1 -1
- package/skills/claude-code/authoring-mcp-servers/SKILL.md +1 -1
- package/skills/claude-code/building-mcp-apps/SKILL.md +1 -1
- package/skills/claude-code/connecting-apis-to-mcp/SKILL.md +1 -1
- package/skills/claude-code/creating-product-agent-guides/SKILL.md +1 -1
- package/skills/claude-code/debugging-mcp-delivery/SKILL.md +1 -1
- package/skills/claude-code/deploying-mcp-services/SKILL.md +1 -1
- package/skills/claude-code/designing-mcp-products/SKILL.md +1 -1
- package/skills/claude-code/embedding-mcp-assistants/SKILL.md +1 -1
- package/skills/claude-code/examples/customer-auth/README.md +25 -8
- package/skills/claude-code/executing-noodle-plans/SKILL.md +1 -1
- package/skills/claude-code/publishing-mcp-integrations/SKILL.md +1 -1
- package/skills/claude-code/references/embedded-assistant.md +16 -6
- package/skills/claude-code/reporting-noodle-feedback/SKILL.md +1 -1
- package/skills/claude-code/verifying-mcp-delivery/SKILL.md +1 -1
- package/skills/claude-code/wrapping-existing-applications/SKILL.md +1 -1
- package/skills/codex/SKILL.md +1 -1
- package/skills/codex/authoring-mcp-servers/SKILL.md +1 -1
- package/skills/codex/building-mcp-apps/SKILL.md +1 -1
- package/skills/codex/connecting-apis-to-mcp/SKILL.md +1 -1
- package/skills/codex/creating-product-agent-guides/SKILL.md +1 -1
- package/skills/codex/debugging-mcp-delivery/SKILL.md +1 -1
- package/skills/codex/deploying-mcp-services/SKILL.md +1 -1
- package/skills/codex/designing-mcp-products/SKILL.md +1 -1
- package/skills/codex/embedding-mcp-assistants/SKILL.md +1 -1
- package/skills/codex/examples/customer-auth/README.md +25 -8
- package/skills/codex/executing-noodle-plans/SKILL.md +1 -1
- package/skills/codex/publishing-mcp-integrations/SKILL.md +1 -1
- package/skills/codex/references/embedded-assistant.md +16 -6
- package/skills/codex/reporting-noodle-feedback/SKILL.md +1 -1
- package/skills/codex/verifying-mcp-delivery/SKILL.md +1 -1
- 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.
|
|
3
|
+
"version": "0.82.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.
|
|
6
|
+
<!-- noodle-skill version:0.82.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.
|
|
6
|
+
<!-- noodle-skill version:0.82.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.
|
|
6
|
+
<!-- noodle-skill version:0.82.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.
|
|
6
|
+
<!-- noodle-skill version:0.82.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.
|
|
6
|
+
<!-- noodle-skill version:0.82.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.
|
|
6
|
+
<!-- noodle-skill version:0.82.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.
|
|
6
|
+
<!-- noodle-skill version:0.82.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.
|
|
6
|
+
<!-- noodle-skill version:0.82.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.
|
|
6
|
+
<!-- noodle-skill version:0.82.0 hash:cc54a67f21c0ecdb -->
|
|
7
7
|
|
|
8
8
|
# embedding-mcp-assistants
|
|
9
9
|
|
|
@@ -541,9 +541,15 @@ then aborts and clears the prior session and transcript. The sample fails closed
|
|
|
541
541
|
fallback is replaced with a form generated from `requestedSchema`. A production renderer must show the
|
|
542
542
|
complete confirmation review and both decisions. For `data-view`, map `resourceUri` or `tool` and the
|
|
543
543
|
bounded/redacted result to a component already trusted by this application only when intentionally replacing
|
|
544
|
-
the linked App with a native UI. Otherwise use
|
|
545
|
-
semantic lifecycle identity is the client plus `view.id`
|
|
546
|
-
rerenders keep the iframe and only a different view
|
|
544
|
+
the linked App with a native UI. Otherwise use `<noodle-app-view>` or its React `NoodleAppView` adapter;
|
|
545
|
+
JSON result data is not the App UI. The element's semantic lifecycle identity is the client plus `view.id`
|
|
546
|
+
plus `view.resourceUri`, so parent payload/callback rerenders keep the iframe and only a different view,
|
|
547
|
+
disconnect, or App teardown request retires the bridge.
|
|
548
|
+
App views remain inline by default: the host advertises only inline presentation and rejects a widget's
|
|
549
|
+
fullscreen request. A customer-owned renderer may opt in explicitly with `allowFullscreen` on
|
|
550
|
+
`NoodleAppView` or `allow-fullscreen` on `<noodle-app-view>` only when fullscreen is part of its intended
|
|
551
|
+
experience. When fullscreen is accepted, the shared host adds a top-right exit control that returns the same
|
|
552
|
+
mounted App to inline mode without discarding its state.
|
|
547
553
|
Never inject `part.data.html`, assign it to `srcdoc`, fetch a `ui://` URI, or reproduce the bridge directly. Pages with a
|
|
548
554
|
Content-Security-Policy must include the Noodle service origin in both `connect-src` and `frame-src`.
|
|
549
555
|
|
|
@@ -588,23 +594,33 @@ useEffect(() => {
|
|
|
588
594
|
|
|
589
595
|
For a chat-first custom host, raw `tool_started` supplies the direct call `id` and technical tool name. Map
|
|
590
596
|
known tools to concise application copy and use a neutral fallback. Reserve a stable `role="status"` region
|
|
591
|
-
for thinking, tool activity, and the view skeleton; switch to the ready
|
|
592
|
-
or to `role="alert"` on error. Decorative skeleton shapes stay hidden from assistive technology, and shimmer
|
|
597
|
+
for thinking, tool activity, and the view skeleton; switch to the ready `<noodle-app-view>` (or React
|
|
598
|
+
`NoodleAppView`) on `view_available` or to `role="alert"` on error. Decorative skeleton shapes stay hidden from assistive technology, and shimmer
|
|
593
599
|
or transition motion is disabled under `prefers-reduced-motion`.
|
|
594
600
|
|
|
595
601
|
Use `${view.id}:${view.resourceUri}` as transport identity. Different call IDs are distinct invocations and
|
|
596
602
|
must not be deduplicated generically. If this application intentionally owns one current panel for a known
|
|
597
603
|
resource, declare an application-owned slot for that resource and replace only that slot.
|
|
598
604
|
|
|
599
|
-
Outside React, subscribe to the DOM-free client directly
|
|
600
|
-
SDK `UIMessage` state, including typed confirmation, input,
|
|
605
|
+
Outside React, subscribe to the DOM-free client directly and use the isolated framework-neutral App host.
|
|
606
|
+
It exposes the same conversation as headless AI SDK `UIMessage` state, including typed confirmation, input,
|
|
607
|
+
tool-result, and linked-view parts, without installing React:
|
|
608
|
+
|
|
609
|
+
```html
|
|
610
|
+
<noodle-app-view id="assistant-app-view"></noodle-app-view>
|
|
611
|
+
```
|
|
601
612
|
|
|
602
613
|
```ts
|
|
614
|
+
import '@noodleseed/assistant/app-view';
|
|
603
615
|
import { createAssistantClient } from '@noodleseed/assistant/client';
|
|
604
616
|
|
|
605
617
|
const assistant = createAssistantClient({
|
|
606
618
|
sessionEndpoint: '/api/noodle-assistant/session',
|
|
607
619
|
});
|
|
620
|
+
const appView = document.querySelector('#assistant-app-view');
|
|
621
|
+
if (!appView) throw new Error('Missing App view host');
|
|
622
|
+
appView.client = assistant;
|
|
623
|
+
appView.theme = resolvedTheme;
|
|
608
624
|
|
|
609
625
|
assistant.subscribeChat((state) => {
|
|
610
626
|
renderUIMessageState(state);
|
|
@@ -613,13 +629,14 @@ assistant.subscribeChat((state) => {
|
|
|
613
629
|
if (part.type === 'data-confirmation' && part.data.status === 'pending') {
|
|
614
630
|
renderConfirmation(part.data, (response) => assistant.respond(part.data.id, response));
|
|
615
631
|
}
|
|
632
|
+
if (part.type === 'data-view') appView.view = part.data;
|
|
616
633
|
}
|
|
617
634
|
}
|
|
618
635
|
});
|
|
619
636
|
```
|
|
620
637
|
|
|
621
638
|
`theme="auto"` follows the operating-system preference, not a SaaS-owned toggle. Pass the resolved
|
|
622
|
-
`light`/`dark` theme to `NoodleAssistant` and
|
|
639
|
+
`light`/`dark` theme to `NoodleAssistant` and `<noodle-app-view>`/`NoodleAppView`; updates reach mounted MCP Apps without a
|
|
623
640
|
remount. CSS custom properties inherit through the host, and documented `--ns-assistant-*` variables remain
|
|
624
641
|
the final integration escape hatch. Server `branding` is shared by widgets and the assistant; there is no
|
|
625
642
|
second branding declaration. Text streams progressively. Expired turns re-exchange and retry once;
|
|
@@ -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.
|
|
6
|
+
<!-- noodle-skill version:0.82.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.
|
|
6
|
+
<!-- noodle-skill version:0.82.0 hash:efffbf82007f935d -->
|
|
7
7
|
|
|
8
8
|
# publishing-mcp-integrations
|
|
9
9
|
|
|
@@ -513,14 +513,19 @@ useEffect(() => {
|
|
|
513
513
|
|
|
514
514
|
`settle` must await or catch the command promise; the same structured failure also appears in the hook `error` state.
|
|
515
515
|
|
|
516
|
-
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 `NoodleAppView` 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.
|
|
516
|
+
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.
|
|
517
517
|
|
|
518
|
-
|
|
518
|
+
`<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`.
|
|
519
519
|
|
|
520
|
-
Outside React, use the same DOM-free client directly.
|
|
520
|
+
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:
|
|
521
|
+
|
|
522
|
+
```html
|
|
523
|
+
<noodle-app-view id="assistant-app-view"></noodle-app-view>
|
|
524
|
+
```
|
|
521
525
|
|
|
522
526
|
```ts
|
|
523
527
|
import { createAssistantClient } from "@noodleseed/assistant/client";
|
|
528
|
+
import "@noodleseed/assistant/app-view";
|
|
524
529
|
|
|
525
530
|
const assistant = createAssistantClient({
|
|
526
531
|
sessionEndpoint: "/api/assistant/session",
|
|
@@ -530,6 +535,11 @@ const assistant = createAssistantClient({
|
|
|
530
535
|
}),
|
|
531
536
|
});
|
|
532
537
|
|
|
538
|
+
const appView = document.querySelector("#assistant-app-view");
|
|
539
|
+
if (!appView) throw new Error("Missing App view host");
|
|
540
|
+
appView.client = assistant;
|
|
541
|
+
appView.theme = document.documentElement.classList.contains('dark') ? 'dark' : 'light';
|
|
542
|
+
|
|
533
543
|
assistant.updateModelContext({
|
|
534
544
|
content: [{ type: 'text', text: 'The time-off form is mounted.' }],
|
|
535
545
|
structuredContent: { widget: { name: 'time-off', lifecycle: 'mounted' } },
|
|
@@ -548,7 +558,7 @@ assistant.subscribeChat((state) => {
|
|
|
548
558
|
pending = { id: part.data.id, requestedSchema: part.data.requestedSchema };
|
|
549
559
|
}
|
|
550
560
|
if (part.type === 'data-view') {
|
|
551
|
-
|
|
561
|
+
appView.view = part.data;
|
|
552
562
|
}
|
|
553
563
|
}
|
|
554
564
|
}
|
|
@@ -587,7 +597,7 @@ assistant.subscribe((event) => {
|
|
|
587
597
|
});
|
|
588
598
|
```
|
|
589
599
|
|
|
590
|
-
`data-view` means a completed tool has a linked MCP App view.
|
|
600
|
+
`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.
|
|
591
601
|
|
|
592
602
|
`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.
|
|
593
603
|
|
|
@@ -612,7 +622,7 @@ Devtools privacy gate: default model and connector exercises to synthetic or moc
|
|
|
612
622
|
|
|
613
623
|
- Node.js 20+ for `@noodleseed/assistant/server`.
|
|
614
624
|
- The package ships ESM and CommonJS with full export conditions; no bundler aliases, `transpilePackages`, or ambient type shims are needed. If resolution fails, the installed package version is outdated: update `@noodleseed/assistant` instead of adding workarounds.
|
|
615
|
-
- TypeScript `moduleResolution` `bundler` or `node16` recommended; classic `node` also resolves the `/client`, `/react`, `/react/client`, and `/server` subpaths.
|
|
625
|
+
- TypeScript `moduleResolution` `bundler` or `node16` recommended; classic `node` also resolves the `/app-view`, `/client`, `/react`, `/react/client`, and `/server` subpaths.
|
|
616
626
|
|
|
617
627
|
## Verify the boundary
|
|
618
628
|
|
|
@@ -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.
|
|
6
|
+
<!-- noodle-skill version:0.82.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.
|
|
6
|
+
<!-- noodle-skill version:0.82.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.
|
|
6
|
+
<!-- noodle-skill version:0.82.0 hash:eccc3c158dcafba8 -->
|
|
7
7
|
|
|
8
8
|
# wrapping-existing-applications
|
|
9
9
|
|
package/skills/codex/SKILL.md
CHANGED
|
@@ -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.
|
|
6
|
+
<!-- noodle-skill version:0.82.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.
|
|
6
|
+
<!-- noodle-skill version:0.82.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.
|
|
6
|
+
<!-- noodle-skill version:0.82.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.
|
|
6
|
+
<!-- noodle-skill version:0.82.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.
|
|
6
|
+
<!-- noodle-skill version:0.82.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.
|
|
6
|
+
<!-- noodle-skill version:0.82.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.
|
|
6
|
+
<!-- noodle-skill version:0.82.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.
|
|
6
|
+
<!-- noodle-skill version:0.82.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.
|
|
6
|
+
<!-- noodle-skill version:0.82.0 hash:cc54a67f21c0ecdb -->
|
|
7
7
|
|
|
8
8
|
# embedding-mcp-assistants
|
|
9
9
|
|
|
@@ -541,9 +541,15 @@ then aborts and clears the prior session and transcript. The sample fails closed
|
|
|
541
541
|
fallback is replaced with a form generated from `requestedSchema`. A production renderer must show the
|
|
542
542
|
complete confirmation review and both decisions. For `data-view`, map `resourceUri` or `tool` and the
|
|
543
543
|
bounded/redacted result to a component already trusted by this application only when intentionally replacing
|
|
544
|
-
the linked App with a native UI. Otherwise use
|
|
545
|
-
semantic lifecycle identity is the client plus `view.id`
|
|
546
|
-
rerenders keep the iframe and only a different view
|
|
544
|
+
the linked App with a native UI. Otherwise use `<noodle-app-view>` or its React `NoodleAppView` adapter;
|
|
545
|
+
JSON result data is not the App UI. The element's semantic lifecycle identity is the client plus `view.id`
|
|
546
|
+
plus `view.resourceUri`, so parent payload/callback rerenders keep the iframe and only a different view,
|
|
547
|
+
disconnect, or App teardown request retires the bridge.
|
|
548
|
+
App views remain inline by default: the host advertises only inline presentation and rejects a widget's
|
|
549
|
+
fullscreen request. A customer-owned renderer may opt in explicitly with `allowFullscreen` on
|
|
550
|
+
`NoodleAppView` or `allow-fullscreen` on `<noodle-app-view>` only when fullscreen is part of its intended
|
|
551
|
+
experience. When fullscreen is accepted, the shared host adds a top-right exit control that returns the same
|
|
552
|
+
mounted App to inline mode without discarding its state.
|
|
547
553
|
Never inject `part.data.html`, assign it to `srcdoc`, fetch a `ui://` URI, or reproduce the bridge directly. Pages with a
|
|
548
554
|
Content-Security-Policy must include the Noodle service origin in both `connect-src` and `frame-src`.
|
|
549
555
|
|
|
@@ -588,23 +594,33 @@ useEffect(() => {
|
|
|
588
594
|
|
|
589
595
|
For a chat-first custom host, raw `tool_started` supplies the direct call `id` and technical tool name. Map
|
|
590
596
|
known tools to concise application copy and use a neutral fallback. Reserve a stable `role="status"` region
|
|
591
|
-
for thinking, tool activity, and the view skeleton; switch to the ready
|
|
592
|
-
or to `role="alert"` on error. Decorative skeleton shapes stay hidden from assistive technology, and shimmer
|
|
597
|
+
for thinking, tool activity, and the view skeleton; switch to the ready `<noodle-app-view>` (or React
|
|
598
|
+
`NoodleAppView`) on `view_available` or to `role="alert"` on error. Decorative skeleton shapes stay hidden from assistive technology, and shimmer
|
|
593
599
|
or transition motion is disabled under `prefers-reduced-motion`.
|
|
594
600
|
|
|
595
601
|
Use `${view.id}:${view.resourceUri}` as transport identity. Different call IDs are distinct invocations and
|
|
596
602
|
must not be deduplicated generically. If this application intentionally owns one current panel for a known
|
|
597
603
|
resource, declare an application-owned slot for that resource and replace only that slot.
|
|
598
604
|
|
|
599
|
-
Outside React, subscribe to the DOM-free client directly
|
|
600
|
-
SDK `UIMessage` state, including typed confirmation, input,
|
|
605
|
+
Outside React, subscribe to the DOM-free client directly and use the isolated framework-neutral App host.
|
|
606
|
+
It exposes the same conversation as headless AI SDK `UIMessage` state, including typed confirmation, input,
|
|
607
|
+
tool-result, and linked-view parts, without installing React:
|
|
608
|
+
|
|
609
|
+
```html
|
|
610
|
+
<noodle-app-view id="assistant-app-view"></noodle-app-view>
|
|
611
|
+
```
|
|
601
612
|
|
|
602
613
|
```ts
|
|
614
|
+
import '@noodleseed/assistant/app-view';
|
|
603
615
|
import { createAssistantClient } from '@noodleseed/assistant/client';
|
|
604
616
|
|
|
605
617
|
const assistant = createAssistantClient({
|
|
606
618
|
sessionEndpoint: '/api/noodle-assistant/session',
|
|
607
619
|
});
|
|
620
|
+
const appView = document.querySelector('#assistant-app-view');
|
|
621
|
+
if (!appView) throw new Error('Missing App view host');
|
|
622
|
+
appView.client = assistant;
|
|
623
|
+
appView.theme = resolvedTheme;
|
|
608
624
|
|
|
609
625
|
assistant.subscribeChat((state) => {
|
|
610
626
|
renderUIMessageState(state);
|
|
@@ -613,13 +629,14 @@ assistant.subscribeChat((state) => {
|
|
|
613
629
|
if (part.type === 'data-confirmation' && part.data.status === 'pending') {
|
|
614
630
|
renderConfirmation(part.data, (response) => assistant.respond(part.data.id, response));
|
|
615
631
|
}
|
|
632
|
+
if (part.type === 'data-view') appView.view = part.data;
|
|
616
633
|
}
|
|
617
634
|
}
|
|
618
635
|
});
|
|
619
636
|
```
|
|
620
637
|
|
|
621
638
|
`theme="auto"` follows the operating-system preference, not a SaaS-owned toggle. Pass the resolved
|
|
622
|
-
`light`/`dark` theme to `NoodleAssistant` and
|
|
639
|
+
`light`/`dark` theme to `NoodleAssistant` and `<noodle-app-view>`/`NoodleAppView`; updates reach mounted MCP Apps without a
|
|
623
640
|
remount. CSS custom properties inherit through the host, and documented `--ns-assistant-*` variables remain
|
|
624
641
|
the final integration escape hatch. Server `branding` is shared by widgets and the assistant; there is no
|
|
625
642
|
second branding declaration. Text streams progressively. Expired turns re-exchange and retry once;
|
|
@@ -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.
|
|
6
|
+
<!-- noodle-skill version:0.82.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.
|
|
6
|
+
<!-- noodle-skill version:0.82.0 hash:efffbf82007f935d -->
|
|
7
7
|
|
|
8
8
|
# publishing-mcp-integrations
|
|
9
9
|
|
|
@@ -513,14 +513,19 @@ useEffect(() => {
|
|
|
513
513
|
|
|
514
514
|
`settle` must await or catch the command promise; the same structured failure also appears in the hook `error` state.
|
|
515
515
|
|
|
516
|
-
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 `NoodleAppView` 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.
|
|
516
|
+
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.
|
|
517
517
|
|
|
518
|
-
|
|
518
|
+
`<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`.
|
|
519
519
|
|
|
520
|
-
Outside React, use the same DOM-free client directly.
|
|
520
|
+
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:
|
|
521
|
+
|
|
522
|
+
```html
|
|
523
|
+
<noodle-app-view id="assistant-app-view"></noodle-app-view>
|
|
524
|
+
```
|
|
521
525
|
|
|
522
526
|
```ts
|
|
523
527
|
import { createAssistantClient } from "@noodleseed/assistant/client";
|
|
528
|
+
import "@noodleseed/assistant/app-view";
|
|
524
529
|
|
|
525
530
|
const assistant = createAssistantClient({
|
|
526
531
|
sessionEndpoint: "/api/assistant/session",
|
|
@@ -530,6 +535,11 @@ const assistant = createAssistantClient({
|
|
|
530
535
|
}),
|
|
531
536
|
});
|
|
532
537
|
|
|
538
|
+
const appView = document.querySelector("#assistant-app-view");
|
|
539
|
+
if (!appView) throw new Error("Missing App view host");
|
|
540
|
+
appView.client = assistant;
|
|
541
|
+
appView.theme = document.documentElement.classList.contains('dark') ? 'dark' : 'light';
|
|
542
|
+
|
|
533
543
|
assistant.updateModelContext({
|
|
534
544
|
content: [{ type: 'text', text: 'The time-off form is mounted.' }],
|
|
535
545
|
structuredContent: { widget: { name: 'time-off', lifecycle: 'mounted' } },
|
|
@@ -548,7 +558,7 @@ assistant.subscribeChat((state) => {
|
|
|
548
558
|
pending = { id: part.data.id, requestedSchema: part.data.requestedSchema };
|
|
549
559
|
}
|
|
550
560
|
if (part.type === 'data-view') {
|
|
551
|
-
|
|
561
|
+
appView.view = part.data;
|
|
552
562
|
}
|
|
553
563
|
}
|
|
554
564
|
}
|
|
@@ -587,7 +597,7 @@ assistant.subscribe((event) => {
|
|
|
587
597
|
});
|
|
588
598
|
```
|
|
589
599
|
|
|
590
|
-
`data-view` means a completed tool has a linked MCP App view.
|
|
600
|
+
`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.
|
|
591
601
|
|
|
592
602
|
`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.
|
|
593
603
|
|
|
@@ -612,7 +622,7 @@ Devtools privacy gate: default model and connector exercises to synthetic or moc
|
|
|
612
622
|
|
|
613
623
|
- Node.js 20+ for `@noodleseed/assistant/server`.
|
|
614
624
|
- The package ships ESM and CommonJS with full export conditions; no bundler aliases, `transpilePackages`, or ambient type shims are needed. If resolution fails, the installed package version is outdated: update `@noodleseed/assistant` instead of adding workarounds.
|
|
615
|
-
- TypeScript `moduleResolution` `bundler` or `node16` recommended; classic `node` also resolves the `/client`, `/react`, `/react/client`, and `/server` subpaths.
|
|
625
|
+
- TypeScript `moduleResolution` `bundler` or `node16` recommended; classic `node` also resolves the `/app-view`, `/client`, `/react`, `/react/client`, and `/server` subpaths.
|
|
616
626
|
|
|
617
627
|
## Verify the boundary
|
|
618
628
|
|
|
@@ -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.
|
|
6
|
+
<!-- noodle-skill version:0.82.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.
|
|
6
|
+
<!-- noodle-skill version:0.82.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.
|
|
6
|
+
<!-- noodle-skill version:0.82.0 hash:eccc3c158dcafba8 -->
|
|
7
7
|
|
|
8
8
|
# wrapping-existing-applications
|
|
9
9
|
|