@nxuss/lemma 1.44.0 → 1.45.1

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 (207) hide show
  1. package/README.md +59 -8
  2. package/bin/brain-ingest.js +30 -13
  3. package/dist/cjs/cli/hostHooks.d.ts +38 -7
  4. package/dist/cjs/cli/hostHooks.d.ts.map +1 -1
  5. package/dist/cjs/cli/hostHooks.js +189 -9
  6. package/dist/cjs/cli/hostHooks.js.map +1 -1
  7. package/dist/cjs/cli/lemma-proxy.d.ts.map +1 -1
  8. package/dist/cjs/cli/lemma-proxy.js +13 -16
  9. package/dist/cjs/cli/lemma-proxy.js.map +1 -1
  10. package/dist/cjs/cloud/billing/stripeApi.d.ts.map +1 -1
  11. package/dist/cjs/cloud/billing/stripeApi.js +6 -1
  12. package/dist/cjs/cloud/billing/stripeApi.js.map +1 -1
  13. package/dist/cjs/cloud/billing/stripeWebhook.d.ts.map +1 -1
  14. package/dist/cjs/cloud/billing/stripeWebhook.js +5 -0
  15. package/dist/cjs/cloud/billing/stripeWebhook.js.map +1 -1
  16. package/dist/cjs/cloud/console/consoleRouter.d.ts +2 -2
  17. package/dist/cjs/cloud/console/consoleRouter.d.ts.map +1 -1
  18. package/dist/cjs/cloud/console/consoleRouter.js +39 -1
  19. package/dist/cjs/cloud/console/consoleRouter.js.map +1 -1
  20. package/dist/cjs/cloud/console/mailer.d.ts +2 -0
  21. package/dist/cjs/cloud/console/mailer.d.ts.map +1 -1
  22. package/dist/cjs/cloud/console/mailer.js +3 -1
  23. package/dist/cjs/cloud/console/mailer.js.map +1 -1
  24. package/dist/cjs/cloud/identity/PlanPolicy.d.ts +26 -5
  25. package/dist/cjs/cloud/identity/PlanPolicy.d.ts.map +1 -1
  26. package/dist/cjs/cloud/identity/PlanPolicy.js +56 -16
  27. package/dist/cjs/cloud/identity/PlanPolicy.js.map +1 -1
  28. package/dist/cjs/cloud/identity/TenantResolver.d.ts +2 -0
  29. package/dist/cjs/cloud/identity/TenantResolver.d.ts.map +1 -1
  30. package/dist/cjs/cloud/identity/TenantResolver.js +1 -1
  31. package/dist/cjs/cloud/identity/TenantResolver.js.map +1 -1
  32. package/dist/cjs/cloud/identity/authenticateV2.js +1 -1
  33. package/dist/cjs/cloud/identity/authenticateV2.js.map +1 -1
  34. package/dist/cjs/cloud/identity/identityStore.d.ts +11 -0
  35. package/dist/cjs/cloud/identity/identityStore.d.ts.map +1 -1
  36. package/dist/cjs/cloud/identity/identityStore.js +26 -9
  37. package/dist/cjs/cloud/identity/identityStore.js.map +1 -1
  38. package/dist/cjs/cloud/metering/PostgresLedgerStore.d.ts +3 -1
  39. package/dist/cjs/cloud/metering/PostgresLedgerStore.d.ts.map +1 -1
  40. package/dist/cjs/cloud/metering/PostgresLedgerStore.js +12 -0
  41. package/dist/cjs/cloud/metering/PostgresLedgerStore.js.map +1 -1
  42. package/dist/cjs/cloud/metering/UsageLedger.d.ts +37 -0
  43. package/dist/cjs/cloud/metering/UsageLedger.d.ts.map +1 -1
  44. package/dist/cjs/cloud/metering/UsageLedger.js +42 -0
  45. package/dist/cjs/cloud/metering/UsageLedger.js.map +1 -1
  46. package/dist/cjs/cloud/store/FileBrainStore.d.ts +5 -1
  47. package/dist/cjs/cloud/store/FileBrainStore.d.ts.map +1 -1
  48. package/dist/cjs/cloud/store/FileBrainStore.js +5 -0
  49. package/dist/cjs/cloud/store/FileBrainStore.js.map +1 -1
  50. package/dist/cjs/cloud/store/PostgresBrainStore.d.ts +10 -1
  51. package/dist/cjs/cloud/store/PostgresBrainStore.d.ts.map +1 -1
  52. package/dist/cjs/cloud/store/PostgresBrainStore.js +28 -0
  53. package/dist/cjs/cloud/store/PostgresBrainStore.js.map +1 -1
  54. package/dist/cjs/cloud/store/memorySummary.d.ts +29 -0
  55. package/dist/cjs/cloud/store/memorySummary.d.ts.map +1 -0
  56. package/dist/cjs/cloud/store/memorySummary.js +66 -0
  57. package/dist/cjs/cloud/store/memorySummary.js.map +1 -0
  58. package/dist/cjs/cloud/v2/routes/admin.d.ts.map +1 -1
  59. package/dist/cjs/cloud/v2/routes/admin.js +20 -5
  60. package/dist/cjs/cloud/v2/routes/admin.js.map +1 -1
  61. package/dist/cjs/cloud/v2/routes/memories.js +1 -1
  62. package/dist/cjs/cloud/v2/routes/memories.js.map +1 -1
  63. package/dist/cjs/cloud/v2/routes/tenant.d.ts +1 -0
  64. package/dist/cjs/cloud/v2/routes/tenant.d.ts.map +1 -1
  65. package/dist/cjs/cloud/v2/routes/tenant.js +4 -1
  66. package/dist/cjs/cloud/v2/routes/tenant.js.map +1 -1
  67. package/dist/cjs/contracts/api-v2.types.d.ts +2 -0
  68. package/dist/cjs/contracts/api-v2.types.d.ts.map +1 -1
  69. package/dist/cjs/contracts/store.d.ts +35 -0
  70. package/dist/cjs/contracts/store.d.ts.map +1 -1
  71. package/dist/cjs/mcp/index.js +4 -1
  72. package/dist/cjs/mcp/index.js.map +1 -1
  73. package/dist/cjs/mcp/tools/misc.d.ts.map +1 -1
  74. package/dist/cjs/mcp/tools/misc.js +2 -1
  75. package/dist/cjs/mcp/tools/misc.js.map +1 -1
  76. package/dist/cjs/mcp/tools/workspace.d.ts.map +1 -1
  77. package/dist/cjs/mcp/tools/workspace.js +4 -1
  78. package/dist/cjs/mcp/tools/workspace.js.map +1 -1
  79. package/dist/cjs/mcp/tools.d.ts +10 -0
  80. package/dist/cjs/mcp/tools.d.ts.map +1 -1
  81. package/dist/cjs/mcp/tools.js +47 -12
  82. package/dist/cjs/mcp/tools.js.map +1 -1
  83. package/dist/cjs/subconscious/HostRecall.d.ts.map +1 -1
  84. package/dist/cjs/subconscious/HostRecall.js +11 -4
  85. package/dist/cjs/subconscious/HostRecall.js.map +1 -1
  86. package/dist/cjs/utils/FixCapture.d.ts +7 -5
  87. package/dist/cjs/utils/FixCapture.d.ts.map +1 -1
  88. package/dist/cjs/utils/FixCapture.js +64 -32
  89. package/dist/cjs/utils/FixCapture.js.map +1 -1
  90. package/dist/cjs/utils/NoTerminal.d.ts +27 -0
  91. package/dist/cjs/utils/NoTerminal.d.ts.map +1 -0
  92. package/dist/cjs/utils/NoTerminal.js +37 -0
  93. package/dist/cjs/utils/NoTerminal.js.map +1 -0
  94. package/dist/cjs/utils/OpenCodeSession.d.ts +70 -0
  95. package/dist/cjs/utils/OpenCodeSession.d.ts.map +1 -0
  96. package/dist/cjs/utils/OpenCodeSession.js +154 -0
  97. package/dist/cjs/utils/OpenCodeSession.js.map +1 -0
  98. package/dist/cjs/utils/SessionCapture.d.ts +29 -7
  99. package/dist/cjs/utils/SessionCapture.d.ts.map +1 -1
  100. package/dist/cjs/utils/SessionCapture.js +180 -32
  101. package/dist/cjs/utils/SessionCapture.js.map +1 -1
  102. package/dist/cjs/utils/TestAutofixInterceptor.d.ts.map +1 -1
  103. package/dist/cjs/utils/TestAutofixInterceptor.js +2 -0
  104. package/dist/cjs/utils/TestAutofixInterceptor.js.map +1 -1
  105. package/dist/esm/cli/hostHooks.d.ts +38 -7
  106. package/dist/esm/cli/hostHooks.d.ts.map +1 -1
  107. package/dist/esm/cli/hostHooks.js +187 -8
  108. package/dist/esm/cli/hostHooks.js.map +1 -1
  109. package/dist/esm/cli/lemma-proxy.d.ts.map +1 -1
  110. package/dist/esm/cli/lemma-proxy.js +14 -17
  111. package/dist/esm/cli/lemma-proxy.js.map +1 -1
  112. package/dist/esm/cloud/billing/stripeApi.d.ts.map +1 -1
  113. package/dist/esm/cloud/billing/stripeApi.js +6 -1
  114. package/dist/esm/cloud/billing/stripeApi.js.map +1 -1
  115. package/dist/esm/cloud/billing/stripeWebhook.d.ts.map +1 -1
  116. package/dist/esm/cloud/billing/stripeWebhook.js +5 -0
  117. package/dist/esm/cloud/billing/stripeWebhook.js.map +1 -1
  118. package/dist/esm/cloud/console/consoleRouter.d.ts +2 -2
  119. package/dist/esm/cloud/console/consoleRouter.d.ts.map +1 -1
  120. package/dist/esm/cloud/console/consoleRouter.js +39 -1
  121. package/dist/esm/cloud/console/consoleRouter.js.map +1 -1
  122. package/dist/esm/cloud/console/mailer.d.ts +2 -0
  123. package/dist/esm/cloud/console/mailer.d.ts.map +1 -1
  124. package/dist/esm/cloud/console/mailer.js +3 -1
  125. package/dist/esm/cloud/console/mailer.js.map +1 -1
  126. package/dist/esm/cloud/identity/PlanPolicy.d.ts +26 -5
  127. package/dist/esm/cloud/identity/PlanPolicy.d.ts.map +1 -1
  128. package/dist/esm/cloud/identity/PlanPolicy.js +54 -15
  129. package/dist/esm/cloud/identity/PlanPolicy.js.map +1 -1
  130. package/dist/esm/cloud/identity/TenantResolver.d.ts +2 -0
  131. package/dist/esm/cloud/identity/TenantResolver.d.ts.map +1 -1
  132. package/dist/esm/cloud/identity/TenantResolver.js +1 -1
  133. package/dist/esm/cloud/identity/TenantResolver.js.map +1 -1
  134. package/dist/esm/cloud/identity/authenticateV2.js +1 -1
  135. package/dist/esm/cloud/identity/authenticateV2.js.map +1 -1
  136. package/dist/esm/cloud/identity/identityStore.d.ts +11 -0
  137. package/dist/esm/cloud/identity/identityStore.d.ts.map +1 -1
  138. package/dist/esm/cloud/identity/identityStore.js +26 -9
  139. package/dist/esm/cloud/identity/identityStore.js.map +1 -1
  140. package/dist/esm/cloud/metering/PostgresLedgerStore.d.ts +3 -1
  141. package/dist/esm/cloud/metering/PostgresLedgerStore.d.ts.map +1 -1
  142. package/dist/esm/cloud/metering/PostgresLedgerStore.js +12 -0
  143. package/dist/esm/cloud/metering/PostgresLedgerStore.js.map +1 -1
  144. package/dist/esm/cloud/metering/UsageLedger.d.ts +37 -0
  145. package/dist/esm/cloud/metering/UsageLedger.d.ts.map +1 -1
  146. package/dist/esm/cloud/metering/UsageLedger.js +41 -0
  147. package/dist/esm/cloud/metering/UsageLedger.js.map +1 -1
  148. package/dist/esm/cloud/store/FileBrainStore.d.ts +5 -1
  149. package/dist/esm/cloud/store/FileBrainStore.d.ts.map +1 -1
  150. package/dist/esm/cloud/store/FileBrainStore.js +5 -0
  151. package/dist/esm/cloud/store/FileBrainStore.js.map +1 -1
  152. package/dist/esm/cloud/store/PostgresBrainStore.d.ts +10 -1
  153. package/dist/esm/cloud/store/PostgresBrainStore.d.ts.map +1 -1
  154. package/dist/esm/cloud/store/PostgresBrainStore.js +28 -0
  155. package/dist/esm/cloud/store/PostgresBrainStore.js.map +1 -1
  156. package/dist/esm/cloud/store/memorySummary.d.ts +29 -0
  157. package/dist/esm/cloud/store/memorySummary.d.ts.map +1 -0
  158. package/dist/esm/cloud/store/memorySummary.js +60 -0
  159. package/dist/esm/cloud/store/memorySummary.js.map +1 -0
  160. package/dist/esm/cloud/v2/routes/admin.d.ts.map +1 -1
  161. package/dist/esm/cloud/v2/routes/admin.js +20 -5
  162. package/dist/esm/cloud/v2/routes/admin.js.map +1 -1
  163. package/dist/esm/cloud/v2/routes/memories.js +1 -1
  164. package/dist/esm/cloud/v2/routes/memories.js.map +1 -1
  165. package/dist/esm/cloud/v2/routes/tenant.d.ts +1 -0
  166. package/dist/esm/cloud/v2/routes/tenant.d.ts.map +1 -1
  167. package/dist/esm/cloud/v2/routes/tenant.js +4 -1
  168. package/dist/esm/cloud/v2/routes/tenant.js.map +1 -1
  169. package/dist/esm/contracts/api-v2.types.d.ts +2 -0
  170. package/dist/esm/contracts/api-v2.types.d.ts.map +1 -1
  171. package/dist/esm/contracts/store.d.ts +35 -0
  172. package/dist/esm/contracts/store.d.ts.map +1 -1
  173. package/dist/esm/mcp/index.js +5 -2
  174. package/dist/esm/mcp/index.js.map +1 -1
  175. package/dist/esm/mcp/tools/misc.d.ts.map +1 -1
  176. package/dist/esm/mcp/tools/misc.js +2 -1
  177. package/dist/esm/mcp/tools/misc.js.map +1 -1
  178. package/dist/esm/mcp/tools/workspace.d.ts.map +1 -1
  179. package/dist/esm/mcp/tools/workspace.js +4 -1
  180. package/dist/esm/mcp/tools/workspace.js.map +1 -1
  181. package/dist/esm/mcp/tools.d.ts +10 -0
  182. package/dist/esm/mcp/tools.d.ts.map +1 -1
  183. package/dist/esm/mcp/tools.js +46 -12
  184. package/dist/esm/mcp/tools.js.map +1 -1
  185. package/dist/esm/subconscious/HostRecall.d.ts.map +1 -1
  186. package/dist/esm/subconscious/HostRecall.js +11 -4
  187. package/dist/esm/subconscious/HostRecall.js.map +1 -1
  188. package/dist/esm/utils/FixCapture.d.ts +7 -5
  189. package/dist/esm/utils/FixCapture.d.ts.map +1 -1
  190. package/dist/esm/utils/FixCapture.js +64 -33
  191. package/dist/esm/utils/FixCapture.js.map +1 -1
  192. package/dist/esm/utils/NoTerminal.d.ts +27 -0
  193. package/dist/esm/utils/NoTerminal.d.ts.map +1 -0
  194. package/dist/esm/utils/NoTerminal.js +33 -0
  195. package/dist/esm/utils/NoTerminal.js.map +1 -0
  196. package/dist/esm/utils/OpenCodeSession.d.ts +70 -0
  197. package/dist/esm/utils/OpenCodeSession.d.ts.map +1 -0
  198. package/dist/esm/utils/OpenCodeSession.js +146 -0
  199. package/dist/esm/utils/OpenCodeSession.js.map +1 -0
  200. package/dist/esm/utils/SessionCapture.d.ts +29 -7
  201. package/dist/esm/utils/SessionCapture.d.ts.map +1 -1
  202. package/dist/esm/utils/SessionCapture.js +180 -32
  203. package/dist/esm/utils/SessionCapture.js.map +1 -1
  204. package/dist/esm/utils/TestAutofixInterceptor.d.ts.map +1 -1
  205. package/dist/esm/utils/TestAutofixInterceptor.js +2 -0
  206. package/dist/esm/utils/TestAutofixInterceptor.js.map +1 -1
  207. package/package.json +1 -1
