@deepseek-ai/dsh-host-plugin-inventory 0.0.1-rc.3
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/LICENSE +28 -0
- package/README.i18n.yaml +6 -0
- package/README.md +22 -0
- package/README.zh.md +22 -0
- package/lib/index.js +118 -0
- package/lib/invariant.js +13 -0
- package/lib/typert.host.d.ts +3 -0
- package/lib/typert.host.js +40 -0
- package/lib/typert.remote-client.d.ts +22 -0
- package/lib/typert.remote-client.js +34 -0
- package/lib/types/index.d.ts +19 -0
- package/lib/types/index.js +100 -0
- package/lib/types/invariant.d.ts +9 -0
- package/lib/types/invariant.js +12 -0
- package/lib/types/types.d.ts +19 -0
- package/lib/types/types.js +2 -0
- package/package.json +68 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
BSD 3-Clause License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026, DeepSeek
|
|
4
|
+
|
|
5
|
+
Redistribution and use in source and binary forms, with or without
|
|
6
|
+
modification, are permitted provided that the following conditions are met:
|
|
7
|
+
|
|
8
|
+
1. Redistributions of source code must retain the above copyright notice, this
|
|
9
|
+
list of conditions and the following disclaimer.
|
|
10
|
+
|
|
11
|
+
2. Redistributions in binary form must reproduce the above copyright notice,
|
|
12
|
+
this list of conditions and the following disclaimer in the documentation
|
|
13
|
+
and/or other materials provided with the distribution.
|
|
14
|
+
|
|
15
|
+
3. Neither the name of the copyright holder nor the names of its
|
|
16
|
+
contributors may be used to endorse or promote products derived from
|
|
17
|
+
this software without specific prior written permission.
|
|
18
|
+
|
|
19
|
+
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
|
20
|
+
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
21
|
+
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
|
22
|
+
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
|
|
23
|
+
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
|
24
|
+
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
|
25
|
+
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
|
26
|
+
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
|
27
|
+
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
28
|
+
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
package/README.i18n.yaml
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
# Bilingual-pair consistency record (docs/i18n/README.md): the git blob hash of each
|
|
2
|
+
# side as of the last confirmed-consistent state. Both languages carry equal authority;
|
|
3
|
+
# after editing either side, bring the other along and re-record with:
|
|
4
|
+
# pnpm run verify-translation-pairing --write packages/host/plugin-inventory/README.md
|
|
5
|
+
README.md: a91c02df5e7a57db89c9a63af6c4355573b843da
|
|
6
|
+
README.zh.md: 261db0b92cf025606b7fc18c5754d54f8cd34e48
|
package/README.md
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
# @deepseek-ai/dsh-host-plugin-inventory
|
|
2
|
+
|
|
3
|
+
English | [中文](README.zh.md)
|
|
4
|
+
|
|
5
|
+
Read-only Host projection of the current Cordis Loader tree. `PluginInventoryGateway` registers the `pluginInventory` service and publishes one generated direct Remote, `pluginInventory/list`. Every call reads `ctx.loader.entries()` directly, skips structural group rows, and returns the remaining entries in Loader order with only their Loader entry id, module specifier, effective enablement, and current root Fiber phase.
|
|
6
|
+
|
|
7
|
+
The phase is `pending`, `loading`, `active`, `failed`, or `unloading`; it is `null` when the entry has no live root Fiber. The snapshot is intentionally point-in-time: Loader remains the sole lifecycle authority, while this package owns no cache, history, provenance model, event stream, or mutation path. Its public payload types live under `./types`, and Typert generates the Host and Client Remote artifacts exposed by `./typert` and `./remote`.
|
|
8
|
+
|
|
9
|
+
The service is Remote-only and deliberately declares no same-process Cordis `Context` merge. Client packages consume it through the explicit [`api-remotes`](../../api/remotes/README.md) assembly rather than importing the Host implementation.
|
|
10
|
+
|
|
11
|
+
## Model Experience
|
|
12
|
+
|
|
13
|
+
None, as this Host-only inventory projection registers no prompt, tool, message, or provider request.
|
|
14
|
+
|
|
15
|
+
#### KV Cache effect
|
|
16
|
+
|
|
17
|
+
None; this package never assembles model input.
|
|
18
|
+
|
|
19
|
+
## Known Limitations and Deferred Work
|
|
20
|
+
|
|
21
|
+
- **Point-in-time state only** — the result contains no durable failure history or subscription; a missing root Fiber is reported as `null`, regardless of why no live root exists.
|
|
22
|
+
- **No provenance or mutation** — the service does not identify which bundle, profile, or override introduced an entry, and it cannot enable, disable, add, or remove plugins.
|
package/README.zh.md
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
# @deepseek-ai/dsh-host-plugin-inventory
|
|
2
|
+
|
|
3
|
+
[English](README.md) | 中文
|
|
4
|
+
|
|
5
|
+
当前 Cordis Loader 树的只读 Host 投影。`PluginInventoryGateway` 注册 `pluginInventory` 服务,并发布一个由 Typert 生成的直接 Remote:`pluginInventory/list`。每次调用都直接读取 `ctx.loader.entries()`,跳过结构性的 group 行,再按 Loader 顺序返回其余条目,并且只包含 Loader 条目 id、模块标识、有效启用状态与当前根 Fiber 阶段。
|
|
6
|
+
|
|
7
|
+
阶段为 `pending`、`loading`、`active`、`failed` 或 `unloading`;条目没有存活的根 Fiber 时则为 `null`。该快照刻意只表示调用当下:Loader 仍是唯一的生命周期权威,本包不拥有缓存、历史、来源模型、事件流或修改路径。公开 payload 类型位于 `./types`,Typert 生成由 `./typert` 与 `./remote` 导出的 Host 和 Client Remote 产物。
|
|
8
|
+
|
|
9
|
+
该服务仅供 Remote 使用,刻意不声明同进程 Cordis `Context` merge。Client 包通过显式的 [`api-remotes`](../../api/remotes/README.md) 组合消费它,而不导入 Host 实现。
|
|
10
|
+
|
|
11
|
+
## 模型体验
|
|
12
|
+
|
|
13
|
+
无,因为这个仅限 Host 的清单投影不注册提示词、工具、消息或提供方请求。
|
|
14
|
+
|
|
15
|
+
#### KV Cache 影响
|
|
16
|
+
|
|
17
|
+
无;本包从不组装模型输入。
|
|
18
|
+
|
|
19
|
+
## 已知限制与暂缓事项
|
|
20
|
+
|
|
21
|
+
- **仅表示调用当下** —— 结果不包含持久的失败历史或订阅;只要不存在存活的根 Fiber,就会报告 `null`,而不区分其原因。
|
|
22
|
+
- **无来源与修改能力** —— 服务不识别条目由哪个 bundle、profile 或 override 引入,也不能启用、停用、添加或移除插件。
|
package/lib/index.js
ADDED
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
import { Remote, TypertRemoteService } from "@deepseek-ai/dsh-typert-protocol";
|
|
2
|
+
//#region lib/types/index.js
|
|
3
|
+
/** Read-only projection of the current Cordis Loader plugin entries. */
|
|
4
|
+
var __runInitializers = function(thisArg, initializers, value) {
|
|
5
|
+
var useValue = arguments.length > 2;
|
|
6
|
+
for (var i = 0; i < initializers.length; i++) value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);
|
|
7
|
+
return useValue ? value : void 0;
|
|
8
|
+
};
|
|
9
|
+
var __esDecorate = function(ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {
|
|
10
|
+
function accept(f) {
|
|
11
|
+
if (f !== void 0 && typeof f !== "function") throw new TypeError("Function expected");
|
|
12
|
+
return f;
|
|
13
|
+
}
|
|
14
|
+
var kind = contextIn.kind, key = kind === "getter" ? "get" : kind === "setter" ? "set" : "value";
|
|
15
|
+
var target = !descriptorIn && ctor ? contextIn["static"] ? ctor : ctor.prototype : null;
|
|
16
|
+
var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});
|
|
17
|
+
var _, done = false;
|
|
18
|
+
for (var i = decorators.length - 1; i >= 0; i--) {
|
|
19
|
+
var context = {};
|
|
20
|
+
for (var p in contextIn) context[p] = p === "access" ? {} : contextIn[p];
|
|
21
|
+
for (var p in contextIn.access) context.access[p] = contextIn.access[p];
|
|
22
|
+
context.addInitializer = function(f) {
|
|
23
|
+
if (done) throw new TypeError("Cannot add initializers after decoration has completed");
|
|
24
|
+
extraInitializers.push(accept(f || null));
|
|
25
|
+
};
|
|
26
|
+
var result = (0, decorators[i])(kind === "accessor" ? {
|
|
27
|
+
get: descriptor.get,
|
|
28
|
+
set: descriptor.set
|
|
29
|
+
} : descriptor[key], context);
|
|
30
|
+
if (kind === "accessor") {
|
|
31
|
+
if (result === void 0) continue;
|
|
32
|
+
if (result === null || typeof result !== "object") throw new TypeError("Object expected");
|
|
33
|
+
if (_ = accept(result.get)) descriptor.get = _;
|
|
34
|
+
if (_ = accept(result.set)) descriptor.set = _;
|
|
35
|
+
if (_ = accept(result.init)) initializers.unshift(_);
|
|
36
|
+
} else if (_ = accept(result)) if (kind === "field") initializers.unshift(_);
|
|
37
|
+
else descriptor[key] = _;
|
|
38
|
+
}
|
|
39
|
+
if (target) Object.defineProperty(target, contextIn.name, descriptor);
|
|
40
|
+
done = true;
|
|
41
|
+
};
|
|
42
|
+
/** Brand an existing Loader-tree entry id at the owning boundary. */
|
|
43
|
+
function pluginEntryId(value) {
|
|
44
|
+
return value;
|
|
45
|
+
}
|
|
46
|
+
/** Runtime mirror: FiberState is a cross-package const enum. */
|
|
47
|
+
const FIBER_STATE = {
|
|
48
|
+
PENDING: 0,
|
|
49
|
+
LOADING: 1,
|
|
50
|
+
ACTIVE: 2,
|
|
51
|
+
FAILED: 3,
|
|
52
|
+
DISPOSED: 4,
|
|
53
|
+
UNLOADING: 5
|
|
54
|
+
};
|
|
55
|
+
/** Complete public projection of Cordis Fiber states. */
|
|
56
|
+
const FIBER_PHASE = {
|
|
57
|
+
[FIBER_STATE.PENDING]: "pending",
|
|
58
|
+
[FIBER_STATE.LOADING]: "loading",
|
|
59
|
+
[FIBER_STATE.ACTIVE]: "active",
|
|
60
|
+
[FIBER_STATE.FAILED]: "failed",
|
|
61
|
+
[FIBER_STATE.DISPOSED]: null,
|
|
62
|
+
[FIBER_STATE.UNLOADING]: "unloading"
|
|
63
|
+
};
|
|
64
|
+
/** Remote-only service exposing the Loader's current non-group entry state. */
|
|
65
|
+
let PluginInventoryGateway = (() => {
|
|
66
|
+
let _classSuper = TypertRemoteService;
|
|
67
|
+
let _instanceExtraInitializers = [];
|
|
68
|
+
let _list_decorators;
|
|
69
|
+
return class PluginInventoryGateway extends _classSuper {
|
|
70
|
+
static {
|
|
71
|
+
const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
|
|
72
|
+
_list_decorators = [Remote("list")];
|
|
73
|
+
__esDecorate(this, null, _list_decorators, {
|
|
74
|
+
kind: "method",
|
|
75
|
+
name: "list",
|
|
76
|
+
static: false,
|
|
77
|
+
private: false,
|
|
78
|
+
access: {
|
|
79
|
+
has: (obj) => "list" in obj,
|
|
80
|
+
get: (obj) => obj.list
|
|
81
|
+
},
|
|
82
|
+
metadata: _metadata
|
|
83
|
+
}, null, _instanceExtraInitializers);
|
|
84
|
+
if (_metadata) Object.defineProperty(this, Symbol.metadata, {
|
|
85
|
+
enumerable: true,
|
|
86
|
+
configurable: true,
|
|
87
|
+
writable: true,
|
|
88
|
+
value: _metadata
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
static inject = ["loader"];
|
|
92
|
+
constructor(ctx) {
|
|
93
|
+
super(ctx, "pluginInventory");
|
|
94
|
+
__runInitializers(this, _instanceExtraInitializers);
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Read the Loader directly on every call. Cordis's internal plugin/status
|
|
98
|
+
* events already maintain Entry.fiber and Fiber.state, so a second cache
|
|
99
|
+
* would only add another lifecycle truth to keep synchronized.
|
|
100
|
+
* @returns Current non-group Loader entries in Loader order.
|
|
101
|
+
*/
|
|
102
|
+
list() {
|
|
103
|
+
const entries = [];
|
|
104
|
+
for (const entry of this.ctx.loader.entries()) {
|
|
105
|
+
if (entry.options.group) continue;
|
|
106
|
+
entries.push({
|
|
107
|
+
entryId: pluginEntryId(entry.id),
|
|
108
|
+
moduleName: entry.options.name,
|
|
109
|
+
enabled: !entry.disabled,
|
|
110
|
+
fiberPhase: entry.fiber === void 0 ? null : FIBER_PHASE[entry.fiber.state]
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
return { entries };
|
|
114
|
+
}
|
|
115
|
+
};
|
|
116
|
+
})();
|
|
117
|
+
//#endregion
|
|
118
|
+
export { PluginInventoryGateway, PluginInventoryGateway as default };
|
package/lib/invariant.js
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
//#region lib/types/invariant.js
|
|
2
|
+
/** Package-owned invariant companion. @module @deepseek-ai/dsh-host-plugin-inventory/invariant */
|
|
3
|
+
const PACKAGE_NAME = "@deepseek-ai/dsh-host-plugin-inventory";
|
|
4
|
+
/** Cordis companion plugin name. */
|
|
5
|
+
const name = "host-plugin-inventory-invariant";
|
|
6
|
+
/** Service required before the companion can reserve package ownership. */
|
|
7
|
+
const inject = ["invariants"];
|
|
8
|
+
/** No runtime invariant: every snapshot is projected directly from Loader-owned state. */
|
|
9
|
+
const install = () => {};
|
|
10
|
+
/** Register this package's invariant companion. */
|
|
11
|
+
const apply = (ctx) => Promise.resolve(ctx.invariants.register(PACKAGE_NAME, install));
|
|
12
|
+
//#endregion
|
|
13
|
+
export { apply, inject, name };
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/* Generated by @deepseek-ai/dsh-typert-generator from FaceModel — do not edit. */
|
|
2
|
+
import { z } from 'zod'
|
|
3
|
+
|
|
4
|
+
const _deepseek_ai_dsh_host_plugin_inventory_pluginInventory_list_result$schema = z.object({
|
|
5
|
+
'entries': z.array(z.object({
|
|
6
|
+
'entryId': z.intersection(z.string(), z.unknown()).readonly(),
|
|
7
|
+
'moduleName': z.string().readonly(),
|
|
8
|
+
'enabled': z.boolean().readonly(),
|
|
9
|
+
'fiberPhase': z.union([z.literal(null), z.literal("failed"), z.literal("pending"), z.literal("active"), z.literal("loading"), z.literal("unloading")]).readonly(),
|
|
10
|
+
})).readonly(),
|
|
11
|
+
})
|
|
12
|
+
|
|
13
|
+
export const TYPERT = {
|
|
14
|
+
package: '@deepseek-ai/dsh-host-plugin-inventory',
|
|
15
|
+
face: 'host',
|
|
16
|
+
schemas: [
|
|
17
|
+
],
|
|
18
|
+
invocations: [
|
|
19
|
+
{
|
|
20
|
+
id: '@deepseek-ai/dsh-host-plugin-inventory#pluginInventory/list',
|
|
21
|
+
service: 'pluginInventory',
|
|
22
|
+
namespace: 'pluginInventory',
|
|
23
|
+
method: 'list',
|
|
24
|
+
invocation: { kind: 'direct' },
|
|
25
|
+
parameters: [
|
|
26
|
+
],
|
|
27
|
+
result: {
|
|
28
|
+
mode: 'strict',
|
|
29
|
+
typeSymbol: '@deepseek-ai/dsh-host-plugin-inventory/types#PluginInventorySnapshot',
|
|
30
|
+
schema: _deepseek_ai_dsh_host_plugin_inventory_pluginInventory_list_result$schema,
|
|
31
|
+
},
|
|
32
|
+
sourceLocation: {"file":"packages/host/plugin-inventory/src/index.ts","line":57,"column":3},
|
|
33
|
+
},
|
|
34
|
+
],
|
|
35
|
+
model: {
|
|
36
|
+
"services": [],
|
|
37
|
+
"events": [],
|
|
38
|
+
"objects": []
|
|
39
|
+
},
|
|
40
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/* Generated by @deepseek-ai/dsh-typert-generator from the Host FaceModel — do not edit. */
|
|
2
|
+
import type {
|
|
3
|
+
RemoteResult,
|
|
4
|
+
TypertRemoteContribution,
|
|
5
|
+
} from '@deepseek-ai/dsh-typert-protocol'
|
|
6
|
+
import type { PluginInventorySnapshot } from '@deepseek-ai/dsh-host-plugin-inventory/types'
|
|
7
|
+
|
|
8
|
+
declare module '@deepseek-ai/dsh-typert-protocol' {
|
|
9
|
+
interface TypertRemoteNamespace$706c7567696e496e76656e746f7279 {
|
|
10
|
+
list: () => Promise<RemoteResult<PluginInventorySnapshot>>
|
|
11
|
+
}
|
|
12
|
+
interface TypertRemoteMap {
|
|
13
|
+
'pluginInventory/list': () => Promise<RemoteResult<PluginInventorySnapshot>>
|
|
14
|
+
}
|
|
15
|
+
interface TypertRemoteNamespaceMap {
|
|
16
|
+
'pluginInventory': TypertRemoteNamespace$706c7567696e496e76656e746f7279
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
export declare const TYPERT_REMOTE: TypertRemoteContribution
|
|
21
|
+
export default TYPERT_REMOTE
|
|
22
|
+
//# sourceMappingURL=typert.remote-client.d.ts.map
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/* Generated by @deepseek-ai/dsh-typert-generator from the Host FaceModel — do not edit. */
|
|
2
|
+
import { z } from 'zod'
|
|
3
|
+
|
|
4
|
+
const _deepseek_ai_dsh_host_plugin_inventory_pluginInventory_list_result$schema = z.object({
|
|
5
|
+
'entries': z.array(z.object({
|
|
6
|
+
'entryId': z.intersection(z.string(), z.unknown()).readonly(),
|
|
7
|
+
'moduleName': z.string().readonly(),
|
|
8
|
+
'enabled': z.boolean().readonly(),
|
|
9
|
+
'fiberPhase': z.union([z.literal(null), z.literal("failed"), z.literal("pending"), z.literal("active"), z.literal("loading"), z.literal("unloading")]).readonly(),
|
|
10
|
+
})).readonly(),
|
|
11
|
+
})
|
|
12
|
+
|
|
13
|
+
export const TYPERT_REMOTE = {
|
|
14
|
+
package: '@deepseek-ai/dsh-host-plugin-inventory',
|
|
15
|
+
descriptors: [
|
|
16
|
+
{
|
|
17
|
+
id: '@deepseek-ai/dsh-host-plugin-inventory#pluginInventory/list',
|
|
18
|
+
service: 'pluginInventory',
|
|
19
|
+
namespace: 'pluginInventory',
|
|
20
|
+
method: 'list',
|
|
21
|
+
invocation: { kind: 'direct' },
|
|
22
|
+
parameters: [
|
|
23
|
+
],
|
|
24
|
+
result: {
|
|
25
|
+
mode: 'strict',
|
|
26
|
+
typeSymbol: '@deepseek-ai/dsh-host-plugin-inventory/types#PluginInventorySnapshot',
|
|
27
|
+
schema: _deepseek_ai_dsh_host_plugin_inventory_pluginInventory_list_result$schema,
|
|
28
|
+
},
|
|
29
|
+
sourceLocation: {"file":"packages/host/plugin-inventory/src/index.ts","line":57,"column":3},
|
|
30
|
+
},
|
|
31
|
+
],
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
export default TYPERT_REMOTE
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/** Read-only projection of the current Cordis Loader plugin entries. */
|
|
2
|
+
import type { Context } from '@deepseek-ai/cordis';
|
|
3
|
+
import { TypertRemoteService } from '@deepseek-ai/dsh-typert-protocol';
|
|
4
|
+
import type { PluginInventorySnapshot } from './types.ts';
|
|
5
|
+
export type * from './types.ts';
|
|
6
|
+
/** Remote-only service exposing the Loader's current non-group entry state. */
|
|
7
|
+
export declare class PluginInventoryGateway extends TypertRemoteService {
|
|
8
|
+
static inject: string[];
|
|
9
|
+
constructor(ctx: Context);
|
|
10
|
+
/**
|
|
11
|
+
* Read the Loader directly on every call. Cordis's internal plugin/status
|
|
12
|
+
* events already maintain Entry.fiber and Fiber.state, so a second cache
|
|
13
|
+
* would only add another lifecycle truth to keep synchronized.
|
|
14
|
+
* @returns Current non-group Loader entries in Loader order.
|
|
15
|
+
*/
|
|
16
|
+
list(): PluginInventorySnapshot;
|
|
17
|
+
}
|
|
18
|
+
export default PluginInventoryGateway;
|
|
19
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
/** Read-only projection of the current Cordis Loader plugin entries. */
|
|
2
|
+
var __runInitializers = (this && this.__runInitializers) || function (thisArg, initializers, value) {
|
|
3
|
+
var useValue = arguments.length > 2;
|
|
4
|
+
for (var i = 0; i < initializers.length; i++) {
|
|
5
|
+
value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);
|
|
6
|
+
}
|
|
7
|
+
return useValue ? value : void 0;
|
|
8
|
+
};
|
|
9
|
+
var __esDecorate = (this && this.__esDecorate) || function (ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {
|
|
10
|
+
function accept(f) { if (f !== void 0 && typeof f !== "function") throw new TypeError("Function expected"); return f; }
|
|
11
|
+
var kind = contextIn.kind, key = kind === "getter" ? "get" : kind === "setter" ? "set" : "value";
|
|
12
|
+
var target = !descriptorIn && ctor ? contextIn["static"] ? ctor : ctor.prototype : null;
|
|
13
|
+
var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});
|
|
14
|
+
var _, done = false;
|
|
15
|
+
for (var i = decorators.length - 1; i >= 0; i--) {
|
|
16
|
+
var context = {};
|
|
17
|
+
for (var p in contextIn) context[p] = p === "access" ? {} : contextIn[p];
|
|
18
|
+
for (var p in contextIn.access) context.access[p] = contextIn.access[p];
|
|
19
|
+
context.addInitializer = function (f) { if (done) throw new TypeError("Cannot add initializers after decoration has completed"); extraInitializers.push(accept(f || null)); };
|
|
20
|
+
var result = (0, decorators[i])(kind === "accessor" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);
|
|
21
|
+
if (kind === "accessor") {
|
|
22
|
+
if (result === void 0) continue;
|
|
23
|
+
if (result === null || typeof result !== "object") throw new TypeError("Object expected");
|
|
24
|
+
if (_ = accept(result.get)) descriptor.get = _;
|
|
25
|
+
if (_ = accept(result.set)) descriptor.set = _;
|
|
26
|
+
if (_ = accept(result.init)) initializers.unshift(_);
|
|
27
|
+
}
|
|
28
|
+
else if (_ = accept(result)) {
|
|
29
|
+
if (kind === "field") initializers.unshift(_);
|
|
30
|
+
else descriptor[key] = _;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
if (target) Object.defineProperty(target, contextIn.name, descriptor);
|
|
34
|
+
done = true;
|
|
35
|
+
};
|
|
36
|
+
import { TypertRemoteService, Remote } from '@deepseek-ai/dsh-typert-protocol';
|
|
37
|
+
/** Brand an existing Loader-tree entry id at the owning boundary. */
|
|
38
|
+
function pluginEntryId(value) {
|
|
39
|
+
return value;
|
|
40
|
+
}
|
|
41
|
+
/** Runtime mirror: FiberState is a cross-package const enum. */
|
|
42
|
+
const FIBER_STATE = {
|
|
43
|
+
PENDING: 0,
|
|
44
|
+
LOADING: 1,
|
|
45
|
+
ACTIVE: 2,
|
|
46
|
+
FAILED: 3,
|
|
47
|
+
DISPOSED: 4,
|
|
48
|
+
UNLOADING: 5,
|
|
49
|
+
};
|
|
50
|
+
/** Complete public projection of Cordis Fiber states. */
|
|
51
|
+
const FIBER_PHASE = {
|
|
52
|
+
[FIBER_STATE.PENDING]: 'pending',
|
|
53
|
+
[FIBER_STATE.LOADING]: 'loading',
|
|
54
|
+
[FIBER_STATE.ACTIVE]: 'active',
|
|
55
|
+
[FIBER_STATE.FAILED]: 'failed',
|
|
56
|
+
[FIBER_STATE.DISPOSED]: null,
|
|
57
|
+
[FIBER_STATE.UNLOADING]: 'unloading',
|
|
58
|
+
};
|
|
59
|
+
/** Remote-only service exposing the Loader's current non-group entry state. */
|
|
60
|
+
let PluginInventoryGateway = (() => {
|
|
61
|
+
let _classSuper = TypertRemoteService;
|
|
62
|
+
let _instanceExtraInitializers = [];
|
|
63
|
+
let _list_decorators;
|
|
64
|
+
return class PluginInventoryGateway extends _classSuper {
|
|
65
|
+
static {
|
|
66
|
+
const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
|
|
67
|
+
_list_decorators = [Remote('list')];
|
|
68
|
+
__esDecorate(this, null, _list_decorators, { kind: "method", name: "list", static: false, private: false, access: { has: obj => "list" in obj, get: obj => obj.list }, metadata: _metadata }, null, _instanceExtraInitializers);
|
|
69
|
+
if (_metadata) Object.defineProperty(this, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
|
|
70
|
+
}
|
|
71
|
+
static inject = ['loader'];
|
|
72
|
+
constructor(ctx) {
|
|
73
|
+
super(ctx, 'pluginInventory');
|
|
74
|
+
__runInitializers(this, _instanceExtraInitializers);
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Read the Loader directly on every call. Cordis's internal plugin/status
|
|
78
|
+
* events already maintain Entry.fiber and Fiber.state, so a second cache
|
|
79
|
+
* would only add another lifecycle truth to keep synchronized.
|
|
80
|
+
* @returns Current non-group Loader entries in Loader order.
|
|
81
|
+
*/
|
|
82
|
+
list() {
|
|
83
|
+
const entries = [];
|
|
84
|
+
for (const entry of this.ctx.loader.entries()) {
|
|
85
|
+
if (entry.options.group)
|
|
86
|
+
continue;
|
|
87
|
+
entries.push({
|
|
88
|
+
entryId: pluginEntryId(entry.id),
|
|
89
|
+
moduleName: entry.options.name,
|
|
90
|
+
enabled: !entry.disabled,
|
|
91
|
+
fiberPhase: entry.fiber === undefined ? null : FIBER_PHASE[entry.fiber.state],
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
return { entries };
|
|
95
|
+
}
|
|
96
|
+
};
|
|
97
|
+
})();
|
|
98
|
+
export { PluginInventoryGateway };
|
|
99
|
+
export default PluginInventoryGateway;
|
|
100
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/** Package-owned invariant companion. @module @deepseek-ai/dsh-host-plugin-inventory/invariant */
|
|
2
|
+
import type { Context } from '@deepseek-ai/cordis';
|
|
3
|
+
/** Cordis companion plugin name. */
|
|
4
|
+
export declare const name = "host-plugin-inventory-invariant";
|
|
5
|
+
/** Service required before the companion can reserve package ownership. */
|
|
6
|
+
export declare const inject: string[];
|
|
7
|
+
/** Register this package's invariant companion. */
|
|
8
|
+
export declare const apply: (ctx: Context) => Promise<() => void>;
|
|
9
|
+
//# sourceMappingURL=invariant.d.ts.map
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/** Package-owned invariant companion. @module @deepseek-ai/dsh-host-plugin-inventory/invariant */
|
|
2
|
+
const PACKAGE_NAME = '@deepseek-ai/dsh-host-plugin-inventory';
|
|
3
|
+
/** Cordis companion plugin name. */
|
|
4
|
+
export const name = 'host-plugin-inventory-invariant';
|
|
5
|
+
/** Service required before the companion can reserve package ownership. */
|
|
6
|
+
export const inject = ['invariants'];
|
|
7
|
+
/** No runtime invariant: every snapshot is projected directly from Loader-owned state. */
|
|
8
|
+
const install = () => { };
|
|
9
|
+
/** Register this package's invariant companion. */
|
|
10
|
+
export const apply = (ctx) => Promise.resolve(ctx.invariants.register(PACKAGE_NAME, install));
|
|
11
|
+
/* jscpd:ignore-end */
|
|
12
|
+
//# sourceMappingURL=invariant.js.map
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { Branded } from '@deepseek-ai/dsh-brand';
|
|
2
|
+
/** Stable Loader-tree identity of one configured plugin entry. */
|
|
3
|
+
export type PluginEntryId = Branded<'PluginEntryId'>;
|
|
4
|
+
/** Lifecycle state of an entry's root Fiber, or null when it has no live root Fiber. */
|
|
5
|
+
export type PluginFiberPhase = 'pending' | 'loading' | 'active' | 'failed' | 'unloading' | null;
|
|
6
|
+
/** One non-group Loader entry exposed to trusted clients. */
|
|
7
|
+
export interface PluginInventoryEntry {
|
|
8
|
+
readonly entryId: PluginEntryId;
|
|
9
|
+
/** Exact module specifier imported by the Loader entry. */
|
|
10
|
+
readonly moduleName: string;
|
|
11
|
+
/** Effective Loader enablement, including disabled ancestor groups. */
|
|
12
|
+
readonly enabled: boolean;
|
|
13
|
+
readonly fiberPhase: PluginFiberPhase;
|
|
14
|
+
}
|
|
15
|
+
/** Point-in-time inventory returned by the plugin inventory Remote. */
|
|
16
|
+
export interface PluginInventorySnapshot {
|
|
17
|
+
readonly entries: readonly PluginInventoryEntry[];
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=types.d.ts.map
|
package/package.json
ADDED
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@deepseek-ai/dsh-host-plugin-inventory",
|
|
3
|
+
"description": "Read-only Remote projection of current Cordis Loader plugin state",
|
|
4
|
+
"version": "0.0.1-rc.3",
|
|
5
|
+
"publishConfig": {
|
|
6
|
+
"access": "restricted"
|
|
7
|
+
},
|
|
8
|
+
"repository": {
|
|
9
|
+
"type": "git",
|
|
10
|
+
"url": "git+https://github.com/deepseek-ai/deepseek-harness.git",
|
|
11
|
+
"directory": "packages/host/plugin-inventory"
|
|
12
|
+
},
|
|
13
|
+
"type": "module",
|
|
14
|
+
"main": "lib/index.js",
|
|
15
|
+
"types": "lib/types/index.d.ts",
|
|
16
|
+
"exports": {
|
|
17
|
+
".": {
|
|
18
|
+
"types": "./lib/types/index.d.ts",
|
|
19
|
+
"default": "./lib/index.js"
|
|
20
|
+
},
|
|
21
|
+
"./invariant": {
|
|
22
|
+
"types": "./lib/types/invariant.d.ts",
|
|
23
|
+
"default": "./lib/invariant.js"
|
|
24
|
+
},
|
|
25
|
+
"./types": {
|
|
26
|
+
"types": "./lib/types/types.d.ts",
|
|
27
|
+
"default": "./lib/types/types.js"
|
|
28
|
+
},
|
|
29
|
+
"./typert": {
|
|
30
|
+
"types": "./lib/typert.host.d.ts",
|
|
31
|
+
"default": "./lib/typert.host.js"
|
|
32
|
+
},
|
|
33
|
+
"./remote": {
|
|
34
|
+
"types": "./lib/typert.remote-client.d.ts",
|
|
35
|
+
"default": "./lib/typert.remote-client.js"
|
|
36
|
+
},
|
|
37
|
+
"./src/*": "./src/*",
|
|
38
|
+
"./package.json": "./package.json"
|
|
39
|
+
},
|
|
40
|
+
"files": [
|
|
41
|
+
"lib/index.js",
|
|
42
|
+
"lib/invariant.js",
|
|
43
|
+
"lib/types/**/*.js",
|
|
44
|
+
"lib/types/**/*.d.ts",
|
|
45
|
+
"lib/typert.host.js",
|
|
46
|
+
"lib/typert.host.d.ts",
|
|
47
|
+
"lib/typert.remote-client.js",
|
|
48
|
+
"lib/typert.remote-client.d.ts"
|
|
49
|
+
],
|
|
50
|
+
"license": "BSD-3-Clause",
|
|
51
|
+
"dependencies": {
|
|
52
|
+
"zod": "^4.4.3"
|
|
53
|
+
},
|
|
54
|
+
"peerDependencies": {
|
|
55
|
+
"@deepseek-ai/cordis-plugin-loader": "^1.0.1-rc.1",
|
|
56
|
+
"@deepseek-ai/dsh-brand": "^0.0.1-rc.3",
|
|
57
|
+
"@deepseek-ai/dsh-invariants": "^0.0.1-rc.3",
|
|
58
|
+
"@deepseek-ai/dsh-typert-protocol": "^0.0.1-rc.3",
|
|
59
|
+
"@deepseek-ai/cordis": "^4.0.1-rc.1"
|
|
60
|
+
},
|
|
61
|
+
"devDependencies": {
|
|
62
|
+
"@deepseek-ai/cordis-plugin-loader": "^1.0.1-rc.1",
|
|
63
|
+
"@deepseek-ai/dsh-brand": "^0.0.1-rc.3",
|
|
64
|
+
"@deepseek-ai/dsh-invariants": "^0.0.1-rc.3",
|
|
65
|
+
"@deepseek-ai/dsh-typert-protocol": "^0.0.1-rc.3",
|
|
66
|
+
"@deepseek-ai/cordis": "^4.0.1-rc.1"
|
|
67
|
+
}
|
|
68
|
+
}
|