@aalis/core 0.7.0 → 0.9.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/app.d.ts +16 -13
- package/dist/app.d.ts.map +1 -1
- package/dist/app.js +20 -45
- package/dist/app.js.map +1 -1
- package/dist/config.d.ts +2 -25
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +2 -96
- package/dist/config.js.map +1 -1
- package/dist/context.d.ts +105 -34
- package/dist/context.d.ts.map +1 -1
- package/dist/context.js +185 -43
- package/dist/context.js.map +1 -1
- package/dist/contributions.d.ts +75 -0
- package/dist/contributions.d.ts.map +1 -0
- package/dist/contributions.js +83 -0
- package/dist/contributions.js.map +1 -0
- package/dist/disposable-chain.d.ts +47 -6
- package/dist/disposable-chain.d.ts.map +1 -1
- package/dist/disposable-chain.js +92 -12
- package/dist/disposable-chain.js.map +1 -1
- package/dist/events.d.ts +1 -9
- package/dist/events.d.ts.map +1 -1
- package/dist/events.js +1 -23
- package/dist/events.js.map +1 -1
- package/dist/hooks.d.ts +7 -22
- package/dist/hooks.d.ts.map +1 -1
- package/dist/hooks.js +6 -2
- package/dist/hooks.js.map +1 -1
- package/dist/index.d.ts +6 -5
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -4
- package/dist/index.js.map +1 -1
- package/dist/plugin-activation.d.ts +2 -0
- package/dist/plugin-activation.d.ts.map +1 -1
- package/dist/plugin-activation.js +9 -5
- package/dist/plugin-activation.js.map +1 -1
- package/dist/plugin-topology.d.ts +6 -2
- package/dist/plugin-topology.d.ts.map +1 -1
- package/dist/plugin-topology.js +6 -4
- package/dist/plugin-topology.js.map +1 -1
- package/dist/plugin.d.ts +20 -14
- package/dist/plugin.d.ts.map +1 -1
- package/dist/plugin.js +53 -72
- package/dist/plugin.js.map +1 -1
- package/dist/{service-helpers.d.ts → services-helpers.d.ts} +2 -2
- package/dist/services-helpers.d.ts.map +1 -0
- package/dist/{service-helpers.js → services-helpers.js} +2 -2
- package/dist/{service-helpers.js.map → services-helpers.js.map} +1 -1
- package/dist/{service.d.ts → services.d.ts} +43 -9
- package/dist/services.d.ts.map +1 -0
- package/dist/{service.js → services.js} +34 -11
- package/dist/services.js.map +1 -0
- package/dist/types/app.d.ts +8 -8
- package/dist/types/app.d.ts.map +1 -1
- package/dist/types/contributions.d.ts +3 -0
- package/dist/types/contributions.d.ts.map +1 -0
- package/dist/types/contributions.js +10 -0
- package/dist/types/contributions.js.map +1 -0
- package/dist/types/events.d.ts +44 -0
- package/dist/types/events.d.ts.map +1 -0
- package/dist/types/events.js +6 -0
- package/dist/types/events.js.map +1 -0
- package/dist/types/hooks.d.ts +8 -0
- package/dist/types/hooks.d.ts.map +1 -1
- package/dist/types/index.d.ts +5 -3
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js +8 -6
- package/dist/types/index.js.map +1 -1
- package/dist/types/plugin.d.ts +12 -4
- package/dist/types/plugin.d.ts.map +1 -1
- package/dist/types/plugin.js.map +1 -1
- package/dist/types/services.d.ts +4 -0
- package/dist/types/services.d.ts.map +1 -1
- package/package.json +1 -1
- package/dist/constants.d.ts +0 -31
- package/dist/constants.d.ts.map +0 -1
- package/dist/constants.js +0 -36
- package/dist/constants.js.map +0 -1
- package/dist/i18n.d.ts +0 -6
- package/dist/i18n.d.ts.map +0 -1
- package/dist/i18n.js +0 -26
- package/dist/i18n.js.map +0 -1
- package/dist/identity.d.ts +0 -26
- package/dist/identity.d.ts.map +0 -1
- package/dist/identity.js +0 -36
- package/dist/identity.js.map +0 -1
- package/dist/init.d.ts +0 -20
- package/dist/init.d.ts.map +0 -1
- package/dist/init.js +0 -455
- package/dist/init.js.map +0 -1
- package/dist/llm-router.d.ts.map +0 -1
- package/dist/llm-router.js +0 -123
- package/dist/llm-router.js.map +0 -1
- package/dist/marketplace-bootstrap.d.ts +0 -54
- package/dist/marketplace-bootstrap.d.ts.map +0 -1
- package/dist/marketplace-bootstrap.js +0 -132
- package/dist/marketplace-bootstrap.js.map +0 -1
- package/dist/mixin-registry.d.ts +0 -34
- package/dist/mixin-registry.d.ts.map +0 -1
- package/dist/mixin-registry.js +0 -60
- package/dist/mixin-registry.js.map +0 -1
- package/dist/model-ref.d.ts +0 -22
- package/dist/model-ref.d.ts.map +0 -1
- package/dist/model-ref.js +0 -46
- package/dist/model-ref.js.map +0 -1
- package/dist/pending-buffer.d.ts +0 -46
- package/dist/pending-buffer.d.ts.map +0 -1
- package/dist/pending-buffer.js +0 -131
- package/dist/pending-buffer.js.map +0 -1
- package/dist/platform-registry.d.ts +0 -40
- package/dist/platform-registry.d.ts.map +0 -1
- package/dist/platform-registry.js +0 -64
- package/dist/platform-registry.js.map +0 -1
- package/dist/semver-mini.d.ts +0 -20
- package/dist/semver-mini.d.ts.map +0 -1
- package/dist/semver-mini.js +0 -94
- package/dist/semver-mini.js.map +0 -1
- package/dist/service-helpers.d.ts.map +0 -1
- package/dist/service.d.ts.map +0 -1
- package/dist/service.js.map +0 -1
- package/dist/types/agent.d.ts +0 -51
- package/dist/types/agent.d.ts.map +0 -1
- package/dist/types/agent.js +0 -3
- package/dist/types/agent.js.map +0 -1
- package/dist/types/archive.d.ts +0 -59
- package/dist/types/archive.d.ts.map +0 -1
- package/dist/types/archive.js +0 -16
- package/dist/types/archive.js.map +0 -1
- package/dist/types/authority.d.ts +0 -63
- package/dist/types/authority.d.ts.map +0 -1
- package/dist/types/authority.js +0 -3
- package/dist/types/authority.js.map +0 -1
- package/dist/types/capabilities.d.ts +0 -53
- package/dist/types/capabilities.d.ts.map +0 -1
- package/dist/types/capabilities.js +0 -87
- package/dist/types/capabilities.js.map +0 -1
- package/dist/types/cli.d.ts +0 -14
- package/dist/types/cli.d.ts.map +0 -1
- package/dist/types/cli.js +0 -3
- package/dist/types/cli.js.map +0 -1
- package/dist/types/commands.d.ts +0 -98
- package/dist/types/commands.d.ts.map +0 -1
- package/dist/types/commands.js +0 -3
- package/dist/types/commands.js.map +0 -1
- package/dist/types/core.d.ts +0 -116
- package/dist/types/core.d.ts.map +0 -1
- package/dist/types/core.js +0 -6
- package/dist/types/core.js.map +0 -1
- package/dist/types/embedding.d.ts +0 -7
- package/dist/types/embedding.d.ts.map +0 -1
- package/dist/types/embedding.js +0 -3
- package/dist/types/embedding.js.map +0 -1
- package/dist/types/flow-control.d.ts +0 -51
- package/dist/types/flow-control.d.ts.map +0 -1
- package/dist/types/flow-control.js +0 -12
- package/dist/types/flow-control.js.map +0 -1
- package/dist/types/gateway.d.ts +0 -24
- package/dist/types/gateway.d.ts.map +0 -1
- package/dist/types/gateway.js +0 -15
- package/dist/types/gateway.js.map +0 -1
- package/dist/types/image-recognition.d.ts +0 -123
- package/dist/types/image-recognition.d.ts.map +0 -1
- package/dist/types/image-recognition.js +0 -31
- package/dist/types/image-recognition.js.map +0 -1
- package/dist/types/llm.d.ts +0 -146
- package/dist/types/llm.d.ts.map +0 -1
- package/dist/types/llm.js +0 -27
- package/dist/types/llm.js.map +0 -1
- package/dist/types/memory.d.ts +0 -62
- package/dist/types/memory.d.ts.map +0 -1
- package/dist/types/memory.js +0 -22
- package/dist/types/memory.js.map +0 -1
- package/dist/types/persona.d.ts +0 -45
- package/dist/types/persona.d.ts.map +0 -1
- package/dist/types/persona.js +0 -3
- package/dist/types/persona.js.map +0 -1
- package/dist/types/platform.d.ts +0 -126
- package/dist/types/platform.d.ts.map +0 -1
- package/dist/types/platform.js +0 -5
- package/dist/types/platform.js.map +0 -1
- package/dist/types/service.d.ts +0 -41
- package/dist/types/service.d.ts.map +0 -1
- package/dist/types/service.js +0 -35
- package/dist/types/service.js.map +0 -1
- package/dist/types/session.d.ts +0 -153
- package/dist/types/session.d.ts.map +0 -1
- package/dist/types/session.js +0 -19
- package/dist/types/session.js.map +0 -1
- package/dist/types/storage.d.ts +0 -100
- package/dist/types/storage.d.ts.map +0 -1
- package/dist/types/storage.js +0 -29
- package/dist/types/storage.js.map +0 -1
- package/dist/types/tools.d.ts +0 -39
- package/dist/types/tools.d.ts.map +0 -1
- package/dist/types/tools.js +0 -3
- package/dist/types/tools.js.map +0 -1
- package/dist/types/trigger-policy.d.ts +0 -16
- package/dist/types/trigger-policy.d.ts.map +0 -1
- package/dist/types/trigger-policy.js +0 -6
- package/dist/types/trigger-policy.js.map +0 -1
- package/dist/types/vectorstore.d.ts +0 -23
- package/dist/types/vectorstore.d.ts.map +0 -1
- package/dist/types/vectorstore.js +0 -3
- package/dist/types/vectorstore.js.map +0 -1
- package/dist/types/web-search.d.ts +0 -88
- package/dist/types/web-search.d.ts.map +0 -1
- package/dist/types/web-search.js +0 -23
- package/dist/types/web-search.js.map +0 -1
- package/dist/types/webui.d.ts +0 -137
- package/dist/types/webui.d.ts.map +0 -1
- package/dist/types/webui.js +0 -3
- package/dist/types/webui.js.map +0 -1
package/dist/llm-router.js
DELETED
|
@@ -1,123 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* LLM 路由器
|
|
3
|
-
*
|
|
4
|
-
* 负责:
|
|
5
|
-
* 1. 聚合所有已注册 'llm' 服务的模型列表。
|
|
6
|
-
* 2. 按 model ID 反查所属提供者(带缓存,服务变更时自动失效)。
|
|
7
|
-
* 3. 作为后续扩展点(负载均衡、能力过滤、成本路由等)的载体。
|
|
8
|
-
*
|
|
9
|
-
* 本类不持有全局状态:每个 Context 拥有一份实例,缓存在实例上。
|
|
10
|
-
* 由 ServiceContainer 共享真实数据源,所以同一 App 下不同子 Context
|
|
11
|
-
* 的路由结果一致。
|
|
12
|
-
*/
|
|
13
|
-
export class LLMRouter {
|
|
14
|
-
ctx;
|
|
15
|
-
logger;
|
|
16
|
-
_cache = null;
|
|
17
|
-
_cacheTime = 0;
|
|
18
|
-
_cachePromise = null;
|
|
19
|
-
static CACHE_TTL = 60_000;
|
|
20
|
-
constructor(ctx, logger) {
|
|
21
|
-
this.ctx = ctx;
|
|
22
|
-
this.logger = logger;
|
|
23
|
-
}
|
|
24
|
-
/**
|
|
25
|
-
* 聚合所有 LLM 提供者的模型列表
|
|
26
|
-
*
|
|
27
|
-
* @example
|
|
28
|
-
* const models = await router.listAllModels();
|
|
29
|
-
* // [{ id: 'gpt-4o', capabilities: [...], provider: 'OpenAI', contextId: '...' }, ...]
|
|
30
|
-
*/
|
|
31
|
-
async listAllModels() {
|
|
32
|
-
const providers = this.ctx.getAllServices('llm');
|
|
33
|
-
const results = [];
|
|
34
|
-
await Promise.all(providers.map(async ({ instance, contextId, label }) => {
|
|
35
|
-
if (typeof instance.listModels !== 'function')
|
|
36
|
-
return;
|
|
37
|
-
try {
|
|
38
|
-
const models = await instance.listModels();
|
|
39
|
-
for (const m of models) {
|
|
40
|
-
results.push({ ...m, provider: label ?? contextId, contextId });
|
|
41
|
-
}
|
|
42
|
-
}
|
|
43
|
-
catch (err) {
|
|
44
|
-
this.logger.warn(`获取模型列表失败 [${contextId}]:`, err);
|
|
45
|
-
}
|
|
46
|
-
}));
|
|
47
|
-
return results;
|
|
48
|
-
}
|
|
49
|
-
/**
|
|
50
|
-
* 按 model ID 查找拥有该模型的 LLM 提供者
|
|
51
|
-
*
|
|
52
|
-
* 解析顺序:
|
|
53
|
-
* 1. 若提供者实现了 `supportsModel(id)`,优先按此同步判断;
|
|
54
|
-
* 2. 否则回退到 `listModels()` 枚举构建缓存(TTL 60s)。
|
|
55
|
-
*
|
|
56
|
-
* @example
|
|
57
|
-
* const result = await router.resolveModelProvider('gpt-4o');
|
|
58
|
-
* if (result) await (result.instance as LLMService).chat({ messages, model: result.model });
|
|
59
|
-
*/
|
|
60
|
-
async resolveModelProvider(modelId) {
|
|
61
|
-
// 快路径:提供者自报支持
|
|
62
|
-
const providers = this.ctx.getAllServices('llm');
|
|
63
|
-
for (const { instance, contextId } of providers) {
|
|
64
|
-
if (typeof instance.supportsModel === 'function') {
|
|
65
|
-
try {
|
|
66
|
-
if (await instance.supportsModel(modelId)) {
|
|
67
|
-
return { instance, model: modelId, contextId };
|
|
68
|
-
}
|
|
69
|
-
}
|
|
70
|
-
catch { /* ignore, fall back to enumeration */ }
|
|
71
|
-
}
|
|
72
|
-
}
|
|
73
|
-
// 慢路径:缓存 + listModels 枚举
|
|
74
|
-
const cache = await this._ensureCache();
|
|
75
|
-
const targetContextId = cache.get(modelId);
|
|
76
|
-
if (!targetContextId)
|
|
77
|
-
return undefined;
|
|
78
|
-
const found = providers.find(p => p.contextId === targetContextId);
|
|
79
|
-
return found ? { instance: found.instance, model: modelId, contextId: targetContextId } : undefined;
|
|
80
|
-
}
|
|
81
|
-
/**
|
|
82
|
-
* 获取完整的 model→contextId 映射(带缓存)
|
|
83
|
-
* 供需要批量查找或自行路由的插件使用。
|
|
84
|
-
*/
|
|
85
|
-
getModelProviderMap() {
|
|
86
|
-
return this._ensureCache();
|
|
87
|
-
}
|
|
88
|
-
/** 使 model→provider 缓存立即失效(服务注册/注销时应当调用) */
|
|
89
|
-
invalidate() {
|
|
90
|
-
this._cache = null;
|
|
91
|
-
this._cachePromise = null;
|
|
92
|
-
}
|
|
93
|
-
_ensureCache() {
|
|
94
|
-
const now = Date.now();
|
|
95
|
-
if (this._cache && (now - this._cacheTime) < LLMRouter.CACHE_TTL) {
|
|
96
|
-
return Promise.resolve(this._cache);
|
|
97
|
-
}
|
|
98
|
-
if (this._cachePromise)
|
|
99
|
-
return this._cachePromise;
|
|
100
|
-
this._cachePromise = (async () => {
|
|
101
|
-
const map = new Map();
|
|
102
|
-
const providers = this.ctx.getAllServices('llm');
|
|
103
|
-
for (const { instance, contextId } of providers) {
|
|
104
|
-
if (typeof instance.listModels !== 'function')
|
|
105
|
-
continue;
|
|
106
|
-
try {
|
|
107
|
-
const models = await instance.listModels();
|
|
108
|
-
for (const m of models) {
|
|
109
|
-
if (!map.has(m.id))
|
|
110
|
-
map.set(m.id, contextId);
|
|
111
|
-
}
|
|
112
|
-
}
|
|
113
|
-
catch { /* skip unavailable provider */ }
|
|
114
|
-
}
|
|
115
|
-
this._cache = map;
|
|
116
|
-
this._cacheTime = Date.now();
|
|
117
|
-
this._cachePromise = null;
|
|
118
|
-
return map;
|
|
119
|
-
})();
|
|
120
|
-
return this._cachePromise;
|
|
121
|
-
}
|
|
122
|
-
}
|
|
123
|
-
//# sourceMappingURL=llm-router.js.map
|
package/dist/llm-router.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"llm-router.js","sourceRoot":"","sources":["../src/llm-router.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,54 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* 最小化 marketplace HTTP 客户端,专供 init 向导/全新工程的 bootstrap 使用。
|
|
3
|
-
*
|
|
4
|
-
* 与 plugin-marketplace-client 的关系:
|
|
5
|
-
* - core 不依赖任何 plugin 包,因此这里独立实现一份"够用就好"的 HTTP fetch + 解压。
|
|
6
|
-
* - 不做签名校验(仅 sha256 对比 tarball.size/sha256,签名留给运行时插件)。
|
|
7
|
-
* - 安装目标固定为 packages/<dir>/,与 plugin-marketplace-client 的 install-pipeline 对齐。
|
|
8
|
-
*
|
|
9
|
-
* 路由与 plugin-marketplace-client/src/protocol.ts 的 ROUTES 保持一致:
|
|
10
|
-
* GET /v1/plugins
|
|
11
|
-
* GET /v1/plugins/:name/:version/tarball
|
|
12
|
-
*/
|
|
13
|
-
export interface BootstrapIndexEntry {
|
|
14
|
-
name: string;
|
|
15
|
-
latest: string;
|
|
16
|
-
versions: string[];
|
|
17
|
-
displayName?: string;
|
|
18
|
-
description?: string;
|
|
19
|
-
keywords?: string[];
|
|
20
|
-
provides?: string[];
|
|
21
|
-
inject?: string[];
|
|
22
|
-
}
|
|
23
|
-
export interface BootstrapListResponse {
|
|
24
|
-
protocol: string;
|
|
25
|
-
total: number;
|
|
26
|
-
items: BootstrapIndexEntry[];
|
|
27
|
-
}
|
|
28
|
-
/** 把 manifest.name 转成 packages/<dir> 的目录名(与 install-pipeline.pluginDirName 对齐)。 */
|
|
29
|
-
export declare function pluginDirName(manifestName: string): string;
|
|
30
|
-
export declare class MarketplaceBootstrap {
|
|
31
|
-
readonly baseUrl: string;
|
|
32
|
-
readonly timeoutMs: number;
|
|
33
|
-
constructor(baseUrl: string, timeoutMs?: number);
|
|
34
|
-
private get base();
|
|
35
|
-
/** 拉取插件列表 */
|
|
36
|
-
listPlugins(): Promise<BootstrapIndexEntry[]>;
|
|
37
|
-
/** 下载指定版本 tarball */
|
|
38
|
-
fetchTarball(name: string, version: string): Promise<Buffer>;
|
|
39
|
-
/**
|
|
40
|
-
* 下载 + 校验 + 解压到 packages/<dir>/。
|
|
41
|
-
* 调用方须自行决定是否在所有插件下载完毕后跑一次 pnpm install。
|
|
42
|
-
*/
|
|
43
|
-
installToPackages(name: string, version: string, opts: {
|
|
44
|
-
packagesDir: string;
|
|
45
|
-
cacheDir?: string;
|
|
46
|
-
expectedSha256?: string;
|
|
47
|
-
}): Promise<{
|
|
48
|
-
pluginDir: string;
|
|
49
|
-
tarballPath?: string;
|
|
50
|
-
}>;
|
|
51
|
-
}
|
|
52
|
-
/** 在项目根触发 pnpm install(让 workspace 重新解析 deps) */
|
|
53
|
-
export declare function runRootPnpmInstall(projectRoot: string, timeoutMs?: number): Promise<void>;
|
|
54
|
-
//# sourceMappingURL=marketplace-bootstrap.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"marketplace-bootstrap.d.ts","sourceRoot":"","sources":["../src/marketplace-bootstrap.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAWH,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,MAAM,WAAW,qBAAqB;IACpC,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,mBAAmB,EAAE,CAAC;CAC9B;AAED,mFAAmF;AACnF,wBAAgB,aAAa,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,CAM1D;AAED,qBAAa,oBAAoB;aAEb,OAAO,EAAE,MAAM;aACf,SAAS,EAAE,MAAM;gBADjB,OAAO,EAAE,MAAM,EACf,SAAS,GAAE,MAAe;IAG5C,OAAO,KAAK,IAAI,GAAuD;IAEvE,aAAa;IACP,WAAW,IAAI,OAAO,CAAC,mBAAmB,EAAE,CAAC;IAgBnD,qBAAqB;IACf,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAalE;;;OAGG;IACG,iBAAiB,CACrB,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,EACf,IAAI,EAAE;QACJ,WAAW,EAAE,MAAM,CAAC;QACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,cAAc,CAAC,EAAE,MAAM,CAAC;KACzB,GACA,OAAO,CAAC;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CA2CxD;AAMD,iDAAiD;AACjD,wBAAsB,kBAAkB,CAAC,WAAW,EAAE,MAAM,EAAE,SAAS,SAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAOhG"}
|
|
@@ -1,132 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* 最小化 marketplace HTTP 客户端,专供 init 向导/全新工程的 bootstrap 使用。
|
|
3
|
-
*
|
|
4
|
-
* 与 plugin-marketplace-client 的关系:
|
|
5
|
-
* - core 不依赖任何 plugin 包,因此这里独立实现一份"够用就好"的 HTTP fetch + 解压。
|
|
6
|
-
* - 不做签名校验(仅 sha256 对比 tarball.size/sha256,签名留给运行时插件)。
|
|
7
|
-
* - 安装目标固定为 packages/<dir>/,与 plugin-marketplace-client 的 install-pipeline 对齐。
|
|
8
|
-
*
|
|
9
|
-
* 路由与 plugin-marketplace-client/src/protocol.ts 的 ROUTES 保持一致:
|
|
10
|
-
* GET /v1/plugins
|
|
11
|
-
* GET /v1/plugins/:name/:version/tarball
|
|
12
|
-
*/
|
|
13
|
-
import { execFile } from 'node:child_process';
|
|
14
|
-
import { createHash } from 'node:crypto';
|
|
15
|
-
import { existsSync } from 'node:fs';
|
|
16
|
-
import { mkdir, rm, writeFile } from 'node:fs/promises';
|
|
17
|
-
import { resolve } from 'node:path';
|
|
18
|
-
import { promisify } from 'node:util';
|
|
19
|
-
const execFileAsync = promisify(execFile);
|
|
20
|
-
/** 把 manifest.name 转成 packages/<dir> 的目录名(与 install-pipeline.pluginDirName 对齐)。 */
|
|
21
|
-
export function pluginDirName(manifestName) {
|
|
22
|
-
if (manifestName.startsWith('@')) {
|
|
23
|
-
const slash = manifestName.indexOf('/');
|
|
24
|
-
return slash > 0 ? manifestName.slice(slash + 1) : manifestName;
|
|
25
|
-
}
|
|
26
|
-
return manifestName;
|
|
27
|
-
}
|
|
28
|
-
export class MarketplaceBootstrap {
|
|
29
|
-
baseUrl;
|
|
30
|
-
timeoutMs;
|
|
31
|
-
constructor(baseUrl, timeoutMs = 15_000) {
|
|
32
|
-
this.baseUrl = baseUrl;
|
|
33
|
-
this.timeoutMs = timeoutMs;
|
|
34
|
-
}
|
|
35
|
-
get base() { return this.baseUrl.replace(/\/+$/, ''); }
|
|
36
|
-
/** 拉取插件列表 */
|
|
37
|
-
async listPlugins() {
|
|
38
|
-
const ac = new AbortController();
|
|
39
|
-
const timer = setTimeout(() => ac.abort(), this.timeoutMs);
|
|
40
|
-
try {
|
|
41
|
-
const res = await fetch(this.base + '/v1/plugins', {
|
|
42
|
-
signal: ac.signal,
|
|
43
|
-
headers: { accept: 'application/json' },
|
|
44
|
-
});
|
|
45
|
-
if (!res.ok)
|
|
46
|
-
throw new Error(`registry list ${res.status}`);
|
|
47
|
-
const data = (await res.json());
|
|
48
|
-
return data.items ?? [];
|
|
49
|
-
}
|
|
50
|
-
finally {
|
|
51
|
-
clearTimeout(timer);
|
|
52
|
-
}
|
|
53
|
-
}
|
|
54
|
-
/** 下载指定版本 tarball */
|
|
55
|
-
async fetchTarball(name, version) {
|
|
56
|
-
const ac = new AbortController();
|
|
57
|
-
const timer = setTimeout(() => ac.abort(), this.timeoutMs * 4);
|
|
58
|
-
try {
|
|
59
|
-
const url = this.base + `/v1/plugins/${encodeURIComponent(name)}/${encodeURIComponent(version)}/tarball`;
|
|
60
|
-
const res = await fetch(url, { signal: ac.signal });
|
|
61
|
-
if (!res.ok)
|
|
62
|
-
throw new Error(`tarball ${name}@${version} ${res.status}`);
|
|
63
|
-
return Buffer.from(await res.arrayBuffer());
|
|
64
|
-
}
|
|
65
|
-
finally {
|
|
66
|
-
clearTimeout(timer);
|
|
67
|
-
}
|
|
68
|
-
}
|
|
69
|
-
/**
|
|
70
|
-
* 下载 + 校验 + 解压到 packages/<dir>/。
|
|
71
|
-
* 调用方须自行决定是否在所有插件下载完毕后跑一次 pnpm install。
|
|
72
|
-
*/
|
|
73
|
-
async installToPackages(name, version, opts) {
|
|
74
|
-
const dir = pluginDirName(name);
|
|
75
|
-
const finalDir = resolve(opts.packagesDir, dir);
|
|
76
|
-
if (existsSync(finalDir)) {
|
|
77
|
-
throw new Error(`packages/${dir}/ 已存在,拒绝覆盖`);
|
|
78
|
-
}
|
|
79
|
-
const tarball = await this.fetchTarball(name, version);
|
|
80
|
-
if (opts.expectedSha256) {
|
|
81
|
-
const got = sha256Hex(tarball);
|
|
82
|
-
if (got !== opts.expectedSha256) {
|
|
83
|
-
throw new Error(`sha256 mismatch: expected ${opts.expectedSha256}, got ${got}`);
|
|
84
|
-
}
|
|
85
|
-
}
|
|
86
|
-
let tarballPath;
|
|
87
|
-
if (opts.cacheDir) {
|
|
88
|
-
await mkdir(opts.cacheDir, { recursive: true });
|
|
89
|
-
tarballPath = resolve(opts.cacheDir, `${name.replace(/[\/@]/g, '-')}-${version}.tgz`);
|
|
90
|
-
await writeFile(tarballPath, tarball);
|
|
91
|
-
}
|
|
92
|
-
else {
|
|
93
|
-
// 没有 cacheDir 也得有个临时落点供 system tar 读取
|
|
94
|
-
tarballPath = resolve(opts.packagesDir, `.aalis-bootstrap-${Date.now()}.tgz`);
|
|
95
|
-
await writeFile(tarballPath, tarball);
|
|
96
|
-
}
|
|
97
|
-
await mkdir(finalDir, { recursive: true });
|
|
98
|
-
try {
|
|
99
|
-
await execFileAsync('tar', ['-xzf', tarballPath, '-C', finalDir, '--strip-components=1'], {
|
|
100
|
-
timeout: 60_000,
|
|
101
|
-
maxBuffer: 128 * 1024 * 1024,
|
|
102
|
-
});
|
|
103
|
-
}
|
|
104
|
-
catch (e) {
|
|
105
|
-
await rm(finalDir, { recursive: true, force: true });
|
|
106
|
-
throw e;
|
|
107
|
-
}
|
|
108
|
-
finally {
|
|
109
|
-
// 临时 tarball 用完即删
|
|
110
|
-
if (!opts.cacheDir && tarballPath && existsSync(tarballPath)) {
|
|
111
|
-
try {
|
|
112
|
-
await rm(tarballPath, { force: true });
|
|
113
|
-
}
|
|
114
|
-
catch { /* ignore */ }
|
|
115
|
-
}
|
|
116
|
-
}
|
|
117
|
-
return { pluginDir: finalDir, tarballPath: opts.cacheDir ? tarballPath : undefined };
|
|
118
|
-
}
|
|
119
|
-
}
|
|
120
|
-
function sha256Hex(data) {
|
|
121
|
-
return createHash('sha256').update(data).digest('hex');
|
|
122
|
-
}
|
|
123
|
-
/** 在项目根触发 pnpm install(让 workspace 重新解析 deps) */
|
|
124
|
-
export async function runRootPnpmInstall(projectRoot, timeoutMs = 180_000) {
|
|
125
|
-
await execFileAsync('pnpm', ['install', '--silent'], {
|
|
126
|
-
cwd: projectRoot,
|
|
127
|
-
timeout: timeoutMs,
|
|
128
|
-
maxBuffer: 32 * 1024 * 1024,
|
|
129
|
-
env: process.env,
|
|
130
|
-
});
|
|
131
|
-
}
|
|
132
|
-
//# sourceMappingURL=marketplace-bootstrap.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"marketplace-bootstrap.js","sourceRoot":"","sources":["../src/marketplace-bootstrap.ts"],"names":[],"mappings":"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"}
|
package/dist/mixin-registry.d.ts
DELETED
|
@@ -1,34 +0,0 @@
|
|
|
1
|
-
import type { Logger } from './logger.js';
|
|
2
|
-
/** Mixin 条目记录 */
|
|
3
|
-
export interface MixinEntry {
|
|
4
|
-
service: string;
|
|
5
|
-
methods: string[];
|
|
6
|
-
contextId: string;
|
|
7
|
-
}
|
|
8
|
-
/** 承载 mixin 方法的目标 prototype(一般是 Context.prototype) */
|
|
9
|
-
type MixinTarget = object;
|
|
10
|
-
/**
|
|
11
|
-
* Mixin 注册表(进程级)
|
|
12
|
-
*
|
|
13
|
-
* 职责:
|
|
14
|
-
* - 维护 mixin 条目列表(哪些服务的哪些方法被代理到了 target prototype 上)
|
|
15
|
-
* - 在 target prototype 上安装 getter,按 `this` 运行时解析服务实例并 bind
|
|
16
|
-
* - `dispose()` 时如该方法已无其他 mixin 引用则清除
|
|
17
|
-
*
|
|
18
|
-
* 设计:静态类而非单例——因为 Context.prototype 是进程级共享资源,
|
|
19
|
-
* 不存在"每实例一个 registry"的语义;集中成静态便于测试和管理。
|
|
20
|
-
*/
|
|
21
|
-
export declare class MixinRegistry {
|
|
22
|
-
private static _entries;
|
|
23
|
-
/**
|
|
24
|
-
* 注册 mixin:把 `serviceName` 指代的服务实例的若干方法
|
|
25
|
-
* 代理到 `target` prototype 上。
|
|
26
|
-
*
|
|
27
|
-
* @returns 卸载函数
|
|
28
|
-
*/
|
|
29
|
-
static register(target: MixinTarget, serviceName: string, methods: string[], contextId: string, logger: Logger): () => void;
|
|
30
|
-
/** 当前所有 mixin 注册信息(快照) */
|
|
31
|
-
static list(): MixinEntry[];
|
|
32
|
-
}
|
|
33
|
-
export {};
|
|
34
|
-
//# sourceMappingURL=mixin-registry.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"mixin-registry.d.ts","sourceRoot":"","sources":["../src/mixin-registry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAE1C,iBAAiB;AACjB,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAOD,sDAAsD;AACtD,KAAK,WAAW,GAAG,MAAM,CAAC;AAE1B;;;;;;;;;;GAUG;AACH,qBAAa,aAAa;IACxB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAoB;IAE3C;;;;;OAKG;IACH,MAAM,CAAC,QAAQ,CACb,MAAM,EAAE,WAAW,EACnB,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,MAAM,EAAE,EACjB,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,GACb,MAAM,IAAI;IAoCb,0BAA0B;IAC1B,MAAM,CAAC,IAAI,IAAI,UAAU,EAAE;CAG5B"}
|
package/dist/mixin-registry.js
DELETED
|
@@ -1,60 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Mixin 注册表(进程级)
|
|
3
|
-
*
|
|
4
|
-
* 职责:
|
|
5
|
-
* - 维护 mixin 条目列表(哪些服务的哪些方法被代理到了 target prototype 上)
|
|
6
|
-
* - 在 target prototype 上安装 getter,按 `this` 运行时解析服务实例并 bind
|
|
7
|
-
* - `dispose()` 时如该方法已无其他 mixin 引用则清除
|
|
8
|
-
*
|
|
9
|
-
* 设计:静态类而非单例——因为 Context.prototype 是进程级共享资源,
|
|
10
|
-
* 不存在"每实例一个 registry"的语义;集中成静态便于测试和管理。
|
|
11
|
-
*/
|
|
12
|
-
export class MixinRegistry {
|
|
13
|
-
static _entries = [];
|
|
14
|
-
/**
|
|
15
|
-
* 注册 mixin:把 `serviceName` 指代的服务实例的若干方法
|
|
16
|
-
* 代理到 `target` prototype 上。
|
|
17
|
-
*
|
|
18
|
-
* @returns 卸载函数
|
|
19
|
-
*/
|
|
20
|
-
static register(target, serviceName, methods, contextId, logger) {
|
|
21
|
-
const entry = { service: serviceName, methods, contextId };
|
|
22
|
-
MixinRegistry._entries.push(entry);
|
|
23
|
-
for (const method of methods) {
|
|
24
|
-
if (method in target) {
|
|
25
|
-
logger.warn(`mixin: 方法 "${method}" 已存在于 target,跳过`);
|
|
26
|
-
continue;
|
|
27
|
-
}
|
|
28
|
-
Object.defineProperty(target, method, {
|
|
29
|
-
configurable: true,
|
|
30
|
-
enumerable: false,
|
|
31
|
-
get() {
|
|
32
|
-
const svc = this.getService(serviceName);
|
|
33
|
-
if (!svc)
|
|
34
|
-
return undefined;
|
|
35
|
-
const val = svc[method];
|
|
36
|
-
if (typeof val === 'function')
|
|
37
|
-
return val.bind(svc);
|
|
38
|
-
return val;
|
|
39
|
-
},
|
|
40
|
-
});
|
|
41
|
-
}
|
|
42
|
-
logger.debug(`mixin: ${methods.join(', ')} → ${serviceName}`);
|
|
43
|
-
return () => {
|
|
44
|
-
const idx = MixinRegistry._entries.indexOf(entry);
|
|
45
|
-
if (idx >= 0)
|
|
46
|
-
MixinRegistry._entries.splice(idx, 1);
|
|
47
|
-
for (const method of methods) {
|
|
48
|
-
const stillUsed = MixinRegistry._entries.some(e => e.methods.includes(method));
|
|
49
|
-
if (!stillUsed) {
|
|
50
|
-
delete target[method];
|
|
51
|
-
}
|
|
52
|
-
}
|
|
53
|
-
};
|
|
54
|
-
}
|
|
55
|
-
/** 当前所有 mixin 注册信息(快照) */
|
|
56
|
-
static list() {
|
|
57
|
-
return MixinRegistry._entries.map(e => ({ ...e }));
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
//# sourceMappingURL=mixin-registry.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"mixin-registry.js","sourceRoot":"","sources":["../src/mixin-registry.ts"],"names":[],"mappings":"AAiBA;;;;;;;;;;GAUG;AACH,MAAM,OAAO,aAAa;IAChB,MAAM,CAAC,QAAQ,GAAiB,EAAE,CAAC;IAE3C;;;;;OAKG;IACH,MAAM,CAAC,QAAQ,CACb,MAAmB,EACnB,WAAmB,EACnB,OAAiB,EACjB,SAAiB,EACjB,MAAc;QAEd,MAAM,KAAK,GAAe,EAAE,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC;QACvE,aAAa,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAEnC,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;YAC7B,IAAI,MAAM,IAAI,MAAM,EAAE,CAAC;gBACrB,MAAM,CAAC,IAAI,CAAC,cAAc,MAAM,kBAAkB,CAAC,CAAC;gBACpD,SAAS;YACX,CAAC;YACD,MAAM,CAAC,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE;gBACpC,YAAY,EAAE,IAAI;gBAClB,UAAU,EAAE,KAAK;gBACjB,GAAG;oBACD,MAAM,GAAG,GAAG,IAAI,CAAC,UAAU,CAA0B,WAAW,CAAC,CAAC;oBAClE,IAAI,CAAC,GAAG;wBAAE,OAAO,SAAS,CAAC;oBAC3B,MAAM,GAAG,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC;oBACxB,IAAI,OAAO,GAAG,KAAK,UAAU;wBAAE,OAAQ,GAAuC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;oBACzF,OAAO,GAAG,CAAC;gBACb,CAAC;aACF,CAAC,CAAC;QACL,CAAC;QAED,MAAM,CAAC,KAAK,CAAC,UAAU,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,WAAW,EAAE,CAAC,CAAC;QAE9D,OAAO,GAAG,EAAE;YACV,MAAM,GAAG,GAAG,aAAa,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;YAClD,IAAI,GAAG,IAAI,CAAC;gBAAE,aAAa,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;YACpD,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;gBAC7B,MAAM,SAAS,GAAG,aAAa,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;gBAC/E,IAAI,CAAC,SAAS,EAAE,CAAC;oBACf,OAAQ,MAAkC,CAAC,MAAM,CAAC,CAAC;gBACrD,CAAC;YACH,CAAC;QACH,CAAC,CAAC;IACJ,CAAC;IAED,0BAA0B;IAC1B,MAAM,CAAC,IAAI;QACT,OAAO,aAAa,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;IACrD,CAAC"}
|
package/dist/model-ref.d.ts
DELETED
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
export interface ModelRef {
|
|
2
|
-
/** provider 的 contextId(instanceId)。未指定则 router 走"按 model id 在所有 provider listModels 中查找" */
|
|
3
|
-
provider?: string;
|
|
4
|
-
/** 模型 id;未指定则 provider 用其默认模型 */
|
|
5
|
-
model?: string;
|
|
6
|
-
}
|
|
7
|
-
/**
|
|
8
|
-
* 解析复合 model 引用字符串。
|
|
9
|
-
*
|
|
10
|
-
* - `"@aalis/plugin-openai::gpt-4o"` → `{ provider: "@aalis/plugin-openai", model: "gpt-4o" }`
|
|
11
|
-
* - `"gpt-4o"` (无 `::`)→ `{ model: "gpt-4o" }`(旧风格,仅 model)
|
|
12
|
-
* - `""` / null / undefined → `{}`(让调用方走默认 provider/model)
|
|
13
|
-
*
|
|
14
|
-
* 注意:分隔符使用 `::` 而非 `:`,因为 model id 中允许包含 `:`(如 ollama 的 `qwen2.5:7b`)。
|
|
15
|
-
*/
|
|
16
|
-
export declare function parseModelRef(value: string | null | undefined): ModelRef;
|
|
17
|
-
/**
|
|
18
|
-
* 将 (provider, model) 编码为复合 string,用于持久化或 UI 选项 value。
|
|
19
|
-
* 任一方缺失时不输出分隔符(避免产生 `::xxx` 或 `xxx::` 这种不规整形式)。
|
|
20
|
-
*/
|
|
21
|
-
export declare function formatModelRef(ref: ModelRef): string;
|
|
22
|
-
//# sourceMappingURL=model-ref.d.ts.map
|
package/dist/model-ref.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"model-ref.d.ts","sourceRoot":"","sources":["../src/model-ref.ts"],"names":[],"mappings":"AAgBA,MAAM,WAAW,QAAQ;IACvB,6FAA6F;IAC7F,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,iCAAiC;IACjC,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;;;;;;GAQG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,QAAQ,CAUxE;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,QAAQ,GAAG,MAAM,CAGpD"}
|
package/dist/model-ref.js
DELETED
|
@@ -1,46 +0,0 @@
|
|
|
1
|
-
// ===== Model 引用编解码 =====
|
|
2
|
-
//
|
|
3
|
-
// 把 (provider, model) 二元组与配置/UI 友好的 string 形式互转,避免在 yaml 与 form 里
|
|
4
|
-
// 引入复合 schema。yaml 与 WebUI dynamicOptions:'llm' 的 select value 都使用此格式:
|
|
5
|
-
//
|
|
6
|
-
// "<providerContextId>::<modelId>"
|
|
7
|
-
//
|
|
8
|
-
// 例如:
|
|
9
|
-
// "@aalis/plugin-openai::gpt-4o"
|
|
10
|
-
// "@aalis/plugin-deepseek::deepseek-chat"
|
|
11
|
-
// "@aalis/plugin-ollama::qwen2.5:7b" ← model id 内部出现 ':' 仍然安全(用 '::' 分隔)
|
|
12
|
-
//
|
|
13
|
-
// 只接受 contextId 作为 provider 部分;不接受 label,避免歧义。
|
|
14
|
-
const MODEL_REF_SEPARATOR = '::';
|
|
15
|
-
/**
|
|
16
|
-
* 解析复合 model 引用字符串。
|
|
17
|
-
*
|
|
18
|
-
* - `"@aalis/plugin-openai::gpt-4o"` → `{ provider: "@aalis/plugin-openai", model: "gpt-4o" }`
|
|
19
|
-
* - `"gpt-4o"` (无 `::`)→ `{ model: "gpt-4o" }`(旧风格,仅 model)
|
|
20
|
-
* - `""` / null / undefined → `{}`(让调用方走默认 provider/model)
|
|
21
|
-
*
|
|
22
|
-
* 注意:分隔符使用 `::` 而非 `:`,因为 model id 中允许包含 `:`(如 ollama 的 `qwen2.5:7b`)。
|
|
23
|
-
*/
|
|
24
|
-
export function parseModelRef(value) {
|
|
25
|
-
if (!value)
|
|
26
|
-
return {};
|
|
27
|
-
const idx = value.indexOf(MODEL_REF_SEPARATOR);
|
|
28
|
-
if (idx < 0)
|
|
29
|
-
return { model: value };
|
|
30
|
-
const provider = value.slice(0, idx);
|
|
31
|
-
const model = value.slice(idx + MODEL_REF_SEPARATOR.length);
|
|
32
|
-
return {
|
|
33
|
-
provider: provider || undefined,
|
|
34
|
-
model: model || undefined,
|
|
35
|
-
};
|
|
36
|
-
}
|
|
37
|
-
/**
|
|
38
|
-
* 将 (provider, model) 编码为复合 string,用于持久化或 UI 选项 value。
|
|
39
|
-
* 任一方缺失时不输出分隔符(避免产生 `::xxx` 或 `xxx::` 这种不规整形式)。
|
|
40
|
-
*/
|
|
41
|
-
export function formatModelRef(ref) {
|
|
42
|
-
if (ref.provider && ref.model)
|
|
43
|
-
return `${ref.provider}${MODEL_REF_SEPARATOR}${ref.model}`;
|
|
44
|
-
return ref.model ?? ref.provider ?? '';
|
|
45
|
-
}
|
|
46
|
-
//# sourceMappingURL=model-ref.js.map
|
package/dist/model-ref.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"model-ref.js","sourceRoot":"","sources":["../src/model-ref.ts"],"names":[],"mappings":"AAAA,0BAA0B;AAC1B,EAAE;AACF,kEAAkE;AAClE,uEAAuE;AACvE,EAAE;AACF,qCAAqC;AACrC,EAAE;AACF,MAAM;AACN,mCAAmC;AACnC,4CAA4C;AAC5C,6EAA6E;AAC7E,EAAE;AACF,+CAA+C;AAE/C,MAAM,mBAAmB,GAAG,IAAI,CAAC;AASjC;;;;;;;;GAQG;AACH,MAAM,UAAU,aAAa,CAAC,KAAgC;IAC5D,IAAI,CAAC,KAAK;QAAE,OAAO,EAAE,CAAC;IACtB,MAAM,GAAG,GAAG,KAAK,CAAC,OAAO,CAAC,mBAAmB,CAAC,CAAC;IAC/C,IAAI,GAAG,GAAG,CAAC;QAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;IACrC,MAAM,QAAQ,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IACrC,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,GAAG,mBAAmB,CAAC,MAAM,CAAC,CAAC;IAC5D,OAAO;QACL,QAAQ,EAAE,QAAQ,IAAI,SAAS;QAC/B,KAAK,EAAE,KAAK,IAAI,SAAS;KAC1B,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,cAAc,CAAC,GAAa;IAC1C,IAAI,GAAG,CAAC,QAAQ,IAAI,GAAG,CAAC,KAAK;QAAE,OAAO,GAAG,GAAG,CAAC,QAAQ,GAAG,mBAAmB,GAAG,GAAG,CAAC,KAAK,EAAE,CAAC;IAC1F,OAAO,GAAG,CAAC,KAAK,IAAI,GAAG,CAAC,QAAQ,IAAI,EAAE,CAAC;AACzC,CAAC"}
|
package/dist/pending-buffer.d.ts
DELETED
|
@@ -1,46 +0,0 @@
|
|
|
1
|
-
import type { DisposableChain } from './disposable-chain.js';
|
|
2
|
-
import type { Logger } from './logger.js';
|
|
3
|
-
import type { ServiceContainer } from './service.js';
|
|
4
|
-
import type { RegisteredTool, ToolGroupInfo, CommandDefinition, AalisEvents } from './types/index.js';
|
|
5
|
-
/**
|
|
6
|
-
* 工具/指令注册缓冲
|
|
7
|
-
*
|
|
8
|
-
* 用途:插件加载顺序无法保证 tools/commands 服务已就绪时,
|
|
9
|
-
* 调用 `ctx.registerTool / registerToolGroup / command` 会被临时收纳,
|
|
10
|
-
* 等 `service:registered` 事件触发后自动刷入真实服务。
|
|
11
|
-
*
|
|
12
|
-
* 从 Context 抽出以便独立测试与理解。
|
|
13
|
-
*
|
|
14
|
-
* 设计要点:
|
|
15
|
-
* - 该缓冲是"按 Context 实例一份"的,因为每条注册都要归属到发起者 contextId
|
|
16
|
-
* - 刷入成功后获得的 dispose 函数会被加入传入的 DisposableChain,保证 Context
|
|
17
|
-
* dispose 时能统一回收
|
|
18
|
-
* - 如调用方尚未刷入前主动 dispose,会从本地数组里移除条目,不会到达底层服务
|
|
19
|
-
*/
|
|
20
|
-
export declare class PendingRegistrationBuffer {
|
|
21
|
-
private readonly contextId;
|
|
22
|
-
private readonly services;
|
|
23
|
-
private readonly logger;
|
|
24
|
-
private readonly disposables;
|
|
25
|
-
/** 由 Context 注入的 `on(event, handler)` —— 让生命周期统一托管 */
|
|
26
|
-
private readonly onEvent;
|
|
27
|
-
private _tools;
|
|
28
|
-
private _toolGroups;
|
|
29
|
-
private _commands;
|
|
30
|
-
private _flushListenerAttached;
|
|
31
|
-
constructor(contextId: string, services: ServiceContainer, logger: Logger, disposables: DisposableChain,
|
|
32
|
-
/** 由 Context 注入的 `on(event, handler)` —— 让生命周期统一托管 */
|
|
33
|
-
onEvent: <E extends string & keyof AalisEvents>(event: E, handler: (...args: AalisEvents[E]) => void | Promise<void>) => () => void);
|
|
34
|
-
/** 注册 AI 工具。服务可用则直接注册,否则缓冲到 tools 服务就绪。 */
|
|
35
|
-
registerTool(tool: Omit<RegisteredTool, 'pluginName'>): () => void;
|
|
36
|
-
/** 注册工具分组。行为同 registerTool。 */
|
|
37
|
-
registerToolGroup(group: Omit<ToolGroupInfo, 'pluginName'>): () => void;
|
|
38
|
-
/** 注册斜杠指令。服务可用则直接注册,否则缓冲到 commands 服务就绪。 */
|
|
39
|
-
registerCommand(def: CommandDefinition): () => void;
|
|
40
|
-
/** 清空本地缓冲(Context.dispose 时调用,底层服务已由 DisposableChain 回收) */
|
|
41
|
-
clear(): void;
|
|
42
|
-
private _ensureFlushListener;
|
|
43
|
-
private _flushTools;
|
|
44
|
-
private _flushCommands;
|
|
45
|
-
}
|
|
46
|
-
//# sourceMappingURL=pending-buffer.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"pending-buffer.d.ts","sourceRoot":"","sources":["../src/pending-buffer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AACrD,OAAO,KAAK,EAAE,cAAc,EAAE,aAAa,EAAE,iBAAiB,EAA+B,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAEnI;;;;;;;;;;;;;;GAcG;AACH,qBAAa,yBAAyB;IAOlC,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,WAAW;IAC5B,sDAAsD;IACtD,OAAO,CAAC,QAAQ,CAAC,OAAO;IAX1B,OAAO,CAAC,MAAM,CAA4C;IAC1D,OAAO,CAAC,WAAW,CAA2C;IAC9D,OAAO,CAAC,SAAS,CAAmD;IACpE,OAAO,CAAC,sBAAsB,CAAS;gBAGpB,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,gBAAgB,EAC1B,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,eAAe;IAC7C,sDAAsD;IACrC,OAAO,EAAE,CAAC,CAAC,SAAS,MAAM,GAAG,MAAM,WAAW,EAC7D,KAAK,EAAE,CAAC,EACR,OAAO,EAAE,CAAC,GAAG,IAAI,EAAE,WAAW,CAAC,CAAC,CAAC,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KACvD,MAAM,IAAI;IAGjB,2CAA2C;IAC3C,YAAY,CAAC,IAAI,EAAE,IAAI,CAAC,cAAc,EAAE,YAAY,CAAC,GAAG,MAAM,IAAI;IAgBlE,+BAA+B;IAC/B,iBAAiB,CAAC,KAAK,EAAE,IAAI,CAAC,aAAa,EAAE,YAAY,CAAC,GAAG,MAAM,IAAI;IAgBvE,4CAA4C;IAC5C,eAAe,CAAC,GAAG,EAAE,iBAAiB,GAAG,MAAM,IAAI;IAiBnD,4DAA4D;IAC5D,KAAK,IAAI,IAAI;IAMb,OAAO,CAAC,oBAAoB;IAW5B,OAAO,CAAC,WAAW;IAenB,OAAO,CAAC,cAAc;CASvB"}
|