@@ -0,0 +1,27 @@
1
+ /**
2
+ * Spawn options that start a command in its own session, with no controlling terminal.
3
+ *
4
+ * The MCP server runs as a child of the host (Claude Code, Cursor…), which owns the user's terminal,
5
+ * and a command spawned from it inherited that terminal even with every stdio fd piped. Anything that
6
+ * opens /dev/tty then wrote straight onto the host's screen, around the pipes Lemma reads: npm
7
+ * postinstall notices, progress bars, and prompts (ssh, git credential, sudo) that waited on a
8
+ * keyboard the agent cannot type on. The output never reached the agent, and a test asserting on
9
+ * stderr failed only when run through run_workspace_command.
10
+ *
11
+ * `detached` makes libuv call setsid(), so the child has no controlling terminal and /dev/tty fails
12
+ * to open (verified under a pty for spawn and for execSync, which forwards the option). It also makes
13
+ * the child a process-group leader, so a timeout can stop the whole tree (see killTree). On Windows
14
+ * `detached` opens a new console window instead, so it is not set there.
15
+ */
16
+ export declare const NO_TERMINAL: {
17
+ detached?: boolean;
18
+ };
19
+ /**
20
+ * Signal a child spawned with NO_TERMINAL and everything it started: `npm test` runs jest under a
21
+ * shell, and killing only the shell left jest running after the timeout. Falls back to the child alone.
22
+ */
23
+ export declare function killTree(child: {
24
+ pid?: number;
25
+ kill: (signal?: NodeJS.Signals) => boolean;
26
+ }, signal?: NodeJS.Signals): void;
27
+ //# sourceMappingURL=NoTerminal.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NoTerminal.d.ts","sourceRoot":"","sources":["../../../src/utils/NoTerminal.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,WAAW,EAAE;IAAE,QAAQ,CAAC,EAAE,OAAO,CAAA;CAA2D,CAAC;AAE1G;;;GAGG;AACH,wBAAgB,QAAQ,CAAC,KAAK,EAAE;IAAE,GAAG,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,OAAO,KAAK,OAAO,CAAA;CAAE,EAAE,MAAM,GAAE,MAAM,CAAC,OAAmB,GAAG,IAAI,CAUtI"}
@@ -0,0 +1,33 @@
1
+ /**
2
+ * Spawn options that start a command in its own session, with no controlling terminal.
3
+ *
4
+ * The MCP server runs as a child of the host (Claude Code, Cursor…), which owns the user's terminal,
5
+ * and a command spawned from it inherited that terminal even with every stdio fd piped. Anything that
6
+ * opens /dev/tty then wrote straight onto the host's screen, around the pipes Lemma reads: npm
7
+ * postinstall notices, progress bars, and prompts (ssh, git credential, sudo) that waited on a
8
+ * keyboard the agent cannot type on. The output never reached the agent, and a test asserting on
9
+ * stderr failed only when run through run_workspace_command.
10
+ *
11
+ * `detached` makes libuv call setsid(), so the child has no controlling terminal and /dev/tty fails
12
+ * to open (verified under a pty for spawn and for execSync, which forwards the option). It also makes
13
+ * the child a process-group leader, so a timeout can stop the whole tree (see killTree). On Windows
14
+ * `detached` opens a new console window instead, so it is not set there.
15
+ */
16
+ export const NO_TERMINAL = process.platform === "win32" ? {} : { detached: true };
17
+ /**
18
+ * Signal a child spawned with NO_TERMINAL and everything it started: `npm test` runs jest under a
19
+ * shell, and killing only the shell left jest running after the timeout. Falls back to the child alone.
20
+ */
21
+ export function killTree(child, signal = "SIGTERM") {
22
+ if (NO_TERMINAL.detached && child.pid) {
23
+ try {
24
+ process.kill(-child.pid, signal);
25
+ return;
26
+ }
27
+ catch {
28
+ // the group is already gone, or this platform has no groups: fall through
29
+ }
30
+ }
31
+ child.kill(signal);
32
+ }
33
+ //# sourceMappingURL=NoTerminal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NoTerminal.js","sourceRoot":"","sources":["../../../src/utils/NoTerminal.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,MAAM,CAAC,MAAM,WAAW,GAA2B,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;AAE1G;;;GAGG;AACH,MAAM,UAAU,QAAQ,CAAC,KAAmE,EAAE,SAAyB,SAAS;IAC9H,IAAI,WAAW,CAAC,QAAQ,IAAI,KAAK,CAAC,GAAG,EAAE,CAAC;QACtC,IAAI,CAAC;YACH,OAAO,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;YACjC,OAAO;QACT,CAAC;QAAC,MAAM,CAAC;YACP,0EAA0E;QAC5E,CAAC;IACH,CAAC;IACD,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AACrB,CAAC"}
@@ -0,0 +1,70 @@
1
+ /**
2
+ * OpenCode sessions → the hand-off. OpenCode has no SessionEnd hook and no transcript file: its
3
+ * plugin gets the session from the SDK (`client.session.messages`, `client.session.children`) as
4
+ * `{ info, parts }` messages, and subagents are child sessions the `task` tool creates. The plugin
5
+ * `lemma init` installs sends that snapshot here when the session goes idle (and before a
6
+ * compaction); it is rewritten as a Claude Code shaped transcript, subagents beside it in
7
+ * `<name>/subagents/agent-<id>.jsonl` + `.meta.json`, so captureSession builds the same hand-off
8
+ * it builds for Claude Code instead of a second implementation drifting from the first.
9
+ *
10
+ * Measured on OpenCode 1.19.3 (session snapshot from a real `opencode run` with a `task` subagent):
11
+ * tool parts carry `state.input` with `filePath` (read/edit/write) or `command` (bash), and `patch`
12
+ * parts list the files the step changed on disk, which also catches edits made through bash.
13
+ */
14
+ import { SessionCaptureResult } from './SessionCapture.js';
15
+ export interface OpenCodePart {
16
+ type: string;
17
+ text?: string;
18
+ synthetic?: boolean;
19
+ tool?: string;
20
+ callID?: string;
21
+ files?: string[];
22
+ state?: {
23
+ status?: string;
24
+ input?: any;
25
+ output?: string;
26
+ error?: string;
27
+ metadata?: any;
28
+ time?: {
29
+ start?: number;
30
+ end?: number;
31
+ };
32
+ };
33
+ }
34
+ export interface OpenCodeMessage {
35
+ info: {
36
+ role: string;
37
+ time?: {
38
+ created?: number;
39
+ };
40
+ };
41
+ parts: OpenCodePart[];
42
+ }
43
+ export interface OpenCodeSnapshot {
44
+ sessionID: string;
45
+ directory: string;
46
+ messages: OpenCodeMessage[];
47
+ children?: Array<{
48
+ session: {
49
+ id: string;
50
+ title?: string;
51
+ agent?: string;
52
+ };
53
+ messages: OpenCodeMessage[];
54
+ }>;
55
+ }
56
+ /** One OpenCode session as Claude Code transcript events (one JSON object per line). */
57
+ export declare function toClaudeEvents(messages: OpenCodeMessage[], directory: string, sidechain?: string): string[];
58
+ /** Writes the snapshot as `<dir>/<session>.jsonl` plus its subagents, and returns the transcript path. */
59
+ export declare function writeClaudeTranscript(snap: OpenCodeSnapshot, dir?: string): string;
60
+ /**
61
+ * Save (or refresh) the session's hand-off. OpenCode has no session end: `session.idle` fires after
62
+ * every turn, so this runs in the mid-session mode (PreCompact's): it refreshes one hand-off in place
63
+ * and never marks the session done. `compacting` also returns the text to put back in the context.
64
+ */
65
+ export declare function captureOpenCodeSession(snap: OpenCodeSnapshot, opts?: {
66
+ compacting?: boolean;
67
+ }): SessionCaptureResult & {
68
+ text?: string;
69
+ };
70
+ //# sourceMappingURL=OpenCodeSession.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"OpenCodeSession.d.ts","sourceRoot":"","sources":["../../../src/utils/OpenCodeSession.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAKH,OAAO,EAAkB,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AAIxE,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,KAAK,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,GAAG,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,GAAG,CAAC;QAAC,IAAI,CAAC,EAAE;YAAE,KAAK,CAAC,EAAE,MAAM,CAAC;YAAC,GAAG,CAAC,EAAE,MAAM,CAAA;SAAE,CAAA;KAAE,CAAC;CACpI;AACD,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE;YAAE,OAAO,CAAC,EAAE,MAAM,CAAA;SAAE,CAAA;KAAE,CAAC;IACpD,KAAK,EAAE,YAAY,EAAE,CAAC;CACvB;AACD,MAAM,WAAW,gBAAgB;IAC/B,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,eAAe,EAAE,CAAC;IAC5B,QAAQ,CAAC,EAAE,KAAK,CAAC;QAAE,OAAO,EAAE;YAAE,EAAE,EAAE,MAAM,CAAC;YAAC,KAAK,CAAC,EAAE,MAAM,CAAC;YAAC,KAAK,CAAC,EAAE,MAAM,CAAA;SAAE,CAAC;QAAC,QAAQ,EAAE,eAAe,EAAE,CAAA;KAAE,CAAC,CAAC;CAC5G;AAuBD,wFAAwF;AACxF,wBAAgB,cAAc,CAAC,QAAQ,EAAE,eAAe,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAsC3G;AAyBD,0GAA0G;AAC1G,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,gBAAgB,EAAE,GAAG,GAAE,MAAuB,GAAG,MAAM,CAkBlG;AAED;;;;GAIG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,gBAAgB,EAAE,IAAI,GAAE;IAAE,UAAU,CAAC,EAAE,OAAO,CAAA;CAAO,GAAG,oBAAoB,GAAG;IAAE,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,CAO5I"}
@@ -0,0 +1,146 @@
1
+ /**
2
+ * OpenCode sessions → the hand-off. OpenCode has no SessionEnd hook and no transcript file: its
3
+ * plugin gets the session from the SDK (`client.session.messages`, `client.session.children`) as
4
+ * `{ info, parts }` messages, and subagents are child sessions the `task` tool creates. The plugin
5
+ * `lemma init` installs sends that snapshot here when the session goes idle (and before a
6
+ * compaction); it is rewritten as a Claude Code shaped transcript, subagents beside it in
7
+ * `<name>/subagents/agent-<id>.jsonl` + `.meta.json`, so captureSession builds the same hand-off
8
+ * it builds for Claude Code instead of a second implementation drifting from the first.
9
+ *
10
+ * Measured on OpenCode 1.19.3 (session snapshot from a real `opencode run` with a `task` subagent):
11
+ * tool parts carry `state.input` with `filePath` (read/edit/write) or `command` (bash), and `patch`
12
+ * parts list the files the step changed on disk, which also catches edits made through bash.
13
+ */
14
+ import fs from 'fs';
15
+ import os from 'os';
16
+ import path from 'path';
17
+ import { captureSession } from './SessionCapture.js';
18
+ import { compactRecall } from '../subconscious/HostRecall.js';
19
+ import { writeFileAtomic } from './AtomicFile.js';
20
+ const TRANSCRIPT_DIR = path.join(os.tmpdir(), 'lemma-opencode');
21
+ const KEEP_MS = 3 * 24 * 60 * 60 * 1000;
22
+ /** OpenCode tool ids → the names SessionCapture knows. MCP tools arrive as `<server>_<tool>`. */
23
+ const TOOL_NAMES = { read: 'Read', edit: 'Edit', write: 'Write', multiedit: 'MultiEdit', bash: 'Bash', task: 'Agent', grep: 'Grep', glob: 'Glob', list: 'LS' };
24
+ const FILE_TOOLS = new Set(['Read', 'Edit', 'Write', 'MultiEdit']);
25
+ function toolName(tool) {
26
+ if (TOOL_NAMES[tool])
27
+ return TOOL_NAMES[tool];
28
+ const lemma = /^lemma_(.+)$/.exec(tool);
29
+ return lemma ? `mcp__lemma__${lemma[1]}` : tool;
30
+ }
31
+ /** Files named in an apply_patch body (the tool GPT models get in OpenCode). */
32
+ function patchFiles(patchText) {
33
+ if (typeof patchText !== 'string')
34
+ return [];
35
+ return [...patchText.matchAll(/^\*\*\* (?:Add|Update|Delete) File: (.+)$/gm)].map((m) => m[1].trim());
36
+ }
37
+ const iso = (ms, fallback) => (typeof ms === 'number' && ms > 0 ? new Date(ms).toISOString() : fallback);
38
+ /** One OpenCode session as Claude Code transcript events (one JSON object per line). */
39
+ export function toClaudeEvents(messages, directory, sidechain) {
40
+ const lines = [];
41
+ const extra = sidechain ? { isSidechain: true, agentId: sidechain } : {};
42
+ const push = (timestamp, o) => lines.push(JSON.stringify({ timestamp, ...extra, ...o }));
43
+ const abs = (f) => path.resolve(directory, f);
44
+ let n = 0;
45
+ for (const m of messages ?? []) {
46
+ const role = m?.info?.role;
47
+ const at = iso(m?.info?.time?.created, new Date(0).toISOString());
48
+ for (const p of m?.parts ?? []) {
49
+ if (p?.type === 'text' && typeof p.text === 'string' && p.text.trim() && !p.synthetic) {
50
+ push(at, role === 'user'
51
+ ? { type: 'user', message: { role: 'user', content: p.text } }
52
+ : { type: 'assistant', message: { role: 'assistant', content: [{ type: 'text', text: p.text }] } });
53
+ }
54
+ else if (p?.type === 'patch' && Array.isArray(p.files)) {
55
+ // The step's on-disk changes, whichever tool made them.
56
+ for (const f of p.files)
57
+ if (typeof f === 'string')
58
+ push(at, { type: 'assistant', message: { role: 'assistant', content: [{ type: 'tool_use', id: `patch-${n++}`, name: 'Edit', input: { file_path: abs(f) } }] } });
59
+ }
60
+ else if (p?.type === 'tool' && typeof p.tool === 'string') {
61
+ const st = p.state ?? {};
62
+ const start = iso(st.time?.start, at);
63
+ const name = toolName(p.tool);
64
+ const input = { ...(st.input && typeof st.input === 'object' ? st.input : {}) };
65
+ if (FILE_TOOLS.has(name) && typeof input.filePath === 'string')
66
+ input.file_path = abs(input.filePath);
67
+ const id = p.callID || `call-${n++}`;
68
+ const files = /^(apply_)?patch$/.test(p.tool) ? patchFiles(input.patchText) : [];
69
+ if (files.length) {
70
+ for (const f of files)
71
+ push(start, { type: 'assistant', message: { role: 'assistant', content: [{ type: 'tool_use', id: `${id}-${n++}`, name: 'Edit', input: { file_path: abs(f) } }] } });
72
+ continue;
73
+ }
74
+ push(start, { type: 'assistant', message: { role: 'assistant', content: [{ type: 'tool_use', id, name, input }] } });
75
+ if (st.status === 'completed' || st.status === 'error') {
76
+ const content = st.status === 'error' ? String(st.error ?? '') : String(st.output ?? '');
77
+ push(iso(st.time?.end, start), { type: 'user', message: { role: 'user', content: [{ type: 'tool_result', tool_use_id: id, content }] } });
78
+ }
79
+ }
80
+ }
81
+ }
82
+ return lines;
83
+ }
84
+ /** The description the parent gave each subagent: the `task` call whose metadata names the child session. */
85
+ function taskDescriptions(messages) {
86
+ const out = new Map();
87
+ for (const m of messages ?? [])
88
+ for (const p of m?.parts ?? []) {
89
+ if (p?.type !== 'tool' || p.tool !== 'task')
90
+ continue;
91
+ const child = p.state?.metadata?.sessionId;
92
+ const description = p.state?.input?.description;
93
+ if (typeof child === 'string' && typeof description === 'string')
94
+ out.set(child, description);
95
+ }
96
+ return out;
97
+ }
98
+ function prune(dir) {
99
+ try {
100
+ for (const name of fs.readdirSync(dir)) {
101
+ const f = path.join(dir, name);
102
+ if (Date.now() - fs.statSync(f).mtimeMs > KEEP_MS)
103
+ fs.rmSync(f, { recursive: true, force: true });
104
+ }
105
+ }
106
+ catch {
107
+ // a leftover temp file costs nothing
108
+ }
109
+ }
110
+ /** Writes the snapshot as `<dir>/<session>.jsonl` plus its subagents, and returns the transcript path. */
111
+ export function writeClaudeTranscript(snap, dir = TRANSCRIPT_DIR) {
112
+ fs.mkdirSync(dir, { recursive: true });
113
+ prune(dir);
114
+ const safe = (id) => id.replace(/[^A-Za-z0-9_-]/g, '_');
115
+ const base = path.join(dir, safe(snap.sessionID));
116
+ writeFileAtomic(`${base}.jsonl`, toClaudeEvents(snap.messages, snap.directory).join('\n'));
117
+ const subdir = path.join(base, 'subagents');
118
+ fs.rmSync(subdir, { recursive: true, force: true });
119
+ const descriptions = taskDescriptions(snap.messages);
120
+ for (const child of snap.children ?? []) {
121
+ const id = child?.session?.id;
122
+ if (typeof id !== 'string')
123
+ continue;
124
+ fs.mkdirSync(subdir, { recursive: true });
125
+ fs.writeFileSync(path.join(subdir, `agent-${safe(id)}.jsonl`), toClaudeEvents(child.messages, snap.directory, id).join('\n'));
126
+ const description = descriptions.get(id) ?? child.session.title?.replace(/\s*\(@\S+ subagent\)\s*$/, '');
127
+ fs.writeFileSync(path.join(subdir, `agent-${safe(id)}.meta.json`), JSON.stringify({ ...(child.session.agent ? { agentType: child.session.agent } : {}), ...(description ? { description } : {}) }));
128
+ }
129
+ return `${base}.jsonl`;
130
+ }
131
+ /**
132
+ * Save (or refresh) the session's hand-off. OpenCode has no session end: `session.idle` fires after
133
+ * every turn, so this runs in the mid-session mode (PreCompact's): it refreshes one hand-off in place
134
+ * and never marks the session done. `compacting` also returns the text to put back in the context.
135
+ */
136
+ export function captureOpenCodeSession(snap, opts = {}) {
137
+ if (!snap || typeof snap.sessionID !== 'string' || typeof snap.directory !== 'string' || !Array.isArray(snap.messages))
138
+ return { skipped: 'no-transcript' };
139
+ const transcript = writeClaudeTranscript(snap);
140
+ const res = captureSession({ session_id: snap.sessionID, transcript_path: transcript, cwd: snap.directory }, snap.directory, undefined, { preCompact: true });
141
+ if (!opts.compacting)
142
+ return res;
143
+ const recall = compactRecall({ source: 'compact', session_id: snap.sessionID, cwd: snap.directory }, snap.directory);
144
+ return recall ? { ...res, text: recall.text } : res;
145
+ }
146
+ //# sourceMappingURL=OpenCodeSession.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"OpenCodeSession.js","sourceRoot":"","sources":["../../../src/utils/OpenCodeSession.ts"],"names":[],"mappings":"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"}
@@ -33,14 +33,36 @@ export interface SessionDigest {
33
33
  /** Timestamp of the first transcript event: where "commits made during this session" starts. */
34
34
  startedAt?: string;
35
35
  /** The last test/build/lint run the agent made and how it ended; unset when the output didn't say. */
36
- lastVerdict?: {
37
- command: string;
38
- passed: boolean;
39
- headline: string;
40
- };
36
+ lastVerdict?: Verdict;
37
+ /** What the session's subagents did, when asked for (digestTranscript's `subagents` option). Not counted in the fields above. */
38
+ subagents?: SubagentDigest[];
41
39
  }
