@oratis/lisa 0.8.0 → 0.11.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 (320) hide show
  1. package/README.md +123 -16
  2. package/README.zh-CN.md +101 -15
  3. package/completions/_lisa +56 -0
  4. package/completions/lisa.bash +35 -1
  5. package/completions/lisa.fish +18 -1
  6. package/dist/advisor/engine.d.ts +7 -0
  7. package/dist/advisor/engine.d.ts.map +1 -1
  8. package/dist/advisor/engine.js +12 -0
  9. package/dist/advisor/engine.js.map +1 -1
  10. package/dist/agent.d.ts +14 -0
  11. package/dist/agent.d.ts.map +1 -1
  12. package/dist/agent.js +58 -7
  13. package/dist/agent.js.map +1 -1
  14. package/dist/agents/managed.d.ts +108 -0
  15. package/dist/agents/managed.d.ts.map +1 -0
  16. package/dist/agents/managed.js +241 -0
  17. package/dist/agents/managed.js.map +1 -0
  18. package/dist/agents/pty.d.ts +155 -0
  19. package/dist/agents/pty.d.ts.map +1 -0
  20. package/dist/agents/pty.js +299 -0
  21. package/dist/agents/pty.js.map +1 -0
  22. package/dist/approval.d.ts +13 -0
  23. package/dist/approval.d.ts.map +1 -1
  24. package/dist/approval.js +25 -2
  25. package/dist/approval.js.map +1 -1
  26. package/dist/autonomy/runs.d.ts +33 -0
  27. package/dist/autonomy/runs.d.ts.map +1 -0
  28. package/dist/autonomy/runs.js +106 -0
  29. package/dist/autonomy/runs.js.map +1 -0
  30. package/dist/channels/feishu.d.ts.map +1 -1
  31. package/dist/channels/feishu.js +65 -0
  32. package/dist/channels/feishu.js.map +1 -1
  33. package/dist/channels/router.d.ts +7 -0
  34. package/dist/channels/router.d.ts.map +1 -1
  35. package/dist/channels/router.js +1 -1
  36. package/dist/channels/router.js.map +1 -1
  37. package/dist/cli/agents-pty.d.ts +18 -0
  38. package/dist/cli/agents-pty.d.ts.map +1 -0
  39. package/dist/cli/agents-pty.js +182 -0
  40. package/dist/cli/agents-pty.js.map +1 -0
  41. package/dist/cli/agents.d.ts +2 -0
  42. package/dist/cli/agents.d.ts.map +1 -0
  43. package/dist/cli/agents.js +65 -0
  44. package/dist/cli/agents.js.map +1 -0
  45. package/dist/cli/consent.d.ts +2 -0
  46. package/dist/cli/consent.d.ts.map +1 -0
  47. package/dist/cli/consent.js +57 -0
  48. package/dist/cli/consent.js.map +1 -0
  49. package/dist/cli/model.d.ts +2 -0
  50. package/dist/cli/model.d.ts.map +1 -0
  51. package/dist/cli/model.js +121 -0
  52. package/dist/cli/model.js.map +1 -0
  53. package/dist/cli/sense.d.ts +2 -0
  54. package/dist/cli/sense.d.ts.map +1 -0
  55. package/dist/cli/sense.js +36 -0
  56. package/dist/cli/sense.js.map +1 -0
  57. package/dist/cli.js +117 -12
  58. package/dist/cli.js.map +1 -1
  59. package/dist/consent/blacklist.d.ts +28 -0
  60. package/dist/consent/blacklist.d.ts.map +1 -0
  61. package/dist/consent/blacklist.js +78 -0
  62. package/dist/consent/blacklist.js.map +1 -0
  63. package/dist/consent/store.d.ts +45 -0
  64. package/dist/consent/store.d.ts.map +1 -0
  65. package/dist/consent/store.js +126 -0
  66. package/dist/consent/store.js.map +1 -0
  67. package/dist/control/policy.d.ts +13 -0
  68. package/dist/control/policy.d.ts.map +1 -0
  69. package/dist/control/policy.js +57 -0
  70. package/dist/control/policy.js.map +1 -0
  71. package/dist/heartbeat/runner.d.ts.map +1 -1
  72. package/dist/heartbeat/runner.js +70 -14
  73. package/dist/heartbeat/runner.js.map +1 -1
  74. package/dist/idle/runner.d.ts.map +1 -1
  75. package/dist/idle/runner.js +87 -17
  76. package/dist/idle/runner.js.map +1 -1
  77. package/dist/integrations/aider/observer.d.ts +21 -1
  78. package/dist/integrations/aider/observer.d.ts.map +1 -1
  79. package/dist/integrations/aider/observer.js +110 -1
  80. package/dist/integrations/aider/observer.js.map +1 -1
  81. package/dist/integrations/claude-code/liveness.d.ts +10 -0
  82. package/dist/integrations/claude-code/liveness.d.ts.map +1 -0
  83. package/dist/integrations/claude-code/liveness.js +62 -0
  84. package/dist/integrations/claude-code/liveness.js.map +1 -0
  85. package/dist/integrations/claude-code/watcher.d.ts +39 -4
  86. package/dist/integrations/claude-code/watcher.d.ts.map +1 -1
  87. package/dist/integrations/claude-code/watcher.js +94 -57
  88. package/dist/integrations/claude-code/watcher.js.map +1 -1
  89. package/dist/integrations/codex/observer.d.ts +19 -6
  90. package/dist/integrations/codex/observer.d.ts.map +1 -1
  91. package/dist/integrations/codex/observer.js +228 -4
  92. package/dist/integrations/codex/observer.js.map +1 -1
  93. package/dist/integrations/dispatch-ledger.d.ts +30 -1
  94. package/dist/integrations/dispatch-ledger.d.ts.map +1 -1
  95. package/dist/integrations/dispatch-ledger.js +75 -9
  96. package/dist/integrations/dispatch-ledger.js.map +1 -1
  97. package/dist/integrations/git/branch.d.ts +11 -0
  98. package/dist/integrations/git/branch.d.ts.map +1 -0
  99. package/dist/integrations/git/branch.js +49 -0
  100. package/dist/integrations/git/branch.js.map +1 -0
  101. package/dist/integrations/git/observer.d.ts +39 -0
  102. package/dist/integrations/git/observer.d.ts.map +1 -0
  103. package/dist/integrations/git/observer.js +252 -0
  104. package/dist/integrations/git/observer.js.map +1 -0
  105. package/dist/integrations/github-pr/observer.d.ts.map +1 -1
  106. package/dist/integrations/github-pr/observer.js +7 -2
  107. package/dist/integrations/github-pr/observer.js.map +1 -1
  108. package/dist/integrations/hub.d.ts +8 -0
  109. package/dist/integrations/hub.d.ts.map +1 -1
  110. package/dist/integrations/hub.js +39 -1
  111. package/dist/integrations/hub.js.map +1 -1
  112. package/dist/integrations/managed/observer.d.ts +17 -0
  113. package/dist/integrations/managed/observer.d.ts.map +1 -0
  114. package/dist/integrations/managed/observer.js +46 -0
  115. package/dist/integrations/managed/observer.js.map +1 -0
  116. package/dist/integrations/opencode/observer.d.ts +53 -5
  117. package/dist/integrations/opencode/observer.d.ts.map +1 -1
  118. package/dist/integrations/opencode/observer.js +242 -20
  119. package/dist/integrations/opencode/observer.js.map +1 -1
  120. package/dist/integrations/pty/observer.d.ts +25 -0
  121. package/dist/integrations/pty/observer.d.ts.map +1 -0
  122. package/dist/integrations/pty/observer.js +48 -0
  123. package/dist/integrations/pty/observer.js.map +1 -0
  124. package/dist/integrations/registry.d.ts.map +1 -1
  125. package/dist/integrations/registry.js +5 -0
  126. package/dist/integrations/registry.js.map +1 -1
  127. package/dist/integrations/shell/observer.d.ts +33 -0
  128. package/dist/integrations/shell/observer.d.ts.map +1 -0
  129. package/dist/integrations/shell/observer.js +223 -0
  130. package/dist/integrations/shell/observer.js.map +1 -0
  131. package/dist/integrations/takoapi/a2a.d.ts +38 -0
  132. package/dist/integrations/takoapi/a2a.d.ts.map +1 -0
  133. package/dist/integrations/takoapi/a2a.js +70 -0
  134. package/dist/integrations/takoapi/a2a.js.map +1 -0
  135. package/dist/integrations/takoapi/ledger.d.ts +32 -0
  136. package/dist/integrations/takoapi/ledger.d.ts.map +1 -0
  137. package/dist/integrations/takoapi/ledger.js +96 -0
  138. package/dist/integrations/takoapi/ledger.js.map +1 -0
  139. package/dist/integrations/takoapi/observer.d.ts +39 -0
  140. package/dist/integrations/takoapi/observer.d.ts.map +1 -0
  141. package/dist/integrations/takoapi/observer.js +102 -0
  142. package/dist/integrations/takoapi/observer.js.map +1 -0
  143. package/dist/integrations/types.d.ts +17 -0
  144. package/dist/integrations/types.d.ts.map +1 -1
  145. package/dist/mcp/client.d.ts +5 -0
  146. package/dist/mcp/client.d.ts.map +1 -1
  147. package/dist/mcp/client.js +1 -1
  148. package/dist/mcp/client.js.map +1 -1
  149. package/dist/mcp/config.d.ts +4 -0
  150. package/dist/mcp/config.d.ts.map +1 -1
  151. package/dist/mcp/config.js +34 -0
  152. package/dist/mcp/config.js.map +1 -1
  153. package/dist/memory/embedding.d.ts +45 -0
  154. package/dist/memory/embedding.d.ts.map +1 -0
  155. package/dist/memory/embedding.js +139 -0
  156. package/dist/memory/embedding.js.map +1 -0
  157. package/dist/memory/search_tool.d.ts.map +1 -1
  158. package/dist/memory/search_tool.js +6 -2
  159. package/dist/memory/search_tool.js.map +1 -1
  160. package/dist/memory/vector.d.ts +14 -3
  161. package/dist/memory/vector.d.ts.map +1 -1
  162. package/dist/memory/vector.js +50 -0
  163. package/dist/memory/vector.js.map +1 -1
  164. package/dist/model/local.d.ts +43 -0
  165. package/dist/model/local.d.ts.map +1 -0
  166. package/dist/model/local.js +118 -0
  167. package/dist/model/local.js.map +1 -0
  168. package/dist/model/plan-usage.d.ts +41 -0
  169. package/dist/model/plan-usage.d.ts.map +1 -0
  170. package/dist/model/plan-usage.js +168 -0
  171. package/dist/model/plan-usage.js.map +1 -0
  172. package/dist/model/plans.d.ts +73 -0
  173. package/dist/model/plans.d.ts.map +1 -0
  174. package/dist/model/plans.js +246 -0
  175. package/dist/model/plans.js.map +1 -0
  176. package/dist/orchestrator/recent-recap.d.ts +2 -0
  177. package/dist/orchestrator/recent-recap.d.ts.map +1 -0
  178. package/dist/orchestrator/recent-recap.js +20 -0
  179. package/dist/orchestrator/recent-recap.js.map +1 -0
  180. package/dist/providers/anthropic.d.ts +1 -0
  181. package/dist/providers/anthropic.d.ts.map +1 -1
  182. package/dist/providers/anthropic.js +10 -2
  183. package/dist/providers/anthropic.js.map +1 -1
  184. package/dist/providers/fallback.d.ts +23 -0
  185. package/dist/providers/fallback.d.ts.map +1 -0
  186. package/dist/providers/fallback.js +29 -0
  187. package/dist/providers/fallback.js.map +1 -0
  188. package/dist/providers/gemini.d.ts +2 -0
  189. package/dist/providers/gemini.d.ts.map +1 -1
  190. package/dist/providers/gemini.js +24 -10
  191. package/dist/providers/gemini.js.map +1 -1
  192. package/dist/providers/openai.d.ts.map +1 -1
  193. package/dist/providers/openai.js +4 -1
  194. package/dist/providers/openai.js.map +1 -1
  195. package/dist/providers/registry.d.ts +18 -2
  196. package/dist/providers/registry.d.ts.map +1 -1
  197. package/dist/providers/registry.js +56 -9
  198. package/dist/providers/registry.js.map +1 -1
  199. package/dist/reflect.d.ts +55 -0
  200. package/dist/reflect.d.ts.map +1 -1
  201. package/dist/reflect.js +148 -54
  202. package/dist/reflect.js.map +1 -1
  203. package/dist/sense/log.d.ts +9 -0
  204. package/dist/sense/log.d.ts.map +1 -0
  205. package/dist/sense/log.js +63 -0
  206. package/dist/sense/log.js.map +1 -0
  207. package/dist/sense/screen.d.ts +43 -0
  208. package/dist/sense/screen.d.ts.map +1 -0
  209. package/dist/sense/screen.js +107 -0
  210. package/dist/sense/screen.js.map +1 -0
  211. package/dist/sense/service.d.ts +16 -0
  212. package/dist/sense/service.d.ts.map +1 -0
  213. package/dist/sense/service.js +33 -0
  214. package/dist/sense/service.js.map +1 -0
  215. package/dist/sense/types.d.ts +35 -0
  216. package/dist/sense/types.d.ts.map +1 -0
  217. package/dist/sense/types.js +11 -0
  218. package/dist/sense/types.js.map +1 -0
  219. package/dist/sense/voice.d.ts +28 -0
  220. package/dist/sense/voice.d.ts.map +1 -0
  221. package/dist/sense/voice.js +64 -0
  222. package/dist/sense/voice.js.map +1 -0
  223. package/dist/soul/git.d.ts.map +1 -1
  224. package/dist/soul/git.js +35 -16
  225. package/dist/soul/git.js.map +1 -1
  226. package/dist/soul/store.d.ts +22 -0
  227. package/dist/soul/store.d.ts.map +1 -1
  228. package/dist/soul/store.js +69 -14
  229. package/dist/soul/store.js.map +1 -1
  230. package/dist/soul/summary.d.ts +10 -0
  231. package/dist/soul/summary.d.ts.map +1 -0
  232. package/dist/soul/summary.js +57 -0
  233. package/dist/soul/summary.js.map +1 -0
  234. package/dist/soul/tools.d.ts.map +1 -1
  235. package/dist/soul/tools.js +13 -24
  236. package/dist/soul/tools.js.map +1 -1
  237. package/dist/soul/types.d.ts +9 -0
  238. package/dist/soul/types.d.ts.map +1 -1
  239. package/dist/soul/types.js.map +1 -1
  240. package/dist/subagent.d.ts +7 -0
  241. package/dist/subagent.d.ts.map +1 -1
  242. package/dist/subagent.js +3 -1
  243. package/dist/subagent.js.map +1 -1
  244. package/dist/tools/dispatch_agent.d.ts +13 -1
  245. package/dist/tools/dispatch_agent.d.ts.map +1 -1
  246. package/dist/tools/dispatch_agent.js +56 -12
  247. package/dist/tools/dispatch_agent.js.map +1 -1
  248. package/dist/tools/dispatch_status.d.ts +22 -0
  249. package/dist/tools/dispatch_status.d.ts.map +1 -0
  250. package/dist/tools/dispatch_status.js +57 -0
  251. package/dist/tools/dispatch_status.js.map +1 -0
  252. package/dist/tools/github.d.ts +34 -0
  253. package/dist/tools/github.d.ts.map +1 -0
  254. package/dist/tools/github.js +140 -0
  255. package/dist/tools/github.js.map +1 -0
  256. package/dist/tools/github_link.d.ts +36 -0
  257. package/dist/tools/github_link.d.ts.map +1 -0
  258. package/dist/tools/github_link.js +127 -0
  259. package/dist/tools/github_link.js.map +1 -0
  260. package/dist/tools/mcp.d.ts +28 -0
  261. package/dist/tools/mcp.d.ts.map +1 -0
  262. package/dist/tools/mcp.js +55 -0
  263. package/dist/tools/mcp.js.map +1 -0
  264. package/dist/tools/npm_info.d.ts +21 -0
  265. package/dist/tools/npm_info.d.ts.map +1 -0
  266. package/dist/tools/npm_info.js +102 -0
  267. package/dist/tools/npm_info.js.map +1 -0
  268. package/dist/tools/registry.d.ts +29 -0
  269. package/dist/tools/registry.d.ts.map +1 -1
  270. package/dist/tools/registry.js +75 -0
  271. package/dist/tools/registry.js.map +1 -1
  272. package/dist/tools/run_on_plan.d.ts +46 -0
  273. package/dist/tools/run_on_plan.d.ts.map +1 -0
  274. package/dist/tools/run_on_plan.js +89 -0
  275. package/dist/tools/run_on_plan.js.map +1 -0
  276. package/dist/tools/takoapi.d.ts +60 -0
  277. package/dist/tools/takoapi.d.ts.map +1 -0
  278. package/dist/tools/takoapi.js +181 -0
  279. package/dist/tools/takoapi.js.map +1 -0
  280. package/dist/tools/validate.d.ts +22 -0
  281. package/dist/tools/validate.d.ts.map +1 -0
  282. package/dist/tools/validate.js +50 -0
  283. package/dist/tools/validate.js.map +1 -0
  284. package/dist/voice/dictation.d.ts +51 -0
  285. package/dist/voice/dictation.d.ts.map +1 -0
  286. package/dist/voice/dictation.js +70 -0
  287. package/dist/voice/dictation.js.map +1 -0
  288. package/dist/web/agent-roster.d.ts +56 -0
  289. package/dist/web/agent-roster.d.ts.map +1 -0
  290. package/dist/web/agent-roster.js +109 -0
  291. package/dist/web/agent-roster.js.map +1 -0
  292. package/dist/web/devices.d.ts +27 -0
  293. package/dist/web/devices.d.ts.map +1 -0
  294. package/dist/web/devices.js +113 -0
  295. package/dist/web/devices.js.map +1 -0
  296. package/dist/web/island.d.ts +5 -1
  297. package/dist/web/island.d.ts.map +1 -1
  298. package/dist/web/island.js +427 -67
  299. package/dist/web/island.js.map +1 -1
  300. package/dist/web/lisa-client.d.ts +20 -0
  301. package/dist/web/lisa-client.d.ts.map +1 -0
  302. package/dist/web/lisa-client.js +1323 -0
  303. package/dist/web/lisa-client.js.map +1 -0
  304. package/dist/web/lisa-css.d.ts +13 -0
  305. package/dist/web/lisa-css.d.ts.map +1 -0
  306. package/dist/web/lisa-css.js +1163 -0
  307. package/dist/web/lisa-css.js.map +1 -0
  308. package/dist/web/lisa-html.d.ts +1 -1
  309. package/dist/web/lisa-html.d.ts.map +1 -1
  310. package/dist/web/lisa-html.js +16 -2091
  311. package/dist/web/lisa-html.js.map +1 -1
  312. package/dist/web/push.d.ts +76 -0
  313. package/dist/web/push.d.ts.map +1 -0
  314. package/dist/web/push.js +163 -0
  315. package/dist/web/push.js.map +1 -0
  316. package/dist/web/server.d.ts +19 -0
  317. package/dist/web/server.d.ts.map +1 -1
  318. package/dist/web/server.js +898 -65
  319. package/dist/web/server.js.map +1 -1
  320. package/package.json +5 -2
