@principles/core 1.73.0 → 1.74.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/adapter/__tests__/schema-prompt-adapter.test.d.ts +2 -0
- package/dist/runtime-v2/adapter/__tests__/schema-prompt-adapter.test.d.ts.map +1 -0
- package/dist/runtime-v2/adapter/__tests__/schema-prompt-adapter.test.js +270 -0
- package/dist/runtime-v2/adapter/__tests__/schema-prompt-adapter.test.js.map +1 -0
- package/dist/runtime-v2/adapter/pi-ai-runtime-adapter.d.ts +1 -1
- package/dist/runtime-v2/adapter/pi-ai-runtime-adapter.d.ts.map +1 -1
- package/dist/runtime-v2/adapter/pi-ai-runtime-adapter.js +4 -3
- package/dist/runtime-v2/adapter/pi-ai-runtime-adapter.js.map +1 -1
- package/dist/runtime-v2/adapter/schema-prompt-adapter.d.ts +13 -0
- package/dist/runtime-v2/adapter/schema-prompt-adapter.d.ts.map +1 -0
- package/dist/runtime-v2/adapter/schema-prompt-adapter.js +266 -0
- package/dist/runtime-v2/adapter/schema-prompt-adapter.js.map +1 -0
- package/dist/runtime-v2/adapter/tools/diagnostician-tool.d.ts +3 -7
- package/dist/runtime-v2/adapter/tools/diagnostician-tool.d.ts.map +1 -1
- package/dist/runtime-v2/adapter/tools/diagnostician-tool.js +7 -19
- package/dist/runtime-v2/adapter/tools/diagnostician-tool.js.map +1 -1
- package/dist/runtime-v2/diagnostician/__tests__/diagnostician-prompt-builder.test.js +97 -15
- package/dist/runtime-v2/diagnostician/__tests__/diagnostician-prompt-builder.test.js.map +1 -1
- package/dist/runtime-v2/diagnostician-output.d.ts +0 -10
- package/dist/runtime-v2/diagnostician-output.d.ts.map +1 -1
- package/dist/runtime-v2/diagnostician-output.js +5 -10
- package/dist/runtime-v2/diagnostician-output.js.map +1 -1
- package/dist/runtime-v2/diagnostician-prompt-builder.d.ts +6 -1
- package/dist/runtime-v2/diagnostician-prompt-builder.d.ts.map +1 -1
- package/dist/runtime-v2/diagnostician-prompt-builder.js +23 -15
- package/dist/runtime-v2/diagnostician-prompt-builder.js.map +1 -1
- package/package.json +1 -1
- package/dist/runtime-v2/__tests__/nocturnal-compliance-trust-boundary.test.d.ts +0 -2
- package/dist/runtime-v2/__tests__/nocturnal-compliance-trust-boundary.test.d.ts.map +0 -1
- package/dist/runtime-v2/__tests__/nocturnal-compliance-trust-boundary.test.js +0 -215
- package/dist/runtime-v2/__tests__/nocturnal-compliance-trust-boundary.test.js.map +0 -1
- package/dist/runtime-v2/idle-trigger/__tests__/idle-trigger-config-resolve.test.d.ts +0 -2
- package/dist/runtime-v2/idle-trigger/__tests__/idle-trigger-config-resolve.test.d.ts.map +0 -1
- package/dist/runtime-v2/idle-trigger/__tests__/idle-trigger-config-resolve.test.js +0 -92
- package/dist/runtime-v2/idle-trigger/__tests__/idle-trigger-config-resolve.test.js.map +0 -1
- package/dist/runtime-v2/idle-trigger/__tests__/idle-trigger-decision.test.d.ts +0 -2
- package/dist/runtime-v2/idle-trigger/__tests__/idle-trigger-decision.test.d.ts.map +0 -1
- package/dist/runtime-v2/idle-trigger/__tests__/idle-trigger-decision.test.js +0 -134
- package/dist/runtime-v2/idle-trigger/__tests__/idle-trigger-decision.test.js.map +0 -1
- package/dist/runtime-v2/idle-trigger/__tests__/idle-trigger-edge-cases.test.d.ts +0 -2
- package/dist/runtime-v2/idle-trigger/__tests__/idle-trigger-edge-cases.test.d.ts.map +0 -1
- package/dist/runtime-v2/idle-trigger/__tests__/idle-trigger-edge-cases.test.js +0 -226
- package/dist/runtime-v2/idle-trigger/__tests__/idle-trigger-edge-cases.test.js.map +0 -1
- package/dist/runtime-v2/idle-trigger/idle-trigger-decision.d.ts +0 -3
- package/dist/runtime-v2/idle-trigger/idle-trigger-decision.d.ts.map +0 -1
- package/dist/runtime-v2/idle-trigger/idle-trigger-decision.js +0 -5
- package/dist/runtime-v2/idle-trigger/idle-trigger-decision.js.map +0 -1
- package/dist/runtime-v2/idle-trigger/idle-trigger-policy.d.ts +0 -4
- package/dist/runtime-v2/idle-trigger/idle-trigger-policy.d.ts.map +0 -1
- package/dist/runtime-v2/idle-trigger/idle-trigger-policy.js +0 -81
- package/dist/runtime-v2/idle-trigger/idle-trigger-policy.js.map +0 -1
- package/dist/runtime-v2/idle-trigger/idle-trigger-types.d.ts +0 -29
- package/dist/runtime-v2/idle-trigger/idle-trigger-types.d.ts.map +0 -1
- package/dist/runtime-v2/idle-trigger/idle-trigger-types.js +0 -15
- package/dist/runtime-v2/idle-trigger/idle-trigger-types.js.map +0 -1
- package/dist/runtime-v2/idle-trigger/index.d.ts +0 -5
- package/dist/runtime-v2/idle-trigger/index.d.ts.map +0 -1
- package/dist/runtime-v2/idle-trigger/index.js +0 -4
- package/dist/runtime-v2/idle-trigger/index.js.map +0 -1
- package/dist/runtime-v2/nocturnal/candidate-scoring.d.ts +0 -486
- package/dist/runtime-v2/nocturnal/candidate-scoring.d.ts.map +0 -1
- package/dist/runtime-v2/nocturnal/candidate-scoring.js +0 -493
- package/dist/runtime-v2/nocturnal/candidate-scoring.js.map +0 -1
- package/dist/runtime-v2/nocturnal/index.d.ts +0 -9
- package/dist/runtime-v2/nocturnal/index.d.ts.map +0 -1
- package/dist/runtime-v2/nocturnal/index.js +0 -5
- package/dist/runtime-v2/nocturnal/index.js.map +0 -1
- package/dist/runtime-v2/nocturnal/nocturnal-compliance.d.ts +0 -185
- package/dist/runtime-v2/nocturnal/nocturnal-compliance.d.ts.map +0 -1
- package/dist/runtime-v2/nocturnal/nocturnal-compliance.js +0 -912
- package/dist/runtime-v2/nocturnal/nocturnal-compliance.js.map +0 -1
- package/dist/runtime-v2/nocturnal/snapshot-contract.d.ts +0 -192
- package/dist/runtime-v2/nocturnal/snapshot-contract.d.ts.map +0 -1
- package/dist/runtime-v2/nocturnal/snapshot-contract.js +0 -185
- package/dist/runtime-v2/nocturnal/snapshot-contract.js.map +0 -1
- package/dist/runtime-v2/nocturnal/trinity-types.d.ts +0 -421
- package/dist/runtime-v2/nocturnal/trinity-types.d.ts.map +0 -1
- package/dist/runtime-v2/nocturnal/trinity-types.js +0 -182
- package/dist/runtime-v2/nocturnal/trinity-types.js.map +0 -1
|
@@ -28,24 +28,19 @@ export const RecommendationKindSchema = Type.Union([
|
|
|
28
28
|
export const DiagnosticianRecommendationSchema = Type.Object({
|
|
29
29
|
kind: RecommendationKindSchema,
|
|
30
30
|
description: Type.String({ minLength: 1 }),
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
action: Type.Optional(Type.String()),
|
|
35
|
-
/** Highly abstracted principle (≤200 chars) — required when kind is 'principle'
|
|
36
|
-
* @see MAX_ABSTRACTED_PRINCIPLE_CHARS in runner/default-validator.ts
|
|
37
|
-
*/
|
|
38
|
-
abstractedPrinciple: Type.Optional(Type.String()),
|
|
31
|
+
triggerPattern: Type.Optional(Type.String({ description: 'Required when kind is "rule". Regex or keyword pattern for interception.' })),
|
|
32
|
+
action: Type.Optional(Type.String({ description: 'Required when kind is "rule". Action to take when pattern matches.' })),
|
|
33
|
+
abstractedPrinciple: Type.Optional(Type.String({ description: 'Required when kind is "principle". Highly abstracted, reusable wisdom (≤200 chars).' })),
|
|
39
34
|
});
|
|
40
35
|
export const DiagnosticianOutputV1Schema = Type.Object({
|
|
41
36
|
valid: Type.Boolean(),
|
|
42
37
|
diagnosisId: Type.String({ minLength: 1 }),
|
|
43
38
|
summary: Type.String({ minLength: 1 }),
|
|
44
|
-
rootCause: Type.String({ minLength: 1 }),
|
|
39
|
+
rootCause: Type.String({ minLength: 1, description: 'MUST include category prefix: "Design: ..." or "People: ..." or "Assumption: ..." or "Tooling: ..."' }),
|
|
45
40
|
violatedPrinciples: Type.Array(DiagnosticianViolatedPrincipleSchema),
|
|
46
41
|
evidence: Type.Array(DiagnosticianEvidenceSchema),
|
|
47
42
|
recommendations: Type.Array(DiagnosticianRecommendationSchema),
|
|
48
|
-
confidence: Type.Number({ minimum: 0, maximum: 1 }),
|
|
43
|
+
confidence: Type.Number({ minimum: 0, maximum: 1, description: 'A number between 0.0 and 1.0 (NOT a string, NOT a percentage)' }),
|
|
49
44
|
ambiguityNotes: Type.Optional(Type.Array(Type.String())),
|
|
50
45
|
});
|
|
51
46
|
// ── Diagnostician Invocation Input ──
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"diagnostician-output.js","sourceRoot":"","sources":["../../src/runtime-v2/diagnostician-output.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,EAAE,IAAI,EAAe,MAAM,mBAAmB,CAAC;AAGtD,gCAAgC;AAEhC,MAAM,CAAC,MAAM,oCAAoC,GAAG,IAAI,CAAC,MAAM,CAAC;IAC9D,WAAW,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC,CAAC;IACzD,KAAK,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;IACnC,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC;CACzC,CAAC,CAAC;AAIH,MAAM,CAAC,MAAM,2BAA2B,GAAG,IAAI,CAAC,MAAM,CAAC;IACrD,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC;IACxC,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC;CACpC,CAAC,CAAC;AAIH,MAAM,CAAC,MAAM,wBAAwB,GAAG,IAAI,CAAC,KAAK,CAAC;IACjD,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC;IACzB,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC;IACpB,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC;IAC9B,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC;IACtB,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC;CACtB,CAAC,CAAC;AAIH,MAAM,CAAC,MAAM,iCAAiC,GAAG,IAAI,CAAC,MAAM,CAAC;IAC3D,IAAI,EAAE,wBAAwB;IAC9B,WAAW,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC;IAC1C,
|
|
1
|
+
{"version":3,"file":"diagnostician-output.js","sourceRoot":"","sources":["../../src/runtime-v2/diagnostician-output.ts"],"names":[],"mappings":"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"}
|
|
@@ -28,6 +28,8 @@
|
|
|
28
28
|
* - DPB-05: LLM only analyzes — PD database commits are handled by caller code
|
|
29
29
|
*/
|
|
30
30
|
import type { DiagnosticianContextPayload, HistoryQueryEntry, DiagnosisTarget } from './context-payload.js';
|
|
31
|
+
import type { TSchema } from '@sinclair/typebox';
|
|
32
|
+
import type { SchemaPromptAdapter } from './adapter/schema-prompt-adapter.js';
|
|
31
33
|
/**
|
|
32
34
|
* PromptInput — the JSON message sent to openclaw agent via --message flag.
|
|
33
35
|
*
|
|
@@ -97,7 +99,7 @@ export interface PromptBuildResult {
|
|
|
97
99
|
* The 5-phase protocol is embedded directly in the prompt so the LLM follows it
|
|
98
100
|
* regardless of whether OpenClaw loads SKILL.md as the agent system prompt.
|
|
99
101
|
*/
|
|
100
|
-
export declare
|
|
102
|
+
export declare function buildDiagnosticProtocolInstruction(adapter?: SchemaPromptAdapter, schema?: TSchema): string;
|
|
101
103
|
/**
|
|
102
104
|
* Summarizes a conversation window for inclusion in the prompt.
|
|
103
105
|
* DPB-04: Prompt includes conversationWindow summary.
|
|
@@ -107,6 +109,9 @@ export declare const DIAGNOSTIC_PROTOCOL_INSTRUCTION = "You are a root cause ana
|
|
|
107
109
|
*/
|
|
108
110
|
export declare function summarizeConversationWindow(entries: HistoryQueryEntry[]): HistoryQueryEntry[];
|
|
109
111
|
export declare class DiagnosticianPromptBuilder {
|
|
112
|
+
private readonly adapter;
|
|
113
|
+
private readonly schema;
|
|
114
|
+
constructor(adapter?: SchemaPromptAdapter, schema?: TSchema);
|
|
110
115
|
/**
|
|
111
116
|
* Transform DiagnosticianContextPayload into a PromptInput object,
|
|
112
117
|
* then serialize to JSON for the --message argument.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"diagnostician-prompt-builder.d.ts","sourceRoot":"","sources":["../../src/runtime-v2/diagnostician-prompt-builder.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,OAAO,KAAK,EACV,2BAA2B,EAC3B,iBAAiB,EACjB,eAAe,EAChB,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"diagnostician-prompt-builder.d.ts","sourceRoot":"","sources":["../../src/runtime-v2/diagnostician-prompt-builder.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,OAAO,KAAK,EACV,2BAA2B,EAC3B,iBAAiB,EACjB,eAAe,EAChB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,oCAAoC,CAAC;AAI9E;;;;;;;;GAQG;AACH,MAAM,WAAW,WAAW;IAC1B,2BAA2B;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,qDAAqD;IACrD,WAAW,EAAE,MAAM,CAAC;IACpB,wDAAwD;IACxD,eAAe,EAAE,eAAe,CAAC;IACjC;;;;OAIG;IACH,kBAAkB,EAAE,iBAAiB,EAAE,CAAC;IACxC,0CAA0C;IAC1C,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,kEAAkE;IAClE,OAAO,EAAE,2BAA2B,CAAC;IACrC;;;;;OAKG;IACH,qBAAqB,EAAE,MAAM,CAAC;IAC9B,kFAAkF;IAClF,kBAAkB,CAAC,EAAE,MAAM,EAAE,CAAC;CAC/B;AAED,+DAA+D;AAC/D,MAAM,WAAW,mBAAmB;IAClC,2DAA2D;IAC3D,sBAAsB,EAAE,MAAM,CAAC;IAC/B,wDAAwD;IACxD,iBAAiB,EAAE,MAAM,CAAC;IAC1B,wDAAwD;IACxD,eAAe,EAAE,MAAM,CAAC;CACzB;AAED,eAAO,MAAM,6BAA6B,EAAE,mBAIlC,CAAC;AAEX;;;;;GAKG;AACH,MAAM,WAAW,iBAAiB;IAChC,iFAAiF;IACjF,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,yDAAyD;IACzD,QAAQ,CAAC,WAAW,EAAE,WAAW,CAAC;CACnC;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,kCAAkC,CAChD,OAAO,GAAE,mBAAsD,EAC/D,MAAM,GAAE,OAAqC,GAC5C,MAAM,CAwDR;AAED;;;;;;GAMG;AACH,wBAAgB,2BAA2B,CACzC,OAAO,EAAE,iBAAiB,EAAE,GAC3B,iBAAiB,EAAE,CAErB;AAED,qBAAa,0BAA0B;IACrC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAsB;IAC9C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAU;gBAG/B,OAAO,GAAE,mBAAsD,EAC/D,MAAM,GAAE,OAAqC;IAM/C;;;;;;;;;;;;OAYG;IACH,WAAW,CACT,OAAO,EAAE,2BAA2B,EACpC,MAAM,GAAE,mBAAmD,GAC1D,iBAAiB;CAkErB"}
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import { DefaultSchemaPromptAdapter } from './adapter/schema-prompt-adapter.js';
|
|
2
|
+
import { DiagnosticianOutputV1Schema } from './diagnostician-output.js';
|
|
1
3
|
export const DEFAULT_PROMPT_BUILDER_LIMITS = {
|
|
2
4
|
maxConversationEntries: 30,
|
|
3
5
|
maxEntryTextChars: 2000,
|
|
@@ -14,7 +16,10 @@ export const DEFAULT_PROMPT_BUILDER_LIMITS = {
|
|
|
14
16
|
* The 5-phase protocol is embedded directly in the prompt so the LLM follows it
|
|
15
17
|
* regardless of whether OpenClaw loads SKILL.md as the agent system prompt.
|
|
16
18
|
*/
|
|
17
|
-
export
|
|
19
|
+
export function buildDiagnosticProtocolInstruction(adapter = new DefaultSchemaPromptAdapter(), schema = DiagnosticianOutputV1Schema) {
|
|
20
|
+
const example = adapter.generateExample(schema);
|
|
21
|
+
const constraints = adapter.generateConstraints(schema);
|
|
22
|
+
return `You are a root cause analysis expert. Follow this protocol:
|
|
18
23
|
|
|
19
24
|
PHASE 1 — Evidence Review:
|
|
20
25
|
Review the provided sourceRefs, diagnosisTarget.evidence entries, conversationWindow
|
|
@@ -50,26 +55,23 @@ TAXONOMY DEFINITIONS:
|
|
|
50
55
|
4. "prompt": Context/Skill injection. Use to influence the agent's workflow habits.
|
|
51
56
|
5. "defer": Insufficient evidence. Use for network timeouts or noise.
|
|
52
57
|
|
|
58
|
+
EVIDENCE SCOPE GUARD:
|
|
59
|
+
- The root cause MUST describe an agent behavior or decision, not a system monitoring or diagnostic mechanism.
|
|
60
|
+
- If the evidence only describes internal metrics (GFI, friction scores, threshold crossings) with no
|
|
61
|
+
owner message or agent action context, return confidence < 0.3 and kind="defer".
|
|
62
|
+
|
|
53
63
|
CRITICAL: Your ENTIRE response must be ONLY the JSON object below. Do NOT include any text before or after the JSON. Do NOT wrap the JSON in markdown code fences. Do NOT add explanatory prose. Output the raw JSON object and nothing else.
|
|
54
64
|
|
|
55
65
|
COMPLETE EXAMPLE OUTPUT (follow this exact structure):
|
|
56
|
-
{
|
|
66
|
+
${example}
|
|
57
67
|
|
|
58
68
|
IMPORTANT: The example above is ILLUSTRATIVE ONLY. Your recommendations MUST be based on the actual root cause analysis and evidence in this context — do not copy the example text verbatim.
|
|
59
69
|
|
|
60
70
|
CONSTRAINTS:
|
|
61
71
|
- Output ONLY valid JSON — no markdown, no explanatory text, no code fences, no prose before or after
|
|
62
72
|
- Do NOT read files, call tools, or write to any database
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
- kind MUST be one of: "principle", "rule", "implementation", "prompt", "defer" (lowercase only)
|
|
66
|
-
- "principle" kind: MUST include abstractedPrinciple (<=200 chars)
|
|
67
|
-
- "rule" kind: MUST include triggerPattern AND action
|
|
68
|
-
- All evidence must reference sourceRef identifiers or conversationWindow entries from the context payload
|
|
69
|
-
- The root cause MUST describe an agent behavior or decision, not a system monitoring or diagnostic mechanism.
|
|
70
|
-
If the evidence only describes internal metrics (GFI, friction scores, threshold crossings) with no
|
|
71
|
-
owner message or agent action context, return confidence < 0.3 and kind="defer".
|
|
72
|
-
`;
|
|
73
|
+
${constraints}`;
|
|
74
|
+
}
|
|
73
75
|
/**
|
|
74
76
|
* Summarizes a conversation window for inclusion in the prompt.
|
|
75
77
|
* DPB-04: Prompt includes conversationWindow summary.
|
|
@@ -81,6 +83,12 @@ export function summarizeConversationWindow(entries) {
|
|
|
81
83
|
return entries;
|
|
82
84
|
}
|
|
83
85
|
export class DiagnosticianPromptBuilder {
|
|
86
|
+
adapter;
|
|
87
|
+
schema;
|
|
88
|
+
constructor(adapter = new DefaultSchemaPromptAdapter(), schema = DiagnosticianOutputV1Schema) {
|
|
89
|
+
this.adapter = adapter;
|
|
90
|
+
this.schema = schema;
|
|
91
|
+
}
|
|
84
92
|
/**
|
|
85
93
|
* Transform DiagnosticianContextPayload into a PromptInput object,
|
|
86
94
|
* then serialize to JSON for the --message argument.
|
|
@@ -94,7 +102,6 @@ export class DiagnosticianPromptBuilder {
|
|
|
94
102
|
*
|
|
95
103
|
* Per DPB-07: NO extraSystemPrompt is added — agent profile is the source of truth.
|
|
96
104
|
*/
|
|
97
|
-
// eslint-disable-next-line @typescript-eslint/class-methods-use-this
|
|
98
105
|
buildPrompt(payload, limits = DEFAULT_PROMPT_BUILDER_LIMITS) {
|
|
99
106
|
const truncationWarnings = [];
|
|
100
107
|
// DPB-04: Apply truncation to conversationWindow to prevent token overflow
|
|
@@ -119,6 +126,7 @@ export class DiagnosticianPromptBuilder {
|
|
|
119
126
|
...payload,
|
|
120
127
|
conversationWindow,
|
|
121
128
|
};
|
|
129
|
+
const diagnosticInstruction = buildDiagnosticProtocolInstruction(this.adapter, this.schema);
|
|
122
130
|
// DPB-04: Explicit top-level fields at the prompt level
|
|
123
131
|
const promptInput = {
|
|
124
132
|
taskId: payload.taskId,
|
|
@@ -127,7 +135,7 @@ export class DiagnosticianPromptBuilder {
|
|
|
127
135
|
conversationWindow,
|
|
128
136
|
sourceRefs: payload.sourceRefs,
|
|
129
137
|
context: compactContext,
|
|
130
|
-
diagnosticInstruction
|
|
138
|
+
diagnosticInstruction,
|
|
131
139
|
...(truncationWarnings.length > 0 ? { truncationWarnings } : {}),
|
|
132
140
|
};
|
|
133
141
|
// DPB-02: Output is ONLY JSON — no markdown, no file ops, no tool calls
|
|
@@ -136,7 +144,7 @@ export class DiagnosticianPromptBuilder {
|
|
|
136
144
|
// If message exceeds maxMessageChars, truncate the diagnostic instruction
|
|
137
145
|
if (message.length > limits.maxMessageChars) {
|
|
138
146
|
const surplus = message.length - limits.maxMessageChars;
|
|
139
|
-
const instruction =
|
|
147
|
+
const instruction = diagnosticInstruction;
|
|
140
148
|
// Keep at least the first 200 chars of the instruction + a note
|
|
141
149
|
const keepLength = Math.max(200, instruction.length - surplus - 100);
|
|
142
150
|
const truncatedInstruction = instruction.slice(0, keepLength) +
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"diagnostician-prompt-builder.js","sourceRoot":"","sources":["../../src/runtime-v2/diagnostician-prompt-builder.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"diagnostician-prompt-builder.js","sourceRoot":"","sources":["../../src/runtime-v2/diagnostician-prompt-builder.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"nocturnal-compliance-trust-boundary.test.d.ts","sourceRoot":"","sources":["../../../src/runtime-v2/__tests__/nocturnal-compliance-trust-boundary.test.ts"],"names":[],"mappings":""}
|
|
@@ -1,215 +0,0 @@
|
|
|
1
|
-
import { describe, it, expect } from 'vitest';
|
|
2
|
-
import { groupEventsIntoSessions, detectOpportunity, } from '../nocturnal/nocturnal-compliance.js';
|
|
3
|
-
import { validatePainSignal, } from '../types/pain-signal.js';
|
|
4
|
-
function makeEvent(overrides) {
|
|
5
|
-
return {
|
|
6
|
-
ts: '2025-01-01T00:00:00Z',
|
|
7
|
-
sessionId: 'test-session',
|
|
8
|
-
...overrides,
|
|
9
|
-
};
|
|
10
|
-
}
|
|
11
|
-
function getSession(events) {
|
|
12
|
-
const sessions = groupEventsIntoSessions(events);
|
|
13
|
-
const session = sessions.get('test-session');
|
|
14
|
-
expect(session).toBeDefined();
|
|
15
|
-
return session;
|
|
16
|
-
}
|
|
17
|
-
describe('nocturnal-compliance trust boundary', () => {
|
|
18
|
-
describe('groupEventsIntoSessions — non-string toolName', () => {
|
|
19
|
-
it('rejects numeric toolName, entry skipped from toolCalls', () => {
|
|
20
|
-
const events = [
|
|
21
|
-
makeEvent({ type: 'tool_call', data: { toolName: 42 } }),
|
|
22
|
-
];
|
|
23
|
-
const session = getSession(events);
|
|
24
|
-
expect(session.toolCalls).toHaveLength(0);
|
|
25
|
-
});
|
|
26
|
-
it('rejects array toolName, entry skipped from toolCalls', () => {
|
|
27
|
-
const events = [
|
|
28
|
-
makeEvent({ type: 'tool_call', data: { toolName: ['Write'] } }),
|
|
29
|
-
];
|
|
30
|
-
const session = getSession(events);
|
|
31
|
-
expect(session.toolCalls).toHaveLength(0);
|
|
32
|
-
});
|
|
33
|
-
});
|
|
34
|
-
describe('groupEventsIntoSessions — non-string filePath', () => {
|
|
35
|
-
it('rejects object filePath, yields undefined', () => {
|
|
36
|
-
const events = [
|
|
37
|
-
makeEvent({ type: 'tool_call', data: { toolName: 'Write', filePath: { malicious: true } } }),
|
|
38
|
-
];
|
|
39
|
-
const session = getSession(events);
|
|
40
|
-
expect(session.toolCalls[0]?.filePath).toBeUndefined();
|
|
41
|
-
});
|
|
42
|
-
it('rejects numeric filePath, yields undefined', () => {
|
|
43
|
-
const events = [
|
|
44
|
-
makeEvent({ type: 'tool_call', data: { toolName: 'Write', filePath: 123 } }),
|
|
45
|
-
];
|
|
46
|
-
const session = getSession(events);
|
|
47
|
-
expect(session.toolCalls[0]?.filePath).toBeUndefined();
|
|
48
|
-
});
|
|
49
|
-
});
|
|
50
|
-
describe('groupEventsIntoSessions — score NaN/Infinity', () => {
|
|
51
|
-
it('rejects NaN score, entry skipped from painSignals', () => {
|
|
52
|
-
const events = [
|
|
53
|
-
makeEvent({ type: 'pain_signal', data: { score: NaN, source: 'test' } }),
|
|
54
|
-
];
|
|
55
|
-
const session = getSession(events);
|
|
56
|
-
expect(session.painSignals).toHaveLength(0);
|
|
57
|
-
});
|
|
58
|
-
it('rejects Infinity score, entry skipped from painSignals', () => {
|
|
59
|
-
const events = [
|
|
60
|
-
makeEvent({ type: 'pain_signal', data: { score: Infinity, source: 'test' } }),
|
|
61
|
-
];
|
|
62
|
-
const session = getSession(events);
|
|
63
|
-
expect(session.painSignals).toHaveLength(0);
|
|
64
|
-
});
|
|
65
|
-
it('rejects -Infinity score, entry skipped from painSignals', () => {
|
|
66
|
-
const events = [
|
|
67
|
-
makeEvent({ type: 'pain_signal', data: { score: -Infinity, source: 'test' } }),
|
|
68
|
-
];
|
|
69
|
-
const session = getSession(events);
|
|
70
|
-
expect(session.painSignals).toHaveLength(0);
|
|
71
|
-
});
|
|
72
|
-
});
|
|
73
|
-
describe('groupEventsIntoSessions — invalid severity', () => {
|
|
74
|
-
it('rejects unknown severity string, yields undefined', () => {
|
|
75
|
-
const events = [
|
|
76
|
-
makeEvent({ type: 'pain_signal', data: { score: 50, source: 'test', severity: 'critical' } }),
|
|
77
|
-
];
|
|
78
|
-
const session = getSession(events);
|
|
79
|
-
expect(session.painSignals).toHaveLength(1);
|
|
80
|
-
expect(session.painSignals[0]?.severity).toBeUndefined();
|
|
81
|
-
});
|
|
82
|
-
it('rejects numeric severity, yields undefined', () => {
|
|
83
|
-
const events = [
|
|
84
|
-
makeEvent({ type: 'pain_signal', data: { score: 50, source: 'test', severity: 3 } }),
|
|
85
|
-
];
|
|
86
|
-
const session = getSession(events);
|
|
87
|
-
expect(session.painSignals).toHaveLength(1);
|
|
88
|
-
expect(session.painSignals[0]?.severity).toBeUndefined();
|
|
89
|
-
});
|
|
90
|
-
});
|
|
91
|
-
describe('groupEventsIntoSessions — malformed nested values', () => {
|
|
92
|
-
it('does not crash and does not promote untrusted values', () => {
|
|
93
|
-
const events = [
|
|
94
|
-
makeEvent({ type: 'tool_call', data: { toolName: [1, 2, 3] } }),
|
|
95
|
-
makeEvent({ type: 'pain_signal', data: { toolName: [1, 2, 3], score: 'high', source: 99 } }),
|
|
96
|
-
];
|
|
97
|
-
const session = getSession(events);
|
|
98
|
-
expect(session.toolCalls).toHaveLength(0);
|
|
99
|
-
expect(session.painSignals).toHaveLength(0);
|
|
100
|
-
});
|
|
101
|
-
});
|
|
102
|
-
describe('groupEventsIntoSessions — skip behavior', () => {
|
|
103
|
-
it('invalid toolName row skipped and does not increment toolCalls length', () => {
|
|
104
|
-
const events = [
|
|
105
|
-
makeEvent({ type: 'tool_call', data: { toolName: 'Write', filePath: '/foo.ts' } }),
|
|
106
|
-
makeEvent({ type: 'tool_call', data: { toolName: 42 } }),
|
|
107
|
-
makeEvent({ type: 'tool_call', data: { toolName: 'Read', filePath: '/bar.ts' } }),
|
|
108
|
-
];
|
|
109
|
-
const session = getSession(events);
|
|
110
|
-
expect(session.toolCalls).toHaveLength(2);
|
|
111
|
-
expect(session.toolCalls[0]?.toolName).toBe('Write');
|
|
112
|
-
expect(session.toolCalls[1]?.toolName).toBe('Read');
|
|
113
|
-
});
|
|
114
|
-
it('invalid toolName cannot trigger T-09 opportunity', () => {
|
|
115
|
-
const events = [
|
|
116
|
-
makeEvent({ type: 'tool_call', data: { toolName: 42 } }),
|
|
117
|
-
makeEvent({ type: 'tool_call', data: { toolName: 99 } }),
|
|
118
|
-
makeEvent({ type: 'tool_call', data: { toolName: [1, 2] } }),
|
|
119
|
-
];
|
|
120
|
-
const session = getSession(events);
|
|
121
|
-
expect(session.toolCalls).toHaveLength(0);
|
|
122
|
-
const opp = detectOpportunity('T-09', session);
|
|
123
|
-
expect(opp.applicable).toBe(false);
|
|
124
|
-
});
|
|
125
|
-
it('NaN pain score skipped and does not trigger pain-derived opportunity', () => {
|
|
126
|
-
const events = [
|
|
127
|
-
makeEvent({ type: 'pain_signal', data: { score: NaN, source: 'test' } }),
|
|
128
|
-
];
|
|
129
|
-
const session = getSession(events);
|
|
130
|
-
expect(session.painSignals).toHaveLength(0);
|
|
131
|
-
});
|
|
132
|
-
it('malformed gate block skipped and does not count as violation', () => {
|
|
133
|
-
const events = [
|
|
134
|
-
makeEvent({ type: 'gate_block', data: { toolName: 42, reason: 'dangerous' } }),
|
|
135
|
-
makeEvent({ type: 'gate_block', data: { toolName: 'bash', reason: '' } }),
|
|
136
|
-
];
|
|
137
|
-
const session = getSession(events);
|
|
138
|
-
expect(session.gateBlocks).toHaveLength(0);
|
|
139
|
-
});
|
|
140
|
-
it('malformed plan approval skipped', () => {
|
|
141
|
-
const events = [
|
|
142
|
-
makeEvent({ type: 'plan_approval', data: { toolName: [1, 2] } }),
|
|
143
|
-
];
|
|
144
|
-
const session = getSession(events);
|
|
145
|
-
expect(session.planApprovals).toHaveLength(0);
|
|
146
|
-
});
|
|
147
|
-
});
|
|
148
|
-
describe('groupEventsIntoSessions — valid data preserved', () => {
|
|
149
|
-
it('preserves all valid fields correctly', () => {
|
|
150
|
-
const events = [
|
|
151
|
-
makeEvent({ type: 'tool_call', data: { toolName: 'Write', filePath: '/foo.ts' } }),
|
|
152
|
-
makeEvent({ type: 'pain_signal', data: { source: 'tool_failure', score: 0.8, severity: 'moderate', reason: 'test reason' } }),
|
|
153
|
-
makeEvent({ type: 'gate_block', data: { toolName: 'bash', filePath: '/bar.sh', reason: 'dangerous command' } }),
|
|
154
|
-
makeEvent({ type: 'plan_approval', data: { toolName: 'Read', filePath: '/baz.ts' } }),
|
|
155
|
-
];
|
|
156
|
-
const session = getSession(events);
|
|
157
|
-
expect(session.toolCalls[0]?.toolName).toBe('Write');
|
|
158
|
-
expect(session.toolCalls[0]?.filePath).toBe('/foo.ts');
|
|
159
|
-
expect(session.painSignals[0]?.source).toBe('tool_failure');
|
|
160
|
-
expect(session.painSignals[0]?.score).toBe(0.8);
|
|
161
|
-
expect(session.painSignals[0]?.severity).toBe('moderate');
|
|
162
|
-
expect(session.painSignals[0]?.reason).toBe('test reason');
|
|
163
|
-
expect(session.gateBlocks[0]?.toolName).toBe('bash');
|
|
164
|
-
expect(session.gateBlocks[0]?.filePath).toBe('/bar.sh');
|
|
165
|
-
expect(session.gateBlocks[0]?.reason).toBe('dangerous command');
|
|
166
|
-
expect(session.planApprovals[0]?.toolName).toBe('Read');
|
|
167
|
-
expect(session.planApprovals[0]?.filePath).toBe('/baz.ts');
|
|
168
|
-
});
|
|
169
|
-
});
|
|
170
|
-
describe('validatePainSignal — malformed unknown input', () => {
|
|
171
|
-
it('rejects null', () => {
|
|
172
|
-
const result = validatePainSignal(null);
|
|
173
|
-
expect(result.valid).toBe(false);
|
|
174
|
-
});
|
|
175
|
-
it('rejects string', () => {
|
|
176
|
-
const result = validatePainSignal('string');
|
|
177
|
-
expect(result.valid).toBe(false);
|
|
178
|
-
});
|
|
179
|
-
it('rejects number', () => {
|
|
180
|
-
const result = validatePainSignal(42);
|
|
181
|
-
expect(result.valid).toBe(false);
|
|
182
|
-
});
|
|
183
|
-
it('rejects array', () => {
|
|
184
|
-
const result = validatePainSignal([]);
|
|
185
|
-
expect(result.valid).toBe(false);
|
|
186
|
-
});
|
|
187
|
-
it('rejects undefined', () => {
|
|
188
|
-
const result = validatePainSignal(undefined);
|
|
189
|
-
expect(result.valid).toBe(false);
|
|
190
|
-
});
|
|
191
|
-
it('rejects boolean', () => {
|
|
192
|
-
const result = validatePainSignal(true);
|
|
193
|
-
expect(result.valid).toBe(false);
|
|
194
|
-
});
|
|
195
|
-
});
|
|
196
|
-
});
|
|
197
|
-
describe('plugin re-export compatibility', () => {
|
|
198
|
-
it('exposes groupEventsIntoSessions from @principles/core/runtime-v2', async () => {
|
|
199
|
-
const mod = await import('../index.js');
|
|
200
|
-
expect(typeof mod.groupEventsIntoSessions).toBe('function');
|
|
201
|
-
});
|
|
202
|
-
it('exposes validatePainSignal from @principles/core/runtime-v2', async () => {
|
|
203
|
-
const mod = await import('../index.js');
|
|
204
|
-
expect(typeof mod.validatePainSignal).toBe('function');
|
|
205
|
-
});
|
|
206
|
-
it('exposes detectOpportunity from @principles/core/runtime-v2', async () => {
|
|
207
|
-
const mod = await import('../index.js');
|
|
208
|
-
expect(typeof mod.detectOpportunity).toBe('function');
|
|
209
|
-
});
|
|
210
|
-
it('exposes computeCompliance from @principles/core/runtime-v2', async () => {
|
|
211
|
-
const mod = await import('../index.js');
|
|
212
|
-
expect(typeof mod.computeCompliance).toBe('function');
|
|
213
|
-
});
|
|
214
|
-
});
|
|
215
|
-
//# sourceMappingURL=nocturnal-compliance-trust-boundary.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"nocturnal-compliance-trust-boundary.test.js","sourceRoot":"","sources":["../../../src/runtime-v2/__tests__/nocturnal-compliance-trust-boundary.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"idle-trigger-config-resolve.test.d.ts","sourceRoot":"","sources":["../../../../src/runtime-v2/idle-trigger/__tests__/idle-trigger-config-resolve.test.ts"],"names":[],"mappings":""}
|
|
@@ -1,92 +0,0 @@
|
|
|
1
|
-
import { describe, it, expect } from 'vitest';
|
|
2
|
-
import { resolveIdleTriggerConfig, DEFAULT_IDLE_TRIGGER_CONFIG } from '../index.js';
|
|
3
|
-
describe('resolveIdleTriggerConfig', () => {
|
|
4
|
-
it('undefined partial returns full default config', () => {
|
|
5
|
-
const result = resolveIdleTriggerConfig(undefined);
|
|
6
|
-
expect(result).toEqual(DEFAULT_IDLE_TRIGGER_CONFIG);
|
|
7
|
-
});
|
|
8
|
-
it('empty object partial returns full default config', () => {
|
|
9
|
-
const result = resolveIdleTriggerConfig({});
|
|
10
|
-
expect(result).toEqual(DEFAULT_IDLE_TRIGGER_CONFIG);
|
|
11
|
-
});
|
|
12
|
-
it('partial enabled=false overrides only enabled', () => {
|
|
13
|
-
const result = resolveIdleTriggerConfig({ enabled: false });
|
|
14
|
-
expect(result.enabled).toBe(false);
|
|
15
|
-
expect(result.idleThresholdMs).toBe(DEFAULT_IDLE_TRIGGER_CONFIG.idleThresholdMs);
|
|
16
|
-
expect(result.jitterMaxMs).toBe(DEFAULT_IDLE_TRIGGER_CONFIG.jitterMaxMs);
|
|
17
|
-
expect(result.activityCooldownMs).toBe(DEFAULT_IDLE_TRIGGER_CONFIG.activityCooldownMs);
|
|
18
|
-
});
|
|
19
|
-
it('partial enabled=true overrides only enabled', () => {
|
|
20
|
-
const result = resolveIdleTriggerConfig({ enabled: true });
|
|
21
|
-
expect(result.enabled).toBe(true);
|
|
22
|
-
expect(result.idleThresholdMs).toBe(DEFAULT_IDLE_TRIGGER_CONFIG.idleThresholdMs);
|
|
23
|
-
});
|
|
24
|
-
it('partial idleThresholdMs overrides only idleThresholdMs', () => {
|
|
25
|
-
const result = resolveIdleTriggerConfig({ idleThresholdMs: 600000 });
|
|
26
|
-
expect(result.idleThresholdMs).toBe(600000);
|
|
27
|
-
expect(result.enabled).toBe(DEFAULT_IDLE_TRIGGER_CONFIG.enabled);
|
|
28
|
-
expect(result.jitterMaxMs).toBe(DEFAULT_IDLE_TRIGGER_CONFIG.jitterMaxMs);
|
|
29
|
-
expect(result.activityCooldownMs).toBe(DEFAULT_IDLE_TRIGGER_CONFIG.activityCooldownMs);
|
|
30
|
-
});
|
|
31
|
-
it('partial jitterMaxMs overrides only jitterMaxMs', () => {
|
|
32
|
-
const result = resolveIdleTriggerConfig({ jitterMaxMs: 60000 });
|
|
33
|
-
expect(result.jitterMaxMs).toBe(60000);
|
|
34
|
-
expect(result.enabled).toBe(DEFAULT_IDLE_TRIGGER_CONFIG.enabled);
|
|
35
|
-
expect(result.idleThresholdMs).toBe(DEFAULT_IDLE_TRIGGER_CONFIG.idleThresholdMs);
|
|
36
|
-
expect(result.activityCooldownMs).toBe(DEFAULT_IDLE_TRIGGER_CONFIG.activityCooldownMs);
|
|
37
|
-
});
|
|
38
|
-
it('partial activityCooldownMs overrides only activityCooldownMs', () => {
|
|
39
|
-
const result = resolveIdleTriggerConfig({ activityCooldownMs: 120000 });
|
|
40
|
-
expect(result.activityCooldownMs).toBe(120000);
|
|
41
|
-
expect(result.enabled).toBe(DEFAULT_IDLE_TRIGGER_CONFIG.enabled);
|
|
42
|
-
expect(result.idleThresholdMs).toBe(DEFAULT_IDLE_TRIGGER_CONFIG.idleThresholdMs);
|
|
43
|
-
expect(result.jitterMaxMs).toBe(DEFAULT_IDLE_TRIGGER_CONFIG.jitterMaxMs);
|
|
44
|
-
});
|
|
45
|
-
it('all fields partial overrides all fields', () => {
|
|
46
|
-
const overrides = {
|
|
47
|
-
enabled: false,
|
|
48
|
-
idleThresholdMs: 900000,
|
|
49
|
-
jitterMaxMs: 45000,
|
|
50
|
-
activityCooldownMs: 180000,
|
|
51
|
-
};
|
|
52
|
-
const result = resolveIdleTriggerConfig(overrides);
|
|
53
|
-
expect(result).toEqual(overrides);
|
|
54
|
-
});
|
|
55
|
-
it('single field partial preserves defaults for other fields', () => {
|
|
56
|
-
const result = resolveIdleTriggerConfig({ idleThresholdMs: 120000 });
|
|
57
|
-
expect(result.idleThresholdMs).toBe(120000);
|
|
58
|
-
expect(result.enabled).toBe(DEFAULT_IDLE_TRIGGER_CONFIG.enabled);
|
|
59
|
-
expect(result.jitterMaxMs).toBe(DEFAULT_IDLE_TRIGGER_CONFIG.jitterMaxMs);
|
|
60
|
-
expect(result.activityCooldownMs).toBe(DEFAULT_IDLE_TRIGGER_CONFIG.activityCooldownMs);
|
|
61
|
-
});
|
|
62
|
-
});
|
|
63
|
-
describe('DEFAULT_IDLE_TRIGGER_CONFIG', () => {
|
|
64
|
-
it('has required fields', () => {
|
|
65
|
-
expect(DEFAULT_IDLE_TRIGGER_CONFIG).toHaveProperty('enabled');
|
|
66
|
-
expect(DEFAULT_IDLE_TRIGGER_CONFIG).toHaveProperty('idleThresholdMs');
|
|
67
|
-
expect(DEFAULT_IDLE_TRIGGER_CONFIG).toHaveProperty('jitterMaxMs');
|
|
68
|
-
expect(DEFAULT_IDLE_TRIGGER_CONFIG).toHaveProperty('activityCooldownMs');
|
|
69
|
-
});
|
|
70
|
-
it('enabled defaults to true', () => {
|
|
71
|
-
expect(DEFAULT_IDLE_TRIGGER_CONFIG.enabled).toBe(true);
|
|
72
|
-
});
|
|
73
|
-
it('idleThresholdMs is positive number', () => {
|
|
74
|
-
expect(typeof DEFAULT_IDLE_TRIGGER_CONFIG.idleThresholdMs).toBe('number');
|
|
75
|
-
expect(DEFAULT_IDLE_TRIGGER_CONFIG.idleThresholdMs).toBeGreaterThan(0);
|
|
76
|
-
});
|
|
77
|
-
it('jitterMaxMs is non-negative number', () => {
|
|
78
|
-
expect(typeof DEFAULT_IDLE_TRIGGER_CONFIG.jitterMaxMs).toBe('number');
|
|
79
|
-
expect(DEFAULT_IDLE_TRIGGER_CONFIG.jitterMaxMs).toBeGreaterThanOrEqual(0);
|
|
80
|
-
});
|
|
81
|
-
it('activityCooldownMs is positive number', () => {
|
|
82
|
-
expect(typeof DEFAULT_IDLE_TRIGGER_CONFIG.activityCooldownMs).toBe('number');
|
|
83
|
-
expect(DEFAULT_IDLE_TRIGGER_CONFIG.activityCooldownMs).toBeGreaterThan(0);
|
|
84
|
-
});
|
|
85
|
-
it('jitterMaxMs is less than or equal to idleThresholdMs', () => {
|
|
86
|
-
expect(DEFAULT_IDLE_TRIGGER_CONFIG.jitterMaxMs).toBeLessThanOrEqual(DEFAULT_IDLE_TRIGGER_CONFIG.idleThresholdMs);
|
|
87
|
-
});
|
|
88
|
-
it('activityCooldownMs is less than idleThresholdMs', () => {
|
|
89
|
-
expect(DEFAULT_IDLE_TRIGGER_CONFIG.activityCooldownMs).toBeLessThan(DEFAULT_IDLE_TRIGGER_CONFIG.idleThresholdMs);
|
|
90
|
-
});
|
|
91
|
-
});
|
|
92
|
-
//# sourceMappingURL=idle-trigger-config-resolve.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"idle-trigger-config-resolve.test.js","sourceRoot":"","sources":["../../../../src/runtime-v2/idle-trigger/__tests__/idle-trigger-config-resolve.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"idle-trigger-decision.test.d.ts","sourceRoot":"","sources":["../../../../src/runtime-v2/idle-trigger/__tests__/idle-trigger-decision.test.ts"],"names":[],"mappings":""}
|