@principles/core 1.91.0 → 1.92.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 (39) hide show
  1. package/dist/runtime-v2/__tests__/architecture-regression.test.js +4 -1
  2. package/dist/runtime-v2/__tests__/architecture-regression.test.js.map +1 -1
  3. package/dist/runtime-v2/__tests__/pain-to-principle-service.test.js +48 -3
  4. package/dist/runtime-v2/__tests__/pain-to-principle-service.test.js.map +1 -1
  5. package/dist/runtime-v2/__tests__/resolve-runtime-config-from-pd-config.test.d.ts +12 -0
  6. package/dist/runtime-v2/__tests__/resolve-runtime-config-from-pd-config.test.d.ts.map +1 -0
  7. package/dist/runtime-v2/__tests__/resolve-runtime-config-from-pd-config.test.js +194 -0
  8. package/dist/runtime-v2/__tests__/resolve-runtime-config-from-pd-config.test.js.map +1 -0
  9. package/dist/runtime-v2/__tests__/runtime-config-boundary.test.js +5 -3
  10. package/dist/runtime-v2/__tests__/runtime-config-boundary.test.js.map +1 -1
  11. package/dist/runtime-v2/adapter/openclaw-cli-runtime-adapter.d.ts +4 -2
  12. package/dist/runtime-v2/adapter/openclaw-cli-runtime-adapter.d.ts.map +1 -1
  13. package/dist/runtime-v2/adapter/openclaw-cli-runtime-adapter.js +0 -1
  14. package/dist/runtime-v2/adapter/openclaw-cli-runtime-adapter.js.map +1 -1
  15. package/dist/runtime-v2/config/__tests__/pd-config-agent-binding.test.d.ts +18 -0
  16. package/dist/runtime-v2/config/__tests__/pd-config-agent-binding.test.d.ts.map +1 -0
  17. package/dist/runtime-v2/config/__tests__/pd-config-agent-binding.test.js +339 -0
  18. package/dist/runtime-v2/config/__tests__/pd-config-agent-binding.test.js.map +1 -0
  19. package/dist/runtime-v2/config/index.d.ts +2 -0
  20. package/dist/runtime-v2/config/index.d.ts.map +1 -1
  21. package/dist/runtime-v2/config/index.js +1 -0
  22. package/dist/runtime-v2/config/index.js.map +1 -1
  23. package/dist/runtime-v2/config/pd-config-agent-binding.d.ts +93 -0
  24. package/dist/runtime-v2/config/pd-config-agent-binding.d.ts.map +1 -0
  25. package/dist/runtime-v2/config/pd-config-agent-binding.js +184 -0
  26. package/dist/runtime-v2/config/pd-config-agent-binding.js.map +1 -0
  27. package/dist/runtime-v2/index.d.ts +3 -1
  28. package/dist/runtime-v2/index.d.ts.map +1 -1
  29. package/dist/runtime-v2/index.js +3 -1
  30. package/dist/runtime-v2/index.js.map +1 -1
  31. package/dist/runtime-v2/pain-signal-runtime-factory.d.ts +16 -0
  32. package/dist/runtime-v2/pain-signal-runtime-factory.d.ts.map +1 -1
  33. package/dist/runtime-v2/pain-signal-runtime-factory.js +76 -6
  34. package/dist/runtime-v2/pain-signal-runtime-factory.js.map +1 -1
  35. package/dist/runtime-v2/pain-to-principle-service.d.ts +7 -0
  36. package/dist/runtime-v2/pain-to-principle-service.d.ts.map +1 -1
  37. package/dist/runtime-v2/pain-to-principle-service.js +2 -0
  38. package/dist/runtime-v2/pain-to-principle-service.js.map +1 -1
  39. package/package.json +1 -1
