@xopcai/xopc 0.0.158 → 0.0.160

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 (218) hide show
  1. package/dist/browser-ext/manifest.json +1 -1
  2. package/dist/extensions/dashscope/src/image-generation-provider.js +1 -1
  3. package/dist/extensions/fal/src/image-generation-provider.js +1 -1
  4. package/dist/extensions/google/src/image-generation-provider.js +1 -1
  5. package/dist/extensions/telegram/xopc.extension.json +1 -1
  6. package/dist/gateway/static/root/assets/{action-boundary-settings-panel-2p1f4-KA.js → action-boundary-settings-panel-CY3sizqC.js} +1 -1
  7. package/dist/gateway/static/root/assets/{activity-store-C-57rvkX.js → activity-store-3Cso_2qm.js} +1 -1
  8. package/dist/gateway/static/root/assets/{agent-avatar-dicebear-BIl6X2b_.js → agent-avatar-dicebear-B_27aaZQ.js} +1 -1
  9. package/dist/gateway/static/root/assets/agents-B1l3iii6.js +2 -0
  10. package/dist/gateway/static/root/assets/{api-BjcBIV2O.js → api-BbzB57CJ.js} +1 -1
  11. package/dist/gateway/static/root/assets/{app-management-settings-panel-CZxw161D.js → app-management-settings-panel-DfmyWcyh.js} +1 -1
  12. package/dist/gateway/static/root/assets/{appearance-settings-CRXNlDhH.js → appearance-settings-B2v0c-K-.js} +1 -1
  13. package/dist/gateway/static/root/assets/apps-page-DaNFLsp0.js +1 -0
  14. package/dist/gateway/static/root/assets/{archive-plugin-CpVshjXu.js → archive-plugin-DL5Lnx0C.js} +1 -1
  15. package/dist/gateway/static/root/assets/{attachment-load-M9WqqJnQ.js → attachment-load-InuP-ZjQ.js} +1 -1
  16. package/dist/gateway/static/root/assets/{automation-suggestion-card-CYMsAsYf.js → automation-suggestion-card-CahGuh7B.js} +1 -1
  17. package/dist/gateway/static/root/assets/automations-page-Cd0gMx6p.js +6 -0
  18. package/dist/gateway/static/root/assets/{binary-plugins-Cjn3zb4u.js → binary-plugins-CdOTGYVu.js} +1 -1
  19. package/dist/gateway/static/root/assets/{block-editor-BPKdquaV.js → block-editor-D6ShK1S-.js} +3 -3
  20. package/dist/gateway/static/root/assets/browser-settings-page-BmUYDL2Z.js +8 -0
  21. package/dist/gateway/static/root/assets/{capability-presets-api-Bzkcsyzn.js → capability-presets-api-BzoLm52Z.js} +1 -1
  22. package/dist/gateway/static/root/assets/{capability-presets-settings-panel-D4rH4Dax.js → capability-presets-settings-panel-CE7mrWtS.js} +2 -2
  23. package/dist/gateway/static/root/assets/{channel-recipient-api-CFqrSi5K.js → channel-recipient-api-DbgydMjl.js} +1 -1
  24. package/dist/gateway/static/root/assets/channels-settings-D1_gcAHK.js +1 -0
  25. package/dist/gateway/static/root/assets/channels-status-swr-Cqfqv59m.js +1 -0
  26. package/dist/gateway/static/root/assets/{connector-logo-ljPKdYKh.js → connector-logo-C3bJC9nt.js} +1 -1
  27. package/dist/gateway/static/root/assets/connectors-page-CaLBi6Na.js +2 -0
  28. package/dist/gateway/static/root/assets/desktop-pet-settings-BrHVvbBw.js +1 -0
  29. package/dist/gateway/static/root/assets/desktop-pet-sprite-CFd1jGLJ.js +1 -0
  30. package/dist/gateway/static/root/assets/desktop-pet-wacrnJJ1.js +1 -0
  31. package/dist/gateway/static/root/assets/{directory-picker-path-field-Dmy1035j.js → directory-picker-path-field-BPI969w-.js} +1 -1
  32. package/dist/gateway/static/root/assets/{dreaming-settings-tT4WkBkd.js → dreaming-settings-iw6QXD45.js} +3 -3
  33. package/dist/gateway/static/root/assets/{extension-debug-page-CL79q8AH.js → extension-debug-page-rCHyhEr6.js} +1 -1
  34. package/dist/gateway/static/root/assets/{extension-page-hq80wkFI.js → extension-page-C4gQsAPt.js} +1 -1
  35. package/dist/gateway/static/root/assets/{extension-settings-page-BV-9GDfT.js → extension-settings-page-DB_3eik7.js} +1 -1
  36. package/dist/gateway/static/root/assets/{gateway-config-api-CFqoN2NW.js → gateway-config-api-Cdt38iF2.js} +1 -1
  37. package/dist/gateway/static/root/assets/gateway-settings-DM4BgyGw.js +1 -0
  38. package/dist/gateway/static/root/assets/{gateway-startup-retry-cxQ94qMm.js → gateway-startup-retry-ChRFNjj_.js} +1 -1
  39. package/dist/gateway/static/root/assets/goal-create-dialog-BQamcEmF.js +1 -0
  40. package/dist/gateway/static/root/assets/goal-detail-page-DZUQ0Lf1.js +4 -0
  41. package/dist/gateway/static/root/assets/{goals-config-api--qJ4qlRq.js → goals-config-api-RvljeEm6.js} +1 -1
  42. package/dist/gateway/static/root/assets/goals-page-BtxVD27C.js +2 -0
  43. package/dist/gateway/static/root/assets/{goals-settings-h7x9h5lb.js → goals-settings-DMGV4S4L.js} +1 -1
  44. package/dist/gateway/static/root/assets/{heartbeat-settings-71IhhM3s.js → heartbeat-settings-B8r5EXc5.js} +1 -1
  45. package/dist/gateway/static/root/assets/index-CHKe7nwC.js +197 -0
  46. package/dist/gateway/static/root/assets/index-CXhfUIjh.css +1 -0
  47. package/dist/gateway/static/root/assets/{keyboard-shortcuts-settings-BZGmHvLu.js → keyboard-shortcuts-settings-1-LYibQ4.js} +1 -1
  48. package/dist/gateway/static/root/assets/local-app-workbench-page-CTTfyFe3.js +2 -0
  49. package/dist/gateway/static/root/assets/{local-apps-page-CiLqrMIh.js → local-apps-page-CC4vtUUI.js} +1 -1
  50. package/dist/gateway/static/root/assets/{locale-store-C_M71MK9.js → locale-store-CPbGB_6l.js} +1 -1
  51. package/dist/gateway/static/root/assets/logs-page-Bn_taxBV.js +7 -0
  52. package/dist/gateway/static/root/assets/{markdown-split-r1HPWfCU.js → markdown-split-CprEIf8A.js} +1 -1
  53. package/dist/gateway/static/root/assets/{media-plugins-D74kd3hn.js → media-plugins-BXt_Sj2O.js} +1 -1
  54. package/dist/gateway/static/root/assets/{messages-BuT0SR1R.js → messages-DDsiqdJS.js} +4 -4
  55. package/dist/gateway/static/root/assets/models-hub-panel-DJReXRP9.js +2 -0
  56. package/dist/gateway/static/root/assets/{notes-page-Dgu02514.js → notes-page-Wf5-eyyM.js} +1 -1
  57. package/dist/gateway/static/root/assets/notes-workbench-BbdjzYzs.js +4 -0
  58. package/dist/gateway/static/root/assets/{page-tabs-hinRdDy3.js → page-tabs-dtpK_4Fs.js} +1 -1
  59. package/dist/gateway/static/root/assets/{preview-open-alternatives-C7fw3oGy.js → preview-open-alternatives-DijtEVxG.js} +1 -1
  60. package/dist/gateway/static/root/assets/project-detail-page-BwG8SOzI.js +1 -0
  61. package/dist/gateway/static/root/assets/projects-page-nUlyUtxh.js +1 -0
  62. package/dist/gateway/static/root/assets/remote-access-hub-rf7bjije.js +1 -0
  63. package/dist/gateway/static/root/assets/{save-bar-controls-C3aU8-vO.js → save-bar-controls-qhDisdqY.js} +1 -1
  64. package/dist/gateway/static/root/assets/{schedule-field-DjegExFD.js → schedule-field-AhJ50NoT.js} +1 -1
  65. package/dist/gateway/static/root/assets/{schema-form-DLubnsql.js → schema-form-AuJg2CXU.js} +1 -1
  66. package/dist/gateway/static/root/assets/sessions-page-CSoHUe38.js +1 -0
  67. package/dist/gateway/static/root/assets/settings-advanced-gate-Db976IEa.js +1 -0
  68. package/dist/gateway/static/root/assets/{settings-collapsible-section-3syQHsNR.js → settings-collapsible-section-D5ganr_X.js} +1 -1
  69. package/dist/gateway/static/root/assets/{settings-form-section-D4DCZzKg.js → settings-form-section-Db3cKRsg.js} +1 -1
  70. package/dist/gateway/static/root/assets/{settings-loading-skeleton-c5K85ylS.js → settings-loading-skeleton-D05YKT2x.js} +1 -1
  71. package/dist/gateway/static/root/assets/{settings-page-DNiDlaRq.js → settings-page-DYfXmfTx.js} +1 -1
  72. package/dist/gateway/static/root/assets/{settings-page-layout-iTRY1Hy-.js → settings-page-layout-Cv_Cu4I5.js} +1 -1
  73. package/dist/gateway/static/root/assets/setup-status-panel-wBWOFpvw.js +1 -0
  74. package/dist/gateway/static/root/assets/{share-preview-page-B88Afrhe.js → share-preview-page-CYkZVuse.js} +1 -1
  75. package/dist/gateway/static/root/assets/shares-settings-BAMma1-P.js +1 -0
  76. package/dist/gateway/static/root/assets/skill-reload-api-TWxFFWxM.js +1 -0
  77. package/dist/gateway/static/root/assets/skills-page-Ca2RA29R.js +2 -0
  78. package/dist/gateway/static/root/assets/{system-settings-panel-DtpTq837.js → system-settings-panel-C1Ng5bXh.js} +1 -1
  79. package/dist/gateway/static/root/assets/{theme-store-C8ohIHhw.js → theme-store-LMHIDR9n.js} +1 -1
  80. package/dist/gateway/static/root/assets/{typed-models-lib-ndEnUP3b.js → typed-models-lib-Ch2Bdm_5.js} +1 -1
  81. package/dist/gateway/static/root/assets/{use-channel-catalog-BWzou5ar.js → use-channel-catalog-CZnaMOeL.js} +1 -1
  82. package/dist/gateway/static/root/assets/user-context-page-CTumZa0y.js +1 -0
  83. package/dist/gateway/static/root/assets/voice-api-key-field-DdlMxeqO.js +1 -0
  84. package/dist/gateway/static/root/assets/work-discovery-page-CcfZhdBi.js +1 -0
  85. package/dist/gateway/static/root/assets/work-item-detail-page--wxLw1p_.js +1 -0
  86. package/dist/gateway/static/root/assets/work-page-DyS0XBpV.js +1 -0
  87. package/dist/gateway/static/root/assets/{workflow-run-setup-panel-ukmpkj66.js → workflow-run-setup-panel-BFk8TvTw.js} +2 -2
  88. package/dist/gateway/static/root/assets/workflows-page-CVVJd4gy.js +11 -0
  89. package/dist/gateway/static/root/index.html +7 -7
  90. package/dist/package.js +1 -1
  91. package/dist/src/agent/embedded/session-tool-result-guard.js +14 -0
  92. package/dist/src/agent/image/generation/openai-compatible-image-provider.js +1 -1
  93. package/dist/src/agent/service/process-direct-streaming.js +1 -1
  94. package/dist/src/agent/tools/image-generate-tool.js +10 -3
  95. package/dist/src/agent/tools/send-media.js +20 -70
  96. package/dist/src/agent/tools/tool-media.d.ts +9 -0
  97. package/dist/src/agent/tools/tool-media.js +58 -0
  98. package/dist/src/automations/service/action-executor.js +1 -1
  99. package/dist/src/cli/commands/doctor/checks/database-schema.js +1 -1
  100. package/dist/src/config/agent-profile.js +1 -1
  101. package/dist/src/gateway/agent-run-relay.d.ts +2 -0
  102. package/dist/src/gateway/agent-run-relay.js +114 -14
  103. package/dist/src/gateway/agents-admin.js +1 -1
  104. package/dist/src/gateway/chat-stream/mapper.d.ts +1 -0
  105. package/dist/src/gateway/chat-stream/mapper.js +40 -19
  106. package/dist/src/gateway/chat-stream/thinking-delta-coalescer.d.ts +7 -0
  107. package/dist/src/gateway/chat-stream/thinking-delta-coalescer.js +103 -0
  108. package/dist/src/gateway/hono/routes/home.js +15 -2
  109. package/dist/src/gateway/hono/routes/work-discovery.js +451 -0
  110. package/dist/src/gateway/hono/sse.d.ts +1 -1
  111. package/dist/src/gateway/hono/sse.js +1 -1
  112. package/dist/src/gateway/service/run-gateway-agent.js +5 -1
  113. package/dist/src/gateway/service.d.ts +2 -0
  114. package/dist/src/gateway/service.js +27 -2
  115. package/dist/src/media/session-references.js +9 -6
  116. package/dist/src/mobile/notification-service.js +1 -0
  117. package/dist/src/pets/factory.js +23 -26
  118. package/dist/src/pets/manifest.d.ts +2 -1
  119. package/dist/src/pets/manifest.js +15 -8
  120. package/dist/src/pets/validator.js +8 -3
  121. package/dist/src/proactive/calendar-signals.d.ts +4 -0
  122. package/dist/src/proactive/calendar-signals.js +120 -0
  123. package/dist/src/proactive/focus-service.d.ts +62 -0
  124. package/dist/src/proactive/focus-service.js +173 -0
  125. package/dist/src/proactive/index.d.ts +7 -0
  126. package/dist/src/proactive/index.js +7 -0
  127. package/dist/src/proactive/insight-repository.d.ts +19 -0
  128. package/dist/src/proactive/insight-repository.js +106 -0
  129. package/dist/src/proactive/run-processor.d.ts +19 -0
  130. package/dist/src/proactive/run-processor.js +125 -0
  131. package/dist/src/proactive/trial-expiry-reconciler.d.ts +5 -0
  132. package/dist/src/proactive/trial-expiry-reconciler.js +30 -0
  133. package/dist/src/proactive/types.d.ts +64 -0
  134. package/dist/src/proactive/types.js +1 -0
  135. package/dist/src/proactive/watch-repository.d.ts +28 -0
  136. package/dist/src/proactive/watch-repository.js +129 -0
  137. package/dist/src/session/client-history.d.ts +1 -0
  138. package/dist/src/session/client-history.js +56 -12
  139. package/dist/src/session/types.d.ts +1 -0
  140. package/dist/src/storage/sqlite/knowledge-repository.d.ts +1 -0
  141. package/dist/src/storage/sqlite/knowledge-repository.js +4 -0
  142. package/dist/src/storage/sqlite/migrations/047_work_discovery_sources.sql +16 -0
  143. package/dist/src/storage/sqlite/migrations/048_work_understanding_investigations.sql +40 -0
  144. package/dist/src/storage/sqlite/migrations/049_work_understanding_threads.sql +52 -0
  145. package/dist/src/storage/sqlite/migrations/050_work_discovery_source_refreshes.sql +15 -0
  146. package/dist/src/storage/sqlite/migrations/051_focus_watches.sql +26 -0
  147. package/dist/src/storage/sqlite/migrations/052_proactive_insights.sql +25 -0
  148. package/dist/src/storage/sqlite/migrations/runner.d.ts +1 -1
  149. package/dist/src/storage/sqlite/migrations/runner.js +3 -3
  150. package/dist/src/storage/sqlite/migrations/runner.ts +1 -1
  151. package/dist/src/storage/sqlite/schema.js +1 -1
  152. package/dist/src/work-discovery/analyzer.d.ts +12 -1
  153. package/dist/src/work-discovery/analyzer.js +126 -7
  154. package/dist/src/work-discovery/candidate-discovery.d.ts +17 -0
  155. package/dist/src/work-discovery/candidate-discovery.js +279 -0
  156. package/dist/src/work-discovery/evaluation.d.ts +11 -0
  157. package/dist/src/work-discovery/evaluation.js +17 -0
  158. package/dist/src/work-discovery/governance.d.ts +25 -0
  159. package/dist/src/work-discovery/governance.js +96 -0
  160. package/dist/src/work-discovery/incremental-repository.d.ts +13 -0
  161. package/dist/src/work-discovery/incremental-repository.js +55 -0
  162. package/dist/src/work-discovery/incremental.d.ts +2 -0
  163. package/dist/src/work-discovery/incremental.js +7 -0
  164. package/dist/src/work-discovery/index.d.ts +10 -0
  165. package/dist/src/work-discovery/index.js +13 -3
  166. package/dist/src/work-discovery/investigation-repository.d.ts +16 -0
  167. package/dist/src/work-discovery/investigation-repository.js +122 -0
  168. package/dist/src/work-discovery/investigator.d.ts +55 -0
  169. package/dist/src/work-discovery/investigator.js +358 -0
  170. package/dist/src/work-discovery/probe.d.ts +22 -0
  171. package/dist/src/work-discovery/probe.js +88 -1
  172. package/dist/src/work-discovery/service.d.ts +110 -1
  173. package/dist/src/work-discovery/service.js +578 -8
  174. package/dist/src/work-discovery/source-repository.d.ts +13 -0
  175. package/dist/src/work-discovery/source-repository.js +72 -0
  176. package/dist/src/work-discovery/thread-repository.d.ts +34 -0
  177. package/dist/src/work-discovery/thread-repository.js +112 -0
  178. package/dist/src/work-discovery/thread-service.d.ts +8 -0
  179. package/dist/src/work-discovery/thread-service.js +104 -0
  180. package/dist/src/work-discovery/types.d.ts +145 -0
  181. package/package.json +1 -1
  182. package/skills/creative/hatch-pet/SKILL.md +2 -2
  183. package/dist/gateway/static/root/assets/agents-bnkKH9EI.js +0 -2
  184. package/dist/gateway/static/root/assets/apps-page-l4ripRNG.js +0 -1
  185. package/dist/gateway/static/root/assets/automations-page-Kny7tLiF.js +0 -6
  186. package/dist/gateway/static/root/assets/browser-settings-page-vr1tXAab.js +0 -8
  187. package/dist/gateway/static/root/assets/channels-settings-Tlhbi5eh.js +0 -1
  188. package/dist/gateway/static/root/assets/channels-status-swr-vooEF4lG.js +0 -1
  189. package/dist/gateway/static/root/assets/connectors-page-_XfvjXoY.js +0 -2
  190. package/dist/gateway/static/root/assets/desktop-pet-DKUlAgm7.js +0 -1
  191. package/dist/gateway/static/root/assets/desktop-pet-settings-aWWzjdza.js +0 -1
  192. package/dist/gateway/static/root/assets/desktop-pet-sprite-DqZ6fbIj.js +0 -1
  193. package/dist/gateway/static/root/assets/gateway-settings-DzR-kM91.js +0 -1
  194. package/dist/gateway/static/root/assets/goal-create-dialog-BLjHRtqe.js +0 -1
  195. package/dist/gateway/static/root/assets/goal-detail-page-BRxeujXh.js +0 -4
  196. package/dist/gateway/static/root/assets/goals-page-BaZ3aw4u.js +0 -2
  197. package/dist/gateway/static/root/assets/index-EXa_i6BT.js +0 -193
  198. package/dist/gateway/static/root/assets/index-gpwk8Nro.css +0 -1
  199. package/dist/gateway/static/root/assets/local-app-workbench-page-lUpd6lSo.js +0 -2
  200. package/dist/gateway/static/root/assets/logs-page-FPDTmcWe.js +0 -7
  201. package/dist/gateway/static/root/assets/models-hub-panel-BXrdePhv.js +0 -2
  202. package/dist/gateway/static/root/assets/notes-workbench-D-EAhXv1.js +0 -4
  203. package/dist/gateway/static/root/assets/project-detail-page-BjpB1wrp.js +0 -1
  204. package/dist/gateway/static/root/assets/projects-page-BxyjqOfC.js +0 -1
  205. package/dist/gateway/static/root/assets/remote-access-hub-BFv6Upke.js +0 -1
  206. package/dist/gateway/static/root/assets/sessions-page-BX4DH8J7.js +0 -1
  207. package/dist/gateway/static/root/assets/settings-advanced-gate-CJ9MbRP8.js +0 -1
  208. package/dist/gateway/static/root/assets/setup-status-panel-BH4xQKM9.js +0 -1
  209. package/dist/gateway/static/root/assets/shares-settings-B6kKkvOb.js +0 -1
  210. package/dist/gateway/static/root/assets/skill-reload-api-DtjS-nUK.js +0 -1
  211. package/dist/gateway/static/root/assets/skills-page-CQEoPv0u.js +0 -2
  212. package/dist/gateway/static/root/assets/sliding-segmented-uWmrxE3P.js +0 -1
  213. package/dist/gateway/static/root/assets/user-context-page-Dn2T3itn.js +0 -1
  214. package/dist/gateway/static/root/assets/voice-api-key-field-wtWc3SfN.js +0 -1
  215. package/dist/gateway/static/root/assets/work-discovery-page-Ckxhj66e.js +0 -1
  216. package/dist/gateway/static/root/assets/work-item-detail-page-_1QgGPNw.js +0 -1
  217. package/dist/gateway/static/root/assets/work-page-BPdf2iuv.js +0 -1
  218. package/dist/gateway/static/root/assets/workflows-page-DdKTx0Hs.js +0 -11
