@principles/core 1.103.0 → 1.105.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/evidence-triage/__tests__/admission-events.test.d.ts +7 -0
- package/dist/runtime-v2/evidence-triage/__tests__/admission-events.test.d.ts.map +1 -0
- package/dist/runtime-v2/evidence-triage/__tests__/admission-events.test.js +170 -0
- package/dist/runtime-v2/evidence-triage/__tests__/admission-events.test.js.map +1 -0
- package/dist/runtime-v2/evidence-triage/__tests__/source-descriptors.test.js +1 -1
- package/dist/runtime-v2/evidence-triage/__tests__/source-descriptors.test.js.map +1 -1
- package/dist/runtime-v2/evidence-triage/__tests__/trigger-controller.test.d.ts +16 -0
- package/dist/runtime-v2/evidence-triage/__tests__/trigger-controller.test.d.ts.map +1 -0
- package/dist/runtime-v2/evidence-triage/__tests__/trigger-controller.test.js +316 -0
- package/dist/runtime-v2/evidence-triage/__tests__/trigger-controller.test.js.map +1 -0
- package/dist/runtime-v2/evidence-triage/admission-events.d.ts +126 -0
- package/dist/runtime-v2/evidence-triage/admission-events.d.ts.map +1 -0
- package/dist/runtime-v2/evidence-triage/admission-events.js +159 -0
- package/dist/runtime-v2/evidence-triage/admission-events.js.map +1 -0
- package/dist/runtime-v2/evidence-triage/index.d.ts +6 -2
- package/dist/runtime-v2/evidence-triage/index.d.ts.map +1 -1
- package/dist/runtime-v2/evidence-triage/index.js +4 -2
- package/dist/runtime-v2/evidence-triage/index.js.map +1 -1
- package/dist/runtime-v2/evidence-triage/trigger-controller.d.ts +116 -0
- package/dist/runtime-v2/evidence-triage/trigger-controller.d.ts.map +1 -0
- package/dist/runtime-v2/evidence-triage/trigger-controller.js +218 -0
- package/dist/runtime-v2/evidence-triage/trigger-controller.js.map +1 -0
- package/dist/runtime-v2/index.d.ts +2 -2
- package/dist/runtime-v2/index.d.ts.map +1 -1
- package/dist/runtime-v2/index.js +1 -1
- package/dist/runtime-v2/index.js.map +1 -1
- package/package.json +2 -2
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Admission Events — PEAT-B2
|
|
3
|
+
*
|
|
4
|
+
* Structured event types for the pain evidence admission pipeline.
|
|
5
|
+
* These events make admission decisions observable without exposing raw data.
|
|
6
|
+
*
|
|
7
|
+
* Privacy boundary: events MUST NOT contain raw prompt, raw chat, raw trajectory,
|
|
8
|
+
* full local paths, file contents, env vars, tokens, or API keys.
|
|
9
|
+
*
|
|
10
|
+
* ERR checklist:
|
|
11
|
+
* - ERR-002: Every event has reason + nextAction.
|
|
12
|
+
* - ERR-009: Malformed input events include validation error details.
|
|
13
|
+
*/
|
|
14
|
+
import type { TriggerOutcome, TriggerDecision } from './trigger-controller.js';
|
|
15
|
+
import type { SourceKind, TriageDecision } from './types.js';
|
|
16
|
+
/**
|
|
17
|
+
* Base fields shared by all admission events.
|
|
18
|
+
*/
|
|
19
|
+
interface AdmissionEventBase {
|
|
20
|
+
/** Unique event ID */
|
|
21
|
+
readonly eventId: string;
|
|
22
|
+
/** ISO timestamp */
|
|
23
|
+
readonly timestamp: string;
|
|
24
|
+
/** Source kind that was evaluated */
|
|
25
|
+
readonly sourceKind: SourceKind;
|
|
26
|
+
/** Workspace reference (directory name only, no full path) */
|
|
27
|
+
readonly workspaceRef: string;
|
|
28
|
+
/** Session ID (may be truncated for privacy) */
|
|
29
|
+
readonly sessionId?: string;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Emitted when the admission controller makes a decision.
|
|
33
|
+
* This is the primary observability event for the admission pipeline.
|
|
34
|
+
*/
|
|
35
|
+
export interface AdmissionDecisionEvent extends AdmissionEventBase {
|
|
36
|
+
readonly eventType: 'admission_decision';
|
|
37
|
+
readonly triageDecision: TriageDecision;
|
|
38
|
+
readonly triggerOutcome: TriggerOutcome;
|
|
39
|
+
readonly reason: string;
|
|
40
|
+
readonly nextAction: string;
|
|
41
|
+
readonly shouldCreateDiagnosticTask: boolean;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Emitted when a diagnostic task is created as a result of admission.
|
|
45
|
+
*/
|
|
46
|
+
export interface DiagnosisTaskCreatedEvent extends AdmissionEventBase {
|
|
47
|
+
readonly eventType: 'diagnosis_task_created';
|
|
48
|
+
readonly painId: string;
|
|
49
|
+
readonly taskId: string;
|
|
50
|
+
readonly triggerOutcome: TriggerOutcome;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Emitted when evidence is recorded without triggering diagnosis.
|
|
54
|
+
*/
|
|
55
|
+
export interface EvidenceOnlyRecordedEvent extends AdmissionEventBase {
|
|
56
|
+
readonly eventType: 'evidence_only_recorded';
|
|
57
|
+
readonly triageDecision: TriageDecision;
|
|
58
|
+
readonly reason: string;
|
|
59
|
+
readonly nextAction: string;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Emitted when a signal is skipped or refused.
|
|
63
|
+
*/
|
|
64
|
+
export interface SkippedRefusedEvent extends AdmissionEventBase {
|
|
65
|
+
readonly eventType: 'skipped_refused';
|
|
66
|
+
readonly triggerOutcome: TriggerOutcome;
|
|
67
|
+
readonly reason: string;
|
|
68
|
+
readonly nextAction: string;
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Union of all admission event types.
|
|
72
|
+
*/
|
|
73
|
+
export type AdmissionEvent = AdmissionDecisionEvent | DiagnosisTaskCreatedEvent | EvidenceOnlyRecordedEvent | SkippedRefusedEvent;
|
|
74
|
+
/**
|
|
75
|
+
* Create an AdmissionDecisionEvent from a TriggerDecision.
|
|
76
|
+
*
|
|
77
|
+
* This is the canonical way to produce an admission event.
|
|
78
|
+
* The event contains no raw sensitive data — only structured metadata.
|
|
79
|
+
*/
|
|
80
|
+
export declare function createAdmissionDecisionEvent(decision: TriggerDecision, options: {
|
|
81
|
+
workspaceRef: string;
|
|
82
|
+
sessionId?: string;
|
|
83
|
+
}): AdmissionDecisionEvent;
|
|
84
|
+
/**
|
|
85
|
+
* Create a DiagnosisTaskCreatedEvent.
|
|
86
|
+
*/
|
|
87
|
+
export declare function createDiagnosisTaskCreatedEvent(opts: {
|
|
88
|
+
painId: string;
|
|
89
|
+
taskId: string;
|
|
90
|
+
decision: TriggerDecision;
|
|
91
|
+
workspaceRef: string;
|
|
92
|
+
sessionId?: string;
|
|
93
|
+
}): DiagnosisTaskCreatedEvent;
|
|
94
|
+
/**
|
|
95
|
+
* Create an EvidenceOnlyRecordedEvent.
|
|
96
|
+
*/
|
|
97
|
+
export declare function createEvidenceOnlyRecordedEvent(decision: TriggerDecision, options: {
|
|
98
|
+
workspaceRef: string;
|
|
99
|
+
sessionId?: string;
|
|
100
|
+
}): EvidenceOnlyRecordedEvent;
|
|
101
|
+
/**
|
|
102
|
+
* Create a SkippedRefusedEvent.
|
|
103
|
+
*/
|
|
104
|
+
export declare function createSkippedRefusedEvent(decision: TriggerDecision, options: {
|
|
105
|
+
workspaceRef: string;
|
|
106
|
+
sessionId?: string;
|
|
107
|
+
}): SkippedRefusedEvent;
|
|
108
|
+
/**
|
|
109
|
+
* Serialize an admission event to a JSONL-safe string.
|
|
110
|
+
*
|
|
111
|
+
* Privacy boundary: only structured fields are included.
|
|
112
|
+
* No raw prompt/chat/trajectory/file content/token/path secrets.
|
|
113
|
+
*/
|
|
114
|
+
export declare function serializeAdmissionEvent(event: AdmissionEvent): string;
|
|
115
|
+
/**
|
|
116
|
+
* Validate that an admission event does not contain raw sensitive data.
|
|
117
|
+
*
|
|
118
|
+
* Returns true if the event passes privacy checks.
|
|
119
|
+
* This is a defense-in-depth check for tests and auditing.
|
|
120
|
+
*/
|
|
121
|
+
export declare function validateEventPrivacy(event: AdmissionEvent): {
|
|
122
|
+
valid: boolean;
|
|
123
|
+
violations: string[];
|
|
124
|
+
};
|
|
125
|
+
export {};
|
|
126
|
+
//# sourceMappingURL=admission-events.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"admission-events.d.ts","sourceRoot":"","sources":["../../../src/runtime-v2/evidence-triage/admission-events.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC/E,OAAO,KAAK,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAI7D;;GAEG;AACH,UAAU,kBAAkB;IAC1B,sBAAsB;IACtB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,oBAAoB;IACpB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,qCAAqC;IACrC,QAAQ,CAAC,UAAU,EAAE,UAAU,CAAC;IAChC,8DAA8D;IAC9D,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,gDAAgD;IAChD,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED;;;GAGG;AACH,MAAM,WAAW,sBAAuB,SAAQ,kBAAkB;IAChE,QAAQ,CAAC,SAAS,EAAE,oBAAoB,CAAC;IACzC,QAAQ,CAAC,cAAc,EAAE,cAAc,CAAC;IACxC,QAAQ,CAAC,cAAc,EAAE,cAAc,CAAC;IACxC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,0BAA0B,EAAE,OAAO,CAAC;CAC9C;AAED;;GAEG;AACH,MAAM,WAAW,yBAA0B,SAAQ,kBAAkB;IACnE,QAAQ,CAAC,SAAS,EAAE,wBAAwB,CAAC;IAC7C,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,cAAc,EAAE,cAAc,CAAC;CACzC;AAED;;GAEG;AACH,MAAM,WAAW,yBAA0B,SAAQ,kBAAkB;IACnE,QAAQ,CAAC,SAAS,EAAE,wBAAwB,CAAC;IAC7C,QAAQ,CAAC,cAAc,EAAE,cAAc,CAAC;IACxC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;CAC7B;AAED;;GAEG;AACH,MAAM,WAAW,mBAAoB,SAAQ,kBAAkB;IAC7D,QAAQ,CAAC,SAAS,EAAE,iBAAiB,CAAC;IACtC,QAAQ,CAAC,cAAc,EAAE,cAAc,CAAC;IACxC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;CAC7B;AAED;;GAEG;AACH,MAAM,MAAM,cAAc,GACtB,sBAAsB,GACtB,yBAAyB,GACzB,yBAAyB,GACzB,mBAAmB,CAAC;AAUxB;;;;;GAKG;AACH,wBAAgB,4BAA4B,CAC1C,QAAQ,EAAE,eAAe,EACzB,OAAO,EAAE;IACP,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,GACA,sBAAsB,CAcxB;AAED;;GAEG;AACH,wBAAgB,+BAA+B,CAC7C,IAAI,EAAE;IACJ,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,eAAe,CAAC;IAC1B,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,GACA,yBAAyB,CAY3B;AAED;;GAEG;AACH,wBAAgB,+BAA+B,CAC7C,QAAQ,EAAE,eAAe,EACzB,OAAO,EAAE;IACP,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,GACA,yBAAyB,CAY3B;AAED;;GAEG;AACH,wBAAgB,yBAAyB,CACvC,QAAQ,EAAE,eAAe,EACzB,OAAO,EAAE;IACP,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,GACA,mBAAmB,CAYrB;AAID;;;;;GAKG;AACH,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,cAAc,GAAG,MAAM,CAgCrE;AAID;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,cAAc,GAAG;IAAE,KAAK,EAAE,OAAO,CAAC;IAAC,UAAU,EAAE,MAAM,EAAE,CAAA;CAAE,CAwBpG"}
|
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Admission Events — PEAT-B2
|
|
3
|
+
*
|
|
4
|
+
* Structured event types for the pain evidence admission pipeline.
|
|
5
|
+
* These events make admission decisions observable without exposing raw data.
|
|
6
|
+
*
|
|
7
|
+
* Privacy boundary: events MUST NOT contain raw prompt, raw chat, raw trajectory,
|
|
8
|
+
* full local paths, file contents, env vars, tokens, or API keys.
|
|
9
|
+
*
|
|
10
|
+
* ERR checklist:
|
|
11
|
+
* - ERR-002: Every event has reason + nextAction.
|
|
12
|
+
* - ERR-009: Malformed input events include validation error details.
|
|
13
|
+
*/
|
|
14
|
+
// ── Event Factory Functions ─────────────────────────────────────────────────
|
|
15
|
+
let eventCounter = 0;
|
|
16
|
+
function nextEventId() {
|
|
17
|
+
return `adm_${Date.now()}_${++eventCounter}`;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Create an AdmissionDecisionEvent from a TriggerDecision.
|
|
21
|
+
*
|
|
22
|
+
* This is the canonical way to produce an admission event.
|
|
23
|
+
* The event contains no raw sensitive data — only structured metadata.
|
|
24
|
+
*/
|
|
25
|
+
export function createAdmissionDecisionEvent(decision, options) {
|
|
26
|
+
return {
|
|
27
|
+
eventType: 'admission_decision',
|
|
28
|
+
eventId: nextEventId(),
|
|
29
|
+
timestamp: decision.decidedAt,
|
|
30
|
+
sourceKind: decision.sourceKind,
|
|
31
|
+
workspaceRef: options.workspaceRef,
|
|
32
|
+
sessionId: options.sessionId,
|
|
33
|
+
triageDecision: decision.triageDecision,
|
|
34
|
+
triggerOutcome: decision.outcome,
|
|
35
|
+
reason: decision.reason,
|
|
36
|
+
nextAction: decision.nextAction,
|
|
37
|
+
shouldCreateDiagnosticTask: decision.shouldCreateDiagnosticTask,
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Create a DiagnosisTaskCreatedEvent.
|
|
42
|
+
*/
|
|
43
|
+
export function createDiagnosisTaskCreatedEvent(opts) {
|
|
44
|
+
return {
|
|
45
|
+
eventType: 'diagnosis_task_created',
|
|
46
|
+
eventId: nextEventId(),
|
|
47
|
+
timestamp: new Date().toISOString(),
|
|
48
|
+
sourceKind: opts.decision.sourceKind,
|
|
49
|
+
workspaceRef: opts.workspaceRef,
|
|
50
|
+
sessionId: opts.sessionId,
|
|
51
|
+
painId: opts.painId,
|
|
52
|
+
taskId: opts.taskId,
|
|
53
|
+
triggerOutcome: opts.decision.outcome,
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Create an EvidenceOnlyRecordedEvent.
|
|
58
|
+
*/
|
|
59
|
+
export function createEvidenceOnlyRecordedEvent(decision, options) {
|
|
60
|
+
return {
|
|
61
|
+
eventType: 'evidence_only_recorded',
|
|
62
|
+
eventId: nextEventId(),
|
|
63
|
+
timestamp: decision.decidedAt,
|
|
64
|
+
sourceKind: decision.sourceKind,
|
|
65
|
+
workspaceRef: options.workspaceRef,
|
|
66
|
+
sessionId: options.sessionId,
|
|
67
|
+
triageDecision: decision.triageDecision,
|
|
68
|
+
reason: decision.reason,
|
|
69
|
+
nextAction: decision.nextAction,
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Create a SkippedRefusedEvent.
|
|
74
|
+
*/
|
|
75
|
+
export function createSkippedRefusedEvent(decision, options) {
|
|
76
|
+
return {
|
|
77
|
+
eventType: 'skipped_refused',
|
|
78
|
+
eventId: nextEventId(),
|
|
79
|
+
timestamp: decision.decidedAt,
|
|
80
|
+
sourceKind: decision.sourceKind,
|
|
81
|
+
workspaceRef: options.workspaceRef,
|
|
82
|
+
sessionId: options.sessionId,
|
|
83
|
+
triggerOutcome: decision.outcome,
|
|
84
|
+
reason: decision.reason,
|
|
85
|
+
nextAction: decision.nextAction,
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
// ── Event Serialization ─────────────────────────────────────────────────────
|
|
89
|
+
/**
|
|
90
|
+
* Serialize an admission event to a JSONL-safe string.
|
|
91
|
+
*
|
|
92
|
+
* Privacy boundary: only structured fields are included.
|
|
93
|
+
* No raw prompt/chat/trajectory/file content/token/path secrets.
|
|
94
|
+
*/
|
|
95
|
+
export function serializeAdmissionEvent(event) {
|
|
96
|
+
// Explicit field selection prevents accidental raw data leakage
|
|
97
|
+
const safe = {
|
|
98
|
+
eventType: event.eventType,
|
|
99
|
+
eventId: event.eventId,
|
|
100
|
+
timestamp: event.timestamp,
|
|
101
|
+
sourceKind: event.sourceKind,
|
|
102
|
+
workspaceRef: event.workspaceRef,
|
|
103
|
+
sessionId: event.sessionId,
|
|
104
|
+
};
|
|
105
|
+
if (event.eventType === 'admission_decision') {
|
|
106
|
+
safe.triageDecision = event.triageDecision;
|
|
107
|
+
safe.triggerOutcome = event.triggerOutcome;
|
|
108
|
+
safe.reason = event.reason;
|
|
109
|
+
safe.nextAction = event.nextAction;
|
|
110
|
+
safe.shouldCreateDiagnosticTask = event.shouldCreateDiagnosticTask;
|
|
111
|
+
}
|
|
112
|
+
else if (event.eventType === 'diagnosis_task_created') {
|
|
113
|
+
safe.painId = event.painId;
|
|
114
|
+
safe.taskId = event.taskId;
|
|
115
|
+
safe.triggerOutcome = event.triggerOutcome;
|
|
116
|
+
}
|
|
117
|
+
else if (event.eventType === 'evidence_only_recorded') {
|
|
118
|
+
safe.triageDecision = event.triageDecision;
|
|
119
|
+
safe.reason = event.reason;
|
|
120
|
+
safe.nextAction = event.nextAction;
|
|
121
|
+
}
|
|
122
|
+
else if (event.eventType === 'skipped_refused') {
|
|
123
|
+
safe.triggerOutcome = event.triggerOutcome;
|
|
124
|
+
safe.reason = event.reason;
|
|
125
|
+
safe.nextAction = event.nextAction;
|
|
126
|
+
}
|
|
127
|
+
return JSON.stringify(safe);
|
|
128
|
+
}
|
|
129
|
+
// ── Validation ──────────────────────────────────────────────────────────────
|
|
130
|
+
/**
|
|
131
|
+
* Validate that an admission event does not contain raw sensitive data.
|
|
132
|
+
*
|
|
133
|
+
* Returns true if the event passes privacy checks.
|
|
134
|
+
* This is a defense-in-depth check for tests and auditing.
|
|
135
|
+
*/
|
|
136
|
+
export function validateEventPrivacy(event) {
|
|
137
|
+
const violations = [];
|
|
138
|
+
const serialized = JSON.stringify(event);
|
|
139
|
+
// Check for common sensitive patterns
|
|
140
|
+
if (/sk-[a-zA-Z0-9]{20,}/.test(serialized)) {
|
|
141
|
+
violations.push('potential_api_key_detected');
|
|
142
|
+
}
|
|
143
|
+
// Check for absolute paths in JSON-serialized form.
|
|
144
|
+
// JSON.stringify('C:\\Users\\admin') produces "C:\\\\Users\\\\admin" in the JSON string.
|
|
145
|
+
// At runtime, serialized.includes('Users\\') checks for Users followed by one backslash.
|
|
146
|
+
const hasWindowsPath = serialized.includes('Users\\') ||
|
|
147
|
+
/[A-Z]:\\[Uu]sers/.test(serialized);
|
|
148
|
+
if (hasWindowsPath) {
|
|
149
|
+
violations.push('absolute_windows_path_detected');
|
|
150
|
+
}
|
|
151
|
+
if (/\/home\/[a-z]/.test(serialized)) {
|
|
152
|
+
violations.push('absolute_unix_path_detected');
|
|
153
|
+
}
|
|
154
|
+
if (/"prompt"\s*:\s*"/.test(serialized) && serialized.length > 2000) {
|
|
155
|
+
violations.push('potential_raw_prompt_in_event');
|
|
156
|
+
}
|
|
157
|
+
return { valid: violations.length === 0, violations };
|
|
158
|
+
}
|
|
159
|
+
//# sourceMappingURL=admission-events.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"admission-events.js","sourceRoot":"","sources":["../../../src/runtime-v2/evidence-triage/admission-events.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Evidence Triage — PEAT-B1
|
|
2
|
+
* Evidence Triage — PEAT-B1 → B2
|
|
3
3
|
*
|
|
4
|
-
* Public API for pre-diagnosis evidence triage.
|
|
4
|
+
* Public API for pre-diagnosis evidence triage and trigger control.
|
|
5
5
|
* Pure types and policy — no I/O, no plugin imports.
|
|
6
6
|
*/
|
|
7
7
|
export type { SourceKind, TriageDecision, TriageResult, TriageInput, } from './types.js';
|
|
@@ -9,4 +9,8 @@ export { isSourceKind } from './types.js';
|
|
|
9
9
|
export type { SourceDescriptor } from './source-descriptors.js';
|
|
10
10
|
export { SOURCE_DESCRIPTORS, getSourceDescriptor } from './source-descriptors.js';
|
|
11
11
|
export { evaluateTriage } from './triage-policy.js';
|
|
12
|
+
export type { TriggerOutcome, TriggerDecision, TriggerControllerInput, } from './trigger-controller.js';
|
|
13
|
+
export { evaluateTriggerController, shouldCreateTask, isAdmittedOutcome, isSkippedOutcome, } from './trigger-controller.js';
|
|
14
|
+
export type { AdmissionDecisionEvent, DiagnosisTaskCreatedEvent, EvidenceOnlyRecordedEvent, SkippedRefusedEvent, AdmissionEvent, } from './admission-events.js';
|
|
15
|
+
export { createAdmissionDecisionEvent, createDiagnosisTaskCreatedEvent, createEvidenceOnlyRecordedEvent, createSkippedRefusedEvent, serializeAdmissionEvent, validateEventPrivacy, } from './admission-events.js';
|
|
12
16
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/runtime-v2/evidence-triage/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,YAAY,EACV,UAAU,EACV,cAAc,EACd,YAAY,EACZ,WAAW,GACZ,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAG1C,YAAY,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAChE,OAAO,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAGlF,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/runtime-v2/evidence-triage/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,YAAY,EACV,UAAU,EACV,cAAc,EACd,YAAY,EACZ,WAAW,GACZ,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAG1C,YAAY,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAChE,OAAO,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAGlF,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAGpD,YAAY,EACV,cAAc,EACd,eAAe,EACf,sBAAsB,GACvB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EACL,yBAAyB,EACzB,gBAAgB,EAChB,iBAAiB,EACjB,gBAAgB,GACjB,MAAM,yBAAyB,CAAC;AAGjC,YAAY,EACV,sBAAsB,EACtB,yBAAyB,EACzB,yBAAyB,EACzB,mBAAmB,EACnB,cAAc,GACf,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACL,4BAA4B,EAC5B,+BAA+B,EAC/B,+BAA+B,EAC/B,yBAAyB,EACzB,uBAAuB,EACvB,oBAAoB,GACrB,MAAM,uBAAuB,CAAC"}
|
|
@@ -1,11 +1,13 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Evidence Triage — PEAT-B1
|
|
2
|
+
* Evidence Triage — PEAT-B1 → B2
|
|
3
3
|
*
|
|
4
|
-
* Public API for pre-diagnosis evidence triage.
|
|
4
|
+
* Public API for pre-diagnosis evidence triage and trigger control.
|
|
5
5
|
* Pure types and policy — no I/O, no plugin imports.
|
|
6
6
|
*/
|
|
7
7
|
export { isSourceKind } from './types.js';
|
|
8
8
|
export { SOURCE_DESCRIPTORS, getSourceDescriptor } from './source-descriptors.js';
|
|
9
9
|
// Triage policy
|
|
10
10
|
export { evaluateTriage } from './triage-policy.js';
|
|
11
|
+
export { evaluateTriggerController, shouldCreateTask, isAdmittedOutcome, isSkippedOutcome, } from './trigger-controller.js';
|
|
12
|
+
export { createAdmissionDecisionEvent, createDiagnosisTaskCreatedEvent, createEvidenceOnlyRecordedEvent, createSkippedRefusedEvent, serializeAdmissionEvent, validateEventPrivacy, } from './admission-events.js';
|
|
11
13
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/runtime-v2/evidence-triage/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAUH,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAI1C,OAAO,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAElF,gBAAgB;AAChB,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/runtime-v2/evidence-triage/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAUH,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAI1C,OAAO,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAElF,gBAAgB;AAChB,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAQpD,OAAO,EACL,yBAAyB,EACzB,gBAAgB,EAChB,iBAAiB,EACjB,gBAAgB,GACjB,MAAM,yBAAyB,CAAC;AAUjC,OAAO,EACL,4BAA4B,EAC5B,+BAA+B,EAC/B,+BAA+B,EAC/B,yBAAyB,EACzB,uBAAuB,EACvB,oBAAoB,GACrB,MAAM,uBAAuB,CAAC"}
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Trigger Controller — PEAT-B2
|
|
3
|
+
*
|
|
4
|
+
* Pure core module that connects triage/admission decisions to a concrete
|
|
5
|
+
* trigger outcome. This is the ONLY module that decides whether a diagnostic
|
|
6
|
+
* task is created.
|
|
7
|
+
*
|
|
8
|
+
* Input: triage result + source descriptor + minimal evidence metadata
|
|
9
|
+
* Output: TriggerDecision with structured outcome
|
|
10
|
+
*
|
|
11
|
+
* Every output carries reason + nextAction (ERR-002).
|
|
12
|
+
* No raw sensitive data in outputs (privacy boundary).
|
|
13
|
+
*
|
|
14
|
+
* ERR checklist:
|
|
15
|
+
* - ERR-001: No `as` casts. Input validated with runtime guards.
|
|
16
|
+
* - ERR-002: Every decision carries reason + nextAction.
|
|
17
|
+
* - ERR-009: Malformed/missing state fails loud with reason.
|
|
18
|
+
* - ERR-025: Production-path wiring, not just helper tests.
|
|
19
|
+
* - ERR-031/034: Config source alignment — decisions from canonical descriptors.
|
|
20
|
+
* - ERR-048: Activation/write-read disconnect prevented by recording decisions.
|
|
21
|
+
*/
|
|
22
|
+
import type { SourceKind, TriageDecision, TriageResult } from './types.js';
|
|
23
|
+
/**
|
|
24
|
+
* The outcome of a trigger controller evaluation.
|
|
25
|
+
*
|
|
26
|
+
* Each variant represents a distinct state that is observable by the owner:
|
|
27
|
+
* - evidence_only: recorded but no diagnosis created
|
|
28
|
+
* - diagnosis_created: diagnostician task was/will be created
|
|
29
|
+
* - diagnosis_skipped: admission was 'admit' but something prevented diagnosis
|
|
30
|
+
* - cooldown_skipped: admitted but cooldown prevented creation
|
|
31
|
+
* - manual_owner_admitted: owner explicit pain bypasses normal gate
|
|
32
|
+
* - refused: malformed or invalid input rejected
|
|
33
|
+
* - health_only: infrastructure health signal only
|
|
34
|
+
* - owner_confirm_required: needs owner confirmation before diagnosis
|
|
35
|
+
*/
|
|
36
|
+
export type TriggerOutcome = 'evidence_only' | 'diagnosis_created' | 'diagnosis_skipped' | 'cooldown_skipped' | 'manual_owner_admitted' | 'refused' | 'health_only' | 'owner_confirm_required';
|
|
37
|
+
/**
|
|
38
|
+
* Structured trigger decision returned by the controller.
|
|
39
|
+
*
|
|
40
|
+
* Every field is required to prevent silent degradation (ERR-002).
|
|
41
|
+
*/
|
|
42
|
+
export interface TriggerDecision {
|
|
43
|
+
/** The trigger outcome */
|
|
44
|
+
readonly outcome: TriggerOutcome;
|
|
45
|
+
/** Human-readable reason for this decision */
|
|
46
|
+
readonly reason: string;
|
|
47
|
+
/** What should happen next */
|
|
48
|
+
readonly nextAction: string;
|
|
49
|
+
/** Source kind that was evaluated */
|
|
50
|
+
readonly sourceKind: SourceKind;
|
|
51
|
+
/** The triage decision that led to this trigger outcome */
|
|
52
|
+
readonly triageDecision: TriageDecision;
|
|
53
|
+
/** Whether this decision should result in a diagnostic task */
|
|
54
|
+
readonly shouldCreateDiagnosticTask: boolean;
|
|
55
|
+
/** Timestamp of the decision */
|
|
56
|
+
readonly decidedAt: string;
|
|
57
|
+
/** Optional operator note for debugging */
|
|
58
|
+
readonly operatorNote?: string;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Input to the trigger controller.
|
|
62
|
+
*
|
|
63
|
+
* Combines triage result with additional context that the trigger controller
|
|
64
|
+
* needs but the triage policy does not.
|
|
65
|
+
*/
|
|
66
|
+
export interface TriggerControllerInput {
|
|
67
|
+
/** Result from evidence triage (PEAT-B1) */
|
|
68
|
+
readonly triageResult: TriageResult;
|
|
69
|
+
/** Whether this is an owner manual pain signal */
|
|
70
|
+
readonly isOwnerManual: boolean;
|
|
71
|
+
/** Whether cooldown is currently active for this source/session */
|
|
72
|
+
readonly isCooldownActive: boolean;
|
|
73
|
+
/** Whether the input was valid (malformed → refused) */
|
|
74
|
+
readonly isValid: boolean;
|
|
75
|
+
/** Optional validation error message when isValid is false */
|
|
76
|
+
readonly validationError?: string;
|
|
77
|
+
/** Pain score (0-100) */
|
|
78
|
+
readonly score: number;
|
|
79
|
+
/** Optional session ID for cooldown scoping */
|
|
80
|
+
readonly sessionId?: string;
|
|
81
|
+
/** Whether cooldown bypass is allowed (owner manual always bypasses) */
|
|
82
|
+
readonly cooldownBypassAllowed?: boolean;
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Evaluate trigger controller for incoming pain evidence.
|
|
86
|
+
*
|
|
87
|
+
* This is the ONLY function that decides whether a diagnostic task is created.
|
|
88
|
+
* The production path (hooks, CLI, manual) must call this before creating tasks.
|
|
89
|
+
*
|
|
90
|
+
* Decision precedence:
|
|
91
|
+
* 1. Invalid input → refused
|
|
92
|
+
* 2. Owner manual → manual_owner_admitted (always creates task)
|
|
93
|
+
* 3. Triage decision → evidence_only / diagnosis_created / health_only / etc.
|
|
94
|
+
* 4. Cooldown check → cooldown_skipped (within 'admit' branch)
|
|
95
|
+
*
|
|
96
|
+
* @param input - Trigger controller input with triage result and context
|
|
97
|
+
* @returns Structured trigger decision
|
|
98
|
+
*/
|
|
99
|
+
export declare function evaluateTriggerController(input: TriggerControllerInput): TriggerDecision;
|
|
100
|
+
/**
|
|
101
|
+
* Check if a trigger outcome should result in a diagnostic task being created.
|
|
102
|
+
*
|
|
103
|
+
* Convenience function for callers that just need the boolean.
|
|
104
|
+
*/
|
|
105
|
+
export declare function shouldCreateTask(decision: TriggerDecision): boolean;
|
|
106
|
+
/**
|
|
107
|
+
* Check if a trigger outcome represents an "admitted" state
|
|
108
|
+
* (i.e., the signal was accepted into the pipeline, even if it didn't create a task).
|
|
109
|
+
*/
|
|
110
|
+
export declare function isAdmittedOutcome(outcome: TriggerOutcome): boolean;
|
|
111
|
+
/**
|
|
112
|
+
* Check if a trigger outcome represents a "skipped" state
|
|
113
|
+
* (i.e., the signal was valid but something prevented task creation).
|
|
114
|
+
*/
|
|
115
|
+
export declare function isSkippedOutcome(outcome: TriggerOutcome): boolean;
|
|
116
|
+
//# sourceMappingURL=trigger-controller.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trigger-controller.d.ts","sourceRoot":"","sources":["../../../src/runtime-v2/evidence-triage/trigger-controller.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAM3E;;;;;;;;;;;;GAYG;AACH,MAAM,MAAM,cAAc,GACtB,eAAe,GACf,mBAAmB,GACnB,mBAAmB,GACnB,kBAAkB,GAClB,uBAAuB,GACvB,SAAS,GACT,aAAa,GACb,wBAAwB,CAAC;AAE7B;;;;GAIG;AACH,MAAM,WAAW,eAAe;IAC9B,0BAA0B;IAC1B,QAAQ,CAAC,OAAO,EAAE,cAAc,CAAC;IACjC,8CAA8C;IAC9C,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,8BAA8B;IAC9B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,qCAAqC;IACrC,QAAQ,CAAC,UAAU,EAAE,UAAU,CAAC;IAChC,2DAA2D;IAC3D,QAAQ,CAAC,cAAc,EAAE,cAAc,CAAC;IACxC,+DAA+D;IAC/D,QAAQ,CAAC,0BAA0B,EAAE,OAAO,CAAC;IAC7C,gCAAgC;IAChC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,2CAA2C;IAC3C,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;CAChC;AAID;;;;;GAKG;AACH,MAAM,WAAW,sBAAsB;IACrC,4CAA4C;IAC5C,QAAQ,CAAC,YAAY,EAAE,YAAY,CAAC;IACpC,kDAAkD;IAClD,QAAQ,CAAC,aAAa,EAAE,OAAO,CAAC;IAChC,mEAAmE;IACnE,QAAQ,CAAC,gBAAgB,EAAE,OAAO,CAAC;IACnC,wDAAwD;IACxD,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,8DAA8D;IAC9D,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,CAAC;IAClC,yBAAyB;IACzB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,+CAA+C;IAC/C,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,wEAAwE;IACxE,QAAQ,CAAC,qBAAqB,CAAC,EAAE,OAAO,CAAC;CAC1C;AAgKD;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,sBAAsB,GAAG,eAAe,CAaxF;AAID;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,eAAe,GAAG,OAAO,CAEnE;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAElE;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAEjE"}
|