@pellux/goodvibes-sdk 1.2.0 → 1.3.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 (120) hide show
  1. package/dist/contracts/artifacts/operator-contract.json +26 -2
  2. package/dist/platform/companion/companion-chat-manager.d.ts +6 -12
  3. package/dist/platform/companion/companion-chat-manager.d.ts.map +1 -1
  4. package/dist/platform/companion/companion-chat-manager.js +8 -2
  5. package/dist/platform/config/index.d.ts +2 -1
  6. package/dist/platform/config/index.d.ts.map +1 -1
  7. package/dist/platform/config/index.js +1 -0
  8. package/dist/platform/config/manager.d.ts +35 -0
  9. package/dist/platform/config/manager.d.ts.map +1 -1
  10. package/dist/platform/config/manager.js +98 -2
  11. package/dist/platform/config/shared-config-tier.d.ts +51 -0
  12. package/dist/platform/config/shared-config-tier.d.ts.map +1 -0
  13. package/dist/platform/config/shared-config-tier.js +127 -0
  14. package/dist/platform/control-plane/operator-contract-schemas-knowledge.d.ts.map +1 -1
  15. package/dist/platform/control-plane/operator-contract-schemas-knowledge.js +6 -1
  16. package/dist/platform/control-plane/operator-contract-schemas-runtime.d.ts.map +1 -1
  17. package/dist/platform/control-plane/operator-contract-schemas-runtime.js +2 -1
  18. package/dist/platform/daemon/facade-composition.d.ts.map +1 -1
  19. package/dist/platform/daemon/facade-composition.js +1 -0
  20. package/dist/platform/daemon/homeassistant-chat.d.ts +4 -1
  21. package/dist/platform/daemon/homeassistant-chat.d.ts.map +1 -1
  22. package/dist/platform/daemon/homeassistant-chat.js +1 -1
  23. package/dist/platform/daemon/http/homeassistant-routes.d.ts.map +1 -1
  24. package/dist/platform/daemon/http/homeassistant-routes.js +28 -2
  25. package/dist/platform/integrations/webhooks.d.ts +15 -0
  26. package/dist/platform/integrations/webhooks.d.ts.map +1 -1
  27. package/dist/platform/integrations/webhooks.js +18 -0
  28. package/dist/platform/knowledge/extraction-policy.d.ts +12 -1
  29. package/dist/platform/knowledge/extraction-policy.d.ts.map +1 -1
  30. package/dist/platform/knowledge/extraction-policy.js +19 -1
  31. package/dist/platform/knowledge/graphql-schema.d.ts +1 -1
  32. package/dist/platform/knowledge/graphql-schema.d.ts.map +1 -1
  33. package/dist/platform/knowledge/graphql-schema.js +5 -0
  34. package/dist/platform/knowledge/home-graph/index.d.ts.map +1 -1
  35. package/dist/platform/knowledge/home-graph/index.js +4 -0
  36. package/dist/platform/knowledge/home-graph/link.d.ts +2 -2
  37. package/dist/platform/knowledge/home-graph/link.d.ts.map +1 -1
  38. package/dist/platform/knowledge/home-graph/link.js +60 -9
  39. package/dist/platform/knowledge/home-graph/refinement.d.ts +14 -9
  40. package/dist/platform/knowledge/home-graph/refinement.d.ts.map +1 -1
  41. package/dist/platform/knowledge/home-graph/refinement.js +18 -3
  42. package/dist/platform/knowledge/home-graph/reset.js +21 -4
  43. package/dist/platform/knowledge/home-graph/service.d.ts +10 -11
  44. package/dist/platform/knowledge/home-graph/service.d.ts.map +1 -1
  45. package/dist/platform/knowledge/home-graph/triage.d.ts +103 -0
  46. package/dist/platform/knowledge/home-graph/triage.d.ts.map +1 -0
  47. package/dist/platform/knowledge/home-graph/triage.js +362 -0
  48. package/dist/platform/knowledge/home-graph/types.d.ts +15 -0
  49. package/dist/platform/knowledge/home-graph/types.d.ts.map +1 -1
  50. package/dist/platform/knowledge/knowledge-api.d.ts +6 -0
  51. package/dist/platform/knowledge/knowledge-api.d.ts.map +1 -1
  52. package/dist/platform/knowledge/knowledge-api.js +5 -0
  53. package/dist/platform/knowledge/knowledge-history-types.d.ts +56 -0
  54. package/dist/platform/knowledge/knowledge-history-types.d.ts.map +1 -0
  55. package/dist/platform/knowledge/knowledge-history-types.js +1 -0
  56. package/dist/platform/knowledge/packet.d.ts.map +1 -1
  57. package/dist/platform/knowledge/packet.js +27 -3
  58. package/dist/platform/knowledge/scope-records.js +4 -2
  59. package/dist/platform/knowledge/semantic/answer-gaps.d.ts +8 -0
  60. package/dist/platform/knowledge/semantic/answer-gaps.d.ts.map +1 -1
  61. package/dist/platform/knowledge/semantic/answer-gaps.js +26 -6
  62. package/dist/platform/knowledge/semantic/enrichment.d.ts.map +1 -1
  63. package/dist/platform/knowledge/semantic/enrichment.js +15 -13
  64. package/dist/platform/knowledge/semantic/graph-index.d.ts.map +1 -1
  65. package/dist/platform/knowledge/semantic/graph-index.js +3 -1
  66. package/dist/platform/knowledge/semantic/service.d.ts +7 -0
  67. package/dist/platform/knowledge/semantic/service.d.ts.map +1 -1
  68. package/dist/platform/knowledge/semantic/service.js +10 -1
  69. package/dist/platform/knowledge/service-node-admin.d.ts +46 -0
  70. package/dist/platform/knowledge/service-node-admin.d.ts.map +1 -0
  71. package/dist/platform/knowledge/service-node-admin.js +72 -0
  72. package/dist/platform/knowledge/service.d.ts +24 -20
  73. package/dist/platform/knowledge/service.d.ts.map +1 -1
  74. package/dist/platform/knowledge/service.js +23 -47
  75. package/dist/platform/knowledge/store-config.d.ts +34 -0
  76. package/dist/platform/knowledge/store-config.d.ts.map +1 -1
  77. package/dist/platform/knowledge/store-config.js +23 -0
  78. package/dist/platform/knowledge/store-load.d.ts +3 -1
  79. package/dist/platform/knowledge/store-load.d.ts.map +1 -1
  80. package/dist/platform/knowledge/store-load.js +3 -1
  81. package/dist/platform/knowledge/store-node-history.d.ts +49 -0
  82. package/dist/platform/knowledge/store-node-history.d.ts.map +1 -0
  83. package/dist/platform/knowledge/store-node-history.js +331 -0
  84. package/dist/platform/knowledge/store-record-delete.d.ts +25 -0
  85. package/dist/platform/knowledge/store-record-delete.d.ts.map +1 -0
  86. package/dist/platform/knowledge/store-record-delete.js +84 -0
  87. package/dist/platform/knowledge/store-schema.d.ts +3 -1
  88. package/dist/platform/knowledge/store-schema.d.ts.map +1 -1
  89. package/dist/platform/knowledge/store-schema.js +66 -0
  90. package/dist/platform/knowledge/store.d.ts +19 -1
  91. package/dist/platform/knowledge/store.d.ts.map +1 -1
  92. package/dist/platform/knowledge/store.js +69 -108
  93. package/dist/platform/knowledge/types.d.ts +18 -0
  94. package/dist/platform/knowledge/types.d.ts.map +1 -1
  95. package/dist/platform/providers/registry.d.ts +18 -0
  96. package/dist/platform/providers/registry.d.ts.map +1 -1
  97. package/dist/platform/providers/registry.js +49 -3
  98. package/dist/platform/providers/runtime-snapshot.d.ts.map +1 -1
  99. package/dist/platform/providers/runtime-snapshot.js +14 -2
  100. package/dist/platform/runtime/memory-spine/client.d.ts +12 -0
  101. package/dist/platform/runtime/memory-spine/client.d.ts.map +1 -1
  102. package/dist/platform/runtime/memory-spine/client.js +14 -4
  103. package/dist/platform/runtime/memory-spine/index.d.ts +1 -0
  104. package/dist/platform/runtime/memory-spine/index.d.ts.map +1 -1
  105. package/dist/platform/runtime/memory-spine/index.js +1 -0
  106. package/dist/platform/runtime/memory-spine/recall-snapshot.d.ts.map +1 -1
  107. package/dist/platform/runtime/memory-spine/recall-snapshot.js +16 -3
  108. package/dist/platform/runtime/memory-spine/wire-verb-availability.d.ts +59 -0
  109. package/dist/platform/runtime/memory-spine/wire-verb-availability.d.ts.map +1 -0
  110. package/dist/platform/runtime/memory-spine/wire-verb-availability.js +114 -0
  111. package/dist/platform/runtime/services.d.ts.map +1 -1
  112. package/dist/platform/runtime/services.js +3 -12
  113. package/dist/platform/state/memory-recall-contract.d.ts +7 -0
  114. package/dist/platform/state/memory-recall-contract.d.ts.map +1 -1
  115. package/dist/platform/state/memory-recall-contract.js +2 -0
  116. package/dist/platform/utils/notify.d.ts +25 -1
  117. package/dist/platform/utils/notify.d.ts.map +1 -1
  118. package/dist/platform/utils/notify.js +29 -1
  119. package/dist/platform/version.js +1 -1
  120. package/package.json +9 -9