@@ -0,0 +1,43 @@
1
+ import type { SenseEvent, SenseSource } from "./types.js";
2
+ /** Probes the current foreground app (+ optional title). Injectable for tests. */
3
+ export type ForegroundProbe = () => Promise<{
4
+ app?: string;
5
+ title?: string;
6
+ }>;
7
+ /** macOS foreground app via System Events. {} off-darwin / on any failure. */
8
+ export declare const defaultForegroundProbe: ForegroundProbe;
9
+ /**
10
+ * Decide whether a foreground probe should produce an event. Pure — the privacy-
11
+ * critical unit. Returns null for: no app, a blacklisted app (skip frame), or no
12
+ * change since prevApp. A surfaced title is secret-path-dropped + PII-redacted.
13
+ */
14
+ export declare function shouldEmitForeground(prevApp: string | undefined, cur: {
15
+ app?: string;
16
+ title?: string;
17
+ }, now: number, appBlacklist?: string[]): SenseEvent | null;
18
+ export interface ScreenSourceOptions {
19
+ probe?: ForegroundProbe;
20
+ intervalMs?: number;
21
+ /** Extra app-name blacklist entries merged on top of the defaults. */
22
+ appBlacklist?: string[];
23
+ now?: () => number;
24
+ /** Injectable consent check (tests); defaults to the real consent store. */
25
+ granted?: () => boolean;
26
+ }
27
+ export declare class ScreenSource implements SenseSource {
28
+ readonly signal = "screen";
29
+ private timer;
30
+ private emitFn;
31
+ private prevApp;
32
+ private readonly probe;
33
+ private readonly intervalMs;
34
+ private readonly appBlacklist;
35
+ private readonly now;
36
+ private readonly granted;
37
+ constructor(opts?: ScreenSourceOptions);
38
+ start(emit: (e: SenseEvent) => void): Promise<void>;
39
+ /** One capture cycle. Exposed for deterministic tests. */
40
+ tick(): Promise<void>;
41
+ stop(): Promise<void>;
42
+ }
43
+ //# sourceMappingURL=screen.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"screen.d.ts","sourceRoot":"","sources":["../../src/sense/screen.ts"],"names":[],"mappings":"AAsBA,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAK1D,kFAAkF;AAClF,MAAM,MAAM,eAAe,GAAG,MAAM,OAAO,CAAC;IAAE,GAAG,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC;AAE9E,8EAA8E;AAC9E,eAAO,MAAM,sBAAsB,EAAE,eAYpC,CAAC;AAEF;;;;GAIG;AACH,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,MAAM,GAAG,SAAS,EAC3B,GAAG,EAAE;IAAE,GAAG,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,EACrC,GAAG,EAAE,MAAM,EACX,YAAY,GAAE,MAAM,EAAO,GAC1B,UAAU,GAAG,IAAI,CAiBnB;AAED,MAAM,WAAW,mBAAmB;IAClC,KAAK,CAAC,EAAE,eAAe,CAAC;IACxB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,sEAAsE;IACtE,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;IACnB,4EAA4E;IAC5E,OAAO,CAAC,EAAE,MAAM,OAAO,CAAC;CACzB;AAED,qBAAa,YAAa,YAAW,WAAW;IAC9C,QAAQ,CAAC,MAAM,YAAY;IAC3B,OAAO,CAAC,KAAK,CAA+B;IAC5C,OAAO,CAAC,MAAM,CAA0C;IACxD,OAAO,CAAC,OAAO,CAAqB;IACpC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAkB;IACxC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAW;IACxC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAe;IACnC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAgB;gBAE5B,IAAI,GAAE,mBAAwB;IAQpC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE,UAAU,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAMzD,0DAA0D;IACpD,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAarB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;CAK5B"}
@@ -0,0 +1,107 @@
1
+ /**
2
+ * Screen sense source (PLAN_SENSE S2-screen) — the user's foreground context as
3
+ * an ambient signal: WHICH app is in front, emitted only when it changes.
4
+ *
5
+ * Deliberately the cheap, low-sensitivity slice of S2-screen: app NAME (and an
6
+ * optional, blacklist-checked + PII-redacted window title). It does NOT capture
7
+ * screen pixels — there is no screenshot here; raw screen content never enters a
8
+ * SenseEvent. (The optional low-frequency screenshot→model path is a follow-up
9
+ * that reuses the existing screen-advisor, and would persist nothing.)
10
+ *
11
+ * Consent + privacy (FOUNDATIONS §1):
12
+ * - captures nothing unless `screen` is granted; re-checks every tick so a
13
+ * revoke takes effect within one interval (and resets state).
14
+ * - a blacklisted foreground app (password manager / bank) → whole frame
15
+ * skipped: no event, and prev stays put so the app is invisible to the
16
+ * timeline (switching THROUGH it leaves no trace).
17
+ * - a window title is dropped if it looks like a secret path, else PII-redacted.
18
+ */
19
+ import { execFile } from "node:child_process";
20
+ import { promisify } from "node:util";
21
+ import { isGranted } from "../consent/store.js";
22
+ import { isBlacklistedApp, isBlacklistedPath, redactPII } from "../consent/blacklist.js";
23
+ const pexec = promisify(execFile);
24
+ const DEFAULT_INTERVAL_MS = 15_000;
25
+ /** macOS foreground app via System Events. {} off-darwin / on any failure. */
26
+ export const defaultForegroundProbe = async () => {
27
+ if (process.platform !== "darwin")
28
+ return {};
29
+ try {
30
+ const { stdout } = await pexec("osascript", ["-e", 'tell application "System Events" to get name of first application process whose frontmost is true'], { timeout: 3_000 });
31
+ return { app: stdout.trim() || undefined };
32
+ }
33
+ catch {
34
+ return {}; // no permission / not darwin / timeout → capture nothing
35
+ }
36
+ };
37
+ /**
38
+ * Decide whether a foreground probe should produce an event. Pure — the privacy-
39
+ * critical unit. Returns null for: no app, a blacklisted app (skip frame), or no
40
+ * change since prevApp. A surfaced title is secret-path-dropped + PII-redacted.
41
+ */
42
+ export function shouldEmitForeground(prevApp, cur, now, appBlacklist = []) {
43
+ const app = cur.app;
44
+ if (!app)
45
+ return null;
46
+ if (isBlacklistedApp(app, appBlacklist))
47
+ return null; // skip whole frame
48
+ if (app === prevApp)
49
+ return null; // unchanged → nothing to record
50
+ let title = cur.title;
51
+ if (title) {
52
+ title = isBlacklistedPath(title) ? undefined : redactPII(title);
53
+ }
54
+ return {
55
+ signal: "screen",
56
+ kind: "foreground-app",
57
+ app,
58
+ ...(title ? { title } : {}),
59
+ summary: "switched to " + app,
60
+ ts: now,
61
+ };
62
+ }
63
+ export class ScreenSource {
64
+ signal = "screen";
65
+ timer = null;
66
+ emitFn = null;
67
+ prevApp;
68
+ probe;
69
+ intervalMs;
70
+ appBlacklist;
71
+ now;
72
+ granted;
73
+ constructor(opts = {}) {
74
+ this.probe = opts.probe ?? defaultForegroundProbe;
75
+ this.intervalMs = opts.intervalMs ?? DEFAULT_INTERVAL_MS;
76
+ this.appBlacklist = opts.appBlacklist ?? [];
77
+ this.now = opts.now ?? Date.now;
78
+ this.granted = opts.granted ?? (() => isGranted("screen"));
79
+ }
80
+ async start(emit) {
81
+ this.emitFn = emit;
82
+ this.timer = setInterval(() => void this.tick(), this.intervalMs);
83
+ this.timer.unref?.();
84
+ }
85
+ /** One capture cycle. Exposed for deterministic tests. */
86
+ async tick() {
87
+ if (!this.granted()) {
88
+ this.prevApp = undefined; // revoked → stop emitting + forget context
89
+ return;
90
+ }
91
+ const cur = await this.probe();
92
+ const ev = shouldEmitForeground(this.prevApp, cur, this.now(), this.appBlacklist);
93
+ // Track prev only for a present, non-blacklisted app (blacklisted frames
94
+ // leave prev untouched so they never appear in the timeline).
95
+ if (cur.app && !isBlacklistedApp(cur.app, this.appBlacklist))
96
+ this.prevApp = cur.app;
97
+ if (ev && this.emitFn)
98
+ this.emitFn(ev);
99
+ }
100
+ async stop() {
101
+ if (this.timer)
102
+ clearInterval(this.timer);
103
+ this.timer = null;
104
+ this.emitFn = null;
105
+ }
106
+ }
107
+ //# sourceMappingURL=screen.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"screen.js","sourceRoot":"","sources":["../../src/sense/screen.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * SenseService (PLAN_SENSE §2.2) — the resident loop that owns ambient sources,
3
+ * decoupled from chat. Each source self-gates on consent every cycle, so the
4
+ * service simply starts them all and lets ungranted ones no-op; `stopAll()` is
5
+ * for shutdown. This is the registration point S2-voice plugs into next.
6
+ */
7
+ import type { SenseEvent, SenseSource } from "./types.js";
8
+ export declare class SenseService {
9
+ private readonly sources;
10
+ private started;
11
+ register(source: SenseSource): void;
12
+ /** Start every registered source. Idempotent. Sources gate on consent. */
13
+ start(emit: (e: SenseEvent) => void): Promise<void>;
14
+ stopAll(): Promise<void>;
15
+ }
16
+ //# sourceMappingURL=service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../src/sense/service.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE1D,qBAAa,YAAY;IACvB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAqB;IAC7C,OAAO,CAAC,OAAO,CAAS;IAExB,QAAQ,CAAC,MAAM,EAAE,WAAW,GAAG,IAAI;IAInC,0EAA0E;IACpE,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE,UAAU,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAYnD,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;CAU/B"}
@@ -0,0 +1,33 @@
1
+ export class SenseService {
2
+ sources = [];
3
+ started = false;
4
+ register(source) {
5
+ this.sources.push(source);
6
+ }
7
+ /** Start every registered source. Idempotent. Sources gate on consent. */
8
+ async start(emit) {
9
+ if (this.started)
10
+ return;
11
+ this.started = true;
12
+ for (const s of this.sources) {
13
+ try {
14
+ await s.start(emit);
15
+ }
16
+ catch {
17
+ // one bad source must not take down the others / the server
18
+ }
19
+ }
20
+ }
21
+ async stopAll() {
22
+ for (const s of this.sources) {
23
+ try {
24
+ await s.stop();
25
+ }
26
+ catch {
27
+ // ignore
28
+ }
29
+ }
30
+ this.started = false;
31
+ }
32
+ }
33
+ //# sourceMappingURL=service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"service.js","sourceRoot":"","sources":["../../src/sense/service.ts"],"names":[],"mappings":"AAQA,MAAM,OAAO,YAAY;IACN,OAAO,GAAkB,EAAE,CAAC;IACrC,OAAO,GAAG,KAAK,CAAC;IAExB,QAAQ,CAAC,MAAmB;QAC1B,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAC5B,CAAC;IAED,0EAA0E;IAC1E,KAAK,CAAC,KAAK,CAAC,IAA6B;QACvC,IAAI,IAAI,CAAC,OAAO;YAAE,OAAO;QACzB,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;QACpB,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YAC7B,IAAI,CAAC;gBACH,MAAM,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YACtB,CAAC;YAAC,MAAM,CAAC;gBACP,4DAA4D;YAC9D,CAAC;QACH,CAAC;IACH,CAAC;IAED,KAAK,CAAC,OAAO;QACX,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YAC7B,IAAI,CAAC;gBACH,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;YACjB,CAAC;YAAC,MAAM,CAAC;gBACP,SAAS;YACX,CAAC;QACH,CAAC;QACD,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;IACvB,CAAC;CACF"}
@@ -0,0 +1,35 @@
1
+ /**
2
+ * Sense — ambient signal sources (PLAN_SENSE S2). These are NOT agent sessions,
3
+ * so they get their own abstraction parallel to AgentObserver rather than being
4
+ * shoved into the orchestrator hub.
5
+ *
6
+ * Every source is consent-gated (FOUNDATIONS §1): it captures nothing unless the
7
+ * user has granted its signal, and it surfaces only STRUCTURED metadata — never
8
+ * raw screen bytes, raw audio, or unredacted content.
9
+ */
10
+ /** A distilled, structured observation from an ambient source. Never raw bytes. */
11
+ export interface SenseEvent {
12
+ /** The consent signal this came from, e.g. "screen" / "voice". */
13
+ signal: string;
14
+ /** Source-specific event kind, e.g. "foreground-app". */
15
+ kind: string;
16
+ /** Foreground app name (structural, low-sensitivity). */
17
+ app?: string;
18
+ /** Window title — only when safe (blacklist-checked + PII-redacted). */
19
+ title?: string;
20
+ /** Short structured summary for display / distillation. */
21
+ summary: string;
22
+ /** Epoch ms. */
23
+ ts: number;
24
+ }
25
+ /**
26
+ * An ambient source. Stateful (holds a timer between start/stop). It must check
27
+ * consent itself on every capture — start() does not imply permission, and a
28
+ * mid-run revoke must take effect within one cycle.
29
+ */
30
+ export interface SenseSource {
31
+ readonly signal: string;
32
+ start(emit: (e: SenseEvent) => void): Promise<void>;
33
+ stop(): Promise<void>;
34
+ }
35
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/sense/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,mFAAmF;AACnF,MAAM,WAAW,UAAU;IACzB,kEAAkE;IAClE,MAAM,EAAE,MAAM,CAAC;IACf,yDAAyD;IACzD,IAAI,EAAE,MAAM,CAAC;IACb,yDAAyD;IACzD,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,wEAAwE;IACxE,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,2DAA2D;IAC3D,OAAO,EAAE,MAAM,CAAC;IAChB,gBAAgB;IAChB,EAAE,EAAE,MAAM,CAAC;CACZ;AAED;;;;GAIG;AACH,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE,UAAU,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACpD,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACvB"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Sense — ambient signal sources (PLAN_SENSE S2). These are NOT agent sessions,
3
+ * so they get their own abstraction parallel to AgentObserver rather than being
4
+ * shoved into the orchestrator hub.
5
+ *
6
+ * Every source is consent-gated (FOUNDATIONS §1): it captures nothing unless the
7
+ * user has granted its signal, and it surfaces only STRUCTURED metadata — never
8
+ * raw screen bytes, raw audio, or unredacted content.
9
+ */
10
+ export {};
11
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/sense/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG"}
@@ -0,0 +1,28 @@
1
+ import type { SenseEvent, SenseSource } from "./types.js";
2
+ /**
3
+ * Distill a transcript into a structured SenseEvent. Pure. PII-redacted and
4
+ * length-capped; null for empty text or text that names a secret path. Never
5
+ * touches audio bytes.
6
+ */
7
+ export declare function distillVoiceTranscript(transcript: string, now: number): SenseEvent | null;
8
+ export interface VoiceSourceOptions {
9
+ now?: () => number;
10
+ /** Injectable consent check (tests); defaults to the real consent store. */
11
+ granted?: () => boolean;
12
+ }
13
+ export declare class VoiceSource implements SenseSource {
14
+ readonly signal = "voice";
15
+ private emitFn;
16
+ private readonly now;
17
+ private readonly granted;
18
+ constructor(opts?: VoiceSourceOptions);
19
+ start(emit: (e: SenseEvent) => void): Promise<void>;
20
+ stop(): Promise<void>;
21
+ /**
22
+ * Feed a push-to-talk transcript. Distills + emits IFF `voice` is granted;
23
+ * a no-op (returns null) otherwise — ambient capture always requires consent.
24
+ * Returns the event (for tests / callers) or null.
25
+ */
26
+ ingest(transcript: string): SenseEvent | null;
27
+ }
28
+ //# sourceMappingURL=voice.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"voice.d.ts","sourceRoot":"","sources":["../../src/sense/voice.ts"],"names":[],"mappings":"AAiBA,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAI1D;;;;GAIG;AACH,wBAAgB,sBAAsB,CAAC,UAAU,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI,CAOzF;AAED,MAAM,WAAW,kBAAkB;IACjC,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;IACnB,4EAA4E;IAC5E,OAAO,CAAC,EAAE,MAAM,OAAO,CAAC;CACzB;AAED,qBAAa,WAAY,YAAW,WAAW;IAC7C,QAAQ,CAAC,MAAM,WAAW;IAC1B,OAAO,CAAC,MAAM,CAA0C;IACxD,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAe;IACnC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAgB;gBAE5B,IAAI,GAAE,kBAAuB;IAMnC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE,UAAU,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAGnD,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAI3B;;;;OAIG;IACH,MAAM,CAAC,UAAU,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI;CAM9C"}
@@ -0,0 +1,64 @@
1
+ /**
2
+ * Voice sense source (PLAN_SENSE S2-voice) — push-to-talk transcripts as an
3
+ * ambient signal, built on F-consent.
4
+ *
5
+ * It rides the EXISTING transcribe pipeline (browser MediaRecorder → Whisper)
6
+ * rather than opening the mic itself: the user already speaks intentionally
7
+ * (push-to-talk, the plan's default over always-on). What S2-voice adds is, when
8
+ * `voice` is granted, distilling those transcripts into the ambient sense log as
9
+ * context. Default off → dictation works exactly as before and nothing is logged.
10
+ *
11
+ * Privacy: raw AUDIO is never stored (there is none here — only the transcript
12
+ * the user chose to speak); the persisted summary is PII-redacted and dropped
13
+ * entirely if it names a secret path. Always-on listening and a local STT
14
+ * (whisper.cpp) for off-device transcription are deliberate follow-ups.
15
+ */
16
+ import { isGranted } from "../consent/store.js";
17
+ import { redactPII, isBlacklistedPath } from "../consent/blacklist.js";
18
+ const MAX_SUMMARY = 280;
19
+ /**
20
+ * Distill a transcript into a structured SenseEvent. Pure. PII-redacted and
21
+ * length-capped; null for empty text or text that names a secret path. Never
22
+ * touches audio bytes.
23
+ */
24
+ export function distillVoiceTranscript(transcript, now) {
25
+ const text = (transcript || "").trim();
26
+ if (!text)
27
+ return null;
28
+ if (isBlacklistedPath(text))
29
+ return null; // mentions a secret path → don't log
30
+ const redacted = redactPII(text);
31
+ const summary = redacted.length > MAX_SUMMARY ? redacted.slice(0, MAX_SUMMARY) + "…" : redacted;
32
+ return { signal: "voice", kind: "voice-transcript", summary, ts: now };
33
+ }
34
+ export class VoiceSource {
35
+ signal = "voice";
36
+ emitFn = null;
37
+ now;
38
+ granted;
39
+ constructor(opts = {}) {
40
+ this.now = opts.now ?? Date.now;
41
+ this.granted = opts.granted ?? (() => isGranted("voice"));
42
+ }
43
+ // Event-driven (not polled): start just wires the sink, stop unwires it.
44
+ async start(emit) {
45
+ this.emitFn = emit;
46
+ }
47
+ async stop() {
48
+ this.emitFn = null;
49
+ }
50
+ /**
51
+ * Feed a push-to-talk transcript. Distills + emits IFF `voice` is granted;
52
+ * a no-op (returns null) otherwise — ambient capture always requires consent.
53
+ * Returns the event (for tests / callers) or null.
54
+ */
55
+ ingest(transcript) {
56
+ if (!this.granted())
57
+ return null;
58
+ const ev = distillVoiceTranscript(transcript, this.now());
59
+ if (ev && this.emitFn)
60
+ this.emitFn(ev);
61
+ return ev;
62
+ }
63
+ }
64
+ //# sourceMappingURL=voice.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"voice.js","sourceRoot":"","sources":["../../src/sense/voice.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAChD,OAAO,EAAE,SAAS,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAGvE,MAAM,WAAW,GAAG,GAAG,CAAC;AAExB;;;;GAIG;AACH,MAAM,UAAU,sBAAsB,CAAC,UAAkB,EAAE,GAAW;IACpE,MAAM,IAAI,GAAG,CAAC,UAAU,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IACvC,IAAI,CAAC,IAAI;QAAE,OAAO,IAAI,CAAC;IACvB,IAAI,iBAAiB,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC,CAAC,qCAAqC;IAC/E,MAAM,QAAQ,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;IACjC,MAAM,OAAO,GAAG,QAAQ,CAAC,MAAM,GAAG,WAAW,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,WAAW,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC;IAChG,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,kBAAkB,EAAE,OAAO,EAAE,EAAE,EAAE,GAAG,EAAE,CAAC;AACzE,CAAC;AAQD,MAAM,OAAO,WAAW;IACb,MAAM,GAAG,OAAO,CAAC;IAClB,MAAM,GAAqC,IAAI,CAAC;IACvC,GAAG,CAAe;IAClB,OAAO,CAAgB;IAExC,YAAY,OAA2B,EAAE;QACvC,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC;QAChC,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC;IAC5D,CAAC;IAED,yEAAyE;IACzE,KAAK,CAAC,KAAK,CAAC,IAA6B;QACvC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;IACrB,CAAC;IACD,KAAK,CAAC,IAAI;QACR,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;IACrB,CAAC;IAED;;;;OAIG;IACH,MAAM,CAAC,UAAkB;QACvB,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE;YAAE,OAAO,IAAI,CAAC;QACjC,MAAM,EAAE,GAAG,sBAAsB,CAAC,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;QAC1D,IAAI,EAAE,IAAI,IAAI,CAAC,MAAM;YAAE,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QACvC,OAAO,EAAE,CAAC;IACZ,CAAC;CACF"}
@@ -1 +1 @@
1
- {"version":3,"file":"git.d.ts","sourceRoot":"","sources":["../../src/soul/git.ts"],"names":[],"mappings":"AAgBA,MAAM,MAAM,UAAU,GAClB,OAAO,GACP,YAAY,GACZ,cAAc,GACd,WAAW,GACX,SAAS,GACT,WAAW,GACX,QAAQ,GACR,WAAW,CAAC;AAQhB;;;;GAIG;AACH,wBAAsB,cAAc,CAAC,CAAC,EACpC,MAAM,EAAE,UAAU,EAClB,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GACnB,OAAO,CAAC,CAAC,CAAC,CAEZ;AAqDD;;;;GAIG;AACH,wBAAsB,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC,CAiDlD;AAED;;;;;;;;GAQG;AACH,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,IAAI,CAAC,CA6Bf;AAwBD,wBAAsB,aAAa,CAAC,IAAI,EAAE;IACxC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,GAAG,OAAO,CAAC,MAAM,CAAC,CAWlB;AAED,wBAAsB,YAAY,CAAC,IAAI,EAAE;IACvC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,GAAG,OAAO,CAAC,MAAM,CAAC,CAkBlB;AAED,iCAAiC;AACjC,wBAAsB,uBAAuB,IAAI,OAAO,CAAC,IAAI,CAAC,CAE7D"}
1
+ {"version":3,"file":"git.d.ts","sourceRoot":"","sources":["../../src/soul/git.ts"],"names":[],"mappings":"AA+BA,MAAM,MAAM,UAAU,GAClB,OAAO,GACP,YAAY,GACZ,cAAc,GACd,WAAW,GACX,SAAS,GACT,WAAW,GACX,QAAQ,GACR,WAAW,CAAC;AAQhB;;;;GAIG;AACH,wBAAsB,cAAc,CAAC,CAAC,EACpC,MAAM,EAAE,UAAU,EAClB,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GACnB,OAAO,CAAC,CAAC,CAAC,CAEZ;AAqDD;;;;GAIG;AACH,wBAAsB,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC,CAiDlD;AAED;;;;;;;;GAQG;AACH,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,IAAI,CAAC,CAqCf;AAwBD,wBAAsB,aAAa,CAAC,IAAI,EAAE;IACxC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,GAAG,OAAO,CAAC,MAAM,CAAC,CAWlB;AAED,wBAAsB,YAAY,CAAC,IAAI,EAAE;IACvC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,GAAG,OAAO,CAAC,MAAM,CAAC,CAkBlB;AAED,iCAAiC;AACjC,wBAAsB,uBAAuB,IAAI,OAAO,CAAC,IAAI,CAAC,CAE7D"}
package/dist/soul/git.js CHANGED
@@ -12,7 +12,21 @@ import { spawn } from "node:child_process";
12
12
  import { AsyncLocalStorage } from "node:async_hooks";
