@skastr0/prism-linux-x64 0.2.2 → 0.3.1
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/bin/prism +0 -0
- package/package.json +2 -1
- package/types/content-hash.d.ts +14 -0
- package/types/index.d.ts +1 -9
- package/types/lowerer-capabilities.d.ts +34 -0
- package/types/workflow-bun-runtime.d.ts +21 -0
- package/types/workflow-errors.d.ts +9 -2
- package/types/workflow-harness-detection.d.ts +85 -0
- package/types/workflow-identity.d.ts +48 -0
- package/types/workflow-runner.d.ts +4 -1
- package/types/workflow-runtime.d.ts +24 -0
- package/types/workflow-session.d.ts +0 -1
- package/types/workflow-store.d.ts +16 -51
- package/types/workflow-worker-contract.d.ts +2 -1
- package/types/workflows.d.ts +27 -0
- package/types/compile/authoring-runtime.d.ts +0 -27
- package/types/compile/bundle-utils.d.ts +0 -16
- package/types/compile/cache.d.ts +0 -49
- package/types/compile/compile-manifest.d.ts +0 -48
- package/types/compile/compose.d.ts +0 -35
- package/types/compile/errors.d.ts +0 -124
- package/types/compile/generated-plugin.d.ts +0 -10
- package/types/compile/load.d.ts +0 -52
- package/types/compile/paths.d.ts +0 -2
- package/types/compile/protocol-tools.d.ts +0 -47
- package/types/compile/refs.d.ts +0 -7
- package/types/compile/registry.d.ts +0 -32
- package/types/compile/resolve.d.ts +0 -63
- package/types/compile/runtime-deps.d.ts +0 -6
- package/types/compile/sources.d.ts +0 -2782
- package/types/errors.d.ts +0 -116
- package/types/harnesses.d.ts +0 -18
- package/types/manifest.d.ts +0 -106
- package/types/prism-home.d.ts +0 -26
- package/types/services/prism-env.d.ts +0 -45
- package/types/source-selection.d.ts +0 -38
- package/types/state/lock.d.ts +0 -14
- package/types/workflow-amp-worker.d.ts +0 -28
- package/types/workflow-antigravity-pty.d.ts +0 -22
- package/types/workflow-antigravity-worker.d.ts +0 -75
- package/types/workflow-claude-worker.d.ts +0 -32
- package/types/workflow-codex-worker.d.ts +0 -24
- package/types/workflow-grok-worker.d.ts +0 -27
- package/types/workflow-hermes-worker.d.ts +0 -22
- package/types/workflow-kimi-worker.d.ts +0 -24
- package/types/workflow-loader.d.ts +0 -64
- package/types/workflow-opencode-worker.d.ts +0 -22
- package/types/workflow-output-schema.d.ts +0 -7
- package/types/workflow-permissions.d.ts +0 -10
- package/types/workflow-tsconfig.d.ts +0 -98
- package/types/workflow-worker-process.d.ts +0 -24
- package/types/workflow-workers.d.ts +0 -43
package/bin/prism
CHANGED
|
Binary file
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@skastr0/prism-linux-x64",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.3.1",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "Prism standalone CLI binary for Linux x64.",
|
|
6
6
|
"license": "MIT",
|
|
@@ -19,6 +19,7 @@
|
|
|
19
19
|
"dependencies": {
|
|
20
20
|
"@modelcontextprotocol/sdk": "1.29.0",
|
|
21
21
|
"@opencode-ai/plugin": "^1.15.13",
|
|
22
|
+
"@skastr0/prism-sdk": "0.3.1",
|
|
22
23
|
"effect": "^3.21.1",
|
|
23
24
|
"typescript": "^5.8.3",
|
|
24
25
|
"zod": "4.4.3"
|
package/types/content-hash.d.ts
CHANGED
|
@@ -1 +1,15 @@
|
|
|
1
1
|
export declare const computeContentHash: (content: string | Uint8Array) => string;
|
|
2
|
+
/**
|
|
3
|
+
* Normalizes the dynamic `mcpServers[*].url` authority (host:port) out of a
|
|
4
|
+
* generated MCP HTTP config before hashing, so an owner daemon rebinding to a
|
|
5
|
+
* different ephemeral port is never mistaken for content drift. Detection is
|
|
6
|
+
* purely structural (`{ mcpServers: { url: "http(s)://..." } }`); content that
|
|
7
|
+
* does not match this shape is returned unchanged.
|
|
8
|
+
*/
|
|
9
|
+
export declare const normalizeMcpHttpConfigForHash: (content: string) => string;
|
|
10
|
+
/**
|
|
11
|
+
* Content hash for a generated MCP HTTP config owned file. Equal for two
|
|
12
|
+
* renders that differ only in the dynamic port/url authority; still differs
|
|
13
|
+
* for a genuine content change (e.g. an added/removed server entry).
|
|
14
|
+
*/
|
|
15
|
+
export declare const computeMcpHttpConfigContentHash: (content: string) => string;
|
package/types/index.d.ts
CHANGED
|
@@ -13,19 +13,11 @@
|
|
|
13
13
|
* These helpers are identity constructors for authoring ergonomics.
|
|
14
14
|
*/
|
|
15
15
|
export * from "./workflow-errors.js";
|
|
16
|
+
export * from "./workflow-harness-detection.js";
|
|
16
17
|
export * from "./workflows.js";
|
|
17
|
-
export * from "./workflow-tsconfig.js";
|
|
18
|
-
export * from "./workflow-antigravity-worker.js";
|
|
19
|
-
export * from "./workflow-amp-worker.js";
|
|
20
|
-
export * from "./workflow-claude-worker.js";
|
|
21
|
-
export * from "./workflow-codex-worker.js";
|
|
22
|
-
export * from "./workflow-loader.js";
|
|
23
|
-
export * from "./workflow-opencode-worker.js";
|
|
24
18
|
export * from "./workflow-runner.js";
|
|
25
|
-
export * from "./workflow-store.js";
|
|
26
19
|
export * from "./workflow-worker-contract.js";
|
|
27
20
|
export * from "./workflow-worker-metadata.js";
|
|
28
|
-
export * from "./workflow-workers.js";
|
|
29
21
|
export interface NamedRefDefinition {
|
|
30
22
|
readonly plugin?: string;
|
|
31
23
|
readonly name: string;
|
|
@@ -2,8 +2,10 @@ import type { HarnessId } from "./types.js";
|
|
|
2
2
|
export type GeneratedCanonicalToolSupport = "executable" | "unsupported";
|
|
3
3
|
export type SkillPermissionSupport = "supported" | "unsupported";
|
|
4
4
|
export type CompileSurfaceSupport = "supported" | "unsupported";
|
|
5
|
+
export type AgentModelBindingSupport = "consumed" | "ignored";
|
|
5
6
|
export interface CompileTargetCapabilities {
|
|
6
7
|
readonly agents: CompileSurfaceSupport;
|
|
8
|
+
readonly agentModelBindings: AgentModelBindingSupport;
|
|
7
9
|
readonly generatedCanonicalTools: GeneratedCanonicalToolSupport;
|
|
8
10
|
readonly hooks: CompileSurfaceSupport;
|
|
9
11
|
readonly skillPermissions: SkillPermissionSupport;
|
|
@@ -21,6 +23,14 @@ export interface LowererSurfaceCapability {
|
|
|
21
23
|
export interface LowererCapabilityProfile {
|
|
22
24
|
readonly harness: HarnessId;
|
|
23
25
|
readonly family: HarnessFamily;
|
|
26
|
+
/**
|
|
27
|
+
* Whether Prism Workflows can dispatch a task to this harness (a worker
|
|
28
|
+
* module exists under `src/workflow-*-worker.ts` and the harness is a
|
|
29
|
+
* member of `WorkflowWorkerId`, workflows.ts). This is the single source
|
|
30
|
+
* for `WORKFLOW_WORKERS` (workflow-catalog.ts) — do not hand-list harness
|
|
31
|
+
* ids elsewhere.
|
|
32
|
+
*/
|
|
33
|
+
readonly workflowWorker: boolean;
|
|
24
34
|
readonly compile: CompileTargetCapabilities;
|
|
25
35
|
readonly surfaces: Record<LowererSurfaceId, LowererSurfaceCapability>;
|
|
26
36
|
readonly notes?: readonly string[];
|
|
@@ -29,6 +39,7 @@ export declare const LOWERER_CAPABILITIES: {
|
|
|
29
39
|
readonly "claude-code": {
|
|
30
40
|
readonly harness: "claude-code";
|
|
31
41
|
readonly family: "coding-harness";
|
|
42
|
+
readonly workflowWorker: true;
|
|
32
43
|
readonly compile: CompileTargetCapabilities;
|
|
33
44
|
readonly surfaces: {
|
|
34
45
|
readonly pluginBundle: {
|
|
@@ -77,6 +88,7 @@ export declare const LOWERER_CAPABILITIES: {
|
|
|
77
88
|
readonly opencode: {
|
|
78
89
|
readonly harness: "opencode";
|
|
79
90
|
readonly family: "coding-harness";
|
|
91
|
+
readonly workflowWorker: true;
|
|
80
92
|
readonly compile: CompileTargetCapabilities;
|
|
81
93
|
readonly surfaces: {
|
|
82
94
|
readonly pluginBundle: {
|
|
@@ -125,6 +137,7 @@ export declare const LOWERER_CAPABILITIES: {
|
|
|
125
137
|
readonly openclaw: {
|
|
126
138
|
readonly harness: "openclaw";
|
|
127
139
|
readonly family: "claw-harness";
|
|
140
|
+
readonly workflowWorker: false;
|
|
128
141
|
readonly compile: CompileTargetCapabilities;
|
|
129
142
|
readonly surfaces: {
|
|
130
143
|
readonly pluginBundle: LowererSurfaceCapability;
|
|
@@ -146,6 +159,7 @@ export declare const LOWERER_CAPABILITIES: {
|
|
|
146
159
|
readonly hermes: {
|
|
147
160
|
readonly harness: "hermes";
|
|
148
161
|
readonly family: "claw-harness";
|
|
162
|
+
readonly workflowWorker: true;
|
|
149
163
|
readonly compile: CompileTargetCapabilities;
|
|
150
164
|
readonly surfaces: {
|
|
151
165
|
readonly pluginBundle: LowererSurfaceCapability;
|
|
@@ -174,6 +188,7 @@ export declare const LOWERER_CAPABILITIES: {
|
|
|
174
188
|
readonly "codex-cli": {
|
|
175
189
|
readonly harness: "codex-cli";
|
|
176
190
|
readonly family: "coding-harness";
|
|
191
|
+
readonly workflowWorker: true;
|
|
177
192
|
readonly compile: CompileTargetCapabilities;
|
|
178
193
|
readonly surfaces: {
|
|
179
194
|
readonly pluginBundle: LowererSurfaceCapability;
|
|
@@ -222,6 +237,7 @@ export declare const LOWERER_CAPABILITIES: {
|
|
|
222
237
|
readonly "antigravity-cli": {
|
|
223
238
|
readonly harness: "antigravity-cli";
|
|
224
239
|
readonly family: "coding-harness";
|
|
240
|
+
readonly workflowWorker: true;
|
|
225
241
|
readonly compile: CompileTargetCapabilities;
|
|
226
242
|
readonly surfaces: {
|
|
227
243
|
readonly pluginBundle: {
|
|
@@ -270,6 +286,7 @@ export declare const LOWERER_CAPABILITIES: {
|
|
|
270
286
|
readonly "kimi-code": {
|
|
271
287
|
readonly harness: "kimi-code";
|
|
272
288
|
readonly family: "coding-harness";
|
|
289
|
+
readonly workflowWorker: true;
|
|
273
290
|
readonly compile: CompileTargetCapabilities;
|
|
274
291
|
readonly surfaces: {
|
|
275
292
|
readonly pluginBundle: {
|
|
@@ -323,6 +340,7 @@ export declare const LOWERER_CAPABILITIES: {
|
|
|
323
340
|
readonly "amp-code": {
|
|
324
341
|
readonly harness: "amp-code";
|
|
325
342
|
readonly family: "coding-harness";
|
|
343
|
+
readonly workflowWorker: true;
|
|
326
344
|
readonly compile: CompileTargetCapabilities;
|
|
327
345
|
readonly surfaces: {
|
|
328
346
|
readonly pluginBundle: {
|
|
@@ -368,6 +386,7 @@ export declare const LOWERER_CAPABILITIES: {
|
|
|
368
386
|
readonly cursor: {
|
|
369
387
|
readonly harness: "cursor";
|
|
370
388
|
readonly family: "coding-harness";
|
|
389
|
+
readonly workflowWorker: false;
|
|
371
390
|
readonly compile: CompileTargetCapabilities;
|
|
372
391
|
readonly surfaces: {
|
|
373
392
|
readonly pluginBundle: {
|
|
@@ -409,6 +428,7 @@ export declare const LOWERER_CAPABILITIES: {
|
|
|
409
428
|
readonly "factory-droid": {
|
|
410
429
|
readonly harness: "factory-droid";
|
|
411
430
|
readonly family: "coding-harness";
|
|
431
|
+
readonly workflowWorker: false;
|
|
412
432
|
readonly compile: CompileTargetCapabilities;
|
|
413
433
|
readonly surfaces: {
|
|
414
434
|
readonly pluginBundle: {
|
|
@@ -461,6 +481,7 @@ export declare const LOWERER_CAPABILITIES: {
|
|
|
461
481
|
readonly pi: {
|
|
462
482
|
readonly harness: "pi";
|
|
463
483
|
readonly family: "coding-harness";
|
|
484
|
+
readonly workflowWorker: false;
|
|
464
485
|
readonly compile: CompileTargetCapabilities;
|
|
465
486
|
readonly surfaces: {
|
|
466
487
|
readonly pluginBundle: {
|
|
@@ -510,6 +531,7 @@ export declare const LOWERER_CAPABILITIES: {
|
|
|
510
531
|
readonly grok: {
|
|
511
532
|
readonly harness: "grok";
|
|
512
533
|
readonly family: "coding-harness";
|
|
534
|
+
readonly workflowWorker: true;
|
|
513
535
|
readonly compile: CompileTargetCapabilities;
|
|
514
536
|
readonly surfaces: {
|
|
515
537
|
readonly pluginBundle: {
|
|
@@ -557,3 +579,15 @@ export declare const LOWERER_CAPABILITIES: {
|
|
|
557
579
|
};
|
|
558
580
|
};
|
|
559
581
|
export declare const getCompileTargetCapabilities: (harness: string) => CompileTargetCapabilities;
|
|
582
|
+
/**
|
|
583
|
+
* Harness ids flagged `workflowWorker: true` above — computed at the type
|
|
584
|
+
* level from the literal `as const` table, so it narrows exactly (no wider
|
|
585
|
+
* than `HarnessId`, no manual re-listing). Consumers (workflow-catalog.ts)
|
|
586
|
+
* assert this set against their own worker-module registry so a harness
|
|
587
|
+
* flagged here without a matching worker module is a tsc error.
|
|
588
|
+
*/
|
|
589
|
+
export type WorkflowWorkerHarnessId = {
|
|
590
|
+
[K in HarnessId]: (typeof LOWERER_CAPABILITIES)[K]["workflowWorker"] extends true ? K : never;
|
|
591
|
+
}[HarnessId];
|
|
592
|
+
/** Harness ids that can be dispatched as Prism Workflows workers, derived from the `workflowWorker` bit. */
|
|
593
|
+
export declare const workflowWorkerHarnessIds: () => readonly WorkflowWorkerHarnessId[];
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
export interface WorkflowBunSpawnOptions {
|
|
2
|
+
readonly cmd: ReadonlyArray<string>;
|
|
3
|
+
readonly cwd?: string;
|
|
4
|
+
readonly env?: Record<string, string | undefined>;
|
|
5
|
+
readonly stdin: "ignore";
|
|
6
|
+
readonly stdout: "ignore" | "pipe";
|
|
7
|
+
readonly stderr: "ignore" | "pipe";
|
|
8
|
+
}
|
|
9
|
+
export interface WorkflowBunSpawnedProcess {
|
|
10
|
+
readonly pid?: number;
|
|
11
|
+
readonly stdout?: ReadableStream<Uint8Array>;
|
|
12
|
+
readonly stderr: ReadableStream<Uint8Array>;
|
|
13
|
+
readonly exited: Promise<number | null>;
|
|
14
|
+
kill(signal?: NodeJS.Signals | number): void;
|
|
15
|
+
unref?(): void;
|
|
16
|
+
}
|
|
17
|
+
export interface WorkflowBunRuntime {
|
|
18
|
+
which(name: string): string | null;
|
|
19
|
+
spawn(options: WorkflowBunSpawnOptions): WorkflowBunSpawnedProcess;
|
|
20
|
+
}
|
|
21
|
+
export declare const workflowBunRuntime: (capability: string) => WorkflowBunRuntime;
|
|
@@ -17,5 +17,12 @@ export declare class WorkflowTaskEscalatedError extends Error {
|
|
|
17
17
|
readonly name = "WorkflowTaskEscalatedError";
|
|
18
18
|
constructor(taskId: string, criterion: string, feedback?: string | undefined);
|
|
19
19
|
}
|
|
20
|
-
export
|
|
21
|
-
|
|
20
|
+
export declare class WorkflowBunRuntimeUnavailableError extends Error {
|
|
21
|
+
readonly name = "WorkflowBunRuntimeUnavailableError";
|
|
22
|
+
constructor(capability: string, cause?: unknown);
|
|
23
|
+
}
|
|
24
|
+
export declare class WorkflowUnsupportedHarnessError extends Error {
|
|
25
|
+
readonly name = "WorkflowUnsupportedHarnessError";
|
|
26
|
+
constructor(harness: string, validHarnesses: ReadonlyArray<string>);
|
|
27
|
+
}
|
|
28
|
+
export type WorkflowRuntimeError = WorkflowBunRuntimeUnavailableError | WorkflowUnsupportedHarnessError | WorkflowTaskDecodeError | WorkflowTaskEscalatedError | WorkflowRunStoppedError | Error;
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import { type WorkflowWorkerHarnessId } from "./lowerer-capabilities.js";
|
|
2
|
+
import type { HarnessId } from "./types.js";
|
|
3
|
+
/**
|
|
4
|
+
* Workflow-worker harness ids, derived from the capability registry's
|
|
5
|
+
* `workflowWorker` bit (`lowerer-capabilities.ts`) — the single source of
|
|
6
|
+
* truth for this set (PQ-163). Never hand-list these ids here; add a harness
|
|
7
|
+
* by flipping its `workflowWorker` capability in the registry, which also
|
|
8
|
+
* forces `WORKFLOW_HARNESS_DETECTION_SPECS` below to gain the matching entry
|
|
9
|
+
* at compile time.
|
|
10
|
+
*/
|
|
11
|
+
export declare const WORKFLOW_HARNESS_IDS: ReadonlyArray<WorkflowWorkerHarnessId>;
|
|
12
|
+
export type WorkflowHarnessId = WorkflowWorkerHarnessId;
|
|
13
|
+
export type WorkflowHarnessDetectionStatus = "available" | "missing" | "broken";
|
|
14
|
+
export type WorkflowHarnessDetectionReasonCode = "executable-found" | "executable-missing" | "probe-succeeded" | "probe-exited-nonzero" | "probe-timed-out" | "probe-failed";
|
|
15
|
+
export interface WorkflowHarnessDetectionReason {
|
|
16
|
+
readonly code: WorkflowHarnessDetectionReasonCode;
|
|
17
|
+
readonly message: string;
|
|
18
|
+
readonly command: string;
|
|
19
|
+
readonly executablePath?: string;
|
|
20
|
+
readonly exitCode?: number | null;
|
|
21
|
+
readonly stderr?: string;
|
|
22
|
+
}
|
|
23
|
+
export interface WorkflowHarnessDetection {
|
|
24
|
+
readonly schema: "prism.workflow-harness-detection.v1";
|
|
25
|
+
readonly harness: WorkflowHarnessId;
|
|
26
|
+
readonly available: boolean;
|
|
27
|
+
readonly status: WorkflowHarnessDetectionStatus;
|
|
28
|
+
readonly reason: WorkflowHarnessDetectionReason;
|
|
29
|
+
}
|
|
30
|
+
export interface WorkflowHarnessDetectionSpec {
|
|
31
|
+
readonly harness: WorkflowHarnessId;
|
|
32
|
+
readonly command: string;
|
|
33
|
+
readonly envVar: string;
|
|
34
|
+
readonly probeArgs: ReadonlyArray<string>;
|
|
35
|
+
/**
|
|
36
|
+
* Cheap-fast-tier model used by `resolveWorkflowTaskModel` when a task
|
|
37
|
+
* declares this harness but nothing (task, profile, or CLI --model) supplies
|
|
38
|
+
* a concrete model. Chosen from the empirical modelspace's throughput/triage
|
|
39
|
+
* profiles (not the premium tier) so a scaffolded workflow never crashes at
|
|
40
|
+
* run with "no concrete model for workflow worker X".
|
|
41
|
+
*/
|
|
42
|
+
readonly defaultModel: string;
|
|
43
|
+
}
|
|
44
|
+
export interface WorkflowHarnessProbeRunResult {
|
|
45
|
+
readonly exitCode: number | null;
|
|
46
|
+
readonly stderr?: string;
|
|
47
|
+
readonly timedOut?: boolean;
|
|
48
|
+
}
|
|
49
|
+
export interface WorkflowHarnessProbeRunOptions {
|
|
50
|
+
readonly timeoutMs: number;
|
|
51
|
+
}
|
|
52
|
+
export interface WorkflowHarnessDetectionOptions {
|
|
53
|
+
/**
|
|
54
|
+
* Environment map used only to read Prism workflow binary override variables.
|
|
55
|
+
* Defaults to process.env when omitted.
|
|
56
|
+
*/
|
|
57
|
+
readonly env?: Readonly<Record<string, string | undefined>>;
|
|
58
|
+
/**
|
|
59
|
+
* Optional executable resolver. Inject this in apps/tests to keep detection
|
|
60
|
+
* deterministic and side-effect free.
|
|
61
|
+
*/
|
|
62
|
+
readonly resolveExecutable?: (command: string) => string | undefined | Promise<string | undefined>;
|
|
63
|
+
/**
|
|
64
|
+
* When true, detection runs a short version probe after resolving the binary.
|
|
65
|
+
* The default false mode only inspects PATH/override variables and is safe to
|
|
66
|
+
* call during application startup: no files are written, no config is loaded,
|
|
67
|
+
* and no harness process is spawned.
|
|
68
|
+
*/
|
|
69
|
+
readonly verify?: boolean;
|
|
70
|
+
readonly probeTimeoutMs?: number;
|
|
71
|
+
readonly runProbe?: (command: string, args: ReadonlyArray<string>, options: WorkflowHarnessProbeRunOptions) => Promise<WorkflowHarnessProbeRunResult>;
|
|
72
|
+
}
|
|
73
|
+
export declare const WORKFLOW_HARNESS_DETECTION_SPECS: Readonly<Record<WorkflowHarnessId, WorkflowHarnessDetectionSpec>>;
|
|
74
|
+
export declare const isWorkflowHarnessId: (id: string) => id is WorkflowHarnessId;
|
|
75
|
+
/**
|
|
76
|
+
* Cheap-fast-tier default model for a workflow harness, or `undefined` for an
|
|
77
|
+
* id outside the registry. Single source of truth for `resolveWorkflowTaskModel`
|
|
78
|
+
* (src/workflows.ts) — do not hand-maintain a second per-harness default list.
|
|
79
|
+
*/
|
|
80
|
+
export declare const workflowHarnessDefaultModel: (harness: string) => string | undefined;
|
|
81
|
+
export declare const workflowHarnessIdsForHarnesses: (harnesses: ReadonlyArray<HarnessId>) => WorkflowHarnessId[];
|
|
82
|
+
export declare const detectWorkflowHarness: (harness: WorkflowHarnessId, options?: WorkflowHarnessDetectionOptions) => Promise<WorkflowHarnessDetection>;
|
|
83
|
+
export declare const detectWorkflowHarnesses: (options?: WorkflowHarnessDetectionOptions & {
|
|
84
|
+
readonly harnesses?: ReadonlyArray<WorkflowHarnessId>;
|
|
85
|
+
}) => Promise<ReadonlyArray<WorkflowHarnessDetection>>;
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { type AnyWorkflowTask, type WorkflowRuntimeOptions } from "./workflows.js";
|
|
2
|
+
export interface WorkflowTaskIdentity {
|
|
3
|
+
readonly workflow: string;
|
|
4
|
+
readonly taskId: string;
|
|
5
|
+
readonly cacheKey: string;
|
|
6
|
+
readonly promptHash: string;
|
|
7
|
+
readonly agentManifestHash: string;
|
|
8
|
+
}
|
|
9
|
+
export interface WorkflowJudgeIdentity {
|
|
10
|
+
readonly workflow: string;
|
|
11
|
+
readonly taskId: string;
|
|
12
|
+
readonly taskCacheKey: string;
|
|
13
|
+
readonly criterion: string;
|
|
14
|
+
readonly cacheKey: string;
|
|
15
|
+
}
|
|
16
|
+
export interface WorkflowRunTaskSnapshot {
|
|
17
|
+
readonly runId: string;
|
|
18
|
+
readonly ordinal: number;
|
|
19
|
+
readonly taskId: string;
|
|
20
|
+
readonly phase?: string;
|
|
21
|
+
readonly prompt: string;
|
|
22
|
+
readonly cacheKey: string;
|
|
23
|
+
readonly promptHash: string;
|
|
24
|
+
readonly agentManifestHash: string;
|
|
25
|
+
readonly agent: {
|
|
26
|
+
readonly plugin: string;
|
|
27
|
+
readonly name: string;
|
|
28
|
+
readonly description: string;
|
|
29
|
+
readonly sourceHash: string;
|
|
30
|
+
readonly manifestHash: string;
|
|
31
|
+
};
|
|
32
|
+
readonly worker?: {
|
|
33
|
+
readonly worker?: string;
|
|
34
|
+
readonly model?: string;
|
|
35
|
+
readonly profile?: string;
|
|
36
|
+
};
|
|
37
|
+
readonly outputSchema?: unknown;
|
|
38
|
+
readonly finishCriteria: ReadonlyArray<string>;
|
|
39
|
+
readonly createdAt: string;
|
|
40
|
+
}
|
|
41
|
+
export declare const workflowTaskIdentity: (workflow: string, task: AnyWorkflowTask, runtimeOptions?: WorkflowRuntimeOptions) => WorkflowTaskIdentity;
|
|
42
|
+
export declare const workflowRunTaskSnapshotForTask: (input: {
|
|
43
|
+
readonly runId: string;
|
|
44
|
+
readonly ordinal: number;
|
|
45
|
+
readonly workflow: string;
|
|
46
|
+
readonly task: AnyWorkflowTask;
|
|
47
|
+
readonly runtimeOptions?: WorkflowRuntimeOptions;
|
|
48
|
+
}) => Omit<WorkflowRunTaskSnapshot, "createdAt">;
|
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
import { type AnyWorkflowDefinition, type AnyWorkflowTask, type WorkflowRuntimeOptions } from "./workflows.js";
|
|
2
|
-
import {
|
|
2
|
+
import type { WorkflowStore } from "./workflow-store.js";
|
|
3
3
|
import { type WorkflowRepairLoopContinuationWorkerId, type WorkflowStableSession } from "./workflow-session.js";
|
|
4
4
|
export interface WorkflowTaskExecution {
|
|
5
5
|
readonly output: unknown;
|
|
6
6
|
readonly metadata?: Record<string, unknown>;
|
|
7
7
|
}
|
|
8
|
+
export type WorkflowRunTaskResultStatus = "completed" | "failed" | "escalated";
|
|
8
9
|
export interface WorkflowRunTaskResult {
|
|
9
10
|
readonly id: string;
|
|
10
11
|
readonly agent: {
|
|
@@ -13,7 +14,9 @@ export interface WorkflowRunTaskResult {
|
|
|
13
14
|
};
|
|
14
15
|
readonly output: unknown;
|
|
15
16
|
readonly cached: boolean;
|
|
17
|
+
readonly status: WorkflowRunTaskResultStatus;
|
|
16
18
|
readonly metadata?: Record<string, unknown>;
|
|
19
|
+
readonly error?: string;
|
|
17
20
|
}
|
|
18
21
|
export interface WorkflowRunResult {
|
|
19
22
|
readonly runId: string | null;
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { type WorkflowBunSpawnedProcess, type WorkflowBunSpawnOptions } from "./workflow-bun-runtime.js";
|
|
2
|
+
export interface WorkflowDatabaseQuery<Row, Params extends ReadonlyArray<unknown>> {
|
|
3
|
+
get(...params: Params): Row | null;
|
|
4
|
+
all(...params: Params): Row[];
|
|
5
|
+
run(...params: Params): unknown;
|
|
6
|
+
}
|
|
7
|
+
export interface WorkflowDatabase {
|
|
8
|
+
exec(statement: string): unknown;
|
|
9
|
+
close(): void;
|
|
10
|
+
query<Row = unknown, Params extends ReadonlyArray<unknown> = ReadonlyArray<unknown>>(statement: string): WorkflowDatabaseQuery<Row, Params>;
|
|
11
|
+
transaction<T extends (...args: never[]) => unknown>(fn: T): T;
|
|
12
|
+
}
|
|
13
|
+
export interface WorkflowSpawnOptions extends WorkflowBunSpawnOptions {
|
|
14
|
+
readonly cwd: string;
|
|
15
|
+
}
|
|
16
|
+
export interface WorkflowSpawnedProcess extends WorkflowBunSpawnedProcess {
|
|
17
|
+
readonly pid: number;
|
|
18
|
+
readonly stdout: ReadableStream<Uint8Array>;
|
|
19
|
+
readonly stderr: ReadableStream<Uint8Array>;
|
|
20
|
+
unref(): void;
|
|
21
|
+
}
|
|
22
|
+
export declare const openWorkflowDatabase: (path: string) => WorkflowDatabase;
|
|
23
|
+
export declare const spawnWorkflowProcess: (options: WorkflowSpawnOptions) => WorkflowSpawnedProcess;
|
|
24
|
+
export declare const findWorkflowExecutable: (name: string) => string | undefined;
|
|
@@ -116,7 +116,6 @@ export declare const workflowHarnessContinuationSupport: {
|
|
|
116
116
|
};
|
|
117
117
|
export declare const stableSessionIdFromUnknown: (value: unknown) => StableSessionId | undefined;
|
|
118
118
|
export declare const workflowContinuationAdapterForWorker: (worker: string) => WorkflowContinuationAdapterId | undefined;
|
|
119
|
-
export declare const workflowWorkerSupportsRepairLoopContinuation: (worker: string) => worker is WorkflowRepairLoopContinuationWorkerId;
|
|
120
119
|
export declare const workflowContinuationSupportForAdapter: (adapter: string | undefined) => WorkflowHarnessContinuationSupport | undefined;
|
|
121
120
|
export declare const workflowAdapterFromMetadata: (metadata: Record<string, unknown> | undefined) => WorkflowContinuationAdapterId | undefined;
|
|
122
121
|
export declare const workflowStableSessionFromMetadata: (metadata: Record<string, unknown> | undefined) => WorkflowStableSession | undefined;
|
|
@@ -1,19 +1,7 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
export
|
|
4
|
-
|
|
5
|
-
readonly taskId: string;
|
|
6
|
-
readonly cacheKey: string;
|
|
7
|
-
readonly promptHash: string;
|
|
8
|
-
readonly agentManifestHash: string;
|
|
9
|
-
}
|
|
10
|
-
export interface WorkflowJudgeIdentity {
|
|
11
|
-
readonly workflow: string;
|
|
12
|
-
readonly taskId: string;
|
|
13
|
-
readonly taskCacheKey: string;
|
|
14
|
-
readonly criterion: string;
|
|
15
|
-
readonly cacheKey: string;
|
|
16
|
-
}
|
|
1
|
+
import type { WorkflowJudgeVerdict } from "./workflows.js";
|
|
2
|
+
import type { WorkflowJudgeIdentity, WorkflowRunTaskSnapshot, WorkflowTaskIdentity } from "./workflow-identity.js";
|
|
3
|
+
export { workflowRunTaskSnapshotForTask, workflowTaskIdentity, type WorkflowJudgeIdentity, type WorkflowRunTaskSnapshot, type WorkflowTaskIdentity } from "./workflow-identity.js";
|
|
4
|
+
import { type WorkflowDatabase } from "./workflow-runtime.js";
|
|
17
5
|
export type WorkflowTaskOutputSource = "mock-output";
|
|
18
6
|
export interface CompletedWorkflowTaskRecord {
|
|
19
7
|
readonly identity: WorkflowTaskIdentity;
|
|
@@ -105,31 +93,6 @@ export interface WorkflowRunSnapshot {
|
|
|
105
93
|
readonly createdAt: string;
|
|
106
94
|
readonly updatedAt: string;
|
|
107
95
|
}
|
|
108
|
-
export interface WorkflowRunTaskSnapshot {
|
|
109
|
-
readonly runId: string;
|
|
110
|
-
readonly ordinal: number;
|
|
111
|
-
readonly taskId: string;
|
|
112
|
-
readonly phase?: string;
|
|
113
|
-
readonly prompt: string;
|
|
114
|
-
readonly cacheKey: string;
|
|
115
|
-
readonly promptHash: string;
|
|
116
|
-
readonly agentManifestHash: string;
|
|
117
|
-
readonly agent: {
|
|
118
|
-
readonly plugin: string;
|
|
119
|
-
readonly name: string;
|
|
120
|
-
readonly description: string;
|
|
121
|
-
readonly sourceHash: string;
|
|
122
|
-
readonly manifestHash: string;
|
|
123
|
-
};
|
|
124
|
-
readonly worker?: {
|
|
125
|
-
readonly worker?: string;
|
|
126
|
-
readonly model?: string;
|
|
127
|
-
readonly profile?: string;
|
|
128
|
-
};
|
|
129
|
-
readonly outputSchema?: unknown;
|
|
130
|
-
readonly finishCriteria: ReadonlyArray<string>;
|
|
131
|
-
readonly createdAt: string;
|
|
132
|
-
}
|
|
133
96
|
export type WorkflowCacheBadge = "hit" | "miss" | "skipped" | "cached" | "fresh" | "write" | "mock" | `repair ${number}`;
|
|
134
97
|
export interface WorkflowMonitorTask extends WorkflowRunTaskCompactSummary {
|
|
135
98
|
readonly phase?: string;
|
|
@@ -179,6 +142,15 @@ export interface WorkflowRunRecord {
|
|
|
179
142
|
readonly heartbeatAt?: string;
|
|
180
143
|
}
|
|
181
144
|
export type WorkflowRunStatus = "running" | "completed" | "failed" | "escalated" | "unknown";
|
|
145
|
+
/**
|
|
146
|
+
* A run's persisted status can read "completed" while carrying isolated task failures: the
|
|
147
|
+
* dynamic runtime's fault-isolation contract (PQ-166) lets an author's `run` program finish
|
|
148
|
+
* successfully after recovering from a task that itself failed or escalated (e.g. via
|
|
149
|
+
* `Effect.either`). That is not a caller-visible success — a caller gating on `$?` (the CLI)
|
|
150
|
+
* must still see the partial failure. Success requires both: the run itself reached
|
|
151
|
+
* "completed", and every recorded task did too.
|
|
152
|
+
*/
|
|
153
|
+
export declare function isWorkflowRunOutcomeSuccessful(runStatus: WorkflowRunStatus, taskStatuses: ReadonlyArray<WorkflowRunTaskProgressStatus>): boolean;
|
|
182
154
|
export interface WorkflowEventRecord {
|
|
183
155
|
readonly sequence: number;
|
|
184
156
|
readonly runId: string;
|
|
@@ -187,18 +159,11 @@ export interface WorkflowEventRecord {
|
|
|
187
159
|
readonly payload: unknown;
|
|
188
160
|
readonly createdAt: string;
|
|
189
161
|
}
|
|
190
|
-
export declare const
|
|
191
|
-
export declare const
|
|
192
|
-
export declare const workflowRunTaskSnapshotForTask: (input: {
|
|
193
|
-
readonly runId: string;
|
|
194
|
-
readonly ordinal: number;
|
|
195
|
-
readonly workflow: string;
|
|
196
|
-
readonly task: AnyWorkflowTask;
|
|
197
|
-
readonly runtimeOptions?: WorkflowRuntimeOptions;
|
|
198
|
-
}) => Omit<WorkflowRunTaskSnapshot, "createdAt">;
|
|
162
|
+
export declare const projectWorkflowStoreDir: (prismHome: string, cwd?: string) => string;
|
|
163
|
+
export declare const defaultWorkflowStorePath: (prismHome: string, cwd?: string) => string;
|
|
199
164
|
export declare class WorkflowStore {
|
|
200
165
|
private readonly db;
|
|
201
|
-
constructor(db:
|
|
166
|
+
constructor(db: WorkflowDatabase);
|
|
202
167
|
static open(path: string): Promise<WorkflowStore>;
|
|
203
168
|
close(): void;
|
|
204
169
|
getCompleted(identity: WorkflowTaskIdentity, options?: {
|
|
@@ -4,7 +4,8 @@ export declare const WORKFLOW_WORKER_JSON_INSTRUCTION_SOURCE = "workflow-worker-
|
|
|
4
4
|
export declare class WorkflowOutputParseError extends Error {
|
|
5
5
|
readonly name = "WorkflowOutputParseError";
|
|
6
6
|
readonly rawText?: string;
|
|
7
|
-
|
|
7
|
+
readonly metadata?: Record<string, unknown>;
|
|
8
|
+
constructor(message: string, rawText?: string, metadata?: Record<string, unknown>);
|
|
8
9
|
}
|
|
9
10
|
export declare const workflowWorkerJsonInstruction: (task: AnyWorkflowTask) => string;
|
|
10
11
|
export declare const parseWorkflowWorkerJsonOutput: (text: string) => unknown;
|
package/types/workflows.d.ts
CHANGED
|
@@ -42,6 +42,20 @@ export interface WorkflowAgentRef {
|
|
|
42
42
|
readonly model?: WorkflowModelRef;
|
|
43
43
|
readonly installs: ReadonlyArray<string>;
|
|
44
44
|
}
|
|
45
|
+
export interface WorkflowTaskSummary {
|
|
46
|
+
readonly id: string;
|
|
47
|
+
readonly agent: {
|
|
48
|
+
readonly plugin: string;
|
|
49
|
+
readonly name: string;
|
|
50
|
+
};
|
|
51
|
+
readonly cacheKey?: string;
|
|
52
|
+
}
|
|
53
|
+
export interface WorkflowValidationSummary {
|
|
54
|
+
readonly path: string;
|
|
55
|
+
readonly name: string;
|
|
56
|
+
readonly tasks: ReadonlyArray<WorkflowTaskSummary>;
|
|
57
|
+
readonly dynamic: boolean;
|
|
58
|
+
}
|
|
45
59
|
export type WorkflowOutputSchema = Schema.Schema.AnyNoContext;
|
|
46
60
|
export type WorkflowFinishCriterionError = Error;
|
|
47
61
|
export type WorkflowWorkerId = "amp-code" | "antigravity-cli" | "claude-code" | "codex-cli" | "grok" | "hermes" | "kimi-code" | "opencode";
|
|
@@ -68,6 +82,15 @@ export type WorkflowResolvedModelTarget = Readonly<Record<string, WorkflowResolv
|
|
|
68
82
|
export declare class WorkflowModelResolutionError extends Error {
|
|
69
83
|
readonly name = "WorkflowModelResolutionError";
|
|
70
84
|
}
|
|
85
|
+
export type WorkflowTaskModelResolutionSource = "task" | "profile" | "default" | "cli-fallback";
|
|
86
|
+
export interface WorkflowTaskModelResolution {
|
|
87
|
+
readonly model: string;
|
|
88
|
+
readonly source: WorkflowTaskModelResolutionSource;
|
|
89
|
+
}
|
|
90
|
+
export declare const resolveWorkflowTaskModelResolution: (task: AnyWorkflowTask, options?: {
|
|
91
|
+
readonly worker?: string;
|
|
92
|
+
readonly fallbackModel?: string;
|
|
93
|
+
}) => WorkflowTaskModelResolution | undefined;
|
|
71
94
|
export declare const resolveWorkflowTaskModel: (task: AnyWorkflowTask, options?: {
|
|
72
95
|
readonly worker?: string;
|
|
73
96
|
readonly fallbackModel?: string;
|
|
@@ -145,6 +168,8 @@ export interface WorkflowTask<Id extends string = string, Agent extends Workflow
|
|
|
145
168
|
}
|
|
146
169
|
export type AnyWorkflowTask = WorkflowTask<string, WorkflowAgentRef, WorkflowOutputSchema>;
|
|
147
170
|
export type WorkflowTaskOutput<Task extends AnyWorkflowTask> = Schema.Schema.Type<Task["output"]>;
|
|
171
|
+
export declare const isWorkflowAgentRef: (value: unknown) => value is WorkflowAgentRef;
|
|
172
|
+
export declare const isWorkflowTask: (value: unknown) => value is AnyWorkflowTask;
|
|
148
173
|
export interface WorkflowDefinition<Name extends string, Tasks extends ReadonlyArray<AnyWorkflowTask>> {
|
|
149
174
|
readonly kind: "workflow";
|
|
150
175
|
readonly name: Name;
|
|
@@ -165,6 +190,8 @@ export interface DynamicWorkflowDefinition<Name extends string, Result = unknown
|
|
|
165
190
|
readonly run: (runtime: WorkflowRuntime) => Effect.Effect<Result, Err, never>;
|
|
166
191
|
}
|
|
167
192
|
export type AnyWorkflowDefinition = WorkflowDefinition<string, ReadonlyArray<AnyWorkflowTask>> | DynamicWorkflowDefinition<string>;
|
|
193
|
+
export declare const isWorkflowDefinition: (value: unknown) => value is AnyWorkflowDefinition;
|
|
194
|
+
export declare const workflowSummary: (path: string, workflow: AnyWorkflowDefinition) => WorkflowValidationSummary;
|
|
168
195
|
export declare const defineTask: <const Id extends string, const Agent extends WorkflowAgentRef, const Output extends WorkflowOutputSchema>(definition: WorkflowTaskDefinition<Id, Agent, Output>) => WorkflowTask<Id, Agent, Output>;
|
|
169
196
|
export declare function defineWorkflow<const Name extends string, const Tasks extends ReadonlyArray<AnyWorkflowTask>>(definition: {
|
|
170
197
|
readonly name: Name;
|
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
import { Effect } from "effect";
|
|
2
|
-
/**
|
|
3
|
-
* Minimal in-memory authoring runtime that stubs the `prism` module for
|
|
4
|
-
* plugin source files. It provides the typed-ref helpers and definition
|
|
5
|
-
* builders used by `.agent.ts`, `.orbit.ts`, `.trait.ts`, `.tool.ts`,
|
|
6
|
-
* `.toolspace.ts`, `.modelspace.ts`, `.skillspace.ts`, and `.hook.ts` files.
|
|
7
|
-
*
|
|
8
|
-
* The real semantic validation happens later in the compiler; this runtime
|
|
9
|
-
* only needs to return plain data structures so that source modules can be
|
|
10
|
-
* imported/bundled without resolving the full `prism` package.
|
|
11
|
-
*/
|
|
12
|
-
export declare const AUTHORING_RUNTIME_JS = "\nconst withNamedRef = (kind, first, second) =>\n second === undefined ? { kind, name: first } : { kind, plugin: first, name: second };\n\nexport const traitRef = (first, second) => withNamedRef(\"trait-ref\", first, second);\nexport const agentRef = (first, second) => withNamedRef(\"agent-ref\", first, second);\nexport const orbitRef = (first, second) => withNamedRef(\"orbit-ref\", first, second);\n\nexport const toolRef = (first, second, third) =>\n third === undefined\n ? { kind: \"tool-ref\", toolspace: first, name: second }\n : { kind: \"tool-ref\", plugin: first, toolspace: second, name: third };\n\nexport const toolGroupRef = (first, second, third) =>\n third === undefined\n ? { kind: \"tool-group-ref\", toolspace: first, name: second }\n : { kind: \"tool-group-ref\", plugin: first, toolspace: second, name: third };\n\nexport const modelProfileRef = (first, second, third) =>\n third === undefined\n ? { kind: \"model-profile-ref\", modelspace: first, name: second }\n : { kind: \"model-profile-ref\", plugin: first, modelspace: second, name: third };\n\nexport const skillRef = (first, second) => withNamedRef(\"skill-ref\", first, second);\n\nexport const skillspaceRef = (first, second, third) =>\n third === undefined\n ? { kind: \"skillspace-ref\", skillspace: first, name: second }\n : { kind: \"skillspace-ref\", plugin: first, skillspace: second, name: third };\n\nexport const schemaSlot = (options = {}) => ({ kind: \"schema\", ...options });\nexport const bindTrait = (trait, options = {}) => ({\n kind: \"trait-binding\",\n trait,\n ...(options.tools ? { tools: options.tools } : {}),\n});\n\nexport const defineAgent = (agent) => agent;\nexport const defineTrait = (trait) => trait;\nexport const defineOrbit = (orbit) => orbit;\nexport const defineTool = (tool) => tool;\nexport const defineToolspace = (toolspace) => toolspace;\nexport const defineModelspace = (modelspace) => modelspace;\nexport const defineSkillspace = (skillspace) => skillspace;\nexport const defineHook = (hook) => hook;\n\nexport const hookEvent = {\n toolBefore: \"tool.before\",\n toolAfter: \"tool.after\",\n promptSubmit: \"prompt.submit\",\n permissionRequest: \"permission.request\",\n sessionStart: \"session.start\",\n sessionEnd: \"session.end\",\n};\n\nexport const hookTool = {\n any: () => ({ kind: \"hook-any-tool\" }),\n tool: (tool) => ({ kind: \"hook-toolspace-tool\", tool }),\n group: (group) => ({ kind: \"hook-toolspace-group\", group }),\n canonical: (ref) => ({ kind: \"hook-canonical-tool\", ref }),\n};\n\nexport const hookMatcher = {\n tool: hookTool,\n};\n";
|
|
13
|
-
declare class AuthoringRuntimeWriteError {
|
|
14
|
-
readonly cause: unknown;
|
|
15
|
-
readonly _tag = "AuthoringRuntimeWriteError";
|
|
16
|
-
constructor(cause: unknown);
|
|
17
|
-
}
|
|
18
|
-
/**
|
|
19
|
-
* Return a file path to a persisted copy of the authoring runtime. The file
|
|
20
|
-
* is written once per process and reused across plugin compiles.
|
|
21
|
-
*/
|
|
22
|
-
export declare const getAuthoringRuntimePath: () => Effect.Effect<string, AuthoringRuntimeWriteError, never>;
|
|
23
|
-
/**
|
|
24
|
-
* For tests that need to clean up the machine-global temp runtime file.
|
|
25
|
-
*/
|
|
26
|
-
export declare const getAuthoringRuntimeDir: () => string | undefined;
|
|
27
|
-
export {};
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
export declare const NODE_BUILTIN_EXTERNALS: string[];
|
|
2
|
-
export declare const BARE_IMPORT_PATTERN: RegExp;
|
|
3
|
-
export declare const RELATIVE_IMPORT_PATTERN: RegExp;
|
|
4
|
-
export declare const collectRelativeImportSpecifiers: (source: string) => string[];
|
|
5
|
-
export declare const packageNameFromSpecifier: (specifier: string) => string;
|
|
6
|
-
export declare const relativeModulePath: (fromFile: string, toFileWithoutExtension: string) => string;
|
|
7
|
-
export declare const resolveImportedSourcePath: (sourcePath: string, source: string) => string;
|
|
8
|
-
export declare const stripToolAuthoringHelpers: (source: string) => string;
|
|
9
|
-
export declare const rewriteGeneratedPluginBundleImports: (source: string, currentGeneratedPath: string) => string;
|
|
10
|
-
export declare const resolveTsImportCandidate: (absoluteWithoutQuery: string, fileExists: (path: string) => Promise<boolean>) => Promise<string | undefined>;
|
|
11
|
-
export declare const rewriteBareImportsForBundle: (source: string, replacements: ReadonlyMap<string, string>) => string;
|
|
12
|
-
export declare const rewriteBareEffectImportsForBundle: (source: string) => string;
|
|
13
|
-
export declare const rewriteBarePluginDependencyImportsForBundle: (options: {
|
|
14
|
-
readonly source: string;
|
|
15
|
-
readonly pluginRoot?: string;
|
|
16
|
-
}) => Promise<string>;
|