@pellux/goodvibes-sdk 1.1.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 (139) hide show
  1. package/dist/contracts/artifacts/operator-contract.json +1416 -88
  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/method-catalog-runtime.d.ts.map +1 -1
  15. package/dist/platform/control-plane/method-catalog-runtime.js +95 -1
  16. package/dist/platform/control-plane/operator-contract-schemas-knowledge.d.ts.map +1 -1
  17. package/dist/platform/control-plane/operator-contract-schemas-knowledge.js +6 -1
  18. package/dist/platform/control-plane/operator-contract-schemas-runtime.d.ts +7 -0
  19. package/dist/platform/control-plane/operator-contract-schemas-runtime.d.ts.map +1 -1
  20. package/dist/platform/control-plane/operator-contract-schemas-runtime.js +40 -1
  21. package/dist/platform/daemon/facade-composition.d.ts.map +1 -1
  22. package/dist/platform/daemon/facade-composition.js +1 -0
  23. package/dist/platform/daemon/homeassistant-chat.d.ts +4 -1
  24. package/dist/platform/daemon/homeassistant-chat.d.ts.map +1 -1
  25. package/dist/platform/daemon/homeassistant-chat.js +1 -1
  26. package/dist/platform/daemon/http/homeassistant-routes.d.ts.map +1 -1
  27. package/dist/platform/daemon/http/homeassistant-routes.js +28 -2
  28. package/dist/platform/integrations/webhooks.d.ts +15 -0
  29. package/dist/platform/integrations/webhooks.d.ts.map +1 -1
  30. package/dist/platform/integrations/webhooks.js +18 -0
  31. package/dist/platform/knowledge/extraction-policy.d.ts +12 -1
  32. package/dist/platform/knowledge/extraction-policy.d.ts.map +1 -1
  33. package/dist/platform/knowledge/extraction-policy.js +19 -1
  34. package/dist/platform/knowledge/graphql-schema.d.ts +1 -1
  35. package/dist/platform/knowledge/graphql-schema.d.ts.map +1 -1
  36. package/dist/platform/knowledge/graphql-schema.js +5 -0
  37. package/dist/platform/knowledge/home-graph/index.d.ts.map +1 -1
  38. package/dist/platform/knowledge/home-graph/index.js +4 -0
  39. package/dist/platform/knowledge/home-graph/link.d.ts +2 -2
  40. package/dist/platform/knowledge/home-graph/link.d.ts.map +1 -1
  41. package/dist/platform/knowledge/home-graph/link.js +60 -9
  42. package/dist/platform/knowledge/home-graph/refinement.d.ts +14 -9
  43. package/dist/platform/knowledge/home-graph/refinement.d.ts.map +1 -1
  44. package/dist/platform/knowledge/home-graph/refinement.js +18 -3
  45. package/dist/platform/knowledge/home-graph/reset.js +21 -4
  46. package/dist/platform/knowledge/home-graph/service.d.ts +10 -11
  47. package/dist/platform/knowledge/home-graph/service.d.ts.map +1 -1
  48. package/dist/platform/knowledge/home-graph/triage.d.ts +103 -0
  49. package/dist/platform/knowledge/home-graph/triage.d.ts.map +1 -0
  50. package/dist/platform/knowledge/home-graph/triage.js +362 -0
  51. package/dist/platform/knowledge/home-graph/types.d.ts +15 -0
  52. package/dist/platform/knowledge/home-graph/types.d.ts.map +1 -1
  53. package/dist/platform/knowledge/knowledge-api.d.ts +6 -0
  54. package/dist/platform/knowledge/knowledge-api.d.ts.map +1 -1
  55. package/dist/platform/knowledge/knowledge-api.js +5 -0
  56. package/dist/platform/knowledge/knowledge-history-types.d.ts +56 -0
  57. package/dist/platform/knowledge/knowledge-history-types.d.ts.map +1 -0
  58. package/dist/platform/knowledge/knowledge-history-types.js +1 -0
  59. package/dist/platform/knowledge/packet.d.ts.map +1 -1
  60. package/dist/platform/knowledge/packet.js +27 -3
  61. package/dist/platform/knowledge/scope-records.js +4 -2
  62. package/dist/platform/knowledge/semantic/answer-gaps.d.ts +8 -0
  63. package/dist/platform/knowledge/semantic/answer-gaps.d.ts.map +1 -1
  64. package/dist/platform/knowledge/semantic/answer-gaps.js +26 -6
  65. package/dist/platform/knowledge/semantic/enrichment.d.ts.map +1 -1
  66. package/dist/platform/knowledge/semantic/enrichment.js +15 -13
  67. package/dist/platform/knowledge/semantic/graph-index.d.ts.map +1 -1
  68. package/dist/platform/knowledge/semantic/graph-index.js +3 -1
  69. package/dist/platform/knowledge/semantic/service.d.ts +7 -0
  70. package/dist/platform/knowledge/semantic/service.d.ts.map +1 -1
  71. package/dist/platform/knowledge/semantic/service.js +10 -1
  72. package/dist/platform/knowledge/service-node-admin.d.ts +46 -0
  73. package/dist/platform/knowledge/service-node-admin.d.ts.map +1 -0
  74. package/dist/platform/knowledge/service-node-admin.js +72 -0
  75. package/dist/platform/knowledge/service.d.ts +24 -20
  76. package/dist/platform/knowledge/service.d.ts.map +1 -1
  77. package/dist/platform/knowledge/service.js +23 -47
  78. package/dist/platform/knowledge/store-config.d.ts +34 -0
  79. package/dist/platform/knowledge/store-config.d.ts.map +1 -1
  80. package/dist/platform/knowledge/store-config.js +23 -0
  81. package/dist/platform/knowledge/store-load.d.ts +3 -1
  82. package/dist/platform/knowledge/store-load.d.ts.map +1 -1
  83. package/dist/platform/knowledge/store-load.js +3 -1
  84. package/dist/platform/knowledge/store-node-history.d.ts +49 -0
  85. package/dist/platform/knowledge/store-node-history.d.ts.map +1 -0
  86. package/dist/platform/knowledge/store-node-history.js +331 -0
  87. package/dist/platform/knowledge/store-record-delete.d.ts +25 -0
  88. package/dist/platform/knowledge/store-record-delete.d.ts.map +1 -0
  89. package/dist/platform/knowledge/store-record-delete.js +84 -0
  90. package/dist/platform/knowledge/store-schema.d.ts +3 -1
  91. package/dist/platform/knowledge/store-schema.d.ts.map +1 -1
  92. package/dist/platform/knowledge/store-schema.js +66 -0
  93. package/dist/platform/knowledge/store.d.ts +19 -1
  94. package/dist/platform/knowledge/store.d.ts.map +1 -1
  95. package/dist/platform/knowledge/store.js +69 -108
  96. package/dist/platform/knowledge/types.d.ts +18 -0
  97. package/dist/platform/knowledge/types.d.ts.map +1 -1
  98. package/dist/platform/providers/registry.d.ts +18 -0
  99. package/dist/platform/providers/registry.d.ts.map +1 -1
  100. package/dist/platform/providers/registry.js +49 -3
  101. package/dist/platform/providers/runtime-snapshot.d.ts.map +1 -1
  102. package/dist/platform/providers/runtime-snapshot.js +14 -2
  103. package/dist/platform/runtime/memory-spine/client.d.ts +137 -12
  104. package/dist/platform/runtime/memory-spine/client.d.ts.map +1 -1
  105. package/dist/platform/runtime/memory-spine/client.js +119 -1
  106. package/dist/platform/runtime/memory-spine/index.d.ts +8 -1
  107. package/dist/platform/runtime/memory-spine/index.d.ts.map +1 -1
  108. package/dist/platform/runtime/memory-spine/index.js +7 -0
  109. package/dist/platform/runtime/memory-spine/recall-snapshot.d.ts +74 -0
  110. package/dist/platform/runtime/memory-spine/recall-snapshot.d.ts.map +1 -0
  111. package/dist/platform/runtime/memory-spine/recall-snapshot.js +87 -0
  112. package/dist/platform/runtime/memory-spine/wire-verb-availability.d.ts +59 -0
  113. package/dist/platform/runtime/memory-spine/wire-verb-availability.d.ts.map +1 -0
  114. package/dist/platform/runtime/memory-spine/wire-verb-availability.js +114 -0
  115. package/dist/platform/runtime/services.d.ts.map +1 -1
  116. package/dist/platform/runtime/services.js +3 -12
  117. package/dist/platform/state/memory-recall-contract.d.ts +7 -0
  118. package/dist/platform/state/memory-recall-contract.d.ts.map +1 -1
  119. package/dist/platform/state/memory-recall-contract.js +2 -0
  120. package/dist/platform/utils/notify.d.ts +25 -1
  121. package/dist/platform/utils/notify.d.ts.map +1 -1
  122. package/dist/platform/utils/notify.js +29 -1
  123. package/dist/platform/version.js +1 -1
  124. package/dist/platform/voice/index.d.ts +2 -0
  125. package/dist/platform/voice/index.d.ts.map +1 -1
  126. package/dist/platform/voice/index.js +3 -0
  127. package/dist/platform/voice/spoken-turn/audio-sink.d.ts +111 -0
  128. package/dist/platform/voice/spoken-turn/audio-sink.d.ts.map +1 -0
  129. package/dist/platform/voice/spoken-turn/audio-sink.js +1 -0
  130. package/dist/platform/voice/spoken-turn/controller.d.ts +117 -0
  131. package/dist/platform/voice/spoken-turn/controller.d.ts.map +1 -0
  132. package/dist/platform/voice/spoken-turn/controller.js +448 -0
  133. package/dist/platform/voice/spoken-turn/index.d.ts +16 -0
  134. package/dist/platform/voice/spoken-turn/index.d.ts.map +1 -0
  135. package/dist/platform/voice/spoken-turn/index.js +12 -0
  136. package/dist/platform/voice/spoken-turn/text-chunker.d.ts +33 -0
  137. package/dist/platform/voice/spoken-turn/text-chunker.d.ts.map +1 -0
  138. package/dist/platform/voice/spoken-turn/text-chunker.js +97 -0
  139. package/package.json +9 -9
