@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.
Files changed (42) hide show
  1. package/dist/contracts/artifacts/operator-contract.json +1090 -4
  2. package/dist/events/ops.d.ts +6 -0
  3. package/dist/events/ops.d.ts.map +1 -1
  4. package/dist/platform/control-plane/method-catalog-runtime.d.ts.map +1 -1
  5. package/dist/platform/control-plane/method-catalog-runtime.js +150 -2
  6. package/dist/platform/core/context-compaction.d.ts +21 -7
  7. package/dist/platform/core/context-compaction.d.ts.map +1 -1
  8. package/dist/platform/core/context-compaction.js +42 -11
  9. package/dist/platform/core/orchestrator-context-runtime.d.ts.map +1 -1
  10. package/dist/platform/core/orchestrator-context-runtime.js +133 -25
  11. package/dist/platform/daemon/facade-composition.d.ts.map +1 -1
  12. package/dist/platform/daemon/facade-composition.js +2 -0
  13. package/dist/platform/daemon/http/mcp-routes.d.ts +13 -0
  14. package/dist/platform/daemon/http/mcp-routes.d.ts.map +1 -0
  15. package/dist/platform/daemon/http/mcp-routes.js +128 -0
  16. package/dist/platform/daemon/http/router.d.ts +2 -0
  17. package/dist/platform/daemon/http/router.d.ts.map +1 -1
  18. package/dist/platform/daemon/http/router.js +12 -0
  19. package/dist/platform/mcp/config.d.ts +27 -0
  20. package/dist/platform/mcp/config.d.ts.map +1 -1
  21. package/dist/platform/mcp/config.js +165 -46
  22. package/dist/platform/mcp/index.d.ts +3 -3
  23. package/dist/platform/mcp/index.d.ts.map +1 -1
  24. package/dist/platform/mcp/index.js +1 -1
  25. package/dist/platform/mcp/mcp-api.d.ts +24 -0
  26. package/dist/platform/mcp/mcp-api.d.ts.map +1 -1
  27. package/dist/platform/mcp/mcp-api.js +12 -0
  28. package/dist/platform/mcp/registry.d.ts +27 -2
  29. package/dist/platform/mcp/registry.d.ts.map +1 -1
  30. package/dist/platform/mcp/registry.js +106 -8
  31. package/dist/platform/runtime/bootstrap-hook-bridge.d.ts.map +1 -1
  32. package/dist/platform/runtime/bootstrap-hook-bridge.js +4 -3
  33. package/dist/platform/runtime/emitters/ops.d.ts +6 -0
  34. package/dist/platform/runtime/emitters/ops.d.ts.map +1 -1
  35. package/dist/platform/runtime/emitters/ops.js +1 -2
  36. package/dist/platform/tools/exec/runtime.d.ts.map +1 -1
  37. package/dist/platform/tools/exec/runtime.js +25 -1
  38. package/dist/platform/tools/exec/schema.d.ts +6 -1
  39. package/dist/platform/tools/exec/schema.d.ts.map +1 -1
  40. package/dist/platform/tools/exec/schema.js +5 -1
  41. package/dist/platform/version.js +1 -1
  42. package/package.json +9 -9
