@principles/core 1.87.0 → 1.88.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/runtime-v2/__tests__/scribe-runner-vslice.test.js +425 -2
- package/dist/runtime-v2/__tests__/scribe-runner-vslice.test.js.map +1 -1
- package/dist/runtime-v2/internalization/scribe-output.d.ts +8 -2
- package/dist/runtime-v2/internalization/scribe-output.d.ts.map +1 -1
- package/dist/runtime-v2/internalization/scribe-output.js +33 -17
- package/dist/runtime-v2/internalization/scribe-output.js.map +1 -1
- package/dist/runtime-v2/internalization/scribe-runner.d.ts +56 -49
- package/dist/runtime-v2/internalization/scribe-runner.d.ts.map +1 -1
- package/dist/runtime-v2/internalization/scribe-runner.js +116 -398
- package/dist/runtime-v2/internalization/scribe-runner.js.map +1 -1
- package/dist/runtime-v2/runner/__tests__/base-peer-runner-trust-boundary.test.js +119 -0
- package/dist/runtime-v2/runner/__tests__/base-peer-runner-trust-boundary.test.js.map +1 -1
- package/dist/runtime-v2/runner/base-peer-runner.d.ts +1 -1
- package/dist/runtime-v2/runner/base-peer-runner.d.ts.map +1 -1
- package/dist/runtime-v2/runner/base-peer-runner.js +8 -0
- package/dist/runtime-v2/runner/base-peer-runner.js.map +1 -1
- package/package.json +1 -1
|
@@ -66,9 +66,15 @@ export interface ScribeValidationResult {
|
|
|
66
66
|
readonly errorCategory?: string;
|
|
67
67
|
}
|
|
68
68
|
export interface ScribeValidator {
|
|
69
|
-
|
|
69
|
+
/**
|
|
70
|
+
* Validate untrusted LLM/runtime output.
|
|
71
|
+
*
|
|
72
|
+
* Receives `unknown` — must perform runtime validation before
|
|
73
|
+
* treating as ScribeOutputV1 (ERR-001, ERR-005).
|
|
74
|
+
*/
|
|
75
|
+
validate(output: unknown, taskId: string, expectedSourcePhilosopherArtifactId?: string): Promise<ScribeValidationResult>;
|
|
70
76
|
}
|
|
71
77
|
export declare class DefaultScribeValidator implements ScribeValidator {
|
|
72
|
-
validate(output:
|
|
78
|
+
validate(output: unknown, taskId: string, expectedSourcePhilosopherArtifactId?: string): Promise<ScribeValidationResult>;
|
|
73
79
|
}
|
|
74
80
|
//# sourceMappingURL=scribe-output.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scribe-output.d.ts","sourceRoot":"","sources":["../../../src/runtime-v2/internalization/scribe-output.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAQ,KAAK,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAEtD,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,aAAa,EAAE,SAAS,MAAM,EAAE,CAAC;IAC1C,QAAQ,CAAC,YAAY,EAAE,SAAS,MAAM,EAAE,CAAC;IACzC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;CAC7B;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,iBAAiB,CAAC,EAAE,MAAM,CAAC;IACpC,QAAQ,CAAC,qBAAqB,EAAE,MAAM,CAAC;CACxC;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,2BAA2B,EAAE,MAAM,CAAC;IAC7C,QAAQ,CAAC,cAAc,EAAE,oBAAoB,CAAC;IAC9C,QAAQ,CAAC,WAAW,EAAE,iBAAiB,CAAC;IACxC,QAAQ,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;IAClC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;CAC9B;AAED,eAAO,MAAM,0BAA0B;;;;;;;EAOrC,CAAC;AAEH,eAAO,MAAM,uBAAuB;;;EAGlC,CAAC;AAEH,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;;;EAO/B,CAAC;AAEH,MAAM,MAAM,gBAAgB,GAAG,MAAM,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAEnE,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;IACxB,QAAQ,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC;IACnC,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;CACjC;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,MAAM,EAAE,
|
|
1
|
+
{"version":3,"file":"scribe-output.d.ts","sourceRoot":"","sources":["../../../src/runtime-v2/internalization/scribe-output.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAQ,KAAK,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAEtD,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,aAAa,EAAE,SAAS,MAAM,EAAE,CAAC;IAC1C,QAAQ,CAAC,YAAY,EAAE,SAAS,MAAM,EAAE,CAAC;IACzC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;CAC7B;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,iBAAiB,CAAC,EAAE,MAAM,CAAC;IACpC,QAAQ,CAAC,qBAAqB,EAAE,MAAM,CAAC;CACxC;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,2BAA2B,EAAE,MAAM,CAAC;IAC7C,QAAQ,CAAC,cAAc,EAAE,oBAAoB,CAAC;IAC9C,QAAQ,CAAC,WAAW,EAAE,iBAAiB,CAAC;IACxC,QAAQ,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;IAClC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;CAC9B;AAED,eAAO,MAAM,0BAA0B;;;;;;;EAOrC,CAAC;AAEH,eAAO,MAAM,uBAAuB;;;EAGlC,CAAC;AAEH,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;;;EAO/B,CAAC;AAEH,MAAM,MAAM,gBAAgB,GAAG,MAAM,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAEnE,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;IACxB,QAAQ,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC;IACnC,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;CACjC;AAED,MAAM,WAAW,eAAe;IAC9B;;;;;OAKG;IACH,QAAQ,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,mCAAmC,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,sBAAsB,CAAC,CAAC;CAC1H;AAOD,qBAAa,sBAAuB,YAAW,eAAe;IAEtD,QAAQ,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,mCAAmC,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,sBAAsB,CAAC;CAqE/H"}
|
|
@@ -29,65 +29,81 @@ export const ScribeOutputV1Schema = Type.Object({
|
|
|
29
29
|
risks: Type.Array(Type.String()),
|
|
30
30
|
generatedAt: Type.String({ minLength: 1 }),
|
|
31
31
|
});
|
|
32
|
+
/** Runtime type guard: true if v is a non-null plain object (not an array). */
|
|
33
|
+
function isRecord(v) {
|
|
34
|
+
return v !== null && typeof v === 'object' && !Array.isArray(v);
|
|
35
|
+
}
|
|
32
36
|
export class DefaultScribeValidator {
|
|
33
37
|
// eslint-disable-next-line @typescript-eslint/class-methods-use-this
|
|
34
38
|
async validate(output, taskId, expectedSourcePhilosopherArtifactId) {
|
|
35
39
|
const errors = [];
|
|
36
|
-
if (
|
|
40
|
+
if (!isRecord(output)) {
|
|
37
41
|
return { valid: false, errors: ['Output is not an object'], errorCategory: 'output_invalid' };
|
|
38
42
|
}
|
|
39
|
-
|
|
43
|
+
// taskId — required field (ERR-013: use Object.hasOwn)
|
|
44
|
+
if (!Object.hasOwn(output, 'taskId') || output.taskId !== taskId) {
|
|
40
45
|
errors.push(`taskId mismatch: expected ${taskId}, got ${String(output.taskId)}`);
|
|
41
46
|
}
|
|
42
|
-
|
|
47
|
+
// sourcePhilosopherArtifactId — required, non-empty string (ERR-013)
|
|
48
|
+
if (!Object.hasOwn(output, 'sourcePhilosopherArtifactId') || typeof output.sourcePhilosopherArtifactId !== 'string' || output.sourcePhilosopherArtifactId.trim() === '') {
|
|
43
49
|
errors.push('sourcePhilosopherArtifactId must be non-empty string');
|
|
44
50
|
}
|
|
45
51
|
else if (expectedSourcePhilosopherArtifactId && output.sourcePhilosopherArtifactId !== expectedSourcePhilosopherArtifactId) {
|
|
46
52
|
errors.push(`sourcePhilosopherArtifactId mismatch: expected ${expectedSourcePhilosopherArtifactId}, got ${output.sourcePhilosopherArtifactId}`);
|
|
47
53
|
}
|
|
48
|
-
|
|
54
|
+
// principleDraft — required nested object (ERR-001, ERR-005: use isRecord, not as)
|
|
55
|
+
if (!Object.hasOwn(output, 'principleDraft') || !isRecord(output.principleDraft)) {
|
|
49
56
|
errors.push('principleDraft must be an object');
|
|
50
57
|
}
|
|
51
58
|
else {
|
|
52
59
|
const pd = output.principleDraft;
|
|
53
|
-
if (typeof pd.title !== 'string' ||
|
|
60
|
+
if (!Object.hasOwn(pd, 'title') || typeof pd.title !== 'string' || pd.title.trim() === '')
|
|
54
61
|
errors.push('principleDraft.title must be non-empty string');
|
|
55
|
-
if (typeof pd.statement !== 'string' ||
|
|
62
|
+
if (!Object.hasOwn(pd, 'statement') || typeof pd.statement !== 'string' || pd.statement.trim() === '')
|
|
56
63
|
errors.push('principleDraft.statement must be non-empty string');
|
|
57
|
-
if (typeof pd.rationale !== 'string' ||
|
|
64
|
+
if (!Object.hasOwn(pd, 'rationale') || typeof pd.rationale !== 'string' || pd.rationale.trim() === '')
|
|
58
65
|
errors.push('principleDraft.rationale must be non-empty string');
|
|
59
|
-
if (!Array.isArray(pd.applicability))
|
|
66
|
+
if (!Object.hasOwn(pd, 'applicability') || !Array.isArray(pd.applicability))
|
|
60
67
|
errors.push('principleDraft.applicability must be an array');
|
|
61
|
-
else if (!pd.applicability.every(e => typeof e === 'string'))
|
|
68
|
+
else if (!pd.applicability.every((e) => typeof e === 'string'))
|
|
62
69
|
errors.push('principleDraft.applicability must be an array of strings');
|
|
63
|
-
if (!Array.isArray(pd.antiPatterns))
|
|
70
|
+
if (!Object.hasOwn(pd, 'antiPatterns') || !Array.isArray(pd.antiPatterns))
|
|
64
71
|
errors.push('principleDraft.antiPatterns must be an array');
|
|
65
|
-
else if (!pd.antiPatterns.every(e => typeof e === 'string'))
|
|
72
|
+
else if (!pd.antiPatterns.every((e) => typeof e === 'string'))
|
|
66
73
|
errors.push('principleDraft.antiPatterns must be an array of strings');
|
|
67
|
-
if (typeof pd.confidence !== 'number')
|
|
74
|
+
if (!Object.hasOwn(pd, 'confidence') || typeof pd.confidence !== 'number')
|
|
68
75
|
errors.push('principleDraft.confidence must be number');
|
|
69
76
|
else if (pd.confidence < 0 || pd.confidence > 1)
|
|
70
77
|
errors.push('principleDraft.confidence must be in [0, 1]');
|
|
71
78
|
}
|
|
72
|
-
|
|
79
|
+
// sourceTrace — required nested object (ERR-001, ERR-005: use isRecord, not as)
|
|
80
|
+
if (!Object.hasOwn(output, 'sourceTrace') || !isRecord(output.sourceTrace)) {
|
|
73
81
|
errors.push('sourceTrace must be an object');
|
|
74
82
|
}
|
|
75
83
|
else {
|
|
76
84
|
const st = output.sourceTrace;
|
|
77
|
-
if (typeof st.philosopherArtifactId !== 'string' ||
|
|
85
|
+
if (!Object.hasOwn(st, 'philosopherArtifactId') || typeof st.philosopherArtifactId !== 'string' || st.philosopherArtifactId.trim() === '') {
|
|
78
86
|
errors.push('sourceTrace.philosopherArtifactId must be non-empty string');
|
|
79
87
|
}
|
|
80
88
|
else if (expectedSourcePhilosopherArtifactId && st.philosopherArtifactId !== expectedSourcePhilosopherArtifactId) {
|
|
81
89
|
errors.push(`sourceTrace.philosopherArtifactId mismatch: expected ${expectedSourcePhilosopherArtifactId}, got ${st.philosopherArtifactId}`);
|
|
82
90
|
}
|
|
91
|
+
// dreamerArtifactId — optional, but if present must be non-empty string
|
|
92
|
+
if (Object.hasOwn(st, 'dreamerArtifactId') && st.dreamerArtifactId !== undefined) {
|
|
93
|
+
if (typeof st.dreamerArtifactId !== 'string' || st.dreamerArtifactId.trim() === '') {
|
|
94
|
+
errors.push('sourceTrace.dreamerArtifactId must be non-empty string when present');
|
|
95
|
+
}
|
|
96
|
+
}
|
|
83
97
|
}
|
|
84
|
-
|
|
98
|
+
// risks — required array of strings (ERR-005: validate element types)
|
|
99
|
+
if (!Object.hasOwn(output, 'risks') || !Array.isArray(output.risks)) {
|
|
85
100
|
errors.push('risks must be an array');
|
|
86
101
|
}
|
|
87
|
-
else if (!output.risks.every(e => typeof e === 'string')) {
|
|
102
|
+
else if (!output.risks.every((e) => typeof e === 'string')) {
|
|
88
103
|
errors.push('risks must be an array of strings');
|
|
89
104
|
}
|
|
90
|
-
|
|
105
|
+
// generatedAt — required, non-empty string (ERR-013)
|
|
106
|
+
if (!Object.hasOwn(output, 'generatedAt') || typeof output.generatedAt !== 'string' || output.generatedAt.trim() === '') {
|
|
91
107
|
errors.push('generatedAt must be non-empty string');
|
|
92
108
|
}
|
|
93
109
|
return errors.length > 0
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scribe-output.js","sourceRoot":"","sources":["../../../src/runtime-v2/internalization/scribe-output.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,IAAI,EAAe,MAAM,mBAAmB,CAAC;AAyBtD,MAAM,CAAC,MAAM,0BAA0B,GAAG,IAAI,CAAC,MAAM,CAAC;IACpD,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC;IACpC,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC;IACxC,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC;IACxC,aAAa,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;IACxC,YAAY,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;IACvC,UAAU,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC;CACpD,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,uBAAuB,GAAG,IAAI,CAAC,MAAM,CAAC;IACjD,iBAAiB,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;IAC/C,qBAAqB,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC;CACrD,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,oBAAoB,GAAG,IAAI,CAAC,MAAM,CAAC;IAC9C,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC;IACrC,2BAA2B,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC;IAC1D,cAAc,EAAE,0BAA0B;IAC1C,WAAW,EAAE,uBAAuB;IACpC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;IAChC,WAAW,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC;CAC3C,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"scribe-output.js","sourceRoot":"","sources":["../../../src/runtime-v2/internalization/scribe-output.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,10 +1,42 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
1
|
+
/**
|
|
2
|
+
* ScribeRunner — Third peer runner for the Internalization Engine (PRI-109).
|
|
3
|
+
*
|
|
4
|
+
* Migrated to extend BasePeerRunner (PRI-302). The shared lease → buildContext →
|
|
5
|
+
* invoke → poll → fetch → validate → succeed/fail pipeline is now in the base
|
|
6
|
+
* class. This file only contains Scribe-specific logic.
|
|
7
|
+
*
|
|
8
|
+
* Key constraints (ADR-0003):
|
|
9
|
+
* - Uses PDRuntimeAdapter for all LLM execution (no direct SDK calls)
|
|
10
|
+
* - Does NOT directly invoke Artificer (host layer enqueues next task)
|
|
11
|
+
* - No plugin-layer imports (core is infrastructure-agnostic)
|
|
12
|
+
* - No timer-based scheduling (sleep via setTimeout is polling-only)
|
|
13
|
+
* - Uses RuntimeStateManager for all state operations
|
|
14
|
+
*
|
|
15
|
+
* Pipeline:
|
|
16
|
+
* 1. acquireLease — isolated try/catch, lease_conflict is non-mutating
|
|
17
|
+
* 2. resolve Philosopher dependency from dependencyTaskIds
|
|
18
|
+
* 3. fetch Philosopher artifact via PIArtifactStore
|
|
19
|
+
* 4. startRun with outputSchemaRef: 'scribe-output-v1'
|
|
20
|
+
* 5. pollUntilTerminal
|
|
21
|
+
* 6. fetchOutput → validate as unknown → cast to ScribeOutputV1
|
|
22
|
+
* 7. updateRunOutput → persist serialized output
|
|
23
|
+
* 8. write PIArtifact → markTaskSucceeded with scribe:// resultRef
|
|
24
|
+
*
|
|
25
|
+
* @see docs/adr/0003-peer-agent-state-machine-orchestration.md
|
|
26
|
+
* @see BasePeerRunner in runner/base-peer-runner.ts
|
|
27
|
+
*/
|
|
28
|
+
import type { RunHandle } from '../runtime-protocol.js';
|
|
4
29
|
import type { ScribeOutputV1, ScribeValidator } from './scribe-output.js';
|
|
5
|
-
import type {
|
|
30
|
+
import type { TaskRecord } from '../task-status.js';
|
|
6
31
|
import { type PDErrorCategory } from '../error-categories.js';
|
|
7
|
-
import {
|
|
32
|
+
import { BasePeerRunner } from '../runner/base-peer-runner.js';
|
|
33
|
+
import type { PeerRunnerOptions, PeerRunnerDeps, PeerRunnerResult, PeerRunnerValidationResult } from '../runner/peer-runner-types.js';
|
|
34
|
+
/** Context built by ScribeRunner.buildContext() and consumed by invokeRuntime(). */
|
|
35
|
+
interface ScribeContext {
|
|
36
|
+
readonly contextHash: string;
|
|
37
|
+
readonly philosopherArtifact: string;
|
|
38
|
+
readonly sourcePhilosopherArtifactId: string;
|
|
39
|
+
}
|
|
8
40
|
export type ScribeRunnerResultStatus = 'succeeded' | 'failed' | 'retried';
|
|
9
41
|
export interface ScribeRunnerResult {
|
|
10
42
|
readonly status: ScribeRunnerResultStatus;
|
|
@@ -18,14 +50,7 @@ export interface ScribeRunnerResult {
|
|
|
18
50
|
readonly failureReason?: string;
|
|
19
51
|
readonly attemptCount: number;
|
|
20
52
|
}
|
|
21
|
-
export
|
|
22
|
-
readonly pollIntervalMs?: number;
|
|
23
|
-
readonly timeoutMs?: number;
|
|
24
|
-
readonly defaultMaxAttempts?: number;
|
|
25
|
-
readonly owner: string;
|
|
26
|
-
readonly runtimeKind: string;
|
|
27
|
-
readonly agentId?: string;
|
|
28
|
-
}
|
|
53
|
+
export type ScribeRunnerOptions = PeerRunnerOptions;
|
|
29
54
|
export interface ResolvedScribeRunnerOptions {
|
|
30
55
|
readonly pollIntervalMs: number;
|
|
31
56
|
readonly timeoutMs: number;
|
|
@@ -34,44 +59,26 @@ export interface ResolvedScribeRunnerOptions {
|
|
|
34
59
|
readonly runtimeKind: string;
|
|
35
60
|
readonly agentId: string;
|
|
36
61
|
}
|
|
37
|
-
declare const DEFAULT_SCRIBE_RUNNER_OPTIONS: Readonly<Omit<ResolvedScribeRunnerOptions, 'owner' | 'runtimeKind'>>;
|
|
38
|
-
declare function resolveScribeRunnerOptions(options: ScribeRunnerOptions): ResolvedScribeRunnerOptions;
|
|
39
|
-
export interface ScribeRunnerDeps {
|
|
40
|
-
readonly stateManager: RuntimeStateManager;
|
|
41
|
-
readonly runtimeAdapter: PDRuntimeAdapter;
|
|
42
|
-
readonly eventEmitter: StoreEventEmitter;
|
|
62
|
+
export declare const DEFAULT_SCRIBE_RUNNER_OPTIONS: Readonly<Omit<ResolvedScribeRunnerOptions, 'owner' | 'runtimeKind'>>;
|
|
63
|
+
export declare function resolveScribeRunnerOptions(options: ScribeRunnerOptions): ResolvedScribeRunnerOptions;
|
|
64
|
+
export interface ScribeRunnerDeps extends PeerRunnerDeps {
|
|
43
65
|
readonly validator: ScribeValidator;
|
|
44
|
-
readonly artifactStore: PIArtifactStore;
|
|
45
66
|
}
|
|
46
|
-
export declare class ScribeRunner {
|
|
47
|
-
private phase;
|
|
48
|
-
private readonly resolvedOptions;
|
|
49
|
-
private readonly stateManager;
|
|
50
|
-
private readonly runtimeAdapter;
|
|
51
|
-
private readonly eventEmitter;
|
|
67
|
+
export declare class ScribeRunner extends BasePeerRunner<ScribeContext, ScribeOutputV1> {
|
|
52
68
|
private readonly validator;
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
private handleValidationError;
|
|
67
|
-
private handleLeaseOrPhaseError;
|
|
68
|
-
private handlePostLeaseError;
|
|
69
|
-
private retryOrFail;
|
|
70
|
-
private readonly PERMANENT_ERROR_CATEGORIES;
|
|
71
|
-
private isPermanentError;
|
|
72
|
-
private classifyError;
|
|
73
|
-
private mapRunStatusToErrorCategory;
|
|
74
|
-
private sleep;
|
|
69
|
+
constructor(deps: ScribeRunnerDeps, options: PeerRunnerOptions);
|
|
70
|
+
get permanentErrorCategories(): ReadonlySet<PDErrorCategory>;
|
|
71
|
+
buildContext(taskId: string): Promise<ScribeContext>;
|
|
72
|
+
invokeRuntime(taskId: string, context: ScribeContext): Promise<RunHandle>;
|
|
73
|
+
validateOutput(output: unknown, taskId: string, context: ScribeContext): Promise<PeerRunnerValidationResult>;
|
|
74
|
+
succeedTask(taskId: string, runId: string, output: ScribeOutputV1, task: TaskRecord, contextHash: string, context: ScribeContext): Promise<PeerRunnerResult<ScribeOutputV1>>;
|
|
75
|
+
/**
|
|
76
|
+
* Re-inject taskId if stripped by stripLineageFields (PRI-272 / ERR-008).
|
|
77
|
+
* Only fill when absent via Object.hasOwn — present-but-falsy values
|
|
78
|
+
* must reach validation and fail loud (Runtime Contract Rule 3).
|
|
79
|
+
*/
|
|
80
|
+
protected postFetchTransform(taskId: string, untrustedOutput: unknown): void;
|
|
81
|
+
protected emitSuccessTelemetry(taskId: string, output: ScribeOutputV1): void;
|
|
75
82
|
}
|
|
76
|
-
export {
|
|
83
|
+
export {};
|
|
77
84
|
//# sourceMappingURL=scribe-runner.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scribe-runner.d.ts","sourceRoot":"","sources":["../../../src/runtime-v2/internalization/scribe-runner.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"scribe-runner.d.ts","sourceRoot":"","sources":["../../../src/runtime-v2/internalization/scribe-runner.ts"],"names":[],"mappings":"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"}
|