@pellux/goodvibes-sdk 0.34.2 → 0.35.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 +4 -1
- package/dist/platform/agents/orchestrator-runner.d.ts.map +1 -1
- package/dist/platform/agents/orchestrator-runner.js +17 -3
- package/dist/platform/agents/wrfc-controller.d.ts.map +1 -1
- package/dist/platform/agents/wrfc-controller.js +10 -4
- package/dist/platform/automation/manager-runtime-delivery.d.ts +1 -1
- package/dist/platform/automation/manager-runtime-delivery.d.ts.map +1 -1
- package/dist/platform/automation/manager-runtime-delivery.js +4 -3
- package/dist/platform/channels/policy-manager.d.ts +8 -0
- package/dist/platform/channels/policy-manager.d.ts.map +1 -1
- package/dist/platform/channels/policy-manager.js +43 -1
- package/dist/platform/companion/companion-chat-manager.d.ts +1 -0
- package/dist/platform/companion/companion-chat-manager.d.ts.map +1 -1
- package/dist/platform/companion/companion-chat-manager.js +10 -0
- package/dist/platform/companion/companion-chat-routes.js +1 -0
- package/dist/platform/companion/companion-chat-types.d.ts +1 -0
- package/dist/platform/companion/companion-chat-types.d.ts.map +1 -1
- package/dist/platform/control-plane/approval-broker.d.ts +7 -0
- package/dist/platform/control-plane/approval-broker.d.ts.map +1 -1
- package/dist/platform/control-plane/approval-broker.js +30 -0
- package/dist/platform/control-plane/method-catalog-channels.d.ts.map +1 -1
- package/dist/platform/control-plane/method-catalog-channels.js +2 -0
- package/dist/platform/control-plane/method-catalog-email.d.ts.map +1 -1
- package/dist/platform/control-plane/method-catalog-email.js +1 -0
- package/dist/platform/core/compaction-sections.d.ts.map +1 -1
- package/dist/platform/core/compaction-sections.js +16 -5
- package/dist/platform/core/compaction-types.d.ts +7 -1
- package/dist/platform/core/compaction-types.d.ts.map +1 -1
- package/dist/platform/core/compaction-types.js +6 -0
- package/dist/platform/core/context-compaction.d.ts +20 -4
- package/dist/platform/core/context-compaction.d.ts.map +1 -1
- package/dist/platform/core/context-compaction.js +34 -7
- package/dist/platform/core/conversation-utils.js +1 -1
- package/dist/platform/core/conversation.js +1 -1
- package/dist/platform/core/orchestrator-turn-loop.d.ts.map +1 -1
- package/dist/platform/core/orchestrator-turn-loop.js +4 -2
- package/dist/platform/core/orchestrator.d.ts +12 -0
- package/dist/platform/core/orchestrator.d.ts.map +1 -1
- package/dist/platform/core/orchestrator.js +36 -8
- package/dist/platform/daemon/http/home-graph-routes.d.ts.map +1 -1
- package/dist/platform/daemon/http/home-graph-routes.js +2 -1
- package/dist/platform/daemon/http/project-planning-routes.d.ts.map +1 -1
- package/dist/platform/daemon/http/project-planning-routes.js +2 -1
- package/dist/platform/hooks/dispatcher.d.ts.map +1 -1
- package/dist/platform/hooks/dispatcher.js +4 -0
- package/dist/platform/hooks/runners/command.d.ts.map +1 -1
- package/dist/platform/hooks/runners/command.js +11 -2
- package/dist/platform/integrations/delivery.d.ts.map +1 -1
- package/dist/platform/integrations/delivery.js +0 -2
- package/dist/platform/intelligence/import-graph.d.ts.map +1 -1
- package/dist/platform/intelligence/import-graph.js +8 -0
- package/dist/platform/knowledge/extractors.d.ts.map +1 -1
- package/dist/platform/knowledge/extractors.js +30 -4
- package/dist/platform/mcp/client.d.ts +2 -0
- package/dist/platform/mcp/client.d.ts.map +1 -1
- package/dist/platform/mcp/client.js +17 -3
- package/dist/platform/mcp/registry.d.ts.map +1 -1
- package/dist/platform/mcp/registry.js +4 -0
- package/dist/platform/media/builtin-generation-providers.d.ts.map +1 -1
- package/dist/platform/media/builtin-generation-providers.js +2 -3
- package/dist/platform/media/provider-registry.d.ts.map +1 -1
- package/dist/platform/media/provider-registry.js +3 -1
- package/dist/platform/multimodal/service.d.ts.map +1 -1
- package/dist/platform/multimodal/service.js +18 -3
- package/dist/platform/providers/anthropic-sse-assembler.d.ts.map +1 -1
- package/dist/platform/providers/anthropic-sse-assembler.js +24 -0
- package/dist/platform/providers/capabilities.d.ts +6 -0
- package/dist/platform/providers/capabilities.d.ts.map +1 -1
- package/dist/platform/providers/capabilities.js +20 -1
- package/dist/platform/providers/gemini.d.ts.map +1 -1
- package/dist/platform/providers/gemini.js +55 -46
- package/dist/platform/providers/index.d.ts +1 -0
- package/dist/platform/providers/index.d.ts.map +1 -1
- package/dist/platform/providers/index.js +1 -0
- package/dist/platform/providers/model-limits.d.ts.map +1 -1
- package/dist/platform/providers/model-limits.js +14 -2
- package/dist/platform/runtime/store/domains/conversation.d.ts +0 -2
- package/dist/platform/runtime/store/domains/conversation.d.ts.map +1 -1
- package/dist/platform/runtime/store/domains/conversation.js +0 -1
- package/dist/platform/runtime/store/helpers/reducers/conversation.d.ts.map +1 -1
- package/dist/platform/runtime/store/helpers/reducers/conversation.js +20 -2
- package/dist/platform/runtime/store/helpers/reducers/lifecycle.d.ts.map +1 -1
- package/dist/platform/runtime/store/helpers/reducers/lifecycle.js +3 -0
- package/dist/platform/runtime/store/helpers/reducers/sync.d.ts.map +1 -1
- package/dist/platform/runtime/store/helpers/reducers/sync.js +7 -1
- package/dist/platform/runtime/ui-read-models-core.d.ts.map +1 -1
- package/dist/platform/runtime/ui-read-models-core.js +4 -1
- package/dist/platform/utils/error-display.d.ts.map +1 -1
- package/dist/platform/utils/error-display.js +14 -6
- package/dist/platform/version.js +1 -1
- package/dist/platform/voice/providers/shared.d.ts.map +1 -1
- package/dist/platform/voice/providers/shared.js +2 -3
- package/package.json +9 -9
|
@@ -39,6 +39,12 @@ export declare const DEFAULT_COMPACTION_CONFIG: CompactionConfig;
|
|
|
39
39
|
export type { SessionMemory };
|
|
40
40
|
/** Rough token estimate for a string: 4 chars ≈ 1 token. */
|
|
41
41
|
export declare function estimateTokens(text: string): number;
|
|
42
|
+
/**
|
|
43
|
+
* Rough token cost for a single image content part. Image parts carry real provider
|
|
44
|
+
* token cost (Anthropic bills up to ~1600 tokens per image) but contribute no text,
|
|
45
|
+
* so threshold and overflow estimates must not treat them as free.
|
|
46
|
+
*/
|
|
47
|
+
export declare const IMAGE_TOKEN_ESTIMATE = 1600;
|
|
42
48
|
/** All data sources needed for compaction. Accept as plain data; do not import singletons. */
|
|
43
49
|
export interface CompactionContext {
|
|
44
50
|
/** Current conversation messages (as sent to LLM — no system messages). */
|
|
@@ -55,7 +61,7 @@ export interface CompactionContext {
|
|
|
55
61
|
lineageEntries: string[];
|
|
56
62
|
/** Original task description for lineage. Set on first compaction. */
|
|
57
63
|
originalTask?: string | undefined;
|
|
58
|
-
/** Number of compactions
|
|
64
|
+
/** Number of compactions already recorded before this one (excludes the in-flight compaction). */
|
|
59
65
|
compactionCount: number;
|
|
60
66
|
/** Context window size for the current model (used for threshold scaling). */
|
|
61
67
|
contextWindow: number;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"compaction-types.d.ts","sourceRoot":"","sources":["../../../src/platform/core/compaction-types.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AACjE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AACzD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAMzD,yCAAyC;AACzC,MAAM,WAAW,iBAAiB;IAChC,kFAAkF;IAClF,EAAE,EAAE,MAAM,CAAC;IACX,0FAA0F;IAC1F,MAAM,EAAE,MAAM,CAAC;IACf,qCAAqC;IACrC,OAAO,EAAE,MAAM,CAAC;IAChB,8CAA8C;IAC9C,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,6DAA6D;AAC7D,MAAM,WAAW,gBAAgB;IAC/B,iEAAiE;IACjE,wBAAwB,EAAE,MAAM,CAAC;IACjC,2DAA2D;IAC3D,iBAAiB,EAAE,MAAM,CAAC;IAC1B,2DAA2D;IAC3D,mBAAmB,EAAE,MAAM,CAAC;IAC5B,yDAAyD;IACzD,uBAAuB,EAAE,MAAM,CAAC;IAChC,+DAA+D;IAC/D,sBAAsB,EAAE,MAAM,CAAC;IAC/B,mEAAmE;IACnE,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,wCAAwC;AACxC,eAAO,MAAM,yBAAyB,EAAE,gBAOvC,CAAC;AAMF,YAAY,EAAE,aAAa,EAAE,CAAC;AAM9B,4DAA4D;AAC5D,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEnD;
|
|
1
|
+
{"version":3,"file":"compaction-types.d.ts","sourceRoot":"","sources":["../../../src/platform/core/compaction-types.ts"],"names":[],"mappings":"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"}
|
|
@@ -19,3 +19,9 @@ export const DEFAULT_COMPACTION_CONFIG = {
|
|
|
19
19
|
export function estimateTokens(text) {
|
|
20
20
|
return Math.ceil(text.length / 4);
|
|
21
21
|
}
|
|
22
|
+
/**
|
|
23
|
+
* Rough token cost for a single image content part. Image parts carry real provider
|
|
24
|
+
* token cost (Anthropic bills up to ~1600 tokens per image) but contribute no text,
|
|
25
|
+
* so threshold and overflow estimates must not treat them as free.
|
|
26
|
+
*/
|
|
27
|
+
export const IMAGE_TOKEN_ESTIMATE = 1600;
|
|
@@ -33,7 +33,10 @@ export interface AutoCompactOptions {
|
|
|
33
33
|
contextWindow: number;
|
|
34
34
|
/** Whether auto-compact is already in progress (prevent re-entry). */
|
|
35
35
|
isCompacting: boolean;
|
|
36
|
-
/**
|
|
36
|
+
/**
|
|
37
|
+
* Usage percentage that triggers compaction. Defaults to 80. Set to 0 to disable
|
|
38
|
+
* the percentage trigger; the safety buffer still applies as an independent backstop.
|
|
39
|
+
*/
|
|
37
40
|
thresholdPercent?: number | undefined;
|
|
38
41
|
/** Remaining-token safety buffer that also triggers compaction. Defaults to 15000. */
|
|
39
42
|
minRemainingTokens?: number | undefined;
|
|
@@ -50,11 +53,24 @@ export interface AutoCompactDecision {
|
|
|
50
53
|
readonly safetyBufferTokens: number;
|
|
51
54
|
}
|
|
52
55
|
/**
|
|
53
|
-
*
|
|
54
|
-
*
|
|
55
|
-
*
|
|
56
|
+
* Default remaining-token safety buffer for auto-compaction. Acts as a backstop:
|
|
57
|
+
* compaction triggers when the remaining context drops below this buffer. 15k gives
|
|
58
|
+
* room for the ~6.5k compaction output + LLM extraction calls on large windows.
|
|
59
|
+
* The effective buffer is capped at SAFETY_BUFFER_MAX_WINDOW_FRACTION of the context
|
|
60
|
+
* window (see getAutoCompactDecision) so it scales down on small/medium windows instead
|
|
61
|
+
* of forcing near-constant compaction, while remaining an independent backstop on large windows.
|
|
56
62
|
*/
|
|
57
63
|
export declare const COMPACTION_BUFFER_TOKENS = 15000;
|
|
64
|
+
/**
|
|
65
|
+
* The remaining-token safety buffer is capped at this fraction of the context
|
|
66
|
+
* window. A fixed token buffer (COMPACTION_BUFFER_TOKENS) must not reserve an
|
|
67
|
+
* outsized share of small/medium windows, so the effective buffer is the lesser
|
|
68
|
+
* of the configured buffer and this fraction of the window. On a 128k window the
|
|
69
|
+
* full buffer applies (128k * 0.125 = 16k >= 15k); on smaller windows it scales
|
|
70
|
+
* down so the backstop fires near the window edge rather than on near-empty
|
|
71
|
+
* conversations, while still firing independently of high percentage thresholds.
|
|
72
|
+
*/
|
|
73
|
+
export declare const SAFETY_BUFFER_MAX_WINDOW_FRACTION = 0.125;
|
|
58
74
|
export declare const DEFAULT_AUTO_COMPACT_THRESHOLD_PERCENT = 80;
|
|
59
75
|
/**
|
|
60
76
|
* Context windows smaller than this use simplified compaction (summarize last N messages)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"context-compaction.d.ts","sourceRoot":"","sources":["../../../src/platform/core/context-compaction.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAEH,OAAO,KAAK,EAAE,eAAe,EAA4B,MAAM,2BAA2B,CAAC;AAC3F,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAEjE,OAAO,KAAK,EAEV,iBAAiB,EACjB,gBAAgB,EAChB,eAAe,EAEhB,MAAM,uBAAuB,CAAC;AAoB/B,YAAY,EAAE,eAAe,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAElG,MAAM,WAAW,kBAAkB;IACjC,wDAAwD;IACxD,aAAa,EAAE,MAAM,CAAC;IACtB,oDAAoD;IACpD,aAAa,EAAE,MAAM,CAAC;IACtB,sEAAsE;IACtE,YAAY,EAAE,OAAO,CAAC;IACtB
|
|
1
|
+
{"version":3,"file":"context-compaction.d.ts","sourceRoot":"","sources":["../../../src/platform/core/context-compaction.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAEH,OAAO,KAAK,EAAE,eAAe,EAA4B,MAAM,2BAA2B,CAAC;AAC3F,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAEjE,OAAO,KAAK,EAEV,iBAAiB,EACjB,gBAAgB,EAChB,eAAe,EAEhB,MAAM,uBAAuB,CAAC;AAoB/B,YAAY,EAAE,eAAe,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAElG,MAAM,WAAW,kBAAkB;IACjC,wDAAwD;IACxD,aAAa,EAAE,MAAM,CAAC;IACtB,oDAAoD;IACpD,aAAa,EAAE,MAAM,CAAC;IACtB,sEAAsE;IACtE,YAAY,EAAE,OAAO,CAAC;IACtB;;;OAGG;IACH,gBAAgB,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACtC,sFAAsF;IACtF,kBAAkB,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CACzC;AAED,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,aAAa,EAAE,OAAO,CAAC;IAChC,QAAQ,CAAC,MAAM,EAAE,WAAW,GAAG,eAAe,GAAG,IAAI,CAAC;IACtD,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,kBAAkB,EAAE,MAAM,CAAC;CACrC;AAMD;;;;;;;GAOG;AACH,eAAO,MAAM,wBAAwB,QAAS,CAAC;AAC/C;;;;;;;;GAQG;AACH,eAAO,MAAM,iCAAiC,QAAQ,CAAC;AACvD,eAAO,MAAM,sCAAsC,KAAK,CAAC;AAEzD;;;GAGG;AACH,eAAO,MAAM,sBAAsB,QAAS,CAAC;AAQ7C,wBAAgB,mBAAmB,IAAI,SAAS,eAAe,EAAE,CAEhE;AAED,wBAAgB,sBAAsB,IAAI,eAAe,GAAG,IAAI,CAI/D;AAMD,0EAA0E;AAC1E,wBAAgB,0BAA0B,CAAC,QAAQ,EAAE,eAAe,EAAE,GAAG,MAAM,CAgB9E;AAED,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAYvD,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,kBAAkB,GAAG,mBAAmB,CA2CpF;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,kBAAkB,GAAG,OAAO,CAEnE;AAMD;;;;;;;;GAQG;AACH,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,eAAe,EAAE,EAC3B,UAAU,SAAK,GACd,eAAe,EAAE,CAanB;AAqHD;;GAEG;AACH,wBAAsB,eAAe,CACnC,GAAG,EAAE,iBAAiB,EACtB,QAAQ,EAAE,gBAAgB,GACzB,OAAO,CAAC,gBAAgB,CAAC,CAE3B;AA0OD;;;;GAIG;AACH,wBAAsB,eAAe,CACnC,QAAQ,EAAE,kBAAkB,EAC5B,GAAG,EAAE,iBAAiB,EACtB,QAAQ,EAAE,gBAAgB,GACzB,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC,CAOlC"}
|
|
@@ -23,7 +23,7 @@
|
|
|
23
23
|
* getLastCompactionEvent() — return most recent compaction event
|
|
24
24
|
*/
|
|
25
25
|
import { logger } from '../utils/logger.js';
|
|
26
|
-
import { DEFAULT_COMPACTION_CONFIG, estimateTokens } from './compaction-types.js';
|
|
26
|
+
import { DEFAULT_COMPACTION_CONFIG, IMAGE_TOKEN_ESTIMATE, estimateTokens } from './compaction-types.js';
|
|
27
27
|
import { summarizeError } from '../utils/error-display.js';
|
|
28
28
|
import { buildHandoffHeader, buildSessionMemories, buildCurrentTask, buildRunningAgents, gatherRecentConversation, buildConversationFilterPrompt, buildToolResultsPrompt, buildAgentActivityTable, buildOlderAgentSummaryPrompt, buildResolvedProblemsPrompt, buildPlanProgress, buildSessionLineage, extractText, } from './compaction-sections.js';
|
|
29
29
|
import { isActiveAgent } from '../tools/agent/predicates.js';
|
|
@@ -31,11 +31,24 @@ import { isActiveAgent } from '../tools/agent/predicates.js';
|
|
|
31
31
|
// Compaction trigger constants
|
|
32
32
|
// ---------------------------------------------------------------------------
|
|
33
33
|
/**
|
|
34
|
-
*
|
|
35
|
-
*
|
|
36
|
-
*
|
|
34
|
+
* Default remaining-token safety buffer for auto-compaction. Acts as a backstop:
|
|
35
|
+
* compaction triggers when the remaining context drops below this buffer. 15k gives
|
|
36
|
+
* room for the ~6.5k compaction output + LLM extraction calls on large windows.
|
|
37
|
+
* The effective buffer is capped at SAFETY_BUFFER_MAX_WINDOW_FRACTION of the context
|
|
38
|
+
* window (see getAutoCompactDecision) so it scales down on small/medium windows instead
|
|
39
|
+
* of forcing near-constant compaction, while remaining an independent backstop on large windows.
|
|
37
40
|
*/
|
|
38
41
|
export const COMPACTION_BUFFER_TOKENS = 15_000;
|
|
42
|
+
/**
|
|
43
|
+
* The remaining-token safety buffer is capped at this fraction of the context
|
|
44
|
+
* window. A fixed token buffer (COMPACTION_BUFFER_TOKENS) must not reserve an
|
|
45
|
+
* outsized share of small/medium windows, so the effective buffer is the lesser
|
|
46
|
+
* of the configured buffer and this fraction of the window. On a 128k window the
|
|
47
|
+
* full buffer applies (128k * 0.125 = 16k >= 15k); on smaller windows it scales
|
|
48
|
+
* down so the backstop fires near the window edge rather than on near-empty
|
|
49
|
+
* conversations, while still firing independently of high percentage thresholds.
|
|
50
|
+
*/
|
|
51
|
+
export const SAFETY_BUFFER_MAX_WINDOW_FRACTION = 0.125;
|
|
39
52
|
export const DEFAULT_AUTO_COMPACT_THRESHOLD_PERCENT = 80;
|
|
40
53
|
/**
|
|
41
54
|
* Context windows smaller than this use simplified compaction (summarize last N messages)
|
|
@@ -69,6 +82,9 @@ export function estimateConversationTokens(messages) {
|
|
|
69
82
|
if (part.type === 'text') {
|
|
70
83
|
total += estimateTokens(part.text);
|
|
71
84
|
}
|
|
85
|
+
else if (part.type === 'image') {
|
|
86
|
+
total += IMAGE_TOKEN_ESTIMATE;
|
|
87
|
+
}
|
|
72
88
|
}
|
|
73
89
|
}
|
|
74
90
|
}
|
|
@@ -93,12 +109,23 @@ export function getAutoCompactDecision(opts) {
|
|
|
93
109
|
const usagePct = contextWindow > 0 ? (currentTokens / contextWindow) * 100 : 0;
|
|
94
110
|
const thresholdTokens = contextWindow > 0 ? Math.floor((contextWindow * thresholdPercent) / 100) : 0;
|
|
95
111
|
const remainingTokens = Math.max(0, contextWindow - currentTokens);
|
|
112
|
+
// Scale the flat safety buffer to the window so a fixed token buffer never
|
|
113
|
+
// reserves an outsized share of small/medium windows. A flat 15k buffer would
|
|
114
|
+
// trip a 20k window at ~25% usage, and would fire on every request — even an
|
|
115
|
+
// empty conversation — for any window at or below the buffer size. Capping the
|
|
116
|
+
// buffer at a fraction of the window keeps the full configured buffer on large
|
|
117
|
+
// windows (e.g. 128k) while scaling it down on small ones, WITHOUT collapsing
|
|
118
|
+
// the backstop for high (or disabled) percentage thresholds, where the buffer
|
|
119
|
+
// is the only thing standing between usage and the window edge. (Clamping to
|
|
120
|
+
// the threshold headroom instead would make the buffer fire no earlier than the
|
|
121
|
+
// threshold itself, nullifying it as an independent backstop.)
|
|
122
|
+
const effectiveBuffer = Math.min(safetyBufferTokens, Math.floor(contextWindow * SAFETY_BUFFER_MAX_WINDOW_FRACTION));
|
|
96
123
|
let reason = null;
|
|
97
|
-
if (!opts.isCompacting && contextWindow > 0
|
|
98
|
-
if (currentTokens >= thresholdTokens) {
|
|
124
|
+
if (!opts.isCompacting && contextWindow > 0) {
|
|
125
|
+
if (thresholdPercent > 0 && currentTokens >= thresholdTokens) {
|
|
99
126
|
reason = 'threshold';
|
|
100
127
|
}
|
|
101
|
-
else if (remainingTokens <=
|
|
128
|
+
else if (currentTokens > 0 && effectiveBuffer > 0 && remainingTokens <= effectiveBuffer) {
|
|
102
129
|
reason = 'safety-buffer';
|
|
103
130
|
}
|
|
104
131
|
}
|
|
@@ -298,7 +298,7 @@ export class ConversationManager {
|
|
|
298
298
|
};
|
|
299
299
|
}
|
|
300
300
|
fromJSON(data) {
|
|
301
|
-
this.messages = data.messages ?? [];
|
|
301
|
+
this.messages = cloneMessages(data.messages ?? []);
|
|
302
302
|
this._title = typeof data.title === 'string' ? data.title : '';
|
|
303
303
|
this._titleSource = data.titleSource === 'user' || data.titleSource === 'system'
|
|
304
304
|
? data.titleSource
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"orchestrator-turn-loop.d.ts","sourceRoot":"","sources":["../../../src/platform/core/orchestrator-turn-loop.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"orchestrator-turn-loop.d.ts","sourceRoot":"","sources":["../../../src/platform/core/orchestrator-turn-loop.ts"],"names":[],"mappings":"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"}
|
|
@@ -179,7 +179,9 @@ export async function executeOrchestratorTurnLoop(context) {
|
|
|
179
179
|
...response,
|
|
180
180
|
usage: context.normalizeUsage(response.usage),
|
|
181
181
|
};
|
|
182
|
-
void context.favoritesStore?.recordUsage(model.registryKey)
|
|
182
|
+
void context.favoritesStore?.recordUsage(model.registryKey).catch((err) => logger.warn('favoritesStore.recordUsage failed', {
|
|
183
|
+
error: err instanceof Error ? err.message : String(err),
|
|
184
|
+
}));
|
|
183
185
|
context.usage.input += response.usage.inputTokens;
|
|
184
186
|
context.usage.output += response.usage.outputTokens;
|
|
185
187
|
context.usage.cacheRead += response.usage.cacheReadTokens ?? 0;
|
|
@@ -297,7 +299,7 @@ export async function executeOrchestratorTurnLoop(context) {
|
|
|
297
299
|
});
|
|
298
300
|
}
|
|
299
301
|
context.markTurnFailed();
|
|
300
|
-
|
|
302
|
+
break;
|
|
301
303
|
}
|
|
302
304
|
else if (breakerResult === 'warn') {
|
|
303
305
|
context.conversation.addSystemMessage(`WARNING: You have made ${circuitBreaker.consecutiveErrors} consecutive tool calls that ALL failed. `
|
|
@@ -216,6 +216,18 @@ export declare class Orchestrator {
|
|
|
216
216
|
* @param options - Optional origin metadata for external surfaces.
|
|
217
217
|
*/
|
|
218
218
|
handleUserInput(text: string, content?: ContentPart[], options?: OrchestratorUserInputOptions | undefined): Promise<void>;
|
|
219
|
+
/**
|
|
220
|
+
* Drain queued user messages sequentially. Skips draining while a turn is in
|
|
221
|
+
* flight or a background auto-compaction is running; in the latter case
|
|
222
|
+
* setCompacting() re-triggers the drain once compaction settles, so no queued
|
|
223
|
+
* message is lost.
|
|
224
|
+
*/
|
|
225
|
+
private drainMessageQueue;
|
|
226
|
+
/**
|
|
227
|
+
* Single funnel for mutating the compaction flag. On the true->false edge it
|
|
228
|
+
* resumes draining any messages that were queued while compaction was in flight.
|
|
229
|
+
*/
|
|
230
|
+
private setCompacting;
|
|
219
231
|
private startThinking;
|
|
220
232
|
private stopThinking;
|
|
221
233
|
private runTurn;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"orchestrator.d.ts","sourceRoot":"","sources":["../../../src/platform/core/orchestrator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAC7D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAGzD,OAAO,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAG/D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAG7D,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AACnE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"orchestrator.d.ts","sourceRoot":"","sources":["../../../src/platform/core/orchestrator.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,9 +1,7 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { ProviderError, isNonTransientProviderFailure } from '../types/errors.js';
|
|
2
2
|
import { formatError, summarizeError } from '../utils/error-display.js';
|
|
3
3
|
import { notifyCompletion } from '../utils/notify.js';
|
|
4
4
|
import { logger } from '../utils/logger.js';
|
|
5
|
-
import { ConsecutiveErrorBreaker } from './circuit-breaker.js';
|
|
6
|
-
import { classifyIntent } from './intent-classifier.js';
|
|
7
5
|
import { estimateConversationTokens } from './context-compaction.js';
|
|
8
6
|
import { SessionLineageTracker } from './session-lineage.js';
|
|
9
7
|
import { EventReplayQueue } from './event-replay.js';
|
|
@@ -315,13 +313,39 @@ export class Orchestrator {
|
|
|
315
313
|
// Set the original task on the first user message (idempotent — subsequent calls are no-ops)
|
|
316
314
|
getSessionLineageTracker(this.coreServices, this.ownedSessionLineageTracker).setOriginalTask(text.slice(0, 200));
|
|
317
315
|
await this.runTurn(text, content, options);
|
|
318
|
-
// Process any messages queued while the LLM was thinking
|
|
319
|
-
while
|
|
316
|
+
// Process any messages queued while the LLM was thinking. Draining is gated on
|
|
317
|
+
// isCompacting so a queued turn cannot start while a background auto-compaction is
|
|
318
|
+
// mid-flight (which would let compact() replace the message array and drop the
|
|
319
|
+
// in-flight turn's freshly appended messages). Messages left queued during
|
|
320
|
+
// compaction are drained by setCompacting() once compaction settles.
|
|
321
|
+
await this.drainMessageQueue();
|
|
322
|
+
}
|
|
323
|
+
/**
|
|
324
|
+
* Drain queued user messages sequentially. Skips draining while a turn is in
|
|
325
|
+
* flight or a background auto-compaction is running; in the latter case
|
|
326
|
+
* setCompacting() re-triggers the drain once compaction settles, so no queued
|
|
327
|
+
* message is lost.
|
|
328
|
+
*/
|
|
329
|
+
async drainMessageQueue() {
|
|
330
|
+
while (this.messageQueue.length > 0 && !this.isThinking && !this.isCompacting) {
|
|
320
331
|
const next = this.messageQueue.shift();
|
|
321
332
|
await this.runTurn(next.text, next.content, next.options);
|
|
322
333
|
}
|
|
323
334
|
this.followUpRuntime.scheduleFlush();
|
|
324
335
|
}
|
|
336
|
+
/**
|
|
337
|
+
* Single funnel for mutating the compaction flag. On the true->false edge it
|
|
338
|
+
* resumes draining any messages that were queued while compaction was in flight.
|
|
339
|
+
*/
|
|
340
|
+
setCompacting(value) {
|
|
341
|
+
const wasCompacting = this.isCompacting;
|
|
342
|
+
this.isCompacting = value;
|
|
343
|
+
if (wasCompacting && !value && !this.isThinking && this.messageQueue.length > 0) {
|
|
344
|
+
void this.drainMessageQueue().catch((err) => logger.error('Orchestrator: queued message drain after compaction failed', {
|
|
345
|
+
error: err instanceof Error ? err.message : String(err),
|
|
346
|
+
}));
|
|
347
|
+
}
|
|
348
|
+
}
|
|
325
349
|
startThinking(estimatedInputTokens) {
|
|
326
350
|
this.isThinking = true;
|
|
327
351
|
this.thinkingFrame = 0; // Reset each turn so gradient starts clean and frame never grows unbounded
|
|
@@ -469,7 +493,11 @@ export class Orchestrator {
|
|
|
469
493
|
getMessageQueueLength: () => this.messageQueue.length,
|
|
470
494
|
isReconciliationEnabled: () => this.isReconciliationEnabled(),
|
|
471
495
|
setPendingToolCalls: (calls) => { this._pendingToolCalls = calls; },
|
|
472
|
-
setAutoSpawnTimeout: (timeout) => {
|
|
496
|
+
setAutoSpawnTimeout: (timeout) => {
|
|
497
|
+
if (this.autoSpawnTimeout !== null)
|
|
498
|
+
clearTimeout(this.autoSpawnTimeout);
|
|
499
|
+
this.autoSpawnTimeout = timeout;
|
|
500
|
+
},
|
|
473
501
|
setStreamingActive: (value) => { this.isStreaming = value; },
|
|
474
502
|
setStreamingInputTokens: (value) => { this.streamingInputTokens = value; },
|
|
475
503
|
addStreamingOutputTokens: (value) => { this.streamingOutputTokens += value; },
|
|
@@ -496,7 +524,7 @@ export class Orchestrator {
|
|
|
496
524
|
sessionId: this.sessionId,
|
|
497
525
|
requestRender: this.requestRender,
|
|
498
526
|
isCompacting: this.isCompacting,
|
|
499
|
-
setIsCompacting: (value) => { this.
|
|
527
|
+
setIsCompacting: (value) => { this.setCompacting(value); },
|
|
500
528
|
lastWarningBracket: this.lastWarningBracket,
|
|
501
529
|
setLastWarningBracket: (value) => { this.lastWarningBracket = value; },
|
|
502
530
|
}, turnId, this.lastInputTokens);
|
|
@@ -629,7 +657,7 @@ export class Orchestrator {
|
|
|
629
657
|
runtimeBus: this.runtimeBus,
|
|
630
658
|
emitterContext: (id) => createEmitterContext(this.sessionId, id),
|
|
631
659
|
isCompacting: this.isCompacting,
|
|
632
|
-
setIsCompacting: (value) => { this.
|
|
660
|
+
setIsCompacting: (value) => { this.setCompacting(value); },
|
|
633
661
|
}, turnId, model);
|
|
634
662
|
}
|
|
635
663
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"home-graph-routes.d.ts","sourceRoot":"","sources":["../../../../src/platform/daemon/http/home-graph-routes.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AACjE,OAAO,EAGL,KAAK,uBAAuB,EAC7B,MAAM,8BAA8B,CAAC;
|
|
1
|
+
{"version":3,"file":"home-graph-routes.d.ts","sourceRoot":"","sources":["../../../../src/platform/daemon/http/home-graph-routes.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AACjE,OAAO,EAGL,KAAK,uBAAuB,EAC7B,MAAM,8BAA8B,CAAC;AAgBtC,KAAK,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAE1C,UAAU,qBAAqB;IAC7B,QAAQ,CAAC,aAAa,EAAE,uBAAuB,CAAC;IAChD,QAAQ,CAAC,gBAAgB,EAAE,gBAAgB,CAAC;IAC5C,QAAQ,CAAC,aAAa,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,OAAO,CAAC,UAAU,GAAG,QAAQ,CAAC,CAAC;IACzE,QAAQ,CAAC,qBAAqB,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,OAAO,CAAC,UAAU,GAAG,IAAI,GAAG,QAAQ,CAAC,CAAC;IACxF,QAAQ,CAAC,YAAY,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,QAAQ,GAAG,IAAI,CAAC;CAC1D;AAED,qBAAa,eAAe;IACd,OAAO,CAAC,QAAQ,CAAC,OAAO;gBAAP,OAAO,EAAE,qBAAqB;IAErD,MAAM,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC;YAqJtC,KAAK;YAML,QAAQ;YAMR,gBAAgB;CAK/B"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { createArtifactFromUploadRequest, isArtifactUploadRequest, } from '@pellux/goodvibes-daemon-sdk';
|
|
2
|
+
import { jsonErrorResponse } from './error-response.js';
|
|
2
3
|
import { readBoundedPositiveInteger, readOptionalBoundedInteger } from './route-helpers.js';
|
|
3
4
|
export class HomeGraphRoutes {
|
|
4
5
|
context;
|
|
@@ -153,7 +154,7 @@ export class HomeGraphRoutes {
|
|
|
153
154
|
return Response.json({ error: 'Unknown Home Graph route' }, { status: 404 });
|
|
154
155
|
}
|
|
155
156
|
catch (error) {
|
|
156
|
-
return
|
|
157
|
+
return jsonErrorResponse(error, { status: 400 });
|
|
157
158
|
}
|
|
158
159
|
}
|
|
159
160
|
async admin(req, fn) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"project-planning-routes.d.ts","sourceRoot":"","sources":["../../../../src/platform/daemon/http/project-planning-routes.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAIV,sBAAsB,EAUvB,MAAM,0BAA0B,CAAC;
|
|
1
|
+
{"version":3,"file":"project-planning-routes.d.ts","sourceRoot":"","sources":["../../../../src/platform/daemon/http/project-planning-routes.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAIV,sBAAsB,EAUvB,MAAM,0BAA0B,CAAC;AAGlC,KAAK,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAE1C,UAAU,2BAA2B;IACnC,QAAQ,CAAC,sBAAsB,EAAE,sBAAsB,CAAC;IACxD,QAAQ,CAAC,aAAa,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,OAAO,CAAC,UAAU,GAAG,QAAQ,CAAC,CAAC;IACzE,QAAQ,CAAC,qBAAqB,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,OAAO,CAAC,UAAU,GAAG,IAAI,GAAG,QAAQ,CAAC,CAAC;IACxF,QAAQ,CAAC,YAAY,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,QAAQ,GAAG,IAAI,CAAC;CAC1D;AAED,qBAAa,qBAAqB;IACpB,OAAO,CAAC,QAAQ,CAAC,OAAO;gBAAP,OAAO,EAAE,2BAA2B;IAE3D,MAAM,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC;YA8GtC,KAAK;YAML,QAAQ;YAMR,gBAAgB;CAK/B"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { jsonErrorResponse } from './error-response.js';
|
|
1
2
|
export class ProjectPlanningRoutes {
|
|
2
3
|
context;
|
|
3
4
|
constructor(context) {
|
|
@@ -93,7 +94,7 @@ export class ProjectPlanningRoutes {
|
|
|
93
94
|
return Response.json({ error: 'Unknown project planning route' }, { status: 404 });
|
|
94
95
|
}
|
|
95
96
|
catch (error) {
|
|
96
|
-
return
|
|
97
|
+
return jsonErrorResponse(error, { status: 400 });
|
|
97
98
|
}
|
|
98
99
|
}
|
|
99
100
|
async admin(req, fn) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dispatcher.d.ts","sourceRoot":"","sources":["../../../src/platform/hooks/dispatcher.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,SAAS,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAGnF,OAAO,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AAGpD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AAOrD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,iCAAiC,CAAC;AAG1E,KAAK,cAAc,GAAG;IACpB,QAAQ,CAAC,YAAY,CAAC,EAAE,IAAI,CAAC,YAAY,EAAE,OAAO,GAAG,WAAW,GAAG,QAAQ,CAAC,GAAG,SAAS,CAAC;IACzF,QAAQ,CAAC,OAAO,CAAC,EAAE,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,GAAG,SAAS,CAAC;IACrD,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAC3C,CAAC;AAgCF,qBAAa,cAAc;IACzB,OAAO,CAAC,KAAK,CAAuC;IACpD,OAAO,CAAC,MAAM,CAAmB;IACjC,OAAO,CAAC,cAAc,CAAmC;IACzD,OAAO,CAAC,kBAAkB,CAAuB;IACjD,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAiB;IAC5C,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAsB;gBAE1C,UAAU,GAAE,cAAmB,EAAE,eAAe,GAAE,mBAA+C;IAK7G,mFAAmF;IACnF,iBAAiB,CAAC,EAAE,EAAE,kBAAkB,GAAG,IAAI,GAAG,IAAI;IAItD,sCAAsC;IACtC,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IAmGpC,uCAAuC;IACvC,QAAQ,CAAC,YAAY,EAAE,MAAM,EAAE,IAAI,EAAE,cAAc,GAAG,IAAI;IAS1D,wCAAwC;IACxC,aAAa,CAAC,KAAK,EAAE,SAAS,GAAG,IAAI;IAIrC;;;;;;;;;OASG;IACG,IAAI,CAAC,KAAK,EAAE,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"dispatcher.d.ts","sourceRoot":"","sources":["../../../src/platform/hooks/dispatcher.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,SAAS,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAGnF,OAAO,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AAGpD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AAOrD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,iCAAiC,CAAC;AAG1E,KAAK,cAAc,GAAG;IACpB,QAAQ,CAAC,YAAY,CAAC,EAAE,IAAI,CAAC,YAAY,EAAE,OAAO,GAAG,WAAW,GAAG,QAAQ,CAAC,GAAG,SAAS,CAAC;IACzF,QAAQ,CAAC,OAAO,CAAC,EAAE,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,GAAG,SAAS,CAAC;IACrD,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAC3C,CAAC;AAgCF,qBAAa,cAAc;IACzB,OAAO,CAAC,KAAK,CAAuC;IACpD,OAAO,CAAC,MAAM,CAAmB;IACjC,OAAO,CAAC,cAAc,CAAmC;IACzD,OAAO,CAAC,kBAAkB,CAAuB;IACjD,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAiB;IAC5C,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAsB;gBAE1C,UAAU,GAAE,cAAmB,EAAE,eAAe,GAAE,mBAA+C;IAK7G,mFAAmF;IACnF,iBAAiB,CAAC,EAAE,EAAE,kBAAkB,GAAG,IAAI,GAAG,IAAI;IAItD,sCAAsC;IACtC,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IAmGpC,uCAAuC;IACvC,QAAQ,CAAC,YAAY,EAAE,MAAM,EAAE,IAAI,EAAE,cAAc,GAAG,IAAI;IAS1D,wCAAwC;IACxC,aAAa,CAAC,KAAK,EAAE,SAAS,GAAG,IAAI;IAIrC;;;;;;;;;OASG;IACG,IAAI,CAAC,KAAK,EAAE,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC;IAkJjD,0DAA0D;IAC1D,QAAQ,IAAI,GAAG,CAAC,MAAM,EAAE,cAAc,EAAE,CAAC;IAIzC,gCAAgC;IAChC,SAAS,IAAI,SAAS,EAAE;IAIxB,qCAAqC;IACrC,KAAK,IAAI,IAAI;IAKb;;OAEG;IACH,SAAS,IAAI,KAAK,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,cAAc,CAAA;KAAE,CAAC;IAU7D;;;OAGG;IACH,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAYjC;;;OAGG;IACH,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAYlC;;;OAGG;IACH,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;CAWlC"}
|
|
@@ -175,6 +175,10 @@ export class HookDispatcher {
|
|
|
175
175
|
for (const [pattern, defs] of this.hooks.entries()) {
|
|
176
176
|
if (matchesEventPath(pattern, event.path)) {
|
|
177
177
|
for (const hook of defs) {
|
|
178
|
+
// Skip hooks explicitly disabled via disableHook() or `enabled: false`
|
|
179
|
+
// in hooks.json. Strict === false preserves the default (undefined = enabled).
|
|
180
|
+
if (hook.enabled === false)
|
|
181
|
+
continue;
|
|
178
182
|
const specificValue = event.specific;
|
|
179
183
|
if (matchesMatcher(hook.matcher, specificValue)) {
|
|
180
184
|
matchingEntries.push({ pattern, hook });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"command.d.ts","sourceRoot":"","sources":["../../../../src/platform/hooks/runners/command.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AACH,OAAO,KAAK,EAAE,cAAc,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAIzE;;;;GAIG;AACH,wBAAsB,GAAG,CAAC,IAAI,EAAE,cAAc,EAAE,KAAK,EAAE,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,
|
|
1
|
+
{"version":3,"file":"command.d.ts","sourceRoot":"","sources":["../../../../src/platform/hooks/runners/command.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AACH,OAAO,KAAK,EAAE,cAAc,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAIzE;;;;GAIG;AACH,wBAAsB,GAAG,CAAC,IAAI,EAAE,cAAc,EAAE,KAAK,EAAE,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,CAgFrF"}
|
|
@@ -27,6 +27,12 @@ export async function run(hook, event) {
|
|
|
27
27
|
killHookProcess(proc, command, 'timeout');
|
|
28
28
|
}, timeoutMs);
|
|
29
29
|
timer.unref?.();
|
|
30
|
+
// Start draining stdout/stderr concurrently with the exit wait. If we only
|
|
31
|
+
// read after exit, a hook that writes more than the OS pipe buffer (~64KB)
|
|
32
|
+
// blocks on write — the child never exits and `await proc.exited` deadlocks
|
|
33
|
+
// until the timeout kills it, discarding the hook's intended output.
|
|
34
|
+
const stdoutPromise = new Response(proc.stdout).text();
|
|
35
|
+
const stderrPromise = new Response(proc.stderr).text();
|
|
30
36
|
let exitCode;
|
|
31
37
|
try {
|
|
32
38
|
exitCode = await proc.exited;
|
|
@@ -35,10 +41,13 @@ export async function run(hook, event) {
|
|
|
35
41
|
catch (err) {
|
|
36
42
|
clearTimeout(timer);
|
|
37
43
|
killHookProcess(proc, command, 'spawn error');
|
|
44
|
+
// We're abandoning the drains on this path; settle them with a no-op
|
|
45
|
+
// catch so a stream rejection can't surface as an unhandled rejection.
|
|
46
|
+
void stdoutPromise.catch(() => { });
|
|
47
|
+
void stderrPromise.catch(() => { });
|
|
38
48
|
throw err;
|
|
39
49
|
}
|
|
40
|
-
const stdout = await
|
|
41
|
-
const stderr = await new Response(proc.stderr).text();
|
|
50
|
+
const [stdout, stderr] = await Promise.all([stdoutPromise, stderrPromise]);
|
|
42
51
|
if (exitCode !== 0) {
|
|
43
52
|
logger.error('command hook exited with non-zero code', {
|
|
44
53
|
command,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"delivery.d.ts","sourceRoot":"","sources":["../../../src/platform/integrations/delivery.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"delivery.d.ts","sourceRoot":"","sources":["../../../src/platform/integrations/delivery.ts"],"names":[],"mappings":"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"}
|
|
@@ -204,8 +204,6 @@ export class DeliveryQueue {
|
|
|
204
204
|
try {
|
|
205
205
|
await entry.deliver();
|
|
206
206
|
this._delivered += 1;
|
|
207
|
-
if (entry.attempts > 1)
|
|
208
|
-
this._retrying = Math.max(0, this._retrying - 1);
|
|
209
207
|
this._pending.delete(entry.id);
|
|
210
208
|
logger.debug('DeliveryQueue: delivered', {
|
|
211
209
|
channel: entry.channel,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"import-graph.d.ts","sourceRoot":"","sources":["../../../src/platform/intelligence/import-graph.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAWH,2DAA2D;AAC3D,MAAM,MAAM,aAAa,GAAG,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC;AAErD,uDAAuD;AACvD,MAAM,MAAM,UAAU,GAAG,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"import-graph.d.ts","sourceRoot":"","sources":["../../../src/platform/intelligence/import-graph.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAWH,2DAA2D;AAC3D,MAAM,MAAM,aAAa,GAAG,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC;AAErD,uDAAuD;AACvD,MAAM,MAAM,UAAU,GAAG,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC;AA8BlD;;;GAGG;AACH,iBAAS,yBAAyB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,CAa5D;AAED,eAAO,MAAM,gCAAgC,kCAA4B,CAAC;AAiD1E,wBAAgB,uBAAuB,CACrC,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,EACZ,UAAU,EAAE,QAAQ,CAAC,MAAM,CAAC,GAC3B,MAAM,GAAG,IAAI,CAGf;AAqCD,qBAAa,WAAW;IACtB,2CAA2C;IAC3C,OAAO,CAAC,OAAO,CAAyB;IAExC,+CAA+C;IAC/C,OAAO,CAAC,UAAU,CAA4B;IAE9C,iCAAiC;IACjC,OAAO,CAAC,WAAW,CAAuB;IAE1C,iDAAiD;IACjD,OAAO,CAAC,KAAK,CAAQ;IAErB,iDAAiD;IACjD,OAAO,CAAC,QAAQ,CAAgB;;IAIhC;;;OAGG;IACH,SAAS,IAAI,IAAI;IAIjB;;;OAGG;IACG,KAAK,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAyD/C;;;OAGG;IACH,qBAAqB,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI;IA4B1D;;;OAGG;IACH,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,EAAE;IAI1C;;;OAGG;IACH,wBAAwB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,EAAE;IAiBpD;;OAEG;IACH,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,EAAE;IAIvC;;OAEG;IACH,KAAK,IAAI;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,KAAK,EAAE,OAAO,CAAA;KAAE;IAQrF;;OAEG;IACH,WAAW,IAAI,MAAM,EAAE;IAIvB;;;OAGG;IACH,eAAe,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC;CAQ/D"}
|
|
@@ -33,6 +33,8 @@ function addImportGraphWarning(diagnostics, warning) {
|
|
|
33
33
|
// Import extraction (line-by-line, no catastrophic backtracking)
|
|
34
34
|
// ---------------------------------------------------------------------------
|
|
35
35
|
const IMPORT_RE = /(?:import|export)\s.*?from\s+['"]([^'"]+)['"]/;
|
|
36
|
+
const SIDE_EFFECT_IMPORT_RE = /^\s*import\s+['"]([^'"]+)['"]/;
|
|
37
|
+
const DYNAMIC_IMPORT_RE = /import\(\s*['"]([^'"]+)['"]\s*\)/;
|
|
36
38
|
const REQUIRE_RE = /require\(['"]([^'"]+)['"]\)/;
|
|
37
39
|
/**
|
|
38
40
|
* Extract all module specifiers (import/export/require) from a file's text.
|
|
@@ -44,6 +46,12 @@ function extractRelativeSpecifiers(content) {
|
|
|
44
46
|
const im = IMPORT_RE.exec(line);
|
|
45
47
|
if (im?.[1]?.startsWith('.'))
|
|
46
48
|
specs.push(im[1]);
|
|
49
|
+
const sideEffect = SIDE_EFFECT_IMPORT_RE.exec(line);
|
|
50
|
+
if (sideEffect?.[1]?.startsWith('.'))
|
|
51
|
+
specs.push(sideEffect[1]);
|
|
52
|
+
const dynamic = DYNAMIC_IMPORT_RE.exec(line);
|
|
53
|
+
if (dynamic?.[1]?.startsWith('.'))
|
|
54
|
+
specs.push(dynamic[1]);
|
|
47
55
|
const rq = REQUIRE_RE.exec(line);
|
|
48
56
|
if (rq?.[1]?.startsWith('.'))
|
|
49
57
|
specs.push(rq[1]);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"extractors.d.ts","sourceRoot":"","sources":["../../../src/platform/knowledge/extractors.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAsB,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAKhF,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"extractors.d.ts","sourceRoot":"","sources":["../../../src/platform/knowledge/extractors.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAsB,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAKhF,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,YAAY,CAAC;AAK5D,MAAM,WAAW,yBAAyB;IACxC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,MAAM,EAAE,yBAAyB,CAAC;IAC3C,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACpC,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACtC,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACtC,QAAQ,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAC;IACrC,QAAQ,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;IAClC,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC5C,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC5C;AAwhBD,wBAAsB,wBAAwB,CAC5C,QAAQ,EAAE,IAAI,CAAC,cAAc,EAAE,IAAI,GAAG,UAAU,GAAG,UAAU,CAAC,EAC9D,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,yBAAyB,CAAC,CAiDpC"}
|
|
@@ -6,6 +6,7 @@ import { extractPdf } from './pdf-extractor.js';
|
|
|
6
6
|
import { KNOWLEDGE_MAX_STRUCTURE_SEARCH_TEXT_CHARS } from './extraction-policy.js';
|
|
7
7
|
import { summarizeError } from '../utils/error-display.js';
|
|
8
8
|
import { logger } from '../utils/logger.js';
|
|
9
|
+
import { isRecord } from '../utils/record-coerce.js';
|
|
9
10
|
function decodeHtmlEntities(value) {
|
|
10
11
|
return value
|
|
11
12
|
.replace(/ /g, ' ')
|
|
@@ -194,7 +195,7 @@ function extractJson(buffer) {
|
|
|
194
195
|
const text = decodeBuffer(buffer);
|
|
195
196
|
try {
|
|
196
197
|
const parsed = JSON.parse(text);
|
|
197
|
-
const rootKeys =
|
|
198
|
+
const rootKeys = isRecord(parsed)
|
|
198
199
|
? Object.keys(parsed).slice(0, 24)
|
|
199
200
|
: [];
|
|
200
201
|
const title = rootKeys.length > 0 ? `JSON object: ${rootKeys.slice(0, 3).join(', ')}` : 'JSON document';
|
|
@@ -502,6 +503,26 @@ function chooseFormat(artifact) {
|
|
|
502
503
|
return 'pdf';
|
|
503
504
|
return 'unknown';
|
|
504
505
|
}
|
|
506
|
+
async function extractOfficeWithFallback(buffer, format, extractor) {
|
|
507
|
+
try {
|
|
508
|
+
return await extractor(buffer);
|
|
509
|
+
}
|
|
510
|
+
catch (error) {
|
|
511
|
+
const parseWarning = `${format} parsing failed; used text fallback: ${summarizeError(error)}`;
|
|
512
|
+
logger.debug('Knowledge extraction: office parse failed; using text fallback', {
|
|
513
|
+
format,
|
|
514
|
+
error: summarizeError(error),
|
|
515
|
+
});
|
|
516
|
+
const fallback = extractTextLike(buffer, format, `${format}-fallback`);
|
|
517
|
+
return {
|
|
518
|
+
...fallback,
|
|
519
|
+
metadata: {
|
|
520
|
+
...fallback.metadata,
|
|
521
|
+
warnings: [parseWarning],
|
|
522
|
+
},
|
|
523
|
+
};
|
|
524
|
+
}
|
|
525
|
+
}
|
|
505
526
|
export async function extractKnowledgeArtifact(artifact, buffer) {
|
|
506
527
|
const format = chooseFormat(artifact);
|
|
507
528
|
switch (format) {
|
|
@@ -520,12 +541,17 @@ export async function extractKnowledgeArtifact(artifact, buffer) {
|
|
|
520
541
|
case 'yaml':
|
|
521
542
|
return extractYaml(buffer);
|
|
522
543
|
case 'docx':
|
|
523
|
-
return
|
|
544
|
+
return extractOfficeWithFallback(buffer, 'docx', extractDocx);
|
|
524
545
|
case 'xlsx':
|
|
525
|
-
return
|
|
546
|
+
return extractOfficeWithFallback(buffer, 'xlsx', extractXlsx);
|
|
526
547
|
case 'pptx':
|
|
527
|
-
return
|
|
548
|
+
return extractOfficeWithFallback(buffer, 'pptx', extractPptx);
|
|
528
549
|
case 'pdf':
|
|
550
|
+
// PDFs must reject when no readable text can be extracted. extractPdf already
|
|
551
|
+
// performs its own pdfjs -> raw-stream fallbacks internally and only throws as a
|
|
552
|
+
// terminal failure; do NOT wrap it in the office text fallback. Decoding PDF binary
|
|
553
|
+
// as text yields garbage and would swallow 'PDF extraction failed', which callers
|
|
554
|
+
// rely on to know OCR / a dedicated PDF provider is required.
|
|
529
555
|
return extractPdf(buffer);
|
|
530
556
|
case 'text':
|
|
531
557
|
return extractTextLike(buffer, 'text', 'text');
|
|
@@ -49,6 +49,8 @@ export declare class McpClient {
|
|
|
49
49
|
private readLoopRunning;
|
|
50
50
|
private restartCount;
|
|
51
51
|
private initialized;
|
|
52
|
+
/** Set true by disconnect() to suppress the read-loop's auto-restart. Reset on each successful _startProcess(). */
|
|
53
|
+
private intentionalClose;
|
|
52
54
|
/** Cache: tool name → full schema (populated lazily on first callTool) */
|
|
53
55
|
private schemaCache;
|
|
54
56
|
/** Minimal tool info loaded at connect time (name + description only) */
|