@yadsh/dsh-plugin-log-ui 0.1.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/LICENSE +21 -0
- package/README.md +31 -0
- package/cordis.patch.yml +4 -0
- package/lib/client/index.js +114 -0
- package/lib/client/index.js.map +1 -0
- package/lib/client/settings-store.js +12 -0
- package/lib/client/settings-store.js.map +1 -0
- package/lib/client/styles.js +23 -0
- package/lib/client/styles.js.map +1 -0
- package/lib/client.js +5229 -0
- package/lib/client.js.map +1 -0
- package/lib/config.js +52 -0
- package/lib/config.js.map +1 -0
- package/lib/index.js +115 -0
- package/lib/index.js.map +1 -0
- package/lib/typert.host.d.ts +3 -0
- package/lib/typert.host.js +80 -0
- package/lib/typert.remote-client.d.ts +22 -0
- package/lib/typert.remote-client.js +34 -0
- package/lib/types/client/index.d.ts +3 -0
- package/lib/types/client/settings-store.d.ts +12 -0
- package/lib/types/client/styles.d.ts +1 -0
- package/lib/types/config.d.ts +7 -0
- package/lib/types/index.d.ts +26 -0
- package/lib/types/types.d.ts +25 -0
- package/lib/types.js +2 -0
- package/lib/types.js.map +1 -0
- package/package.json +121 -0
package/lib/config.js
ADDED
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import z from "@deepseek-ai/schemastery";
|
|
2
|
+
export const MANAGED_LOG_LEVELS = [
|
|
3
|
+
"trace",
|
|
4
|
+
"debug",
|
|
5
|
+
"info",
|
|
6
|
+
"warn",
|
|
7
|
+
"error",
|
|
8
|
+
"fatal",
|
|
9
|
+
"silent",
|
|
10
|
+
];
|
|
11
|
+
export const MANAGED_LOG_FORMATS = [
|
|
12
|
+
"json",
|
|
13
|
+
"text",
|
|
14
|
+
];
|
|
15
|
+
export const DEFAULT_PLUGIN_LOG_UI_CONFIG = Object.freeze({
|
|
16
|
+
defaultLevel: "info",
|
|
17
|
+
format: "text",
|
|
18
|
+
levels: Object.freeze({}),
|
|
19
|
+
});
|
|
20
|
+
const levelSchema = z.union(MANAGED_LOG_LEVELS);
|
|
21
|
+
export const ConfigSchema = z.object({
|
|
22
|
+
defaultLevel: levelSchema.default(DEFAULT_PLUGIN_LOG_UI_CONFIG.defaultLevel),
|
|
23
|
+
format: z.union(MANAGED_LOG_FORMATS).default(DEFAULT_PLUGIN_LOG_UI_CONFIG.format),
|
|
24
|
+
levels: z.dict(levelSchema).default({}),
|
|
25
|
+
});
|
|
26
|
+
const PLUGIN_ID_PATTERN = /^[A-Za-z0-9][A-Za-z0-9._-]*$/;
|
|
27
|
+
export function resolveConfig(input = {}) {
|
|
28
|
+
const levels = {};
|
|
29
|
+
for (const [pluginId, level] of Object.entries(input.levels ?? {})) {
|
|
30
|
+
if (!PLUGIN_ID_PATTERN.test(pluginId)) {
|
|
31
|
+
throw new TypeError(`plugin log override id is invalid: ${JSON.stringify(pluginId)}`);
|
|
32
|
+
}
|
|
33
|
+
if (!MANAGED_LOG_LEVELS.includes(level)) {
|
|
34
|
+
throw new TypeError(`plugin log override level is invalid: ${JSON.stringify(level)}`);
|
|
35
|
+
}
|
|
36
|
+
levels[pluginId] = level;
|
|
37
|
+
}
|
|
38
|
+
const defaultLevel = input.defaultLevel ?? DEFAULT_PLUGIN_LOG_UI_CONFIG.defaultLevel;
|
|
39
|
+
const format = input.format ?? DEFAULT_PLUGIN_LOG_UI_CONFIG.format;
|
|
40
|
+
if (!MANAGED_LOG_LEVELS.includes(defaultLevel)) {
|
|
41
|
+
throw new TypeError(`default plugin log level is invalid: ${JSON.stringify(defaultLevel)}`);
|
|
42
|
+
}
|
|
43
|
+
if (!MANAGED_LOG_FORMATS.includes(format)) {
|
|
44
|
+
throw new TypeError(`plugin log format is invalid: ${JSON.stringify(format)}`);
|
|
45
|
+
}
|
|
46
|
+
return Object.freeze({
|
|
47
|
+
defaultLevel,
|
|
48
|
+
format,
|
|
49
|
+
levels: Object.freeze(levels),
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,CAAC,MAAM,0BAA0B,CAAC;AAQzC,MAAM,CAAC,MAAM,kBAAkB,GAAG;IAChC,OAAO;IACP,OAAO;IACP,MAAM;IACN,MAAM;IACN,OAAO;IACP,OAAO;IACP,QAAQ;CAC2C,CAAC;AAEtD,MAAM,CAAC,MAAM,mBAAmB,GAAG;IACjC,MAAM;IACN,MAAM;CAC8C,CAAC;AAEvD,MAAM,CAAC,MAAM,4BAA4B,GAA8B,MAAM,CAAC,MAAM,CAAC;IACnF,YAAY,EAAE,MAAM;IACpB,MAAM,EAAE,MAAM;IACd,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC;CAC1B,CAAC,CAAC;AAEH,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC;AAEhD,MAAM,CAAC,MAAM,YAAY,GAAyB,CAAC,CAAC,MAAM,CAAC;IACzD,YAAY,EAAE,WAAW,CAAC,OAAO,CAAC,4BAA4B,CAAC,YAAY,CAAC;IAC5E,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAAC,OAAO,CAAC,4BAA4B,CAAC,MAAM,CAAC;IACjF,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;CACxC,CAAC,CAAC;AAEH,MAAM,iBAAiB,GAAG,8BAA8B,CAAC;AAEzD,MAAM,UAAU,aAAa,CAAC,KAAK,GAAsB,EAAE;IACzD,MAAM,MAAM,GAA0C,EAAE,CAAC;IACzD,KAAK,MAAM,CAAC,QAAQ,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,IAAI,EAAE,CAAC,EAAE,CAAC;QACnE,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;YACtC,MAAM,IAAI,SAAS,CAAC,sCAAsC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;QACxF,CAAC;QACD,IAAI,CAAC,kBAAkB,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;YACxC,MAAM,IAAI,SAAS,CAAC,yCAAyC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QACxF,CAAC;QACD,MAAM,CAAC,QAAQ,CAAC,GAAG,KAAK,CAAC;IAC3B,CAAC;IACD,MAAM,YAAY,GAAG,KAAK,CAAC,YAAY,IAAI,4BAA4B,CAAC,YAAY,CAAC;IACrF,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,IAAI,4BAA4B,CAAC,MAAM,CAAC;IACnE,IAAI,CAAC,kBAAkB,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC;QAC/C,MAAM,IAAI,SAAS,CAAC,wCAAwC,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;IAC9F,CAAC;IACD,IAAI,CAAC,mBAAmB,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;QAC1C,MAAM,IAAI,SAAS,CAAC,iCAAiC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IACjF,CAAC;IACD,OAAO,MAAM,CAAC,MAAM,CAAC;QACnB,YAAY;QACZ,MAAM;QACN,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC;KAC9B,CAAC,CAAC;AACL,CAAC"}
|
package/lib/index.js
ADDED
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
var __runInitializers = (this && this.__runInitializers) || function (thisArg, initializers, value) {
|
|
2
|
+
var useValue = arguments.length > 2;
|
|
3
|
+
for (var i = 0; i < initializers.length; i++) {
|
|
4
|
+
value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);
|
|
5
|
+
}
|
|
6
|
+
return useValue ? value : void 0;
|
|
7
|
+
};
|
|
8
|
+
var __esDecorate = (this && this.__esDecorate) || function (ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {
|
|
9
|
+
function accept(f) { if (f !== void 0 && typeof f !== "function") throw new TypeError("Function expected"); return f; }
|
|
10
|
+
var kind = contextIn.kind, key = kind === "getter" ? "get" : kind === "setter" ? "set" : "value";
|
|
11
|
+
var target = !descriptorIn && ctor ? contextIn["static"] ? ctor : ctor.prototype : null;
|
|
12
|
+
var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});
|
|
13
|
+
var _, done = false;
|
|
14
|
+
for (var i = decorators.length - 1; i >= 0; i--) {
|
|
15
|
+
var context = {};
|
|
16
|
+
for (var p in contextIn) context[p] = p === "access" ? {} : contextIn[p];
|
|
17
|
+
for (var p in contextIn.access) context.access[p] = contextIn.access[p];
|
|
18
|
+
context.addInitializer = function (f) { if (done) throw new TypeError("Cannot add initializers after decoration has completed"); extraInitializers.push(accept(f || null)); };
|
|
19
|
+
var result = (0, decorators[i])(kind === "accessor" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);
|
|
20
|
+
if (kind === "accessor") {
|
|
21
|
+
if (result === void 0) continue;
|
|
22
|
+
if (result === null || typeof result !== "object") throw new TypeError("Object expected");
|
|
23
|
+
if (_ = accept(result.get)) descriptor.get = _;
|
|
24
|
+
if (_ = accept(result.set)) descriptor.set = _;
|
|
25
|
+
if (_ = accept(result.init)) initializers.unshift(_);
|
|
26
|
+
}
|
|
27
|
+
else if (_ = accept(result)) {
|
|
28
|
+
if (kind === "field") initializers.unshift(_);
|
|
29
|
+
else descriptor[key] = _;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
if (target) Object.defineProperty(target, contextIn.name, descriptor);
|
|
33
|
+
done = true;
|
|
34
|
+
};
|
|
35
|
+
import { Context } from "@deepseek-ai/cordis";
|
|
36
|
+
import { installSettingsSection, settingsNamespace } from "@deepseek-ai/dsh-settings";
|
|
37
|
+
import { Remote, TypertRemoteService } from "@deepseek-ai/dsh-typert-protocol";
|
|
38
|
+
import { getRegisteredPluginLoggers, setPluginLogFormat, setPluginLogLevel, subscribePluginLoggerRegistry, } from "@yadsh/dsh-plugin-log";
|
|
39
|
+
import { ConfigSchema, resolveConfig } from "./config.js";
|
|
40
|
+
export const name = "plugin-log-ui";
|
|
41
|
+
export const inject = [];
|
|
42
|
+
export const PLUGIN_LOG_SETTINGS_NAMESPACE = settingsNamespace("plugin-log");
|
|
43
|
+
export const Config = ConfigSchema;
|
|
44
|
+
let PluginLogUi = (() => {
|
|
45
|
+
let _classSuper = TypertRemoteService;
|
|
46
|
+
let _instanceExtraInitializers = [];
|
|
47
|
+
let _inspect_decorators;
|
|
48
|
+
return class PluginLogUi extends _classSuper {
|
|
49
|
+
static {
|
|
50
|
+
const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
|
|
51
|
+
_inspect_decorators = [Remote("inspect")];
|
|
52
|
+
__esDecorate(this, null, _inspect_decorators, { kind: "method", name: "inspect", static: false, private: false, access: { has: obj => "inspect" in obj, get: obj => obj.inspect }, metadata: _metadata }, null, _instanceExtraInitializers);
|
|
53
|
+
if (_metadata) Object.defineProperty(this, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
|
|
54
|
+
}
|
|
55
|
+
static inject = inject;
|
|
56
|
+
static Config = ConfigSchema;
|
|
57
|
+
configSource = __runInitializers(this, _instanceExtraInitializers);
|
|
58
|
+
applying = false;
|
|
59
|
+
constructor(ctx, input = {}) {
|
|
60
|
+
super(ctx, "pluginLogUi", { namespace: "pluginLogUi" });
|
|
61
|
+
const entry = resolveConfig(input);
|
|
62
|
+
this.configSource = () => entry;
|
|
63
|
+
installSettingsSection(ctx, PLUGIN_LOG_SETTINGS_NAMESPACE, ConfigSchema, entry, {
|
|
64
|
+
setSource: (current) => {
|
|
65
|
+
this.configSource = current;
|
|
66
|
+
},
|
|
67
|
+
onChange: () => this.applyPolicy(),
|
|
68
|
+
});
|
|
69
|
+
ctx.effect(() => subscribePluginLoggerRegistry(() => this.applyPolicy()), "dsh-plugin-log-ui.registry");
|
|
70
|
+
this.applyPolicy();
|
|
71
|
+
}
|
|
72
|
+
getConfig() {
|
|
73
|
+
return resolveConfig(this.configSource());
|
|
74
|
+
}
|
|
75
|
+
inspect() {
|
|
76
|
+
this.applyPolicy();
|
|
77
|
+
const grouped = new Map();
|
|
78
|
+
for (const logger of getRegisteredPluginLoggers()) {
|
|
79
|
+
const existing = grouped.get(logger.pluginId);
|
|
80
|
+
grouped.set(logger.pluginId, {
|
|
81
|
+
pluginId: logger.pluginId,
|
|
82
|
+
level: logger.level,
|
|
83
|
+
format: logger.format,
|
|
84
|
+
instances: (existing?.instances ?? 0) + 1,
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
return {
|
|
88
|
+
consumers: [...grouped.values()].sort((left, right) => left.pluginId.localeCompare(right.pluginId)),
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
applyPolicy() {
|
|
92
|
+
if (this.applying)
|
|
93
|
+
return;
|
|
94
|
+
this.applying = true;
|
|
95
|
+
try {
|
|
96
|
+
const config = this.getConfig();
|
|
97
|
+
setPluginLogFormat(config.format);
|
|
98
|
+
const seen = new Set();
|
|
99
|
+
for (const logger of getRegisteredPluginLoggers()) {
|
|
100
|
+
if (seen.has(logger.pluginId))
|
|
101
|
+
continue;
|
|
102
|
+
seen.add(logger.pluginId);
|
|
103
|
+
setPluginLogLevel(logger.pluginId, config.levels[logger.pluginId] ?? config.defaultLevel);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
finally {
|
|
107
|
+
this.applying = false;
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
};
|
|
111
|
+
})();
|
|
112
|
+
export { PluginLogUi };
|
|
113
|
+
export { ConfigSchema, resolveConfig } from "./config.js";
|
|
114
|
+
export default PluginLogUi;
|
|
115
|
+
//# sourceMappingURL=index.js.map
|
package/lib/index.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
/* Generated by @deepseek-ai/dsh-typert-generator from FaceModel — do not edit. */
|
|
2
|
+
import { z } from 'zod'
|
|
3
|
+
|
|
4
|
+
const _yadsh_dsh_plugin_log_ui_pluginLogUi_inspect_result$schema = z.object({
|
|
5
|
+
'consumers': z.array(z.object({
|
|
6
|
+
'pluginId': z.string().readonly(),
|
|
7
|
+
'level': z.union([z.literal("trace"), z.literal("debug"), z.literal("info"), z.literal("warn"), z.literal("error"), z.literal("fatal"), z.literal("silent")]).readonly(),
|
|
8
|
+
'format': z.union([z.literal("json"), z.literal("text")]).readonly(),
|
|
9
|
+
'instances': z.number().readonly(),
|
|
10
|
+
})).readonly(),
|
|
11
|
+
})
|
|
12
|
+
|
|
13
|
+
export const TYPERT = {
|
|
14
|
+
package: '@yadsh/dsh-plugin-log-ui',
|
|
15
|
+
face: 'host',
|
|
16
|
+
schemas: [
|
|
17
|
+
],
|
|
18
|
+
invocations: [
|
|
19
|
+
{
|
|
20
|
+
id: '@yadsh/dsh-plugin-log-ui#pluginLogUi/inspect',
|
|
21
|
+
service: 'pluginLogUi',
|
|
22
|
+
namespace: 'pluginLogUi',
|
|
23
|
+
method: 'inspect',
|
|
24
|
+
invocation: { kind: 'direct' },
|
|
25
|
+
parameters: [
|
|
26
|
+
],
|
|
27
|
+
result: {
|
|
28
|
+
mode: 'strict',
|
|
29
|
+
typeSymbol: '@yadsh/dsh-plugin-log-ui/types#PluginLogUiSnapshot',
|
|
30
|
+
schema: _yadsh_dsh_plugin_log_ui_pluginLogUi_inspect_result$schema,
|
|
31
|
+
},
|
|
32
|
+
sourceLocation: {"file":"packages/dsh-plugin-log-ui/src/index.ts","line":62,"column":3},
|
|
33
|
+
},
|
|
34
|
+
],
|
|
35
|
+
model: {
|
|
36
|
+
"services": [
|
|
37
|
+
{
|
|
38
|
+
"tags": [],
|
|
39
|
+
"key": "pluginLogUi",
|
|
40
|
+
"exportName": "PluginLogUiService",
|
|
41
|
+
"members": [
|
|
42
|
+
{
|
|
43
|
+
"kind": "method",
|
|
44
|
+
"name": "inspect",
|
|
45
|
+
"signature": "inspect(): PluginLogUiSnapshot"
|
|
46
|
+
},
|
|
47
|
+
{
|
|
48
|
+
"kind": "method",
|
|
49
|
+
"name": "getConfig",
|
|
50
|
+
"signature": "getConfig(): ResolvedPluginLogUiConfig"
|
|
51
|
+
}
|
|
52
|
+
],
|
|
53
|
+
"types": [
|
|
54
|
+
{
|
|
55
|
+
"name": "ManagedPluginLogFormat",
|
|
56
|
+
"declaration": "export type ManagedPluginLogFormat = \"json\" | \"text\";"
|
|
57
|
+
},
|
|
58
|
+
{
|
|
59
|
+
"name": "ManagedPluginLogLevel",
|
|
60
|
+
"declaration": "export type ManagedPluginLogLevel = \"trace\" | \"debug\" | \"info\" | \"warn\" | \"error\" | \"fatal\" | \"silent\";"
|
|
61
|
+
},
|
|
62
|
+
{
|
|
63
|
+
"name": "PluginLogConsumerSnapshot",
|
|
64
|
+
"declaration": "export interface PluginLogConsumerSnapshot {\n readonly pluginId: string;\n readonly level: ManagedPluginLogLevel;\n readonly format: ManagedPluginLogFormat;\n readonly instances: number;\n}"
|
|
65
|
+
},
|
|
66
|
+
{
|
|
67
|
+
"name": "PluginLogUiSnapshot",
|
|
68
|
+
"declaration": "export interface PluginLogUiSnapshot {\n readonly consumers: readonly PluginLogConsumerSnapshot[];\n}"
|
|
69
|
+
},
|
|
70
|
+
{
|
|
71
|
+
"name": "ResolvedPluginLogUiConfig",
|
|
72
|
+
"declaration": "export interface ResolvedPluginLogUiConfig {\n readonly defaultLevel: ManagedPluginLogLevel;\n readonly format: ManagedPluginLogFormat;\n readonly levels: Readonly<Record<string, ManagedPluginLogLevel>>;\n}"
|
|
73
|
+
}
|
|
74
|
+
]
|
|
75
|
+
}
|
|
76
|
+
],
|
|
77
|
+
"events": [],
|
|
78
|
+
"objects": []
|
|
79
|
+
},
|
|
80
|
+
}
|
|
@@ -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 { PluginLogUiSnapshot } from '@yadsh/dsh-plugin-log-ui/types'
|
|
7
|
+
|
|
8
|
+
declare module '@deepseek-ai/dsh-typert-protocol' {
|
|
9
|
+
interface TypertRemoteNamespace$706c7567696e4c6f675569 {
|
|
10
|
+
inspect: () => Promise<RemoteResult<PluginLogUiSnapshot>>
|
|
11
|
+
}
|
|
12
|
+
interface TypertRemoteMap {
|
|
13
|
+
'pluginLogUi/inspect': () => Promise<RemoteResult<PluginLogUiSnapshot>>
|
|
14
|
+
}
|
|
15
|
+
interface TypertRemoteNamespaceMap {
|
|
16
|
+
'pluginLogUi': TypertRemoteNamespace$706c7567696e4c6f675569
|
|
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 _yadsh_dsh_plugin_log_ui_pluginLogUi_inspect_result$schema = z.object({
|
|
5
|
+
'consumers': z.array(z.object({
|
|
6
|
+
'pluginId': z.string().readonly(),
|
|
7
|
+
'level': z.union([z.literal("trace"), z.literal("debug"), z.literal("info"), z.literal("warn"), z.literal("error"), z.literal("fatal"), z.literal("silent")]).readonly(),
|
|
8
|
+
'format': z.union([z.literal("json"), z.literal("text")]).readonly(),
|
|
9
|
+
'instances': z.number().readonly(),
|
|
10
|
+
})).readonly(),
|
|
11
|
+
})
|
|
12
|
+
|
|
13
|
+
export const TYPERT_REMOTE = {
|
|
14
|
+
package: '@yadsh/dsh-plugin-log-ui',
|
|
15
|
+
descriptors: [
|
|
16
|
+
{
|
|
17
|
+
id: '@yadsh/dsh-plugin-log-ui#pluginLogUi/inspect',
|
|
18
|
+
service: 'pluginLogUi',
|
|
19
|
+
namespace: 'pluginLogUi',
|
|
20
|
+
method: 'inspect',
|
|
21
|
+
invocation: { kind: 'direct' },
|
|
22
|
+
parameters: [
|
|
23
|
+
],
|
|
24
|
+
result: {
|
|
25
|
+
mode: 'strict',
|
|
26
|
+
typeSymbol: '@yadsh/dsh-plugin-log-ui/types#PluginLogUiSnapshot',
|
|
27
|
+
schema: _yadsh_dsh_plugin_log_ui_pluginLogUi_inspect_result$schema,
|
|
28
|
+
},
|
|
29
|
+
sourceLocation: {"file":"packages/dsh-plugin-log-ui/src/index.ts","line":62,"column":3},
|
|
30
|
+
},
|
|
31
|
+
],
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
export default TYPERT_REMOTE
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* React calls external-store callbacks as plain functions. SettingsScope's
|
|
3
|
+
* methods use their receiver, so forwarding them directly loses `this` and
|
|
4
|
+
* crashes while reading the internal store.
|
|
5
|
+
*/
|
|
6
|
+
export declare function bindSettingsExternalStore<TSnapshot>(scope: {
|
|
7
|
+
subscribe(listener: () => void): () => void;
|
|
8
|
+
getSnapshot(): TSnapshot;
|
|
9
|
+
}): {
|
|
10
|
+
subscribe(listener: () => void): () => void;
|
|
11
|
+
getSnapshot(): TSnapshot;
|
|
12
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const styles = "\n.dsh-plugin-card{border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-3);border-radius:12px;list-style:none;transition:border-color .16s,background .16s}\n.dsh-plugin-card:hover{border-color:var(--dsw-alias-label-dimmed)}\n.dsh-plugin-card--open{background:var(--dsw-alias-bg-layer-2);border-color:var(--dsw-alias-label-dimmed)}\n.dsh-plugin-card__header{appearance:none;width:100%;font:inherit;color:inherit;text-align:left;cursor:pointer;background:0 0;border:0;border-radius:12px;align-items:center;gap:12px;padding:14px 16px;display:flex}\n.dsh-plugin-card__header:focus-visible{outline:2px solid var(--dsw-alias-brand-primary);outline-offset:-2px}\n.dsh-plugin-card__head-text{flex-direction:column;flex:1;gap:4px;min-width:0;display:flex}\n.dsh-plugin-card__name{color:var(--dsw-alias-label-primary);font-size:15px;font-weight:600;line-height:1.4}\n.dsh-plugin-card__description{color:var(--dsw-alias-label-tertiary);font-size:13px;line-height:1.5}\n.dsh-plugin-card__badge{white-space:nowrap;background:var(--dsw-alias-bg-module-platform);color:var(--dsw-alias-label-secondary);border-radius:999px;flex:none;padding:1px 8px;font-size:11px;font-weight:500;line-height:17px}\n.dsh-plugin-card__chevron{width:14px;height:14px;color:var(--dsw-alias-label-tertiary);flex:none;transition:transform .16s}\n.dsh-plugin-card--open .dsh-plugin-card__chevron{transform:rotate(180deg)}\n.dsh-plugin-card__body{border-top:1px solid var(--dsw-alias-border-l2);margin:0 16px;padding-bottom:8px}\n.plu-body{padding-top:16px;display:flex;flex-direction:column;gap:18px}\n.plu-section{display:flex;flex-direction:column;gap:10px}.plu-section h3{margin:0;font-size:13px;color:var(--dsw-alias-label-primary)}\n.plu-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:12px}.plu-field{display:flex;flex-direction:column;gap:6px}.plu-field>span{font-size:12px;font-weight:500;color:var(--dsw-alias-label-secondary)}\n.plu-select{box-sizing:border-box;width:100%;height:34px;padding:0 10px;border:1px solid var(--dsw-alias-border-l2);border-radius:8px;background:var(--dsw-alias-bg-layer-3);color:var(--dsw-alias-label-primary);font:inherit;font-size:13px}.plu-select:focus{outline:none;border-color:var(--dsw-alias-border-brand)}.plu-select:disabled{opacity:.55}\n.plu-hint,.plu-status,.plu-empty{margin:0;font-size:12px;line-height:1.5;color:var(--dsw-alias-label-tertiary)}.plu-error{margin:0;padding:9px 10px;border-radius:8px;background:var(--dsw-alias-bg-error);color:var(--dsw-alias-label-error);font-size:12px}\n.plu-list{display:flex;flex-direction:column;border-top:1px solid var(--dsw-alias-border-l2)}.plu-row{display:grid;grid-template-columns:minmax(150px,1fr) minmax(150px,220px);gap:14px;align-items:center;padding:12px 0;border-bottom:1px solid var(--dsw-alias-border-l2)}\n.plu-plugin{min-width:0}.plu-plugin code{display:block;overflow:hidden;text-overflow:ellipsis;font-size:12px;color:var(--dsw-alias-label-primary)}.plu-plugin span{display:block;margin-top:3px;font-size:11px;color:var(--dsw-alias-label-tertiary)}\n@media(max-width:720px){.plu-grid{grid-template-columns:1fr}.plu-row{grid-template-columns:1fr}}\n";
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import z from "@deepseek-ai/schemastery";
|
|
2
|
+
import type { PluginLogUiConfig, ResolvedPluginLogUiConfig } from "./types.js";
|
|
3
|
+
export declare const MANAGED_LOG_LEVELS: readonly ["trace", "debug", "info", "warn", "error", "fatal", "silent"];
|
|
4
|
+
export declare const MANAGED_LOG_FORMATS: readonly ["json", "text"];
|
|
5
|
+
export declare const DEFAULT_PLUGIN_LOG_UI_CONFIG: ResolvedPluginLogUiConfig;
|
|
6
|
+
export declare const ConfigSchema: z<PluginLogUiConfig>;
|
|
7
|
+
export declare function resolveConfig(input?: PluginLogUiConfig): ResolvedPluginLogUiConfig;
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { Context } from "@deepseek-ai/cordis";
|
|
2
|
+
import { TypertRemoteService } from "@deepseek-ai/dsh-typert-protocol";
|
|
3
|
+
import type { PluginLogUiConfig, PluginLogUiService, PluginLogUiSnapshot, ResolvedPluginLogUiConfig } from "./types.js";
|
|
4
|
+
export declare const name = "plugin-log-ui";
|
|
5
|
+
export declare const inject: readonly string[];
|
|
6
|
+
export declare const PLUGIN_LOG_SETTINGS_NAMESPACE: import("@deepseek-ai/dsh-settings").SettingsNamespace;
|
|
7
|
+
export type Config = PluginLogUiConfig;
|
|
8
|
+
export declare const Config: import("@deepseek-ai/schemastery").default<PluginLogUiConfig>;
|
|
9
|
+
declare module "@deepseek-ai/cordis" {
|
|
10
|
+
interface Context {
|
|
11
|
+
pluginLogUi: PluginLogUiService;
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
export declare class PluginLogUi extends TypertRemoteService implements PluginLogUiService {
|
|
15
|
+
static inject: readonly string[];
|
|
16
|
+
static Config: import("@deepseek-ai/schemastery").default<PluginLogUiConfig>;
|
|
17
|
+
private configSource;
|
|
18
|
+
private applying;
|
|
19
|
+
constructor(ctx: Context, input?: PluginLogUiConfig);
|
|
20
|
+
getConfig(): ResolvedPluginLogUiConfig;
|
|
21
|
+
inspect(): PluginLogUiSnapshot;
|
|
22
|
+
private applyPolicy;
|
|
23
|
+
}
|
|
24
|
+
export { ConfigSchema, resolveConfig } from "./config.js";
|
|
25
|
+
export type * from "./types.js";
|
|
26
|
+
export default PluginLogUi;
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
export type ManagedPluginLogLevel = "trace" | "debug" | "info" | "warn" | "error" | "fatal" | "silent";
|
|
2
|
+
export type ManagedPluginLogFormat = "json" | "text";
|
|
3
|
+
export interface PluginLogUiConfig {
|
|
4
|
+
readonly defaultLevel?: ManagedPluginLogLevel;
|
|
5
|
+
readonly format?: ManagedPluginLogFormat;
|
|
6
|
+
readonly levels?: Readonly<Record<string, ManagedPluginLogLevel>>;
|
|
7
|
+
}
|
|
8
|
+
export interface ResolvedPluginLogUiConfig {
|
|
9
|
+
readonly defaultLevel: ManagedPluginLogLevel;
|
|
10
|
+
readonly format: ManagedPluginLogFormat;
|
|
11
|
+
readonly levels: Readonly<Record<string, ManagedPluginLogLevel>>;
|
|
12
|
+
}
|
|
13
|
+
export interface PluginLogConsumerSnapshot {
|
|
14
|
+
readonly pluginId: string;
|
|
15
|
+
readonly level: ManagedPluginLogLevel;
|
|
16
|
+
readonly format: ManagedPluginLogFormat;
|
|
17
|
+
readonly instances: number;
|
|
18
|
+
}
|
|
19
|
+
export interface PluginLogUiSnapshot {
|
|
20
|
+
readonly consumers: readonly PluginLogConsumerSnapshot[];
|
|
21
|
+
}
|
|
22
|
+
export interface PluginLogUiService {
|
|
23
|
+
inspect(): PluginLogUiSnapshot;
|
|
24
|
+
getConfig(): ResolvedPluginLogUiConfig;
|
|
25
|
+
}
|
package/lib/types.js
ADDED
package/lib/types.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
|
package/package.json
ADDED
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@yadsh/dsh-plugin-log-ui",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "DSH settings UI for shared plugin logging levels and file format",
|
|
5
|
+
"repository": {
|
|
6
|
+
"type": "git",
|
|
7
|
+
"url": "git+https://github.com/xarleyn/dsh-plugins.git",
|
|
8
|
+
"directory": "plugins/dsh-plugin-log-ui"
|
|
9
|
+
},
|
|
10
|
+
"homepage": "https://github.com/xarleyn/dsh-plugins/tree/main/plugins/dsh-plugin-log-ui#readme",
|
|
11
|
+
"bugs": {
|
|
12
|
+
"url": "https://github.com/xarleyn/dsh-plugins/issues"
|
|
13
|
+
},
|
|
14
|
+
"license": "MIT",
|
|
15
|
+
"type": "module",
|
|
16
|
+
"main": "./lib/index.js",
|
|
17
|
+
"types": "./lib/types/index.d.ts",
|
|
18
|
+
"exports": {
|
|
19
|
+
".": {
|
|
20
|
+
"types": "./lib/types/index.d.ts",
|
|
21
|
+
"default": "./lib/index.js"
|
|
22
|
+
},
|
|
23
|
+
"./client": {
|
|
24
|
+
"types": "./lib/types/client/index.d.ts",
|
|
25
|
+
"default": "./lib/client.js"
|
|
26
|
+
},
|
|
27
|
+
"./remote": {
|
|
28
|
+
"types": "./lib/typert.remote-client.d.ts",
|
|
29
|
+
"default": "./lib/typert.remote-client.js"
|
|
30
|
+
},
|
|
31
|
+
"./typert": {
|
|
32
|
+
"types": "./lib/typert.host.d.ts",
|
|
33
|
+
"default": "./lib/typert.host.js"
|
|
34
|
+
},
|
|
35
|
+
"./types": {
|
|
36
|
+
"types": "./lib/types/types.d.ts",
|
|
37
|
+
"default": "./lib/types.js"
|
|
38
|
+
},
|
|
39
|
+
"./package.json": "./package.json"
|
|
40
|
+
},
|
|
41
|
+
"files": [
|
|
42
|
+
"lib/**/*.js",
|
|
43
|
+
"lib/**/*.js.map",
|
|
44
|
+
"lib/**/*.d.ts",
|
|
45
|
+
"cordis.patch.yml",
|
|
46
|
+
"README.md",
|
|
47
|
+
"LICENSE"
|
|
48
|
+
],
|
|
49
|
+
"dsh": {
|
|
50
|
+
"bundle": {
|
|
51
|
+
"patch": "./cordis.patch.yml"
|
|
52
|
+
},
|
|
53
|
+
"client": {
|
|
54
|
+
"external": [
|
|
55
|
+
"@deepseek-ai/dsh-client-ui-slots"
|
|
56
|
+
],
|
|
57
|
+
"inject": [
|
|
58
|
+
"@deepseek-ai/dsh-api-gateway",
|
|
59
|
+
"@deepseek-ai/dsh-client-connection",
|
|
60
|
+
"@deepseek-ai/dsh-client-ui-settings",
|
|
61
|
+
"@deepseek-ai/dsh-client-ui-settings-plugins"
|
|
62
|
+
],
|
|
63
|
+
"platform": "web"
|
|
64
|
+
}
|
|
65
|
+
},
|
|
66
|
+
"scripts": {
|
|
67
|
+
"clean": "node -e \"require('node:fs').rmSync('lib', { recursive: true, force: true })\"",
|
|
68
|
+
"build": "pnpm run clean && node scripts/generate-typert.mjs && tsc -p tsconfig.build.json && tsdown",
|
|
69
|
+
"lint": "eslint src tests scripts tsdown.config.ts",
|
|
70
|
+
"test": "vitest run",
|
|
71
|
+
"typecheck": "tsc -p tsconfig.json --noEmit",
|
|
72
|
+
"verify": "node scripts/verify-package.mjs",
|
|
73
|
+
"check": "pnpm run lint && pnpm run typecheck && pnpm run test && pnpm run build && pnpm run verify",
|
|
74
|
+
"prepack": "pnpm run build && pnpm run verify"
|
|
75
|
+
},
|
|
76
|
+
"dependencies": {
|
|
77
|
+
"@yadsh/dsh-plugin-log": "workspace:^",
|
|
78
|
+
"zod": "^4.4.3"
|
|
79
|
+
},
|
|
80
|
+
"peerDependencies": {
|
|
81
|
+
"@deepseek-ai/cordis": "catalog:dsh",
|
|
82
|
+
"@deepseek-ai/schemastery": "catalog:dsh",
|
|
83
|
+
"@deepseek-ai/dsh-api-gateway": "catalog:dsh",
|
|
84
|
+
"@deepseek-ai/dsh-client-connection": "catalog:dsh",
|
|
85
|
+
"@deepseek-ai/dsh-client-runtime": "catalog:dsh",
|
|
86
|
+
"@deepseek-ai/dsh-client-ui-settings": "catalog:dsh",
|
|
87
|
+
"@deepseek-ai/dsh-client-ui-settings-plugins": "catalog:dsh",
|
|
88
|
+
"@deepseek-ai/dsh-client-ui-slots": "catalog:dsh",
|
|
89
|
+
"@deepseek-ai/dsh-settings": "catalog:dsh",
|
|
90
|
+
"@deepseek-ai/dsh-typert-protocol": "catalog:dsh",
|
|
91
|
+
"react": ">=18.2.0 <20"
|
|
92
|
+
},
|
|
93
|
+
"devDependencies": {
|
|
94
|
+
"@deepseek-ai/cordis": "catalog:dsh-dev",
|
|
95
|
+
"@deepseek-ai/schemastery": "catalog:dsh-dev",
|
|
96
|
+
"@yadsh/dsh-config": "workspace:^",
|
|
97
|
+
"@deepseek-ai/dsh-api-gateway": "catalog:dsh-dev",
|
|
98
|
+
"@deepseek-ai/dsh-client-connection": "catalog:dsh-dev",
|
|
99
|
+
"@deepseek-ai/dsh-client-runtime": "catalog:dsh-dev",
|
|
100
|
+
"@deepseek-ai/dsh-client-ui-settings": "catalog:dsh-dev",
|
|
101
|
+
"@deepseek-ai/dsh-client-ui-settings-plugins": "catalog:dsh-dev",
|
|
102
|
+
"@deepseek-ai/dsh-client-ui-slots": "catalog:dsh-dev",
|
|
103
|
+
"@deepseek-ai/dsh-settings": "catalog:dsh-dev",
|
|
104
|
+
"@deepseek-ai/dsh-typert-generator": "catalog:dsh-dev",
|
|
105
|
+
"@deepseek-ai/dsh-typert-protocol": "catalog:dsh-dev",
|
|
106
|
+
"@types/node": "catalog:tooling",
|
|
107
|
+
"@types/react": "catalog:frontend-dev",
|
|
108
|
+
"eslint": "catalog:tooling",
|
|
109
|
+
"react": "catalog:frontend-dev",
|
|
110
|
+
"tsdown": "catalog:tooling",
|
|
111
|
+
"typescript": "catalog:plugin-tooling",
|
|
112
|
+
"vitest": "catalog:tooling"
|
|
113
|
+
},
|
|
114
|
+
"publishConfig": {
|
|
115
|
+
"access": "public",
|
|
116
|
+
"registry": "https://registry.npmjs.org/"
|
|
117
|
+
},
|
|
118
|
+
"engines": {
|
|
119
|
+
"node": ">=22"
|
|
120
|
+
}
|
|
121
|
+
}
|