@@ -1,6 +1,6 @@
1
1
  import { EMPTY_OBJECT_SCHEMA, BOOLEAN_SCHEMA, STRING_SCHEMA, NUMBER_SCHEMA, objectSchema, listOutputSchema, entityOutputSchema, bodyEnvelopeSchema, methodDescriptor, runtimeEventId, arraySchema, } from './method-catalog-shared.js';
2
2
  import { enumSchema, nullableSchema } from './operator-contract-schemas-shared.js';
3
- import { CONTINUITY_SNAPSHOT_SCHEMA, DISTRIBUTED_NODE_HOST_CONTRACT_SCHEMA, HEALTH_SNAPSHOT_SCHEMA, INTELLIGENCE_SNAPSHOT_SCHEMA, MEMORY_DOCTOR_REPORT_SCHEMA, MEMORY_VECTOR_STATS_SCHEMA, MEMORY_CLASS_SCHEMA, MEMORY_SCOPE_SCHEMA, MEMORY_REVIEW_STATE_SCHEMA, MEMORY_PROVENANCE_KIND_SCHEMA, MEMORY_PROVENANCE_LINK_SCHEMA, MEMORY_RECORD_SCHEMA, MEMORY_RECORD_SEARCH_OUTPUT_SCHEMA, MEMORY_RECORD_DELETE_OUTPUT_SCHEMA, PROVIDER_ACCOUNT_SNAPSHOT_SCHEMA, PROVIDER_RUNTIME_SNAPSHOT_SCHEMA, PROVIDER_USAGE_SNAPSHOT_SCHEMA, REMOTE_PAIR_APPROVAL_OUTPUT_SCHEMA, REMOTE_PAIR_REQUEST_OUTPUT_SCHEMA, REMOTE_PAIR_REQUESTS_OUTPUT_SCHEMA, REMOTE_PEERS_OUTPUT_SCHEMA, REMOTE_PAIR_REQUEST_ACTION_INPUT_SCHEMA, REMOTE_PEER_DISCONNECT_INPUT_SCHEMA, REMOTE_PEER_INVOKE_INPUT_SCHEMA, REMOTE_PEER_INVOKE_OUTPUT_SCHEMA, REMOTE_PEER_OUTPUT_SCHEMA, REMOTE_PEER_TOKEN_REVOKE_INPUT_SCHEMA, REMOTE_PEER_TOKEN_ROTATE_INPUT_SCHEMA, REMOTE_PEER_TOKEN_ROTATE_OUTPUT_SCHEMA, REMOTE_SNAPSHOT_SCHEMA, REMOTE_WORK_LIST_OUTPUT_SCHEMA, REMOTE_WORK_CANCEL_INPUT_SCHEMA, REMOTE_WORK_OUTPUT_SCHEMA, SECURITY_SETTINGS_REPORT_SCHEMA, SETTINGS_SNAPSHOT_SCHEMA, WORKTREE_SNAPSHOT_SCHEMA, } from './operator-contract-schemas.js';
3
+ import { CONTINUITY_SNAPSHOT_SCHEMA, DISTRIBUTED_NODE_HOST_CONTRACT_SCHEMA, HEALTH_SNAPSHOT_SCHEMA, INTELLIGENCE_SNAPSHOT_SCHEMA, MEMORY_DOCTOR_REPORT_SCHEMA, MEMORY_VECTOR_STATS_SCHEMA, MEMORY_CLASS_SCHEMA, MEMORY_SCOPE_SCHEMA, MEMORY_REVIEW_STATE_SCHEMA, MEMORY_PROVENANCE_KIND_SCHEMA, MEMORY_PROVENANCE_LINK_SCHEMA, MEMORY_RECORD_SCHEMA, MEMORY_RECORD_SEARCH_OUTPUT_SCHEMA, MEMORY_RECORD_DELETE_OUTPUT_SCHEMA, MEMORY_LINK_SCHEMA, MEMORY_BUNDLE_SCHEMA, MEMORY_IMPORT_RESULT_SCHEMA, MEMORY_RECORD_LIST_OUTPUT_SCHEMA, MEMORY_RECORD_SEMANTIC_OUTPUT_SCHEMA, MEMORY_RECORD_LINKS_OUTPUT_SCHEMA, PROVIDER_ACCOUNT_SNAPSHOT_SCHEMA, PROVIDER_RUNTIME_SNAPSHOT_SCHEMA, PROVIDER_USAGE_SNAPSHOT_SCHEMA, REMOTE_PAIR_APPROVAL_OUTPUT_SCHEMA, REMOTE_PAIR_REQUEST_OUTPUT_SCHEMA, REMOTE_PAIR_REQUESTS_OUTPUT_SCHEMA, REMOTE_PEERS_OUTPUT_SCHEMA, REMOTE_PAIR_REQUEST_ACTION_INPUT_SCHEMA, REMOTE_PEER_DISCONNECT_INPUT_SCHEMA, REMOTE_PEER_INVOKE_INPUT_SCHEMA, REMOTE_PEER_INVOKE_OUTPUT_SCHEMA, REMOTE_PEER_OUTPUT_SCHEMA, REMOTE_PEER_TOKEN_REVOKE_INPUT_SCHEMA, REMOTE_PEER_TOKEN_ROTATE_INPUT_SCHEMA, REMOTE_PEER_TOKEN_ROTATE_OUTPUT_SCHEMA, REMOTE_SNAPSHOT_SCHEMA, REMOTE_WORK_LIST_OUTPUT_SCHEMA, REMOTE_WORK_CANCEL_INPUT_SCHEMA, REMOTE_WORK_OUTPUT_SCHEMA, SECURITY_SETTINGS_REPORT_SCHEMA, SETTINGS_SNAPSHOT_SCHEMA, WORKTREE_SNAPSHOT_SCHEMA, } from './operator-contract-schemas.js';
4
4
  const MCP_SCOPE_SCHEMA = enumSchema(['project', 'global']);