13
13
  import path from "node:path";
14
14
  import { pathExists } from "../fs-utils.js";
15
+ import { withFileLock } from "./lock.js";
15
16
  import { SOUL_DIR } from "./paths.js";
17
+ /**
18
+ * Cross-process lock around the add→diff→commit sequence. The in-process
19
+ * enqueueCommit queue only serializes commits within ONE process; the web
20
+ * server, the CLI, and a launchd heartbeat all write the same soul repo, and
21
+ * two processes committing concurrently collide on .git/index.lock — the
22
+ * loser's commit was silently swallowed (file written, history entry lost).
23
+ *
24
+ * Deliberately a DIFFERENT file from SOUL_LOCK_PATH (.write.lock): store-level
25
+ * writers hold the soul write-lock *while* awaiting commitSoulChange, so
26
+ * reusing the same lock here would self-deadlock. Ordering is always
27
+ * write-lock → git-lock, never the reverse, so the two can't deadlock.
28
+ */
29
+ const SOUL_GIT_LOCK_PATH = path.join(SOUL_DIR, ".git-write.lock");
16
30
  const callerStore = new AsyncLocalStorage();
17
31
  /**
18
32
  * Wrap an async block so that any soul write inside it commits with the given
@@ -92,7 +106,7 @@ export async function initSoulRepo() {
92
106
  const fs = await import("node:fs/promises");
93
107
  const ignorePath = path.join(SOUL_DIR, ".gitignore");
94
108
  if (!(await pathExists(ignorePath))) {
95
- await fs.writeFile(ignorePath, ["*.tmp", "*.swp", ".DS_Store", ""].join("\n"), "utf8");
109
+ await fs.writeFile(ignorePath, ["*.tmp", "*.swp", ".DS_Store", ".write.lock", ".git-write.lock", ""].join("\n"), "utf8");
96
110
  }
97
111
  await runGit(["add", "."]);
98
112
  const ts = new Date().toISOString();
@@ -129,21 +143,26 @@ export function commitSoulChange(relPath, opKind) {
129
143
  if (!(await pathExists(dotGit)))
130
144
  return; // not initialized yet (pre-birth)
131
145
  try {
132
- const add = await runGit(["add", "--", relPath]);
133
- if (add.code !== 0) {
134
- // file might not exist yet (deletion case) — try -A on the relPath
135
- // dirname instead. If still nothing, give up quietly.
136
- return;
137
- }
138
- const diff = await runGit(["diff", "--cached", "--quiet", "--", relPath]);
139
- // exit 0 = no diff, exit 1 = diff present.
140
- if (diff.code === 0)
141
- return;
142
- const msg = formatCommitMessage(relPath, opKind, caller);
143
- const commit = await runGit(["commit", "-q", "-m", msg]);
144
- if (commit.code !== 0) {
145
- console.warn(`[soul-git] commit failed for ${relPath}: ${commit.stderr.trim().slice(0, 200)}`);
146
- }
146
+ await withFileLock(SOUL_GIT_LOCK_PATH, async () => {
147
+ const add = await runGit(["add", "--", relPath]);
148
+ if (add.code !== 0) {
149
+ // file might not exist yet (deletion case) — try -A on the relPath
150
+ // dirname instead. If still nothing, give up quietly.
151
+ return;
152
+ }
153
+ const diff = await runGit(["diff", "--cached", "--quiet", "--", relPath]);
154
+ // exit 0 = no diff, exit 1 = diff present.
155
+ if (diff.code === 0)
156
+ return;
157
+ const msg = formatCommitMessage(relPath, opKind, caller);
158
+ const commit = await runGit(["commit", "-q", "-m", msg]);
159
+ if (commit.code !== 0) {
160
+ console.warn(`[soul-git] commit failed for ${relPath}: ${commit.stderr.trim().slice(0, 200)}`);
161
+ }
162
+ },
163
+ // Waiting out another process's commit is cheap; a commit that holds
164
+ // the lock >30s is presumed crashed and stolen.
165
+ { timeoutMs: 15_000, staleMs: 30_000 });
147
166
  }
148
167
  catch (err) {
149
168
  console.warn(`[soul-git] commit error for ${relPath}: ${err.message.slice(0, 200)}`);
@@ -1 +1 @@
1
- {"version":3,"file":"git.js","sourceRoot":"","sources":["../../src/soul/git.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAC5C,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAgBtC,MAAM,WAAW,GAAG,IAAI,iBAAiB,EAAiB,CAAC;AAE3D;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,MAAkB,EAClB,EAAoB;IAEpB,OAAO,MAAM,WAAW,CAAC,GAAG,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,CAAC;AAC/C,CAAC;AAED,SAAS,aAAa;IACpB,OAAO,WAAW,CAAC,QAAQ,EAAE,EAAE,MAAM,IAAI,QAAQ,CAAC;AACpD,CAAC;AAQD,IAAI,YAAY,GAAmB,IAAI,CAAC;AAExC,KAAK,UAAU,iBAAiB;IAC9B,IAAI,YAAY,KAAK,IAAI;QAAE,OAAO,YAAY,CAAC;IAC/C,IAAI,CAAC;QACH,MAAM,CAAC,GAAG,MAAM,SAAS,CAAC,CAAC,WAAW,CAAC,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;QACxD,YAAY,GAAG,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC;IAC9B,CAAC;IAAC,MAAM,CAAC;QACP,YAAY,GAAG,KAAK,CAAC;IACvB,CAAC;IACD,OAAO,YAAY,CAAC;AACtB,CAAC;AAED,SAAS,SAAS,CAAC,IAAc,EAAE,GAAW;IAC5C,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,EAAE,IAAI,EAAE;YAC/B,GAAG;YACH,GAAG,EAAE;gBACH,GAAG,OAAO,CAAC,GAAG;gBACd,iEAAiE;gBACjE,sDAAsD;gBACtD,mBAAmB,EAAE,GAAG;gBACxB,kBAAkB,EAAE,GAAG;aACxB;YACD,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC;SAClC,CAAC,CAAC;QACH,IAAI,MAAM,GAAG,EAAE,CAAC;QAChB,IAAI,MAAM,GAAG,EAAE,CAAC;QAChB,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QACvE,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QACvE,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,IAAI,IAAI,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;QAC1E,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE,CACxB,OAAO,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,IAAI,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAC5D,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC;AAED,KAAK,UAAU,MAAM,CAAC,IAAc;IAClC,OAAO,MAAM,SAAS,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;AACzC,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY;IAChC,IAAI,CAAC,CAAC,MAAM,iBAAiB,EAAE,CAAC,EAAE,CAAC;QACjC,OAAO,CAAC,IAAI,CAAC,qDAAqD,CAAC,CAAC;QACpE,OAAO;IACT,CAAC;IACD,IAAI,CAAC,CAAC,MAAM,UAAU,CAAC,QAAQ,CAAC,CAAC;QAAE,OAAO;IAC1C,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IAC3C,IAAI,MAAM,UAAU,CAAC,MAAM,CAAC;QAAE,OAAO;IAErC,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC;QACxD,IAAI,IAAI,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;YACpB,kDAAkD;YAClD,MAAM,MAAM,CAAC,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC;QAC/B,CAAC;QACD,MAAM,MAAM,CAAC,CAAC,QAAQ,EAAE,YAAY,EAAE,WAAW,CAAC,CAAC,CAAC;QACpD,MAAM,MAAM,CAAC,CAAC,QAAQ,EAAE,WAAW,EAAE,MAAM,CAAC,CAAC,CAAC;QAC9C,MAAM,MAAM,CAAC,CAAC,QAAQ,EAAE,gBAAgB,EAAE,OAAO,CAAC,CAAC,CAAC;QACpD,iEAAiE;QACjE,MAAM,MAAM,CAAC,CAAC,QAAQ,EAAE,gBAAgB,EAAE,WAAW,CAAC,CAAC,CAAC;QACxD,iCAAiC;QACjC,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,kBAAkB,CAAC,CAAC;QAC5C,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;QACrD,IAAI,CAAC,CAAC,MAAM,UAAU,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC;YACpC,MAAM,EAAE,CAAC,SAAS,CAChB,UAAU,EACV,CAAC,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAC9C,MAAM,CACP,CAAC;QACJ,CAAC;QACD,MAAM,MAAM,CAAC,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC;QAC3B,MAAM,EAAE,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QACpC,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC;YAC1B,QAAQ;YACR,IAAI;YACJ,IAAI;YACJ,kCAAkC,EAAE,EAAE;YACtC,eAAe;SAChB,CAAC,CAAC;QACH,IAAI,MAAM,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;YACtB,OAAO,CAAC,IAAI,CACV,qCAAqC,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAC1E,CAAC;QACJ,CAAC;IACH,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,IAAI,CACV,2BAA4B,GAAa,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAClE,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,gBAAgB,CAC9B,OAAe,EACf,MAAc;IAEd,MAAM,MAAM,GAAG,aAAa,EAAE,CAAC;IAC/B,OAAO,aAAa,CAAC,KAAK,IAAI,EAAE;QAC9B,IAAI,CAAC,CAAC,MAAM,iBAAiB,EAAE,CAAC;YAAE,OAAO;QACzC,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QAC3C,IAAI,CAAC,CAAC,MAAM,UAAU,CAAC,MAAM,CAAC,CAAC;YAAE,OAAO,CAAC,kCAAkC;QAC3E,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,CAAC,KAAK,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC;YACjD,IAAI,GAAG,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;gBACnB,mEAAmE;gBACnE,sDAAsD;gBACtD,OAAO;YACT,CAAC;YACD,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,CAAC,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC;YAC1E,2CAA2C;YAC3C,IAAI,IAAI,CAAC,IAAI,KAAK,CAAC;gBAAE,OAAO;YAC5B,MAAM,GAAG,GAAG,mBAAmB,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;YACzD,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,CAAC,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC;YACzD,IAAI,MAAM,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;gBACtB,OAAO,CAAC,IAAI,CACV,gCAAgC,OAAO,KAAK,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CACjF,CAAC;YACJ,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,IAAI,CACV,+BAA+B,OAAO,KAAM,GAAa,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAClF,CAAC;QACJ,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,mBAAmB,CAC1B,OAAe,EACf,MAAc,EACd,MAAkB;IAElB,OAAO,GAAG,MAAM,KAAK,OAAO,QAAQ,MAAM,EAAE,CAAC;AAC/C,CAAC;AAED,6EAA6E;AAE7E,IAAI,WAAW,GAAkB,OAAO,CAAC,OAAO,EAAE,CAAC;AAEnD,SAAS,aAAa,CAAC,EAAuB;IAC5C,MAAM,IAAI,GAAG,WAAW,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;IACtC,uEAAuE;IACvE,4BAA4B;IAC5B,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;IAC1C,OAAO,IAAI,CAAC;AACd,CAAC;AAED,6EAA6E;AAE7E,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,IAInC;IACC,IAAI,CAAC,CAAC,MAAM,iBAAiB,EAAE,CAAC;QAAE,OAAO,mBAAmB,CAAC;IAC7D,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IAC3C,IAAI,CAAC,CAAC,MAAM,UAAU,CAAC,MAAM,CAAC,CAAC;QAAE,OAAO,gCAAgC,CAAC;IACzE,MAAM,IAAI,GAAG,CAAC,KAAK,EAAE,2BAA2B,EAAE,mBAAmB,CAAC,CAAC;IACvE,IAAI,IAAI,CAAC,KAAK;QAAE,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;IACpD,IAAI,IAAI,CAAC,KAAK;QAAE,IAAI,CAAC,IAAI,CAAC,WAAW,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;IACnD,IAAI,IAAI,CAAC,OAAO;QAAE,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;IAChD,MAAM,CAAC,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,CAAC;IAC7B,IAAI,CAAC,CAAC,IAAI,KAAK,CAAC;QAAE,OAAO,oBAAoB,CAAC,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC;IAC9E,OAAO,CAAC,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,cAAc,CAAC;AAC3C,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,IAIlC;IACC,IAAI,CAAC,CAAC,MAAM,iBAAiB,EAAE,CAAC;QAAE,OAAO,mBAAmB,CAAC;IAC7D,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IAC3C,IAAI,CAAC,CAAC,MAAM,UAAU,CAAC,MAAM,CAAC,CAAC;QAAE,OAAO,gCAAgC,CAAC;IACzE,MAAM,IAAI,GAAG,CAAC,KAAK,EAAE,IAAI,EAAE,YAAY,EAAE,mBAAmB,CAAC,CAAC;IAC9D,IAAI,IAAI,CAAC,KAAK;QAAE,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;IACpD,IAAI,IAAI,CAAC,KAAK;QAAE,IAAI,CAAC,IAAI,CAAC,WAAW,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;IACnD,IAAI,IAAI,CAAC,OAAO;QAAE,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;IAChD,MAAM,CAAC,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,CAAC;IAC7B,IAAI,CAAC,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;QACjB,OAAO,uBAAuB,CAAC,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC;IACjE,CAAC;IACD,mDAAmD;IACnD,MAAM,GAAG,GAAG,MAAM,CAAC;IACnB,IAAI,CAAC,CAAC,MAAM,CAAC,MAAM,GAAG,GAAG,EAAE,CAAC;QAC1B,OAAO,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,oBAAoB,CAAC,CAAC,MAAM,CAAC,MAAM,GAAG,GAAG,cAAc,CAAC;IAC1F,CAAC;IACD,OAAO,CAAC,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,oBAAoB,CAAC;AACjD,CAAC;AAED,iCAAiC;AACjC,MAAM,CAAC,KAAK,UAAU,uBAAuB;IAC3C,YAAY,GAAG,IAAI,CAAC;AACtB,CAAC"}
1
+ {"version":3,"file":"git.js","sourceRoot":"","sources":["../../src/soul/git.ts"],"names":[],"mappings":"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"}
@@ -13,6 +13,24 @@ export declare function readConstitution(): Promise<string>;
13
13
  export declare function writeConstitution(text: string): Promise<void>;
14
14
  export declare function readEmotions(): Promise<EmotionState>;
15
15
  export declare function writeEmotions(state: EmotionState): Promise<void>;
16
+ /**
17
+ * The one true way to nudge an emotion: read → decay-to-now → add delta →
18
+ * append the causal event → persist, all under the cross-process soul lock.
19
+ * Both soul_feel and reflect's `feel` op go through here so the two paths
20
+ * can't diverge (reflect used to skip the decay step and stack deltas on a
21
+ * stale baseline) and so two processes can't interleave the read-modify-write
22
+ * and lose an event.
23
+ */
24
+ export declare function applyEmotionDelta(opts: {
25
+ emotion: string;
26
+ delta: number;
27
+ trigger: string;
28
+ decay?: number;
29
+ maxEvents: number;
30
+ }): Promise<{
31
+ previous: number;
32
+ next: number;
33
+ }>;
16
34
  /**
17
35
  * Apply exponential decay to all emotion intensities based on elapsed time
18
36
  * since `state.updatedAt`. Pure modulo the clock: pass `nowMs` to make it
@@ -31,6 +49,10 @@ export declare function listOpinions(): Promise<OpinionEntry[]>;
31
49
  export declare function writeOpinion(entry: OpinionEntry): Promise<void>;
32
50
  export declare function listDesires(): Promise<DesireEntry[]>;
33
51
  export declare function writeDesire(entry: DesireEntry): Promise<void>;
52
+ /** Can the autonomous heartbeat pursue this desire unattended? Pure (R4). */
53
+ export declare function isAutoPursuable(d: DesireEntry): boolean;
54
+ /** An actionable desire that needs the user to run something Lisa can't do unattended. */
55
+ export declare function needsUserHelp(d: DesireEntry): boolean;
34
56
  export declare function readDesireProgress(slug: string): Promise<string>;
