@xopcai/xopc 0.0.159 → 0.0.161

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 (215) hide show
  1. package/dist/browser-ext/manifest.json +1 -1
  2. package/dist/extensions/telegram/xopc.extension.json +1 -1
  3. package/dist/gateway/static/root/assets/{action-boundary-settings-panel-CaRK2vIy.js → action-boundary-settings-panel-BIVBUiNT.js} +1 -1
  4. package/dist/gateway/static/root/assets/activity-store-o7GRljfD.js +1 -0
  5. package/dist/gateway/static/root/assets/{agent-avatar-dicebear-BeVf03hx.js → agent-avatar-dicebear-9R3szLMc.js} +1 -1
  6. package/dist/gateway/static/root/assets/agents-_qbUaYbs.js +2 -0
  7. package/dist/gateway/static/root/assets/{api-BjcBIV2O.js → api-jSTqFMq9.js} +1 -1
  8. package/dist/gateway/static/root/assets/{app-management-settings-panel-BG2ulMYw.js → app-management-settings-panel-D81cyE76.js} +1 -1
  9. package/dist/gateway/static/root/assets/{appearance-settings-0Kjenr2T.js → appearance-settings-Ct6bZQCV.js} +1 -1
  10. package/dist/gateway/static/root/assets/apps-page-0sPqD0FK.js +1 -0
  11. package/dist/gateway/static/root/assets/{archive-plugin-ChiNnH1e.js → archive-plugin-CfD7AZKn.js} +1 -1
  12. package/dist/gateway/static/root/assets/{attachment-load-pbBlQR-g.js → attachment-load-CP_Gaxt3.js} +1 -1
  13. package/dist/gateway/static/root/assets/{automation-suggestion-card-CTZDOyDy.js → automation-suggestion-card-BGKM_NDZ.js} +1 -1
  14. package/dist/gateway/static/root/assets/automations-page-BxWBuBsE.js +6 -0
  15. package/dist/gateway/static/root/assets/{binary-plugins-BeZGzpGF.js → binary-plugins-IPr2EVnS.js} +1 -1
  16. package/dist/gateway/static/root/assets/{block-editor-BnDmhN5Z.js → block-editor-B6aHEGA6.js} +3 -3
  17. package/dist/gateway/static/root/assets/browser-settings-page-C499b9AH.js +8 -0
  18. package/dist/gateway/static/root/assets/{capability-presets-api-Ii36j_7v.js → capability-presets-api-CCX9-LjU.js} +1 -1
  19. package/dist/gateway/static/root/assets/{capability-presets-settings-panel-Cl3dw4yh.js → capability-presets-settings-panel-Dva9SiPK.js} +2 -2
  20. package/dist/gateway/static/root/assets/{channel-recipient-api-CFqrSi5K.js → channel-recipient-api-MmLMLDWf.js} +1 -1
  21. package/dist/gateway/static/root/assets/channels-settings-DNAU7u9o.js +1 -0
  22. package/dist/gateway/static/root/assets/channels-status-swr-CIOH7tgn.js +1 -0
  23. package/dist/gateway/static/root/assets/check-DUBLcKHA.js +1 -0
  24. package/dist/gateway/static/root/assets/circle-alert-BEjgurr2.js +1 -0
  25. package/dist/gateway/static/root/assets/cn-JdwAhgNB.js +1 -0
  26. package/dist/gateway/static/root/assets/{connector-logo-CiLxuZ8S.js → connector-logo-BbjzIs87.js} +1 -1
  27. package/dist/gateway/static/root/assets/connectors-page-TwiBp8vY.js +2 -0
  28. package/dist/gateway/static/root/assets/createLucideIcon-DPHK1VkS.js +1 -0
  29. package/dist/gateway/static/root/assets/desktop-pet-CYH5ZSXy.js +1 -0
  30. package/dist/gateway/static/root/assets/desktop-pet-settings-DQLqGLc0.js +1 -0
  31. package/dist/gateway/static/root/assets/desktop-pet-sprite-DTqXSpqf.js +1 -0
  32. package/dist/gateway/static/root/assets/{directory-picker-path-field-CC2VL5Mc.js → directory-picker-path-field-ClsiXhmz.js} +1 -1
  33. package/dist/gateway/static/root/assets/{dreaming-settings-KY7ZfVsy.js → dreaming-settings-CjMPPdzg.js} +3 -3
  34. package/dist/gateway/static/root/assets/{extension-debug-page-C8KBeucs.js → extension-debug-page-57eizjhB.js} +1 -1
  35. package/dist/gateway/static/root/assets/{extension-page-CV-5Kcyk.js → extension-page-CsbSb3u1.js} +1 -1
  36. package/dist/gateway/static/root/assets/{extension-settings-page-DvUtDrAu.js → extension-settings-page-DKA9-lyP.js} +1 -1
  37. package/dist/gateway/static/root/assets/{gateway-config-api-DXfVeJLc.js → gateway-config-api-DIPJuzBZ.js} +1 -1
  38. package/dist/gateway/static/root/assets/gateway-settings-CDLqAQY7.js +1 -0
  39. package/dist/gateway/static/root/assets/{gateway-startup-retry-cxQ94qMm.js → gateway-startup-retry-DrfSJtvT.js} +1 -1
  40. package/dist/gateway/static/root/assets/goal-create-dialog-Q3B0E-0s.js +1 -0
  41. package/dist/gateway/static/root/assets/goal-detail-page-C5VAK04G.js +4 -0
  42. package/dist/gateway/static/root/assets/{goals-config-api-P8VhLqYF.js → goals-config-api-lGC10UkU.js} +1 -1
  43. package/dist/gateway/static/root/assets/goals-page-BJb-5IYw.js +2 -0
  44. package/dist/gateway/static/root/assets/{goals-settings-DHXyaH_O.js → goals-settings-BWq0pdrA.js} +1 -1
  45. package/dist/gateway/static/root/assets/{heartbeat-settings-CNckP_Dv.js → heartbeat-settings-D4o8BJVv.js} +1 -1
  46. package/dist/gateway/static/root/assets/index-CkUHH170.css +1 -0
  47. package/dist/gateway/static/root/assets/index-vq_cJZJC.js +199 -0
  48. package/dist/gateway/static/root/assets/{keyboard-shortcuts-settings-jXmv1RVX.js → keyboard-shortcuts-settings-6T2QYehS.js} +1 -1
  49. package/dist/gateway/static/root/assets/local-app-workbench-page-euH17Kvb.js +2 -0
  50. package/dist/gateway/static/root/assets/{local-apps-page-Cs5LKjtc.js → local-apps-page-DCjg2K9f.js} +1 -1
  51. package/dist/gateway/static/root/assets/{locale-store-C_M71MK9.js → locale-store-Dar-xqQr.js} +1 -1
  52. package/dist/gateway/static/root/assets/logs-page-CyYCBqym.js +7 -0
  53. package/dist/gateway/static/root/assets/{markdown-split-BFqeSNte.js → markdown-split-rt1XO43g.js} +1 -1
  54. package/dist/gateway/static/root/assets/{media-plugins-Cc8379gq.js → media-plugins-Bwo8CJuh.js} +1 -1
  55. package/dist/gateway/static/root/assets/messages-CxySDn9d.js +5 -0
  56. package/dist/gateway/static/root/assets/models-hub-panel-DObxxjc9.js +2 -0
  57. package/dist/gateway/static/root/assets/{notes-page-DlGU4ipo.js → notes-page-Dp-pkX7d.js} +1 -1
  58. package/dist/gateway/static/root/assets/notes-workbench-CCb4RXcZ.js +4 -0
  59. package/dist/gateway/static/root/assets/{page-tabs-kFOswGlG.js → page-tabs-CzZ4iKOb.js} +1 -1
  60. package/dist/gateway/static/root/assets/{preview-open-alternatives-CvjuvABg.js → preview-open-alternatives-3E_Qa-58.js} +1 -1
  61. package/dist/gateway/static/root/assets/product-delivery-BTRT9kCS.js +1 -0
  62. package/dist/gateway/static/root/assets/product-open-page-B2T48Sbt.js +1 -0
  63. package/dist/gateway/static/root/assets/project-detail-page-BvEcriRC.js +1 -0
  64. package/dist/gateway/static/root/assets/projects-page-B_e79MRJ.js +1 -0
  65. package/dist/gateway/static/root/assets/remote-access-hub-DGcqnYfR.js +1 -0
  66. package/dist/gateway/static/root/assets/{save-bar-controls-DwrD7ODx.js → save-bar-controls-CkeKasGm.js} +1 -1
  67. package/dist/gateway/static/root/assets/{schedule-field-Ba4WzTmE.js → schedule-field-TkqUL3wm.js} +1 -1
  68. package/dist/gateway/static/root/assets/{schema-form-DvydL8eF.js → schema-form-DC-iU5IG.js} +1 -1
  69. package/dist/gateway/static/root/assets/sessions-page-DQZhrDJ8.js +1 -0
  70. package/dist/gateway/static/root/assets/settings-advanced-gate-BkdeN99Y.js +1 -0
  71. package/dist/gateway/static/root/assets/{settings-collapsible-section-LaQqGGej.js → settings-collapsible-section-Dpqth3oA.js} +1 -1
  72. package/dist/gateway/static/root/assets/{settings-form-section-DruI__qO.js → settings-form-section-CNqF6IwY.js} +1 -1
  73. package/dist/gateway/static/root/assets/{settings-loading-skeleton-UvA-eDhF.js → settings-loading-skeleton-DkvwitK_.js} +1 -1
  74. package/dist/gateway/static/root/assets/{settings-page-layout-DG-XMIPu.js → settings-page-layout-DWvNgISx.js} +1 -1
  75. package/dist/gateway/static/root/assets/{settings-page-5oCGSebm.js → settings-page-qPG7I2zd.js} +1 -1
  76. package/dist/gateway/static/root/assets/setup-status-panel-lwRAh9aw.js +1 -0
  77. package/dist/gateway/static/root/assets/{share-preview-page-FLVeTrRt.js → share-preview-page-DGpSPW-n.js} +1 -1
  78. package/dist/gateway/static/root/assets/shares-settings-BGj9IVUr.js +1 -0
  79. package/dist/gateway/static/root/assets/skill-reload-api-B2UBAs5U.js +1 -0
  80. package/dist/gateway/static/root/assets/skills-page-DdjzFZ8I.js +2 -0
  81. package/dist/gateway/static/root/assets/{system-settings-panel-CeK93xVi.js → system-settings-panel-8TxxSbUw.js} +1 -1
  82. package/dist/gateway/static/root/assets/{theme-store-C8ohIHhw.js → theme-store-B5FzMWOx.js} +1 -1
  83. package/dist/gateway/static/root/assets/{typed-models-lib-D1Lr2gG0.js → typed-models-lib-DEGtSA5h.js} +1 -1
  84. package/dist/gateway/static/root/assets/{use-channel-catalog-BWzou5ar.js → use-channel-catalog-BDU6FneG.js} +1 -1
  85. package/dist/gateway/static/root/assets/user-context-page-BTTZpAGV.js +1 -0
  86. package/dist/gateway/static/root/assets/voice-api-key-field-DuDQd-WU.js +1 -0
  87. package/dist/gateway/static/root/assets/work-discovery-page-BUVkVCsW.js +1 -0
  88. package/dist/gateway/static/root/assets/work-item-detail-page-DeEPPu4n.js +1 -0
  89. package/dist/gateway/static/root/assets/work-page-DQNUyTUq.js +1 -0
  90. package/dist/gateway/static/root/assets/{workflow-run-setup-panel-Bynqe4kV.js → workflow-run-setup-panel-Cwi8Pz7n.js} +2 -2
  91. package/dist/gateway/static/root/assets/workflows-page-BIy4wrzO.js +11 -0
  92. package/dist/gateway/static/root/index.html +12 -10
  93. package/dist/package.js +1 -1
  94. package/dist/src/automations/service/action-executor.js +1 -1
  95. package/dist/src/cli/commands/doctor/checks/database-schema.js +1 -1
  96. package/dist/src/config/agent-profile.js +1 -1
  97. package/dist/src/gateway/agents-admin.js +1 -1
  98. package/dist/src/gateway/chat-stream/mapper.d.ts +1 -0
  99. package/dist/src/gateway/chat-stream/mapper.js +43 -7
  100. package/dist/src/gateway/hono/routes/home.js +15 -2
  101. package/dist/src/gateway/hono/routes/work-discovery.js +451 -0
  102. package/dist/src/gateway/hono/sse.d.ts +2 -0
  103. package/dist/src/gateway/hono/sse.js +10 -3
  104. package/dist/src/gateway/run-loop.js +17 -7
  105. package/dist/src/gateway/server.d.ts +1 -0
  106. package/dist/src/gateway/server.js +9 -0
  107. package/dist/src/gateway/service.d.ts +2 -0
  108. package/dist/src/gateway/service.js +27 -2
  109. package/dist/src/local-apps/preview-runtime-bridge.d.ts +1 -1
  110. package/dist/src/local-apps/preview-runtime-bridge.js +14 -11
  111. package/dist/src/mobile/notification-service.js +1 -0
  112. package/dist/src/pets/factory.js +23 -26
  113. package/dist/src/pets/manifest.d.ts +2 -1
  114. package/dist/src/pets/manifest.js +15 -8
  115. package/dist/src/pets/validator.js +8 -3
  116. package/dist/src/proactive/calendar-signals.d.ts +4 -0
  117. package/dist/src/proactive/calendar-signals.js +120 -0
  118. package/dist/src/proactive/focus-service.d.ts +62 -0
  119. package/dist/src/proactive/focus-service.js +173 -0
  120. package/dist/src/proactive/index.d.ts +7 -0
  121. package/dist/src/proactive/index.js +7 -0
  122. package/dist/src/proactive/insight-repository.d.ts +19 -0
  123. package/dist/src/proactive/insight-repository.js +106 -0
  124. package/dist/src/proactive/run-processor.d.ts +19 -0
  125. package/dist/src/proactive/run-processor.js +125 -0
  126. package/dist/src/proactive/trial-expiry-reconciler.d.ts +5 -0
  127. package/dist/src/proactive/trial-expiry-reconciler.js +30 -0
  128. package/dist/src/proactive/types.d.ts +64 -0
  129. package/dist/src/proactive/types.js +1 -0
  130. package/dist/src/proactive/watch-repository.d.ts +28 -0
  131. package/dist/src/proactive/watch-repository.js +129 -0
  132. package/dist/src/storage/sqlite/knowledge-repository.d.ts +1 -0
  133. package/dist/src/storage/sqlite/knowledge-repository.js +4 -0
  134. package/dist/src/storage/sqlite/migrations/047_work_discovery_sources.sql +16 -0
  135. package/dist/src/storage/sqlite/migrations/048_work_understanding_investigations.sql +40 -0
  136. package/dist/src/storage/sqlite/migrations/049_work_understanding_threads.sql +52 -0
  137. package/dist/src/storage/sqlite/migrations/050_work_discovery_source_refreshes.sql +15 -0
  138. package/dist/src/storage/sqlite/migrations/051_focus_watches.sql +26 -0
  139. package/dist/src/storage/sqlite/migrations/052_proactive_insights.sql +25 -0
  140. package/dist/src/storage/sqlite/migrations/runner.d.ts +1 -1
  141. package/dist/src/storage/sqlite/migrations/runner.js +3 -3
  142. package/dist/src/storage/sqlite/migrations/runner.ts +1 -1
  143. package/dist/src/storage/sqlite/schema.js +1 -1
  144. package/dist/src/work-discovery/analyzer.d.ts +12 -1
  145. package/dist/src/work-discovery/analyzer.js +126 -7
  146. package/dist/src/work-discovery/candidate-discovery.d.ts +17 -0
  147. package/dist/src/work-discovery/candidate-discovery.js +279 -0
  148. package/dist/src/work-discovery/evaluation.d.ts +11 -0
  149. package/dist/src/work-discovery/evaluation.js +17 -0
  150. package/dist/src/work-discovery/governance.d.ts +25 -0
  151. package/dist/src/work-discovery/governance.js +96 -0
  152. package/dist/src/work-discovery/incremental-repository.d.ts +13 -0
  153. package/dist/src/work-discovery/incremental-repository.js +55 -0
  154. package/dist/src/work-discovery/incremental.d.ts +2 -0
  155. package/dist/src/work-discovery/incremental.js +7 -0
  156. package/dist/src/work-discovery/index.d.ts +10 -0
  157. package/dist/src/work-discovery/index.js +13 -3
  158. package/dist/src/work-discovery/investigation-repository.d.ts +16 -0
  159. package/dist/src/work-discovery/investigation-repository.js +122 -0
  160. package/dist/src/work-discovery/investigator.d.ts +55 -0
  161. package/dist/src/work-discovery/investigator.js +358 -0
  162. package/dist/src/work-discovery/probe.d.ts +22 -0
  163. package/dist/src/work-discovery/probe.js +88 -1
  164. package/dist/src/work-discovery/service.d.ts +110 -1
  165. package/dist/src/work-discovery/service.js +578 -8
  166. package/dist/src/work-discovery/source-repository.d.ts +13 -0
  167. package/dist/src/work-discovery/source-repository.js +72 -0
  168. package/dist/src/work-discovery/thread-repository.d.ts +34 -0
  169. package/dist/src/work-discovery/thread-repository.js +112 -0
  170. package/dist/src/work-discovery/thread-service.d.ts +8 -0
  171. package/dist/src/work-discovery/thread-service.js +104 -0
  172. package/dist/src/work-discovery/types.d.ts +145 -0
  173. package/package.json +1 -1
  174. package/skills/creative/hatch-pet/SKILL.md +2 -2
  175. package/dist/gateway/static/root/assets/activity-store-C-57rvkX.js +0 -1
  176. package/dist/gateway/static/root/assets/agents-P05C4A-3.js +0 -2
  177. package/dist/gateway/static/root/assets/apps-page-DANGrBpN.js +0 -1
  178. package/dist/gateway/static/root/assets/automations-page-BXfGL_cm.js +0 -6
  179. package/dist/gateway/static/root/assets/browser-settings-page-534luV0B.js +0 -8
  180. package/dist/gateway/static/root/assets/channels-settings-M91zFJVi.js +0 -1
  181. package/dist/gateway/static/root/assets/channels-status-swr-vooEF4lG.js +0 -1
  182. package/dist/gateway/static/root/assets/check-BODqo66o.js +0 -1
  183. package/dist/gateway/static/root/assets/circle-alert-RzVebuX2.js +0 -1
  184. package/dist/gateway/static/root/assets/cn-BQ_8x0bT.js +0 -1
  185. package/dist/gateway/static/root/assets/connectors-page-CV5UulW6.js +0 -2
  186. package/dist/gateway/static/root/assets/desktop-pet-Cil2eSpW.js +0 -1
  187. package/dist/gateway/static/root/assets/desktop-pet-settings-DwsC6l5F.js +0 -1
  188. package/dist/gateway/static/root/assets/desktop-pet-sprite-DqZ6fbIj.js +0 -1
  189. package/dist/gateway/static/root/assets/gateway-settings-BpJ0v56l.js +0 -1
  190. package/dist/gateway/static/root/assets/goal-create-dialog-lMHD-2CX.js +0 -1
  191. package/dist/gateway/static/root/assets/goal-detail-page-yPmF-G7b.js +0 -4
  192. package/dist/gateway/static/root/assets/goals-page-BHTCKobG.js +0 -2
  193. package/dist/gateway/static/root/assets/index-BgZhEOkN.css +0 -1
  194. package/dist/gateway/static/root/assets/index-BuqGh2SW.js +0 -193
  195. package/dist/gateway/static/root/assets/local-app-workbench-page-zpp_wciE.js +0 -2
  196. package/dist/gateway/static/root/assets/logs-page-B4CRYqYR.js +0 -7
  197. package/dist/gateway/static/root/assets/messages-BuT0SR1R.js +0 -5
  198. package/dist/gateway/static/root/assets/models-hub-panel-1hdoAoB_.js +0 -2
  199. package/dist/gateway/static/root/assets/notes-workbench-DQEAZTA5.js +0 -4
  200. package/dist/gateway/static/root/assets/project-detail-page-Bp9bC7A6.js +0 -1
  201. package/dist/gateway/static/root/assets/projects-page-RNorFXTw.js +0 -1
  202. package/dist/gateway/static/root/assets/remote-access-hub-BqRTcM_6.js +0 -1
  203. package/dist/gateway/static/root/assets/sessions-page-B2EfW1cm.js +0 -1
  204. package/dist/gateway/static/root/assets/settings-advanced-gate-CklL85T4.js +0 -1
  205. package/dist/gateway/static/root/assets/setup-status-panel-D3my1HgB.js +0 -1
  206. package/dist/gateway/static/root/assets/shares-settings-DVxgjrsP.js +0 -1
  207. package/dist/gateway/static/root/assets/skill-reload-api-Bcu58ZaF.js +0 -1
  208. package/dist/gateway/static/root/assets/skills-page-CDd-84FE.js +0 -2
  209. package/dist/gateway/static/root/assets/sliding-segmented-uWmrxE3P.js +0 -1
  210. package/dist/gateway/static/root/assets/user-context-page-1OyJnTyR.js +0 -1
  211. package/dist/gateway/static/root/assets/voice-api-key-field-B2ncRwHS.js +0 -1
  212. package/dist/gateway/static/root/assets/work-discovery-page-BZlY4PZL.js +0 -1
  213. package/dist/gateway/static/root/assets/work-item-detail-page-DPXMrneY.js +0 -1
  214. package/dist/gateway/static/root/assets/work-page-CTERoqyv.js +0 -1
  215. package/dist/gateway/static/root/assets/workflows-page-CLgsnqFQ.js +0 -11
@@ -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: {