5
5
  const MCP_SERVER_CONFIG_SCHEMA = objectSchema({
6
6
  name: STRING_SCHEMA,
@@ -71,6 +71,20 @@ const MCP_TOOL_SCHEMA = objectSchema({
71
71
  const MCP_TOOLS_RESPONSE_SCHEMA = objectSchema({
72
72
  tools: arraySchema(MCP_TOOL_SCHEMA),
73
73
  }, ['tools']);
74
+ /** The shared memory search-filter fields (no `recall` — that is search-only). Reused by list / search-semantic / export. */
75
+ const MEMORY_SEARCH_FILTER_FIELDS = {
76
+ scope: MEMORY_SCOPE_SCHEMA,
77
+ cls: MEMORY_CLASS_SCHEMA,
78
+ tags: arraySchema(STRING_SCHEMA),
79
+ query: STRING_SCHEMA,
80
+ semantic: BOOLEAN_SCHEMA,
81
+ since: NUMBER_SCHEMA,
82
+ reviewState: arraySchema(MEMORY_REVIEW_STATE_SCHEMA),
83
+ minConfidence: NUMBER_SCHEMA,
84
+ provenanceKinds: arraySchema(MEMORY_PROVENANCE_KIND_SCHEMA),
85
+ staleOnly: BOOLEAN_SCHEMA,
86
+ limit: NUMBER_SCHEMA,
87
+ };
74
88
  export const builtinGatewayRuntimeMethodDescriptors = [
75
89
  methodDescriptor({
76
90
  id: 'mcp.config.get',
@@ -515,6 +529,86 @@ export const builtinGatewayRuntimeMethodDescriptors = [
515
529
  inputSchema: objectSchema({ id: STRING_SCHEMA }, ['id']),
516
530
  outputSchema: MEMORY_RECORD_DELETE_OUTPUT_SCHEMA,
517
531
  }),
532
+ methodDescriptor({
533
+ id: 'memory.records.list',
534
+ title: 'List Memory Records',
535
+ description: 'Bulk read from the canonical store: a literal (non-semantic) search returning the matching records as a plain array. An empty filter returns every record (getAll). This is the read a client surface uses instead of opening the store file for its browse/list and knowledge-injection paths.',
536
+ category: 'memory',
537
+ scopes: ['read:memory'],
538
+ http: { method: 'POST', path: '/api/memory/records/list' },
539
+ inputSchema: bodyEnvelopeSchema({ ...MEMORY_SEARCH_FILTER_FIELDS }),
540
+ outputSchema: MEMORY_RECORD_LIST_OUTPUT_SCHEMA,
541
+ }),
542
+ methodDescriptor({
543
+ id: 'memory.records.search-semantic',
544
+ title: 'Semantic Search Memory Records',
545
+ description: 'Rank records by semantic similarity against the query, returning scored results (distance, similarity, score). When the query has no vector match the store falls back to a lexical ranking rather than a silent empty. distance is null for a fallback (non-vector) result. Read-only against the daemon\'s canonical index.',
546
+ category: 'memory',
547
+ scopes: ['read:memory'],
548
+ http: { method: 'POST', path: '/api/memory/records/search-semantic' },
549
+ inputSchema: bodyEnvelopeSchema({ ...MEMORY_SEARCH_FILTER_FIELDS }),
550
+ outputSchema: MEMORY_RECORD_SEMANTIC_OUTPUT_SCHEMA,
551
+ }),
552
+ methodDescriptor({
553
+ id: 'memory.records.export',
554
+ title: 'Export Memory Bundle',
555
+ description: 'Export a no-loss bundle (records + links) for the given filter from the canonical store. The bundle round-trips through import id-keyed, so it is the wire form of the cross-surface fold/reconcile seam. Read-only.',
556
+ category: 'memory',
557
+ scopes: ['read:memory'],
558
+ http: { method: 'POST', path: '/api/memory/records/export' },
559
+ inputSchema: bodyEnvelopeSchema({ ...MEMORY_SEARCH_FILTER_FIELDS }),
560
+ outputSchema: entityOutputSchema('bundle', MEMORY_BUNDLE_SCHEMA),
561
+ }),
562
+ methodDescriptor({
563
+ id: 'memory.records.import',
564
+ title: 'Import Memory Bundle',
565
+ description: 'Import a bundle into the canonical store as an id-keyed union: an id already present is left untouched (counted skipped), a new id is added; a link is added only when both its endpoints exist. Never overwrites, never deletes, idempotent on re-run. The daemon is the single writer, so a client imports here instead of writing the store file.',
566
+ category: 'memory',
567
+ scopes: ['write:memory'],
568
+ http: { method: 'POST', path: '/api/memory/records/import' },
569
+ inputSchema: bodyEnvelopeSchema({ bundle: MEMORY_BUNDLE_SCHEMA }, ['bundle']),
570
+ outputSchema: entityOutputSchema('result', MEMORY_IMPORT_RESULT_SCHEMA),
571
+ }),
572
+ methodDescriptor({
573
+ id: 'memory.records.update',
574
+ title: 'Update Memory Record',
575
+ description: 'Edit a record\'s content fields (scope, summary, detail, tags) in the canonical store. This is distinct from the review update: it changes the record itself — e.g. moving scope project→team promotes a record to the shared surface. Returns 404 when no record with that id exists.',
576
+ category: 'memory',
577
+ scopes: ['write:memory'],
578
+ http: { method: 'POST', path: '/api/memory/records/{id}/update' },
579
+ inputSchema: bodyEnvelopeSchema({
580
+ id: STRING_SCHEMA,
581
+ scope: MEMORY_SCOPE_SCHEMA,
582
+ summary: STRING_SCHEMA,
583
+ detail: STRING_SCHEMA,
584
+ tags: arraySchema(STRING_SCHEMA),
585
+ }, ['id']),
586
+ outputSchema: entityOutputSchema('record', MEMORY_RECORD_SCHEMA),
587
+ }),
588
+ methodDescriptor({
589
+ id: 'memory.records.links.list',
590
+ title: 'List Memory Record Links',
591
+ description: 'Return every link where the record is the source or the target. Returns 404 when no record with that id exists — an honest not-found, distinct from a record that exists but has no links (an empty array).',
592
+ category: 'memory',
593
+ scopes: ['read:memory'],
594
+ http: { method: 'GET', path: '/api/memory/records/{id}/links' },
595
+ inputSchema: objectSchema({ id: STRING_SCHEMA }, ['id']),
596
+ outputSchema: MEMORY_RECORD_LINKS_OUTPUT_SCHEMA,
597
+ }),
598
+ methodDescriptor({
599
+ id: 'memory.records.links.add',
600
+ title: 'Link Memory Records',
601
+ description: 'Create a directed relation (e.g. "supersedes", "caused") from the path record to a target record. Returns 404 when either endpoint does not exist — never a 200 that pretends a link was made between records that do not both exist.',
602
+ category: 'memory',
603
+ scopes: ['write:memory'],
604
+ http: { method: 'POST', path: '/api/memory/records/{id}/links' },
605
+ inputSchema: bodyEnvelopeSchema({
606
+ id: STRING_SCHEMA,
607
+ toId: STRING_SCHEMA,
608
+ relation: STRING_SCHEMA,
609
+ }, ['id', 'toId', 'relation']),
610
+ outputSchema: entityOutputSchema('link', MEMORY_LINK_SCHEMA),
611
+ }),
518
612
  methodDescriptor({
519
613
  id: 'scheduler.capacity',
520
614
  title: 'Scheduler Capacity',
@@ -1 +1 @@
1
- {"version":3,"file":"operator-contract-schemas-knowledge.d.ts","sourceRoot":"","sources":["../../../src/platform/control-plane/operator-contract-schemas-knowledge.ts"],"names":[],"mappings":"AAwBA,eAAO,MAAM,qCAAqC,yBAA6C,CAAC;AAChG,eAAO,MAAM,iCAAiC,yBAAqC,CAAC;AACpF,eAAO,MAAM,oCAAoC,yBAA4B,CAAC;AAC9E,eAAO,MAAM,sCAAsC,yBAAqE,CAAC;AACzH,eAAO,MAAM,4BAA4B,yBAWvC,CAAC;AACH,eAAO,MAAM,8BAA8B,yBAAkD,CAAC;AAC9F,eAAO,MAAM,yBAAyB,yBAAuC,CAAC;AAC9E,eAAO,MAAM,2BAA2B,yBAA2D,CAAC;AACpG,eAAO,MAAM,sCAAsC,yBAcjD,CAAC;AACH,eAAO,MAAM,wCAAwC,yBAOnD,CAAC;AACH,eAAO,MAAM,yCAAyC,yBAAkD,CAAC;AACzG,eAAO,MAAM,yBAAyB,yBAWpC,CAAC;AACH,eAAO,MAAM,uCAAuC,yBAAgD,CAAC;AACrG,eAAO,MAAM,2CAA2C,yBAAmE,CAAC;AAC5H,eAAO,MAAM,6CAA6C,yBAQxD,CAAC;AACH,eAAO,MAAM,wCAAwC,yBAAuC,CAAC;AAwB7F,eAAO,MAAM,oCAAoC;;CAMvC,CAAC;AACX,eAAO,MAAM,+BAA+B;;CAOlC,CAAC;AA4DX,eAAO,MAAM,+BAA+B;;CAYlC,CAAC;AACX,eAAO,MAAM,gCAAgC,yBAIN,CAAC;AACxC,eAAO,MAAM,uCAAuC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAiB1C,CAAC;AACX,eAAO,MAAM,qCAAqC,yBAOM,CAAC;AACzD,eAAO,MAAM,0BAA0B,yBAY4H,CAAC;AACpK,eAAO,MAAM,iCAAiC,yBAGI,CAAC;AAEnD,eAAO,MAAM,uBAAuB,yBAoB2F,CAAC;AAEhI,eAAO,MAAM,qBAAqB,yBAiB0G,CAAC;AAE7I,eAAO,MAAM,sBAAsB,yBAWsF,CAAC;AAE1H,eAAO,MAAM,qBAAqB,yBAW4G,CAAC;AAE/I,eAAO,MAAM,2BAA2B,yBAgBkI,CAAC;AAE3K,eAAO,MAAM,uBAAuB,yBAciL,CAAC;AAEtN,eAAO,MAAM,gCAAgC,yBAyBiH,CAAC;AAE/J,eAAO,MAAM,wCAAwC,yBAER,CAAC;AAE9C,eAAO,MAAM,uCAAuC,yBAER,CAAC;AAE7C,eAAO,MAAM,sCAAsC,yBAsB4H,CAAC;AAEhL,eAAO,MAAM,0BAA0B,yBAOD,CAAC;AAoBvC,eAAO,MAAM,0BAA0B,yBAWgC,CAAC;AAmBxE,eAAO,MAAM,8BAA8B,yBAIa,CAAC;AAEzD,eAAO,MAAM,oCAAoC,yBAKF,CAAC;AAWhD,eAAO,MAAM,oCAAoC,yBAMU,CAAC;AAW5D,eAAO,MAAM,8BAA8B,yBAE5B,CAAC;AAEhB,eAAO,MAAM,2BAA2B,yBAe2C,CAAC;AAEpF,eAAO,MAAM,+BAA+B,yBAAuD,CAAC;AACpG,eAAO,MAAM,6BAA6B,yBAAmD,CAAC;AAC9F,eAAO,MAAM,8BAA8B,yBAAqD,CAAC;AACjG,eAAO,MAAM,oCAAoC,yBAOE,CAAC;AACpD,eAAO,MAAM,kCAAkC,yBAA6D,CAAC;AAgB7G,eAAO,MAAM,uBAAuB,yBASsE,CAAC;AAsG3G,eAAO,MAAM,kCAAkC,yBAOsB,CAAC;AAEtE,eAAO,MAAM,wCAAwC,yBAMK,CAAC;AAE3D,OAAO,EAAE,2BAA2B,EAAE,MAAM,8CAA8C,CAAC;AAE3F,eAAO,MAAM,sCAAsC,yBAIf,CAAC;AAErC,eAAO,MAAM,uCAAuC,yBAId,CAAC;AAEvC,eAAO,MAAM,4BAA4B,yBAE3B,CAAC;AAEf,eAAO,MAAM,+BAA+B,yBAGpB,CAAC;AAEzB,eAAO,MAAM,6BAA6B,yBAE7B,CAAC;AAEd,eAAO,MAAM,iCAAiC,yBAE7B,CAAC;AAElB,eAAO,MAAM,kCAAkC,yBAE7B,CAAC;AAEnB,eAAO,MAAM,8BAA8B,yBAE7B,CAAC;AAEf,eAAO,MAAM,+BAA+B,yBAE7B,CAAC;AAEhB,eAAO,MAAM,kCAAkC,yBAE7B,CAAC;AAEnB,eAAO,MAAM,4BAA4B,yBAE7B,CAAC;AAEb,eAAO,MAAM,2BAA2B,yBAE7B,CAAC;AAEZ,eAAO,MAAM,gCAAgC,yBAEjC,CAAC;AACb,eAAO,MAAM,+BAA+B,yBAEjC,CAAC;AAEZ,eAAO,MAAM,iCAAiC,yBAE7B,CAAC;AAElB,eAAO,MAAM,gCAAgC,yBAE7B,CAAC;AAEjB,eAAO,MAAM,0CAA0C,yBAExC,CAAC;AAEhB,eAAO,MAAM,mCAAmC,yBAA6B,CAAC;AAC9E,eAAO,MAAM,wCAAwC,yBAA8D,CAAC;AACpH,eAAO,MAAM,wCAAwC,yBAAyE,CAAC;AAC/H,eAAO,MAAM,mCAAmC,yBAA+D,CAAC;AAChH,eAAO,MAAM,kCAAkC,yBAAgC,CAAC"}
1
+ {"version":3,"file":"operator-contract-schemas-knowledge.d.ts","sourceRoot":"","sources":["../../../src/platform/control-plane/operator-contract-schemas-knowledge.ts"],"names":[],"mappings":"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"}
@@ -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,
@@ -73,4 +73,11 @@ export declare const MEMORY_PROVENANCE_LINK_SCHEMA: Record<string, unknown>;
73
73
  export declare const MEMORY_RECORD_SCHEMA: Record<string, unknown>;
74
74
  export declare const MEMORY_RECORD_SEARCH_OUTPUT_SCHEMA: Record<string, unknown>;
75
75
  export declare const MEMORY_RECORD_DELETE_OUTPUT_SCHEMA: Record<string, unknown>;
76
+ export declare const MEMORY_LINK_SCHEMA: Record<string, unknown>;
77
+ export declare const MEMORY_SEMANTIC_RESULT_SCHEMA: Record<string, unknown>;
78
+ export declare const MEMORY_BUNDLE_SCHEMA: Record<string, unknown>;
79
+ export declare const MEMORY_IMPORT_RESULT_SCHEMA: Record<string, unknown>;
80
+ export declare const MEMORY_RECORD_LIST_OUTPUT_SCHEMA: Record<string, unknown>;
81
+ export declare const MEMORY_RECORD_SEMANTIC_OUTPUT_SCHEMA: Record<string, unknown>;
82
+ export declare const MEMORY_RECORD_LINKS_OUTPUT_SCHEMA: Record<string, unknown>;
76
83
  //# sourceMappingURL=operator-contract-schemas-runtime.d.ts.map
@@ -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"}
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,8 +658,47 @@ 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,
665
666
  }, ['id', 'deleted']);
667
+ // ── Full-detach catalog wire schemas (1.2.0) ──────────────────────────────────
668
+ export const MEMORY_LINK_SCHEMA = objectSchema({
669
+ fromId: STRING_SCHEMA,
670
+ toId: STRING_SCHEMA,
671
+ relation: STRING_SCHEMA,
672
+ createdAt: NUMBER_SCHEMA,
673
+ }, ['fromId', 'toId', 'relation', 'createdAt']);
674
+ // distance may be Infinity for a no-vector-match fallback; JSON serializes that to
675
+ // null, so the wire field is nullable — honest about the "not ranked by vector" case.
676
+ export const MEMORY_SEMANTIC_RESULT_SCHEMA = objectSchema({
677
+ record: MEMORY_RECORD_SCHEMA,
678
+ distance: nullableSchema(NUMBER_SCHEMA),
679
+ similarity: NUMBER_SCHEMA,
680
+ score: NUMBER_SCHEMA,
681
+ }, ['record', 'similarity', 'score']);
682
+ export const MEMORY_BUNDLE_SCHEMA = objectSchema({
683
+ schemaVersion: enumSchema(['v1']),
684
+ exportedAt: NUMBER_SCHEMA,
685
+ scope: enumSchema(['session', 'project', 'team', 'all']),
686
+ recordCount: NUMBER_SCHEMA,
687
+ linkCount: NUMBER_SCHEMA,
688
+ records: arraySchema(MEMORY_RECORD_SCHEMA),
689
+ links: arraySchema(MEMORY_LINK_SCHEMA),
690
+ }, ['schemaVersion', 'exportedAt', 'scope', 'recordCount', 'linkCount', 'records', 'links']);
691
+ export const MEMORY_IMPORT_RESULT_SCHEMA = objectSchema({
692
+ importedRecords: NUMBER_SCHEMA,
693
+ skippedRecords: NUMBER_SCHEMA,
694
+ importedLinks: NUMBER_SCHEMA,
695
+ }, ['importedRecords', 'skippedRecords', 'importedLinks']);
696
+ export const MEMORY_RECORD_LIST_OUTPUT_SCHEMA = objectSchema({
697
+ records: arraySchema(MEMORY_RECORD_SCHEMA),
698
+ }, ['records']);
699
+ export const MEMORY_RECORD_SEMANTIC_OUTPUT_SCHEMA = objectSchema({
700
+ results: arraySchema(MEMORY_SEMANTIC_RESULT_SCHEMA),
701
+ }, ['results']);
702
+ export const MEMORY_RECORD_LINKS_OUTPUT_SCHEMA = objectSchema({
703
+ links: arraySchema(MEMORY_LINK_SCHEMA),
704
+ }, ['links']);
@@ -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":"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;AACjF,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;IAAE,QAAQ,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAO,GAC7G,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"}
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';