@@ -0,0 +1,339 @@
1
+ /**
2
+ * Agent Runtime Binding Resolution Tests — PRI-306
3
+ *
4
+ * TDD tests for:
5
+ * - resolveAgentRuntimeBinding() — which RuntimeProfile an agent uses
6
+ * - checkAgentRuntimeReadiness() — whether a profile is ready to run
7
+ * - createAdapterConfigFromProfile() — profile → adapter config transform
8
+ *
9
+ * Acceptance criteria coverage:
10
+ * AC1: Diagnostician runtime can be configured to use an OpenClaw model reference
11
+ * AC2: Diagnostician runtime can be configured to use a PD-local profile with apiKeyEnv
12
+ * AC3: Per-agent override beats default runtime
13
+ * AC4: Missing env var for PD-local profile fails loud with reason + nextAction
14
+ * AC5: Existing MVP pipeline still runs with defaults
15
+ * AC6: Tests cover diagnostician + at least one peer runner binding path
16
+ */
17
+ import { describe, it, expect } from 'vitest';
18
+ import { computeEffectivePdConfig, getDefaultPdConfig, DEFAULT_RUNTIME_PROFILE_ID, } from '../index.js';
19
+ import { resolveAgentRuntimeBinding, checkAgentRuntimeReadiness, createAdapterConfigFromProfile, } from '../pd-config-agent-binding.js';
20
+ // ── Helpers ──────────────────────────────────────────────────────────────────
21
+ function makeConfigWithOverrides(overrides) {
22
+ const base = getDefaultPdConfig();
23
+ return { ...base, ...overrides };
24
+ }
25
+ function makeConfigWithPdLocalProfile() {
26
+ return makeConfigWithOverrides({
27
+ runtimeProfiles: {
28
+ 'openclaw.default': { type: 'openclaw', source: 'default' },
29
+ 'anthropic-claude': {
30
+ type: 'pi-ai',
31
+ provider: 'anthropic',
32
+ model: 'claude-3-5-sonnet',
33
+ apiKeyEnv: 'ANTHROPIC_API_KEY',
34
+ },
35
+ },
36
+ internalAgents: {
37
+ defaultRuntime: 'openclaw.default',
38
+ agents: {
39
+ diagnostician: { enabled: true, runtimeProfile: 'anthropic-claude' },
40
+ dreamer: { enabled: true },
41
+ philosopher: { enabled: false },
42
+ scribe: { enabled: true },
43
+ artificer: { enabled: true },
44
+ evaluator: { enabled: false },
45
+ rolloutReviewer: { enabled: false },
46
+ trainer: { enabled: false },
47
+ correctionObserver: { enabled: false },
48
+ empathyObserver: { enabled: false },
49
+ },
50
+ },
51
+ });
52
+ }
53
+ function makeConfigWithOpenClawProfile() {
54
+ return makeConfigWithOverrides({
55
+ runtimeProfiles: {
56
+ 'openclaw.default': { type: 'openclaw', source: 'default' },
57
+ 'lmstudio-local': {
58
+ type: 'openclaw',
59
+ provider: 'lmstudio',
60
+ model: 'qwen3.6-27b-mtp',
61
+ },
62
+ },
63
+ internalAgents: {
64
+ defaultRuntime: 'openclaw.default',
65
+ agents: {
66
+ diagnostician: { enabled: true, runtimeProfile: 'lmstudio-local' },
67
+ dreamer: { enabled: true },
68
+ philosopher: { enabled: false },
69
+ scribe: { enabled: true },
70
+ artificer: { enabled: true },
71
+ evaluator: { enabled: false },
72
+ rolloutReviewer: { enabled: false },
73
+ trainer: { enabled: false },
74
+ correctionObserver: { enabled: false },
75
+ empathyObserver: { enabled: false },
76
+ },
77
+ },
78
+ });
79
+ }
80
+ // ── resolveAgentRuntimeBinding ───────────────────────────────────────────────
81
+ describe('resolveAgentRuntimeBinding', () => {
82
+ it('AC5: returns default profile when no per-agent override (MVP defaults)', () => {
83
+ const effective = computeEffectivePdConfig(null);
84
+ const result = resolveAgentRuntimeBinding(effective, 'diagnostician');
85
+ expect(result.ok).toBe(true);
86
+ if (!result.ok)
87
+ return;
88
+ expect(result.profileId).toBe(DEFAULT_RUNTIME_PROFILE_ID);
89
+ expect(result.profile.type).toBe('openclaw');
90
+ expect(result.source).toBe('default_runtime');
91
+ });
92
+ it('AC1: diagnostician uses OpenClaw model reference when configured', () => {
93
+ const config = makeConfigWithOpenClawProfile();
94
+ const effective = computeEffectivePdConfig(config);
95
+ const result = resolveAgentRuntimeBinding(effective, 'diagnostician');
96
+ expect(result.ok).toBe(true);
97
+ if (!result.ok)
98
+ return;
99
+ expect(result.profileId).toBe('lmstudio-local');
100
+ expect(result.profile.type).toBe('openclaw');
101
+ if (result.profile.type === 'openclaw') {
102
+ expect(result.profile.provider).toBe('lmstudio');
103
+ expect(result.profile.model).toBe('qwen3.6-27b-mtp');
104
+ }
105
+ expect(result.source).toBe('agent_override');
106
+ });
107
+ it('AC2: diagnostician uses PD-local profile with apiKeyEnv when configured', () => {
108
+ const config = makeConfigWithPdLocalProfile();
109
+ const effective = computeEffectivePdConfig(config);
110
+ const result = resolveAgentRuntimeBinding(effective, 'diagnostician');
111
+ expect(result.ok).toBe(true);
112
+ if (!result.ok)
113
+ return;
114
+ expect(result.profileId).toBe('anthropic-claude');
115
+ expect(result.profile.type).toBe('pi-ai');
116
+ if (result.profile.type === 'pi-ai') {
117
+ expect(result.profile.provider).toBe('anthropic');
118
+ expect(result.profile.model).toBe('claude-3-5-sonnet');
119
+ expect(result.profile.apiKeyEnv).toBe('ANTHROPIC_API_KEY');
120
+ }
121
+ expect(result.source).toBe('agent_override');
122
+ });
123
+ it('AC3: per-agent override beats default runtime', () => {
124
+ const config = makeConfigWithPdLocalProfile();
125
+ const effective = computeEffectivePdConfig(config);
126
+ // diagnostician has explicit override → uses anthropic-claude
127
+ const diagResult = resolveAgentRuntimeBinding(effective, 'diagnostician');
128
+ expect(diagResult.ok).toBe(true);
129
+ if (!diagResult.ok)
130
+ return;
131
+ expect(diagResult.profileId).toBe('anthropic-claude');
132
+ expect(diagResult.source).toBe('agent_override');
133
+ // dreamer has no override → uses defaultRuntime (openclaw.default)
134
+ const dreamerResult = resolveAgentRuntimeBinding(effective, 'dreamer');
135
+ expect(dreamerResult.ok).toBe(true);
136
+ if (!dreamerResult.ok)
137
+ return;
138
+ expect(dreamerResult.profileId).toBe('openclaw.default');
139
+ expect(dreamerResult.source).toBe('default_runtime');
140
+ });
141
+ it('AC6: peer runner (dreamer) binding path works', () => {
142
+ const config = makeConfigWithOverrides({
143
+ runtimeProfiles: {
144
+ 'openclaw.default': { type: 'openclaw', source: 'default' },
145
+ 'dreamer-profile': {
146
+ type: 'pi-ai',
147
+ provider: 'openrouter',
148
+ model: 'openai/gpt-4o',
149
+ apiKeyEnv: 'OPENROUTER_API_KEY',
150
+ },
151
+ },
152
+ internalAgents: {
153
+ defaultRuntime: 'openclaw.default',
154
+ agents: {
155
+ diagnostician: { enabled: true },
156
+ dreamer: { enabled: true, runtimeProfile: 'dreamer-profile' },
157
+ philosopher: { enabled: false },
158
+ scribe: { enabled: true },
159
+ artificer: { enabled: true },
160
+ evaluator: { enabled: false },
161
+ rolloutReviewer: { enabled: false },
162
+ trainer: { enabled: false },
163
+ correctionObserver: { enabled: false },
164
+ empathyObserver: { enabled: false },
165
+ },
166
+ },
167
+ });
168
+ const effective = computeEffectivePdConfig(config);
169
+ const result = resolveAgentRuntimeBinding(effective, 'dreamer');
170
+ expect(result.ok).toBe(true);
171
+ if (!result.ok)
172
+ return;
173
+ expect(result.profileId).toBe('dreamer-profile');
174
+ expect(result.profile.type).toBe('pi-ai');
175
+ if (result.profile.type === 'pi-ai') {
176
+ expect(result.profile.provider).toBe('openrouter');
177
+ expect(result.profile.apiKeyEnv).toBe('OPENROUTER_API_KEY');
178
+ }
179
+ expect(result.source).toBe('agent_override');
180
+ });
181
+ it('returns error when profile ID references missing profile', () => {
182
+ const config = makeConfigWithOverrides({
183
+ runtimeProfiles: {
184
+ 'openclaw.default': { type: 'openclaw', source: 'default' },
185
+ },
186
+ internalAgents: {
187
+ defaultRuntime: 'openclaw.default',
188
+ agents: {
189
+ diagnostician: { enabled: true, runtimeProfile: 'nonexistent-profile' },
190
+ dreamer: { enabled: true },
191
+ philosopher: { enabled: false },
192
+ scribe: { enabled: true },
193
+ artificer: { enabled: true },
194
+ evaluator: { enabled: false },
195
+ rolloutReviewer: { enabled: false },
196
+ trainer: { enabled: false },
197
+ correctionObserver: { enabled: false },
198
+ empathyObserver: { enabled: false },
199
+ },
200
+ },
201
+ });
202
+ const effective = computeEffectivePdConfig(config);
203
+ const result = resolveAgentRuntimeBinding(effective, 'diagnostician');
204
+ expect(result.ok).toBe(false);
205
+ if (result.ok)
206
+ return;
207
+ expect(result.readiness).toBe('needs_setup');
208
+ expect(result.reason).toContain('nonexistent-profile');
209
+ expect(result.nextAction).toBeTruthy();
210
+ });
211
+ it('returns error for disabled agent', () => {
212
+ const effective = computeEffectivePdConfig(null);
213
+ const result = resolveAgentRuntimeBinding(effective, 'philosopher');
214
+ expect(result.ok).toBe(false);
215
+ if (result.ok)
216
+ return;
217
+ expect(result.readiness).toBe('disabled');
218
+ });
219
+ });
220
+ // ── checkAgentRuntimeReadiness ───────────────────────────────────────────────
221
+ describe('checkAgentRuntimeReadiness', () => {
222
+ it('returns ready for openclaw profile with source=default', () => {
223
+ const result = checkAgentRuntimeReadiness({ type: 'openclaw', source: 'default' }, () => undefined);
224
+ expect(result.readiness).toBe('ready');
225
+ });
226
+ it('returns ready for openclaw profile with provider+model', () => {
227
+ const result = checkAgentRuntimeReadiness({ type: 'openclaw', provider: 'lmstudio', model: 'qwen3.6-27b-mtp' }, () => undefined);
228
+ expect(result.readiness).toBe('ready');
229
+ });
230
+ it('returns needs_setup for openclaw profile without provider or model', () => {
231
+ const result = checkAgentRuntimeReadiness({ type: 'openclaw' }, () => undefined);
232
+ expect(result.readiness).toBe('needs_setup');
233
+ expect(result.reason).toBeTruthy();
234
+ expect(result.nextAction).toBeTruthy();
235
+ });
236
+ it('AC4: returns not_ready for pi-ai profile when apiKeyEnv is missing from env', () => {
237
+ const result = checkAgentRuntimeReadiness({
238
+ type: 'pi-ai',
239
+ provider: 'anthropic',
240
+ model: 'claude-3-5-sonnet',
241
+ apiKeyEnv: 'MISSING_API_KEY',
242
+ }, (name) => name === 'MISSING_API_KEY' ? undefined : 'some-value');
243
+ expect(result.readiness).toBe('not_ready');
244
+ expect(result.reason).toContain('MISSING_API_KEY');
245
+ expect(result.nextAction).toBeTruthy();
246
+ });
247
+ it('returns ready for pi-ai profile when apiKeyEnv exists in env', () => {
248
+ const result = checkAgentRuntimeReadiness({
249
+ type: 'pi-ai',
250
+ provider: 'anthropic',
251
+ model: 'claude-3-5-sonnet',
252
+ apiKeyEnv: 'ANTHROPIC_API_KEY',
253
+ }, (name) => name === 'ANTHROPIC_API_KEY' ? 'sk-ant-test-key' : undefined);
254
+ expect(result.readiness).toBe('ready');
255
+ });
256
+ it('returns not_ready for pi-ai profile when apiKeyEnv is set but empty', () => {
257
+ const result = checkAgentRuntimeReadiness({
258
+ type: 'pi-ai',
259
+ provider: 'anthropic',
260
+ model: 'claude-3-5-sonnet',
261
+ apiKeyEnv: 'ANTHROPIC_API_KEY',
262
+ }, (name) => name === 'ANTHROPIC_API_KEY' ? '' : undefined);
263
+ expect(result.readiness).toBe('not_ready');
264
+ expect(result.reason).toContain('empty');
265
+ expect(result.nextAction).toBeTruthy();
266
+ });
267
+ it('returns needs_setup for pi-ai profile with empty provider', () => {
268
+ const result = checkAgentRuntimeReadiness(
269
+ // Empty provider is type-valid string but semantically invalid — tests runtime validation
270
+ {
271
+ type: 'pi-ai',
272
+ provider: '',
273
+ model: 'claude-3-5-sonnet',
274
+ apiKeyEnv: 'ANTHROPIC_API_KEY',
275
+ }, (name) => name === 'ANTHROPIC_API_KEY' ? 'sk-ant-test-key' : undefined);
276
+ expect(result.readiness).toBe('needs_setup');
277
+ expect(result.reason).toContain('provider');
278
+ });
279
+ });
280
+ // ── createAdapterConfigFromProfile ───────────────────────────────────────────
281
+ describe('createAdapterConfigFromProfile', () => {
282
+ it('creates PiAiRuntimeAdapterConfig from pi-ai profile', () => {
283
+ const result = createAdapterConfigFromProfile({
284
+ type: 'pi-ai',
285
+ provider: 'anthropic',
286
+ model: 'claude-3-5-sonnet',
287
+ apiKeyEnv: 'ANTHROPIC_API_KEY',
288
+ baseUrl: 'https://custom-api.example.com',
289
+ timeoutMs: 120_000,
290
+ }, '/workspace/test');
291
+ expect(result.runtimeKind).toBe('pi-ai');
292
+ if (result.runtimeKind !== 'pi-ai')
293
+ return;
294
+ expect(result.provider).toBe('anthropic');
295
+ expect(result.model).toBe('claude-3-5-sonnet');
296
+ expect(result.apiKeyEnv).toBe('ANTHROPIC_API_KEY');
297
+ expect(result.baseUrl).toBe('https://custom-api.example.com');
298
+ expect(result.timeoutMs).toBe(120_000);
299
+ expect(result.workspace).toBe('/workspace/test');
300
+ });
301
+ it('creates OpenClawCliRuntimeAdapter config from openclaw profile', () => {
302
+ const result = createAdapterConfigFromProfile({
303
+ type: 'openclaw',
304
+ provider: 'lmstudio',
305
+ model: 'qwen3.6-27b-mtp',
306
+ }, '/workspace/test');
307
+ expect(result.runtimeKind).toBe('openclaw-cli');
308
+ if (result.runtimeKind !== 'openclaw-cli')
309
+ return;
310
+ expect(result.workspaceDir).toBe('/workspace/test');
311
+ // Explicit provider+model → openclawMode='local' (not delegated)
312
+ expect(result.openclawMode).toBe('local');
313
+ });
314
+ it('creates openclaw config with source=default (delegated mode)', () => {
315
+ const result = createAdapterConfigFromProfile({
316
+ type: 'openclaw',
317
+ source: 'default',
318
+ }, '/workspace/test');
319
+ expect(result.runtimeKind).toBe('openclaw-cli');
320
+ if (result.runtimeKind !== 'openclaw-cli')
321
+ return;
322
+ // source='default' → openclawMode='default' (delegate to OpenClaw's own mode resolution)
323
+ expect(result.openclawMode).toBe('default');
324
+ });
325
+ it('pi-ai profile without baseUrl still produces valid config', () => {
326
+ const result = createAdapterConfigFromProfile({
327
+ type: 'pi-ai',
328
+ provider: 'openrouter',
329
+ model: 'openai/gpt-4o',
330
+ apiKeyEnv: 'OPENROUTER_API_KEY',
331
+ }, '/workspace/test');
332
+ expect(result.runtimeKind).toBe('pi-ai');
333
+ if (result.runtimeKind !== 'pi-ai')
334
+ return;
335
+ expect(result.provider).toBe('openrouter');
336
+ expect(result.baseUrl).toBeUndefined();
337
+ });
338
+ });
339
+ //# sourceMappingURL=pd-config-agent-binding.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pd-config-agent-binding.test.js","sourceRoot":"","sources":["../../../../src/runtime-v2/config/__tests__/pd-config-agent-binding.test.ts"],"names":[],"mappings":"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"}
@@ -11,4 +11,6 @@ export { computeEffectivePdConfig, } from './pd-config-effective.js';
11
11
  export { redactPdConfig, redactConfigValue, } from './pd-config-redaction.js';