35
57
  /** One parsed progress entry (anything between `## <ts>` headers). */
36
58
  export interface ParsedProgressEntry {
@@ -1 +1 @@
1
- {"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../src/soul/store.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../src/soul/store.ts"],"names":[],"mappings":"AA2BA,OAAO,EAEL,KAAK,WAAW,EAChB,KAAK,YAAY,EACjB,KAAK,YAAY,EACjB,KAAK,QAAQ,EACb,KAAK,QAAQ,EACb,KAAK,WAAW,EAChB,KAAK,UAAU,EAChB,MAAM,YAAY,CAAC;AAEpB,wBAAsB,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC,CAWpD;AAED,wBAAsB,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC,CAE/C;AAED,wBAAsB,QAAQ,IAAI,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CAGzD;AAED,wBAAsB,SAAS,CAAC,IAAI,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAI7D;AAED,wBAAsB,QAAQ,IAAI,OAAO,CAAC,MAAM,CAAC,CAGhD;AAED,wBAAsB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAG3D;AAED,wBAAsB,YAAY,IAAI,OAAO,CAAC,MAAM,CAAC,CAEpD;AACD,wBAAsB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAG/D;AAED,wBAAsB,WAAW,IAAI,OAAO,CAAC,MAAM,CAAC,CAEnD;AACD,wBAAsB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAG9D;AAED,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,MAAM,CAAC,CAExD;AACD,wBAAsB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAGnE;AAED,wBAAsB,YAAY,IAAI,OAAO,CAAC,YAAY,CAAC,CAc1D;AAED,wBAAsB,aAAa,CAAC,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAGtE;AAED;;;;;;;GAOG;AACH,wBAAsB,iBAAiB,CAAC,IAAI,EAAE;IAC5C,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;CACnB,GAAG,OAAO,CAAC;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,CAqB9C;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,aAAa,CAC3B,KAAK,EAAE,YAAY,EACnB,KAAK,GAAE,MAAmB,GACzB,YAAY,CAgBd;AAID,wBAAsB,UAAU,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC,CAExD;AACD,wBAAsB,UAAU,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAIjE;AAgBD,wBAAsB,YAAY,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC,CAE5D;AAED,wBAAsB,YAAY,CAAC,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAUrE;AAgBD,wBAAsB,WAAW,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC,CAK1D;AAED,wBAAsB,WAAW,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAiBnE;AAYD,6EAA6E;AAC7E,wBAAgB,eAAe,CAAC,CAAC,EAAE,WAAW,GAAG,OAAO,CAEvD;AAED,0FAA0F;AAC1F,wBAAgB,aAAa,CAAC,CAAC,EAAE,WAAW,GAAG,OAAO,CAErD;AAKD,wBAAsB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAEtE;AAED,sEAAsE;AACtE,MAAM,WAAW,mBAAmB;IAClC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,oBAAoB;IACnC,4EAA4E;IAC5E,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,mBAAmB,EAAE,CAAC;CAChC;AAED,wBAAsB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,oBAAoB,CAAC,CA2BrF;AAED;;;;GAIG;AACH,wBAAsB,yBAAyB,CAC7C,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE;IAAE,gBAAgB,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,mBAAmB,EAAE,CAAA;CAAE,GACpE,OAAO,CAAC,IAAI,CAAC,CAef;AAKD,wBAAsB,oBAAoB,CACxC,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,IAAI,CAAC,CAuBf;AAID,wBAAsB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAa9E;AAED,wBAAsB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAE/D;AAED,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC,CAO1D;AAID,wBAAsB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAEvE;AACD,wBAAsB,iBAAiB,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAGpF;AAoBD,wBAAsB,aAAa,IAAI,OAAO,CAAC,QAAQ,CAAC,CAOvD;AAED,wBAAsB,QAAQ,CAAC,IAAI,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAE5D;AAED,wBAAsB,QAAQ,IAAI,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CAOzD;AAED,wBAAsB,eAAe,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC,CAkBzD;AAoCD,wBAAsB,eAAe,IAAI,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CA6BnE"}