@noodleseed/one 0.111.0 → 0.112.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/dist/commands/catalog-data-tenant-resources.d.ts.map +1 -1
- package/dist/commands/catalog-data-tenant-resources.js +10 -1
- package/dist/commands/catalog-data-tenant-resources.js.map +1 -1
- package/dist/commands/deployment-package.d.ts +3 -0
- package/dist/commands/deployment-package.d.ts.map +1 -0
- package/dist/commands/deployment-package.js +126 -0
- package/dist/commands/deployment-package.js.map +1 -0
- package/dist/commands/deployments-ops.d.ts.map +1 -1
- package/dist/commands/deployments-ops.js +3 -0
- package/dist/commands/deployments-ops.js.map +1 -1
- package/dist/commands/github-runs-ops.d.ts +2 -21
- package/dist/commands/github-runs-ops.d.ts.map +1 -1
- package/dist/commands/github-runs-ops.js.map +1 -1
- package/dist/commands/github-shared.d.ts +2 -14
- package/dist/commands/github-shared.d.ts.map +1 -1
- package/dist/commands/github-shared.js +1 -1
- package/dist/commands/github-shared.js.map +1 -1
- package/dist/commands/resource-shared.d.ts +2 -82
- package/dist/commands/resource-shared.d.ts.map +1 -1
- package/dist/commands/resource-shared.js.map +1 -1
- package/dist/devtools-harness.js +1 -1
- package/dist/devtools-harness.js.map +1 -1
- package/node_modules/@noodle-borg/agent-kit/dist/curated/error-fixes.d.ts.map +1 -1
- package/node_modules/@noodle-borg/agent-kit/dist/curated/error-fixes.js +7 -0
- package/node_modules/@noodle-borg/agent-kit/dist/curated/error-fixes.js.map +1 -1
- package/node_modules/@noodle-borg/agent-kit/dist/generated/example-files.d.ts.map +1 -1
- package/node_modules/@noodle-borg/agent-kit/dist/generated/example-files.js +3 -2
- package/node_modules/@noodle-borg/agent-kit/dist/generated/example-files.js.map +1 -1
- package/node_modules/@noodle-borg/agent-kit/dist/generated/surface.d.ts.map +1 -1
- package/node_modules/@noodle-borg/agent-kit/dist/generated/surface.js +7 -0
- package/node_modules/@noodle-borg/agent-kit/dist/generated/surface.js.map +1 -1
- package/node_modules/@noodle-borg/agent-kit/dist/index.d.ts +4 -1
- package/node_modules/@noodle-borg/agent-kit/dist/index.d.ts.map +1 -1
- package/node_modules/@noodle-borg/agent-kit/dist/index.js +5 -2
- package/node_modules/@noodle-borg/agent-kit/dist/index.js.map +1 -1
- package/node_modules/@noodle-borg/agent-kit/dist/product-skill-markdown.d.ts +4 -0
- package/node_modules/@noodle-borg/agent-kit/dist/product-skill-markdown.d.ts.map +1 -0
- package/node_modules/@noodle-borg/agent-kit/dist/product-skill-markdown.js +138 -0
- package/node_modules/@noodle-borg/agent-kit/dist/product-skill-markdown.js.map +1 -0
- package/node_modules/@noodle-borg/agent-kit/dist/product-skill-renderer.d.ts +8 -0
- package/node_modules/@noodle-borg/agent-kit/dist/product-skill-renderer.d.ts.map +1 -0
- package/node_modules/@noodle-borg/agent-kit/dist/product-skill-renderer.js +135 -0
- package/node_modules/@noodle-borg/agent-kit/dist/product-skill-renderer.js.map +1 -0
- package/node_modules/@noodle-borg/agent-kit/dist/product-skill-types.d.ts +126 -0
- package/node_modules/@noodle-borg/agent-kit/dist/product-skill-types.d.ts.map +1 -0
- package/node_modules/@noodle-borg/agent-kit/dist/product-skill-types.js +2 -0
- package/node_modules/@noodle-borg/agent-kit/dist/product-skill-types.js.map +1 -0
- package/node_modules/@noodle-borg/agent-kit/dist/product-skill-validation.d.ts +27 -0
- package/node_modules/@noodle-borg/agent-kit/dist/product-skill-validation.d.ts.map +1 -0
- package/node_modules/@noodle-borg/agent-kit/dist/product-skill-validation.js +262 -0
- package/node_modules/@noodle-borg/agent-kit/dist/product-skill-validation.js.map +1 -0
- package/node_modules/@noodle-borg/agent-kit/dist/skill-agent-guide-ref.d.ts +2 -0
- package/node_modules/@noodle-borg/agent-kit/dist/skill-agent-guide-ref.d.ts.map +1 -0
- package/node_modules/@noodle-borg/agent-kit/dist/skill-agent-guide-ref.js +16 -0
- package/node_modules/@noodle-borg/agent-kit/dist/skill-agent-guide-ref.js.map +1 -0
- package/node_modules/@noodle-borg/agent-kit/dist/skill-content.d.ts.map +1 -1
- package/node_modules/@noodle-borg/agent-kit/dist/skill-content.js +2 -0
- package/node_modules/@noodle-borg/agent-kit/dist/skill-content.js.map +1 -1
- package/node_modules/@noodle-borg/agent-kit/dist/skill-router.d.ts.map +1 -1
- package/node_modules/@noodle-borg/agent-kit/dist/skill-router.js +1 -0
- package/node_modules/@noodle-borg/agent-kit/dist/skill-router.js.map +1 -1
- package/node_modules/@noodle-borg/agent-kit/dist/version.d.ts +2 -0
- package/node_modules/@noodle-borg/agent-kit/dist/version.d.ts.map +1 -0
- package/node_modules/@noodle-borg/agent-kit/dist/version.js +3 -0
- package/node_modules/@noodle-borg/agent-kit/dist/version.js.map +1 -0
- package/node_modules/@noodle-borg/app-package/dist/agent-guide-schema.d.ts +34 -0
- package/node_modules/@noodle-borg/app-package/dist/agent-guide-schema.d.ts.map +1 -0
- package/node_modules/@noodle-borg/app-package/dist/agent-guide-schema.js +50 -0
- package/node_modules/@noodle-borg/app-package/dist/agent-guide-schema.js.map +1 -0
- package/node_modules/@noodle-borg/app-package/dist/canonical.d.ts +5 -0
- package/node_modules/@noodle-borg/app-package/dist/canonical.d.ts.map +1 -0
- package/node_modules/@noodle-borg/app-package/dist/canonical.js +44 -0
- package/node_modules/@noodle-borg/app-package/dist/canonical.js.map +1 -0
- package/node_modules/@noodle-borg/app-package/dist/index.d.ts +8 -0
- package/node_modules/@noodle-borg/app-package/dist/index.d.ts.map +1 -0
- package/node_modules/@noodle-borg/app-package/dist/index.js +8 -0
- package/node_modules/@noodle-borg/app-package/dist/index.js.map +1 -0
- package/node_modules/@noodle-borg/app-package/dist/limits.d.ts +29 -0
- package/node_modules/@noodle-borg/app-package/dist/limits.d.ts.map +1 -0
- package/node_modules/@noodle-borg/app-package/dist/limits.js +29 -0
- package/node_modules/@noodle-borg/app-package/dist/limits.js.map +1 -0
- package/node_modules/@noodle-borg/app-package/dist/schema.d.ts +5 -0
- package/node_modules/@noodle-borg/app-package/dist/schema.d.ts.map +1 -0
- package/node_modules/@noodle-borg/app-package/dist/schema.js +188 -0
- package/node_modules/@noodle-borg/app-package/dist/schema.js.map +1 -0
- package/node_modules/@noodle-borg/app-package/dist/sensitive-content.d.ts +6 -0
- package/node_modules/@noodle-borg/app-package/dist/sensitive-content.d.ts.map +1 -0
- package/node_modules/@noodle-borg/app-package/dist/sensitive-content.js +39 -0
- package/node_modules/@noodle-borg/app-package/dist/sensitive-content.js.map +1 -0
- package/node_modules/@noodle-borg/app-package/dist/snapshot.d.ts +51 -0
- package/node_modules/@noodle-borg/app-package/dist/snapshot.d.ts.map +1 -0
- package/node_modules/@noodle-borg/app-package/dist/snapshot.js +160 -0
- package/node_modules/@noodle-borg/app-package/dist/snapshot.js.map +1 -0
- package/node_modules/@noodle-borg/app-package/dist/types.d.ts +126 -0
- package/node_modules/@noodle-borg/app-package/dist/types.d.ts.map +1 -0
- package/node_modules/@noodle-borg/app-package/dist/types.js +2 -0
- package/node_modules/@noodle-borg/app-package/dist/types.js.map +1 -0
- package/node_modules/@noodle-borg/app-package/package.json +31 -0
- package/node_modules/@noodle-borg/authoring/dist/agent-guide.d.ts +30 -0
- package/node_modules/@noodle-borg/authoring/dist/agent-guide.d.ts.map +1 -0
- package/node_modules/@noodle-borg/authoring/dist/agent-guide.js +21 -0
- package/node_modules/@noodle-borg/authoring/dist/agent-guide.js.map +1 -0
- package/node_modules/@noodle-borg/authoring/dist/index.d.ts +1 -0
- package/node_modules/@noodle-borg/authoring/dist/index.d.ts.map +1 -1
- package/node_modules/@noodle-borg/authoring/dist/index.js.map +1 -1
- package/node_modules/@noodle-borg/authoring/dist/react/components.d.ts +3 -3
- package/node_modules/@noodle-borg/authoring/dist/react/native-components.d.ts +2 -2
- package/node_modules/@noodle-borg/authoring/dist/server.d.ts +3 -0
- package/node_modules/@noodle-borg/authoring/dist/server.d.ts.map +1 -1
- package/node_modules/@noodle-borg/authoring/dist/server.js +4 -0
- package/node_modules/@noodle-borg/authoring/dist/server.js.map +1 -1
- package/node_modules/@noodle-borg/compiler/dist/app-package/compile.d.ts +24 -0
- package/node_modules/@noodle-borg/compiler/dist/app-package/compile.d.ts.map +1 -0
- package/node_modules/@noodle-borg/compiler/dist/app-package/compile.js +341 -0
- package/node_modules/@noodle-borg/compiler/dist/app-package/compile.js.map +1 -0
- package/node_modules/@noodle-borg/compiler/dist/compile.d.ts.map +1 -1
- package/node_modules/@noodle-borg/compiler/dist/compile.js +35 -0
- package/node_modules/@noodle-borg/compiler/dist/compile.js.map +1 -1
- package/node_modules/@noodle-borg/compiler/dist/errors.d.ts +3 -1
- package/node_modules/@noodle-borg/compiler/dist/errors.d.ts.map +1 -1
- package/node_modules/@noodle-borg/compiler/dist/index.d.ts +3 -0
- package/node_modules/@noodle-borg/compiler/dist/index.d.ts.map +1 -1
- package/node_modules/@noodle-borg/compiler/dist/index.js +2 -0
- package/node_modules/@noodle-borg/compiler/dist/index.js.map +1 -1
- package/node_modules/@noodle-borg/compiler/dist/manifest/agent-guide-schema.d.ts +3 -0
- package/node_modules/@noodle-borg/compiler/dist/manifest/agent-guide-schema.d.ts.map +1 -0
- package/node_modules/@noodle-borg/compiler/dist/manifest/agent-guide-schema.js +3 -0
- package/node_modules/@noodle-borg/compiler/dist/manifest/agent-guide-schema.js.map +1 -0
- package/node_modules/@noodle-borg/compiler/dist/manifest/schema.d.ts +50 -0
- package/node_modules/@noodle-borg/compiler/dist/manifest/schema.d.ts.map +1 -1
- package/node_modules/@noodle-borg/compiler/dist/manifest/schema.js +5 -1
- package/node_modules/@noodle-borg/compiler/dist/manifest/schema.js.map +1 -1
- package/node_modules/@noodle-borg/compiler/dist/suggest.d.ts +2 -0
- package/node_modules/@noodle-borg/compiler/dist/suggest.d.ts.map +1 -1
- package/node_modules/@noodle-borg/compiler/dist/suggest.js +13 -1
- package/node_modules/@noodle-borg/compiler/dist/suggest.js.map +1 -1
- package/node_modules/@noodle-borg/compiler/dist/zod-issue.d.ts.map +1 -1
- package/node_modules/@noodle-borg/compiler/dist/zod-issue.js +2 -0
- package/node_modules/@noodle-borg/compiler/dist/zod-issue.js.map +1 -1
- package/node_modules/@noodle-borg/compiler/package.json +1 -0
- package/node_modules/@noodle-borg/devtools-ui/dist/index.d.ts +2 -0
- package/node_modules/@noodle-borg/devtools-ui/dist/index.d.ts.map +1 -0
- package/node_modules/@noodle-borg/devtools-ui/dist/index.js +2 -0
- package/node_modules/@noodle-borg/devtools-ui/dist/index.js.map +1 -0
- package/node_modules/@noodle-borg/devtools-ui/package.json +28 -0
- package/node_modules/@noodle-borg/service/dist/app-package-snapshot.d.ts +20 -0
- package/node_modules/@noodle-borg/service/dist/app-package-snapshot.d.ts.map +1 -0
- package/node_modules/@noodle-borg/service/dist/app-package-snapshot.js +47 -0
- package/node_modules/@noodle-borg/service/dist/app-package-snapshot.js.map +1 -0
- package/node_modules/@noodle-borg/service/dist/index.d.ts +2 -2
- package/node_modules/@noodle-borg/service/dist/index.d.ts.map +1 -1
- package/node_modules/@noodle-borg/service/dist/index.js +1 -1
- package/node_modules/@noodle-borg/service/dist/index.js.map +1 -1
- package/node_modules/@noodle-borg/service/dist/platform-auth-configuration.d.ts +2 -2
- package/node_modules/@noodle-borg/service/dist/platform-auth-rollout-support.d.ts +2 -2
- package/node_modules/@noodle-borg/service/dist/product-skill-type-compatibility.d.ts +7 -0
- package/node_modules/@noodle-borg/service/dist/product-skill-type-compatibility.d.ts.map +1 -0
- package/node_modules/@noodle-borg/service/dist/product-skill-type-compatibility.js +2 -0
- package/node_modules/@noodle-borg/service/dist/product-skill-type-compatibility.js.map +1 -0
- package/node_modules/@noodle-borg/service/dist/registry-compile.d.ts +7 -1
- package/node_modules/@noodle-borg/service/dist/registry-compile.d.ts.map +1 -1
- package/node_modules/@noodle-borg/service/dist/registry-compile.js +20 -1
- package/node_modules/@noodle-borg/service/dist/registry-compile.js.map +1 -1
- package/node_modules/@noodle-borg/service/dist/registry-deploy-transaction.d.ts +6 -0
- package/node_modules/@noodle-borg/service/dist/registry-deploy-transaction.d.ts.map +1 -1
- package/node_modules/@noodle-borg/service/dist/registry-deploy-transaction.js +6 -0
- package/node_modules/@noodle-borg/service/dist/registry-deploy-transaction.js.map +1 -1
- package/node_modules/@noodle-borg/service/dist/registry-package.d.ts +23 -0
- package/node_modules/@noodle-borg/service/dist/registry-package.d.ts.map +1 -0
- package/node_modules/@noodle-borg/service/dist/registry-package.js +35 -0
- package/node_modules/@noodle-borg/service/dist/registry-package.js.map +1 -0
- package/node_modules/@noodle-borg/service/dist/registry-types.d.ts +3 -0
- package/node_modules/@noodle-borg/service/dist/registry-types.d.ts.map +1 -1
- package/node_modules/@noodle-borg/service/dist/registry.d.ts +3 -0
- package/node_modules/@noodle-borg/service/dist/registry.d.ts.map +1 -1
- package/node_modules/@noodle-borg/service/dist/registry.js +21 -5
- package/node_modules/@noodle-borg/service/dist/registry.js.map +1 -1
- package/node_modules/@noodle-borg/service/dist/routes/access.d.ts.map +1 -1
- package/node_modules/@noodle-borg/service/dist/routes/access.js +1 -1
- package/node_modules/@noodle-borg/service/dist/routes/access.js.map +1 -1
- package/node_modules/@noodle-borg/service/dist/routes/alerts.d.ts.map +1 -1
- package/node_modules/@noodle-borg/service/dist/routes/alerts.js +1 -1
- package/node_modules/@noodle-borg/service/dist/routes/alerts.js.map +1 -1
- package/node_modules/@noodle-borg/service/dist/routes/apps.d.ts +1 -1
- package/node_modules/@noodle-borg/service/dist/routes/apps.d.ts.map +1 -1
- package/node_modules/@noodle-borg/service/dist/routes/apps.js +1 -1
- package/node_modules/@noodle-borg/service/dist/routes/apps.js.map +1 -1
- package/node_modules/@noodle-borg/service/dist/routes/config-values.d.ts.map +1 -1
- package/node_modules/@noodle-borg/service/dist/routes/config-values.js +1 -2
- package/node_modules/@noodle-borg/service/dist/routes/config-values.js.map +1 -1
- package/node_modules/@noodle-borg/service/dist/routes/deployment-lock.d.ts.map +1 -1
- package/node_modules/@noodle-borg/service/dist/routes/deployment-lock.js +1 -1
- package/node_modules/@noodle-borg/service/dist/routes/deployment-lock.js.map +1 -1
- package/node_modules/@noodle-borg/service/dist/routes/deployment-package.d.ts +12 -0
- package/node_modules/@noodle-borg/service/dist/routes/deployment-package.d.ts.map +1 -0
- package/node_modules/@noodle-borg/service/dist/routes/deployment-package.js +52 -0
- package/node_modules/@noodle-borg/service/dist/routes/deployment-package.js.map +1 -0
- package/node_modules/@noodle-borg/service/dist/routes/deployments.d.ts.map +1 -1
- package/node_modules/@noodle-borg/service/dist/routes/deployments.js +1 -1
- package/node_modules/@noodle-borg/service/dist/routes/deployments.js.map +1 -1
- package/node_modules/@noodle-borg/service/dist/routes/environment-production.d.ts.map +1 -1
- package/node_modules/@noodle-borg/service/dist/routes/environment-production.js +1 -1
- package/node_modules/@noodle-borg/service/dist/routes/environment-production.js.map +1 -1
- package/node_modules/@noodle-borg/service/dist/routes/envs.d.ts +2 -2
- package/node_modules/@noodle-borg/service/dist/routes/envs.d.ts.map +1 -1
- package/node_modules/@noodle-borg/service/dist/routes/envs.js +1 -1
- package/node_modules/@noodle-borg/service/dist/routes/envs.js.map +1 -1
- package/node_modules/@noodle-borg/service/dist/routes/feedback.d.ts.map +1 -1
- package/node_modules/@noodle-borg/service/dist/routes/feedback.js +1 -1
- package/node_modules/@noodle-borg/service/dist/routes/feedback.js.map +1 -1
- package/node_modules/@noodle-borg/service/dist/routes/github-connection.d.ts.map +1 -1
- package/node_modules/@noodle-borg/service/dist/routes/github-connection.js +1 -1
- package/node_modules/@noodle-borg/service/dist/routes/github-connection.js.map +1 -1
- package/node_modules/@noodle-borg/service/dist/routes/github-runs.d.ts.map +1 -1
- package/node_modules/@noodle-borg/service/dist/routes/github-runs.js +1 -1
- package/node_modules/@noodle-borg/service/dist/routes/github-runs.js.map +1 -1
- package/node_modules/@noodle-borg/service/dist/routes/org-admin.d.ts.map +1 -1
- package/node_modules/@noodle-borg/service/dist/routes/org-admin.js +1 -1
- package/node_modules/@noodle-borg/service/dist/routes/org-admin.js.map +1 -1
- package/node_modules/@noodle-borg/service/dist/routes/org-mcp-subdomain.d.ts.map +1 -1
- package/node_modules/@noodle-borg/service/dist/routes/org-mcp-subdomain.js +1 -1
- package/node_modules/@noodle-borg/service/dist/routes/org-mcp-subdomain.js.map +1 -1
- package/node_modules/@noodle-borg/service/dist/routes/paths.d.ts +5 -0
- package/node_modules/@noodle-borg/service/dist/routes/paths.d.ts.map +1 -1
- package/node_modules/@noodle-borg/service/dist/routes/paths.js +16 -0
- package/node_modules/@noodle-borg/service/dist/routes/paths.js.map +1 -1
- package/node_modules/@noodle-borg/service/dist/routes/resource-read-dispatch.d.ts +2 -1
- package/node_modules/@noodle-borg/service/dist/routes/resource-read-dispatch.d.ts.map +1 -1
- package/node_modules/@noodle-borg/service/dist/routes/resource-read-dispatch.js +14 -2
- package/node_modules/@noodle-borg/service/dist/routes/resource-read-dispatch.js.map +1 -1
- package/node_modules/@noodle-borg/service/dist/service.d.ts.map +1 -1
- package/node_modules/@noodle-borg/service/dist/service.js +1 -0
- package/node_modules/@noodle-borg/service/dist/service.js.map +1 -1
- package/node_modules/@noodle-borg/service/dist/store/in-memory.d.ts.map +1 -1
- package/node_modules/@noodle-borg/service/dist/store/in-memory.js +8 -2
- package/node_modules/@noodle-borg/service/dist/store/in-memory.js.map +1 -1
- package/node_modules/@noodle-borg/service/dist/store/json-file.d.ts.map +1 -1
- package/node_modules/@noodle-borg/service/dist/store/json-file.js +7 -2
- package/node_modules/@noodle-borg/service/dist/store/json-file.js.map +1 -1
- package/node_modules/@noodle-borg/service/dist/store/postgres-deploy-records.d.ts.map +1 -1
- package/node_modules/@noodle-borg/service/dist/store/postgres-deploy-records.js +11 -6
- package/node_modules/@noodle-borg/service/dist/store/postgres-deploy-records.js.map +1 -1
- package/node_modules/@noodle-borg/service/dist/store/postgres-rows.d.ts +1 -0
- package/node_modules/@noodle-borg/service/dist/store/postgres-rows.d.ts.map +1 -1
- package/node_modules/@noodle-borg/service/dist/store/postgres-rows.js +5 -0
- package/node_modules/@noodle-borg/service/dist/store/postgres-rows.js.map +1 -1
- package/node_modules/@noodle-borg/service/dist/store/postgres-schema.d.ts.map +1 -1
- package/node_modules/@noodle-borg/service/dist/store/postgres-schema.js +2 -0
- package/node_modules/@noodle-borg/service/dist/store/postgres-schema.js.map +1 -1
- package/node_modules/@noodle-borg/service/dist/store.d.ts +3 -0
- package/node_modules/@noodle-borg/service/dist/store.d.ts.map +1 -1
- package/node_modules/@noodle-borg/service/dist/store.js.map +1 -1
- package/node_modules/@noodle-borg/service/package.json +2 -0
- package/node_modules/@noodle-borg/wire-contracts/dist/access-mode.d.ts +13 -0
- package/node_modules/@noodle-borg/wire-contracts/dist/access-mode.d.ts.map +1 -0
- package/node_modules/@noodle-borg/wire-contracts/dist/access-mode.js +12 -0
- package/node_modules/@noodle-borg/wire-contracts/dist/access-mode.js.map +1 -0
- package/node_modules/@noodle-borg/{service/dist/routes/config-contracts.d.ts → wire-contracts/dist/config.d.ts} +3 -2
- package/node_modules/@noodle-borg/wire-contracts/dist/config.d.ts.map +1 -0
- package/node_modules/@noodle-borg/{service/dist/routes/config-contracts.js → wire-contracts/dist/config.js} +1 -1
- package/node_modules/@noodle-borg/wire-contracts/dist/config.js.map +1 -0
- package/node_modules/@noodle-borg/{service/dist/routes/contracts.d.ts → wire-contracts/dist/control-plane.d.ts} +31 -30
- package/node_modules/@noodle-borg/wire-contracts/dist/control-plane.d.ts.map +1 -0
- package/node_modules/@noodle-borg/{service/dist/routes/contracts.js → wire-contracts/dist/control-plane.js} +11 -31
- package/node_modules/@noodle-borg/wire-contracts/dist/control-plane.js.map +1 -0
- package/node_modules/@noodle-borg/wire-contracts/dist/deployment-package.d.ts +56 -0
- package/node_modules/@noodle-borg/wire-contracts/dist/deployment-package.d.ts.map +1 -0
- package/node_modules/@noodle-borg/wire-contracts/dist/deployment-package.js +21 -0
- package/node_modules/@noodle-borg/wire-contracts/dist/deployment-package.js.map +1 -0
- package/node_modules/@noodle-borg/wire-contracts/dist/index.d.ts +5 -17
- package/node_modules/@noodle-borg/wire-contracts/dist/index.d.ts.map +1 -1
- package/node_modules/@noodle-borg/wire-contracts/dist/index.js +6 -17
- package/node_modules/@noodle-borg/wire-contracts/dist/index.js.map +1 -1
- package/node_modules/@noodle-borg/wire-contracts/package.json +1 -0
- package/package.json +4 -1
- package/node_modules/@noodle-borg/service/dist/routes/config-contracts.d.ts.map +0 -1
- package/node_modules/@noodle-borg/service/dist/routes/config-contracts.js.map +0 -1
- package/node_modules/@noodle-borg/service/dist/routes/contracts.d.ts.map +0 -1
- package/node_modules/@noodle-borg/service/dist/routes/contracts.js.map +0 -1
- /package/{dist → node_modules/@noodle-borg/devtools-ui/dist}/devtools-copy-styles.d.ts +0 -0
- /package/{dist → node_modules/@noodle-borg/devtools-ui/dist}/devtools-copy-styles.d.ts.map +0 -0
- /package/{dist → node_modules/@noodle-borg/devtools-ui/dist}/devtools-copy-styles.js +0 -0
- /package/{dist → node_modules/@noodle-borg/devtools-ui/dist}/devtools-copy-styles.js.map +0 -0
- /package/{dist → node_modules/@noodle-borg/devtools-ui/dist}/devtools-design-styles.d.ts +0 -0
- /package/{dist → node_modules/@noodle-borg/devtools-ui/dist}/devtools-design-styles.d.ts.map +0 -0
- /package/{dist → node_modules/@noodle-borg/devtools-ui/dist}/devtools-design-styles.js +0 -0
- /package/{dist → node_modules/@noodle-borg/devtools-ui/dist}/devtools-design-styles.js.map +0 -0
- /package/{dist → node_modules/@noodle-borg/devtools-ui/dist}/devtools-preview-control-styles.d.ts +0 -0
- /package/{dist → node_modules/@noodle-borg/devtools-ui/dist}/devtools-preview-control-styles.d.ts.map +0 -0
- /package/{dist → node_modules/@noodle-borg/devtools-ui/dist}/devtools-preview-control-styles.js +0 -0
- /package/{dist → node_modules/@noodle-borg/devtools-ui/dist}/devtools-preview-control-styles.js.map +0 -0
- /package/{dist → node_modules/@noodle-borg/devtools-ui/dist}/devtools-responsive-styles.d.ts +0 -0
- /package/{dist → node_modules/@noodle-borg/devtools-ui/dist}/devtools-responsive-styles.d.ts.map +0 -0
- /package/{dist → node_modules/@noodle-borg/devtools-ui/dist}/devtools-responsive-styles.js +0 -0
- /package/{dist → node_modules/@noodle-borg/devtools-ui/dist}/devtools-responsive-styles.js.map +0 -0
- /package/{dist → node_modules/@noodle-borg/devtools-ui/dist}/devtools-styles.d.ts +0 -0
- /package/{dist → node_modules/@noodle-borg/devtools-ui/dist}/devtools-styles.d.ts.map +0 -0
- /package/{dist → node_modules/@noodle-borg/devtools-ui/dist}/devtools-styles.js +0 -0
- /package/{dist → node_modules/@noodle-borg/devtools-ui/dist}/devtools-styles.js.map +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"devtools-harness.js","sourceRoot":"","sources":["../src/devtools-harness.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EACL,uBAAuB,EACvB,uBAAuB,EACvB,0BAA0B,EAC1B,oBAAoB,GACrB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACL,yBAAyB,EACzB,sBAAsB,EACtB,iBAAiB,GAClB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,qCAAqC,EACrC,gCAAgC,EAChC,kCAAkC,GACnC,MAAM,qCAAqC,CAAC;AAC7C,OAAO,EAAE,yBAAyB,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AACvF,OAAO,EAAE,uBAAuB,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AACnF,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AACrF,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"devtools-harness.js","sourceRoot":"","sources":["../src/devtools-harness.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"error-fixes.d.ts","sourceRoot":"","sources":["../../src/curated/error-fixes.ts"],"names":[],"mappings":"AAQA,eAAO,MAAM,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"error-fixes.d.ts","sourceRoot":"","sources":["../../src/curated/error-fixes.ts"],"names":[],"mappings":"AAQA,eAAO,MAAM,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAkI9C,CAAC"}
|
|
@@ -67,5 +67,12 @@ export const ERROR_FIXES = {
|
|
|
67
67
|
customer_endpoint_routing_inconsistent: 'Regenerate the connector catalog so every action route includes all of its ordinary customer endpoint dependencies.',
|
|
68
68
|
unused_connector_alias: 'A declared connector alias is never called; remove the unused `use` entry or wire it into a tool.',
|
|
69
69
|
arg_mismatch: 'A connector call is missing or adds arguments; match the operation signature under `expected`/`got`.',
|
|
70
|
+
agent_guide_invalid: 'Correct the product guide shape in `server(..., { agentGuide })` using non-empty bounded prose and symbolic references.',
|
|
71
|
+
agent_guide_duplicate_workflow: 'Give every `agentGuide.workflows` entry a unique lowercase underscore id.',
|
|
72
|
+
agent_guide_duplicate_example: 'Keep each agent-guide prompt and workflow pairing unique.',
|
|
73
|
+
agent_guide_example_workflow_missing: 'Point the example workflow at an existing `agentGuide.workflows` id.',
|
|
74
|
+
agent_guide_capability_missing: 'Correct the capability kind/name in `server(..., { agentGuide })` to a declared MCP capability.',
|
|
75
|
+
agent_guide_capability_kind: 'Correct the capability kind/name in `server(..., { agentGuide })` to match its declared MCP capability.',
|
|
76
|
+
app_package_sensitive_content: 'Remove the credential value; reference managed config by name only.',
|
|
70
77
|
};
|
|
71
78
|
//# sourceMappingURL=error-fixes.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"error-fixes.js","sourceRoot":"","sources":["../../src/curated/error-fixes.ts"],"names":[],"mappings":"AAAA,6DAA6D;AAC7D,EAAE;AACF,uFAAuF;AACvF,yFAAyF;AACzF,0DAA0D;AAC1D,0FAA0F;AAC1F,6FAA6F;AAE7F,MAAM,CAAC,MAAM,WAAW,GAA2B;IACjD,gBAAgB,EACd,+HAA+H;IACjI,aAAa,EACX,8HAA8H;IAChI,YAAY,EACV,gHAAgH;IAClH,aAAa,EACX,4IAA4I;IAC9I,wBAAwB,EACtB,2GAA2G;IAC7G,cAAc,EAAE,iFAAiF;IACjG,4BAA4B,EAC1B,oGAAoG;IACtG,2BAA2B,EACzB,kOAAkO;IACpO,qBAAqB,EACnB,4GAA4G;IAC9G,YAAY,EACV,2HAA2H;IAC7H,kBAAkB,EAChB,mGAAmG;IACrG,kBAAkB,EAChB,kHAAkH;IACpH,mBAAmB,EACjB,6FAA6F;IAC/F,kBAAkB,EAAE,kEAAkE;IACtF,iBAAiB,EACf,0GAA0G;IAC5G,qBAAqB,EACnB,4GAA4G;IAC9G,yBAAyB,EACvB,kHAAkH;IACpH,mBAAmB,EACjB,+FAA+F;IACjG,gBAAgB,EACd,0FAA0F;IAC5F,gBAAgB,EACd,gGAAgG;IAClG,aAAa,EAAE,8DAA8D;IAC7E,iBAAiB,EACf,uHAAuH;IACzH,kBAAkB,EAChB,oLAAoL;IACtL,0BAA0B,EACxB,mLAAmL;IACrL,wBAAwB,EACtB,uIAAuI;IACzI,yBAAyB,EACvB,kJAAkJ;IACpJ,iBAAiB,EACf,4GAA4G;IAC9G,sBAAsB,EACpB,kJAAkJ;IACpJ,kBAAkB,EAAE,2EAA2E;IAC/F,gBAAgB,EAAE,qDAAqD;IACvE,sBAAsB,EAAE,uEAAuE;IAC/F,wBAAwB,EACtB,wEAAwE;IAC1E,gBAAgB,EACd,2FAA2F;IAC7F,mBAAmB,EACjB,8GAA8G;IAChH,0BAA0B,EACxB,8FAA8F;IAChG,qBAAqB,EACnB,6EAA6E;IAC/E,sBAAsB,EACpB,oGAAoG;IACtG,2BAA2B,EACzB,mIAAmI;IACrI,qBAAqB,EACnB,mKAAmK;IACrK,2BAA2B,EACzB,mJAAmJ;IACrJ,aAAa,EACX,yFAAyF;IAC3F,8BAA8B,EAC5B,8EAA8E;IAChF,kBAAkB,EAChB,oHAAoH;IACtH,uBAAuB,EACrB,iHAAiH;IACnH,wBAAwB,EACtB,qHAAqH;IACvH,iBAAiB,EACf,oHAAoH;IACtH,0BAA0B,EACxB,wIAAwI;IAC1I,8BAA8B,EAC5B,wJAAwJ;IAC1J,yBAAyB,EACvB,8IAA8I;IAChJ,4BAA4B,EAC1B,uIAAuI;IACzI,+BAA+B,EAC7B,iIAAiI;IACnI,kCAAkC,EAChC,sIAAsI;IACxI,iCAAiC,EAC/B,wIAAwI;IAC1I,oCAAoC,EAClC,6HAA6H;IAC/H,oCAAoC,EAClC,8JAA8J;IAChK,qCAAqC,EACnC,yHAAyH;IAC3H,+CAA+C,EAC7C,iIAAiI;IACnI,iCAAiC,EAC/B,0HAA0H;IAC5H,sCAAsC,EACpC,qHAAqH;IACvH,sBAAsB,EACpB,mGAAmG;IACrG,YAAY,EACV,sGAAsG;
|
|
1
|
+
{"version":3,"file":"error-fixes.js","sourceRoot":"","sources":["../../src/curated/error-fixes.ts"],"names":[],"mappings":"AAAA,6DAA6D;AAC7D,EAAE;AACF,uFAAuF;AACvF,yFAAyF;AACzF,0DAA0D;AAC1D,0FAA0F;AAC1F,6FAA6F;AAE7F,MAAM,CAAC,MAAM,WAAW,GAA2B;IACjD,gBAAgB,EACd,+HAA+H;IACjI,aAAa,EACX,8HAA8H;IAChI,YAAY,EACV,gHAAgH;IAClH,aAAa,EACX,4IAA4I;IAC9I,wBAAwB,EACtB,2GAA2G;IAC7G,cAAc,EAAE,iFAAiF;IACjG,4BAA4B,EAC1B,oGAAoG;IACtG,2BAA2B,EACzB,kOAAkO;IACpO,qBAAqB,EACnB,4GAA4G;IAC9G,YAAY,EACV,2HAA2H;IAC7H,kBAAkB,EAChB,mGAAmG;IACrG,kBAAkB,EAChB,kHAAkH;IACpH,mBAAmB,EACjB,6FAA6F;IAC/F,kBAAkB,EAAE,kEAAkE;IACtF,iBAAiB,EACf,0GAA0G;IAC5G,qBAAqB,EACnB,4GAA4G;IAC9G,yBAAyB,EACvB,kHAAkH;IACpH,mBAAmB,EACjB,+FAA+F;IACjG,gBAAgB,EACd,0FAA0F;IAC5F,gBAAgB,EACd,gGAAgG;IAClG,aAAa,EAAE,8DAA8D;IAC7E,iBAAiB,EACf,uHAAuH;IACzH,kBAAkB,EAChB,oLAAoL;IACtL,0BAA0B,EACxB,mLAAmL;IACrL,wBAAwB,EACtB,uIAAuI;IACzI,yBAAyB,EACvB,kJAAkJ;IACpJ,iBAAiB,EACf,4GAA4G;IAC9G,sBAAsB,EACpB,kJAAkJ;IACpJ,kBAAkB,EAAE,2EAA2E;IAC/F,gBAAgB,EAAE,qDAAqD;IACvE,sBAAsB,EAAE,uEAAuE;IAC/F,wBAAwB,EACtB,wEAAwE;IAC1E,gBAAgB,EACd,2FAA2F;IAC7F,mBAAmB,EACjB,8GAA8G;IAChH,0BAA0B,EACxB,8FAA8F;IAChG,qBAAqB,EACnB,6EAA6E;IAC/E,sBAAsB,EACpB,oGAAoG;IACtG,2BAA2B,EACzB,mIAAmI;IACrI,qBAAqB,EACnB,mKAAmK;IACrK,2BAA2B,EACzB,mJAAmJ;IACrJ,aAAa,EACX,yFAAyF;IAC3F,8BAA8B,EAC5B,8EAA8E;IAChF,kBAAkB,EAChB,oHAAoH;IACtH,uBAAuB,EACrB,iHAAiH;IACnH,wBAAwB,EACtB,qHAAqH;IACvH,iBAAiB,EACf,oHAAoH;IACtH,0BAA0B,EACxB,wIAAwI;IAC1I,8BAA8B,EAC5B,wJAAwJ;IAC1J,yBAAyB,EACvB,8IAA8I;IAChJ,4BAA4B,EAC1B,uIAAuI;IACzI,+BAA+B,EAC7B,iIAAiI;IACnI,kCAAkC,EAChC,sIAAsI;IACxI,iCAAiC,EAC/B,wIAAwI;IAC1I,oCAAoC,EAClC,6HAA6H;IAC/H,oCAAoC,EAClC,8JAA8J;IAChK,qCAAqC,EACnC,yHAAyH;IAC3H,+CAA+C,EAC7C,iIAAiI;IACnI,iCAAiC,EAC/B,0HAA0H;IAC5H,sCAAsC,EACpC,qHAAqH;IACvH,sBAAsB,EACpB,mGAAmG;IACrG,YAAY,EACV,sGAAsG;IACxG,mBAAmB,EACjB,yHAAyH;IAC3H,8BAA8B,EAC5B,2EAA2E;IAC7E,6BAA6B,EAAE,2DAA2D;IAC1F,oCAAoC,EAClC,sEAAsE;IACxE,8BAA8B,EAC5B,iGAAiG;IACnG,2BAA2B,EACzB,yGAAyG;IAC3G,6BAA6B,EAC3B,qEAAqE;CACxE,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"example-files.d.ts","sourceRoot":"","sources":["../../src/generated/example-files.ts"],"names":[],"mappings":"AAIA,oGAAoG;AACpG,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B;AAED,uGAAuG;AACvG,eAAO,MAAM,qBAAqB,EAAE,SAAS,MAAM,EAUlD,CAAC;AAEF,yGAAyG;AACzG,eAAO,MAAM,qBAAqB,EAAE,SAAS,kBAAkB,
|
|
1
|
+
{"version":3,"file":"example-files.d.ts","sourceRoot":"","sources":["../../src/generated/example-files.ts"],"names":[],"mappings":"AAIA,oGAAoG;AACpG,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B;AAED,uGAAuG;AACvG,eAAO,MAAM,qBAAqB,EAAE,SAAS,MAAM,EAUlD,CAAC;AAEF,yGAAyG;AACzG,eAAO,MAAM,qBAAqB,EAAE,SAAS,kBAAkB,EA2E9D,CAAC"}
|
|
@@ -43,11 +43,12 @@ export const BUNDLED_EXAMPLE_FILES = [
|
|
|
43
43
|
{ relPath: "examples/acme-tasks/design/wireframe.html", content: "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n<meta charset=\"UTF-8\">\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n<title>Acme Tasks × ChatGPT — Two-Way App Wireframes</title>\n<style>\n @import url('https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800&family=JetBrains+Mono:wght@500;700&display=swap');\n * { margin: 0; padding: 0; box-sizing: border-box; }\n body { font-family: 'Inter', -apple-system, sans-serif; background: #f4f5f7; color: #1f1f1f; line-height: 1.55; }\n .mono { font-family: 'JetBrains Mono', monospace; }\n\n /* ── Acme Tasks branding + host-compliant tokens ── */\n :root {\n --accent: #7C3AED; /* branding.accent — CTAs, logo, high-priority emphasis only */\n --accent-soft: #EDE9FE;\n --accent-border: #DDD6FE;\n --ink: #161228; /* branding.surfaceDark — ChatGPT / system surface */\n --hi: #DC2626; /* priority: high */\n --med: #D97706; /* priority: medium */\n --low: #6B7280; /* priority: low */\n --green: #059669;\n --green-soft: #E7F6EF;\n --green-border: #A7E0C6;\n --amber: #B45309;\n --amber-soft: #FBF1E2;\n --amber-border: #EBD7A8;\n --blue-soft: #E8EEFB;\n --line: #ececeb;\n }\n\n .page-header { background: var(--ink); color: #fff; border-bottom: 3px solid var(--accent); padding: 30px 48px; position: sticky; top: 0; z-index: 100; }\n .page-header h1 { font-size: 22px; font-weight: 800; letter-spacing: -0.4px; }\n .page-header h1 .brand { color: #b79bff; }\n .page-header p { font-size: 13px; color: #b3b3c2; margin-top: 4px; }\n .page-header .scope { display: inline-block; margin-top: 10px; font-size: 11px; font-weight: 600; letter-spacing: 0.4px; padding: 4px 12px; background: var(--accent); color: #fff; border-radius: 4px; }\n\n .section-nav { background: #fff; border-bottom: 1px solid #e6e8ec; padding: 12px 48px; display: flex; gap: 22px; font-size: 12px; font-weight: 600; position: sticky; top: 100px; z-index: 99; overflow-x: auto; }\n .section-nav a { color: #8a929c; text-decoration: none; white-space: nowrap; }\n .section-nav a:hover { color: var(--accent); }\n\n .container { max-width: 1480px; margin: 0 auto; padding: 40px 48px 90px; }\n\n /* ── Legend ── */\n .vocab { display: flex; gap: 18px; flex-wrap: wrap; margin: 0 0 24px; padding: 14px 18px; background: #fff; border: 1px solid #e6e8ec; border-radius: 12px; font-size: 12px; color: #555; }\n .vocab-item { display: flex; align-items: center; gap: 8px; }\n .vocab-sw { width: 16px; height: 16px; border-radius: 4px; border: 1px solid rgba(0,0,0,0.1); }\n .vocab-sw.accent { background: var(--accent); }\n .vocab-sw.hi { background: var(--hi); } .vocab-sw.med { background: var(--med); } .vocab-sw.low { background: var(--low); }\n .vocab-sw.green { background: var(--green); }\n .vocab-sw.ink { background: var(--ink); }\n .vocab-sw.grey { background: #cdd2d8; }\n\n .section { margin-bottom: 72px; }\n .section-label { font-size: 11px; font-weight: 700; letter-spacing: 1.5px; text-transform: uppercase; color: var(--accent); margin-bottom: 8px; display: block; }\n .section-title { font-size: 27px; font-weight: 800; letter-spacing: -0.5px; margin-bottom: 6px; color: var(--ink); }\n .section-subtitle { font-size: 14px; color: #5c6570; margin-bottom: 24px; max-width: 880px; }\n\n /* ── Rationale block ── */\n .rationale { background: #fff; border: 1px solid #e6e8ec; border-left: 3px solid var(--accent); border-radius: 10px; padding: 16px 20px; margin-bottom: 24px; max-width: 960px; }\n .rationale h4 { font-size: 12px; font-weight: 700; text-transform: uppercase; letter-spacing: 0.8px; color: #8a929c; margin-bottom: 8px; }\n .rationale p { font-size: 13px; color: #3d454e; line-height: 1.6; margin-bottom: 8px; }\n .rationale p:last-child { margin-bottom: 0; }\n .r-tag { display: inline-block; font-size: 10px; font-weight: 700; padding: 2px 8px; border-radius: 4px; margin-right: 4px; }\n .r-tag.ux { background: var(--green-soft); color: #15734d; }\n .r-tag.ui { background: var(--blue-soft); color: #1d4fa0; }\n .r-tag.acme { background: var(--accent-soft); color: #5b21b6; }\n .r-tag.trust { background: var(--amber-soft); color: #8a5a0a; }\n\n /* ── Phones ── */\n .phones-row { display: flex; gap: 26px; overflow-x: auto; padding-bottom: 16px; align-items: stretch; }\n .phone-step { flex-shrink: 0; display: flex; flex-direction: column; align-items: center; }\n .step-label { font-size: 11px; font-weight: 600; color: #99a1ab; text-transform: uppercase; letter-spacing: 1px; margin-bottom: 12px; text-align: center; max-width: 320px; }\n .step-label small { font-weight: 400; letter-spacing: 0; text-transform: none; color: #b3bac2; display: block; margin-top: 2px; }\n .phone { width: 322px; min-height: 660px; background: #fff; border: 2px solid var(--ink); border-radius: 32px; overflow: hidden; display: flex; flex-direction: column; }\n .phone.offapp { border-color: #b9c0c8; border-style: dashed; }\n .phone-notch { width: 100px; height: 24px; background: var(--ink); border-radius: 0 0 14px 14px; margin: 0 auto; flex-shrink: 0; }\n .phone.offapp .phone-notch { background: #b9c0c8; }\n .phone-screen { padding: 16px; display: flex; flex-direction: column; gap: 12px; flex: 1; }\n .step-arrow { display: flex; align-items: center; justify-content: center; flex-shrink: 0; align-self: center; width: 34px; font-size: 24px; color: #c6ccd3; }\n\n .chatgpt-header { display: flex; align-items: center; justify-content: space-between; padding: 8px 0 10px; border-bottom: 1px solid #eef0f2; }\n .chatgpt-header .model-name { font-size: 14px; font-weight: 600; }\n .chatgpt-header .dots { font-size: 18px; color: #aab; letter-spacing: 2px; }\n .browser-header { display: flex; align-items: center; gap: 8px; padding: 8px 0 10px; border-bottom: 1px solid #eef0f2; }\n .browser-header .url { flex: 1; font-size: 9.5px; color: #8a929c; background: #f1f3f5; border-radius: 12px; padding: 6px 10px; overflow: hidden; white-space: nowrap; text-overflow: ellipsis; }\n .browser-header .lock { color: var(--green); font-size: 11px; }\n\n .msg { max-width: 94%; font-size: 13px; line-height: 1.55; }\n .msg.user { align-self: flex-end; background: #ece9e3; color: #1f1f1f; padding: 10px 14px; border-radius: 18px 18px 4px 18px; margin-left: auto; }\n .msg.assistant { color: #1f1f1f; padding: 2px 0; }\n .msg.assistant strong { font-weight: 600; }\n .msg.assistant .ok { color: var(--green); font-weight: 600; }\n\n .tool-call { display: flex; align-items: center; gap: 8px; padding: 8px 12px; background: #f7f8f9; border: 1px solid #e6e8ec; border-radius: 10px; font-size: 11px; color: #5c6570; }\n .tool-call .icon { width: 20px; height: 20px; background: var(--accent); border-radius: 5px; display: flex; align-items: center; justify-content: center; font-size: 12px; flex-shrink: 0; font-weight: 800; color: #fff; }\n .tool-call .label { font-weight: 700; color: #3d454e; }\n .mono-tool { font-family: 'JetBrains Mono', monospace; color: #8a929c; }\n\n /* ── Widget card (TaskList) ── */\n .wcard { border: 1.5px solid #e0e3e7; border-radius: 14px; background: #fff; overflow: hidden; }\n .wcard-head { padding: 11px 14px; background: #fbfbfa; border-bottom: 1px solid var(--line); display: flex; align-items: center; gap: 8px; }\n .wcard-head .wc-logo { width: 18px; height: 18px; background: var(--accent); border-radius: 5px; display: flex; align-items: center; justify-content: center; font-size: 11px; font-weight: 800; color: #fff; }\n .wcard-head .wc-title { font-size: 12.5px; font-weight: 700; letter-spacing: 0.2px; color: #1f1f1f; }\n .wcard-head .wc-sub { font-size: 10px; color: #a0a4a8; margin-left: auto; font-family: 'JetBrains Mono', monospace; }\n .wcard-body { padding: 12px 14px; display: flex; flex-direction: column; gap: 10px; }\n\n /* ── Capture input ── */\n .capture { display: flex; gap: 8px; }\n .capture .cinput { flex: 1; font-size: 12px; color: #6b7280; background: #f6f7f9; border: 1px solid #e3e6ea; border-radius: 8px; padding: 8px 10px; }\n .capture .cinput.typed { color: #1f1f1f; }\n .capture .cadd { font-size: 12px; font-weight: 700; color: #fff; background: var(--accent); border-radius: 8px; padding: 8px 14px; }\n\n /* ── Task rows ── */\n .task { display: flex; gap: 10px; align-items: center; padding: 8px 0; border-bottom: 1px solid #f2f2f0; }\n .task:last-child { border-bottom: none; }\n .tcheck { width: 18px; height: 18px; border-radius: 50%; border: 1.6px solid #c6ccd3; flex-shrink: 0; display: flex; align-items: center; justify-content: center; font-size: 10px; }\n .tcheck.done { background: var(--green); border-color: var(--green); color: #fff; }\n .ttitle { flex: 1; font-size: 12.5px; color: #202020; line-height: 1.35; min-width: 0; }\n .ttitle.done { text-decoration: line-through; color: #a8adb2; }\n .pri { font-size: 9.5px; font-weight: 700; padding: 2px 8px; border-radius: 5px; flex-shrink: 0; display: inline-flex; align-items: center; gap: 3px; }\n .pri.hi { background: rgba(220,38,38,0.10); color: var(--hi); }\n .pri.med { background: rgba(217,119,6,0.10); color: var(--med); }\n .pri.low { background: rgba(107,114,128,0.12); color: var(--low); }\n .pri .caret { font-size: 8px; opacity: 0.7; }\n\n .note { font-size: 11px; color: #5c6570; background: #f7f8f9; border-radius: 8px; padding: 8px 10px; line-height: 1.5; }\n .note.why { border-left: 3px solid var(--accent); }\n .note.ok { background: var(--green-soft); color: #146b32; border-left: 3px solid var(--green); }\n .caution { display: flex; gap: 6px; font-size: 10.5px; font-weight: 600; padding: 7px 9px; background: var(--amber-soft); color: #8a5a0a; border: 1px solid var(--amber-border); border-radius: 8px; line-height: 1.45; }\n .disclaimer { font-size: 9.5px; color: #a0a4a8; font-style: italic; line-height: 1.45; padding-top: 2px; }\n .footnote { font-size: 10px; color: #8a929c; text-align: center; padding-top: 4px; }\n\n .cta { padding: 9px 10px; background: var(--accent); border-radius: 9px; text-align: center; font-size: 12px; font-weight: 700; color: #fff; }\n .cta.ghost { background: #fff; border: 1.5px solid #d4d8dd; color: #4a525c; }\n .cta-row { display: flex; gap: 8px; }\n .cta-row .cta { flex: 1; }\n\n /* ── Connect / customerAuth ── */\n .connect { text-align: center; padding: 6px 4px; }\n .connect .ci { width: 46px; height: 46px; background: var(--accent); border-radius: 12px; margin: 6px auto 12px; display: flex; align-items: center; justify-content: center; color: #fff; font-size: 22px; font-weight: 800; }\n .connect .ctitle { font-size: 14px; font-weight: 800; color: var(--ink); }\n .scopes { text-align: left; font-size: 10.5px; color: #4a525c; display: flex; flex-direction: column; gap: 6px; margin: 6px 0; }\n .scopes .sc { display: flex; gap: 7px; align-items: flex-start; }\n .scopes .sc .k { color: var(--green); font-weight: 800; min-width: 34px; }\n\n .dest { border: 1.5px solid #e0e3e7; border-radius: 10px; padding: 11px; }\n .dest .dh { font-size: 12px; font-weight: 800; color: var(--ink); margin-bottom: 6px; }\n .dest .dl { font-size: 11px; color: #5c6570; line-height: 1.5; }\n\n .empty { text-align: center; padding: 8px 4px; }\n .empty .ei { width: 44px; height: 44px; background: var(--green); border-radius: 12px; margin: 4px auto 10px; display: flex; align-items: center; justify-content: center; font-size: 22px; }\n .empty .et { font-size: 13px; font-weight: 800; color: var(--ink); }\n\n /* ── Gallery ── */\n .gallery { display: grid; grid-template-columns: repeat(auto-fill, minmax(300px, 1fr)); gap: 22px; }\n .spec-frame { display: flex; flex-direction: column; gap: 8px; }\n .spec-frame .sf-name { font-size: 12px; font-weight: 700; color: var(--ink); }\n .spec-frame .sf-name span { font-weight: 400; color: #8a929c; }\n\n /* ── API appendix ── */\n .api-panel { background: #fff; border: 1px solid #e6e8ec; border-radius: 12px; padding: 18px 22px; margin-bottom: 18px; max-width: 1040px; }\n .api-panel h4 { font-size: 13px; font-weight: 800; color: var(--ink); margin-bottom: 10px; }\n .api-step { display: flex; gap: 10px; align-items: baseline; padding: 7px 0; border-bottom: 1px dashed #eceef1; font-size: 12.5px; }\n .api-step:last-child { border-bottom: none; }\n .api-step .verb { font-family: 'JetBrains Mono', monospace; font-size: 10px; font-weight: 700; color: #fff; background: var(--accent); padding: 2px 7px; border-radius: 4px; flex-shrink: 0; }\n .api-step .verb.read { background: #64748b; }\n .api-step .tname { font-family: 'JetBrains Mono', monospace; font-weight: 700; color: #3d454e; }\n .api-note { font-size: 11px; color: #6b7280; padding: 4px 0 2px 0; line-height: 1.5; }\n\n /* ── Audit table ── */\n .audit-table { width: 100%; border-collapse: collapse; background: #fff; border: 1px solid #e6e8ec; border-radius: 12px; overflow: hidden; font-size: 12.5px; }\n .audit-table th { text-align: left; background: #fafbfc; color: #5c6570; font-weight: 700; font-size: 11px; text-transform: uppercase; letter-spacing: 0.4px; padding: 11px 14px; border-bottom: 1px solid #e6e8ec; }\n .audit-table td { padding: 11px 14px; border-bottom: 1px solid #f0f1f3; vertical-align: top; color: #3d454e; line-height: 1.5; }\n .audit-table tr:last-child td { border-bottom: none; }\n .audit-table .req { font-weight: 700; color: var(--ink); width: 22%; }\n .verdict { font-weight: 800; font-size: 11px; padding: 2px 8px; border-radius: 5px; white-space: nowrap; }\n .verdict.pass { background: var(--green-soft); color: #146b32; }\n .verdict.flag { background: var(--amber-soft); color: #8a5a0a; }\n\n .footer { text-align: center; font-size: 11px; color: #99a1ab; padding: 30px; border-top: 1px solid #e6e8ec; }\n</style>\n</head>\n<body>\n\n<div class=\"page-header\">\n <h1><span class=\"brand\">Acme Tasks</span> × ChatGPT — Two-Way App Wireframes</h1>\n <p>Prepared by Noodle Seed · a two-way (read + write) task manager — capture, prioritize & complete, all in chat · three core flows</p>\n <span class=\"scope\">SCOPE: two-way in chat — Capture · Prioritize · Complete · OFF-APP: one-time scoped account link (customerAuth) only</span>\n</div>\n\n<div class=\"section-nav\">\n <a href=\"#legend\">Legend</a>\n <a href=\"#connect\">First-run · Connect</a>\n <a href=\"#flow\">End-to-End Flow</a>\n <a href=\"#capture\">1 · Capture</a>\n <a href=\"#prioritize\">2 · Prioritize</a>\n <a href=\"#complete\">3 · Complete</a>\n <a href=\"#gallery\">Widget Gallery</a>\n <a href=\"#api\">MCP Tools</a>\n <a href=\"#audit\">Compliance Audit</a>\n</div>\n\n<div class=\"container\">\n\n <!-- LEGEND -->\n <div class=\"section\" id=\"legend\">\n <div class=\"vocab\">\n <div class=\"vocab-item\"><span class=\"vocab-sw accent\"></span> Acme accent — primary CTAs, logo & checks only</div>\n <div class=\"vocab-item\"><span class=\"vocab-sw hi\"></span> high</div>\n <div class=\"vocab-item\"><span class=\"vocab-sw med\"></span> medium</div>\n <div class=\"vocab-item\"><span class=\"vocab-sw low\"></span> low</div>\n <div class=\"vocab-item\"><span class=\"vocab-sw green\"></span> Completed / success</div>\n <div class=\"vocab-item\"><span class=\"vocab-sw ink\"></span> ChatGPT system surface</div>\n <div class=\"vocab-item\"><span class=\"vocab-sw grey\"></span> Off-app (dashed phone → account link only)</div>\n </div>\n <div class=\"rationale\">\n <h4>How to read these wireframes</h4>\n <p>Solid-border phones are the <strong>in-ChatGPT app</strong>. Acme Tasks is a <strong>two-way (read + write) app</strong>, not a discovery funnel: every widget reflects the user's real list, and each action — capture, re-prioritize, complete — is <strong>recorded through a tool call</strong> and confirmed in-chat. The single dashed phone is the <strong>one-time account link</strong> (<span class=\"mono\">customerAuth</span>); there is no transactional off-app step.</p>\n <p>Widgets are built with the Noodle Seed authoring SDK — <span class=\"mono\">tool + view</span> renders <span class=\"mono\">TaskList</span>; <span class=\"mono\">tool + app visibility</span> powers the in-widget re-prioritize. Styling uses host/Noodle Seed semantic tokens via CSS cascade layers; the brand accent (<span class=\"mono\">#7C3AED</span>) is reserved for the logo, checks, primary CTA and <em>high</em> emphasis. Priority uses fixed semantic colors: high red · medium amber · low slate.</p>\n <p><span class=\"r-tag ux\">UX</span> flow rationale <span class=\"r-tag ui\">UI</span> interface rationale <span class=\"r-tag acme\">ACME</span> product-model fit <span class=\"r-tag trust\">TRUST</span> write-safety / grounding guardrail</p>\n </div>\n </div>\n\n <!-- CONNECT -->\n <div class=\"section\" id=\"connect\">\n <span class=\"section-label\">First-run</span>\n <h2 class=\"section-title\">Connect Acme Tasks — scoped, once</h2>\n <p class=\"section-subtitle\">Because the app writes to the user's tasks, the very first interaction is a scoped account connection. It names exactly what the app can read and change, is dismissed forever after, and the original request resumes automatically. <em>(This flagship seeds the list so the flows stay in focus; the connect screen is the production pattern — see <span class=\"mono\">customer-auth</span>.)</em></p>\n <div class=\"rationale\">\n <h4>Why it's built this way</h4>\n <p><span class=\"r-tag trust\">TRUST</span> An app that can complete and re-prioritize your tasks needs unambiguous, plain-language consent — the scope card names read vs. write in the user's words and links the revoke path, rather than burying it in an OAuth redirect.</p>\n <p><span class=\"r-tag acme\">ACME</span> Uses Noodle Seed's <span class=\"mono\">customerAuth</span> end-user OAuth. One connection powers all three flows; the delegated credential is held by the credential broker, never surfaced to the model, the widget, or logs.</p>\n </div>\n <div class=\"phones-row\">\n <div class=\"phone-step\">\n <div class=\"step-label\">Connect prompt</div>\n <div class=\"phone\"><div class=\"phone-notch\"></div><div class=\"phone-screen\">\n <div class=\"chatgpt-header\"><span class=\"model-name\">ChatGPT · Acme Tasks</span><span class=\"dots\">···</span></div>\n <div class=\"msg user\">What's on my plate today?</div>\n <div class=\"msg assistant\">I can pull your live Acme Tasks list — let's connect it first (takes a few seconds).</div>\n <div class=\"wcard\"><div class=\"wcard-body\">\n <div class=\"connect\">\n <div class=\"ci\">✓</div>\n <div class=\"ctitle\">Connect Acme Tasks</div>\n </div>\n <div class=\"scopes\">\n <div class=\"sc\"><span class=\"k\">Read</span><span>your tasks and their priorities</span></div>\n <div class=\"sc\"><span class=\"k\">Write</span><span>add, re-prioritize & complete tasks you ask me to</span></div>\n </div>\n <div class=\"cta\">Connect Acme Tasks</div>\n <div class=\"disclaimer\">Scoped end-user OAuth (customerAuth) · read + write · revoke anytime in Acme Tasks → Settings → Connections.</div>\n </div></div>\n </div></div>\n </div>\n <div class=\"step-arrow\">→</div>\n <div class=\"phone-step\">\n <div class=\"step-label\">Authorize (off-app)</div>\n <div class=\"phone offapp\"><div class=\"phone-notch\"></div><div class=\"phone-screen\">\n <div class=\"browser-header\"><span class=\"lock\">🔒</span><span class=\"url\">tasks.acme.example/oauth/authorize?scope=tasks.read+tasks.write</span></div>\n <div class=\"dest\">\n <div class=\"dh\">Acme Tasks authorization</div>\n <div class=\"dl\">User signs in and approves read + write. Acme redirects back with a token held by the connector, not the model. <strong>Happens once.</strong></div>\n </div>\n <div class=\"note\" style=\"margin-top:8px;\">↩ On return, the original request (\"what's on my plate today?\") resumes automatically — no re-typing.</div>\n </div></div>\n </div>\n <div class=\"step-arrow\">→</div>\n <div class=\"phone-step\">\n <div class=\"step-label\">Connected → request resumes</div>\n <div class=\"phone\"><div class=\"phone-notch\"></div><div class=\"phone-screen\">\n <div class=\"chatgpt-header\"><span class=\"model-name\">ChatGPT · Acme Tasks</span><span class=\"dots\">···</span></div>\n <div class=\"note ok\">✓ Acme Tasks connected — I'll keep it linked for next time.</div>\n <div class=\"tool-call\"><span class=\"icon read\">✓</span><span><span class=\"label\">list_today</span> <span class=\"mono-tool\">{ focus: \"today\" }</span></span></div>\n <div class=\"msg assistant\">Here's today 👇 <span style=\"color:#8a929c;\">(see Flow 2)</span></div>\n </div></div>\n </div>\n </div>\n </div>\n\n <!-- END TO END FLOW -->\n <div class=\"section\" id=\"flow\">\n <span class=\"section-label\">The whole loop</span>\n <h2 class=\"section-title\">End-to-end: read today → capture → re-prioritize → complete</h2>\n <p class=\"section-subtitle\">One connected session touching all three flows. The user reads the grounded list, captures a new task, bumps a priority, and checks work off — never leaving the conversation, every change recorded and confirmed in place.</p>\n <div class=\"phones-row\">\n\n <!-- Step 1 · read -->\n <div class=\"phone-step\">\n <div class=\"step-label\">1 · Read today<small>grounded list</small></div>\n <div class=\"phone\"><div class=\"phone-notch\"></div><div class=\"phone-screen\">\n <div class=\"chatgpt-header\"><span class=\"model-name\">ChatGPT · Acme Tasks</span><span class=\"dots\">···</span></div>\n <div class=\"msg user\">What's on my plate today?</div>\n <div class=\"tool-call\"><span class=\"icon read\">✓</span><span><span class=\"label\">list_today</span></span></div>\n <div class=\"wcard\"><div class=\"wcard-head\"><span class=\"wc-logo\">✓</span><span class=\"wc-title\">Today's tasks · 3 open</span><span class=\"wc-sub\">TaskList</span></div><div class=\"wcard-body\">\n <div class=\"capture\"><span class=\"cinput\">Add a task…</span><span class=\"cadd\">Add</span></div>\n <div class=\"task\"><div class=\"tcheck\"></div><div class=\"ttitle\">Email the vendor about the Q3 quote</div><span class=\"pri hi\">high <span class=\"caret\">▾</span></span></div>\n <div class=\"task\"><div class=\"tcheck\"></div><div class=\"ttitle\">Review the analytics pull request</div><span class=\"pri med\">medium <span class=\"caret\">▾</span></span></div>\n <div class=\"task\"><div class=\"tcheck\"></div><div class=\"ttitle\">Book flights for the team offsite</div><span class=\"pri low\">low <span class=\"caret\">▾</span></span></div>\n <div class=\"footnote\">Two-way in chat: read, capture, re-prioritize, complete.</div>\n </div></div>\n </div></div>\n </div>\n\n <div class=\"step-arrow\">→</div>\n\n <!-- Step 2 · capture -->\n <div class=\"phone-step\">\n <div class=\"step-label\">2 · Capture<small>natural language</small></div>\n <div class=\"phone\"><div class=\"phone-notch\"></div><div class=\"phone-screen\">\n <div class=\"chatgpt-header\"><span class=\"model-name\">ChatGPT · Acme Tasks</span><span class=\"dots\">···</span></div>\n <div class=\"msg user\">Add \"draft the board update\", high priority.</div>\n <div class=\"tool-call\"><span class=\"icon\">✓</span><span><span class=\"label\">add_task</span> <span class=\"mono-tool\">{ title:\"Draft the board update\", priority:\"high\" }</span></span></div>\n <div class=\"wcard\"><div class=\"wcard-head\"><span class=\"wc-logo\">✓</span><span class=\"wc-title\">Today's tasks · 4 open</span><span class=\"wc-sub\">TaskList</span></div><div class=\"wcard-body\">\n <div class=\"task\"><div class=\"tcheck\"></div><div class=\"ttitle\">Draft the board update</div><span class=\"pri hi\">high <span class=\"caret\">▾</span></span></div>\n <div class=\"task\"><div class=\"tcheck\"></div><div class=\"ttitle\">Email the vendor about the Q3 quote</div><span class=\"pri hi\">high <span class=\"caret\">▾</span></span></div>\n <div class=\"task\"><div class=\"tcheck\"></div><div class=\"ttitle\">Review the analytics pull request</div><span class=\"pri med\">medium <span class=\"caret\">▾</span></span></div>\n <div class=\"note ok\">✓ Added \"Draft the board update\" (high).</div>\n </div></div>\n </div></div>\n </div>\n\n <div class=\"step-arrow\">→</div>\n\n <!-- Step 3 · prioritize -->\n <div class=\"phone-step\">\n <div class=\"step-label\">3 · Prioritize<small>in-widget re-order</small></div>\n <div class=\"phone\"><div class=\"phone-notch\"></div><div class=\"phone-screen\">\n <div class=\"chatgpt-header\"><span class=\"model-name\">ChatGPT · Acme Tasks</span><span class=\"dots\">···</span></div>\n <div class=\"msg user\">Bump the PR review to high.</div>\n <div class=\"tool-call\"><span class=\"icon\">✓</span><span><span class=\"label\">set_priority</span> <span class=\"mono-tool\">{ task:\"review_pr\", priority:\"high\" }</span></span></div>\n <div class=\"wcard\"><div class=\"wcard-head\"><span class=\"wc-logo\">✓</span><span class=\"wc-title\">Today's tasks · 4 open</span><span class=\"wc-sub\">TaskList</span></div><div class=\"wcard-body\">\n <div class=\"task\"><div class=\"tcheck\"></div><div class=\"ttitle\">Draft the board update</div><span class=\"pri hi\">high <span class=\"caret\">▾</span></span></div>\n <div class=\"task\"><div class=\"tcheck\"></div><div class=\"ttitle\">Email the vendor about the Q3 quote</div><span class=\"pri hi\">high <span class=\"caret\">▾</span></span></div>\n <div class=\"task\"><div class=\"tcheck\"></div><div class=\"ttitle\">Review the analytics pull request</div><span class=\"pri hi\">high <span class=\"caret\">▾</span></span></div>\n <div class=\"note ok\">✓ Set review_pr to high priority.</div>\n </div></div>\n </div></div>\n </div>\n\n <div class=\"step-arrow\">→</div>\n\n <!-- Step 4 · complete -->\n <div class=\"phone-step\">\n <div class=\"step-label\">4 · Complete<small>checked & confirmed</small></div>\n <div class=\"phone\"><div class=\"phone-notch\"></div><div class=\"phone-screen\">\n <div class=\"chatgpt-header\"><span class=\"model-name\">ChatGPT · Acme Tasks</span><span class=\"dots\">···</span></div>\n <div class=\"msg user\">I finished the vendor email — mark it done.</div>\n <div class=\"tool-call\"><span class=\"icon\">✓</span><span><span class=\"label\">complete_task</span> <span class=\"mono-tool\">{ task:\"email_vendor\", title:\"Email the vendor…\" }</span></span></div>\n <div class=\"wcard\"><div class=\"wcard-head\"><span class=\"wc-logo\">✓</span><span class=\"wc-title\">Today's tasks · 3 open</span><span class=\"wc-sub\">TaskList</span></div><div class=\"wcard-body\">\n <div class=\"task\"><div class=\"tcheck done\">✓</div><div class=\"ttitle done\">Email the vendor about the Q3 quote</div><span class=\"pri hi\">high</span></div>\n <div class=\"task\"><div class=\"tcheck\"></div><div class=\"ttitle\">Draft the board update</div><span class=\"pri hi\">high <span class=\"caret\">▾</span></span></div>\n <div class=\"task\"><div class=\"tcheck\"></div><div class=\"ttitle\">Review the analytics pull request</div><span class=\"pri hi\">high <span class=\"caret\">▾</span></span></div>\n <div class=\"note ok\">✓ Completed \"Email the vendor about the Q3 quote\". 3 left today.</div>\n </div></div>\n </div></div>\n </div>\n\n </div>\n </div>\n\n <!-- FLOW 1 : CAPTURE -->\n <div class=\"section\" id=\"capture\">\n <span class=\"section-label\">Flow 1 · lowest friction</span>\n <h2 class=\"section-title\">Capture — a spoken thought becomes a task, instantly</h2>\n <p class=\"section-subtitle\">The moment a task is mentioned it lands on the list. The model parses the prose into a title and priority, the row appears optimistically, and <span class=\"mono\">add_task</span> records it — no form, no app-switch.</p>\n <div class=\"rationale\">\n <h4>Why it's built this way</h4>\n <p><span class=\"r-tag ux\">UX</span> Capture must be the fastest path in the app — the thought is fragile. \"Add X, high\" is one turn: the model fills <span class=\"mono\">{ title, priority }</span> from natural language, so the user never fills a field by hand.</p>\n <p><span class=\"r-tag ui\">UI</span> The new row renders immediately (optimistic), then the tool call confirms with a spoken-ready status. The capture input lives at the top of <span class=\"mono\">TaskList</span> so keyboard capture and voice capture converge on the same widget.</p>\n <p><span class=\"r-tag trust\">TRUST</span> Priority is the user's: the model may <em>suggest</em> (\"sounds high?\") but sets what the user says, and defaults to <span class=\"mono\">medium</span> when unstated — it never silently ranks work.</p>\n </div>\n <div class=\"phones-row\">\n <div class=\"phone-step\">\n <div class=\"step-label\">Say it</div>\n <div class=\"phone\"><div class=\"phone-notch\"></div><div class=\"phone-screen\">\n <div class=\"chatgpt-header\"><span class=\"model-name\">ChatGPT · Acme Tasks</span><span class=\"dots\">···</span></div>\n <div class=\"msg user\">Remind me to book flights for the team offsite — low priority.</div>\n <div class=\"tool-call\"><span class=\"icon\">✓</span><span><span class=\"label\">add_task</span> <span class=\"mono-tool\">{ title:\"Book flights for the team offsite\", priority:\"low\" }</span></span></div>\n <div class=\"msg assistant\">Added it to today's list at low priority.</div>\n </div></div>\n </div>\n <div class=\"step-arrow\">→</div>\n <div class=\"phone-step\">\n <div class=\"step-label\">Row appears (optimistic + recorded)</div>\n <div class=\"phone\"><div class=\"phone-notch\"></div><div class=\"phone-screen\">\n <div class=\"chatgpt-header\"><span class=\"model-name\">ChatGPT · Acme Tasks</span><span class=\"dots\">···</span></div>\n <div class=\"wcard\"><div class=\"wcard-head\"><span class=\"wc-logo\">✓</span><span class=\"wc-title\">Today's tasks · 3 open</span><span class=\"wc-sub\">TaskList</span></div><div class=\"wcard-body\">\n <div class=\"capture\"><span class=\"cinput typed\">Book flights for the team offsite</span><span class=\"cadd\">Add</span></div>\n <div class=\"task\"><div class=\"tcheck\"></div><div class=\"ttitle\">Email the vendor about the Q3 quote</div><span class=\"pri hi\">high <span class=\"caret\">▾</span></span></div>\n <div class=\"task\"><div class=\"tcheck\"></div><div class=\"ttitle\">Review the analytics pull request</div><span class=\"pri med\">medium <span class=\"caret\">▾</span></span></div>\n <div class=\"task\"><div class=\"tcheck\"></div><div class=\"ttitle\">Book flights for the team offsite</div><span class=\"pri low\">low <span class=\"caret\">▾</span></span></div>\n <div class=\"note ok\">✓ Added \"Book flights for the team offsite\" (low).</div>\n </div></div>\n </div></div>\n </div>\n </div>\n </div>\n\n <!-- FLOW 2 : PRIORITIZE -->\n <div class=\"section\" id=\"prioritize\">\n <span class=\"section-label\">Flow 2 · the hub</span>\n <h2 class=\"section-title\">Prioritize — read the day, then re-order it in place</h2>\n <p class=\"section-subtitle\"><span class=\"mono\">list_today</span> renders the grounded list, highest priority first; the per-row priority control (a <span class=\"mono\">tool + app visibility</span> helper hidden from the model) lets the user re-rank without describing the task twice. This is the widget the other two flows write into.</p>\n <div class=\"rationale\">\n <h4>Why it's built this way</h4>\n <p><span class=\"r-tag ux\">UX</span> \"What's on my plate?\" wants an answer <em>and</em> a next move. The list is grouped high → low so the triager sees the real order at a glance and adjusts with one tap.</p>\n <p><span class=\"r-tag acme\">ACME</span> Re-prioritize is <span class=\"mono\">set_priority</span> as <span class=\"mono\">tool + app visibility</span> — <strong>widget-only</strong>, hidden from the model's tool surface. The model reasons about three tools (list, add, complete); the fourth is pure UI plumbing, keeping the model's choices clean.</p>\n <p><span class=\"r-tag trust\">TRUST</span> The list only ever shows tasks that exist — the app never invents a task or a priority. Every re-rank echoes a confirmation (\"Set review_pr to high priority\").</p>\n </div>\n <div class=\"phones-row\">\n <div class=\"phone-step\">\n <div class=\"step-label\">Grounded read</div>\n <div class=\"phone\"><div class=\"phone-notch\"></div><div class=\"phone-screen\">\n <div class=\"chatgpt-header\"><span class=\"model-name\">ChatGPT · Acme Tasks</span><span class=\"dots\">···</span></div>\n <div class=\"msg user\">What's due today?</div>\n <div class=\"tool-call\"><span class=\"icon read\">✓</span><span><span class=\"label\">list_today</span> <span class=\"mono-tool\">{ focus:\"today\" }</span></span></div>\n <div class=\"wcard\"><div class=\"wcard-head\"><span class=\"wc-logo\">✓</span><span class=\"wc-title\">Today's tasks · 3 open</span><span class=\"wc-sub\">TaskList</span></div><div class=\"wcard-body\">\n <div class=\"task\"><div class=\"tcheck\"></div><div class=\"ttitle\">Email the vendor about the Q3 quote</div><span class=\"pri hi\">high <span class=\"caret\">▾</span></span></div>\n <div class=\"task\"><div class=\"tcheck\"></div><div class=\"ttitle\">Review the analytics pull request</div><span class=\"pri med\">medium <span class=\"caret\">▾</span></span></div>\n <div class=\"task\"><div class=\"tcheck\"></div><div class=\"ttitle\">Book flights for the team offsite</div><span class=\"pri low\">low <span class=\"caret\">▾</span></span></div>\n </div></div>\n </div></div>\n </div>\n <div class=\"step-arrow\">→</div>\n <div class=\"phone-step\">\n <div class=\"step-label\">Re-prioritize (widget-only write)</div>\n <div class=\"phone\"><div class=\"phone-notch\"></div><div class=\"phone-screen\">\n <div class=\"chatgpt-header\"><span class=\"model-name\">ChatGPT · Acme Tasks</span><span class=\"dots\">···</span></div>\n <div class=\"note why\"><strong>Tapping the priority ▾</strong> on \"Review the analytics pull request\" → <span class=\"mono\">high</span>. The list re-orders in place.</div>\n <div class=\"tool-call\"><span class=\"icon\">✓</span><span><span class=\"label\">set_priority</span> <span class=\"mono-tool\">{ task:\"review_pr\", priority:\"high\" }</span></span></div>\n <div class=\"wcard\"><div class=\"wcard-head\"><span class=\"wc-logo\">✓</span><span class=\"wc-title\">Today's tasks · 3 open</span><span class=\"wc-sub\">TaskList</span></div><div class=\"wcard-body\">\n <div class=\"task\"><div class=\"tcheck\"></div><div class=\"ttitle\">Email the vendor about the Q3 quote</div><span class=\"pri hi\">high <span class=\"caret\">▾</span></span></div>\n <div class=\"task\"><div class=\"tcheck\"></div><div class=\"ttitle\">Review the analytics pull request</div><span class=\"pri hi\">high <span class=\"caret\">▾</span></span></div>\n <div class=\"task\"><div class=\"tcheck\"></div><div class=\"ttitle\">Book flights for the team offsite</div><span class=\"pri low\">low <span class=\"caret\">▾</span></span></div>\n <div class=\"note ok\">✓ Set review_pr to high priority.</div>\n </div></div>\n </div></div>\n </div>\n </div>\n </div>\n\n <!-- FLOW 3 : COMPLETE -->\n <div class=\"section\" id=\"complete\">\n <span class=\"section-label\">Flow 3 · the payoff</span>\n <h2 class=\"section-title\">Complete — check it off by voice or tap, confirmed every time</h2>\n <p class=\"section-subtitle\">The satisfaction loop. The user finishes work and closes it out — either by tapping the row's check or by saying \"mark X done\" (<span class=\"mono\">complete_task</span> is model-visible). The row strikes through, the open count drops, and the model narrates what changed.</p>\n <div class=\"rationale\">\n <h4>Why it's built this way</h4>\n <p><span class=\"r-tag ux\">UX</span> Completion is the reward that drives return visits, so it is friction-free two ways: the check in <span class=\"mono\">TaskList</span> and the spoken \"mark X done\". Ending on an all-clear empty state nudges the next capture instead of a dead end.</p>\n <p><span class=\"r-tag trust\">TRUST</span> Completion is never silent: <span class=\"mono\">complete_task</span> returns \"Completed '…'\" plus the remaining count, and the struck-through row is the visible receipt. The model confirms in the same turn.</p>\n <p><span class=\"r-tag acme\">ACME</span> <span class=\"mono\">complete_task</span> is model-visible (unlike re-prioritize) precisely because \"I finished X\" is a natural sentence the user will say — the model must be able to act on it directly.</p>\n </div>\n <div class=\"phones-row\">\n <div class=\"phone-step\">\n <div class=\"step-label\">Complete by voice (write + confirm)</div>\n <div class=\"phone\"><div class=\"phone-notch\"></div><div class=\"phone-screen\">\n <div class=\"chatgpt-header\"><span class=\"model-name\">ChatGPT · Acme Tasks</span><span class=\"dots\">···</span></div>\n <div class=\"msg user\">Done with the vendor email and the PR review.</div>\n <div class=\"tool-call\"><span class=\"icon\">✓</span><span><span class=\"label\">complete_task ×2</span> <span class=\"mono-tool\">email_vendor · review_pr</span></span></div>\n <div class=\"wcard\"><div class=\"wcard-head\"><span class=\"wc-logo\">✓</span><span class=\"wc-title\">Today's tasks · 1 open</span><span class=\"wc-sub\">TaskList</span></div><div class=\"wcard-body\">\n <div class=\"task\"><div class=\"tcheck done\">✓</div><div class=\"ttitle done\">Email the vendor about the Q3 quote</div><span class=\"pri hi\">high</span></div>\n <div class=\"task\"><div class=\"tcheck done\">✓</div><div class=\"ttitle done\">Review the analytics pull request</div><span class=\"pri med\">medium</span></div>\n <div class=\"task\"><div class=\"tcheck\"></div><div class=\"ttitle\">Book flights for the team offsite</div><span class=\"pri low\">low <span class=\"caret\">▾</span></span></div>\n <div class=\"note ok\">✓ Completed 2 tasks. 1 left today.</div>\n </div></div>\n </div></div>\n </div>\n <div class=\"step-arrow\">→</div>\n <div class=\"phone-step\">\n <div class=\"step-label\">All clear (close the loop)</div>\n <div class=\"phone\"><div class=\"phone-notch\"></div><div class=\"phone-screen\">\n <div class=\"chatgpt-header\"><span class=\"model-name\">ChatGPT · Acme Tasks</span><span class=\"dots\">···</span></div>\n <div class=\"msg user\">Booked the flights too — check it off.</div>\n <div class=\"tool-call\"><span class=\"icon\">✓</span><span><span class=\"label\">complete_task · list_today</span></span></div>\n <div class=\"wcard\"><div class=\"wcard-head\"><span class=\"wc-logo\">✓</span><span class=\"wc-title\">Today's tasks · all clear</span><span class=\"wc-sub\">TaskList · empty</span></div><div class=\"wcard-body\">\n <div class=\"empty\"><div class=\"ei\">🎉</div><div class=\"et\">All clear for today</div></div>\n <div class=\"note ok\">Everything on today's list is done — 3/3 completed this session.</div>\n <div class=\"cta-row\"><div class=\"cta\">Capture tomorrow's first task</div></div>\n <div class=\"disclaimer\">Nudges to the next capture instead of leaving the user at a dead end.</div>\n </div></div>\n </div></div>\n </div>\n </div>\n </div>\n\n <!-- WIDGET GALLERY -->\n <div class=\"section\" id=\"gallery\">\n <span class=\"section-label\">Reference</span>\n <h2 class=\"section-title\">Widget gallery</h2>\n <p class=\"section-subtitle\">One widget, <span class=\"mono\">TaskList</span>, across its states. Compliant: system fonts, neutral surfaces, accent reserved for logo/checks/primary CTA/high emphasis; priority in fixed semantic colors (high red · medium amber · low slate).</p>\n <div class=\"gallery\">\n\n <div class=\"spec-frame\">\n <div class=\"sf-name\">TaskList ★ <span>· grounded read (default)</span></div>\n <div class=\"wcard\"><div class=\"wcard-head\"><span class=\"wc-logo\">✓</span><span class=\"wc-title\">Today's tasks · 3 open</span><span class=\"wc-sub\">TaskList</span></div><div class=\"wcard-body\">\n <div class=\"capture\"><span class=\"cinput\">Add a task…</span><span class=\"cadd\">Add</span></div>\n <div class=\"task\"><div class=\"tcheck\"></div><div class=\"ttitle\">Email the vendor about the Q3 quote</div><span class=\"pri hi\">high <span class=\"caret\">▾</span></span></div>\n <div class=\"task\"><div class=\"tcheck\"></div><div class=\"ttitle\">Review the analytics pull request</div><span class=\"pri med\">medium <span class=\"caret\">▾</span></span></div>\n <div class=\"task\"><div class=\"tcheck\"></div><div class=\"ttitle\">Book flights for the team offsite</div><span class=\"pri low\">low <span class=\"caret\">▾</span></span></div>\n </div></div>\n </div>\n\n <div class=\"spec-frame\">\n <div class=\"sf-name\">TaskList <span>· captured (optimistic + recorded)</span></div>\n <div class=\"wcard\"><div class=\"wcard-head\"><span class=\"wc-logo\">✓</span><span class=\"wc-title\">Today's tasks · 4 open</span><span class=\"wc-sub\">TaskList</span></div><div class=\"wcard-body\">\n <div class=\"task\"><div class=\"tcheck\"></div><div class=\"ttitle\">Draft the board update</div><span class=\"pri hi\">high <span class=\"caret\">▾</span></span></div>\n <div class=\"task\"><div class=\"tcheck\"></div><div class=\"ttitle\">Email the vendor about the Q3 quote</div><span class=\"pri hi\">high <span class=\"caret\">▾</span></span></div>\n <div class=\"note ok\">✓ Added \"Draft the board update\" (high).</div>\n </div></div>\n </div>\n\n <div class=\"spec-frame\">\n <div class=\"sf-name\">TaskList <span>· completed (write + confirm)</span></div>\n <div class=\"wcard\"><div class=\"wcard-head\"><span class=\"wc-logo\">✓</span><span class=\"wc-title\">Today's tasks · 2 open</span><span class=\"wc-sub\">TaskList</span></div><div class=\"wcard-body\">\n <div class=\"task\"><div class=\"tcheck done\">✓</div><div class=\"ttitle done\">Email the vendor about the Q3 quote</div><span class=\"pri hi\">high</span></div>\n <div class=\"task\"><div class=\"tcheck\"></div><div class=\"ttitle\">Review the analytics pull request</div><span class=\"pri med\">medium <span class=\"caret\">▾</span></span></div>\n <div class=\"note ok\">✓ Completed \"Email the vendor…\". 2 left.</div>\n </div></div>\n </div>\n\n <div class=\"spec-frame\">\n <div class=\"sf-name\">TaskList <span>· all-clear empty state</span></div>\n <div class=\"wcard\"><div class=\"wcard-head\"><span class=\"wc-logo\">✓</span><span class=\"wc-title\">Today's tasks · all clear</span><span class=\"wc-sub\">TaskList · empty</span></div><div class=\"wcard-body\">\n <div class=\"empty\"><div class=\"ei\">🎉</div><div class=\"et\">All clear for today</div></div>\n <div class=\"cta\">Capture tomorrow's first task</div>\n </div></div>\n </div>\n\n <div class=\"spec-frame\">\n <div class=\"sf-name\">Connect / customerAuth <span>· scoped consent</span></div>\n <div class=\"wcard\"><div class=\"wcard-body\">\n <div class=\"connect\"><div class=\"ci\">✓</div><div class=\"ctitle\">Connect Acme Tasks</div></div>\n <div class=\"scopes\"><div class=\"sc\"><span class=\"k\">R/W</span><span>read tasks & priorities · add, re-prioritize, complete</span></div></div>\n <div class=\"cta\">Connect Acme Tasks</div>\n </div></div>\n </div>\n\n </div>\n </div>\n\n <!-- MCP TOOLS APPENDIX -->\n <div class=\"section\" id=\"api\">\n <span class=\"section-label\">Technical appendix</span>\n <h2 class=\"section-title\">MCP tools & call sequence</h2>\n <p class=\"section-subtitle\">The four tools behind the flows. <span class=\"mono\">list_today</span> is the only widget-opening tool (<span class=\"mono\">tool + view</span>); <span class=\"mono\">set_priority</span> is widget-only (<span class=\"mono\">tool + app visibility</span>, hidden from the model); <span class=\"mono\">add_task</span> and <span class=\"mono\">complete_task</span> are model-visible.</p>\n\n <div class=\"api-panel\">\n <h4>Read & render (Flow 2 · the hub)</h4>\n <div class=\"api-step\"><span class=\"verb read\">READ</span><span><span class=\"tname\">list_today</span> — returns { status, focus, tasks:[{ id, title, priority, done }] } and renders TaskList</span></div>\n <div class=\"api-note\">Input <span class=\"mono\">{ focus:\"today\" }</span>. Read-only annotation; host status copy: invoking \"Loading your tasks…\", invoked \"Tasks ready\". This is the single widget-opening tool — the other flows write into the card it renders.</div>\n </div>\n\n <div class=\"api-panel\">\n <h4>Capture (Flow 1)</h4>\n <div class=\"api-step\"><span class=\"verb\">WRITE</span><span><span class=\"tname\">add_task</span> — returns { status, title, priority }</span></div>\n <div class=\"api-note\">Input <span class=\"mono\">{ title, priority: \"high\"|\"medium\"|\"low\" = \"medium\" }</span>. Model-fillable from prose (\"book flights, low\" → { title, priority:\"low\" }); local non-destructive write. Status is spoken-ready so the model confirms in one turn.</div>\n </div>\n\n <div class=\"api-panel\">\n <h4>Prioritize (Flow 2 helper) & Complete (Flow 3)</h4>\n <div class=\"api-step\"><span class=\"verb\">WRITE</span><span><span class=\"tname\">set_priority</span> — returns { status, task, priority } · tool + app visibility, hidden from the model</span></div>\n <div class=\"api-note\">Input <span class=\"mono\">{ task:id, priority }</span>. Called only by the priority ▾ in TaskList — keeps the model's tool surface to the three it should reason about.</div>\n <div class=\"api-step\"><span class=\"verb\">WRITE</span><span><span class=\"tname\">complete_task</span> — returns { status, task } · model-visible</span></div>\n <div class=\"api-note\">Input <span class=\"mono\">{ task:id, title:\"\" }</span>. Model-visible so \"I finished X\" completes directly; local non-destructive write, confirmed with the remaining count.</div>\n </div>\n </div>\n\n <!-- COMPLIANCE AUDIT -->\n <div class=\"section\" id=\"audit\">\n <span class=\"section-label\">Submission-ready</span>\n <h2 class=\"section-title\">OpenAI Apps SDK Compliance Audit</h2>\n <p class=\"section-subtitle\">Every row cites concrete app behavior. Built with the Noodle Seed authoring SDK and verified with <span class=\"mono\">noodle check --target chatgpt</span>.</p>\n\n <table class=\"audit-table\">\n <thead><tr><th class=\"req\">Requirement</th><th>How Acme Tasks addresses it</th><th>Verdict</th></tr></thead>\n <tbody>\n <tr><td class=\"req\">Conversational value</td><td>Capture parses prose into structured fields (\"book flights for the offsite, low\" → { title, priority:\"low\" }); complete-by-voice (\"I finished the vendor email\") acts directly — actions no tap-only app affords.</td><td><span class=\"verdict pass\">PASS</span></td></tr>\n <tr><td class=\"req\">Beyond base ChatGPT</td><td>Grounded read of the user's real list (never guessed) plus committed writes to the connected account — state the base model cannot hold.</td><td><span class=\"verdict pass\">PASS</span></td></tr>\n <tr><td class=\"req\">Atomic, model-friendly tools</td><td>Four tools, explicit Zod input/output schemas, each returning a spoken-ready status. <span class=\"mono\">list_today</span> / <span class=\"mono\">add_task</span> / <span class=\"mono\">complete_task</span> model-visible; <span class=\"mono\">set_priority</span> widget-only.</td><td><span class=\"verdict pass\">PASS</span></td></tr>\n <tr><td class=\"req\">Helpful UI only</td><td>One widget, <span class=\"mono\">TaskList</span> — visual scanning of a prioritized list plus in-place capture/complete/re-prioritize. No carousel (one list) and no PiP (nothing backgrounded); omissions are deliberate.</td><td><span class=\"verdict pass\">PASS</span></td></tr>\n <tr><td class=\"req\">In-chat task completion</td><td>The whole loop — read, capture, re-prioritize, complete — finishes in chat; there is no handoff. The only off-app step is the one-time account link.</td><td><span class=\"verdict pass\">PASS</span></td></tr>\n <tr><td class=\"req\">Performance & responsiveness</td><td>Optimistic render on capture/complete, then the tool call records; one tool call per user step. Host status copy shown while <span class=\"mono\">list_today</span> loads.</td><td><span class=\"verdict pass\">PASS</span></td></tr>\n <tr><td class=\"req\">Discoverability</td><td>Broad natural triggers: \"remind me to…\", \"what's on my list?\", \"make X high priority\", \"mark X done\". Golden-prompt set & description keywords are a launch workstream.</td><td><span class=\"verdict flag\">PLAN</span></td></tr>\n <tr><td class=\"req\">Design tokens & theming</td><td>Host/Noodle Seed semantic tokens via CSS cascade layers; brand accent (<span class=\"mono\">#7C3AED</span>) restricted to logo, checks, primary CTA & high emphasis. Adapts to host light/dark.</td><td><span class=\"verdict pass\">PASS</span></td></tr>\n <tr><td class=\"req\">System fonts, icons, WCAG AA</td><td>System font stack; single outlined monochrome check icon; contrast on priority chips and CTAs meets AA; no nested scroll (inline card → fullscreen for long lists).</td><td><span class=\"verdict pass\">PASS</span></td></tr>\n <tr><td class=\"req\">≤2 primary actions on inline card</td><td>Two primaries — capture <strong>Add</strong> and the per-row <strong>complete</strong> check; re-prioritize is a lightweight inline control, not a CTA.</td><td><span class=\"verdict pass\">PASS</span></td></tr>\n <tr><td class=\"req\">Write safety (domain guardrail)</td><td>No silent mutation: capture, re-prioritize & complete each return a confirmation and update the widget. Completion always states the remaining count. Priority is the user's — the model suggests, never silently re-ranks.</td><td><span class=\"verdict pass\">PASS</span></td></tr>\n <tr><td class=\"req\">Grounding (domain guardrail)</td><td>The list only shows tasks that exist in state; the app never invents a task. A production deployment reads from the connected account, not the model's memory.</td><td><span class=\"verdict pass\">PASS</span></td></tr>\n <tr><td class=\"req\">Scoped account auth & secrets</td><td>Scoped <span class=\"mono\">customerAuth</span> (read + write), connected once, revocable. Delegated credential held by the credential broker — never in tool payloads, the widget, or logs.</td><td><span class=\"verdict pass\">PASS</span></td></tr>\n </tbody>\n </table>\n </div>\n\n</div>\n\n<div class=\"footer\">\n Acme Tasks × ChatGPT — Two-Way App Wireframes · Noodle Seed · v1 · July 2026<br>\n Illustrative wireframes for a fictional app. Built with the Noodle Seed authoring SDK (tool + view / tool + app visibility · customerAuth). This flagship seeds the task list; a production deployment connects the user's account. Task data shown is sample content.\n</div>\n\n</body>\n</html>\n" },
|
|
44
44
|
{ relPath: "examples/acme-tasks/noodle.json", content: "{\n \"entrypoint\": \"src/server.ts\",\n \"name\": \"acme-tasks\",\n \"template\": \"widget\"\n}\n" },
|
|
45
45
|
{ relPath: "examples/acme-tasks/package.json", content: "{\n \"name\": \"acme-tasks\",\n \"version\": \"0.1.0\",\n \"private\": true,\n \"type\": \"module\",\n \"scripts\": {\n \"test\": \"vitest run\",\n \"validate\": \"noodle validate\",\n \"dev\": \"noodle dev\",\n \"deploy\": \"noodle deploy\"\n },\n \"devDependencies\": {\n \"@vitejs/plugin-react\": \"latest\",\n \"@noodleseed/one\": \"latest\",\n \"react\": \"latest\",\n \"react-dom\": \"latest\",\n \"vite\": \"latest\",\n \"vitest\": \"latest\"\n }\n}\n" },
|
|
46
|
+
{ relPath: "examples/acme-tasks/src/agent-guide.ts", content: "import type { AgentGuideSource } from '@noodleseed/one';\n\n/** Product guidance is authored once for the full Acme Tasks MCP surface. */\nexport const ACME_TASKS_AGENT_GUIDE = {\n description: 'Use Acme Tasks to review, capture, prioritize, and complete the team task list.',\n useWhen: [\n 'The user asks about their Acme work items.',\n 'The user wants to capture or finish an Acme task.',\n ],\n workflows: [\n {\n id: 'review_tasks',\n title: 'Review today’s tasks',\n intent: 'Ground the task list before taking action.',\n steps: [\n { capability: { kind: 'tool', name: 'list_today' } },\n {\n capability: { kind: 'tool', name: 'set_priority' },\n guidance: 'Use only from the task-list app when reprioritizing.',\n },\n ],\n },\n {\n id: 'capture_task',\n title: 'Capture a task',\n steps: [\n {\n capability: { kind: 'tool', name: 'add_task' },\n guidance: 'Ground the new task title and priority exactly.',\n },\n ],\n },\n {\n id: 'complete_task',\n title: 'Complete a task',\n steps: [\n {\n capability: { kind: 'tool', name: 'complete_task' },\n guidance: 'Confirm the exact grounded task with the user before completion.',\n },\n ],\n },\n ],\n boundaries: [\n 'Never invent a task identifier.',\n 'Ground writes in the exact task and confirm completion with the user.',\n ],\n examples: [\n { prompt: 'What should I do today?', workflow: 'review_tasks' },\n { prompt: 'Add a follow-up with the vendor.', workflow: 'capture_task' },\n { prompt: 'Finish the vendor follow-up.', workflow: 'complete_task' },\n ],\n} as const satisfies AgentGuideSource;\n" },
|
|
46
47
|
{ relPath: "examples/acme-tasks/src/helpers.ts", content: "import type { ServerDefinition } from '@noodleseed/one';\nimport { generateHelpers } from '@noodleseed/one/react';\n\nexport type AppType = ServerDefinition;\n\nexport const { useCallTool, useLayout, useToolInfo, useViewState } = generateHelpers<AppType>();\n" },
|
|
47
|
-
{ relPath: "examples/acme-tasks/src/server.ts", content: "import { annotations, server, tool, z } from '@noodleseed/one';\n\n// Acme Tasks is a fictional productivity app. It is a two-way (read + write) experience rather than a\n// top-of-funnel handoff: the top-3 prioritized user flows all complete in chat — Capture, Prioritize,\n// and Complete. It is the flagship for designing an app around its prioritized flows (see the README).\n//\n// Authoring notes:\n// - A tool `fulfil` is *recorded*, not run as live JS. Place inputs directly into an output string as\n// `${input.x}` so they substitute at runtime; do not transform them (no arithmetic/filter on inputs).\n// The seed list below is static data the runtime returns verbatim — the \"today\" view.\n// - A real deployment would connect the user's account with the end-user auth pattern (see the\n// `customer-auth` example); this example keeps a seeded list so the focus stays on the flows.\n\nconst today = [\n {\n id: 'email_vendor',\n title: 'Email the vendor about the Q3 quote',\n priority: 'high',\n done: false,\n },\n { id: 'review_pr', title: 'Review the analytics pull request', priority: 'medium', done: false },\n { id: 'book_offsite', title: 'Book flights for the team offsite', priority: 'low', done: false },\n] as const;\n\nconst priority = z.enum(['high', 'medium', 'low']);\n\n// Tool annotations for host planners: listing is read-only; capture/complete/re-prioritize are local\n// non-destructive writes.\nconst readOnly = annotations.readOnly();\nconst localWrite = annotations.localAction({ destructive: false });\nconst confirmedWrite = annotations.localAction({ destructive: false, confirm: true });\nconst widgetWrite = annotations.localAction({ destructive: false, confirm: false });\n\nconst taskOutput = z.object({\n id: z.string(),\n title: z.string(),\n priority,\n done: z.boolean(),\n});\n\nexport default server(\n 'acme_tasks',\n {\n title: 'Acme Tasks',\n version: '1.0.0',\n // ChatGPT's stateless MCP lane cannot carry Noodle's standard confirmation form. Keep\n // confirm:true for capable/embedded hosts, but explicitly trust native host approval there.\n interactions: { confirmationFallback: 'host' },\n branding: {\n name: 'Acme Tasks',\n accent: '#7C3AED',\n surface: '#F5F3FF',\n surfaceDark: '#161228',\n radius: 'lg',\n density: 'comfortable',\n },\n },\n [\n // Flow 2 — Prioritize / Today: render the list so the human triages and the model can speak to it.\n tool('list_today', {\n title: 'Show today’s tasks',\n description: 'Show today’s Acme Tasks and render the task-list widget.',\n annotations: readOnly,\n input: z.object({ focus: z.string().default('today') }),\n // Bound the list output. A recorded `fulfil` cannot slice an array, so the honest bound here is\n // a cap on the shape itself; a connector-backed list takes a pagination input instead (see the\n // `weather` example). `noodle check` reports an unbounded array as `tool_design_output_bounds`.\n output: z.object({\n status: z.string(),\n focus: z.string(),\n tasks: z.array(taskOutput).max(20),\n }),\n fulfil: ({ input }) => ({\n status: `Acme Tasks for ${input.focus}: ${today.length} open items, highest priority first.`,\n focus: input.focus,\n tasks: today,\n }),\n viewTitle: 'Today’s tasks',\n viewDescription: 'A prioritized task list: capture, re-prioritize, and complete in place.',\n // ChatGPT host status copy (openai/toolInvocation/*) — required for widget-opening tools.\n invoking: 'Loading your tasks…',\n invoked: 'Tasks ready',\n domain: 'https://tasks.acme.example',\n view: {\n component: 'task-list',\n entry: './views/task-list.tsx',\n },\n csp: {\n connectDomains: ['https://acme.example'],\n resourceDomains: ['https://acme.example'],\n frameDomains: ['https://acme.example'],\n },\n }),\n // Flow 1 — Capture: add a task from natural language (\"remind me to email the vendor\").\n tool('add_task', {\n title: 'Add a task',\n description: 'Capture a new Acme task with a title and priority.',\n annotations: localWrite,\n input: z.object({\n title: z.string().meta({ title: 'Task' }),\n priority: priority.default('medium').meta({ title: 'Priority' }),\n }),\n output: z.object({\n status: z.string(),\n title: z.string(),\n priority,\n }),\n fulfil: ({ input }) => ({\n status: `Added “${input.title}” (${input.priority}).`,\n title: input.title,\n priority: input.priority,\n }),\n }),\n // Flow 3 — Complete: mark a task done. Model-visible so the model can complete on request.\n tool('complete_task', {\n title: 'Complete task',\n description: 'This will mark the selected task complete for everyone using Acme Tasks.',\n annotations: confirmedWrite,\n input: z.object({\n task: z.string().meta({ title: 'Task ID' }),\n title: z.string().min(1).meta({ title: 'Task' }),\n }),\n output: z.object({\n status: z.string(),\n task: z.string(),\n }),\n fulfil: ({ input }) => ({\n status: `Completed “${input.title}”.`,\n task: input.task,\n }),\n }),\n // Flow 2 helper (widget-only): re-prioritize a task from the list widget.\n tool('set_priority', {\n title: 'Change task priority',\n visibility: ['app'],\n description: 'Re-prioritize a task from the list widget.',\n annotations: widgetWrite,\n input: z.object({\n task: z.string().meta({ title: 'Task ID' }),\n priority: priority.meta({ title: 'New priority' }),\n }),\n output: z.object({\n status: z.string(),\n task: z.string(),\n priority,\n }),\n fulfil: ({ input }) => ({\n status: `Set ${input.task} to ${input.priority} priority.`,\n task: input.task,\n priority: input.priority,\n }),\n }),\n ],\n);\n" },
|
|
48
|
+
{ relPath: "examples/acme-tasks/src/server.ts", content: "import { annotations, server, tool, z } from '@noodleseed/one';\nimport { ACME_TASKS_AGENT_GUIDE } from './agent-guide.js';\n\n// Acme Tasks is a fictional productivity app. It is a two-way (read + write) experience rather than a\n// top-of-funnel handoff: the top-3 prioritized user flows all complete in chat — Capture, Prioritize,\n// and Complete. It is the flagship for designing an app around its prioritized flows (see the README).\n//\n// Authoring notes:\n// - A tool `fulfil` is *recorded*, not run as live JS. Place inputs directly into an output string as\n// `${input.x}` so they substitute at runtime; do not transform them (no arithmetic/filter on inputs).\n// The seed list below is static data the runtime returns verbatim — the \"today\" view.\n// - A real deployment would connect the user's account with the end-user auth pattern (see the\n// `customer-auth` example); this example keeps a seeded list so the focus stays on the flows.\n\nconst today = [\n {\n id: 'email_vendor',\n title: 'Email the vendor about the Q3 quote',\n priority: 'high',\n done: false,\n },\n { id: 'review_pr', title: 'Review the analytics pull request', priority: 'medium', done: false },\n { id: 'book_offsite', title: 'Book flights for the team offsite', priority: 'low', done: false },\n] as const;\n\nconst priority = z.enum(['high', 'medium', 'low']);\n\n// Tool annotations for host planners: listing is read-only; capture/complete/re-prioritize are local\n// non-destructive writes.\nconst readOnly = annotations.readOnly();\nconst localWrite = annotations.localAction({ destructive: false });\nconst confirmedWrite = annotations.localAction({ destructive: false, confirm: true });\nconst widgetWrite = annotations.localAction({ destructive: false, confirm: false });\n\nconst taskOutput = z.object({\n id: z.string(),\n title: z.string(),\n priority,\n done: z.boolean(),\n});\n\nexport default server(\n 'acme_tasks',\n {\n title: 'Acme Tasks',\n version: '1.0.0',\n agentGuide: ACME_TASKS_AGENT_GUIDE,\n // ChatGPT's stateless MCP lane cannot carry Noodle's standard confirmation form. Keep\n // confirm:true for capable/embedded hosts, but explicitly trust native host approval there.\n interactions: { confirmationFallback: 'host' },\n branding: {\n name: 'Acme Tasks',\n accent: '#7C3AED',\n surface: '#F5F3FF',\n surfaceDark: '#161228',\n radius: 'lg',\n density: 'comfortable',\n },\n },\n [\n // Flow 2 — Prioritize / Today: render the list so the human triages and the model can speak to it.\n tool('list_today', {\n title: 'Show today’s tasks',\n description: 'Show today’s Acme Tasks and render the task-list widget.',\n annotations: readOnly,\n input: z.object({ focus: z.string().default('today') }),\n // Bound the list output. A recorded `fulfil` cannot slice an array, so the honest bound here is\n // a cap on the shape itself; a connector-backed list takes a pagination input instead (see the\n // `weather` example). `noodle check` reports an unbounded array as `tool_design_output_bounds`.\n output: z.object({\n status: z.string(),\n focus: z.string(),\n tasks: z.array(taskOutput).max(20),\n }),\n fulfil: ({ input }) => ({\n status: `Acme Tasks for ${input.focus}: ${today.length} open items, highest priority first.`,\n focus: input.focus,\n tasks: today,\n }),\n viewTitle: 'Today’s tasks',\n viewDescription: 'A prioritized task list: capture, re-prioritize, and complete in place.',\n // ChatGPT host status copy (openai/toolInvocation/*) — required for widget-opening tools.\n invoking: 'Loading your tasks…',\n invoked: 'Tasks ready',\n domain: 'https://tasks.acme.example',\n view: {\n component: 'task-list',\n entry: './views/task-list.tsx',\n },\n csp: {\n connectDomains: ['https://acme.example'],\n resourceDomains: ['https://acme.example'],\n frameDomains: ['https://acme.example'],\n },\n }),\n // Flow 1 — Capture: add a task from natural language (\"remind me to email the vendor\").\n tool('add_task', {\n title: 'Add a task',\n description: 'Capture a new Acme task with a title and priority.',\n annotations: localWrite,\n input: z.object({\n title: z.string().meta({ title: 'Task' }),\n priority: priority.default('medium').meta({ title: 'Priority' }),\n }),\n output: z.object({\n status: z.string(),\n title: z.string(),\n priority,\n }),\n fulfil: ({ input }) => ({\n status: `Added “${input.title}” (${input.priority}).`,\n title: input.title,\n priority: input.priority,\n }),\n }),\n // Flow 3 — Complete: mark a task done. Model-visible so the model can complete on request.\n tool('complete_task', {\n title: 'Complete task',\n description: 'This will mark the selected task complete for everyone using Acme Tasks.',\n annotations: confirmedWrite,\n input: z.object({\n task: z.string().meta({ title: 'Task ID' }),\n title: z.string().min(1).meta({ title: 'Task' }),\n }),\n output: z.object({\n status: z.string(),\n task: z.string(),\n }),\n fulfil: ({ input }) => ({\n status: `Completed “${input.title}”.`,\n task: input.task,\n }),\n }),\n // Flow 2 helper (widget-only): re-prioritize a task from the list widget.\n tool('set_priority', {\n title: 'Change task priority',\n visibility: ['app'],\n description: 'Re-prioritize a task from the list widget.',\n annotations: widgetWrite,\n input: z.object({\n task: z.string().meta({ title: 'Task ID' }),\n priority: priority.meta({ title: 'New priority' }),\n }),\n output: z.object({\n status: z.string(),\n task: z.string(),\n priority,\n }),\n fulfil: ({ input }) => ({\n status: `Set ${input.task} to ${input.priority} priority.`,\n task: input.task,\n priority: input.priority,\n }),\n }),\n ],\n);\n" },
|
|
48
49
|
{ relPath: "examples/acme-tasks/src/views/task-list.tsx", content: "import { useState } from 'react';\nimport { useCallTool, useLayout, useToolInfo, useViewState } from '../helpers.js';\nimport './widget-style.css';\n\ntype Priority = 'high' | 'medium' | 'low';\n\ntype Task = {\n readonly id: string;\n readonly title: string;\n readonly priority: Priority;\n readonly done: boolean;\n};\n\nconst PRIORITIES: readonly Priority[] = ['high', 'medium', 'low'];\n\nfunction asToday(value: unknown) {\n return value as { readonly status?: string; readonly tasks?: readonly Task[] } | undefined;\n}\n\nexport default function TaskList() {\n const { displayMode, theme } = useLayout();\n const today = asToday(useToolInfo('list_today').structuredContent);\n const addTask = useCallTool('add_task');\n const completeTask = useCallTool('complete_task');\n const setPriorityTool = useCallTool('set_priority');\n\n const seeded = today?.tasks ?? [];\n // Local, session-scoped state layered over the seeded list — the three flows write here and record\n // the change through a tool call. Captured tasks live in `added` so the list updates in place.\n const [added, setAdded] = useState<readonly Task[]>([]);\n const [done, setDone] = useState<readonly string[]>([]);\n const [priority, setPriority] = useState<Record<string, Priority>>({});\n const [draft, setDraft] = useViewState('draft', '');\n const [status, setStatus] = useState(today?.status ?? 'Capture, prioritize, and complete.');\n\n const tasks: readonly Task[] = [...seeded, ...added];\n const openCount = tasks.filter((task) => !done.includes(task.id)).length;\n\n // Each flow updates local state optimistically, then records the change through a tool call. If the\n // call fails, revert the optimistic change and surface a failure message instead of a false success.\n async function capture() {\n const title = draft.trim();\n if (title.length === 0) return;\n const id = `added_${added.length}`;\n setAdded((current) => [...current, { id, title, priority: 'medium', done: false }]);\n setDraft('');\n try {\n const result = await addTask.callTool({ title, priority: 'medium' });\n const structured = result.structuredContent as { readonly status?: string } | undefined;\n setStatus(structured?.status ?? `Added “${title}”.`);\n } catch {\n setAdded((current) => current.filter((task) => task.id !== id));\n setStatus(`Couldn't add “${title}” — try again.`);\n }\n }\n\n async function reprioritize(task: Task, next: Priority) {\n const prev = priority[task.id];\n setPriority((current) => ({ ...current, [task.id]: next }));\n try {\n const result = await setPriorityTool.callTool({ task: task.id, priority: next });\n const structured = result.structuredContent as { readonly status?: string } | undefined;\n setStatus(structured?.status ?? `Set ${task.title} to ${next}.`);\n } catch {\n setPriority((current) => {\n const restored = { ...current };\n if (prev === undefined) delete restored[task.id];\n else restored[task.id] = prev;\n return restored;\n });\n setStatus(`Couldn't re-prioritize ${task.title} — try again.`);\n }\n }\n\n async function complete(task: Task) {\n setDone((current) => [...current, task.id]);\n try {\n const result = await completeTask.callTool({ task: task.id, title: task.title });\n const structured = result.structuredContent as { readonly status?: string } | undefined;\n setStatus(structured?.status ?? `Completed “${task.title}”.`);\n } catch {\n setDone((current) => current.filter((id) => id !== task.id));\n setStatus(`Couldn't complete “${task.title}” — try again.`);\n }\n }\n\n return (\n <main\n className={`nw-shell${theme === 'dark' ? ' dark' : ''}`}\n data-llm={`Acme Tasks: ${openCount} open of ${tasks.length}; ${done.length} completed this session`}\n >\n <section className=\"nw-card\">\n <header className=\"nw-header\">\n <span className=\"nw-icon\" aria-hidden=\"true\">\n <CheckIcon />\n </span>\n <div className=\"nw-title-block\">\n <h1 className=\"nw-title\">Acme Tasks</h1>\n <p className=\"nw-subtitle\" aria-live=\"polite\">\n {status}\n </p>\n </div>\n <span className=\"nw-chip\">\n {displayMode === 'fullscreen' ? 'Fullscreen' : `${openCount} open`}\n </span>\n </header>\n\n {/* Flow 1 — Capture */}\n <div className=\"nw-capture\">\n <input\n className=\"nw-input\"\n placeholder=\"Add a task…\"\n value={draft}\n onChange={(event) => setDraft(event.currentTarget.value)}\n onKeyDown={(event) => {\n if (event.key === 'Enter') capture();\n }}\n />\n <button\n className=\"nw-button nw-button-primary\"\n type=\"button\"\n disabled={addTask.isPending}\n onClick={capture}\n >\n Add\n </button>\n </div>\n\n {/* Flow 2 — Prioritize, Flow 3 — Complete */}\n <ul className=\"nw-list\">\n {tasks.map((task) => {\n const isDone = done.includes(task.id);\n const level = priority[task.id] ?? task.priority;\n return (\n <li className={`nw-task${isDone ? ' nw-task-done' : ''}`} key={task.id}>\n <button\n aria-label={isDone ? 'Completed' : 'Complete task'}\n className={`nw-check${isDone ? ' nw-check-on' : ''}`}\n type=\"button\"\n disabled={isDone}\n onClick={() => complete(task)}\n >\n {isDone ? '✓' : ''}\n </button>\n <span className=\"nw-task-title\">{task.title}</span>\n <select\n aria-label=\"Priority\"\n className={`nw-priority nw-priority-${level}`}\n value={level}\n disabled={isDone}\n onChange={(event) => reprioritize(task, event.currentTarget.value as Priority)}\n >\n {PRIORITIES.map((entry) => (\n <option key={entry} value={entry}>\n {entry}\n </option>\n ))}\n </select>\n </li>\n );\n })}\n </ul>\n <p className=\"nw-note\">\n Two-way in chat: read your list, capture, re-prioritize, and complete.\n </p>\n </section>\n </main>\n );\n}\n\nfunction CheckIcon() {\n return (\n <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\">\n <path d=\"M4 12.5 9 17l11-11\" />\n </svg>\n );\n}\n" },
|
|
49
50
|
{ relPath: "examples/acme-tasks/src/views/widget-style.css", content: ":root {\n color-scheme: light dark;\n font-family:\n Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", sans-serif;\n --nw-bg: #ffffff;\n --nw-surface: #f7f5ff;\n --nw-text: #1c1830;\n --nw-muted: #635d80;\n --nw-border: #e2ddf5;\n --nw-accent: #7c3aed;\n --nw-accent-strong: #6d28d9;\n --nw-accent-soft: #efe9ff;\n --nw-high: #dc2626;\n --nw-medium: #b45309;\n --nw-low: #2563eb;\n --nw-radius: 10px;\n --nw-shadow: 0 18px 50px rgb(30 20 60 / 12%);\n}\n\n.dark,\n[data-theme=\"dark\"] {\n --nw-bg: #161228;\n --nw-surface: #1d1735;\n --nw-text: #f2eeff;\n --nw-muted: #a99fce;\n --nw-border: #342a54;\n --nw-accent: #a78bfa;\n --nw-accent-strong: #8b5cf6;\n --nw-accent-soft: #2a2148;\n --nw-high: #f87171;\n --nw-medium: #fbbf24;\n --nw-low: #60a5fa;\n --nw-shadow: 0 18px 50px rgb(0 0 0 / 32%);\n}\n\n* {\n box-sizing: border-box;\n}\n\nbody {\n margin: 0;\n background: var(--nw-bg);\n color: var(--nw-text);\n}\n\nbutton,\ninput,\nselect {\n font: inherit;\n}\n\n.nw-shell {\n min-height: 100vh;\n padding: 14px;\n background: var(--nw-bg);\n color: var(--nw-text);\n}\n\n.nw-card {\n max-width: 620px;\n margin: 0 auto;\n background: var(--nw-surface);\n border: 1px solid var(--nw-border);\n border-radius: var(--nw-radius);\n box-shadow: var(--nw-shadow);\n overflow: hidden;\n}\n\n.nw-header {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 16px;\n border-bottom: 1px solid var(--nw-border);\n}\n\n.nw-icon svg {\n width: 24px;\n height: 24px;\n fill: none;\n stroke: var(--nw-accent);\n stroke-width: 2;\n stroke-linecap: round;\n stroke-linejoin: round;\n}\n\n.nw-title-block {\n flex: 1;\n min-width: 0;\n}\n\n.nw-title {\n margin: 0;\n font-size: 17px;\n font-weight: 700;\n}\n\n.nw-subtitle {\n margin: 2px 0 0;\n font-size: 13px;\n color: var(--nw-muted);\n}\n\n.nw-chip {\n padding: 4px 10px;\n border-radius: 999px;\n background: var(--nw-accent-soft);\n color: var(--nw-accent-strong);\n font-size: 12px;\n font-weight: 600;\n}\n\n.nw-capture {\n display: flex;\n gap: 8px;\n padding: 14px 16px 4px;\n}\n\n.nw-input {\n flex: 1;\n padding: 9px 12px;\n border: 1px solid var(--nw-border);\n border-radius: 10px;\n background: var(--nw-bg);\n color: var(--nw-text);\n}\n\n.nw-button {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 9px 14px;\n border: 1px solid var(--nw-border);\n border-radius: 10px;\n background: var(--nw-bg);\n color: var(--nw-text);\n cursor: pointer;\n}\n\n.nw-button-primary {\n background: var(--nw-accent);\n border-color: var(--nw-accent);\n color: #ffffff;\n font-weight: 600;\n}\n\n.nw-button-primary:disabled {\n opacity: 0.6;\n cursor: default;\n}\n\n.nw-list {\n list-style: none;\n margin: 0;\n padding: 8px 16px 4px;\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n.nw-task {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 10px 12px;\n border: 1px solid var(--nw-border);\n border-radius: 12px;\n background: var(--nw-bg);\n}\n\n.nw-task-title {\n flex: 1;\n min-width: 0;\n}\n\n.nw-task-done {\n opacity: 0.55;\n}\n\n.nw-task-done .nw-task-title {\n text-decoration: line-through;\n}\n\n.nw-check {\n width: 22px;\n height: 22px;\n border: 1.5px solid var(--nw-border);\n border-radius: 999px;\n background: transparent;\n color: #ffffff;\n cursor: pointer;\n flex: none;\n}\n\n.nw-check-on {\n background: var(--nw-accent);\n border-color: var(--nw-accent);\n}\n\n.nw-priority {\n padding: 5px 8px;\n border: 1px solid var(--nw-border);\n border-radius: 8px;\n background: var(--nw-bg);\n color: var(--nw-text);\n font-size: 12px;\n font-weight: 600;\n}\n\n.nw-priority-high {\n color: var(--nw-high);\n}\n\n.nw-priority-medium {\n color: var(--nw-medium);\n}\n\n.nw-priority-low {\n color: var(--nw-low);\n}\n\n.nw-note {\n margin: 0;\n padding: 8px 16px 16px;\n font-size: 12px;\n color: var(--nw-muted);\n}\n" },
|
|
50
|
-
{ relPath: "examples/acme-tasks/test/server.test.ts", content: "import { describe, expect, it } from 'vitest';\nimport app from '../src/server.js';\n\ndescribe('acme-tasks example', () => {\n it('exports a Noodle server definition', () => {\n expect(typeof app.toManifest).toBe('function');\n });\n\n it('exposes a tool for each of the top-3 prioritized flows', async () => {\n // Capture → add_task, Prioritize → list_today (+ set_priority helper), Complete → complete_task.\n const text = JSON.stringify(await app.toManifest());\n expect(text).toContain('add_task');\n expect(text).toContain('list_today');\n expect(text).toContain('complete_task');\n expect(text).toContain('set_priority');\n });\n\n it('seeds today’s list highest-priority first', async () => {\n const text = JSON.stringify(await app.toManifest());\n expect(text).toMatch(/\"tasks\":\\[\\{\"id\":\"email_vendor\".*\"priority\":\"high\"/);\n });\n\n it('opts the conversational completion action into runtime confirmation', async () => {\n const manifest = await app.toManifest();\n const completeTask = manifest.tools.find((candidate) => candidate.name === 'complete_task');\n const addTask = manifest.tools.find((candidate) => candidate.name === 'add_task');\n\n expect(completeTask?.annotations?.confirm).toBe(true);\n expect(addTask?.annotations).not.toHaveProperty('confirm');\n });\n});\n" },
|
|
51
|
+
{ relPath: "examples/acme-tasks/test/server.test.ts", content: "import { describe, expect, it } from 'vitest';\nimport app from '../src/server.js';\n\ndescribe('acme-tasks example', () => {\n it('exports a Noodle server definition', () => {\n expect(typeof app.toManifest).toBe('function');\n });\n\n it('exposes a tool for each of the top-3 prioritized flows', async () => {\n // Capture → add_task, Prioritize → list_today (+ set_priority helper), Complete → complete_task.\n const text = JSON.stringify(await app.toManifest());\n expect(text).toContain('add_task');\n expect(text).toContain('list_today');\n expect(text).toContain('complete_task');\n expect(text).toContain('set_priority');\n });\n\n it('seeds today’s list highest-priority first', async () => {\n const text = JSON.stringify(await app.toManifest());\n expect(text).toMatch(/\"tasks\":\\[\\{\"id\":\"email_vendor\".*\"priority\":\"high\"/);\n });\n\n it('opts the conversational completion action into runtime confirmation', async () => {\n const manifest = await app.toManifest();\n const completeTask = manifest.tools.find((candidate) => candidate.name === 'complete_task');\n const addTask = manifest.tools.find((candidate) => candidate.name === 'add_task');\n const setPriority = manifest.tools.find((candidate) => candidate.name === 'set_priority');\n\n expect(completeTask?.annotations?.confirm).toBe(true);\n expect(addTask?.annotations).not.toHaveProperty('confirm');\n expect(setPriority?.visibility).toEqual(['app']);\n });\n\n it('teaches its three product workflows through one host-neutral agent guide', async () => {\n const manifest = await app.toManifest();\n const guide = manifest.server.agentGuide;\n\n expect(guide?.workflows.map((workflow) => workflow.id)).toEqual([\n 'review_tasks',\n 'capture_task',\n 'complete_task',\n ]);\n expect(\n guide?.workflows.flatMap((workflow) => workflow.steps.map((step) => step.capability.name)),\n ).toEqual(expect.arrayContaining(['list_today', 'set_priority', 'add_task', 'complete_task']));\n expect(\n guide?.workflows\n .find((workflow) => workflow.id === 'review_tasks')\n ?.steps.map((step) => step.capability.name),\n ).toContain('set_priority');\n expect(\n guide?.examples.every((example) =>\n guide.workflows.some((workflow) => workflow.id === example.workflow),\n ),\n ).toBe(true);\n expect(guide?.boundaries.some((boundary) => boundary.toLowerCase().includes('confirm'))).toBe(\n true,\n );\n });\n});\n" },
|
|
51
52
|
{ relPath: "examples/acme-tasks/vitest.config.ts", content: "import { defineConfig } from 'vitest/config';\n\n// Local config so `npm test` (vitest run) discovers this example's own tests instead of inheriting a\n// parent monorepo config's include globs.\nexport default defineConfig({\n test: { include: ['test/**/*.test.ts'] },\n});\n" },
|
|
52
53
|
{ relPath: "examples/customer-auth/README.md", content: "# Customer Auth - OIDC identity and customer-routed APIs\n\nThis curated example owns the customer/end-user authentication capability slot. It proves that a SaaS app\ncan protect an MCP endpoint with direct OIDC, retain role/scope-based tool authorization, and route ordinary\nreads and confirmed actions to the API origin selected by the verified customer's identity provider.\n\nIt also owns the customer-branded embedded-assistant presentation showcase. Direct MCP calls obtain the\nroute from the verified OIDC claim; embedded sessions obtain it from the authenticated customer backend's\nsession exchange. Both paths keep the URL outside tool/model/browser-visible state.\n\nThe public developer entrypoint is [`src/server.ts`](src/server.ts). It exposes a deliberately small MCP\nsurface for organization discovery and app lifecycle operations:\n\n- `list_my_organizations` lists the NoodleSeed.com organizations the signed-in customer belongs to (no\n arguments — the org set comes from the verified customer session).\n- `list_org_apps` lists apps for one of those organizations through that tenant's API. It is visible and\n callable only when the verified customer has the `org_apps:read` scope and either the `org_admin` or\n `org_member` role.\n- `archive_org_app` archives one app only after exact runtime confirmation. It requires the\n `org_apps:write` scope and `org_admin` role.\n\nThe tools chain: `list_my_organizations` surfaces the `org_id`s the customer can act on,\n`list_org_apps` takes one of those ids, and `archive_org_app` accepts the selected app id. Tool code remains\nindependent of the selected origin.\n\n## Declare the customer endpoint\n\n`customerEndpoint` names one private routing authority and bounds the origins an IdP may select:\n\n```ts\nconst customerApi = customerEndpoint('customer_api', {\n allowedHttpsHostSuffixes: ['api.noodleseed.dev'],\n});\n```\n\nUse either non-empty `allowedHttpsHostSuffixes` or non-empty `allowedHttpsOrigins`, never both. Exact-origin\npolicies may include a non-default port. Suffix policies match only the exact hostname or dot-boundary\nsubdomains on port 443. A routed connector must not add `allowedOrigins`; its endpoint policy is the egress\nallowlist.\n\nThe connector uses that declaration as its normal base URL. Its token endpoint remains a fixed, independently\nvalidated HTTPS URL:\n\n```ts\nconst api = connector('noodleseed_app_api')\n .version('1.0.0')\n .http({\n baseUrl: customerApi,\n auth: {\n kind: 'delegatedTokenExchange',\n tokenUrl: 'https://id.noodleseed.dev/oauth/token',\n clientId: variable('CUSTOMER_API_CLIENT_ID'),\n clientSecret: secret('CUSTOMER_API_CLIENT_SECRET'),\n scopes: ['organizations:read', 'org_apps:read', 'org_apps:write'],\n audience: 'noodleseed-customer-api',\n },\n operations: {\n // read and action operations...\n },\n });\n```\n\nAt both connector and operation level, auth must be omitted or use `delegatedTokenExchange`. The compiler\nvalidates the concrete connector definition emitted from TypeScript, including connector defaults and\noperation overrides, and reports the exact failing auth path and kind. Do not keep a bearer, API-key,\nclient-credentials, or managed-provider fallback for local mode; use operation fakes while leaving auth\ndeclarative.\n\n## Map the endpoint from verified OIDC\n\nThe IdP claim contains the complete base URL, including an optional base path. Routing is separate from the\npublic `${user}` expression scope:\n\n```ts\nauth: customerAuth.oidc({\n issuer: 'https://id.noodleseed.dev',\n audience: 'noodleseed-customer-auth-prod',\n claims: {\n id: 'sub',\n email: 'email',\n name: 'name',\n orgs: 'permissions.orgs',\n roles: 'permissions.roles',\n scopes: 'permissions.scopes',\n },\n routing: {\n endpoints: {\n customer_api: { claim: 'tenant.api_base_url' },\n },\n },\n}),\n```\n\nFor federated OIDC, put the same endpoint map on every issuer. Claim paths may differ, but each issuer must\nmap every endpoint the app uses:\n\n```ts\nauth: customerAuth.federatedOidc({\n issuers: [\n {\n issuer: 'https://id.customer-a.com',\n audience: 'noodleseed-customer-auth-prod',\n routing: {\n endpoints: {\n customer_api: { claim: 'tenant.api_base_url' },\n },\n },\n },\n {\n issuer: 'https://login.customer-b.com',\n audience: 'noodleseed-customer-auth-prod',\n routing: {\n endpoints: {\n customer_api: { claim: 'organization.routes.customer_api' },\n },\n },\n },\n ],\n}),\n```\n\nAt runtime, Noodle Seed validates the configured stable audience, associates the caller with the exact\ntransport-derived MCP resource, projects the route into private request state, applies its policy, and\nfreezes it for the call. Missing, malformed, or\ndisallowed claims return `connector_route_unavailable` before credential lookup or connector egress.\nResolved URLs never enter artifacts, `${user}`, logs, model output, widgets, public confirmation review,\nbroker cache keys, or delegated exchange assertions.\n\nRouted reads work in tools, including declared nested calls. Routed actions require exact\n`annotations.confirm: true`; otherwise they fail with `customer_endpoint_action_unsupported`. Routed\nresources, prompts, and ambient context fail with `customer_endpoint_surface_unsupported`.\n\nThe flagship's routed action uses the normal TypeScript action helper:\n\n```ts\ntool('archive_org_app', {\n authorization: {\n requiredScopes: ['org_apps:write'],\n allowedRoles: ['org_admin'],\n },\n annotations: annotations.openAction({ destructive: false, confirm: true }),\n // input, output, and the normal connectors.app_api.archiveOrgApp(...) call...\n});\n```\n\nThe flagship also opts into the current stateless hosted MCP path:\n\n```ts\ninteractions: {\n confirmationFallback: 'host',\n},\n```\n\nA bidirectional client that negotiated form elicitation can complete the standard confirmation exchange\ninstead. The explicit host fallback trusts the MCP host to have collected native write approval before the\ntool call reaches Noodle Seed; it is never inferred from client identity and does not replace auth, policy,\nor accurate action/destructive annotations. Omit the fallback when connected hosts are not trusted to\nprovide that approval. If neither standard confirmation nor the fallback is available, the action fails\nclosed with `interaction_unavailable`.\n\nPreparation stores only sorted route `{ key, fingerprint }` bindings in its private server-held\ncontinuation; the public review exposes none of them. Acceptance re-resolves the current request route and\nreturns `invalid_continuation` if it is missing or changed, before policy, credentials, or egress. A match\nreuses the current frozen snapshot for the action and all nested or later reads.\n\nThe application developer owns the direct/federated authorization server. It must publish its path-inserted\nRFC 8414 document as direct HTTP 200 JSON with exact issuer and HTTPS authorization/token/registration/JWKS\nendpoints, authorization-code and refresh grants, PKCE S256, public-client auth method `none`, RFC 8707\nresource handling, and public signing keys. It validates each exact MCP resource on authorize, code exchange,\nand refresh, then maps approved versions of this app/environment to `noodleseed-customer-auth-prod`. Other\napps and environments use distinct audiences.\n\nRun `noodle auth doctor src/server.ts` before sharing. Its bounded, read-only probes never register a client.\nAdding the embedded assistant does not choose or rewrite MCP customer auth. Its authenticated backend may\nbind `routing.endpoints.customer_api` during assistant-session exchange from server-owned membership data;\ndirect MCP requests continue to resolve the same endpoint from the configured verified OIDC claim.\n\n## Per-tool authorization remains independent\n\nThe mapped `roles` and `scopes` paths are read only after OIDC verification. The restricted tool declares its\nrule beside the rest of its public contract:\n\n```ts\ntool('list_org_apps', {\n authorization: {\n requiredScopes: ['org_apps:read'],\n allowedRoles: ['org_admin', 'org_member'],\n },\n // input, output, and fulfilment...\n});\n```\n\nEvery required scope must be present and at least one allowed role must match. When both lists are declared,\nboth conditions apply. Route availability never changes `tools/list`: discovery remains based only on\nroles/scopes. A restricted tool is omitted for an ineligible customer and a guessed direct call still fails\nclosed.\n\nTool code calls the connector normally:\n\n```ts\nfulfil({ input, connectors }) {\n const apps = connectors.app_api.listOrgApps({\n org_id: input.org_id,\n skip: input.skip,\n limit: input.limit,\n });\n\n return { result: apps.result };\n}\n```\n\nThe broker exchanges a short-lived, platform-signed assertion at the fixed token endpoint and caches the\nresult by caller, connector, scopes, and a route fingerprint. The assertion carries only the route key and\nfingerprint, never the URL. The MCP access token is never forwarded to the customer API. The exchange wire\ncontract lives in docs/spec/connectors.md.\n\nFirebase and Microsoft remain supported managed adapters; their provider-specific contracts and tests live\nin docs/spec/auth-and-policy.md and the SharePoint flagship.\n\n## Supabase direct-OIDC access-token hook\n\nDynamic Client Registration lets any OAuth client register, so the presence of `client_id` is not approval.\nKeep an operator-controlled client-to-audience map and rewrite `aud` only for an exact mapped client. For a\ndynamically registered client, review its generated client ID, name, and exact redirect URIs in the consent\nflow before adding the mapping. Each new registration needs its own row; never approve by name or prefix.\n\nReplace `<approved-oauth-client-id>` with the reviewed client ID and `<stable-mcp-audience>` with the exact\nvalue configured in `customerAuth.oidc`:\n\n```sql\ncreate table if not exists public.mcp_oauth_client_audiences (\n client_id text primary key check (btrim(client_id) <> ''),\n audience text not null check (btrim(audience) <> '')\n);\n\nrevoke all on table public.mcp_oauth_client_audiences from authenticated, anon, public;\ngrant usage on schema public to supabase_auth_admin;\ngrant select on table public.mcp_oauth_client_audiences to supabase_auth_admin;\n\ninsert into public.mcp_oauth_client_audiences (client_id, audience)\nvalues ('<approved-oauth-client-id>', '<stable-mcp-audience>')\non conflict (client_id) do update set audience = excluded.audience;\n\ncreate or replace function public.mcp_access_token_hook(event jsonb)\nreturns jsonb\nlanguage plpgsql\nstable\nas $$\ndeclare\n claims jsonb := coalesce(event->'claims', '{}'::jsonb);\n oauth_client_id text := nullif(btrim(claims->>'client_id'), '');\n mapped_audience text;\nbegin\n if oauth_client_id is not null then\n select mapping.audience\n into mapped_audience\n from public.mcp_oauth_client_audiences as mapping\n where mapping.client_id = oauth_client_id;\n end if;\n\n if mapped_audience is not null then\n claims := jsonb_set(\n claims,\n '{aud}',\n to_jsonb(mapped_audience),\n true\n );\n end if;\n\n return jsonb_build_object('claims', claims);\nend;\n$$;\n\ngrant execute on function public.mcp_access_token_hook(jsonb) to supabase_auth_admin;\nrevoke execute on function public.mcp_access_token_hook(jsonb) from authenticated, anon, public;\n```\n\n| Token source | Mapping | Resulting `aud` |\n| --- | --- | --- |\n| Approved OAuth client | Exact client row | Mapped stable MCP audience |\n| Unrelated or unknown OAuth client | No row | Original Supabase audience |\n| Browser session | No `client_id` | Original Supabase audience |\n\nSelect this function under Supabase Auth Hooks before completing the interactive verification below.\n\n## Validate\n\n```bash\nnoodle validate examples/customer-auth/src/server.ts --json\nnoodle auth doctor examples/customer-auth/src/server.ts --json\nnoodle test examples/customer-auth/src/server.ts --json\n```\n\nThe doctor proves metadata and JWKS readiness without registering a client. For this protected app,\n`noodle test` proves the anonymous 401 plus exact protected-resource metadata boundary and reports\n`interactiveRequired: true`; neither command proves token issuance or audience verification.\n\nAgainst a deployed customer-protected environment, set a short-lived real customer token only in\n`NOODLE_CUSTOMER_TOKEN` and add `--live --org <org> --app <app> --env <env>`. The live doctor performs\ncredential exchanges without invoking any business tool. Add `--version 1` when testing a pinned version;\nthe reported customer resource must match that versioned MCP endpoint.\n\n## Run locally\n\n```bash\nnoodle devtools examples/customer-auth/src/server.ts\n```\n\nComplete sign-in in Devtools and load the tool list. That authenticated request is the local proof that DCR,\nPKCE, token issuance, issuer/signature verification, the stable audience, and exact-resource binding work\ntogether. Invoke a representative safe read when the configured customer API is available.\n\n### Test delegated exchange locally\n\nLocal customer OIDC sign-in and delegated-exchange assertion trust are two distinct boundaries. OIDC proves\nthe caller to the local MCP server; Devtools uses a separate local issuer only for the RFC 8693 assertion\nsent to the downstream token endpoint. This is the canonical local path and requires no `server.ts` change,\nflag, environment variable, or config surface.\n\n1. Configure the OIDC authorization server for the exact loopback callback and RFC 8707 resource. Do not add\n the Devtools assertion key to OIDC issuer metadata or change its signing keys.\n2. Start Devtools, complete customer sign-in, and copy the displayed `{ issuer, jwks }` from **Local delegated exchange**.\n3. Pin both values only in the customer-owned development RFC 8693 token endpoint.\n4. Restrict that trust to development client credentials, audience, API, and data.\n5. Invoke the delegated `list_org_apps` tool until its binding reads **Exchange verified**.\n6. Use hosted preview or `noodle auth doctor --live` to prove the production platform issuer.\n\n**Never trust the Devtools issuer in production: anyone holding the local private key could impersonate a customer.**\n\n## Configuration\n\nThe embedded assistant uses a customer-supplied OpenAI Chat Completions-compatible endpoint. Configure its\nmanaged values at the Noodle deployment environment; none of these values belongs in the customer web\napplication environment, and the API key never reaches the browser:\n\nThe assistant session carries a verified user, tenant, deployment, roles, and scopes. For this flagship's\nrouted tools, the embedding backend resolves the signed-in user's cluster from server-owned membership data\nand passes `routing: { endpoints: { customer_api: cluster.apiBaseUrl } }` to\n`createAssistantSession`. Noodle validates and privately stores that route; it is not returned to the\nbrowser. Do not copy the route into page context, session claims, tool input, or model instructions.\n\n```bash\nnoodle variables set ASSISTANT_MODEL_BASE_URL https://model.example.com/v1 --scope env\nnoodle variables set ASSISTANT_MODEL your-model --scope env\nnoodle secrets set ASSISTANT_MODEL_API_KEY --scope env\nnoodle variables set CUSTOMER_API_CLIENT_ID your-broker-client-id --scope env\nnoodle secrets set CUSTOMER_API_CLIENT_SECRET --scope env\nnoodle check --target embedded-assistant src/server.ts\n```\n\nAssistant origins are exact. Production embedding origins must use HTTPS; plain HTTP is accepted only for\nloopback development origins such as `http://localhost:3000`, `http://127.0.0.1:3000`, or\n`http://[::1]:3000`. `noodle dev` serves the MCP project, not that separate embedding application.\n\nThe bounded `presentation` object configures the panel, launcher, header, composer, and messages. Its\nprimitives derive colors from shared server `branding`; raw HTML, CSS, inline SVG, renderer classes, and\ncallbacks are not accepted.\n\nCreate the backend credential after deployment. The CLI writes it to a mode-0600 file and never prints the\nsecret:\n\n```bash\nnoodle assistant clients create --name web --org noodleseed --app customer-auth --env prod\n```\n\nOnly the Noodle service URL, assistant client ID, and assistant client secret belong in the authenticated\ncustomer backend. The model URL, model name, and model API key remain managed by the Noodle deployment.\n\nThe customer's authenticated backend calls `createAssistantSession(...)` from\n`@noodleseed/assistant/server`, passing the already-verified user and browser origin. The browser then uses\nthe returned short-lived session through the managed Web Component/React renderer or a customer-owned UI:\n\n```bash\npnpm add @noodleseed/assistant\n```\n\n```tsx\nimport { NoodleAssistant } from '@noodleseed/assistant/react';\n\n<NoodleAssistant\n sessionEndpoint=\"/api/noodle-assistant/session\"\n theme={resolvedTheme}\n onSessionExpired={() => console.info('Assistant session renewed')}\n/>;\n```\n\n`resolvedTheme` is the application's current `'light' | 'dark'` value. Use `theme=\"auto\"` only when the\nbrowser operating-system preference is intentionally authoritative.\n\nFor an entirely application-owned React renderer, use the renderer-free hook. It creates no custom element\nand returns the AI SDK transcript plus the canonical client commands:\n\n```tsx\n'use client';\n\nimport { useEffect, useState } from 'react';\nimport { NoodleAppView } from '@noodleseed/assistant/react';\nimport { useNoodleAssistant } from '@noodleseed/assistant/react/client';\n\nexport function CustomerAssistant({\n principalKey,\n resolvedTheme,\n}: {\n principalKey: string;\n resolvedTheme: 'light' | 'dark';\n}) {\n const [draft, setDraft] = useState('');\n const { client, messages, status, error } = useNoodleAssistant({\n sessionEndpoint: '/api/noodle-assistant/session',\n principalKey,\n });\n const busy = status === 'submitted' || status === 'streaming';\n const settle = (operation: Promise<void>) => {\n void operation.catch(() => {\n // The hook exposes this same structured failure through `error`.\n });\n };\n\n return (\n <section aria-label=\"Assistant\" aria-busy={busy}>\n {messages.map((message) => (\n <article key={message.id} data-role={message.role}>\n {message.parts.map((part, index) => {\n if (part.type === 'text') return <p key={index}>{part.text}</p>;\n if (part.type === 'data-confirmation') {\n const review = part.data;\n return (\n <section key={review.id} aria-label=\"Review proposed action\">\n <h3>{review.title ?? 'Review proposed action'}</h3>\n {review.description ? <p>{review.description}</p> : null}\n <pre aria-label=\"Proposed action arguments\">\n {JSON.stringify(review.arguments ?? {}, null, 2)}\n </pre>\n <button\n disabled={busy || review.status !== 'pending'}\n onClick={() => settle(client.respond(review.id, { action: 'accept' }))}\n >\n Confirm\n </button>\n <button\n disabled={busy || review.status !== 'pending'}\n onClick={() => settle(client.respond(review.id, { action: 'decline' }))}\n >\n Don't proceed\n </button>\n </section>\n );\n }\n if (part.type === 'data-input-request') {\n const request = part.data;\n return (\n <section key={request.id} aria-label=\"Assistant needs input\">\n <p>{request.message}</p>\n <p>This renderer has not implemented the requested form.</p>\n <button\n disabled={busy || request.status !== 'pending'}\n onClick={() => settle(client.respond(request.id, { action: 'decline' }))}\n >\n Cancel request\n </button>\n </section>\n );\n }\n if (part.type === 'data-tool-result') {\n return (\n <pre key={part.data.id} aria-label={`${part.data.tool} result`}>\n {JSON.stringify(part.data.result, null, 2)}\n </pre>\n );\n }\n if (part.type === 'data-view') {\n return (\n <NoodleAppView\n key={`${part.data.id}:${part.data.resourceUri}`}\n client={client}\n view={part.data}\n theme={resolvedTheme}\n />\n );\n }\n return <p key={index}>Unsupported assistant content.</p>;\n })}\n </article>\n ))}\n {error ? <p role=\"alert\">{error.message}</p> : null}\n <form\n onSubmit={(event) => {\n event.preventDefault();\n const message = draft.trim();\n if (!message) return;\n setDraft('');\n settle(client.sendMessage(message));\n }}\n >\n <input\n aria-label=\"Message\"\n value={draft}\n onChange={(event) => setDraft(event.currentTarget.value)}\n />\n {busy ? (\n <button type=\"button\" onClick={() => client.abort()}>\n Stop\n </button>\n ) : (\n <button type=\"submit\">Send</button>\n )}\n </form>\n </section>\n );\n}\n```\n\n`principalKey` stays in the browser. Change it whenever the authenticated user or tenant changes; the hook\nthen aborts and clears the prior session and transcript. The sample fails closed on input requests until its\nfallback is replaced with a form generated from `requestedSchema`. A production renderer must show the\ncomplete confirmation review and both decisions. For `data-view`, map `resourceUri` or `tool` and the\nbounded/redacted result to a component already trusted by this application only when intentionally replacing\nthe linked App with a native UI. Otherwise use `NoodleAppView`; JSON result data is not the App UI. Its\nsemantic lifecycle identity is the client plus `view.id` plus `view.resourceUri`, so parent payload/callback\nrerenders keep the iframe and only a different view or unmount tears down the bridge.\nNever inject `part.data.html`, assign it to `srcdoc`, fetch a `ui://` URI, or reproduce the bridge directly. Pages with a\nContent-Security-Policy must include the Noodle service origin in both `connect-src` and `frame-src`.\n\nBefore the production-equivalent host build, run the presence-only handoff check:\n\n```sh\nnoodle assistant embed --check --json\n```\n\nAdd application-owned delegated-exchange requirements with repeatable `--require-env NAME` flags. The JSON\nreports required and missing names, CSP status, and post-deploy probes without returning environment values\nor writing scaffold files. Map the names through the production secret manager, CI environment, and any\nsecret allowlist; regenerate existing framework-owned environment binding types before the build. Default\nDevtools/model exercises to synthetic data, and obtain approval before sending real connector data to an\nexternal model.\n\nAfter deployment, use the assistant doctor to verify the embed client, model, and static session boundary:\n\n```sh\nnoodle assistant doctor --user-id <real-test-user> --origin \"$PUBLIC_APP_ORIGIN\" --org <org> --app <app> --env <env>\n```\n\nThe doctor does not invent or test an application-specific customer route. Prove routed assistant tools by\nhaving the authenticated embedding backend pass the user's server-verified endpoint during session\nexchange, then invoke one representative safe read.\n\nIf the application deliberately sends a first turn on mount, do not combine a persistent \"sent\" ref with a\nmount effect. React Strict Mode can abort that provisional request and then suppress the stable remount.\nSchedule the send after the provisional cleanup and settle its promise:\n\n```tsx\nuseEffect(() => {\n let active = true;\n queueMicrotask(() => {\n if (active) settle(client.sendMessage(initialMessage));\n });\n return () => {\n active = false;\n };\n}, [client, initialMessage]);\n```\n\nFor a chat-first custom host, raw `tool_started` supplies the direct call `id` and technical tool name. Map\nknown tools to concise application copy and use a neutral fallback. Reserve a stable `role=\"status\"` region\nfor thinking, tool activity, and the view skeleton; switch to the ready `NoodleAppView` on `view_available`\nor to `role=\"alert\"` on error. Decorative skeleton shapes stay hidden from assistive technology, and shimmer\nor transition motion is disabled under `prefers-reduced-motion`.\n\nUse `${view.id}:${view.resourceUri}` as transport identity. Different call IDs are distinct invocations and\nmust not be deduplicated generically. If this application intentionally owns one current panel for a known\nresource, declare an application-owned slot for that resource and replace only that slot.\n\nOutside React, subscribe to the DOM-free client directly. It exposes the same conversation as headless AI\nSDK `UIMessage` state, including typed confirmation, input, tool-result, and linked-view parts:\n\n```ts\nimport { createAssistantClient } from '@noodleseed/assistant/client';\n\nconst assistant = createAssistantClient({\n sessionEndpoint: '/api/noodle-assistant/session',\n});\n\nassistant.subscribeChat((state) => {\n renderUIMessageState(state);\n for (const message of state.messages) {\n for (const part of message.parts) {\n if (part.type === 'data-confirmation' && part.data.status === 'pending') {\n renderConfirmation(part.data, (response) => assistant.respond(part.data.id, response));\n }\n }\n }\n});\n```\n\n`theme=\"auto\"` follows the operating-system preference, not a SaaS-owned toggle. Pass the resolved\n`light`/`dark` theme to `NoodleAssistant` and `NoodleAppView`; updates reach mounted MCP Apps without a\nremount. CSS custom properties inherit through the host, and documented `--ns-assistant-*` variables remain\nthe final integration escape hatch. Server `branding` is shared by widgets and the assistant; there is no\nsecond branding declaration. Text streams progressively. Expired turns re-exchange and retry once;\nconfirmations never replay automatically.\n\nThe customer IdP must place the full tenant API base URL in `tenant.api_base_url`. For example, one verified\ncustomer may receive `https://customer-a.api.noodleseed.dev/v1` and another\n`https://customer-b.api.noodleseed.dev/v1`; both satisfy the declared suffix policy. Application code,\ndeployment variables, and connector arguments do not select the tenant route.\n\n`CUSTOMER_API_CLIENT_ID` and `CUSTOMER_API_CLIENT_SECRET` authenticate only the broker to the fixed exchange\nendpoint. They are not customer API bearer tokens. The exchange endpoint verifies the platform-signed\nsubject assertion and mints a short-lived token scoped to the signed-in user and route binding.\n\n## Deploy customer-protected to Noodle Seed Cloud\n\n```bash\nnoodle deploy examples/customer-auth/src/server.ts \\\n --org noodleseed \\\n --app customer-auth \\\n --env prod \\\n --access customers\n```\n\nEndpoint:\n\n```text\nhttps://cloud.noodleseed.dev/o/noodleseed/customer-auth/mcp\n```\n\n## MCP Primitives\n\n- Tool `list_my_organizations`: calls `GET /api/organizations` and returns the organizations the signed-in\n customer is a member of. Takes no arguments; the org set is scoped by the verified customer session.\n- Tool `list_org_apps`: calls `GET /api/organizations/{org_id}/apps` for one organization `org_id`.\n- Tool `archive_org_app`: after confirmation, calls\n `POST /api/organizations/{org_id}/apps/{app_id}/archive`.\n\n## Auth boundary\n\nNoodle Seed verifies the configured OIDC issuer and stable audience, then binds the exact transport-derived\nMCP resource before reading identity or routing claims. Public caller identity contains the user/role/scope\nprojection; the customer route remains private request state.\n\nConnector-backed tools ask the broker for a route-bound delegated credential; only the endpoint key and\nfingerprint enter broker cache/single-flight state or the assertion. The route claim and inbound MCP bearer\ntoken never reach tools, connectors, widgets, model output, or downstream systems. Confirmed actions keep\nthe same URL-blind binding only in private continuation state and reject acceptance-time drift.\n" },
|
|
53
54
|
{ relPath: "examples/customer-auth/noodle.json", content: "{\n \"entrypoint\": \"src/server.ts\",\n \"name\": \"customer-auth\"\n}\n" },
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"example-files.js","sourceRoot":"","sources":["../../src/generated/example-files.ts"],"names":[],"mappings":"AAAA,yEAAyE;AACzE,kFAAkF;AAClF,iGAAiG;AAQjG,uGAAuG;AACvG,MAAM,CAAC,MAAM,qBAAqB,GAAsB;IACtD,OAAO;IACP,SAAS;IACT,eAAe;IACf,gBAAgB;IAChB,YAAY;IACZ,aAAa;IACb,eAAe;IACf,qBAAqB;IACrB,iBAAiB;CAClB,CAAC;AAEF,yGAAyG;AACzG,MAAM,CAAC,MAAM,qBAAqB,GAAkC;IAClE,EAAE,OAAO,EAAE,gCAAgC,EAAE,OAAO,EAAE,4oEAA4oE,EAAE;IACpsE,EAAE,OAAO,EAAE,4CAA4C,EAAE,OAAO,EAAE,u/wBAAu/wB,EAAE;IAC3jxB,EAAE,OAAO,EAAE,6CAA6C,EAAE,OAAO,EAAE,kkQAAkkQ,EAAE;IACvoQ,EAAE,OAAO,EAAE,4CAA4C,EAAE,OAAO,EAAE,klqDAAklqD,EAAE;IACtpqD,EAAE,OAAO,EAAE,kCAAkC,EAAE,OAAO,EAAE,wGAAwG,EAAE;IAClK,EAAE,OAAO,EAAE,mCAAmC,EAAE,OAAO,EAAE,mfAAmf,EAAE;IAC9iB,EAAE,OAAO,EAAE,qCAAqC,EAAE,OAAO,EAAE,sSAAsS,EAAE;IACnW,EAAE,OAAO,EAAE,oCAAoC,EAAE,OAAO,EAAE,ivMAAivM,EAAE;IAC7yM,EAAE,OAAO,EAAE,8CAA8C,EAAE,OAAO,EAAE,g/LAAg/L,EAAE;IACtjM,EAAE,OAAO,EAAE,iDAAiD,EAAE,OAAO,EAAE,+5HAA+5H,EAAE;IACx+H,EAAE,OAAO,EAAE,0CAA0C,EAAE,OAAO,EAAE,wyBAAwyB,EAAE;IAC12B,EAAE,OAAO,EAAE,uCAAuC,EAAE,OAAO,EAAE,uRAAuR,EAAE;IACtV,EAAE,OAAO,EAAE,mCAAmC,EAAE,OAAO,EAAE,2tIAA2tI,EAAE;IACtxI,EAAE,OAAO,EAAE,+CAA+C,EAAE,OAAO,EAAE,mrhCAAmrhC,EAAE;IAC1vhC,EAAE,OAAO,EAAE,+CAA+C,EAAE,OAAO,EAAE,g4sDAAg4sD,EAAE;IACv8sD,EAAE,OAAO,EAAE,qCAAqC,EAAE,OAAO,EAAE,2GAA2G,EAAE;IACxK,EAAE,OAAO,EAAE,sCAAsC,EAAE,OAAO,EAAE,sfAAsf,EAAE;IACpjB,EAAE,OAAO,EAAE,wCAAwC,EAAE,OAAO,EAAE,yRAAyR,EAAE;IACzV,EAAE,OAAO,EAAE,uCAAuC,EAAE,OAAO,EAAE,g9OAAg9O,EAAE;IAC/gP,EAAE,OAAO,EAAE,0DAA0D,EAAE,OAAO,EAAE,4jLAA4jL,EAAE;IAC9oL,EAAE,OAAO,EAAE,oDAAoD,EAAE,OAAO,EAAE,ijHAAijH,EAAE;IAC7nH,EAAE,OAAO,EAAE,6CAA6C,EAAE,OAAO,EAAE,8/BAA8/B,EAAE;IACnkC,EAAE,OAAO,EAAE,0CAA0C,EAAE,OAAO,EAAE,uRAAuR,EAAE;IACzV,EAAE,OAAO,EAAE,+BAA+B,EAAE,OAAO,EAAE,w9LAAw9L,EAAE;IAC/gM,EAAE,OAAO,EAAE,2CAA2C,EAAE,OAAO,EAAE,o8nBAAo8nB,EAAE;IACvgoB,EAAE,OAAO,EAAE,2CAA2C,EAAE,OAAO,EAAE,k1nDAAk1nD,EAAE;IACr5nD,EAAE,OAAO,EAAE,iCAAiC,EAAE,OAAO,EAAE,uGAAuG,EAAE;IAChK,EAAE,OAAO,EAAE,kCAAkC,EAAE,OAAO,EAAE,kfAAkf,EAAE;IAC5iB,EAAE,OAAO,EAAE,oCAAoC,EAAE,OAAO,EAAE,qQAAqQ,EAAE;IACjU,EAAE,OAAO,EAAE,mCAAmC,EAAE,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"example-files.js","sourceRoot":"","sources":["../../src/generated/example-files.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"surface.d.ts","sourceRoot":"","sources":["../../src/generated/surface.ts"],"names":[],"mappings":"AAIA,qGAAqG;AACrG,eAAO,MAAM,YAAY,EAAE,SAAS,MAAM,EA4DzC,CAAC;AAEF,8FAA8F;AAC9F,eAAO,MAAM,WAAW,EAAE,SAAS,MAAM,EAwBxC,CAAC;AAEF,iGAAiG;AACjG,eAAO,MAAM,mBAAmB,EAAE,SAAS,MAAM,
|
|
1
|
+
{"version":3,"file":"surface.d.ts","sourceRoot":"","sources":["../../src/generated/surface.ts"],"names":[],"mappings":"AAIA,qGAAqG;AACrG,eAAO,MAAM,YAAY,EAAE,SAAS,MAAM,EA4DzC,CAAC;AAEF,8FAA8F;AAC9F,eAAO,MAAM,WAAW,EAAE,SAAS,MAAM,EAwBxC,CAAC;AAEF,iGAAiG;AACjG,eAAO,MAAM,mBAAmB,EAAE,SAAS,MAAM,EAqEhD,CAAC;AAEF,oGAAoG;AACpG,eAAO,MAAM,WAAW,EAAE,SAAS,MAAM,EAcxC,CAAC"}
|
|
@@ -152,6 +152,13 @@ export const COMPILE_ERROR_CODES = [
|
|
|
152
152
|
'customer_endpoint_routing_inconsistent',
|
|
153
153
|
'unused_connector_alias',
|
|
154
154
|
'arg_mismatch',
|
|
155
|
+
'agent_guide_invalid',
|
|
156
|
+
'agent_guide_duplicate_workflow',
|
|
157
|
+
'agent_guide_duplicate_example',
|
|
158
|
+
'agent_guide_example_workflow_missing',
|
|
159
|
+
'agent_guide_capability_missing',
|
|
160
|
+
'agent_guide_capability_kind',
|
|
161
|
+
'app_package_sensitive_content',
|
|
155
162
|
];
|
|
156
163
|
/** Widget React hooks from `generateHelpers<AppType>()` (packages/authoring/src/react/hooks.ts). */
|
|
157
164
|
export const REACT_HOOKS = [
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"surface.js","sourceRoot":"","sources":["../../src/generated/surface.ts"],"names":[],"mappings":"AAAA,uEAAuE;AACvE,6EAA6E;AAC7E,iGAAiG;AAEjG,qGAAqG;AACrG,MAAM,CAAC,MAAM,YAAY,GAAsB;IAC7C,MAAM;IACN,SAAS;IACT,UAAU;IACV,UAAU;IACV,OAAO;IACP,QAAQ;IACR,MAAM;IACN,OAAO;IACP,MAAM;IACN,QAAQ;IACR,QAAQ;IACR,MAAM;IACN,MAAM;IACN,SAAS;IACT,QAAQ;IACR,QAAQ;IACR,UAAU;IACV,OAAO;IACP,MAAM;IACN,OAAO;IACP,WAAW;IACX,SAAS;IACT,KAAK;IACL,UAAU;IACV,QAAQ;IACR,OAAO;IACP,SAAS;IACT,MAAM;IACN,SAAS;IACT,QAAQ;IACR,QAAQ;IACR,WAAW;IACX,QAAQ;IACR,eAAe;IACf,QAAQ;IACR,MAAM;IACN,QAAQ;IACR,SAAS;IACT,OAAO;IACP,UAAU;IACV,SAAS;IACT,SAAS;IACT,QAAQ;IACR,MAAM;IACN,MAAM;IACN,aAAa;IACb,SAAS;IACT,OAAO;IACP,QAAQ;IACR,QAAQ;IACR,UAAU;IACV,MAAM;IACN,MAAM;IACN,SAAS;IACT,QAAQ;IACR,MAAM;IACN,QAAQ;IACR,SAAS;IACT,WAAW;CACZ,CAAC;AAEF,8FAA8F;AAC9F,MAAM,CAAC,MAAM,WAAW,GAAsB;IAC5C,aAAa;IACb,OAAO;IACP,MAAM;IACN,mBAAmB;IACnB,YAAY;IACZ,WAAW;IACX,cAAc;IACd,kBAAkB;IAClB,mBAAmB;IACnB,kBAAkB;IAClB,gBAAgB;IAChB,wBAAwB;IACxB,gBAAgB;IAChB,eAAe;IACf,kBAAkB;IAClB,QAAQ;IACR,UAAU;IACV,QAAQ;IACR,QAAQ;IACR,MAAM;IACN,UAAU;IACV,MAAM;IACN,GAAG;CACJ,CAAC;AAEF,iGAAiG;AACjG,MAAM,CAAC,MAAM,mBAAmB,GAAsB;IACpD,0BAA0B;IAC1B,kBAAkB;IAClB,eAAe;IACf,cAAc;IACd,gBAAgB;IAChB,eAAe;IACf,8BAA8B;IAC9B,6BAA6B;IAC7B,uBAAuB;IACvB,cAAc;IACd,oBAAoB;IACpB,oBAAoB;IACpB,qBAAqB;IACrB,oBAAoB;IACpB,mBAAmB;IACnB,uBAAuB;IACvB,2BAA2B;IAC3B,qBAAqB;IACrB,kBAAkB;IAClB,kBAAkB;IAClB,eAAe;IACf,mBAAmB;IACnB,oBAAoB;IACpB,4BAA4B;IAC5B,0BAA0B;IAC1B,2BAA2B;IAC3B,mBAAmB;IACnB,wBAAwB;IACxB,oBAAoB;IACpB,kBAAkB;IAClB,wBAAwB;IACxB,0BAA0B;IAC1B,kBAAkB;IAClB,qBAAqB;IACrB,4BAA4B;IAC5B,uBAAuB;IACvB,wBAAwB;IACxB,6BAA6B;IAC7B,uBAAuB;IACvB,6BAA6B;IAC7B,eAAe;IACf,gCAAgC;IAChC,oBAAoB;IACpB,yBAAyB;IACzB,0BAA0B;IAC1B,mBAAmB;IACnB,4BAA4B;IAC5B,gCAAgC;IAChC,2BAA2B;IAC3B,8BAA8B;IAC9B,iCAAiC;IACjC,oCAAoC;IACpC,mCAAmC;IACnC,sCAAsC;IACtC,sCAAsC;IACtC,uCAAuC;IACvC,iDAAiD;IACjD,mCAAmC;IACnC,wCAAwC;IACxC,wBAAwB;IACxB,cAAc;
|
|
1
|
+
{"version":3,"file":"surface.js","sourceRoot":"","sources":["../../src/generated/surface.ts"],"names":[],"mappings":"AAAA,uEAAuE;AACvE,6EAA6E;AAC7E,iGAAiG;AAEjG,qGAAqG;AACrG,MAAM,CAAC,MAAM,YAAY,GAAsB;IAC7C,MAAM;IACN,SAAS;IACT,UAAU;IACV,UAAU;IACV,OAAO;IACP,QAAQ;IACR,MAAM;IACN,OAAO;IACP,MAAM;IACN,QAAQ;IACR,QAAQ;IACR,MAAM;IACN,MAAM;IACN,SAAS;IACT,QAAQ;IACR,QAAQ;IACR,UAAU;IACV,OAAO;IACP,MAAM;IACN,OAAO;IACP,WAAW;IACX,SAAS;IACT,KAAK;IACL,UAAU;IACV,QAAQ;IACR,OAAO;IACP,SAAS;IACT,MAAM;IACN,SAAS;IACT,QAAQ;IACR,QAAQ;IACR,WAAW;IACX,QAAQ;IACR,eAAe;IACf,QAAQ;IACR,MAAM;IACN,QAAQ;IACR,SAAS;IACT,OAAO;IACP,UAAU;IACV,SAAS;IACT,SAAS;IACT,QAAQ;IACR,MAAM;IACN,MAAM;IACN,aAAa;IACb,SAAS;IACT,OAAO;IACP,QAAQ;IACR,QAAQ;IACR,UAAU;IACV,MAAM;IACN,MAAM;IACN,SAAS;IACT,QAAQ;IACR,MAAM;IACN,QAAQ;IACR,SAAS;IACT,WAAW;CACZ,CAAC;AAEF,8FAA8F;AAC9F,MAAM,CAAC,MAAM,WAAW,GAAsB;IAC5C,aAAa;IACb,OAAO;IACP,MAAM;IACN,mBAAmB;IACnB,YAAY;IACZ,WAAW;IACX,cAAc;IACd,kBAAkB;IAClB,mBAAmB;IACnB,kBAAkB;IAClB,gBAAgB;IAChB,wBAAwB;IACxB,gBAAgB;IAChB,eAAe;IACf,kBAAkB;IAClB,QAAQ;IACR,UAAU;IACV,QAAQ;IACR,QAAQ;IACR,MAAM;IACN,UAAU;IACV,MAAM;IACN,GAAG;CACJ,CAAC;AAEF,iGAAiG;AACjG,MAAM,CAAC,MAAM,mBAAmB,GAAsB;IACpD,0BAA0B;IAC1B,kBAAkB;IAClB,eAAe;IACf,cAAc;IACd,gBAAgB;IAChB,eAAe;IACf,8BAA8B;IAC9B,6BAA6B;IAC7B,uBAAuB;IACvB,cAAc;IACd,oBAAoB;IACpB,oBAAoB;IACpB,qBAAqB;IACrB,oBAAoB;IACpB,mBAAmB;IACnB,uBAAuB;IACvB,2BAA2B;IAC3B,qBAAqB;IACrB,kBAAkB;IAClB,kBAAkB;IAClB,eAAe;IACf,mBAAmB;IACnB,oBAAoB;IACpB,4BAA4B;IAC5B,0BAA0B;IAC1B,2BAA2B;IAC3B,mBAAmB;IACnB,wBAAwB;IACxB,oBAAoB;IACpB,kBAAkB;IAClB,wBAAwB;IACxB,0BAA0B;IAC1B,kBAAkB;IAClB,qBAAqB;IACrB,4BAA4B;IAC5B,uBAAuB;IACvB,wBAAwB;IACxB,6BAA6B;IAC7B,uBAAuB;IACvB,6BAA6B;IAC7B,eAAe;IACf,gCAAgC;IAChC,oBAAoB;IACpB,yBAAyB;IACzB,0BAA0B;IAC1B,mBAAmB;IACnB,4BAA4B;IAC5B,gCAAgC;IAChC,2BAA2B;IAC3B,8BAA8B;IAC9B,iCAAiC;IACjC,oCAAoC;IACpC,mCAAmC;IACnC,sCAAsC;IACtC,sCAAsC;IACtC,uCAAuC;IACvC,iDAAiD;IACjD,mCAAmC;IACnC,wCAAwC;IACxC,wBAAwB;IACxB,cAAc;IACd,qBAAqB;IACrB,gCAAgC;IAChC,+BAA+B;IAC/B,sCAAsC;IACtC,gCAAgC;IAChC,6BAA6B;IAC7B,+BAA+B;CAChC,CAAC;AAEF,oGAAoG;AACpG,MAAM,CAAC,MAAM,WAAW,GAAsB;IAC5C,gBAAgB;IAChB,aAAa;IACb,aAAa;IACb,cAAc;IACd,WAAW;IACX,aAAa;IACb,uBAAuB;IACvB,iBAAiB;IACjB,wBAAwB;IACxB,uBAAuB;IACvB,oBAAoB;IACpB,YAAY;IACZ,YAAY;CACb,CAAC"}
|
|
@@ -5,8 +5,11 @@ export * from './plugin-compatibility.js';
|
|
|
5
5
|
export * from './plugin-copilot-bundle.js';
|
|
6
6
|
export * from './plugin-launcher.js';
|
|
7
7
|
export * from './plugin-submission.js';
|
|
8
|
+
export * from './product-skill-markdown.js';
|
|
9
|
+
export * from './product-skill-renderer.js';
|
|
10
|
+
export * from './product-skill-types.js';
|
|
8
11
|
export * from './skill-registry.js';
|
|
9
|
-
export
|
|
12
|
+
export { AGENT_KIT_VERSION } from './version.js';
|
|
10
13
|
export declare const MANAGED_BEGIN = "<!-- BEGIN NOODLE AGENT CONTEXT -->";
|
|
11
14
|
export declare const MANAGED_END = "<!-- END NOODLE AGENT CONTEXT -->";
|
|
12
15
|
export type AgentTargetSelection = AgentTarget | 'all' | 'none';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,19 +1,22 @@
|
|
|
1
1
|
import { createHash } from 'node:crypto';
|
|
2
|
-
import pkg from '../package.json' with { type: 'json' };
|
|
3
2
|
import { BEHAVIOR_SKILLS, renderBehaviorSkillBody } from './behavior-skills.js';
|
|
4
3
|
import { BUNDLED_EXAMPLE_FILES } from './generated/example-files.js';
|
|
5
4
|
import { EXECUTING_NOODLE_PLANS_SKILL } from './plan-execution-skill.js';
|
|
6
5
|
import { SKILL_REFERENCES } from './skill-content.js';
|
|
7
6
|
import { defineSkillRegistry, renderRegisteredSkillFiles, } from './skill-registry.js';
|
|
8
7
|
import { SKILL_DESCRIPTION, skillRouterBody } from './skill-router.js';
|
|
8
|
+
import { AGENT_KIT_VERSION } from './version.js';
|
|
9
9
|
export * from './behavior-skills.js';
|
|
10
10
|
export * from './plan-execution-skill.js';
|
|
11
11
|
export * from './plugin-compatibility.js';
|
|
12
12
|
export * from './plugin-copilot-bundle.js';
|
|
13
13
|
export * from './plugin-launcher.js';
|
|
14
14
|
export * from './plugin-submission.js';
|
|
15
|
+
export * from './product-skill-markdown.js';
|
|
16
|
+
export * from './product-skill-renderer.js';
|
|
17
|
+
export * from './product-skill-types.js';
|
|
15
18
|
export * from './skill-registry.js';
|
|
16
|
-
export
|
|
19
|
+
export { AGENT_KIT_VERSION } from './version.js';
|
|
17
20
|
export const MANAGED_BEGIN = '<!-- BEGIN NOODLE AGENT CONTEXT -->';
|
|
18
21
|
export const MANAGED_END = '<!-- END NOODLE AGENT CONTEXT -->';
|
|
19
22
|
const TARGETS = ['codex', 'claude-code'];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { ProductSkillMarkdown, ProductSkillPackageInput } from './product-skill-types.js';
|
|
2
|
+
/** Render host-neutral, bounded product-skill Markdown from the safe App Package projection. */
|
|
3
|
+
export declare function renderProductSkillMarkdown(input: ProductSkillPackageInput): ProductSkillMarkdown;
|
|
4
|
+
//# sourceMappingURL=product-skill-markdown.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"product-skill-markdown.d.ts","sourceRoot":"","sources":["../src/product-skill-markdown.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,oBAAoB,EACpB,wBAAwB,EAEzB,MAAM,0BAA0B,CAAC;AAGlC,gGAAgG;AAChG,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,wBAAwB,GAAG,oBAAoB,CAOhG"}
|