@pellux/goodvibes-sdk 0.33.26 → 0.33.28
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 +1090 -4
- package/dist/events/ops.d.ts +6 -0
- package/dist/events/ops.d.ts.map +1 -1
- package/dist/platform/control-plane/method-catalog-runtime.d.ts.map +1 -1
- package/dist/platform/control-plane/method-catalog-runtime.js +150 -2
- package/dist/platform/core/context-compaction.d.ts +21 -7
- package/dist/platform/core/context-compaction.d.ts.map +1 -1
- package/dist/platform/core/context-compaction.js +42 -11
- package/dist/platform/core/orchestrator-context-runtime.d.ts.map +1 -1
- package/dist/platform/core/orchestrator-context-runtime.js +133 -25
- package/dist/platform/daemon/facade-composition.d.ts.map +1 -1
- package/dist/platform/daemon/facade-composition.js +2 -0
- package/dist/platform/daemon/http/mcp-routes.d.ts +13 -0
- package/dist/platform/daemon/http/mcp-routes.d.ts.map +1 -0
- package/dist/platform/daemon/http/mcp-routes.js +128 -0
- package/dist/platform/daemon/http/router.d.ts +2 -0
- package/dist/platform/daemon/http/router.d.ts.map +1 -1
- package/dist/platform/daemon/http/router.js +12 -0
- package/dist/platform/mcp/config.d.ts +27 -0
- package/dist/platform/mcp/config.d.ts.map +1 -1
- package/dist/platform/mcp/config.js +165 -46
- package/dist/platform/mcp/index.d.ts +3 -3
- package/dist/platform/mcp/index.d.ts.map +1 -1
- package/dist/platform/mcp/index.js +1 -1
- package/dist/platform/mcp/mcp-api.d.ts +24 -0
- package/dist/platform/mcp/mcp-api.d.ts.map +1 -1
- package/dist/platform/mcp/mcp-api.js +12 -0
- package/dist/platform/mcp/registry.d.ts +27 -2
- package/dist/platform/mcp/registry.d.ts.map +1 -1
- package/dist/platform/mcp/registry.js +106 -8
- package/dist/platform/runtime/bootstrap-hook-bridge.d.ts.map +1 -1
- package/dist/platform/runtime/bootstrap-hook-bridge.js +4 -3
- package/dist/platform/runtime/emitters/ops.d.ts +6 -0
- package/dist/platform/runtime/emitters/ops.d.ts.map +1 -1
- package/dist/platform/runtime/emitters/ops.js +1 -2
- package/dist/platform/tools/exec/runtime.d.ts.map +1 -1
- package/dist/platform/tools/exec/runtime.js +25 -1
- package/dist/platform/tools/exec/schema.d.ts +6 -1
- package/dist/platform/tools/exec/schema.d.ts.map +1 -1
- package/dist/platform/tools/exec/schema.js +5 -1
- package/dist/platform/version.js +1 -1
- package/package.json +9 -9
package/dist/events/ops.d.ts
CHANGED
|
@@ -14,6 +14,12 @@ export type OpsEvent =
|
|
|
14
14
|
type: 'OPS_CONTEXT_WARNING';
|
|
15
15
|
usage: number;
|
|
16
16
|
threshold: number;
|
|
17
|
+
currentTokens?: number | undefined;
|
|
18
|
+
contextWindow?: number | undefined;
|
|
19
|
+
thresholdTokens?: number | undefined;
|
|
20
|
+
remainingTokens?: number | undefined;
|
|
21
|
+
safetyBufferTokens?: number | undefined;
|
|
22
|
+
reason?: 'threshold' | 'safety-buffer' | undefined;
|
|
17
23
|
}
|
|
18
24
|
/** Cache hit-rate and token metrics snapshot. */
|
|
19
25
|
| {
|
package/dist/events/ops.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ops.d.ts","sourceRoot":"","sources":["../../src/events/ops.ts"],"names":[],"mappings":"AAAA,qFAAqF;AAErF;;;;;;GAMG;AAEH,+CAA+C;AAC/C,MAAM,MAAM,qBAAqB,GAC7B,gBAAgB,GAChB,YAAY,GACZ,WAAW,GACX,YAAY,GACZ,WAAW,GACX,kBAAkB,CAAC;AAEvB,MAAM,MAAM,QAAQ;AAClB,iDAAiD;AAC/C;IACE,IAAI,EAAE,qBAAqB,CAAC;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"ops.d.ts","sourceRoot":"","sources":["../../src/events/ops.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"method-catalog-runtime.d.ts","sourceRoot":"","sources":["../../../src/platform/control-plane/method-catalog-runtime.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,4BAA4B,CAAC;
|
|
1
|
+
{"version":3,"file":"method-catalog-runtime.d.ts","sourceRoot":"","sources":["../../../src/platform/control-plane/method-catalog-runtime.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,4BAA4B,CAAC;AAqH1E,eAAO,MAAM,sCAAsC,EAAE,SAAS,uBAAuB,EA4WpF,CAAC"}
|
|
@@ -1,7 +1,155 @@
|
|
|
1
|
-
import { EMPTY_OBJECT_SCHEMA, STRING_SCHEMA, NUMBER_SCHEMA, objectSchema, listOutputSchema, entityOutputSchema, bodyEnvelopeSchema, methodDescriptor, runtimeEventId, } from './method-catalog-shared.js';
|
|
2
|
-
import { nullableSchema } from './operator-contract-schemas-shared.js';
|
|
1
|
+
import { EMPTY_OBJECT_SCHEMA, BOOLEAN_SCHEMA, STRING_SCHEMA, NUMBER_SCHEMA, objectSchema, listOutputSchema, entityOutputSchema, bodyEnvelopeSchema, methodDescriptor, runtimeEventId, arraySchema, } from './method-catalog-shared.js';
|
|
2
|
+
import { enumSchema, nullableSchema } from './operator-contract-schemas-shared.js';
|
|
3
3
|
import { CONTINUITY_SNAPSHOT_SCHEMA, DISTRIBUTED_NODE_HOST_CONTRACT_SCHEMA, HEALTH_SNAPSHOT_SCHEMA, INTELLIGENCE_SNAPSHOT_SCHEMA, MEMORY_DOCTOR_REPORT_SCHEMA, MEMORY_VECTOR_STATS_SCHEMA, PROVIDER_ACCOUNT_SNAPSHOT_SCHEMA, PROVIDER_RUNTIME_SNAPSHOT_SCHEMA, PROVIDER_USAGE_SNAPSHOT_SCHEMA, REMOTE_PAIR_APPROVAL_OUTPUT_SCHEMA, REMOTE_PAIR_REQUEST_OUTPUT_SCHEMA, REMOTE_PAIR_REQUESTS_OUTPUT_SCHEMA, REMOTE_PEERS_OUTPUT_SCHEMA, REMOTE_PAIR_REQUEST_ACTION_INPUT_SCHEMA, REMOTE_PEER_DISCONNECT_INPUT_SCHEMA, REMOTE_PEER_INVOKE_INPUT_SCHEMA, REMOTE_PEER_INVOKE_OUTPUT_SCHEMA, REMOTE_PEER_OUTPUT_SCHEMA, REMOTE_PEER_TOKEN_REVOKE_INPUT_SCHEMA, REMOTE_PEER_TOKEN_ROTATE_INPUT_SCHEMA, REMOTE_PEER_TOKEN_ROTATE_OUTPUT_SCHEMA, REMOTE_SNAPSHOT_SCHEMA, REMOTE_WORK_LIST_OUTPUT_SCHEMA, REMOTE_WORK_CANCEL_INPUT_SCHEMA, REMOTE_WORK_OUTPUT_SCHEMA, SECURITY_SETTINGS_REPORT_SCHEMA, SETTINGS_SNAPSHOT_SCHEMA, WORKTREE_SNAPSHOT_SCHEMA, } from './operator-contract-schemas.js';
|
|
4
|
+
const MCP_SCOPE_SCHEMA = enumSchema(['project', 'global']);
|
|
5
|
+
const MCP_SERVER_CONFIG_SCHEMA = objectSchema({
|
|
6
|
+
name: STRING_SCHEMA,
|
|
7
|
+
command: STRING_SCHEMA,
|
|
8
|
+
args: arraySchema(STRING_SCHEMA),
|
|
9
|
+
env: objectSchema({}, [], { additionalProperties: true }),
|
|
10
|
+
envKeys: arraySchema(STRING_SCHEMA),
|
|
11
|
+
role: nullableSchema(STRING_SCHEMA),
|
|
12
|
+
trustMode: nullableSchema(STRING_SCHEMA),
|
|
13
|
+
allowedPaths: arraySchema(STRING_SCHEMA),
|
|
14
|
+
allowedHosts: arraySchema(STRING_SCHEMA),
|
|
15
|
+
}, ['name', 'command']);
|
|
16
|
+
const MCP_CONFIG_SOURCE_SCHEMA = objectSchema({
|
|
17
|
+
scope: STRING_SCHEMA,
|
|
18
|
+
kind: STRING_SCHEMA,
|
|
19
|
+
path: STRING_SCHEMA,
|
|
20
|
+
writable: BOOLEAN_SCHEMA,
|
|
21
|
+
}, ['scope', 'kind', 'path', 'writable']);
|
|
22
|
+
const MCP_CONFIG_SERVER_SCHEMA = objectSchema({
|
|
23
|
+
name: STRING_SCHEMA,
|
|
24
|
+
command: STRING_SCHEMA,
|
|
25
|
+
args: arraySchema(STRING_SCHEMA),
|
|
26
|
+
envKeys: arraySchema(STRING_SCHEMA),
|
|
27
|
+
role: nullableSchema(STRING_SCHEMA),
|
|
28
|
+
trustMode: nullableSchema(STRING_SCHEMA),
|
|
29
|
+
allowedPaths: arraySchema(STRING_SCHEMA),
|
|
30
|
+
allowedHosts: arraySchema(STRING_SCHEMA),
|
|
31
|
+
source: MCP_CONFIG_SOURCE_SCHEMA,
|
|
32
|
+
}, ['name', 'command', 'args', 'envKeys', 'role', 'trustMode', 'allowedPaths', 'allowedHosts', 'source']);
|
|
33
|
+
const MCP_RELOAD_SERVER_SCHEMA = objectSchema({
|
|
34
|
+
name: STRING_SCHEMA,
|
|
35
|
+
action: enumSchema(['added', 'changed', 'removed', 'unchanged']),
|
|
36
|
+
connected: BOOLEAN_SCHEMA,
|
|
37
|
+
}, ['name', 'action', 'connected']);
|
|
38
|
+
const MCP_RELOAD_RESULT_SCHEMA = objectSchema({
|
|
39
|
+
added: NUMBER_SCHEMA,
|
|
40
|
+
changed: NUMBER_SCHEMA,
|
|
41
|
+
removed: NUMBER_SCHEMA,
|
|
42
|
+
unchanged: NUMBER_SCHEMA,
|
|
43
|
+
servers: arraySchema(MCP_RELOAD_SERVER_SCHEMA),
|
|
44
|
+
}, ['added', 'changed', 'removed', 'unchanged', 'servers']);
|
|
45
|
+
const MCP_CONFIG_RESPONSE_SCHEMA = objectSchema({
|
|
46
|
+
locations: arraySchema(MCP_CONFIG_SOURCE_SCHEMA),
|
|
47
|
+
servers: arraySchema(MCP_CONFIG_SERVER_SCHEMA),
|
|
48
|
+
}, ['locations', 'servers']);
|
|
49
|
+
const MCP_CONFIG_MUTATION_RESPONSE_SCHEMA = objectSchema({
|
|
50
|
+
scope: MCP_SCOPE_SCHEMA,
|
|
51
|
+
path: STRING_SCHEMA,
|
|
52
|
+
removed: BOOLEAN_SCHEMA,
|
|
53
|
+
reload: MCP_RELOAD_RESULT_SCHEMA,
|
|
54
|
+
config: MCP_CONFIG_RESPONSE_SCHEMA,
|
|
55
|
+
}, ['scope', 'path', 'reload', 'config']);
|
|
56
|
+
const MCP_SERVER_STATUS_SCHEMA = objectSchema({
|
|
57
|
+
name: STRING_SCHEMA,
|
|
58
|
+
connected: BOOLEAN_SCHEMA,
|
|
59
|
+
}, ['name', 'connected']);
|
|
60
|
+
const MCP_SERVERS_RESPONSE_SCHEMA = objectSchema({
|
|
61
|
+
servers: arraySchema(MCP_SERVER_STATUS_SCHEMA),
|
|
62
|
+
security: arraySchema(objectSchema({}, [], { additionalProperties: true })),
|
|
63
|
+
sandboxBindings: arraySchema(objectSchema({}, [], { additionalProperties: true })),
|
|
64
|
+
}, ['servers', 'security', 'sandboxBindings']);
|
|
65
|
+
const MCP_TOOL_SCHEMA = objectSchema({
|
|
66
|
+
qualifiedName: STRING_SCHEMA,
|
|
67
|
+
serverName: STRING_SCHEMA,
|
|
68
|
+
toolName: STRING_SCHEMA,
|
|
69
|
+
description: STRING_SCHEMA,
|
|
70
|
+
}, ['qualifiedName', 'serverName', 'toolName', 'description']);
|
|
71
|
+
const MCP_TOOLS_RESPONSE_SCHEMA = objectSchema({
|
|
72
|
+
tools: arraySchema(MCP_TOOL_SCHEMA),
|
|
73
|
+
}, ['tools']);
|
|
4
74
|
export const builtinGatewayRuntimeMethodDescriptors = [
|
|
75
|
+
methodDescriptor({
|
|
76
|
+
id: 'mcp.config.get',
|
|
77
|
+
title: 'MCP Effective Config',
|
|
78
|
+
description: 'Return effective MCP config from global, external, and project sources. Environment values are redacted to envKeys.',
|
|
79
|
+
category: 'mcp',
|
|
80
|
+
scopes: ['read:mcp'],
|
|
81
|
+
http: { method: 'GET', path: '/api/mcp/config' },
|
|
82
|
+
events: [runtimeEventId('mcp')],
|
|
83
|
+
inputSchema: EMPTY_OBJECT_SCHEMA,
|
|
84
|
+
outputSchema: MCP_CONFIG_RESPONSE_SCHEMA,
|
|
85
|
+
}),
|
|
86
|
+
methodDescriptor({
|
|
87
|
+
id: 'mcp.servers.list',
|
|
88
|
+
title: 'MCP Servers List',
|
|
89
|
+
description: 'Return configured MCP servers, runtime security posture, and sandbox bindings.',
|
|
90
|
+
category: 'mcp',
|
|
91
|
+
scopes: ['read:mcp'],
|
|
92
|
+
http: { method: 'GET', path: '/api/mcp/servers' },
|
|
93
|
+
events: [runtimeEventId('mcp')],
|
|
94
|
+
inputSchema: EMPTY_OBJECT_SCHEMA,
|
|
95
|
+
outputSchema: MCP_SERVERS_RESPONSE_SCHEMA,
|
|
96
|
+
}),
|
|
97
|
+
methodDescriptor({
|
|
98
|
+
id: 'mcp.tools.list',
|
|
99
|
+
title: 'MCP Tools List',
|
|
100
|
+
description: 'Return currently connected MCP tools.',
|
|
101
|
+
category: 'mcp',
|
|
102
|
+
scopes: ['read:mcp'],
|
|
103
|
+
http: { method: 'GET', path: '/api/mcp/tools' },
|
|
104
|
+
events: [runtimeEventId('mcp')],
|
|
105
|
+
inputSchema: EMPTY_OBJECT_SCHEMA,
|
|
106
|
+
outputSchema: MCP_TOOLS_RESPONSE_SCHEMA,
|
|
107
|
+
}),
|
|
108
|
+
methodDescriptor({
|
|
109
|
+
id: 'mcp.config.reload',
|
|
110
|
+
title: 'Reload MCP Config',
|
|
111
|
+
description: 'Reload effective MCP config and reconnect added, removed, or changed servers without daemon restart.',
|
|
112
|
+
category: 'mcp',
|
|
113
|
+
scopes: ['write:mcp'],
|
|
114
|
+
access: 'admin',
|
|
115
|
+
http: { method: 'POST', path: '/api/mcp/reload' },
|
|
116
|
+
events: [runtimeEventId('mcp')],
|
|
117
|
+
inputSchema: EMPTY_OBJECT_SCHEMA,
|
|
118
|
+
outputSchema: objectSchema({
|
|
119
|
+
reload: MCP_RELOAD_RESULT_SCHEMA,
|
|
120
|
+
config: MCP_CONFIG_RESPONSE_SCHEMA,
|
|
121
|
+
}, ['reload', 'config']),
|
|
122
|
+
}),
|
|
123
|
+
methodDescriptor({
|
|
124
|
+
id: 'mcp.servers.upsert',
|
|
125
|
+
title: 'Upsert MCP Server',
|
|
126
|
+
description: 'Persist a project/global MCP server config and reconnect the changed runtime server without daemon restart.',
|
|
127
|
+
category: 'mcp',
|
|
128
|
+
scopes: ['write:mcp'],
|
|
129
|
+
access: 'admin',
|
|
130
|
+
http: { method: 'POST', path: '/api/mcp/config/servers' },
|
|
131
|
+
events: [runtimeEventId('mcp')],
|
|
132
|
+
inputSchema: bodyEnvelopeSchema({
|
|
133
|
+
scope: MCP_SCOPE_SCHEMA,
|
|
134
|
+
server: MCP_SERVER_CONFIG_SCHEMA,
|
|
135
|
+
}, ['server']),
|
|
136
|
+
outputSchema: MCP_CONFIG_MUTATION_RESPONSE_SCHEMA,
|
|
137
|
+
}),
|
|
138
|
+
methodDescriptor({
|
|
139
|
+
id: 'mcp.servers.remove',
|
|
140
|
+
title: 'Remove MCP Server',
|
|
141
|
+
description: 'Remove a project/global MCP server config and disconnect it without daemon restart.',
|
|
142
|
+
category: 'mcp',
|
|
143
|
+
scopes: ['write:mcp'],
|
|
144
|
+
access: 'admin',
|
|
145
|
+
http: { method: 'DELETE', path: '/api/mcp/config/servers/{serverName}' },
|
|
146
|
+
events: [runtimeEventId('mcp')],
|
|
147
|
+
inputSchema: objectSchema({
|
|
148
|
+
serverName: STRING_SCHEMA,
|
|
149
|
+
scope: MCP_SCOPE_SCHEMA,
|
|
150
|
+
}, ['serverName']),
|
|
151
|
+
outputSchema: MCP_CONFIG_MUTATION_RESPONSE_SCHEMA,
|
|
152
|
+
}),
|
|
5
153
|
methodDescriptor({
|
|
6
154
|
id: 'remote.snapshot',
|
|
7
155
|
title: 'Remote Runtime Snapshot',
|
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
* Public API:
|
|
16
16
|
* estimateConversationTokens(messages) — rough token count for a message array
|
|
17
17
|
* estimateTokens(text) — rough token count for a string
|
|
18
|
-
* shouldAutoCompact(opts) — check if
|
|
18
|
+
* shouldAutoCompact(opts) — check if configured usage threshold or safety buffer is exceeded
|
|
19
19
|
* compactSmallWindow(messages, keepRecent) — simplified compaction for small context windows
|
|
20
20
|
* compactMessages(ctx, registry) — structured compaction entry point
|
|
21
21
|
* checkAndCompact(autoOpts, ctx) — check and compact if threshold exceeded
|
|
@@ -33,6 +33,21 @@ export interface AutoCompactOptions {
|
|
|
33
33
|
contextWindow: number;
|
|
34
34
|
/** Whether auto-compact is already in progress (prevent re-entry). */
|
|
35
35
|
isCompacting: boolean;
|
|
36
|
+
/** Usage percentage that triggers compaction. Defaults to 80. */
|
|
37
|
+
thresholdPercent?: number | undefined;
|
|
38
|
+
/** Remaining-token safety buffer that also triggers compaction. Defaults to 15000. */
|
|
39
|
+
minRemainingTokens?: number | undefined;
|
|
40
|
+
}
|
|
41
|
+
export interface AutoCompactDecision {
|
|
42
|
+
readonly shouldCompact: boolean;
|
|
43
|
+
readonly reason: 'threshold' | 'safety-buffer' | null;
|
|
44
|
+
readonly currentTokens: number;
|
|
45
|
+
readonly contextWindow: number;
|
|
46
|
+
readonly usagePct: number;
|
|
47
|
+
readonly thresholdPercent: number;
|
|
48
|
+
readonly thresholdTokens: number;
|
|
49
|
+
readonly remainingTokens: number;
|
|
50
|
+
readonly safetyBufferTokens: number;
|
|
36
51
|
}
|
|
37
52
|
/**
|
|
38
53
|
* Tokens remaining in the context window at which auto-compaction triggers.
|
|
@@ -40,6 +55,7 @@ export interface AutoCompactOptions {
|
|
|
40
55
|
* 15k gives room for the ~6.5k compaction output + LLM extraction calls.
|
|
41
56
|
*/
|
|
42
57
|
export declare const COMPACTION_BUFFER_TOKENS = 15000;
|
|
58
|
+
export declare const DEFAULT_AUTO_COMPACT_THRESHOLD_PERCENT = 80;
|
|
43
59
|
/**
|
|
44
60
|
* Context windows smaller than this use simplified compaction (summarize last N messages)
|
|
45
61
|
* instead of the full structured output, since there isn't enough room for extraction calls.
|
|
@@ -50,13 +66,11 @@ export declare function getLastCompactionEvent(): CompactionEvent | null;
|
|
|
50
66
|
/** Rough token estimate: 4 chars ≈ 1 token. Used for threshold checks. */
|
|
51
67
|
export declare function estimateConversationTokens(messages: ProviderMessage[]): number;
|
|
52
68
|
export { estimateTokens } from './compaction-types.js';
|
|
69
|
+
export declare function getAutoCompactDecision(opts: AutoCompactOptions): AutoCompactDecision;
|
|
53
70
|
/**
|
|
54
|
-
* Returns true
|
|
55
|
-
*
|
|
56
|
-
*
|
|
57
|
-
* Triggers when: contextWindow - currentTokens <= 15000
|
|
58
|
-
* The 15k buffer gives room for the ~6.5k compaction output + LLM extraction calls
|
|
59
|
-
* + post-compaction work before the window is exhausted.
|
|
71
|
+
* Returns true when context usage reaches the configured percentage threshold
|
|
72
|
+
* or the remaining-token safety buffer is exhausted, unless compaction is
|
|
73
|
+
* already active.
|
|
60
74
|
*/
|
|
61
75
|
export declare function shouldAutoCompact(opts: AutoCompactOptions): boolean;
|
|
62
76
|
/**
|
|
@@ -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;AAkB/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;
|
|
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;AAkB/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,iEAAiE;IACjE,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;;;;GAIG;AACH,eAAO,MAAM,wBAAwB,QAAS,CAAC;AAC/C,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,CAc9E;AAED,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAYvD,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,kBAAkB,GAAG,mBAAmB,CA6BpF;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;AAuHD;;GAEG;AACH,wBAAsB,eAAe,CACnC,GAAG,EAAE,iBAAiB,EACtB,QAAQ,EAAE,gBAAgB,GACzB,OAAO,CAAC,gBAAgB,CAAC,CAE3B;AAmPD;;;;GAIG;AACH,wBAAsB,eAAe,CACnC,QAAQ,EAAE,kBAAkB,EAC5B,GAAG,EAAE,iBAAiB,EACtB,QAAQ,EAAE,gBAAgB,GACzB,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC,CAOlC"}
|
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
* Public API:
|
|
16
16
|
* estimateConversationTokens(messages) — rough token count for a message array
|
|
17
17
|
* estimateTokens(text) — rough token count for a string
|
|
18
|
-
* shouldAutoCompact(opts) — check if
|
|
18
|
+
* shouldAutoCompact(opts) — check if configured usage threshold or safety buffer is exceeded
|
|
19
19
|
* compactSmallWindow(messages, keepRecent) — simplified compaction for small context windows
|
|
20
20
|
* compactMessages(ctx, registry) — structured compaction entry point
|
|
21
21
|
* checkAndCompact(autoOpts, ctx) — check and compact if threshold exceeded
|
|
@@ -35,6 +35,7 @@ import { buildHandoffHeader, buildSessionMemories, buildCurrentTask, buildRunnin
|
|
|
35
35
|
* 15k gives room for the ~6.5k compaction output + LLM extraction calls.
|
|
36
36
|
*/
|
|
37
37
|
export const COMPACTION_BUFFER_TOKENS = 15_000;
|
|
38
|
+
export const DEFAULT_AUTO_COMPACT_THRESHOLD_PERCENT = 80;
|
|
38
39
|
/**
|
|
39
40
|
* Context windows smaller than this use simplified compaction (summarize last N messages)
|
|
40
41
|
* instead of the full structured output, since there isn't enough room for extraction calls.
|
|
@@ -76,19 +77,49 @@ export { estimateTokens } from './compaction-types.js';
|
|
|
76
77
|
// ---------------------------------------------------------------------------
|
|
77
78
|
// Should compact?
|
|
78
79
|
// ---------------------------------------------------------------------------
|
|
80
|
+
function normalizeThresholdPercent(value) {
|
|
81
|
+
if (value === undefined)
|
|
82
|
+
return DEFAULT_AUTO_COMPACT_THRESHOLD_PERCENT;
|
|
83
|
+
if (!Number.isFinite(value))
|
|
84
|
+
return DEFAULT_AUTO_COMPACT_THRESHOLD_PERCENT;
|
|
85
|
+
return Math.max(0, Math.min(100, value));
|
|
86
|
+
}
|
|
87
|
+
export function getAutoCompactDecision(opts) {
|
|
88
|
+
const currentTokens = Math.max(0, opts.currentTokens);
|
|
89
|
+
const contextWindow = Math.max(0, opts.contextWindow);
|
|
90
|
+
const thresholdPercent = normalizeThresholdPercent(opts.thresholdPercent);
|
|
91
|
+
const safetyBufferTokens = Math.max(0, opts.minRemainingTokens ?? COMPACTION_BUFFER_TOKENS);
|
|
92
|
+
const usagePct = contextWindow > 0 ? (currentTokens / contextWindow) * 100 : 0;
|
|
93
|
+
const thresholdTokens = contextWindow > 0 ? Math.floor((contextWindow * thresholdPercent) / 100) : 0;
|
|
94
|
+
const remainingTokens = Math.max(0, contextWindow - currentTokens);
|
|
95
|
+
let reason = null;
|
|
96
|
+
if (!opts.isCompacting && contextWindow > 0 && thresholdPercent > 0) {
|
|
97
|
+
if (currentTokens >= thresholdTokens) {
|
|
98
|
+
reason = 'threshold';
|
|
99
|
+
}
|
|
100
|
+
else if (remainingTokens <= safetyBufferTokens) {
|
|
101
|
+
reason = 'safety-buffer';
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
return {
|
|
105
|
+
shouldCompact: reason !== null,
|
|
106
|
+
reason,
|
|
107
|
+
currentTokens,
|
|
108
|
+
contextWindow,
|
|
109
|
+
usagePct,
|
|
110
|
+
thresholdPercent,
|
|
111
|
+
thresholdTokens,
|
|
112
|
+
remainingTokens,
|
|
113
|
+
safetyBufferTokens,
|
|
114
|
+
};
|
|
115
|
+
}
|
|
79
116
|
/**
|
|
80
|
-
* Returns true
|
|
81
|
-
*
|
|
82
|
-
*
|
|
83
|
-
* Triggers when: contextWindow - currentTokens <= 15000
|
|
84
|
-
* The 15k buffer gives room for the ~6.5k compaction output + LLM extraction calls
|
|
85
|
-
* + post-compaction work before the window is exhausted.
|
|
117
|
+
* Returns true when context usage reaches the configured percentage threshold
|
|
118
|
+
* or the remaining-token safety buffer is exhausted, unless compaction is
|
|
119
|
+
* already active.
|
|
86
120
|
*/
|
|
87
121
|
export function shouldAutoCompact(opts) {
|
|
88
|
-
|
|
89
|
-
if (isCompacting || contextWindow <= 0)
|
|
90
|
-
return false;
|
|
91
|
-
return (contextWindow - currentTokens) <= COMPACTION_BUFFER_TOKENS;
|
|
122
|
+
return getAutoCompactDecision(opts).shouldCompact;
|
|
92
123
|
}
|
|
93
124
|
// ---------------------------------------------------------------------------
|
|
94
125
|
// Small-window simplified compaction
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"orchestrator-context-runtime.d.ts","sourceRoot":"","sources":["../../../src/platform/core/orchestrator-context-runtime.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAC7D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,KAAK,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAIlF,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAC9D,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAClE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AACnE,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAChE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAElE,OAAO,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAG/D,KAAK,kBAAkB,GAAG;IACxB,IAAI,CAAC,KAAK,EAAE,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;CAC7C,CAAC;AAEF,KAAK,qBAAqB,GAAG,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,8BAA8B,EAAE,cAAc,CAAC;AAEvG,KAAK,WAAW,GAAG,MAAM,GAAG,MAAM,GAAG,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"orchestrator-context-runtime.d.ts","sourceRoot":"","sources":["../../../src/platform/core/orchestrator-context-runtime.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { logger } from '../utils/logger.js';
|
|
2
|
-
import { estimateConversationTokens, COMPACTION_BUFFER_TOKENS, SMALL_WINDOW_THRESHOLD, compactSmallWindow,
|
|
2
|
+
import { estimateConversationTokens, COMPACTION_BUFFER_TOKENS, SMALL_WINDOW_THRESHOLD, compactSmallWindow, getAutoCompactDecision } from './context-compaction.js';
|
|
3
3
|
import { emitOpsContextWarning } from '../runtime/emitters/index.js';
|
|
4
4
|
import { summarizeError } from '../utils/error-display.js';
|
|
5
5
|
function normalizeCatalogTier(tier) {
|
|
@@ -26,6 +26,16 @@ function findLargerContextModels(providerRegistry, minContext, tier, limit = 3)
|
|
|
26
26
|
.slice(0, limit)
|
|
27
27
|
.map(({ id, displayName, context }) => ({ id, displayName, context }));
|
|
28
28
|
}
|
|
29
|
+
function readAutoCompactThreshold(configManager) {
|
|
30
|
+
const raw = Number(configManager.get('behavior.autoCompactThreshold') ?? 0);
|
|
31
|
+
return Number.isFinite(raw) ? raw : 0;
|
|
32
|
+
}
|
|
33
|
+
function formatAutoCompactTrigger(decision) {
|
|
34
|
+
if (decision.reason === 'safety-buffer') {
|
|
35
|
+
return `leaving ${decision.remainingTokens.toLocaleString()} tokens, inside the ${decision.safetyBufferTokens.toLocaleString()} token safety buffer`;
|
|
36
|
+
}
|
|
37
|
+
return `crossing the ${decision.thresholdPercent}% auto-compact threshold`;
|
|
38
|
+
}
|
|
29
39
|
export async function checkContextWindowPreflight(deps, turnId, model) {
|
|
30
40
|
const contextWindow = deps.providerRegistry.getContextWindowForModel(model);
|
|
31
41
|
const tier = normalizeCatalogTier(model.tier);
|
|
@@ -33,18 +43,30 @@ export async function checkContextWindowPreflight(deps, turnId, model) {
|
|
|
33
43
|
return 'ok';
|
|
34
44
|
const messages = deps.conversation.getMessagesForLLM();
|
|
35
45
|
const estimatedTokens = estimateConversationTokens(messages);
|
|
36
|
-
|
|
37
|
-
return 'ok';
|
|
38
|
-
const threshold = deps.configManager.get('behavior.autoCompactThreshold');
|
|
46
|
+
const threshold = readAutoCompactThreshold(deps.configManager);
|
|
39
47
|
const autoCompactEnabled = threshold > 0;
|
|
40
|
-
|
|
48
|
+
const preflightDecision = getAutoCompactDecision({
|
|
49
|
+
currentTokens: estimatedTokens,
|
|
50
|
+
contextWindow,
|
|
51
|
+
isCompacting: deps.isCompacting,
|
|
52
|
+
thresholdPercent: threshold,
|
|
53
|
+
});
|
|
54
|
+
if (!preflightDecision.shouldCompact && estimatedTokens <= contextWindow)
|
|
55
|
+
return 'ok';
|
|
56
|
+
if (autoCompactEnabled && !deps.isCompacting && preflightDecision.shouldCompact) {
|
|
41
57
|
logger.info('Orchestrator: context window pre-flight - auto-compacting before chat call', {
|
|
42
58
|
modelId: model.id,
|
|
43
59
|
estimatedTokens,
|
|
44
60
|
contextWindow,
|
|
61
|
+
usagePct: Math.round(preflightDecision.usagePct),
|
|
62
|
+
thresholdPercent: preflightDecision.thresholdPercent,
|
|
63
|
+
thresholdTokens: preflightDecision.thresholdTokens,
|
|
64
|
+
remainingTokens: preflightDecision.remainingTokens,
|
|
65
|
+
safetyBufferTokens: preflightDecision.safetyBufferTokens,
|
|
66
|
+
reason: preflightDecision.reason,
|
|
45
67
|
});
|
|
46
68
|
deps.setIsCompacting(true);
|
|
47
|
-
deps.conversation.addSystemMessage(`Context pre-check: request
|
|
69
|
+
deps.conversation.addSystemMessage(`Context pre-check: request is at ${Math.round(preflightDecision.usagePct)}% (${estimatedTokens}/${contextWindow} tokens), ${formatAutoCompactTrigger(preflightDecision)}. Auto-compacting...`);
|
|
48
70
|
deps.requestRender();
|
|
49
71
|
if (deps.hookDispatcher) {
|
|
50
72
|
const preResult = await deps.hookDispatcher.fire({
|
|
@@ -54,7 +76,17 @@ export async function checkContextWindowPreflight(deps, turnId, model) {
|
|
|
54
76
|
specific: 'preflight',
|
|
55
77
|
sessionId: deps.sessionId,
|
|
56
78
|
timestamp: Date.now(),
|
|
57
|
-
payload: {
|
|
79
|
+
payload: {
|
|
80
|
+
trigger: 'preflight',
|
|
81
|
+
estimatedTokens,
|
|
82
|
+
contextWindow,
|
|
83
|
+
usagePct: Math.round(preflightDecision.usagePct),
|
|
84
|
+
thresholdPercent: preflightDecision.thresholdPercent,
|
|
85
|
+
thresholdTokens: preflightDecision.thresholdTokens,
|
|
86
|
+
remainingTokens: preflightDecision.remainingTokens,
|
|
87
|
+
safetyBufferTokens: preflightDecision.safetyBufferTokens,
|
|
88
|
+
reason: preflightDecision.reason,
|
|
89
|
+
},
|
|
58
90
|
}).catch((err) => {
|
|
59
91
|
logger.warn('Pre:compact:preflight hook error', { error: summarizeError(err) });
|
|
60
92
|
return { ok: true };
|
|
@@ -89,7 +121,17 @@ export async function checkContextWindowPreflight(deps, turnId, model) {
|
|
|
89
121
|
specific: 'preflight',
|
|
90
122
|
sessionId: deps.sessionId,
|
|
91
123
|
timestamp: Date.now(),
|
|
92
|
-
payload: {
|
|
124
|
+
payload: {
|
|
125
|
+
trigger: 'preflight',
|
|
126
|
+
estimatedTokens,
|
|
127
|
+
contextWindow,
|
|
128
|
+
usagePct: Math.round(preflightDecision.usagePct),
|
|
129
|
+
thresholdPercent: preflightDecision.thresholdPercent,
|
|
130
|
+
thresholdTokens: preflightDecision.thresholdTokens,
|
|
131
|
+
remainingTokens: preflightDecision.remainingTokens,
|
|
132
|
+
safetyBufferTokens: preflightDecision.safetyBufferTokens,
|
|
133
|
+
reason: preflightDecision.reason,
|
|
134
|
+
},
|
|
93
135
|
}).catch((err) => { logger.warn('Post:compact:preflight hook error', { error: summarizeError(err) }); });
|
|
94
136
|
}
|
|
95
137
|
}
|
|
@@ -105,7 +147,18 @@ export async function checkContextWindowPreflight(deps, turnId, model) {
|
|
|
105
147
|
specific: 'preflight',
|
|
106
148
|
sessionId: deps.sessionId,
|
|
107
149
|
timestamp: Date.now(),
|
|
108
|
-
payload: {
|
|
150
|
+
payload: {
|
|
151
|
+
trigger: 'preflight',
|
|
152
|
+
estimatedTokens,
|
|
153
|
+
contextWindow,
|
|
154
|
+
usagePct: Math.round(preflightDecision.usagePct),
|
|
155
|
+
thresholdPercent: preflightDecision.thresholdPercent,
|
|
156
|
+
thresholdTokens: preflightDecision.thresholdTokens,
|
|
157
|
+
remainingTokens: preflightDecision.remainingTokens,
|
|
158
|
+
safetyBufferTokens: preflightDecision.safetyBufferTokens,
|
|
159
|
+
reason: preflightDecision.reason,
|
|
160
|
+
error: msg,
|
|
161
|
+
},
|
|
109
162
|
}).catch((err) => { logger.warn('Fail:compact:preflight hook error', { error: summarizeError(err) }); });
|
|
110
163
|
}
|
|
111
164
|
}
|
|
@@ -146,23 +199,31 @@ export async function handlePostTurnContextMaintenance(deps, turnId, totalTokens
|
|
|
146
199
|
const maxTokens = deps.providerRegistry.getContextWindowForModel(currentModel);
|
|
147
200
|
if (maxTokens <= 0)
|
|
148
201
|
return;
|
|
149
|
-
const
|
|
150
|
-
const configuredThreshold = deps.configManager.get('behavior.autoCompactThreshold');
|
|
202
|
+
const configuredThreshold = readAutoCompactThreshold(deps.configManager);
|
|
151
203
|
const warningsEnabled = deps.configManager.get('behavior.staleContextWarnings');
|
|
152
204
|
const autoCompactEnabled = configuredThreshold > 0;
|
|
205
|
+
const autoDecision = getAutoCompactDecision({
|
|
206
|
+
currentTokens: totalTokens,
|
|
207
|
+
contextWindow: maxTokens,
|
|
208
|
+
isCompacting: deps.isCompacting,
|
|
209
|
+
thresholdPercent: configuredThreshold,
|
|
210
|
+
});
|
|
211
|
+
const usagePct = Math.round(autoDecision.usagePct);
|
|
153
212
|
const bracket = Math.floor(usagePct / 10) * 10;
|
|
154
213
|
if (autoCompactEnabled &&
|
|
155
|
-
|
|
156
|
-
currentTokens: totalTokens,
|
|
157
|
-
contextWindow: maxTokens,
|
|
158
|
-
isCompacting: deps.isCompacting,
|
|
159
|
-
})) {
|
|
214
|
+
autoDecision.shouldCompact) {
|
|
160
215
|
deps.setIsCompacting(true);
|
|
161
|
-
deps.conversation.addSystemMessage(`Context usage at ${usagePct}% (${totalTokens}/${maxTokens} tokens). Auto-compacting conversation...`);
|
|
216
|
+
deps.conversation.addSystemMessage(`Context usage at ${usagePct}% (${totalTokens}/${maxTokens} tokens), ${formatAutoCompactTrigger(autoDecision)}. Auto-compacting conversation...`);
|
|
162
217
|
if (deps.runtimeBus) {
|
|
163
218
|
emitOpsContextWarning(deps.runtimeBus, deps.emitterContext(turnId), {
|
|
164
219
|
usage: usagePct,
|
|
165
|
-
threshold:
|
|
220
|
+
threshold: autoDecision.thresholdPercent,
|
|
221
|
+
currentTokens: totalTokens,
|
|
222
|
+
contextWindow: maxTokens,
|
|
223
|
+
thresholdTokens: autoDecision.thresholdTokens,
|
|
224
|
+
remainingTokens: autoDecision.remainingTokens,
|
|
225
|
+
safetyBufferTokens: autoDecision.safetyBufferTokens,
|
|
226
|
+
reason: autoDecision.reason ?? 'threshold',
|
|
166
227
|
});
|
|
167
228
|
}
|
|
168
229
|
deps.requestRender();
|
|
@@ -175,7 +236,17 @@ export async function handlePostTurnContextMaintenance(deps, turnId, totalTokens
|
|
|
175
236
|
specific: 'auto',
|
|
176
237
|
sessionId: deps.sessionId,
|
|
177
238
|
timestamp: Date.now(),
|
|
178
|
-
payload: {
|
|
239
|
+
payload: {
|
|
240
|
+
trigger: 'auto',
|
|
241
|
+
usagePct,
|
|
242
|
+
totalTokens,
|
|
243
|
+
maxTokens,
|
|
244
|
+
thresholdPercent: autoDecision.thresholdPercent,
|
|
245
|
+
thresholdTokens: autoDecision.thresholdTokens,
|
|
246
|
+
remainingTokens: autoDecision.remainingTokens,
|
|
247
|
+
safetyBufferTokens: autoDecision.safetyBufferTokens,
|
|
248
|
+
reason: autoDecision.reason,
|
|
249
|
+
},
|
|
179
250
|
}).catch((err) => {
|
|
180
251
|
logger.warn('Pre:compact:auto hook error', { error: summarizeError(err) });
|
|
181
252
|
return { ok: true };
|
|
@@ -225,7 +296,17 @@ export async function handlePostTurnContextMaintenance(deps, turnId, totalTokens
|
|
|
225
296
|
deps.setLastWarningBracket(0);
|
|
226
297
|
deps.conversation.addSystemMessage('Context auto-compacted. Conversation history summarized to free context window.');
|
|
227
298
|
deps.requestRender();
|
|
228
|
-
logger.info('Orchestrator: auto-compact complete', {
|
|
299
|
+
logger.info('Orchestrator: auto-compact complete', {
|
|
300
|
+
modelId: currentModel.registryKey,
|
|
301
|
+
usagePct,
|
|
302
|
+
totalTokens,
|
|
303
|
+
maxTokens,
|
|
304
|
+
thresholdPercent: autoDecision.thresholdPercent,
|
|
305
|
+
thresholdTokens: autoDecision.thresholdTokens,
|
|
306
|
+
remainingTokens: autoDecision.remainingTokens,
|
|
307
|
+
safetyBufferTokens: autoDecision.safetyBufferTokens,
|
|
308
|
+
reason: autoDecision.reason,
|
|
309
|
+
});
|
|
229
310
|
if (deps.hookDispatcher) {
|
|
230
311
|
deps.hookDispatcher.fire({
|
|
231
312
|
path: 'Post:compact:auto',
|
|
@@ -234,7 +315,17 @@ export async function handlePostTurnContextMaintenance(deps, turnId, totalTokens
|
|
|
234
315
|
specific: 'auto',
|
|
235
316
|
sessionId: deps.sessionId,
|
|
236
317
|
timestamp: Date.now(),
|
|
237
|
-
payload: {
|
|
318
|
+
payload: {
|
|
319
|
+
trigger: 'auto',
|
|
320
|
+
usagePct,
|
|
321
|
+
totalTokens,
|
|
322
|
+
maxTokens,
|
|
323
|
+
thresholdPercent: autoDecision.thresholdPercent,
|
|
324
|
+
thresholdTokens: autoDecision.thresholdTokens,
|
|
325
|
+
remainingTokens: autoDecision.remainingTokens,
|
|
326
|
+
safetyBufferTokens: autoDecision.safetyBufferTokens,
|
|
327
|
+
reason: autoDecision.reason,
|
|
328
|
+
},
|
|
238
329
|
}).catch((err) => { logger.warn('Post:compact:auto hook error', { error: summarizeError(err) }); });
|
|
239
330
|
}
|
|
240
331
|
}).catch((err) => {
|
|
@@ -251,7 +342,18 @@ export async function handlePostTurnContextMaintenance(deps, turnId, totalTokens
|
|
|
251
342
|
specific: 'auto',
|
|
252
343
|
sessionId: deps.sessionId,
|
|
253
344
|
timestamp: Date.now(),
|
|
254
|
-
payload: {
|
|
345
|
+
payload: {
|
|
346
|
+
trigger: 'auto',
|
|
347
|
+
usagePct,
|
|
348
|
+
totalTokens,
|
|
349
|
+
maxTokens,
|
|
350
|
+
thresholdPercent: autoDecision.thresholdPercent,
|
|
351
|
+
thresholdTokens: autoDecision.thresholdTokens,
|
|
352
|
+
remainingTokens: autoDecision.remainingTokens,
|
|
353
|
+
safetyBufferTokens: autoDecision.safetyBufferTokens,
|
|
354
|
+
reason: autoDecision.reason,
|
|
355
|
+
error: msg,
|
|
356
|
+
},
|
|
255
357
|
}).catch((err) => { logger.warn('Fail:compact:auto hook error', { error: summarizeError(err) }); });
|
|
256
358
|
}
|
|
257
359
|
});
|
|
@@ -266,14 +368,20 @@ export async function handlePostTurnContextMaintenance(deps, turnId, totalTokens
|
|
|
266
368
|
}
|
|
267
369
|
else if (warningsEnabled &&
|
|
268
370
|
autoCompactEnabled &&
|
|
269
|
-
(
|
|
371
|
+
usagePct >= Math.max(0, configuredThreshold - 10) &&
|
|
270
372
|
bracket > deps.lastWarningBracket) {
|
|
271
373
|
deps.setLastWarningBracket(bracket);
|
|
272
|
-
deps.conversation.addSystemMessage(`Context usage at ${usagePct}% (${totalTokens}/${maxTokens} tokens). Auto-compact will trigger
|
|
374
|
+
deps.conversation.addSystemMessage(`Context usage at ${usagePct}% (${totalTokens}/${maxTokens} tokens). Auto-compact will trigger at ${configuredThreshold}% or when the ${COMPACTION_BUFFER_TOKENS.toLocaleString()} token safety buffer is reached.`);
|
|
273
375
|
if (deps.runtimeBus) {
|
|
274
376
|
emitOpsContextWarning(deps.runtimeBus, deps.emitterContext(turnId), {
|
|
275
377
|
usage: usagePct,
|
|
276
|
-
threshold:
|
|
378
|
+
threshold: configuredThreshold,
|
|
379
|
+
currentTokens: totalTokens,
|
|
380
|
+
contextWindow: maxTokens,
|
|
381
|
+
thresholdTokens: Math.floor((maxTokens * configuredThreshold) / 100),
|
|
382
|
+
remainingTokens: Math.max(0, maxTokens - totalTokens),
|
|
383
|
+
safetyBufferTokens: COMPACTION_BUFFER_TOKENS,
|
|
384
|
+
reason: 'threshold',
|
|
277
385
|
});
|
|
278
386
|
}
|
|
279
387
|
deps.requestRender();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"facade-composition.d.ts","sourceRoot":"","sources":["../../../src/platform/daemon/facade-composition.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAqBvD,OAAO,KAAK,EAAE,oBAAoB,EAA0B,MAAM,wCAAwC,CAAC;AAG3G,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAEjE,OAAO,KAAK,EAAE,YAAY,EAAuB,MAAM,YAAY,CAAC;AAKpE,YAAY,EACV,2BAA2B,EAC3B,yBAAyB,EACzB,sCAAsC,GACvC,MAAM,mBAAmB,CAAC;AAC3B,OAAO,KAAK,EACV,2BAA2B,EAC3B,yBAAyB,EACzB,sCAAsC,EACvC,MAAM,mBAAmB,CAAC;AAI3B;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,8BAA8B,CAAC,gBAAgB,EAAE,gBAAgB,GAAG,oBAAoB,CA8HvG;AAED,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,YAAY,GAAG,2BAA2B,CAgJ5F;AAED,wBAAgB,+BAA+B,CAC7C,OAAO,EAAE,sCAAsC,GAC9C,yBAAyB,
|
|
1
|
+
{"version":3,"file":"facade-composition.d.ts","sourceRoot":"","sources":["../../../src/platform/daemon/facade-composition.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAqBvD,OAAO,KAAK,EAAE,oBAAoB,EAA0B,MAAM,wCAAwC,CAAC;AAG3G,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAEjE,OAAO,KAAK,EAAE,YAAY,EAAuB,MAAM,YAAY,CAAC;AAKpE,YAAY,EACV,2BAA2B,EAC3B,yBAAyB,EACzB,sCAAsC,GACvC,MAAM,mBAAmB,CAAC;AAC3B,OAAO,KAAK,EACV,2BAA2B,EAC3B,yBAAyB,EACzB,sCAAsC,EACvC,MAAM,mBAAmB,CAAC;AAI3B;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,8BAA8B,CAAC,gBAAgB,EAAE,gBAAgB,GAAG,oBAAoB,CA8HvG;AAED,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,YAAY,GAAG,2BAA2B,CAgJ5F;AAED,wBAAgB,+BAA+B,CAC7C,OAAO,EAAE,sCAAsC,GAC9C,yBAAyB,CA2K3B;AAED,wBAAgB,kCAAkC,CAAC,OAAO,EAAE;IAC1D,QAAQ,CAAC,aAAa,EAAE,OAAO,2BAA2B,EAAE,mBAAmB,CAAC;IAChF,QAAQ,CAAC,aAAa,EAAE,CAAC,KAAK,EAAE,UAAU,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,KAAK,OAAO,yBAAyB,EAAE,WAAW,GAAG,QAAQ,CAAC;IACzK,QAAQ,CAAC,4BAA4B,EAAE,CAAC,OAAO,EAAE,OAAO,yBAAyB,EAAE,sBAAsB,GAAG,SAAS,EAAE,KAAK,EAAE;QAC5H,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;QACzB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;QACtB,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;QACxC,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;QAC9C,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;KACzC,KAAK,IAAI,CAAC;CACZ,GAAG,IAAI,CAoBP"}
|
|
@@ -383,6 +383,8 @@ export function createDaemonFacadeCollaborators(options) {
|
|
|
383
383
|
watcherRegistry: runtime.watcherRegistry,
|
|
384
384
|
voiceService: runtime.voiceService,
|
|
385
385
|
webSearchService: runtime.webSearchService,
|
|
386
|
+
mcpRegistry: runtime.runtimeServices.mcpRegistry,
|
|
387
|
+
mcpConfigRoots: runtime.runtimeServices.shellPaths,
|
|
386
388
|
knowledgeService: runtime.knowledgeService,
|
|
387
389
|
homeGraphService: runtime.homeGraphService,
|
|
388
390
|
projectPlanningService: runtime.projectPlanningService,
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { McpRegistry } from '../../mcp/registry.js';
|
|
2
|
+
import type { McpConfigRoots } from '../../mcp/config.js';
|
|
3
|
+
import type { JsonRecord } from '../helpers.js';
|
|
4
|
+
interface McpRouteContext {
|
|
5
|
+
readonly mcpRegistry: Pick<McpRegistry, 'getEffectiveConfig' | 'reload' | 'upsertServerConfig' | 'removeServerConfig' | 'listServers' | 'listServerSecurity' | 'listServerSandboxBindings' | 'listAllTools'>;
|
|
6
|
+
readonly roots: McpConfigRoots;
|
|
7
|
+
readonly parseJsonBody: (req: Request) => Promise<JsonRecord | Response>;
|
|
8
|
+
readonly parseOptionalJsonBody: (req: Request) => Promise<JsonRecord | null | Response>;
|
|
9
|
+
readonly requireAdmin: (req: Request) => Response | null;
|
|
10
|
+
}
|
|
11
|
+
export declare function dispatchMcpRoutes(req: Request, context: McpRouteContext): Promise<Response | null>;
|
|
12
|
+
export {};
|
|
13
|
+
//# sourceMappingURL=mcp-routes.d.ts.map
|