veryfront 0.1.214 → 0.1.216
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/knowledge/command.d.ts +1 -1
- package/esm/cli/commands/knowledge/command.d.ts.map +1 -1
- package/esm/cli/commands/knowledge/command.js +1 -2
- package/esm/cli/help/command-definitions.d.ts.map +1 -1
- package/esm/cli/help/command-definitions.js +2 -0
- package/esm/cli/router.d.ts.map +1 -1
- package/esm/cli/router.js +2 -0
- package/esm/deno.d.ts +3 -0
- package/esm/deno.js +4 -1
- 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/index.d.ts +21 -0
- package/esm/src/extensions/index.d.ts.map +1 -0
- package/esm/src/extensions/index.js +25 -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/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/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.d.ts.map +1 -1
- package/esm/src/provider/runtime-loader.js +95 -141
- package/esm/src/proxy/handler.d.ts.map +1 -1
- package/esm/src/proxy/handler.js +14 -0
- 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/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/knowledge/command.ts +1 -2
- package/src/cli/help/command-definitions.ts +2 -0
- package/src/cli/router.ts +2 -0
- package/src/deno.js +4 -1
- 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/index.ts +59 -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/recommendations.ts +24 -0
- package/src/src/extensions/types.ts +57 -0
- package/src/src/extensions/validation.ts +147 -0
- 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.ts +112 -169
- package/src/src/proxy/handler.ts +16 -0
- package/src/src/server/utils/domain-parser.ts +4 -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
|
+
}
|
|
@@ -6,7 +6,7 @@ type SafeParseResult<T> = {
|
|
|
6
6
|
success: false;
|
|
7
7
|
error: z.ZodError;
|
|
8
8
|
};
|
|
9
|
-
import { type CommandResult } from "../../../src/platform/
|
|
9
|
+
import { type CommandResult } from "../../../src/platform/index.js";
|
|
10
10
|
import { type ApiClient } from "../../shared/config.js";
|
|
11
11
|
import type { ParsedArgs } from "../../shared/types.js";
|
|
12
12
|
import { type Logger } from "../../../src/utils/index.js";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"command.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/knowledge/command.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,KAAK,eAAe,CAAC,CAAC,IAAI;IAAE,OAAO,EAAE,IAAI,CAAC;IAAC,IAAI,EAAE,CAAC,CAAA;CAAE,GAAG;IAAE,OAAO,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,CAAC,CAAC,QAAQ,CAAA;CAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"command.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/knowledge/command.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,8 +1,7 @@
|
|
|
1
1
|
import * as dntShim from "../../../_dnt.shims.js";
|
|
2
2
|
import { z } from "zod";
|
|
3
|
-
import { createFileSystem, getEnv } from "../../../src/platform/index.js";
|
|
3
|
+
import { createFileSystem, getEnv, runCommand } from "../../../src/platform/index.js";
|
|
4
4
|
import { basename, extname, join, normalize, relative } from "../../../src/platform/compat/path/index.js";
|
|
5
|
-
import { runCommand } from "../../../src/platform/compat/process.js";
|
|
6
5
|
import { withSpan } from "../../../src/observability/tracing/otlp-setup.js";
|
|
7
6
|
import { cliLogger } from "../../utils/index.js";
|
|
8
7
|
import { createApiClient, resolveConfigWithAuth } from "../../shared/config.js";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"command-definitions.d.ts","sourceRoot":"","sources":["../../../src/cli/help/command-definitions.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"command-definitions.d.ts","sourceRoot":"","sources":["../../../src/cli/help/command-definitions.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AA0ClD;;;GAGG;AACH,eAAO,MAAM,QAAQ,EAAE,eAwCtB,CAAC"}
|
|
@@ -42,6 +42,7 @@ import { skillsHelp } from "../commands/skills/command-help.js";
|
|
|
42
42
|
import { configHelp } from "../commands/config/command-help.js";
|
|
43
43
|
import { openHelp } from "../commands/open/command-help.js";
|
|
44
44
|
import { completionsHelp } from "../commands/completions/command-help.js";
|
|
45
|
+
import { extensionHelp } from "../commands/extension/command-help.js";
|
|
45
46
|
/**
|
|
46
47
|
* Central registry of all command help definitions.
|
|
47
48
|
* Each command's help is imported from its respective command-help.ts file.
|
|
@@ -85,4 +86,5 @@ export const COMMANDS = {
|
|
|
85
86
|
config: configHelp,
|
|
86
87
|
open: openHelp,
|
|
87
88
|
completions: completionsHelp,
|
|
89
|
+
extension: extensionHelp,
|
|
88
90
|
};
|
package/esm/cli/router.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"router.d.ts","sourceRoot":"","sources":["../../src/cli/router.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"router.d.ts","sourceRoot":"","sources":["../../src/cli/router.ts"],"names":[],"mappings":"AA2DA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AA2FpD;;;;GAIG;AACH,wBAAsB,YAAY,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CA+FlE"}
|
package/esm/cli/router.js
CHANGED
|
@@ -13,6 +13,7 @@ import { handleDemoCommand } from "./commands/demo/handler.js";
|
|
|
13
13
|
import { handleDeployCommand } from "./commands/deploy/handler.js";
|
|
14
14
|
import { handleDevCommand } from "./commands/dev/handler.js";
|
|
15
15
|
import { handleDoctorCommand } from "./commands/doctor/handler.js";
|
|
16
|
+
import { handleExtensionCommand } from "./commands/extension/handler.js";
|
|
16
17
|
import { handleGenerateCommand } from "./commands/generate/handler.js";
|
|
17
18
|
import { handleInitCommand } from "./commands/init/handler.js";
|
|
18
19
|
import { handleInstallCommand, handleUninstallCommand } from "./commands/install/handler.js";
|
|
@@ -108,6 +109,7 @@ const commands = {
|
|
|
108
109
|
"install": handleInstallCommand,
|
|
109
110
|
"uninstall": handleUninstallCommand,
|
|
110
111
|
"demo": handleDemoCommand,
|
|
112
|
+
"extension": handleExtensionCommand,
|
|
111
113
|
"mcp": handleMCPCommand,
|
|
112
114
|
"issues": handleIssuesCommand,
|
|
113
115
|
"start": handleStartCommand,
|
package/esm/deno.d.ts
CHANGED
|
@@ -34,6 +34,8 @@ declare namespace _default {
|
|
|
34
34
|
"./integrations": string;
|
|
35
35
|
"./sandbox": string;
|
|
36
36
|
"./embedding": string;
|
|
37
|
+
"./extensions": string;
|
|
38
|
+
"./extensions/interfaces": string;
|
|
37
39
|
"./cli": string;
|
|
38
40
|
};
|
|
39
41
|
let imports: {
|
|
@@ -100,6 +102,7 @@ declare namespace _default {
|
|
|
100
102
|
"veryfront/observability": string;
|
|
101
103
|
"veryfront/tool/schema": string;
|
|
102
104
|
"veryfront/agent/composition": string;
|
|
105
|
+
"veryfront/extensions": string;
|
|
103
106
|
"#veryfront": string;
|
|
104
107
|
"#veryfront/agent": string;
|
|
105
108
|
"#veryfront/agent/react": string;
|
package/esm/deno.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
export default {
|
|
2
2
|
"name": "veryfront",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.216",
|
|
4
4
|
"license": "Apache-2.0",
|
|
5
5
|
"nodeModulesDir": "auto",
|
|
6
6
|
"exclude": [
|
|
@@ -44,6 +44,8 @@ export default {
|
|
|
44
44
|
"./integrations": "./src/integrations/index.ts",
|
|
45
45
|
"./sandbox": "./src/sandbox/index.ts",
|
|
46
46
|
"./embedding": "./src/embedding/index.ts",
|
|
47
|
+
"./extensions": "./src/extensions/index.ts",
|
|
48
|
+
"./extensions/interfaces": "./src/extensions/interfaces/index.ts",
|
|
47
49
|
"./cli": "./cli/main.ts"
|
|
48
50
|
},
|
|
49
51
|
"imports": {
|
|
@@ -110,6 +112,7 @@ export default {
|
|
|
110
112
|
"veryfront/observability": "./src/observability/index.ts",
|
|
111
113
|
"veryfront/tool/schema": "./src/tool/schema/index.ts",
|
|
112
114
|
"veryfront/agent/composition": "./src/agent/composition/index.ts",
|
|
115
|
+
"veryfront/extensions": "./src/extensions/index.ts",
|
|
113
116
|
"#veryfront": "./src/index.ts",
|
|
114
117
|
"#veryfront/agent": "./src/agent/index.ts",
|
|
115
118
|
"#veryfront/agent/react": "./src/agent/react/index.ts",
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Capability audit logging and Deno permission mapping.
|
|
3
|
+
*
|
|
4
|
+
* @module extensions/capabilities
|
|
5
|
+
*/
|
|
6
|
+
import type { Capability, ExtensionLogger } from "./types.js";
|
|
7
|
+
/**
|
|
8
|
+
* Format capabilities as human-readable strings for logging.
|
|
9
|
+
*/
|
|
10
|
+
export declare function formatCapabilities(capabilities: Capability[]): string[];
|
|
11
|
+
/**
|
|
12
|
+
* Map capabilities to Deno CLI permission flags.
|
|
13
|
+
* Skips non-system capabilities (e.g., "contract").
|
|
14
|
+
*/
|
|
15
|
+
export declare function mapToDenoPermissions(capabilities: Capability[]): string[];
|
|
16
|
+
/**
|
|
17
|
+
* Log capabilities for a named extension at startup.
|
|
18
|
+
*/
|
|
19
|
+
export declare function auditCapabilities(extensionName: string, capabilities: Capability[], logger: ExtensionLogger): void;
|
|
20
|
+
//# sourceMappingURL=capabilities.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"capabilities.d.ts","sourceRoot":"","sources":["../../../src/src/extensions/capabilities.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAE9D;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,YAAY,EAAE,UAAU,EAAE,GAAG,MAAM,EAAE,CAevE;AA2BD;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,YAAY,EAAE,UAAU,EAAE,GAAG,MAAM,EAAE,CAyBzE;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,aAAa,EAAE,MAAM,EACrB,YAAY,EAAE,UAAU,EAAE,EAC1B,MAAM,EAAE,eAAe,GACtB,IAAI,CAKN"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Capability audit logging and Deno permission mapping.
|
|
3
|
+
*
|
|
4
|
+
* @module extensions/capabilities
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Format capabilities as human-readable strings for logging.
|
|
8
|
+
*/
|
|
9
|
+
export function formatCapabilities(capabilities) {
|
|
10
|
+
return capabilities.map((cap) => {
|
|
11
|
+
if (cap.type === "contract") {
|
|
12
|
+
return `contract: ${cap.name}`;
|
|
13
|
+
}
|
|
14
|
+
const { type, ...rest } = cap;
|
|
15
|
+
const extras = Object.keys(rest);
|
|
16
|
+
if (extras.length === 0)
|
|
17
|
+
return type;
|
|
18
|
+
const details = extras
|
|
19
|
+
.map((key) => `${key}: ${JSON.stringify(rest[key])}`)
|
|
20
|
+
.join(", ");
|
|
21
|
+
return `${type} (${details})`;
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
const DENO_PERMISSION_MAP = {
|
|
25
|
+
"fs:read": { flag: "--allow-read", scopeKey: "paths" },
|
|
26
|
+
"fs:write": { flag: "--allow-write", scopeKey: "paths" },
|
|
27
|
+
"net:outbound": { flag: "--allow-net", scopeKey: "hosts" },
|
|
28
|
+
"net:listen": {
|
|
29
|
+
flag: "--allow-net",
|
|
30
|
+
resolveScopes: (cap) => {
|
|
31
|
+
const ports = cap.ports;
|
|
32
|
+
if (!ports || ports.length === 0)
|
|
33
|
+
return [];
|
|
34
|
+
const host = cap.host || "localhost";
|
|
35
|
+
return ports.map((p) => `${host}:${p}`);
|
|
36
|
+
},
|
|
37
|
+
},
|
|
38
|
+
"env:read": { flag: "--allow-env", scopeKey: "keys" },
|
|
39
|
+
"process:spawn": { flag: "--allow-run", scopeKey: "commands" },
|
|
40
|
+
"native:ffi": { flag: "--allow-ffi" },
|
|
41
|
+
};
|
|
42
|
+
/**
|
|
43
|
+
* Map capabilities to Deno CLI permission flags.
|
|
44
|
+
* Skips non-system capabilities (e.g., "contract").
|
|
45
|
+
*/
|
|
46
|
+
export function mapToDenoPermissions(capabilities) {
|
|
47
|
+
const seen = new Set();
|
|
48
|
+
const flags = [];
|
|
49
|
+
for (const cap of capabilities) {
|
|
50
|
+
const mapping = DENO_PERMISSION_MAP[cap.type];
|
|
51
|
+
if (!mapping)
|
|
52
|
+
continue;
|
|
53
|
+
let flag = mapping.flag;
|
|
54
|
+
const scopes = mapping.resolveScopes
|
|
55
|
+
? mapping.resolveScopes(cap)
|
|
56
|
+
: mapping.scopeKey
|
|
57
|
+
? cap[mapping.scopeKey] ?? []
|
|
58
|
+
: [];
|
|
59
|
+
if (scopes.length > 0) {
|
|
60
|
+
flag = `${flag}=${scopes.join(",")}`;
|
|
61
|
+
}
|
|
62
|
+
if (!seen.has(flag)) {
|
|
63
|
+
seen.add(flag);
|
|
64
|
+
flags.push(flag);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
return flags;
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Log capabilities for a named extension at startup.
|
|
71
|
+
*/
|
|
72
|
+
export function auditCapabilities(extensionName, capabilities, logger) {
|
|
73
|
+
if (capabilities.length === 0)
|
|
74
|
+
return;
|
|
75
|
+
const lines = formatCapabilities(capabilities);
|
|
76
|
+
logger.info(`Extension "${extensionName}" declares capabilities:`, ...lines);
|
|
77
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Contract registry — runtime resolution of extension-provided implementations.
|
|
3
|
+
*
|
|
4
|
+
* @module extensions/contracts
|
|
5
|
+
*/
|
|
6
|
+
export declare function resolve<T>(name: string): T;
|
|
7
|
+
export declare function tryResolve<T>(name: string): T | undefined;
|
|
8
|
+
export declare function register<T>(name: string, impl: T): void;
|
|
9
|
+
export declare function reset(): void;
|
|
10
|
+
//# sourceMappingURL=contracts.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"contracts.d.ts","sourceRoot":"","sources":["../../../src/src/extensions/contracts.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAOH,wBAAgB,OAAO,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,GAAG,CAAC,CAY1C;AAED,wBAAgB,UAAU,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,GAAG,CAAC,GAAG,SAAS,CAEzD;AAED,wBAAgB,QAAQ,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,GAAG,IAAI,CAEvD;AAED,wBAAgB,KAAK,IAAI,IAAI,CAE5B"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Contract registry — runtime resolution of extension-provided implementations.
|
|
3
|
+
*
|
|
4
|
+
* @module extensions/contracts
|
|
5
|
+
*/
|
|
6
|
+
import { MISSING_EXTENSION_ERROR } from "./errors.js";
|
|
7
|
+
import { getRecommendation } from "./recommendations.js";
|
|
8
|
+
const contracts = new Map();
|
|
9
|
+
export function resolve(name) {
|
|
10
|
+
const impl = contracts.get(name);
|
|
11
|
+
if (impl === undefined) {
|
|
12
|
+
const recommendation = getRecommendation(name);
|
|
13
|
+
throw MISSING_EXTENSION_ERROR.create({
|
|
14
|
+
message: `Missing extension for contract "${name}"${recommendation ? `. Recommended: ${recommendation}` : ""}`,
|
|
15
|
+
detail: recommendation ? `Install it with: deno add ${recommendation}` : undefined,
|
|
16
|
+
});
|
|
17
|
+
}
|
|
18
|
+
return impl;
|
|
19
|
+
}
|
|
20
|
+
export function tryResolve(name) {
|
|
21
|
+
return contracts.get(name);
|
|
22
|
+
}
|
|
23
|
+
export function register(name, impl) {
|
|
24
|
+
contracts.set(name, impl);
|
|
25
|
+
}
|
|
26
|
+
export function reset() {
|
|
27
|
+
contracts.clear();
|
|
28
|
+
}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import type { Capability, ResolvedExtension } from "./types.js";
|
|
2
|
+
/**
|
|
3
|
+
* Metadata extracted from a package.json that declares itself
|
|
4
|
+
* as a veryfront extension.
|
|
5
|
+
*/
|
|
6
|
+
export interface PackageMetadata {
|
|
7
|
+
isExtension: true;
|
|
8
|
+
capabilities: Capability[];
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Parse veryfront extension metadata from a package.json-like object.
|
|
12
|
+
*
|
|
13
|
+
* Returns `PackageMetadata` when the package declares
|
|
14
|
+
* `veryfront.extension: true`, otherwise `undefined`. Malformed capability
|
|
15
|
+
* entries are filtered out; the caller receives only valid shapes.
|
|
16
|
+
*/
|
|
17
|
+
export declare function parsePackageMetadata(pkg: Record<string, unknown>): PackageMetadata | undefined;
|
|
18
|
+
/**
|
|
19
|
+
* Merge extensions from all four sources in priority order.
|
|
20
|
+
*
|
|
21
|
+
* Priority (highest first): config > package > project > local-file.
|
|
22
|
+
* Duplicates are resolved by keeping the highest-priority entry.
|
|
23
|
+
* Disable directives (`{ name, enabled: false }`) remove matching
|
|
24
|
+
* extensions regardless of source.
|
|
25
|
+
*/
|
|
26
|
+
export declare function mergeExtensions(config: ResolvedExtension[], packages: ResolvedExtension[], project: ResolvedExtension[], local: ResolvedExtension[], disableDirectives?: Array<{
|
|
27
|
+
name: string;
|
|
28
|
+
enabled: false;
|
|
29
|
+
}>): ResolvedExtension[];
|
|
30
|
+
/**
|
|
31
|
+
* Scan `node_modules` (including `@scoped` packages) for packages
|
|
32
|
+
* that declare veryfront extension metadata in their `package.json`.
|
|
33
|
+
*/
|
|
34
|
+
export declare function discoverPackageExtensions(baseDir: string): Promise<Array<{
|
|
35
|
+
packageName: string;
|
|
36
|
+
metadata: PackageMetadata;
|
|
37
|
+
}>>;
|
|
38
|
+
/**
|
|
39
|
+
* Discover project extensions living under `extensions/` in the project root.
|
|
40
|
+
*
|
|
41
|
+
* Looks for `extensions/<name>/src/index.ts` and `extensions/<name>/index.ts`.
|
|
42
|
+
*/
|
|
43
|
+
export declare function discoverProjectExtensions(baseDir: string): Promise<string[]>;
|
|
44
|
+
/**
|
|
45
|
+
* Find `*.extension.ts` files in the project root.
|
|
46
|
+
*/
|
|
47
|
+
export declare function discoverLocalExtensions(baseDir: string): Promise<string[]>;
|
|
48
|
+
//# sourceMappingURL=discovery.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"discovery.d.ts","sourceRoot":"","sources":["../../../src/src/extensions/discovery.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAEhE;;;GAGG;AACH,MAAM,WAAW,eAAe;IAC9B,WAAW,EAAE,IAAI,CAAC;IAClB,YAAY,EAAE,UAAU,EAAE,CAAC;CAC5B;AAUD;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAClC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC3B,eAAe,GAAG,SAAS,CAmB7B;AAED;;;;;;;GAOG;AACH,wBAAgB,eAAe,CAC7B,MAAM,EAAE,iBAAiB,EAAE,EAC3B,QAAQ,EAAE,iBAAiB,EAAE,EAC7B,OAAO,EAAE,iBAAiB,EAAE,EAC5B,KAAK,EAAE,iBAAiB,EAAE,EAC1B,iBAAiB,CAAC,EAAE,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,KAAK,CAAA;CAAE,CAAC,GAC1D,iBAAiB,EAAE,CAwBrB;AA6BD;;;GAGG;AACH,wBAAsB,yBAAyB,CAC7C,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,KAAK,CAAC;IAAE,WAAW,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,eAAe,CAAA;CAAE,CAAC,CAAC,CA4BpE;AAqBD;;;;GAIG;AACH,wBAAsB,yBAAyB,CAC7C,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,MAAM,EAAE,CAAC,CAkBnB;AAED;;GAEG;AACH,wBAAsB,uBAAuB,CAC3C,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,MAAM,EAAE,CAAC,CAKnB"}
|