12
12
  export type { EffectiveFeatureFlag, FeatureFlagsResult, } from './pd-config-feature-flags.js';
13
13
  export { MVP_CHANNEL_IDS, computeFeatureFlagsFromConfig, isFeatureEnabled, getEnabledFlagIds, } from './pd-config-feature-flags.js';
14
+ export type { AgentRuntimeBindingOk, AgentRuntimeBindingErr, AgentRuntimeBindingResult, AgentRuntimeReadinessResult, PiAiAdapterConfigResult, OpenClawAdapterConfigResult, AdapterConfigResult, } from './pd-config-agent-binding.js';
15
+ export { resolveAgentRuntimeBinding, checkAgentRuntimeReadiness, createAdapterConfigFromProfile, } from './pd-config-agent-binding.js';
14
16
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/runtime-v2/config/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,YAAY,EACV,eAAe,EACf,eAAe,EACf,gBAAgB,EAChB,kBAAkB,EAClB,sBAAsB,EACtB,qBAAqB,EACrB,cAAc,EACd,iBAAiB,EACjB,oBAAoB,EACpB,oBAAoB,EACpB,eAAe,EACf,QAAQ,EACR,QAAQ,EACR,uBAAuB,EACvB,0BAA0B,EAC1B,2BAA2B,EAC3B,wBAAwB,EACxB,iBAAiB,EACjB,6BAA6B,EAC7B,oBAAoB,EACpB,sBAAsB,EACtB,uBAAuB,GACxB,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EACL,iBAAiB,EACjB,wBAAwB,EACxB,mBAAmB,EACnB,oBAAoB,EACpB,uBAAuB,EACvB,cAAc,GACf,MAAM,sBAAsB,CAAC;AAG9B,OAAO,EACL,gBAAgB,GACjB,MAAM,yBAAyB,CAAC;AAGjC,OAAO,EACL,qBAAqB,EACrB,0BAA0B,EAC1B,uBAAuB,EACvB,UAAU,EACV,wBAAwB,EACxB,kBAAkB,GACnB,MAAM,yBAAyB,CAAC;AAGjC,OAAO,EACL,wBAAwB,GACzB,MAAM,0BAA0B,CAAC;AAGlC,OAAO,EACL,cAAc,EACd,iBAAiB,GAClB,MAAM,0BAA0B,CAAC;AAGlC,YAAY,EACV,oBAAoB,EACpB,kBAAkB,GACnB,MAAM,8BAA8B,CAAC;AAEtC,OAAO,EACL,eAAe,EACf,6BAA6B,EAC7B,gBAAgB,EAChB,iBAAiB,GAClB,MAAM,8BAA8B,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/runtime-v2/config/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,YAAY,EACV,eAAe,EACf,eAAe,EACf,gBAAgB,EAChB,kBAAkB,EAClB,sBAAsB,EACtB,qBAAqB,EACrB,cAAc,EACd,iBAAiB,EACjB,oBAAoB,EACpB,oBAAoB,EACpB,eAAe,EACf,QAAQ,EACR,QAAQ,EACR,uBAAuB,EACvB,0BAA0B,EAC1B,2BAA2B,EAC3B,wBAAwB,EACxB,iBAAiB,EACjB,6BAA6B,EAC7B,oBAAoB,EACpB,sBAAsB,EACtB,uBAAuB,GACxB,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EACL,iBAAiB,EACjB,wBAAwB,EACxB,mBAAmB,EACnB,oBAAoB,EACpB,uBAAuB,EACvB,cAAc,GACf,MAAM,sBAAsB,CAAC;AAG9B,OAAO,EACL,gBAAgB,GACjB,MAAM,yBAAyB,CAAC;AAGjC,OAAO,EACL,qBAAqB,EACrB,0BAA0B,EAC1B,uBAAuB,EACvB,UAAU,EACV,wBAAwB,EACxB,kBAAkB,GACnB,MAAM,yBAAyB,CAAC;AAGjC,OAAO,EACL,wBAAwB,GACzB,MAAM,0BAA0B,CAAC;AAGlC,OAAO,EACL,cAAc,EACd,iBAAiB,GAClB,MAAM,0BAA0B,CAAC;AAGlC,YAAY,EACV,oBAAoB,EACpB,kBAAkB,GACnB,MAAM,8BAA8B,CAAC;AAEtC,OAAO,EACL,eAAe,EACf,6BAA6B,EAC7B,gBAAgB,EAChB,iBAAiB,GAClB,MAAM,8BAA8B,CAAC;AAGtC,YAAY,EACV,qBAAqB,EACrB,sBAAsB,EACtB,yBAAyB,EACzB,2BAA2B,EAC3B,uBAAuB,EACvB,2BAA2B,EAC3B,mBAAmB,GACpB,MAAM,8BAA8B,CAAC;AAEtC,OAAO,EACL,0BAA0B,EAC1B,0BAA0B,EAC1B,8BAA8B,GAC/B,MAAM,8BAA8B,CAAC"}
@@ -13,4 +13,5 @@ export { computeEffectivePdConfig, } from './pd-config-effective.js';
13
13
  // Redaction
