@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.
Files changed (76) hide show
  1. package/dist/index.d.ts +2 -2
  2. package/dist/index.d.ts.map +1 -1
  3. package/dist/index.js +1 -1
  4. package/dist/index.js.map +1 -1
  5. package/dist/prompt-builder/__tests__/model-config.test.d.ts +2 -0
  6. package/dist/prompt-builder/__tests__/model-config.test.d.ts.map +1 -0
  7. package/dist/prompt-builder/__tests__/model-config.test.js +158 -0
  8. package/dist/prompt-builder/__tests__/model-config.test.js.map +1 -0
  9. package/dist/prompt-builder/__tests__/xml-escape.test.d.ts +2 -0
  10. package/dist/prompt-builder/__tests__/xml-escape.test.d.ts.map +1 -0
  11. package/dist/prompt-builder/__tests__/xml-escape.test.js +42 -0
  12. package/dist/prompt-builder/__tests__/xml-escape.test.js.map +1 -0
  13. package/dist/prompt-builder/index.d.ts +3 -0
  14. package/dist/prompt-builder/index.d.ts.map +1 -1
  15. package/dist/prompt-builder/index.js +2 -0
  16. package/dist/prompt-builder/index.js.map +1 -1
  17. package/dist/prompt-builder/model-config.d.ts +42 -0
  18. package/dist/prompt-builder/model-config.d.ts.map +1 -0
  19. package/dist/prompt-builder/model-config.js +84 -0
  20. package/dist/prompt-builder/model-config.js.map +1 -0
  21. package/dist/prompt-builder/xml-escape.d.ts +12 -0
  22. package/dist/prompt-builder/xml-escape.d.ts.map +1 -0
  23. package/dist/prompt-builder/xml-escape.js +19 -0
  24. package/dist/prompt-builder/xml-escape.js.map +1 -0
  25. package/dist/runtime-v2/__tests__/architecture-regression.test.js +49 -0
  26. package/dist/runtime-v2/__tests__/architecture-regression.test.js.map +1 -1
  27. package/dist/runtime-v2/detection/__tests__/detection-funnel-policy.test.d.ts +13 -0
  28. package/dist/runtime-v2/detection/__tests__/detection-funnel-policy.test.d.ts.map +1 -0
  29. package/dist/runtime-v2/detection/__tests__/detection-funnel-policy.test.js +111 -0
  30. package/dist/runtime-v2/detection/__tests__/detection-funnel-policy.test.js.map +1 -0
  31. package/dist/runtime-v2/detection/detection-funnel-policy.d.ts +103 -0
  32. package/dist/runtime-v2/detection/detection-funnel-policy.d.ts.map +1 -0
  33. package/dist/runtime-v2/detection/detection-funnel-policy.js +135 -0
  34. package/dist/runtime-v2/detection/detection-funnel-policy.js.map +1 -0
  35. package/dist/runtime-v2/detection/index.d.ts +10 -0
  36. package/dist/runtime-v2/detection/index.d.ts.map +1 -0
  37. package/dist/runtime-v2/detection/index.js +9 -0
  38. package/dist/runtime-v2/detection/index.js.map +1 -0
  39. package/dist/runtime-v2/evidence-triage/__tests__/observation-resolver.test.d.ts +12 -0
  40. package/dist/runtime-v2/evidence-triage/__tests__/observation-resolver.test.d.ts.map +1 -0
  41. package/dist/runtime-v2/evidence-triage/__tests__/observation-resolver.test.js +137 -0
  42. package/dist/runtime-v2/evidence-triage/__tests__/observation-resolver.test.js.map +1 -0
  43. package/dist/runtime-v2/evidence-triage/__tests__/triage-policy.test.js +104 -1
  44. package/dist/runtime-v2/evidence-triage/__tests__/triage-policy.test.js.map +1 -1
  45. package/dist/runtime-v2/evidence-triage/index.d.ts +3 -0
  46. package/dist/runtime-v2/evidence-triage/index.d.ts.map +1 -1
  47. package/dist/runtime-v2/evidence-triage/index.js +3 -0
  48. package/dist/runtime-v2/evidence-triage/index.js.map +1 -1
  49. package/dist/runtime-v2/evidence-triage/observation-resolver.d.ts +107 -0
  50. package/dist/runtime-v2/evidence-triage/observation-resolver.d.ts.map +1 -0
  51. package/dist/runtime-v2/evidence-triage/observation-resolver.js +175 -0
  52. package/dist/runtime-v2/evidence-triage/observation-resolver.js.map +1 -0
  53. package/dist/runtime-v2/evidence-triage/triage-policy.d.ts +4 -0
  54. package/dist/runtime-v2/evidence-triage/triage-policy.d.ts.map +1 -1
  55. package/dist/runtime-v2/evidence-triage/triage-policy.js +66 -9
  56. package/dist/runtime-v2/evidence-triage/triage-policy.js.map +1 -1
  57. package/dist/runtime-v2/evidence-triage/types.d.ts +14 -0
  58. package/dist/runtime-v2/evidence-triage/types.d.ts.map +1 -1
  59. package/dist/runtime-v2/evidence-triage/types.js.map +1 -1
  60. package/dist/runtime-v2/index.d.ts +6 -2
  61. package/dist/runtime-v2/index.d.ts.map +1 -1
  62. package/dist/runtime-v2/index.js +3 -1
  63. package/dist/runtime-v2/index.js.map +1 -1
  64. package/dist/runtime-v2/pain-gate/__tests__/pain-diagnostic-gate-policy.test.d.ts +15 -0
  65. package/dist/runtime-v2/pain-gate/__tests__/pain-diagnostic-gate-policy.test.d.ts.map +1 -0
  66. package/dist/runtime-v2/pain-gate/__tests__/pain-diagnostic-gate-policy.test.js +179 -0
  67. package/dist/runtime-v2/pain-gate/__tests__/pain-diagnostic-gate-policy.test.js.map +1 -0
  68. package/dist/runtime-v2/pain-gate/index.d.ts +10 -0
  69. package/dist/runtime-v2/pain-gate/index.d.ts.map +1 -0
  70. package/dist/runtime-v2/pain-gate/index.js +9 -0
  71. package/dist/runtime-v2/pain-gate/index.js.map +1 -0
  72. package/dist/runtime-v2/pain-gate/pain-diagnostic-gate-policy.d.ts +110 -0
  73. package/dist/runtime-v2/pain-gate/pain-diagnostic-gate-policy.d.ts.map +1 -0
  74. package/dist/runtime-v2/pain-gate/pain-diagnostic-gate-policy.js +146 -0
  75. package/dist/runtime-v2/pain-gate/pain-diagnostic-gate-policy.js.map +1 -0
  76. 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';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
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,SAAS,EACT,qBAAqB,EACrB,gBAAgB,EAChB,yBAAyB,EACzB,kBAAkB,EAClB,sBAAsB,GACvB,MAAM,2BAA2B,CAAC;AACnC,YAAY,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAGtH,OAAO,EACL,oBAAoB,EACpB,yBAAyB,EACzB,mBAAmB,EACnB,yBAAyB,EACzB,sBAAsB,EACtB,qBAAqB,EACrB,8BAA8B,EAC9B,eAAe,EACf,iBAAiB,EACjB,iBAAiB,GAClB,MAAM,2BAA2B,CAAC;AACnC,YAAY,EACV,mBAAmB,EACnB,mBAAmB,EACnB,mBAAmB,EACnB,kBAAkB,EAClB,oBAAoB,EACpB,yBAAyB,EACzB,gBAAgB,EAChB,oBAAoB,GACrB,MAAM,2BAA2B,CAAC;AAGnC,OAAO,EACL,cAAc,EACd,WAAW,EACX,cAAc,EACd,yBAAyB,EACzB,wBAAwB,EACxB,iBAAiB,EACjB,oBAAoB,EACpB,kBAAkB,EAClB,oBAAoB,EACpB,iCAAiC,GAClC,MAAM,2BAA2B,CAAC;AACnC,YAAY,EACV,YAAY,EACZ,qBAAqB,EACrB,uBAAuB,EACvB,sBAAsB,GACvB,MAAM,2BAA2B,CAAC;AAGnC,OAAO,EAAE,qBAAqB,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AACtF,YAAY,EAAE,sBAAsB,EAAE,4BAA4B,EAAE,MAAM,uBAAuB,CAAC;AAOlG,OAAO,EACL,yBAAyB,EACzB,SAAS,EACT,sBAAsB,EACtB,4BAA4B,EAC5B,qBAAqB,EACrB,mBAAmB,EACnB,cAAc,EACd,iBAAiB,GAClB,MAAM,uBAAuB,CAAC;AAG/B,OAAO,EACL,SAAS,EACT,iCAAiC,EACjC,wBAAwB,EACxB,sBAAsB,EACtB,eAAe,GAChB,MAAM,uBAAuB,CAAC;AAG/B,OAAO,EACL,iBAAiB,EACjB,yBAAyB,EACzB,mBAAmB,EACnB,eAAe,EACf,wBAAwB,EACxB,eAAe,EACf,iBAAiB,EACjB,kBAAkB,EAClB,iBAAiB,EACjB,aAAa,EACb,mBAAmB,EACnB,yBAAyB,EACzB,wBAAwB,GACzB,MAAM,uBAAuB,CAAC;AAG/B,OAAO,EACL,kBAAkB,EAClB,gBAAgB,EAChB,6BAA6B,GAC9B,MAAM,uBAAuB,CAAC;AAG/B,OAAO,EACL,8BAA8B,GAC/B,MAAM,uBAAuB,CAAC;AAG/B,OAAO,EACL,uBAAuB,EACvB,2BAA2B,EAC3B,yBAAyB,EACzB,4BAA4B,EAC5B,wBAAwB,EACxB,qBAAqB,EACrB,oBAAoB,EACpB,iCAAiC,GAClC,MAAM,uBAAuB,CAAC;AAG/B,OAAO,EACL,oCAAoC,EACpC,2BAA2B,EAC3B,wBAAwB,EACxB,iCAAiC,EACjC,2BAA2B,EAC3B,kCAAkC,GACnC,MAAM,uBAAuB,CAAC;AAC/B,YAAY,EACV,eAAe,EACf,SAAS,EACT,2BAA2B,EAC3B,kBAAkB,EAClB,gBAAgB,EAChB,gBAAgB,EAChB,WAAW,EACX,mBAAmB,EACnB,aAAa,EACb,SAAS,EACT,kBAAkB,EAClB,SAAS,EACT,WAAW,EACX,YAAY,EACZ,WAAW,EACX,OAAO,EACP,aAAa,EACb,mBAAmB,EACnB,kBAAkB,EAClB,gBAAgB,EAChB,eAAe,EACf,wBAAwB,EACxB,sBAAsB,EACtB,YAAY,EACZ,UAAU,EACV,uBAAuB,EACvB,iBAAiB,EACjB,qBAAqB,EACrB,mBAAmB,EACnB,sBAAsB,EACtB,kBAAkB,EAClB,eAAe,EACf,cAAc,EACd,2BAA2B,EAC3B,qBAAqB,EACrB,8BAA8B,EAC9B,qBAAqB,EACrB,kBAAkB,EAClB,2BAA2B,EAC3B,4BAA4B,GAC7B,MAAM,uBAAuB,CAAC;AAG/B,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,YAAY,EAAE,0BAA0B,EAAE,MAAM,uBAAuB,CAAC;AAGxE,OAAO,EACL,eAAe,EACf,cAAc,EACd,iBAAiB,EACjB,gBAAgB,EAChB,uBAAuB,EACvB,wBAAwB,EACxB,kBAAkB,EAClB,sBAAsB,EACtB,yBAAyB,EACzB,qBAAqB,EACrB,yBAAyB,EACzB,qBAAqB,EACrB,sBAAsB,GACvB,MAAM,uBAAuB,CAAC;AAC/B,YAAY,EACV,YAAY,EACZ,sBAAsB,EACtB,mBAAmB,GACpB,MAAM,uBAAuB,CAAC;AAC/B,YAAY,EAAE,gBAAgB,EAAE,MAAM,iDAAiD,CAAC;AACxF,YAAY,EACV,SAAS,EACT,eAAe,EACf,oBAAoB,GACrB,MAAM,uCAAuC,CAAC;AAC/C,YAAY,EACV,QAAQ,EACR,SAAS,GACV,MAAM,qCAAqC,CAAC;AAC7C,YAAY,EAAE,iBAAiB,EAAE,MAAM,qDAAqD,CAAC;AAG7F,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,YAAY,EAAE,YAAY,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC/E,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAC3D,YAAY,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC5E,OAAO,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAC7D,YAAY,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAG3E,OAAO,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAGxE,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AACnE,YAAY,EACV,aAAa,EACb,cAAc,EACd,YAAY,EACZ,oBAAoB,GACrB,MAAM,6BAA6B,CAAC"}
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":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=model-config.test.d.ts.map
@@ -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":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAClD,OAAO,EACL,kBAAkB,EAClB,sBAAsB,GAGvB,MAAM,oBAAoB,CAAC;AAE5B,QAAQ,CAAC,oBAAoB,EAAE,GAAG,EAAE;IAClC,EAAE,CAAC,qCAAqC,EAAE,GAAG,EAAE;QAC7C,MAAM,CAAC,kBAAkB,CAAC,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACtD,MAAM,CAAC,kBAAkB,CAAC,yBAAyB,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACnE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qCAAqC,EAAE,GAAG,EAAE;QAC7C,MAAM,CAAC,kBAAkB,CAAC,oBAAoB,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC5D,MAAM,CAAC,kBAAkB,CAAC,6BAA6B,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACvE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iDAAiD,EAAE,GAAG,EAAE;QACzD,MAAM,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAChD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mEAAmE,EAAE,GAAG,EAAE;QAC3E,MAAM,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAChD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uBAAuB,EAAE,GAAG,EAAE;QAC/B,MAAM,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAChD,MAAM,CAAC,kBAAkB,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACnD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sBAAsB,EAAE,GAAG,EAAE;QAC9B,MAAM,CAAC,kBAAkB,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC7C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iDAAiD,EAAE,GAAG,EAAE;QACzD,MAAM,CAAC,kBAAkB,CAAC,eAAe,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACxD,MAAM,CAAC,kBAAkB,CAAC,eAAe,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC1D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0CAA0C,EAAE,GAAG,EAAE;QAClD,MAAM,CAAC,kBAAkB,CAAC,eAAe,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACxD,MAAM,CAAC,kBAAkB,CAAC,eAAe,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC1D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0BAA0B,EAAE,GAAG,EAAE;QAClC,MAAM,CAAC,kBAAkB,CAAC,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACzD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,wBAAwB,EAAE,GAAG,EAAE;IACtC,QAAQ,CAAC,cAAc,EAAE,GAAG,EAAE;QAC5B,EAAE,CAAC,yCAAyC,EAAE,GAAG,EAAE;YACjD,MAAM,CAAC,sBAAsB,CAAC,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QACtE,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,kBAAkB,EAAE,GAAG,EAAE;YAC1B,MAAM,CAAC,sBAAsB,CAAC,kBAAkB,CAAC,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QAC1E,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,+BAA+B,EAAE,GAAG,EAAE;YACvC,MAAM,MAAM,GAAe,EAAE,IAAI,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC;YAC7C,MAAM,CAAC,sBAAsB,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACtD,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,oBAAoB,CAAC,MAAM,CAAC,gBAAgB,CAAC,oBAAoB,CAAC,CAAC,CAAC;QAC1F,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,yCAAyC,EAAE,GAAG,EAAE;YACjD,MAAM,MAAM,GAAe,EAAE,IAAI,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC;YAC7C,MAAM,CAAC,sBAAsB,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACzD,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,oBAAoB,CAAC,MAAM,CAAC,gBAAgB,CAAC,oBAAoB,CAAC,CAAC,CAAC;QAC1F,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,2CAA2C,EAAE,GAAG,EAAE;YACnD,MAAM,MAAM,GAAe,EAAE,IAAI,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC;YAC7C,MAAM,MAAM,GAAG,sBAAsB,CAAC,eAAe,EAAE,MAAM,CAAC,CAAC;YAC/D,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC1B,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,oBAAoB,CACtC,MAAM,CAAC,gBAAgB,CAAC,uCAAuC,CAAC,CACjE,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,6CAA6C,EAAE,GAAG,EAAE;YACrD,mBAAmB;YACnB,MAAM,MAAM,GAAG,sBAAsB,CAAC,eAAe,CAAC,CAAC;YACvD,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC5B,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,cAAc,EAAE,GAAG,EAAE;QAC5B,EAAE,CAAC,wCAAwC,EAAE,GAAG,EAAE;YAChD,MAAM,GAAG,GAAsB,EAAE,OAAO,EAAE,cAAc,EAAE,CAAC;YAC3D,MAAM,CAAC,sBAAsB,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QAC3D,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,gCAAgC,EAAE,GAAG,EAAE;YACxC,MAAM,GAAG,GAAsB,EAAE,OAAO,EAAE,kBAAkB,EAAE,CAAC;YAC/D,MAAM,CAAC,sBAAsB,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QAC3D,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,sCAAsC,EAAE,GAAG,EAAE;YAC9C,MAAM,MAAM,GAAe,EAAE,IAAI,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC;YAC7C,MAAM,GAAG,GAAsB,EAAE,SAAS,EAAE,CAAC,cAAc,CAAC,EAAE,CAAC;YAC/D,MAAM,CAAC,sBAAsB,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACvD,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,oBAAoB,CAAC,MAAM,CAAC,gBAAgB,CAAC,uBAAuB,CAAC,CAAC,CAAC;QAC7F,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,2CAA2C,EAAE,GAAG,EAAE;YACnD,MAAM,MAAM,GAAe,EAAE,IAAI,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC;YAC7C,MAAM,GAAG,GAAsB,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;YAC/C,MAAM,CAAC,sBAAsB,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACvD,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,oBAAoB,CAAC,MAAM,CAAC,gBAAgB,CAAC,4BAA4B,CAAC,CAAC,CAAC;QAClG,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,mDAAmD,EAAE,GAAG,EAAE;YAC3D,MAAM,MAAM,GAAe,EAAE,IAAI,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC;YAC7C,MAAM,GAAG,GAAsB,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC;YACtD,MAAM,MAAM,GAAG,sBAAsB,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;YACnD,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC1B,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,oBAAoB,CACtC,MAAM,CAAC,gBAAgB,CAAC,yCAAyC,CAAC,CACnE,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,yBAAyB,EAAE,GAAG,EAAE;YACjC,MAAM,GAAG,GAAsB;gBAC7B,OAAO,EAAE,cAAc;gBACvB,SAAS,EAAE,CAAC,oBAAoB,CAAC;aAClC,CAAC;YACF,MAAM,CAAC,sBAAsB,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QAC3D,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,aAAa,EAAE,GAAG,EAAE;QAC3B,EAAE,CAAC,kCAAkC,EAAE,GAAG,EAAE;YAC1C,MAAM,MAAM,GAAe,EAAE,IAAI,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC;YAC7C,MAAM,MAAM,GAAG,sBAAsB,CAAC,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC,CAAC;YAChE,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC1B,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,oBAAoB,CACtC,MAAM,CAAC,gBAAgB,CAAC,kCAAkC,CAAC,CAC5D,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,cAAc,EAAE,GAAG,EAAE;QAC5B,EAAE,CAAC,uBAAuB,EAAE,GAAG,EAAE;YAC/B,MAAM,MAAM,GAAe,EAAE,IAAI,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC;YAC7C,MAAM,CAAC,sBAAsB,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACxD,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,oBAAoB,CAAC,MAAM,CAAC,gBAAgB,CAAC,sBAAsB,CAAC,CAAC,CAAC;QAC5F,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,4BAA4B,EAAE,GAAG,EAAE;YACpC,MAAM,MAAM,GAAe,EAAE,IAAI,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC;YAC7C,MAAM,CAAC,sBAAsB,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC7D,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,oBAAoB,CAAC,MAAM,CAAC,gBAAgB,CAAC,sBAAsB,CAAC,CAAC,CAAC;QAC5F,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,yBAAyB,EAAE,GAAG,EAAE;YACjC,MAAM,MAAM,GAAe,EAAE,IAAI,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC;YAC7C,MAAM,CAAC,sBAAsB,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACtD,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,oBAAoB,CAAC,MAAM,CAAC,gBAAgB,CAAC,uCAAuC,CAAC,CAAC,CAAC;QAC7G,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,+BAA+B,EAAE,GAAG,EAAE;YACvC,MAAM,MAAM,GAAe,EAAE,IAAI,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC;YAC7C,MAAM,CAAC,sBAAsB,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACtD,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,oBAAoB,CAAC,MAAM,CAAC,gBAAgB,CAAC,uBAAuB,CAAC,CAAC,CAAC;QAC7F,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,iDAAiD,EAAE,GAAG,EAAE;YACzD,MAAM,MAAM,GAAe,EAAE,IAAI,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC;YAC7C,MAAM,CAAC,sBAAsB,CAAC,EAAE,OAAO,EAAE,GAAG,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACpE,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,oBAAoB,CAAC,MAAM,CAAC,gBAAgB,CAAC,oCAAoC,CAAC,CAAC,CAAC;QAC1G,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,oDAAoD,EAAE,GAAG,EAAE;YAC5D,MAAM,MAAM,GAAe,EAAE,IAAI,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC;YAC7C,MAAM,eAAe,GAAG,MAAM,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,cAAc,EAAE,CAAC,CAAC;YACnE,MAAM,CAAC,sBAAsB,CAAC,eAAe,EAAE,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACnE,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,oBAAoB,CAAC,MAAM,CAAC,gBAAgB,CAAC,uBAAuB,CAAC,CAAC,CAAC;QAC7F,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,sBAAsB,EAAE,GAAG,EAAE;QACpC,EAAE,CAAC,iFAAiF,EAAE,GAAG,EAAE;YACzF,iDAAiD;YACjD,MAAM,gBAAgB,GAAe;gBACnC,IAAI,EAAE,EAAE,CAAC,EAAE,EAAE;gBACb,IAAI,EAAE,EAAE,CAAC,EAAE,EAAE;gBACb,KAAK,EAAE,EAAE,CAAC,EAAE,EAAE;aACf,CAAC;YACF,iDAAiD;YACjD,MAAM,MAAM,GAAG,sBAAsB,CAAC,SAAS,EAAE,gBAAgB,CAAC,CAAC;YACnE,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC5B,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=xml-escape.test.d.ts.map
@@ -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&lt;b');
9
+ });
10
+ it('escapes greater-than', () => {
11
+ expect(escapeXml('a>b')).toBe('a&gt;b');
12
+ });
13
+ it('escapes double quote', () => {
14
+ expect(escapeXml('a"b')).toBe('a&quot;b');
15
+ });
16
+ it('escapes single quote', () => {
17
+ expect(escapeXml("a'b")).toBe('a&apos;b');
18
+ });
19
+ it('escapes all special characters in mixed content', () => {
20
+ expect(escapeXml('<tag attr="x">A&B\'C</tag>')).toBe('&lt;tag attr=&quot;x&quot;&gt;A&amp;B&apos;C&lt;/tag&gt;');
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('&amp;&amp;&amp;');
30
+ });
31
+ it('escapes ampersand first to avoid double-escaping', () => {
32
+ // If & were not escaped first, &lt; would become &amp;lt;
33
+ expect(escapeXml('&lt;')).toBe('&amp;lt;');
34
+ });
35
+ it('handles principle-id-like input', () => {
36
+ expect(escapeXml('P<001>')).toBe('P&lt;001&gt;');
37
+ });
38
+ it('handles principle-text-like input', () => {
39
+ expect(escapeXml('Use "typeof" & avoid <as>')).toBe('Use &quot;typeof&quot; &amp; avoid &lt;as&gt;');
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;AAGnI,OAAO,EAAE,sBAAsB,EAAE,MAAM,yBAAyB,CAAC;AACjE,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC1D,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;AAGpL,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"}
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;AASH,YAAY;AACZ,OAAO,EAAE,sBAAsB,EAAE,MAAM,yBAAyB,CAAC;AACjE,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC1D,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;AAEpL,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"}
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, '&amp;')
14
+ .replace(/</g, '&lt;')
15
+ .replace(/>/g, '&gt;')
16
+ .replace(/"/g, '&quot;')
17
+ .replace(/'/g, '&apos;');
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');