@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.
- package/dist/contracts/artifacts/operator-contract.json +26 -2
- package/dist/platform/companion/companion-chat-manager.d.ts +6 -12
- package/dist/platform/companion/companion-chat-manager.d.ts.map +1 -1
- package/dist/platform/companion/companion-chat-manager.js +8 -2
- package/dist/platform/config/index.d.ts +2 -1
- package/dist/platform/config/index.d.ts.map +1 -1
- package/dist/platform/config/index.js +1 -0
- package/dist/platform/config/manager.d.ts +35 -0
- package/dist/platform/config/manager.d.ts.map +1 -1
- package/dist/platform/config/manager.js +98 -2
- package/dist/platform/config/shared-config-tier.d.ts +51 -0
- package/dist/platform/config/shared-config-tier.d.ts.map +1 -0
- package/dist/platform/config/shared-config-tier.js +127 -0
- package/dist/platform/control-plane/operator-contract-schemas-knowledge.d.ts.map +1 -1
- package/dist/platform/control-plane/operator-contract-schemas-knowledge.js +6 -1
- package/dist/platform/control-plane/operator-contract-schemas-runtime.d.ts.map +1 -1
- package/dist/platform/control-plane/operator-contract-schemas-runtime.js +2 -1
- package/dist/platform/daemon/facade-composition.d.ts.map +1 -1
- package/dist/platform/daemon/facade-composition.js +1 -0
- package/dist/platform/daemon/homeassistant-chat.d.ts +4 -1
- package/dist/platform/daemon/homeassistant-chat.d.ts.map +1 -1
- package/dist/platform/daemon/homeassistant-chat.js +1 -1
- package/dist/platform/daemon/http/homeassistant-routes.d.ts.map +1 -1
- package/dist/platform/daemon/http/homeassistant-routes.js +28 -2
- package/dist/platform/integrations/webhooks.d.ts +15 -0
- package/dist/platform/integrations/webhooks.d.ts.map +1 -1
- package/dist/platform/integrations/webhooks.js +18 -0
- package/dist/platform/knowledge/extraction-policy.d.ts +12 -1
- package/dist/platform/knowledge/extraction-policy.d.ts.map +1 -1
- package/dist/platform/knowledge/extraction-policy.js +19 -1
- package/dist/platform/knowledge/graphql-schema.d.ts +1 -1
- package/dist/platform/knowledge/graphql-schema.d.ts.map +1 -1
- package/dist/platform/knowledge/graphql-schema.js +5 -0
- package/dist/platform/knowledge/home-graph/index.d.ts.map +1 -1
- package/dist/platform/knowledge/home-graph/index.js +4 -0
- package/dist/platform/knowledge/home-graph/link.d.ts +2 -2
- package/dist/platform/knowledge/home-graph/link.d.ts.map +1 -1
- package/dist/platform/knowledge/home-graph/link.js +60 -9
- package/dist/platform/knowledge/home-graph/refinement.d.ts +14 -9
- package/dist/platform/knowledge/home-graph/refinement.d.ts.map +1 -1
- package/dist/platform/knowledge/home-graph/refinement.js +18 -3
- package/dist/platform/knowledge/home-graph/reset.js +21 -4
- package/dist/platform/knowledge/home-graph/service.d.ts +10 -11
- package/dist/platform/knowledge/home-graph/service.d.ts.map +1 -1
- package/dist/platform/knowledge/home-graph/triage.d.ts +103 -0
- package/dist/platform/knowledge/home-graph/triage.d.ts.map +1 -0
- package/dist/platform/knowledge/home-graph/triage.js +362 -0
- package/dist/platform/knowledge/home-graph/types.d.ts +15 -0
- package/dist/platform/knowledge/home-graph/types.d.ts.map +1 -1
- package/dist/platform/knowledge/knowledge-api.d.ts +6 -0
- package/dist/platform/knowledge/knowledge-api.d.ts.map +1 -1
- package/dist/platform/knowledge/knowledge-api.js +5 -0
- package/dist/platform/knowledge/knowledge-history-types.d.ts +56 -0
- package/dist/platform/knowledge/knowledge-history-types.d.ts.map +1 -0
- package/dist/platform/knowledge/knowledge-history-types.js +1 -0
- package/dist/platform/knowledge/packet.d.ts.map +1 -1
- package/dist/platform/knowledge/packet.js +27 -3
- package/dist/platform/knowledge/scope-records.js +4 -2
- package/dist/platform/knowledge/semantic/answer-gaps.d.ts +8 -0
- package/dist/platform/knowledge/semantic/answer-gaps.d.ts.map +1 -1
- package/dist/platform/knowledge/semantic/answer-gaps.js +26 -6
- package/dist/platform/knowledge/semantic/enrichment.d.ts.map +1 -1
- package/dist/platform/knowledge/semantic/enrichment.js +15 -13
- package/dist/platform/knowledge/semantic/graph-index.d.ts.map +1 -1
- package/dist/platform/knowledge/semantic/graph-index.js +3 -1
- package/dist/platform/knowledge/semantic/service.d.ts +7 -0
- package/dist/platform/knowledge/semantic/service.d.ts.map +1 -1
- package/dist/platform/knowledge/semantic/service.js +10 -1
- package/dist/platform/knowledge/service-node-admin.d.ts +46 -0
- package/dist/platform/knowledge/service-node-admin.d.ts.map +1 -0
- package/dist/platform/knowledge/service-node-admin.js +72 -0
- package/dist/platform/knowledge/service.d.ts +24 -20
- package/dist/platform/knowledge/service.d.ts.map +1 -1
- package/dist/platform/knowledge/service.js +23 -47
- package/dist/platform/knowledge/store-config.d.ts +34 -0
- package/dist/platform/knowledge/store-config.d.ts.map +1 -1
- package/dist/platform/knowledge/store-config.js +23 -0
- package/dist/platform/knowledge/store-load.d.ts +3 -1
- package/dist/platform/knowledge/store-load.d.ts.map +1 -1
- package/dist/platform/knowledge/store-load.js +3 -1
- package/dist/platform/knowledge/store-node-history.d.ts +49 -0
- package/dist/platform/knowledge/store-node-history.d.ts.map +1 -0
- package/dist/platform/knowledge/store-node-history.js +331 -0
- package/dist/platform/knowledge/store-record-delete.d.ts +25 -0
- package/dist/platform/knowledge/store-record-delete.d.ts.map +1 -0
- package/dist/platform/knowledge/store-record-delete.js +84 -0
- package/dist/platform/knowledge/store-schema.d.ts +3 -1
- package/dist/platform/knowledge/store-schema.d.ts.map +1 -1
- package/dist/platform/knowledge/store-schema.js +66 -0
- package/dist/platform/knowledge/store.d.ts +19 -1
- package/dist/platform/knowledge/store.d.ts.map +1 -1
- package/dist/platform/knowledge/store.js +69 -108
- package/dist/platform/knowledge/types.d.ts +18 -0
- package/dist/platform/knowledge/types.d.ts.map +1 -1
- package/dist/platform/providers/registry.d.ts +18 -0
- package/dist/platform/providers/registry.d.ts.map +1 -1
- package/dist/platform/providers/registry.js +49 -3
- package/dist/platform/providers/runtime-snapshot.d.ts.map +1 -1
- package/dist/platform/providers/runtime-snapshot.js +14 -2
- package/dist/platform/runtime/memory-spine/client.d.ts +12 -0
- package/dist/platform/runtime/memory-spine/client.d.ts.map +1 -1
- package/dist/platform/runtime/memory-spine/client.js +14 -4
- package/dist/platform/runtime/memory-spine/index.d.ts +1 -0
- package/dist/platform/runtime/memory-spine/index.d.ts.map +1 -1
- package/dist/platform/runtime/memory-spine/index.js +1 -0
- package/dist/platform/runtime/memory-spine/recall-snapshot.d.ts.map +1 -1
- package/dist/platform/runtime/memory-spine/recall-snapshot.js +16 -3
- package/dist/platform/runtime/memory-spine/wire-verb-availability.d.ts +59 -0
- package/dist/platform/runtime/memory-spine/wire-verb-availability.d.ts.map +1 -0
- package/dist/platform/runtime/memory-spine/wire-verb-availability.js +114 -0
- package/dist/platform/runtime/services.d.ts.map +1 -1
- package/dist/platform/runtime/services.js +3 -12
- package/dist/platform/state/memory-recall-contract.d.ts +7 -0
- package/dist/platform/state/memory-recall-contract.d.ts.map +1 -1
- package/dist/platform/state/memory-recall-contract.js +2 -0
- package/dist/platform/utils/notify.d.ts +25 -1
- package/dist/platform/utils/notify.d.ts.map +1 -1
- package/dist/platform/utils/notify.js +29 -1
- package/dist/platform/version.js +1 -1
- 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,
|
|
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
|
-
|
|
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;
|
|
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":"AAAA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,yBAAyB,CAAC;AACtE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAEhE,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,wCAAwC,CAAC;AACnF,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,sCAAsC,CAAC;
|
|
1
|
+
{"version":3,"file":"homeassistant-chat.d.ts","sourceRoot":"","sources":["../../../src/platform/daemon/homeassistant-chat.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,yBAAyB,CAAC;AACtE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAEhE,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,wCAAwC,CAAC;AACnF,OAAO,KAAK,EAAE,oBAAoB,EAAE,sBAAsB,EAAE,MAAM,sCAAsC,CAAC;AACzG,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAE1D,eAAO,MAAM,4CAA4C,QAAc,CAAC;AAIxE,KAAK,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAE1C,UAAU,iBAAiB;IACzB,QAAQ,CAAC,KAAK,EAAE,mBAAmB,CAAC,OAAO,CAAC,CAAC;IAC7C,QAAQ,CAAC,aAAa,EAAE,mBAAmB,CAAC,eAAe,CAAC,CAAC;IAC7D,QAAQ,CAAC,YAAY,EAAE,mBAAmB,CAAC,cAAc,CAAC,CAAC;CAC5D;AAED,UAAU,YAAY;IACpB,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CAC3B;AAED,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACvC,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACrC,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1C,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACzC,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACtC,QAAQ,CAAC,KAAK,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,SAAS,CAAC;IAC/C,QAAQ,CAAC,OAAO,CAAC,EAAE,UAAU,GAAG,SAAS,CAAC;IAC1C,QAAQ,CAAC,kBAAkB,EAAE,MAAM,CAAC;CACrC;AAED,MAAM,WAAW,2BAA2B;IAC1C,QAAQ,CAAC,OAAO,EAAE,sBAAsB,CAAC;IACzC,QAAQ,CAAC,OAAO,EAAE,oBAAoB,CAAC;IACvC,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC;IAC7B,QAAQ,CAAC,cAAc,EAAE,OAAO,CAAC;CAClC;AAED,MAAM,WAAW,2BAA4B,SAAQ,2BAA2B;IAC9E,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,kBAAkB,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACjD,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACvC,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CACrC;AAED,MAAM,WAAW,wBAAwB;IACvC,QAAQ,CAAC,aAAa,EAAE,IAAI,CAAC,aAAa,EAAE,KAAK,CAAC,GAAG,YAAY,CAAC;IAClE,QAAQ,CAAC,aAAa,EAAE,iBAAiB,CAAC;IAC1C,QAAQ,CAAC,WAAW,EAAE,oBAAoB,CAAC;IAC3C,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;AAED,wBAAsB,4BAA4B,CAChD,OAAO,EAAE,wBAAwB,EACjC,KAAK,EAAE,sBAAsB,EAC7B,OAAO,GAAE;IACP,QAAQ,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC;IACxB,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACxC,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B;yFACqF;IACrF,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,KAAK,EAAE,sBAAsB,KAAK,IAAI,CAAC,GAAG,SAAS,CAAC;CACzE,GACL,OAAO,CAAC,2BAA2B,CAAC,CAoBtC;AAED,wBAAsB,+BAA+B,CACnD,OAAO,EAAE,wBAAwB,EACjC,KAAK,EAAE,sBAAsB,GAC5B,OAAO,CAAC,2BAA2B,CAAC,CAiEtC;AAED,wBAAgB,mCAAmC,CACjD,aAAa,EAAE,YAAY,EAC3B,KAAK,EAAE,OAAO,GACb,MAAM,CAOR"}
|
|
@@ -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;
|
|
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;
|
|
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,
|
|
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,
|
|
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;
|
|
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<
|
|
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;
|
|
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
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
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
|
|
36
|
-
result?:
|
|
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;
|
|
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"}
|