instar 1.3.235 → 1.3.237
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/commands/server.d.ts.map +1 -1
- package/dist/commands/server.js +41 -0
- package/dist/commands/server.js.map +1 -1
- package/dist/core/CircuitBreakingIntelligenceProvider.d.ts +1 -1
- package/dist/core/CircuitBreakingIntelligenceProvider.d.ts.map +1 -1
- package/dist/core/CircuitBreakingIntelligenceProvider.js +5 -2
- package/dist/core/CircuitBreakingIntelligenceProvider.js.map +1 -1
- package/dist/core/IntelligenceRouter.d.ts +82 -0
- package/dist/core/IntelligenceRouter.d.ts.map +1 -0
- package/dist/core/IntelligenceRouter.js +108 -0
- package/dist/core/IntelligenceRouter.js.map +1 -0
- package/dist/core/ParallelActivityIndex.d.ts +62 -0
- package/dist/core/ParallelActivityIndex.d.ts.map +1 -0
- package/dist/core/ParallelActivityIndex.js +129 -0
- package/dist/core/ParallelActivityIndex.js.map +1 -0
- package/dist/core/PostUpdateMigrator.d.ts.map +1 -1
- package/dist/core/PostUpdateMigrator.js +34 -0
- package/dist/core/PostUpdateMigrator.js.map +1 -1
- package/dist/core/componentCategories.d.ts +37 -0
- package/dist/core/componentCategories.d.ts.map +1 -0
- package/dist/core/componentCategories.js +84 -0
- package/dist/core/componentCategories.js.map +1 -0
- package/dist/core/intelligenceProviderFactory.d.ts +8 -0
- package/dist/core/intelligenceProviderFactory.d.ts.map +1 -1
- package/dist/core/intelligenceProviderFactory.js +3 -3
- package/dist/core/intelligenceProviderFactory.js.map +1 -1
- package/dist/core/types.d.ts +26 -0
- package/dist/core/types.d.ts.map +1 -1
- package/dist/core/types.js.map +1 -1
- package/dist/monitoring/GeminiLoopDriver.d.ts +112 -0
- package/dist/monitoring/GeminiLoopDriver.d.ts.map +1 -0
- package/dist/monitoring/GeminiLoopDriver.js +111 -0
- package/dist/monitoring/GeminiLoopDriver.js.map +1 -0
- package/dist/monitoring/ParallelWorkOverlap.d.ts +59 -0
- package/dist/monitoring/ParallelWorkOverlap.d.ts.map +1 -0
- package/dist/monitoring/ParallelWorkOverlap.js +86 -0
- package/dist/monitoring/ParallelWorkOverlap.js.map +1 -0
- package/dist/monitoring/ParallelWorkSentinel.d.ts +59 -0
- package/dist/monitoring/ParallelWorkSentinel.d.ts.map +1 -0
- package/dist/monitoring/ParallelWorkSentinel.js +79 -0
- package/dist/monitoring/ParallelWorkSentinel.js.map +1 -0
- package/dist/providers/adapters/gemini-cli/transport/geminiSpawn.d.ts +14 -0
- package/dist/providers/adapters/gemini-cli/transport/geminiSpawn.d.ts.map +1 -1
- package/dist/providers/adapters/gemini-cli/transport/geminiSpawn.js +16 -0
- package/dist/providers/adapters/gemini-cli/transport/geminiSpawn.js.map +1 -1
- package/dist/scaffold/templates.d.ts.map +1 -1
- package/dist/scaffold/templates.js +10 -0
- package/dist/scaffold/templates.js.map +1 -1
- package/dist/server/AgentServer.d.ts +1 -0
- package/dist/server/AgentServer.d.ts.map +1 -1
- package/dist/server/AgentServer.js +33 -0
- package/dist/server/AgentServer.js.map +1 -1
- package/dist/server/CapabilityIndex.d.ts.map +1 -1
- package/dist/server/CapabilityIndex.js +10 -0
- package/dist/server/CapabilityIndex.js.map +1 -1
- package/dist/server/routes.d.ts +4 -0
- package/dist/server/routes.d.ts.map +1 -1
- package/dist/server/routes.js +44 -0
- package/dist/server/routes.js.map +1 -1
- package/package.json +1 -1
- package/src/data/builtin-manifest.json +64 -64
- package/src/scaffold/templates.ts +10 -0
- package/upgrades/1.3.236.md +53 -0
- package/upgrades/1.3.237.md +82 -0
- package/upgrades/side-effects/gemini-multi-turn-loop-driver.md +56 -0
- package/upgrades/side-effects/parallel-activity-coherence.md +85 -0
- package/upgrades/side-effects/per-component-framework-routing.md +88 -0
|
@@ -74,5 +74,5 @@ export declare class CircuitBreakingIntelligenceProvider implements Intelligence
|
|
|
74
74
|
* can pass a possibly-null factory result through unchanged) and is idempotent
|
|
75
75
|
* (never double-wraps).
|
|
76
76
|
*/
|
|
77
|
-
export declare function wrapIntelligenceWithCircuitBreaker(provider: IntelligenceProvider | null | undefined): IntelligenceProvider | null;
|
|
77
|
+
export declare function wrapIntelligenceWithCircuitBreaker(provider: IntelligenceProvider | null | undefined, breaker?: LlmCircuitBreaker): IntelligenceProvider | null;
|
|
78
78
|
//# sourceMappingURL=CircuitBreakingIntelligenceProvider.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CircuitBreakingIntelligenceProvider.d.ts","sourceRoot":"","sources":["../../src/core/CircuitBreakingIntelligenceProvider.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAEH,OAAO,KAAK,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAC5E,OAAO,EACL,iBAAiB,EAKlB,MAAM,wBAAwB,CAAC;AAEhC;;;;;GAKG;AACH,MAAM,WAAW,sBAAsB;IACrC,MAAM,CAAC,KAAK,EAAE;QACZ,OAAO,EAAE,MAAM,CAAC;QAChB,IAAI,CAAC,EAAE,KAAK,GAAG,OAAO,CAAC;QACvB,OAAO,EAAE,OAAO,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,CAAC;QAC7C,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,MAAM,CAAC,EAAE,OAAO,CAAC;QACjB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB;;;;;WAKG;QACH,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,SAAS,CAAC,EAAE,MAAM,CAAC;KACpB,GAAG,IAAI,CAAC;CACV;AAOD,wBAAgB,yBAAyB,CAAC,QAAQ,EAAE,sBAAsB,GAAG,IAAI,GAAG,IAAI,CAEvF;AACD,wBAAgB,yBAAyB,IAAI,sBAAsB,GAAG,IAAI,CAEzE;AAED,qBAAa,mCAAoC,YAAW,oBAAoB;IAE5E,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,OAAO;gBADP,KAAK,EAAE,oBAAoB,EAC3B,OAAO,GAAE,iBAA0C;IAGtE;;;;;;;;;;OAUG;IACH,OAAO,CAAC,YAAY;IAsBd,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,mBAAmB,GAAG,OAAO,CAAC,MAAM,CAAC;CA+D/E;AAED;;;;GAIG;AACH,wBAAgB,kCAAkC,CAChD,QAAQ,EAAE,oBAAoB,GAAG,IAAI,GAAG,SAAS,
|
|
1
|
+
{"version":3,"file":"CircuitBreakingIntelligenceProvider.d.ts","sourceRoot":"","sources":["../../src/core/CircuitBreakingIntelligenceProvider.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAEH,OAAO,KAAK,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAC5E,OAAO,EACL,iBAAiB,EAKlB,MAAM,wBAAwB,CAAC;AAEhC;;;;;GAKG;AACH,MAAM,WAAW,sBAAsB;IACrC,MAAM,CAAC,KAAK,EAAE;QACZ,OAAO,EAAE,MAAM,CAAC;QAChB,IAAI,CAAC,EAAE,KAAK,GAAG,OAAO,CAAC;QACvB,OAAO,EAAE,OAAO,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,CAAC;QAC7C,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,MAAM,CAAC,EAAE,OAAO,CAAC;QACjB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB;;;;;WAKG;QACH,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,SAAS,CAAC,EAAE,MAAM,CAAC;KACpB,GAAG,IAAI,CAAC;CACV;AAOD,wBAAgB,yBAAyB,CAAC,QAAQ,EAAE,sBAAsB,GAAG,IAAI,GAAG,IAAI,CAEvF;AACD,wBAAgB,yBAAyB,IAAI,sBAAsB,GAAG,IAAI,CAEzE;AAED,qBAAa,mCAAoC,YAAW,oBAAoB;IAE5E,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,OAAO;gBADP,KAAK,EAAE,oBAAoB,EAC3B,OAAO,GAAE,iBAA0C;IAGtE;;;;;;;;;;OAUG;IACH,OAAO,CAAC,YAAY;IAsBd,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,mBAAmB,GAAG,OAAO,CAAC,MAAM,CAAC;CA+D/E;AAED;;;;GAIG;AACH,wBAAgB,kCAAkC,CAChD,QAAQ,EAAE,oBAAoB,GAAG,IAAI,GAAG,SAAS,EACjD,OAAO,CAAC,EAAE,iBAAiB,GAC1B,oBAAoB,GAAG,IAAI,CAO7B"}
|
|
@@ -135,11 +135,14 @@ export class CircuitBreakingIntelligenceProvider {
|
|
|
135
135
|
* can pass a possibly-null factory result through unchanged) and is idempotent
|
|
136
136
|
* (never double-wraps).
|
|
137
137
|
*/
|
|
138
|
-
export function wrapIntelligenceWithCircuitBreaker(provider) {
|
|
138
|
+
export function wrapIntelligenceWithCircuitBreaker(provider, breaker) {
|
|
139
139
|
if (!provider)
|
|
140
140
|
return null;
|
|
141
141
|
if (provider instanceof CircuitBreakingIntelligenceProvider)
|
|
142
142
|
return provider;
|
|
143
|
-
|
|
143
|
+
// breaker===undefined ⇒ the constructor default (the account-global singleton)
|
|
144
|
+
// applies, preserving today's behavior. A caller (the IntelligenceRouter) passes
|
|
145
|
+
// a DISTINCT breaker per framework so one framework's trip can't pause another.
|
|
146
|
+
return new CircuitBreakingIntelligenceProvider(provider, breaker);
|
|
144
147
|
}
|
|
145
148
|
//# sourceMappingURL=CircuitBreakingIntelligenceProvider.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CircuitBreakingIntelligenceProvider.js","sourceRoot":"","sources":["../../src/core/CircuitBreakingIntelligenceProvider.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"CircuitBreakingIntelligenceProvider.js","sourceRoot":"","sources":["../../src/core/CircuitBreakingIntelligenceProvider.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* IntelligenceRouter — routes each LLM call to a framework-specific provider
|
|
3
|
+
* based on the calling component's category/name, so different Instar components
|
|
4
|
+
* can run on different agentic frameworks (e.g. sentinels on Codex while the
|
|
5
|
+
* agent's conversation stays on Claude). Implements docs/specs/
|
|
6
|
+
* per-component-framework-routing.md (B1).
|
|
7
|
+
*
|
|
8
|
+
* KEY DESIGN (corrected by convergence):
|
|
9
|
+
* - Routing is resolved at CALL TIME, at the single funnel every `.evaluate()`
|
|
10
|
+
* already passes through — NOT at construction. The component name only
|
|
11
|
+
* exists at call time (`attribution.component`), and ~half the LLM callers
|
|
12
|
+
* never receive a constructor-injected provider, so construction-time routing
|
|
13
|
+
* is unworkable. The router IS the injected provider; it dispatches per call.
|
|
14
|
+
* - Config is read LIVE on each call, so a `componentFrameworks` change takes
|
|
15
|
+
* effect on the next call with no restart (no session-start staleness trap).
|
|
16
|
+
* - Each non-default framework gets its OWN circuit breaker (built by the
|
|
17
|
+
* injected `buildProvider`), so a Claude rate-limit trip does NOT pause Codex.
|
|
18
|
+
* The default framework keeps using the existing shared (global-breaker)
|
|
19
|
+
* provider, so unconfigured behavior is byte-identical to today.
|
|
20
|
+
* - Fallback is circuit-aware: a framework whose binary is MISSING degrades to
|
|
21
|
+
* the default framework (config/install problem, low volume) and reports it; a
|
|
22
|
+
* framework that is merely RATE-LIMITED surfaces LlmCircuitOpenError, which
|
|
23
|
+
* callers already swallow into their heuristic — so we never herd a Codex
|
|
24
|
+
* outage's worth of calls onto Claude all at once.
|
|
25
|
+
*/
|
|
26
|
+
import type { IntelligenceProvider, IntelligenceOptions } from './types.js';
|
|
27
|
+
import type { IntelligenceFramework } from './intelligenceProviderFactory.js';
|
|
28
|
+
import { type ComponentCategory } from './componentCategories.js';
|
|
29
|
+
export interface ComponentFrameworksConfig {
|
|
30
|
+
/** Framework for anything not otherwise specified. Defaults to the router's defaultFramework. */
|
|
31
|
+
default?: IntelligenceFramework;
|
|
32
|
+
/** Per-category framework, e.g. { sentinel: 'codex-cli' }. */
|
|
33
|
+
categories?: Partial<Record<ComponentCategory, IntelligenceFramework>>;
|
|
34
|
+
/** Per-component-name override, highest precedence. */
|
|
35
|
+
overrides?: Record<string, IntelligenceFramework>;
|
|
36
|
+
/** When a routed framework's provider is unavailable (binary missing): 'default' degrades, 'none' errors. */
|
|
37
|
+
fallback?: 'default' | 'none';
|
|
38
|
+
}
|
|
39
|
+
export interface RouterDegradeInfo {
|
|
40
|
+
component: string;
|
|
41
|
+
category: ComponentCategory;
|
|
42
|
+
from: IntelligenceFramework;
|
|
43
|
+
to: IntelligenceFramework;
|
|
44
|
+
reason: string;
|
|
45
|
+
}
|
|
46
|
+
export interface IntelligenceRouterOptions {
|
|
47
|
+
/** The existing shared provider for the default framework (global breaker). Used unconfigured + for default-routed calls. */
|
|
48
|
+
defaultProvider: IntelligenceProvider;
|
|
49
|
+
/** Which framework defaultProvider speaks. */
|
|
50
|
+
defaultFramework: IntelligenceFramework;
|
|
51
|
+
/** Live config getter — read on EVERY call so changes are hot. Returns undefined ⇒ routing disabled (all default). */
|
|
52
|
+
resolveConfig: () => ComponentFrameworksConfig | undefined;
|
|
53
|
+
/**
|
|
54
|
+
* Build a provider for a non-default framework, with its OWN circuit breaker.
|
|
55
|
+
* Returns null when that framework's binary isn't available. Called at most
|
|
56
|
+
* once per framework (result cached). MUST NOT throw (catch internally).
|
|
57
|
+
*/
|
|
58
|
+
buildProvider: (framework: IntelligenceFramework) => IntelligenceProvider | null;
|
|
59
|
+
/** Optional: invoked when a routed call degrades to the default framework (for DegradationReporter). */
|
|
60
|
+
onDegrade?: (info: RouterDegradeInfo) => void;
|
|
61
|
+
}
|
|
62
|
+
export declare class IntelligenceRouter implements IntelligenceProvider {
|
|
63
|
+
private readonly opts;
|
|
64
|
+
private readonly cache;
|
|
65
|
+
constructor(opts: IntelligenceRouterOptions);
|
|
66
|
+
/** Resolve the framework for a component+category against a config (pure). */
|
|
67
|
+
resolveFramework(component: string | undefined, category: ComponentCategory, cfg: ComponentFrameworksConfig | undefined): IntelligenceFramework;
|
|
68
|
+
/**
|
|
69
|
+
* Diagnostic resolver for the GET /intelligence/routing surface: what framework
|
|
70
|
+
* a component WOULD route to right now, and whether that framework is available.
|
|
71
|
+
*/
|
|
72
|
+
for(component: string, categoryOverride?: ComponentCategory): {
|
|
73
|
+
component: string;
|
|
74
|
+
category: ComponentCategory;
|
|
75
|
+
framework: IntelligenceFramework;
|
|
76
|
+
available: boolean;
|
|
77
|
+
};
|
|
78
|
+
/** Get-or-build the provider for a framework (cached). Default framework → shared provider. */
|
|
79
|
+
private providerFor;
|
|
80
|
+
evaluate(prompt: string, options?: IntelligenceOptions): Promise<string>;
|
|
81
|
+
}
|
|
82
|
+
//# sourceMappingURL=IntelligenceRouter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"IntelligenceRouter.d.ts","sourceRoot":"","sources":["../../src/core/IntelligenceRouter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAEH,OAAO,KAAK,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAC5E,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,kCAAkC,CAAC;AAC9E,OAAO,EACL,KAAK,iBAAiB,EAGvB,MAAM,0BAA0B,CAAC;AAElC,MAAM,WAAW,yBAAyB;IACxC,iGAAiG;IACjG,OAAO,CAAC,EAAE,qBAAqB,CAAC;IAChC,8DAA8D;IAC9D,UAAU,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,iBAAiB,EAAE,qBAAqB,CAAC,CAAC,CAAC;IACvE,uDAAuD;IACvD,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,qBAAqB,CAAC,CAAC;IAClD,6GAA6G;IAC7G,QAAQ,CAAC,EAAE,SAAS,GAAG,MAAM,CAAC;CAC/B;AAED,MAAM,WAAW,iBAAiB;IAChC,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,iBAAiB,CAAC;IAC5B,IAAI,EAAE,qBAAqB,CAAC;IAC5B,EAAE,EAAE,qBAAqB,CAAC;IAC1B,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,yBAAyB;IACxC,6HAA6H;IAC7H,eAAe,EAAE,oBAAoB,CAAC;IACtC,8CAA8C;IAC9C,gBAAgB,EAAE,qBAAqB,CAAC;IACxC,sHAAsH;IACtH,aAAa,EAAE,MAAM,yBAAyB,GAAG,SAAS,CAAC;IAC3D;;;;OAIG;IACH,aAAa,EAAE,CAAC,SAAS,EAAE,qBAAqB,KAAK,oBAAoB,GAAG,IAAI,CAAC;IACjF,wGAAwG;IACxG,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE,iBAAiB,KAAK,IAAI,CAAC;CAC/C;AAMD,qBAAa,kBAAmB,YAAW,oBAAoB;IAGjD,OAAO,CAAC,QAAQ,CAAC,IAAI;IAFjC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAqD;gBAE9C,IAAI,EAAE,yBAAyB;IAE5D,8EAA8E;IAC9E,gBAAgB,CACd,SAAS,EAAE,MAAM,GAAG,SAAS,EAC7B,QAAQ,EAAE,iBAAiB,EAC3B,GAAG,EAAE,yBAAyB,GAAG,SAAS,GACzC,qBAAqB;IAQxB;;;OAGG;IACH,GAAG,CAAC,SAAS,EAAE,MAAM,EAAE,gBAAgB,CAAC,EAAE,iBAAiB,GAAG;QAC5D,SAAS,EAAE,MAAM,CAAC;QAClB,QAAQ,EAAE,iBAAiB,CAAC;QAC5B,SAAS,EAAE,qBAAqB,CAAC;QACjC,SAAS,EAAE,OAAO,CAAC;KACpB;IAQD,+FAA+F;IAC/F,OAAO,CAAC,WAAW;IAcb,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,mBAAmB,GAAG,OAAO,CAAC,MAAM,CAAC;CAwC/E"}
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* IntelligenceRouter — routes each LLM call to a framework-specific provider
|
|
3
|
+
* based on the calling component's category/name, so different Instar components
|
|
4
|
+
* can run on different agentic frameworks (e.g. sentinels on Codex while the
|
|
5
|
+
* agent's conversation stays on Claude). Implements docs/specs/
|
|
6
|
+
* per-component-framework-routing.md (B1).
|
|
7
|
+
*
|
|
8
|
+
* KEY DESIGN (corrected by convergence):
|
|
9
|
+
* - Routing is resolved at CALL TIME, at the single funnel every `.evaluate()`
|
|
10
|
+
* already passes through — NOT at construction. The component name only
|
|
11
|
+
* exists at call time (`attribution.component`), and ~half the LLM callers
|
|
12
|
+
* never receive a constructor-injected provider, so construction-time routing
|
|
13
|
+
* is unworkable. The router IS the injected provider; it dispatches per call.
|
|
14
|
+
* - Config is read LIVE on each call, so a `componentFrameworks` change takes
|
|
15
|
+
* effect on the next call with no restart (no session-start staleness trap).
|
|
16
|
+
* - Each non-default framework gets its OWN circuit breaker (built by the
|
|
17
|
+
* injected `buildProvider`), so a Claude rate-limit trip does NOT pause Codex.
|
|
18
|
+
* The default framework keeps using the existing shared (global-breaker)
|
|
19
|
+
* provider, so unconfigured behavior is byte-identical to today.
|
|
20
|
+
* - Fallback is circuit-aware: a framework whose binary is MISSING degrades to
|
|
21
|
+
* the default framework (config/install problem, low volume) and reports it; a
|
|
22
|
+
* framework that is merely RATE-LIMITED surfaces LlmCircuitOpenError, which
|
|
23
|
+
* callers already swallow into their heuristic — so we never herd a Codex
|
|
24
|
+
* outage's worth of calls onto Claude all at once.
|
|
25
|
+
*/
|
|
26
|
+
import { isComponentCategory, categoryForComponent, } from './componentCategories.js';
|
|
27
|
+
export class IntelligenceRouter {
|
|
28
|
+
opts;
|
|
29
|
+
cache = new Map();
|
|
30
|
+
constructor(opts) {
|
|
31
|
+
this.opts = opts;
|
|
32
|
+
}
|
|
33
|
+
/** Resolve the framework for a component+category against a config (pure). */
|
|
34
|
+
resolveFramework(component, category, cfg) {
|
|
35
|
+
if (!cfg)
|
|
36
|
+
return this.opts.defaultFramework;
|
|
37
|
+
if (component && cfg.overrides && cfg.overrides[component])
|
|
38
|
+
return cfg.overrides[component];
|
|
39
|
+
const byCat = cfg.categories?.[category];
|
|
40
|
+
if (byCat)
|
|
41
|
+
return byCat;
|
|
42
|
+
return cfg.default ?? this.opts.defaultFramework;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Diagnostic resolver for the GET /intelligence/routing surface: what framework
|
|
46
|
+
* a component WOULD route to right now, and whether that framework is available.
|
|
47
|
+
*/
|
|
48
|
+
for(component, categoryOverride) {
|
|
49
|
+
const category = categoryOverride ?? categoryForComponent(component);
|
|
50
|
+
const cfg = this.opts.resolveConfig();
|
|
51
|
+
const framework = this.resolveFramework(component, category, cfg);
|
|
52
|
+
const available = framework === this.opts.defaultFramework ? true : this.providerFor(framework) !== null;
|
|
53
|
+
return { component, category, framework, available };
|
|
54
|
+
}
|
|
55
|
+
/** Get-or-build the provider for a framework (cached). Default framework → shared provider. */
|
|
56
|
+
providerFor(framework) {
|
|
57
|
+
if (framework === this.opts.defaultFramework)
|
|
58
|
+
return this.opts.defaultProvider;
|
|
59
|
+
const cached = this.cache.get(framework);
|
|
60
|
+
if (cached)
|
|
61
|
+
return cached.provider;
|
|
62
|
+
let provider = null;
|
|
63
|
+
try {
|
|
64
|
+
provider = this.opts.buildProvider(framework);
|
|
65
|
+
}
|
|
66
|
+
catch {
|
|
67
|
+
provider = null; // never throw into the call path on a build failure
|
|
68
|
+
}
|
|
69
|
+
this.cache.set(framework, { provider });
|
|
70
|
+
return provider;
|
|
71
|
+
}
|
|
72
|
+
async evaluate(prompt, options) {
|
|
73
|
+
const component = options?.attribution?.component;
|
|
74
|
+
const explicitCategory = options?.attribution?.category;
|
|
75
|
+
const category = isComponentCategory(explicitCategory)
|
|
76
|
+
? explicitCategory
|
|
77
|
+
: categoryForComponent(component);
|
|
78
|
+
const cfg = this.opts.resolveConfig();
|
|
79
|
+
// Unconfigured ⇒ exactly today's behavior.
|
|
80
|
+
if (!cfg)
|
|
81
|
+
return this.opts.defaultProvider.evaluate(prompt, options);
|
|
82
|
+
const framework = this.resolveFramework(component, category, cfg);
|
|
83
|
+
if (framework === this.opts.defaultFramework) {
|
|
84
|
+
return this.opts.defaultProvider.evaluate(prompt, options);
|
|
85
|
+
}
|
|
86
|
+
const provider = this.providerFor(framework);
|
|
87
|
+
if (provider) {
|
|
88
|
+
// Per-framework breaker handles rate-limit isolation. If that breaker is
|
|
89
|
+
// open, LlmCircuitOpenError propagates and the caller swallows it into its
|
|
90
|
+
// heuristic — we deliberately do NOT herd onto the default framework here.
|
|
91
|
+
return provider.evaluate(prompt, options);
|
|
92
|
+
}
|
|
93
|
+
// Provider unavailable (binary missing / not built).
|
|
94
|
+
if ((cfg.fallback ?? 'default') === 'none') {
|
|
95
|
+
throw new Error(`IntelligenceRouter: framework '${framework}' for component '${component ?? '(none)'}' ` +
|
|
96
|
+
`is unavailable and fallback is 'none'.`);
|
|
97
|
+
}
|
|
98
|
+
this.opts.onDegrade?.({
|
|
99
|
+
component: component ?? '(none)',
|
|
100
|
+
category,
|
|
101
|
+
from: framework,
|
|
102
|
+
to: this.opts.defaultFramework,
|
|
103
|
+
reason: `framework '${framework}' unavailable (binary missing / not built) — degraded to default`,
|
|
104
|
+
});
|
|
105
|
+
return this.opts.defaultProvider.evaluate(prompt, options);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
//# sourceMappingURL=IntelligenceRouter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"IntelligenceRouter.js","sourceRoot":"","sources":["../../src/core/IntelligenceRouter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ParallelActivityIndex — a thin CROSS-topic read aggregator over the EXISTING
|
|
3
|
+
* Topic-Intent Layer (docs/specs/parallel-activity-coherence.md, Phase A).
|
|
4
|
+
*
|
|
5
|
+
* It does NOT introduce a new per-topic store (convergence: that would duplicate
|
|
6
|
+
* TopicIntentStore/TopicIntentCapture/briefing/decay). It only READS the existing
|
|
7
|
+
* per-topic intent files and presents a cross-topic view — "all my topics + what
|
|
8
|
+
* each is currently working on" — which is the thing that genuinely did not exist.
|
|
9
|
+
* This view feeds the GET /parallel-work/activities surface and (Phase B) the
|
|
10
|
+
* ParallelWorkSentinel's overlap comparison. Signal-only; never gates or mutates.
|
|
11
|
+
*/
|
|
12
|
+
import { type EstablishedRef } from './TopicIntent.js';
|
|
13
|
+
/** A topic's current parallel-work snapshot, derived from its intent refs. */
|
|
14
|
+
export interface TopicActivity {
|
|
15
|
+
topicId: number;
|
|
16
|
+
/** One-line current focus: the highest-tier goal, else the latest decision, else null. */
|
|
17
|
+
focus: string | null;
|
|
18
|
+
/** High-specificity tokens (entities/files/identifiers) for cheap overlap matching. */
|
|
19
|
+
tags: string[];
|
|
20
|
+
/** Count of established refs at/above the 'tentative' tier (how "settled" the topic is). */
|
|
21
|
+
refCount: number;
|
|
22
|
+
/** Most recent reinforcement across the topic's refs (freshness; null if unknown). */
|
|
23
|
+
updatedAt: number | null;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Extract high-specificity tokens from free text: identifiers, file paths, branch-ish
|
|
27
|
+
* names, camelCase/kebab/snake words, and rare ≥4-char words — minus boilerplate. Bare
|
|
28
|
+
* generic words are dropped so two topics that merely both say "fix the test" don't match.
|
|
29
|
+
*/
|
|
30
|
+
export declare function extractTags(text: string): string[];
|
|
31
|
+
export interface ParallelActivityIndexOptions {
|
|
32
|
+
stateDir: string;
|
|
33
|
+
/** Optional: resolve a topic's one-line purpose (e.g. TopicMemory.purpose) as a focus fallback. */
|
|
34
|
+
purposeFor?: (topicId: number) => string | null | undefined;
|
|
35
|
+
/** Optional: is a session/autonomous job live on this topic right now? */
|
|
36
|
+
isRunning?: (topicId: number) => boolean;
|
|
37
|
+
/** Optional: a human nickname for the topic. */
|
|
38
|
+
nicknameFor?: (topicId: number) => string | null | undefined;
|
|
39
|
+
/**
|
|
40
|
+
* Optional refs provider seam (testability + wiring-integrity). Defaults to the
|
|
41
|
+
* real TopicIntentStore.getRefsAtOrAbove(topicId,'tentative'). Production never
|
|
42
|
+
* sets this; tests inject controlled refs without fighting projectConfidence.
|
|
43
|
+
*/
|
|
44
|
+
getRefs?: (topicId: number, nowMs: number) => EstablishedRef[];
|
|
45
|
+
}
|
|
46
|
+
export declare class ParallelActivityIndex {
|
|
47
|
+
private readonly opts;
|
|
48
|
+
private readonly store;
|
|
49
|
+
private readonly intentDir;
|
|
50
|
+
constructor(opts: ParallelActivityIndexOptions);
|
|
51
|
+
/** Enumerate every topic that has an intent file. */
|
|
52
|
+
listTopicIds(): number[];
|
|
53
|
+
/** Build the cross-topic snapshot. nowMs lets tests pin time; defaults to live. */
|
|
54
|
+
activities(nowMs?: number): Array<TopicActivity & {
|
|
55
|
+
nickname: string | null;
|
|
56
|
+
running: boolean;
|
|
57
|
+
}>;
|
|
58
|
+
private safeRefs;
|
|
59
|
+
/** Focus = most-recently-reinforced goal text, else the latest decision, else purpose, else null. */
|
|
60
|
+
private deriveFocus;
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=ParallelActivityIndex.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ParallelActivityIndex.d.ts","sourceRoot":"","sources":["../../src/core/ParallelActivityIndex.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAIH,OAAO,EAAoB,KAAK,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAEzE,8EAA8E;AAC9E,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,0FAA0F;IAC1F,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,uFAAuF;IACvF,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,4FAA4F;IAC5F,QAAQ,EAAE,MAAM,CAAC;IACjB,sFAAsF;IACtF,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B;AAYD;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAalD;AAED,MAAM,WAAW,4BAA4B;IAC3C,QAAQ,EAAE,MAAM,CAAC;IACjB,mGAAmG;IACnG,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IAC5D,0EAA0E;IAC1E,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC;IACzC,gDAAgD;IAChD,WAAW,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IAC7D;;;;OAIG;IACH,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,cAAc,EAAE,CAAC;CAChE;AAED,qBAAa,qBAAqB;IAIpB,OAAO,CAAC,QAAQ,CAAC,IAAI;IAHjC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAmB;IACzC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;gBAEN,IAAI,EAAE,4BAA4B;IAK/D,qDAAqD;IACrD,YAAY,IAAI,MAAM,EAAE;IAexB,mFAAmF;IACnF,UAAU,CAAC,KAAK,GAAE,MAAmB,GAAG,KAAK,CAAC,aAAa,GAAG;QAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,OAAO,EAAE,OAAO,CAAA;KAAE,CAAC;IAwB5G,OAAO,CAAC,QAAQ;IAShB,qGAAqG;IACrG,OAAO,CAAC,WAAW;CASpB"}
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ParallelActivityIndex — a thin CROSS-topic read aggregator over the EXISTING
|
|
3
|
+
* Topic-Intent Layer (docs/specs/parallel-activity-coherence.md, Phase A).
|
|
4
|
+
*
|
|
5
|
+
* It does NOT introduce a new per-topic store (convergence: that would duplicate
|
|
6
|
+
* TopicIntentStore/TopicIntentCapture/briefing/decay). It only READS the existing
|
|
7
|
+
* per-topic intent files and presents a cross-topic view — "all my topics + what
|
|
8
|
+
* each is currently working on" — which is the thing that genuinely did not exist.
|
|
9
|
+
* This view feeds the GET /parallel-work/activities surface and (Phase B) the
|
|
10
|
+
* ParallelWorkSentinel's overlap comparison. Signal-only; never gates or mutates.
|
|
11
|
+
*/
|
|
12
|
+
import fs from 'node:fs';
|
|
13
|
+
import path from 'node:path';
|
|
14
|
+
import { TopicIntentStore } from './TopicIntent.js';
|
|
15
|
+
/** Generic instar/domain boilerplate that must NOT count as overlap specificity. */
|
|
16
|
+
const STOPWORDS = new Set([
|
|
17
|
+
'the', 'a', 'an', 'and', 'or', 'to', 'of', 'in', 'on', 'for', 'with', 'is', 'are', 'be',
|
|
18
|
+
'this', 'that', 'it', 'we', 'i', 'you', 'will', 'should', 'add', 'use', 'using', 'make',
|
|
19
|
+
'fix', 'fixing', 'test', 'tests', 'testing', 'config', 'configure', 'pr', 'spec', 'topic',
|
|
20
|
+
'sentinel', 'hook', 'session', 'sessions', 'migration', 'migrate', 'work', 'working',
|
|
21
|
+
'build', 'building', 'change', 'changes', 'update', 'updates', 'wire', 'wiring', 'run',
|
|
22
|
+
'running', 'check', 'checks', 'new', 'task', 'feature', 'code', 'agent', 'instar',
|
|
23
|
+
]);
|
|
24
|
+
/**
|
|
25
|
+
* Extract high-specificity tokens from free text: identifiers, file paths, branch-ish
|
|
26
|
+
* names, camelCase/kebab/snake words, and rare ≥4-char words — minus boilerplate. Bare
|
|
27
|
+
* generic words are dropped so two topics that merely both say "fix the test" don't match.
|
|
28
|
+
*/
|
|
29
|
+
export function extractTags(text) {
|
|
30
|
+
const out = new Set();
|
|
31
|
+
if (!text)
|
|
32
|
+
return [];
|
|
33
|
+
// Path-ish / identifier-ish tokens (contain / . _ - or camelCase) are high-specificity.
|
|
34
|
+
const specific = text.match(/[A-Za-z0-9][A-Za-z0-9._/-]*[A-Za-z0-9]/g) ?? [];
|
|
35
|
+
for (const raw of specific) {
|
|
36
|
+
const tok = raw.toLowerCase();
|
|
37
|
+
const isCompound = /[._/-]/.test(raw) || /[a-z][A-Z]/.test(raw); // path/identifier/camelCase
|
|
38
|
+
if (isCompound && tok.length >= 3) {
|
|
39
|
+
out.add(tok);
|
|
40
|
+
continue;
|
|
41
|
+
}
|
|
42
|
+
// plain word: keep only if rare-ish (≥4 chars) and not boilerplate
|
|
43
|
+
if (tok.length >= 4 && !STOPWORDS.has(tok))
|
|
44
|
+
out.add(tok);
|
|
45
|
+
}
|
|
46
|
+
return [...out];
|
|
47
|
+
}
|
|
48
|
+
export class ParallelActivityIndex {
|
|
49
|
+
opts;
|
|
50
|
+
store;
|
|
51
|
+
intentDir;
|
|
52
|
+
constructor(opts) {
|
|
53
|
+
this.opts = opts;
|
|
54
|
+
this.store = new TopicIntentStore(opts.stateDir);
|
|
55
|
+
this.intentDir = path.join(opts.stateDir, 'topic-intent');
|
|
56
|
+
}
|
|
57
|
+
/** Enumerate every topic that has an intent file. */
|
|
58
|
+
listTopicIds() {
|
|
59
|
+
let names = [];
|
|
60
|
+
try {
|
|
61
|
+
names = fs.readdirSync(this.intentDir);
|
|
62
|
+
}
|
|
63
|
+
catch {
|
|
64
|
+
return []; // no intent dir yet ⇒ no activities
|
|
65
|
+
}
|
|
66
|
+
const ids = [];
|
|
67
|
+
for (const n of names) {
|
|
68
|
+
const m = n.match(/^(\d+)\.json$/);
|
|
69
|
+
if (m)
|
|
70
|
+
ids.push(Number(m[1]));
|
|
71
|
+
}
|
|
72
|
+
return ids.sort((a, b) => a - b);
|
|
73
|
+
}
|
|
74
|
+
/** Build the cross-topic snapshot. nowMs lets tests pin time; defaults to live. */
|
|
75
|
+
activities(nowMs = Date.now()) {
|
|
76
|
+
return this.listTopicIds().map((topicId) => {
|
|
77
|
+
const refs = this.safeRefs(topicId, nowMs);
|
|
78
|
+
const focus = this.deriveFocus(refs, topicId);
|
|
79
|
+
const updatedAt = refs.reduce((acc, r) => {
|
|
80
|
+
const ms = tsOf(r);
|
|
81
|
+
return ms !== null && (acc === null || ms > acc) ? ms : acc;
|
|
82
|
+
}, null);
|
|
83
|
+
const tagSet = new Set();
|
|
84
|
+
for (const r of refs)
|
|
85
|
+
for (const t of extractTags(r.text))
|
|
86
|
+
tagSet.add(t);
|
|
87
|
+
const purpose = this.opts.purposeFor?.(topicId);
|
|
88
|
+
if (purpose)
|
|
89
|
+
for (const t of extractTags(purpose))
|
|
90
|
+
tagSet.add(t);
|
|
91
|
+
return {
|
|
92
|
+
topicId,
|
|
93
|
+
focus,
|
|
94
|
+
tags: [...tagSet],
|
|
95
|
+
refCount: refs.length,
|
|
96
|
+
updatedAt,
|
|
97
|
+
nickname: this.opts.nicknameFor?.(topicId) ?? null,
|
|
98
|
+
running: this.opts.isRunning?.(topicId) ?? false,
|
|
99
|
+
};
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
safeRefs(topicId, nowMs) {
|
|
103
|
+
try {
|
|
104
|
+
if (this.opts.getRefs)
|
|
105
|
+
return this.opts.getRefs(topicId, nowMs);
|
|
106
|
+
return this.store.getRefsAtOrAbove(topicId, 'tentative', nowMs);
|
|
107
|
+
}
|
|
108
|
+
catch {
|
|
109
|
+
return [];
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
/** Focus = most-recently-reinforced goal text, else the latest decision, else purpose, else null. */
|
|
113
|
+
deriveFocus(refs, topicId) {
|
|
114
|
+
const latestByKind = (kind) => {
|
|
115
|
+
const matching = refs.filter((r) => r.kind === kind && r.text);
|
|
116
|
+
if (!matching.length)
|
|
117
|
+
return null;
|
|
118
|
+
const latest = matching.reduce((a, b) => ((tsOf(b) ?? 0) > (tsOf(a) ?? 0) ? b : a));
|
|
119
|
+
return latest.text;
|
|
120
|
+
};
|
|
121
|
+
return latestByKind('goal') ?? latestByKind('decision') ?? this.opts.purposeFor?.(topicId) ?? null;
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
/** Parse an EstablishedRef's ISO lastReinforcedAt to epoch ms; null if unparseable. */
|
|
125
|
+
function tsOf(ref) {
|
|
126
|
+
const ms = Date.parse(ref.lastReinforcedAt);
|
|
127
|
+
return Number.isNaN(ms) ? null : ms;
|
|
128
|
+
}
|
|
129
|
+
//# sourceMappingURL=ParallelActivityIndex.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ParallelActivityIndex.js","sourceRoot":"","sources":["../../src/core/ParallelActivityIndex.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PostUpdateMigrator.d.ts","sourceRoot":"","sources":["../../src/core/PostUpdateMigrator.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"PostUpdateMigrator.d.ts","sourceRoot":"","sources":["../../src/core/PostUpdateMigrator.ts"],"names":[],"mappings":"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"}
|
|
@@ -3059,6 +3059,40 @@ The "an unknown component is using more than a quarter of the agent's token budg
|
|
|
3059
3059
|
patched = true;
|
|
3060
3060
|
result.upgraded.push('CLAUDE.md: added Token-Burn Alerts awareness (activity-gate noise fix)');
|
|
3061
3061
|
}
|
|
3062
|
+
// Parallel-Work Awareness (2026-06-03) — Agent Awareness + Migration Parity:
|
|
3063
|
+
// existing agents must learn they can see what all their topics are working on
|
|
3064
|
+
// (the cross-topic index), the antidote to duplicating another topic's work.
|
|
3065
|
+
// Content-sniffed for idempotency.
|
|
3066
|
+
if (!content.includes('Parallel-Work Awareness')) {
|
|
3067
|
+
const pwSection = `
|
|
3068
|
+
## Parallel-Work Awareness
|
|
3069
|
+
|
|
3070
|
+
See what ALL your hands are doing across topics/sessions at once (like a king with a council). A cross-topic read index over your existing per-topic intent: every topic, its current focus, high-specificity tags, and whether a session is live on it. The antidote to self-blindness — duplicating work another of your topics already did.
|
|
3071
|
+
- Check: \`curl -H "Authorization: Bearer $AUTH" "http://localhost:4042/parallel-work/activities"\` → \`{ count, runningCount, activities: [{ topicId, focus, tags, running, updatedAt }] }\`.
|
|
3072
|
+
- Proactive: before starting substantial new work in a topic, glance here to see if another topic is already on it; when the user asks "what am I working on across topics?" / "is another session already doing this?". (The proactive overlap councilor — ParallelWorkSentinel — is Phase B, ships dark.) Read-only; never gates. Spec: \`docs/specs/parallel-activity-coherence.md\`.
|
|
3073
|
+
`;
|
|
3074
|
+
content += '\n' + pwSection;
|
|
3075
|
+
patched = true;
|
|
3076
|
+
result.upgraded.push('CLAUDE.md: added Parallel-Work Awareness');
|
|
3077
|
+
}
|
|
3078
|
+
// Per-Component Framework Routing (2026-06-03) — Agent Awareness + Migration
|
|
3079
|
+
// Parity: existing agents must learn they can route internal components
|
|
3080
|
+
// (sentinels/gates) to a different framework (e.g. sentinels on Codex) to
|
|
3081
|
+
// spread LLM load off a single account's rate limit. Content-sniffed for idempotency.
|
|
3082
|
+
if (!content.includes('Per-Component Framework Routing')) {
|
|
3083
|
+
const routingSection = `
|
|
3084
|
+
## Per-Component Framework Routing
|
|
3085
|
+
|
|
3086
|
+
Run different INTERNAL components on different agentic frameworks to spread LLM load off a single account's rate limit — e.g. you run on Claude Code but ALL your sentinels/gates run on Codex, so that background chatter stops spending your Claude quota. Model "size" is preserved automatically (a \`fast\` check becomes Haiku on Claude or a small GPT model on Codex). Opt-in; with no config, everything stays on your default framework.
|
|
3087
|
+
- See current routing: \`curl -H "Authorization: Bearer $AUTH" "http://localhost:4042/intelligence/routing"\` → \`{ defaultFramework, components: [{ component, category, framework, available }], coverage }\`.
|
|
3088
|
+
- Turn it on in \`.instar/config.json\` → \`sessions.componentFrameworks\`, e.g. \`{ "categories": { "sentinel": "codex-cli" }, "overrides": { "CoherenceReviewer": "claude-code" }, "fallback": "default" }\`. Categories: \`sentinel | gate | job | reflector | other\`. Resolution: \`overrides[name] → categories[category] → default\`.
|
|
3089
|
+
- Each framework gets its own circuit breaker (a Claude trip can't pause Codex). A missing CLI degrades to default + reports; a rate-limited framework falls back to the component's heuristic (no herd). Routes INTERNAL calls only — spawned sessions stay on \`topicFrameworks\`. Restart sessions to apply.
|
|
3090
|
+
- Proactive: user hitting rate limits / "run my sentinels on Codex" / "move background checks off Claude" → point them at \`sessions.componentFrameworks\` + \`GET /intelligence/routing\`. (Spec: \`docs/specs/per-component-framework-routing.md\`.)
|
|
3091
|
+
`;
|
|
3092
|
+
content += '\n' + routingSection;
|
|
3093
|
+
patched = true;
|
|
3094
|
+
result.upgraded.push('CLAUDE.md: added Per-Component Framework Routing awareness');
|
|
3095
|
+
}
|
|
3062
3096
|
// Correction & Preference Learning Sentinel (Slice 1a) §7 — Agent Awareness +
|
|
3063
3097
|
// Migration Parity: existing agents must learn about the preferences read-
|
|
3064
3098
|
// surface (the session-start hook now fetches /preferences/session-context
|