@pellux/goodvibes-sdk 0.37.1 → 0.38.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/contracts/artifacts/operator-contract.json +1 -1
- package/dist/events/communication.d.ts +21 -1
- package/dist/events/communication.d.ts.map +1 -1
- package/dist/platform/agents/message-bus-core.d.ts +7 -0
- package/dist/platform/agents/message-bus-core.d.ts.map +1 -1
- package/dist/platform/agents/message-bus-core.js +2 -1
- package/dist/platform/agents/orchestrator-runner.d.ts +37 -1
- package/dist/platform/agents/orchestrator-runner.d.ts.map +1 -1
- package/dist/platform/agents/orchestrator-runner.js +158 -7
- package/dist/platform/agents/orchestrator.d.ts +40 -0
- package/dist/platform/agents/orchestrator.d.ts.map +1 -1
- package/dist/platform/agents/orchestrator.js +29 -0
- package/dist/platform/agents/turn-knowledge-injection.d.ts +107 -0
- package/dist/platform/agents/turn-knowledge-injection.d.ts.map +1 -0
- package/dist/platform/agents/turn-knowledge-injection.js +152 -0
- package/dist/platform/agents/wrfc-controller.d.ts +23 -0
- package/dist/platform/agents/wrfc-controller.d.ts.map +1 -1
- package/dist/platform/agents/wrfc-controller.js +55 -0
- package/dist/platform/config/manager.d.ts +9 -0
- package/dist/platform/config/manager.d.ts.map +1 -1
- package/dist/platform/config/manager.js +15 -0
- package/dist/platform/control-plane/approval-broker.d.ts +1 -0
- package/dist/platform/control-plane/approval-broker.d.ts.map +1 -1
- package/dist/platform/control-plane/approval-broker.js +2 -0
- package/dist/platform/core/adaptive-planner.d.ts +50 -0
- package/dist/platform/core/adaptive-planner.d.ts.map +1 -1
- package/dist/platform/core/adaptive-planner.js +49 -0
- package/dist/platform/core/index.d.ts +1 -0
- package/dist/platform/core/index.d.ts.map +1 -1
- package/dist/platform/core/index.js +1 -0
- package/dist/platform/core/orchestrator-runtime.d.ts +11 -0
- package/dist/platform/core/orchestrator-runtime.d.ts.map +1 -1
- package/dist/platform/core/orchestrator-turn-loop.d.ts +28 -1
- package/dist/platform/core/orchestrator-turn-loop.d.ts.map +1 -1
- package/dist/platform/core/orchestrator-turn-loop.js +115 -3
- package/dist/platform/core/orchestrator.d.ts +61 -0
- package/dist/platform/core/orchestrator.d.ts.map +1 -1
- package/dist/platform/core/orchestrator.js +74 -1
- package/dist/platform/core/plan-proposal.d.ts +165 -0
- package/dist/platform/core/plan-proposal.d.ts.map +1 -0
- package/dist/platform/core/plan-proposal.js +296 -0
- package/dist/platform/knowledge/knowledge-api.d.ts +26 -0
- package/dist/platform/knowledge/knowledge-api.d.ts.map +1 -1
- package/dist/platform/knowledge/knowledge-api.js +11 -0
- package/dist/platform/orchestration/budget.d.ts +22 -0
- package/dist/platform/orchestration/budget.d.ts.map +1 -0
- package/dist/platform/orchestration/budget.js +35 -0
- package/dist/platform/orchestration/cancellation.d.ts +31 -0
- package/dist/platform/orchestration/cancellation.d.ts.map +1 -0
- package/dist/platform/orchestration/cancellation.js +25 -0
- package/dist/platform/orchestration/controller-compat.d.ts +32 -0
- package/dist/platform/orchestration/controller-compat.d.ts.map +1 -0
- package/dist/platform/orchestration/controller-compat.js +13 -0
- package/dist/platform/orchestration/dirty-guard.d.ts +32 -0
- package/dist/platform/orchestration/dirty-guard.d.ts.map +1 -0
- package/dist/platform/orchestration/dirty-guard.js +147 -0
- package/dist/platform/orchestration/engine.d.ts +57 -0
- package/dist/platform/orchestration/engine.d.ts.map +1 -0
- package/dist/platform/orchestration/engine.js +418 -0
- package/dist/platform/orchestration/index.d.ts +18 -0
- package/dist/platform/orchestration/index.d.ts.map +1 -0
- package/dist/platform/orchestration/index.js +10 -0
- package/dist/platform/orchestration/persistence.d.ts +24 -0
- package/dist/platform/orchestration/persistence.d.ts.map +1 -0
- package/dist/platform/orchestration/persistence.js +176 -0
- package/dist/platform/orchestration/phase-runner.d.ts +87 -0
- package/dist/platform/orchestration/phase-runner.d.ts.map +1 -0
- package/dist/platform/orchestration/phase-runner.js +274 -0
- package/dist/platform/orchestration/scheduler.d.ts +45 -0
- package/dist/platform/orchestration/scheduler.d.ts.map +1 -0
- package/dist/platform/orchestration/scheduler.js +57 -0
- package/dist/platform/orchestration/types.d.ts +250 -0
- package/dist/platform/orchestration/types.d.ts.map +1 -0
- package/dist/platform/orchestration/types.js +15 -0
- package/dist/platform/runtime/emitters/communication.d.ts +11 -0
- package/dist/platform/runtime/emitters/communication.d.ts.map +1 -1
- package/dist/platform/runtime/emitters/communication.js +9 -0
- package/dist/platform/runtime/feature-flags/flags.d.ts.map +1 -1
- package/dist/platform/runtime/feature-flags/flags.js +17 -0
- package/dist/platform/runtime/fleet/adapters/agent.d.ts +56 -0
- package/dist/platform/runtime/fleet/adapters/agent.d.ts.map +1 -0
- package/dist/platform/runtime/fleet/adapters/agent.js +143 -0
- package/dist/platform/runtime/fleet/adapters/automation.d.ts +30 -0
- package/dist/platform/runtime/fleet/adapters/automation.d.ts.map +1 -0
- package/dist/platform/runtime/fleet/adapters/automation.js +41 -0
- package/dist/platform/runtime/fleet/adapters/background-process.d.ts +12 -0
- package/dist/platform/runtime/fleet/adapters/background-process.d.ts.map +1 -0
- package/dist/platform/runtime/fleet/adapters/background-process.js +46 -0
- package/dist/platform/runtime/fleet/adapters/code-index.d.ts +21 -0
- package/dist/platform/runtime/fleet/adapters/code-index.d.ts.map +1 -0
- package/dist/platform/runtime/fleet/adapters/code-index.js +44 -0
- package/dist/platform/runtime/fleet/adapters/orchestration.d.ts +47 -0
- package/dist/platform/runtime/fleet/adapters/orchestration.d.ts.map +1 -0
- package/dist/platform/runtime/fleet/adapters/orchestration.js +225 -0
- package/dist/platform/runtime/fleet/adapters/schedule.d.ts +14 -0
- package/dist/platform/runtime/fleet/adapters/schedule.d.ts.map +1 -0
- package/dist/platform/runtime/fleet/adapters/schedule.js +28 -0
- package/dist/platform/runtime/fleet/adapters/trigger.d.ts +12 -0
- package/dist/platform/runtime/fleet/adapters/trigger.d.ts.map +1 -0
- package/dist/platform/runtime/fleet/adapters/trigger.js +22 -0
- package/dist/platform/runtime/fleet/adapters/watcher.d.ts +13 -0
- package/dist/platform/runtime/fleet/adapters/watcher.d.ts.map +1 -0
- package/dist/platform/runtime/fleet/adapters/watcher.js +47 -0
- package/dist/platform/runtime/fleet/adapters/workflow.d.ts +11 -0
- package/dist/platform/runtime/fleet/adapters/workflow.d.ts.map +1 -0
- package/dist/platform/runtime/fleet/adapters/workflow.js +34 -0
- package/dist/platform/runtime/fleet/adapters/wrfc.d.ts +22 -0
- package/dist/platform/runtime/fleet/adapters/wrfc.d.ts.map +1 -0
- package/dist/platform/runtime/fleet/adapters/wrfc.js +228 -0
- package/dist/platform/runtime/fleet/index.d.ts +10 -0
- package/dist/platform/runtime/fleet/index.d.ts.map +1 -0
- package/dist/platform/runtime/fleet/index.js +6 -0
- package/dist/platform/runtime/fleet/registry.d.ts +113 -0
- package/dist/platform/runtime/fleet/registry.d.ts.map +1 -0
- package/dist/platform/runtime/fleet/registry.js +630 -0
- package/dist/platform/runtime/fleet/types.d.ts +199 -0
- package/dist/platform/runtime/fleet/types.d.ts.map +1 -0
- package/dist/platform/runtime/fleet/types.js +2 -0
- package/dist/platform/runtime/runtime-knowledge-api.d.ts +1 -1
- package/dist/platform/runtime/runtime-knowledge-api.d.ts.map +1 -1
- package/dist/platform/runtime/runtime-knowledge-api.js +1 -0
- package/dist/platform/runtime/services.d.ts +46 -0
- package/dist/platform/runtime/services.d.ts.map +1 -1
- package/dist/platform/runtime/services.js +78 -0
- package/dist/platform/state/code-index-chunking.d.ts +49 -0
- package/dist/platform/state/code-index-chunking.d.ts.map +1 -0
- package/dist/platform/state/code-index-chunking.js +111 -0
- package/dist/platform/state/code-index-db.d.ts +53 -0
- package/dist/platform/state/code-index-db.d.ts.map +1 -0
- package/dist/platform/state/code-index-db.js +101 -0
- package/dist/platform/state/code-index-store.d.ts +175 -0
- package/dist/platform/state/code-index-store.d.ts.map +1 -0
- package/dist/platform/state/code-index-store.js +612 -0
- package/dist/platform/state/index.d.ts +4 -2
- package/dist/platform/state/index.d.ts.map +1 -1
- package/dist/platform/state/index.js +2 -1
- package/dist/platform/state/knowledge-injection.d.ts +23 -0
- package/dist/platform/state/knowledge-injection.d.ts.map +1 -1
- package/dist/platform/state/knowledge-injection.js +34 -19
- package/dist/platform/state/memory-vector-store.d.ts +1 -13
- package/dist/platform/state/memory-vector-store.d.ts.map +1 -1
- package/dist/platform/state/memory-vector-store.js +6 -38
- package/dist/platform/state/sqlite-vec-loader.d.ts +25 -0
- package/dist/platform/state/sqlite-vec-loader.d.ts.map +1 -0
- package/dist/platform/state/sqlite-vec-loader.js +43 -0
- package/dist/platform/tools/agent/manager.d.ts +128 -1
- package/dist/platform/tools/agent/manager.d.ts.map +1 -1
- package/dist/platform/tools/agent/manager.js +137 -1
- package/dist/platform/tools/exec/runtime.d.ts.map +1 -1
- package/dist/platform/tools/exec/runtime.js +139 -44
- package/dist/platform/tools/exec/schema.d.ts +2 -0
- package/dist/platform/tools/exec/schema.d.ts.map +1 -1
- package/dist/platform/tools/fetch/runtime.d.ts +7 -0
- package/dist/platform/tools/fetch/runtime.d.ts.map +1 -1
- package/dist/platform/tools/fetch/runtime.js +8 -6
- package/dist/platform/tools/registry.d.ts +9 -3
- package/dist/platform/tools/registry.d.ts.map +1 -1
- package/dist/platform/tools/registry.js +9 -3
- package/dist/platform/types/tools.d.ts +14 -1
- package/dist/platform/types/tools.d.ts.map +1 -1
- package/dist/platform/version.js +1 -1
- package/dist/platform/workspace/checkpoint/side-git.d.ts +20 -8
- package/dist/platform/workspace/checkpoint/side-git.d.ts.map +1 -1
- package/dist/platform/workspace/checkpoint/side-git.js +21 -11
- package/package.json +17 -9
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
import type { ProviderMessage } from '../providers/interface.js';
|
|
2
|
+
import type { MemoryRecord, MemoryRegistry, MemorySemanticSearchResult, MemoryVectorStats } from '../state/index.js';
|
|
3
|
+
/**
|
|
4
|
+
* Default per-turn injection budget: min(800 tokens, 3% of the model's context window).
|
|
5
|
+
* 800 is the static floor for models with an unknown/zero context window (0 short-circuits
|
|
6
|
+
* the percentage term); the percentage term keeps the block a small, bounded slice of the
|
|
7
|
+
* turn's own budget for large-context models rather than a fixed absolute cost.
|
|
8
|
+
*/
|
|
9
|
+
export declare const DEFAULT_TURN_KNOWLEDGE_BUDGET_TOKENS = 800;
|
|
10
|
+
/**
|
|
11
|
+
* Default relevance floor: the minimum `scoreKnowledge` score required to survive stage 2
|
|
12
|
+
* filtering (stage 1 is the existing confidence>=55 gate inside selectKnowledgeForTaskScored).
|
|
13
|
+
* Derived directly from the scoreKnowledge weights (knowledge-injection.ts) rather than
|
|
14
|
+
* picked arbitrarily: a record sitting exactly at the confidence floor (55) with the
|
|
15
|
+
* weakest positive reviewState bonus ('fresh', +20) that matches at least one task token
|
|
16
|
+
* (+20) scores 55 + 20 + 20 = 95. Below that, a record is either under-confidence, has no
|
|
17
|
+
* reviewState credit, or matched nothing about the current turn — filler, not relevance.
|
|
18
|
+
*/
|
|
19
|
+
export declare const DEFAULT_TURN_KNOWLEDGE_RELEVANCE_FLOOR = 95;
|
|
20
|
+
/** Default candidate breadth passed through to selectKnowledgeForTaskScored. */
|
|
21
|
+
export declare const DEFAULT_TURN_KNOWLEDGE_LIMIT = 3;
|
|
22
|
+
/** Bounded ring size for AgentRecord.turnInjections (see recordTurnInjection). */
|
|
23
|
+
export declare const DEFAULT_TURN_INJECTION_RING_SIZE = 20;
|
|
24
|
+
export declare function defaultTurnKnowledgeBudgetTokens(contextWindow: number): number;
|
|
25
|
+
/**
|
|
26
|
+
* Per-turn honesty record for one agent turn's passive-injection attempt. Stored on
|
|
27
|
+
* `AgentRecord.turnInjections` (bounded ring) and appended verbatim to the agent's
|
|
28
|
+
* session transcript (`{type:'knowledge_injection', turn, ...record}`) — no new
|
|
29
|
+
* event-contract member, per the brief's "prefer existing-event reuse" constraint.
|
|
30
|
+
*/
|
|
31
|
+
export interface TurnInjectionRecord {
|
|
32
|
+
/** The agent turn number this retrieval ran on. */
|
|
33
|
+
readonly turn: number;
|
|
34
|
+
/** The derived query actually sent through the ranking pipeline (task + conversation tail). */
|
|
35
|
+
readonly query: string;
|
|
36
|
+
/** Count of scored, confidence-gated, not-already-injected candidates considered this turn. */
|
|
37
|
+
readonly candidatesConsidered: number;
|
|
38
|
+
/** Record ids actually injected into the prompt this turn (empty when block===null). */
|
|
39
|
+
readonly injectedIds: readonly string[];
|
|
40
|
+
/** Record ids that cleared the relevance floor but were dropped to fit the token budget. */
|
|
41
|
+
readonly droppedForBudget: readonly string[];
|
|
42
|
+
/** Estimated token cost of the rendered block (0 when block===null). */
|
|
43
|
+
readonly tokenCost: number;
|
|
44
|
+
/** The token budget this turn was evaluated against. */
|
|
45
|
+
readonly budgetTokens: number;
|
|
46
|
+
/** The relevance floor this turn was evaluated against. */
|
|
47
|
+
readonly relevanceFloor: number;
|
|
48
|
+
/** Ingest mode (keyword/semantic/hybrid) of each injected record, same order as injectedIds. */
|
|
49
|
+
readonly ingestModes: readonly string[];
|
|
50
|
+
/** Honest embeddings signal: 'available' when the registry's vector index is enabled and
|
|
51
|
+
* usable, 'fallback-lexical' when memory-store.ts's searchSemantic() degraded to keyword
|
|
52
|
+
* ranking (no vector index, or the registry does not expose vectorStats at all). */
|
|
53
|
+
readonly embeddingBackend: 'available' | 'fallback-lexical';
|
|
54
|
+
/** Present exactly when block===null: why nothing was injected. */
|
|
55
|
+
readonly reason?: string | undefined;
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Structural registry surface, mirroring knowledge-injection.ts's private
|
|
59
|
+
* `KnowledgeRegistrySource` plus one addition: optional `vectorStats`, the sole signal this
|
|
60
|
+
* module uses to tell a real semantic search apart from memory-store.ts's silent lexical
|
|
61
|
+
* fallback (searchSemantic() never throws on a missing/disabled vector index — it just
|
|
62
|
+
* degrades to keyword ranking). Kept structural (not `Pick<MemoryRegistry, ...>`) so tests
|
|
63
|
+
* can supply a minimal fake without constructing a real MemoryStore/SQLite.
|
|
64
|
+
*/
|
|
65
|
+
export type TurnKnowledgeRegistrySource = {
|
|
66
|
+
getAll(): readonly MemoryRecord[];
|
|
67
|
+
searchSemantic?(input: Parameters<MemoryRegistry['searchSemantic']>[0]): readonly MemorySemanticSearchResult[];
|
|
68
|
+
vectorStats?(): MemoryVectorStats;
|
|
69
|
+
};
|
|
70
|
+
export interface BuildPerTurnKnowledgeInjectionInput {
|
|
71
|
+
readonly memoryRegistry: TurnKnowledgeRegistrySource;
|
|
72
|
+
/** The agent's (possibly frozen) task text — always included in the derived query. */
|
|
73
|
+
readonly task: string;
|
|
74
|
+
readonly writeScope?: readonly string[] | undefined;
|
|
75
|
+
/** The current conversation, formatted for the LLM — the source of "what changed this turn". */
|
|
76
|
+
readonly conversationTail: readonly ProviderMessage[];
|
|
77
|
+
/** Hard token budget for the rendered block. budgetTokens<=0 is the caller's job to no-op on;
|
|
78
|
+
* this function still honors it correctly (an empty/null block, honest record). */
|
|
79
|
+
readonly budgetTokens: number;
|
|
80
|
+
readonly relevanceFloor: number;
|
|
81
|
+
readonly limit?: number | undefined;
|
|
82
|
+
/** Ids never to re-list (the spawn-time baseline plus every id injected on prior turns). */
|
|
83
|
+
readonly alreadyInjectedIds: readonly string[];
|
|
84
|
+
readonly turn: number;
|
|
85
|
+
}
|
|
86
|
+
export interface BuildPerTurnKnowledgeInjectionResult {
|
|
87
|
+
readonly block: string | null;
|
|
88
|
+
readonly record: TurnInjectionRecord;
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* The one behavioral difference from spawn-time selection: derive the query from the
|
|
92
|
+
* LATEST user-role message in the conversation tail (a steer, a drained directive, or —
|
|
93
|
+
* on turn 1, before any steer exists — the initial task itself) concatenated with the
|
|
94
|
+
* task, instead of the task alone. On turn 1 the latest user message IS the task (the
|
|
95
|
+
* runner seeds it via `conversation.addUserMessage(record.task)` before the turn loop),
|
|
96
|
+
* so this collapses to the task with no duplication.
|
|
97
|
+
*/
|
|
98
|
+
export declare function deriveTurnKnowledgeQuery(task: string, conversationTail: readonly ProviderMessage[]): string;
|
|
99
|
+
export declare function buildPerTurnKnowledgeInjection(input: BuildPerTurnKnowledgeInjectionInput): BuildPerTurnKnowledgeInjectionResult;
|
|
100
|
+
/**
|
|
101
|
+
* Push one entry onto a bounded ring, evicting the oldest entry once
|
|
102
|
+
* `retention` is exceeded. Pure and exported so it is independently
|
|
103
|
+
* unit-testable (and so orchestrator-runner.ts never has to hand-roll ring
|
|
104
|
+
* eviction inline).
|
|
105
|
+
*/
|
|
106
|
+
export declare function recordTurnInjection(existing: readonly TurnInjectionRecord[] | undefined, entry: TurnInjectionRecord, retention?: number): TurnInjectionRecord[];
|
|
107
|
+
//# sourceMappingURL=turn-knowledge-injection.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"turn-knowledge-injection.d.ts","sourceRoot":"","sources":["../../../src/platform/agents/turn-knowledge-injection.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
import { estimateTokens } from '../core/context-compaction.js';
|
|
2
|
+
import { buildKnowledgeInjectionPrompt, selectKnowledgeForTaskScored } from '../state/index.js';
|
|
3
|
+
/**
|
|
4
|
+
* Default per-turn injection budget: min(800 tokens, 3% of the model's context window).
|
|
5
|
+
* 800 is the static floor for models with an unknown/zero context window (0 short-circuits
|
|
6
|
+
* the percentage term); the percentage term keeps the block a small, bounded slice of the
|
|
7
|
+
* turn's own budget for large-context models rather than a fixed absolute cost.
|
|
8
|
+
*/
|
|
9
|
+
export const DEFAULT_TURN_KNOWLEDGE_BUDGET_TOKENS = 800;
|
|
10
|
+
/**
|
|
11
|
+
* Default relevance floor: the minimum `scoreKnowledge` score required to survive stage 2
|
|
12
|
+
* filtering (stage 1 is the existing confidence>=55 gate inside selectKnowledgeForTaskScored).
|
|
13
|
+
* Derived directly from the scoreKnowledge weights (knowledge-injection.ts) rather than
|
|
14
|
+
* picked arbitrarily: a record sitting exactly at the confidence floor (55) with the
|
|
15
|
+
* weakest positive reviewState bonus ('fresh', +20) that matches at least one task token
|
|
16
|
+
* (+20) scores 55 + 20 + 20 = 95. Below that, a record is either under-confidence, has no
|
|
17
|
+
* reviewState credit, or matched nothing about the current turn — filler, not relevance.
|
|
18
|
+
*/
|
|
19
|
+
export const DEFAULT_TURN_KNOWLEDGE_RELEVANCE_FLOOR = 95;
|
|
20
|
+
/** Default candidate breadth passed through to selectKnowledgeForTaskScored. */
|
|
21
|
+
export const DEFAULT_TURN_KNOWLEDGE_LIMIT = 3;
|
|
22
|
+
/** Bounded ring size for AgentRecord.turnInjections (see recordTurnInjection). */
|
|
23
|
+
export const DEFAULT_TURN_INJECTION_RING_SIZE = 20;
|
|
24
|
+
export function defaultTurnKnowledgeBudgetTokens(contextWindow) {
|
|
25
|
+
if (!Number.isFinite(contextWindow) || contextWindow <= 0) {
|
|
26
|
+
return DEFAULT_TURN_KNOWLEDGE_BUDGET_TOKENS;
|
|
27
|
+
}
|
|
28
|
+
return Math.min(DEFAULT_TURN_KNOWLEDGE_BUDGET_TOKENS, Math.floor(contextWindow * 0.03));
|
|
29
|
+
}
|
|
30
|
+
function extractTextContent(content) {
|
|
31
|
+
if (typeof content === 'string')
|
|
32
|
+
return content;
|
|
33
|
+
return content
|
|
34
|
+
.filter((part) => part.type === 'text')
|
|
35
|
+
.map((part) => part.text)
|
|
36
|
+
.join(' ');
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* The one behavioral difference from spawn-time selection: derive the query from the
|
|
40
|
+
* LATEST user-role message in the conversation tail (a steer, a drained directive, or —
|
|
41
|
+
* on turn 1, before any steer exists — the initial task itself) concatenated with the
|
|
42
|
+
* task, instead of the task alone. On turn 1 the latest user message IS the task (the
|
|
43
|
+
* runner seeds it via `conversation.addUserMessage(record.task)` before the turn loop),
|
|
44
|
+
* so this collapses to the task with no duplication.
|
|
45
|
+
*/
|
|
46
|
+
export function deriveTurnKnowledgeQuery(task, conversationTail) {
|
|
47
|
+
let latestUserContent = '';
|
|
48
|
+
for (let i = conversationTail.length - 1; i >= 0; i--) {
|
|
49
|
+
const message = conversationTail[i];
|
|
50
|
+
if (message?.role === 'user') {
|
|
51
|
+
latestUserContent = extractTextContent(message.content).trim();
|
|
52
|
+
break;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
const trimmedTask = task.trim();
|
|
56
|
+
if (!latestUserContent || latestUserContent === trimmedTask) {
|
|
57
|
+
return trimmedTask;
|
|
58
|
+
}
|
|
59
|
+
return `${trimmedTask} ${latestUserContent}`.trim();
|
|
60
|
+
}
|
|
61
|
+
function resolveEmbeddingBackend(registry) {
|
|
62
|
+
const stats = registry.vectorStats?.();
|
|
63
|
+
if (!stats)
|
|
64
|
+
return 'fallback-lexical';
|
|
65
|
+
return stats.enabled && stats.available ? 'available' : 'fallback-lexical';
|
|
66
|
+
}
|
|
67
|
+
export function buildPerTurnKnowledgeInjection(input) {
|
|
68
|
+
const { memoryRegistry, task, writeScope = [], conversationTail, budgetTokens, relevanceFloor, limit = DEFAULT_TURN_KNOWLEDGE_LIMIT, alreadyInjectedIds, turn, } = input;
|
|
69
|
+
const query = deriveTurnKnowledgeQuery(task, conversationTail);
|
|
70
|
+
const alreadyInjectedIdSet = new Set(alreadyInjectedIds);
|
|
71
|
+
const embeddingBackend = resolveEmbeddingBackend(memoryRegistry);
|
|
72
|
+
const scored = selectKnowledgeForTaskScored(memoryRegistry, query, writeScope, limit)
|
|
73
|
+
.filter((entry) => !alreadyInjectedIdSet.has(entry.injection.id));
|
|
74
|
+
const candidatesConsidered = scored.length;
|
|
75
|
+
const clearedFloor = scored.filter((entry) => entry.score >= relevanceFloor).slice(0, limit);
|
|
76
|
+
if (clearedFloor.length === 0) {
|
|
77
|
+
return {
|
|
78
|
+
block: null,
|
|
79
|
+
record: {
|
|
80
|
+
turn,
|
|
81
|
+
query,
|
|
82
|
+
candidatesConsidered,
|
|
83
|
+
injectedIds: [],
|
|
84
|
+
droppedForBudget: [],
|
|
85
|
+
tokenCost: 0,
|
|
86
|
+
budgetTokens,
|
|
87
|
+
relevanceFloor,
|
|
88
|
+
ingestModes: [],
|
|
89
|
+
embeddingBackend,
|
|
90
|
+
reason: 'no records cleared relevance floor',
|
|
91
|
+
},
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
// Greedy budget trim: clearedFloor is already sorted best-first (selectKnowledgeForTaskScored's
|
|
95
|
+
// contract), so dropping from the tail always drops the lowest-scored surviving entry.
|
|
96
|
+
const kept = [...clearedFloor];
|
|
97
|
+
const droppedForBudget = [];
|
|
98
|
+
let tokenCost = estimateTokens(buildKnowledgeInjectionPrompt(kept.map((entry) => entry.injection)) ?? '');
|
|
99
|
+
while (kept.length > 0 && tokenCost > budgetTokens) {
|
|
100
|
+
const removed = kept.pop();
|
|
101
|
+
if (!removed)
|
|
102
|
+
break;
|
|
103
|
+
droppedForBudget.push(removed.injection.id);
|
|
104
|
+
tokenCost = kept.length > 0
|
|
105
|
+
? estimateTokens(buildKnowledgeInjectionPrompt(kept.map((entry) => entry.injection)) ?? '')
|
|
106
|
+
: 0;
|
|
107
|
+
}
|
|
108
|
+
if (kept.length === 0) {
|
|
109
|
+
return {
|
|
110
|
+
block: null,
|
|
111
|
+
record: {
|
|
112
|
+
turn,
|
|
113
|
+
query,
|
|
114
|
+
candidatesConsidered,
|
|
115
|
+
injectedIds: [],
|
|
116
|
+
droppedForBudget,
|
|
117
|
+
tokenCost: 0,
|
|
118
|
+
budgetTokens,
|
|
119
|
+
relevanceFloor,
|
|
120
|
+
ingestModes: [],
|
|
121
|
+
embeddingBackend,
|
|
122
|
+
reason: 'single highest-scoring record exceeds budget',
|
|
123
|
+
},
|
|
124
|
+
};
|
|
125
|
+
}
|
|
126
|
+
const block = buildKnowledgeInjectionPrompt(kept.map((entry) => entry.injection));
|
|
127
|
+
return {
|
|
128
|
+
block,
|
|
129
|
+
record: {
|
|
130
|
+
turn,
|
|
131
|
+
query,
|
|
132
|
+
candidatesConsidered,
|
|
133
|
+
injectedIds: kept.map((entry) => entry.injection.id),
|
|
134
|
+
droppedForBudget,
|
|
135
|
+
tokenCost,
|
|
136
|
+
budgetTokens,
|
|
137
|
+
relevanceFloor,
|
|
138
|
+
ingestModes: kept.map((entry) => entry.injection.ingestMode),
|
|
139
|
+
embeddingBackend,
|
|
140
|
+
},
|
|
141
|
+
};
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* Push one entry onto a bounded ring, evicting the oldest entry once
|
|
145
|
+
* `retention` is exceeded. Pure and exported so it is independently
|
|
146
|
+
* unit-testable (and so orchestrator-runner.ts never has to hand-roll ring
|
|
147
|
+
* eviction inline).
|
|
148
|
+
*/
|
|
149
|
+
export function recordTurnInjection(existing, entry, retention = DEFAULT_TURN_INJECTION_RING_SIZE) {
|
|
150
|
+
const next = existing ? [...existing, entry] : [entry];
|
|
151
|
+
return next.length > retention ? next.slice(next.length - retention) : next;
|
|
152
|
+
}
|
|
@@ -96,6 +96,29 @@ export declare class WrfcController {
|
|
|
96
96
|
* Returns true if the chain was imported, false if refused.
|
|
97
97
|
*/
|
|
98
98
|
importChain(chain: WrfcChain, force?: boolean): boolean;
|
|
99
|
+
/**
|
|
100
|
+
* Item d5 (Wave 6, wo-F): resurrection-safe zombie check for a chain about
|
|
101
|
+
* to be imported at rehydrate. A non-terminal chain whose ENTIRE roster
|
|
102
|
+
* (allAgentIds) is absent from THIS process's live AgentManager never
|
|
103
|
+
* survived the restart — no in-process execution is coming back to finish
|
|
104
|
+
* it, so it would otherwise show as "running" forever. If even ONE roster
|
|
105
|
+
* agent id IS live (e.g. re-imported mid-session, not at a real process
|
|
106
|
+
* restart), this returns false and the chain is left exactly as imported —
|
|
107
|
+
* reaping only ever fires when NOTHING could possibly still be driving it.
|
|
108
|
+
*/
|
|
109
|
+
private isZombieChain;
|
|
110
|
+
/**
|
|
111
|
+
* Item d5: mark a reimported zombie chain terminal at import time so it
|
|
112
|
+
* presents as failed + prunable instead of stuck non-terminal forever.
|
|
113
|
+
* Deliberately does NOT call failChain()/cancelChain(): those assume a
|
|
114
|
+
* live in-memory execution (cancel running children, complete the owner
|
|
115
|
+
* agent record, re-check gates for siblings) that makes no sense for a
|
|
116
|
+
* chain whose entire roster is already confirmed dead — this is a direct,
|
|
117
|
+
* minimal field mutation plus the same state-changed/chain-failed events
|
|
118
|
+
* every other terminal transition emits, so consumers see one consistent
|
|
119
|
+
* "chain failed" signal regardless of which path produced it.
|
|
120
|
+
*/
|
|
121
|
+
private reapZombieChain;
|
|
99
122
|
dispose(): void;
|
|
100
123
|
private transition;
|
|
101
124
|
private applyWrfcAgentMetadata;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wrfc-controller.d.ts","sourceRoot":"","sources":["../../../src/platform/agents/wrfc-controller.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"wrfc-controller.d.ts","sourceRoot":"","sources":["../../../src/platform/agents/wrfc-controller.ts"],"names":[],"mappings":"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"}
|
|
@@ -296,7 +296,17 @@ export class WrfcController {
|
|
|
296
296
|
});
|
|
297
297
|
return false;
|
|
298
298
|
}
|
|
299
|
+
// Insert into the chain map BEFORE reapZombieChain runs. reapZombieChain
|
|
300
|
+
// emits state-changed + chain-failed for a terminal transition, and every
|
|
301
|
+
// other terminal transition in this controller operates on a chain already
|
|
302
|
+
// present in this.chains — so a consumer that resolves the chain via
|
|
303
|
+
// getChain(id) in response to those events finds it, consistent with the
|
|
304
|
+
// rest of the lifecycle. (chain is a reference already held here, so
|
|
305
|
+
// setting first and then mutating it in reapZombieChain is equivalent.)
|
|
299
306
|
this.chains.set(chain.id, chain);
|
|
307
|
+
if (!isChainTerminal(chain.state) && this.isZombieChain(chain)) {
|
|
308
|
+
this.reapZombieChain(chain);
|
|
309
|
+
}
|
|
300
310
|
logger.info('WrfcController.importChain: chain imported', {
|
|
301
311
|
chainId: chain.id,
|
|
302
312
|
state: chain.state,
|
|
@@ -304,6 +314,51 @@ export class WrfcController {
|
|
|
304
314
|
});
|
|
305
315
|
return true;
|
|
306
316
|
}
|
|
317
|
+
/**
|
|
318
|
+
* Item d5 (Wave 6, wo-F): resurrection-safe zombie check for a chain about
|
|
319
|
+
* to be imported at rehydrate. A non-terminal chain whose ENTIRE roster
|
|
320
|
+
* (allAgentIds) is absent from THIS process's live AgentManager never
|
|
321
|
+
* survived the restart — no in-process execution is coming back to finish
|
|
322
|
+
* it, so it would otherwise show as "running" forever. If even ONE roster
|
|
323
|
+
* agent id IS live (e.g. re-imported mid-session, not at a real process
|
|
324
|
+
* restart), this returns false and the chain is left exactly as imported —
|
|
325
|
+
* reaping only ever fires when NOTHING could possibly still be driving it.
|
|
326
|
+
*/
|
|
327
|
+
isZombieChain(chain) {
|
|
328
|
+
if (chain.allAgentIds.length === 0)
|
|
329
|
+
return false;
|
|
330
|
+
return chain.allAgentIds.every((agentId) => this.agentManager.getStatus(agentId) === null);
|
|
331
|
+
}
|
|
332
|
+
/**
|
|
333
|
+
* Item d5: mark a reimported zombie chain terminal at import time so it
|
|
334
|
+
* presents as failed + prunable instead of stuck non-terminal forever.
|
|
335
|
+
* Deliberately does NOT call failChain()/cancelChain(): those assume a
|
|
336
|
+
* live in-memory execution (cancel running children, complete the owner
|
|
337
|
+
* agent record, re-check gates for siblings) that makes no sense for a
|
|
338
|
+
* chain whose entire roster is already confirmed dead — this is a direct,
|
|
339
|
+
* minimal field mutation plus the same state-changed/chain-failed events
|
|
340
|
+
* every other terminal transition emits, so consumers see one consistent
|
|
341
|
+
* "chain failed" signal regardless of which path produced it.
|
|
342
|
+
*/
|
|
343
|
+
reapZombieChain(chain) {
|
|
344
|
+
const from = chain.state;
|
|
345
|
+
const reason = 'zombie chain reaped at rehydrate: no member agent survived the restart';
|
|
346
|
+
chain.state = 'failed';
|
|
347
|
+
chain.error = reason;
|
|
348
|
+
chain.failureKind = 'other';
|
|
349
|
+
chain.completedAt = Date.now();
|
|
350
|
+
emitWrfcStateChanged(this.runtimeBus, this.sessionId, chain.id, from, 'failed');
|
|
351
|
+
emitWorkflowChainFailed(this.runtimeBus, createWrfcWorkflowContext(this.sessionId, chain.id), {
|
|
352
|
+
chainId: chain.id,
|
|
353
|
+
reason,
|
|
354
|
+
failureKind: 'other',
|
|
355
|
+
});
|
|
356
|
+
logger.warn('WrfcController.importChain: reaped zombie chain — no member agent survived restart', {
|
|
357
|
+
chainId: chain.id,
|
|
358
|
+
priorState: from,
|
|
359
|
+
agentIds: chain.allAgentIds,
|
|
360
|
+
});
|
|
361
|
+
}
|
|
307
362
|
dispose() {
|
|
308
363
|
for (const unsub of this.unsubscribers)
|
|
309
364
|
unsub();
|
|
@@ -103,6 +103,15 @@ export declare class ConfigManager {
|
|
|
103
103
|
* The patch is shallow-merged into the existing category value.
|
|
104
104
|
*/
|
|
105
105
|
mergeCategory<C extends keyof GoodVibesConfig>(category: C, patch: Partial<GoodVibesConfig[C]>): void;
|
|
106
|
+
/**
|
|
107
|
+
* Remove a key from an object-shaped category and auto-save.
|
|
108
|
+
*
|
|
109
|
+
* mergeCategory can only set keys (undefined patch values are skipped, and
|
|
110
|
+
* getCategory returns a clone, so delete-then-merge is a silent no-op) —
|
|
111
|
+
* clearing an override, e.g. a feature-flag entry back to its default,
|
|
112
|
+
* requires this explicit removal.
|
|
113
|
+
*/
|
|
114
|
+
removeCategoryKey<C extends keyof GoodVibesConfig>(category: C, key: string): void;
|
|
106
115
|
/**
|
|
107
116
|
* Reset a specific key to its default, or reset all config.
|
|
108
117
|
* Saves to disk after reset.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../../src/platform/config/manager.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../../src/platform/config/manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -314,6 +314,21 @@ export class ConfigManager {
|
|
|
314
314
|
}
|
|
315
315
|
this.save();
|
|
316
316
|
}
|
|
317
|
+
/**
|
|
318
|
+
* Remove a key from an object-shaped category and auto-save.
|
|
319
|
+
*
|
|
320
|
+
* mergeCategory can only set keys (undefined patch values are skipped, and
|
|
321
|
+
* getCategory returns a clone, so delete-then-merge is a silent no-op) —
|
|
322
|
+
* clearing an override, e.g. a feature-flag entry back to its default,
|
|
323
|
+
* requires this explicit removal.
|
|
324
|
+
*/
|
|
325
|
+
removeCategoryKey(category, key) {
|
|
326
|
+
const current = this.config[category];
|
|
327
|
+
if (!(key in current))
|
|
328
|
+
return;
|
|
329
|
+
delete current[key];
|
|
330
|
+
this.save();
|
|
331
|
+
}
|
|
317
332
|
/**
|
|
318
333
|
* Reset a specific key to its default, or reset all config.
|
|
319
334
|
* Saves to disk after reset.
|
|
@@ -64,6 +64,7 @@ export declare class ApprovalBroker {
|
|
|
64
64
|
resolveApproval(approvalId: string, input: {
|
|
65
65
|
readonly approved: boolean;
|
|
66
66
|
readonly remember?: boolean | undefined;
|
|
67
|
+
readonly modifiedArgs?: Record<string, unknown> | undefined;
|
|
67
68
|
readonly actor: string;
|
|
68
69
|
readonly actorSurface?: string | undefined;
|
|
69
70
|
readonly note?: string | undefined;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"approval-broker.d.ts","sourceRoot":"","sources":["../../../src/platform/control-plane/approval-broker.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"approval-broker.d.ts","sourceRoot":"","sources":["../../../src/platform/control-plane/approval-broker.ts"],"names":[],"mappings":"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"}
|
|
@@ -220,6 +220,7 @@ export class ApprovalBroker {
|
|
|
220
220
|
.then((decision) => this.resolveApproval(approval.id, {
|
|
221
221
|
approved: decision.approved,
|
|
222
222
|
remember: decision.remember,
|
|
223
|
+
modifiedArgs: decision.modifiedArgs,
|
|
223
224
|
actor: 'tui-local',
|
|
224
225
|
actorSurface: 'tui',
|
|
225
226
|
}))
|
|
@@ -267,6 +268,7 @@ export class ApprovalBroker {
|
|
|
267
268
|
decision: {
|
|
268
269
|
approved: input.approved,
|
|
269
270
|
...(input.remember !== undefined ? { remember: input.remember } : {}),
|
|
271
|
+
...(input.modifiedArgs !== undefined ? { modifiedArgs: input.modifiedArgs } : {}),
|
|
270
272
|
},
|
|
271
273
|
audit: [
|
|
272
274
|
...approval.audit,
|
|
@@ -9,6 +9,7 @@
|
|
|
9
9
|
* /plan explain
|
|
10
10
|
* /plan override <strategy>
|
|
11
11
|
*/
|
|
12
|
+
import { type PlanProposal, type PlanProposalIssue, type RawDecomposition } from './plan-proposal.js';
|
|
12
13
|
/**
|
|
13
14
|
* The five supported execution strategies.
|
|
14
15
|
*
|
|
@@ -52,6 +53,18 @@ export interface StrategyCandidate {
|
|
|
52
53
|
score: number;
|
|
53
54
|
reasonCode: StrategyReasonCode;
|
|
54
55
|
}
|
|
56
|
+
/**
|
|
57
|
+
* The outcome of the deterministic "does this task warrant decomposition?"
|
|
58
|
+
* gate. This is a semantic projection of the existing strategy selection —
|
|
59
|
+
* `decompose` is simply `selected !== 'single'` — so every existing reason
|
|
60
|
+
* code and the `/plan explain` output stay authoritative. No new scoring
|
|
61
|
+
* logic lives here.
|
|
62
|
+
*/
|
|
63
|
+
export interface DecompositionGate {
|
|
64
|
+
decompose: boolean;
|
|
65
|
+
strategy: ExecutionStrategy;
|
|
66
|
+
reasonCode: StrategyReasonCode;
|
|
67
|
+
}
|
|
55
68
|
/** The outcome of a planner selection pass. */
|
|
56
69
|
export interface PlannerDecision {
|
|
57
70
|
/** The strategy that was ultimately selected. */
|
|
@@ -86,6 +99,43 @@ export declare class AdaptivePlanner {
|
|
|
86
99
|
* The decision is appended to the history log.
|
|
87
100
|
*/
|
|
88
101
|
select(inputs: PlannerInputs): PlannerDecision;
|
|
102
|
+
/**
|
|
103
|
+
* Deterministic gate: does this task warrant decomposition into a
|
|
104
|
+
* multi-phase workstream, or is a single-item workstream the honest
|
|
105
|
+
* answer?
|
|
106
|
+
*
|
|
107
|
+
* This calls the existing `select()` pipeline — no new scoring logic — and
|
|
108
|
+
* projects the result: `decompose` is `selected !== 'single'`. Because it
|
|
109
|
+
* goes through `select()`, the decision is appended to the same audit
|
|
110
|
+
* history as every other planner call, and `/plan explain` / `/plan
|
|
111
|
+
* status` remain authoritative for it.
|
|
112
|
+
*/
|
|
113
|
+
shouldDecompose(inputs: PlannerInputs): DecompositionGate;
|
|
114
|
+
/**
|
|
115
|
+
* Produce a typed `PlanProposal` for the given inputs.
|
|
116
|
+
*
|
|
117
|
+
* `AdaptivePlanner` never spawns a planning agent and never performs LLM
|
|
118
|
+
* decomposition itself — it only gates (via `shouldDecompose`) and
|
|
119
|
+
* validates/assembles (via `assemblePlanProposal`, in `plan-proposal.ts`).
|
|
120
|
+
* The raw decomposition, if any, is expected to come from a planning
|
|
121
|
+
* agent that the ORCHESTRATION ENGINE spawns and hands back here.
|
|
122
|
+
*
|
|
123
|
+
* - If the gate says decomposition is not warranted, or no raw
|
|
124
|
+
* decomposition is available yet, this returns the honest single-item
|
|
125
|
+
* fallback (`singleItemProposal`) — never a partially-assembled guess.
|
|
126
|
+
* - Otherwise it validates `raw` via `assemblePlanProposal`, which never
|
|
127
|
+
* throws: malformed decompositions degrade to an honest partial result
|
|
128
|
+
* plus a list of `issues`.
|
|
129
|
+
*
|
|
130
|
+
* Returns the `gate` alongside the proposal so callers (the engine, or the
|
|
131
|
+
* TUI) can show WHY a proposal was or wasn't decomposed, reusing
|
|
132
|
+
* `AdaptivePlanner.explainReasonCode`.
|
|
133
|
+
*/
|
|
134
|
+
proposeWorkstream(inputs: PlannerInputs, raw?: RawDecomposition): {
|
|
135
|
+
proposal: PlanProposal;
|
|
136
|
+
gate: DecompositionGate;
|
|
137
|
+
issues: PlanProposalIssue[];
|
|
138
|
+
};
|
|
89
139
|
/**
|
|
90
140
|
* Set the operating mode for future calls to `select()`.
|
|
91
141
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"adaptive-planner.d.ts","sourceRoot":"","sources":["../../../src/platform/core/adaptive-planner.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;
|
|
1
|
+
{"version":3,"file":"adaptive-planner.d.ts","sourceRoot":"","sources":["../../../src/platform/core/adaptive-planner.ts"],"names":[],"mappings":"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"}
|
|
@@ -10,6 +10,7 @@
|
|
|
10
10
|
* /plan override <strategy>
|
|
11
11
|
*/
|
|
12
12
|
import { logger } from '../utils/logger.js';
|
|
13
|
+
import { assemblePlanProposal, singleItemProposal, } from './plan-proposal.js';
|
|
13
14
|
/** All valid strategy names (including 'auto'). Exported for use in command handlers. */
|
|
14
15
|
export const VALID_STRATEGIES = ['auto', 'single', 'cohort', 'background', 'remote'];
|
|
15
16
|
// ---------------------------------------------------------------------------
|
|
@@ -172,6 +173,54 @@ export class AdaptivePlanner {
|
|
|
172
173
|
});
|
|
173
174
|
return decision;
|
|
174
175
|
}
|
|
176
|
+
/**
|
|
177
|
+
* Deterministic gate: does this task warrant decomposition into a
|
|
178
|
+
* multi-phase workstream, or is a single-item workstream the honest
|
|
179
|
+
* answer?
|
|
180
|
+
*
|
|
181
|
+
* This calls the existing `select()` pipeline — no new scoring logic — and
|
|
182
|
+
* projects the result: `decompose` is `selected !== 'single'`. Because it
|
|
183
|
+
* goes through `select()`, the decision is appended to the same audit
|
|
184
|
+
* history as every other planner call, and `/plan explain` / `/plan
|
|
185
|
+
* status` remain authoritative for it.
|
|
186
|
+
*/
|
|
187
|
+
shouldDecompose(inputs) {
|
|
188
|
+
const decision = this.select(inputs);
|
|
189
|
+
return {
|
|
190
|
+
decompose: decision.selected !== 'single',
|
|
191
|
+
strategy: decision.selected,
|
|
192
|
+
reasonCode: decision.reasonCode,
|
|
193
|
+
};
|
|
194
|
+
}
|
|
195
|
+
/**
|
|
196
|
+
* Produce a typed `PlanProposal` for the given inputs.
|
|
197
|
+
*
|
|
198
|
+
* `AdaptivePlanner` never spawns a planning agent and never performs LLM
|
|
199
|
+
* decomposition itself — it only gates (via `shouldDecompose`) and
|
|
200
|
+
* validates/assembles (via `assemblePlanProposal`, in `plan-proposal.ts`).
|
|
201
|
+
* The raw decomposition, if any, is expected to come from a planning
|
|
202
|
+
* agent that the ORCHESTRATION ENGINE spawns and hands back here.
|
|
203
|
+
*
|
|
204
|
+
* - If the gate says decomposition is not warranted, or no raw
|
|
205
|
+
* decomposition is available yet, this returns the honest single-item
|
|
206
|
+
* fallback (`singleItemProposal`) — never a partially-assembled guess.
|
|
207
|
+
* - Otherwise it validates `raw` via `assemblePlanProposal`, which never
|
|
208
|
+
* throws: malformed decompositions degrade to an honest partial result
|
|
209
|
+
* plus a list of `issues`.
|
|
210
|
+
*
|
|
211
|
+
* Returns the `gate` alongside the proposal so callers (the engine, or the
|
|
212
|
+
* TUI) can show WHY a proposal was or wasn't decomposed, reusing
|
|
213
|
+
* `AdaptivePlanner.explainReasonCode`.
|
|
214
|
+
*/
|
|
215
|
+
proposeWorkstream(inputs, raw) {
|
|
216
|
+
const gate = this.shouldDecompose(inputs);
|
|
217
|
+
const task = inputs.taskDescription ?? '';
|
|
218
|
+
if (gate.decompose && raw) {
|
|
219
|
+
const { proposal, issues } = assemblePlanProposal(task, gate.strategy, raw);
|
|
220
|
+
return { proposal, gate, issues };
|
|
221
|
+
}
|
|
222
|
+
return { proposal: singleItemProposal(task), gate, issues: [] };
|
|
223
|
+
}
|
|
175
224
|
/**
|
|
176
225
|
* Set the operating mode for future calls to `select()`.
|
|
177
226
|
*
|