veryfront 0.1.215 → 0.1.217
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 +1 -1
- package/esm/cli/commands/extension/command-help.d.ts +3 -0
- package/esm/cli/commands/extension/command-help.d.ts.map +1 -0
- package/esm/cli/commands/extension/command-help.js +16 -0
- package/esm/cli/commands/extension/handler.d.ts +3 -0
- package/esm/cli/commands/extension/handler.d.ts.map +1 -0
- package/esm/cli/commands/extension/handler.js +36 -0
- package/esm/cli/commands/extension/init-command.d.ts +19 -0
- package/esm/cli/commands/extension/init-command.d.ts.map +1 -0
- package/esm/cli/commands/extension/init-command.js +122 -0
- package/esm/cli/commands/extension/validate-command.d.ts +13 -0
- package/esm/cli/commands/extension/validate-command.d.ts.map +1 -0
- package/esm/cli/commands/extension/validate-command.js +62 -0
- package/esm/cli/commands/generate/integration-generator-helpers.d.ts +35 -0
- package/esm/cli/commands/generate/integration-generator-helpers.d.ts.map +1 -0
- package/esm/cli/commands/generate/integration-generator-helpers.js +123 -0
- package/esm/cli/commands/generate/integration-generator.d.ts +1 -2
- package/esm/cli/commands/generate/integration-generator.d.ts.map +1 -1
- package/esm/cli/commands/generate/integration-generator.js +1 -123
- package/esm/cli/commands/knowledge/command-helpers.d.ts +48 -0
- package/esm/cli/commands/knowledge/command-helpers.d.ts.map +1 -0
- package/esm/cli/commands/knowledge/command-helpers.js +216 -0
- package/esm/cli/commands/knowledge/command.d.ts +12 -17
- package/esm/cli/commands/knowledge/command.d.ts.map +1 -1
- package/esm/cli/commands/knowledge/command.js +26 -214
- package/esm/cli/help/command-definitions.d.ts.map +1 -1
- package/esm/cli/help/command-definitions.js +2 -0
- package/esm/cli/mcp/remote-file-tool-helpers.d.ts +5 -0
- package/esm/cli/mcp/remote-file-tool-helpers.d.ts.map +1 -0
- package/esm/cli/mcp/remote-file-tool-helpers.js +22 -0
- package/esm/cli/mcp/remote-file-tools.d.ts.map +1 -1
- package/esm/cli/mcp/remote-file-tools.js +1 -22
- package/esm/cli/router.d.ts.map +1 -1
- package/esm/cli/router.js +2 -0
- package/esm/cli/templates/integration-loader-helpers.d.ts +8 -0
- package/esm/cli/templates/integration-loader-helpers.d.ts.map +1 -0
- package/esm/cli/templates/integration-loader-helpers.js +29 -0
- package/esm/cli/templates/integration-loader.d.ts.map +1 -1
- package/esm/cli/templates/integration-loader.js +5 -21
- package/esm/cli/templates/manifest.d.ts +1 -0
- package/esm/cli/templates/manifest.js +2 -1
- package/esm/deno.d.ts +3 -0
- package/esm/deno.js +5 -2
- package/esm/src/agent/runtime/index.d.ts.map +1 -1
- package/esm/src/agent/runtime/index.js +48 -90
- package/esm/src/chat/ag-ui-helpers.d.ts +17 -0
- package/esm/src/chat/ag-ui-helpers.d.ts.map +1 -0
- package/esm/src/chat/ag-ui-helpers.js +111 -0
- package/esm/src/chat/ag-ui.d.ts.map +1 -1
- package/esm/src/chat/ag-ui.js +1 -111
- package/esm/src/config/schemas/config.schema.d.ts +1 -0
- package/esm/src/config/schemas/config.schema.d.ts.map +1 -1
- package/esm/src/config/schemas/config.schema.js +11 -0
- package/esm/src/config/schemas/index.d.ts +11 -1
- package/esm/src/config/schemas/index.d.ts.map +1 -1
- package/esm/src/errors/error-registry-helpers.d.ts +6 -0
- package/esm/src/errors/error-registry-helpers.d.ts.map +1 -0
- package/esm/src/errors/error-registry-helpers.js +9 -0
- package/esm/src/errors/error-registry.d.ts.map +1 -1
- package/esm/src/errors/error-registry.js +4 -3
- package/esm/src/extensions/capabilities.d.ts +20 -0
- package/esm/src/extensions/capabilities.d.ts.map +1 -0
- package/esm/src/extensions/capabilities.js +77 -0
- package/esm/src/extensions/contracts.d.ts +10 -0
- package/esm/src/extensions/contracts.d.ts.map +1 -0
- package/esm/src/extensions/contracts.js +28 -0
- package/esm/src/extensions/discovery.d.ts +48 -0
- package/esm/src/extensions/discovery.d.ts.map +1 -0
- package/esm/src/extensions/discovery.js +179 -0
- package/esm/src/extensions/errors.d.ts +10 -0
- package/esm/src/extensions/errors.d.ts.map +1 -0
- package/esm/src/extensions/errors.js +34 -0
- package/esm/src/extensions/factory-loader.d.ts +29 -0
- package/esm/src/extensions/factory-loader.d.ts.map +1 -0
- package/esm/src/extensions/factory-loader.js +63 -0
- package/esm/src/extensions/index.d.ts +37 -0
- package/esm/src/extensions/index.d.ts.map +1 -0
- package/esm/src/extensions/index.js +41 -0
- package/esm/src/extensions/interfaces/ai-model-provider.d.ts +94 -0
- package/esm/src/extensions/interfaces/ai-model-provider.d.ts.map +1 -0
- package/esm/src/extensions/interfaces/ai-model-provider.js +8 -0
- package/esm/src/extensions/interfaces/auth-provider.d.ts +49 -0
- package/esm/src/extensions/interfaces/auth-provider.d.ts.map +1 -0
- package/esm/src/extensions/interfaces/auth-provider.js +8 -0
- package/esm/src/extensions/interfaces/bundler.d.ts +118 -0
- package/esm/src/extensions/interfaces/bundler.d.ts.map +1 -0
- package/esm/src/extensions/interfaces/bundler.js +8 -0
- package/esm/src/extensions/interfaces/cache-store.d.ts +27 -0
- package/esm/src/extensions/interfaces/cache-store.d.ts.map +1 -0
- package/esm/src/extensions/interfaces/cache-store.js +8 -0
- package/esm/src/extensions/interfaces/code-parser.d.ts +76 -0
- package/esm/src/extensions/interfaces/code-parser.d.ts.map +1 -0
- package/esm/src/extensions/interfaces/code-parser.js +8 -0
- package/esm/src/extensions/interfaces/content-transformer.d.ts +40 -0
- package/esm/src/extensions/interfaces/content-transformer.d.ts.map +1 -0
- package/esm/src/extensions/interfaces/content-transformer.js +8 -0
- package/esm/src/extensions/interfaces/css-processor.d.ts +38 -0
- package/esm/src/extensions/interfaces/css-processor.d.ts.map +1 -0
- package/esm/src/extensions/interfaces/css-processor.js +8 -0
- package/esm/src/extensions/interfaces/database-client.d.ts +31 -0
- package/esm/src/extensions/interfaces/database-client.d.ts.map +1 -0
- package/esm/src/extensions/interfaces/database-client.js +8 -0
- package/esm/src/extensions/interfaces/embedding-provider.d.ts +37 -0
- package/esm/src/extensions/interfaces/embedding-provider.d.ts.map +1 -0
- package/esm/src/extensions/interfaces/embedding-provider.js +8 -0
- package/esm/src/extensions/interfaces/index.d.ts +21 -0
- package/esm/src/extensions/interfaces/index.d.ts.map +1 -0
- package/esm/src/extensions/interfaces/index.js +9 -0
- package/esm/src/extensions/interfaces/node-compat.d.ts +25 -0
- package/esm/src/extensions/interfaces/node-compat.d.ts.map +1 -0
- package/esm/src/extensions/interfaces/node-compat.js +8 -0
- package/esm/src/extensions/interfaces/schema-validator.d.ts +46 -0
- package/esm/src/extensions/interfaces/schema-validator.d.ts.map +1 -0
- package/esm/src/extensions/interfaces/schema-validator.js +8 -0
- package/esm/src/extensions/interfaces/tracing-exporter.d.ts +44 -0
- package/esm/src/extensions/interfaces/tracing-exporter.d.ts.map +1 -0
- package/esm/src/extensions/interfaces/tracing-exporter.js +8 -0
- package/esm/src/extensions/loader.d.ts +33 -0
- package/esm/src/extensions/loader.d.ts.map +1 -0
- package/esm/src/extensions/loader.js +209 -0
- package/esm/src/extensions/orchestrate.d.ts +54 -0
- package/esm/src/extensions/orchestrate.d.ts.map +1 -0
- package/esm/src/extensions/orchestrate.js +116 -0
- package/esm/src/extensions/recommendations.d.ts +7 -0
- package/esm/src/extensions/recommendations.d.ts.map +1 -0
- package/esm/src/extensions/recommendations.js +22 -0
- package/esm/src/extensions/types.d.ts +47 -0
- package/esm/src/extensions/types.d.ts.map +1 -0
- package/esm/src/extensions/types.js +6 -0
- package/esm/src/extensions/validation.d.ts +44 -0
- package/esm/src/extensions/validation.d.ts.map +1 -0
- package/esm/src/extensions/validation.js +115 -0
- package/esm/src/html/styles-builder/plugin-loader.d.ts.map +1 -1
- package/esm/src/html/styles-builder/plugin-loader.js +23 -0
- package/esm/src/html/styles-builder/tailwind-plugin-allowlist.d.ts +29 -0
- package/esm/src/html/styles-builder/tailwind-plugin-allowlist.d.ts.map +1 -0
- package/esm/src/html/styles-builder/tailwind-plugin-allowlist.js +48 -0
- package/esm/src/modules/react-loader/ssr-module-loader/loader-helpers.d.ts +15 -0
- package/esm/src/modules/react-loader/ssr-module-loader/loader-helpers.d.ts.map +1 -0
- package/esm/src/modules/react-loader/ssr-module-loader/loader-helpers.js +22 -0
- package/esm/src/modules/react-loader/ssr-module-loader/loader.d.ts +0 -2
- package/esm/src/modules/react-loader/ssr-module-loader/loader.d.ts.map +1 -1
- package/esm/src/modules/react-loader/ssr-module-loader/loader.js +4 -24
- package/esm/src/platform/adapters/fs/veryfront/adapter-helpers.d.ts +19 -0
- package/esm/src/platform/adapters/fs/veryfront/adapter-helpers.d.ts.map +1 -0
- package/esm/src/platform/adapters/fs/veryfront/adapter-helpers.js +26 -0
- package/esm/src/platform/adapters/fs/veryfront/adapter.d.ts.map +1 -1
- package/esm/src/platform/adapters/fs/veryfront/adapter.js +4 -20
- package/esm/src/platform/adapters/fs/veryfront/read-operations-helpers.d.ts +1 -0
- package/esm/src/platform/adapters/fs/veryfront/read-operations-helpers.d.ts.map +1 -1
- package/esm/src/platform/adapters/fs/veryfront/read-operations-helpers.js +3 -0
- package/esm/src/platform/adapters/fs/veryfront/read-operations.d.ts.map +1 -1
- package/esm/src/platform/adapters/fs/veryfront/read-operations.js +4 -7
- package/esm/src/platform/adapters/fs/veryfront/websocket-manager-helpers.d.ts +28 -0
- package/esm/src/platform/adapters/fs/veryfront/websocket-manager-helpers.d.ts.map +1 -0
- package/esm/src/platform/adapters/fs/veryfront/websocket-manager-helpers.js +41 -0
- package/esm/src/platform/adapters/fs/veryfront/websocket-manager.d.ts +1 -4
- package/esm/src/platform/adapters/fs/veryfront/websocket-manager.d.ts.map +1 -1
- package/esm/src/platform/adapters/fs/veryfront/websocket-manager.js +7 -40
- package/esm/src/platform/compat/process/command.d.ts +31 -0
- package/esm/src/platform/compat/process/command.d.ts.map +1 -0
- package/esm/src/platform/compat/process/command.js +193 -0
- package/esm/src/platform/compat/process/env.d.ts +31 -0
- package/esm/src/platform/compat/process/env.d.ts.map +1 -0
- package/esm/src/platform/compat/process/env.js +175 -0
- package/esm/src/platform/compat/process/lifecycle.d.ts +98 -0
- package/esm/src/platform/compat/process/lifecycle.d.ts.map +1 -0
- package/esm/src/platform/compat/process/lifecycle.js +305 -0
- package/esm/src/platform/compat/process/runtime-process.d.ts +10 -0
- package/esm/src/platform/compat/process/runtime-process.d.ts.map +1 -0
- package/esm/src/platform/compat/process/runtime-process.js +24 -0
- package/esm/src/platform/compat/process.d.ts +4 -165
- package/esm/src/platform/compat/process.d.ts.map +1 -1
- package/esm/src/platform/compat/process.js +4 -682
- package/esm/src/platform/index.d.ts +1 -1
- package/esm/src/platform/index.d.ts.map +1 -1
- package/esm/src/provider/runtime-loader/provider-endpoints.d.ts +8 -0
- package/esm/src/provider/runtime-loader/provider-endpoints.d.ts.map +1 -0
- package/esm/src/provider/runtime-loader/provider-endpoints.js +27 -0
- package/esm/src/provider/runtime-loader/provider-request-init.d.ts +32 -0
- package/esm/src/provider/runtime-loader/provider-request-init.d.ts.map +1 -0
- package/esm/src/provider/runtime-loader/provider-request-init.js +67 -0
- package/esm/src/provider/runtime-loader/tool-input-status.d.ts +17 -0
- package/esm/src/provider/runtime-loader/tool-input-status.d.ts.map +1 -0
- package/esm/src/provider/runtime-loader/tool-input-status.js +155 -0
- package/esm/src/provider/runtime-loader.d.ts +2 -3
- package/esm/src/provider/runtime-loader.d.ts.map +1 -1
- package/esm/src/provider/runtime-loader.js +92 -291
- package/esm/src/proxy/handler.d.ts.map +1 -1
- package/esm/src/proxy/handler.js +14 -0
- package/esm/src/rendering/orchestrator/pipeline-helpers.d.ts +8 -0
- package/esm/src/rendering/orchestrator/pipeline-helpers.d.ts.map +1 -0
- package/esm/src/rendering/orchestrator/pipeline-helpers.js +20 -0
- package/esm/src/rendering/orchestrator/pipeline.d.ts +0 -3
- package/esm/src/rendering/orchestrator/pipeline.d.ts.map +1 -1
- package/esm/src/rendering/orchestrator/pipeline.js +4 -22
- package/esm/src/routing/api/module-loader/loader-helpers.d.ts +10 -0
- package/esm/src/routing/api/module-loader/loader-helpers.d.ts.map +1 -0
- package/esm/src/routing/api/module-loader/loader-helpers.js +62 -0
- package/esm/src/routing/api/module-loader/loader.d.ts +1 -1
- package/esm/src/routing/api/module-loader/loader.d.ts.map +1 -1
- package/esm/src/routing/api/module-loader/loader.js +2 -60
- package/esm/src/server/bootstrap.d.ts +22 -2
- package/esm/src/server/bootstrap.d.ts.map +1 -1
- package/esm/src/server/bootstrap.js +67 -5
- package/esm/src/server/dev-ui/manifest.d.ts +2 -0
- package/esm/src/server/dev-ui/manifest.js +3 -1
- package/esm/src/server/handlers/request/api/project-discovery.d.ts.map +1 -1
- package/esm/src/server/handlers/request/api/project-discovery.js +14 -8
- package/esm/src/server/production-server.js +1 -1
- package/esm/src/server/services/rsc/endpoints/rsc-bundles.generated.d.ts.map +1 -1
- package/esm/src/server/services/rsc/endpoints/rsc-bundles.generated.js +2 -2
- package/esm/src/server/utils/domain-parser.d.ts.map +1 -1
- package/esm/src/server/utils/domain-parser.js +4 -0
- package/esm/src/studio/bridge/bridge-bundle.generated.d.ts.map +1 -1
- package/esm/src/studio/bridge/bridge-bundle.generated.js +1 -1
- package/esm/src/tool/index.d.ts +1 -1
- package/esm/src/tool/index.d.ts.map +1 -1
- package/esm/src/tool/types.d.ts +20 -0
- package/esm/src/tool/types.d.ts.map +1 -1
- package/esm/src/utils/version-constant.d.ts +1 -1
- package/esm/src/utils/version-constant.js +1 -1
- package/package.json +7 -1
- package/src/cli/commands/extension/command-help.ts +18 -0
- package/src/cli/commands/extension/handler.ts +41 -0
- package/src/cli/commands/extension/init-command.ts +140 -0
- package/src/cli/commands/extension/validate-command.ts +78 -0
- package/src/cli/commands/generate/integration-generator-helpers.ts +185 -0
- package/src/cli/commands/generate/integration-generator.ts +12 -168
- package/src/cli/commands/knowledge/command-helpers.ts +295 -0
- package/src/cli/commands/knowledge/command.ts +34 -261
- package/src/cli/help/command-definitions.ts +2 -0
- package/src/cli/mcp/remote-file-tool-helpers.ts +27 -0
- package/src/cli/mcp/remote-file-tools.ts +6 -28
- package/src/cli/router.ts +2 -0
- package/src/cli/templates/integration-loader-helpers.ts +49 -0
- package/src/cli/templates/integration-loader.ts +10 -28
- package/src/cli/templates/manifest.js +2 -1
- package/src/deno.js +5 -2
- package/src/src/agent/runtime/index.ts +77 -94
- package/src/src/chat/ag-ui-helpers.ts +139 -0
- package/src/src/chat/ag-ui.ts +11 -139
- package/src/src/config/schemas/config.schema.ts +11 -0
- package/src/src/config/schemas/index.ts +15 -1
- package/src/src/errors/error-registry-helpers.ts +23 -0
- package/src/src/errors/error-registry.ts +8 -3
- package/src/src/extensions/capabilities.ts +97 -0
- package/src/src/extensions/contracts.ts +36 -0
- package/src/src/extensions/discovery.ts +221 -0
- package/src/src/extensions/errors.ts +39 -0
- package/src/src/extensions/factory-loader.ts +76 -0
- package/src/src/extensions/index.ts +79 -0
- package/src/src/extensions/interfaces/ai-model-provider.ts +100 -0
- package/src/src/extensions/interfaces/auth-provider.ts +52 -0
- package/src/src/extensions/interfaces/bundler.ts +116 -0
- package/src/src/extensions/interfaces/cache-store.ts +27 -0
- package/src/src/extensions/interfaces/code-parser.ts +84 -0
- package/src/src/extensions/interfaces/content-transformer.ts +38 -0
- package/src/src/extensions/interfaces/css-processor.ts +40 -0
- package/src/src/extensions/interfaces/database-client.ts +35 -0
- package/src/src/extensions/interfaces/embedding-provider.ts +39 -0
- package/src/src/extensions/interfaces/index.ts +81 -0
- package/src/src/extensions/interfaces/node-compat.ts +25 -0
- package/src/src/extensions/interfaces/schema-validator.ts +51 -0
- package/src/src/extensions/interfaces/tracing-exporter.ts +42 -0
- package/src/src/extensions/loader.ts +245 -0
- package/src/src/extensions/orchestrate.ts +184 -0
- package/src/src/extensions/recommendations.ts +24 -0
- package/src/src/extensions/types.ts +57 -0
- package/src/src/extensions/validation.ts +147 -0
- package/src/src/html/styles-builder/plugin-loader.ts +32 -0
- package/src/src/html/styles-builder/tailwind-plugin-allowlist.ts +51 -0
- package/src/src/modules/react-loader/ssr-module-loader/loader-helpers.ts +37 -0
- package/src/src/modules/react-loader/ssr-module-loader/loader.ts +8 -39
- package/src/src/platform/adapters/fs/veryfront/adapter-helpers.ts +43 -0
- package/src/src/platform/adapters/fs/veryfront/adapter.ts +8 -22
- package/src/src/platform/adapters/fs/veryfront/read-operations-helpers.ts +4 -0
- package/src/src/platform/adapters/fs/veryfront/read-operations.ts +4 -7
- package/src/src/platform/adapters/fs/veryfront/websocket-manager-helpers.ts +73 -0
- package/src/src/platform/adapters/fs/veryfront/websocket-manager.ts +29 -44
- package/src/src/platform/compat/process/command.ts +297 -0
- package/src/src/platform/compat/process/env.ts +227 -0
- package/src/src/platform/compat/process/lifecycle.ts +330 -0
- package/src/src/platform/compat/process/runtime-process.ts +27 -0
- package/src/src/platform/compat/process.ts +37 -870
- package/src/src/platform/index.ts +1 -0
- package/src/src/provider/runtime-loader/provider-endpoints.ts +50 -0
- package/src/src/provider/runtime-loader/provider-request-init.ts +101 -0
- package/src/src/provider/runtime-loader/tool-input-status.ts +210 -0
- package/src/src/provider/runtime-loader.ts +113 -368
- package/src/src/proxy/handler.ts +16 -0
- package/src/src/rendering/orchestrator/pipeline-helpers.ts +35 -0
- package/src/src/rendering/orchestrator/pipeline.ts +8 -35
- package/src/src/routing/api/module-loader/loader-helpers.ts +68 -0
- package/src/src/routing/api/module-loader/loader.ts +8 -65
- package/src/src/server/bootstrap.ts +88 -7
- package/src/src/server/dev-ui/manifest.js +3 -1
- package/src/src/server/handlers/request/api/project-discovery.ts +19 -8
- package/src/src/server/production-server.ts +1 -1
- package/src/src/server/services/rsc/endpoints/rsc-bundles.generated.ts +2 -2
- package/src/src/server/utils/domain-parser.ts +4 -0
- package/src/src/studio/bridge/bridge-bundle.generated.ts +1 -1
- package/src/src/tool/index.ts +1 -0
- package/src/src/tool/types.ts +21 -0
- package/src/src/utils/version-constant.ts +1 -1
package/README.md
CHANGED
|
@@ -24,7 +24,7 @@ Purpose-built for TypeScript and React, Veryfront gives you everything you need
|
|
|
24
24
|
|
|
25
25
|
- [**Memory & Streaming**](https://veryfront.com/docs/code/guides/memory-and-streaming) — Give agents conversation history and streaming responses. Built-in chat UI components for React.
|
|
26
26
|
|
|
27
|
-
- [**MCP Server**](https://veryfront.com/docs/code/guides/mcp-server) — Expose
|
|
27
|
+
- [**MCP Server**](https://veryfront.com/docs/code/guides/mcp-server) — Expose tools, prompts, and resources via the Model Context Protocol.
|
|
28
28
|
|
|
29
29
|
- [**Pages & Routing**](https://veryfront.com/docs/code/guides/pages-and-routing) — File-based routing with React Server Components, layouts, and server-side rendering.
|
|
30
30
|
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"command-help.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/extension/command-help.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAEvD,eAAO,MAAM,aAAa,EAAE,WAe3B,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export const extensionHelp = {
|
|
2
|
+
name: "extension",
|
|
3
|
+
category: "development",
|
|
4
|
+
description: "Scaffold and validate veryfront extensions",
|
|
5
|
+
usage: "veryfront extension <init|validate> [args]",
|
|
6
|
+
options: [],
|
|
7
|
+
examples: [
|
|
8
|
+
"veryfront extension init my-cache # Scaffold a new extension",
|
|
9
|
+
"veryfront extension validate extensions/my-cache # Validate an extension",
|
|
10
|
+
],
|
|
11
|
+
notes: [
|
|
12
|
+
"'init <name>' creates extensions/<name>/ with a typed factory and tests",
|
|
13
|
+
"'validate <path>' loads the extension and reports shape issues",
|
|
14
|
+
"Names must be lowercase alphanumeric with hyphens (e.g. 'my-cache')",
|
|
15
|
+
],
|
|
16
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"handler.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/extension/handler.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAIxD,wBAAsB,sBAAsB,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CA4B5E"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Extension command handler — routes to subcommands.
|
|
3
|
+
*
|
|
4
|
+
* @module cli/commands/extension/handler
|
|
5
|
+
*/
|
|
6
|
+
import * as dntShim from "../../../_dnt.shims.js";
|
|
7
|
+
import { runExtensionInit, validateExtensionName } from "./init-command.js";
|
|
8
|
+
import { runExtensionValidate } from "./validate-command.js";
|
|
9
|
+
export async function handleExtensionCommand(args) {
|
|
10
|
+
const subcommand = args._[1];
|
|
11
|
+
switch (subcommand) {
|
|
12
|
+
case "init": {
|
|
13
|
+
const name = args._[2];
|
|
14
|
+
if (!name) {
|
|
15
|
+
console.error("Usage: veryfront extension init <name>");
|
|
16
|
+
dntShim.Deno.exit(1);
|
|
17
|
+
}
|
|
18
|
+
const nameError = validateExtensionName(name);
|
|
19
|
+
if (nameError) {
|
|
20
|
+
console.error(`Error: ${nameError}`);
|
|
21
|
+
dntShim.Deno.exit(1);
|
|
22
|
+
}
|
|
23
|
+
await runExtensionInit(name, dntShim.Deno.cwd());
|
|
24
|
+
console.log(`Extension scaffolded at extensions/${name}/`);
|
|
25
|
+
break;
|
|
26
|
+
}
|
|
27
|
+
case "validate": {
|
|
28
|
+
const path = args._[2] || ".";
|
|
29
|
+
await runExtensionValidate(path);
|
|
30
|
+
break;
|
|
31
|
+
}
|
|
32
|
+
default:
|
|
33
|
+
console.error("Usage: veryfront extension <init|validate> [args]");
|
|
34
|
+
dntShim.Deno.exit(1);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
export interface GeneratedFile {
|
|
2
|
+
path: string;
|
|
3
|
+
content: string;
|
|
4
|
+
}
|
|
5
|
+
/**
|
|
6
|
+
* Validate an extension name. Returns an error message if invalid,
|
|
7
|
+
* or `undefined` if the name is acceptable.
|
|
8
|
+
*/
|
|
9
|
+
export declare function validateExtensionName(name: string): string | undefined;
|
|
10
|
+
/**
|
|
11
|
+
* Generate the file contents for a new extension scaffold.
|
|
12
|
+
* Does not write to disk — returns file path/content pairs.
|
|
13
|
+
*/
|
|
14
|
+
export declare function generateExtensionFiles(name: string): GeneratedFile[];
|
|
15
|
+
/**
|
|
16
|
+
* Execute the extension init command: generate files and write to disk.
|
|
17
|
+
*/
|
|
18
|
+
export declare function runExtensionInit(name: string, baseDir: string): Promise<void>;
|
|
19
|
+
//# sourceMappingURL=init-command.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init-command.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/extension/init-command.ts"],"names":[],"mappings":"AAQA,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB;AAID;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAOtE;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa,EAAE,CAmFpE;AASD;;GAEG;AACH,wBAAsB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAYnF"}
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Extension init command — scaffold a new extension.
|
|
3
|
+
*
|
|
4
|
+
* @module cli/commands/extension/init-command
|
|
5
|
+
*/
|
|
6
|
+
import * as dntShim from "../../../_dnt.shims.js";
|
|
7
|
+
const VALID_NAME = /^[a-z0-9][a-z0-9-]*$/;
|
|
8
|
+
/**
|
|
9
|
+
* Validate an extension name. Returns an error message if invalid,
|
|
10
|
+
* or `undefined` if the name is acceptable.
|
|
11
|
+
*/
|
|
12
|
+
export function validateExtensionName(name) {
|
|
13
|
+
if (!name)
|
|
14
|
+
return "Extension name is required.";
|
|
15
|
+
if (!VALID_NAME.test(name)) {
|
|
16
|
+
return "Extension name must be lowercase alphanumeric with hyphens (e.g., 'my-cache').";
|
|
17
|
+
}
|
|
18
|
+
if (name.length > 64)
|
|
19
|
+
return "Extension name must be 64 characters or fewer.";
|
|
20
|
+
return undefined;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Generate the file contents for a new extension scaffold.
|
|
24
|
+
* Does not write to disk — returns file path/content pairs.
|
|
25
|
+
*/
|
|
26
|
+
export function generateExtensionFiles(name) {
|
|
27
|
+
const base = `extensions/${name}`;
|
|
28
|
+
const indexTs = `/**
|
|
29
|
+
* ${name} extension.
|
|
30
|
+
*
|
|
31
|
+
* @module extensions/${name}
|
|
32
|
+
*/
|
|
33
|
+
|
|
34
|
+
import type { ExtensionFactory } from "veryfront/extensions";
|
|
35
|
+
|
|
36
|
+
const ${camelCase(name)}: ExtensionFactory = () => ({
|
|
37
|
+
name: "${name}",
|
|
38
|
+
version: "0.1.0",
|
|
39
|
+
capabilities: [],
|
|
40
|
+
|
|
41
|
+
// Uncomment and modify to provide a contract implementation:
|
|
42
|
+
// provides: {
|
|
43
|
+
// ContractName: { /* implementation */ },
|
|
44
|
+
// },
|
|
45
|
+
|
|
46
|
+
// Uncomment for async setup:
|
|
47
|
+
// async setup(ctx) {
|
|
48
|
+
// // ctx.get<T>("ContractName") — consume another contract
|
|
49
|
+
// // ctx.provide("ContractName", impl) — register a contract
|
|
50
|
+
// },
|
|
51
|
+
|
|
52
|
+
// Uncomment for cleanup:
|
|
53
|
+
// async teardown() {
|
|
54
|
+
// // Close connections, flush buffers, etc.
|
|
55
|
+
// },
|
|
56
|
+
});
|
|
57
|
+
|
|
58
|
+
export default ${camelCase(name)};
|
|
59
|
+
`;
|
|
60
|
+
const testTs = `/**
|
|
61
|
+
* ${name} extension tests.
|
|
62
|
+
*
|
|
63
|
+
* @module extensions/${name}/test
|
|
64
|
+
*/
|
|
65
|
+
|
|
66
|
+
import { assertEquals } from "#veryfront/testing/assert.ts";
|
|
67
|
+
import { describe, it } from "#veryfront/testing/bdd.ts";
|
|
68
|
+
import factory from "./index.ts";
|
|
69
|
+
|
|
70
|
+
describe("${name} extension", () => {
|
|
71
|
+
it("should create an extension with correct name", () => {
|
|
72
|
+
const ext = factory();
|
|
73
|
+
assertEquals(ext.name, "${name}");
|
|
74
|
+
});
|
|
75
|
+
|
|
76
|
+
it("should have a version", () => {
|
|
77
|
+
const ext = factory();
|
|
78
|
+
assertEquals(typeof ext.version, "string");
|
|
79
|
+
assertEquals(ext.version.length > 0, true);
|
|
80
|
+
});
|
|
81
|
+
|
|
82
|
+
it("should have a capabilities array", () => {
|
|
83
|
+
const ext = factory();
|
|
84
|
+
assertEquals(Array.isArray(ext.capabilities), true);
|
|
85
|
+
});
|
|
86
|
+
});
|
|
87
|
+
`;
|
|
88
|
+
const denoJson = JSON.stringify({
|
|
89
|
+
name: name,
|
|
90
|
+
version: "0.1.0",
|
|
91
|
+
veryfront: {
|
|
92
|
+
extension: true,
|
|
93
|
+
capabilities: [],
|
|
94
|
+
},
|
|
95
|
+
}, null, 2);
|
|
96
|
+
return [
|
|
97
|
+
{ path: `${base}/src/index.ts`, content: indexTs },
|
|
98
|
+
{ path: `${base}/src/index.test.ts`, content: testTs },
|
|
99
|
+
{ path: `${base}/deno.json`, content: denoJson + "\n" },
|
|
100
|
+
];
|
|
101
|
+
}
|
|
102
|
+
function camelCase(name) {
|
|
103
|
+
return name
|
|
104
|
+
.split(/[-_]/)
|
|
105
|
+
.map((part, i) => (i === 0 ? part : part.charAt(0).toUpperCase() + part.slice(1)))
|
|
106
|
+
.join("");
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Execute the extension init command: generate files and write to disk.
|
|
110
|
+
*/
|
|
111
|
+
export async function runExtensionInit(name, baseDir) {
|
|
112
|
+
const error = validateExtensionName(name);
|
|
113
|
+
if (error)
|
|
114
|
+
throw new Error(error);
|
|
115
|
+
const files = generateExtensionFiles(name);
|
|
116
|
+
for (const file of files) {
|
|
117
|
+
const fullPath = `${baseDir}/${file.path}`;
|
|
118
|
+
const dir = fullPath.substring(0, fullPath.lastIndexOf("/"));
|
|
119
|
+
await dntShim.Deno.mkdir(dir, { recursive: true });
|
|
120
|
+
await dntShim.Deno.writeTextFile(fullPath, file.content);
|
|
121
|
+
}
|
|
122
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export interface ValidationReport {
|
|
2
|
+
valid: boolean;
|
|
3
|
+
issues: string[];
|
|
4
|
+
}
|
|
5
|
+
/**
|
|
6
|
+
* Validate an extension at the given directory path.
|
|
7
|
+
*/
|
|
8
|
+
export declare function validateExtensionAtPath(extensionPath: string): Promise<ValidationReport>;
|
|
9
|
+
/**
|
|
10
|
+
* CLI entry point for `veryfront extension validate <path>`.
|
|
11
|
+
*/
|
|
12
|
+
export declare function runExtensionValidate(extensionPath: string): Promise<void>;
|
|
13
|
+
//# sourceMappingURL=validate-command.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate-command.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/extension/validate-command.ts"],"names":[],"mappings":"AAUA,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAED;;GAEG;AACH,wBAAsB,uBAAuB,CAC3C,aAAa,EAAE,MAAM,GACpB,OAAO,CAAC,gBAAgB,CAAC,CAwC3B;AAED;;GAEG;AACH,wBAAsB,oBAAoB,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAY/E"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Extension validate command — check an extension for shape and capability issues.
|
|
3
|
+
*
|
|
4
|
+
* @module cli/commands/extension/validate-command
|
|
5
|
+
*/
|
|
6
|
+
import * as dntShim from "../../../_dnt.shims.js";
|
|
7
|
+
import { validateExtension } from "../../../src/extensions/validation.js";
|
|
8
|
+
/**
|
|
9
|
+
* Validate an extension at the given directory path.
|
|
10
|
+
*/
|
|
11
|
+
export async function validateExtensionAtPath(extensionPath) {
|
|
12
|
+
const issues = [];
|
|
13
|
+
const candidates = [
|
|
14
|
+
`${extensionPath}/src/index.ts`,
|
|
15
|
+
`${extensionPath}/index.ts`,
|
|
16
|
+
];
|
|
17
|
+
let entryPoint;
|
|
18
|
+
for (const candidate of candidates) {
|
|
19
|
+
try {
|
|
20
|
+
const stat = await dntShim.Deno.stat(candidate);
|
|
21
|
+
if (stat.isFile) {
|
|
22
|
+
entryPoint = candidate;
|
|
23
|
+
break;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
catch { /* next candidate */ }
|
|
27
|
+
}
|
|
28
|
+
if (!entryPoint) {
|
|
29
|
+
issues.push(`No entry point found. Expected src/index.ts or index.ts in ${extensionPath}`);
|
|
30
|
+
return { valid: false, issues };
|
|
31
|
+
}
|
|
32
|
+
try {
|
|
33
|
+
const mod = await import(`file://${await dntShim.Deno.realPath(entryPoint)}`);
|
|
34
|
+
const factory = mod.default;
|
|
35
|
+
if (typeof factory !== "function") {
|
|
36
|
+
issues.push("Default export must be a function (ExtensionFactory).");
|
|
37
|
+
return { valid: false, issues };
|
|
38
|
+
}
|
|
39
|
+
const ext = factory();
|
|
40
|
+
issues.push(...validateExtension(ext));
|
|
41
|
+
}
|
|
42
|
+
catch (err) {
|
|
43
|
+
issues.push(`Failed to import extension: ${err.message}`);
|
|
44
|
+
}
|
|
45
|
+
return { valid: issues.length === 0, issues };
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* CLI entry point for `veryfront extension validate <path>`.
|
|
49
|
+
*/
|
|
50
|
+
export async function runExtensionValidate(extensionPath) {
|
|
51
|
+
const report = await validateExtensionAtPath(extensionPath);
|
|
52
|
+
if (report.valid) {
|
|
53
|
+
console.log("Extension is valid.");
|
|
54
|
+
}
|
|
55
|
+
else {
|
|
56
|
+
console.error("Extension validation failed:");
|
|
57
|
+
for (const issue of report.issues) {
|
|
58
|
+
console.error(` - ${issue}`);
|
|
59
|
+
}
|
|
60
|
+
dntShim.Deno.exit(1);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
export type TokenAuthMethod = "basic" | "body" | "client_secret_basic" | "client_secret_post" | "request_body";
|
|
2
|
+
export interface IntegrationGeneratorOptionsLike {
|
|
3
|
+
name?: string;
|
|
4
|
+
displayName?: string;
|
|
5
|
+
authType?: "oauth2" | "api-key";
|
|
6
|
+
apiBaseUrl?: string;
|
|
7
|
+
authorizationUrl?: string;
|
|
8
|
+
tokenUrl?: string;
|
|
9
|
+
scopes?: string;
|
|
10
|
+
tokenAuthMethod?: TokenAuthMethod;
|
|
11
|
+
additionalAuthParams?: string;
|
|
12
|
+
usePKCE?: boolean;
|
|
13
|
+
}
|
|
14
|
+
export interface IntegrationConfig {
|
|
15
|
+
name: string;
|
|
16
|
+
displayName: string;
|
|
17
|
+
authType: "oauth2" | "api-key";
|
|
18
|
+
apiBaseUrl: string;
|
|
19
|
+
authorizationUrl?: string;
|
|
20
|
+
tokenUrl?: string;
|
|
21
|
+
scopes: string[];
|
|
22
|
+
tokenAuthMethod: TokenAuthMethod;
|
|
23
|
+
additionalAuthParams: Record<string, string>;
|
|
24
|
+
usePKCE: boolean;
|
|
25
|
+
envVarPrefix: string;
|
|
26
|
+
}
|
|
27
|
+
export declare function parseScopes(scopes?: string): string[];
|
|
28
|
+
export declare function parseAdditionalAuthParams(params?: string): Record<string, string>;
|
|
29
|
+
export declare function normalizeTokenAuthMethod(method?: string): TokenAuthMethod;
|
|
30
|
+
export declare function parseBooleanOption(value: string | boolean | undefined, defaultValue?: boolean): boolean;
|
|
31
|
+
export declare function validateIntegrationName(name: string): void;
|
|
32
|
+
export declare function getNonInteractiveConfig(options: IntegrationGeneratorOptionsLike): IntegrationConfig;
|
|
33
|
+
export declare function getToolInputSchema(toolFile: string): string;
|
|
34
|
+
export declare function getToolExecuteBody(toolFile: string): string;
|
|
35
|
+
//# sourceMappingURL=integration-generator-helpers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"integration-generator-helpers.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/generate/integration-generator-helpers.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,eAAe,GACvB,OAAO,GACP,MAAM,GACN,qBAAqB,GACrB,oBAAoB,GACpB,cAAc,CAAC;AAEnB,MAAM,WAAW,+BAA+B;IAC9C,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,QAAQ,GAAG,SAAS,CAAC;IAChC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,eAAe,CAAC,EAAE,eAAe,CAAC;IAClC,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,QAAQ,GAAG,SAAS,CAAC;IAC/B,UAAU,EAAE,MAAM,CAAC;IACnB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,eAAe,EAAE,eAAe,CAAC;IACjC,oBAAoB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7C,OAAO,EAAE,OAAO,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,wBAAgB,WAAW,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAErD;AAED,wBAAgB,yBAAyB,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CA2BjF;AAED,wBAAgB,wBAAwB,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,eAAe,CAmBzE;AAED,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS,EACnC,YAAY,UAAQ,GACnB,OAAO,CAkBT;AAED,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAI1D;AAED,wBAAgB,uBAAuB,CACrC,OAAO,EAAE,+BAA+B,GACvC,iBAAiB,CAwBnB;AAmCD,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAE3D;AAED,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAE3D"}
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
export function parseScopes(scopes) {
|
|
2
|
+
return scopes?.split(",").map((scope) => scope.trim()) || [];
|
|
3
|
+
}
|
|
4
|
+
export function parseAdditionalAuthParams(params) {
|
|
5
|
+
if (!params?.trim())
|
|
6
|
+
return {};
|
|
7
|
+
return Object.fromEntries(params.split(",")
|
|
8
|
+
.map((entry) => entry.trim())
|
|
9
|
+
.filter(Boolean)
|
|
10
|
+
.map((entry) => {
|
|
11
|
+
const separatorIndex = entry.indexOf("=");
|
|
12
|
+
if (separatorIndex === -1) {
|
|
13
|
+
throw new Error("Additional auth params must use key=value pairs separated by commas");
|
|
14
|
+
}
|
|
15
|
+
const key = entry.slice(0, separatorIndex).trim();
|
|
16
|
+
const value = entry.slice(separatorIndex + 1).trim();
|
|
17
|
+
if (!key || !value) {
|
|
18
|
+
throw new Error("Additional auth params must use non-empty key=value pairs");
|
|
19
|
+
}
|
|
20
|
+
return [key, value];
|
|
21
|
+
}));
|
|
22
|
+
}
|
|
23
|
+
export function normalizeTokenAuthMethod(method) {
|
|
24
|
+
switch (method?.trim().toLowerCase()) {
|
|
25
|
+
case "basic":
|
|
26
|
+
return "basic";
|
|
27
|
+
case "body":
|
|
28
|
+
return "body";
|
|
29
|
+
case "client_secret_basic":
|
|
30
|
+
return "client_secret_basic";
|
|
31
|
+
case "client_secret_post":
|
|
32
|
+
return "client_secret_post";
|
|
33
|
+
case "request_body":
|
|
34
|
+
case undefined:
|
|
35
|
+
case "":
|
|
36
|
+
return "request_body";
|
|
37
|
+
default:
|
|
38
|
+
throw new Error("OAuth token auth method must be one of: request_body, body, basic, client_secret_basic, client_secret_post");
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
export function parseBooleanOption(value, defaultValue = false) {
|
|
42
|
+
if (typeof value === "boolean")
|
|
43
|
+
return value;
|
|
44
|
+
if (!value?.trim())
|
|
45
|
+
return defaultValue;
|
|
46
|
+
switch (value.trim().toLowerCase()) {
|
|
47
|
+
case "y":
|
|
48
|
+
case "yes":
|
|
49
|
+
case "true":
|
|
50
|
+
case "1":
|
|
51
|
+
return true;
|
|
52
|
+
case "n":
|
|
53
|
+
case "no":
|
|
54
|
+
case "false":
|
|
55
|
+
case "0":
|
|
56
|
+
return false;
|
|
57
|
+
default:
|
|
58
|
+
throw new Error("Boolean option must be yes/no, true/false, or 1/0");
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
export function validateIntegrationName(name) {
|
|
62
|
+
if (!name || !/^[a-z][a-z0-9-]*$/.test(name)) {
|
|
63
|
+
throw new Error("Integration name must be lowercase letters, numbers, and hyphens");
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
export function getNonInteractiveConfig(options) {
|
|
67
|
+
const { name, displayName, authType } = options;
|
|
68
|
+
if (!name || !displayName || !authType) {
|
|
69
|
+
throw new Error("Non-interactive mode requires --name, --display-name, and --auth-type options");
|
|
70
|
+
}
|
|
71
|
+
const normalizedName = name.toLowerCase();
|
|
72
|
+
return {
|
|
73
|
+
name: normalizedName,
|
|
74
|
+
displayName,
|
|
75
|
+
authType,
|
|
76
|
+
apiBaseUrl: options.apiBaseUrl ?? `https://api.${name}.com`,
|
|
77
|
+
authorizationUrl: options.authorizationUrl,
|
|
78
|
+
tokenUrl: options.tokenUrl,
|
|
79
|
+
scopes: parseScopes(options.scopes),
|
|
80
|
+
tokenAuthMethod: normalizeTokenAuthMethod(options.tokenAuthMethod),
|
|
81
|
+
additionalAuthParams: parseAdditionalAuthParams(options.additionalAuthParams),
|
|
82
|
+
usePKCE: parseBooleanOption(options.usePKCE, false),
|
|
83
|
+
envVarPrefix: name.toUpperCase().replace(/-/g, "_"),
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
const TOOL_FILE_CONTENTS = {
|
|
87
|
+
"list-items.ts": {
|
|
88
|
+
inputSchema: `limit: z.number().optional().describe("Maximum number of items to return"),
|
|
89
|
+
offset: z.number().optional().describe("Number of items to skip"),`,
|
|
90
|
+
executeBody: `const items = await listItems({
|
|
91
|
+
limit: input.limit,
|
|
92
|
+
offset: input.offset,
|
|
93
|
+
});
|
|
94
|
+
return {
|
|
95
|
+
success: true,
|
|
96
|
+
items,
|
|
97
|
+
count: items.length,
|
|
98
|
+
};`,
|
|
99
|
+
},
|
|
100
|
+
"get-item.ts": {
|
|
101
|
+
inputSchema: `id: z.string().describe("The ID of the item to retrieve"),`,
|
|
102
|
+
executeBody: `const item = await getItem(input.id);
|
|
103
|
+
return {
|
|
104
|
+
success: true,
|
|
105
|
+
item,
|
|
106
|
+
};`,
|
|
107
|
+
},
|
|
108
|
+
"search.ts": {
|
|
109
|
+
inputSchema: `query: z.string().describe("Search query"),`,
|
|
110
|
+
executeBody: `const results = await searchItems(input.query);
|
|
111
|
+
return {
|
|
112
|
+
success: true,
|
|
113
|
+
results,
|
|
114
|
+
count: results.length,
|
|
115
|
+
};`,
|
|
116
|
+
},
|
|
117
|
+
};
|
|
118
|
+
export function getToolInputSchema(toolFile) {
|
|
119
|
+
return TOOL_FILE_CONTENTS[toolFile]?.inputSchema ?? "";
|
|
120
|
+
}
|
|
121
|
+
export function getToolExecuteBody(toolFile) {
|
|
122
|
+
return TOOL_FILE_CONTENTS[toolFile]?.executeBody ?? "";
|
|
123
|
+
}
|
|
@@ -4,6 +4,7 @@
|
|
|
4
4
|
* Generates new service integration scaffolds with interactive prompts.
|
|
5
5
|
* Creates connector.json, API client, OAuth routes, token store, and tool skeletons.
|
|
6
6
|
*/
|
|
7
|
+
import { type TokenAuthMethod } from "./integration-generator-helpers.js";
|
|
7
8
|
export interface IntegrationGeneratorOptions {
|
|
8
9
|
/** Integration name (lowercase, e.g., "twilio") */
|
|
9
10
|
name?: string;
|
|
@@ -28,7 +29,5 @@ export interface IntegrationGeneratorOptions {
|
|
|
28
29
|
/** Skip interactive prompts */
|
|
29
30
|
skipPrompts?: boolean;
|
|
30
31
|
}
|
|
31
|
-
type TokenAuthMethod = "basic" | "body" | "client_secret_basic" | "client_secret_post" | "request_body";
|
|
32
32
|
export declare function generateIntegration(projectDir: string, options?: IntegrationGeneratorOptions): Promise<void>;
|
|
33
|
-
export {};
|
|
34
33
|
//# sourceMappingURL=integration-generator.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"integration-generator.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/generate/integration-generator.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;
|
|
1
|
+
{"version":3,"file":"integration-generator.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/generate/integration-generator.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AASH,OAAO,EASL,KAAK,eAAe,EAErB,MAAM,oCAAoC,CAAC;AAK5C,MAAM,WAAW,2BAA2B;IAC1C,mDAAmD;IACnD,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,oCAAoC;IACpC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,0BAA0B;IAC1B,QAAQ,CAAC,EAAE,QAAQ,GAAG,SAAS,CAAC;IAChC,mBAAmB;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,2CAA2C;IAC3C,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,mCAAmC;IACnC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,qCAAqC;IACrC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,8BAA8B;IAC9B,eAAe,CAAC,EAAE,eAAe,CAAC;IAClC,yEAAyE;IACzE,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,oDAAoD;IACpD,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,+BAA+B;IAC/B,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAaD,wBAAsB,mBAAmB,CACvC,UAAU,EAAE,MAAM,EAClB,OAAO,GAAE,2BAAgC,GACxC,OAAO,CAAC,IAAI,CAAC,CAwBf"}
|
|
@@ -11,6 +11,7 @@ import { createFileSystem } from "../../../src/platform/index.js";
|
|
|
11
11
|
import { ensureDir } from "../../utils/fs.js";
|
|
12
12
|
import { isInteractive as checkIsInteractive, promptSync } from "../../../src/platform/index.js";
|
|
13
13
|
import { isCiEnv, isDenoTestingEnv } from "../../../src/config/index.js";
|
|
14
|
+
import { getNonInteractiveConfig, getToolExecuteBody, getToolInputSchema, normalizeTokenAuthMethod, parseAdditionalAuthParams, parseBooleanOption, parseScopes, validateIntegrationName, } from "./integration-generator-helpers.js";
|
|
14
15
|
import { select } from "../../utils/terminal-select.js";
|
|
15
16
|
let fs;
|
|
16
17
|
function canRunPrompts() {
|
|
@@ -22,71 +23,6 @@ function promptText(question, defaultValue) {
|
|
|
22
23
|
const input = promptSync(fullQuestion);
|
|
23
24
|
return Promise.resolve(input?.trim() || defaultValue || "");
|
|
24
25
|
}
|
|
25
|
-
function parseScopes(scopes) {
|
|
26
|
-
return scopes?.split(",").map((s) => s.trim()) || [];
|
|
27
|
-
}
|
|
28
|
-
function parseAdditionalAuthParams(params) {
|
|
29
|
-
if (!params?.trim())
|
|
30
|
-
return {};
|
|
31
|
-
return Object.fromEntries(params.split(",")
|
|
32
|
-
.map((entry) => entry.trim())
|
|
33
|
-
.filter(Boolean)
|
|
34
|
-
.map((entry) => {
|
|
35
|
-
const separatorIndex = entry.indexOf("=");
|
|
36
|
-
if (separatorIndex === -1) {
|
|
37
|
-
throw new Error("Additional auth params must use key=value pairs separated by commas");
|
|
38
|
-
}
|
|
39
|
-
const key = entry.slice(0, separatorIndex).trim();
|
|
40
|
-
const value = entry.slice(separatorIndex + 1).trim();
|
|
41
|
-
if (!key || !value) {
|
|
42
|
-
throw new Error("Additional auth params must use non-empty key=value pairs");
|
|
43
|
-
}
|
|
44
|
-
return [key, value];
|
|
45
|
-
}));
|
|
46
|
-
}
|
|
47
|
-
function normalizeTokenAuthMethod(method) {
|
|
48
|
-
switch (method?.trim().toLowerCase()) {
|
|
49
|
-
case "basic":
|
|
50
|
-
return "basic";
|
|
51
|
-
case "body":
|
|
52
|
-
return "body";
|
|
53
|
-
case "client_secret_basic":
|
|
54
|
-
return "client_secret_basic";
|
|
55
|
-
case "client_secret_post":
|
|
56
|
-
return "client_secret_post";
|
|
57
|
-
case "request_body":
|
|
58
|
-
case undefined:
|
|
59
|
-
case "":
|
|
60
|
-
return "request_body";
|
|
61
|
-
default:
|
|
62
|
-
throw new Error("OAuth token auth method must be one of: request_body, body, basic, client_secret_basic, client_secret_post");
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
function parseBooleanOption(value, defaultValue = false) {
|
|
66
|
-
if (typeof value === "boolean")
|
|
67
|
-
return value;
|
|
68
|
-
if (!value?.trim())
|
|
69
|
-
return defaultValue;
|
|
70
|
-
switch (value.trim().toLowerCase()) {
|
|
71
|
-
case "y":
|
|
72
|
-
case "yes":
|
|
73
|
-
case "true":
|
|
74
|
-
case "1":
|
|
75
|
-
return true;
|
|
76
|
-
case "n":
|
|
77
|
-
case "no":
|
|
78
|
-
case "false":
|
|
79
|
-
case "0":
|
|
80
|
-
return false;
|
|
81
|
-
default:
|
|
82
|
-
throw new Error("Boolean option must be yes/no, true/false, or 1/0");
|
|
83
|
-
}
|
|
84
|
-
}
|
|
85
|
-
function validateIntegrationName(name) {
|
|
86
|
-
if (!name || !/^[a-z][a-z0-9-]*$/.test(name)) {
|
|
87
|
-
throw new Error("Integration name must be lowercase letters, numbers, and hyphens");
|
|
88
|
-
}
|
|
89
|
-
}
|
|
90
26
|
export async function generateIntegration(projectDir, options = {}) {
|
|
91
27
|
fs = createFileSystem();
|
|
92
28
|
const shouldPrompt = !options.skipPrompts && canRunPrompts();
|
|
@@ -109,26 +45,6 @@ export async function generateIntegration(projectDir, options = {}) {
|
|
|
109
45
|
console.log(` 4. Customize the generated tools in ai/integrations/${config.name}/tools/`);
|
|
110
46
|
console.log("");
|
|
111
47
|
}
|
|
112
|
-
function getNonInteractiveConfig(options) {
|
|
113
|
-
const { name, displayName, authType } = options;
|
|
114
|
-
if (!name || !displayName || !authType) {
|
|
115
|
-
throw new Error("Non-interactive mode requires --name, --display-name, and --auth-type options");
|
|
116
|
-
}
|
|
117
|
-
const normalizedName = name.toLowerCase();
|
|
118
|
-
return {
|
|
119
|
-
name: normalizedName,
|
|
120
|
-
displayName,
|
|
121
|
-
authType,
|
|
122
|
-
apiBaseUrl: options.apiBaseUrl ?? `https://api.${name}.com`,
|
|
123
|
-
authorizationUrl: options.authorizationUrl,
|
|
124
|
-
tokenUrl: options.tokenUrl,
|
|
125
|
-
scopes: parseScopes(options.scopes),
|
|
126
|
-
tokenAuthMethod: normalizeTokenAuthMethod(options.tokenAuthMethod),
|
|
127
|
-
additionalAuthParams: parseAdditionalAuthParams(options.additionalAuthParams),
|
|
128
|
-
usePKCE: parseBooleanOption(options.usePKCE, false),
|
|
129
|
-
envVarPrefix: name.toUpperCase().replace(/-/g, "_"),
|
|
130
|
-
};
|
|
131
|
-
}
|
|
132
48
|
async function getInteractiveConfig(options) {
|
|
133
49
|
console.log("");
|
|
134
50
|
console.log(green("Integration Generator"));
|
|
@@ -666,44 +582,6 @@ export async function searchItems(query: string): Promise<unknown[]> {
|
|
|
666
582
|
await fs.writeTextFile(join(baseDir, "lib", `${config.name}-client.ts`), client);
|
|
667
583
|
cliLogger.debug("Created API client");
|
|
668
584
|
}
|
|
669
|
-
function getToolInputSchema(toolFile) {
|
|
670
|
-
return TOOL_FILE_CONTENTS[toolFile]?.inputSchema ?? "";
|
|
671
|
-
}
|
|
672
|
-
function getToolExecuteBody(toolFile) {
|
|
673
|
-
return TOOL_FILE_CONTENTS[toolFile]?.executeBody ?? "";
|
|
674
|
-
}
|
|
675
|
-
const TOOL_FILE_CONTENTS = {
|
|
676
|
-
"list-items.ts": {
|
|
677
|
-
inputSchema: `limit: z.number().optional().describe("Maximum number of items to return"),
|
|
678
|
-
offset: z.number().optional().describe("Number of items to skip"),`,
|
|
679
|
-
executeBody: `const items = await listItems({
|
|
680
|
-
limit: input.limit,
|
|
681
|
-
offset: input.offset,
|
|
682
|
-
});
|
|
683
|
-
return {
|
|
684
|
-
success: true,
|
|
685
|
-
items,
|
|
686
|
-
count: items.length,
|
|
687
|
-
};`,
|
|
688
|
-
},
|
|
689
|
-
"get-item.ts": {
|
|
690
|
-
inputSchema: `id: z.string().describe("The ID of the item to retrieve"),`,
|
|
691
|
-
executeBody: `const item = await getItem(input.id);
|
|
692
|
-
return {
|
|
693
|
-
success: true,
|
|
694
|
-
item,
|
|
695
|
-
};`,
|
|
696
|
-
},
|
|
697
|
-
"search.ts": {
|
|
698
|
-
inputSchema: `query: z.string().describe("Search query"),`,
|
|
699
|
-
executeBody: `const results = await searchItems(input.query);
|
|
700
|
-
return {
|
|
701
|
-
success: true,
|
|
702
|
-
results,
|
|
703
|
-
count: results.length,
|
|
704
|
-
};`,
|
|
705
|
-
},
|
|
706
|
-
};
|
|
707
585
|
async function createToolSkeletons(baseDir, config) {
|
|
708
586
|
const tools = [
|
|
709
587
|
{
|