@dot-ai/core 0.5.2 → 0.8.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 +40 -0
- package/dist/boot-cache.d.ts.map +1 -0
- package/dist/boot-cache.js +72 -0
- package/dist/boot-cache.js.map +1 -0
- package/dist/capabilities.d.ts +35 -0
- package/dist/capabilities.d.ts.map +1 -0
- package/dist/capabilities.js +17 -0
- package/dist/capabilities.js.map +1 -0
- package/dist/config.d.ts +7 -23
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +131 -108
- package/dist/config.js.map +1 -1
- package/dist/extension-api.d.ts +65 -0
- package/dist/extension-api.d.ts.map +1 -0
- package/dist/extension-api.js +2 -0
- package/dist/extension-api.js.map +1 -0
- package/dist/extension-loader.d.ts +19 -0
- package/dist/extension-loader.d.ts.map +1 -0
- package/dist/extension-loader.js +113 -0
- package/dist/extension-loader.js.map +1 -0
- package/dist/extension-runner.d.ts +62 -0
- package/dist/extension-runner.d.ts.map +1 -0
- package/dist/extension-runner.js +260 -0
- package/dist/extension-runner.js.map +1 -0
- package/dist/extension-types.d.ts +312 -0
- package/dist/extension-types.d.ts.map +1 -0
- package/dist/extension-types.js +89 -0
- package/dist/extension-types.js.map +1 -0
- package/dist/format.d.ts +13 -1
- package/dist/format.d.ts.map +1 -1
- package/dist/format.js +131 -15
- package/dist/format.js.map +1 -1
- package/dist/format.spec.d.ts +2 -0
- package/dist/format.spec.d.ts.map +1 -0
- package/dist/format.spec.js +140 -0
- package/dist/format.spec.js.map +1 -0
- package/dist/index.d.ts +21 -14
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +21 -14
- package/dist/index.js.map +1 -1
- package/dist/logger.d.ts +1 -1
- package/dist/logger.d.ts.map +1 -1
- package/dist/package-manager.d.ts +30 -0
- package/dist/package-manager.d.ts.map +1 -0
- package/dist/package-manager.js +91 -0
- package/dist/package-manager.js.map +1 -0
- package/dist/runtime.d.ts +119 -0
- package/dist/runtime.d.ts.map +1 -0
- package/dist/runtime.js +441 -0
- package/dist/runtime.js.map +1 -0
- package/dist/types.d.ts +29 -10
- package/dist/types.d.ts.map +1 -1
- package/package.json +4 -1
- package/src/__tests__/capabilities.test.ts +72 -0
- package/src/__tests__/config.test.ts +22 -120
- package/src/__tests__/extension-loader.test.ts +84 -0
- package/src/__tests__/extension-runner.test.ts +228 -0
- package/src/__tests__/fixtures/extensions/ctx-aware.js +26 -0
- package/src/__tests__/fixtures/extensions/security-gate.js +20 -0
- package/src/__tests__/fixtures/extensions/session-analytics.js +28 -0
- package/src/__tests__/fixtures/extensions/smart-context.js +10 -0
- package/src/__tests__/format.test.ts +207 -2
- package/src/__tests__/runtime.test.ts +141 -0
- package/src/boot-cache.ts +104 -0
- package/src/capabilities.ts +49 -0
- package/src/config.ts +131 -133
- package/src/extension-api.ts +99 -0
- package/src/extension-loader.ts +127 -0
- package/src/extension-runner.ts +297 -0
- package/src/extension-types.ts +416 -0
- package/src/format.spec.ts +175 -0
- package/src/format.test.ts +218 -0
- package/src/format.ts +140 -16
- package/src/index.ts +68 -30
- package/src/logger.ts +1 -1
- package/src/package-manager.ts +119 -0
- package/src/runtime.ts +562 -0
- package/src/types.ts +36 -14
- package/tsconfig.json +1 -1
- package/tsconfig.tsbuildinfo +1 -1
- package/.ai/memory/2026-03-04.md +0 -2
- package/.ai/tasks.json +0 -7
- package/dist/__tests__/config.test.d.ts +0 -2
- package/dist/__tests__/config.test.d.ts.map +0 -1
- package/dist/__tests__/config.test.js +0 -128
- package/dist/__tests__/config.test.js.map +0 -1
- package/dist/__tests__/e2e.test.d.ts +0 -2
- package/dist/__tests__/e2e.test.d.ts.map +0 -1
- package/dist/__tests__/e2e.test.js +0 -211
- package/dist/__tests__/e2e.test.js.map +0 -1
- package/dist/__tests__/engine.test.d.ts +0 -2
- package/dist/__tests__/engine.test.d.ts.map +0 -1
- package/dist/__tests__/engine.test.js +0 -271
- package/dist/__tests__/engine.test.js.map +0 -1
- package/dist/__tests__/format.test.d.ts +0 -2
- package/dist/__tests__/format.test.d.ts.map +0 -1
- package/dist/__tests__/format.test.js +0 -200
- package/dist/__tests__/format.test.js.map +0 -1
- package/dist/__tests__/labels.test.d.ts +0 -2
- package/dist/__tests__/labels.test.d.ts.map +0 -1
- package/dist/__tests__/labels.test.js +0 -82
- package/dist/__tests__/labels.test.js.map +0 -1
- package/dist/__tests__/loader.test.d.ts +0 -2
- package/dist/__tests__/loader.test.d.ts.map +0 -1
- package/dist/__tests__/loader.test.js +0 -161
- package/dist/__tests__/loader.test.js.map +0 -1
- package/dist/__tests__/logger.test.d.ts +0 -2
- package/dist/__tests__/logger.test.d.ts.map +0 -1
- package/dist/__tests__/logger.test.js +0 -95
- package/dist/__tests__/logger.test.js.map +0 -1
- package/dist/__tests__/nodes.test.d.ts +0 -2
- package/dist/__tests__/nodes.test.d.ts.map +0 -1
- package/dist/__tests__/nodes.test.js +0 -83
- package/dist/__tests__/nodes.test.js.map +0 -1
- package/dist/contracts.d.ts +0 -56
- package/dist/contracts.d.ts.map +0 -1
- package/dist/contracts.js +0 -2
- package/dist/contracts.js.map +0 -1
- package/dist/engine.d.ts +0 -38
- package/dist/engine.d.ts.map +0 -1
- package/dist/engine.js +0 -88
- package/dist/engine.js.map +0 -1
- package/dist/loader.d.ts +0 -26
- package/dist/loader.d.ts.map +0 -1
- package/dist/loader.js +0 -120
- package/dist/loader.js.map +0 -1
- package/src/__tests__/e2e.test.ts +0 -257
- package/src/__tests__/engine.test.ts +0 -305
- package/src/__tests__/loader.test.ts +0 -191
- package/src/contracts.ts +0 -71
- package/src/engine.ts +0 -145
- package/src/loader.ts +0 -152
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"extension-api.js","sourceRoot":"","sources":["../src/extension-api.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { ExtensionAPI } from './extension-api.js';
|
|
2
|
+
import type { LoadedExtension } from './extension-types.js';
|
|
3
|
+
import type { ExtensionsConfig } from './types.js';
|
|
4
|
+
/**
|
|
5
|
+
* Discover extension file paths from configured locations.
|
|
6
|
+
*/
|
|
7
|
+
export declare function discoverExtensions(workspaceRoot: string, config?: ExtensionsConfig): Promise<string[]>;
|
|
8
|
+
/**
|
|
9
|
+
* Create a v6 ExtensionAPI instance that collects registrations into a LoadedExtension.
|
|
10
|
+
* Extensions communicate via events only — no provider access.
|
|
11
|
+
*/
|
|
12
|
+
export declare function createV6CollectorAPI(extensionPath: string, config: Record<string, unknown>, eventBus?: {
|
|
13
|
+
on: (event: string, handler: (...args: unknown[]) => void) => void;
|
|
14
|
+
emit: (event: string, ...args: unknown[]) => void;
|
|
15
|
+
}, workspaceRoot?: string): {
|
|
16
|
+
api: ExtensionAPI;
|
|
17
|
+
extension: LoadedExtension;
|
|
18
|
+
};
|
|
19
|
+
//# sourceMappingURL=extension-loader.d.ts.map
|
|
@@ -0,0 +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,EAAoD,MAAM,sBAAsB,CAAC;AAE9G,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAEnD;;GAEG;AACH,wBAAsB,kBAAkB,CACtC,aAAa,EAAE,MAAM,EACrB,MAAM,CAAC,EAAE,gBAAgB,GACxB,OAAO,CAAC,MAAM,EAAE,CAAC,CAiEnB;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,CAoCnD"}
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
import { readdir, readFile, stat } from 'node:fs/promises';
|
|
2
|
+
import { join, resolve } from 'node:path';
|
|
3
|
+
import { homedir } from 'node:os';
|
|
4
|
+
import { EVENT_TIERS } from './extension-types.js';
|
|
5
|
+
/**
|
|
6
|
+
* Discover extension file paths from configured locations.
|
|
7
|
+
*/
|
|
8
|
+
export async function discoverExtensions(workspaceRoot, config) {
|
|
9
|
+
const paths = new Set();
|
|
10
|
+
// Default discovery paths
|
|
11
|
+
const searchDirs = [
|
|
12
|
+
join(workspaceRoot, '.ai', 'extensions'),
|
|
13
|
+
join(homedir(), '.ai', 'extensions'),
|
|
14
|
+
...(config?.paths ?? []).map(p => resolve(workspaceRoot, p)),
|
|
15
|
+
];
|
|
16
|
+
for (const dir of searchDirs) {
|
|
17
|
+
try {
|
|
18
|
+
const entries = await readdir(dir, { withFileTypes: true });
|
|
19
|
+
for (const entry of entries) {
|
|
20
|
+
const fullPath = join(dir, entry.name);
|
|
21
|
+
if (entry.isFile() && (entry.name.endsWith('.ts') || entry.name.endsWith('.js'))) {
|
|
22
|
+
paths.add(fullPath);
|
|
23
|
+
}
|
|
24
|
+
else if (entry.isDirectory()) {
|
|
25
|
+
// Check for index.ts or index.js
|
|
26
|
+
for (const indexName of ['index.ts', 'index.js']) {
|
|
27
|
+
const indexPath = join(fullPath, indexName);
|
|
28
|
+
try {
|
|
29
|
+
await stat(indexPath);
|
|
30
|
+
paths.add(indexPath);
|
|
31
|
+
break;
|
|
32
|
+
}
|
|
33
|
+
catch { /* not found */ }
|
|
34
|
+
}
|
|
35
|
+
// Check for package.json with dot-ai field
|
|
36
|
+
try {
|
|
37
|
+
const pkgPath = join(fullPath, 'package.json');
|
|
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
|
+
}
|
|
46
|
+
}
|
|
47
|
+
catch { /* no package.json or no dot-ai field */ }
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
catch { /* directory doesn't exist — skip */ }
|
|
52
|
+
}
|
|
53
|
+
// Also resolve npm packages from config
|
|
54
|
+
if (config?.packages) {
|
|
55
|
+
for (const pkg of config.packages) {
|
|
56
|
+
try {
|
|
57
|
+
const { createRequire } = await import('node:module');
|
|
58
|
+
const require = createRequire(join(workspaceRoot, 'package.json'));
|
|
59
|
+
const pkgJsonPath = require.resolve(`${pkg}/package.json`);
|
|
60
|
+
const pkgRaw = await readFile(pkgJsonPath, 'utf-8');
|
|
61
|
+
const pkgJson = JSON.parse(pkgRaw);
|
|
62
|
+
const dotAi = pkgJson['dot-ai'];
|
|
63
|
+
if (dotAi?.extensions && Array.isArray(dotAi.extensions)) {
|
|
64
|
+
const pkgDir = join(pkgJsonPath, '..');
|
|
65
|
+
for (const ext of dotAi.extensions) {
|
|
66
|
+
paths.add(resolve(pkgDir, ext));
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
catch { /* package not found */ }
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
return Array.from(paths);
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Create a v6 ExtensionAPI instance that collects registrations into a LoadedExtension.
|
|
77
|
+
* Extensions communicate via events only — no provider access.
|
|
78
|
+
*/
|
|
79
|
+
export function createV6CollectorAPI(extensionPath, config, eventBus, workspaceRoot) {
|
|
80
|
+
const extension = {
|
|
81
|
+
path: extensionPath,
|
|
82
|
+
handlers: new Map(),
|
|
83
|
+
tools: new Map(),
|
|
84
|
+
commands: new Map(),
|
|
85
|
+
tiers: new Set(),
|
|
86
|
+
};
|
|
87
|
+
const api = {
|
|
88
|
+
on(event, handler) {
|
|
89
|
+
if (!extension.handlers.has(event)) {
|
|
90
|
+
extension.handlers.set(event, []);
|
|
91
|
+
}
|
|
92
|
+
extension.handlers.get(event).push(handler);
|
|
93
|
+
const tier = EVENT_TIERS[event];
|
|
94
|
+
if (tier) {
|
|
95
|
+
extension.tiers.add(tier);
|
|
96
|
+
}
|
|
97
|
+
},
|
|
98
|
+
registerTool(tool) {
|
|
99
|
+
extension.tools.set(tool.name, tool);
|
|
100
|
+
},
|
|
101
|
+
registerCommand(command) {
|
|
102
|
+
extension.commands.set(command.name, command);
|
|
103
|
+
},
|
|
104
|
+
events: eventBus ?? {
|
|
105
|
+
on: () => { },
|
|
106
|
+
emit: () => { },
|
|
107
|
+
},
|
|
108
|
+
config,
|
|
109
|
+
workspaceRoot: workspaceRoot ?? process.cwd(),
|
|
110
|
+
};
|
|
111
|
+
return { api, extension };
|
|
112
|
+
}
|
|
113
|
+
//# sourceMappingURL=extension-loader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"extension-loader.js","sourceRoot":"","sources":["../src/extension-loader.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import type { Logger } from './logger.js';
|
|
2
|
+
import type { LoadedExtension, ToolDefinition, ExtensionTier, ToolCallEvent, ToolCallResult, ExtensionDiagnostic, ExtensionContext, CollectedSections, CommandDefinition } from './extension-types.js';
|
|
3
|
+
/**
|
|
4
|
+
* Simple event bus for inter-extension communication.
|
|
5
|
+
* In-memory only, no persistence.
|
|
6
|
+
*/
|
|
7
|
+
export declare class EventBus {
|
|
8
|
+
private listeners;
|
|
9
|
+
on(event: string, handler: (...args: unknown[]) => void): void;
|
|
10
|
+
off(event: string, handler: (...args: unknown[]) => void): void;
|
|
11
|
+
emit(event: string, ...args: unknown[]): void;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* ExtensionRunner — fires events and collects results from loaded extensions.
|
|
15
|
+
*/
|
|
16
|
+
export declare class ExtensionRunner {
|
|
17
|
+
private extensions;
|
|
18
|
+
private logger?;
|
|
19
|
+
constructor(extensions: LoadedExtension[], logger?: Logger);
|
|
20
|
+
/**
|
|
21
|
+
* Fire an event and collect results from all extensions.
|
|
22
|
+
* ctx is passed as second argument to handlers (like Pi's ctx pattern).
|
|
23
|
+
* Errors in individual handlers are caught and logged — never thrown.
|
|
24
|
+
*/
|
|
25
|
+
fire<T>(event: string, data?: unknown, ctx?: ExtensionContext): Promise<T[]>;
|
|
26
|
+
/**
|
|
27
|
+
* Fire a tool_call event, stop at first blocking result.
|
|
28
|
+
* Returns the blocking result, or null if all allow.
|
|
29
|
+
*/
|
|
30
|
+
fireUntilBlocked(event: 'tool_call', data: ToolCallEvent, ctx?: ExtensionContext): Promise<ToolCallResult | null>;
|
|
31
|
+
/**
|
|
32
|
+
* Fire an event and collect sections from all handlers.
|
|
33
|
+
* Used for `context_enrich` — each handler returns sections and/or systemPrompt fragments.
|
|
34
|
+
* All sections are flattened into a single array; all systemPrompt strings are concatenated.
|
|
35
|
+
*/
|
|
36
|
+
fireCollectSections(event: string, data?: unknown, ctx?: ExtensionContext): Promise<CollectedSections>;
|
|
37
|
+
/**
|
|
38
|
+
* Fire an event and return the first non-null/undefined result.
|
|
39
|
+
* Used for `route` — stops at the first handler that returns a value.
|
|
40
|
+
* Returns null if no handler returns a result.
|
|
41
|
+
*/
|
|
42
|
+
fireFirstResult<T>(event: string, data?: unknown, ctx?: ExtensionContext): Promise<T | null>;
|
|
43
|
+
/**
|
|
44
|
+
* Fire an event as a transform chain — each handler receives the previous handler's output.
|
|
45
|
+
* Used for `label_extract`, `input`, `context_modify`.
|
|
46
|
+
*
|
|
47
|
+
* - Initial value is `data`.
|
|
48
|
+
* - If a handler returns undefined/null, the previous value is kept (no-op).
|
|
49
|
+
* - For `input` events: if the result has `consumed: true`, short-circuits and returns immediately.
|
|
50
|
+
*/
|
|
51
|
+
fireChainTransform<T>(event: string, data: T, ctx?: ExtensionContext): Promise<T>;
|
|
52
|
+
/** Get all registered tools across extensions (last-wins for overrides) */
|
|
53
|
+
get tools(): ToolDefinition[];
|
|
54
|
+
/** Get all registered commands across extensions (last-wins for overrides) */
|
|
55
|
+
get commands(): CommandDefinition[];
|
|
56
|
+
/** Get diagnostic info */
|
|
57
|
+
get diagnostics(): ExtensionDiagnostic[];
|
|
58
|
+
/** Which tiers are used by loaded extensions */
|
|
59
|
+
get usedTiers(): Set<ExtensionTier>;
|
|
60
|
+
private logHandlerError;
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=extension-runner.d.ts.map
|
|
@@ -0,0 +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,aAAa,EACb,cAAc,EACd,mBAAmB,EACnB,gBAAgB,EAGhB,iBAAiB,EACjB,iBAAiB,EAElB,MAAM,sBAAsB,CAAC;AAE9B;;;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,0BAA0B;IAC1B,IAAI,WAAW,IAAI,mBAAmB,EAAE,CAUvC;IAED,gDAAgD;IAChD,IAAI,SAAS,IAAI,GAAG,CAAC,aAAa,CAAC,CAQlC;IAID,OAAO,CAAC,eAAe;CAaxB"}
|
|
@@ -0,0 +1,260 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Simple event bus for inter-extension communication.
|
|
3
|
+
* In-memory only, no persistence.
|
|
4
|
+
*/
|
|
5
|
+
export class EventBus {
|
|
6
|
+
listeners = new Map();
|
|
7
|
+
on(event, handler) {
|
|
8
|
+
if (!this.listeners.has(event)) {
|
|
9
|
+
this.listeners.set(event, []);
|
|
10
|
+
}
|
|
11
|
+
this.listeners.get(event).push(handler);
|
|
12
|
+
}
|
|
13
|
+
off(event, handler) {
|
|
14
|
+
const handlers = this.listeners.get(event);
|
|
15
|
+
if (!handlers)
|
|
16
|
+
return;
|
|
17
|
+
const idx = handlers.indexOf(handler);
|
|
18
|
+
if (idx >= 0)
|
|
19
|
+
handlers.splice(idx, 1);
|
|
20
|
+
}
|
|
21
|
+
emit(event, ...args) {
|
|
22
|
+
const handlers = this.listeners.get(event);
|
|
23
|
+
if (!handlers)
|
|
24
|
+
return;
|
|
25
|
+
for (const handler of handlers) {
|
|
26
|
+
try {
|
|
27
|
+
handler(...args);
|
|
28
|
+
}
|
|
29
|
+
catch {
|
|
30
|
+
// Silently ignore errors in event bus handlers
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* ExtensionRunner — fires events and collects results from loaded extensions.
|
|
37
|
+
*/
|
|
38
|
+
export class ExtensionRunner {
|
|
39
|
+
extensions;
|
|
40
|
+
logger;
|
|
41
|
+
constructor(extensions, logger) {
|
|
42
|
+
this.extensions = extensions;
|
|
43
|
+
this.logger = logger;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Fire an event and collect results from all extensions.
|
|
47
|
+
* ctx is passed as second argument to handlers (like Pi's ctx pattern).
|
|
48
|
+
* Errors in individual handlers are caught and logged — never thrown.
|
|
49
|
+
*/
|
|
50
|
+
async fire(event, data, ctx) {
|
|
51
|
+
const results = [];
|
|
52
|
+
for (const ext of this.extensions) {
|
|
53
|
+
const handlers = ext.handlers.get(event);
|
|
54
|
+
if (!handlers)
|
|
55
|
+
continue;
|
|
56
|
+
for (const handler of handlers) {
|
|
57
|
+
try {
|
|
58
|
+
const result = await handler(data, ctx);
|
|
59
|
+
if (result !== undefined && result !== null) {
|
|
60
|
+
results.push(result);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
catch (err) {
|
|
64
|
+
this.logHandlerError(ext.path, event, err);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
return results;
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Fire a tool_call event, stop at first blocking result.
|
|
72
|
+
* Returns the blocking result, or null if all allow.
|
|
73
|
+
*/
|
|
74
|
+
async fireUntilBlocked(event, data, ctx) {
|
|
75
|
+
for (const ext of this.extensions) {
|
|
76
|
+
const handlers = ext.handlers.get(event);
|
|
77
|
+
if (!handlers)
|
|
78
|
+
continue;
|
|
79
|
+
for (const handler of handlers) {
|
|
80
|
+
try {
|
|
81
|
+
const result = await handler(data, ctx);
|
|
82
|
+
if (result?.decision === 'block') {
|
|
83
|
+
return result;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
catch (err) {
|
|
87
|
+
this.logHandlerError(ext.path, event, err);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
return null;
|
|
92
|
+
}
|
|
93
|
+
// ── v6 Emission Patterns ──
|
|
94
|
+
/**
|
|
95
|
+
* Fire an event and collect sections from all handlers.
|
|
96
|
+
* Used for `context_enrich` — each handler returns sections and/or systemPrompt fragments.
|
|
97
|
+
* All sections are flattened into a single array; all systemPrompt strings are concatenated.
|
|
98
|
+
*/
|
|
99
|
+
async fireCollectSections(event, data, ctx) {
|
|
100
|
+
const sectionMap = new Map();
|
|
101
|
+
const anonymousSections = [];
|
|
102
|
+
const systemPromptParts = [];
|
|
103
|
+
for (const ext of this.extensions) {
|
|
104
|
+
const handlers = ext.handlers.get(event);
|
|
105
|
+
if (!handlers)
|
|
106
|
+
continue;
|
|
107
|
+
for (const handler of handlers) {
|
|
108
|
+
try {
|
|
109
|
+
const result = await handler(data, ctx);
|
|
110
|
+
if (result === undefined || result === null)
|
|
111
|
+
continue;
|
|
112
|
+
if (result.sections && Array.isArray(result.sections)) {
|
|
113
|
+
for (const section of result.sections) {
|
|
114
|
+
// Sections with the same id are overridden (last-wins)
|
|
115
|
+
if (section.id) {
|
|
116
|
+
sectionMap.set(section.id, section);
|
|
117
|
+
}
|
|
118
|
+
else {
|
|
119
|
+
anonymousSections.push(section);
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
if (result.systemPrompt && typeof result.systemPrompt === 'string') {
|
|
124
|
+
systemPromptParts.push(result.systemPrompt);
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
catch (err) {
|
|
128
|
+
this.logHandlerError(ext.path, event, err);
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
return {
|
|
133
|
+
sections: [...sectionMap.values(), ...anonymousSections],
|
|
134
|
+
systemPrompt: systemPromptParts.join('\n'),
|
|
135
|
+
};
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Fire an event and return the first non-null/undefined result.
|
|
139
|
+
* Used for `route` — stops at the first handler that returns a value.
|
|
140
|
+
* Returns null if no handler returns a result.
|
|
141
|
+
*/
|
|
142
|
+
async fireFirstResult(event, data, ctx) {
|
|
143
|
+
for (const ext of this.extensions) {
|
|
144
|
+
const handlers = ext.handlers.get(event);
|
|
145
|
+
if (!handlers)
|
|
146
|
+
continue;
|
|
147
|
+
for (const handler of handlers) {
|
|
148
|
+
try {
|
|
149
|
+
const result = await handler(data, ctx);
|
|
150
|
+
if (result !== undefined && result !== null) {
|
|
151
|
+
return result;
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
catch (err) {
|
|
155
|
+
this.logHandlerError(ext.path, event, err);
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
return null;
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* Fire an event as a transform chain — each handler receives the previous handler's output.
|
|
163
|
+
* Used for `label_extract`, `input`, `context_modify`.
|
|
164
|
+
*
|
|
165
|
+
* - Initial value is `data`.
|
|
166
|
+
* - If a handler returns undefined/null, the previous value is kept (no-op).
|
|
167
|
+
* - For `input` events: if the result has `consumed: true`, short-circuits and returns immediately.
|
|
168
|
+
*/
|
|
169
|
+
async fireChainTransform(event, data, ctx) {
|
|
170
|
+
let current = data;
|
|
171
|
+
for (const ext of this.extensions) {
|
|
172
|
+
const handlers = ext.handlers.get(event);
|
|
173
|
+
if (!handlers)
|
|
174
|
+
continue;
|
|
175
|
+
for (const handler of handlers) {
|
|
176
|
+
try {
|
|
177
|
+
const result = await handler(current, ctx);
|
|
178
|
+
if (result !== undefined && result !== null) {
|
|
179
|
+
current = result;
|
|
180
|
+
// Short-circuit for input events when consumed
|
|
181
|
+
if (event === 'input' && result.consumed === true) {
|
|
182
|
+
return current;
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
catch (err) {
|
|
187
|
+
this.logHandlerError(ext.path, event, err);
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
return current;
|
|
192
|
+
}
|
|
193
|
+
// ── Accessors ──
|
|
194
|
+
/** Get all registered tools across extensions (last-wins for overrides) */
|
|
195
|
+
get tools() {
|
|
196
|
+
const toolMap = new Map();
|
|
197
|
+
for (const ext of this.extensions) {
|
|
198
|
+
for (const [name, tool] of ext.tools) {
|
|
199
|
+
if (toolMap.has(name)) {
|
|
200
|
+
this.logger?.log({
|
|
201
|
+
timestamp: new Date().toISOString(),
|
|
202
|
+
level: 'info',
|
|
203
|
+
phase: 'runtime',
|
|
204
|
+
event: 'tool_override',
|
|
205
|
+
data: { tool: name, extension: ext.path },
|
|
206
|
+
});
|
|
207
|
+
}
|
|
208
|
+
toolMap.set(name, tool);
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
return Array.from(toolMap.values());
|
|
212
|
+
}
|
|
213
|
+
/** Get all registered commands across extensions (last-wins for overrides) */
|
|
214
|
+
get commands() {
|
|
215
|
+
const cmdMap = new Map();
|
|
216
|
+
for (const ext of this.extensions) {
|
|
217
|
+
if (!ext.commands)
|
|
218
|
+
continue;
|
|
219
|
+
for (const [name, cmd] of ext.commands) {
|
|
220
|
+
cmdMap.set(name, cmd);
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
return Array.from(cmdMap.values());
|
|
224
|
+
}
|
|
225
|
+
/** Get diagnostic info */
|
|
226
|
+
get diagnostics() {
|
|
227
|
+
return this.extensions.map(ext => ({
|
|
228
|
+
path: ext.path,
|
|
229
|
+
handlerCounts: Object.fromEntries(Array.from(ext.handlers.entries()).map(([k, v]) => [k, v.length])),
|
|
230
|
+
toolNames: Array.from(ext.tools.keys()),
|
|
231
|
+
commandNames: ext.commands ? Array.from(ext.commands.keys()) : [],
|
|
232
|
+
tiers: Array.from(ext.tiers),
|
|
233
|
+
}));
|
|
234
|
+
}
|
|
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
|
+
// ── Private Helpers ──
|
|
246
|
+
logHandlerError(extPath, event, err) {
|
|
247
|
+
this.logger?.log({
|
|
248
|
+
timestamp: new Date().toISOString(),
|
|
249
|
+
level: 'warn',
|
|
250
|
+
phase: 'runtime',
|
|
251
|
+
event: 'extension_handler_error',
|
|
252
|
+
data: {
|
|
253
|
+
extension: extPath,
|
|
254
|
+
eventName: event,
|
|
255
|
+
error: err instanceof Error ? err.message : String(err),
|
|
256
|
+
},
|
|
257
|
+
});
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
//# sourceMappingURL=extension-runner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"extension-runner.js","sourceRoot":"","sources":["../src/extension-runner.ts"],"names":[],"mappings":"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"}
|