dsh-agent-plugins-market 0.7.0 → 0.7.2
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/README.md +31 -26
- package/README.zh.md +31 -26
- package/client/client.js +29164 -1136
- package/client/client.js.map +1 -1
- package/lib/application/catalog-context.js +8 -1
- package/lib/application/catalog.js +27 -2
- package/lib/application/details.js +13 -2
- package/lib/application/install-store.js +1 -1
- package/lib/application/mcp-service.js +191 -19
- package/lib/application/panel-resources.js +16 -4
- package/lib/application/project-agent-roles.js +7 -1
- package/lib/catalog/archive.js +16 -1
- package/lib/catalog/manifests.js +124 -13
- package/lib/catalog/paths.js +8 -0
- package/lib/catalog/plugin-variables.js +38 -0
- package/lib/catalog/project-hooks.js +14 -1
- package/lib/catalog/scan-resolvers.js +117 -12
- package/lib/catalog/skills-parse.js +47 -0
- package/lib/catalog/source-catalog.js +8 -3
- package/lib/catalog/suite-components.js +2 -2
- package/lib/catalog/surfaces.js +73 -27
- package/lib/catalog/validate.js +205 -54
- package/lib/contracts/market.js +3 -0
- package/lib/contracts/settings.js +63 -0
- package/lib/index.js +32 -13
- package/lib/model/layouts.js +44 -1
- package/lib/model/preset-source.js +8 -0
- package/lib/routes.js +43 -2
- package/lib/runtime/agent-role-router.js +203 -56
- package/lib/runtime/commands-mounts.js +50 -9
- package/lib/runtime/deadline.js +32 -6
- package/lib/runtime/dynamic-context.js +140 -0
- package/lib/runtime/feedback-tool.js +7 -3
- package/lib/runtime/host-locale.js +45 -15
- package/lib/runtime/lsp-mounts.js +23 -2
- package/lib/runtime/mcp-backend.js +14 -15
- package/lib/runtime/mcp-client/config.js +8 -0
- package/lib/runtime/mcp-client/connection.js +9 -8
- package/lib/runtime/mcp-client/host-seams.js +8 -88
- package/lib/runtime/mcp-client/oauth.js +82 -14
- package/lib/runtime/mcp-client/tools.js +2 -1
- package/lib/runtime/mcp-config.js +182 -35
- package/lib/runtime/mcp-direct-config.js +49 -6
- package/lib/runtime/mcp-mounts.js +15 -3
- package/lib/runtime/mcp-overrides.js +131 -1
- package/lib/runtime/mcp-redaction.js +8 -0
- package/lib/runtime/mcp-status.js +21 -5
- package/lib/runtime/project-runtime.js +23 -9
- package/lib/runtime/reconcile-scheduler.js +6 -8
- package/lib/runtime/reconciler.js +2 -1
- package/lib/runtime/regions.js +0 -19
- package/lib/runtime/server-config.js +49 -8
- package/lib/runtime/settings-namespace.js +21 -13
- package/lib/runtime/skills-provider.js +33 -11
- package/lib/runtime/source-auto-update.js +10 -14
- package/lib/runtime/subagent-catalog.js +62 -22
- package/lib/runtime/timer-seat.js +80 -0
- package/lib/runtime/tool-registry-observer.js +24 -20
- package/lib/runtime/user-commands.js +5 -1
- package/lib/runtime/user-panels.js +110 -41
- package/lib/runtime/user-store.js +114 -58
- package/lib/types/application/catalog-context.d.ts +6 -0
- package/lib/types/application/catalog.d.ts +19 -1
- package/lib/types/application/install-store.d.ts +1 -1
- package/lib/types/application/mcp-service.d.ts +38 -3
- package/lib/types/application/ports.d.ts +1 -1
- package/lib/types/application/queries.d.ts +8 -1
- package/lib/types/catalog/manifests.d.ts +6 -2
- package/lib/types/catalog/paths.d.ts +6 -0
- package/lib/types/catalog/plugin-variables.d.ts +16 -0
- package/lib/types/catalog/skills-parse.d.ts +13 -0
- package/lib/types/catalog/source-catalog.d.ts +7 -2
- package/lib/types/catalog/surfaces.d.ts +14 -4
- package/lib/types/catalog/validate.d.ts +72 -11
- package/lib/types/contracts/market.d.ts +77 -0
- package/lib/types/contracts/mcp-status.d.ts +11 -0
- package/lib/types/contracts/settings.d.ts +59 -0
- package/lib/types/model/layouts.d.ts +30 -0
- package/lib/types/model/preset-source.d.ts +18 -0
- package/lib/types/model/types.d.ts +37 -1
- package/lib/types/runtime/agent-role-router.d.ts +96 -18
- package/lib/types/runtime/commands-mounts.d.ts +15 -7
- package/lib/types/runtime/deadline.d.ts +10 -11
- package/lib/types/runtime/dynamic-context.d.ts +81 -0
- package/lib/types/runtime/host-locale.d.ts +20 -2
- package/lib/types/runtime/lsp-mounts.d.ts +7 -0
- package/lib/types/runtime/mcp-backend.d.ts +8 -15
- package/lib/types/runtime/mcp-client/config.d.ts +8 -0
- package/lib/types/runtime/mcp-client/host-seams.d.ts +20 -64
- package/lib/types/runtime/mcp-client/oauth.d.ts +4 -0
- package/lib/types/runtime/mcp-config.d.ts +75 -13
- package/lib/types/runtime/mcp-direct-config.d.ts +22 -0
- package/lib/types/runtime/mcp-overrides.d.ts +44 -0
- package/lib/types/runtime/mcp-redaction.d.ts +6 -0
- package/lib/types/runtime/project-runtime.d.ts +10 -3
- package/lib/types/runtime/reconcile-scheduler.d.ts +1 -1
- package/lib/types/runtime/regions.d.ts +1 -4
- package/lib/types/runtime/server-config.d.ts +26 -1
- package/lib/types/runtime/settings-namespace.d.ts +10 -10
- package/lib/types/runtime/skills-provider.d.ts +11 -2
- package/lib/types/runtime/source-auto-update.d.ts +3 -4
- package/lib/types/runtime/subagent-catalog.d.ts +14 -2
- package/lib/types/runtime/timer-seat.d.ts +51 -0
- package/lib/types/runtime/tool-registry-observer.d.ts +14 -6
- package/lib/types/runtime/user-panels.d.ts +65 -12
- package/lib/types/runtime/user-store.d.ts +65 -16
- package/package.json +23 -6
- package/schemas/1.0.0/mcp.schema.json +0 -22
- package/schemas/1.1.0/mcp.schema.json +120 -0
- package/schemas/1.1.0/plugin.schema.json +65 -0
- package/schemas/README.md +25 -19
- package/schemas/agent-plugins/spec.md +23 -9
- package/schemas/com.deepseek.harness/namespace.schema.json +42 -0
- package/schemas/com.deepseek.harness/spec.md +52 -0
|
@@ -5,6 +5,7 @@ import type { OverviewPayload, SkillContent, SourceProgress, SuiteDetail } from
|
|
|
5
5
|
import type { SourceRef, SuiteSurfaceKey } from '../model/types.js';
|
|
6
6
|
import type { McpServerOverride, McpSuiteOverrides } from '../runtime/mcp-overrides.js';
|
|
7
7
|
import type { McpBackend } from '../runtime/mcp-backend.js';
|
|
8
|
+
import type { McpImportResult } from '../runtime/mcp-direct-config.js';
|
|
8
9
|
import type { ServerConfigPayload } from '../contracts/market.js';
|
|
9
10
|
import type { LspServerTable, McpBackendInfo, SourceInput, SourcePatch } from './ports.js';
|
|
10
11
|
/** Read-only market operations required by HTTP routes. */
|
|
@@ -22,8 +23,10 @@ export interface MarketQueries {
|
|
|
22
23
|
}
|
|
23
24
|
/** Mutating market operations required by HTTP routes. */
|
|
24
25
|
export interface MarketMutations {
|
|
25
|
-
saveServerConfig(kind: 'mcp' | 'lsp', id: string, config: unknown): Promise<void>;
|
|
26
|
+
saveServerConfig(kind: 'mcp' | 'lsp', id: string, config: unknown, policy?: unknown): Promise<void>;
|
|
26
27
|
addMcpServer(name: string, server: unknown): Promise<void>;
|
|
28
|
+
/** Import several pasted services in one write; each entry reports its own outcome. */
|
|
29
|
+
importMcpServers(servers: unknown, overwrite: boolean): Promise<McpImportResult>;
|
|
27
30
|
addLspServer(name: string, config: unknown): Promise<void>;
|
|
28
31
|
addSource(input: SourceInput): Promise<SourceRef>;
|
|
29
32
|
updateSource(sourceId: string, patch: SourcePatch): Promise<void>;
|
|
@@ -40,6 +43,10 @@ export interface MarketMutations {
|
|
|
40
43
|
setEnabled(sourceId: string, suiteId: string, enabled: boolean): Promise<void>;
|
|
41
44
|
setSurface(sourceId: string, suiteId: string, surface: SuiteSurfaceKey, enabled: boolean): Promise<void>;
|
|
42
45
|
setMcpOverride(sourceId: string, suiteId: string, serverKey: string, override: McpServerOverride | null): Promise<void>;
|
|
46
|
+
/** Enable or disable one declared MCP server by its source-qualified suite id. */
|
|
47
|
+
setMcpServerEnabled(suiteKey: string, serverKey: string, enabled: boolean): Promise<void>;
|
|
48
|
+
/** Allow or deny one tool of a declared MCP server by its source-qualified suite id. */
|
|
49
|
+
setMcpServerToolEnabled(suiteKey: string, serverKey: string, tool: string, enabled: boolean): Promise<void>;
|
|
43
50
|
/** Validate and persist the user's direct LSP server table. */
|
|
44
51
|
setLspServers(raw: unknown): Promise<LspServerTable>;
|
|
45
52
|
setLspServerEnabled(id: string, enabled: boolean): Promise<void>;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import type { SuiteManifest, SuiteComponents } from '../model/types.js';
|
|
2
1
|
import { type ManifestKind } from '../model/layouts.js';
|
|
2
|
+
import type { SuiteManifest, SuiteComponents } from '../model/types.js';
|
|
3
3
|
export type { ManifestKind } from '../model/layouts.js';
|
|
4
4
|
/** One manifest candidate: its file path and the dialect it selects. */
|
|
5
5
|
export interface ManifestCandidate {
|
|
@@ -27,12 +27,16 @@ export declare function componentDeclarations(record: object): SuiteComponents;
|
|
|
27
27
|
* go to `fallbacks`, so the winner stays usable while the caller can still
|
|
28
28
|
* report why the higher-priority declaration was ignored. The winner's own
|
|
29
29
|
* diagnostics stay in `errors` and remain fatal.
|
|
30
|
+
*
|
|
31
|
+
* `notes` carries the winner's non-fatal diagnostics — §5.2 unknown
|
|
32
|
+
* top-level fields, §8.1 extension data problems. Callers surface them
|
|
33
|
+
* without failing the suite.
|
|
30
34
|
*/
|
|
31
35
|
export declare function readManifest(root: string, errors: string[], hint: ({
|
|
32
36
|
name?: string;
|
|
33
37
|
version?: string;
|
|
34
38
|
description?: string;
|
|
35
|
-
} & SuiteComponents) | undefined, fallbacks?: string[]): Promise<SuiteManifest | undefined>;
|
|
39
|
+
} & SuiteComponents) | undefined, fallbacks?: string[], notes?: string[]): Promise<SuiteManifest | undefined>;
|
|
36
40
|
export interface MarketplaceEntry extends SuiteComponents {
|
|
37
41
|
layout?: ManifestKind;
|
|
38
42
|
strict?: boolean;
|
|
@@ -45,6 +45,12 @@ export declare function sourceCheckoutDir(dimensionRoot: string, sourceId: strin
|
|
|
45
45
|
* bare suite id silently collides across sources.
|
|
46
46
|
*/
|
|
47
47
|
export declare function qualifiedSuiteId(sourceId: string, suiteId: string): string;
|
|
48
|
+
/**
|
|
49
|
+
* The data directory `${PLUGIN_DATA}` resolves to for one suite: a
|
|
50
|
+
* source-qualified directory under the plugin storage root, shared by every
|
|
51
|
+
* surface of that suite so MCP servers, skills and commands see one location.
|
|
52
|
+
*/
|
|
53
|
+
export declare function suiteDataDir(dataRoot: string, sourceId: string, suiteId: string): string;
|
|
48
54
|
/** The slice of a `node:path` implementation a containment test needs. */
|
|
49
55
|
export interface PathFlavor {
|
|
50
56
|
relative(from: string, to: string): string;
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { Suite } from '../model/types.js';
|
|
2
|
+
/** The absolute paths one expansion can supply; an absent entry leaves its variable verbatim. */
|
|
3
|
+
export interface PluginPathContext {
|
|
4
|
+
/** Suite checkout root: `${PLUGIN_ROOT}` and its dialect aliases. */
|
|
5
|
+
root?: string;
|
|
6
|
+
/** Per-suite data directory: `${PLUGIN_DATA}` and its aliases. */
|
|
7
|
+
data?: string;
|
|
8
|
+
/** Directory holding the skill file: `${CLAUDE_SKILL_DIR}`. */
|
|
9
|
+
skillDir?: string;
|
|
10
|
+
/** Calling session's project directory: `${CLAUDE_PROJECT_DIR}` and its aliases. */
|
|
11
|
+
projectDir?: string;
|
|
12
|
+
}
|
|
13
|
+
/** The suite root `${PLUGIN_ROOT}` and its dialect aliases resolve to. */
|
|
14
|
+
export declare function pluginRootOf(suite: Pick<Suite, 'manifest' | 'root'>): string | undefined;
|
|
15
|
+
/** Replace every path variable the context can resolve; other text stays exactly as written. */
|
|
16
|
+
export declare function expandPluginPaths(text: string, context: PluginPathContext): string;
|
|
@@ -11,5 +11,18 @@ export interface ParsedSkillFrontmatter {
|
|
|
11
11
|
* skill must be dropped from discovery.
|
|
12
12
|
*/
|
|
13
13
|
export declare function parseSkillFrontmatter(text: string, expectedName: string | undefined): ParsedSkillFrontmatter | string;
|
|
14
|
+
/**
|
|
15
|
+
* Rejection for a user skill document the harness's own `dsh-skill-filesystem`
|
|
16
|
+
* reader would drop from `~/.agents/skills`, or `undefined` when that reader
|
|
17
|
+
* accepts it.
|
|
18
|
+
*
|
|
19
|
+
* The two readers share the directory, so the panel publishes only documents
|
|
20
|
+
* both accept: a listed entry never becomes a skill that loads in a
|
|
21
|
+
* market-equipped session alone. The checks mirror the shipped reader rather
|
|
22
|
+
* than the lenient suite scan — strict YAML, no display-name normalization,
|
|
23
|
+
* and a `name` the reader compares only against its kebab grammar.
|
|
24
|
+
* @returns the drop reason, phrased as the reader's own diagnostic.
|
|
25
|
+
*/
|
|
26
|
+
export declare function skillEntryRejection(text: string): string | undefined;
|
|
14
27
|
/** Strip the frontmatter block, returning the instruction body. */
|
|
15
28
|
export declare function stripFrontmatter(text: string): string;
|
|
@@ -1,8 +1,13 @@
|
|
|
1
1
|
import type { DiscoveredSuite, SourceRef, SuiteDimension } from '../model/types.js';
|
|
2
2
|
/** Discover suites from the selected configured or project checkouts. */
|
|
3
3
|
export declare function discoverSourceList(sources: SourceRef[], dimension: SuiteDimension, dimensionRoot: string): Promise<DiscoveredSuite[]>;
|
|
4
|
-
/**
|
|
5
|
-
|
|
4
|
+
/**
|
|
5
|
+
* Discover suites plus per-source scan diagnostics for one dimension.
|
|
6
|
+
* @param scanProjectLayouts - whether the project's own native Agent directories
|
|
7
|
+
* join the scan. Required on purpose: the switch has one owner (the host
|
|
8
|
+
* settings document), so a default here would be a second copy of it.
|
|
9
|
+
*/
|
|
10
|
+
export declare function discoverSourceListWithNotes(sources: SourceRef[], dimension: SuiteDimension, dimensionRoot: string, scanProjectLayouts: boolean): Promise<{
|
|
6
11
|
suites: DiscoveredSuite[];
|
|
7
12
|
scanNotes: Record<string, string[]>;
|
|
8
13
|
}>;
|
|
@@ -1,8 +1,18 @@
|
|
|
1
1
|
import type { LspSuiteConfig, McpSuiteConfig, SuiteManifest, SuiteSkill, SuiteSurfaceCounts } from '../model/types.js';
|
|
2
|
-
/**
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
2
|
+
/**
|
|
3
|
+
* Discover SKILL.md files under the suite's skills directory, up to 3 levels
|
|
4
|
+
* deep. Portable v1 suites (§7.1) instead discover exactly one level of
|
|
5
|
+
* `skills/` subdirectories each carrying a `SKILL.md` — the spec forbids
|
|
6
|
+
* recursive deeper search and root-level or flat skill files are outside the
|
|
7
|
+
* portable discovery shape.
|
|
8
|
+
*/
|
|
9
|
+
export declare function discoverSkills(root: string, errors: string[], declared?: unknown, portable?: boolean): Promise<SuiteSkill[]>;
|
|
10
|
+
/**
|
|
11
|
+
* Read the suite's MCP config: `mcp.json` or `.mcp.json`, else the winning
|
|
12
|
+
* manifest's inline `mcpServers`. Portable v1 suites read only `mcp.json` at
|
|
13
|
+
* the plugin root (§7.2.1: no alternative core path, no inline declarations).
|
|
14
|
+
*/
|
|
15
|
+
export declare function discoverMcp(root: string, errors: string[], manifest?: SuiteManifest, portable?: boolean): Promise<McpSuiteConfig | undefined>;
|
|
6
16
|
/** Count surfaces for a suite; mcp counts only validated servers, lsp counts inline servers plus directory entries. */
|
|
7
17
|
export declare function countSurfaces(root: string, skills: SuiteSkill[], mcp: McpSuiteConfig | undefined, lsp?: LspSuiteConfig): Promise<SuiteSurfaceCounts>;
|
|
8
18
|
export interface LspEntry {
|
|
@@ -1,10 +1,32 @@
|
|
|
1
1
|
import type { McpSuiteConfig } from '../model/types.js';
|
|
2
|
-
|
|
3
|
-
export
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
2
|
+
/** One vendored Agent Plugins release: the canonical manifest and MCP schema ids. */
|
|
3
|
+
export interface SpecVersion {
|
|
4
|
+
version: string;
|
|
5
|
+
pluginSchemaId: string;
|
|
6
|
+
mcpSchemaId: string;
|
|
7
|
+
}
|
|
8
|
+
/** The canonical plugin manifest schema identifier of the baseline release. */
|
|
9
|
+
export declare const PLUGIN_SCHEMA_ID: string;
|
|
10
|
+
/** The canonical MCP configuration schema identifier of the baseline release. */
|
|
11
|
+
export declare const MCP_SCHEMA_ID: string;
|
|
12
|
+
/** The spec version a recognized `$schema` id selects, or undefined when unrecognized. */
|
|
13
|
+
export declare function recognizedSpecVersion(schemaId: unknown): SpecVersion | undefined;
|
|
14
|
+
/** Whether a `$schema` value selects a locally supported ruleset. */
|
|
7
15
|
export declare function isRecognizedSchema(value: unknown): boolean;
|
|
16
|
+
/**
|
|
17
|
+
* One structured schema violation. Structured instead of pre-formatted so
|
|
18
|
+
* callers can classify by location and keyword before rendering text.
|
|
19
|
+
*/
|
|
20
|
+
export interface SchemaError {
|
|
21
|
+
keyword: string;
|
|
22
|
+
instancePath: string;
|
|
23
|
+
message: string;
|
|
24
|
+
params?: Record<string, unknown>;
|
|
25
|
+
}
|
|
26
|
+
/** Validate one JSON document against a vendored schema; structured errors. */
|
|
27
|
+
export declare function validateAgainstSchema(schemaId: string, document: unknown): Promise<SchemaError[]>;
|
|
28
|
+
/** Render structured errors as one diagnostic string per error for surfacing. */
|
|
29
|
+
export declare function formatSchemaErrors(errors: SchemaError[]): string[];
|
|
8
30
|
/**
|
|
9
31
|
* Spec §4 containment: a plugin-relative path must begin with `./` and, after
|
|
10
32
|
* resolution against the plugin root, stay inside the filesystem-resolved
|
|
@@ -12,8 +34,18 @@ export declare function isRecognizedSchema(value: unknown): boolean;
|
|
|
12
34
|
* @returns `undefined` when contained, or the rejection reason.
|
|
13
35
|
*/
|
|
14
36
|
export declare function pathContainmentError(pluginRoot: string, value: string): Promise<string | undefined>;
|
|
15
|
-
/**
|
|
16
|
-
|
|
37
|
+
/**
|
|
38
|
+
* Classification of one plugin manifest against the vendored schema:
|
|
39
|
+
* `fatal` violations reject the manifest (§5.2), `ignored` violations are
|
|
40
|
+
* reported and loading continues (unknown top-level fields per §5.2, the
|
|
41
|
+
* whole `extensions` subtree per §8.1).
|
|
42
|
+
*/
|
|
43
|
+
export interface ManifestVerdict {
|
|
44
|
+
fatal: SchemaError[];
|
|
45
|
+
ignored: SchemaError[];
|
|
46
|
+
}
|
|
47
|
+
/** Validate a plugin manifest against its declared spec version's schema and split the verdict. */
|
|
48
|
+
export declare function validatePluginManifest(raw: unknown): Promise<ManifestVerdict>;
|
|
17
49
|
export interface McpValidateOptions {
|
|
18
50
|
/** Project-owned config may name external executables and working directories. */
|
|
19
51
|
pathMode?: 'plugin' | 'project';
|
|
@@ -21,14 +53,43 @@ export interface McpValidateOptions {
|
|
|
21
53
|
* Lenient mode (`.mcp.json`, native client file): no `$schema` requirement,
|
|
22
54
|
* unknown transports skipped per server, known transports still validated. */
|
|
23
55
|
strict?: boolean;
|
|
56
|
+
/**
|
|
57
|
+
* Whether the data is a distributable package: the closed field set, bare
|
|
58
|
+
* command names and plugin-relative paths apply. User-owned files are local
|
|
59
|
+
* data, so those package rules stay off while every shape and required field
|
|
60
|
+
* the client does know is still validated. Defaults to `strict`.
|
|
61
|
+
*/
|
|
62
|
+
packageRules?: boolean;
|
|
63
|
+
/** The spec version the suite's `plugin.json` declared; mismatched `mcp.json`
|
|
64
|
+
* versions disable MCP for the plugin (§7.2.2 rule 2, §10.1). */
|
|
65
|
+
manifestVersion?: string;
|
|
24
66
|
}
|
|
67
|
+
/**
|
|
68
|
+
* §7.2.1 remote URL rules: absolute http/https, no user information, no
|
|
69
|
+
* fragment, HTTPS everywhere except loopback hosts.
|
|
70
|
+
*/
|
|
71
|
+
export declare function remoteUrlError(value: string): string | undefined;
|
|
72
|
+
/**
|
|
73
|
+
* §7.2.1 header rules: valid field names, and a duplicate name under
|
|
74
|
+
* different casing makes the entry invalid.
|
|
75
|
+
*/
|
|
76
|
+
export declare function headersError(headers: Record<string, string>): string | undefined;
|
|
77
|
+
/**
|
|
78
|
+
* Parse and validate an `mcp.json` document.
|
|
79
|
+
*
|
|
80
|
+
* Strict mode applies the two-level failure boundary of §7.2.2: a file-level
|
|
81
|
+
* violation (bad `$schema`, version mismatch with the manifest, non-object
|
|
82
|
+
* `mcpServers`) disables MCP for the whole plugin, while a per-server
|
|
83
|
+
* violation skips only that server. Lenient mode keeps the native-client
|
|
84
|
+
* behavior: no `$schema` requirement, unknown transports skipped per server.
|
|
85
|
+
*
|
|
86
|
+
* @returns the validated config plus per-problem strings; `config` stays
|
|
87
|
+
* defined whenever at least the file shell was valid, even when some
|
|
88
|
+
* servers were skipped.
|
|
89
|
+
*/
|
|
25
90
|
export declare function validateMcpJson(pluginRoot: string, raw: unknown, options?: McpValidateOptions): Promise<{
|
|
26
91
|
config?: McpSuiteConfig;
|
|
27
92
|
errors: string[];
|
|
28
93
|
}>;
|
|
29
|
-
/** Expand `${PLUGIN_ROOT}`, `${PLUGIN_DATA}`, and `${NAME}` (process env) in one string.
|
|
30
|
-
* Claude Code aliases `${CLAUDE_PLUGIN_ROOT}` / `${CLAUDE_PLUGIN_DATA}` and
|
|
31
|
-
* `${NAME:-default}` fallbacks are honored for unset/empty env vars. */
|
|
32
|
-
export declare function expandPlaceholders(value: string, pluginRoot: string, pluginData: string, env?: NodeJS.ProcessEnv): string;
|
|
33
94
|
/** Resolve an expanded plugin-relative cwd to an absolute path. */
|
|
34
95
|
export declare function resolveCwd(value: string, pluginRoot: string, pluginData: string): string;
|
|
@@ -6,6 +6,7 @@ export declare const MARKET_ROUTES: {
|
|
|
6
6
|
readonly overview: "/api/agent-plugins/overview";
|
|
7
7
|
readonly mcpStatus: "/api/agent-plugins/mcp-status";
|
|
8
8
|
readonly addMcpServer: "/api/agent-plugins/mcp-servers/add";
|
|
9
|
+
readonly importMcpServers: "/api/agent-plugins/mcp-servers/import";
|
|
9
10
|
readonly lspStatus: "/api/agent-plugins/lsp-status";
|
|
10
11
|
readonly lspServers: "/api/agent-plugins/lsp-servers";
|
|
11
12
|
readonly addLspServer: "/api/agent-plugins/lsp-servers/add";
|
|
@@ -28,18 +29,82 @@ export declare const MARKET_ROUTES: {
|
|
|
28
29
|
readonly setSurface: "/api/agent-plugins/set-surface";
|
|
29
30
|
readonly mcpOverrides: "/api/agent-plugins/mcp-overrides";
|
|
30
31
|
readonly setMcpOverride: "/api/agent-plugins/set-mcp-override";
|
|
32
|
+
readonly setMcpServerEnabled: "/api/agent-plugins/set-mcp-server-enabled";
|
|
33
|
+
readonly setMcpServerTool: "/api/agent-plugins/set-mcp-server-tool";
|
|
31
34
|
readonly mcpRetry: "/api/agent-plugins/mcp-retry";
|
|
32
35
|
readonly mcpReauthorize: "/api/agent-plugins/mcp-reauthorize";
|
|
33
36
|
readonly mcpBackend: "/api/agent-plugins/mcp-backend";
|
|
34
37
|
readonly setMcpBackend: "/api/agent-plugins/set-mcp-backend";
|
|
35
38
|
readonly userPanel: "/api/agent-plugins/user-panel";
|
|
36
39
|
};
|
|
40
|
+
/** One timeout's three layers: the user's value, the suite declaration, and the value in force. */
|
|
41
|
+
export interface ServerTimeoutPolicy {
|
|
42
|
+
/** The user's stored value; null when the user inherits. */
|
|
43
|
+
user: number | null;
|
|
44
|
+
/** The suite's declared value; null when the suite declares none. */
|
|
45
|
+
suite: number | null;
|
|
46
|
+
/** The value in force. */
|
|
47
|
+
effective: number;
|
|
48
|
+
/** Which layer supplied `effective`. */
|
|
49
|
+
source: 'user' | 'suite' | 'default';
|
|
50
|
+
}
|
|
51
|
+
/** One tool list's layers: what the user stored and what the suite declares. */
|
|
52
|
+
export interface ServerToolPolicy {
|
|
53
|
+
/** The user's stored list; null when the user set none. */
|
|
54
|
+
user: string[] | null;
|
|
55
|
+
/** The suite's declared list; null when the suite declares none. */
|
|
56
|
+
suite: string[] | null;
|
|
57
|
+
/** The list in force. */
|
|
58
|
+
effective: string[];
|
|
59
|
+
}
|
|
60
|
+
/** The OAuth opt-in's two layers. */
|
|
61
|
+
export interface ServerAuthPolicy {
|
|
62
|
+
/** The user's stored value; null when the user set none. */
|
|
63
|
+
user: boolean | null;
|
|
64
|
+
/** The suite's declared value; null when the suite declares none. */
|
|
65
|
+
suite: boolean | null;
|
|
66
|
+
/** The value in force. */
|
|
67
|
+
effective: boolean;
|
|
68
|
+
}
|
|
69
|
+
/** The MCP per-server client policy as the service editor renders it. */
|
|
70
|
+
export interface ServerPolicyPayload {
|
|
71
|
+
/** Per-tool-call timeout. */
|
|
72
|
+
toolCallTimeout: ServerTimeoutPolicy;
|
|
73
|
+
/** Startup timeout. */
|
|
74
|
+
startupTimeout: ServerTimeoutPolicy;
|
|
75
|
+
/** The tools the service denies. */
|
|
76
|
+
deniedTools: ServerToolPolicy;
|
|
77
|
+
/** The OAuth opt-in. */
|
|
78
|
+
auth: ServerAuthPolicy;
|
|
79
|
+
}
|
|
37
80
|
/** Editable service configuration; masked values are preserved when unchanged. */
|
|
38
81
|
export interface ServerConfigPayload {
|
|
39
82
|
kind: 'mcp' | 'lsp';
|
|
40
83
|
id: string;
|
|
84
|
+
/** The declaration key this service carries, used to compose the document view. */
|
|
85
|
+
key: string;
|
|
41
86
|
editable: boolean;
|
|
42
87
|
config: Record<string, unknown>;
|
|
88
|
+
/** The stored policy and the suite declaration behind it; present for MCP services. */
|
|
89
|
+
policy?: ServerPolicyPayload;
|
|
90
|
+
/** The MCP mount backend; `host` cannot enforce startup timeouts or tool filters. */
|
|
91
|
+
backend?: 'builtin' | 'host';
|
|
92
|
+
}
|
|
93
|
+
/** The policy a service-config save sets (`number`/value) or clears back to inheritance (`null`). */
|
|
94
|
+
export interface ServerPolicyRequest {
|
|
95
|
+
toolCallTimeoutMs?: number | null;
|
|
96
|
+
startupTimeoutMs?: number | null;
|
|
97
|
+
/** The user's deny list; null clears it. The suite's own entries stay in force. */
|
|
98
|
+
disabledTools?: string[] | null;
|
|
99
|
+
/** The user's OAuth opt-in; null clears it back to the suite's declaration. */
|
|
100
|
+
auth?: {
|
|
101
|
+
enabled: boolean;
|
|
102
|
+
} | null;
|
|
103
|
+
}
|
|
104
|
+
/** One rejected value as the API reports it: the field it belongs to and why. */
|
|
105
|
+
export interface MarketFieldError {
|
|
106
|
+
field: string;
|
|
107
|
+
message: string;
|
|
43
108
|
}
|
|
44
109
|
/** Public model identities and exact-model reasoning options; never provider configuration. */
|
|
45
110
|
export interface ModelCatalogPayload {
|
|
@@ -134,6 +199,9 @@ export type McpServerOverrideWire = {
|
|
|
134
199
|
headers?: Record<string, string>;
|
|
135
200
|
env?: Record<string, string>;
|
|
136
201
|
args?: string[];
|
|
202
|
+
toolCallTimeoutMs?: number;
|
|
203
|
+
startupTimeoutMs?: number;
|
|
204
|
+
disabledTools?: string[];
|
|
137
205
|
};
|
|
138
206
|
/** Overrides for one suite keyed by mcp.json server key. */
|
|
139
207
|
export type McpSuiteOverridesWire = Record<string, McpServerOverrideWire>;
|
|
@@ -243,6 +311,8 @@ export interface SuiteDetail {
|
|
|
243
311
|
description: string | null;
|
|
244
312
|
author: string | null;
|
|
245
313
|
keywords: string[];
|
|
314
|
+
/** Last modification of the suite checkout, as an ISO timestamp; null when it cannot be read. */
|
|
315
|
+
updatedAt: string | null;
|
|
246
316
|
layout: string;
|
|
247
317
|
dimension: string;
|
|
248
318
|
root: string;
|
|
@@ -273,6 +343,7 @@ export interface SkillContent {
|
|
|
273
343
|
}
|
|
274
344
|
/** A user panel entry (skills / commands / agent personas) over HTTP. */
|
|
275
345
|
export interface UserPanelEntryWire {
|
|
346
|
+
/** Entry name: the name its document declares, else the file's base name. */
|
|
276
347
|
name: string;
|
|
277
348
|
description: string;
|
|
278
349
|
disabled: boolean;
|
|
@@ -284,7 +355,13 @@ export interface UserPanelEntryWire {
|
|
|
284
355
|
suiteName?: string;
|
|
285
356
|
metadata: Record<string, unknown>;
|
|
286
357
|
path: string;
|
|
358
|
+
/** The entry file's last modification, as an ISO timestamp. */
|
|
359
|
+
updatedAt?: string | null;
|
|
287
360
|
content: string;
|
|
361
|
+
/** Suite checkout root of a plugin-provided file; runtime consumers resolve `${PLUGIN_ROOT}` against it. */
|
|
362
|
+
suiteRoot?: string;
|
|
363
|
+
/** The suite's `${PLUGIN_DATA}` directory, for the same runtime resolution. */
|
|
364
|
+
suiteData?: string;
|
|
288
365
|
}
|
|
289
366
|
/** The user panel surface the market exposes. */
|
|
290
367
|
export type UserPanelKind = 'skills' | 'commands' | 'agents';
|
|
@@ -3,6 +3,8 @@
|
|
|
3
3
|
export interface McpStatusTool {
|
|
4
4
|
name: string;
|
|
5
5
|
description?: string;
|
|
6
|
+
/** The advertised input schema, kept only while it stays small enough to transport; absent otherwise. */
|
|
7
|
+
parameters?: unknown;
|
|
6
8
|
}
|
|
7
9
|
/** Whether an MCP row comes from a suite or direct host observation. */
|
|
8
10
|
export type McpStatusKind = 'plugin' | 'direct';
|
|
@@ -39,6 +41,12 @@ export interface McpStatusEntry {
|
|
|
39
41
|
* runs the OAuth flow when the server answers 401, which the redacted
|
|
40
42
|
* configuration alone cannot show. */
|
|
41
43
|
oauthDefault?: boolean;
|
|
44
|
+
/** Suite allow-list for this server's tools; absent when the suite narrows nothing. */
|
|
45
|
+
suiteEnabledTools?: string[];
|
|
46
|
+
/** Tools the suite's own declaration leaves out. */
|
|
47
|
+
suiteDisabledTools?: string[];
|
|
48
|
+
/** Tools the user turned off through the panel. */
|
|
49
|
+
userDisabledTools?: string[];
|
|
42
50
|
}
|
|
43
51
|
/** The MCP status response returned by the host. */
|
|
44
52
|
export interface McpStatusPayload {
|
|
@@ -55,4 +63,7 @@ export interface McpStatusPayload {
|
|
|
55
63
|
foreign: number;
|
|
56
64
|
};
|
|
57
65
|
directObservationOnly: boolean;
|
|
66
|
+
/** The mount backend the rows were observed under; `host` cannot enforce tool
|
|
67
|
+
* filters or startup timeouts, so the panel disables those controls. */
|
|
68
|
+
backend?: 'builtin' | 'host';
|
|
58
69
|
}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Browser-safe settings contract of the market's host settings namespace: the
|
|
3
|
+
* namespace key, the fields with their defaults, and the one reader that turns
|
|
4
|
+
* a stored section into resolved values.
|
|
5
|
+
*
|
|
6
|
+
* The defaults live here and nowhere else. The namespace schema declares them
|
|
7
|
+
* to the host, the node half reads them back through {@link resolveMarketSettings},
|
|
8
|
+
* and the browser half — which cannot import `src/runtime` — reads the same
|
|
9
|
+
* resolved values off the settings snapshot it is handed. Changing a default is
|
|
10
|
+
* therefore a one-line edit in this module.
|
|
11
|
+
*
|
|
12
|
+
* @module contracts/settings
|
|
13
|
+
*/
|
|
14
|
+
/** Settings namespace this plugin registers; the key the plugin-config tab pairs our card by. */
|
|
15
|
+
export declare const MARKET_SETTINGS_NAMESPACE = "dsh-agent-plugins-market";
|
|
16
|
+
/** The persisted download-region setting: `auto` follows the interface language. */
|
|
17
|
+
export type DownloadRegionSetting = 'auto' | 'global' | 'china';
|
|
18
|
+
/** Every market setting with the value it resolves to when the document says nothing. */
|
|
19
|
+
export interface MarketSettings {
|
|
20
|
+
/** ON = the built-in MCP bridge with OAuth and SSE; OFF = host client compat mode. */
|
|
21
|
+
mcpEnhanced: boolean;
|
|
22
|
+
/** ON = native project Agent layouts (`.claude/`, `.agents/`) take part in discovery. */
|
|
23
|
+
scanProjectLayouts: boolean;
|
|
24
|
+
/** Download region for GitHub acquisition. */
|
|
25
|
+
downloadRegion: DownloadRegionSetting;
|
|
26
|
+
/** ON = the `report_market_issue` model tool is registered. */
|
|
27
|
+
feedbackEnabled: boolean;
|
|
28
|
+
/** ON = every configured source refreshes in the background. */
|
|
29
|
+
autoUpdateSources: boolean;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* The default of every market setting — the single place one is written.
|
|
33
|
+
*
|
|
34
|
+
* These are user-visible behavior: a flip here is a behavior change that ships
|
|
35
|
+
* with its documentation, not a private implementation detail.
|
|
36
|
+
*/
|
|
37
|
+
export declare const MARKET_SETTINGS_DEFAULTS: MarketSettings;
|
|
38
|
+
/** Every field name the market's settings section carries. */
|
|
39
|
+
export type MarketSettingKey = keyof MarketSettings;
|
|
40
|
+
/**
|
|
41
|
+
* Narrow an untrusted stored region to a setting; anything else reads as the
|
|
42
|
+
* declared default.
|
|
43
|
+
* @param value - the stored `downloadRegion` value.
|
|
44
|
+
* @param fallback - the value an unrecognized input reads as.
|
|
45
|
+
*/
|
|
46
|
+
export declare function narrowDownloadRegion(value: unknown, fallback?: DownloadRegionSetting): DownloadRegionSetting;
|
|
47
|
+
/**
|
|
48
|
+
* Resolve a stored settings section the way the host resolves it: each field
|
|
49
|
+
* takes its stored value when it is one this field accepts, and its declared
|
|
50
|
+
* default otherwise.
|
|
51
|
+
*
|
|
52
|
+
* The host hands the resolved section back on its own, but not every caller has
|
|
53
|
+
* one — the plugin's own halves read a section they may not have received yet,
|
|
54
|
+
* and a test hands in a bare literal. Funnelling all of them through this
|
|
55
|
+
* function is what keeps a second reading of "what does missing mean" from
|
|
56
|
+
* growing somewhere else.
|
|
57
|
+
* @param section - the stored (or absent) namespace section, untrusted.
|
|
58
|
+
*/
|
|
59
|
+
export declare function resolveMarketSettings(section: unknown): MarketSettings;
|
|
@@ -39,9 +39,26 @@ export declare const PLUGIN_LAYOUTS: readonly [{
|
|
|
39
39
|
export type ManifestKind = (typeof PLUGIN_LAYOUTS)[number]['kind'];
|
|
40
40
|
/** Kimi Code's primary spelling precedes its compatibility spelling within that dialect. */
|
|
41
41
|
export declare const MANIFEST_ALIASES: Partial<Record<ManifestKind, readonly string[]>>;
|
|
42
|
+
/**
|
|
43
|
+
* This client's Agent Plugins extension namespace (§8): manifest data rides
|
|
44
|
+
* `plugin.json` `extensions` under this key, and file-based extensions live
|
|
45
|
+
* in the top-level directory named exactly this. The namespace contract
|
|
46
|
+
* version is declared inside the manifest data.
|
|
47
|
+
*/
|
|
48
|
+
export declare const EXTENSION_NAMESPACE = "com.deepseek.harness";
|
|
49
|
+
/** Namespace contract versions this manager implements. */
|
|
50
|
+
export declare const NAMESPACE_SCHEMA_VERSIONS: ReadonlySet<string>;
|
|
51
|
+
/** Namespace directory locations, relative to the plugin root. */
|
|
52
|
+
export declare const NAMESPACE_DIR = "com.deepseek.harness";
|
|
53
|
+
export declare const NAMESPACE_HOOKS_FILE: string;
|
|
54
|
+
export declare const NAMESPACE_LSP_FILE: string;
|
|
42
55
|
/** Equivalent plugin-owned path variables; these never resolve as credentials. */
|
|
43
56
|
export declare const PLUGIN_ROOT_VARIABLES: ReadonlySet<string>;
|
|
44
57
|
export declare const PLUGIN_DATA_VARIABLES: ReadonlySet<string>;
|
|
58
|
+
/** Equivalent session project-directory variables; only a calling session supplies the directory. */
|
|
59
|
+
export declare const PROJECT_DIR_VARIABLES: ReadonlySet<string>;
|
|
60
|
+
/** Claude Code names the directory holding the skill's own file; no dialect alias exists. */
|
|
61
|
+
export declare const SKILL_DIR_VARIABLE = "CLAUDE_SKILL_DIR";
|
|
45
62
|
/** Explicit project document formats and portable surfaces; execution stays in the runtime adapters. */
|
|
46
63
|
export type ProjectMcpFormat = 'mcpServers' | 'zcode' | 'codex';
|
|
47
64
|
export type ProjectHookFormat = 'claude' | 'zcode';
|
|
@@ -50,6 +67,11 @@ export interface ProjectLayout {
|
|
|
50
67
|
label: string;
|
|
51
68
|
subdirs: readonly string[];
|
|
52
69
|
mcpFiles?: readonly string[];
|
|
70
|
+
/**
|
|
71
|
+
* Project-root-relative hook documents, read in order. A `settings.json`
|
|
72
|
+
* layer carries a `hooks` key; a standalone `hooks.json` may instead be the
|
|
73
|
+
* bare event table, the same file shape a suite ships under `hooks/`.
|
|
74
|
+
*/
|
|
53
75
|
hookFiles?: readonly string[];
|
|
54
76
|
mcpFormat?: ProjectMcpFormat;
|
|
55
77
|
hookFormat?: ProjectHookFormat;
|
|
@@ -64,6 +86,7 @@ export declare const PROJECT_LAYOUTS: readonly [{
|
|
|
64
86
|
readonly dirName: ".agents";
|
|
65
87
|
readonly label: "agents";
|
|
66
88
|
readonly subdirs: readonly ["skills", "agents", "commands"];
|
|
89
|
+
readonly hookFiles: readonly [".agents/hooks/hooks.json", ".agents/hooks.json"];
|
|
67
90
|
}, {
|
|
68
91
|
readonly dirName: ".codex";
|
|
69
92
|
readonly label: "Codex";
|
|
@@ -100,3 +123,10 @@ export declare const PROJECT_LAYOUTS: readonly [{
|
|
|
100
123
|
}];
|
|
101
124
|
/** Marketplace catalogs follow manifest layout order; the shared root catalog is the fallback. */
|
|
102
125
|
export declare const MARKETPLACE_PATHS: readonly string[];
|
|
126
|
+
/**
|
|
127
|
+
* Inline top-level manifest keys this manager reads for the portable v1
|
|
128
|
+
* dialect. The specification's closed manifest schema carries none of them
|
|
129
|
+
* (§5.2, §6.1), so under `agent-plugin-v1` they are reported as unknown
|
|
130
|
+
* top-level fields and ignored; every other dialect keeps reading them.
|
|
131
|
+
*/
|
|
132
|
+
export declare const V1_IGNORED_MANIFEST_KEYS: readonly string[];
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The source record this plugin presets.
|
|
3
|
+
*
|
|
4
|
+
* The first-party collection lives in its own repository. The plugin ships one
|
|
5
|
+
* registration pointing at it, so a fresh install lists the repository without
|
|
6
|
+
* anyone pasting a URL; from there it is an ordinary Git source — refresh to
|
|
7
|
+
* clone, then install and toggle its suites. Nothing marks it as different, and
|
|
8
|
+
* no setting owns it.
|
|
9
|
+
*
|
|
10
|
+
* @module model/preset-source
|
|
11
|
+
*/
|
|
12
|
+
import type { SourceRef } from './types.js';
|
|
13
|
+
/** Source id the preset record registers under. */
|
|
14
|
+
export declare const PRESET_SOURCE_ID = "dsh-agent-plugins";
|
|
15
|
+
/** Repository the preset record points at. */
|
|
16
|
+
export declare const PRESET_SOURCE_URL = "https://github.com/Sivan757/dsh-agent-plugins.git";
|
|
17
|
+
/** The preset registration, as the market stores it. */
|
|
18
|
+
export declare function presetSourceRef(): SourceRef;
|
|
@@ -67,6 +67,8 @@ export interface SuiteManifest {
|
|
|
67
67
|
keywords?: string[];
|
|
68
68
|
/** For agent-plugin-v1: the recognized `$schema` identifier. */
|
|
69
69
|
schemaVersion?: string;
|
|
70
|
+
/** Parsed `com.deepseek.harness` extension data; present when the suite declares the namespace. */
|
|
71
|
+
harness?: HarnessNamespace;
|
|
70
72
|
}
|
|
71
73
|
/** Raw layout declarations are resolved once by the catalog into runtime resources. */
|
|
72
74
|
export interface SuiteComponents {
|
|
@@ -110,6 +112,40 @@ export interface SuiteSurfaceCounts {
|
|
|
110
112
|
agents: number;
|
|
111
113
|
lsp: number;
|
|
112
114
|
}
|
|
115
|
+
/**
|
|
116
|
+
* Client-specific manifest data under the `com.deepseek.harness` extension
|
|
117
|
+
* namespace (Agent Plugins §8.1), carried by `plugin.json` `extensions`.
|
|
118
|
+
*/
|
|
119
|
+
export interface HarnessExtension {
|
|
120
|
+
/** Namespace contract version this suite was written against. */
|
|
121
|
+
schemaVersion: string;
|
|
122
|
+
/**
|
|
123
|
+
* Client policy for portable `mcp.json` servers, keyed by the server's own
|
|
124
|
+
* name in `mcp.json`; entries without a matching server are reported and
|
|
125
|
+
* ignored.
|
|
126
|
+
*/
|
|
127
|
+
mcpServers?: Record<string, HarnessMcpPolicy>;
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* dsh-owned per-server policy for a portable MCP server: OAuth 2.1
|
|
131
|
+
* authorization for servers that answer `401` with a challenge, tool
|
|
132
|
+
* allow/deny lists, and timeout policies. These fields are outside the
|
|
133
|
+
* portable `mcp.json` schema by design (§7.2.1), so they ride the extension
|
|
134
|
+
* namespace instead of the package file.
|
|
135
|
+
*/
|
|
136
|
+
export interface HarnessMcpPolicy extends McpServerPolicy {
|
|
137
|
+
/** Opt in to OAuth 2.1 authorization (on by default; `enabled: false` opts out). */
|
|
138
|
+
auth?: {
|
|
139
|
+
enabled: boolean;
|
|
140
|
+
scope?: string;
|
|
141
|
+
};
|
|
142
|
+
}
|
|
143
|
+
/** Parsed namespace extension data of one suite, with server names pre-matched. */
|
|
144
|
+
export interface HarnessNamespace {
|
|
145
|
+
schemaVersion: string;
|
|
146
|
+
/** Policy applied on top of the suite's portable MCP servers. */
|
|
147
|
+
mcpServers: Record<string, HarnessMcpPolicy>;
|
|
148
|
+
}
|
|
113
149
|
/** agent-plugins.org v1 `mcp.json` server variants. */
|
|
114
150
|
export interface McpServerPolicy {
|
|
115
151
|
enabledTools?: string[];
|
|
@@ -128,7 +164,7 @@ export interface McpServerStreamableHttp extends McpServerPolicy {
|
|
|
128
164
|
type: 'streamable-http';
|
|
129
165
|
url: string;
|
|
130
166
|
headers?: Record<string, string>;
|
|
131
|
-
/**
|
|
167
|
+
/** OAuth 2.1 authorization; portable files take it from the namespace policy, dialect-native files declare it inline. */
|
|
132
168
|
auth?: {
|
|
133
169
|
enabled: boolean;
|
|
134
170
|
scope?: string;
|