@agent-native/core 0.37.3 → 0.39.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/README.md +19 -6
- package/dist/action.d.ts +60 -2
- package/dist/action.d.ts.map +1 -1
- package/dist/action.js +6 -2
- package/dist/action.js.map +1 -1
- package/dist/agent/production-agent.d.ts +12 -6
- package/dist/agent/production-agent.d.ts.map +1 -1
- package/dist/agent/production-agent.js +161 -11
- package/dist/agent/production-agent.js.map +1 -1
- package/dist/agent/types.d.ts +2 -0
- package/dist/agent/types.d.ts.map +1 -1
- package/dist/agent/types.js.map +1 -1
- package/dist/catalog.json +2 -2
- package/dist/cli/connect.d.ts.map +1 -1
- package/dist/cli/connect.js +15 -0
- package/dist/cli/connect.js.map +1 -1
- package/dist/cli/create.d.ts.map +1 -1
- package/dist/cli/create.js +8 -1
- package/dist/cli/create.js.map +1 -1
- package/dist/cli/index.js +10 -6
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/plan-publish-store.d.ts +52 -0
- package/dist/cli/plan-publish-store.d.ts.map +1 -0
- package/dist/cli/plan-publish-store.js +103 -0
- package/dist/cli/plan-publish-store.js.map +1 -0
- package/dist/cli/skills.d.ts +30 -4
- package/dist/cli/skills.d.ts.map +1 -1
- package/dist/cli/skills.js +1240 -339
- package/dist/cli/skills.js.map +1 -1
- package/dist/cli/templates-meta.js +12 -12
- package/dist/cli/templates-meta.js.map +1 -1
- package/dist/client/AssistantChat.d.ts +3 -1
- package/dist/client/AssistantChat.d.ts.map +1 -1
- package/dist/client/AssistantChat.js +65 -15
- package/dist/client/AssistantChat.js.map +1 -1
- package/dist/client/MultiTabAssistantChat.d.ts.map +1 -1
- package/dist/client/MultiTabAssistantChat.js +20 -2
- package/dist/client/MultiTabAssistantChat.js.map +1 -1
- package/dist/client/agent-chat-adapter.d.ts.map +1 -1
- package/dist/client/agent-chat-adapter.js +12 -0
- package/dist/client/agent-chat-adapter.js.map +1 -1
- package/dist/client/agent-engine-key.d.ts +24 -0
- package/dist/client/agent-engine-key.d.ts.map +1 -0
- package/dist/client/agent-engine-key.js +49 -0
- package/dist/client/agent-engine-key.js.map +1 -0
- package/dist/client/analytics.d.ts.map +1 -1
- package/dist/client/analytics.js +34 -0
- package/dist/client/analytics.js.map +1 -1
- package/dist/client/blocks/BlockView.d.ts +35 -0
- package/dist/client/blocks/BlockView.d.ts.map +1 -0
- package/dist/client/blocks/BlockView.js +45 -0
- package/dist/client/blocks/BlockView.js.map +1 -0
- package/dist/client/blocks/SchemaBlockEditor.d.ts +25 -0
- package/dist/client/blocks/SchemaBlockEditor.d.ts.map +1 -0
- package/dist/client/blocks/SchemaBlockEditor.js +165 -0
- package/dist/client/blocks/SchemaBlockEditor.js.map +1 -0
- package/dist/client/blocks/agent.d.ts +30 -0
- package/dist/client/blocks/agent.d.ts.map +1 -0
- package/dist/client/blocks/agent.js +61 -0
- package/dist/client/blocks/agent.js.map +1 -0
- package/dist/client/blocks/index.d.ts +51 -0
- package/dist/client/blocks/index.d.ts.map +1 -0
- package/dist/client/blocks/index.js +67 -0
- package/dist/client/blocks/index.js.map +1 -0
- package/dist/client/blocks/library/AnnotatedCodeBlock.d.ts +6 -0
- package/dist/client/blocks/library/AnnotatedCodeBlock.d.ts.map +1 -0
- package/dist/client/blocks/library/AnnotatedCodeBlock.js +135 -0
- package/dist/client/blocks/library/AnnotatedCodeBlock.js.map +1 -0
- package/dist/client/blocks/library/ApiEndpointBlock.d.ts +20 -0
- package/dist/client/blocks/library/ApiEndpointBlock.d.ts.map +1 -0
- package/dist/client/blocks/library/ApiEndpointBlock.js +131 -0
- package/dist/client/blocks/library/ApiEndpointBlock.js.map +1 -0
- package/dist/client/blocks/library/DataModelBlock.d.ts +28 -0
- package/dist/client/blocks/library/DataModelBlock.d.ts.map +1 -0
- package/dist/client/blocks/library/DataModelBlock.js +222 -0
- package/dist/client/blocks/library/DataModelBlock.js.map +1 -0
- package/dist/client/blocks/library/DiffBlock.d.ts +6 -0
- package/dist/client/blocks/library/DiffBlock.d.ts.map +1 -0
- package/dist/client/blocks/library/DiffBlock.js +293 -0
- package/dist/client/blocks/library/DiffBlock.js.map +1 -0
- package/dist/client/blocks/library/FileTreeBlock.d.ts +23 -0
- package/dist/client/blocks/library/FileTreeBlock.d.ts.map +1 -0
- package/dist/client/blocks/library/FileTreeBlock.js +225 -0
- package/dist/client/blocks/library/FileTreeBlock.js.map +1 -0
- package/dist/client/blocks/library/JsonExplorerBlock.d.ts +19 -0
- package/dist/client/blocks/library/JsonExplorerBlock.d.ts.map +1 -0
- package/dist/client/blocks/library/JsonExplorerBlock.js +171 -0
- package/dist/client/blocks/library/JsonExplorerBlock.js.map +1 -0
- package/dist/client/blocks/library/MermaidBlock.d.ts +17 -0
- package/dist/client/blocks/library/MermaidBlock.d.ts.map +1 -0
- package/dist/client/blocks/library/MermaidBlock.js +131 -0
- package/dist/client/blocks/library/MermaidBlock.js.map +1 -0
- package/dist/client/blocks/library/OpenApiSpecBlock.d.ts +19 -0
- package/dist/client/blocks/library/OpenApiSpecBlock.d.ts.map +1 -0
- package/dist/client/blocks/library/OpenApiSpecBlock.js +494 -0
- package/dist/client/blocks/library/OpenApiSpecBlock.js.map +1 -0
- package/dist/client/blocks/library/annotated-code.config.d.ts +58 -0
- package/dist/client/blocks/library/annotated-code.config.d.ts.map +1 -0
- package/dist/client/blocks/library/annotated-code.config.js +53 -0
- package/dist/client/blocks/library/annotated-code.config.js.map +1 -0
- package/dist/client/blocks/library/api-endpoint.config.d.ts +71 -0
- package/dist/client/blocks/library/api-endpoint.config.d.ts.map +1 -0
- package/dist/client/blocks/library/api-endpoint.config.js +91 -0
- package/dist/client/blocks/library/api-endpoint.config.js.map +1 -0
- package/dist/client/blocks/library/checklist.config.d.ts +36 -0
- package/dist/client/blocks/library/checklist.config.d.ts.map +1 -0
- package/dist/client/blocks/library/checklist.config.js +25 -0
- package/dist/client/blocks/library/checklist.config.js.map +1 -0
- package/dist/client/blocks/library/checklist.d.ts +26 -0
- package/dist/client/blocks/library/checklist.d.ts.map +1 -0
- package/dist/client/blocks/library/checklist.js +78 -0
- package/dist/client/blocks/library/checklist.js.map +1 -0
- package/dist/client/blocks/library/code-tabs.config.d.ts +36 -0
- package/dist/client/blocks/library/code-tabs.config.d.ts.map +1 -0
- package/dist/client/blocks/library/code-tabs.config.js +30 -0
- package/dist/client/blocks/library/code-tabs.config.js.map +1 -0
- package/dist/client/blocks/library/code-tabs.d.ts +3 -0
- package/dist/client/blocks/library/code-tabs.d.ts.map +1 -0
- package/dist/client/blocks/library/code-tabs.js +165 -0
- package/dist/client/blocks/library/code-tabs.js.map +1 -0
- package/dist/client/blocks/library/data-model.config.d.ts +72 -0
- package/dist/client/blocks/library/data-model.config.d.ts.map +1 -0
- package/dist/client/blocks/library/data-model.config.js +59 -0
- package/dist/client/blocks/library/data-model.config.js.map +1 -0
- package/dist/client/blocks/library/dev-doc-ui.d.ts +49 -0
- package/dist/client/blocks/library/dev-doc-ui.d.ts.map +1 -0
- package/dist/client/blocks/library/dev-doc-ui.js +50 -0
- package/dist/client/blocks/library/dev-doc-ui.js.map +1 -0
- package/dist/client/blocks/library/diff.config.d.ts +41 -0
- package/dist/client/blocks/library/diff.config.d.ts.map +1 -0
- package/dist/client/blocks/library/diff.config.js +34 -0
- package/dist/client/blocks/library/diff.config.js.map +1 -0
- package/dist/client/blocks/library/file-tree.config.d.ts +59 -0
- package/dist/client/blocks/library/file-tree.config.d.ts.map +1 -0
- package/dist/client/blocks/library/file-tree.config.js +45 -0
- package/dist/client/blocks/library/file-tree.config.js.map +1 -0
- package/dist/client/blocks/library/html.config.d.ts +37 -0
- package/dist/client/blocks/library/html.config.d.ts.map +1 -0
- package/dist/client/blocks/library/html.config.js +46 -0
- package/dist/client/blocks/library/html.config.js.map +1 -0
- package/dist/client/blocks/library/html.d.ts +21 -0
- package/dist/client/blocks/library/html.d.ts.map +1 -0
- package/dist/client/blocks/library/html.js +72 -0
- package/dist/client/blocks/library/html.js.map +1 -0
- package/dist/client/blocks/library/json-explorer.config.d.ts +46 -0
- package/dist/client/blocks/library/json-explorer.config.d.ts.map +1 -0
- package/dist/client/blocks/library/json-explorer.config.js +28 -0
- package/dist/client/blocks/library/json-explorer.config.js.map +1 -0
- package/dist/client/blocks/library/mermaid.config.d.ts +32 -0
- package/dist/client/blocks/library/mermaid.config.d.ts.map +1 -0
- package/dist/client/blocks/library/mermaid.config.js +24 -0
- package/dist/client/blocks/library/mermaid.config.js.map +1 -0
- package/dist/client/blocks/library/openapi-spec.config.d.ts +49 -0
- package/dist/client/blocks/library/openapi-spec.config.d.ts.map +1 -0
- package/dist/client/blocks/library/openapi-spec.config.js +24 -0
- package/dist/client/blocks/library/openapi-spec.config.js.map +1 -0
- package/dist/client/blocks/library/server-specs.d.ts +35 -0
- package/dist/client/blocks/library/server-specs.d.ts.map +1 -0
- package/dist/client/blocks/library/server-specs.js +171 -0
- package/dist/client/blocks/library/server-specs.js.map +1 -0
- package/dist/client/blocks/library/specs.d.ts +29 -0
- package/dist/client/blocks/library/specs.d.ts.map +1 -0
- package/dist/client/blocks/library/specs.js +229 -0
- package/dist/client/blocks/library/specs.js.map +1 -0
- package/dist/client/blocks/library/table.config.d.ts +30 -0
- package/dist/client/blocks/library/table.config.d.ts.map +1 -0
- package/dist/client/blocks/library/table.config.js +22 -0
- package/dist/client/blocks/library/table.config.js.map +1 -0
- package/dist/client/blocks/library/table.d.ts +8 -0
- package/dist/client/blocks/library/table.d.ts.map +1 -0
- package/dist/client/blocks/library/table.js +109 -0
- package/dist/client/blocks/library/table.js.map +1 -0
- package/dist/client/blocks/library/tabs.config.d.ts +56 -0
- package/dist/client/blocks/library/tabs.config.d.ts.map +1 -0
- package/dist/client/blocks/library/tabs.config.js +36 -0
- package/dist/client/blocks/library/tabs.config.js.map +1 -0
- package/dist/client/blocks/library/tabs.d.ts +20 -0
- package/dist/client/blocks/library/tabs.d.ts.map +1 -0
- package/dist/client/blocks/library/tabs.js +123 -0
- package/dist/client/blocks/library/tabs.js.map +1 -0
- package/dist/client/blocks/mdx.d.ts +74 -0
- package/dist/client/blocks/mdx.d.ts.map +1 -0
- package/dist/client/blocks/mdx.js +205 -0
- package/dist/client/blocks/mdx.js.map +1 -0
- package/dist/client/blocks/provider.d.ts +25 -0
- package/dist/client/blocks/provider.d.ts.map +1 -0
- package/dist/client/blocks/provider.js +19 -0
- package/dist/client/blocks/provider.js.map +1 -0
- package/dist/client/blocks/registry.d.ts +32 -0
- package/dist/client/blocks/registry.d.ts.map +1 -0
- package/dist/client/blocks/registry.js +65 -0
- package/dist/client/blocks/registry.js.map +1 -0
- package/dist/client/blocks/schema-form/introspect.d.ts +31 -0
- package/dist/client/blocks/schema-form/introspect.d.ts.map +1 -0
- package/dist/client/blocks/schema-form/introspect.js +164 -0
- package/dist/client/blocks/schema-form/introspect.js.map +1 -0
- package/dist/client/blocks/server.d.ts +31 -0
- package/dist/client/blocks/server.d.ts.map +1 -0
- package/dist/client/blocks/server.js +41 -0
- package/dist/client/blocks/server.js.map +1 -0
- package/dist/client/blocks/types.d.ts +252 -0
- package/dist/client/blocks/types.d.ts.map +1 -0
- package/dist/client/blocks/types.js +5 -0
- package/dist/client/blocks/types.js.map +1 -0
- package/dist/client/composer/ComposerPlusMenu.js +10 -1
- package/dist/client/composer/ComposerPlusMenu.js.map +1 -1
- package/dist/client/guided-questions.d.ts +68 -0
- package/dist/client/guided-questions.d.ts.map +1 -1
- package/dist/client/guided-questions.js +158 -3
- package/dist/client/guided-questions.js.map +1 -1
- package/dist/client/index.d.ts +6 -1
- package/dist/client/index.d.ts.map +1 -1
- package/dist/client/index.js +24 -1
- package/dist/client/index.js.map +1 -1
- package/dist/client/rich-markdown-editor/BubbleToolbar.d.ts +37 -0
- package/dist/client/rich-markdown-editor/BubbleToolbar.d.ts.map +1 -0
- package/dist/client/rich-markdown-editor/BubbleToolbar.js +161 -0
- package/dist/client/rich-markdown-editor/BubbleToolbar.js.map +1 -0
- package/dist/client/rich-markdown-editor/DragHandle.d.ts +52 -0
- package/dist/client/rich-markdown-editor/DragHandle.d.ts.map +1 -0
- package/dist/client/rich-markdown-editor/DragHandle.js +403 -0
- package/dist/client/rich-markdown-editor/DragHandle.js.map +1 -0
- package/dist/client/rich-markdown-editor/ImageExtension.d.ts +63 -0
- package/dist/client/rich-markdown-editor/ImageExtension.d.ts.map +1 -0
- package/dist/client/rich-markdown-editor/ImageExtension.js +242 -0
- package/dist/client/rich-markdown-editor/ImageExtension.js.map +1 -0
- package/dist/client/rich-markdown-editor/RegistryBlockNode.d.ts +97 -0
- package/dist/client/rich-markdown-editor/RegistryBlockNode.d.ts.map +1 -0
- package/dist/client/rich-markdown-editor/RegistryBlockNode.js +214 -0
- package/dist/client/rich-markdown-editor/RegistryBlockNode.js.map +1 -0
- package/dist/client/rich-markdown-editor/RichMarkdownEditor.d.ts +51 -0
- package/dist/client/rich-markdown-editor/RichMarkdownEditor.d.ts.map +1 -0
- package/dist/client/rich-markdown-editor/RichMarkdownEditor.js +37 -0
- package/dist/client/rich-markdown-editor/RichMarkdownEditor.js.map +1 -0
- package/dist/client/rich-markdown-editor/RunId.d.ts +28 -0
- package/dist/client/rich-markdown-editor/RunId.d.ts.map +1 -0
- package/dist/client/rich-markdown-editor/RunId.js +60 -0
- package/dist/client/rich-markdown-editor/RunId.js.map +1 -0
- package/dist/client/rich-markdown-editor/SharedRichEditor.d.ts +85 -0
- package/dist/client/rich-markdown-editor/SharedRichEditor.d.ts.map +1 -0
- package/dist/client/rich-markdown-editor/SharedRichEditor.js +130 -0
- package/dist/client/rich-markdown-editor/SharedRichEditor.js.map +1 -0
- package/dist/client/rich-markdown-editor/SlashCommandMenu.d.ts +36 -0
- package/dist/client/rich-markdown-editor/SlashCommandMenu.d.ts.map +1 -0
- package/dist/client/rich-markdown-editor/SlashCommandMenu.js +193 -0
- package/dist/client/rich-markdown-editor/SlashCommandMenu.js.map +1 -0
- package/dist/client/rich-markdown-editor/extensions.d.ts +166 -0
- package/dist/client/rich-markdown-editor/extensions.d.ts.map +1 -0
- package/dist/client/rich-markdown-editor/extensions.js +222 -0
- package/dist/client/rich-markdown-editor/extensions.js.map +1 -0
- package/dist/client/rich-markdown-editor/gfmDoc.d.ts +24 -0
- package/dist/client/rich-markdown-editor/gfmDoc.d.ts.map +1 -0
- package/dist/client/rich-markdown-editor/gfmDoc.js +83 -0
- package/dist/client/rich-markdown-editor/gfmDoc.js.map +1 -0
- package/dist/client/rich-markdown-editor/index.d.ts +14 -0
- package/dist/client/rich-markdown-editor/index.d.ts.map +1 -0
- package/dist/client/rich-markdown-editor/index.js +14 -0
- package/dist/client/rich-markdown-editor/index.js.map +1 -0
- package/dist/client/rich-markdown-editor/registrySlashCommands.d.ts +46 -0
- package/dist/client/rich-markdown-editor/registrySlashCommands.d.ts.map +1 -0
- package/dist/client/rich-markdown-editor/registrySlashCommands.js +13 -0
- package/dist/client/rich-markdown-editor/registrySlashCommands.js.map +1 -0
- package/dist/client/rich-markdown-editor/uploadEditorImage.d.ts +18 -0
- package/dist/client/rich-markdown-editor/uploadEditorImage.d.ts.map +1 -0
- package/dist/client/rich-markdown-editor/uploadEditorImage.js +57 -0
- package/dist/client/rich-markdown-editor/uploadEditorImage.js.map +1 -0
- package/dist/client/rich-markdown-editor/useCollabReconcile.d.ts +91 -0
- package/dist/client/rich-markdown-editor/useCollabReconcile.d.ts.map +1 -0
- package/dist/client/rich-markdown-editor/useCollabReconcile.js +375 -0
- package/dist/client/rich-markdown-editor/useCollabReconcile.js.map +1 -0
- package/dist/client/track.d.ts +25 -0
- package/dist/client/track.d.ts.map +1 -0
- package/dist/client/track.js +53 -0
- package/dist/client/track.js.map +1 -0
- package/dist/client/use-action.d.ts.map +1 -1
- package/dist/client/use-action.js +6 -0
- package/dist/client/use-action.js.map +1 -1
- package/dist/client/use-session.d.ts +3 -2
- package/dist/client/use-session.d.ts.map +1 -1
- package/dist/client/use-session.js +3 -2
- package/dist/client/use-session.js.map +1 -1
- package/dist/deploy/build.d.ts +5 -0
- package/dist/deploy/build.d.ts.map +1 -1
- package/dist/deploy/build.js +67 -1
- package/dist/deploy/build.js.map +1 -1
- package/dist/extensions/schema.d.ts +1 -1
- package/dist/mcp/build-server.d.ts.map +1 -1
- package/dist/mcp/build-server.js +9 -2
- package/dist/mcp/build-server.js.map +1 -1
- package/dist/mcp/server.d.ts +1 -1
- package/dist/mcp/server.d.ts.map +1 -1
- package/dist/mcp/server.js +35 -2
- package/dist/mcp/server.js.map +1 -1
- package/dist/provider-api/index.d.ts +1 -1
- package/dist/provider-api/index.d.ts.map +1 -1
- package/dist/scripts/docs/search.d.ts.map +1 -1
- package/dist/scripts/docs/search.js +5 -2
- package/dist/scripts/docs/search.js.map +1 -1
- package/dist/scripts/runner.d.ts.map +1 -1
- package/dist/scripts/runner.js +16 -3
- package/dist/scripts/runner.js.map +1 -1
- package/dist/server/action-discovery.d.ts.map +1 -1
- package/dist/server/action-discovery.js +2 -0
- package/dist/server/action-discovery.js.map +1 -1
- package/dist/server/action-routes.d.ts.map +1 -1
- package/dist/server/action-routes.js +30 -4
- package/dist/server/action-routes.js.map +1 -1
- package/dist/server/agent-chat-plugin.d.ts.map +1 -1
- package/dist/server/agent-chat-plugin.js +65 -19
- package/dist/server/agent-chat-plugin.js.map +1 -1
- package/dist/server/agent-teams.d.ts.map +1 -1
- package/dist/server/agent-teams.js +8 -1
- package/dist/server/agent-teams.js.map +1 -1
- package/dist/server/agents-bundle.d.ts +27 -1
- package/dist/server/agents-bundle.d.ts.map +1 -1
- package/dist/server/agents-bundle.js +41 -3
- package/dist/server/agents-bundle.js.map +1 -1
- package/dist/server/auth.d.ts.map +1 -1
- package/dist/server/auth.js +76 -3
- package/dist/server/auth.js.map +1 -1
- package/dist/server/core-routes-plugin.d.ts.map +1 -1
- package/dist/server/core-routes-plugin.js +60 -0
- package/dist/server/core-routes-plugin.js.map +1 -1
- package/dist/server/onboarding-html.d.ts.map +1 -1
- package/dist/server/onboarding-html.js +160 -22
- package/dist/server/onboarding-html.js.map +1 -1
- package/dist/server/sentry.d.ts.map +1 -1
- package/dist/server/sentry.js +6 -0
- package/dist/server/sentry.js.map +1 -1
- package/dist/server/social-og-image.d.ts +2 -1
- package/dist/server/social-og-image.d.ts.map +1 -1
- package/dist/server/social-og-image.js +24 -4
- package/dist/server/social-og-image.js.map +1 -1
- package/dist/sharing/schema.d.ts +1 -1
- package/dist/styles/agent-native.css +1 -0
- package/dist/styles/rich-markdown-editor.css +439 -0
- package/dist/templates/default/.agents/skills/actions/SKILL.md +4 -1
- package/dist/templates/default/.agents/skills/security/SKILL.md +13 -4
- package/dist/templates/default/.agents/skills/storing-data/SKILL.md +15 -3
- package/dist/templates/default/AGENTS.md +1 -0
- package/dist/templates/default/DEVELOPING.md +2 -0
- package/dist/templates/workspace-core/.agents/skills/a2a-protocol/SKILL.md +10 -3
- package/dist/templates/workspace-core/.agents/skills/actions/SKILL.md +98 -10
- package/dist/templates/workspace-core/.agents/skills/adding-a-feature/SKILL.md +45 -3
- package/dist/templates/workspace-core/.agents/skills/address-feedback/SKILL.md +2 -0
- package/dist/templates/workspace-core/.agents/skills/authentication/SKILL.md +37 -4
- package/dist/templates/workspace-core/.agents/skills/automations/SKILL.md +9 -4
- package/dist/templates/workspace-core/.agents/skills/capture-learnings/SKILL.md +2 -0
- package/dist/templates/workspace-core/.agents/skills/client-methods/SKILL.md +106 -0
- package/dist/templates/workspace-core/.agents/skills/client-methods/references/legacy-client-fetch-audit-2026-06-03.md +53 -0
- package/dist/templates/workspace-core/.agents/skills/client-side-routing/SKILL.md +2 -0
- package/dist/templates/workspace-core/.agents/skills/context-awareness/SKILL.md +62 -61
- package/dist/templates/workspace-core/.agents/skills/context-xray/SKILL.md +47 -0
- package/dist/templates/workspace-core/.agents/skills/create-skill/SKILL.md +28 -0
- package/dist/templates/workspace-core/.agents/skills/delegate-to-agent/SKILL.md +52 -1
- package/dist/templates/workspace-core/.agents/skills/extension-points/SKILL.md +2 -0
- package/dist/templates/workspace-core/.agents/skills/extensions/SKILL.md +95 -433
- package/dist/templates/workspace-core/.agents/skills/extensions/references/api.md +285 -0
- package/dist/templates/workspace-core/.agents/skills/extensions/references/examples.md +259 -0
- package/dist/templates/workspace-core/.agents/skills/external-agents/SKILL.md +398 -0
- package/dist/templates/workspace-core/.agents/skills/external-agents/references/mcp-apps-embedding.md +157 -0
- package/dist/templates/workspace-core/.agents/skills/frontend-design/SKILL.md +17 -0
- package/dist/templates/workspace-core/.agents/skills/integration-webhooks/SKILL.md +13 -2
- package/dist/templates/workspace-core/.agents/skills/mvp-followup/SKILL.md +51 -0
- package/dist/templates/workspace-core/.agents/skills/observability/SKILL.md +14 -4
- package/dist/templates/workspace-core/.agents/skills/onboarding/SKILL.md +13 -1
- package/dist/templates/workspace-core/.agents/skills/portability/SKILL.md +27 -5
- package/dist/templates/workspace-core/.agents/skills/qa/SKILL.md +24 -8
- package/dist/templates/workspace-core/.agents/skills/real-time-collab/SKILL.md +53 -7
- package/dist/templates/workspace-core/.agents/skills/real-time-sync/SKILL.md +43 -10
- package/dist/templates/workspace-core/.agents/skills/recurring-jobs/SKILL.md +2 -0
- package/dist/templates/workspace-core/.agents/skills/secrets/SKILL.md +43 -14
- package/dist/templates/workspace-core/.agents/skills/security/SKILL.md +50 -1
- package/dist/templates/workspace-core/.agents/skills/self-modifying-code/SKILL.md +4 -2
- package/dist/templates/workspace-core/.agents/skills/server-plugins/SKILL.md +11 -1
- package/dist/templates/workspace-core/.agents/skills/shadcn-ui/SKILL.md +15 -0
- package/dist/templates/workspace-core/.agents/skills/sharing/SKILL.md +5 -1
- package/dist/templates/workspace-core/.agents/skills/storing-data/SKILL.md +48 -19
- package/dist/templates/workspace-core/.agents/skills/tracking/SKILL.md +7 -3
- package/dist/templates/workspace-core/.agents/skills/voice-transcription/SKILL.md +13 -6
- package/dist/templates/workspace-core/.agents/skills/writing-agent-instructions/SKILL.md +236 -0
- package/dist/templates/workspace-core/AGENTS.md +5 -1
- package/dist/templates/workspace-root/AGENTS.md +5 -2
- package/dist/tracking/route.d.ts +43 -0
- package/dist/tracking/route.d.ts.map +1 -0
- package/dist/tracking/route.js +85 -0
- package/dist/tracking/route.js.map +1 -0
- package/dist/vite/client.d.ts.map +1 -1
- package/dist/vite/client.js +15 -0
- package/dist/vite/client.js.map +1 -1
- package/docs/content/a2a-protocol.md +18 -4
- package/docs/content/actions.md +87 -0
- package/docs/content/agent-mentions.md +2 -1
- package/docs/content/authentication.md +2 -1
- package/docs/content/client.md +64 -13
- package/docs/content/cloneable-saas.md +1 -1
- package/docs/content/code-agents-ui.md +17 -11
- package/docs/content/context-awareness.md +23 -28
- package/docs/content/creating-templates.md +1 -1
- package/docs/content/drop-in-agent.md +2 -0
- package/docs/content/getting-started.md +2 -2
- package/docs/content/key-concepts.md +2 -2
- package/docs/content/messaging.md +57 -15
- package/docs/content/migration-workbench.md +1 -1
- package/docs/content/multi-app-workspace.md +1 -1
- package/docs/content/multi-tenancy.md +17 -15
- package/docs/content/real-time-collaboration.md +1 -1
- package/docs/content/recurring-jobs.md +1 -1
- package/docs/content/security.md +2 -2
- package/docs/content/server.md +4 -4
- package/docs/content/skills-guide.md +30 -0
- package/docs/content/template-analytics.md +2 -2
- package/docs/content/template-assets.md +17 -1
- package/docs/content/template-brain.md +2 -2
- package/docs/content/template-calendar.md +1 -1
- package/docs/content/template-clips.md +3 -3
- package/docs/content/template-content.md +2 -2
- package/docs/content/template-design.md +2 -2
- package/docs/content/template-dispatch.md +3 -3
- package/docs/content/template-forms.md +14 -2
- package/docs/content/template-mail.md +1 -3
- package/docs/content/template-plan.md +133 -0
- package/docs/content/template-slides.md +5 -4
- package/docs/content/template-starter.md +4 -4
- package/docs/content/template-videos.md +6 -11
- package/docs/content/tracking.md +21 -1
- package/docs/content/visual-plans.md +74 -0
- package/docs/content/workspace.md +9 -9
- package/package.json +26 -11
- package/src/templates/default/.agents/skills/actions/SKILL.md +4 -1
- package/src/templates/default/.agents/skills/security/SKILL.md +13 -4
- package/src/templates/default/.agents/skills/storing-data/SKILL.md +15 -3
- package/src/templates/default/AGENTS.md +1 -0
- package/src/templates/default/DEVELOPING.md +2 -0
- package/src/templates/workspace-core/.agents/skills/a2a-protocol/SKILL.md +10 -3
- package/src/templates/workspace-core/.agents/skills/actions/SKILL.md +98 -10
- package/src/templates/workspace-core/.agents/skills/adding-a-feature/SKILL.md +45 -3
- package/src/templates/workspace-core/.agents/skills/address-feedback/SKILL.md +2 -0
- package/src/templates/workspace-core/.agents/skills/authentication/SKILL.md +37 -4
- package/src/templates/workspace-core/.agents/skills/automations/SKILL.md +9 -4
- package/src/templates/workspace-core/.agents/skills/capture-learnings/SKILL.md +2 -0
- package/src/templates/workspace-core/.agents/skills/client-methods/SKILL.md +106 -0
- package/src/templates/workspace-core/.agents/skills/client-methods/references/legacy-client-fetch-audit-2026-06-03.md +53 -0
- package/src/templates/workspace-core/.agents/skills/client-side-routing/SKILL.md +2 -0
- package/src/templates/workspace-core/.agents/skills/context-awareness/SKILL.md +62 -61
- package/src/templates/workspace-core/.agents/skills/context-xray/SKILL.md +47 -0
- package/src/templates/workspace-core/.agents/skills/create-skill/SKILL.md +28 -0
- package/src/templates/workspace-core/.agents/skills/delegate-to-agent/SKILL.md +52 -1
- package/src/templates/workspace-core/.agents/skills/extension-points/SKILL.md +2 -0
- package/src/templates/workspace-core/.agents/skills/extensions/SKILL.md +95 -433
- package/src/templates/workspace-core/.agents/skills/extensions/references/api.md +285 -0
- package/src/templates/workspace-core/.agents/skills/extensions/references/examples.md +259 -0
- package/src/templates/workspace-core/.agents/skills/external-agents/SKILL.md +398 -0
- package/src/templates/workspace-core/.agents/skills/external-agents/references/mcp-apps-embedding.md +157 -0
- package/src/templates/workspace-core/.agents/skills/frontend-design/SKILL.md +17 -0
- package/src/templates/workspace-core/.agents/skills/integration-webhooks/SKILL.md +13 -2
- package/src/templates/workspace-core/.agents/skills/mvp-followup/SKILL.md +51 -0
- package/src/templates/workspace-core/.agents/skills/observability/SKILL.md +14 -4
- package/src/templates/workspace-core/.agents/skills/onboarding/SKILL.md +13 -1
- package/src/templates/workspace-core/.agents/skills/portability/SKILL.md +27 -5
- package/src/templates/workspace-core/.agents/skills/qa/SKILL.md +24 -8
- package/src/templates/workspace-core/.agents/skills/real-time-collab/SKILL.md +53 -7
- package/src/templates/workspace-core/.agents/skills/real-time-sync/SKILL.md +43 -10
- package/src/templates/workspace-core/.agents/skills/recurring-jobs/SKILL.md +2 -0
- package/src/templates/workspace-core/.agents/skills/secrets/SKILL.md +43 -14
- package/src/templates/workspace-core/.agents/skills/security/SKILL.md +50 -1
- package/src/templates/workspace-core/.agents/skills/self-modifying-code/SKILL.md +4 -2
- package/src/templates/workspace-core/.agents/skills/server-plugins/SKILL.md +11 -1
- package/src/templates/workspace-core/.agents/skills/shadcn-ui/SKILL.md +15 -0
- package/src/templates/workspace-core/.agents/skills/sharing/SKILL.md +5 -1
- package/src/templates/workspace-core/.agents/skills/storing-data/SKILL.md +48 -19
- package/src/templates/workspace-core/.agents/skills/tracking/SKILL.md +7 -3
- package/src/templates/workspace-core/.agents/skills/voice-transcription/SKILL.md +13 -6
- package/src/templates/workspace-core/.agents/skills/writing-agent-instructions/SKILL.md +236 -0
- package/src/templates/workspace-core/AGENTS.md +5 -1
- package/src/templates/workspace-root/AGENTS.md +5 -2
|
@@ -0,0 +1,494 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useId, useMemo, useState } from "react";
|
|
3
|
+
import { IconChevronRight, IconLock } from "@tabler/icons-react";
|
|
4
|
+
import { cn } from "../../utils.js";
|
|
5
|
+
import { DevInput, DevLabel, DevTextarea } from "./dev-doc-ui.js";
|
|
6
|
+
/**
|
|
7
|
+
* Read + Edit renderers for an `openapi-spec` block — a Redoc / Swagger-UI-style
|
|
8
|
+
* API reference rendered from a whole OpenAPI 3 / Swagger 2 document. The raw
|
|
9
|
+
* `spec` TEXT (`data.spec`) is the source of truth; the Read renderer parses it
|
|
10
|
+
* defensively and, on any parse error, falls back to the raw text plus the error
|
|
11
|
+
* message (it never throws). Lives in core so any app can register the dev-doc
|
|
12
|
+
* block (no shadcn import).
|
|
13
|
+
*
|
|
14
|
+
* Operations are grouped by tag; each operation is a collapsed-by-default row
|
|
15
|
+
* (colored method pill + monospace path + summary) that expands to its
|
|
16
|
+
* description, params table, request body, and per-status responses — the SAME
|
|
17
|
+
* per-operation house style as the single-endpoint `api-endpoint` block. `$ref`
|
|
18
|
+
* model references are resolved against `components.schemas` (OpenAPI 3) or
|
|
19
|
+
* top-level `definitions` (Swagger 2), with a cycle guard.
|
|
20
|
+
*
|
|
21
|
+
* v1 parses JSON specs only (no `yaml` dependency is declared). `parseSpec` is
|
|
22
|
+
* the single seam to extend when a YAML parser is added.
|
|
23
|
+
*
|
|
24
|
+
* DARK/LIGHT: the plan editor toggles a `.dark` class on <html>. Every color
|
|
25
|
+
* token (method/status/location pills, chrome) uses Tailwind `dark:` variants or
|
|
26
|
+
* the theme-aware plan CSS-var utilities, so the reference reads correctly in
|
|
27
|
+
* BOTH modes (no hardcoded dark-only palette). SSR-safe: rendering derives only
|
|
28
|
+
* from props (no window/document access at module or render time).
|
|
29
|
+
*/
|
|
30
|
+
/* ── Theme-aware color tokens (mirrors ApiEndpointBlock) ────────────────────── */
|
|
31
|
+
const METHOD_PILL = {
|
|
32
|
+
GET: "bg-emerald-100 text-emerald-700 dark:bg-emerald-500/15 dark:text-emerald-300",
|
|
33
|
+
POST: "bg-blue-100 text-blue-700 dark:bg-blue-500/15 dark:text-blue-300",
|
|
34
|
+
PUT: "bg-amber-100 text-amber-700 dark:bg-amber-500/15 dark:text-amber-300",
|
|
35
|
+
PATCH: "bg-violet-100 text-violet-700 dark:bg-violet-500/15 dark:text-violet-300",
|
|
36
|
+
DELETE: "bg-red-100 text-red-700 dark:bg-red-500/15 dark:text-red-300",
|
|
37
|
+
HEAD: "bg-slate-200 text-slate-700 dark:bg-slate-500/20 dark:text-slate-300",
|
|
38
|
+
OPTIONS: "bg-slate-200 text-slate-700 dark:bg-slate-500/20 dark:text-slate-300",
|
|
39
|
+
TRACE: "bg-slate-200 text-slate-700 dark:bg-slate-500/20 dark:text-slate-300",
|
|
40
|
+
};
|
|
41
|
+
const PARAM_IN_BADGE = {
|
|
42
|
+
path: "bg-violet-100 text-violet-700 dark:bg-violet-500/15 dark:text-violet-300",
|
|
43
|
+
query: "bg-blue-100 text-blue-700 dark:bg-blue-500/15 dark:text-blue-300",
|
|
44
|
+
header: "bg-amber-100 text-amber-700 dark:bg-amber-500/15 dark:text-amber-300",
|
|
45
|
+
cookie: "bg-emerald-100 text-emerald-700 dark:bg-emerald-500/15 dark:text-emerald-300",
|
|
46
|
+
body: "bg-emerald-100 text-emerald-700 dark:bg-emerald-500/15 dark:text-emerald-300",
|
|
47
|
+
};
|
|
48
|
+
/** Status-pill palette keyed by the leading status digit (2xx/3xx/4xx/5xx). */
|
|
49
|
+
function statusPillClass(status) {
|
|
50
|
+
const lead = status.trim().charAt(0);
|
|
51
|
+
if (lead === "2")
|
|
52
|
+
return "bg-emerald-100 text-emerald-700 dark:bg-emerald-500/15 dark:text-emerald-300";
|
|
53
|
+
if (lead === "4")
|
|
54
|
+
return "bg-amber-100 text-amber-700 dark:bg-amber-500/15 dark:text-amber-300";
|
|
55
|
+
if (lead === "5")
|
|
56
|
+
return "bg-red-100 text-red-700 dark:bg-red-500/15 dark:text-red-300";
|
|
57
|
+
return "bg-slate-200 text-slate-700 dark:bg-slate-500/20 dark:text-slate-300";
|
|
58
|
+
}
|
|
59
|
+
const HTTP_METHODS = [
|
|
60
|
+
"get",
|
|
61
|
+
"post",
|
|
62
|
+
"put",
|
|
63
|
+
"patch",
|
|
64
|
+
"delete",
|
|
65
|
+
"head",
|
|
66
|
+
"options",
|
|
67
|
+
"trace",
|
|
68
|
+
];
|
|
69
|
+
function isObject(value) {
|
|
70
|
+
return value !== null && typeof value === "object" && !Array.isArray(value);
|
|
71
|
+
}
|
|
72
|
+
function asString(value) {
|
|
73
|
+
return typeof value === "string" ? value : undefined;
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Parse the raw spec text into a JSON object. v1 supports JSON only — a YAML
|
|
77
|
+
* parser is not a declared dependency. This is the single seam to extend with
|
|
78
|
+
* YAML once `yaml` is a real dependency.
|
|
79
|
+
*/
|
|
80
|
+
function parseSpec(raw) {
|
|
81
|
+
const trimmed = raw.trim();
|
|
82
|
+
if (!trimmed) {
|
|
83
|
+
return {
|
|
84
|
+
ok: false,
|
|
85
|
+
error: "Empty spec — paste an OpenAPI 3 / Swagger 2 document.",
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
let doc;
|
|
89
|
+
try {
|
|
90
|
+
doc = JSON.parse(trimmed);
|
|
91
|
+
}
|
|
92
|
+
catch (error) {
|
|
93
|
+
const hint = /^[A-Za-z][\w-]*\s*:/.test(trimmed) || trimmed.startsWith("---")
|
|
94
|
+
? " (YAML is not supported yet — paste JSON, or convert the spec to JSON.)"
|
|
95
|
+
: "";
|
|
96
|
+
return {
|
|
97
|
+
ok: false,
|
|
98
|
+
error: `${error instanceof Error ? error.message : "Invalid JSON"}${hint}`,
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
if (!isObject(doc)) {
|
|
102
|
+
return { ok: false, error: "Spec must be a JSON object." };
|
|
103
|
+
}
|
|
104
|
+
try {
|
|
105
|
+
return { ok: true, spec: normalizeSpec(doc) };
|
|
106
|
+
}
|
|
107
|
+
catch (error) {
|
|
108
|
+
return {
|
|
109
|
+
ok: false,
|
|
110
|
+
error: error instanceof Error
|
|
111
|
+
? error.message
|
|
112
|
+
: "Could not interpret the spec document.",
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
/** Resolve a local `$ref` (e.g. `#/components/schemas/User`) against the root. */
|
|
117
|
+
function resolveRef(root, ref, seen) {
|
|
118
|
+
if (!ref.startsWith("#/"))
|
|
119
|
+
return undefined;
|
|
120
|
+
if (seen.has(ref))
|
|
121
|
+
return undefined; // cycle guard
|
|
122
|
+
seen.add(ref);
|
|
123
|
+
const segments = ref
|
|
124
|
+
.slice(2)
|
|
125
|
+
.split("/")
|
|
126
|
+
.map((seg) => seg.replace(/~1/g, "/").replace(/~0/g, "~"));
|
|
127
|
+
let current = root;
|
|
128
|
+
for (const segment of segments) {
|
|
129
|
+
if (!isObject(current))
|
|
130
|
+
return undefined;
|
|
131
|
+
current = current[segment];
|
|
132
|
+
}
|
|
133
|
+
return current;
|
|
134
|
+
}
|
|
135
|
+
/** Follow a single `$ref` hop on a schema/param object if present. */
|
|
136
|
+
function deref(root, value, seen) {
|
|
137
|
+
let current = value;
|
|
138
|
+
let guard = 0;
|
|
139
|
+
while (isObject(current) && typeof current.$ref === "string" && guard < 20) {
|
|
140
|
+
const resolved = resolveRef(root, current.$ref, seen);
|
|
141
|
+
if (resolved === undefined)
|
|
142
|
+
return current;
|
|
143
|
+
current = resolved;
|
|
144
|
+
guard += 1;
|
|
145
|
+
}
|
|
146
|
+
return current;
|
|
147
|
+
}
|
|
148
|
+
/** Short human type label for a (deref'd) schema object. */
|
|
149
|
+
function schemaTypeLabel(root, schema, seen) {
|
|
150
|
+
const resolved = deref(root, schema, new Set(seen));
|
|
151
|
+
if (!isObject(resolved))
|
|
152
|
+
return undefined;
|
|
153
|
+
if (typeof resolved.type === "string") {
|
|
154
|
+
if (resolved.type === "array" && resolved.items) {
|
|
155
|
+
const inner = schemaTypeLabel(root, resolved.items, seen);
|
|
156
|
+
return inner ? `${inner}[]` : "array";
|
|
157
|
+
}
|
|
158
|
+
return resolved.type;
|
|
159
|
+
}
|
|
160
|
+
if (resolved.$ref && typeof resolved.$ref === "string") {
|
|
161
|
+
return resolved.$ref.split("/").pop();
|
|
162
|
+
}
|
|
163
|
+
if (resolved.enum)
|
|
164
|
+
return "enum";
|
|
165
|
+
if (resolved.properties)
|
|
166
|
+
return "object";
|
|
167
|
+
if (resolved.oneOf || resolved.anyOf || resolved.allOf)
|
|
168
|
+
return "object";
|
|
169
|
+
return undefined;
|
|
170
|
+
}
|
|
171
|
+
/**
|
|
172
|
+
* Build a compact JSON skeleton from a (resolved) schema so the request/response
|
|
173
|
+
* panels can show a Swagger-UI-style model preview. Bounded depth + a cycle
|
|
174
|
+
* guard keep it safe on recursive models.
|
|
175
|
+
*/
|
|
176
|
+
function schemaExample(root, schema, seen, depth) {
|
|
177
|
+
if (depth > 6)
|
|
178
|
+
return "…";
|
|
179
|
+
const resolved = deref(root, schema, new Set(seen));
|
|
180
|
+
if (!isObject(resolved))
|
|
181
|
+
return resolved ?? null;
|
|
182
|
+
if (resolved.example !== undefined)
|
|
183
|
+
return resolved.example;
|
|
184
|
+
if (resolved.default !== undefined)
|
|
185
|
+
return resolved.default;
|
|
186
|
+
if (Array.isArray(resolved.enum) && resolved.enum.length > 0) {
|
|
187
|
+
return resolved.enum[0];
|
|
188
|
+
}
|
|
189
|
+
const allOf = Array.isArray(resolved.allOf) ? resolved.allOf : null;
|
|
190
|
+
if (allOf) {
|
|
191
|
+
const merged = {};
|
|
192
|
+
for (const part of allOf) {
|
|
193
|
+
const value = schemaExample(root, part, seen, depth + 1);
|
|
194
|
+
if (isObject(value))
|
|
195
|
+
Object.assign(merged, value);
|
|
196
|
+
}
|
|
197
|
+
if (Object.keys(merged).length > 0)
|
|
198
|
+
return merged;
|
|
199
|
+
}
|
|
200
|
+
const oneOf = (Array.isArray(resolved.oneOf) && resolved.oneOf) ||
|
|
201
|
+
(Array.isArray(resolved.anyOf) && resolved.anyOf) ||
|
|
202
|
+
null;
|
|
203
|
+
if (oneOf && oneOf.length > 0) {
|
|
204
|
+
return schemaExample(root, oneOf[0], seen, depth + 1);
|
|
205
|
+
}
|
|
206
|
+
const type = resolved.type;
|
|
207
|
+
if (type === "object" || resolved.properties) {
|
|
208
|
+
const props = isObject(resolved.properties) ? resolved.properties : {};
|
|
209
|
+
const out = {};
|
|
210
|
+
for (const [key, propSchema] of Object.entries(props).slice(0, 30)) {
|
|
211
|
+
out[key] = schemaExample(root, propSchema, seen, depth + 1);
|
|
212
|
+
}
|
|
213
|
+
return out;
|
|
214
|
+
}
|
|
215
|
+
if (type === "array") {
|
|
216
|
+
return [schemaExample(root, resolved.items ?? {}, seen, depth + 1)];
|
|
217
|
+
}
|
|
218
|
+
if (type === "integer" || type === "number")
|
|
219
|
+
return 0;
|
|
220
|
+
if (type === "boolean")
|
|
221
|
+
return true;
|
|
222
|
+
if (type === "string") {
|
|
223
|
+
if (resolved.format === "date-time")
|
|
224
|
+
return "2020-01-01T00:00:00Z";
|
|
225
|
+
if (resolved.format === "uuid")
|
|
226
|
+
return "00000000-0000-0000-0000-000000000000";
|
|
227
|
+
return "string";
|
|
228
|
+
}
|
|
229
|
+
return null;
|
|
230
|
+
}
|
|
231
|
+
/** Stringify a derived example, guarding against oversized payloads. */
|
|
232
|
+
function stringifyExample(value) {
|
|
233
|
+
try {
|
|
234
|
+
const text = JSON.stringify(value, null, 2);
|
|
235
|
+
if (!text || text === "null" || text === "{}" || text === "[]")
|
|
236
|
+
return undefined;
|
|
237
|
+
return text.length > 8_000 ? `${text.slice(0, 8_000)}\n…` : text;
|
|
238
|
+
}
|
|
239
|
+
catch {
|
|
240
|
+
return undefined;
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
function normalizeParam(root, raw, seen) {
|
|
244
|
+
const param = deref(root, raw, new Set(seen));
|
|
245
|
+
if (!isObject(param))
|
|
246
|
+
return undefined;
|
|
247
|
+
const name = asString(param.name);
|
|
248
|
+
const location = asString(param.in);
|
|
249
|
+
if (!name || !location)
|
|
250
|
+
return undefined;
|
|
251
|
+
// OpenAPI 3 nests type under `schema`; Swagger 2 puts it on the param.
|
|
252
|
+
const type = schemaTypeLabel(root, param.schema, seen) ?? asString(param.type);
|
|
253
|
+
return {
|
|
254
|
+
name,
|
|
255
|
+
in: location,
|
|
256
|
+
type,
|
|
257
|
+
required: param.required === true,
|
|
258
|
+
description: asString(param.description),
|
|
259
|
+
};
|
|
260
|
+
}
|
|
261
|
+
function normalizeOperation(root, path, method, rawOp, pathLevelParams, seen) {
|
|
262
|
+
if (!isObject(rawOp))
|
|
263
|
+
return undefined;
|
|
264
|
+
const params = [...pathLevelParams];
|
|
265
|
+
if (Array.isArray(rawOp.parameters)) {
|
|
266
|
+
for (const rawParam of rawOp.parameters) {
|
|
267
|
+
const normalized = normalizeParam(root, rawParam, seen);
|
|
268
|
+
if (normalized)
|
|
269
|
+
params.push(normalized);
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
// Request body: OpenAPI 3 `requestBody.content[*].schema`; Swagger 2 `body` param.
|
|
273
|
+
let requestContentType;
|
|
274
|
+
let requestExample;
|
|
275
|
+
const requestBody = deref(root, rawOp.requestBody, new Set(seen));
|
|
276
|
+
if (isObject(requestBody) && isObject(requestBody.content)) {
|
|
277
|
+
const [contentType, media] = Object.entries(requestBody.content)[0] ?? [];
|
|
278
|
+
requestContentType = contentType;
|
|
279
|
+
if (isObject(media)) {
|
|
280
|
+
requestExample =
|
|
281
|
+
stringifyExample(media.example) ??
|
|
282
|
+
stringifyExample(schemaExample(root, media.schema, seen, 0));
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
else {
|
|
286
|
+
const bodyParam = params.find((p) => p.in === "body");
|
|
287
|
+
if (bodyParam) {
|
|
288
|
+
// Swagger 2 body param carries its schema on the raw parameter.
|
|
289
|
+
const rawBody = Array.isArray(rawOp.parameters)
|
|
290
|
+
? rawOp.parameters.find((p) => isObject(deref(root, p, new Set(seen))) &&
|
|
291
|
+
asString(deref(root, p, new Set(seen)).in) ===
|
|
292
|
+
"body")
|
|
293
|
+
: undefined;
|
|
294
|
+
const resolvedBody = isObject(deref(root, rawBody, new Set(seen)))
|
|
295
|
+
? deref(root, rawBody, new Set(seen))
|
|
296
|
+
: undefined;
|
|
297
|
+
requestContentType = "application/json";
|
|
298
|
+
requestExample = stringifyExample(schemaExample(root, resolvedBody?.schema, seen, 0));
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
// Swagger 2 `body` params are represented via requestBody above; drop them
|
|
302
|
+
// from the visible param table so they don't double-render.
|
|
303
|
+
const visibleParams = params.filter((p) => p.in !== "body");
|
|
304
|
+
const responses = [];
|
|
305
|
+
if (isObject(rawOp.responses)) {
|
|
306
|
+
for (const [status, rawResponse] of Object.entries(rawOp.responses)) {
|
|
307
|
+
const response = deref(root, rawResponse, new Set(seen));
|
|
308
|
+
let example;
|
|
309
|
+
if (isObject(response)) {
|
|
310
|
+
// OpenAPI 3: response.content[*].schema; Swagger 2: response.schema.
|
|
311
|
+
if (isObject(response.content)) {
|
|
312
|
+
const media = Object.values(response.content)[0];
|
|
313
|
+
if (isObject(media)) {
|
|
314
|
+
example =
|
|
315
|
+
stringifyExample(media.example) ??
|
|
316
|
+
stringifyExample(schemaExample(root, media.schema, seen, 0));
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
else if (response.schema) {
|
|
320
|
+
example = stringifyExample(schemaExample(root, response.schema, seen, 0));
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
responses.push({
|
|
324
|
+
status,
|
|
325
|
+
description: isObject(response)
|
|
326
|
+
? asString(response.description)
|
|
327
|
+
: undefined,
|
|
328
|
+
example,
|
|
329
|
+
});
|
|
330
|
+
}
|
|
331
|
+
}
|
|
332
|
+
const tags = Array.isArray(rawOp.tags) && rawOp.tags.length > 0
|
|
333
|
+
? rawOp.tags.filter((t) => typeof t === "string")
|
|
334
|
+
: [];
|
|
335
|
+
const secured = Array.isArray(rawOp.security) && rawOp.security.length > 0
|
|
336
|
+
? rawOp.security.some((req) => isObject(req) && Object.keys(req).length > 0)
|
|
337
|
+
: undefined;
|
|
338
|
+
return {
|
|
339
|
+
id: `${method}-${path}`,
|
|
340
|
+
method: method.toUpperCase(),
|
|
341
|
+
path,
|
|
342
|
+
summary: asString(rawOp.summary),
|
|
343
|
+
description: asString(rawOp.description),
|
|
344
|
+
deprecated: rawOp.deprecated === true,
|
|
345
|
+
secured,
|
|
346
|
+
tags: tags.length > 0 ? tags : ["default"],
|
|
347
|
+
params: visibleParams,
|
|
348
|
+
requestContentType,
|
|
349
|
+
requestExample,
|
|
350
|
+
responses: responses.sort((a, b) => a.status.localeCompare(b.status)),
|
|
351
|
+
};
|
|
352
|
+
}
|
|
353
|
+
function normalizeSpec(doc) {
|
|
354
|
+
const format = typeof doc.openapi === "string"
|
|
355
|
+
? "OpenAPI 3"
|
|
356
|
+
: typeof doc.swagger === "string"
|
|
357
|
+
? "Swagger 2"
|
|
358
|
+
: "Unknown";
|
|
359
|
+
const info = isObject(doc.info) ? doc.info : undefined;
|
|
360
|
+
// Global security requirement → every operation without its own override is
|
|
361
|
+
// secured. Operation-level `security: []` opts out; we treat presence here as
|
|
362
|
+
// the default-secured signal.
|
|
363
|
+
const globalSecured = Array.isArray(doc.security) &&
|
|
364
|
+
doc.security.some((req) => isObject(req) && Object.keys(req).length > 0);
|
|
365
|
+
// Tag order + descriptions from the document's top-level `tags`.
|
|
366
|
+
const tagOrder = [];
|
|
367
|
+
const tagDescriptions = new Map();
|
|
368
|
+
if (Array.isArray(doc.tags)) {
|
|
369
|
+
for (const tag of doc.tags) {
|
|
370
|
+
if (isObject(tag) && typeof tag.name === "string") {
|
|
371
|
+
tagOrder.push(tag.name);
|
|
372
|
+
if (typeof tag.description === "string") {
|
|
373
|
+
tagDescriptions.set(tag.name, tag.description);
|
|
374
|
+
}
|
|
375
|
+
}
|
|
376
|
+
}
|
|
377
|
+
}
|
|
378
|
+
const groups = new Map();
|
|
379
|
+
let operationCount = 0;
|
|
380
|
+
const paths = isObject(doc.paths) ? doc.paths : {};
|
|
381
|
+
for (const [path, rawPathItem] of Object.entries(paths)) {
|
|
382
|
+
const seen = new Set();
|
|
383
|
+
const pathItem = deref(doc, rawPathItem, seen);
|
|
384
|
+
if (!isObject(pathItem))
|
|
385
|
+
continue;
|
|
386
|
+
const pathLevelParams = [];
|
|
387
|
+
if (Array.isArray(pathItem.parameters)) {
|
|
388
|
+
for (const rawParam of pathItem.parameters) {
|
|
389
|
+
const normalized = normalizeParam(doc, rawParam, new Set());
|
|
390
|
+
if (normalized)
|
|
391
|
+
pathLevelParams.push(normalized);
|
|
392
|
+
}
|
|
393
|
+
}
|
|
394
|
+
for (const method of HTTP_METHODS) {
|
|
395
|
+
const rawOp = pathItem[method];
|
|
396
|
+
if (!isObject(rawOp))
|
|
397
|
+
continue;
|
|
398
|
+
const operation = normalizeOperation(doc, path, method, rawOp, pathLevelParams, new Set());
|
|
399
|
+
if (!operation)
|
|
400
|
+
continue;
|
|
401
|
+
if (operation.secured === undefined && globalSecured) {
|
|
402
|
+
operation.secured = true;
|
|
403
|
+
}
|
|
404
|
+
operationCount += 1;
|
|
405
|
+
for (const tag of operation.tags) {
|
|
406
|
+
const list = groups.get(tag) ?? [];
|
|
407
|
+
list.push(operation);
|
|
408
|
+
groups.set(tag, list);
|
|
409
|
+
}
|
|
410
|
+
}
|
|
411
|
+
}
|
|
412
|
+
// Order: documented tags first (in their declared order), then any remaining
|
|
413
|
+
// tags alphabetically.
|
|
414
|
+
const orderedTagNames = [
|
|
415
|
+
...tagOrder.filter((tag) => groups.has(tag)),
|
|
416
|
+
...[...groups.keys()]
|
|
417
|
+
.filter((tag) => !tagOrder.includes(tag))
|
|
418
|
+
.sort((a, b) => a.localeCompare(b)),
|
|
419
|
+
];
|
|
420
|
+
const groupList = orderedTagNames.map((tag) => ({
|
|
421
|
+
tag,
|
|
422
|
+
description: tagDescriptions.get(tag),
|
|
423
|
+
operations: groups.get(tag) ?? [],
|
|
424
|
+
}));
|
|
425
|
+
return {
|
|
426
|
+
title: info ? asString(info.title) : undefined,
|
|
427
|
+
version: info ? asString(info.version) : undefined,
|
|
428
|
+
description: info ? asString(info.description) : undefined,
|
|
429
|
+
format,
|
|
430
|
+
groups: groupList,
|
|
431
|
+
operationCount,
|
|
432
|
+
};
|
|
433
|
+
}
|
|
434
|
+
/* ── Operation row (collapsed-by-default, mirrors api-endpoint) ─────────────── */
|
|
435
|
+
function OperationRow({ operation, renderMarkdown, }) {
|
|
436
|
+
const [open, setOpen] = useState(false);
|
|
437
|
+
const hasBody = Boolean(operation.description?.trim()) ||
|
|
438
|
+
operation.params.length > 0 ||
|
|
439
|
+
Boolean(operation.requestExample || operation.requestContentType) ||
|
|
440
|
+
operation.responses.length > 0;
|
|
441
|
+
return (_jsxs("div", { className: "overflow-hidden border-t border-plan-line first:border-t-0", children: [_jsxs("button", { type: "button", "data-plan-interactive": true, "aria-expanded": open, onClick: () => setOpen((value) => !value), className: cn("flex w-full items-center gap-3 px-4 py-2.5 text-left transition-colors", "hover:bg-accent/40"), children: [_jsx(IconChevronRight, { className: cn("size-4 shrink-0 text-plan-muted transition-transform", open && "rotate-90") }), _jsx("span", { className: cn("shrink-0 rounded-md px-2 py-1 font-mono text-xs font-bold uppercase tracking-wide", METHOD_PILL[operation.method] ??
|
|
442
|
+
"bg-slate-200 text-slate-700 dark:bg-slate-500/20 dark:text-slate-300"), children: operation.method }), _jsx("span", { className: cn("min-w-0 truncate font-mono text-sm font-semibold text-plan-text", operation.deprecated && "text-plan-muted line-through"), children: operation.path }), operation.summary && (_jsx("span", { className: "ml-1 min-w-0 flex-1 truncate text-sm text-plan-muted", children: operation.summary })), operation.secured && (_jsx(IconLock, { className: "size-3.5 shrink-0 text-plan-muted", "aria-label": "Requires authentication" }))] }), open && hasBody && (_jsxs("div", { className: "border-t border-plan-line bg-plan-block px-4 py-4", children: [operation.description?.trim() && (_jsx("div", { className: "an-api-endpoint-desc", children: renderMarkdown ? (renderMarkdown(operation.description)) : (_jsx("p", { className: "text-sm text-plan-muted", children: operation.description })) })), operation.params.length > 0 && (_jsxs("div", { className: "mt-4", children: [_jsx("div", { className: "text-xs font-semibold uppercase tracking-wide text-plan-muted", children: "Parameters" }), _jsx("div", { className: "mt-2 overflow-hidden rounded-lg border border-plan-line", children: _jsxs("table", { className: "w-full border-collapse text-sm", children: [_jsx("thead", { children: _jsxs("tr", { className: "bg-accent/30 text-left text-xs uppercase tracking-wide text-plan-muted", children: [_jsx("th", { className: "px-3 py-2 font-medium", children: "Name" }), _jsx("th", { className: "px-3 py-2 font-medium", children: "In" }), _jsx("th", { className: "px-3 py-2 font-medium", children: "Type" }), _jsx("th", { className: "px-3 py-2 font-medium", children: "Required" }), _jsx("th", { className: "px-3 py-2 font-medium", children: "Description" })] }) }), _jsx("tbody", { children: operation.params.map((param, index) => (_jsxs("tr", { className: "border-t border-plan-line align-top", children: [_jsx("td", { className: "px-3 py-2 font-mono text-xs font-semibold text-plan-text", children: param.name }), _jsx("td", { className: "px-3 py-2", children: _jsx("span", { className: cn("rounded px-1.5 py-0.5 font-mono text-[11px] font-semibold", PARAM_IN_BADGE[param.in] ??
|
|
443
|
+
"bg-slate-200 text-slate-700 dark:bg-slate-500/20 dark:text-slate-300"), children: param.in }) }), _jsx("td", { className: "px-3 py-2 font-mono text-xs text-plan-muted", children: param.type || "—" }), _jsx("td", { className: "px-3 py-2 text-xs", children: param.required ? (_jsx("span", { className: "font-medium text-red-600 dark:text-red-300", children: "required" })) : (_jsx("span", { className: "text-plan-muted", children: "optional" })) }), _jsx("td", { className: "px-3 py-2 text-xs text-plan-muted", children: param.description || "—" })] }, `${param.name}-${param.in}-${index}`))) })] }) })] })), (operation.requestExample || operation.requestContentType) && (_jsxs("div", { className: "mt-4", children: [_jsxs("div", { className: "flex items-center gap-2", children: [_jsx("span", { className: "text-xs font-semibold uppercase tracking-wide text-plan-muted", children: "Request body" }), operation.requestContentType && (_jsx("span", { className: "rounded bg-accent/40 px-1.5 py-0.5 font-mono text-[11px] text-plan-muted", children: operation.requestContentType }))] }), operation.requestExample && (_jsx("pre", { className: "mt-2 overflow-auto rounded-lg border border-plan-line bg-plan-code px-3 py-2 font-mono text-xs text-plan-code-text", children: operation.requestExample }))] })), operation.responses.length > 0 && (_jsxs("div", { className: "mt-4", children: [_jsx("div", { className: "text-xs font-semibold uppercase tracking-wide text-plan-muted", children: "Responses" }), _jsx("div", { className: "mt-2 flex flex-col gap-3", children: operation.responses.map((response, index) => (_jsxs("div", { className: "rounded-lg border border-plan-line", children: [_jsxs("div", { className: "flex items-center gap-2 px-3 py-2", children: [_jsx("span", { className: cn("rounded px-2 py-0.5 font-mono text-xs font-bold", statusPillClass(response.status)), children: response.status }), response.description && (_jsx("span", { className: "text-sm text-plan-muted", children: response.description }))] }), response.example && (_jsx("pre", { className: "overflow-auto border-t border-plan-line bg-plan-code px-3 py-2 font-mono text-xs text-plan-code-text", children: response.example }))] }, `${response.status}-${index}`))) })] }))] }))] }));
|
|
444
|
+
}
|
|
445
|
+
/* ── Tag group (collapsed-by-default) ──────────────────────────────────────── */
|
|
446
|
+
function TagGroup({ group, defaultOpen, renderMarkdown, }) {
|
|
447
|
+
const [open, setOpen] = useState(defaultOpen);
|
|
448
|
+
return (_jsxs("div", { className: "overflow-hidden rounded-xl border border-plan-line bg-plan-block", children: [_jsxs("button", { type: "button", "data-plan-interactive": true, "aria-expanded": open, onClick: () => setOpen((value) => !value), className: "flex w-full items-center gap-2 px-4 py-3 text-left transition-colors hover:bg-accent/40", children: [_jsx(IconChevronRight, { className: cn("size-4 shrink-0 text-plan-muted transition-transform", open && "rotate-90") }), _jsx("span", { className: "font-semibold text-plan-text", children: group.tag }), _jsx("span", { className: "rounded-full bg-accent/40 px-2 py-0.5 text-[11px] font-medium text-plan-muted", children: group.operations.length }), group.description && (_jsx("span", { className: "ml-1 min-w-0 flex-1 truncate text-sm text-plan-muted", children: group.description }))] }), open && (_jsx("div", { className: "border-t border-plan-line", children: group.operations.map((operation) => (_jsx(OperationRow, { operation: operation, renderMarkdown: renderMarkdown }, operation.id))) }))] }));
|
|
449
|
+
}
|
|
450
|
+
/* ── Read (Redoc / Swagger-UI-style reference) ─────────────────────────────── */
|
|
451
|
+
/**
|
|
452
|
+
* Read-only renderer for an `openapi-spec` block. Parses `data.spec` defensively
|
|
453
|
+
* and renders a Redoc / Swagger-UI-style reference: a header (title + version +
|
|
454
|
+
* format badge), then operations grouped by tag, each a collapsed-by-default row
|
|
455
|
+
* that expands to the full per-operation reference. On a parse error it shows the
|
|
456
|
+
* error plus the raw payload (never throws).
|
|
457
|
+
*/
|
|
458
|
+
export function OpenApiSpecRead({ data, blockId, title, summary, ctx, }) {
|
|
459
|
+
const parsed = useMemo(() => parseSpec(data.spec), [data.spec]);
|
|
460
|
+
const heading = data.title ?? title;
|
|
461
|
+
const renderMarkdown = ctx.renderMarkdown;
|
|
462
|
+
return (_jsxs("section", { className: "plan-block", "data-block-id": blockId, children: [heading && _jsx("div", { className: "plan-block-label", children: heading }), parsed.ok && parsed.spec ? (_jsxs("div", { className: "flex flex-col gap-3", children: [_jsxs("div", { className: "overflow-hidden rounded-xl border border-plan-line bg-plan-block px-4 py-3", children: [_jsxs("div", { className: "flex flex-wrap items-center gap-2", children: [_jsx("span", { className: "font-semibold text-plan-text", children: parsed.spec.title || "API reference" }), parsed.spec.version && (_jsxs("span", { className: "rounded bg-accent/40 px-1.5 py-0.5 font-mono text-[11px] text-plan-muted", children: ["v", parsed.spec.version] })), _jsx("span", { className: "rounded-full border border-plan-line px-2 py-0.5 text-[11px] font-medium text-plan-muted", children: parsed.spec.format }), _jsxs("span", { className: "text-xs text-plan-muted", children: [parsed.spec.operationCount, " ", parsed.spec.operationCount === 1 ? "operation" : "operations"] })] }), parsed.spec.description?.trim() && (_jsx("div", { className: "mt-2 an-api-endpoint-desc", children: renderMarkdown ? (renderMarkdown(parsed.spec.description)) : (_jsx("p", { className: "text-sm text-plan-muted", children: parsed.spec.description })) }))] }), parsed.spec.groups.length === 0 ? (_jsx("div", { className: "rounded-xl border border-plan-line bg-plan-block px-4 py-6 text-center text-sm text-plan-muted", children: "No operations found in this spec." })) : (parsed.spec.groups.map((group, index) => (_jsx(TagGroup, { group: group,
|
|
463
|
+
// Open the first group by default so the reference is not a wall
|
|
464
|
+
// of collapsed accordions on first paint.
|
|
465
|
+
defaultOpen: index === 0, renderMarkdown: renderMarkdown }, group.tag))))] })) : (_jsxs("div", { className: "overflow-hidden rounded-xl border border-plan-line bg-plan-code", children: [_jsx("div", { className: "border-b border-plan-line px-3 py-1.5", children: _jsx("span", { className: "font-mono text-xs uppercase tracking-wide text-plan-muted", children: "OpenAPI" }) }), _jsxs("div", { className: "space-y-2 px-3 py-2.5", children: [_jsxs("p", { className: "text-xs text-red-600 dark:text-red-300", children: ["Could not parse spec: ", parsed.error] }), _jsx("pre", { className: "overflow-auto whitespace-pre-wrap break-words font-mono text-xs text-plan-code-text", children: data.spec || "—" })] })] })), summary && _jsx("p", { className: "mt-5 text-plan-muted", children: summary })] }));
|
|
466
|
+
}
|
|
467
|
+
/* ── Edit (panel form) ─────────────────────────────────────────────────────── */
|
|
468
|
+
/**
|
|
469
|
+
* Panel editor for an `openapi-spec` block: a `title` input plus a monospace
|
|
470
|
+
* textarea bound to the raw `spec`, with a "Format" button that pretty-prints via
|
|
471
|
+
* `JSON.parse` → `JSON.stringify(_, null, 2)` (guarded — shows an INLINE error,
|
|
472
|
+
* never `window.alert`). Renders BARE content (no `<section>`); the registry's
|
|
473
|
+
* panel surface supplies the popover chrome.
|
|
474
|
+
*/
|
|
475
|
+
export function OpenApiSpecEdit({ data, onChange, editable, }) {
|
|
476
|
+
const titleId = useId();
|
|
477
|
+
const specId = useId();
|
|
478
|
+
const [formatError, setFormatError] = useState(null);
|
|
479
|
+
const handleFormat = () => {
|
|
480
|
+
try {
|
|
481
|
+
const formatted = JSON.stringify(JSON.parse(data.spec), null, 2);
|
|
482
|
+
setFormatError(null);
|
|
483
|
+
onChange({ ...data, spec: formatted });
|
|
484
|
+
}
|
|
485
|
+
catch (error) {
|
|
486
|
+
setFormatError(error instanceof Error ? error.message : "Invalid JSON — cannot format");
|
|
487
|
+
}
|
|
488
|
+
};
|
|
489
|
+
return (_jsxs("div", { className: "grid gap-3", "data-plan-interactive": true, children: [_jsxs("div", { className: "grid gap-1.5", children: [_jsx(DevLabel, { htmlFor: titleId, children: "Title" }), _jsx(DevInput, { id: titleId, value: data.title ?? "", readOnly: !editable, onChange: (event) => onChange({ ...data, title: event.target.value || undefined }), placeholder: "Optional heading" })] }), _jsxs("div", { className: "grid gap-1.5", children: [_jsxs("div", { className: "flex items-center justify-between", children: [_jsx(DevLabel, { htmlFor: specId, children: "OpenAPI / Swagger spec" }), editable && (_jsx("button", { type: "button", "data-plan-interactive": true, onClick: handleFormat, className: "inline-flex h-7 cursor-pointer items-center justify-center gap-2 whitespace-nowrap rounded-md border border-input bg-background px-2 text-xs font-medium ring-offset-background transition-colors hover:bg-accent hover:text-accent-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50", children: "Format" }))] }), _jsx(DevTextarea, { id: specId, value: data.spec, readOnly: !editable, spellCheck: false, onChange: (event) => {
|
|
490
|
+
setFormatError(null);
|
|
491
|
+
onChange({ ...data, spec: event.target.value });
|
|
492
|
+
}, className: "min-h-72 font-mono text-xs", placeholder: '{\n "openapi": "3.0.0",\n "info": { "title": "My API", "version": "1.0.0" },\n "paths": {}\n}' }), formatError && (_jsx("p", { className: "text-xs text-red-600 dark:text-red-300", children: formatError })), _jsx("p", { className: "text-xs text-muted-foreground", children: "Paste a complete OpenAPI 3 or Swagger 2 document. v1 supports JSON specs only \u2014 convert YAML to JSON first." })] })] }));
|
|
493
|
+
}
|
|
494
|
+
//# sourceMappingURL=OpenApiSpecBlock.js.map
|