@@ -510,8 +510,13 @@ export const KNOWLEDGE_PACKET_SCHEMA = objectSchema({
510
510
  strategy: STRING_SCHEMA,
511
511
  budgetLimit: NUMBER_SCHEMA,
512
512
  estimatedTokens: NUMBER_SCHEMA,
513
+ truncated: BOOLEAN_SCHEMA,
514
+ totalCandidates: NUMBER_SCHEMA,
515
+ droppedCount: NUMBER_SCHEMA,
516
+ droppedForBudget: NUMBER_SCHEMA,
517
+ budgetExhausted: BOOLEAN_SCHEMA,
513
518
  items: arraySchema(KNOWLEDGE_PACKET_ITEM_SCHEMA),
514
- }, ['task', 'writeScope', 'generatedAt', 'detail', 'strategy', 'budgetLimit', 'estimatedTokens', 'items']);
519
+ }, ['task', 'writeScope', 'generatedAt', 'detail', 'strategy', 'budgetLimit', 'estimatedTokens', 'truncated', 'totalCandidates', 'droppedCount', 'droppedForBudget', 'budgetExhausted', 'items']);
515
520
  const KNOWLEDGE_USAGE_SCHEMA = objectSchema({
516
521
  id: STRING_SCHEMA,
517
522
  targetKind: STRING_SCHEMA,
@@ -1 +1 @@
1
- {"version":3,"file":"operator-contract-schemas-runtime.d.ts","sourceRoot":"","sources":["../../../src/platform/control-plane/operator-contract-schemas-runtime.ts"],"names":[],"mappings":"AAmCA;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,+BAA+B,EAAyB,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AA6B7F,eAAO,MAAM,iCAAiC,yBAQA,CAAC;AAE/C;;;;;GAKG;AACH,eAAO,MAAM,oCAAoC,yBAOe,CAAC;AAEjE,eAAO,MAAM,6BAA6B,yBAasB,CAAC;AAEjE,eAAO,MAAM,4BAA4B,yBAuBqI,CAAC;AAE/K,eAAO,MAAM,6BAA6B,yBAYsF,CAAC;AAEjI,eAAO,MAAM,6BAA6B,yBAO4B,CAAC;AAEvE,eAAO,MAAM,2CAA2C,yBAG7B,CAAC;AAE5B,eAAO,MAAM,mCAAmC,yBAOtB,CAAC;AAE3B,eAAO,MAAM,mCAAmC,yBAGnB,CAAC;AAE9B,eAAO,MAAM,oCAAoC,yBAkB/C,CAAC;AAEH,eAAO,MAAM,kCAAkC,yBAqB0D,CAAC;AAE1G,eAAO,MAAM,uBAAuB,yBAWoE,CAAC;AAEzG,eAAO,MAAM,8BAA8B,yBAOjB,CAAC;AAE3B,eAAO,MAAM,mCAAmC,yBAGrB,CAAC;AAE5B,eAAO,MAAM,iCAAiC,yBAGrB,CAAC;AAE1B,eAAO,MAAM,mCAAmC,yBAEjC,CAAC;AAEhB;;;;;;GAMG;AACH,eAAO,MAAM,qCAAqC,yBAIvB,CAAC;AAE5B,eAAO,MAAM,+CAA+C,yBAIlB,CAAC;AAE3C,eAAO,MAAM,2CAA2C,yBAMF,CAAC;AAEvD,eAAO,MAAM,0CAA0C;;CAK7C,CAAC;AAUX,eAAO,MAAM,mBAAmB,yBAqByD,CAAC;AAE1F,eAAO,MAAM,oBAAoB,yBAsBsB,CAAC;AAExD,eAAO,MAAM,wBAAwB,yBAgBO,CAAC;AAE7C,eAAO,MAAM,yBAAyB,yBASc,CAAC;AAErD,eAAO,MAAM,kBAAkB,yBAEnB,CAAC;AAEb,eAAO,MAAM,yBAAyB,yBAIM,CAAC;AAE7C,eAAO,MAAM,yBAAyB,yBAUiE,CAAC;AAWxG,eAAO,MAAM,6BAA6B,yBAgB8C,CAAC;AAEzF,eAAO,MAAM,wBAAwB,yBASuG,CAAC;AAE7I,eAAO,MAAM,4BAA4B,yBAIU,CAAC;AAOpD,eAAO,MAAM,6BAA6B,yBAKS,CAAC;AAEpD,eAAO,MAAM,6BAA6B,yBAE1B,CAAC;AA0EjB,eAAO,MAAM,gCAAgC,yBAMkB,CAAC;AAEhE,eAAO,MAAM,8BAA8B,yBAcqD,CAAC;AAqEjG,eAAO,MAAM,gCAAgC,yBAKmB,CAAC;AAEjE,eAAO,MAAM,sBAAsB,yBAcyF,CAAC;AAE7H,eAAO,MAAM,4BAA4B,yBASyG,CAAC;AAqBnJ,eAAO,MAAM,0BAA0B,yBAUyH,CAAC;AAEjK,eAAO,MAAM,2BAA2B,yBAIC,CAAC;AAG1C,eAAO,MAAM,mBAAmB,yBAA6C,CAAC;AAC9E,eAAO,MAAM,mBAAmB,yBAE9B,CAAC;AACH,eAAO,MAAM,0BAA0B,yBAA6D,CAAC;AACrG,eAAO,MAAM,6BAA6B,yBAA2D,CAAC;AAEtG,eAAO,MAAM,6BAA6B,yBAIvB,CAAC;AAEpB,eAAO,MAAM,oBAAoB,yBAeiH,CAAC;AAEnJ,eAAO,MAAM,kCAAkC,yBAUiI,CAAC;AAEjL,eAAO,MAAM,kCAAkC,yBAG1B,CAAC;AAItB,eAAO,MAAM,kBAAkB,yBAKgB,CAAC;AAIhD,eAAO,MAAM,6BAA6B,yBAKL,CAAC;AAEtC,eAAO,MAAM,oBAAoB,yBAQ2D,CAAC;AAE7F,eAAO,MAAM,2BAA2B,yBAIkB,CAAC;AAE3D,eAAO,MAAM,gCAAgC,yBAE9B,CAAC;AAEhB,eAAO,MAAM,oCAAoC,yBAElC,CAAC;AAEhB,eAAO,MAAM,iCAAiC,yBAEjC,CAAC"}
1
+ {"version":3,"file":"operator-contract-schemas-runtime.d.ts","sourceRoot":"","sources":["../../../src/platform/control-plane/operator-contract-schemas-runtime.ts"],"names":[],"mappings":"AAmCA;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,+BAA+B,EAAyB,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AA6B7F,eAAO,MAAM,iCAAiC,yBAQA,CAAC;AAE/C;;;;;GAKG;AACH,eAAO,MAAM,oCAAoC,yBAOe,CAAC;AAEjE,eAAO,MAAM,6BAA6B,yBAasB,CAAC;AAEjE,eAAO,MAAM,4BAA4B,yBAuBqI,CAAC;AAE/K,eAAO,MAAM,6BAA6B,yBAYsF,CAAC;AAEjI,eAAO,MAAM,6BAA6B,yBAO4B,CAAC;AAEvE,eAAO,MAAM,2CAA2C,yBAG7B,CAAC;AAE5B,eAAO,MAAM,mCAAmC,yBAOtB,CAAC;AAE3B,eAAO,MAAM,mCAAmC,yBAGnB,CAAC;AAE9B,eAAO,MAAM,oCAAoC,yBAkB/C,CAAC;AAEH,eAAO,MAAM,kCAAkC,yBAqB0D,CAAC;AAE1G,eAAO,MAAM,uBAAuB,yBAWoE,CAAC;AAEzG,eAAO,MAAM,8BAA8B,yBAOjB,CAAC;AAE3B,eAAO,MAAM,mCAAmC,yBAGrB,CAAC;AAE5B,eAAO,MAAM,iCAAiC,yBAGrB,CAAC;AAE1B,eAAO,MAAM,mCAAmC,yBAEjC,CAAC;AAEhB;;;;;;GAMG;AACH,eAAO,MAAM,qCAAqC,yBAIvB,CAAC;AAE5B,eAAO,MAAM,+CAA+C,yBAIlB,CAAC;AAE3C,eAAO,MAAM,2CAA2C,yBAMF,CAAC;AAEvD,eAAO,MAAM,0CAA0C;;CAK7C,CAAC;AAUX,eAAO,MAAM,mBAAmB,yBAqByD,CAAC;AAE1F,eAAO,MAAM,oBAAoB,yBAsBsB,CAAC;AAExD,eAAO,MAAM,wBAAwB,yBAgBO,CAAC;AAE7C,eAAO,MAAM,yBAAyB,yBASc,CAAC;AAErD,eAAO,MAAM,kBAAkB,yBAEnB,CAAC;AAEb,eAAO,MAAM,yBAAyB,yBAIM,CAAC;AAE7C,eAAO,MAAM,yBAAyB,yBAUiE,CAAC;AAWxG,eAAO,MAAM,6BAA6B,yBAgB8C,CAAC;AAEzF,eAAO,MAAM,wBAAwB,yBASuG,CAAC;AAE7I,eAAO,MAAM,4BAA4B,yBAIU,CAAC;AAOpD,eAAO,MAAM,6BAA6B,yBAKS,CAAC;AAEpD,eAAO,MAAM,6BAA6B,yBAE1B,CAAC;AA0EjB,eAAO,MAAM,gCAAgC,yBAMkB,CAAC;AAEhE,eAAO,MAAM,8BAA8B,yBAcqD,CAAC;AAqEjG,eAAO,MAAM,gCAAgC,yBAKmB,CAAC;AAEjE,eAAO,MAAM,sBAAsB,yBAcyF,CAAC;AAE7H,eAAO,MAAM,4BAA4B,yBASyG,CAAC;AAqBnJ,eAAO,MAAM,0BAA0B,yBAUyH,CAAC;AAEjK,eAAO,MAAM,2BAA2B,yBAIC,CAAC;AAG1C,eAAO,MAAM,mBAAmB,yBAA6C,CAAC;AAC9E,eAAO,MAAM,mBAAmB,yBAE9B,CAAC;AACH,eAAO,MAAM,0BAA0B,yBAA6D,CAAC;AACrG,eAAO,MAAM,6BAA6B,yBAA2D,CAAC;AAEtG,eAAO,MAAM,6BAA6B,yBAIvB,CAAC;AAEpB,eAAO,MAAM,oBAAoB,yBAeiH,CAAC;AAEnJ,eAAO,MAAM,kCAAkC,yBAWgJ,CAAC;AAEhM,eAAO,MAAM,kCAAkC,yBAG1B,CAAC;AAItB,eAAO,MAAM,kBAAkB,yBAKgB,CAAC;AAIhD,eAAO,MAAM,6BAA6B,yBAKL,CAAC;AAEtC,eAAO,MAAM,oBAAoB,yBAQ2D,CAAC;AAE7F,eAAO,MAAM,2BAA2B,yBAIkB,CAAC;AAE3D,eAAO,MAAM,gCAAgC,yBAE9B,CAAC;AAEhB,eAAO,MAAM,oCAAoC,yBAElC,CAAC;AAEhB,eAAO,MAAM,iCAAiC,yBAEjC,CAAC"}
@@ -658,7 +658,8 @@ export const MEMORY_RECORD_SEARCH_OUTPUT_SCHEMA = objectSchema({
658
658
  excludedFlaggedCount: NUMBER_SCHEMA,
659
659
  excludedBelowFloorCount: NUMBER_SCHEMA,
660
660
  totalBeforeRecallFilter: NUMBER_SCHEMA,
661
- }, ['records', 'mode', 'requestedSemantic', 'indexUnavailableReason', 'caveat', 'recallFiltered', 'excludedFlaggedCount', 'excludedBelowFloorCount', 'totalBeforeRecallFilter']);
661
+ recallFloor: NUMBER_SCHEMA,
662
+ }, ['records', 'mode', 'requestedSemantic', 'indexUnavailableReason', 'caveat', 'recallFiltered', 'excludedFlaggedCount', 'excludedBelowFloorCount', 'totalBeforeRecallFilter', 'recallFloor']);
662
663
  export const MEMORY_RECORD_DELETE_OUTPUT_SCHEMA = objectSchema({
663
664
  id: STRING_SCHEMA,
664
665
  deleted: BOOLEAN_SCHEMA,
@@ -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;AA6BvD,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;AAiD3B;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,8BAA8B,CAAC,gBAAgB,EAAE,gBAAgB,GAAG,oBAAoB,CA8HvG;AAED,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,YAAY,GAAG,2BAA2B,CAwJ5F;AAED,wBAAgB,+BAA+B,CAC7C,OAAO,EAAE,sCAAsC,GAC9C,yBAAyB,CA4K3B;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;AA6BvD,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;AAkD3B;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,8BAA8B,CAAC,gBAAgB,EAAE,gBAAgB,GAAG,oBAAoB,CA8HvG;AAED,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,YAAY,GAAG,2BAA2B,CAwJ5F;AAED,wBAAgB,+BAA+B,CAC7C,OAAO,EAAE,sCAAsC,GAC9C,yBAAyB,CA4K3B;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"}
@@ -35,6 +35,7 @@ function ensureAgentKnowledgeService(runtimeServices) {
35
35
  const store = new KnowledgeStore({
36
36
  configManager: runtimeServices.configManager,
37
37
  dbFileName: GOODVIBES_AGENT_KNOWLEDGE_DB_FILE,
38
+ family: 'agent',
38
39
  });
39
40
  const semanticLlm = createProviderBackedKnowledgeSemanticLlm(runtimeServices.providerRegistry, {
40
41
  timeoutMs: 20_000,
@@ -1,7 +1,7 @@
1
1
  import type { AutomationRouteBinding } from '../automation/routes.js';
2
2
  import type { RouteBindingManager } from '../channels/index.js';
3
3
  import type { CompanionChatManager } from '../companion/companion-chat-manager.js';
4
- import type { CompanionChatSession } from '../companion/companion-chat-types.js';
4
+ import type { CompanionChatSession, CompanionChatTurnEvent } from '../companion/companion-chat-types.js';
5
5
  import type { ConfigManager } from '../config/manager.js';
6
6
  export declare const HOME_ASSISTANT_DEFAULT_REMOTE_SESSION_TTL_MS: number;
7
7
  type JsonRecord = Record<string, unknown>;
@@ -54,6 +54,9 @@ export declare function postHomeAssistantChatMessage(runtime: HomeAssistantChatR
54
54
  readonly wait?: boolean;
55
55
  readonly timeoutMs?: number | undefined;
56
56
  readonly clientId?: string;
57
+ /** In-process tap for the turn's incremental events, forwarded to the chat
58
+ * manager so a caller (the SSE route) can stream deltas while awaiting the reply. */
59
+ readonly onTurnEvent?: ((event: CompanionChatTurnEvent) => void) | undefined;
57
60
  }): Promise<HomeAssistantChatPostResult>;
58
61
  export declare function resolveHomeAssistantChatSession(runtime: HomeAssistantChatRuntime, input: HomeAssistantChatInput): Promise<HomeAssistantChatResolution>;
59
62
  export declare function readHomeAssistantRemoteSessionTtlMs(configManager: ConfigReader, value: unknown): number;
@@ -1 +1 @@
1
- {"version":3,"file":"homeassistant-chat.d.ts","sourceRoot":"","sources":["../../../src/platform/daemon/homeassistant-chat.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"homeassistant-chat.d.ts","sourceRoot":"","sources":["../../../src/platform/daemon/homeassistant-chat.ts"],"names":[],"mappings":"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"}
@@ -9,7 +9,7 @@ export async function postHomeAssistantChatMessage(runtime, input, options = {})
9
9
  const messageId = await runtime.chatManager.postMessage(resolution.session.id, formatHomeAssistantUserMessage(input), clientId);
10
10
  return { ...resolution, messageId };
11
11
  }
12
- const reply = await runtime.chatManager.postMessageAndWaitForReply(resolution.session.id, formatHomeAssistantUserMessage(input), clientId, { timeoutMs: options.timeoutMs });
12
+ const reply = await runtime.chatManager.postMessageAndWaitForReply(resolution.session.id, formatHomeAssistantUserMessage(input), clientId, { timeoutMs: options.timeoutMs, ...(options.onTurnEvent ? { onTurnEvent: options.onTurnEvent } : {}) });
13
13
  return {
14
14
  ...resolution,
15
15
  messageId: reply.messageId,
@@ -1 +1 @@
1
- {"version":3,"file":"homeassistant-routes.d.ts","sourceRoot":"","sources":["../../../../src/platform/daemon/http/homeassistant-routes.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AACnE,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACtF,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAW7D,KAAK,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAkC1C,UAAU,yBAAyB;IACjC,QAAQ,CAAC,aAAa,EAAE,IAAI,CAAC,aAAa,EAAE,KAAK,CAAC,CAAC;IACnD,QAAQ,CAAC,aAAa,EAAE,IAAI,CAAC,mBAAmB,EAAE,OAAO,GAAG,eAAe,GAAG,cAAc,CAAC,CAAC;IAC9F,QAAQ,CAAC,WAAW,EAAE,oBAAoB,CAAC;IAC3C,QAAQ,CAAC,aAAa,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,OAAO,CAAC,UAAU,GAAG,QAAQ,CAAC,CAAC;IACzE,QAAQ,CAAC,2BAA2B,CAAC,EAAE,CAAC,MAAM;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC,GAAG,SAAS,CAAC;CACvG;AAQD,qBAAa,+BAA+B;IAG9B,OAAO,CAAC,QAAQ,CAAC,OAAO;IAFpC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAgD;gBAEhD,OAAO,EAAE,yBAAyB;IAEzD,MAAM,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC;IA6BpD,OAAO,CAAC,cAAc;YA2BR,kBAAkB;IAmGhC,OAAO,CAAC,eAAe;IASvB,OAAO,CAAC,kBAAkB;IA2B1B,OAAO,CAAC,kBAAkB;IAc1B,OAAO,CAAC,UAAU;IAuClB,OAAO,CAAC,YAAY;IAepB,OAAO,CAAC,sBAAsB;CAG/B"}
1
+ {"version":3,"file":"homeassistant-routes.d.ts","sourceRoot":"","sources":["../../../../src/platform/daemon/http/homeassistant-routes.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AACnE,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AAEtF,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAW7D,KAAK,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAkC1C,UAAU,yBAAyB;IACjC,QAAQ,CAAC,aAAa,EAAE,IAAI,CAAC,aAAa,EAAE,KAAK,CAAC,CAAC;IACnD,QAAQ,CAAC,aAAa,EAAE,IAAI,CAAC,mBAAmB,EAAE,OAAO,GAAG,eAAe,GAAG,cAAc,CAAC,CAAC;IAC9F,QAAQ,CAAC,WAAW,EAAE,oBAAoB,CAAC;IAC3C,QAAQ,CAAC,aAAa,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,OAAO,CAAC,UAAU,GAAG,QAAQ,CAAC,CAAC;IACzE,QAAQ,CAAC,2BAA2B,CAAC,EAAE,CAAC,MAAM;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC,GAAG,SAAS,CAAC;CACvG;AAQD,qBAAa,+BAA+B;IAG9B,OAAO,CAAC,QAAQ,CAAC,OAAO;IAFpC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAgD;gBAEhD,OAAO,EAAE,yBAAyB;IAEzD,MAAM,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC;IA6BpD,OAAO,CAAC,cAAc;YA2BR,kBAAkB;IAuGhC,OAAO,CAAC,eAAe;IASvB,OAAO,CAAC,kBAAkB;IAmD1B,OAAO,CAAC,kBAAkB;IAc1B,OAAO,CAAC,UAAU;IAuClB,OAAO,CAAC,YAAY;IAepB,OAAO,CAAC,sBAAsB;CAG/B"}
@@ -62,7 +62,7 @@ export class HomeAssistantConversationRoutes {
62
62
  ],
63
63
  };
64
64
  }
65
- async submitConversation(body) {
65
+ async submitConversation(body, onTurnEvent) {
66
66
  if (!Boolean(this.context.configManager.get('surfaces.homeassistant.enabled'))) {
67
67
  return {
68
68
  ok: false,
@@ -105,6 +105,7 @@ export class HomeAssistantConversationRoutes {
105
105
  wait: input.wait,
106
106
  timeoutMs: input.waitTimeoutMs,
107
107
  clientId: `homeassistant:${input.surfaceId}:${input.conversationId}`,
108
+ ...(onTurnEvent ? { onTurnEvent } : {}),
108
109
  });
109
110
  }
110
111
  catch (error) {
@@ -168,18 +169,43 @@ export class HomeAssistantConversationRoutes {
168
169
  }
169
170
  streamConversation(body) {
170
171
  const encoder = new TextEncoder();
172
+ const conversationId = readString(body.conversationId ?? body.conversation_id);
173
+ const messageId = readString(body.messageId ?? body.message_id);
171
174
  const stream = new ReadableStream({
172
175
  start: async (controller) => {
176
+ let closed = false;
173
177
  const send = (event, data) => {
178
+ if (closed)
179
+ return;
174
180
  controller.enqueue(encoder.encode(`event: ${event}\ndata: ${JSON.stringify(data)}\n\n`));
175
181
  };
182
+ // Bridge the platform's per-turn streaming events into incremental SSE
183
+ // `delta` frames as the model produces text. The terminal `final`/`error`
184
+ // frame contract below is unchanged, so older consumers that ignore
185
+ // `delta` events still see exactly one terminal frame.
186
+ let accumulated = '';
187
+ const onTurnEvent = (event) => {
188
+ if (event.type === 'turn.delta' && event.delta) {
189
+ accumulated += event.delta;
190
+ send('delta', {
191
+ ok: true,
192
+ delta: event.delta,
193
+ text: accumulated,
194
+ turnId: event.turnId,
195
+ ...(conversationId ? { conversationId } : {}),
196
+ ...(messageId ? { messageId } : {}),
197
+ });
198
+ }
199
+ };
176
200
  try {
177
- const result = await this.submitConversation({ ...body, wait: true });
201
+ const result = await this.submitConversation({ ...body, wait: true }, onTurnEvent);
178
202
  send(result.status === 'completed' ? 'final' : 'error', result);
203
+ closed = true;
179
204
  controller.close();
180
205
  }
181
206
  catch (error) {
182
207
  send('error', { ok: false, error: error instanceof Error ? error.message : String(error) });
208
+ closed = true;
183
209
  controller.close();
184
210
  }
185
211
  },
@@ -17,6 +17,14 @@ export declare class WebhookNotifier {
17
17
  private readonly maxConcurrent;
18
18
  private readonly maxBodyBytes;
19
19
  private readonly signingSecret?;
20
+ /**
21
+ * Bypass test suppression for every delivery from this instance. Intended
22
+ * only for tests that specifically exercise the real HTTP delivery layer
23
+ * (e.g. the SSRF filter tests, which need a real `fetch` attempt to
24
+ * distinguish "blocked" from "not blocked"). Every other caller should
25
+ * leave this unset so `bun test` never fires a real webhook.
26
+ */
27
+ private readonly force;
20
28
  constructor(urls?: string[], options?: WebhookNotifierOptions);
21
29
  /**
22
30
  * Create a WebhookNotifier from a list of URLs (e.g. from persisted config).
@@ -55,6 +63,13 @@ export interface WebhookNotifierOptions {
55
63
  maxConcurrent?: number | undefined;
56
64
  maxBodyBytes?: number | undefined;
57
65
  signingSecret?: string | Uint8Array | undefined;
66
+ /**
67
+ * Bypass test suppression for every delivery from this instance. Only
68
+ * tests that exercise the real HTTP delivery layer itself should set this
69
+ * — everything else should be left unset so `bun test` never sends a real
70
+ * webhook request.
71
+ */
72
+ force?: boolean | undefined;
58
73
  }
59
74
  export interface WebhookNotifierDeliveryResult {
60
75
  readonly url: string;
@@ -1 +1 @@
1
- {"version":3,"file":"webhooks.d.ts","sourceRoot":"","sources":["../../../src/platform/integrations/webhooks.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAA6B,MAAM,4BAA4B,CAAC;AAQ7F;;;;;;;;;;GAUG;AACH,qBAAa,eAAe;IAC1B,OAAO,CAAC,IAAI,CAAW;IACvB,OAAO,CAAC,aAAa,CAAyB;IAC9C,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAS;IACvC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAS;IACtC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAkC;gBAErD,IAAI,GAAE,MAAM,EAAO,EAAE,OAAO,GAAE,sBAA2B;IAQrE;;OAEG;IACH,MAAM,CAAC,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,eAAe;IAQlD,oEAAoE;IACpE,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAQzB,4BAA4B;IAC5B,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAQ/B,gCAAgC;IAChC,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI;IAI7B,iDAAiD;IACjD,OAAO,IAAI,MAAM,EAAE;IAInB,sDAAsD;IACtD,YAAY,IAAI,OAAO;IAQvB;;;;;;OAMG;IACG,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,yBAAyB,CAAC;IA4B5D;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,6BAA6B,EAAE,CAAC;IAoBtD,kBAAkB,CAAC,GAAG,EAAE,eAAe,GAAG,IAAI;IA8B9C,wCAAwC;IACxC,MAAM,IAAI,IAAI;YAWA,OAAO;IA0CrB,OAAO,CAAC,uBAAuB;CAOhC;AAED,MAAM,WAAW,sBAAsB;IACrC,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/B,aAAa,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACnC,YAAY,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAClC,aAAa,CAAC,EAAE,MAAM,GAAG,UAAU,GAAG,SAAS,CAAC;CACjD;AAED,MAAM,WAAW,6BAA6B;IAC5C,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,EAAE,OAAO,CAAC;IACrB,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CACrC;AAED,MAAM,WAAW,yBAAyB;IACxC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,OAAO,EAAE,SAAS,6BAA6B,EAAE,CAAC;CAC5D"}
1
+ {"version":3,"file":"webhooks.d.ts","sourceRoot":"","sources":["../../../src/platform/integrations/webhooks.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAA6B,MAAM,4BAA4B,CAAC;AAS7F;;;;;;;;;;GAUG;AACH,qBAAa,eAAe;IAC1B,OAAO,CAAC,IAAI,CAAW;IACvB,OAAO,CAAC,aAAa,CAAyB;IAC9C,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAS;IACvC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAS;IACtC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAkC;IACjE;;;;;;OAMG;IACH,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAU;gBAEpB,IAAI,GAAE,MAAM,EAAO,EAAE,OAAO,GAAE,sBAA2B;IASrE;;OAEG;IACH,MAAM,CAAC,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,eAAe;IAQlD,oEAAoE;IACpE,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAQzB,4BAA4B;IAC5B,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAQ/B,gCAAgC;IAChC,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI;IAI7B,iDAAiD;IACjD,OAAO,IAAI,MAAM,EAAE;IAInB,sDAAsD;IACtD,YAAY,IAAI,OAAO;IAQvB;;;;;;OAMG;IACG,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,yBAAyB,CAAC;IA4B5D;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,6BAA6B,EAAE,CAAC;IAoBtD,kBAAkB,CAAC,GAAG,EAAE,eAAe,GAAG,IAAI;IA8B9C,wCAAwC;IACxC,MAAM,IAAI,IAAI;YAWA,OAAO;IAmDrB,OAAO,CAAC,uBAAuB;CAOhC;AAED,MAAM,WAAW,sBAAsB;IACrC,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/B,aAAa,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACnC,YAAY,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAClC,aAAa,CAAC,EAAE,MAAM,GAAG,UAAU,GAAG,SAAS,CAAC;IAChD;;;;;OAKG;IACH,KAAK,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;CAC7B;AAED,MAAM,WAAW,6BAA6B;IAC5C,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,EAAE,OAAO,CAAC;IACrB,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CACrC;AAED,MAAM,WAAW,yBAAyB;IACxC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,OAAO,EAAE,SAAS,6BAA6B,EAAE,CAAC;CAC5D"}
@@ -1,6 +1,7 @@
1
1
  import { logger } from '../utils/logger.js';
2
2
  import { classifyHostTrustTier, extractHostname, emitSsrfDeny } from '../tools/fetch/trust-tiers.js';
3
3
  import { instrumentedFetch, createTimeoutController } from '../utils/fetch-with-timeout.js';
4
+ import { isNotifySuppressed } from '../utils/notify.js';
4
5
  // ---------------------------------------------------------------------------
5
6
  // WebhookNotifier
6
7
  // ---------------------------------------------------------------------------
@@ -22,12 +23,21 @@ export class WebhookNotifier {
22
23
  maxConcurrent;
23
24
  maxBodyBytes;
24
25
  signingSecret;
26
+ /**
27
+ * Bypass test suppression for every delivery from this instance. Intended
28
+ * only for tests that specifically exercise the real HTTP delivery layer
29
+ * (e.g. the SSRF filter tests, which need a real `fetch` attempt to
30
+ * distinguish "blocked" from "not blocked"). Every other caller should
31
+ * leave this unset so `bun test` never fires a real webhook.
32
+ */
33
+ force;
25
34
  constructor(urls = [], options = {}) {
26
35
  this.urls = validateWebhookUrls(urls);
27
36
  this.timeoutMs = normalizeWebhookTimeoutMs(options.timeoutMs);
28
37
  this.maxConcurrent = normalizePositiveInteger(options.maxConcurrent, 8, 1, 32);
29
38
  this.maxBodyBytes = normalizePositiveInteger(options.maxBodyBytes, 64 * 1024, 1_024, 256 * 1024);
30
39
  this.signingSecret = normalizeSigningSecret(options.signingSecret);
40
+ this.force = options.force === true;
31
41
  }
32
42
  /**
33
43
  * Create a WebhookNotifier from a list of URLs (e.g. from persisted config).
@@ -159,6 +169,14 @@ export class WebhookNotifier {
159
169
  throw new Error(`WebhookNotifier: blocked URL — ${trustResult.reason}`);
160
170
  }
161
171
  }
172
+ // Real webhook delivery must never fire from an automated test run —
173
+ // suppressed the same way as desktop notifications (NODE_ENV==='test' or
174
+ // GOODVIBES_SUPPRESS_NOTIFY), with `force` as the sanctioned opt-back-in
175
+ // for tests that exercise this delivery layer itself.
176
+ if (isNotifySuppressed(this.force)) {
177
+ logger.debug('WebhookNotifier: delivery suppressed under test', { url });
178
+ throw new Error('WebhookNotifier: delivery suppressed under test (pass { force: true } to enable)');
179
+ }
162
180
  const signal = createTimeoutController(this.timeoutMs);
163
181
  try {
164
182
  const body = truncateUtf8(text, this.maxBodyBytes);
@@ -1,4 +1,15 @@
1
1
  import type { KnowledgeExtractionRecord } from './types.js';
2
+ /**
3
+ * The current extractor generation. Stamped onto every extraction's metadata at
4
+ * write time (`extractorVersion`). Bump this when the extraction pipeline improves
5
+ * so that the retained raw-artifact lake is re-processed: an extraction produced by
6
+ * an older generation is treated as stale-by-version and re-extracted from its
7
+ * stored artifact, even when its prior text was non-empty. This is what turns the
8
+ * retained lake into a compounding asset. Extractions written before versioning
9
+ * carry no stamp and resolve to version 0, so they re-extract once.
10
+ */
11
+ export declare const KNOWLEDGE_EXTRACTOR_VERSION = 1;
12
+ export declare function readKnowledgeExtractorVersion(metadata: Record<string, unknown>): number;
2
13
  export declare const KNOWLEDGE_MAX_STRUCTURE_SEARCH_TEXT_CHARS: number;
3
14
  export declare const KNOWLEDGE_MIN_BINARY_SAMPLE_CHARS = 120;
4
15
  export declare const KNOWLEDGE_BINARY_SAMPLE_CHARS = 4096;
@@ -6,7 +17,7 @@ export declare const KNOWLEDGE_BINARY_EXTENDED_RATIO_THRESHOLD = 0.18;
6
17
  export declare const KNOWLEDGE_BINARY_USEFUL_RATIO_THRESHOLD = 0.78;
7
18
  export declare const KNOWLEDGE_BINARY_PUNCTUATION_RATIO_THRESHOLD = 0.42;
8
19
  export declare const KNOWLEDGE_BINARY_WHITESPACE_RATIO_THRESHOLD = 0.08;
9
- export declare function knowledgeExtractionNeedsRefresh(extraction: KnowledgeExtractionRecord | null): boolean;
20
+ export declare function knowledgeExtractionNeedsRefresh(extraction: KnowledgeExtractionRecord | null, currentExtractorVersion?: number): boolean;
10
21
  export declare function readKnowledgeSearchText(record: Record<string, unknown>): string | undefined;
11
22
  export declare function hasUsefulKnowledgeExtractionText(value: string | undefined): boolean;
12
23
  export declare function looksLikeRawPdfPayload(value: string): boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"extraction-policy.d.ts","sourceRoot":"","sources":["../../../src/platform/knowledge/extraction-policy.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,YAAY,CAAC;AAE5D,eAAO,MAAM,yCAAyC,QAAa,CAAC;AAEpE,eAAO,MAAM,iCAAiC,MAAM,CAAC;AACrD,eAAO,MAAM,6BAA6B,OAAQ,CAAC;AACnD,eAAO,MAAM,yCAAyC,OAAO,CAAC;AAC9D,eAAO,MAAM,uCAAuC,OAAO,CAAC;AAC5D,eAAO,MAAM,4CAA4C,OAAO,CAAC;AACjE,eAAO,MAAM,2CAA2C,OAAO,CAAC;AAShE,wBAAgB,+BAA+B,CAAC,UAAU,EAAE,yBAAyB,GAAG,IAAI,GAAG,OAAO,CAYrG;AAED,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,GAAG,SAAS,CAG3F;AAED,wBAAgB,gCAAgC,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAKnF;AAED,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAM7D;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CA6B1D"}
1
+ {"version":3,"file":"extraction-policy.d.ts","sourceRoot":"","sources":["../../../src/platform/knowledge/extraction-policy.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,YAAY,CAAC;AAE5D;;;;;;;;GAQG;AACH,eAAO,MAAM,2BAA2B,IAAI,CAAC;AAE7C,wBAAgB,6BAA6B,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAGvF;AAED,eAAO,MAAM,yCAAyC,QAAa,CAAC;AAEpE,eAAO,MAAM,iCAAiC,MAAM,CAAC;AACrD,eAAO,MAAM,6BAA6B,OAAQ,CAAC;AACnD,eAAO,MAAM,yCAAyC,OAAO,CAAC;AAC9D,eAAO,MAAM,uCAAuC,OAAO,CAAC;AAC5D,eAAO,MAAM,4CAA4C,OAAO,CAAC;AACjE,eAAO,MAAM,2CAA2C,OAAO,CAAC;AAShE,wBAAgB,+BAA+B,CAC7C,UAAU,EAAE,yBAAyB,GAAG,IAAI,EAC5C,uBAAuB,GAAE,MAAoC,GAC5D,OAAO,CAeT;AAED,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,GAAG,SAAS,CAG3F;AAED,wBAAgB,gCAAgC,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAKnF;AAED,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAM7D;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CA6B1D"}
@@ -1,3 +1,17 @@
1
+ /**
2
+ * The current extractor generation. Stamped onto every extraction's metadata at
3
+ * write time (`extractorVersion`). Bump this when the extraction pipeline improves
4
+ * so that the retained raw-artifact lake is re-processed: an extraction produced by
5
+ * an older generation is treated as stale-by-version and re-extracted from its
6
+ * stored artifact, even when its prior text was non-empty. This is what turns the
7
+ * retained lake into a compounding asset. Extractions written before versioning
8
+ * carry no stamp and resolve to version 0, so they re-extract once.
9
+ */
10
+ export const KNOWLEDGE_EXTRACTOR_VERSION = 1;
11
+ export function readKnowledgeExtractorVersion(metadata) {
12
+ const value = metadata.extractorVersion;
13
+ return typeof value === 'number' && Number.isFinite(value) ? value : 0;
14
+ }
1
15
  export const KNOWLEDGE_MAX_STRUCTURE_SEARCH_TEXT_CHARS = 128 * 1024;
2
16
  export const KNOWLEDGE_MIN_BINARY_SAMPLE_CHARS = 120;
3
17
  export const KNOWLEDGE_BINARY_SAMPLE_CHARS = 4_096;
@@ -11,9 +25,13 @@ const LIMITED_EXTRACTION_MARKERS = [
11
25
  'no specialized extractor matched',
12
26
  'has no specialized in-core extractor',
13
27
  ];
14
- export function knowledgeExtractionNeedsRefresh(extraction) {
28
+ export function knowledgeExtractionNeedsRefresh(extraction, currentExtractorVersion = KNOWLEDGE_EXTRACTOR_VERSION) {
15
29
  if (!extraction)
16
30
  return true;
31
+ // Improved-extractor gate: re-extract a stored capture when it was produced by
32
+ // an older extractor generation, even if its prior text was usable.
33
+ if (readKnowledgeExtractorVersion(extraction.metadata) < currentExtractorVersion)
34
+ return true;
17
35
  const searchText = readKnowledgeSearchText(extraction.structure) ?? readKnowledgeSearchText(extraction.metadata);
18
36
  if (searchText)
19
37
  return false;
@@ -1,6 +1,6 @@
1
1
  import { buildSchema, type DocumentNode, type ValueNode } from 'graphql';
2
2
  import type { KnowledgePacketDetail, KnowledgeProjectionTargetKind } from './types.js';
3
- export declare const KNOWLEDGE_GRAPHQL_SDL = "\n scalar JSON\n\n enum KnowledgeProjectionKind {\n OVERVIEW\n BUNDLE\n SOURCE\n NODE\n ISSUE\n DASHBOARD\n ROLLUP\n }\n\n enum KnowledgePacketDetail {\n COMPACT\n STANDARD\n DETAILED\n }\n\n enum KnowledgeJobMode {\n INLINE\n BACKGROUND\n }\n\n type KnowledgeStatus {\n ready: Boolean!\n storagePath: String!\n sourceCount: Int!\n nodeCount: Int!\n edgeCount: Int!\n issueCount: Int!\n extractionCount: Int!\n jobRunCount: Int!\n usageCount: Int!\n candidateCount: Int!\n reportCount: Int!\n scheduleCount: Int!\n note: String!\n }\n\n type KnowledgeConnectorSetupField {\n key: String!\n label: String!\n kind: String!\n optional: Boolean\n source: String\n description: String\n }\n\n type KnowledgeConnectorSetup {\n version: String!\n summary: String!\n transportHints: [String!]!\n steps: [String!]!\n fields: [KnowledgeConnectorSetupField!]!\n metadata: JSON\n }\n\n type KnowledgeConnectorDoctorCheck {\n id: String!\n label: String!\n status: String!\n detail: String!\n metadata: JSON\n }\n\n type KnowledgeConnectorDoctorReport {\n connectorId: String!\n ready: Boolean!\n summary: String!\n checks: [KnowledgeConnectorDoctorCheck!]!\n hints: [String!]!\n metadata: JSON\n }\n\n type KnowledgeConnector {\n id: String!\n displayName: String\n version: String\n description: String!\n sourceType: String!\n inputSchema: JSON\n examples: [JSON!]!\n capabilities: [String!]!\n setup: KnowledgeConnectorSetup\n metadata: JSON\n }\n\n type KnowledgeSource {\n id: String!\n connectorId: String!\n sourceType: String!\n title: String\n sourceUri: String\n canonicalUri: String\n summary: String\n description: String\n tags: [String!]!\n folderPath: String\n status: String!\n artifactId: String\n contentHash: String\n lastCrawledAt: Float\n crawlError: String\n sessionId: String\n metadata: JSON\n createdAt: Float!\n updatedAt: Float!\n }\n\n type KnowledgeNode {\n id: String!\n kind: String!\n slug: String!\n title: String!\n summary: String\n aliases: [String!]!\n status: String!\n confidence: Int!\n sourceId: String\n metadata: JSON\n createdAt: Float!\n updatedAt: Float!\n }\n\n type KnowledgeEdge {\n id: String!\n fromKind: String!\n fromId: String!\n toKind: String!\n toId: String!\n relation: String!\n weight: Float!\n metadata: JSON\n createdAt: Float!\n updatedAt: Float!\n }\n\n type KnowledgeIssue {\n id: String!\n severity: String!\n code: String!\n message: String!\n status: String!\n sourceId: String\n nodeId: String\n metadata: JSON\n createdAt: Float!\n updatedAt: Float!\n }\n\n type KnowledgeExtraction {\n id: String!\n sourceId: String!\n artifactId: String\n extractorId: String!\n format: String!\n title: String\n summary: String\n excerpt: String\n sections: [String!]!\n links: [String!]!\n estimatedTokens: Int!\n structure: JSON\n metadata: JSON\n createdAt: Float!\n updatedAt: Float!\n }\n\n type KnowledgeItemView {\n source: KnowledgeSource\n node: KnowledgeNode\n issue: KnowledgeIssue\n relatedEdges: [KnowledgeEdge!]!\n linkedSources: [KnowledgeSource!]!\n linkedNodes: [KnowledgeNode!]!\n }\n\n type KnowledgeSearchResult {\n kind: String!\n id: String!\n score: Float!\n reason: String!\n source: KnowledgeSource\n node: KnowledgeNode\n }\n\n type KnowledgePacketItem {\n kind: String!\n id: String!\n title: String!\n summary: String\n uri: String\n reason: String!\n score: Float!\n estimatedTokens: Int!\n related: [String!]!\n evidence: [String!]!\n metadata: JSON\n }\n\n type KnowledgePacket {\n task: String!\n writeScope: [String!]!\n generatedAt: Float!\n detail: KnowledgePacketDetail!\n strategy: String!\n budgetLimit: Int!\n estimatedTokens: Int!\n items: [KnowledgePacketItem!]!\n }\n\n type KnowledgeProjectionTarget {\n targetId: String!\n kind: KnowledgeProjectionKind!\n title: String!\n description: String!\n itemId: String\n defaultPath: String!\n defaultFilename: String!\n metadata: JSON\n }\n\n type KnowledgeProjectionPage {\n path: String!\n title: String!\n format: String!\n content: String!\n itemIds: [String!]!\n metadata: JSON\n }\n\n type KnowledgeProjectionBundle {\n id: String!\n target: KnowledgeProjectionTarget!\n generatedAt: Float!\n pageCount: Int!\n pages: [KnowledgeProjectionPage!]!\n metadata: JSON\n }\n\n type ArtifactDescriptor {\n id: String!\n kind: String!\n mimeType: String!\n filename: String\n sizeBytes: Int!\n sourceUri: String\n createdAt: Float!\n metadata: JSON\n }\n\n type KnowledgeJob {\n id: String!\n label: String!\n description: String!\n defaultMode: KnowledgeJobMode!\n triggerKinds: [String!]!\n lastRunAt: Float\n metadata: JSON\n }\n\n type KnowledgeJobRun {\n id: String!\n jobId: String!\n status: String!\n mode: KnowledgeJobMode!\n requestedAt: Float!\n startedAt: Float\n completedAt: Float\n error: String\n result: JSON\n metadata: JSON\n }\n\n type KnowledgeBatchIngestResult {\n imported: Int!\n failed: Int!\n sources: [KnowledgeSource!]!\n errors: [String!]!\n }\n\n type KnowledgeUsageRecord {\n id: String!\n targetKind: String!\n targetId: String!\n usageKind: String!\n task: String\n sessionId: String\n score: Float\n metadata: JSON\n createdAt: Float!\n }\n\n type KnowledgeConsolidationCandidate {\n id: String!\n candidateType: String!\n status: String!\n subjectKind: String!\n subjectId: String!\n title: String!\n summary: String\n score: Float!\n evidence: [String!]!\n suggestedMemoryClass: String\n suggestedScope: String\n decidedAt: Float\n decidedBy: String\n metadata: JSON\n createdAt: Float!\n updatedAt: Float!\n }\n\n type KnowledgeConsolidationReport {\n id: String!\n kind: String!\n title: String!\n summary: String!\n highlights: [String!]!\n metrics: JSON\n metadata: JSON\n createdAt: Float!\n updatedAt: Float!\n }\n\n type KnowledgeSchedule {\n id: String!\n jobId: String!\n label: String!\n enabled: Boolean!\n schedule: JSON!\n lastRunAt: Float\n nextRunAt: Float\n metadata: JSON\n createdAt: Float!\n updatedAt: Float!\n }\n\n input KnowledgeJobRunInput {\n mode: KnowledgeJobMode\n }\n\n input KnowledgePacketInput {\n task: String!\n writeScope: [String!]\n limit: Int\n detail: KnowledgePacketDetail\n budgetLimit: Int\n knowledgeSpaceId: String\n includeAllSpaces: Boolean\n }\n\n type Query {\n status(knowledgeSpaceId: String, includeAllSpaces: Boolean): KnowledgeStatus!\n connectors: [KnowledgeConnector!]!\n connectorDoctor(id: String!): KnowledgeConnectorDoctorReport\n sources(limit: Int, offset: Int, knowledgeSpaceId: String, includeAllSpaces: Boolean): [KnowledgeSource!]!\n nodes(limit: Int, offset: Int, knowledgeSpaceId: String, includeAllSpaces: Boolean): [KnowledgeNode!]!\n issues(limit: Int, offset: Int, knowledgeSpaceId: String, includeAllSpaces: Boolean): [KnowledgeIssue!]!\n itemView(kind: String!, id: String!): KnowledgeItemView\n extractions(limit: Int, sourceId: String, knowledgeSpaceId: String, includeAllSpaces: Boolean): [KnowledgeExtraction!]!\n neighbors(kind: String!, id: String!, relation: String, limit: Int): [KnowledgeEdge!]!\n search(query: String!, limit: Int, knowledgeSpaceId: String, includeAllSpaces: Boolean): [KnowledgeSearchResult!]!\n packet(task: String!, writeScope: [String!], limit: Int, detail: KnowledgePacketDetail, budgetLimit: Int, knowledgeSpaceId: String, includeAllSpaces: Boolean): KnowledgePacket!\n projectionTargets(limit: Int, knowledgeSpaceId: String, includeAllSpaces: Boolean): [KnowledgeProjectionTarget!]!\n projection(kind: KnowledgeProjectionKind!, id: String, limit: Int, knowledgeSpaceId: String, includeAllSpaces: Boolean): KnowledgeProjectionBundle!\n jobs: [KnowledgeJob!]!\n job(id: String!): KnowledgeJob\n jobRuns(limit: Int, jobId: String): [KnowledgeJobRun!]!\n usage(limit: Int, targetKind: String, targetId: String, usageKind: String): [KnowledgeUsageRecord!]!\n usageRecords(limit: Int, targetKind: String, targetId: String, usageKind: String): [KnowledgeUsageRecord!]!\n consolidationCandidates(limit: Int, status: String): [KnowledgeConsolidationCandidate!]!\n consolidationReports(limit: Int): [KnowledgeConsolidationReport!]!\n schedules(limit: Int): [KnowledgeSchedule!]!\n sourceExtraction(sourceId: String!): KnowledgeExtraction\n }\n\n type Mutation {\n ingestUrl(url: String!, sourceType: String, connectorId: String, folderPath: String, tags: [String!], sessionId: String, allowPrivateHosts: Boolean): KnowledgeSource!\n ingestArtifact(path: String!, connectorId: String, tags: [String!], sessionId: String, allowPrivateHosts: Boolean): KnowledgeSource!\n importBookmarksFromFile(path: String!, sessionId: String, allowPrivateHosts: Boolean): KnowledgeBatchIngestResult!\n importUrlsFromFile(path: String!, sessionId: String, allowPrivateHosts: Boolean): KnowledgeBatchIngestResult!\n ingestBookmarkSeeds(seeds: [String!]!, connectorId: String, sessionId: String): KnowledgeBatchIngestResult!\n ingestWithConnector(connectorId: String!, input: String!, sessionId: String, allowPrivateHosts: Boolean): KnowledgeBatchIngestResult!\n ingestConnectorInput(input: String!, connectorId: String, sessionId: String, allowPrivateHosts: Boolean): KnowledgeBatchIngestResult!\n renderProjection(kind: KnowledgeProjectionKind!, id: String, limit: Int, knowledgeSpaceId: String, includeAllSpaces: Boolean): KnowledgeProjectionBundle!\n materializeProjection(kind: KnowledgeProjectionKind!, id: String, limit: Int, knowledgeSpaceId: String, includeAllSpaces: Boolean): KnowledgeMaterializedProjection!\n reindex: KnowledgeStatus!\n runJob(id: String!, mode: KnowledgeJobMode): KnowledgeJobRun!\n saveSchedule(id: String, jobId: String!, label: String!, enabled: Boolean!, schedule: JSON!, metadata: JSON): KnowledgeSchedule!\n deleteSchedule(id: String!): Boolean!\n setScheduleEnabled(id: String!, enabled: Boolean!): KnowledgeSchedule\n decideConsolidationCandidate(id: String!, status: String!, decidedBy: String): KnowledgeConsolidationCandidate!\n lint: [KnowledgeIssue!]!\n }\n\n type KnowledgeMaterializedProjection {\n artifact: ArtifactDescriptor!\n bundle: KnowledgeProjectionBundle!\n }\n";
3
+ export declare const KNOWLEDGE_GRAPHQL_SDL = "\n scalar JSON\n\n enum KnowledgeProjectionKind {\n OVERVIEW\n BUNDLE\n SOURCE\n NODE\n ISSUE\n DASHBOARD\n ROLLUP\n }\n\n enum KnowledgePacketDetail {\n COMPACT\n STANDARD\n DETAILED\n }\n\n enum KnowledgeJobMode {\n INLINE\n BACKGROUND\n }\n\n type KnowledgeStatus {\n ready: Boolean!\n storagePath: String!\n sourceCount: Int!\n nodeCount: Int!\n edgeCount: Int!\n issueCount: Int!\n extractionCount: Int!\n jobRunCount: Int!\n usageCount: Int!\n candidateCount: Int!\n reportCount: Int!\n scheduleCount: Int!\n note: String!\n }\n\n type KnowledgeConnectorSetupField {\n key: String!\n label: String!\n kind: String!\n optional: Boolean\n source: String\n description: String\n }\n\n type KnowledgeConnectorSetup {\n version: String!\n summary: String!\n transportHints: [String!]!\n steps: [String!]!\n fields: [KnowledgeConnectorSetupField!]!\n metadata: JSON\n }\n\n type KnowledgeConnectorDoctorCheck {\n id: String!\n label: String!\n status: String!\n detail: String!\n metadata: JSON\n }\n\n type KnowledgeConnectorDoctorReport {\n connectorId: String!\n ready: Boolean!\n summary: String!\n checks: [KnowledgeConnectorDoctorCheck!]!\n hints: [String!]!\n metadata: JSON\n }\n\n type KnowledgeConnector {\n id: String!\n displayName: String\n version: String\n description: String!\n sourceType: String!\n inputSchema: JSON\n examples: [JSON!]!\n capabilities: [String!]!\n setup: KnowledgeConnectorSetup\n metadata: JSON\n }\n\n type KnowledgeSource {\n id: String!\n connectorId: String!\n sourceType: String!\n title: String\n sourceUri: String\n canonicalUri: String\n summary: String\n description: String\n tags: [String!]!\n folderPath: String\n status: String!\n artifactId: String\n contentHash: String\n lastCrawledAt: Float\n crawlError: String\n sessionId: String\n metadata: JSON\n createdAt: Float!\n updatedAt: Float!\n }\n\n type KnowledgeNode {\n id: String!\n kind: String!\n slug: String!\n title: String!\n summary: String\n aliases: [String!]!\n status: String!\n confidence: Int!\n sourceId: String\n metadata: JSON\n createdAt: Float!\n updatedAt: Float!\n }\n\n type KnowledgeEdge {\n id: String!\n fromKind: String!\n fromId: String!\n toKind: String!\n toId: String!\n relation: String!\n weight: Float!\n metadata: JSON\n createdAt: Float!\n updatedAt: Float!\n }\n\n type KnowledgeIssue {\n id: String!\n severity: String!\n code: String!\n message: String!\n status: String!\n sourceId: String\n nodeId: String\n metadata: JSON\n createdAt: Float!\n updatedAt: Float!\n }\n\n type KnowledgeExtraction {\n id: String!\n sourceId: String!\n artifactId: String\n extractorId: String!\n format: String!\n title: String\n summary: String\n excerpt: String\n sections: [String!]!\n links: [String!]!\n estimatedTokens: Int!\n structure: JSON\n metadata: JSON\n createdAt: Float!\n updatedAt: Float!\n }\n\n type KnowledgeItemView {\n source: KnowledgeSource\n node: KnowledgeNode\n issue: KnowledgeIssue\n relatedEdges: [KnowledgeEdge!]!\n linkedSources: [KnowledgeSource!]!\n linkedNodes: [KnowledgeNode!]!\n }\n\n type KnowledgeSearchResult {\n kind: String!\n id: String!\n score: Float!\n reason: String!\n source: KnowledgeSource\n node: KnowledgeNode\n }\n\n type KnowledgePacketItem {\n kind: String!\n id: String!\n title: String!\n summary: String\n uri: String\n reason: String!\n score: Float!\n estimatedTokens: Int!\n related: [String!]!\n evidence: [String!]!\n metadata: JSON\n }\n\n type KnowledgePacket {\n task: String!\n writeScope: [String!]!\n generatedAt: Float!\n detail: KnowledgePacketDetail!\n strategy: String!\n budgetLimit: Int!\n estimatedTokens: Int!\n truncated: Boolean!\n totalCandidates: Int!\n droppedCount: Int!\n droppedForBudget: Int!\n budgetExhausted: Boolean!\n items: [KnowledgePacketItem!]!\n }\n\n type KnowledgeProjectionTarget {\n targetId: String!\n kind: KnowledgeProjectionKind!\n title: String!\n description: String!\n itemId: String\n defaultPath: String!\n defaultFilename: String!\n metadata: JSON\n }\n\n type KnowledgeProjectionPage {\n path: String!\n title: String!\n format: String!\n content: String!\n itemIds: [String!]!\n metadata: JSON\n }\n\n type KnowledgeProjectionBundle {\n id: String!\n target: KnowledgeProjectionTarget!\n generatedAt: Float!\n pageCount: Int!\n pages: [KnowledgeProjectionPage!]!\n metadata: JSON\n }\n\n type ArtifactDescriptor {\n id: String!\n kind: String!\n mimeType: String!\n filename: String\n sizeBytes: Int!\n sourceUri: String\n createdAt: Float!\n metadata: JSON\n }\n\n type KnowledgeJob {\n id: String!\n label: String!\n description: String!\n defaultMode: KnowledgeJobMode!\n triggerKinds: [String!]!\n lastRunAt: Float\n metadata: JSON\n }\n\n type KnowledgeJobRun {\n id: String!\n jobId: String!\n status: String!\n mode: KnowledgeJobMode!\n requestedAt: Float!\n startedAt: Float\n completedAt: Float\n error: String\n result: JSON\n metadata: JSON\n }\n\n type KnowledgeBatchIngestResult {\n imported: Int!\n failed: Int!\n sources: [KnowledgeSource!]!\n errors: [String!]!\n }\n\n type KnowledgeUsageRecord {\n id: String!\n targetKind: String!\n targetId: String!\n usageKind: String!\n task: String\n sessionId: String\n score: Float\n metadata: JSON\n createdAt: Float!\n }\n\n type KnowledgeConsolidationCandidate {\n id: String!\n candidateType: String!\n status: String!\n subjectKind: String!\n subjectId: String!\n title: String!\n summary: String\n score: Float!\n evidence: [String!]!\n suggestedMemoryClass: String\n suggestedScope: String\n decidedAt: Float\n decidedBy: String\n metadata: JSON\n createdAt: Float!\n updatedAt: Float!\n }\n\n type KnowledgeConsolidationReport {\n id: String!\n kind: String!\n title: String!\n summary: String!\n highlights: [String!]!\n metrics: JSON\n metadata: JSON\n createdAt: Float!\n updatedAt: Float!\n }\n\n type KnowledgeSchedule {\n id: String!\n jobId: String!\n label: String!\n enabled: Boolean!\n schedule: JSON!\n lastRunAt: Float\n nextRunAt: Float\n metadata: JSON\n createdAt: Float!\n updatedAt: Float!\n }\n\n input KnowledgeJobRunInput {\n mode: KnowledgeJobMode\n }\n\n input KnowledgePacketInput {\n task: String!\n writeScope: [String!]\n limit: Int\n detail: KnowledgePacketDetail\n budgetLimit: Int\n knowledgeSpaceId: String\n includeAllSpaces: Boolean\n }\n\n type Query {\n status(knowledgeSpaceId: String, includeAllSpaces: Boolean): KnowledgeStatus!\n connectors: [KnowledgeConnector!]!\n connectorDoctor(id: String!): KnowledgeConnectorDoctorReport\n sources(limit: Int, offset: Int, knowledgeSpaceId: String, includeAllSpaces: Boolean): [KnowledgeSource!]!\n nodes(limit: Int, offset: Int, knowledgeSpaceId: String, includeAllSpaces: Boolean): [KnowledgeNode!]!\n issues(limit: Int, offset: Int, knowledgeSpaceId: String, includeAllSpaces: Boolean): [KnowledgeIssue!]!\n itemView(kind: String!, id: String!): KnowledgeItemView\n extractions(limit: Int, sourceId: String, knowledgeSpaceId: String, includeAllSpaces: Boolean): [KnowledgeExtraction!]!\n neighbors(kind: String!, id: String!, relation: String, limit: Int): [KnowledgeEdge!]!\n search(query: String!, limit: Int, knowledgeSpaceId: String, includeAllSpaces: Boolean): [KnowledgeSearchResult!]!\n packet(task: String!, writeScope: [String!], limit: Int, detail: KnowledgePacketDetail, budgetLimit: Int, knowledgeSpaceId: String, includeAllSpaces: Boolean): KnowledgePacket!\n projectionTargets(limit: Int, knowledgeSpaceId: String, includeAllSpaces: Boolean): [KnowledgeProjectionTarget!]!\n projection(kind: KnowledgeProjectionKind!, id: String, limit: Int, knowledgeSpaceId: String, includeAllSpaces: Boolean): KnowledgeProjectionBundle!\n jobs: [KnowledgeJob!]!\n job(id: String!): KnowledgeJob\n jobRuns(limit: Int, jobId: String): [KnowledgeJobRun!]!\n usage(limit: Int, targetKind: String, targetId: String, usageKind: String): [KnowledgeUsageRecord!]!\n usageRecords(limit: Int, targetKind: String, targetId: String, usageKind: String): [KnowledgeUsageRecord!]!\n consolidationCandidates(limit: Int, status: String): [KnowledgeConsolidationCandidate!]!\n consolidationReports(limit: Int): [KnowledgeConsolidationReport!]!\n schedules(limit: Int): [KnowledgeSchedule!]!\n sourceExtraction(sourceId: String!): KnowledgeExtraction\n }\n\n type Mutation {\n ingestUrl(url: String!, sourceType: String, connectorId: String, folderPath: String, tags: [String!], sessionId: String, allowPrivateHosts: Boolean): KnowledgeSource!\n ingestArtifact(path: String!, connectorId: String, tags: [String!], sessionId: String, allowPrivateHosts: Boolean): KnowledgeSource!\n importBookmarksFromFile(path: String!, sessionId: String, allowPrivateHosts: Boolean): KnowledgeBatchIngestResult!\n importUrlsFromFile(path: String!, sessionId: String, allowPrivateHosts: Boolean): KnowledgeBatchIngestResult!\n ingestBookmarkSeeds(seeds: [String!]!, connectorId: String, sessionId: String): KnowledgeBatchIngestResult!\n ingestWithConnector(connectorId: String!, input: String!, sessionId: String, allowPrivateHosts: Boolean): KnowledgeBatchIngestResult!\n ingestConnectorInput(input: String!, connectorId: String, sessionId: String, allowPrivateHosts: Boolean): KnowledgeBatchIngestResult!\n renderProjection(kind: KnowledgeProjectionKind!, id: String, limit: Int, knowledgeSpaceId: String, includeAllSpaces: Boolean): KnowledgeProjectionBundle!\n materializeProjection(kind: KnowledgeProjectionKind!, id: String, limit: Int, knowledgeSpaceId: String, includeAllSpaces: Boolean): KnowledgeMaterializedProjection!\n reindex: KnowledgeStatus!\n runJob(id: String!, mode: KnowledgeJobMode): KnowledgeJobRun!\n saveSchedule(id: String, jobId: String!, label: String!, enabled: Boolean!, schedule: JSON!, metadata: JSON): KnowledgeSchedule!\n deleteSchedule(id: String!): Boolean!\n setScheduleEnabled(id: String!, enabled: Boolean!): KnowledgeSchedule\n decideConsolidationCandidate(id: String!, status: String!, decidedBy: String): KnowledgeConsolidationCandidate!\n lint: [KnowledgeIssue!]!\n }\n\n type KnowledgeMaterializedProjection {\n artifact: ArtifactDescriptor!\n bundle: KnowledgeProjectionBundle!\n }\n";
4
4
  export declare function parseJsonAst(node: ValueNode): unknown;
5
5
  export declare function installJsonScalar(schema: ReturnType<typeof buildSchema>): void;
6
6
  export declare function toProjectionKind(value: string): KnowledgeProjectionTargetKind;
@@ -1 +1 @@
1
- {"version":3,"file":"graphql-schema.d.ts","sourceRoot":"","sources":["../../../src/platform/knowledge/graphql-schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,WAAW,EACX,KAAK,YAAY,EACjB,KAAK,SAAS,EACf,MAAM,SAAS,CAAC;AACjB,OAAO,KAAK,EAAE,qBAAqB,EAAE,6BAA6B,EAAE,MAAM,YAAY,CAAC;AAEvF,eAAO,MAAM,qBAAqB,0qVAgZjC,CAAC;AAEF,wBAAgB,YAAY,CAAC,IAAI,EAAE,SAAS,GAAG,OAAO,CAoBrD;AAED,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,UAAU,CAAC,OAAO,WAAW,CAAC,GAAG,IAAI,CAQ9E;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,6BAA6B,CAuB7E;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAiBlE;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,qBAAqB,CAM/E;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAEpE;AAED,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,QAAQ,GAAG,YAAY,CAE5E;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAE/D;AAED,wBAAgB,mBAAmB,CAAC,CAAC,SAAS;IAAE,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,EAAE,MAAM,EAAE,CAAC,GAAG,CAAC,GAAG;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,CAKhG;AAED,wBAAgB,mBAAmB,CAAC,CAAC,SAAS;IAAE,MAAM,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAAC,KAAK,EAAE,SAAS,OAAO,EAAE,CAAA;CAAE,EAAE,MAAM,EAAE,CAAC,GAAG,CAAC,GAAG;IAAE,MAAM,EAAE;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,CAAA;CAAE,CAKnJ;AAED,wBAAgB,SAAS,CAAC,CAAC,SAAS;IAAE,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,EAAE,MAAM,EAAE,CAAC,GAAG,CAAC,GAAG;IAAE,MAAM,EAAE,MAAM,CAAA;CAAE,CAK1F;AAED,wBAAgB,MAAM,CAAC,CAAC,SAAS;IAAE,WAAW,CAAC,EAAE,MAAM,CAAA;CAAE,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,GAAG;IAAE,WAAW,EAAE,MAAM,CAAA;CAAE,CAK9F;AAED,wBAAgB,SAAS,CAAC,CAAC,SAAS;IAAE,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,GAAG;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,CAKnF;AAED,wBAAgB,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAEnF;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,CAEpE;AAED,wBAAgB,aAAa,CAAC,QAAQ,EAAE,YAAY,EAAE,aAAa,CAAC,EAAE,MAAM,GAAG,OAAO,GAAG,UAAU,CASlG"}
1
+ {"version":3,"file":"graphql-schema.d.ts","sourceRoot":"","sources":["../../../src/platform/knowledge/graphql-schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,WAAW,EACX,KAAK,YAAY,EACjB,KAAK,SAAS,EACf,MAAM,SAAS,CAAC;AACjB,OAAO,KAAK,EAAE,qBAAqB,EAAE,6BAA6B,EAAE,MAAM,YAAY,CAAC;AAEvF,eAAO,MAAM,qBAAqB,izVAqZjC,CAAC;AAEF,wBAAgB,YAAY,CAAC,IAAI,EAAE,SAAS,GAAG,OAAO,CAoBrD;AAED,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,UAAU,CAAC,OAAO,WAAW,CAAC,GAAG,IAAI,CAQ9E;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,6BAA6B,CAuB7E;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAiBlE;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,qBAAqB,CAM/E;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAEpE;AAED,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,QAAQ,GAAG,YAAY,CAE5E;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAE/D;AAED,wBAAgB,mBAAmB,CAAC,CAAC,SAAS;IAAE,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,EAAE,MAAM,EAAE,CAAC,GAAG,CAAC,GAAG;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,CAKhG;AAED,wBAAgB,mBAAmB,CAAC,CAAC,SAAS;IAAE,MAAM,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAAC,KAAK,EAAE,SAAS,OAAO,EAAE,CAAA;CAAE,EAAE,MAAM,EAAE,CAAC,GAAG,CAAC,GAAG;IAAE,MAAM,EAAE;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,CAAA;CAAE,CAKnJ;AAED,wBAAgB,SAAS,CAAC,CAAC,SAAS;IAAE,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,EAAE,MAAM,EAAE,CAAC,GAAG,CAAC,GAAG;IAAE,MAAM,EAAE,MAAM,CAAA;CAAE,CAK1F;AAED,wBAAgB,MAAM,CAAC,CAAC,SAAS;IAAE,WAAW,CAAC,EAAE,MAAM,CAAA;CAAE,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,GAAG;IAAE,WAAW,EAAE,MAAM,CAAA;CAAE,CAK9F;AAED,wBAAgB,SAAS,CAAC,CAAC,SAAS;IAAE,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,GAAG;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,CAKnF;AAED,wBAAgB,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAEnF;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,CAEpE;AAED,wBAAgB,aAAa,CAAC,QAAQ,EAAE,YAAY,EAAE,aAAa,CAAC,EAAE,MAAM,GAAG,OAAO,GAAG,UAAU,CASlG"}
@@ -208,6 +208,11 @@ export const KNOWLEDGE_GRAPHQL_SDL = `
208
208
  strategy: String!
209
209
  budgetLimit: Int!
210
210
  estimatedTokens: Int!
211
+ truncated: Boolean!
212
+ totalCandidates: Int!
213
+ droppedCount: Int!
214
+ droppedForBudget: Int!
215
+ budgetExhausted: Boolean!
211
216
  items: [KnowledgePacketItem!]!
212
217
  }
213
218
 
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/platform/knowledge/home-graph/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,EAAE,8BAA8B,EAAE,MAAM,gBAAgB,CAAC;AAChE,OAAO,EACL,qBAAqB,EACrB,oBAAoB,GACrB,MAAM,YAAY,CAAC;AACpB,YAAY,EACV,iBAAiB,EACjB,kBAAkB,EAClB,6BAA6B,EAC7B,eAAe,EACf,8BAA8B,EAC9B,4BAA4B,EAC5B,wBAAwB,EACxB,qBAAqB,EACrB,uBAAuB,EACvB,wBAAwB,EACxB,kBAAkB,EAClB,mBAAmB,EACnB,gBAAgB,EAChB,yBAAyB,EACzB,iBAAiB,EACjB,gBAAgB,EAChB,kBAAkB,EAClB,iBAAiB,EACjB,oBAAoB,EACpB,mBAAmB,EACnB,8BAA8B,EAC9B,uBAAuB,EACvB,wBAAwB,EACxB,yBAAyB,EACzB,sBAAsB,EACtB,iBAAiB,EACjB,mBAAmB,EACnB,oBAAoB,EACpB,oBAAoB,EACpB,sBAAsB,EACtB,eAAe,EACf,mBAAmB,GACpB,MAAM,YAAY,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/platform/knowledge/home-graph/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,EAAE,8BAA8B,EAAE,MAAM,gBAAgB,CAAC;AAKhE,OAAO,EACL,qBAAqB,EACrB,oBAAoB,GACrB,MAAM,YAAY,CAAC;AACpB,YAAY,EACV,iBAAiB,EACjB,kBAAkB,EAClB,6BAA6B,EAC7B,eAAe,EACf,8BAA8B,EAC9B,4BAA4B,EAC5B,wBAAwB,EACxB,qBAAqB,EACrB,uBAAuB,EACvB,wBAAwB,EACxB,kBAAkB,EAClB,mBAAmB,EACnB,gBAAgB,EAChB,yBAAyB,EACzB,iBAAiB,EACjB,gBAAgB,EAChB,kBAAkB,EAClB,iBAAiB,EACjB,oBAAoB,EACpB,mBAAmB,EACnB,8BAA8B,EAC9B,uBAAuB,EACvB,wBAAwB,EACxB,yBAAyB,EACzB,sBAAsB,EACtB,iBAAiB,EACjB,mBAAmB,EACnB,oBAAoB,EACpB,oBAAoB,EACpB,sBAAsB,EACtB,eAAe,EACf,mBAAmB,GACpB,MAAM,YAAY,CAAC"}
@@ -1,3 +1,7 @@
1
1
  export { HomeGraphService } from './service.js';
2
2
  export { HOME_GRAPH_KNOWLEDGE_EXTENSION } from './extension.js';
3
+ // Home Graph issue triage is reached through `HomeGraphService.runRefinement({ triage })`
4
+ // and the `refinement/run` HTTP verb; `./triage.js` stays an internal module so the
5
+ // public `./platform/knowledge/home-graph` subpath surface (and its size budget) is
6
+ // unchanged. Import the loop/types directly from './triage.js' inside the platform.
3
7
  export { HOME_GRAPH_NODE_KINDS, HOME_GRAPH_RELATIONS, } from './types.js';
@@ -1,5 +1,5 @@
1
1
  import type { KnowledgeStore } from '../store.js';
2
- import type { HomeGraphLinkInput, HomeGraphLinkResult } from './types.js';
2
+ import type { HomeGraphLinkInput, HomeGraphLinkResult, HomeGraphUnlinkResult } from './types.js';
3
3
  export declare function linkHomeGraphKnowledge(store: KnowledgeStore, input: HomeGraphLinkInput & {
4
4
  readonly spaceId: string;
5
5
  readonly installationId: string;
@@ -7,5 +7,5 @@ export declare function linkHomeGraphKnowledge(store: KnowledgeStore, input: Hom
7
7
  export declare function unlinkHomeGraphKnowledge(store: KnowledgeStore, input: HomeGraphLinkInput & {
8
8
  readonly spaceId: string;
9
9
  readonly installationId: string;
10
- }): Promise<HomeGraphLinkResult>;
10
+ }): Promise<HomeGraphUnlinkResult>;
11
11
  //# sourceMappingURL=link.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"link.d.ts","sourceRoot":"","sources":["../../../../src/platform/knowledge/home-graph/link.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAQlD,OAAO,KAAK,EAA4B,kBAAkB,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAEpG,wBAAsB,sBAAsB,CAC1C,KAAK,EAAE,cAAc,EACrB,KAAK,EAAE,kBAAkB,GAAG;IAAE,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAA;CAAE,GACxF,OAAO,CAAC,mBAAmB,CAAC,CAgB9B;AAED,wBAAsB,wBAAwB,CAC5C,KAAK,EAAE,cAAc,EACrB,KAAK,EAAE,kBAAkB,GAAG;IAAE,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAA;CAAE,GACxF,OAAO,CAAC,mBAAmB,CAAC,CAU9B"}
1
+ {"version":3,"file":"link.d.ts","sourceRoot":"","sources":["../../../../src/platform/knowledge/home-graph/link.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AASlD,OAAO,KAAK,EAA4B,kBAAkB,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AAQ3H,wBAAsB,sBAAsB,CAC1C,KAAK,EAAE,cAAc,EACrB,KAAK,EAAE,kBAAkB,GAAG;IAAE,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAA;CAAE,GACxF,OAAO,CAAC,mBAAmB,CAAC,CAgB9B;AAED,wBAAsB,wBAAwB,CAC5C,KAAK,EAAE,cAAc,EACrB,KAAK,EAAE,kBAAkB,GAAG;IAAE,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAA;CAAE,GACxF,OAAO,CAAC,qBAAqB,CAAC,CA+BhC"}
@@ -1,4 +1,5 @@
1
1
  import { GoodVibesSdkError } from '@pellux/goodvibes-errors';
2
+ import { isActiveKnowledgeEdge } from '../projection-utils.js';
2
3
  import { belongsToSpace, buildHomeGraphMetadata, homeGraphNodeId, nodeKindForHomeGraphObject, targetToReference, } from './helpers.js';
3
4
  export async function linkHomeGraphKnowledge(store, input) {
4
5
  const from = resolveLinkSource(store, input.spaceId, input);
@@ -18,15 +19,62 @@ export async function linkHomeGraphKnowledge(store, input) {
18
19
  return { ok: true, spaceId: input.spaceId, edge, target: target.record };
19
20
  }
20
21
  export async function unlinkHomeGraphKnowledge(store, input) {
21
- const linked = await linkHomeGraphKnowledge(store, {
22
- ...input,
23
- metadata: {
24
- ...(input.metadata ?? {}),
25
- linkStatus: 'unlinked',
26
- unlinkedAt: Date.now(),
27
- },
28
- });
29
- return { ...linked, edge: linked.edge };
22
+ const from = resolveLinkSource(store, input.spaceId, input);
23
+ const target = resolveExistingHomeGraphTarget(store, input.spaceId, input.target);
24
+ const relation = input.relation ?? input.target.relation ?? 'source_for';
25
+ // Never-linked target: nothing to reverse, and we materialize no phantom records.
26
+ if (!target) {
27
+ return { ok: true, spaceId: input.spaceId, reversed: false, target: null };
28
+ }
29
+ const edge = findHomeGraphLinkEdge(store, from, target, relation);
30
+ if (!edge) {
31
+ return { ok: true, spaceId: input.spaceId, reversed: false, target: target.record };
32
+ }
33
+ await store.deleteEdge(edge.id);
34
+ let removedNodeId;
35
+ if (target.kind === 'node'
36
+ && target.record
37
+ && wasLinkCreatedNode(target.record)
38
+ && !hasOtherActiveEdges(store, target.id, edge.id)) {
39
+ await store.deleteNode(target.id);
40
+ removedNodeId = target.id;
41
+ }
42
+ return {
43
+ ok: true,
44
+ spaceId: input.spaceId,
45
+ reversed: true,
46
+ removedEdgeId: edge.id,
47
+ ...(removedNodeId ? { removedNodeId } : {}),
48
+ target: target.record,
49
+ };
50
+ }
51
+ function resolveExistingHomeGraphTarget(store, spaceId, target) {
52
+ const ref = targetToReference(target);
53
+ if (ref.kind === 'source') {
54
+ const source = store.getSource(ref.id);
55
+ return source && belongsToSpace(source, spaceId) ? { kind: 'source', id: source.id, record: source } : null;
56
+ }
57
+ const existing = store.getNode(ref.id);
58
+ if (existing && belongsToSpace(existing, spaceId))
59
+ return { kind: 'node', id: existing.id, record: existing };
60
+ const kind = ref.nodeKind ?? nodeKindForHomeGraphObject(target.kind);
61
+ const deterministic = store.getNode(homeGraphNodeId(spaceId, kind, ref.id));
62
+ return deterministic && belongsToSpace(deterministic, spaceId)
63
+ ? { kind: 'node', id: deterministic.id, record: deterministic }
64
+ : null;
65
+ }
66
+ function findHomeGraphLinkEdge(store, from, target, relation) {
67
+ return store.edgesFor(from.kind, from.id).find((edge) => (edge.fromKind === from.kind
68
+ && edge.fromId === from.id
69
+ && edge.toKind === target.kind
70
+ && edge.toId === target.id
71
+ && edge.relation === relation));
72
+ }
73
+ function wasLinkCreatedNode(node) {
74
+ return node.metadata.linkCreated === true;
75
+ }
76
+ function hasOtherActiveEdges(store, nodeId, excludeEdgeId) {
77
+ return store.edgesFor('node', nodeId).some((edge) => edge.id !== excludeEdgeId && isActiveKnowledgeEdge(edge));
30
78
  }
31
79
  function resolveLinkSource(store, spaceId, input) {
32
80
  if (input.sourceId) {
@@ -88,6 +136,9 @@ async function ensureHomeGraphLinkTarget(store, spaceId, installationId, target)
88
136
  confidence: 60,
89
137
  metadata: buildHomeGraphMetadata(spaceId, installationId, {
90
138
  homeAssistant: { installationId, objectKind: kind, objectId: target.id },
139
+ // Marks a node the link itself materialized, so unlink can cleanly remove it
140
+ // (and only it) on reversal.
141
+ linkCreated: true,
91
142
  }),
92
143
  };
93
144
  const node = await store.upsertNode(nodeInput);
@@ -1,6 +1,7 @@
1
1
  import type { KnowledgeSemanticService } from '../semantic/index.js';
2
2
  import type { KnowledgeStore } from '../store.js';
3
3
  import type { KnowledgeRefinementTaskRecord } from '../types.js';
4
+ import { type HomeGraphTriageOptions, type HomeGraphTriageResult } from './triage.js';
4
5
  import type { HomeGraphSpaceInput } from './types.js';
5
6
  export declare function listHomeGraphRefinementTasks(input: HomeGraphSpaceInput & {
6
7
  readonly store: KnowledgeStore;
@@ -29,16 +30,20 @@ export declare function runHomeGraphRefinement(input: HomeGraphSpaceInput & {
29
30
  readonly limit?: number | undefined;
30
31
  readonly maxRunMs?: number | undefined;
31
32
  readonly force?: boolean | undefined;
33
+ /**
34
+ * Run the LLM issue-triage pass over open device-quality issues. `true` uses
35
+ * defaults; an object customizes thresholds/limits/rules. Omitted → unchanged
36
+ * gap-refinement behavior for existing callers.
37
+ */
38
+ readonly triage?: HomeGraphTriageOptions | boolean | undefined;
39
+ /** Skip the gap self-improvement pass (e.g. a triage-only run). */
40
+ readonly skipGapRefinement?: boolean | undefined;
32
41
  }): Promise<{
33
- ok: boolean;
34
- spaceId: string;
35
- error: string;
36
- result?: never;
37
- } | {
38
- ok: boolean;
39
- spaceId: string;
40
- result: import("../semantic/types.js").KnowledgeSemanticSelfImproveResult;
41
- error?: never;
42
+ readonly ok: boolean;
43
+ readonly spaceId: string;
44
+ readonly error?: string | undefined;
45
+ readonly result?: Awaited<ReturnType<KnowledgeSemanticService['selfImprove']>> | undefined;
46
+ readonly triage?: HomeGraphTriageResult | undefined;
42
47
  }>;
43
48
  export declare function cancelHomeGraphRefinementTask(input: HomeGraphSpaceInput & {
44
49
  readonly store: KnowledgeStore;
@@ -1 +1 @@
1
- {"version":3,"file":"refinement.d.ts","sourceRoot":"","sources":["../../../../src/platform/knowledge/home-graph/refinement.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,sBAAsB,CAAC;AACrE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,KAAK,EAAE,6BAA6B,EAAE,MAAM,aAAa,CAAC;AAEjE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAEtD,wBAAsB,4BAA4B,CAAC,KAAK,EAAE,mBAAmB,GAAG;IAC9E,QAAQ,CAAC,KAAK,EAAE,cAAc,CAAC;IAC/B,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACpC,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACpC,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACxC,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CACrC,GAAG,OAAO,CAAC;IAAE,QAAQ,CAAC,EAAE,EAAE,IAAI,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,SAAS,6BAA6B,EAAE,CAAA;CAAE,CAAC,CAcrH;AAED,wBAAsB,0BAA0B,CAAC,KAAK,EAAE,mBAAmB,GAAG;IAC5E,QAAQ,CAAC,KAAK,EAAE,cAAc,CAAC;IAC/B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB,GAAG,OAAO,CAAC;IAAE,QAAQ,CAAC,EAAE,EAAE,IAAI,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,6BAA6B,GAAG,IAAI,CAAA;CAAE,CAAC,CAKhH;AAED,wBAAsB,sBAAsB,CAAC,KAAK,EAAE,mBAAmB,GAAG;IACxE,QAAQ,CAAC,KAAK,EAAE,cAAc,CAAC;IAC/B,QAAQ,CAAC,eAAe,CAAC,EAAE,wBAAwB,GAAG,SAAS,CAAC;IAChE,QAAQ,CAAC,MAAM,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,SAAS,CAAC;IAChD,QAAQ,CAAC,SAAS,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,SAAS,CAAC;IACnD,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACpC,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACvC,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;CACtC;;;;;;;;;;GAcA;AAED,wBAAsB,6BAA6B,CAAC,KAAK,EAAE,mBAAmB,GAAG;IAC/E,QAAQ,CAAC,KAAK,EAAE,cAAc,CAAC;IAC/B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;;;;;;;;;;GAuBA"}
1
+ {"version":3,"file":"refinement.d.ts","sourceRoot":"","sources":["../../../../src/platform/knowledge/home-graph/refinement.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,sBAAsB,CAAC;AACrE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,KAAK,EAAE,6BAA6B,EAAE,MAAM,aAAa,CAAC;AAEjE,OAAO,EAEL,KAAK,sBAAsB,EAC3B,KAAK,qBAAqB,EAC3B,MAAM,aAAa,CAAC;AACrB,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAEtD,wBAAsB,4BAA4B,CAAC,KAAK,EAAE,mBAAmB,GAAG;IAC9E,QAAQ,CAAC,KAAK,EAAE,cAAc,CAAC;IAC/B,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACpC,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACpC,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACxC,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CACrC,GAAG,OAAO,CAAC;IAAE,QAAQ,CAAC,EAAE,EAAE,IAAI,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,SAAS,6BAA6B,EAAE,CAAA;CAAE,CAAC,CAcrH;AAED,wBAAsB,0BAA0B,CAAC,KAAK,EAAE,mBAAmB,GAAG;IAC5E,QAAQ,CAAC,KAAK,EAAE,cAAc,CAAC;IAC/B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB,GAAG,OAAO,CAAC;IAAE,QAAQ,CAAC,EAAE,EAAE,IAAI,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,6BAA6B,GAAG,IAAI,CAAA;CAAE,CAAC,CAKhH;AAED,wBAAsB,sBAAsB,CAAC,KAAK,EAAE,mBAAmB,GAAG;IACxE,QAAQ,CAAC,KAAK,EAAE,cAAc,CAAC;IAC/B,QAAQ,CAAC,eAAe,CAAC,EAAE,wBAAwB,GAAG,SAAS,CAAC;IAChE,QAAQ,CAAC,MAAM,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,SAAS,CAAC;IAChD,QAAQ,CAAC,SAAS,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,SAAS,CAAC;IACnD,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACpC,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACvC,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IACrC;;;;OAIG;IACH,QAAQ,CAAC,MAAM,CAAC,EAAE,sBAAsB,GAAG,OAAO,GAAG,SAAS,CAAC;IAC/D,mEAAmE;IACnE,QAAQ,CAAC,iBAAiB,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;CAClD,GAAG,OAAO,CAAC;IACV,QAAQ,CAAC,EAAE,EAAE,OAAO,CAAC;IACrB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACpC,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,UAAU,CAAC,wBAAwB,CAAC,aAAa,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC;IAC3F,QAAQ,CAAC,MAAM,CAAC,EAAE,qBAAqB,GAAG,SAAS,CAAC;CACrD,CAAC,CAgCD;AAED,wBAAsB,6BAA6B,CAAC,KAAK,EAAE,mBAAmB,GAAG;IAC/E,QAAQ,CAAC,KAAK,EAAE,cAAc,CAAC;IAC/B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;;;;;;;;;;GAuBA"}