@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.
Files changed (93) hide show
  1. package/dist/contracts/artifacts/operator-contract.json +4 -1
  2. package/dist/platform/agents/orchestrator-runner.d.ts.map +1 -1
  3. package/dist/platform/agents/orchestrator-runner.js +17 -3
  4. package/dist/platform/agents/wrfc-controller.d.ts.map +1 -1
  5. package/dist/platform/agents/wrfc-controller.js +10 -4
  6. package/dist/platform/automation/manager-runtime-delivery.d.ts +1 -1
  7. package/dist/platform/automation/manager-runtime-delivery.d.ts.map +1 -1
  8. package/dist/platform/automation/manager-runtime-delivery.js +4 -3
  9. package/dist/platform/channels/policy-manager.d.ts +8 -0
  10. package/dist/platform/channels/policy-manager.d.ts.map +1 -1
  11. package/dist/platform/channels/policy-manager.js +43 -1
  12. package/dist/platform/companion/companion-chat-manager.d.ts +1 -0
  13. package/dist/platform/companion/companion-chat-manager.d.ts.map +1 -1
  14. package/dist/platform/companion/companion-chat-manager.js +10 -0
  15. package/dist/platform/companion/companion-chat-routes.js +1 -0
  16. package/dist/platform/companion/companion-chat-types.d.ts +1 -0
  17. package/dist/platform/companion/companion-chat-types.d.ts.map +1 -1
  18. package/dist/platform/control-plane/approval-broker.d.ts +7 -0
  19. package/dist/platform/control-plane/approval-broker.d.ts.map +1 -1
  20. package/dist/platform/control-plane/approval-broker.js +30 -0
  21. package/dist/platform/control-plane/method-catalog-channels.d.ts.map +1 -1
  22. package/dist/platform/control-plane/method-catalog-channels.js +2 -0
  23. package/dist/platform/control-plane/method-catalog-email.d.ts.map +1 -1
  24. package/dist/platform/control-plane/method-catalog-email.js +1 -0
  25. package/dist/platform/core/compaction-sections.d.ts.map +1 -1
  26. package/dist/platform/core/compaction-sections.js +16 -5
  27. package/dist/platform/core/compaction-types.d.ts +7 -1
  28. package/dist/platform/core/compaction-types.d.ts.map +1 -1
  29. package/dist/platform/core/compaction-types.js +6 -0
  30. package/dist/platform/core/context-compaction.d.ts +20 -4
  31. package/dist/platform/core/context-compaction.d.ts.map +1 -1
  32. package/dist/platform/core/context-compaction.js +34 -7
  33. package/dist/platform/core/conversation-utils.js +1 -1
  34. package/dist/platform/core/conversation.js +1 -1
  35. package/dist/platform/core/orchestrator-turn-loop.d.ts.map +1 -1
  36. package/dist/platform/core/orchestrator-turn-loop.js +4 -2
  37. package/dist/platform/core/orchestrator.d.ts +12 -0
  38. package/dist/platform/core/orchestrator.d.ts.map +1 -1
  39. package/dist/platform/core/orchestrator.js +36 -8
  40. package/dist/platform/daemon/http/home-graph-routes.d.ts.map +1 -1
  41. package/dist/platform/daemon/http/home-graph-routes.js +2 -1
  42. package/dist/platform/daemon/http/project-planning-routes.d.ts.map +1 -1
  43. package/dist/platform/daemon/http/project-planning-routes.js +2 -1
  44. package/dist/platform/hooks/dispatcher.d.ts.map +1 -1
  45. package/dist/platform/hooks/dispatcher.js +4 -0
  46. package/dist/platform/hooks/runners/command.d.ts.map +1 -1
  47. package/dist/platform/hooks/runners/command.js +11 -2
  48. package/dist/platform/integrations/delivery.d.ts.map +1 -1
  49. package/dist/platform/integrations/delivery.js +0 -2
  50. package/dist/platform/intelligence/import-graph.d.ts.map +1 -1
  51. package/dist/platform/intelligence/import-graph.js +8 -0
  52. package/dist/platform/knowledge/extractors.d.ts.map +1 -1
  53. package/dist/platform/knowledge/extractors.js +30 -4
  54. package/dist/platform/mcp/client.d.ts +2 -0
  55. package/dist/platform/mcp/client.d.ts.map +1 -1
  56. package/dist/platform/mcp/client.js +17 -3
  57. package/dist/platform/mcp/registry.d.ts.map +1 -1
  58. package/dist/platform/mcp/registry.js +4 -0
  59. package/dist/platform/media/builtin-generation-providers.d.ts.map +1 -1
  60. package/dist/platform/media/builtin-generation-providers.js +2 -3
  61. package/dist/platform/media/provider-registry.d.ts.map +1 -1
  62. package/dist/platform/media/provider-registry.js +3 -1
  63. package/dist/platform/multimodal/service.d.ts.map +1 -1
  64. package/dist/platform/multimodal/service.js +18 -3
  65. package/dist/platform/providers/anthropic-sse-assembler.d.ts.map +1 -1
  66. package/dist/platform/providers/anthropic-sse-assembler.js +24 -0
  67. package/dist/platform/providers/capabilities.d.ts +6 -0
  68. package/dist/platform/providers/capabilities.d.ts.map +1 -1
  69. package/dist/platform/providers/capabilities.js +20 -1
  70. package/dist/platform/providers/gemini.d.ts.map +1 -1
  71. package/dist/platform/providers/gemini.js +55 -46
  72. package/dist/platform/providers/index.d.ts +1 -0
  73. package/dist/platform/providers/index.d.ts.map +1 -1
  74. package/dist/platform/providers/index.js +1 -0
  75. package/dist/platform/providers/model-limits.d.ts.map +1 -1
  76. package/dist/platform/providers/model-limits.js +14 -2
  77. package/dist/platform/runtime/store/domains/conversation.d.ts +0 -2
  78. package/dist/platform/runtime/store/domains/conversation.d.ts.map +1 -1
  79. package/dist/platform/runtime/store/domains/conversation.js +0 -1
  80. package/dist/platform/runtime/store/helpers/reducers/conversation.d.ts.map +1 -1
  81. package/dist/platform/runtime/store/helpers/reducers/conversation.js +20 -2
  82. package/dist/platform/runtime/store/helpers/reducers/lifecycle.d.ts.map +1 -1
  83. package/dist/platform/runtime/store/helpers/reducers/lifecycle.js +3 -0
  84. package/dist/platform/runtime/store/helpers/reducers/sync.d.ts.map +1 -1
  85. package/dist/platform/runtime/store/helpers/reducers/sync.js +7 -1
  86. package/dist/platform/runtime/ui-read-models-core.d.ts.map +1 -1
  87. package/dist/platform/runtime/ui-read-models-core.js +4 -1
  88. package/dist/platform/utils/error-display.d.ts.map +1 -1
  89. package/dist/platform/utils/error-display.js +14 -6
  90. package/dist/platform/version.js +1 -1
  91. package/dist/platform/voice/providers/shared.d.ts.map +1 -1
  92. package/dist/platform/voice/providers/shared.js +2 -3
  93. 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 performed so far (including this one). */
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;AAMD,8FAA8F;AAC9F,MAAM,WAAW,iBAAiB;IAChC,2EAA2E;IAC3E,QAAQ,EAAE,eAAe,EAAE,CAAC;IAE5B,yDAAyD;IACzD,eAAe,EAAE,SAAS,aAAa,EAAE,CAAC;IAE1C,kDAAkD;IAClD,MAAM,EAAE,WAAW,EAAE,CAAC;IAEtB,wDAAwD;IACxD,UAAU,EAAE,SAAS,EAAE,CAAC;IAExB,8CAA8C;IAC9C,UAAU,EAAE,aAAa,GAAG,IAAI,CAAC;IAEjC,0EAA0E;IAC1E,cAAc,EAAE,MAAM,EAAE,CAAC;IAEzB,sEAAsE;IACtE,YAAY,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAElC,mEAAmE;IACnE,eAAe,EAAE,MAAM,CAAC;IAExB,8EAA8E;IAC9E,aAAa,EAAE,MAAM,CAAC;IAEtB,uEAAuE;IACvE,OAAO,EAAE,MAAM,GAAG,QAAQ,CAAC;IAE3B,oEAAoE;IACpE,iBAAiB,EAAE,MAAM,CAAC;IAE1B,kEAAkE;IAClE,kBAAkB,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CACzC;AAMD,8CAA8C;AAC9C,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,wBAAwB,EAAE,MAAM,CAAC;IACjC,uBAAuB,EAAE,MAAM,CAAC;IAChC,oBAAoB,EAAE,MAAM,CAAC;IAC7B,mBAAmB,EAAE,MAAM,CAAC;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,GAAG,QAAQ,CAAC;IAC3B,kDAAkD;IAClD,gBAAgB,CAAC,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC;IACxC,iDAAiD;IACjD,gBAAgB,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;CACxC;AAED,wCAAwC;AACxC,MAAM,WAAW,gBAAgB;IAC/B,mFAAmF;IACnF,QAAQ,EAAE,eAAe,EAAE,CAAC;IAC5B,uCAAuC;IACvC,OAAO,EAAE,MAAM,CAAC;IAChB,mDAAmD;IACnD,oBAAoB,EAAE,MAAM,CAAC;IAC7B,mBAAmB,EAAE,MAAM,CAAC;IAC5B,gDAAgD;IAChD,KAAK,EAAE,eAAe,CAAC;IACvB,mDAAmD;IACnD,QAAQ,EAAE,iBAAiB,EAAE,CAAC;IAC9B,uEAAuE;IACvE,kBAAkB,EAAE,MAAM,EAAE,CAAC;CAC9B"}
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
- /** Usage percentage that triggers compaction. Defaults to 80. */
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
- * Tokens remaining in the context window at which auto-compaction triggers.
54
- * Compact when contextWindow - currentTokens <= COMPACTION_BUFFER_TOKENS.
55
- * 15k gives room for the ~6.5k compaction output + LLM extraction calls.
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,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;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"}
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
- * Tokens remaining in the context window at which auto-compaction triggers.
35
- * Compact when contextWindow - currentTokens <= COMPACTION_BUFFER_TOKENS.
36
- * 15k gives room for the ~6.5k compaction output + LLM extraction calls.
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 && thresholdPercent > 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 <= safetyBufferTokens) {
128
+ else if (currentTokens > 0 && effectiveBuffer > 0 && remainingTokens <= effectiveBuffer) {
102
129
  reason = 'safety-buffer';
103
130
  }
104
131
  }
