@principles/core 1.273.0 → 1.274.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/index.d.ts +7 -12
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +7 -12
- package/dist/index.js.map +1 -1
- package/dist/runtime-v2/__tests__/architecture-regression.test.js +1 -1
- package/dist/runtime-v2/__tests__/architecture-regression.test.js.map +1 -1
- package/dist/runtime-v2/__tests__/pain-signal-observability.test.js +93 -0
- package/dist/runtime-v2/__tests__/pain-signal-observability.test.js.map +1 -1
- package/dist/runtime-v2/__tests__/status-contract.test.js +0 -29
- package/dist/runtime-v2/__tests__/status-contract.test.js.map +1 -1
- package/dist/runtime-v2/index.d.ts +2 -1
- package/dist/runtime-v2/index.d.ts.map +1 -1
- package/dist/runtime-v2/index.js +0 -2
- package/dist/runtime-v2/index.js.map +1 -1
- package/dist/runtime-v2/pain-signal-bridge.d.ts +8 -1
- package/dist/runtime-v2/pain-signal-bridge.d.ts.map +1 -1
- package/dist/runtime-v2/pain-signal-bridge.js.map +1 -1
- package/dist/runtime-v2/pain-signal-observability.d.ts.map +1 -1
- package/dist/runtime-v2/pain-signal-observability.js +25 -10
- package/dist/runtime-v2/pain-signal-observability.js.map +1 -1
- package/package.json +1 -38
- package/dist/adapters/__tests__/code-review-pain-adapter.test.d.ts +0 -2
- package/dist/adapters/__tests__/code-review-pain-adapter.test.d.ts.map +0 -1
- package/dist/adapters/__tests__/code-review-pain-adapter.test.js +0 -346
- package/dist/adapters/__tests__/code-review-pain-adapter.test.js.map +0 -1
- package/dist/adapters/__tests__/openclaw-pain-adapter.test.d.ts +0 -2
- package/dist/adapters/__tests__/openclaw-pain-adapter.test.d.ts.map +0 -1
- package/dist/adapters/__tests__/openclaw-pain-adapter.test.js +0 -290
- package/dist/adapters/__tests__/openclaw-pain-adapter.test.js.map +0 -1
- package/dist/adapters/__tests__/writing-pain-adapter.test.d.ts +0 -2
- package/dist/adapters/__tests__/writing-pain-adapter.test.d.ts.map +0 -1
- package/dist/adapters/__tests__/writing-pain-adapter.test.js +0 -239
- package/dist/adapters/__tests__/writing-pain-adapter.test.js.map +0 -1
- package/dist/adapters/code-review/code-review-pain-adapter.d.ts +0 -13
- package/dist/adapters/code-review/code-review-pain-adapter.d.ts.map +0 -1
- package/dist/adapters/code-review/code-review-pain-adapter.js +0 -139
- package/dist/adapters/code-review/code-review-pain-adapter.js.map +0 -1
- package/dist/adapters/code-review/index.d.ts +0 -6
- package/dist/adapters/code-review/index.d.ts.map +0 -1
- package/dist/adapters/code-review/index.js +0 -2
- package/dist/adapters/code-review/index.js.map +0 -1
- package/dist/adapters/code-review/review-event-types.d.ts +0 -54
- package/dist/adapters/code-review/review-event-types.d.ts.map +0 -1
- package/dist/adapters/code-review/review-event-types.js +0 -8
- package/dist/adapters/code-review/review-event-types.js.map +0 -1
- package/dist/adapters/coding/index.d.ts +0 -6
- package/dist/adapters/coding/index.d.ts.map +0 -1
- package/dist/adapters/coding/index.js +0 -5
- package/dist/adapters/coding/index.js.map +0 -1
- package/dist/adapters/coding/openclaw-event-types.d.ts +0 -26
- package/dist/adapters/coding/openclaw-event-types.d.ts.map +0 -1
- package/dist/adapters/coding/openclaw-event-types.js +0 -9
- package/dist/adapters/coding/openclaw-event-types.js.map +0 -1
- package/dist/adapters/coding/openclaw-pain-adapter.d.ts +0 -27
- package/dist/adapters/coding/openclaw-pain-adapter.d.ts.map +0 -1
- package/dist/adapters/coding/openclaw-pain-adapter.js +0 -102
- package/dist/adapters/coding/openclaw-pain-adapter.js.map +0 -1
- package/dist/adapters/writing/index.d.ts +0 -6
- package/dist/adapters/writing/index.d.ts.map +0 -1
- package/dist/adapters/writing/index.js +0 -5
- package/dist/adapters/writing/index.js.map +0 -1
- package/dist/adapters/writing/writing-pain-adapter.d.ts +0 -22
- package/dist/adapters/writing/writing-pain-adapter.d.ts.map +0 -1
- package/dist/adapters/writing/writing-pain-adapter.js +0 -62
- package/dist/adapters/writing/writing-pain-adapter.js.map +0 -1
- package/dist/adapters/writing/writing-types.d.ts +0 -34
- package/dist/adapters/writing/writing-types.d.ts.map +0 -1
- package/dist/adapters/writing/writing-types.js +0 -9
- package/dist/adapters/writing/writing-types.js.map +0 -1
- package/dist/pain-signal-adapter.d.ts +0 -37
- package/dist/pain-signal-adapter.d.ts.map +0 -1
- package/dist/pain-signal-adapter.js +0 -2
- package/dist/pain-signal-adapter.js.map +0 -1
- package/dist/pain-signal.d.ts +0 -16
- package/dist/pain-signal.d.ts.map +0 -1
- package/dist/pain-signal.js +0 -15
- package/dist/pain-signal.js.map +0 -1
- package/dist/principle-injector.d.ts +0 -67
- package/dist/principle-injector.d.ts.map +0 -1
- package/dist/principle-injector.js +0 -89
- package/dist/principle-injector.js.map +0 -1
- package/dist/principle-injector.test.d.ts +0 -2
- package/dist/principle-injector.test.d.ts.map +0 -1
- package/dist/principle-injector.test.js +0 -158
- package/dist/principle-injector.test.js.map +0 -1
- package/dist/runtime-v2/__tests__/pain-signal-unification.test.d.ts +0 -2
- package/dist/runtime-v2/__tests__/pain-signal-unification.test.d.ts.map +0 -1
- package/dist/runtime-v2/__tests__/pain-signal-unification.test.js +0 -150
- package/dist/runtime-v2/__tests__/pain-signal-unification.test.js.map +0 -1
- package/dist/runtime-v2/store/task-migration.d.ts +0 -89
- package/dist/runtime-v2/store/task-migration.d.ts.map +0 -1
- package/dist/runtime-v2/store/task-migration.js +0 -79
- package/dist/runtime-v2/store/task-migration.js.map +0 -1
|
@@ -1,37 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* PainSignalAdapter interface for the Evolution SDK.
|
|
3
|
-
*
|
|
4
|
-
* This interface decouples the evolution engine from specific AI agent
|
|
5
|
-
* frameworks (OpenClaw, Claude Code, etc.). All modules that need to
|
|
6
|
-
* capture pain signals from tool failures should depend on this interface
|
|
7
|
-
* rather than importing framework-specific event types directly.
|
|
8
|
-
*
|
|
9
|
-
* The interface uses a generic type parameter for the raw framework event,
|
|
10
|
-
* so each framework implementation provides its own concrete type.
|
|
11
|
-
*/
|
|
12
|
-
import type { PainSignal } from './pain-signal.js';
|
|
13
|
-
/**
|
|
14
|
-
* Framework-agnostic adapter for capturing pain signals.
|
|
15
|
-
*
|
|
16
|
-
* @typeParam TRawEvent - The framework-specific event type
|
|
17
|
-
* (e.g., PluginHookAfterToolCallEvent for OpenClaw)
|
|
18
|
-
*/
|
|
19
|
-
export interface PainSignalAdapter<TRawEvent> {
|
|
20
|
-
/**
|
|
21
|
-
* Translate a framework-specific event into a universal PainSignal.
|
|
22
|
-
*
|
|
23
|
-
* Returns null when the event does not constitute a pain signal:
|
|
24
|
-
* - "Not applicable": event type is not a failure (e.g., tool succeeded)
|
|
25
|
-
* - "Malformed": required fields are missing or invalid (e.g., no sessionId)
|
|
26
|
-
*
|
|
27
|
-
* In both cases null is returned -- callers do not need to distinguish.
|
|
28
|
-
* This method performs pure translation only. Trigger decision logic
|
|
29
|
-
* (e.g., GFI threshold checks, tool name filtering) stays in the
|
|
30
|
-
* framework-side hook logic. Per D-02, capture() only translates.
|
|
31
|
-
*
|
|
32
|
-
* @param rawEvent - The framework-specific event to translate
|
|
33
|
-
* @returns A valid PainSignal, or null if the event does not produce one
|
|
34
|
-
*/
|
|
35
|
-
capture(rawEvent: TRawEvent): PainSignal | null;
|
|
36
|
-
}
|
|
37
|
-
//# sourceMappingURL=pain-signal-adapter.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"pain-signal-adapter.d.ts","sourceRoot":"","sources":["../src/pain-signal-adapter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAMnD;;;;;GAKG;AACH,MAAM,WAAW,iBAAiB,CAAC,SAAS;IAC1C;;;;;;;;;;;;;;OAcG;IACH,OAAO,CAAC,QAAQ,EAAE,SAAS,GAAG,UAAU,GAAG,IAAI,CAAC;CACjD"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"pain-signal-adapter.js","sourceRoot":"","sources":["../src/pain-signal-adapter.ts"],"names":[],"mappings":""}
|
package/dist/pain-signal.d.ts
DELETED
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Pain signal schema — re-exported from runtime-v2/types/pain-signal.ts.
|
|
3
|
-
*
|
|
4
|
-
* This file exists for backward compatibility with imports from
|
|
5
|
-
* @principles/core (top-level barrel). The canonical definition
|
|
6
|
-
* lives in runtime-v2/types/pain-signal.ts (PRI-443).
|
|
7
|
-
*
|
|
8
|
-
* The unified schema merges the stricter validations from both versions:
|
|
9
|
-
* - ISO 8601 timestamp format check
|
|
10
|
-
* - Context size limit (10KB)
|
|
11
|
-
* - version field with default
|
|
12
|
-
* - isStringRecord type guard (no `as` bypass)
|
|
13
|
-
*/
|
|
14
|
-
export { PainSeverity, PainSignalSchema, deriveSeverity, validatePainSignal, } from './runtime-v2/types/pain-signal.js';
|
|
15
|
-
export type { PainSignal, PainSignalValidationResult, } from './runtime-v2/types/pain-signal.js';
|
|
16
|
-
//# sourceMappingURL=pain-signal.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"pain-signal.d.ts","sourceRoot":"","sources":["../src/pain-signal.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EACL,YAAY,EACZ,gBAAgB,EAChB,cAAc,EACd,kBAAkB,GACnB,MAAM,mCAAmC,CAAC;AAE3C,YAAY,EACV,UAAU,EACV,0BAA0B,GAC3B,MAAM,mCAAmC,CAAC"}
|
package/dist/pain-signal.js
DELETED
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Pain signal schema — re-exported from runtime-v2/types/pain-signal.ts.
|
|
3
|
-
*
|
|
4
|
-
* This file exists for backward compatibility with imports from
|
|
5
|
-
* @principles/core (top-level barrel). The canonical definition
|
|
6
|
-
* lives in runtime-v2/types/pain-signal.ts (PRI-443).
|
|
7
|
-
*
|
|
8
|
-
* The unified schema merges the stricter validations from both versions:
|
|
9
|
-
* - ISO 8601 timestamp format check
|
|
10
|
-
* - Context size limit (10KB)
|
|
11
|
-
* - version field with default
|
|
12
|
-
* - isStringRecord type guard (no `as` bypass)
|
|
13
|
-
*/
|
|
14
|
-
export { PainSeverity, PainSignalSchema, deriveSeverity, validatePainSignal, } from './runtime-v2/types/pain-signal.js';
|
|
15
|
-
//# sourceMappingURL=pain-signal.js.map
|
package/dist/pain-signal.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"pain-signal.js","sourceRoot":"","sources":["../src/pain-signal.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EACL,YAAY,EACZ,gBAAgB,EAChB,cAAc,EACd,kBAAkB,GACnB,MAAM,mCAAmC,CAAC"}
|
|
@@ -1,67 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* PrincipleInjector interface and DefaultPrincipleInjector implementation for the Evolution SDK.
|
|
3
|
-
*
|
|
4
|
-
* The DefaultPrincipleInjector is a minimal framework-agnostic implementation that:
|
|
5
|
-
* - Sorts principles by priority (P0 first), then by creation date
|
|
6
|
-
* - Selects principles that fit within budgetChars
|
|
7
|
-
* - Always includes P0 principles (forced inclusion)
|
|
8
|
-
* - Formats principles as "- [ID] text"
|
|
9
|
-
*
|
|
10
|
-
* This implementation does NOT depend on openclaw-plugin internals.
|
|
11
|
-
* It uses only SDK types (InjectablePrinciple, InjectionContext).
|
|
12
|
-
*/
|
|
13
|
-
import type { InjectablePrinciple } from './prompt-builder/principle-selection.js';
|
|
14
|
-
/**
|
|
15
|
-
* Generic injection context -- no framework-specific fields.
|
|
16
|
-
*/
|
|
17
|
-
export interface InjectionContext {
|
|
18
|
-
/** Domain context (e.g., 'coding', 'writing', 'analysis') */
|
|
19
|
-
domain: string;
|
|
20
|
-
/** Session identifier */
|
|
21
|
-
sessionId: string;
|
|
22
|
-
/** Maximum characters allowed for injected principles */
|
|
23
|
-
budgetChars: number;
|
|
24
|
-
/** Principle IDs to exclude from injection (e.g. pruned by audit). Undefined = no masking. */
|
|
25
|
-
maskedPrincipleIds?: Set<string>;
|
|
26
|
-
}
|
|
27
|
-
/**
|
|
28
|
-
* Framework-agnostic principle injection interface.
|
|
29
|
-
*
|
|
30
|
-
* Wraps the existing budget-aware selection and formatting logic.
|
|
31
|
-
* Framework adapters convert their context to InjectionContext before calling.
|
|
32
|
-
*/
|
|
33
|
-
export interface PrincipleInjector {
|
|
34
|
-
/**
|
|
35
|
-
* Select principles relevant for injection within a character budget.
|
|
36
|
-
*
|
|
37
|
-
* @param principles - All available principles to select from
|
|
38
|
-
* @param context - Generic injection context with budget constraint
|
|
39
|
-
* @returns Selected principles in injection order
|
|
40
|
-
*/
|
|
41
|
-
getRelevantPrinciples(principles: InjectablePrinciple[], context: InjectionContext): InjectablePrinciple[];
|
|
42
|
-
/**
|
|
43
|
-
* Format a single principle for prompt injection.
|
|
44
|
-
*
|
|
45
|
-
* @param principle - The principle to format
|
|
46
|
-
* @returns Formatted string for prompt injection
|
|
47
|
-
*/
|
|
48
|
-
formatForInjection(principle: InjectablePrinciple): string;
|
|
49
|
-
}
|
|
50
|
-
/**
|
|
51
|
-
* Default implementation of PrincipleInjector.
|
|
52
|
-
*
|
|
53
|
-
* A minimal framework-agnostic injector using only SDK types.
|
|
54
|
-
* Selection algorithm:
|
|
55
|
-
* 1. Separate P0 principles (forced inclusion) from P1/P2
|
|
56
|
-
* 2. Sort all principles by priority (P0 first), then by createdAt (oldest first)
|
|
57
|
-
* 3. Include all P0 principles (forced, may exceed budgetChars)
|
|
58
|
-
* 4. Fill remaining budget with P1/P2 principles in priority order
|
|
59
|
-
*
|
|
60
|
-
* Note: P0 forced inclusion may cause total output to exceed budgetChars.
|
|
61
|
-
* Callers should monitor total formatted length against their budget limit.
|
|
62
|
-
*/
|
|
63
|
-
export declare class DefaultPrincipleInjector implements PrincipleInjector {
|
|
64
|
-
getRelevantPrinciples(principles: InjectablePrinciple[], context: InjectionContext): InjectablePrinciple[];
|
|
65
|
-
formatForInjection(principle: InjectablePrinciple): string;
|
|
66
|
-
}
|
|
67
|
-
//# sourceMappingURL=principle-injector.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"principle-injector.d.ts","sourceRoot":"","sources":["../src/principle-injector.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,yCAAyC,CAAC;AAEnF;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,6DAA6D;IAC7D,MAAM,EAAE,MAAM,CAAC;IACf,yBAAyB;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,yDAAyD;IACzD,WAAW,EAAE,MAAM,CAAC;IACpB,8FAA8F;IAC9F,kBAAkB,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;CAClC;AAED;;;;;GAKG;AACH,MAAM,WAAW,iBAAiB;IAChC;;;;;;OAMG;IACH,qBAAqB,CACnB,UAAU,EAAE,mBAAmB,EAAE,EACjC,OAAO,EAAE,gBAAgB,GACxB,mBAAmB,EAAE,CAAC;IAEzB;;;;;OAKG;IACH,kBAAkB,CAAC,SAAS,EAAE,mBAAmB,GAAG,MAAM,CAAC;CAC5D;AAuBD;;;;;;;;;;;;GAYG;AACH,qBAAa,wBAAyB,YAAW,iBAAiB;IAChE,qBAAqB,CACnB,UAAU,EAAE,mBAAmB,EAAE,EACjC,OAAO,EAAE,gBAAgB,GACxB,mBAAmB,EAAE,CAyDvB;IAGD,kBAAkB,CAAC,SAAS,EAAE,mBAAmB,GAAG,MAAM,CAEzD;CACF"}
|
|
@@ -1,89 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Priority order for principle selection.
|
|
3
|
-
*/
|
|
4
|
-
const PRIORITY_ORDER = {
|
|
5
|
-
'P0': 0,
|
|
6
|
-
'P1': 1,
|
|
7
|
-
'P2': 2,
|
|
8
|
-
};
|
|
9
|
-
/**
|
|
10
|
-
* Parse a priority string to its numeric order value.
|
|
11
|
-
* @throws Error if priority is unknown (not P0, P1, or P2)
|
|
12
|
-
*/
|
|
13
|
-
function priorityValue(priority) {
|
|
14
|
-
const p = PRIORITY_ORDER[priority ?? 'P1'];
|
|
15
|
-
if (p === undefined) {
|
|
16
|
-
throw new Error(`Unknown principle priority: ${priority}`);
|
|
17
|
-
}
|
|
18
|
-
return p;
|
|
19
|
-
}
|
|
20
|
-
/**
|
|
21
|
-
* Default implementation of PrincipleInjector.
|
|
22
|
-
*
|
|
23
|
-
* A minimal framework-agnostic injector using only SDK types.
|
|
24
|
-
* Selection algorithm:
|
|
25
|
-
* 1. Separate P0 principles (forced inclusion) from P1/P2
|
|
26
|
-
* 2. Sort all principles by priority (P0 first), then by createdAt (oldest first)
|
|
27
|
-
* 3. Include all P0 principles (forced, may exceed budgetChars)
|
|
28
|
-
* 4. Fill remaining budget with P1/P2 principles in priority order
|
|
29
|
-
*
|
|
30
|
-
* Note: P0 forced inclusion may cause total output to exceed budgetChars.
|
|
31
|
-
* Callers should monitor total formatted length against their budget limit.
|
|
32
|
-
*/
|
|
33
|
-
export class DefaultPrincipleInjector {
|
|
34
|
-
getRelevantPrinciples(principles, context) {
|
|
35
|
-
if (!principles || principles.length === 0) {
|
|
36
|
-
return [];
|
|
37
|
-
}
|
|
38
|
-
// Apply masking filter before selection
|
|
39
|
-
const maskedIds = context.maskedPrincipleIds;
|
|
40
|
-
const unmasked = maskedIds && maskedIds.size > 0
|
|
41
|
-
? principles.filter((p) => !maskedIds.has(p.id))
|
|
42
|
-
: principles;
|
|
43
|
-
if (unmasked.length === 0) {
|
|
44
|
-
return [];
|
|
45
|
-
}
|
|
46
|
-
// Separate P0 from P1/P2
|
|
47
|
-
const p0Principles = unmasked.filter((p) => p.priority === 'P0');
|
|
48
|
-
const otherPrinciples = unmasked.filter((p) => p.priority !== 'P0');
|
|
49
|
-
// Pre-parse dates once to avoid repeated Date allocations during sort
|
|
50
|
-
const p0WithEpoch = p0Principles.map((p) => ({
|
|
51
|
-
p,
|
|
52
|
-
epoch: new Date(p.createdAt).getTime(),
|
|
53
|
-
}));
|
|
54
|
-
p0WithEpoch.sort((a, b) => a.epoch - b.epoch);
|
|
55
|
-
const othersWithEpoch = otherPrinciples.map((p) => ({
|
|
56
|
-
p,
|
|
57
|
-
priorityVal: priorityValue(p.priority),
|
|
58
|
-
epoch: new Date(p.createdAt).getTime(),
|
|
59
|
-
}));
|
|
60
|
-
othersWithEpoch.sort((a, b) => {
|
|
61
|
-
if (a.priorityVal !== b.priorityVal)
|
|
62
|
-
return a.priorityVal - b.priorityVal;
|
|
63
|
-
return a.epoch - b.epoch;
|
|
64
|
-
});
|
|
65
|
-
// Build result: P0 first (forced, may exceed budget), then others
|
|
66
|
-
const result = [];
|
|
67
|
-
let usedChars = 0;
|
|
68
|
-
// ALWAYS include P0 principles (forced inclusion, even if exceeds budget)
|
|
69
|
-
for (const { p } of p0WithEpoch) {
|
|
70
|
-
const formatted = this.formatForInjection(p);
|
|
71
|
-
result.push(p);
|
|
72
|
-
usedChars += formatted.length;
|
|
73
|
-
}
|
|
74
|
-
// Add P1/P2 principles until main budget exhausted
|
|
75
|
-
for (const { p } of othersWithEpoch) {
|
|
76
|
-
const formatted = this.formatForInjection(p);
|
|
77
|
-
if (usedChars + formatted.length <= context.budgetChars) {
|
|
78
|
-
result.push(p);
|
|
79
|
-
usedChars += formatted.length;
|
|
80
|
-
}
|
|
81
|
-
}
|
|
82
|
-
return result;
|
|
83
|
-
}
|
|
84
|
-
// eslint-disable-next-line @typescript-eslint/class-methods-use-this
|
|
85
|
-
formatForInjection(principle) {
|
|
86
|
-
return `- [${principle.id}] ${principle.text}`;
|
|
87
|
-
}
|
|
88
|
-
}
|
|
89
|
-
//# sourceMappingURL=principle-injector.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"principle-injector.js","sourceRoot":"","sources":["../src/principle-injector.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"principle-injector.test.d.ts","sourceRoot":"","sources":["../src/principle-injector.test.ts"],"names":[],"mappings":""}
|
|
@@ -1,158 +0,0 @@
|
|
|
1
|
-
import { describe, it, expect } from 'vitest';
|
|
2
|
-
import { DefaultPrincipleInjector } from './principle-injector.js';
|
|
3
|
-
function makeP(id, text, opts = {}) {
|
|
4
|
-
return {
|
|
5
|
-
id,
|
|
6
|
-
text,
|
|
7
|
-
priority: opts.priority ?? 'P1',
|
|
8
|
-
createdAt: opts.createdAt ?? '2026-01-01T00:00:00.000Z',
|
|
9
|
-
};
|
|
10
|
-
}
|
|
11
|
-
describe('DefaultPrincipleInjector', () => {
|
|
12
|
-
describe('formatForInjection', () => {
|
|
13
|
-
it('formats principle with id and text', () => {
|
|
14
|
-
const injector = new DefaultPrincipleInjector();
|
|
15
|
-
expect(injector.formatForInjection(makeP('P0-001', 'Be careful'))).toBe('- [P0-001] Be careful');
|
|
16
|
-
});
|
|
17
|
-
it('handles empty text', () => {
|
|
18
|
-
const injector = new DefaultPrincipleInjector();
|
|
19
|
-
expect(injector.formatForInjection(makeP('P1-001', ''))).toBe('- [P1-001] ');
|
|
20
|
-
});
|
|
21
|
-
});
|
|
22
|
-
describe('getRelevantPrinciples', () => {
|
|
23
|
-
it('returns empty array for empty input', () => {
|
|
24
|
-
const injector = new DefaultPrincipleInjector();
|
|
25
|
-
const context = { domain: 'test', sessionId: 's1', budgetChars: 4000 };
|
|
26
|
-
const result = injector.getRelevantPrinciples([], context);
|
|
27
|
-
expect(result).toEqual([]);
|
|
28
|
-
});
|
|
29
|
-
it('returns empty array for null input', () => {
|
|
30
|
-
const injector = new DefaultPrincipleInjector();
|
|
31
|
-
const context = { domain: 'test', sessionId: 's1', budgetChars: 4000 };
|
|
32
|
-
const result = injector.getRelevantPrinciples(null, context);
|
|
33
|
-
expect(result).toEqual([]);
|
|
34
|
-
});
|
|
35
|
-
it('P0 principles are always included (forced)', () => {
|
|
36
|
-
const injector = new DefaultPrincipleInjector();
|
|
37
|
-
const p0 = makeP('P0-001', 'Critical principle', { priority: 'P0' });
|
|
38
|
-
const p1 = makeP('P1-001', 'Normal principle', { priority: 'P1' });
|
|
39
|
-
const context = { domain: 'test', sessionId: 's1', budgetChars: 4000 };
|
|
40
|
-
const result = injector.getRelevantPrinciples([p0, p1], context);
|
|
41
|
-
expect(result).toContainEqual(expect.objectContaining({ id: 'P0-001' }));
|
|
42
|
-
});
|
|
43
|
-
it('P0 included even when exceeding budget', () => {
|
|
44
|
-
const injector = new DefaultPrincipleInjector();
|
|
45
|
-
const p0 = makeP('P0-001', 'X'.repeat(5000), { priority: 'P0' });
|
|
46
|
-
const context = { domain: 'test', sessionId: 's1', budgetChars: 100 };
|
|
47
|
-
const result = injector.getRelevantPrinciples([p0], context);
|
|
48
|
-
expect(result).toHaveLength(1);
|
|
49
|
-
expect(result[0]?.id).toBe('P0-001');
|
|
50
|
-
});
|
|
51
|
-
it('P0 principles sorted by createdAt (oldest first)', () => {
|
|
52
|
-
const injector = new DefaultPrincipleInjector();
|
|
53
|
-
const p0Old = makeP('P0-001', 'Old', { priority: 'P0', createdAt: '2026-01-01T00:00:00.000Z' });
|
|
54
|
-
const p0New = makeP('P0-002', 'New', { priority: 'P0', createdAt: '2026-06-01T00:00:00.000Z' });
|
|
55
|
-
const context = { domain: 'test', sessionId: 's1', budgetChars: 4000 };
|
|
56
|
-
const result = injector.getRelevantPrinciples([p0New, p0Old], context);
|
|
57
|
-
expect(result[0]?.id).toBe('P0-001');
|
|
58
|
-
expect(result[1]?.id).toBe('P0-002');
|
|
59
|
-
});
|
|
60
|
-
it('P1 principles sorted by priority then createdAt', () => {
|
|
61
|
-
const injector = new DefaultPrincipleInjector();
|
|
62
|
-
const p1Old = makeP('P1-001', 'Old', { priority: 'P1', createdAt: '2026-01-01T00:00:00.000Z' });
|
|
63
|
-
const p1New = makeP('P1-002', 'New', { priority: 'P1', createdAt: '2026-06-01T00:00:00.000Z' });
|
|
64
|
-
const context = { domain: 'test', sessionId: 's1', budgetChars: 4000 };
|
|
65
|
-
const result = injector.getRelevantPrinciples([p1New, p1Old], context);
|
|
66
|
-
expect(result[0]?.id).toBe('P1-001');
|
|
67
|
-
expect(result[1]?.id).toBe('P1-002');
|
|
68
|
-
});
|
|
69
|
-
it('maskedPrincipleIds filters out excluded principles', () => {
|
|
70
|
-
const injector = new DefaultPrincipleInjector();
|
|
71
|
-
const p0 = makeP('P0-001', 'Critical', { priority: 'P0' });
|
|
72
|
-
const p1 = makeP('P1-001', 'Masked', { priority: 'P1' });
|
|
73
|
-
const context = {
|
|
74
|
-
domain: 'test',
|
|
75
|
-
sessionId: 's1',
|
|
76
|
-
budgetChars: 4000,
|
|
77
|
-
maskedPrincipleIds: new Set(['P1-001']),
|
|
78
|
-
};
|
|
79
|
-
const result = injector.getRelevantPrinciples([p0, p1], context);
|
|
80
|
-
expect(result).toHaveLength(1);
|
|
81
|
-
expect(result[0]?.id).toBe('P0-001');
|
|
82
|
-
});
|
|
83
|
-
it('maskedPrincipleIds empty set has no effect', () => {
|
|
84
|
-
const injector = new DefaultPrincipleInjector();
|
|
85
|
-
const p0 = makeP('P0-001', 'Critical', { priority: 'P0' });
|
|
86
|
-
const p1 = makeP('P1-001', 'Normal', { priority: 'P1' });
|
|
87
|
-
const context = {
|
|
88
|
-
domain: 'test',
|
|
89
|
-
sessionId: 's1',
|
|
90
|
-
budgetChars: 4000,
|
|
91
|
-
maskedPrincipleIds: new Set(),
|
|
92
|
-
};
|
|
93
|
-
const result = injector.getRelevantPrinciples([p0, p1], context);
|
|
94
|
-
expect(result).toHaveLength(2);
|
|
95
|
-
});
|
|
96
|
-
it('all masked principles returns empty', () => {
|
|
97
|
-
const injector = new DefaultPrincipleInjector();
|
|
98
|
-
const p0 = makeP('P0-001', 'Critical', { priority: 'P0' });
|
|
99
|
-
const context = {
|
|
100
|
-
domain: 'test',
|
|
101
|
-
sessionId: 's1',
|
|
102
|
-
budgetChars: 4000,
|
|
103
|
-
maskedPrincipleIds: new Set(['P0-001']),
|
|
104
|
-
};
|
|
105
|
-
const result = injector.getRelevantPrinciples([p0], context);
|
|
106
|
-
expect(result).toEqual([]);
|
|
107
|
-
});
|
|
108
|
-
it('throws on unknown priority', () => {
|
|
109
|
-
const injector = new DefaultPrincipleInjector();
|
|
110
|
-
const invalidP = { id: 'P9-001', text: 'Invalid', priority: 'P9', createdAt: '2026-01-01T00:00:00.000Z' };
|
|
111
|
-
const context = { domain: 'test', sessionId: 's1', budgetChars: 4000 };
|
|
112
|
-
expect(() => injector.getRelevantPrinciples([invalidP], context)).toThrow('Unknown principle priority: P9');
|
|
113
|
-
});
|
|
114
|
-
it('undefined priority defaults to P1', () => {
|
|
115
|
-
const injector = new DefaultPrincipleInjector();
|
|
116
|
-
// Construct directly without `makeP` so the `priority` field is genuinely
|
|
117
|
-
// absent. `makeP` applies `opts.priority ?? 'P1'`, which would mask the
|
|
118
|
-
// undefined-priority branch (priorityValue() falls back to 'P1').
|
|
119
|
-
const p = { id: 'P-001', text: 'Default', createdAt: '2026-01-01T00:00:00.000Z' };
|
|
120
|
-
const context = { domain: 'test', sessionId: 's1', budgetChars: 4000 };
|
|
121
|
-
const result = injector.getRelevantPrinciples([p], context);
|
|
122
|
-
expect(result).toHaveLength(1);
|
|
123
|
-
});
|
|
124
|
-
it('P1 before P2 in priority order', () => {
|
|
125
|
-
const injector = new DefaultPrincipleInjector();
|
|
126
|
-
const p1 = makeP('P1-001', 'P1', { priority: 'P1' });
|
|
127
|
-
const p2 = makeP('P2-001', 'P2', { priority: 'P2' });
|
|
128
|
-
const context = { domain: 'test', sessionId: 's1', budgetChars: 4000 };
|
|
129
|
-
const result = injector.getRelevantPrinciples([p2, p1], context);
|
|
130
|
-
expect(result[0]?.id).toBe('P1-001');
|
|
131
|
-
expect(result[1]?.id).toBe('P2-001');
|
|
132
|
-
});
|
|
133
|
-
it('P0 fills budget first, then P1/P2', () => {
|
|
134
|
-
const injector = new DefaultPrincipleInjector();
|
|
135
|
-
const p0 = makeP('P0-001', 'Critical', { priority: 'P0' });
|
|
136
|
-
const p1a = makeP('P1-001', 'A'.repeat(100), { priority: 'P1' });
|
|
137
|
-
const p1b = makeP('P1-002', 'B'.repeat(100), { priority: 'P1' });
|
|
138
|
-
const context = { domain: 'test', sessionId: 's1', budgetChars: 300 };
|
|
139
|
-
const result = injector.getRelevantPrinciples([p1a, p0, p1b], context);
|
|
140
|
-
expect(result[0]?.id).toBe('P0-001');
|
|
141
|
-
expect(result.length).toBeGreaterThanOrEqual(2);
|
|
142
|
-
});
|
|
143
|
-
it('returns empty when all principles are masked', () => {
|
|
144
|
-
const injector = new DefaultPrincipleInjector();
|
|
145
|
-
const p0 = makeP('P0-001', 'P0', { priority: 'P0' });
|
|
146
|
-
const p1 = makeP('P1-001', 'P1', { priority: 'P1' });
|
|
147
|
-
const context = {
|
|
148
|
-
domain: 'test',
|
|
149
|
-
sessionId: 's1',
|
|
150
|
-
budgetChars: 4000,
|
|
151
|
-
maskedPrincipleIds: new Set(['P0-001', 'P1-001']),
|
|
152
|
-
};
|
|
153
|
-
const result = injector.getRelevantPrinciples([p0, p1], context);
|
|
154
|
-
expect(result).toEqual([]);
|
|
155
|
-
});
|
|
156
|
-
});
|
|
157
|
-
});
|
|
158
|
-
//# sourceMappingURL=principle-injector.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"principle-injector.test.js","sourceRoot":"","sources":["../src/principle-injector.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"pain-signal-unification.test.d.ts","sourceRoot":"","sources":["../../../src/runtime-v2/__tests__/pain-signal-unification.test.ts"],"names":[],"mappings":""}
|
|
@@ -1,150 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* PRI-443: Pain signal unification tests.
|
|
3
|
-
*
|
|
4
|
-
* Verifies that the top-level pain-signal.ts re-exports from
|
|
5
|
-
* runtime-v2/types/pain-signal.ts and that the unified schema
|
|
6
|
-
* includes the stricter validations from both versions:
|
|
7
|
-
* - ISO 8601 timestamp format check (from top-level)
|
|
8
|
-
* - Context size limit (from top-level)
|
|
9
|
-
* - version field (from top-level)
|
|
10
|
-
* - isStringRecord type guard instead of `as` (from runtime-v2)
|
|
11
|
-
*/
|
|
12
|
-
import { describe, it, expect } from 'vitest';
|
|
13
|
-
import { readFileSync } from 'node:fs';
|
|
14
|
-
import { resolve } from 'node:path';
|
|
15
|
-
import { validatePainSignal, deriveSeverity, PainSignalSchema } from '../../pain-signal.js';
|
|
16
|
-
// Import from runtime-v2 (the canonical source)
|
|
17
|
-
import { validatePainSignal as validatePainSignalV2, PainSignalSchema as PainSignalSchemaV2, } from '../types/pain-signal.js';
|
|
18
|
-
describe('PRI-443: pain-signal.ts unification', () => {
|
|
19
|
-
it('top-level pain-signal.ts re-exports from runtime-v2 (no duplicate code)', () => {
|
|
20
|
-
const src = readFileSync(resolve(__dirname, '..', '..', '..', 'src', 'pain-signal.ts'), 'utf-8');
|
|
21
|
-
// Should NOT contain schema definition — only re-export
|
|
22
|
-
expect(src).not.toMatch(/export\s+const\s+PainSignalSchema\s*=/);
|
|
23
|
-
expect(src).not.toMatch(/export\s+function\s+validatePainSignal\s*\(/);
|
|
24
|
-
// Should contain re-export
|
|
25
|
-
expect(src).toMatch(/from\s+['"]\.\/runtime-v2\/types\/pain-signal\.js['"]/);
|
|
26
|
-
});
|
|
27
|
-
it('top-level and runtime-v2 validatePainSignal are the same function', () => {
|
|
28
|
-
expect(validatePainSignal).toBe(validatePainSignalV2);
|
|
29
|
-
});
|
|
30
|
-
it('top-level and runtime-v2 PainSignalSchema are the same object', () => {
|
|
31
|
-
expect(PainSignalSchema).toBe(PainSignalSchemaV2);
|
|
32
|
-
});
|
|
33
|
-
it('rejects invalid ISO 8601 timestamp', () => {
|
|
34
|
-
const signal = {
|
|
35
|
-
source: 'tool_failure',
|
|
36
|
-
score: 75,
|
|
37
|
-
timestamp: 'not-a-date',
|
|
38
|
-
reason: 'Test',
|
|
39
|
-
sessionId: 'sess-123',
|
|
40
|
-
agentId: 'main',
|
|
41
|
-
traceId: 'trace-abc',
|
|
42
|
-
triggerTextPreview: 'test',
|
|
43
|
-
domain: 'coding',
|
|
44
|
-
severity: 'high',
|
|
45
|
-
context: {},
|
|
46
|
-
};
|
|
47
|
-
const result = validatePainSignal(signal);
|
|
48
|
-
expect(result.valid).toBe(false);
|
|
49
|
-
expect(result.errors.some((e) => e.includes('timestamp'))).toBe(true);
|
|
50
|
-
});
|
|
51
|
-
it('rejects context exceeding 10KB size limit', () => {
|
|
52
|
-
const largeContext = {};
|
|
53
|
-
const bigString = 'x'.repeat(11_000);
|
|
54
|
-
largeContext.big = bigString;
|
|
55
|
-
const signal = {
|
|
56
|
-
source: 'tool_failure',
|
|
57
|
-
score: 75,
|
|
58
|
-
timestamp: '2026-01-01T00:00:00Z',
|
|
59
|
-
reason: 'Test',
|
|
60
|
-
sessionId: 'sess-123',
|
|
61
|
-
agentId: 'main',
|
|
62
|
-
traceId: 'trace-abc',
|
|
63
|
-
triggerTextPreview: 'test',
|
|
64
|
-
domain: 'coding',
|
|
65
|
-
severity: 'high',
|
|
66
|
-
context: largeContext,
|
|
67
|
-
};
|
|
68
|
-
const result = validatePainSignal(signal);
|
|
69
|
-
expect(result.valid).toBe(false);
|
|
70
|
-
expect(result.errors.some((e) => e.includes('Context'))).toBe(true);
|
|
71
|
-
});
|
|
72
|
-
it('rejects context with circular references without crashing (PR review fix)', () => {
|
|
73
|
-
const circularContext = {};
|
|
74
|
-
circularContext.self = circularContext;
|
|
75
|
-
const signal = {
|
|
76
|
-
source: 'tool_failure',
|
|
77
|
-
score: 75,
|
|
78
|
-
timestamp: '2026-01-01T00:00:00Z',
|
|
79
|
-
reason: 'Test',
|
|
80
|
-
sessionId: 'sess-123',
|
|
81
|
-
agentId: 'main',
|
|
82
|
-
traceId: 'trace-abc',
|
|
83
|
-
triggerTextPreview: 'test',
|
|
84
|
-
domain: 'coding',
|
|
85
|
-
severity: 'high',
|
|
86
|
-
context: circularContext,
|
|
87
|
-
};
|
|
88
|
-
const result = validatePainSignal(signal);
|
|
89
|
-
expect(result.valid).toBe(false);
|
|
90
|
-
expect(result.errors.some((e) => e.includes('JSON-serializable'))).toBe(true);
|
|
91
|
-
});
|
|
92
|
-
it('rejects context with BigInt values without crashing (PR review fix)', () => {
|
|
93
|
-
const signal = {
|
|
94
|
-
source: 'tool_failure',
|
|
95
|
-
score: 75,
|
|
96
|
-
timestamp: '2026-01-01T00:00:00Z',
|
|
97
|
-
reason: 'Test',
|
|
98
|
-
sessionId: 'sess-123',
|
|
99
|
-
agentId: 'main',
|
|
100
|
-
traceId: 'trace-abc',
|
|
101
|
-
triggerTextPreview: 'test',
|
|
102
|
-
domain: 'coding',
|
|
103
|
-
severity: 'high',
|
|
104
|
-
context: { bigNum: BigInt(123) },
|
|
105
|
-
};
|
|
106
|
-
const result = validatePainSignal(signal);
|
|
107
|
-
expect(result.valid).toBe(false);
|
|
108
|
-
expect(result.errors.some((e) => e.includes('JSON-serializable'))).toBe(true);
|
|
109
|
-
});
|
|
110
|
-
it('accepts signal with optional sessionId/agentId/traceId missing', () => {
|
|
111
|
-
const signal = {
|
|
112
|
-
source: 'tool_failure',
|
|
113
|
-
score: 75,
|
|
114
|
-
timestamp: '2026-01-01T00:00:00Z',
|
|
115
|
-
reason: 'Test',
|
|
116
|
-
triggerTextPreview: 'test',
|
|
117
|
-
domain: 'coding',
|
|
118
|
-
severity: 'high',
|
|
119
|
-
context: {},
|
|
120
|
-
};
|
|
121
|
-
const result = validatePainSignal(signal);
|
|
122
|
-
expect(result.valid).toBe(true);
|
|
123
|
-
});
|
|
124
|
-
it('includes version field in validated signal', () => {
|
|
125
|
-
const signal = {
|
|
126
|
-
source: 'tool_failure',
|
|
127
|
-
score: 75,
|
|
128
|
-
timestamp: '2026-01-01T00:00:00Z',
|
|
129
|
-
reason: 'Test',
|
|
130
|
-
sessionId: 'sess-123',
|
|
131
|
-
agentId: 'main',
|
|
132
|
-
traceId: 'trace-abc',
|
|
133
|
-
triggerTextPreview: 'test',
|
|
134
|
-
domain: 'coding',
|
|
135
|
-
severity: 'high',
|
|
136
|
-
context: {},
|
|
137
|
-
};
|
|
138
|
-
const result = validatePainSignal(signal);
|
|
139
|
-
expect(result.valid).toBe(true);
|
|
140
|
-
expect(result.signal?.version).toBe('0.1.0');
|
|
141
|
-
});
|
|
142
|
-
it('PainSeverity type is exported', () => {
|
|
143
|
-
const s = 'low';
|
|
144
|
-
expect(s).toBe('low');
|
|
145
|
-
});
|
|
146
|
-
it('deriveSeverity is exported and works', () => {
|
|
147
|
-
expect(deriveSeverity(95)).toBe('critical');
|
|
148
|
-
});
|
|
149
|
-
});
|
|
150
|
-
//# sourceMappingURL=pain-signal-unification.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"pain-signal-unification.test.js","sourceRoot":"","sources":["../../../src/runtime-v2/__tests__/pain-signal-unification.test.ts"],"names":[],"mappings":"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"}
|