@oratis/lisa 0.3.0 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +34 -5
- package/README.zh-CN.md +34 -5
- package/dist/advisor/detectors.d.ts +25 -0
- package/dist/advisor/detectors.d.ts.map +1 -0
- package/dist/advisor/detectors.js +161 -0
- package/dist/advisor/detectors.js.map +1 -0
- package/dist/advisor/engine.d.ts +41 -0
- package/dist/advisor/engine.d.ts.map +1 -0
- package/dist/advisor/engine.js +156 -0
- package/dist/advisor/engine.js.map +1 -0
- package/dist/advisor/types.d.ts +68 -0
- package/dist/advisor/types.d.ts.map +1 -0
- package/dist/advisor/types.js +19 -0
- package/dist/advisor/types.js.map +1 -0
- package/dist/channels/imessage.d.ts +16 -0
- package/dist/channels/imessage.d.ts.map +1 -1
- package/dist/channels/imessage.js +29 -8
- package/dist/channels/imessage.js.map +1 -1
- package/dist/heartbeat/config.d.ts +10 -0
- package/dist/heartbeat/config.d.ts.map +1 -1
- package/dist/heartbeat/config.js +8 -2
- package/dist/heartbeat/config.js.map +1 -1
- package/dist/heartbeat/runner.d.ts.map +1 -1
- package/dist/heartbeat/runner.js +30 -0
- package/dist/heartbeat/runner.js.map +1 -1
- package/dist/integrations/claude-code/observer.d.ts +19 -0
- package/dist/integrations/claude-code/observer.d.ts.map +1 -0
- package/dist/integrations/claude-code/observer.js +59 -0
- package/dist/integrations/claude-code/observer.js.map +1 -0
- package/dist/integrations/claude-code/parser.d.ts +2 -0
- package/dist/integrations/claude-code/parser.d.ts.map +1 -1
- package/dist/integrations/claude-code/parser.js +153 -0
- package/dist/integrations/claude-code/parser.js.map +1 -1
- package/dist/integrations/claude-code/watcher.d.ts +9 -0
- package/dist/integrations/claude-code/watcher.d.ts.map +1 -1
- package/dist/integrations/claude-code/watcher.js +25 -4
- package/dist/integrations/claude-code/watcher.js.map +1 -1
- package/dist/integrations/codex/observer.d.ts +48 -0
- package/dist/integrations/codex/observer.d.ts.map +1 -0
- package/dist/integrations/codex/observer.js +213 -0
- package/dist/integrations/codex/observer.js.map +1 -0
- package/dist/integrations/current-hub.d.ts +13 -0
- package/dist/integrations/current-hub.d.ts.map +1 -0
- package/dist/integrations/current-hub.js +17 -0
- package/dist/integrations/current-hub.js.map +1 -0
- package/dist/integrations/hub.d.ts +45 -0
- package/dist/integrations/hub.d.ts.map +1 -0
- package/dist/integrations/hub.js +110 -0
- package/dist/integrations/hub.js.map +1 -0
- package/dist/integrations/registry.d.ts +15 -0
- package/dist/integrations/registry.d.ts.map +1 -0
- package/dist/integrations/registry.js +38 -0
- package/dist/integrations/registry.js.map +1 -0
- package/dist/integrations/types.d.ts +90 -0
- package/dist/integrations/types.d.ts.map +1 -0
- package/dist/integrations/types.js +12 -0
- package/dist/integrations/types.js.map +1 -0
- package/dist/memory/vector.d.ts +5 -1
- package/dist/memory/vector.d.ts.map +1 -1
- package/dist/memory/vector.js +58 -1
- package/dist/memory/vector.js.map +1 -1
- package/dist/soul/lock.d.ts +38 -0
- package/dist/soul/lock.d.ts.map +1 -0
- package/dist/soul/lock.js +103 -0
- package/dist/soul/lock.js.map +1 -0
- package/dist/soul/paths.d.ts.map +1 -1
- package/dist/soul/paths.js +12 -6
- package/dist/soul/paths.js.map +1 -1
- package/dist/soul/slug.d.ts +40 -0
- package/dist/soul/slug.d.ts.map +1 -0
- package/dist/soul/slug.js +78 -0
- package/dist/soul/slug.js.map +1 -0
- package/dist/soul/store.d.ts +12 -1
- package/dist/soul/store.d.ts.map +1 -1
- package/dist/soul/store.js +40 -23
- package/dist/soul/store.js.map +1 -1
- package/dist/soul/tools.d.ts.map +1 -1
- package/dist/soul/tools.js +10 -3
- package/dist/soul/tools.js.map +1 -1
- package/dist/tools/advise_now.d.ts +11 -0
- package/dist/tools/advise_now.d.ts.map +1 -0
- package/dist/tools/advise_now.js +34 -0
- package/dist/tools/advise_now.js.map +1 -0
- package/dist/tools/dispatch_agent.d.ts +38 -0
- package/dist/tools/dispatch_agent.d.ts.map +1 -0
- package/dist/tools/dispatch_agent.js +145 -0
- package/dist/tools/dispatch_agent.js.map +1 -0
- package/dist/tools/registry.d.ts.map +1 -1
- package/dist/tools/registry.js.map +1 -1
- package/dist/tools/web_fetch.d.ts +10 -0
- package/dist/tools/web_fetch.d.ts.map +1 -1
- package/dist/tools/web_fetch.js +48 -16
- package/dist/tools/web_fetch.js.map +1 -1
- package/dist/web/island.d.ts +1 -1
- package/dist/web/island.d.ts.map +1 -1
- package/dist/web/island.js +69 -5
- package/dist/web/island.js.map +1 -1
- package/dist/web/server.d.ts.map +1 -1
- package/dist/web/server.js +79 -16
- package/dist/web/server.js.map +1 -1
- package/package.json +3 -1
|
@@ -17,4 +17,20 @@ export declare class IMessageChannel implements ChannelAdapter {
|
|
|
17
17
|
private fetchSince;
|
|
18
18
|
private runSqlite;
|
|
19
19
|
}
|
|
20
|
+
/**
|
|
21
|
+
* Build the osascript argv for sending an iMessage WITHOUT interpolating
|
|
22
|
+
* user/LLM text into the AppleScript source.
|
|
23
|
+
*
|
|
24
|
+
* The old approach (`send "${text}"`) only escaped double-quotes, so a
|
|
25
|
+
* message containing a newline — or a crafted `" & (do shell script "...")`
|
|
26
|
+
* payload — could break out of the string literal and inject AppleScript.
|
|
27
|
+
* Inbound iMessage text is untrusted (anyone who can text the user), so this
|
|
28
|
+
* was a real injection vector.
|
|
29
|
+
*
|
|
30
|
+
* Instead the script is a STATIC `on run argv` program; recipient and text
|
|
31
|
+
* arrive as positional argv items (`item 1`/`item 2 of argv`) that AppleScript
|
|
32
|
+
* never parses as source. No escaping needed; newlines/quotes/backslashes
|
|
33
|
+
* survive verbatim.
|
|
34
|
+
*/
|
|
35
|
+
export declare function buildOsascriptArgs(recipient: string, text: string): string[];
|
|
20
36
|
//# sourceMappingURL=imessage.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"imessage.d.ts","sourceRoot":"","sources":["../../src/channels/imessage.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EACV,cAAc,EACd,eAAe,EACf,eAAe,EAChB,MAAM,YAAY,CAAC;AAIpB,qBAAa,eAAgB,YAAW,cAAc;IACpD,QAAQ,CAAC,IAAI,cAAc;IAC3B,OAAO,CAAC,KAAK,CAAC,CAAiB;IAC/B,OAAO,CAAC,SAAS,CAAK;IACtB,OAAO,CAAC,OAAO,CAAC,CAA0C;IAC1D,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,UAAU,CAAS;gBAEf,IAAI,GAAE;QAAE,UAAU,CAAC,EAAE,MAAM,CAAA;KAAO;IAIxC,KAAK,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,eAAe,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;YAa9D,IAAI;IAuBZ,IAAI,CAAC,GAAG,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"imessage.d.ts","sourceRoot":"","sources":["../../src/channels/imessage.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EACV,cAAc,EACd,eAAe,EACf,eAAe,EAChB,MAAM,YAAY,CAAC;AAIpB,qBAAa,eAAgB,YAAW,cAAc;IACpD,QAAQ,CAAC,IAAI,cAAc;IAC3B,OAAO,CAAC,KAAK,CAAC,CAAiB;IAC/B,OAAO,CAAC,SAAS,CAAK;IACtB,OAAO,CAAC,OAAO,CAAC,CAA0C;IAC1D,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,UAAU,CAAS;gBAEf,IAAI,GAAE;QAAE,UAAU,CAAC,EAAE,MAAM,CAAA;KAAO;IAIxC,KAAK,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,eAAe,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;YAa9D,IAAI;IAuBZ,IAAI,CAAC,GAAG,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC;IAezC,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;YAIb,QAAQ;YAMR,UAAU;YAiCV,SAAS;CAexB;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAW5E"}
|
|
@@ -53,15 +53,9 @@ export class IMessageChannel {
|
|
|
53
53
|
}
|
|
54
54
|
}
|
|
55
55
|
async send(msg) {
|
|
56
|
-
const
|
|
57
|
-
const text = msg.text.replace(/"/g, '\\"');
|
|
58
|
-
const script = `tell application "Messages"
|
|
59
|
-
set targetService to first service whose service type = iMessage
|
|
60
|
-
set targetBuddy to buddy "${recipient}" of targetService
|
|
61
|
-
send "${text}" to targetBuddy
|
|
62
|
-
end tell`;
|
|
56
|
+
const args = buildOsascriptArgs(msg.to, msg.text);
|
|
63
57
|
await new Promise((resolve, reject) => {
|
|
64
|
-
const child = spawn("/usr/bin/osascript",
|
|
58
|
+
const child = spawn("/usr/bin/osascript", args);
|
|
65
59
|
let stderr = "";
|
|
66
60
|
child.stderr.on("data", (b) => (stderr += b.toString("utf8")));
|
|
67
61
|
child.on("error", reject);
|
|
@@ -117,6 +111,33 @@ end tell`;
|
|
|
117
111
|
});
|
|
118
112
|
}
|
|
119
113
|
}
|
|
114
|
+
/**
|
|
115
|
+
* Build the osascript argv for sending an iMessage WITHOUT interpolating
|
|
116
|
+
* user/LLM text into the AppleScript source.
|
|
117
|
+
*
|
|
118
|
+
* The old approach (`send "${text}"`) only escaped double-quotes, so a
|
|
119
|
+
* message containing a newline — or a crafted `" & (do shell script "...")`
|
|
120
|
+
* payload — could break out of the string literal and inject AppleScript.
|
|
121
|
+
* Inbound iMessage text is untrusted (anyone who can text the user), so this
|
|
122
|
+
* was a real injection vector.
|
|
123
|
+
*
|
|
124
|
+
* Instead the script is a STATIC `on run argv` program; recipient and text
|
|
125
|
+
* arrive as positional argv items (`item 1`/`item 2 of argv`) that AppleScript
|
|
126
|
+
* never parses as source. No escaping needed; newlines/quotes/backslashes
|
|
127
|
+
* survive verbatim.
|
|
128
|
+
*/
|
|
129
|
+
export function buildOsascriptArgs(recipient, text) {
|
|
130
|
+
const script = `on run argv
|
|
131
|
+
set theRecipient to item 1 of argv
|
|
132
|
+
set theText to item 2 of argv
|
|
133
|
+
tell application "Messages"
|
|
134
|
+
set targetService to first service whose service type = iMessage
|
|
135
|
+
set targetBuddy to buddy theRecipient of targetService
|
|
136
|
+
send theText to targetBuddy
|
|
137
|
+
end tell
|
|
138
|
+
end run`;
|
|
139
|
+
return ["-e", script, recipient, text];
|
|
140
|
+
}
|
|
120
141
|
registerChannel("imessage", (cfg) => {
|
|
121
142
|
const intervalMs = typeof cfg.intervalMs === "number" ? cfg.intervalMs : undefined;
|
|
122
143
|
return new IMessageChannel(intervalMs ? { intervalMs } : {});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"imessage.js","sourceRoot":"","sources":["../../src/channels/imessage.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAOhD,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,UAAU,EAAE,SAAS,CAAC,CAAC;AAE1E,MAAM,OAAO,eAAe;IACjB,IAAI,GAAG,UAAU,CAAC;IACnB,KAAK,CAAkB;IACvB,SAAS,GAAG,CAAC,CAAC;IACd,OAAO,CAA2C;IAClD,OAAO,GAAG,KAAK,CAAC;IAChB,UAAU,CAAS;IAE3B,YAAY,OAAgC,EAAE;QAC5C,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU,IAAI,KAAK,CAAC;IAC7C,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,OAAgD;QAC1D,IAAI,CAAC;YACH,MAAM,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAC3B,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,IAAI,KAAK,CACb,wGAAwG,CACzG,CAAC;QACJ,CAAC;QACD,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,SAAS,GAAG,MAAM,IAAI,CAAC,QAAQ,EAAE,CAAC;QACvC,IAAI,CAAC,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;IAC/D,CAAC;IAEO,KAAK,CAAC,IAAI;QAChB,IAAI,IAAI,CAAC,OAAO;YAAE,OAAO;QACzB,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;QACpB,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YACvD,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;gBAC3B,IAAI,GAAG,CAAC,KAAK,GAAG,IAAI,CAAC,SAAS;oBAAE,IAAI,CAAC,SAAS,GAAG,GAAG,CAAC,KAAK,CAAC;gBAC3D,IAAI,GAAG,CAAC,MAAM;oBAAE,SAAS;gBACzB,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC;oBACnB,OAAO,EAAE,IAAI,CAAC,IAAI;oBAClB,IAAI,EAAE,GAAG,CAAC,MAAM,IAAI,SAAS;oBAC7B,IAAI,EAAE,GAAG,CAAC,IAAI;oBACd,QAAQ,EAAE,GAAG,CAAC,QAAQ;oBACtB,UAAU,EAAE,IAAI,IAAI,EAAE;iBACvB,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CAAC,0BAA2B,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC;QACpE,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;QACvB,CAAC;IACH,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,GAAoB;QAC7B,MAAM,
|
|
1
|
+
{"version":3,"file":"imessage.js","sourceRoot":"","sources":["../../src/channels/imessage.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAOhD,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,UAAU,EAAE,SAAS,CAAC,CAAC;AAE1E,MAAM,OAAO,eAAe;IACjB,IAAI,GAAG,UAAU,CAAC;IACnB,KAAK,CAAkB;IACvB,SAAS,GAAG,CAAC,CAAC;IACd,OAAO,CAA2C;IAClD,OAAO,GAAG,KAAK,CAAC;IAChB,UAAU,CAAS;IAE3B,YAAY,OAAgC,EAAE;QAC5C,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU,IAAI,KAAK,CAAC;IAC7C,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,OAAgD;QAC1D,IAAI,CAAC;YACH,MAAM,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAC3B,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,IAAI,KAAK,CACb,wGAAwG,CACzG,CAAC;QACJ,CAAC;QACD,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,SAAS,GAAG,MAAM,IAAI,CAAC,QAAQ,EAAE,CAAC;QACvC,IAAI,CAAC,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;IAC/D,CAAC;IAEO,KAAK,CAAC,IAAI;QAChB,IAAI,IAAI,CAAC,OAAO;YAAE,OAAO;QACzB,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;QACpB,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YACvD,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;gBAC3B,IAAI,GAAG,CAAC,KAAK,GAAG,IAAI,CAAC,SAAS;oBAAE,IAAI,CAAC,SAAS,GAAG,GAAG,CAAC,KAAK,CAAC;gBAC3D,IAAI,GAAG,CAAC,MAAM;oBAAE,SAAS;gBACzB,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC;oBACnB,OAAO,EAAE,IAAI,CAAC,IAAI;oBAClB,IAAI,EAAE,GAAG,CAAC,MAAM,IAAI,SAAS;oBAC7B,IAAI,EAAE,GAAG,CAAC,IAAI;oBACd,QAAQ,EAAE,GAAG,CAAC,QAAQ;oBACtB,UAAU,EAAE,IAAI,IAAI,EAAE;iBACvB,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CAAC,0BAA2B,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC;QACpE,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;QACvB,CAAC;IACH,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,GAAoB;QAC7B,MAAM,IAAI,GAAG,kBAAkB,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC;QAClD,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YAC1C,MAAM,KAAK,GAAG,KAAK,CAAC,oBAAoB,EAAE,IAAI,CAAC,CAAC;YAChD,IAAI,MAAM,GAAG,EAAE,CAAC;YAChB,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;YAC/D,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;YAC1B,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE,CACzB,IAAI,KAAK,CAAC;gBACR,CAAC,CAAC,OAAO,EAAE;gBACX,CAAC,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,oBAAoB,IAAI,KAAK,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CACpE,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,IAAI;QACR,IAAI,IAAI,CAAC,KAAK;YAAE,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC5C,CAAC;IAEO,KAAK,CAAC,QAAQ;QACpB,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,iCAAiC,CAAC,CAAC;QACpE,MAAM,CAAC,GAAG,QAAQ,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;QACnC,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC1B,CAAC;IAEO,KAAK,CAAC,UAAU,CAAC,KAAa;QASpC,MAAM,GAAG,GAAG;;;mCAGmB,KAAK;gDACQ,CAAC;QAC7C,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;QACtC,MAAM,IAAI,GAEE,EAAE,CAAC;QACf,KAAK,MAAM,IAAI,IAAI,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;YACnC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE;gBAAE,SAAS;YAC3B,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YAC9B,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC;gBAAE,SAAS;YAC/B,IAAI,CAAC,IAAI,CAAC;gBACR,KAAK,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAE,EAAE,EAAE,CAAC;gBAC9B,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC,IAAI,IAAI;gBACxB,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE;gBACpB,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC,KAAK,GAAG;gBACxB,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE;aACzB,CAAC,CAAC;QACL,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAEO,KAAK,CAAC,SAAS,CAAC,GAAW;QACjC,OAAO,MAAM,IAAI,OAAO,CAAS,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACnD,MAAM,KAAK,GAAG,KAAK,CAAC,SAAS,EAAE,CAAC,WAAW,EAAE,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC;YAC5D,IAAI,MAAM,GAAG,EAAE,CAAC;YAChB,IAAI,MAAM,GAAG,EAAE,CAAC;YAChB,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;YAC/D,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;YAC/D,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;YAC1B,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE,CACzB,IAAI,KAAK,CAAC;gBACR,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC;gBACjB,CAAC,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,kBAAkB,IAAI,KAAK,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAClE,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC;CACF;AAED;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,kBAAkB,CAAC,SAAiB,EAAE,IAAY;IAChE,MAAM,MAAM,GAAG;;;;;;;;QAQT,CAAC;IACP,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,CAAC,CAAC;AACzC,CAAC;AAED,eAAe,CAAC,UAAU,EAAE,CAAC,GAAG,EAAE,EAAE;IAClC,MAAM,UAAU,GAAG,OAAO,GAAG,CAAC,UAAU,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC;IACnF,OAAO,IAAI,eAAe,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;AAC/D,CAAC,CAAC,CAAC"}
|
|
@@ -7,7 +7,17 @@ export interface HeartbeatTask {
|
|
|
7
7
|
}
|
|
8
8
|
export interface HeartbeatConfig {
|
|
9
9
|
tasks: HeartbeatTask[];
|
|
10
|
+
/**
|
|
11
|
+
* Max combined (input+output) tokens to spend across all tasks in a single
|
|
12
|
+
* heartbeat invocation. Once exceeded, remaining tasks are skipped (logged,
|
|
13
|
+
* not silently dropped). Guards against the runaway-cost case: a short
|
|
14
|
+
* interval × several actionable desires × deep tool loops can otherwise run
|
|
15
|
+
* to millions of tokens/day unbounded. 0 / unset = no limit.
|
|
16
|
+
*/
|
|
17
|
+
budgetTokens?: number;
|
|
10
18
|
}
|
|
19
|
+
/** Default per-run token ceiling when heartbeat.json doesn't set one. */
|
|
20
|
+
export declare const DEFAULT_HEARTBEAT_BUDGET_TOKENS = 500000;
|
|
11
21
|
export declare function loadHeartbeatConfig(): Promise<HeartbeatConfig>;
|
|
12
22
|
export declare const HEARTBEAT_CONFIG_PATH: string;
|
|
13
23
|
//# sourceMappingURL=config.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/heartbeat/config.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,0FAA0F;IAC1F,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,aAAa,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/heartbeat/config.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,0FAA0F;IAC1F,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,aAAa,EAAE,CAAC;IACvB;;;;;;OAMG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,yEAAyE;AACzE,eAAO,MAAM,+BAA+B,SAAU,CAAC;AAIvD,wBAAsB,mBAAmB,IAAI,OAAO,CAAC,eAAe,CAAC,CAepE;AAED,eAAO,MAAM,qBAAqB,QAAO,CAAC"}
|
package/dist/heartbeat/config.js
CHANGED
|
@@ -2,10 +2,12 @@ import fs from "node:fs/promises";
|
|
|
2
2
|
import path from "node:path";
|
|
3
3
|
import { LISA_HOME } from "../paths.js";
|
|
4
4
|
import { pathExists } from "../fs-utils.js";
|
|
5
|
+
/** Default per-run token ceiling when heartbeat.json doesn't set one. */
|
|
6
|
+
export const DEFAULT_HEARTBEAT_BUDGET_TOKENS = 500_000;
|
|
5
7
|
const FILE = path.join(LISA_HOME, "heartbeat.json");
|
|
6
8
|
export async function loadHeartbeatConfig() {
|
|
7
9
|
if (!(await pathExists(FILE)))
|
|
8
|
-
return { tasks: [] };
|
|
10
|
+
return { tasks: [], budgetTokens: DEFAULT_HEARTBEAT_BUDGET_TOKENS };
|
|
9
11
|
const raw = await fs.readFile(FILE, "utf8");
|
|
10
12
|
let parsed;
|
|
11
13
|
try {
|
|
@@ -14,7 +16,11 @@ export async function loadHeartbeatConfig() {
|
|
|
14
16
|
catch (err) {
|
|
15
17
|
throw new Error(`failed to parse ${FILE}: ${err.message}`);
|
|
16
18
|
}
|
|
17
|
-
return {
|
|
19
|
+
return {
|
|
20
|
+
tasks: parsed.tasks ?? [],
|
|
21
|
+
// Explicit 0 means "no limit"; undefined means "use the default ceiling".
|
|
22
|
+
budgetTokens: parsed.budgetTokens === undefined ? DEFAULT_HEARTBEAT_BUDGET_TOKENS : parsed.budgetTokens,
|
|
23
|
+
};
|
|
18
24
|
}
|
|
19
25
|
export const HEARTBEAT_CONFIG_PATH = FILE;
|
|
20
26
|
//# sourceMappingURL=config.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/heartbeat/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/heartbeat/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAsB5C,yEAAyE;AACzE,MAAM,CAAC,MAAM,+BAA+B,GAAG,OAAO,CAAC;AAEvD,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,gBAAgB,CAAC,CAAC;AAEpD,MAAM,CAAC,KAAK,UAAU,mBAAmB;IACvC,IAAI,CAAC,CAAC,MAAM,UAAU,CAAC,IAAI,CAAC,CAAC;QAAE,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,YAAY,EAAE,+BAA+B,EAAE,CAAC;IACnG,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAC5C,IAAI,MAAuB,CAAC;IAC5B,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAoB,CAAC;IAC9C,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CAAC,mBAAmB,IAAI,KAAM,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC;IACxE,CAAC;IACD,OAAO;QACL,KAAK,EAAE,MAAM,CAAC,KAAK,IAAI,EAAE;QACzB,0EAA0E;QAC1E,YAAY,EACV,MAAM,CAAC,YAAY,KAAK,SAAS,CAAC,CAAC,CAAC,+BAA+B,CAAC,CAAC,CAAC,MAAM,CAAC,YAAY;KAC5F,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,MAAM,qBAAqB,GAAG,IAAI,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../../src/heartbeat/runner.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../../src/heartbeat/runner.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,EAEL,KAAK,aAAa,EACnB,MAAM,aAAa,CAAC;AAmBrB,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,OAAO,CAAC;CACjB;AAED,wBAAsB,gBAAgB,CAAC,IAAI,EAAE;IAC3C,KAAK,EAAE,cAAc,EAAE,CAAC;IACxB,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,WAAW,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB,GAAG,OAAO,CAAC,kBAAkB,EAAE,CAAC,CAgBhC;AAkHD,YAAY,EAAE,aAAa,EAAE,CAAC"}
|
package/dist/heartbeat/runner.js
CHANGED
|
@@ -3,9 +3,11 @@ import { atomicWrite, readTextOrEmpty } from "../fs-utils.js";
|
|
|
3
3
|
import { LISA_HOME } from "../paths.js";
|
|
4
4
|
import { appendDesireProgress, isBorn, listDesires, parseDesireProgress, readDesireProgress, readSeed, } from "../soul/store.js";
|
|
5
5
|
import { withSoulCaller } from "../soul/git.js";
|
|
6
|
+
import { withFileLock } from "../soul/lock.js";
|
|
6
7
|
import { runSubagent } from "../subagent.js";
|
|
7
8
|
import { loadHeartbeatConfig, } from "./config.js";
|
|
8
9
|
const STATE_FILE = path.join(LISA_HOME, "heartbeat-state.json");
|
|
10
|
+
const RUN_LOCK = path.join(LISA_HOME, "heartbeat.lock");
|
|
9
11
|
const HEARTBEAT_SYSTEM = `You are Lisa running a scheduled heartbeat — autonomous time, no user present.
|
|
10
12
|
|
|
11
13
|
Two flavors of heartbeat task land here:
|
|
@@ -16,7 +18,27 @@ Be quiet by default — only produce a final message if something is worth telli
|
|
|
16
18
|
|
|
17
19
|
You have the full Lisa toolset, including soul_patch / soul_journal / soul_feel — use them freely. The system prompt above contains your full soul state. This is your time.`;
|
|
18
20
|
export async function runHeartbeatOnce(opts) {
|
|
21
|
+
// Run-level lock: if launchd/cron fires a new heartbeat while the previous
|
|
22
|
+
// one is still running (long desires + short interval), skip rather than
|
|
23
|
+
// double-run and race on soul state. timeoutMs:0 → fail fast, don't wait.
|
|
24
|
+
try {
|
|
25
|
+
return await withFileLock(RUN_LOCK, () => runHeartbeatInner(opts), {
|
|
26
|
+
timeoutMs: 0,
|
|
27
|
+
staleMs: 6 * 60 * 60_000, // 6h: a heartbeat that's been "running" longer is surely dead
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
catch (err) {
|
|
31
|
+
if (err.message?.includes("timed out acquiring lock")) {
|
|
32
|
+
console.error("[heartbeat] another heartbeat is already running — skipping this tick");
|
|
33
|
+
return [];
|
|
34
|
+
}
|
|
35
|
+
throw err;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
async function runHeartbeatInner(opts) {
|
|
19
39
|
const cfg = await loadHeartbeatConfig();
|
|
40
|
+
const budget = cfg.budgetTokens && cfg.budgetTokens > 0 ? cfg.budgetTokens : Infinity;
|
|
41
|
+
let tokensSpent = 0;
|
|
20
42
|
const desires = (await listDesires()).filter((d) => d.actionable && d.heartbeatPrompt);
|
|
21
43
|
const desireTasks = await Promise.all(desires.map(async (d) => {
|
|
22
44
|
const progress = await readDesireProgress(d.slug);
|
|
@@ -43,6 +65,13 @@ export async function runHeartbeatOnce(opts) {
|
|
|
43
65
|
continue;
|
|
44
66
|
if (opts.taskFilter && task.name !== opts.taskFilter)
|
|
45
67
|
continue;
|
|
68
|
+
// Token budget: stop launching tasks once we've spent the per-run
|
|
69
|
+
// ceiling. We check BEFORE each task (not mid-task) so a single task can
|
|
70
|
+
// overshoot slightly, but a long queue of desires can't run unbounded.
|
|
71
|
+
if (tokensSpent >= budget) {
|
|
72
|
+
console.error(`[heartbeat] token budget reached (${tokensSpent}/${budget}) — skipping remaining tasks`);
|
|
73
|
+
break;
|
|
74
|
+
}
|
|
46
75
|
// For desire tasks, snapshot the progress entry count before so we can
|
|
47
76
|
// detect whether Lisa actually called desire_progress_log during the run.
|
|
48
77
|
const desireSlug = task.name.startsWith("desire:")
|
|
@@ -59,6 +88,7 @@ export async function runHeartbeatOnce(opts) {
|
|
|
59
88
|
signal: opts.signal,
|
|
60
89
|
model: opts.model,
|
|
61
90
|
});
|
|
91
|
+
tokensSpent += (result.inputTokens ?? 0) + (result.outputTokens ?? 0);
|
|
62
92
|
state.lastRunAt[task.name] = new Date().toISOString();
|
|
63
93
|
const trimmed = result.text.trim();
|
|
64
94
|
// Auto-fallback: if a desire heartbeat finished but Lisa didn't log
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runner.js","sourceRoot":"","sources":["../../src/heartbeat/runner.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAC9D,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EACL,oBAAoB,EACpB,MAAM,EACN,WAAW,EACX,mBAAmB,EACnB,kBAAkB,EAClB,QAAQ,GACT,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAE7C,OAAO,EACL,mBAAmB,GAEpB,MAAM,aAAa,CAAC;AAErB,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,sBAAsB,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"runner.js","sourceRoot":"","sources":["../../src/heartbeat/runner.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Claude Code AgentObserver — adapts the existing ClaudeCodeWatcher to the
|
|
3
|
+
* normalized cross-agent interface and registers it in the integration
|
|
4
|
+
* registry.
|
|
5
|
+
*
|
|
6
|
+
* The watcher itself is unchanged (it's well-tested); this is a thin
|
|
7
|
+
* normalization layer: ClaudeSessionInfo → AgentSession. Activity (Tier 2)
|
|
8
|
+
* is attached when the watcher provides it.
|
|
9
|
+
*/
|
|
10
|
+
import type { AgentIntegrationConfig, AgentObserver, AgentSession } from "../types.js";
|
|
11
|
+
export declare class ClaudeCodeObserver implements AgentObserver {
|
|
12
|
+
readonly agent = "claude-code";
|
|
13
|
+
private watcher;
|
|
14
|
+
constructor(cfg: AgentIntegrationConfig);
|
|
15
|
+
start(emit: (s: AgentSession) => void): Promise<void>;
|
|
16
|
+
list(): AgentSession[];
|
|
17
|
+
stop(): Promise<void>;
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=observer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"observer.d.ts","sourceRoot":"","sources":["../../../src/integrations/claude-code/observer.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH,OAAO,KAAK,EACV,sBAAsB,EACtB,aAAa,EACb,YAAY,EACb,MAAM,aAAa,CAAC;AAerB,qBAAa,kBAAmB,YAAW,aAAa;IACtD,QAAQ,CAAC,KAAK,iBAAiB;IAC/B,OAAO,CAAC,OAAO,CAAoB;gBAEvB,GAAG,EAAE,sBAAsB;IAWjC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE,YAAY,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAc3D,IAAI,IAAI,YAAY,EAAE;IAIhB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;CAG5B"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Claude Code AgentObserver — adapts the existing ClaudeCodeWatcher to the
|
|
3
|
+
* normalized cross-agent interface and registers it in the integration
|
|
4
|
+
* registry.
|
|
5
|
+
*
|
|
6
|
+
* The watcher itself is unchanged (it's well-tested); this is a thin
|
|
7
|
+
* normalization layer: ClaudeSessionInfo → AgentSession. Activity (Tier 2)
|
|
8
|
+
* is attached when the watcher provides it.
|
|
9
|
+
*/
|
|
10
|
+
import { ClaudeCodeWatcher } from "./watcher.js";
|
|
11
|
+
import { registerIntegration } from "../registry.js";
|
|
12
|
+
function toAgentSession(info) {
|
|
13
|
+
return {
|
|
14
|
+
agent: "claude-code",
|
|
15
|
+
sessionId: info.sessionId,
|
|
16
|
+
project: info.projectLabel,
|
|
17
|
+
cwd: info.cwd,
|
|
18
|
+
state: info.state,
|
|
19
|
+
stateReason: info.stateReason,
|
|
20
|
+
lastMtime: info.lastMtime,
|
|
21
|
+
activity: info.activity,
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
export class ClaudeCodeObserver {
|
|
25
|
+
agent = "claude-code";
|
|
26
|
+
watcher;
|
|
27
|
+
constructor(cfg) {
|
|
28
|
+
// Tier 2: compute structural activity when visibility is "activity" or
|
|
29
|
+
// "intent". At "metadata"/"off" we stay metadata-only (cheaper, and the
|
|
30
|
+
// privacy-minimal default).
|
|
31
|
+
const computeActivity = cfg.visibility === "activity" || cfg.visibility === "intent";
|
|
32
|
+
this.watcher = new ClaudeCodeWatcher({
|
|
33
|
+
log: (m) => console.error(m),
|
|
34
|
+
computeActivity,
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
async start(emit) {
|
|
38
|
+
// The watcher's "update" payload is a lightweight ClaudeSessionUpdate
|
|
39
|
+
// (no lastMtime/activity), so we re-derive the full session from the
|
|
40
|
+
// current snapshot by sessionId. listActive() includes the just-updated
|
|
41
|
+
// session (its mtime is current), so the lookup succeeds.
|
|
42
|
+
this.watcher.on("update", (payload) => {
|
|
43
|
+
const info = this.watcher
|
|
44
|
+
.listActive()
|
|
45
|
+
.find((s) => s.sessionId === payload.sessionId);
|
|
46
|
+
if (info)
|
|
47
|
+
emit(toAgentSession(info));
|
|
48
|
+
});
|
|
49
|
+
await this.watcher.start();
|
|
50
|
+
}
|
|
51
|
+
list() {
|
|
52
|
+
return this.watcher.listActive().map(toAgentSession);
|
|
53
|
+
}
|
|
54
|
+
async stop() {
|
|
55
|
+
this.watcher.stop();
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
registerIntegration("claude-code", (cfg) => new ClaudeCodeObserver(cfg));
|
|
59
|
+
//# sourceMappingURL=observer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"observer.js","sourceRoot":"","sources":["../../../src/integrations/claude-code/observer.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,iBAAiB,EAA0B,MAAM,cAAc,CAAC;AACzE,OAAO,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAOrD,SAAS,cAAc,CAAC,IAAuB;IAC7C,OAAO;QACL,KAAK,EAAE,aAAa;QACpB,SAAS,EAAE,IAAI,CAAC,SAAS;QACzB,OAAO,EAAE,IAAI,CAAC,YAAY;QAC1B,GAAG,EAAE,IAAI,CAAC,GAAG;QACb,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,WAAW,EAAE,IAAI,CAAC,WAAW;QAC7B,SAAS,EAAE,IAAI,CAAC,SAAS;QACzB,QAAQ,EAAE,IAAI,CAAC,QAAQ;KACxB,CAAC;AACJ,CAAC;AAED,MAAM,OAAO,kBAAkB;IACpB,KAAK,GAAG,aAAa,CAAC;IACvB,OAAO,CAAoB;IAEnC,YAAY,GAA2B;QACrC,uEAAuE;QACvE,wEAAwE;QACxE,4BAA4B;QAC5B,MAAM,eAAe,GAAG,GAAG,CAAC,UAAU,KAAK,UAAU,IAAI,GAAG,CAAC,UAAU,KAAK,QAAQ,CAAC;QACrF,IAAI,CAAC,OAAO,GAAG,IAAI,iBAAiB,CAAC;YACnC,GAAG,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC;YAC5B,eAAe;SAChB,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,IAA+B;QACzC,sEAAsE;QACtE,qEAAqE;QACrE,wEAAwE;QACxE,0DAA0D;QAC1D,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,CAAC,OAA8B,EAAE,EAAE;YAC3D,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO;iBACtB,UAAU,EAAE;iBACZ,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,KAAK,OAAO,CAAC,SAAS,CAAC,CAAC;YAClD,IAAI,IAAI;gBAAE,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC;QACvC,CAAC,CAAC,CAAC;QACH,MAAM,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;IAC7B,CAAC;IAED,IAAI;QACF,OAAO,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;IACvD,CAAC;IAED,KAAK,CAAC,IAAI;QACR,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;IACtB,CAAC;CACF;AAED,mBAAmB,CAAC,aAAa,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,kBAAkB,CAAC,GAAG,CAAC,CAAC,CAAC"}
|
|
@@ -39,6 +39,7 @@
|
|
|
39
39
|
* take the LAST complete line). File deletion mid-parse returns
|
|
40
40
|
* "unknown".
|
|
41
41
|
*/
|
|
42
|
+
import type { SessionActivity } from "../types.js";
|
|
42
43
|
export type ClaudeSessionState = "working" | "waiting" | "error" | "unknown";
|
|
43
44
|
export interface SessionStateInfo {
|
|
44
45
|
state: ClaudeSessionState;
|
|
@@ -53,4 +54,5 @@ export interface SessionStateInfo {
|
|
|
53
54
|
cwd?: string;
|
|
54
55
|
}
|
|
55
56
|
export declare function parseSessionState(filePath: string): Promise<SessionStateInfo>;
|
|
57
|
+
export declare function parseSessionActivity(filePath: string): Promise<SessionActivity | undefined>;
|
|
56
58
|
//# sourceMappingURL=parser.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parser.d.ts","sourceRoot":"","sources":["../../../src/integrations/claude-code/parser.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwCG;
|
|
1
|
+
{"version":3,"file":"parser.d.ts","sourceRoot":"","sources":["../../../src/integrations/claude-code/parser.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwCG;AAGH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAEnD,MAAM,MAAM,kBAAkB,GAAG,SAAS,GAAG,SAAS,GAAG,OAAO,GAAG,SAAS,CAAC;AAE7E,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,kBAAkB,CAAC;IAC1B,iEAAiE;IACjE,MAAM,EAAE,MAAM,CAAC;IACf;;;;;OAKG;IACH,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAgBD,wBAAsB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAoDnF;AAwID,wBAAsB,oBAAoB,CACxC,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,eAAe,GAAG,SAAS,CAAC,CA+GtC"}
|
|
@@ -221,4 +221,157 @@ function readNestedStopReason(e) {
|
|
|
221
221
|
}
|
|
222
222
|
return undefined;
|
|
223
223
|
}
|
|
224
|
+
// ── O2 (Tier 2): structural activity extraction ─────────────────────────────
|
|
225
|
+
//
|
|
226
|
+
// PRIVACY BOUNDARY (tested in parser.test.ts): this function reads ONLY
|
|
227
|
+
// structural metadata from the jsonl:
|
|
228
|
+
// - tool NAMES (tool_use block `.name`)
|
|
229
|
+
// - file PATHS (tool_use `.input.file_path` / `.path` / `.notebook_path`)
|
|
230
|
+
// - command argv[0] (first token of a Bash tool's `.input.command`)
|
|
231
|
+
// - error flags (`is_error`, `hookErrors`)
|
|
232
|
+
// - git branch (top-level `.gitBranch`)
|
|
233
|
+
// - token counts (`.message.usage`)
|
|
234
|
+
// It NEVER extracts or returns: any text block, user prompts, assistant
|
|
235
|
+
// replies, Write/Edit content (`new_string`/`old_string`/`content`), full
|
|
236
|
+
// Bash commands beyond argv[0], Grep patterns, or todo text. The privacy
|
|
237
|
+
// test asserts a unique secret planted in all of those never appears in the
|
|
238
|
+
// output. Keeps the "60-second audit" property of the metadata parser.
|
|
239
|
+
const ACTIVITY_TAIL_BYTES = 64 * 1024;
|
|
240
|
+
const MAX_TOOLS = 6;
|
|
241
|
+
const MAX_FILES = 10;
|
|
242
|
+
const PATH_KEYS = ["file_path", "path", "notebook_path"];
|
|
243
|
+
export async function parseSessionActivity(filePath) {
|
|
244
|
+
let size;
|
|
245
|
+
try {
|
|
246
|
+
const st = await fsp.stat(filePath);
|
|
247
|
+
if (!st.isFile() || st.size === 0)
|
|
248
|
+
return undefined;
|
|
249
|
+
size = st.size;
|
|
250
|
+
}
|
|
251
|
+
catch {
|
|
252
|
+
return undefined;
|
|
253
|
+
}
|
|
254
|
+
let tail;
|
|
255
|
+
try {
|
|
256
|
+
const fd = await fsp.open(filePath, "r");
|
|
257
|
+
try {
|
|
258
|
+
const length = Math.min(ACTIVITY_TAIL_BYTES, size);
|
|
259
|
+
const buf = Buffer.alloc(length);
|
|
260
|
+
await fd.read(buf, 0, length, size - length);
|
|
261
|
+
tail = buf.toString("utf8");
|
|
262
|
+
}
|
|
263
|
+
finally {
|
|
264
|
+
await fd.close();
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
catch {
|
|
268
|
+
return undefined;
|
|
269
|
+
}
|
|
270
|
+
const lines = tail.split("\n").filter(Boolean);
|
|
271
|
+
if (size > ACTIVITY_TAIL_BYTES && lines.length > 0)
|
|
272
|
+
lines.shift();
|
|
273
|
+
let turnCount = 0;
|
|
274
|
+
const toolsInOrder = [];
|
|
275
|
+
const files = [];
|
|
276
|
+
let lastCommandName;
|
|
277
|
+
let lastError;
|
|
278
|
+
let gitBranch;
|
|
279
|
+
let inTok = 0;
|
|
280
|
+
let outTok = 0;
|
|
281
|
+
for (const line of lines) {
|
|
282
|
+
let e;
|
|
283
|
+
try {
|
|
284
|
+
e = JSON.parse(line);
|
|
285
|
+
}
|
|
286
|
+
catch {
|
|
287
|
+
continue;
|
|
288
|
+
}
|
|
289
|
+
if (!e || typeof e !== "object")
|
|
290
|
+
continue;
|
|
291
|
+
const obj = e;
|
|
292
|
+
const type = readString(obj.type);
|
|
293
|
+
if (type && META_TYPES.has(type))
|
|
294
|
+
continue;
|
|
295
|
+
if (!gitBranch)
|
|
296
|
+
gitBranch = readString(obj.gitBranch);
|
|
297
|
+
if (type === "assistant" || type === "user")
|
|
298
|
+
turnCount++;
|
|
299
|
+
if (obj.is_error === true || obj.error === true)
|
|
300
|
+
lastError = "tool error";
|
|
301
|
+
if (typeof obj.hookErrors === "number" && obj.hookErrors > 0) {
|
|
302
|
+
lastError = `${obj.hookErrors} hook error(s)`;
|
|
303
|
+
}
|
|
304
|
+
const msg = obj.message;
|
|
305
|
+
if (!msg || typeof msg !== "object")
|
|
306
|
+
continue;
|
|
307
|
+
const m = msg;
|
|
308
|
+
const usage = m.usage;
|
|
309
|
+
if (usage && typeof usage === "object") {
|
|
310
|
+
const u = usage;
|
|
311
|
+
inTok += toNum(u.input_tokens);
|
|
312
|
+
outTok += toNum(u.output_tokens);
|
|
313
|
+
}
|
|
314
|
+
const content = m.content;
|
|
315
|
+
if (!Array.isArray(content))
|
|
316
|
+
continue;
|
|
317
|
+
for (const block of content) {
|
|
318
|
+
if (!block || typeof block !== "object")
|
|
319
|
+
continue;
|
|
320
|
+
const b = block;
|
|
321
|
+
// ONLY tool_use blocks. "text" blocks (prompts/replies) are skipped
|
|
322
|
+
// entirely — we never read their `.text`.
|
|
323
|
+
if (b.type !== "tool_use")
|
|
324
|
+
continue;
|
|
325
|
+
const name = readString(b.name);
|
|
326
|
+
if (!name)
|
|
327
|
+
continue;
|
|
328
|
+
toolsInOrder.push(name);
|
|
329
|
+
const input = b.input;
|
|
330
|
+
if (!input || typeof input !== "object")
|
|
331
|
+
continue;
|
|
332
|
+
const inp = input;
|
|
333
|
+
for (const k of PATH_KEYS) {
|
|
334
|
+
const p = inp[k];
|
|
335
|
+
if (typeof p === "string" && p) {
|
|
336
|
+
files.push(p);
|
|
337
|
+
break;
|
|
338
|
+
}
|
|
339
|
+
}
|
|
340
|
+
if (name.toLowerCase() === "bash") {
|
|
341
|
+
const cmd = inp.command;
|
|
342
|
+
if (typeof cmd === "string" && cmd.trim()) {
|
|
343
|
+
// argv[0] ONLY — never the full command line.
|
|
344
|
+
lastCommandName = cmd.trim().split(/\s+/)[0];
|
|
345
|
+
}
|
|
346
|
+
}
|
|
347
|
+
}
|
|
348
|
+
}
|
|
349
|
+
if (turnCount === 0 && toolsInOrder.length === 0)
|
|
350
|
+
return undefined;
|
|
351
|
+
return {
|
|
352
|
+
turnCount,
|
|
353
|
+
lastTools: toolsInOrder.slice(-MAX_TOOLS),
|
|
354
|
+
filesTouched: dedupeKeepRecent(files, MAX_FILES),
|
|
355
|
+
lastCommandName,
|
|
356
|
+
lastError,
|
|
357
|
+
gitBranch,
|
|
358
|
+
tokens: inTok || outTok ? { input: inTok, output: outTok } : undefined,
|
|
359
|
+
};
|
|
360
|
+
}
|
|
361
|
+
function toNum(v) {
|
|
362
|
+
return typeof v === "number" && Number.isFinite(v) ? v : 0;
|
|
363
|
+
}
|
|
364
|
+
/** Dedupe paths keeping each one's most-recent position; cap to `max`. */
|
|
365
|
+
function dedupeKeepRecent(items, max) {
|
|
366
|
+
const seen = new Set();
|
|
367
|
+
const out = [];
|
|
368
|
+
for (let i = items.length - 1; i >= 0; i--) {
|
|
369
|
+
const it = items[i];
|
|
370
|
+
if (!seen.has(it)) {
|
|
371
|
+
seen.add(it);
|
|
372
|
+
out.unshift(it);
|
|
373
|
+
}
|
|
374
|
+
}
|
|
375
|
+
return out.slice(-max);
|
|
376
|
+
}
|
|
224
377
|
//# sourceMappingURL=parser.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parser.js","sourceRoot":"","sources":["../../../src/integrations/claude-code/parser.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwCG;AAEH,OAAO,GAAG,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"parser.js","sourceRoot":"","sources":["../../../src/integrations/claude-code/parser.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwCG;AAEH,OAAO,GAAG,MAAM,kBAAkB,CAAC;AAkBnC,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC;IACzB,UAAU;IACV,cAAc;IACd,aAAa;IACb,iBAAiB;IACjB,YAAY;IACZ,kEAAkE;IAClE,oEAAoE;IACpE,kEAAkE;IAClE,SAAS;CACV,CAAC,CAAC;AAEH,MAAM,UAAU,GAAG,EAAE,GAAG,IAAI,CAAC;AAE7B,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,QAAgB;IACtD,IAAI,IAAY,CAAC;IACjB,IAAI,CAAC;QACH,MAAM,EAAE,GAAG,MAAM,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACpC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE;YAAE,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC;QACpE,IAAI,GAAG,EAAE,CAAC,IAAI,CAAC;IACjB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,aAAa,EAAE,CAAC;IACrD,CAAC;IACD,IAAI,IAAI,KAAK,CAAC;QAAE,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC;IAE7D,IAAI,IAAY,CAAC;IACjB,IAAI,CAAC;QACH,MAAM,EAAE,GAAG,MAAM,GAAG,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;QACzC,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;YAC1C,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;YACjC,MAAM,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,EAAE,MAAM,EAAE,IAAI,GAAG,MAAM,CAAC,CAAC;YAC7C,IAAI,GAAG,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QAC9B,CAAC;gBAAS,CAAC;YACT,MAAM,EAAE,CAAC,KAAK,EAAE,CAAC;QACnB,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,aAAa,EAAE,CAAC;IACrD,CAAC;IAED,sEAAsE;IACtE,qEAAqE;IACrE,8DAA8D;IAC9D,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAC/C,IAAI,IAAI,GAAG,UAAU,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC;QAAE,KAAK,CAAC,KAAK,EAAE,CAAC;IAEzD,mEAAmE;IACnE,kEAAkE;IAClE,oEAAoE;IACpE,kCAAkC;IAClC,IAAI,QAA4B,CAAC;IACjC,IAAI,QAAQ,GAA4B,IAAI,CAAC;IAC7C,KAAK,IAAI,CAAC,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC3C,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAE,CAAC;QACvB,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,QAAQ,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;QAC5B,CAAC;QACD,IAAI,QAAQ,KAAK,IAAI,EAAE,CAAC;YACtB,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;QAC1B,CAAC;QACD,IAAI,QAAQ,KAAK,IAAI,IAAI,QAAQ;YAAE,MAAM;IAC3C,CAAC;IACD,IAAI,QAAQ,KAAK,IAAI,EAAE,CAAC;QACtB,OAAO,EAAE,GAAG,QAAQ,EAAE,GAAG,EAAE,QAAQ,EAAE,CAAC;IACxC,CAAC;IACD,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,GAAG,EAAE,QAAQ,EAAE,CAAC;AAClE,CAAC;AAED;;;;;;GAMG;AACH,SAAS,QAAQ,CAAC,IAAY;IAC5B,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC7B,IAAI,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;YACnC,MAAM,GAAG,GAAI,GAA+B,CAAC,GAAG,CAAC;YACjD,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC;gBAAE,OAAO,GAAG,CAAC;QACjE,CAAC;IACH,CAAC;IAAC,MAAM,CAAC,CAAC,UAAU,CAAC,CAAC;IACtB,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;;;;;;GAOG;AACH,SAAS,MAAM,CAAC,IAAY;IAC1B,IAAI,KAAc,CAAC;IACnB,IAAI,CAAC;QACH,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC3B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC;IACrD,MAAM,CAAC,GAAG,KAAgC,CAAC;IAE3C,MAAM,IAAI,GAAG,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IAChC,IAAI,CAAC,IAAI;QAAE,OAAO,IAAI,CAAC;IACvB,IAAI,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IAEtC,iEAAiE;IACjE,kEAAkE;IAClE,uEAAuE;IACvE,MAAM,UAAU,GAAG,oBAAoB,CAAC,CAAC,CAAC,CAAC;IAC3C,MAAM,OAAO,GAAG,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;IACtC,MAAM,OAAO,GAAG,CAAC,CAAC,QAAQ,KAAK,IAAI,IAAI,CAAC,CAAC,KAAK,KAAK,IAAI,CAAC;IACxD,MAAM,UAAU,GAAG,OAAO,CAAC,CAAC,UAAU,KAAK,QAAQ,IAAK,CAAC,CAAC,UAAqB,GAAG,CAAC,CAAC;IAEpF,IAAI,OAAO,IAAI,UAAU,EAAE,CAAC;QAC1B,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC;IAChD,CAAC;IAED,IAAI,IAAI,KAAK,WAAW,EAAE,CAAC;QACzB,+DAA+D;QAC/D,kEAAkE;QAClE,+DAA+D;QAC/D,iEAAiE;QACjE,iEAAiE;QACjE,qDAAqD;QACrD,IAAI,UAAU,KAAK,UAAU;YAAO,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC;QACpF,IAAI,UAAU,KAAK,UAAU;YAAO,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC;QACpF,IAAI,UAAU,KAAK,YAAY;YAAK,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC;QACtF,IAAI,UAAU,KAAK,eAAe;YAAE,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,eAAe,EAAE,CAAC;QACzF,+DAA+D;QAC/D,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC;IACnD,CAAC;IAED,IAAI,IAAI,KAAK,MAAM,EAAE,CAAC;QACpB,iEAAiE;QACjE,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;IAC9C,CAAC;IAED,IAAI,IAAI,KAAK,UAAU,EAAE,CAAC;QACxB,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC;IAClD,CAAC;IAED,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;QACtB,yDAAyD;QACzD,+DAA+D;QAC/D,6CAA6C;QAC7C,IAAI,OAAO,IAAI,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;YAC3C,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC;QACpD,CAAC;QACD,qDAAqD;QACrD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,gEAAgE;IAChE,kEAAkE;IAClE,oBAAoB;IACpB,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,UAAU,CAAC,CAAU;IAC5B,OAAO,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AAC/C,CAAC;AAED;;;;GAIG;AACH,SAAS,oBAAoB,CAAC,CAA0B;IACtD,MAAM,MAAM,GAAG,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,UAAU,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC;IACrE,IAAI,MAAM;QAAE,OAAO,MAAM,CAAC;IAC1B,MAAM,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC;IACtB,IAAI,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;QACnC,MAAM,CAAC,GAAG,GAA8B,CAAC;QACzC,OAAO,UAAU,CAAC,CAAC,CAAC,WAAW,CAAC,IAAI,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC;IAC/D,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,+EAA+E;AAC/E,EAAE;AACF,wEAAwE;AACxE,sCAAsC;AACtC,iDAAiD;AACjD,mFAAmF;AACnF,wEAAwE;AACxE,mDAAmD;AACnD,iDAAiD;AACjD,2CAA2C;AAC3C,wEAAwE;AACxE,0EAA0E;AAC1E,yEAAyE;AACzE,4EAA4E;AAC5E,uEAAuE;AAEvE,MAAM,mBAAmB,GAAG,EAAE,GAAG,IAAI,CAAC;AACtC,MAAM,SAAS,GAAG,CAAC,CAAC;AACpB,MAAM,SAAS,GAAG,EAAE,CAAC;AACrB,MAAM,SAAS,GAAG,CAAC,WAAW,EAAE,MAAM,EAAE,eAAe,CAAC,CAAC;AAEzD,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,QAAgB;IAEhB,IAAI,IAAY,CAAC;IACjB,IAAI,CAAC;QACH,MAAM,EAAE,GAAG,MAAM,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACpC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,IAAI,KAAK,CAAC;YAAE,OAAO,SAAS,CAAC;QACpD,IAAI,GAAG,EAAE,CAAC,IAAI,CAAC;IACjB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,IAAI,IAAY,CAAC;IACjB,IAAI,CAAC;QACH,MAAM,EAAE,GAAG,MAAM,GAAG,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;QACzC,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,mBAAmB,EAAE,IAAI,CAAC,CAAC;YACnD,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;YACjC,MAAM,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,EAAE,MAAM,EAAE,IAAI,GAAG,MAAM,CAAC,CAAC;YAC7C,IAAI,GAAG,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QAC9B,CAAC;gBAAS,CAAC;YACT,MAAM,EAAE,CAAC,KAAK,EAAE,CAAC;QACnB,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAC/C,IAAI,IAAI,GAAG,mBAAmB,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC;QAAE,KAAK,CAAC,KAAK,EAAE,CAAC;IAElE,IAAI,SAAS,GAAG,CAAC,CAAC;IAClB,MAAM,YAAY,GAAa,EAAE,CAAC;IAClC,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,IAAI,eAAmC,CAAC;IACxC,IAAI,SAA6B,CAAC;IAClC,IAAI,SAA6B,CAAC;IAClC,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,IAAI,MAAM,GAAG,CAAC,CAAC;IAEf,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,CAAU,CAAC;QACf,IAAI,CAAC;YACH,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACvB,CAAC;QAAC,MAAM,CAAC;YACP,SAAS;QACX,CAAC;QACD,IAAI,CAAC,CAAC,IAAI,OAAO,CAAC,KAAK,QAAQ;YAAE,SAAS;QAC1C,MAAM,GAAG,GAAG,CAA4B,CAAC;QAEzC,MAAM,IAAI,GAAG,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAClC,IAAI,IAAI,IAAI,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC;YAAE,SAAS;QAE3C,IAAI,CAAC,SAAS;YAAE,SAAS,GAAG,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QACtD,IAAI,IAAI,KAAK,WAAW,IAAI,IAAI,KAAK,MAAM;YAAE,SAAS,EAAE,CAAC;QAEzD,IAAI,GAAG,CAAC,QAAQ,KAAK,IAAI,IAAI,GAAG,CAAC,KAAK,KAAK,IAAI;YAAE,SAAS,GAAG,YAAY,CAAC;QAC1E,IAAI,OAAO,GAAG,CAAC,UAAU,KAAK,QAAQ,IAAI,GAAG,CAAC,UAAU,GAAG,CAAC,EAAE,CAAC;YAC7D,SAAS,GAAG,GAAG,GAAG,CAAC,UAAU,gBAAgB,CAAC;QAChD,CAAC;QAED,MAAM,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC;QACxB,IAAI,CAAC,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ;YAAE,SAAS;QAC9C,MAAM,CAAC,GAAG,GAA8B,CAAC;QAEzC,MAAM,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC;QACtB,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YACvC,MAAM,CAAC,GAAG,KAAgC,CAAC;YAC3C,KAAK,IAAI,KAAK,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC;YAC/B,MAAM,IAAI,KAAK,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC;QACnC,CAAC;QAED,MAAM,OAAO,GAAG,CAAC,CAAC,OAAO,CAAC;QAC1B,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC;YAAE,SAAS;QACtC,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC5B,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ;gBAAE,SAAS;YAClD,MAAM,CAAC,GAAG,KAAgC,CAAC;YAC3C,oEAAoE;YACpE,0CAA0C;YAC1C,IAAI,CAAC,CAAC,IAAI,KAAK,UAAU;gBAAE,SAAS;YACpC,MAAM,IAAI,GAAG,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;YAChC,IAAI,CAAC,IAAI;gBAAE,SAAS;YACpB,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACxB,MAAM,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC;YACtB,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ;gBAAE,SAAS;YAClD,MAAM,GAAG,GAAG,KAAgC,CAAC;YAC7C,KAAK,MAAM,CAAC,IAAI,SAAS,EAAE,CAAC;gBAC1B,MAAM,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;gBACjB,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,EAAE,CAAC;oBAC/B,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;oBACd,MAAM;gBACR,CAAC;YACH,CAAC;YACD,IAAI,IAAI,CAAC,WAAW,EAAE,KAAK,MAAM,EAAE,CAAC;gBAClC,MAAM,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC;gBACxB,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC;oBAC1C,8CAA8C;oBAC9C,eAAe,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC/C,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED,IAAI,SAAS,KAAK,CAAC,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC;IAEnE,OAAO;QACL,SAAS;QACT,SAAS,EAAE,YAAY,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC;QACzC,YAAY,EAAE,gBAAgB,CAAC,KAAK,EAAE,SAAS,CAAC;QAChD,eAAe;QACf,SAAS;QACT,SAAS;QACT,MAAM,EAAE,KAAK,IAAI,MAAM,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,SAAS;KACvE,CAAC;AACJ,CAAC;AAED,SAAS,KAAK,CAAC,CAAU;IACvB,OAAO,OAAO,CAAC,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAC7D,CAAC;AAED,0EAA0E;AAC1E,SAAS,gBAAgB,CAAC,KAAe,EAAE,GAAW;IACpD,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,MAAM,GAAG,GAAa,EAAE,CAAC;IACzB,KAAK,IAAI,CAAC,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC3C,MAAM,EAAE,GAAG,KAAK,CAAC,CAAC,CAAE,CAAC;QACrB,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC;YAClB,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YACb,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QAClB,CAAC;IACH,CAAC;IACD,OAAO,GAAG,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC;AACzB,CAAC"}
|
|
@@ -36,6 +36,7 @@
|
|
|
36
36
|
*/
|
|
37
37
|
import { EventEmitter } from "node:events";
|
|
38
38
|
import { type ClaudeSessionState } from "./parser.js";
|
|
39
|
+
import type { SessionActivity } from "../types.js";
|
|
39
40
|
/**
|
|
40
41
|
* One row in the in-memory session map. We hold mtime + size only —
|
|
41
42
|
* never any jsonl content.
|
|
@@ -61,6 +62,12 @@ export interface ClaudeSessionInfo {
|
|
|
61
62
|
* command". Undefined if the jsonl didn't record it.
|
|
62
63
|
*/
|
|
63
64
|
cwd?: string;
|
|
65
|
+
/**
|
|
66
|
+
* O2 (Tier-2): structural activity (tool names, files touched, last
|
|
67
|
+
* command, error, tokens). Populated when visibility ≥ "activity".
|
|
68
|
+
* Privacy: structural metadata only — never conversation content.
|
|
69
|
+
*/
|
|
70
|
+
activity?: SessionActivity;
|
|
64
71
|
}
|
|
65
72
|
export interface ClaudeSessionUpdate {
|
|
66
73
|
event: "new" | "message" | "state_changed";
|
|
@@ -80,9 +87,11 @@ export declare class ClaudeCodeWatcher extends EventEmitter {
|
|
|
80
87
|
private repollTimer;
|
|
81
88
|
private pendingChanges;
|
|
82
89
|
private readonly log;
|
|
90
|
+
private readonly computeActivity;
|
|
83
91
|
private started;
|
|
84
92
|
constructor(opts?: {
|
|
85
93
|
log?: Log;
|
|
94
|
+
computeActivity?: boolean;
|
|
86
95
|
});
|
|
87
96
|
/** Begin watching. Idempotent. Survives ~/.claude/projects not existing yet. */
|
|
88
97
|
start(): Promise<void>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"watcher.d.ts","sourceRoot":"","sources":["../../../src/integrations/claude-code/watcher.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCG;AAMH,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,
|
|
1
|
+
{"version":3,"file":"watcher.d.ts","sourceRoot":"","sources":["../../../src/integrations/claude-code/watcher.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCG;AAMH,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAA2C,KAAK,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAC/F,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAkCnD;;;GAGG;AACH,MAAM,WAAW,iBAAiB;IAChC,uDAAuD;IACvD,cAAc,EAAE,MAAM,CAAC;IACvB,6CAA6C;IAC7C,YAAY,EAAE,MAAM,CAAC;IACrB,+CAA+C;IAC/C,SAAS,EAAE,MAAM,CAAC;IAClB,wCAAwC;IACxC,SAAS,EAAE,MAAM,CAAC;IAClB,wDAAwD;IACxD,IAAI,EAAE,MAAM,CAAC;IACb,8CAA8C;IAC9C,KAAK,EAAE,kBAAkB,CAAC;IAC1B,sEAAsE;IACtE,WAAW,EAAE,MAAM,CAAC;IACpB;;;;OAIG;IACH,GAAG,CAAC,EAAE,MAAM,CAAC;IACb;;;;OAIG;IACH,QAAQ,CAAC,EAAE,eAAe,CAAC;CAC5B;AAED,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,KAAK,GAAG,SAAS,GAAG,eAAe,CAAC;IAC3C,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,kBAAkB,CAAC;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;CACZ;AAED,KAAK,GAAG,GAAG,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;AAEjC,qBAAa,iBAAkB,SAAQ,YAAY;IACjD,OAAO,CAAC,QAAQ,CAAwC;IACxD,OAAO,CAAC,OAAO,CAA6B;IAC5C,OAAO,CAAC,UAAU,CAA+B;IACjD,OAAO,CAAC,WAAW,CAA+B;IAClD,OAAO,CAAC,cAAc,CAAqC;IAC3D,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAM;IAC1B,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAU;IAC1C,OAAO,CAAC,OAAO,CAAS;gBAEZ,IAAI,GAAE;QAAE,GAAG,CAAC,EAAE,GAAG,CAAC;QAAC,eAAe,CAAC,EAAE,OAAO,CAAA;KAAO;IAS/D,gFAAgF;IAC1E,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAQ5B,IAAI,IAAI,IAAI;IAWZ,kEAAkE;IAClE,UAAU,IAAI,iBAAiB,EAAE;YAUnB,WAAW;YA8BX,cAAc;YAgBd,aAAa;IA8B3B,OAAO,CAAC,aAAa;IAQrB;;;;OAIG;IACH,OAAO,CAAC,aAAa;YAcP,IAAI;IAoClB,OAAO,CAAC,UAAU;IAclB,OAAO,CAAC,QAAQ;IA4DhB;;;;;;;;;OASG;IACH,OAAO,CAAC,eAAe;YAUT,YAAY;CAuB3B;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAM1D;AAED,eAAO,MAAM,mBAAmB,QAAe,CAAC"}
|