@principles/core 1.173.0 → 1.175.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 +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/prompt-builder/__tests__/model-config.test.d.ts +2 -0
- package/dist/prompt-builder/__tests__/model-config.test.d.ts.map +1 -0
- package/dist/prompt-builder/__tests__/model-config.test.js +158 -0
- package/dist/prompt-builder/__tests__/model-config.test.js.map +1 -0
- package/dist/prompt-builder/__tests__/xml-escape.test.d.ts +2 -0
- package/dist/prompt-builder/__tests__/xml-escape.test.d.ts.map +1 -0
- package/dist/prompt-builder/__tests__/xml-escape.test.js +42 -0
- package/dist/prompt-builder/__tests__/xml-escape.test.js.map +1 -0
- package/dist/prompt-builder/index.d.ts +3 -0
- package/dist/prompt-builder/index.d.ts.map +1 -1
- package/dist/prompt-builder/index.js +2 -0
- package/dist/prompt-builder/index.js.map +1 -1
- package/dist/prompt-builder/model-config.d.ts +42 -0
- package/dist/prompt-builder/model-config.d.ts.map +1 -0
- package/dist/prompt-builder/model-config.js +84 -0
- package/dist/prompt-builder/model-config.js.map +1 -0
- package/dist/prompt-builder/xml-escape.d.ts +12 -0
- package/dist/prompt-builder/xml-escape.d.ts.map +1 -0
- package/dist/prompt-builder/xml-escape.js +19 -0
- package/dist/prompt-builder/xml-escape.js.map +1 -0
- package/dist/runtime-v2/__tests__/architecture-regression.test.js +49 -0
- package/dist/runtime-v2/__tests__/architecture-regression.test.js.map +1 -1
- package/dist/runtime-v2/detection/__tests__/detection-funnel-policy.test.d.ts +13 -0
- package/dist/runtime-v2/detection/__tests__/detection-funnel-policy.test.d.ts.map +1 -0
- package/dist/runtime-v2/detection/__tests__/detection-funnel-policy.test.js +111 -0
- package/dist/runtime-v2/detection/__tests__/detection-funnel-policy.test.js.map +1 -0
- package/dist/runtime-v2/detection/detection-funnel-policy.d.ts +103 -0
- package/dist/runtime-v2/detection/detection-funnel-policy.d.ts.map +1 -0
- package/dist/runtime-v2/detection/detection-funnel-policy.js +135 -0
- package/dist/runtime-v2/detection/detection-funnel-policy.js.map +1 -0
- package/dist/runtime-v2/detection/index.d.ts +10 -0
- package/dist/runtime-v2/detection/index.d.ts.map +1 -0
- package/dist/runtime-v2/detection/index.js +9 -0
- package/dist/runtime-v2/detection/index.js.map +1 -0
- package/dist/runtime-v2/evidence-triage/__tests__/observation-resolver.test.d.ts +12 -0
- package/dist/runtime-v2/evidence-triage/__tests__/observation-resolver.test.d.ts.map +1 -0
- package/dist/runtime-v2/evidence-triage/__tests__/observation-resolver.test.js +137 -0
- package/dist/runtime-v2/evidence-triage/__tests__/observation-resolver.test.js.map +1 -0
- package/dist/runtime-v2/evidence-triage/__tests__/triage-policy.test.js +104 -1
- package/dist/runtime-v2/evidence-triage/__tests__/triage-policy.test.js.map +1 -1
- package/dist/runtime-v2/evidence-triage/index.d.ts +3 -0
- package/dist/runtime-v2/evidence-triage/index.d.ts.map +1 -1
- package/dist/runtime-v2/evidence-triage/index.js +3 -0
- package/dist/runtime-v2/evidence-triage/index.js.map +1 -1
- package/dist/runtime-v2/evidence-triage/observation-resolver.d.ts +107 -0
- package/dist/runtime-v2/evidence-triage/observation-resolver.d.ts.map +1 -0
- package/dist/runtime-v2/evidence-triage/observation-resolver.js +175 -0
- package/dist/runtime-v2/evidence-triage/observation-resolver.js.map +1 -0
- package/dist/runtime-v2/evidence-triage/triage-policy.d.ts +4 -0
- package/dist/runtime-v2/evidence-triage/triage-policy.d.ts.map +1 -1
- package/dist/runtime-v2/evidence-triage/triage-policy.js +66 -9
- package/dist/runtime-v2/evidence-triage/triage-policy.js.map +1 -1
- package/dist/runtime-v2/evidence-triage/types.d.ts +14 -0
- package/dist/runtime-v2/evidence-triage/types.d.ts.map +1 -1
- package/dist/runtime-v2/evidence-triage/types.js.map +1 -1
- package/dist/runtime-v2/index.d.ts +6 -2
- package/dist/runtime-v2/index.d.ts.map +1 -1
- package/dist/runtime-v2/index.js +3 -1
- package/dist/runtime-v2/index.js.map +1 -1
- package/dist/runtime-v2/pain-gate/__tests__/pain-diagnostic-gate-policy.test.d.ts +15 -0
- package/dist/runtime-v2/pain-gate/__tests__/pain-diagnostic-gate-policy.test.d.ts.map +1 -0
- package/dist/runtime-v2/pain-gate/__tests__/pain-diagnostic-gate-policy.test.js +179 -0
- package/dist/runtime-v2/pain-gate/__tests__/pain-diagnostic-gate-policy.test.js.map +1 -0
- package/dist/runtime-v2/pain-gate/index.d.ts +10 -0
- package/dist/runtime-v2/pain-gate/index.d.ts.map +1 -0
- package/dist/runtime-v2/pain-gate/index.js +9 -0
- package/dist/runtime-v2/pain-gate/index.js.map +1 -0
- package/dist/runtime-v2/pain-gate/pain-diagnostic-gate-policy.d.ts +110 -0
- package/dist/runtime-v2/pain-gate/pain-diagnostic-gate-policy.d.ts.map +1 -0
- package/dist/runtime-v2/pain-gate/pain-diagnostic-gate-policy.js +146 -0
- package/dist/runtime-v2/pain-gate/pain-diagnostic-gate-policy.js.map +1 -0
- package/package.json +1 -1
package/dist/index.d.ts
CHANGED
|
@@ -16,8 +16,8 @@ export { PainSignalAdapter } from './pain-signal-adapter.js';
|
|
|
16
16
|
export { TelemetryEventSchema, validateTelemetryEvent } from './telemetry-event.js';
|
|
17
17
|
export type { TelemetryEvent, TelemetryEventValidationResult, TelemetryEventType } from './telemetry-event.js';
|
|
18
18
|
export { PrincipleInjector, DefaultPrincipleInjector, InjectionContext } from './principle-injector.js';
|
|
19
|
-
export { buildAttitudeDirective, detectCorrectionCue, extractMessageContent, isMinimalTrigger, truncateInjectionToBudget, } from './prompt-builder/index.js';
|
|
20
|
-
export type { PromptInjectionPart, SizeGuardOptions } from './prompt-builder/index.js';
|
|
19
|
+
export { buildAttitudeDirective, detectCorrectionCue, escapeXml, extractMessageContent, isMinimalTrigger, truncateInjectionToBudget, isValidModelFormat, resolveModelFromConfig, } from './prompt-builder/index.js';
|
|
20
|
+
export type { PromptInjectionPart, SizeGuardOptions, CoreLogger, ModelConfigObject } from './prompt-builder/index.js';
|
|
21
21
|
export { matchEmpathyKeywords, createDefaultKeywordStore, applyKeywordUpdates, shouldTriggerOptimization, getKeywordStoreSummary, EMPATHY_SEED_KEYWORDS, DEFAULT_EMPATHY_KEYWORD_CONFIG, scoreToSeverity, severityToPenalty, normalizeSeverity, } from './prompt-builder/index.js';
|
|
22
22
|
export type { EmpathyKeywordStore, EmpathyKeywordEntry, EmpathyKeywordStats, EmpathyMatchResult, EmpathyKeywordUpdate, EmpathyOptimizationResult, SeedKeywordEntry, EmpathyKeywordConfig, } from './prompt-builder/index.js';
|
|
23
23
|
export { extractVersion, extractDate, extractSummary, parseWorkingMemorySection, workingMemoryToInjection, extractMilestones, validateCurrentFocus, mergeWorkingMemory, compressFocusContent, DEFAULT_FOCUS_COMPRESSION_OPTIONS, } from './prompt-builder/index.js';
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAGH,OAAO,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AACtG,YAAY,EAAE,UAAU,EAAE,0BAA0B,EAAE,MAAM,kBAAkB,CAAC;AAG/E,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAG7D,OAAO,EAAE,oBAAoB,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AACpF,YAAY,EAAE,cAAc,EAAE,8BAA8B,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAG/G,OAAO,EAAE,iBAAiB,EAAE,wBAAwB,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAGxG,OAAO,EACL,sBAAsB,EACtB,mBAAmB,EACnB,qBAAqB,EACrB,gBAAgB,EAChB,yBAAyB,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -17,7 +17,7 @@ export { TelemetryEventSchema, validateTelemetryEvent } from './telemetry-event.
|
|
|
17
17
|
// PrincipleInjector interface and DefaultPrincipleInjector
|
|
18
18
|
export { DefaultPrincipleInjector } from './principle-injector.js';
|
|
19
19
|
// Prompt builder primitives — pure functions extracted from openclaw-plugin prompt hook (PRI-75)
|
|
20
|
-
export { buildAttitudeDirective, detectCorrectionCue, extractMessageContent, isMinimalTrigger, truncateInjectionToBudget, } from './prompt-builder/index.js';
|
|
20
|
+
export { buildAttitudeDirective, detectCorrectionCue, escapeXml, extractMessageContent, isMinimalTrigger, truncateInjectionToBudget, isValidModelFormat, resolveModelFromConfig, } from './prompt-builder/index.js';
|
|
21
21
|
// Prompt builder — empathy keyword matching (PRI-81 Phase A)
|
|
22
22
|
export { matchEmpathyKeywords, createDefaultKeywordStore, applyKeywordUpdates, shouldTriggerOptimization, getKeywordStoreSummary, EMPATHY_SEED_KEYWORDS, DEFAULT_EMPATHY_KEYWORD_CONFIG, scoreToSeverity, severityToPenalty, normalizeSeverity, } from './prompt-builder/index.js';
|
|
23
23
|
// Prompt builder — focus compression (PRI-81 Phase B)
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,mCAAmC;AACnC,OAAO,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAMtG,wBAAwB;AACxB,OAAO,EAAE,oBAAoB,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AAGpF,2DAA2D;AAC3D,OAAO,EAAqB,wBAAwB,EAAoB,MAAM,yBAAyB,CAAC;AAExG,iGAAiG;AACjG,OAAO,EACL,sBAAsB,EACtB,mBAAmB,EACnB,qBAAqB,EACrB,gBAAgB,EAChB,yBAAyB,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"model-config.test.d.ts","sourceRoot":"","sources":["../../../src/prompt-builder/__tests__/model-config.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
import { describe, it, expect, vi } from 'vitest';
|
|
2
|
+
import { isValidModelFormat, resolveModelFromConfig, } from '../model-config.js';
|
|
3
|
+
describe('isValidModelFormat', () => {
|
|
4
|
+
it('accepts valid provider/model format', () => {
|
|
5
|
+
expect(isValidModelFormat('openai/gpt-4')).toBe(true);
|
|
6
|
+
expect(isValidModelFormat('anthropic/claude-3-opus')).toBe(true);
|
|
7
|
+
});
|
|
8
|
+
it('accepts model with dots and hyphens', () => {
|
|
9
|
+
expect(isValidModelFormat('openai/gpt-4-turbo')).toBe(true);
|
|
10
|
+
expect(isValidModelFormat('anthropic/claude-3.5-sonnet')).toBe(true);
|
|
11
|
+
});
|
|
12
|
+
it('accepts two-char provider and single-char model', () => {
|
|
13
|
+
expect(isValidModelFormat('ab/c')).toBe(true);
|
|
14
|
+
});
|
|
15
|
+
it('rejects single-char provider (pattern requires first + last char)', () => {
|
|
16
|
+
expect(isValidModelFormat('a/b')).toBe(false);
|
|
17
|
+
});
|
|
18
|
+
it('rejects missing slash', () => {
|
|
19
|
+
expect(isValidModelFormat('gpt-4')).toBe(false);
|
|
20
|
+
expect(isValidModelFormat('openai')).toBe(false);
|
|
21
|
+
});
|
|
22
|
+
it('rejects empty string', () => {
|
|
23
|
+
expect(isValidModelFormat('')).toBe(false);
|
|
24
|
+
});
|
|
25
|
+
it('rejects provider starting or ending with hyphen', () => {
|
|
26
|
+
expect(isValidModelFormat('-openai/gpt-4')).toBe(false);
|
|
27
|
+
expect(isValidModelFormat('openai-/gpt-4')).toBe(false);
|
|
28
|
+
});
|
|
29
|
+
it('rejects provider with special characters', () => {
|
|
30
|
+
expect(isValidModelFormat('open_ai/gpt-4')).toBe(false);
|
|
31
|
+
expect(isValidModelFormat('open.ai/gpt-4')).toBe(false);
|
|
32
|
+
});
|
|
33
|
+
it('rejects multiple slashes', () => {
|
|
34
|
+
expect(isValidModelFormat('openai/gpt/4')).toBe(false);
|
|
35
|
+
});
|
|
36
|
+
});
|
|
37
|
+
describe('resolveModelFromConfig', () => {
|
|
38
|
+
describe('string input', () => {
|
|
39
|
+
it('returns trimmed string for valid format', () => {
|
|
40
|
+
expect(resolveModelFromConfig('openai/gpt-4')).toBe('openai/gpt-4');
|
|
41
|
+
});
|
|
42
|
+
it('trims whitespace', () => {
|
|
43
|
+
expect(resolveModelFromConfig(' openai/gpt-4 ')).toBe('openai/gpt-4');
|
|
44
|
+
});
|
|
45
|
+
it('returns null for empty string', () => {
|
|
46
|
+
const logger = { warn: vi.fn() };
|
|
47
|
+
expect(resolveModelFromConfig('', logger)).toBe(null);
|
|
48
|
+
expect(logger.warn).toHaveBeenCalledWith(expect.stringContaining('Empty model string'));
|
|
49
|
+
});
|
|
50
|
+
it('returns null for whitespace-only string', () => {
|
|
51
|
+
const logger = { warn: vi.fn() };
|
|
52
|
+
expect(resolveModelFromConfig(' ', logger)).toBe(null);
|
|
53
|
+
expect(logger.warn).toHaveBeenCalledWith(expect.stringContaining('Empty model string'));
|
|
54
|
+
});
|
|
55
|
+
it('returns null and warns for invalid format', () => {
|
|
56
|
+
const logger = { warn: vi.fn() };
|
|
57
|
+
const result = resolveModelFromConfig('invalid-model', logger);
|
|
58
|
+
expect(result).toBe(null);
|
|
59
|
+
expect(logger.warn).toHaveBeenCalledWith(expect.stringContaining('Invalid model format: "invalid-model"'));
|
|
60
|
+
});
|
|
61
|
+
it('does not call warn when logger is undefined', () => {
|
|
62
|
+
// Should not throw
|
|
63
|
+
const result = resolveModelFromConfig('invalid-model');
|
|
64
|
+
expect(result).toBe(null);
|
|
65
|
+
});
|
|
66
|
+
});
|
|
67
|
+
describe('object input', () => {
|
|
68
|
+
it('returns primary model for valid object', () => {
|
|
69
|
+
const cfg = { primary: 'openai/gpt-4' };
|
|
70
|
+
expect(resolveModelFromConfig(cfg)).toBe('openai/gpt-4');
|
|
71
|
+
});
|
|
72
|
+
it('trims primary model whitespace', () => {
|
|
73
|
+
const cfg = { primary: ' openai/gpt-4 ' };
|
|
74
|
+
expect(resolveModelFromConfig(cfg)).toBe('openai/gpt-4');
|
|
75
|
+
});
|
|
76
|
+
it('returns null when primary is missing', () => {
|
|
77
|
+
const logger = { warn: vi.fn() };
|
|
78
|
+
const cfg = { fallbacks: ['openai/gpt-4'] };
|
|
79
|
+
expect(resolveModelFromConfig(cfg, logger)).toBe(null);
|
|
80
|
+
expect(logger.warn).toHaveBeenCalledWith(expect.stringContaining('Missing primary model'));
|
|
81
|
+
});
|
|
82
|
+
it('returns null when primary is empty string', () => {
|
|
83
|
+
const logger = { warn: vi.fn() };
|
|
84
|
+
const cfg = { primary: '' };
|
|
85
|
+
expect(resolveModelFromConfig(cfg, logger)).toBe(null);
|
|
86
|
+
expect(logger.warn).toHaveBeenCalledWith(expect.stringContaining('Empty primary model string'));
|
|
87
|
+
});
|
|
88
|
+
it('returns null and warns for invalid primary format', () => {
|
|
89
|
+
const logger = { warn: vi.fn() };
|
|
90
|
+
const cfg = { primary: 'invalid' };
|
|
91
|
+
const result = resolveModelFromConfig(cfg, logger);
|
|
92
|
+
expect(result).toBe(null);
|
|
93
|
+
expect(logger.warn).toHaveBeenCalledWith(expect.stringContaining('Invalid primary model format: "invalid"'));
|
|
94
|
+
});
|
|
95
|
+
it('ignores fallbacks array', () => {
|
|
96
|
+
const cfg = {
|
|
97
|
+
primary: 'openai/gpt-4',
|
|
98
|
+
fallbacks: ['anthropic/claude-3'],
|
|
99
|
+
};
|
|
100
|
+
expect(resolveModelFromConfig(cfg)).toBe('openai/gpt-4');
|
|
101
|
+
});
|
|
102
|
+
});
|
|
103
|
+
describe('array input', () => {
|
|
104
|
+
it('returns null and warns for array', () => {
|
|
105
|
+
const logger = { warn: vi.fn() };
|
|
106
|
+
const result = resolveModelFromConfig(['openai/gpt-4'], logger);
|
|
107
|
+
expect(result).toBe(null);
|
|
108
|
+
expect(logger.warn).toHaveBeenCalledWith(expect.stringContaining('Array model config not supported'));
|
|
109
|
+
});
|
|
110
|
+
});
|
|
111
|
+
describe('other inputs', () => {
|
|
112
|
+
it('returns null for null', () => {
|
|
113
|
+
const logger = { warn: vi.fn() };
|
|
114
|
+
expect(resolveModelFromConfig(null, logger)).toBe(null);
|
|
115
|
+
expect(logger.warn).toHaveBeenCalledWith(expect.stringContaining('Missing model config'));
|
|
116
|
+
});
|
|
117
|
+
it('returns null for undefined', () => {
|
|
118
|
+
const logger = { warn: vi.fn() };
|
|
119
|
+
expect(resolveModelFromConfig(undefined, logger)).toBe(null);
|
|
120
|
+
expect(logger.warn).toHaveBeenCalledWith(expect.stringContaining('Missing model config'));
|
|
121
|
+
});
|
|
122
|
+
it('returns null for number', () => {
|
|
123
|
+
const logger = { warn: vi.fn() };
|
|
124
|
+
expect(resolveModelFromConfig(42, logger)).toBe(null);
|
|
125
|
+
expect(logger.warn).toHaveBeenCalledWith(expect.stringContaining('Unsupported model config type: number'));
|
|
126
|
+
});
|
|
127
|
+
it('returns null for empty object', () => {
|
|
128
|
+
const logger = { warn: vi.fn() };
|
|
129
|
+
expect(resolveModelFromConfig({}, logger)).toBe(null);
|
|
130
|
+
expect(logger.warn).toHaveBeenCalledWith(expect.stringContaining('Missing primary model'));
|
|
131
|
+
});
|
|
132
|
+
it('returns null for object with non-string primary', () => {
|
|
133
|
+
const logger = { warn: vi.fn() };
|
|
134
|
+
expect(resolveModelFromConfig({ primary: 123 }, logger)).toBe(null);
|
|
135
|
+
expect(logger.warn).toHaveBeenCalledWith(expect.stringContaining('Invalid primary model type: number'));
|
|
136
|
+
});
|
|
137
|
+
it('ignores inherited primary property on object input', () => {
|
|
138
|
+
const logger = { warn: vi.fn() };
|
|
139
|
+
const inheritedConfig = Object.create({ primary: 'openai/gpt-4' });
|
|
140
|
+
expect(resolveModelFromConfig(inheritedConfig, logger)).toBe(null);
|
|
141
|
+
expect(logger.warn).toHaveBeenCalledWith(expect.stringContaining('Missing primary model'));
|
|
142
|
+
});
|
|
143
|
+
});
|
|
144
|
+
describe('logger compatibility', () => {
|
|
145
|
+
it('accepts logger with (...args: unknown[]) => void signature (PluginLogger shape)', () => {
|
|
146
|
+
// This simulates PluginLogger's method signature
|
|
147
|
+
const pluginLikeLogger = {
|
|
148
|
+
warn: vi.fn(),
|
|
149
|
+
info: vi.fn(),
|
|
150
|
+
error: vi.fn(),
|
|
151
|
+
};
|
|
152
|
+
// Should not throw and should satisfy CoreLogger
|
|
153
|
+
const result = resolveModelFromConfig('invalid', pluginLikeLogger);
|
|
154
|
+
expect(result).toBe(null);
|
|
155
|
+
});
|
|
156
|
+
});
|
|
157
|
+
});
|
|
158
|
+
//# sourceMappingURL=model-config.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"model-config.test.js","sourceRoot":"","sources":["../../../src/prompt-builder/__tests__/model-config.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"xml-escape.test.d.ts","sourceRoot":"","sources":["../../../src/prompt-builder/__tests__/xml-escape.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { describe, it, expect } from 'vitest';
|
|
2
|
+
import { escapeXml } from '../xml-escape.js';
|
|
3
|
+
describe('escapeXml', () => {
|
|
4
|
+
it('escapes ampersand', () => {
|
|
5
|
+
expect(escapeXml('A&B')).toBe('A&B');
|
|
6
|
+
});
|
|
7
|
+
it('escapes less-than', () => {
|
|
8
|
+
expect(escapeXml('a<b')).toBe('a<b');
|
|
9
|
+
});
|
|
10
|
+
it('escapes greater-than', () => {
|
|
11
|
+
expect(escapeXml('a>b')).toBe('a>b');
|
|
12
|
+
});
|
|
13
|
+
it('escapes double quote', () => {
|
|
14
|
+
expect(escapeXml('a"b')).toBe('a"b');
|
|
15
|
+
});
|
|
16
|
+
it('escapes single quote', () => {
|
|
17
|
+
expect(escapeXml("a'b")).toBe('a'b');
|
|
18
|
+
});
|
|
19
|
+
it('escapes all special characters in mixed content', () => {
|
|
20
|
+
expect(escapeXml('<tag attr="x">A&B\'C</tag>')).toBe('<tag attr="x">A&B'C</tag>');
|
|
21
|
+
});
|
|
22
|
+
it('returns empty string unchanged', () => {
|
|
23
|
+
expect(escapeXml('')).toBe('');
|
|
24
|
+
});
|
|
25
|
+
it('returns string without special characters unchanged', () => {
|
|
26
|
+
expect(escapeXml('plain text 123')).toBe('plain text 123');
|
|
27
|
+
});
|
|
28
|
+
it('escapes repeated special characters', () => {
|
|
29
|
+
expect(escapeXml('&&&')).toBe('&&&');
|
|
30
|
+
});
|
|
31
|
+
it('escapes ampersand first to avoid double-escaping', () => {
|
|
32
|
+
// If & were not escaped first, < would become &lt;
|
|
33
|
+
expect(escapeXml('<')).toBe('&lt;');
|
|
34
|
+
});
|
|
35
|
+
it('handles principle-id-like input', () => {
|
|
36
|
+
expect(escapeXml('P<001>')).toBe('P<001>');
|
|
37
|
+
});
|
|
38
|
+
it('handles principle-text-like input', () => {
|
|
39
|
+
expect(escapeXml('Use "typeof" & avoid <as>')).toBe('Use "typeof" & avoid <as>');
|
|
40
|
+
});
|
|
41
|
+
});
|
|
42
|
+
//# sourceMappingURL=xml-escape.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"xml-escape.test.js","sourceRoot":"","sources":["../../../src/prompt-builder/__tests__/xml-escape.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAE7C,QAAQ,CAAC,WAAW,EAAE,GAAG,EAAE;IACzB,EAAE,CAAC,mBAAmB,EAAE,GAAG,EAAE;QAC3B,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAC3C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mBAAmB,EAAE,GAAG,EAAE;QAC3B,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC1C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sBAAsB,EAAE,GAAG,EAAE;QAC9B,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC1C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sBAAsB,EAAE,GAAG,EAAE;QAC9B,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IAC5C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sBAAsB,EAAE,GAAG,EAAE;QAC9B,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IAC5C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iDAAiD,EAAE,GAAG,EAAE;QACzD,MAAM,CAAC,SAAS,CAAC,4BAA4B,CAAC,CAAC,CAAC,IAAI,CAClD,0DAA0D,CAC3D,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gCAAgC,EAAE,GAAG,EAAE;QACxC,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACjC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qDAAqD,EAAE,GAAG,EAAE;QAC7D,MAAM,CAAC,SAAS,CAAC,gBAAgB,CAAC,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;IAC7D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qCAAqC,EAAE,GAAG,EAAE;QAC7C,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;IACnD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kDAAkD,EAAE,GAAG,EAAE;QAC1D,0DAA0D;QAC1D,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IAC7C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iCAAiC,EAAE,GAAG,EAAE;QACzC,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;IACnD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mCAAmC,EAAE,GAAG,EAAE;QAC3C,MAAM,CAAC,SAAS,CAAC,2BAA2B,CAAC,CAAC,CAAC,IAAI,CACjD,+CAA+C,CAChD,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -16,13 +16,16 @@ export type { InjectablePrinciple, PrincipleSelectionResult } from './principle-
|
|
|
16
16
|
export type { RoutingInput, RoutingClassification } from './routing-guidance.js';
|
|
17
17
|
export type { EmpathyKeywordStore, EmpathyKeywordEntry, EmpathyKeywordStats, EmpathyMatchResult, EmpathyKeywordUpdate, EmpathyOptimizationResult, SeedKeywordEntry, EmpathyKeywordConfig } from './empathy-types.js';
|
|
18
18
|
export type { FileArtifact, WorkingMemorySnapshot, FocusCompressionOptions, FocusCompressionResult } from './focus-compression.js';
|
|
19
|
+
export type { CoreLogger, ModelConfigObject } from './model-config.js';
|
|
19
20
|
export { buildAttitudeDirective } from './attitude-directive.js';
|
|
20
21
|
export { detectCorrectionCue } from './correction-cue.js';
|
|
22
|
+
export { escapeXml } from './xml-escape.js';
|
|
21
23
|
export { extractMessageContent } from './message-extraction.js';
|
|
22
24
|
export { isMinimalTrigger } from './minimal-trigger.js';
|
|
23
25
|
export { truncateInjectionToBudget } from './size-guard.js';
|
|
24
26
|
export { formatPrinciple, selectPrinciplesForInjection, DEFAULT_PRINCIPLE_BUDGET } from './principle-selection.js';
|
|
25
27
|
export { containsKeyword, computeCombinedText, classifyTaskKind, buildReason, buildBlockers, READER_KEYWORDS, EDITOR_KEYWORDS, HIGH_ENTROPY_KEYWORDS } from './routing-guidance.js';
|
|
28
|
+
export { isValidModelFormat, resolveModelFromConfig } from './model-config.js';
|
|
26
29
|
export { matchEmpathyKeywords, createDefaultKeywordStore, applyKeywordUpdates, shouldTriggerOptimization, getKeywordStoreSummary } from './empathy-keyword-matching.js';
|
|
27
30
|
export { EMPATHY_SEED_KEYWORDS, DEFAULT_EMPATHY_KEYWORD_CONFIG, scoreToSeverity, severityToPenalty, normalizeSeverity } from './empathy-types.js';
|
|
28
31
|
export { extractVersion, extractDate, extractSummary, parseWorkingMemorySection, workingMemoryToInjection, extractMilestones, validateCurrentFocus, mergeWorkingMemory, compressFocusContent, cleanupStaleInfoPure, DEFAULT_FOCUS_COMPRESSION_OPTIONS, extractDescription, extractProblems, extractNextActions, deduplicateArtifacts } from './focus-compression.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/prompt-builder/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAGH,YAAY,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AACxF,YAAY,EAAE,mBAAmB,EAAE,wBAAwB,EAAE,MAAM,0BAA0B,CAAC;AAC9F,YAAY,EAAE,YAAY,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AACjF,YAAY,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,yBAAyB,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AACrN,YAAY,EAAE,YAAY,EAAE,qBAAqB,EAAE,uBAAuB,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/prompt-builder/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAGH,YAAY,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AACxF,YAAY,EAAE,mBAAmB,EAAE,wBAAwB,EAAE,MAAM,0BAA0B,CAAC;AAC9F,YAAY,EAAE,YAAY,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AACjF,YAAY,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,yBAAyB,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AACrN,YAAY,EAAE,YAAY,EAAE,qBAAqB,EAAE,uBAAuB,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AACnI,YAAY,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAGvE,OAAO,EAAE,sBAAsB,EAAE,MAAM,yBAAyB,CAAC;AACjE,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAChE,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,EAAE,yBAAyB,EAAE,MAAM,iBAAiB,CAAC;AAC5D,OAAO,EAAE,eAAe,EAAE,4BAA4B,EAAE,wBAAwB,EAAE,MAAM,0BAA0B,CAAC;AACnH,OAAO,EAAE,eAAe,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,WAAW,EAAE,aAAa,EAAE,eAAe,EAAE,eAAe,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AACpL,OAAO,EAAE,kBAAkB,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAC;AAG/E,OAAO,EAAE,oBAAoB,EAAE,yBAAyB,EAAE,mBAAmB,EAAE,yBAAyB,EAAE,sBAAsB,EAAE,MAAM,+BAA+B,CAAC;AACxK,OAAO,EAAE,qBAAqB,EAAE,8BAA8B,EAAE,eAAe,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAGlJ,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,cAAc,EAAE,yBAAyB,EAAE,wBAAwB,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,iCAAiC,EAAE,kBAAkB,EAAE,eAAe,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC"}
|
|
@@ -14,11 +14,13 @@
|
|
|
14
14
|
// Functions
|
|
15
15
|
export { buildAttitudeDirective } from './attitude-directive.js';
|
|
16
16
|
export { detectCorrectionCue } from './correction-cue.js';
|
|
17
|
+
export { escapeXml } from './xml-escape.js';
|
|
17
18
|
export { extractMessageContent } from './message-extraction.js';
|
|
18
19
|
export { isMinimalTrigger } from './minimal-trigger.js';
|
|
19
20
|
export { truncateInjectionToBudget } from './size-guard.js';
|
|
20
21
|
export { formatPrinciple, selectPrinciplesForInjection, DEFAULT_PRINCIPLE_BUDGET } from './principle-selection.js';
|
|
21
22
|
export { containsKeyword, computeCombinedText, classifyTaskKind, buildReason, buildBlockers, READER_KEYWORDS, EDITOR_KEYWORDS, HIGH_ENTROPY_KEYWORDS } from './routing-guidance.js';
|
|
23
|
+
export { isValidModelFormat, resolveModelFromConfig } from './model-config.js';
|
|
22
24
|
// PRI-81 Phase A: Empathy keyword matching
|
|
23
25
|
export { matchEmpathyKeywords, createDefaultKeywordStore, applyKeywordUpdates, shouldTriggerOptimization, getKeywordStoreSummary } from './empathy-keyword-matching.js';
|
|
24
26
|
export { EMPATHY_SEED_KEYWORDS, DEFAULT_EMPATHY_KEYWORD_CONFIG, scoreToSeverity, severityToPenalty, normalizeSeverity } from './empathy-types.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/prompt-builder/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/prompt-builder/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAUH,YAAY;AACZ,OAAO,EAAE,sBAAsB,EAAE,MAAM,yBAAyB,CAAC;AACjE,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAChE,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,EAAE,yBAAyB,EAAE,MAAM,iBAAiB,CAAC;AAC5D,OAAO,EAAE,eAAe,EAAE,4BAA4B,EAAE,wBAAwB,EAAE,MAAM,0BAA0B,CAAC;AACnH,OAAO,EAAE,eAAe,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,WAAW,EAAE,aAAa,EAAE,eAAe,EAAE,eAAe,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AACpL,OAAO,EAAE,kBAAkB,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAC;AAE/E,2CAA2C;AAC3C,OAAO,EAAE,oBAAoB,EAAE,yBAAyB,EAAE,mBAAmB,EAAE,yBAAyB,EAAE,sBAAsB,EAAE,MAAM,+BAA+B,CAAC;AACxK,OAAO,EAAE,qBAAqB,EAAE,8BAA8B,EAAE,eAAe,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAElJ,oCAAoC;AACpC,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,cAAc,EAAE,yBAAyB,EAAE,wBAAwB,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,iCAAiC,EAAE,kBAAkB,EAAE,eAAe,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Model configuration validation and resolution.
|
|
3
|
+
*
|
|
4
|
+
* Pure logic — no I/O, no side effects (except optional logger callback).
|
|
5
|
+
*
|
|
6
|
+
* Extracted from openclaw-plugin/src/hooks/prompt.ts (PRI-444) so that model
|
|
7
|
+
* config validation can be unit-tested in core without mocking plugin I/O.
|
|
8
|
+
*/
|
|
9
|
+
/**
|
|
10
|
+
* Minimal logger interface for core (structural typing — plugin's PluginLogger
|
|
11
|
+
* satisfies this because `(...args: unknown[]) => void` is assignable to
|
|
12
|
+
* `(msg: string) => void` under parameter bivariance).
|
|
13
|
+
*/
|
|
14
|
+
export interface CoreLogger {
|
|
15
|
+
warn?(msg: string): void;
|
|
16
|
+
info?(msg: string): void;
|
|
17
|
+
error?(msg: string): void;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Model configuration with primary model and optional fallback models.
|
|
21
|
+
* Input shape for {@link resolveModelFromConfig} when config is an object.
|
|
22
|
+
*/
|
|
23
|
+
export interface ModelConfigObject {
|
|
24
|
+
primary?: string;
|
|
25
|
+
fallbacks?: string[];
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Validate model format: must be "provider/model".
|
|
29
|
+
*
|
|
30
|
+
* provider: e.g., "openai", "anthropic" — the API provider name
|
|
31
|
+
* model: e.g., "gpt-4", "claude-3-opus" — the specific model name
|
|
32
|
+
*/
|
|
33
|
+
export declare function isValidModelFormat(model: string): boolean;
|
|
34
|
+
/**
|
|
35
|
+
* Resolve model configuration for OpenClaw agents, supporting string and object formats.
|
|
36
|
+
*
|
|
37
|
+
* @param modelConfig - Model config: string (e.g. "provider/model") or { primary, fallbacks } object
|
|
38
|
+
* @param logger - Optional logger for validation warnings
|
|
39
|
+
* @returns Resolved model string, or null if config is missing/invalid
|
|
40
|
+
*/
|
|
41
|
+
export declare function resolveModelFromConfig(modelConfig: unknown, logger?: CoreLogger): string | null;
|
|
42
|
+
//# sourceMappingURL=model-config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"model-config.d.ts","sourceRoot":"","sources":["../../src/prompt-builder/model-config.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH;;;;GAIG;AACH,MAAM,WAAW,UAAU;IACzB,IAAI,CAAC,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,IAAI,CAAC,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,KAAK,CAAC,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B;AAED;;;GAGG;AACH,MAAM,WAAW,iBAAiB;IAChC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;CACtB;AAUD;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAEzD;AAED;;;;;;GAMG;AACH,wBAAgB,sBAAsB,CACpC,WAAW,EAAE,OAAO,EACpB,MAAM,CAAC,EAAE,UAAU,GAClB,MAAM,GAAG,IAAI,CAqDf"}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Model configuration validation and resolution.
|
|
3
|
+
*
|
|
4
|
+
* Pure logic — no I/O, no side effects (except optional logger callback).
|
|
5
|
+
*
|
|
6
|
+
* Extracted from openclaw-plugin/src/hooks/prompt.ts (PRI-444) so that model
|
|
7
|
+
* config validation can be unit-tested in core without mocking plugin I/O.
|
|
8
|
+
*/
|
|
9
|
+
const MODEL_PATTERN = /^[a-zA-Z0-9][a-zA-Z0-9-]*[a-zA-Z0-9]\/[a-zA-Z0-9._-]+$/;
|
|
10
|
+
function describeModelConfigType(value) {
|
|
11
|
+
if (value === null)
|
|
12
|
+
return 'null';
|
|
13
|
+
if (Array.isArray(value))
|
|
14
|
+
return 'array';
|
|
15
|
+
return typeof value;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Validate model format: must be "provider/model".
|
|
19
|
+
*
|
|
20
|
+
* provider: e.g., "openai", "anthropic" — the API provider name
|
|
21
|
+
* model: e.g., "gpt-4", "claude-3-opus" — the specific model name
|
|
22
|
+
*/
|
|
23
|
+
export function isValidModelFormat(model) {
|
|
24
|
+
return MODEL_PATTERN.test(model);
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Resolve model configuration for OpenClaw agents, supporting string and object formats.
|
|
28
|
+
*
|
|
29
|
+
* @param modelConfig - Model config: string (e.g. "provider/model") or { primary, fallbacks } object
|
|
30
|
+
* @param logger - Optional logger for validation warnings
|
|
31
|
+
* @returns Resolved model string, or null if config is missing/invalid
|
|
32
|
+
*/
|
|
33
|
+
export function resolveModelFromConfig(modelConfig, logger) {
|
|
34
|
+
if (modelConfig === null || modelConfig === undefined) {
|
|
35
|
+
logger?.warn?.(`[PD:Prompt] Missing model config.`);
|
|
36
|
+
return null;
|
|
37
|
+
}
|
|
38
|
+
// Case 1: modelConfig is a string like "provider/model"
|
|
39
|
+
if (typeof modelConfig === 'string') {
|
|
40
|
+
const trimmed = modelConfig.trim();
|
|
41
|
+
if (!trimmed) {
|
|
42
|
+
logger?.warn?.(`[PD:Prompt] Empty model string.`);
|
|
43
|
+
return null;
|
|
44
|
+
}
|
|
45
|
+
if (!isValidModelFormat(trimmed)) {
|
|
46
|
+
logger?.warn?.(`[PD:Prompt] Invalid model format: "${trimmed}". Expected "provider/model" format.`);
|
|
47
|
+
return null;
|
|
48
|
+
}
|
|
49
|
+
return trimmed;
|
|
50
|
+
}
|
|
51
|
+
// Case 2: modelConfig is an object { primary, fallbacks } like { primary: "provider/model", fallbacks: [...] }
|
|
52
|
+
if (typeof modelConfig === 'object' && modelConfig !== null && !Array.isArray(modelConfig)) {
|
|
53
|
+
if (Object.hasOwn(modelConfig, 'primary')) {
|
|
54
|
+
const primaryDescriptor = Object.getOwnPropertyDescriptor(modelConfig, 'primary');
|
|
55
|
+
if (!primaryDescriptor)
|
|
56
|
+
return null;
|
|
57
|
+
const primary = primaryDescriptor.value;
|
|
58
|
+
if (typeof primary !== 'string') {
|
|
59
|
+
logger?.warn?.(`[PD:Prompt] Invalid primary model type: ${describeModelConfigType(primary)}. Expected string.`);
|
|
60
|
+
return null;
|
|
61
|
+
}
|
|
62
|
+
const trimmed = primary.trim();
|
|
63
|
+
if (!trimmed) {
|
|
64
|
+
logger?.warn?.(`[PD:Prompt] Empty primary model string.`);
|
|
65
|
+
return null;
|
|
66
|
+
}
|
|
67
|
+
if (!isValidModelFormat(trimmed)) {
|
|
68
|
+
logger?.warn?.(`[PD:Prompt] Invalid primary model format: "${trimmed}". Expected "provider/model" format.`);
|
|
69
|
+
return null;
|
|
70
|
+
}
|
|
71
|
+
return trimmed;
|
|
72
|
+
}
|
|
73
|
+
logger?.warn?.(`[PD:Prompt] Missing primary model in object config.`);
|
|
74
|
+
return null;
|
|
75
|
+
}
|
|
76
|
+
// Case 3: Array format not supported
|
|
77
|
+
if (Array.isArray(modelConfig)) {
|
|
78
|
+
logger?.warn?.(`[PD:Prompt] Array model config not supported. Expected "provider/model" string or { primary: "..." } object.`);
|
|
79
|
+
return null;
|
|
80
|
+
}
|
|
81
|
+
logger?.warn?.(`[PD:Prompt] Unsupported model config type: ${describeModelConfigType(modelConfig)}.`);
|
|
82
|
+
return null;
|
|
83
|
+
}
|
|
84
|
+
//# sourceMappingURL=model-config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"model-config.js","sourceRoot":"","sources":["../../src/prompt-builder/model-config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Escape special XML characters in a string.
|
|
3
|
+
*
|
|
4
|
+
* Pure logic — no I/O, no side effects.
|
|
5
|
+
*
|
|
6
|
+
* Used by prompt injection to safely embed user/principle text into XML-style
|
|
7
|
+
* prompt markers (e.g. `<directive id="...">...</directive>`). Also accepted
|
|
8
|
+
* as a callback by `trimToBudget` and `renderPrinciplesToDirectives` in
|
|
9
|
+
* `runtime-v2/activation/prompt-activation-reader-contract.ts`.
|
|
10
|
+
*/
|
|
11
|
+
export declare function escapeXml(input: string): string;
|
|
12
|
+
//# sourceMappingURL=xml-escape.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"xml-escape.d.ts","sourceRoot":"","sources":["../../src/prompt-builder/xml-escape.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAO/C"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Escape special XML characters in a string.
|
|
3
|
+
*
|
|
4
|
+
* Pure logic — no I/O, no side effects.
|
|
5
|
+
*
|
|
6
|
+
* Used by prompt injection to safely embed user/principle text into XML-style
|
|
7
|
+
* prompt markers (e.g. `<directive id="...">...</directive>`). Also accepted
|
|
8
|
+
* as a callback by `trimToBudget` and `renderPrinciplesToDirectives` in
|
|
9
|
+
* `runtime-v2/activation/prompt-activation-reader-contract.ts`.
|
|
10
|
+
*/
|
|
11
|
+
export function escapeXml(input) {
|
|
12
|
+
return input
|
|
13
|
+
.replace(/&/g, '&')
|
|
14
|
+
.replace(/</g, '<')
|
|
15
|
+
.replace(/>/g, '>')
|
|
16
|
+
.replace(/"/g, '"')
|
|
17
|
+
.replace(/'/g, ''');
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=xml-escape.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"xml-escape.js","sourceRoot":"","sources":["../../src/prompt-builder/xml-escape.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,MAAM,UAAU,SAAS,CAAC,KAAa;IACrC,OAAO,KAAK;SACT,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC;SACtB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;SACrB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;SACrB,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC;SACvB,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;AAC7B,CAAC"}
|
|
@@ -195,6 +195,12 @@ const REQUIRED_SOURCE_FILES = [
|
|
|
195
195
|
'activation/approval-completion-service.ts',
|
|
196
196
|
// PRI-431: L2 principle reader (pure logic, extracted from pd-cli + plugin duplicates)
|
|
197
197
|
'build-l2-principle-reader.ts',
|
|
198
|
+
// PRI-446: pure logic migrated from openclaw-plugin into core
|
|
199
|
+
'evidence-triage/observation-resolver.ts',
|
|
200
|
+
'pain-gate/pain-diagnostic-gate-policy.ts',
|
|
201
|
+
'pain-gate/index.ts',
|
|
202
|
+
'detection/detection-funnel-policy.ts',
|
|
203
|
+
'detection/index.ts',
|
|
198
204
|
];
|
|
199
205
|
// ── PRI-212: Plugin core anti-growth guard ────────────────────────────────────
|
|
200
206
|
//
|
|
@@ -247,6 +253,9 @@ const KNOWN_PLUGIN_CORE_FILES = new Set([
|
|
|
247
253
|
'schema/migration-runner.ts',
|
|
248
254
|
'rule-host.ts',
|
|
249
255
|
'principle-training-state.ts',
|
|
256
|
+
// PRI-446: now a thin adapter delegating pure decision logic to
|
|
257
|
+
// runtime-v2/pain-gate/pain-diagnostic-gate-policy.ts. Kept here because it
|
|
258
|
+
// owns the cooldown Map + SystemLogger + Date.now side effects.
|
|
250
259
|
'pain-diagnostic-gate.ts',
|
|
251
260
|
'hygiene/tracker.ts',
|
|
252
261
|
'schema/migrations/002-init-central.ts',
|
|
@@ -289,6 +298,9 @@ const KNOWN_PLUGIN_CORE_FILES = new Set([
|
|
|
289
298
|
'dictionary.ts',
|
|
290
299
|
'thinking-os-parser.ts',
|
|
291
300
|
'system-logger.ts',
|
|
301
|
+
// PRI-446: now a thin shell wiring DetectionFunnelCore (core runtime-v2/detection)
|
|
302
|
+
// with crypto.createHash + PainDictionary. Kept here because it owns the
|
|
303
|
+
// crypto + dictionary I/O boundary.
|
|
292
304
|
'detection-funnel.ts',
|
|
293
305
|
'risk-calculator.ts',
|
|
294
306
|
'migration.ts',
|
|
@@ -361,6 +373,9 @@ describe('PRI-212 plugin core anti-growth guard', () => {
|
|
|
361
373
|
// model-training-registry.ts, model-deployment-registry.ts,
|
|
362
374
|
// shadow-observation-registry.ts (98 → 93)
|
|
363
375
|
// PRI-449: Removed external-training-contract.ts (93 → 92)
|
|
376
|
+
// PRI-446: pain-diagnostic-gate.ts and detection-funnel.ts remain at 92 —
|
|
377
|
+
// they are now thin adapters delegating pure logic to core, but still live
|
|
378
|
+
// in plugin src/core/ and own I/O side effects, so they stay classified.
|
|
364
379
|
expect(KNOWN_PLUGIN_CORE_FILES.size).toBe(92);
|
|
365
380
|
});
|
|
366
381
|
});
|
|
@@ -597,6 +612,30 @@ describe('PRI-42 internalization boundary', () => {
|
|
|
597
612
|
expect(src).not.toContain('../../../openclaw-plugin');
|
|
598
613
|
}
|
|
599
614
|
});
|
|
615
|
+
it('PRI-446: pain-gate has zero openclaw-plugin imports', async () => {
|
|
616
|
+
const { existsSync, readdirSync, readFileSync } = await import('node:fs');
|
|
617
|
+
const { resolve, join } = await import('node:path');
|
|
618
|
+
const dir = resolve(__dirname, '..', 'pain-gate');
|
|
619
|
+
expect(existsSync(dir)).toBe(true);
|
|
620
|
+
const files = readdirSync(dir).filter((f) => f.endsWith('.ts') && !f.endsWith('.test.ts'));
|
|
621
|
+
for (const file of files) {
|
|
622
|
+
const src = readFileSync(join(dir, file), 'utf-8');
|
|
623
|
+
expect(src).not.toContain('openclaw-plugin');
|
|
624
|
+
expect(src).not.toContain('../../../openclaw-plugin');
|
|
625
|
+
}
|
|
626
|
+
});
|
|
627
|
+
it('PRI-446: detection has zero openclaw-plugin imports', async () => {
|
|
628
|
+
const { existsSync, readdirSync, readFileSync } = await import('node:fs');
|
|
629
|
+
const { resolve, join } = await import('node:path');
|
|
630
|
+
const dir = resolve(__dirname, '..', 'detection');
|
|
631
|
+
expect(existsSync(dir)).toBe(true);
|
|
632
|
+
const files = readdirSync(dir).filter((f) => f.endsWith('.ts') && !f.endsWith('.test.ts'));
|
|
633
|
+
for (const file of files) {
|
|
634
|
+
const src = readFileSync(join(dir, file), 'utf-8');
|
|
635
|
+
expect(src).not.toContain('openclaw-plugin');
|
|
636
|
+
expect(src).not.toContain('../../../openclaw-plugin');
|
|
637
|
+
}
|
|
638
|
+
});
|
|
600
639
|
it('plugin does not re-define RuleHost contract types locally', async () => {
|
|
601
640
|
const { existsSync, readFileSync } = await import('node:fs');
|
|
602
641
|
const { resolve } = await import('node:path');
|
|
@@ -1598,6 +1637,16 @@ describe('PRI-75/PRI-74/PRI-81 prompt-builder core boundary', () => {
|
|
|
1598
1637
|
// Must NOT have the old multi-line fallback block with attitudeDirective interpolation
|
|
1599
1638
|
expect(src).not.toMatch(/## 【CONTEXT SECTIONS】\n\n\[WARNING: Context sections stripped/);
|
|
1600
1639
|
});
|
|
1640
|
+
it('plugin prompt-helpers.ts imports escapeXml from core, not reimplemented', async () => {
|
|
1641
|
+
const { readFileSync } = await import('node:fs');
|
|
1642
|
+
const { resolve } = await import('node:path');
|
|
1643
|
+
const src = readFileSync(resolve(__dirname, '../../../../openclaw-plugin/src/hooks/prompt-helpers.ts'), 'utf-8');
|
|
1644
|
+
// Must import escapeXml from core
|
|
1645
|
+
expect(src).toContain('@principles/core/prompt-builder');
|
|
1646
|
+
expect(src).toMatch(/import\s*\{[^}]*escapeXml[^}]*\}\s*from\s*['"]@principles\/core\/prompt-builder['"]/);
|
|
1647
|
+
// Must NOT reimplement escapeXml inline
|
|
1648
|
+
expect(src).not.toMatch(/\b(function\s+escapeXml\s*\(|const\s+escapeXml\s*=\s*(?:async\s*)?(?:\([^)]*\)|[a-zA-Z_$][\w$]*)\s*=>)/);
|
|
1649
|
+
});
|
|
1601
1650
|
it('plugin empathy-keyword-matcher.ts is a thin adapter (re-exports from core)', async () => {
|
|
1602
1651
|
const { readFileSync } = await import('node:fs');
|
|
1603
1652
|
const { resolve } = await import('node:path');
|