42
- /** Reads the transcript (JSONL, one event per line) into the few facts capture needs. */
43
- export declare function digestTranscript(transcriptPath: string): SessionDigest | null;
40
+ export interface Verdict {
41
+ command: string;
42
+ passed: boolean;
43
+ headline: string;
44
+ /** Timestamp of the run's result, when the transcript had one: which of several agents ran last. */
45
+ at?: string;
46
+ }
47
+ /** One subagent's share of the work, from its own transcript. */
48
+ export interface SubagentDigest {
49
+ agentId: string;
50
+ /** What the parent called it (the Agent tool's description), from the host's meta file. */
51
+ description?: string;
52
+ agentType?: string;
53
+ startedAt?: string;
54
+ toolCalls: number;
55
+ edited: string[];
56
+ lastVerdict?: Verdict;
57
+ }
58
+ /**
59
+ * Reads the transcript (JSONL, one event per line) into the few facts capture needs. The fields
60
+ * describe the main agent only; `subagents: true` adds what each subagent did, read from the
61
+ * sidechain events in this file and from the host's per-subagent transcripts next to it.
62
+ */
63
+ export declare function digestTranscript(transcriptPath: string, opts?: {
64
+ subagents?: boolean;
65
+ }): SessionDigest | null;
44
66
  /**
45
67
  * Where a session that edited code left off, from the transcript and git alone. The task is the
46
68
  * person's first prompt, uncut up to a limit, because that is where a multi-part plan lives; "what
@@ -1 +1 @@
1
- {"version":3,"file":"SessionCapture.d.ts","sourceRoot":"","sources":["../../../src/utils/SessionCapture.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAIH,OAAO,EAA0C,UAAU,EAAE,MAAM,4BAA4B,CAAC;AA2BhG,eAAO,MAAM,YAAY,wBAAwB,CAAC;AASlD,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,sGAAsG;IACtG,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,eAAe,EAAE,OAAO,CAAC;IACzB,0GAA0G;IAC1G,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,gGAAgG;IAChG,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,sGAAsG;IACtG,WAAW,CAAC,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,OAAO,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC;CACtE;AAkCD,yFAAyF;AACzF,wBAAgB,gBAAgB,CAAC,cAAc,EAAE,MAAM,GAAG,aAAa,GAAG,IAAI,CA+D7E;AA+BD;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,MAAM,CA0B9F;AAED,qEAAqE;AACrE,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEtD;AAED;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAIhE;AAsBD,MAAM,WAAW,oBAAoB;IACnC,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,OAAO,CAAC,EAAE,eAAe,GAAG,UAAU,GAAG,kBAAkB,GAAG,cAAc,GAAG,eAAe,GAAG,WAAW,GAAG,YAAY,GAAG,SAAS,CAAC;CACzI;AAED,0GAA0G;AAC1G,wBAAgB,cAAc,CAAC,OAAO,EAAE,OAAO,EAAE,GAAG,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,UAAU,EAAE,IAAI,GAAE;IAAE,UAAU,CAAC,EAAE,OAAO,CAAA;CAAO,GAAG,oBAAoB,CAqE5I;AAuBD;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,EAAE,UAAU,GAAG;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAWtH"}
1
+ {"version":3,"file":"SessionCapture.d.ts","sourceRoot":"","sources":["../../../src/utils/SessionCapture.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAIH,OAAO,EAA0C,UAAU,EAAE,MAAM,4BAA4B,CAAC;AA2BhG,eAAO,MAAM,YAAY,wBAAwB,CAAC;AAkBlD,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,sGAAsG;IACtG,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,eAAe,EAAE,OAAO,CAAC;IACzB,0GAA0G;IAC1G,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,gGAAgG;IAChG,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,sGAAsG;IACtG,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,iIAAiI;IACjI,SAAS,CAAC,EAAE,cAAc,EAAE,CAAC;CAC9B;AAED,MAAM,WAAW,OAAO;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,OAAO,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,oGAAoG;IACpG,EAAE,CAAC,EAAE,MAAM,CAAC;CACb;AAED,iEAAiE;AACjE,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,2FAA2F;IAC3F,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AA2CD;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,cAAc,EAAE,MAAM,EAAE,IAAI,GAAE;IAAE,SAAS,CAAC,EAAE,OAAO,CAAA;CAAO,GAAG,aAAa,GAAG,IAAI,CAYjH;AA2LD;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,MAAM,CAyC9F;AAED,qEAAqE;AACrE,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEtD;AAED;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAIhE;AAsBD,MAAM,WAAW,oBAAoB;IACnC,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,OAAO,CAAC,EAAE,eAAe,GAAG,UAAU,GAAG,kBAAkB,GAAG,cAAc,GAAG,eAAe,GAAG,WAAW,GAAG,YAAY,GAAG,SAAS,CAAC;CACzI;AAED,0GAA0G;AAC1G,wBAAgB,cAAc,CAAC,OAAO,EAAE,OAAO,EAAE,GAAG,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,UAAU,EAAE,IAAI,GAAE;IAAE,UAAU,CAAC,EAAE,OAAO,CAAA;CAAO,GAAG,oBAAoB,CAwE5I;AAuBD;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,EAAE,UAAU,GAAG;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAWtH"}