@@ -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
  | {
@@ -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;CACnB;AACH,iDAAiD;GAC/C;IACE,IAAI,EAAE,mBAAmB,CAAC;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,eAAe,EAAE,MAAM,CAAC;IACxB,gBAAgB,EAAE,MAAM,CAAC;IACzB,gBAAgB,EAAE,MAAM,CAAC;IACzB,KAAK,EAAE,MAAM,CAAC;CACf;AACH,8CAA8C;GAC5C;IACE,IAAI,EAAE,kBAAkB,CAAC;IACzB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC;CACf;AACH,mDAAmD;GACjD;IACE,IAAI,EAAE,oBAAoB,CAAC;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,qBAAqB,CAAC;IAC9B,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAC3B;AACH,+DAA+D;GAC7D;IACE,IAAI,EAAE,iBAAiB,CAAC;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,qBAAqB,CAAC;IAC9B,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAC3B;AACH,uCAAuC;GACrC;IACE,IAAI,EAAE,kBAAkB,CAAC;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,qBAAqB,CAAC;IAC9B,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAC3B;AACH,mDAAmD;GACjD;IACE,IAAI,EAAE,kBAAkB,CAAC;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,qBAAqB,CAAC;IAC9B,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAC3B;AACH,0CAA0C;GACxC;IACE,IAAI,EAAE,qBAAqB,CAAC;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,qBAAqB,CAAC;IAC9B,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAC3B;AACH,kDAAkD;GAChD;IACE,IAAI,EAAE,WAAW,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC;IAC7B,MAAM,EAAE,qBAAqB,CAAC;IAC9B,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1B,OAAO,EAAE,SAAS,GAAG,UAAU,GAAG,OAAO,CAAC;IAC1C,YAAY,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CACnC;AACH,wFAAwF;GACtF;IACE,IAAI,EAAE,0BAA0B,CAAC;IACjC,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;CACpB,CAAC;AAEN,8CAA8C;AAC9C,MAAM,MAAM,YAAY,GAAG,QAAQ,CAAC,MAAM,CAAC,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;AA4C1E,eAAO,MAAM,sCAAsC,EAAE,SAAS,uBAAuB,EA8RpF,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 15k token buffer threshold is exceeded
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 if the remaining context window is within COMPACTION_BUFFER_TOKENS
55
- * and compaction has not already been triggered.
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;CACvB;AAMD;;;;GAIG;AACH,eAAO,MAAM,wBAAwB,QAAS,CAAC;AAE/C;;;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;AAMvD;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,kBAAkB,GAAG,OAAO,CAInE;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"}
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 15k token buffer threshold is exceeded
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 if the remaining context window is within COMPACTION_BUFFER_TOKENS
81
- * and compaction has not already been triggered.
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
- const { currentTokens, contextWindow, isCompacting } = opts;
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":"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"}
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;AA0CpD,MAAM,MAAM,aAAa,GAAG;IAC1B,YAAY,EAAE,mBAAmB,CAAC;IAClC,aAAa,EAAE,MAAM,IAAI,CAAC;IAC1B,cAAc,EAAE,kBAAkB,GAAG,IAAI,CAAC;IAC1C,aAAa,EAAE,IAAI,CAAC,aAAa,EAAE,KAAK,CAAC,CAAC;IAC1C,gBAAgB,EAAE,gBAAgB,CAAC;IACnC,qBAAqB,EAAE,IAAI,CAAC,qBAAqB,EAAE,YAAY,GAAG,oBAAoB,CAAC,CAAC;IACxF,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,IAAI,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC;IACzC,cAAc,EAAE,IAAI,CAAC,cAAc,EAAE,YAAY,CAAC,CAAC;IACnD,WAAW,EAAE,IAAI,CAAC,oBAAoB,EAAE,WAAW,CAAC,GAAG,IAAI,CAAC;IAC5D,kBAAkB,EAAE,IAAI,CAAC,kBAAkB,EAAE,MAAM,CAAC,GAAG,IAAI,CAAC;IAC5D,UAAU,EAAE,eAAe,GAAG,IAAI,CAAC;IACnC,cAAc,EAAE,qBAAqB,CAAC;IACtC,YAAY,EAAE,OAAO,CAAC;IACtB,eAAe,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;CAC3C,CAAC;AAEF,wBAAsB,2BAA2B,CAC/C,IAAI,EAAE,aAAa,EACnB,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,eAAe,GACrB,OAAO,CAAC,IAAI,GAAG,WAAW,GAAG,OAAO,CAAC,CAmKvC;AAED,wBAAgB,wBAAwB,CACtC,YAAY,EAAE;IAAE,gBAAgB,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAA;CAAE,EAC7D,aAAa,EAAE,MAAM,IAAI,EACzB,OAAO,EAAE,MAAM,EACf,eAAe,EAAE,MAAM,EACvB,aAAa,EAAE,MAAM,EACrB,gBAAgB,EAAE,MAAM,EACxB,gBAAgB,EAAE,IAAI,CAAC,gBAAgB,EAAE,YAAY,GAAG,0BAA0B,CAAC,EACnF,IAAI,CAAC,EAAE,WAAW,GACjB,IAAI,CAuBN;AAED,MAAM,MAAM,mBAAmB,GAAG;IAChC,YAAY,EAAE,mBAAmB,CAAC;IAClC,YAAY,EAAE,IAAI,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC;IACzC,cAAc,EAAE,IAAI,CAAC,cAAc,EAAE,YAAY,CAAC,CAAC;IACnD,WAAW,EAAE,IAAI,CAAC,oBAAoB,EAAE,WAAW,CAAC,GAAG,IAAI,CAAC;IAC5D,kBAAkB,EAAE,IAAI,CAAC,kBAAkB,EAAE,MAAM,CAAC,GAAG,IAAI,CAAC;IAC5D,UAAU,EAAE,eAAe,GAAG,IAAI,CAAC;IACnC,cAAc,EAAE,qBAAqB,CAAC;IACtC,cAAc,EAAE,kBAAkB,GAAG,IAAI,CAAC;IAC1C,aAAa,EAAE,IAAI,CAAC,aAAa,EAAE,KAAK,CAAC,CAAC;IAC1C,gBAAgB,EAAE,gBAAgB,CAAC;IACnC,qBAAqB,EAAE,IAAI,CAAC,qBAAqB,EAAE,YAAY,GAAG,oBAAoB,CAAC,CAAC;IACxF,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,IAAI,CAAC;IAC1B,YAAY,EAAE,OAAO,CAAC;IACtB,eAAe,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;IAC1C,kBAAkB,EAAE,MAAM,CAAC;IAC3B,qBAAqB,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;CAChD,CAAC;AAEF,wBAAsB,gCAAgC,CACpD,IAAI,EAAE,mBAAmB,EACzB,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,IAAI,CAAC,CA8Mf"}
@@ -1,5 +1,5 @@
1
1
  import { logger } from '../utils/logger.js';
2
- import { estimateConversationTokens, COMPACTION_BUFFER_TOKENS, SMALL_WINDOW_THRESHOLD, compactSmallWindow, shouldAutoCompact } from './context-compaction.js';
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
- if (estimatedTokens <= contextWindow)
37
- return 'ok';
38
- const threshold = deps.configManager.get('behavior.autoCompactThreshold');
46
+ const threshold = readAutoCompactThreshold(deps.configManager);
39
47
  const autoCompactEnabled = threshold > 0;
40
- if (autoCompactEnabled && !deps.isCompacting) {
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 (~${Math.round(estimatedTokens / 1000)}K tokens) exceeds ${model.displayName} context window (${Math.round(contextWindow / 1000)}K). Auto-compacting...`);
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: { trigger: 'preflight', estimatedTokens, contextWindow },
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: { trigger: 'preflight', estimatedTokens, contextWindow },
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: { trigger: 'preflight', estimatedTokens, contextWindow, error: msg },
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 usagePct = Math.round((totalTokens / maxTokens) * 100);
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
- shouldAutoCompact({
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: COMPACTION_BUFFER_TOKENS,
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: { trigger: 'auto', usagePct, totalTokens, maxTokens },
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', { modelId: currentModel.registryKey, usagePct });
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: { trigger: 'auto', usagePct, totalTokens, maxTokens },
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: { trigger: 'auto', usagePct, totalTokens, maxTokens, error: msg },
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
- (maxTokens - totalTokens) <= COMPACTION_BUFFER_TOKENS * 2 &&
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 within ${COMPACTION_BUFFER_TOKENS.toLocaleString()} remaining tokens.`);
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: COMPACTION_BUFFER_TOKENS,
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,CAyK3B;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"}
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