@noodleseed/one 0.192.1 → 0.193.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/node_modules/@noodle-borg/agent-kit/dist/generated/example-files.js +29 -57
- package/node_modules/@noodle-borg/agent-kit/dist/skill-authoring-refs.js +15 -34
- package/node_modules/@noodle-borg/agent-kit/dist/skill-connect-refs.js +1 -1
- package/node_modules/@noodle-borg/agent-kit/dist/skill-content.js +1 -1
- package/node_modules/@noodle-borg/agent-kit/dist/skill-design-refs.js +5 -6
- package/node_modules/@noodle-borg/agent-kit/package.json +1 -1
- package/node_modules/@noodle-borg/service/package.json +1 -1
- package/package.json +2 -2
|
@@ -80,7 +80,7 @@ export function renderAuthoringWorkflowReference() {
|
|
|
80
80
|
'HTTP connector auth variants: `bearer` (`{ kind: "bearer", secret: secret("API_TOKEN") }`), `apiKey` (`{ kind: "apiKey", header: "X-API-Key", secret: secret("API_KEY") }`), `clientCredentials`, `delegatedOAuth`, `delegatedSessionCookie`, and `delegatedTokenExchange` (per-user calls to your own API — see "Delegated downstream auth" below). Use managed `secret(...)` / `variable(...)` refs for all values that differ by org/app/env.',
|
|
81
81
|
'An application-owned adapter may require its own service credential in addition to the operator account credential. Declare `http.transportAuth: { kind: "apiKey", header: "X-Adapter-Key", secret: secret("ADAPTER_SERVICE_KEY") }` alongside bound account credential profiles; the credential broker supplies the two independently. Never put either credential in tool arguments or ordinary headers, and never reuse an inbound MCP bearer. This capability does not imply a provider requires two credentials.',
|
|
82
82
|
'',
|
|
83
|
-
'When one connector needs independently selectable accounts, declare catalog `credentialProfiles` plus each operation’s accepted `credentials.profiles`, then bind each `server.use` alias with `bind(connector, { profile, connection: connection("logical_id", managedSecret(secret("NAME"), { scopes, audience })) })`. The alias is the stable account boundary; never put provider account ids, labels, or credential values in it. `gmailConnector()` is the curated Gmail catalog helper; reuse it under independent aliases and accept canonical `accounts` arrays in tools (one account for writes, or an explicitly ordered supported combination for reads).
|
|
83
|
+
'When one connector needs independently selectable accounts, declare catalog `credentialProfiles` plus each operation’s accepted `credentials.profiles`, then bind each `server.use` alias with `bind(connector, { profile, connection: connection("logical_id", managedSecret(secret("NAME"), { scopes, audience })) })`. The alias is the stable account boundary; never put provider account ids, labels, or credential values in it. `gmailConnector()` is the curated Gmail catalog helper; reuse it under independent aliases and accept canonical `accounts` arrays in tools (one account for writes, or an explicitly ordered supported combination for reads). Bound managed secrets are supported by hosted execution. For deployed-server access to Google APIs, use `googleWorkloadIdentity({ provider: variable("GOOGLE_WIF_PROVIDER"), access: { kind: "direct" } })`, or add `serviceAccountImpersonation` with a managed service-account email. This is keyless Google Workload Identity Federation: exact Google scopes/audience come from the catalog operation, while `noodle auth google prepare|status|doctor|revoke` owns operator lifecycle. `externalExchange()` is runnable only when the deployment operator injects an exact HTTPS provider endpoint/origin/audience and durable shared subject-pin store through service ports; Noodle sends a short-lived platform-signed deployment workload assertion and accepts only a bounded bearer response. Provider implementations must consume assertion replay ids through durable shared atomic storage across instances and restarts. There is intentionally no hosted enrollment or provider CRUD surface yet. The provider wire contract is public, but its conformance kit is workspace/source-only and is not an installable npm package. Bound `clientCredentials(...)` remains fail-closed until its provider slice lands.',
|
|
84
84
|
'',
|
|
85
85
|
'## HTTP connector example (full server)',
|
|
86
86
|
'',
|
|
@@ -224,7 +224,7 @@ export function renderAuthoringWorkflowReference() {
|
|
|
224
224
|
'',
|
|
225
225
|
'Author managed config as `secret("NAME")` / `variable("NAME")` and operate it with `noodle secrets set` / `noodle variables set` (scoped org/app/env). Never inline secret values in `server.ts`, tests, or generated files.',
|
|
226
226
|
'',
|
|
227
|
-
'For business-editable configuration, declare `const guestExperience = variable("GUEST_EXPERIENCE", { schema: z.object({ notice: z.string().max(500) }), default: { notice: "Welcome" }, portal: { label: "Guest experience" }, requiredFor: ["show_menu"] })` and register it in `server(..., { variables: [guestExperience], ... }, tools)`. Use the whole ref or `guestExperience.field("notice")` in ordinary fulfilment/connector arguments. `.field()` selects a schema-declared object property, can chain for nested objects, and retains the parent variable and full configuration snapshot; it never reads operator data at author time. Keep confirmed action arguments shallow enough for complete review; do not label ordinary settings sensitive to bypass the review. The default is reusable safe intent; each business supplies its own values without editing source. Only explicit `portal` metadata exposes a setting. Name-only references and declared variables without `portal` remain technical configuration; secrets remain credential slots.
|
|
227
|
+
'For business-editable configuration, declare `const guestExperience = variable("GUEST_EXPERIENCE", { schema: z.object({ notice: z.string().max(500) }), default: { notice: "Welcome" }, portal: { label: "Guest experience" }, requiredFor: ["show_menu"] })` and register it in `server(..., { variables: [guestExperience], ... }, tools)`. Use the whole ref or `guestExperience.field("notice")` in ordinary fulfilment/connector arguments. `.field()` selects a schema-declared object property, can chain for nested objects, and retains the parent variable and full configuration snapshot; it never reads operator data at author time. Keep confirmed action arguments shallow enough for complete review; do not label ordinary settings sensitive to bypass the review. The default is reusable safe intent; each business supplies its own values without editing source. Only explicit `portal` metadata exposes a setting. Name-only references and declared variables without `portal` remain technical configuration; secrets remain credential slots.',
|
|
228
228
|
'',
|
|
229
229
|
'Business schemas must be bounded: booleans, finite bounded numbers, bounded text, string enums, bounded arrays, and closed objects. Put defaults in the declaration, not inside Zod schema defaults; custom transforms/refinements and arbitrary schema code cannot run in the shared runtime. `requiredFor` names existing tools whose invocation needs the value; unresolved settings must leave only dependent capabilities unavailable. Publisher compilation does not require a future buyer’s values. Application code enforces business rules server-side; exposing a control or placing the rule in a prompt is insufficient.',
|
|
230
230
|
'',
|
|
@@ -268,7 +268,7 @@ export function renderAuthoringWorkflowReference() {
|
|
|
268
268
|
'## Managed collections',
|
|
269
269
|
'',
|
|
270
270
|
'Use `managedCollection(name, { title, description, schemaVersion, record })` when an application needs reusable typed intent for business records that Noodle may later hold. Pass it through `server(..., { collections: [...] }, definitions)`. `record` is one bounded, closed Zod object; names use lowercase letters, numbers, and underscores. Keep payment-card, credentials, passport/government identity, health, and biometric fields out of this surface.',
|
|
271
|
-
'Native record controls are independent: `management: { assignment: true }`, `{ notes: true }`, both, or neither. Status is an ordinary application field such as `progress: z.enum(["received", "reviewing", "handled"]).default("received")`; no framework transition graph exists. Declare `publicFields` explicitly (default empty), `editableFields` for authorized staff (default all schema properties), optional field labels/help, `summaryFields`, `filterFields` and `sortFields`. References must name actual fields and filters/sorts select scalars. Public callers cannot set staff-only fields; a required private field needs a valid creation default. Staff updates merge only admitted fields and revalidate the complete record.
|
|
271
|
+
'Native record controls are independent: `management: { assignment: true }`, `{ notes: true }`, both, or neither. Status is an ordinary application field such as `progress: z.enum(["received", "reviewing", "handled"]).default("received")`; no framework transition graph exists. Declare `publicFields` explicitly (default empty), `editableFields` for authorized staff (default all schema properties), optional field labels/help, `summaryFields`, `filterFields` and `sortFields`. References must name actual fields and filters/sorts select scalars. Public callers cannot set staff-only fields; a required private field needs a valid creation default. Staff updates merge only admitted fields and revalidate the complete record.',
|
|
272
272
|
'Operator record queries use `noodle solutions records list --filters \'[{"field":"progress","value":"received"}]\' --sort-field progress`. Only declared scalar equality/sort fields apply. Payload queries scan at most 10,000 candidates; narrow `--created-at-from`/`--created-at-to` if the API returns `query_limit_exceeded`. Ordinary listing/export has no such scan cap. Cursor reuse requires unchanged query/schema and anchor revision. An administrator can explicitly migrate an eligible historical request with `records migrate-schema ... --expected-revision N`; never implement read-time rewrites.',
|
|
273
273
|
'',
|
|
274
274
|
'Omitting `source` makes Noodle authoritative for the collection. To project a read-only collection from an outside system, bind an HTTP connector in `server(..., { use: [...] })` and add `source: { connector: connector.ref(), scan: "scan_operation" }`. The compiler requires the exact normalized scan contract and the same record schema. Noodle ingests a one-way replica; create, update, and delete in the outside system remain ordinary application tools with their own confirmation and policy.',
|
|
@@ -568,19 +568,7 @@ const FLAGSHIP_EXAMPLES = [
|
|
|
568
568
|
],
|
|
569
569
|
[
|
|
570
570
|
'food-ordering',
|
|
571
|
-
'Consumer ordering MCP App widgets, app-only helpers, cart state, assets, branding, and handoff.',
|
|
572
|
-
],
|
|
573
|
-
[
|
|
574
|
-
'acme-discovery',
|
|
575
|
-
'Top-of-funnel discovery→handoff: a discovery carousel, a `create_handoff` deep link, and a design-first UX spec + wireframe.',
|
|
576
|
-
],
|
|
577
|
-
[
|
|
578
|
-
'acme-tasks',
|
|
579
|
-
'A two-way productivity app designed around its top-3 prioritized flows (capture/prioritize/complete), with a design-first flow spec + wireframe.',
|
|
580
|
-
],
|
|
581
|
-
[
|
|
582
|
-
'acme-bistro',
|
|
583
|
-
'End-to-end ordering with a payment-only handoff; ships a gold-standard `design/` set (UX doc, wireframe with compliance audit, API contract).',
|
|
571
|
+
'Consumer ordering MCP App widgets, app-only helpers, cart state, assets, branding, and handoff; ships the gold-standard `design/` set (UX doc, wireframe with compliance audit, API contract).',
|
|
584
572
|
],
|
|
585
573
|
[
|
|
586
574
|
'customer-auth',
|
|
@@ -590,20 +578,9 @@ const FLAGSHIP_EXAMPLES = [
|
|
|
590
578
|
'stateful-draft',
|
|
591
579
|
'Review and save a brief before signup; carry caller-scoped state into an account.',
|
|
592
580
|
],
|
|
593
|
-
['perplexity', 'A real SaaS API with bearer auth and a managed `secret`.'],
|
|
594
|
-
['bitcoin', 'API-key HTTP connector, custom auth header, and compute normalization.'],
|
|
595
581
|
[
|
|
596
|
-
'
|
|
597
|
-
'
|
|
598
|
-
],
|
|
599
|
-
[
|
|
600
|
-
'google-bigquery',
|
|
601
|
-
'Keyless Google Workload Identity Federation with optional service-account impersonation, a BigQuery REST connector, and complete developer/operator setup.',
|
|
602
|
-
],
|
|
603
|
-
['sharepoint', 'Microsoft SharePoint delegated Microsoft Entra auth and Graph tools.'],
|
|
604
|
-
[
|
|
605
|
-
'internal-ops-demo',
|
|
606
|
-
'Governed internal connectivity — tools/resources/prompts, role-shaped output.',
|
|
582
|
+
'shopify-storefront',
|
|
583
|
+
'Commerce on a real provider: live Shopify search, a composed upstream Storefront MCP server, Noodle-owned views, published store knowledge, an embedded assistant, and hosted-checkout handoff.',
|
|
607
584
|
],
|
|
608
585
|
];
|
|
609
586
|
export function renderExamplesReference() {
|
|
@@ -624,7 +601,7 @@ export function renderExamplesReference() {
|
|
|
624
601
|
return [
|
|
625
602
|
'# Examples',
|
|
626
603
|
'',
|
|
627
|
-
'Flagship examples, one per capability. The **bundled** rows ship inside this skill under `examples/<name>/` (the real `server.ts`, `src/views/*.tsx`, and — for the design-first
|
|
604
|
+
'Flagship examples, one per capability. The **bundled** rows ship inside this skill under `examples/<name>/` (the real `server.ts`, `src/views/*.tsx`, and — for the design-first flagship — a `design/` set); read them locally at the paths shown. Every curated example is bundled, and each is proven against the CLI it ships with. Extend an existing flagship rather than inventing a new shape.',
|
|
628
605
|
'',
|
|
629
606
|
'## Bundled in this skill — read locally',
|
|
630
607
|
'',
|
|
@@ -632,10 +609,14 @@ export function renderExamplesReference() {
|
|
|
632
609
|
'',
|
|
633
610
|
mdTable(['Example', 'Use when', 'Read'], bundledRows),
|
|
634
611
|
'',
|
|
635
|
-
|
|
636
|
-
|
|
637
|
-
|
|
638
|
-
|
|
612
|
+
...(repoRows.length
|
|
613
|
+
? [
|
|
614
|
+
'## In the repository only — `examples/<name>/`',
|
|
615
|
+
'',
|
|
616
|
+
mdTable(['Example', 'Use when'], repoRows),
|
|
617
|
+
'',
|
|
618
|
+
]
|
|
619
|
+
: []),
|
|
639
620
|
'## Canonical server.ts',
|
|
640
621
|
'',
|
|
641
622
|
'Author with `server(name, options, definitions)` and top-level helpers:',
|
|
@@ -129,7 +129,7 @@ export function renderConnectAnApiReference() {
|
|
|
129
129
|
'',
|
|
130
130
|
'- **A response mapping cannot iterate.** There is no per-item / `map` / `item` construct, so you cannot reshape `[{…30 fields}]` into `[{ id, label }]` inside a `response:` block — bind the whole array.',
|
|
131
131
|
"- **A tool's Zod `output` does not strip at runtime.** It only advertises the JSON Schema; the runtime returns your `fulfil` output verbatim, so `z.array(z.object({ id, label }))` will NOT drop extra element fields.",
|
|
132
|
-
'- **So narrow in a compute connector.** To reshape each element, synthesize a `label`, or normalize a missing array to `[]`, pass the whole array to a `.compute(...)` op whose `run` maps it (a connector is HTTP **or** compute, not both — use a second connector). To only *drop* known fields without reshaping, `projection: { hiddenFields: [...] }` deletes them from each element. Worked example: `examples/weather` — `search_list` binds the array, then `geo_places.narrow` reshapes to `{ id, label }` and normalizes no-results to `[]
|
|
132
|
+
'- **So narrow in a compute connector.** To reshape each element, synthesize a `label`, or normalize a missing array to `[]`, pass the whole array to a `.compute(...)` op whose `run` maps it (a connector is HTTP **or** compute, not both — use a second connector). To only *drop* known fields without reshaping, `projection: { hiddenFields: [...] }` deletes them from each element. Worked example: `examples/weather` — `search_list` binds the array, then `geo_places.narrow` reshapes to `{ id, label }` and normalizes no-results to `[]`.',
|
|
133
133
|
'',
|
|
134
134
|
'For a **paginated** API, collect across pages with a `pagination` config; the collected list is then `${response.items}`:',
|
|
135
135
|
'',
|
|
@@ -249,7 +249,7 @@ const SDK_AUTHORING_SIGNATURES = [
|
|
|
249
249
|
'- Keep tool input names application-owned and meaningful; `__noodleIntent` is reserved for an optional serve-time operator analytics adapter and never reaches `fulfil`.',
|
|
250
250
|
'- `resource(name, { uri, description?, mimeType?, fulfil })` and `prompt(name, { description?, arguments?, fulfil })` expose MCP resources/prompts.',
|
|
251
251
|
'- View metadata (`viewTitle`, `viewDescription`, `csp`, `domain`, `permissions`) belongs on the tool that renders it; `asset("./path")` packages local files.',
|
|
252
|
-
'- `customerAuth.*(...)` belongs in `server` options when deployed customer callers need verified identity; inspect `examples/customer-auth`
|
|
252
|
+
'- `customerAuth.*(...)` belongs in `server` options when deployed customer callers need verified identity; inspect `examples/customer-auth` before using it.',
|
|
253
253
|
'- `state` defines durable widget state handles; handle schemas may use `.optional()`/`.default()` — defaulted fields are optional on write, so a save that omits them still validates. Add `claimOnAuthentication: true` only to an explicitly caller-scoped handle with a finite TTL when a mixed public assistant should atomically adopt that expiring draft on sign-in-ticket spend. `handoff` declares allowed external domains for safe host handoff.',
|
|
254
254
|
];
|
|
255
255
|
function renderSdkSurfaceReference() {
|
|
@@ -118,15 +118,14 @@ export function renderExperienceDesignReference() {
|
|
|
118
118
|
'Expand from one screen to the full journey: entry → configuration → handoff, ending at the off-app',
|
|
119
119
|
'destination. Verify the built app against the design with `noodle check --target chatgpt`.',
|
|
120
120
|
'',
|
|
121
|
-
|
|
122
|
-
'`design/` folder
|
|
123
|
-
'
|
|
124
|
-
'embedded OpenAI Apps SDK compliance audit. Match that bar.',
|
|
121
|
+
"For the full quality bar, open the shipped gold-standard set: the bundled `food-ordering` example's",
|
|
122
|
+
'`design/` folder holds a house-style UX Document, a single-file HTML wireframe with an embedded',
|
|
123
|
+
'OpenAI Apps SDK compliance audit, and an API contract for an end-to-end ordering app. Match that bar.',
|
|
125
124
|
'',
|
|
126
125
|
'## The deliverables',
|
|
127
126
|
'',
|
|
128
|
-
'The design phase produces up to three artifacts — worked gold-standard versions live in
|
|
129
|
-
"`
|
|
127
|
+
'The design phase produces up to three artifacts — worked gold-standard versions live in the',
|
|
128
|
+
"`food-ordering` example's `design/` folder (copy its structure, swap the content):",
|
|
130
129
|
'',
|
|
131
130
|
'- **UX Document** — the thinking artifact. House-style sections: product overview / knowledge base,',
|
|
132
131
|
' competitive landscape, personas, conversational flow (with tool-call playscripts), widget specs +',
|
|
@@ -41,7 +41,7 @@
|
|
|
41
41
|
"@noodle-borg/managed-capabilities": "0.0.0",
|
|
42
42
|
"@modelcontextprotocol/sdk": "^1.29.0",
|
|
43
43
|
"@noodle-borg/admission-limits": "0.0.0",
|
|
44
|
-
"@noodle-borg/agent-kit": "0.
|
|
44
|
+
"@noodle-borg/agent-kit": "0.114.0",
|
|
45
45
|
"@noodle-borg/app-package": "0.0.0",
|
|
46
46
|
"@noodle-borg/assistant-gateway": "0.0.0",
|
|
47
47
|
"@noodle-borg/auth": "0.0.0",
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@noodleseed/one",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.193.0",
|
|
4
4
|
"private": false,
|
|
5
5
|
"description": "Noodle CLI by Noodle Seed — author, run, and deploy declarative MCP servers. Embedding the assistant in your own web app is @noodleseed/assistant.",
|
|
6
6
|
"license": "Apache-2.0",
|
|
@@ -236,7 +236,7 @@
|
|
|
236
236
|
"@modelcontextprotocol/client": "2.0.0",
|
|
237
237
|
"@modelcontextprotocol/server": "2.0.0",
|
|
238
238
|
"@noodle-borg/admission-limits": "0.0.0",
|
|
239
|
-
"@noodle-borg/agent-kit": "0.
|
|
239
|
+
"@noodle-borg/agent-kit": "0.114.0",
|
|
240
240
|
"@noodle-borg/app-audit": "0.0.0",
|
|
241
241
|
"@noodle-borg/app-package": "0.0.0",
|
|
242
242
|
"@noodle-borg/assistant-gateway": "0.0.0",
|