@dot-ai/core 0.9.0 → 0.11.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/boot-cache.d.ts +1 -1
- package/dist/boot-cache.d.ts.map +1 -1
- package/dist/extension-api.d.ts +10 -9
- package/dist/extension-api.d.ts.map +1 -1
- package/dist/extension-loader.d.ts +9 -2
- package/dist/extension-loader.d.ts.map +1 -1
- package/dist/extension-loader.js +179 -55
- package/dist/extension-loader.js.map +1 -1
- package/dist/extension-runner.d.ts +9 -4
- package/dist/extension-runner.d.ts.map +1 -1
- package/dist/extension-runner.js +34 -13
- package/dist/extension-runner.js.map +1 -1
- package/dist/extension-types.d.ts +15 -115
- package/dist/extension-types.d.ts.map +1 -1
- package/dist/extension-types.js +1 -88
- package/dist/extension-types.js.map +1 -1
- package/dist/format.d.ts +21 -0
- package/dist/format.d.ts.map +1 -1
- package/dist/format.js +74 -0
- package/dist/format.js.map +1 -1
- package/dist/index.d.ts +6 -7
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -4
- package/dist/index.js.map +1 -1
- package/dist/package-manager.d.ts +28 -5
- package/dist/package-manager.d.ts.map +1 -1
- package/dist/package-manager.js +126 -20
- package/dist/package-manager.js.map +1 -1
- package/dist/runtime.d.ts +31 -43
- package/dist/runtime.d.ts.map +1 -1
- package/dist/runtime.js +79 -177
- package/dist/runtime.js.map +1 -1
- package/package.json +1 -1
- package/src/__tests__/extension-loader.test.ts +154 -11
- package/src/__tests__/extension-runner.test.ts +245 -32
- package/src/__tests__/fixtures/extensions/ctx-aware.js +12 -3
- package/src/__tests__/fixtures/extensions/smart-context.js +12 -3
- package/src/__tests__/format.test.ts +178 -1
- package/src/__tests__/package-manager.test.ts +237 -0
- package/src/__tests__/runtime.test.ts +38 -10
- package/src/boot-cache.ts +1 -1
- package/src/extension-api.ts +10 -15
- package/src/extension-loader.ts +187 -57
- package/src/extension-runner.ts +44 -15
- package/src/extension-types.ts +26 -195
- package/src/format.ts +100 -0
- package/src/index.ts +5 -13
- package/src/package-manager.ts +146 -23
- package/src/runtime.ts +96 -222
- package/tsconfig.tsbuildinfo +1 -1
package/dist/boot-cache.d.ts
CHANGED
|
@@ -7,7 +7,7 @@ export interface BootCacheData {
|
|
|
7
7
|
version: 1;
|
|
8
8
|
/** Checksum of inputs that produced this cache */
|
|
9
9
|
checksum: string;
|
|
10
|
-
/** Label vocabulary from
|
|
10
|
+
/** Label vocabulary from registered resources */
|
|
11
11
|
vocabulary: string[];
|
|
12
12
|
/** Extension paths that were loaded */
|
|
13
13
|
extensionPaths: string[];
|
package/dist/boot-cache.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"boot-cache.d.ts","sourceRoot":"","sources":["../src/boot-cache.ts"],"names":[],"mappings":"AAIA;;;GAGG;AACH,MAAM,WAAW,aAAa;IAC5B,2BAA2B;IAC3B,OAAO,EAAE,CAAC,CAAC;IACX,kDAAkD;IAClD,QAAQ,EAAE,MAAM,CAAC;IACjB
|
|
1
|
+
{"version":3,"file":"boot-cache.d.ts","sourceRoot":"","sources":["../src/boot-cache.ts"],"names":[],"mappings":"AAIA;;;GAGG;AACH,MAAM,WAAW,aAAa;IAC5B,2BAA2B;IAC3B,OAAO,EAAE,CAAC,CAAC;IACX,kDAAkD;IAClD,QAAQ,EAAE,MAAM,CAAC;IACjB,iDAAiD;IACjD,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,uCAAuC;IACvC,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,sDAAsD;IACtD,KAAK,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACpD,kCAAkC;IAClC,SAAS,EAAE,MAAM,CAAC;CACnB;AAKD;;;GAGG;AACH,wBAAsB,eAAe,CACnC,aAAa,EAAE,MAAM,EACrB,cAAc,EAAE,MAAM,EAAE,GACvB,OAAO,CAAC,MAAM,CAAC,CA0BjB;AAED;;;GAGG;AACH,wBAAsB,aAAa,CACjC,aAAa,EAAE,MAAM,EACrB,eAAe,EAAE,MAAM,GACtB,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC,CAa/B;AAED;;GAEG;AACH,wBAAsB,cAAc,CAClC,aAAa,EAAE,MAAM,EACrB,IAAI,EAAE,aAAa,GAClB,OAAO,CAAC,IAAI,CAAC,CAKf;AAED;;GAEG;AACH,wBAAsB,cAAc,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAIzE"}
|
package/dist/extension-api.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
import type { Label } from './types.js';
|
|
1
|
+
import type { ToolCallEvent, ToolCallResult, ToolResultEvent, AgentEndEvent, ToolDefinition, ExtensionContext, LabelExtractEvent, ContextEnrichEvent, ContextEnrichResult, RouteEvent, RouteResult, InputEvent, InputResult, CommandDefinition } from './extension-types.js';
|
|
2
|
+
import type { Label, Skill, Identity } from './types.js';
|
|
3
3
|
/**
|
|
4
|
-
*
|
|
4
|
+
* v7 Extension Context — passed as second argument to every event handler.
|
|
5
5
|
* Extends the base ExtensionContext with labels and optional agent capabilities.
|
|
6
6
|
*/
|
|
7
7
|
export interface ExtensionContextV6 extends ExtensionContext {
|
|
@@ -23,8 +23,6 @@ export interface ExtensionContextV6 extends ExtensionContext {
|
|
|
23
23
|
* Pi-compatible: same on(event) + registerTool() + registerCommand() pattern.
|
|
24
24
|
*/
|
|
25
25
|
export interface ExtensionAPI {
|
|
26
|
-
/** Resource discovery: extensions declare resources and contribute labels */
|
|
27
|
-
on(event: 'resources_discover', handler: (e: undefined, ctx: ExtensionContextV6) => Promise<ResourcesDiscoverResult | void>): void;
|
|
28
26
|
/** Label extraction: extensions can add custom labels (chain-transform) */
|
|
29
27
|
on(event: 'label_extract', handler: (e: LabelExtractEvent, ctx: ExtensionContextV6) => Promise<Label[] | void>): void;
|
|
30
28
|
/** Context enrichment: extensions return sections for context injection */
|
|
@@ -39,19 +37,22 @@ export interface ExtensionAPI {
|
|
|
39
37
|
on(event: 'tool_result', handler: (e: ToolResultEvent, ctx: ExtensionContextV6) => Promise<void>): void;
|
|
40
38
|
on(event: 'session_start', handler: (e: undefined, ctx: ExtensionContextV6) => Promise<void>): void;
|
|
41
39
|
on(event: 'session_end', handler: (e: undefined, ctx: ExtensionContextV6) => Promise<void>): void;
|
|
40
|
+
on(event: 'session_compact', handler: (e: undefined, ctx: ExtensionContextV6) => Promise<void>): void;
|
|
42
41
|
on(event: 'agent_start', handler: (e: undefined, ctx: ExtensionContextV6) => Promise<void>): void;
|
|
43
42
|
on(event: 'agent_end', handler: (e: AgentEndEvent, ctx: ExtensionContextV6) => Promise<void>): void;
|
|
44
43
|
on(event: 'turn_start', handler: (e: undefined, ctx: ExtensionContextV6) => Promise<void>): void;
|
|
45
44
|
on(event: 'turn_end', handler: (e: undefined, ctx: ExtensionContextV6) => Promise<void>): void;
|
|
46
|
-
/** @deprecated Use context_enrich instead */
|
|
47
|
-
on(event: 'context_inject', handler: (e: ContextInjectEvent, ctx: ExtensionContextV6) => Promise<ContextInjectResult | void>): void;
|
|
48
|
-
/** @deprecated Use context_enrich instead */
|
|
49
|
-
on(event: 'context_modify', handler: (e: ContextModifyEvent, ctx: ExtensionContextV6) => Promise<ContextModifyResult | void>): void;
|
|
50
45
|
on(event: string, handler: (e: any, ctx: ExtensionContextV6) => Promise<any>): void;
|
|
51
46
|
/** Register a tool that the agent can invoke */
|
|
52
47
|
registerTool(tool: ToolDefinition): void;
|
|
53
48
|
/** Register a command (slash command, etc.) */
|
|
54
49
|
registerCommand(command: CommandDefinition): void;
|
|
50
|
+
/** Register a skill for context enrichment and discovery */
|
|
51
|
+
registerSkill(skill: Skill): void;
|
|
52
|
+
/** Register an identity document */
|
|
53
|
+
registerIdentity(identity: Identity): void;
|
|
54
|
+
/** Contribute labels to the global vocabulary (for label matching) */
|
|
55
|
+
contributeLabels(labels: string[]): void;
|
|
55
56
|
events: {
|
|
56
57
|
on(event: string, handler: (...args: unknown[]) => void): void;
|
|
57
58
|
off(event: string, handler: (...args: unknown[]) => void): void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"extension-api.d.ts","sourceRoot":"","sources":["../src/extension-api.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,
|
|
1
|
+
{"version":3,"file":"extension-api.d.ts","sourceRoot":"","sources":["../src/extension-api.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,11 +2,18 @@ import type { ExtensionAPI } from './extension-api.js';
|
|
|
2
2
|
import type { LoadedExtension } from './extension-types.js';
|
|
3
3
|
import type { ExtensionsConfig } from './types.js';
|
|
4
4
|
/**
|
|
5
|
-
* Discover extension file paths from
|
|
5
|
+
* Discover extension file paths from all sources.
|
|
6
|
+
*
|
|
7
|
+
* Sources (in order):
|
|
8
|
+
* 1. Auto-discovery: .ai/extensions/ (project-local)
|
|
9
|
+
* 2. Auto-discovery: ~/.ai/extensions/ (global)
|
|
10
|
+
* 3. Installed packages: .ai/packages/node_modules/ (installed via dot-ai install)
|
|
11
|
+
* 4. Configured paths: settings.json "extensions" array (explicit paths/dirs)
|
|
12
|
+
* 5. Configured packages: settings.json "packages" array (npm package names resolved from workspace node_modules)
|
|
6
13
|
*/
|
|
7
14
|
export declare function discoverExtensions(workspaceRoot: string, config?: ExtensionsConfig): Promise<string[]>;
|
|
8
15
|
/**
|
|
9
|
-
* Create
|
|
16
|
+
* Create an ExtensionAPI instance that collects registrations into a LoadedExtension.
|
|
10
17
|
* Extensions communicate via events only — no provider access.
|
|
11
18
|
*/
|
|
12
19
|
export declare function createV6CollectorAPI(extensionPath: string, config: Record<string, unknown>, eventBus?: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"extension-loader.d.ts","sourceRoot":"","sources":["../src/extension-loader.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,KAAK,EAAE,eAAe,
|
|
1
|
+
{"version":3,"file":"extension-loader.d.ts","sourceRoot":"","sources":["../src/extension-loader.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,KAAK,EAAE,eAAe,EAAqC,MAAM,sBAAsB,CAAC;AAC/F,OAAO,KAAK,EAAE,gBAAgB,EAAmB,MAAM,YAAY,CAAC;AAmHpE;;;;;;;;;GASG;AACH,wBAAsB,kBAAkB,CACtC,aAAa,EAAE,MAAM,EACrB,MAAM,CAAC,EAAE,gBAAgB,GACxB,OAAO,CAAC,MAAM,EAAE,CAAC,CAkEnB;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAClC,aAAa,EAAE,MAAM,EACrB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,QAAQ,CAAC,EAAE;IAAE,EAAE,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,KAAK,IAAI,CAAC;IAAC,IAAI,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,CAAA;CAAE,EACpI,aAAa,CAAC,EAAE,MAAM,GACrB;IAAE,GAAG,EAAE,YAAY,CAAC;IAAC,SAAS,EAAE,eAAe,CAAA;CAAE,CA8CnD"}
|
package/dist/extension-loader.js
CHANGED
|
@@ -1,79 +1,189 @@
|
|
|
1
1
|
import { readdir, readFile, stat } from 'node:fs/promises';
|
|
2
2
|
import { join, resolve } from 'node:path';
|
|
3
3
|
import { homedir } from 'node:os';
|
|
4
|
-
|
|
4
|
+
function isExtensionFile(name) {
|
|
5
|
+
return name.endsWith('.ts') || name.endsWith('.js');
|
|
6
|
+
}
|
|
5
7
|
/**
|
|
6
|
-
*
|
|
8
|
+
* Resolve extension entry points from a directory.
|
|
9
|
+
*
|
|
10
|
+
* Checks for:
|
|
11
|
+
* 1. package.json with "dot-ai.extensions" field -> returns declared paths
|
|
12
|
+
* 2. index.ts or index.js -> returns the index file
|
|
13
|
+
*
|
|
14
|
+
* Returns resolved paths or null if no entry points found.
|
|
7
15
|
*/
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
16
|
+
async function resolveExtensionEntries(dir) {
|
|
17
|
+
// Check for package.json with "dot-ai" field first
|
|
18
|
+
try {
|
|
19
|
+
const pkgPath = join(dir, 'package.json');
|
|
20
|
+
const pkgRaw = await readFile(pkgPath, 'utf-8');
|
|
21
|
+
const pkg = JSON.parse(pkgRaw);
|
|
22
|
+
const dotAi = pkg['dot-ai'];
|
|
23
|
+
if (dotAi?.extensions && Array.isArray(dotAi.extensions)) {
|
|
24
|
+
const entries = [];
|
|
25
|
+
for (const ext of dotAi.extensions) {
|
|
26
|
+
const resolvedPath = resolve(dir, ext);
|
|
27
|
+
try {
|
|
28
|
+
await stat(resolvedPath);
|
|
29
|
+
entries.push(resolvedPath);
|
|
30
|
+
}
|
|
31
|
+
catch { /* entry doesn't exist */ }
|
|
32
|
+
}
|
|
33
|
+
if (entries.length > 0)
|
|
34
|
+
return entries;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
catch { /* no package.json or invalid */ }
|
|
38
|
+
// Check for index.ts or index.js
|
|
39
|
+
for (const indexName of ['index.ts', 'index.js']) {
|
|
40
|
+
const indexPath = join(dir, indexName);
|
|
17
41
|
try {
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
42
|
+
await stat(indexPath);
|
|
43
|
+
return [indexPath];
|
|
44
|
+
}
|
|
45
|
+
catch { /* not found */ }
|
|
46
|
+
}
|
|
47
|
+
return null;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Scan a directory for extensions.
|
|
51
|
+
*
|
|
52
|
+
* Discovery rules:
|
|
53
|
+
* 1. Direct files: `dir/*.ts` or `*.js` -> load
|
|
54
|
+
* 2. Subdirectory with package.json: `dir/sub/package.json` with "dot-ai" field -> load what it declares
|
|
55
|
+
* 3. Subdirectory with index: `dir/sub/index.ts` or `index.js` -> load
|
|
56
|
+
*
|
|
57
|
+
* No recursion beyond one level. Complex packages must use package.json manifest.
|
|
58
|
+
*/
|
|
59
|
+
async function discoverExtensionsInDir(dir) {
|
|
60
|
+
const discovered = [];
|
|
61
|
+
try {
|
|
62
|
+
const entries = await readdir(dir, { withFileTypes: true });
|
|
63
|
+
for (const entry of entries) {
|
|
64
|
+
const entryPath = join(dir, entry.name);
|
|
65
|
+
// 1. Direct files: *.ts or *.js
|
|
66
|
+
if (entry.isFile() && isExtensionFile(entry.name)) {
|
|
67
|
+
discovered.push(entryPath);
|
|
68
|
+
continue;
|
|
69
|
+
}
|
|
70
|
+
// 2 & 3. Subdirectories: package.json or index file
|
|
71
|
+
if (entry.isDirectory()) {
|
|
72
|
+
const resolved = await resolveExtensionEntries(entryPath);
|
|
73
|
+
if (resolved) {
|
|
74
|
+
discovered.push(...resolved);
|
|
23
75
|
}
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
catch { /* directory doesn't exist — skip */ }
|
|
80
|
+
return discovered;
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Resolve extensions from installed packages in .ai/packages/.
|
|
84
|
+
*
|
|
85
|
+
* Reads the package.json created by `npm --prefix .ai/packages/` and resolves
|
|
86
|
+
* extension entry points from each installed package's "dot-ai.extensions" field.
|
|
87
|
+
*/
|
|
88
|
+
async function resolveInstalledPackages(workspaceRoot) {
|
|
89
|
+
const packagesDir = join(workspaceRoot, '.ai', 'packages');
|
|
90
|
+
const pkgJsonPath = join(packagesDir, 'package.json');
|
|
91
|
+
try {
|
|
92
|
+
const raw = await readFile(pkgJsonPath, 'utf-8');
|
|
93
|
+
const pkg = JSON.parse(raw);
|
|
94
|
+
const deps = pkg.dependencies;
|
|
95
|
+
if (!deps)
|
|
96
|
+
return [];
|
|
97
|
+
const paths = [];
|
|
98
|
+
for (const name of Object.keys(deps)) {
|
|
99
|
+
const pkgDir = join(packagesDir, 'node_modules', name);
|
|
100
|
+
const entries = await resolveExtensionEntries(pkgDir);
|
|
101
|
+
if (entries) {
|
|
102
|
+
paths.push(...entries);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
return paths;
|
|
106
|
+
}
|
|
107
|
+
catch {
|
|
108
|
+
return [];
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Discover extension file paths from all sources.
|
|
113
|
+
*
|
|
114
|
+
* Sources (in order):
|
|
115
|
+
* 1. Auto-discovery: .ai/extensions/ (project-local)
|
|
116
|
+
* 2. Auto-discovery: ~/.ai/extensions/ (global)
|
|
117
|
+
* 3. Installed packages: .ai/packages/node_modules/ (installed via dot-ai install)
|
|
118
|
+
* 4. Configured paths: settings.json "extensions" array (explicit paths/dirs)
|
|
119
|
+
* 5. Configured packages: settings.json "packages" array (npm package names resolved from workspace node_modules)
|
|
120
|
+
*/
|
|
121
|
+
export async function discoverExtensions(workspaceRoot, config) {
|
|
122
|
+
const seen = new Set();
|
|
123
|
+
const allPaths = [];
|
|
124
|
+
const addPaths = (paths) => {
|
|
125
|
+
for (const p of paths) {
|
|
126
|
+
const resolved = resolve(p);
|
|
127
|
+
if (!seen.has(resolved)) {
|
|
128
|
+
seen.add(resolved);
|
|
129
|
+
allPaths.push(resolved);
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
};
|
|
133
|
+
// 1. Project-local extensions: .ai/extensions/
|
|
134
|
+
addPaths(await discoverExtensionsInDir(join(workspaceRoot, '.ai', 'extensions')));
|
|
135
|
+
// 2. Global extensions: ~/.ai/extensions/
|
|
136
|
+
addPaths(await discoverExtensionsInDir(join(homedir(), '.ai', 'extensions')));
|
|
137
|
+
// 3. Installed packages: .ai/packages/node_modules/
|
|
138
|
+
addPaths(await resolveInstalledPackages(workspaceRoot));
|
|
139
|
+
// 4. Explicitly configured paths from settings.json "extensions" array
|
|
140
|
+
if (config?.paths) {
|
|
141
|
+
for (const p of config.paths) {
|
|
142
|
+
const resolved = resolve(workspaceRoot, p);
|
|
143
|
+
try {
|
|
144
|
+
const s = await stat(resolved);
|
|
145
|
+
if (s.isDirectory()) {
|
|
146
|
+
// Check for package.json or index file first
|
|
147
|
+
const entries = await resolveExtensionEntries(resolved);
|
|
148
|
+
if (entries) {
|
|
149
|
+
addPaths(entries);
|
|
34
150
|
}
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
const pkgRaw = await readFile(pkgPath, 'utf-8');
|
|
39
|
-
const pkg = JSON.parse(pkgRaw);
|
|
40
|
-
const dotAi = pkg['dot-ai'];
|
|
41
|
-
if (dotAi?.extensions && Array.isArray(dotAi.extensions)) {
|
|
42
|
-
for (const ext of dotAi.extensions) {
|
|
43
|
-
paths.add(resolve(fullPath, ext));
|
|
44
|
-
}
|
|
45
|
-
}
|
|
151
|
+
else {
|
|
152
|
+
// Discover individual files in directory
|
|
153
|
+
addPaths(await discoverExtensionsInDir(resolved));
|
|
46
154
|
}
|
|
47
|
-
|
|
155
|
+
}
|
|
156
|
+
else if (s.isFile()) {
|
|
157
|
+
addPaths([resolved]);
|
|
48
158
|
}
|
|
49
159
|
}
|
|
160
|
+
catch {
|
|
161
|
+
// Path doesn't exist — add anyway (will fail at load time with clear error)
|
|
162
|
+
addPaths([resolved]);
|
|
163
|
+
}
|
|
50
164
|
}
|
|
51
|
-
catch { /* directory doesn't exist — skip */ }
|
|
52
165
|
}
|
|
53
|
-
//
|
|
166
|
+
// 5. Configured npm packages from settings.json "packages" array
|
|
167
|
+
// These are resolved from the workspace's own node_modules
|
|
54
168
|
if (config?.packages) {
|
|
55
169
|
for (const pkg of config.packages) {
|
|
56
170
|
try {
|
|
57
171
|
const { createRequire } = await import('node:module');
|
|
58
172
|
const require = createRequire(join(workspaceRoot, 'package.json'));
|
|
59
173
|
const pkgJsonPath = require.resolve(`${pkg}/package.json`);
|
|
60
|
-
const
|
|
61
|
-
const
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
const pkgDir = join(pkgJsonPath, '..');
|
|
65
|
-
for (const ext of dotAi.extensions) {
|
|
66
|
-
paths.add(resolve(pkgDir, ext));
|
|
67
|
-
}
|
|
174
|
+
const pkgDir = join(pkgJsonPath, '..');
|
|
175
|
+
const entries = await resolveExtensionEntries(pkgDir);
|
|
176
|
+
if (entries) {
|
|
177
|
+
addPaths(entries);
|
|
68
178
|
}
|
|
69
179
|
}
|
|
70
180
|
catch { /* package not found */ }
|
|
71
181
|
}
|
|
72
182
|
}
|
|
73
|
-
return
|
|
183
|
+
return allPaths;
|
|
74
184
|
}
|
|
75
185
|
/**
|
|
76
|
-
* Create
|
|
186
|
+
* Create an ExtensionAPI instance that collects registrations into a LoadedExtension.
|
|
77
187
|
* Extensions communicate via events only — no provider access.
|
|
78
188
|
*/
|
|
79
189
|
export function createV6CollectorAPI(extensionPath, config, eventBus, workspaceRoot) {
|
|
@@ -82,7 +192,9 @@ export function createV6CollectorAPI(extensionPath, config, eventBus, workspaceR
|
|
|
82
192
|
handlers: new Map(),
|
|
83
193
|
tools: new Map(),
|
|
84
194
|
commands: new Map(),
|
|
85
|
-
|
|
195
|
+
skills: new Map(),
|
|
196
|
+
identities: new Map(),
|
|
197
|
+
labels: new Set(),
|
|
86
198
|
};
|
|
87
199
|
const api = {
|
|
88
200
|
on(event, handler) {
|
|
@@ -90,10 +202,6 @@ export function createV6CollectorAPI(extensionPath, config, eventBus, workspaceR
|
|
|
90
202
|
extension.handlers.set(event, []);
|
|
91
203
|
}
|
|
92
204
|
extension.handlers.get(event).push(handler);
|
|
93
|
-
const tier = EVENT_TIERS[event];
|
|
94
|
-
if (tier) {
|
|
95
|
-
extension.tiers.add(tier);
|
|
96
|
-
}
|
|
97
205
|
},
|
|
98
206
|
registerTool(tool) {
|
|
99
207
|
extension.tools.set(tool.name, tool);
|
|
@@ -101,6 +209,22 @@ export function createV6CollectorAPI(extensionPath, config, eventBus, workspaceR
|
|
|
101
209
|
registerCommand(command) {
|
|
102
210
|
extension.commands.set(command.name, command);
|
|
103
211
|
},
|
|
212
|
+
registerSkill(skill) {
|
|
213
|
+
extension.skills.set(skill.name, skill);
|
|
214
|
+
// Skills contribute their labels and triggers to vocabulary
|
|
215
|
+
for (const label of skill.labels)
|
|
216
|
+
extension.labels.add(label);
|
|
217
|
+
for (const trigger of skill.triggers ?? [])
|
|
218
|
+
extension.labels.add(trigger);
|
|
219
|
+
},
|
|
220
|
+
registerIdentity(identity) {
|
|
221
|
+
const key = `${identity.type}:${identity.node ?? 'root'}`;
|
|
222
|
+
extension.identities.set(key, identity);
|
|
223
|
+
},
|
|
224
|
+
contributeLabels(labels) {
|
|
225
|
+
for (const label of labels)
|
|
226
|
+
extension.labels.add(label);
|
|
227
|
+
},
|
|
104
228
|
events: eventBus ?? {
|
|
105
229
|
on: () => { },
|
|
106
230
|
emit: () => { },
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"extension-loader.js","sourceRoot":"","sources":["../src/extension-loader.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAC3D,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"extension-loader.js","sourceRoot":"","sources":["../src/extension-loader.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import type { Logger } from './logger.js';
|
|
2
|
-
import type { LoadedExtension, ToolDefinition,
|
|
2
|
+
import type { LoadedExtension, ToolDefinition, ToolCallEvent, ToolCallResult, ExtensionDiagnostic, ExtensionContext, CollectedSections, CommandDefinition } from './extension-types.js';
|
|
3
|
+
import type { Skill, Identity } from './types.js';
|
|
3
4
|
/**
|
|
4
5
|
* Simple event bus for inter-extension communication.
|
|
5
6
|
* In-memory only, no persistence.
|
|
@@ -42,7 +43,7 @@ export declare class ExtensionRunner {
|
|
|
42
43
|
fireFirstResult<T>(event: string, data?: unknown, ctx?: ExtensionContext): Promise<T | null>;
|
|
43
44
|
/**
|
|
44
45
|
* Fire an event as a transform chain — each handler receives the previous handler's output.
|
|
45
|
-
* Used for `label_extract`, `input`, `
|
|
46
|
+
* Used for `label_extract`, `input`, `tool_result`.
|
|
46
47
|
*
|
|
47
48
|
* - Initial value is `data`.
|
|
48
49
|
* - If a handler returns undefined/null, the previous value is kept (no-op).
|
|
@@ -53,10 +54,14 @@ export declare class ExtensionRunner {
|
|
|
53
54
|
get tools(): ToolDefinition[];
|
|
54
55
|
/** Get all registered commands across extensions (last-wins for overrides) */
|
|
55
56
|
get commands(): CommandDefinition[];
|
|
57
|
+
/** Get all registered skills across extensions (last-wins for overrides) */
|
|
58
|
+
get skills(): Skill[];
|
|
59
|
+
/** Get all registered identities across extensions */
|
|
60
|
+
get identities(): Identity[];
|
|
61
|
+
/** Get all vocabulary labels contributed by extensions */
|
|
62
|
+
get vocabularyLabels(): string[];
|
|
56
63
|
/** Get diagnostic info */
|
|
57
64
|
get diagnostics(): ExtensionDiagnostic[];
|
|
58
|
-
/** Which tiers are used by loaded extensions */
|
|
59
|
-
get usedTiers(): Set<ExtensionTier>;
|
|
60
65
|
private logHandlerError;
|
|
61
66
|
}
|
|
62
67
|
//# sourceMappingURL=extension-runner.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"extension-runner.d.ts","sourceRoot":"","sources":["../src/extension-runner.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,KAAK,EACV,eAAe,EACf,cAAc,EACd,aAAa,EACb,
|
|
1
|
+
{"version":3,"file":"extension-runner.d.ts","sourceRoot":"","sources":["../src/extension-runner.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,KAAK,EACV,eAAe,EACf,cAAc,EACd,aAAa,EACb,cAAc,EACd,mBAAmB,EACnB,gBAAgB,EAGhB,iBAAiB,EACjB,iBAAiB,EAElB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAElD;;;GAGG;AACH,qBAAa,QAAQ;IACnB,OAAO,CAAC,SAAS,CAA0D;IAE3E,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,GAAG,IAAI;IAO9D,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,GAAG,IAAI;IAO/D,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI;CAW9C;AAED;;GAEG;AACH,qBAAa,eAAe;IAC1B,OAAO,CAAC,UAAU,CAAoB;IACtC,OAAO,CAAC,MAAM,CAAC,CAAS;gBAEZ,UAAU,EAAE,eAAe,EAAE,EAAE,MAAM,CAAC,EAAE,MAAM;IAK1D;;;;OAIG;IACG,IAAI,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,EAAE,GAAG,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,CAAC,EAAE,CAAC;IAsBlF;;;OAGG;IACG,gBAAgB,CAAC,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,aAAa,EAAE,GAAG,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC;IAsBvH;;;;OAIG;IACG,mBAAmB,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,EAAE,GAAG,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAuC5G;;;;OAIG;IACG,eAAe,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,EAAE,GAAG,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC;IAoBlG;;;;;;;OAOG;IACG,kBAAkB,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,GAAG,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,CAAC,CAAC;IA6BvF,2EAA2E;IAC3E,IAAI,KAAK,IAAI,cAAc,EAAE,CAmB5B;IAED,8EAA8E;IAC9E,IAAI,QAAQ,IAAI,iBAAiB,EAAE,CAWlC;IAED,4EAA4E;IAC5E,IAAI,MAAM,IAAI,KAAK,EAAE,CAUpB;IAED,sDAAsD;IACtD,IAAI,UAAU,IAAI,QAAQ,EAAE,CAU3B;IAED,0DAA0D;IAC1D,IAAI,gBAAgB,IAAI,MAAM,EAAE,CAU/B;IAED,0BAA0B;IAC1B,IAAI,WAAW,IAAI,mBAAmB,EAAE,CAWvC;IAID,OAAO,CAAC,eAAe;CAaxB"}
|
package/dist/extension-runner.js
CHANGED
|
@@ -90,7 +90,7 @@ export class ExtensionRunner {
|
|
|
90
90
|
}
|
|
91
91
|
return null;
|
|
92
92
|
}
|
|
93
|
-
// ──
|
|
93
|
+
// ── Emission Patterns ──
|
|
94
94
|
/**
|
|
95
95
|
* Fire an event and collect sections from all handlers.
|
|
96
96
|
* Used for `context_enrich` — each handler returns sections and/or systemPrompt fragments.
|
|
@@ -160,7 +160,7 @@ export class ExtensionRunner {
|
|
|
160
160
|
}
|
|
161
161
|
/**
|
|
162
162
|
* Fire an event as a transform chain — each handler receives the previous handler's output.
|
|
163
|
-
* Used for `label_extract`, `input`, `
|
|
163
|
+
* Used for `label_extract`, `input`, `tool_result`.
|
|
164
164
|
*
|
|
165
165
|
* - Initial value is `data`.
|
|
166
166
|
* - If a handler returns undefined/null, the previous value is kept (no-op).
|
|
@@ -222,6 +222,36 @@ export class ExtensionRunner {
|
|
|
222
222
|
}
|
|
223
223
|
return Array.from(cmdMap.values());
|
|
224
224
|
}
|
|
225
|
+
/** Get all registered skills across extensions (last-wins for overrides) */
|
|
226
|
+
get skills() {
|
|
227
|
+
const skillMap = new Map();
|
|
228
|
+
for (const ext of this.extensions) {
|
|
229
|
+
for (const [name, skill] of ext.skills) {
|
|
230
|
+
skillMap.set(name, skill);
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
return Array.from(skillMap.values());
|
|
234
|
+
}
|
|
235
|
+
/** Get all registered identities across extensions */
|
|
236
|
+
get identities() {
|
|
237
|
+
const identityMap = new Map();
|
|
238
|
+
for (const ext of this.extensions) {
|
|
239
|
+
for (const [key, identity] of ext.identities) {
|
|
240
|
+
identityMap.set(key, identity);
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
return Array.from(identityMap.values());
|
|
244
|
+
}
|
|
245
|
+
/** Get all vocabulary labels contributed by extensions */
|
|
246
|
+
get vocabularyLabels() {
|
|
247
|
+
const labels = new Set();
|
|
248
|
+
for (const ext of this.extensions) {
|
|
249
|
+
for (const label of ext.labels) {
|
|
250
|
+
labels.add(label);
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
return Array.from(labels);
|
|
254
|
+
}
|
|
225
255
|
/** Get diagnostic info */
|
|
226
256
|
get diagnostics() {
|
|
227
257
|
return this.extensions.map(ext => ({
|
|
@@ -229,19 +259,10 @@ export class ExtensionRunner {
|
|
|
229
259
|
handlerCounts: Object.fromEntries(Array.from(ext.handlers.entries()).map(([k, v]) => [k, v.length])),
|
|
230
260
|
toolNames: Array.from(ext.tools.keys()),
|
|
231
261
|
commandNames: ext.commands ? Array.from(ext.commands.keys()) : [],
|
|
232
|
-
|
|
262
|
+
skillNames: Array.from(ext.skills.keys()),
|
|
263
|
+
identityNames: Array.from(ext.identities.keys()),
|
|
233
264
|
}));
|
|
234
265
|
}
|
|
235
|
-
/** Which tiers are used by loaded extensions */
|
|
236
|
-
get usedTiers() {
|
|
237
|
-
const tiers = new Set();
|
|
238
|
-
for (const ext of this.extensions) {
|
|
239
|
-
for (const tier of ext.tiers) {
|
|
240
|
-
tiers.add(tier);
|
|
241
|
-
}
|
|
242
|
-
}
|
|
243
|
-
return tiers;
|
|
244
|
-
}
|
|
245
266
|
// ── Private Helpers ──
|
|
246
267
|
logHandlerError(extPath, event, err) {
|
|
247
268
|
this.logger?.log({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"extension-runner.js","sourceRoot":"","sources":["../src/extension-runner.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"extension-runner.js","sourceRoot":"","sources":["../src/extension-runner.ts"],"names":[],"mappings":"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"}
|