@@ -44,7 +44,7 @@ export function restoreBranchMap(branches) {
44
44
  if (!branches)
45
45
  return restored;
46
46
  for (const [name, msgs] of Object.entries(branches)) {
47
- restored.set(name, msgs);
47
+ restored.set(name, cloneMessages(msgs));
48
48
  }
49
49
  return restored;
50
50
  }
@@ -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
- continueLoop = false;
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":"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"}
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 { PermissionError, ProviderError, ToolError, isNonTransientProviderFailure } from '../types/errors.js';
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 (iterative, not recursive)
319
- while (this.messageQueue.length > 0) {
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) => { this.autoSpawnTimeout = 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.isCompacting = value; },
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.isCompacting = value; },
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;AAetC,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
+ {"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 Response.json({ error: error instanceof Error ? error.message : String(error) }, { status: 400 });
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;AAElC,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
+ {"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 Response.json({ error: error instanceof Error ? error.message : String(error) }, { status: 400 });
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;IA+IjD,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"}
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,CAsErF"}
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 new Response(proc.stdout).text();
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;AA4BlD;;;GAGG;AACH,iBAAS,yBAAyB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,CAS5D;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"}
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;AAI5D,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;AAggBD,wBAAsB,wBAAwB,CAC5C,QAAQ,EAAE,IAAI,CAAC,cAAc,EAAE,IAAI,GAAG,UAAU,GAAG,UAAU,CAAC,EAC9D,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,yBAAyB,CAAC,CA4CpC"}
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(/&nbsp;/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 = typeof parsed === 'object' && parsed !== null && !Array.isArray(parsed)
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 extractDocx(buffer);
544
+ return extractOfficeWithFallback(buffer, 'docx', extractDocx);
524
545
  case 'xlsx':
525
- return extractXlsx(buffer);
546
+ return extractOfficeWithFallback(buffer, 'xlsx', extractXlsx);
526
547
  case 'pptx':
527
- return extractPptx(buffer);
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) */