@@ -10,9 +10,31 @@ export declare function previewWorkDiscoveryRoot(rootPath: string): Promise<{
10
10
  fingerprint: {
11
11
  changedFileCount: number;
12
12
  recentAreas: string[];
13
+ contentSignature: string;
13
14
  generatedAt: number;
14
15
  branch?: string;
15
16
  };
16
17
  }>;
17
18
  export declare function probeWorkDiscoveryRoot(rootPath: string, signal?: AbortSignal): Promise<WorkContextSnapshot>;
19
+ export declare function readWorkDiscoveryTextExcerpt(input: {
20
+ rootPath: string;
21
+ relativePath: string;
22
+ maxChars?: number;
23
+ signal?: AbortSignal;
24
+ }): Promise<{
25
+ relativePath: string;
26
+ excerpt: string;
27
+ modifiedAt: number;
28
+ truncated: boolean;
29
+ }>;
30
+ export declare function searchWorkDiscoveryText(input: {
31
+ rootPath: string;
32
+ relativePaths: string[];
33
+ query: string;
34
+ signal?: AbortSignal;
35
+ }): Promise<Array<{
36
+ relativePath: string;
37
+ excerpt: string;
38
+ modifiedAt: number;
39
+ }>>;
18
40
  export declare function summarizeWorkContextSnapshot(snapshot: WorkContextSnapshot): WorkContextSnapshotSummary;