14
14
  export { redactPdConfig, redactConfigValue, } from './pd-config-redaction.js';
15
15
  export { MVP_CHANNEL_IDS, computeFeatureFlagsFromConfig, isFeatureEnabled, getEnabledFlagIds, } from './pd-config-feature-flags.js';
16
+ export { resolveAgentRuntimeBinding, checkAgentRuntimeReadiness, createAdapterConfigFromProfile, } from './pd-config-agent-binding.js';
16
17
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/runtime-v2/config/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AA4BH,OAAO,EACL,iBAAiB,EACjB,wBAAwB,EACxB,mBAAmB,EACnB,oBAAoB,EACpB,uBAAuB,EACvB,cAAc,GACf,MAAM,sBAAsB,CAAC;AAE9B,aAAa;AACb,OAAO,EACL,gBAAgB,GACjB,MAAM,yBAAyB,CAAC;AAEjC,WAAW;AACX,OAAO,EACL,qBAAqB,EACrB,0BAA0B,EAC1B,uBAAuB,EACvB,UAAU,EACV,wBAAwB,EACxB,kBAAkB,GACnB,MAAM,yBAAyB,CAAC;AAEjC,mBAAmB;AACnB,OAAO,EACL,wBAAwB,GACzB,MAAM,0BAA0B,CAAC;AAElC,YAAY;AACZ,OAAO,EACL,cAAc,EACd,iBAAiB,GAClB,MAAM,0BAA0B,CAAC;AAQlC,OAAO,EACL,eAAe,EACf,6BAA6B,EAC7B,gBAAgB,EAChB,iBAAiB,GAClB,MAAM,8BAA8B,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/runtime-v2/config/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AA4BH,OAAO,EACL,iBAAiB,EACjB,wBAAwB,EACxB,mBAAmB,EACnB,oBAAoB,EACpB,uBAAuB,EACvB,cAAc,GACf,MAAM,sBAAsB,CAAC;AAE9B,aAAa;AACb,OAAO,EACL,gBAAgB,GACjB,MAAM,yBAAyB,CAAC;AAEjC,WAAW;AACX,OAAO,EACL,qBAAqB,EACrB,0BAA0B,EAC1B,uBAAuB,EACvB,UAAU,EACV,wBAAwB,EACxB,kBAAkB,GACnB,MAAM,yBAAyB,CAAC;AAEjC,mBAAmB;AACnB,OAAO,EACL,wBAAwB,GACzB,MAAM,0BAA0B,CAAC;AAElC,YAAY;AACZ,OAAO,EACL,cAAc,EACd,iBAAiB,GAClB,MAAM,0BAA0B,CAAC;AAQlC,OAAO,EACL,eAAe,EACf,6BAA6B,EAC7B,gBAAgB,EAChB,iBAAiB,GAClB,MAAM,8BAA8B,CAAC;AAatC,OAAO,EACL,0BAA0B,EAC1B,0BAA0B,EAC1B,8BAA8B,GAC/B,MAAM,8BAA8B,CAAC"}
@@ -0,0 +1,93 @@
1
+ /**
2
+ * Agent Runtime Binding Resolution — PRI-306
3
+ *
4
+ * Pure functions that resolve which RuntimeProfile an internal agent uses,
5
+ * check readiness, and produce adapter configuration.
6
+ *
7
+ * No I/O — env var access is injected via getEnvVar callback.
8
+ * No `as` casts on untrusted data (ERR-001).
9
+ * Missing fields fail loud with reason + nextAction (ERR-002, ERR-009).
10
+ * Uses Object.hasOwn() for key checks (ERR-013).
11
+ */
12
+ import type { EffectivePdConfig, InternalAgentName, RuntimeProfile } from './pd-config-types.js';
13
+ export interface AgentRuntimeBindingOk {
14
+ ok: true;
15
+ /** The resolved runtime profile */
16
+ profile: RuntimeProfile;
17
+ /** The profile ID in the runtimeProfiles map */
18
+ profileId: string;
19
+ /** How this binding was resolved: 'agent_override' = per-agent override, 'default_runtime' = fallback to defaultRuntime */
20
+ source: 'agent_override' | 'default_runtime';
21
+ }
22
+ export interface AgentRuntimeBindingErr {
23
+ ok: false;
24
+ /** Readiness status */
25
+ readiness: 'needs_setup' | 'not_ready' | 'disabled';
26
+ /** Human-readable reason */
27
+ reason: string;
28
+ /** Actionable next step */
29
+ nextAction: string;
30
+ }
31
+ export type AgentRuntimeBindingResult = AgentRuntimeBindingOk | AgentRuntimeBindingErr;
32
+ export interface AgentRuntimeReadinessResult {
33
+ readiness: 'ready' | 'not_ready' | 'needs_setup';
34
+ reason?: string;
35
+ nextAction?: string;
36
+ }
37
+ export interface PiAiAdapterConfigResult {
38
+ runtimeKind: 'pi-ai';
39
+ provider: string;
40
+ model: string;
41
+ apiKeyEnv: string;
42
+ baseUrl?: string;
43
+ timeoutMs?: number;
44
+ workspace: string;
45
+ }
46
+ export interface OpenClawAdapterConfigResult {
47
+ runtimeKind: 'openclaw-cli';
48
+ workspaceDir: string;
49
+ /** 'default' = delegate to OpenClaw's own mode resolution (CLI flags, workflows.yaml).
50
+ * 'local' | 'gateway' = explicit mode from profile config. */
51
+ openclawMode: 'local' | 'gateway' | 'default';
52
+ }
53
+ export type AdapterConfigResult = PiAiAdapterConfigResult | OpenClawAdapterConfigResult;
54
+ /**
55
+ * Resolve which RuntimeProfile an internal agent should use.
56
+ *
57
+ * Resolution order:
58
+ * 1. Per-agent override (agent.runtimeProfile) → source: 'agent_override'
59
+ * 2. defaultRuntime → source: 'default_runtime'
60
+ *
61
+ * If the resolved profile ID doesn't exist in runtimeProfiles, returns an error.
62
+ * If the agent is disabled, returns a disabled result.
63
+ */
64
+ export declare function resolveAgentRuntimeBinding(effective: EffectivePdConfig, agentName: InternalAgentName): AgentRuntimeBindingResult;
65
+ /**
66
+ * Check whether a RuntimeProfile is ready for use.
67
+ *
68
+ * For openclaw profiles:
69
+ * - source=default → ready (delegated to OpenClaw)
70
+ * - provider+model set → ready
71
+ * - otherwise → needs_setup
72
+ *
73
+ * For pi-ai profiles:
74
+ * - provider, model, apiKeyEnv all set AND apiKeyEnv exists in env → ready
75
+ * - apiKeyEnv missing from env → not_ready (config is correct but env is not set up)
76
+ * - provider or model missing → needs_setup (config is incomplete)
77
+ *
78
+ * The getEnvVar callback is injected to avoid process.env access in core.
79
+ */
80
+ export declare function checkAgentRuntimeReadiness(profile: RuntimeProfile, getEnvVar: (name: string) => string | undefined): AgentRuntimeReadinessResult;
81
+ /**
82
+ * Transform a RuntimeProfile into adapter configuration.
83
+ *
84
+ * For pi-ai profiles: produces PiAiAdapterConfigResult with all fields needed
85
+ * to construct a PiAiRuntimeAdapter.
86
+ *
87
+ * For openclaw profiles: produces OpenClawAdapterConfigResult.
88
+ * OpenClaw profiles do NOT copy secrets — they only reference provider/model.
89
+ *
90
+ * This is a pure data transform. No I/O, no env access.
91
+ */
92
+ export declare function createAdapterConfigFromProfile(profile: RuntimeProfile, workspaceDir: string): AdapterConfigResult;
93
+ //# sourceMappingURL=pd-config-agent-binding.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pd-config-agent-binding.d.ts","sourceRoot":"","sources":["../../../src/runtime-v2/config/pd-config-agent-binding.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EACV,iBAAiB,EACjB,iBAAiB,EACjB,cAAc,EAGf,MAAM,sBAAsB,CAAC;AAI9B,MAAM,WAAW,qBAAqB;IACpC,EAAE,EAAE,IAAI,CAAC;IACT,mCAAmC;IACnC,OAAO,EAAE,cAAc,CAAC;IACxB,gDAAgD;IAChD,SAAS,EAAE,MAAM,CAAC;IAClB,2HAA2H;IAC3H,MAAM,EAAE,gBAAgB,GAAG,iBAAiB,CAAC;CAC9C;AAED,MAAM,WAAW,sBAAsB;IACrC,EAAE,EAAE,KAAK,CAAC;IACV,uBAAuB;IACvB,SAAS,EAAE,aAAa,GAAG,WAAW,GAAG,UAAU,CAAC;IACpD,4BAA4B;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,2BAA2B;IAC3B,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,MAAM,yBAAyB,GAAG,qBAAqB,GAAG,sBAAsB,CAAC;AAIvF,MAAM,WAAW,2BAA2B;IAC1C,SAAS,EAAE,OAAO,GAAG,WAAW,GAAG,aAAa,CAAC;IACjD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAID,MAAM,WAAW,uBAAuB;IACtC,WAAW,EAAE,OAAO,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,2BAA2B;IAC1C,WAAW,EAAE,cAAc,CAAC;IAC5B,YAAY,EAAE,MAAM,CAAC;IACrB;mEAC+D;IAC/D,YAAY,EAAE,OAAO,GAAG,SAAS,GAAG,SAAS,CAAC;CAC/C;AAED,MAAM,MAAM,mBAAmB,GAAG,uBAAuB,GAAG,2BAA2B,CAAC;AA0ExF;;;;;;;;;GASG;AACH,wBAAgB,0BAA0B,CACxC,SAAS,EAAE,iBAAiB,EAC5B,SAAS,EAAE,iBAAiB,GAC3B,yBAAyB,CAgD3B;AAID;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,0BAA0B,CACxC,OAAO,EAAE,cAAc,EACvB,SAAS,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS,GAC9C,2BAA2B,CAK7B;AAID;;;;;;;;;;GAUG;AACH,wBAAgB,8BAA8B,CAC5C,OAAO,EAAE,cAAc,EACvB,YAAY,EAAE,MAAM,GACnB,mBAAmB,CA4BrB"}