@@ -3,6 +3,7 @@ import "../projects/index.js";
3
3
  import { basename, extname, isAbsolute, relative, resolve, sep } from "node:path";
4
4
  import { constants } from "node:fs";
5
5
  import { execFile } from "node:child_process";
6
+ import { createHash } from "node:crypto";
6
7
  import { access, lstat, readFile, readdir, realpath, stat } from "node:fs/promises";
7
8
  import { promisify } from "node:util";
8
9
  //#region src/work-discovery/probe.ts
@@ -169,6 +170,30 @@ async function gitInfo(root, signal) {
169
170
  return;
170
171
  }
171
172
  }
173
+ async function metadataFingerprint(root, signal) {
174
+ const entries = [];
175
+ const visit = async (directory, depth) => {
176
+ if (depth > 2 || entries.length >= 300) return;
177
+ abortIfNeeded(signal);
178
+ const children = await readdir(directory, { withFileTypes: true }).catch(() => []);
179
+ for (const child of children.sort((left, right) => left.name.localeCompare(right.name))) {
180
+ if (entries.length >= 300) break;
181
+ if (isSecretFile(child.name)) continue;
182
+ if (child.isDirectory() && isExcludedDirectory(child.name)) continue;
183
+ const absolutePath = resolve(directory, child.name);
184
+ const relativePath = relative(root, absolutePath).replaceAll("\\", "/");
185
+ if (child.isDirectory()) {
186
+ await visit(absolutePath, depth + 1);
187
+ continue;
188
+ }
189
+ const info = await lstat(absolutePath).catch(() => null);
190
+ if (!info?.isFile() || info.isSymbolicLink()) continue;
191
+ entries.push(`${relativePath}\0${info.size}\0${Math.floor(info.mtimeMs)}`);
192
+ }
193
+ };
194
+ await visit(root, 0);
195
+ return createHash("sha256").update(entries.join("\n")).digest("hex");
196
+ }
172
197
  async function canonicalWorkDiscoveryRoot(input) {
173
198
  const trimmed = input.trim();
174
199
  if (!trimmed || !isAbsolute(trimmed)) throw new Error("An absolute folder path is required");
@@ -181,6 +206,7 @@ async function previewWorkDiscoveryRoot(rootPath) {
181
206
  const canonicalRootPath = await canonicalWorkDiscoveryRoot(rootPath);
182
207
  const inference = inferProjectKind({ workspaceRoot: canonicalRootPath });
183
208
  const git = await gitInfo(canonicalRootPath);
209
+ const contentSignature = await metadataFingerprint(canonicalRootPath);
184
210
  const recentAreas = Array.from(new Set((git?.changedPaths ?? []).map((path) => {
185
211
  const [first, second] = path.replaceAll("\\", "/").split("/");
186
212
  return second ? `${first}/${second}` : first;
@@ -195,6 +221,7 @@ async function previewWorkDiscoveryRoot(rootPath) {
195
221
  ...git?.branch ? { branch: git.branch } : {},
196
222
  changedFileCount: git?.changedPaths.length ?? 0,
197
223
  recentAreas,
224
+ contentSignature,
198
225
  generatedAt: Date.now()
199
226
  }
200
227
  };
@@ -329,6 +356,66 @@ async function probeWorkDiscoveryRoot(rootPath, signal) {
329
356
  }
330
357
  };
331
358
  }
359
+ async function resolveWorkDiscoveryTextFile(rootPath, relativePath) {
360
+ const root = await canonicalWorkDiscoveryRoot(rootPath);
361
+ const normalized = relativePath.trim().replaceAll("\\", "/");
362
+ if (!normalized || isAbsolute(normalized) || normalized.split("/").includes("..")) throw new Error("A safe relative path is required");
363
+ if (normalized.split("/").some((segment) => isExcludedDirectory(segment)) || isSecretFile(basename(normalized))) throw new Error("The requested path is excluded by the scan policy");
364
+ if (isLikelyBinary(normalized) || METADATA_ONLY_EXTENSIONS.has(extname(normalized).toLowerCase())) throw new Error("The requested path is not a readable text file");
365
+ const resolvedPath = await realpath(resolve(root, normalized));
366
+ if (!isInsideRoot(root, resolvedPath)) throw new Error("The requested path is outside the approved folder");
367
+ const info = await lstat(resolvedPath);
368
+ if (!info.isFile() || info.size > MAX_FILE_BYTES * 4) throw new Error("The requested file is not eligible for investigation");
369
+ return {
370
+ root,
371
+ resolvedPath,
372
+ relativePath: relative(root, resolvedPath),
373
+ modifiedAt: info.mtimeMs
374
+ };
375
+ }
376
+ async function readWorkDiscoveryTextExcerpt(input) {
377
+ abortIfNeeded(input.signal);
378
+ const file = await resolveWorkDiscoveryTextFile(input.rootPath, input.relativePath);
379
+ const maxChars = Math.max(500, Math.min(2e4, input.maxChars ?? 8e3));
380
+ const buffer = await readFile(file.resolvedPath);
381
+ abortIfNeeded(input.signal);
382
+ if (buffer.includes(0)) throw new Error("The requested file appears to be binary");
383
+ const text = buffer.toString("utf8");
384
+ return {
385
+ relativePath: file.relativePath,
386
+ excerpt: text.slice(0, maxChars).trim(),
387
+ modifiedAt: file.modifiedAt,
388
+ truncated: text.length > maxChars
389
+ };
390
+ }
391
+ async function searchWorkDiscoveryText(input) {
392
+ const query = input.query.trim().slice(0, 120);
393
+ if (query.length < 2) throw new Error("Search query is too short");
394
+ const needle = query.toLocaleLowerCase();
395
+ const results = [];
396
+ for (const relativePath of input.relativePaths.slice(0, 120)) {
397
+ abortIfNeeded(input.signal);
398
+ try {
399
+ const file = await readWorkDiscoveryTextExcerpt({
400
+ rootPath: input.rootPath,
401
+ relativePath,
402
+ maxChars: 2e4,
403
+ signal: input.signal
404
+ });
405
+ const index = file.excerpt.toLocaleLowerCase().indexOf(needle);
406
+ if (index < 0) continue;
407
+ const start = Math.max(0, index - 300);
408
+ const end = Math.min(file.excerpt.length, index + query.length + 700);
409
+ results.push({
410
+ relativePath: file.relativePath,
411
+ excerpt: file.excerpt.slice(start, end).trim(),
412
+ modifiedAt: file.modifiedAt
413
+ });
414
+ if (results.length >= 8) break;
415
+ } catch {}
416
+ }
417
+ return results;
418
+ }
332
419
  function summarizeWorkContextSnapshot(snapshot) {
333
420
  return {
334
421
  projectKind: snapshot.root.projectKind,
@@ -341,4 +428,4 @@ function summarizeWorkContextSnapshot(snapshot) {
341
428
  };
342
429
  }
343
430
  //#endregion
344
- export { WORK_DISCOVERY_SCAN_POLICY_VERSION, canonicalWorkDiscoveryRoot, previewWorkDiscoveryRoot, probeWorkDiscoveryRoot, summarizeWorkContextSnapshot };
431
+ export { WORK_DISCOVERY_SCAN_POLICY_VERSION, canonicalWorkDiscoveryRoot, previewWorkDiscoveryRoot, probeWorkDiscoveryRoot, readWorkDiscoveryTextExcerpt, searchWorkDiscoveryText, summarizeWorkContextSnapshot };
@@ -1,7 +1,7 @@
1
1
  import type { Config } from '../config/schema.js';
2
2
  import type { ProjectService } from '../projects/project-service.js';
3
3
  import type { SessionIndex } from '../session/manager.js';
4
- import type { WorkDiscoveryOnboardingState, WorkDiscoveryRecognitionDecision, WorkDiscoveryRun, WorkDiscoverySource } from './types.js';
4
+ import type { WorkDiscoveryCandidate, WorkDiscoveryOnboardingState, WorkDiscoveryRecognitionDecision, WorkDiscoveryRun, WorkDiscoverySource } from './types.js';
5
5
  export interface WorkDiscoveryServiceOptions {
6
6
  projects: ProjectService;
7
7
  sessions: SessionIndex;
@@ -11,19 +11,128 @@ export interface WorkDiscoveryServiceOptions {
11
11
  export declare class WorkDiscoveryService {
12
12
  private readonly options;
13
13
  private readonly abortControllers;
14
+ private readonly candidateContexts;
14
15
  private readonly activity;
15
16
  constructor(options: WorkDiscoveryServiceOptions);
16
17
  isEnabled(): boolean;
17
18
  getOnboardingState(): WorkDiscoveryOnboardingState;
18
19
  dismissOnboarding(): WorkDiscoveryOnboardingState;
19
20
  getRun(id: string): WorkDiscoveryRun | null;
21
+ getInvestigation(runId: string): {
22
+ investigation: import("./types.js").WorkUnderstandingInvestigation;
23
+ evidence: import("./types.js").WorkUnderstandingEvidenceItem[];
24
+ };
25
+ listWorkThreads(options?: {
26
+ projectId?: string;
27
+ includeRejected?: boolean;
28
+ limit?: number;
29
+ }): import("./types.js").WorkUnderstandingThread[];
30
+ getWorkThread(id: string): import("./types.js").WorkUnderstandingThread;
31
+ getSourceLineage(sourceId: string): import("./governance.js").WorkUnderstandingSourceLineage;
32
+ deleteSourceDerivedData(sourceId: string): {
33
+ deletedMemoryRecords: number;
34
+ evidenceCount: number | bigint;
35
+ deletedThreads: number;
36
+ retainedThreads: number;
37
+ };
38
+ getUnderstandingMetrics(): {
39
+ completedInvestigations: number;
40
+ averageToolCalls: number;
41
+ activeThreads: number;
42
+ confirmedThreads: number;
43
+ recognitionConfirmationRate: number;
44
+ evidenceBySource: {
45
+ sourceType: string;
46
+ count: number;
47
+ }[];
48
+ };
49
+ updateWorkThread(input: {
50
+ id: string;
51
+ decision: 'confirmed' | 'corrected' | 'rejected' | 'paused' | 'completed';
52
+ correctedTitle?: string;
53
+ correctedSummary?: string;
54
+ }): import("./types.js").WorkUnderstandingThread;
55
+ discoverCandidates(signal?: AbortSignal): Promise<WorkDiscoveryCandidate[]>;
56
+ listDirectorySources(): import("./types.js").WorkDiscoveryDirectorySource[];
57
+ grantDirectorySource(rootPath: string): Promise<import("./types.js").WorkDiscoveryDirectorySource>;
58
+ checkDirectorySources(): Promise<any[]>;
59
+ refreshDirectorySourceIfChanged(input: {
60
+ id: string;
61
+ idempotencyKey: string;
62
+ }): Promise<{
63
+ changed: boolean;
64
+ refresh: import("./types.js").WorkDiscoverySourceRefresh;
65
+ reused?: undefined;
66
+ run?: undefined;
67
+ } | {
68
+ changed: boolean;
69
+ reused: boolean;
70
+ refresh: import("./types.js").WorkDiscoverySourceRefresh;
71
+ run: WorkDiscoveryRun;
72
+ } | {
73
+ changed: boolean;
74
+ run: WorkDiscoveryRun;
75
+ refresh: import("./types.js").WorkDiscoverySourceRefresh;
76
+ reused?: undefined;
77
+ }>;
78
+ revokeDirectorySource(id: string): import("./types.js").WorkDiscoveryDirectorySource;
79
+ importPersonalContext(rawItems: unknown[], signal?: AbortSignal, runId?: string): Promise<{
80
+ profileCandidates: {
81
+ status: "pending" | "accepted";
82
+ memoryRecordId: string;
83
+ id: string;
84
+ category: "role" | "focus" | "technology" | "workflow" | "preference";
85
+ statement: string;
86
+ confidence: "high" | "medium" | "low";
87
+ evidence: string[];
88
+ }[];
89
+ workThreads: import("./types.js").WorkUnderstandingThread[];
90
+ autoRemembered: {
91
+ status: "pending" | "accepted";
92
+ memoryRecordId: string;
93
+ id: string;
94
+ category: "role" | "focus" | "technology" | "workflow" | "preference";
95
+ statement: string;
96
+ confidence: "high" | "medium" | "low";
97
+ evidence: string[];
98
+ }[];
99
+ }>;
100
+ updatePersonalContextProfile(input: {
101
+ decisions: Array<{
102
+ memoryRecordId: string;
103
+ status: 'accepted' | 'edited' | 'rejected';
104
+ statement?: string;
105
+ }>;
106
+ }): {
107
+ memoryRecordId: string;
108
+ status: "rejected" | "accepted" | "edited";
109
+ statement: string;
110
+ }[];
111
+ rescanDirectorySource(input: {
112
+ id: string;
113
+ idempotencyKey: string;
114
+ }): Promise<WorkDiscoveryRun>;
115
+ startQuickRun(input: {
116
+ idempotencyKey: string;
117
+ }): Promise<WorkDiscoveryRun>;
20
118
  startRun(input: {
21
119
  rootPath: string;
22
120
  source: WorkDiscoverySource;
23
121
  idempotencyKey: string;
122
+ candidateContext?: WorkDiscoveryCandidate[];
24
123
  }): Promise<WorkDiscoveryRun>;
25
124
  private publish;
26
125
  private execute;
126
+ private persistProfileCandidates;
127
+ updateProfileCandidates(input: {
128
+ runId: string;
129
+ decisions: Array<{
130
+ id: string;
131
+ status: 'accepted' | 'edited' | 'rejected';
132
+ statement?: string;
133
+ }>;
134
+ }): WorkDiscoveryRun | null;
135
+ private preserveMemoryRecord;
27
136
  cancelRun(id: string): WorkDiscoveryRun | null;
28
137
  retryRun(id: string): WorkDiscoveryRun | null;
29
138
  submitRecognitionFeedback(input: {