pybao-cli 1.5.21 → 1.5.23

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 (163) hide show
  1. package/dist/REPL-CI5ET6VF.js +50 -0
  2. package/dist/{acp-VH2FWCMR.js → acp-5G7LPADD.js} +32 -32
  3. package/dist/{agentsValidate-4E7AHAMS.js → agentsValidate-BIRAVXBL.js} +7 -7
  4. package/dist/{ask-R3YZ5B44.js → ask-XQZT6WIO.js} +31 -31
  5. package/dist/{autoUpdater-DCNAXD4F.js → autoUpdater-DDJAJPKA.js} +3 -3
  6. package/dist/{chunk-GIXE5FJ2.js → chunk-2GHNW642.js} +1 -1
  7. package/dist/{chunk-NRQHLVJJ.js → chunk-2SVUNNJB.js} +2 -2
  8. package/dist/{chunk-6UNYL6XK.js → chunk-3CC7QXCN.js} +222 -75
  9. package/dist/chunk-3CC7QXCN.js.map +7 -0
  10. package/dist/{chunk-H2ZE5QDY.js → chunk-4ZZYPG6P.js} +4 -4
  11. package/dist/{chunk-TBEA6BY3.js → chunk-5B7UCAYL.js} +1 -1
  12. package/dist/{chunk-ZQR3MM2D.js → chunk-652OMXEE.js} +2 -2
  13. package/dist/{chunk-EP62LHB7.js → chunk-6QGIRDZS.js} +1 -1
  14. package/dist/{chunk-BED7SG2Q.js → chunk-76BOJQUE.js} +1 -1
  15. package/dist/{chunk-TXZ5UTGP.js → chunk-7SYDIES4.js} +1 -1
  16. package/dist/{chunk-TXZ5UTGP.js.map → chunk-7SYDIES4.js.map} +1 -1
  17. package/dist/{chunk-CSONCQLF.js → chunk-A6QEPK5J.js} +2 -2
  18. package/dist/{chunk-X5LLT4P2.js → chunk-ABJT5MG2.js} +1 -1
  19. package/dist/{chunk-56IL2VXC.js → chunk-C2GNLGBM.js} +1 -1
  20. package/dist/{chunk-2OOER4FR.js → chunk-CNMNKSWQ.js} +3 -3
  21. package/dist/{chunk-QE7PZPHW.js → chunk-CT7LWVB7.js} +1 -1
  22. package/dist/{chunk-P5NTGZ5H.js → chunk-CZZKRPE2.js} +1 -1
  23. package/dist/{chunk-P5NTGZ5H.js.map → chunk-CZZKRPE2.js.map} +1 -1
  24. package/dist/chunk-G5MP72ZL.js +515 -0
  25. package/dist/chunk-G5MP72ZL.js.map +7 -0
  26. package/dist/{chunk-25GZITCX.js → chunk-GU4XA76N.js} +3 -3
  27. package/dist/chunk-KQZAS4DO.js +582 -0
  28. package/dist/chunk-KQZAS4DO.js.map +7 -0
  29. package/dist/{chunk-VP5A6FKG.js → chunk-LBDLSBXN.js} +4 -1
  30. package/dist/{chunk-SE7UGQCE.js → chunk-M7FEUIHO.js} +2 -2
  31. package/dist/{chunk-HA7FKBZI.js → chunk-MMW6MLFR.js} +2 -2
  32. package/dist/{chunk-XRLMQN3Q.js → chunk-MN77HNBB.js} +4 -4
  33. package/dist/{chunk-VY5KEHU5.js → chunk-N7GEPTZB.js} +3 -3
  34. package/dist/{chunk-MMMMRMOG.js → chunk-O7LWCCRJ.js} +3 -3
  35. package/dist/{chunk-5VO2CFAL.js → chunk-PUPDIRI6.js} +2 -2
  36. package/dist/{chunk-YQ2RQUQF.js → chunk-QCI5HPTA.js} +1 -1
  37. package/dist/{chunk-KMCUZUZG.js → chunk-QSMZLK7K.js} +3 -3
  38. package/dist/{chunk-4ZGZTWMR.js → chunk-S65MIABQ.js} +4 -4
  39. package/dist/{chunk-3UWTN6DM.js → chunk-V22PQM4W.js} +3 -3
  40. package/dist/{chunk-RQ5X6LFM.js → chunk-VVXC3SNP.js} +4 -4
  41. package/dist/{chunk-LRL3MYKR.js → chunk-W7VIESST.js} +3 -3
  42. package/dist/{chunk-CPYDPN2J.js → chunk-XEVB4WON.js} +15 -15
  43. package/dist/chunk-ZB3ZWD2K.js +96 -0
  44. package/dist/chunk-ZB3ZWD2K.js.map +7 -0
  45. package/dist/{cli-RBMZQ5KF.js → cli-YIANCHDD.js} +130 -103
  46. package/dist/cli-YIANCHDD.js.map +7 -0
  47. package/dist/commands-4YMZW52K.js +54 -0
  48. package/dist/{config-7TO5SQU5.js → config-QVH3VNUQ.js} +4 -4
  49. package/dist/{context-LRA2DKJT.js → context-5VXEWH3G.js} +6 -6
  50. package/dist/{conversationPersistence-Z4QSI5NB.js → conversationPersistence-INUNJHOV.js} +3 -3
  51. package/dist/{conversationTracker-B3DMEHMA.js → conversationTracker-H25IOHBE.js} +4 -4
  52. package/dist/{customCommands-6JZ2VUO2.js → customCommands-7RZHKH2K.js} +4 -4
  53. package/dist/{env-37ALKFXU.js → env-DPJTGHMP.js} +2 -2
  54. package/dist/{file-7EOMBX72.js → file-D7W2FBZP.js} +4 -4
  55. package/dist/index.js +3 -3
  56. package/dist/{llm-3KQG5NEP.js → llm-TOU5REY5.js} +32 -32
  57. package/dist/{llmLazy-ENEH3KAB.js → llmLazy-HSKKIGLC.js} +1 -1
  58. package/dist/{loader-D6V3WFL6.js → loader-YUP6OJTJ.js} +4 -4
  59. package/dist/{lsp-CTPOMI7O.js → lsp-7QKC4DVK.js} +6 -6
  60. package/dist/{lspAnchor-PPPTHRQH.js → lspAnchor-LCRZ23GA.js} +6 -6
  61. package/dist/{mcp-6M34WBA5.js → mcp-KK6BOD6I.js} +7 -7
  62. package/dist/{mentionProcessor-TS4SITI3.js → mentionProcessor-V6JH6HUD.js} +5 -5
  63. package/dist/{messages-BINU6SYX.js → messages-7NVTXWIJ.js} +1 -1
  64. package/dist/{model-6IW224UU.js → model-QSDSUJDB.js} +5 -5
  65. package/dist/{openai-O6CGVMYK.js → openai-JC3KJN3H.js} +5 -5
  66. package/dist/{outputStyles-7PPMLSV6.js → outputStyles-TPH3CCB4.js} +4 -4
  67. package/dist/{pluginRuntime-RU5STQ6F.js → pluginRuntime-7EK4LQDD.js} +6 -6
  68. package/dist/{pluginValidation-JTJTB3TB.js → pluginValidation-BJWCS55I.js} +6 -6
  69. package/dist/prompts-KQNPPEOG.js +56 -0
  70. package/dist/{pybAgentSessionLoad-ZXQAHTQS.js → pybAgentSessionLoad-V3IAJJPS.js} +4 -6
  71. package/dist/{pybAgentSessionResume-R73KFN3V.js → pybAgentSessionResume-WE7ET356.js} +4 -4
  72. package/dist/{pybAgentStreamJsonSession-N4SMTC64.js → pybAgentStreamJsonSession-VWDYV4XL.js} +1 -1
  73. package/dist/{pybHooks-NGJ5OFAI.js → pybHooks-UV7BTIVT.js} +4 -4
  74. package/dist/query-KAZY5LOW.js +54 -0
  75. package/dist/{registry-FKY6JQ3L.js → registry-FK6UGJPV.js} +5 -5
  76. package/dist/{ripgrep-O7MOW25M.js → ripgrep-CXJ4DFPU.js} +3 -3
  77. package/dist/{skillMarketplace-VK3AYR6Q.js → skillMarketplace-QUJXDKZK.js} +3 -3
  78. package/dist/{state-T57IG35V.js → state-GC3XELIE.js} +2 -2
  79. package/dist/{theme-ZEFQIPVH.js → theme-24PLJSPD.js} +5 -5
  80. package/dist/{toolPermissionSettings-ERNXVP7A.js → toolPermissionSettings-S6NJPBKT.js} +6 -6
  81. package/dist/tools-NC5R4I6F.js +55 -0
  82. package/dist/{userInput-JBAUBHGI.js → userInput-4VZSNII7.js} +34 -34
  83. package/package.json +1 -1
  84. package/dist/REPL-64WF5V7K.js +0 -50
  85. package/dist/chunk-6UNYL6XK.js.map +0 -7
  86. package/dist/chunk-BRSPPFSY.js +0 -196
  87. package/dist/chunk-BRSPPFSY.js.map +0 -7
  88. package/dist/chunk-N3T2WAYN.js +0 -138
  89. package/dist/chunk-N3T2WAYN.js.map +0 -7
  90. package/dist/chunk-TSAURYF2.js +0 -81
  91. package/dist/chunk-TSAURYF2.js.map +0 -7
  92. package/dist/cli-RBMZQ5KF.js.map +0 -7
  93. package/dist/commands-WPHK776A.js +0 -54
  94. package/dist/prompts-CAPCICF3.js +0 -56
  95. package/dist/query-CYTIVMQ6.js +0 -54
  96. package/dist/tools-2XLLIKZM.js +0 -55
  97. /package/dist/{REPL-64WF5V7K.js.map → REPL-CI5ET6VF.js.map} +0 -0
  98. /package/dist/{acp-VH2FWCMR.js.map → acp-5G7LPADD.js.map} +0 -0
  99. /package/dist/{agentsValidate-4E7AHAMS.js.map → agentsValidate-BIRAVXBL.js.map} +0 -0
  100. /package/dist/{ask-R3YZ5B44.js.map → ask-XQZT6WIO.js.map} +0 -0
  101. /package/dist/{autoUpdater-DCNAXD4F.js.map → autoUpdater-DDJAJPKA.js.map} +0 -0
  102. /package/dist/{chunk-GIXE5FJ2.js.map → chunk-2GHNW642.js.map} +0 -0
  103. /package/dist/{chunk-NRQHLVJJ.js.map → chunk-2SVUNNJB.js.map} +0 -0
  104. /package/dist/{chunk-H2ZE5QDY.js.map → chunk-4ZZYPG6P.js.map} +0 -0
  105. /package/dist/{chunk-TBEA6BY3.js.map → chunk-5B7UCAYL.js.map} +0 -0
  106. /package/dist/{chunk-ZQR3MM2D.js.map → chunk-652OMXEE.js.map} +0 -0
  107. /package/dist/{chunk-EP62LHB7.js.map → chunk-6QGIRDZS.js.map} +0 -0
  108. /package/dist/{chunk-BED7SG2Q.js.map → chunk-76BOJQUE.js.map} +0 -0
  109. /package/dist/{chunk-CSONCQLF.js.map → chunk-A6QEPK5J.js.map} +0 -0
  110. /package/dist/{chunk-X5LLT4P2.js.map → chunk-ABJT5MG2.js.map} +0 -0
  111. /package/dist/{chunk-56IL2VXC.js.map → chunk-C2GNLGBM.js.map} +0 -0
  112. /package/dist/{chunk-2OOER4FR.js.map → chunk-CNMNKSWQ.js.map} +0 -0
  113. /package/dist/{chunk-QE7PZPHW.js.map → chunk-CT7LWVB7.js.map} +0 -0
  114. /package/dist/{chunk-25GZITCX.js.map → chunk-GU4XA76N.js.map} +0 -0
  115. /package/dist/{chunk-VP5A6FKG.js.map → chunk-LBDLSBXN.js.map} +0 -0
  116. /package/dist/{chunk-SE7UGQCE.js.map → chunk-M7FEUIHO.js.map} +0 -0
  117. /package/dist/{chunk-HA7FKBZI.js.map → chunk-MMW6MLFR.js.map} +0 -0
  118. /package/dist/{chunk-XRLMQN3Q.js.map → chunk-MN77HNBB.js.map} +0 -0
  119. /package/dist/{chunk-VY5KEHU5.js.map → chunk-N7GEPTZB.js.map} +0 -0
  120. /package/dist/{chunk-MMMMRMOG.js.map → chunk-O7LWCCRJ.js.map} +0 -0
  121. /package/dist/{chunk-5VO2CFAL.js.map → chunk-PUPDIRI6.js.map} +0 -0
  122. /package/dist/{chunk-YQ2RQUQF.js.map → chunk-QCI5HPTA.js.map} +0 -0
  123. /package/dist/{chunk-KMCUZUZG.js.map → chunk-QSMZLK7K.js.map} +0 -0
  124. /package/dist/{chunk-4ZGZTWMR.js.map → chunk-S65MIABQ.js.map} +0 -0
  125. /package/dist/{chunk-3UWTN6DM.js.map → chunk-V22PQM4W.js.map} +0 -0
  126. /package/dist/{chunk-RQ5X6LFM.js.map → chunk-VVXC3SNP.js.map} +0 -0
  127. /package/dist/{chunk-LRL3MYKR.js.map → chunk-W7VIESST.js.map} +0 -0
  128. /package/dist/{chunk-CPYDPN2J.js.map → chunk-XEVB4WON.js.map} +0 -0
  129. /package/dist/{commands-WPHK776A.js.map → commands-4YMZW52K.js.map} +0 -0
  130. /package/dist/{config-7TO5SQU5.js.map → config-QVH3VNUQ.js.map} +0 -0
  131. /package/dist/{context-LRA2DKJT.js.map → context-5VXEWH3G.js.map} +0 -0
  132. /package/dist/{conversationPersistence-Z4QSI5NB.js.map → conversationPersistence-INUNJHOV.js.map} +0 -0
  133. /package/dist/{conversationTracker-B3DMEHMA.js.map → conversationTracker-H25IOHBE.js.map} +0 -0
  134. /package/dist/{customCommands-6JZ2VUO2.js.map → customCommands-7RZHKH2K.js.map} +0 -0
  135. /package/dist/{env-37ALKFXU.js.map → env-DPJTGHMP.js.map} +0 -0
  136. /package/dist/{file-7EOMBX72.js.map → file-D7W2FBZP.js.map} +0 -0
  137. /package/dist/{llm-3KQG5NEP.js.map → llm-TOU5REY5.js.map} +0 -0
  138. /package/dist/{llmLazy-ENEH3KAB.js.map → llmLazy-HSKKIGLC.js.map} +0 -0
  139. /package/dist/{loader-D6V3WFL6.js.map → loader-YUP6OJTJ.js.map} +0 -0
  140. /package/dist/{lsp-CTPOMI7O.js.map → lsp-7QKC4DVK.js.map} +0 -0
  141. /package/dist/{lspAnchor-PPPTHRQH.js.map → lspAnchor-LCRZ23GA.js.map} +0 -0
  142. /package/dist/{mcp-6M34WBA5.js.map → mcp-KK6BOD6I.js.map} +0 -0
  143. /package/dist/{mentionProcessor-TS4SITI3.js.map → mentionProcessor-V6JH6HUD.js.map} +0 -0
  144. /package/dist/{messages-BINU6SYX.js.map → messages-7NVTXWIJ.js.map} +0 -0
  145. /package/dist/{model-6IW224UU.js.map → model-QSDSUJDB.js.map} +0 -0
  146. /package/dist/{openai-O6CGVMYK.js.map → openai-JC3KJN3H.js.map} +0 -0
  147. /package/dist/{outputStyles-7PPMLSV6.js.map → outputStyles-TPH3CCB4.js.map} +0 -0
  148. /package/dist/{pluginRuntime-RU5STQ6F.js.map → pluginRuntime-7EK4LQDD.js.map} +0 -0
  149. /package/dist/{pluginValidation-JTJTB3TB.js.map → pluginValidation-BJWCS55I.js.map} +0 -0
  150. /package/dist/{prompts-CAPCICF3.js.map → prompts-KQNPPEOG.js.map} +0 -0
  151. /package/dist/{pybAgentSessionLoad-ZXQAHTQS.js.map → pybAgentSessionLoad-V3IAJJPS.js.map} +0 -0
  152. /package/dist/{pybAgentSessionResume-R73KFN3V.js.map → pybAgentSessionResume-WE7ET356.js.map} +0 -0
  153. /package/dist/{pybAgentStreamJsonSession-N4SMTC64.js.map → pybAgentStreamJsonSession-VWDYV4XL.js.map} +0 -0
  154. /package/dist/{pybHooks-NGJ5OFAI.js.map → pybHooks-UV7BTIVT.js.map} +0 -0
  155. /package/dist/{query-CYTIVMQ6.js.map → query-KAZY5LOW.js.map} +0 -0
  156. /package/dist/{registry-FKY6JQ3L.js.map → registry-FK6UGJPV.js.map} +0 -0
  157. /package/dist/{ripgrep-O7MOW25M.js.map → ripgrep-CXJ4DFPU.js.map} +0 -0
  158. /package/dist/{skillMarketplace-VK3AYR6Q.js.map → skillMarketplace-QUJXDKZK.js.map} +0 -0
  159. /package/dist/{state-T57IG35V.js.map → state-GC3XELIE.js.map} +0 -0
  160. /package/dist/{theme-ZEFQIPVH.js.map → theme-24PLJSPD.js.map} +0 -0
  161. /package/dist/{toolPermissionSettings-ERNXVP7A.js.map → toolPermissionSettings-S6NJPBKT.js.map} +0 -0
  162. /package/dist/{tools-2XLLIKZM.js.map → tools-NC5R4I6F.js.map} +0 -0
  163. /package/dist/{userInput-JBAUBHGI.js.map → userInput-4VZSNII7.js.map} +0 -0
@@ -0,0 +1,582 @@
1
+ import { createRequire as __pybCreateRequire } from "node:module";
2
+ const require = __pybCreateRequire(import.meta.url);
3
+ import {
4
+ isUuid
5
+ } from "./chunk-5P7HBXTD.js";
6
+ import {
7
+ createSessionSqlStore,
8
+ getSessionStoreFlags
9
+ } from "./chunk-G5MP72ZL.js";
10
+ import {
11
+ getPybAgentSessionId
12
+ } from "./chunk-B6IMQJZM.js";
13
+ import {
14
+ PLAN_SLUG_ADJECTIVES,
15
+ PLAN_SLUG_NOUNS,
16
+ PLAN_SLUG_VERBS,
17
+ getCwd,
18
+ resolveXdgDataPath
19
+ } from "./chunk-LBDLSBXN.js";
20
+ import {
21
+ MACRO
22
+ } from "./chunk-7SYDIES4.js";
23
+
24
+ // src/utils/protocol/pybAgentSessionResume.ts
25
+ import { existsSync as existsSync2, readdirSync, readFileSync as readFileSync2, statSync as statSync2 } from "fs";
26
+ import { basename, join as join2 } from "path";
27
+
28
+ // src/utils/protocol/pybAgentSessionLog.ts
29
+ import { execFileSync } from "child_process";
30
+ import {
31
+ appendFileSync,
32
+ existsSync,
33
+ mkdirSync,
34
+ readFileSync,
35
+ statSync,
36
+ writeFileSync
37
+ } from "fs";
38
+ import { randomBytes } from "crypto";
39
+ import { dirname, join } from "path";
40
+
41
+ // src/utils/session/sessionSqlDualWriteTelemetry.ts
42
+ var state = {
43
+ successCount: 0,
44
+ failCount: 0,
45
+ totalLatencyMs: 0,
46
+ lastErrorCode: null
47
+ };
48
+ function recordSessionSqlDualWriteSuccess(latencyMs) {
49
+ state.successCount += 1;
50
+ state.totalLatencyMs += Math.max(0, Number(latencyMs) || 0);
51
+ }
52
+ function recordSessionSqlDualWriteFailure(errorCode) {
53
+ state.failCount += 1;
54
+ state.lastErrorCode = errorCode ? String(errorCode) : "SESSION_SQL_DUALWRITE_FAILED";
55
+ }
56
+
57
+ // src/utils/session/sessionSqlDualWrite.ts
58
+ function parseTime(timestampIso) {
59
+ return Number(Date.parse(timestampIso)) || Date.now();
60
+ }
61
+ function withSessionSqlDualWrite(action) {
62
+ const flags = getSessionStoreFlags();
63
+ if (!flags.sqlWriteEnabled) return;
64
+ const startedAt = Date.now();
65
+ let store = null;
66
+ try {
67
+ store = createSessionSqlStore();
68
+ action(store);
69
+ recordSessionSqlDualWriteSuccess(Date.now() - startedAt);
70
+ } catch (error) {
71
+ const errorCode = typeof error?.code === "string" ? error.code : typeof error?.name === "string" ? error.name : null;
72
+ recordSessionSqlDualWriteFailure(errorCode);
73
+ } finally {
74
+ try {
75
+ store?.close();
76
+ } catch {
77
+ }
78
+ }
79
+ }
80
+ function tryDualWriteSessionMessage(input) {
81
+ const message = input.message;
82
+ if (message.type !== "user" && message.type !== "assistant") return;
83
+ withSessionSqlDualWrite((store) => {
84
+ const timeCreated = parseTime(input.timestampIso);
85
+ store.appendMessages([
86
+ {
87
+ sessionId: input.sessionId,
88
+ uuid: message.uuid,
89
+ role: message.type,
90
+ timeCreated,
91
+ rawMessage: message.message,
92
+ agentId: input.agentId,
93
+ parentUuid: input.parentUuid,
94
+ logicalParentUuid: input.logicalParentUuid ?? null,
95
+ requestId: message.type === "assistant" && typeof message.requestId === "string" ? String(message.requestId) : null,
96
+ isApiError: message.type === "assistant" ? Boolean(message.isApiErrorMessage) : false
97
+ }
98
+ ]);
99
+ const blocks = Array.isArray(message?.message?.content) ? message.message.content : [];
100
+ if (blocks.length > 0) {
101
+ store.appendParts(
102
+ blocks.map((block, partIndex) => ({
103
+ id: `${message.uuid}:${partIndex}`,
104
+ messageUuid: message.uuid,
105
+ sessionId: input.sessionId,
106
+ partIndex,
107
+ partType: String(block?.type ?? "unknown"),
108
+ rawPart: block ?? {},
109
+ timeCreated
110
+ }))
111
+ );
112
+ }
113
+ });
114
+ }
115
+ function tryDualWriteSessionMetaEvent(input) {
116
+ withSessionSqlDualWrite((store) => {
117
+ const timeCreated = parseTime(input.timestampIso);
118
+ const eventKey = input.eventType === "custom-title" ? String(input.payload.customTitle ?? "") : String(input.payload.tag ?? "");
119
+ store.appendSessionMetaEvents([
120
+ {
121
+ id: `${input.sessionId}:${input.eventType}:${timeCreated}:${eventKey}`,
122
+ sessionId: input.sessionId,
123
+ eventType: input.eventType,
124
+ payload: input.payload,
125
+ timeCreated
126
+ }
127
+ ]);
128
+ });
129
+ }
130
+ function tryDualWriteFileHistorySnapshot(input) {
131
+ withSessionSqlDualWrite((store) => {
132
+ const timeCreated = parseTime(input.timestampIso);
133
+ store.appendFileHistorySnapshots([
134
+ {
135
+ id: `${input.sessionId}:${input.messageUuid}:${timeCreated}`,
136
+ sessionId: input.sessionId,
137
+ messageUuid: input.messageUuid,
138
+ snapshot: input.snapshot,
139
+ isSnapshotUpdate: input.isSnapshotUpdate,
140
+ timeCreated
141
+ }
142
+ ]);
143
+ });
144
+ }
145
+
146
+ // src/utils/protocol/pybAgentSessionLog.ts
147
+ function getSessionStoreBaseDir() {
148
+ return resolveXdgDataPath("sessions");
149
+ }
150
+ function sanitizeProjectNameForSessionStore(cwd) {
151
+ return cwd.replace(/[^a-zA-Z0-9]/g, "-");
152
+ }
153
+ function getSessionProjectsDir() {
154
+ return join(getSessionStoreBaseDir(), "projects");
155
+ }
156
+ function getSessionProjectDir(cwd) {
157
+ return join(getSessionProjectsDir(), sanitizeProjectNameForSessionStore(cwd));
158
+ }
159
+ function getSessionLogFilePath(args) {
160
+ return join(getSessionProjectDir(args.cwd), `${args.sessionId}.jsonl`);
161
+ }
162
+ function getAgentLogFilePath(args) {
163
+ return join(getSessionProjectDir(args.cwd), `agent-${args.agentId}.jsonl`);
164
+ }
165
+ function safeMkdir(dir) {
166
+ if (existsSync(dir)) return;
167
+ mkdirSync(dir, { recursive: true });
168
+ }
169
+ function safeEnsureFile(path) {
170
+ safeMkdir(dirname(path));
171
+ if (!existsSync(path)) writeFileSync(path, "", "utf8");
172
+ }
173
+ function safeAppendJsonl(path, record) {
174
+ try {
175
+ safeEnsureFile(path);
176
+ appendFileSync(path, JSON.stringify(record) + "\n", "utf8");
177
+ } catch {
178
+ }
179
+ }
180
+ function shouldWriteJsonlForSessionStore() {
181
+ const flags = getSessionStoreFlags();
182
+ if (!flags.sqlWriteEnabled) return true;
183
+ return flags.jsonlWriteEnabled;
184
+ }
185
+ var lastUuidByFile = /* @__PURE__ */ new Map();
186
+ var snapshotWrittenByFile = /* @__PURE__ */ new Set();
187
+ var slugBySessionId = /* @__PURE__ */ new Map();
188
+ var currentSessionCustomTitle = null;
189
+ var currentSessionTag = null;
190
+ function safeReadLastPersistedInfo(filePath) {
191
+ try {
192
+ if (!existsSync(filePath)) return { uuid: null, slug: null };
193
+ const content = readFileSync(filePath, "utf8");
194
+ const lines = content.split("\n");
195
+ let lastSlug = null;
196
+ for (let i = lines.length - 1; i >= 0; i--) {
197
+ const line = lines[i]?.trim();
198
+ if (!line) continue;
199
+ let parsed;
200
+ try {
201
+ parsed = JSON.parse(line);
202
+ } catch {
203
+ continue;
204
+ }
205
+ if (!parsed || typeof parsed !== "object") continue;
206
+ if (!lastSlug && typeof parsed.slug === "string" && parsed.slug.trim()) {
207
+ lastSlug = parsed.slug.trim();
208
+ }
209
+ if (typeof parsed.uuid === "string" && parsed.uuid) {
210
+ return { uuid: parsed.uuid, slug: lastSlug };
211
+ }
212
+ }
213
+ return { uuid: null, slug: lastSlug };
214
+ } catch {
215
+ return { uuid: null, slug: null };
216
+ }
217
+ }
218
+ function pickIndex(length) {
219
+ return randomBytes(4).readUInt32BE(0) % length;
220
+ }
221
+ function pickWord(words) {
222
+ return words[pickIndex(words.length)];
223
+ }
224
+ function generateSessionSlug() {
225
+ const adjective = pickWord(PLAN_SLUG_ADJECTIVES);
226
+ const verb = pickWord(PLAN_SLUG_VERBS);
227
+ const noun = pickWord(PLAN_SLUG_NOUNS);
228
+ return `${adjective}-${verb}-${noun}`;
229
+ }
230
+ function getOrCreateSessionSlug(sessionId) {
231
+ const existing = slugBySessionId.get(sessionId);
232
+ if (existing) return existing;
233
+ const slug = generateSessionSlug();
234
+ slugBySessionId.set(sessionId, slug);
235
+ return slug;
236
+ }
237
+ var gitBranchCache = null;
238
+ function getGitBranchBestEffort(cwd) {
239
+ if (gitBranchCache && gitBranchCache.cwd === cwd) return gitBranchCache.value;
240
+ let value;
241
+ try {
242
+ const stdout = execFileSync("git", ["rev-parse", "--abbrev-ref", "HEAD"], {
243
+ cwd,
244
+ stdio: ["ignore", "pipe", "ignore"],
245
+ timeout: 750
246
+ });
247
+ const branch = stdout.toString("utf8").trim();
248
+ value = branch || void 0;
249
+ } catch {
250
+ value = void 0;
251
+ }
252
+ gitBranchCache = { cwd, value };
253
+ return value;
254
+ }
255
+ function ensureFileHistorySnapshot(filePath, sessionId, firstMessageUuid) {
256
+ if (snapshotWrittenByFile.has(filePath)) return;
257
+ const shouldWriteJsonl = shouldWriteJsonlForSessionStore();
258
+ if (shouldWriteJsonl) {
259
+ try {
260
+ safeEnsureFile(filePath);
261
+ const size = statSync(filePath).size;
262
+ if (size > 0) {
263
+ snapshotWrittenByFile.add(filePath);
264
+ return;
265
+ }
266
+ } catch {
267
+ }
268
+ }
269
+ const now = (/* @__PURE__ */ new Date()).toISOString();
270
+ const snapshot = {
271
+ messageId: firstMessageUuid,
272
+ trackedFileBackups: {},
273
+ timestamp: now
274
+ };
275
+ if (shouldWriteJsonl) {
276
+ safeAppendJsonl(filePath, {
277
+ type: "file-history-snapshot",
278
+ messageId: firstMessageUuid,
279
+ snapshot,
280
+ isSnapshotUpdate: false
281
+ });
282
+ }
283
+ tryDualWriteFileHistorySnapshot({
284
+ sessionId,
285
+ messageUuid: firstMessageUuid,
286
+ snapshot,
287
+ isSnapshotUpdate: false,
288
+ timestampIso: now
289
+ });
290
+ snapshotWrittenByFile.add(filePath);
291
+ }
292
+ function resolvePersistTarget(toolUseContext) {
293
+ const agentId = toolUseContext.agentId;
294
+ if (agentId && agentId !== "main") return { kind: "agent", agentId };
295
+ return { kind: "session", sessionId: getPybAgentSessionId() };
296
+ }
297
+ function appendSessionJsonlFromMessage(args) {
298
+ const { message, toolUseContext } = args;
299
+ if (message.type !== "user" && message.type !== "assistant") return;
300
+ const cwd = getCwd();
301
+ const userType = (process.env.USER_TYPE ?? "external").trim() || "external";
302
+ const sessionId = getPybAgentSessionId();
303
+ const agentId = (toolUseContext.agentId ?? "main").trim() || "main";
304
+ const isSidechain = agentId !== "main";
305
+ const gitBranch = getGitBranchBestEffort(cwd);
306
+ const target = resolvePersistTarget(toolUseContext);
307
+ const filePath = target.kind === "agent" ? getAgentLogFilePath({ cwd, agentId: target.agentId }) : getSessionLogFilePath({ cwd, sessionId: target.sessionId });
308
+ if (!lastUuidByFile.has(filePath)) {
309
+ const info = safeReadLastPersistedInfo(filePath);
310
+ lastUuidByFile.set(filePath, info.uuid);
311
+ if (info.slug) slugBySessionId.set(sessionId, info.slug);
312
+ }
313
+ const previousUuid = lastUuidByFile.get(filePath) ?? null;
314
+ const slug = getOrCreateSessionSlug(sessionId);
315
+ if (target.kind === "session") {
316
+ ensureFileHistorySnapshot(filePath, sessionId, message.uuid);
317
+ }
318
+ const base = {
319
+ parentUuid: previousUuid,
320
+ logicalParentUuid: void 0,
321
+ isSidechain,
322
+ userType,
323
+ cwd,
324
+ sessionId,
325
+ version: MACRO.VERSION,
326
+ ...gitBranch ? { gitBranch } : {},
327
+ agentId,
328
+ slug,
329
+ uuid: message.uuid,
330
+ timestamp: (/* @__PURE__ */ new Date()).toISOString()
331
+ };
332
+ const record = message.type === "user" ? {
333
+ ...base,
334
+ type: "user",
335
+ message: message.message,
336
+ ...message.toolUseResult?.data !== void 0 ? { toolUseResult: message.toolUseResult.data } : {}
337
+ } : {
338
+ ...base,
339
+ type: "assistant",
340
+ message: message.message,
341
+ ...typeof message.requestId === "string" ? { requestId: String(message.requestId) } : {},
342
+ ...message.isApiErrorMessage ? { isApiErrorMessage: true } : {}
343
+ };
344
+ if (shouldWriteJsonlForSessionStore()) {
345
+ safeAppendJsonl(filePath, record);
346
+ }
347
+ tryDualWriteSessionMessage({
348
+ message,
349
+ sessionId,
350
+ agentId,
351
+ parentUuid: previousUuid,
352
+ logicalParentUuid: void 0,
353
+ timestampIso: base.timestamp
354
+ });
355
+ lastUuidByFile.set(filePath, message.uuid);
356
+ }
357
+ function appendSessionCustomTitleRecord(args) {
358
+ const cwd = getCwd();
359
+ if (shouldWriteJsonlForSessionStore()) {
360
+ safeAppendJsonl(getSessionLogFilePath({ cwd, sessionId: args.sessionId }), {
361
+ type: "custom-title",
362
+ sessionId: args.sessionId,
363
+ customTitle: args.customTitle
364
+ });
365
+ }
366
+ tryDualWriteSessionMetaEvent({
367
+ sessionId: args.sessionId,
368
+ eventType: "custom-title",
369
+ payload: { customTitle: args.customTitle },
370
+ timestampIso: (/* @__PURE__ */ new Date()).toISOString()
371
+ });
372
+ if (args.sessionId === getPybAgentSessionId()) {
373
+ currentSessionCustomTitle = args.customTitle;
374
+ }
375
+ }
376
+ function appendSessionTagRecord(args) {
377
+ const cwd = getCwd();
378
+ if (shouldWriteJsonlForSessionStore()) {
379
+ safeAppendJsonl(getSessionLogFilePath({ cwd, sessionId: args.sessionId }), {
380
+ type: "tag",
381
+ sessionId: args.sessionId,
382
+ tag: args.tag
383
+ });
384
+ }
385
+ tryDualWriteSessionMetaEvent({
386
+ sessionId: args.sessionId,
387
+ eventType: "tag",
388
+ payload: { tag: args.tag },
389
+ timestampIso: (/* @__PURE__ */ new Date()).toISOString()
390
+ });
391
+ if (args.sessionId === getPybAgentSessionId()) {
392
+ currentSessionTag = args.tag;
393
+ }
394
+ }
395
+
396
+ // src/utils/protocol/pybAgentSessionResume.ts
397
+ function safeParseJson(line) {
398
+ try {
399
+ return JSON.parse(line);
400
+ } catch {
401
+ return null;
402
+ }
403
+ }
404
+ function safeParseDate(value) {
405
+ if (typeof value !== "string") return null;
406
+ const d = new Date(value);
407
+ if (Number.isNaN(d.getTime())) return null;
408
+ return d;
409
+ }
410
+ function readSessionListItemBestEffort(args) {
411
+ const { filePath, sessionId } = args;
412
+ let slug = null;
413
+ let cwd = null;
414
+ let createdAt = null;
415
+ let modifiedAt = null;
416
+ let customTitle = null;
417
+ let tag = null;
418
+ let lastAssistantUuid = null;
419
+ const summariesByLeaf = /* @__PURE__ */ new Map();
420
+ let lastSummary = null;
421
+ try {
422
+ modifiedAt = new Date(statSync2(filePath).mtimeMs);
423
+ } catch {
424
+ modifiedAt = null;
425
+ }
426
+ let content;
427
+ try {
428
+ content = readFileSync2(filePath, "utf8");
429
+ } catch {
430
+ return {
431
+ slug,
432
+ customTitle,
433
+ tag,
434
+ summary: null,
435
+ cwd,
436
+ createdAt,
437
+ modifiedAt
438
+ };
439
+ }
440
+ for (const rawLine of content.split("\n")) {
441
+ const line = rawLine.trim();
442
+ if (!line) continue;
443
+ const parsed = safeParseJson(line);
444
+ if (!parsed || typeof parsed !== "object") continue;
445
+ const entry = parsed;
446
+ if (!slug && typeof entry.slug === "string" && entry.slug.trim()) {
447
+ slug = entry.slug.trim();
448
+ }
449
+ if (!cwd && typeof entry.cwd === "string" && entry.cwd.trim()) {
450
+ cwd = entry.cwd.trim();
451
+ }
452
+ if (!createdAt) {
453
+ const ts = safeParseDate(entry.timestamp);
454
+ if (ts) createdAt = ts;
455
+ }
456
+ if (typeof entry.type !== "string") continue;
457
+ if (entry.type === "assistant") {
458
+ if (typeof entry.uuid === "string" && entry.uuid)
459
+ lastAssistantUuid = entry.uuid;
460
+ continue;
461
+ }
462
+ if (entry.type === "summary") {
463
+ const leafUuid = typeof entry.leafUuid === "string" ? entry.leafUuid : "";
464
+ const summary2 = typeof entry.summary === "string" ? entry.summary : "";
465
+ if (leafUuid && summary2) {
466
+ summariesByLeaf.set(leafUuid, summary2);
467
+ lastSummary = summary2;
468
+ }
469
+ continue;
470
+ }
471
+ if (entry.type === "custom-title") {
472
+ const id = typeof entry.sessionId === "string" ? entry.sessionId : "";
473
+ const title = typeof entry.customTitle === "string" ? entry.customTitle : "";
474
+ if (id === sessionId && title) customTitle = title;
475
+ continue;
476
+ }
477
+ if (entry.type === "tag") {
478
+ const id = typeof entry.sessionId === "string" ? entry.sessionId : "";
479
+ const t = typeof entry.tag === "string" ? entry.tag : "";
480
+ if (id === sessionId && t) tag = t;
481
+ continue;
482
+ }
483
+ }
484
+ const summary = (lastAssistantUuid ? summariesByLeaf.get(lastAssistantUuid) ?? null : null) ?? lastSummary ?? null;
485
+ return {
486
+ slug,
487
+ customTitle,
488
+ tag,
489
+ summary,
490
+ cwd,
491
+ createdAt,
492
+ modifiedAt
493
+ };
494
+ }
495
+ function listPybAgentSessions(args) {
496
+ const { cwd } = args;
497
+ const projectDir = getSessionProjectDir(cwd);
498
+ if (!existsSync2(projectDir)) return [];
499
+ const candidates = readdirSync(projectDir).filter((name) => name.endsWith(".jsonl")).filter((name) => !name.startsWith("agent-")).map((name) => ({
500
+ sessionId: basename(name, ".jsonl"),
501
+ filePath: join2(projectDir, name)
502
+ })).filter((c) => isUuid(c.sessionId));
503
+ const items = candidates.map(({ sessionId, filePath }) => ({
504
+ sessionId,
505
+ ...readSessionListItemBestEffort({ filePath, sessionId })
506
+ }));
507
+ items.sort((a, b) => {
508
+ const am = a.modifiedAt?.getTime() ?? 0;
509
+ const bm = b.modifiedAt?.getTime() ?? 0;
510
+ return bm - am;
511
+ });
512
+ return items;
513
+ }
514
+ function findSessionFileAcrossProjects(args) {
515
+ const { sessionId } = args;
516
+ const projectsDir = getSessionProjectsDir();
517
+ if (!existsSync2(projectsDir)) return null;
518
+ let projectNames;
519
+ try {
520
+ projectNames = readdirSync(projectsDir);
521
+ } catch {
522
+ return null;
523
+ }
524
+ for (const projectName of projectNames) {
525
+ const candidate = join2(projectsDir, projectName, `${sessionId}.jsonl`);
526
+ if (existsSync2(candidate)) return { filePath: candidate };
527
+ }
528
+ return null;
529
+ }
530
+ function readSessionCwdBestEffort(filePath) {
531
+ try {
532
+ const content = readFileSync2(filePath, "utf8");
533
+ for (const rawLine of content.split("\n")) {
534
+ const line = rawLine.trim();
535
+ if (!line) continue;
536
+ const parsed = safeParseJson(line);
537
+ if (!parsed || typeof parsed !== "object") continue;
538
+ const cwd = parsed.cwd;
539
+ if (typeof cwd === "string" && cwd.trim()) return cwd.trim();
540
+ }
541
+ } catch {
542
+ }
543
+ return null;
544
+ }
545
+ function sessionExistsInProject(cwd, sessionId) {
546
+ try {
547
+ return existsSync2(join2(getSessionProjectDir(cwd), `${sessionId}.jsonl`));
548
+ } catch {
549
+ return false;
550
+ }
551
+ }
552
+ function resolvePybResumeSessionIdentifier(args) {
553
+ const { cwd, identifier } = args;
554
+ const id = identifier.trim();
555
+ if (!id) return { kind: "not_found", identifier };
556
+ if (isUuid(id)) {
557
+ if (sessionExistsInProject(cwd, id)) return { kind: "ok", sessionId: id };
558
+ const elsewhere = findSessionFileAcrossProjects({ sessionId: id });
559
+ if (elsewhere) {
560
+ return {
561
+ kind: "different_directory",
562
+ sessionId: id,
563
+ otherCwd: readSessionCwdBestEffort(elsewhere.filePath)
564
+ };
565
+ }
566
+ return { kind: "not_found", identifier: id };
567
+ }
568
+ const sessions = listPybAgentSessions({ cwd });
569
+ const matches = sessions.filter((s) => s.slug === id || s.customTitle === id).map((s) => s.sessionId);
570
+ if (matches.length === 1) return { kind: "ok", sessionId: matches[0] };
571
+ if (matches.length > 1)
572
+ return { kind: "ambiguous", identifier: id, matchingSessionIds: matches };
573
+ return { kind: "not_found", identifier: id };
574
+ }
575
+
576
+ export {
577
+ appendSessionJsonlFromMessage,
578
+ appendSessionCustomTitleRecord,
579
+ appendSessionTagRecord,
580
+ listPybAgentSessions,
581
+ resolvePybResumeSessionIdentifier
582
+ };
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/utils/protocol/pybAgentSessionResume.ts", "../src/utils/protocol/pybAgentSessionLog.ts", "../src/utils/session/sessionSqlDualWriteTelemetry.ts", "../src/utils/session/sessionSqlDualWrite.ts"],
4
+ "sourcesContent": ["import { existsSync, readdirSync, readFileSync, statSync } from 'fs'\nimport { basename, join } from 'path'\nimport {\n getSessionProjectDir,\n getSessionProjectsDir,\n} from './pybAgentSessionLog'\nimport { isUuid } from '@utils/text/uuid'\n\nexport type PybAgentSessionListItem = {\n sessionId: string\n slug: string | null\n customTitle: string | null\n tag: string | null\n summary: string | null\n cwd: string | null\n createdAt: Date | null\n modifiedAt: Date | null\n}\n\nexport type ResumeResolveResult =\n | { kind: 'ok'; sessionId: string }\n | { kind: 'ambiguous'; identifier: string; matchingSessionIds: string[] }\n | { kind: 'different_directory'; sessionId: string; otherCwd: string | null }\n | { kind: 'not_found'; identifier: string }\n\nfunction safeParseJson(line: string): unknown | null {\n try {\n return JSON.parse(line)\n } catch {\n return null\n }\n}\n\nfunction safeParseDate(value: unknown): Date | null {\n if (typeof value !== 'string') return null\n const d = new Date(value)\n if (Number.isNaN(d.getTime())) return null\n return d\n}\n\nfunction readSessionListItemBestEffort(args: {\n filePath: string\n sessionId: string\n}): Omit<PybAgentSessionListItem, 'sessionId'> {\n const { filePath, sessionId } = args\n\n let slug: string | null = null\n let cwd: string | null = null\n let createdAt: Date | null = null\n let modifiedAt: Date | null = null\n let customTitle: string | null = null\n let tag: string | null = null\n let lastAssistantUuid: string | null = null\n const summariesByLeaf = new Map<string, string>()\n let lastSummary: string | null = null\n\n try {\n modifiedAt = new Date(statSync(filePath).mtimeMs)\n } catch {\n modifiedAt = null\n }\n\n let content: string\n try {\n content = readFileSync(filePath, 'utf8')\n } catch {\n return {\n slug,\n customTitle,\n tag,\n summary: null,\n cwd,\n createdAt,\n modifiedAt,\n }\n }\n\n for (const rawLine of content.split('\\n')) {\n const line = rawLine.trim()\n if (!line) continue\n const parsed = safeParseJson(line)\n if (!parsed || typeof parsed !== 'object') continue\n\n const entry: any = parsed\n\n if (!slug && typeof entry.slug === 'string' && entry.slug.trim()) {\n slug = entry.slug.trim()\n }\n if (!cwd && typeof entry.cwd === 'string' && entry.cwd.trim()) {\n cwd = entry.cwd.trim()\n }\n if (!createdAt) {\n const ts = safeParseDate(entry.timestamp)\n if (ts) createdAt = ts\n }\n\n if (typeof entry.type !== 'string') continue\n\n if (entry.type === 'assistant') {\n if (typeof entry.uuid === 'string' && entry.uuid)\n lastAssistantUuid = entry.uuid\n continue\n }\n\n if (entry.type === 'summary') {\n const leafUuid = typeof entry.leafUuid === 'string' ? entry.leafUuid : ''\n const summary = typeof entry.summary === 'string' ? entry.summary : ''\n if (leafUuid && summary) {\n summariesByLeaf.set(leafUuid, summary)\n lastSummary = summary\n }\n continue\n }\n\n if (entry.type === 'custom-title') {\n const id = typeof entry.sessionId === 'string' ? entry.sessionId : ''\n const title =\n typeof entry.customTitle === 'string' ? entry.customTitle : ''\n if (id === sessionId && title) customTitle = title\n continue\n }\n\n if (entry.type === 'tag') {\n const id = typeof entry.sessionId === 'string' ? entry.sessionId : ''\n const t = typeof entry.tag === 'string' ? entry.tag : ''\n if (id === sessionId && t) tag = t\n continue\n }\n }\n\n const summary =\n (lastAssistantUuid\n ? (summariesByLeaf.get(lastAssistantUuid) ?? null)\n : null) ??\n lastSummary ??\n null\n\n return {\n slug,\n customTitle,\n tag,\n summary,\n cwd,\n createdAt,\n modifiedAt,\n }\n}\n\nexport function listPybAgentSessions(args: {\n cwd: string\n}): PybAgentSessionListItem[] {\n const { cwd } = args\n const projectDir = getSessionProjectDir(cwd)\n if (!existsSync(projectDir)) return []\n\n const candidates = readdirSync(projectDir)\n .filter(name => name.endsWith('.jsonl'))\n .filter(name => !name.startsWith('agent-'))\n .map(name => ({\n sessionId: basename(name, '.jsonl'),\n filePath: join(projectDir, name),\n }))\n .filter(c => isUuid(c.sessionId))\n\n const items = candidates.map(({ sessionId, filePath }) => ({\n sessionId,\n ...readSessionListItemBestEffort({ filePath, sessionId }),\n }))\n\n items.sort((a, b) => {\n const am = a.modifiedAt?.getTime() ?? 0\n const bm = b.modifiedAt?.getTime() ?? 0\n return bm - am\n })\n\n return items\n}\n\nfunction findSessionFileAcrossProjects(args: {\n sessionId: string\n}): { filePath: string } | null {\n const { sessionId } = args\n const projectsDir = getSessionProjectsDir()\n if (!existsSync(projectsDir)) return null\n\n let projectNames: string[]\n try {\n projectNames = readdirSync(projectsDir)\n } catch {\n return null\n }\n\n for (const projectName of projectNames) {\n const candidate = join(projectsDir, projectName, `${sessionId}.jsonl`)\n if (existsSync(candidate)) return { filePath: candidate }\n }\n\n return null\n}\n\nfunction readSessionCwdBestEffort(filePath: string): string | null {\n try {\n const content = readFileSync(filePath, 'utf8')\n for (const rawLine of content.split('\\n')) {\n const line = rawLine.trim()\n if (!line) continue\n const parsed = safeParseJson(line)\n if (!parsed || typeof parsed !== 'object') continue\n const cwd = (parsed as any).cwd\n if (typeof cwd === 'string' && cwd.trim()) return cwd.trim()\n }\n } catch {\n }\n return null\n}\n\nfunction sessionExistsInProject(cwd: string, sessionId: string): boolean {\n try {\n return existsSync(join(getSessionProjectDir(cwd), `${sessionId}.jsonl`))\n } catch {\n return false\n }\n}\n\nexport function resolvePybResumeSessionIdentifier(args: {\n cwd: string\n identifier: string\n}): ResumeResolveResult {\n const { cwd, identifier } = args\n const id = identifier.trim()\n if (!id) return { kind: 'not_found', identifier }\n\n if (isUuid(id)) {\n if (sessionExistsInProject(cwd, id)) return { kind: 'ok', sessionId: id }\n\n const elsewhere = findSessionFileAcrossProjects({ sessionId: id })\n if (elsewhere) {\n return {\n kind: 'different_directory',\n sessionId: id,\n otherCwd: readSessionCwdBestEffort(elsewhere.filePath),\n }\n }\n\n return { kind: 'not_found', identifier: id }\n }\n\n const sessions = listPybAgentSessions({ cwd })\n const matches = sessions\n .filter(s => s.slug === id || s.customTitle === id)\n .map(s => s.sessionId)\n\n if (matches.length === 1) return { kind: 'ok', sessionId: matches[0]! }\n if (matches.length > 1)\n return { kind: 'ambiguous', identifier: id, matchingSessionIds: matches }\n return { kind: 'not_found', identifier: id }\n}\n", "import { execFileSync } from 'child_process'\nimport {\n appendFileSync,\n existsSync,\n mkdirSync,\n readFileSync,\n statSync,\n writeFileSync,\n} from 'fs'\nimport { randomBytes } from 'crypto'\nimport { dirname, join } from 'path'\nimport type { Message } from '@query'\nimport { MACRO } from '@constants/macros'\nimport { getCwd } from '@utils/state'\nimport { getPybAgentSessionId } from './pybAgentSessionId'\nimport { resolveXdgDataPath } from '@utils/config/env'\nimport { getSessionStoreFlags } from '@utils/session/sessionStoreConfig'\nimport {\n tryDualWriteFileHistorySnapshot,\n tryDualWriteSessionMessage,\n tryDualWriteSessionMetaEvent,\n tryDualWriteSessionSummary,\n} from '@utils/session/sessionSqlDualWrite'\nimport {\n PLAN_SLUG_ADJECTIVES,\n PLAN_SLUG_NOUNS,\n PLAN_SLUG_VERBS,\n} from '@utils/plan/planSlugWords'\n\ntype PersistTarget =\n | { kind: 'session'; sessionId: string }\n | { kind: 'agent'; agentId: string }\n\ntype JsonlEnvelopeBase = {\n cwd: string\n sessionId: string\n version: string\n gitBranch?: string\n userType: string\n isSidechain: boolean\n parentUuid: string | null\n logicalParentUuid?: string\n agentId: string\n slug: string\n uuid: string\n timestamp: string\n}\n\ntype SessionJsonlEntry =\n | (JsonlEnvelopeBase & {\n type: 'user'\n message: any\n toolUseResult?: any\n })\n | (JsonlEnvelopeBase & {\n type: 'assistant'\n message: any\n requestId?: string\n isApiErrorMessage?: boolean\n })\n | { type: 'summary'; summary: string; leafUuid: string }\n | { type: 'custom-title'; sessionId: string; customTitle: string }\n | { type: 'tag'; sessionId: string; tag: string }\n | {\n type: 'file-history-snapshot'\n messageId: string\n snapshot: {\n messageId: string\n trackedFileBackups: Record<string, unknown>\n timestamp: string\n }\n isSnapshotUpdate: boolean\n }\n\nfunction getSessionStoreBaseDir(): string {\n return resolveXdgDataPath('sessions')\n}\n\nexport function sanitizeProjectNameForSessionStore(cwd: string): string {\n return cwd.replace(/[^a-zA-Z0-9]/g, '-')\n}\n\nexport function getSessionProjectsDir(): string {\n return join(getSessionStoreBaseDir(), 'projects')\n}\n\nexport function getSessionProjectDir(cwd: string): string {\n return join(getSessionProjectsDir(), sanitizeProjectNameForSessionStore(cwd))\n}\n\nexport function getSessionLogFilePath(args: {\n cwd: string\n sessionId: string\n}): string {\n return join(getSessionProjectDir(args.cwd), `${args.sessionId}.jsonl`)\n}\n\nexport function getAgentLogFilePath(args: {\n cwd: string\n agentId: string\n}): string {\n return join(getSessionProjectDir(args.cwd), `agent-${args.agentId}.jsonl`)\n}\n\nfunction safeMkdir(dir: string): void {\n if (existsSync(dir)) return\n mkdirSync(dir, { recursive: true })\n}\n\nfunction safeEnsureFile(path: string): void {\n safeMkdir(dirname(path))\n if (!existsSync(path)) writeFileSync(path, '', 'utf8')\n}\n\nfunction safeAppendJsonl(path: string, record: unknown): void {\n try {\n safeEnsureFile(path)\n appendFileSync(path, JSON.stringify(record) + '\\n', 'utf8')\n } catch {\n }\n}\n\nfunction shouldWriteJsonlForSessionStore(): boolean {\n const flags = getSessionStoreFlags()\n if (!flags.sqlWriteEnabled) return true\n return flags.jsonlWriteEnabled\n}\n\nconst lastUuidByFile = new Map<string, string | null>()\nconst snapshotWrittenByFile = new Set<string>()\nconst slugBySessionId = new Map<string, string>()\nlet currentSessionCustomTitle: string | null = null\nlet currentSessionTag: string | null = null\n\ntype LastPersistedInfo = { uuid: string | null; slug: string | null }\n\nfunction safeReadLastPersistedInfo(filePath: string): LastPersistedInfo {\n try {\n if (!existsSync(filePath)) return { uuid: null, slug: null }\n const content = readFileSync(filePath, 'utf8')\n const lines = content.split('\\n')\n\n let lastSlug: string | null = null\n for (let i = lines.length - 1; i >= 0; i--) {\n const line = lines[i]?.trim()\n if (!line) continue\n let parsed: any\n try {\n parsed = JSON.parse(line)\n } catch {\n continue\n }\n if (!parsed || typeof parsed !== 'object') continue\n\n if (!lastSlug && typeof parsed.slug === 'string' && parsed.slug.trim()) {\n lastSlug = parsed.slug.trim()\n }\n\n if (typeof parsed.uuid === 'string' && parsed.uuid) {\n return { uuid: parsed.uuid, slug: lastSlug }\n }\n }\n\n return { uuid: null, slug: lastSlug }\n } catch {\n return { uuid: null, slug: null }\n }\n}\n\nfunction pickIndex(length: number): number {\n return randomBytes(4).readUInt32BE(0) % length\n}\n\nfunction pickWord(words: readonly string[]): string {\n return words[pickIndex(words.length)]!\n}\n\nfunction generateSessionSlug(): string {\n const adjective = pickWord(PLAN_SLUG_ADJECTIVES)\n const verb = pickWord(PLAN_SLUG_VERBS)\n const noun = pickWord(PLAN_SLUG_NOUNS)\n return `${adjective}-${verb}-${noun}`\n}\n\nfunction getOrCreateSessionSlug(sessionId: string): string {\n const existing = slugBySessionId.get(sessionId)\n if (existing) return existing\n const slug = generateSessionSlug()\n slugBySessionId.set(sessionId, slug)\n return slug\n}\n\ntype GitBranchCacheEntry = { cwd: string; value: string | undefined }\nlet gitBranchCache: GitBranchCacheEntry | null = null\n\nfunction getGitBranchBestEffort(cwd: string): string | undefined {\n if (gitBranchCache && gitBranchCache.cwd === cwd) return gitBranchCache.value\n\n let value: string | undefined\n try {\n const stdout = execFileSync('git', ['rev-parse', '--abbrev-ref', 'HEAD'], {\n cwd,\n stdio: ['ignore', 'pipe', 'ignore'],\n timeout: 750,\n })\n const branch = stdout.toString('utf8').trim()\n value = branch || undefined\n } catch {\n value = undefined\n }\n\n gitBranchCache = { cwd, value }\n return value\n}\n\nfunction ensureFileHistorySnapshot(\n filePath: string,\n sessionId: string,\n firstMessageUuid: string,\n): void {\n if (snapshotWrittenByFile.has(filePath)) return\n const shouldWriteJsonl = shouldWriteJsonlForSessionStore()\n\n if (shouldWriteJsonl) {\n try {\n safeEnsureFile(filePath)\n const size = statSync(filePath).size\n if (size > 0) {\n snapshotWrittenByFile.add(filePath)\n return\n }\n } catch {\n }\n }\n\n const now = new Date().toISOString()\n const snapshot = {\n messageId: firstMessageUuid,\n trackedFileBackups: {},\n timestamp: now,\n }\n if (shouldWriteJsonl) {\n safeAppendJsonl(filePath, {\n type: 'file-history-snapshot',\n messageId: firstMessageUuid,\n snapshot,\n isSnapshotUpdate: false,\n } satisfies SessionJsonlEntry)\n }\n tryDualWriteFileHistorySnapshot({\n sessionId,\n messageUuid: firstMessageUuid,\n snapshot: snapshot as Record<string, any>,\n isSnapshotUpdate: false,\n timestampIso: now,\n })\n\n snapshotWrittenByFile.add(filePath)\n}\n\nfunction resolvePersistTarget(toolUseContext: {\n agentId?: string\n}): PersistTarget {\n const agentId = toolUseContext.agentId\n if (agentId && agentId !== 'main') return { kind: 'agent', agentId }\n return { kind: 'session', sessionId: getPybAgentSessionId() }\n}\n\nexport function appendSessionJsonlFromMessage(args: {\n message: Message\n toolUseContext: { agentId?: string }\n}): void {\n const { message, toolUseContext } = args\n if (message.type !== 'user' && message.type !== 'assistant') return\n\n const cwd = getCwd()\n const userType = (process.env.USER_TYPE ?? 'external').trim() || 'external'\n const sessionId = getPybAgentSessionId()\n const agentId = (toolUseContext.agentId ?? 'main').trim() || 'main'\n const isSidechain = agentId !== 'main'\n const gitBranch = getGitBranchBestEffort(cwd)\n\n const target = resolvePersistTarget(toolUseContext)\n const filePath =\n target.kind === 'agent'\n ? getAgentLogFilePath({ cwd, agentId: target.agentId })\n : getSessionLogFilePath({ cwd, sessionId: target.sessionId })\n\n if (!lastUuidByFile.has(filePath)) {\n const info = safeReadLastPersistedInfo(filePath)\n lastUuidByFile.set(filePath, info.uuid)\n if (info.slug) slugBySessionId.set(sessionId, info.slug)\n }\n const previousUuid = lastUuidByFile.get(filePath) ?? null\n\n const slug = getOrCreateSessionSlug(sessionId)\n\n if (target.kind === 'session') {\n ensureFileHistorySnapshot(filePath, sessionId, message.uuid)\n }\n\n const base: JsonlEnvelopeBase = {\n parentUuid: previousUuid,\n logicalParentUuid: undefined,\n isSidechain,\n userType,\n cwd,\n sessionId,\n version: MACRO.VERSION,\n ...(gitBranch ? { gitBranch } : {}),\n agentId,\n slug,\n uuid: message.uuid,\n timestamp: new Date().toISOString(),\n }\n\n const record: SessionJsonlEntry =\n message.type === 'user'\n ? {\n ...base,\n type: 'user',\n message: message.message,\n ...(message.toolUseResult?.data !== undefined\n ? { toolUseResult: message.toolUseResult.data }\n : {}),\n }\n : {\n ...base,\n type: 'assistant',\n message: message.message,\n ...(typeof (message as any).requestId === 'string'\n ? { requestId: String((message as any).requestId) }\n : {}),\n ...(message.isApiErrorMessage ? { isApiErrorMessage: true } : {}),\n }\n\n if (shouldWriteJsonlForSessionStore()) {\n safeAppendJsonl(filePath, record)\n }\n tryDualWriteSessionMessage({\n message,\n sessionId,\n agentId,\n parentUuid: previousUuid,\n logicalParentUuid: undefined,\n timestampIso: base.timestamp,\n })\n lastUuidByFile.set(filePath, message.uuid)\n}\n\nexport function appendSessionSummaryRecord(args: {\n summary: string\n leafUuid: string\n sessionId?: string\n}): void {\n const sessionId = args.sessionId ?? getPybAgentSessionId()\n const cwd = getCwd()\n if (shouldWriteJsonlForSessionStore()) {\n safeAppendJsonl(getSessionLogFilePath({ cwd, sessionId }), {\n type: 'summary',\n summary: args.summary,\n leafUuid: args.leafUuid,\n } satisfies SessionJsonlEntry)\n }\n tryDualWriteSessionSummary({\n sessionId,\n summary: args.summary,\n leafUuid: args.leafUuid,\n timestampIso: new Date().toISOString(),\n })\n}\n\nexport function appendSessionCustomTitleRecord(args: {\n sessionId: string\n customTitle: string\n}): void {\n const cwd = getCwd()\n if (shouldWriteJsonlForSessionStore()) {\n safeAppendJsonl(getSessionLogFilePath({ cwd, sessionId: args.sessionId }), {\n type: 'custom-title',\n sessionId: args.sessionId,\n customTitle: args.customTitle,\n } satisfies SessionJsonlEntry)\n }\n tryDualWriteSessionMetaEvent({\n sessionId: args.sessionId,\n eventType: 'custom-title',\n payload: { customTitle: args.customTitle },\n timestampIso: new Date().toISOString(),\n })\n if (args.sessionId === getPybAgentSessionId()) {\n currentSessionCustomTitle = args.customTitle\n }\n}\n\nexport function appendSessionTagRecord(args: {\n sessionId: string\n tag: string\n}): void {\n const cwd = getCwd()\n if (shouldWriteJsonlForSessionStore()) {\n safeAppendJsonl(getSessionLogFilePath({ cwd, sessionId: args.sessionId }), {\n type: 'tag',\n sessionId: args.sessionId,\n tag: args.tag,\n } satisfies SessionJsonlEntry)\n }\n tryDualWriteSessionMetaEvent({\n sessionId: args.sessionId,\n eventType: 'tag',\n payload: { tag: args.tag },\n timestampIso: new Date().toISOString(),\n })\n if (args.sessionId === getPybAgentSessionId()) {\n currentSessionTag = args.tag\n }\n}\n\nexport function getCurrentSessionCustomTitle(): string | null {\n return currentSessionCustomTitle\n}\n\nexport function getCurrentSessionTag(): string | null {\n return currentSessionTag\n}\n\nexport function resetSessionJsonlStateForTests(): void {\n lastUuidByFile.clear()\n snapshotWrittenByFile.clear()\n slugBySessionId.clear()\n gitBranchCache = null\n currentSessionCustomTitle = null\n currentSessionTag = null\n}\n", "export type SessionSqlDualWriteSnapshot = {\n successCount: number\n failCount: number\n totalLatencyMs: number\n lastErrorCode: string | null\n}\n\nexport type SessionSqlDualWriteMetrics = SessionSqlDualWriteSnapshot & {\n totalAttempts: number\n successRate: number\n avgSuccessLatencyMs: number\n}\n\nconst state: SessionSqlDualWriteSnapshot = {\n successCount: 0,\n failCount: 0,\n totalLatencyMs: 0,\n lastErrorCode: null,\n}\n\nexport function recordSessionSqlDualWriteSuccess(latencyMs: number) {\n state.successCount += 1\n state.totalLatencyMs += Math.max(0, Number(latencyMs) || 0)\n}\n\nexport function recordSessionSqlDualWriteFailure(errorCode?: string | null) {\n state.failCount += 1\n state.lastErrorCode = errorCode ? String(errorCode) : 'SESSION_SQL_DUALWRITE_FAILED'\n}\n\nexport function getSessionSqlDualWriteSnapshot(): SessionSqlDualWriteSnapshot {\n return { ...state }\n}\n\nexport function getSessionSqlDualWriteMetrics(): SessionSqlDualWriteMetrics {\n const totalAttempts = state.successCount + state.failCount\n const successRate = totalAttempts > 0 ? state.successCount / totalAttempts : 0\n const avgSuccessLatencyMs =\n state.successCount > 0 ? state.totalLatencyMs / state.successCount : 0\n return {\n ...state,\n totalAttempts,\n successRate,\n avgSuccessLatencyMs,\n }\n}\n\nexport function resetSessionSqlDualWriteTelemetry() {\n state.successCount = 0\n state.failCount = 0\n state.totalLatencyMs = 0\n state.lastErrorCode = null\n}\n", "import type { Message } from '@query'\nimport { createSessionSqlStore } from './sessionSqlStore'\nimport { getSessionStoreFlags } from './sessionStoreConfig'\nimport {\n recordSessionSqlDualWriteFailure,\n recordSessionSqlDualWriteSuccess,\n} from './sessionSqlDualWriteTelemetry'\n\nfunction parseTime(timestampIso: string): number {\n return Number(Date.parse(timestampIso)) || Date.now()\n}\n\nfunction withSessionSqlDualWrite(action: (store: ReturnType<typeof createSessionSqlStore>) => void) {\n const flags = getSessionStoreFlags()\n if (!flags.sqlWriteEnabled) return\n const startedAt = Date.now()\n let store: ReturnType<typeof createSessionSqlStore> | null = null\n try {\n store = createSessionSqlStore()\n action(store)\n recordSessionSqlDualWriteSuccess(Date.now() - startedAt)\n } catch (error: any) {\n const errorCode =\n typeof error?.code === 'string'\n ? error.code\n : typeof error?.name === 'string'\n ? error.name\n : null\n recordSessionSqlDualWriteFailure(errorCode)\n } finally {\n try {\n store?.close()\n } catch {}\n }\n}\n\nexport function tryDualWriteSessionMessage(input: {\n message: Message\n sessionId: string\n agentId: string\n parentUuid: string | null\n logicalParentUuid?: string\n timestampIso: string\n}) {\n const message = input.message\n if (message.type !== 'user' && message.type !== 'assistant') return\n withSessionSqlDualWrite(store => {\n const timeCreated = parseTime(input.timestampIso)\n store.appendMessages([\n {\n sessionId: input.sessionId,\n uuid: message.uuid,\n role: message.type,\n timeCreated,\n rawMessage: message.message as any,\n agentId: input.agentId,\n parentUuid: input.parentUuid,\n logicalParentUuid: input.logicalParentUuid ?? null,\n requestId:\n message.type === 'assistant' && typeof (message as any).requestId === 'string'\n ? String((message as any).requestId)\n : null,\n isApiError:\n message.type === 'assistant' ? Boolean(message.isApiErrorMessage) : false,\n },\n ])\n const blocks = Array.isArray((message as any)?.message?.content)\n ? ((message as any).message.content as Array<Record<string, any>>)\n : []\n if (blocks.length > 0) {\n store.appendParts(\n blocks.map((block, partIndex) => ({\n id: `${message.uuid}:${partIndex}`,\n messageUuid: message.uuid,\n sessionId: input.sessionId,\n partIndex,\n partType: String(block?.type ?? 'unknown'),\n rawPart: block ?? {},\n timeCreated,\n })),\n )\n }\n })\n}\n\nexport function tryDualWriteSessionSummary(input: {\n sessionId: string\n leafUuid: string\n summary: string\n timestampIso: string\n}) {\n withSessionSqlDualWrite(store => {\n const timeCreated = parseTime(input.timestampIso)\n store.appendSessionSummaries([\n {\n id: `${input.sessionId}:${input.leafUuid}:${timeCreated}`,\n sessionId: input.sessionId,\n leafUuid: input.leafUuid,\n summary: input.summary,\n timeCreated,\n },\n ])\n })\n}\n\nexport function tryDualWriteSessionMetaEvent(input: {\n sessionId: string\n eventType: 'custom-title' | 'tag'\n payload: Record<string, any>\n timestampIso: string\n}) {\n withSessionSqlDualWrite(store => {\n const timeCreated = parseTime(input.timestampIso)\n const eventKey =\n input.eventType === 'custom-title'\n ? String(input.payload.customTitle ?? '')\n : String(input.payload.tag ?? '')\n store.appendSessionMetaEvents([\n {\n id: `${input.sessionId}:${input.eventType}:${timeCreated}:${eventKey}`,\n sessionId: input.sessionId,\n eventType: input.eventType,\n payload: input.payload,\n timeCreated,\n },\n ])\n })\n}\n\nexport function tryDualWriteFileHistorySnapshot(input: {\n sessionId: string\n messageUuid: string\n snapshot: Record<string, any>\n isSnapshotUpdate: boolean\n timestampIso: string\n}) {\n withSessionSqlDualWrite(store => {\n const timeCreated = parseTime(input.timestampIso)\n store.appendFileHistorySnapshots([\n {\n id: `${input.sessionId}:${input.messageUuid}:${timeCreated}`,\n sessionId: input.sessionId,\n messageUuid: input.messageUuid,\n snapshot: input.snapshot,\n isSnapshotUpdate: input.isSnapshotUpdate,\n timeCreated,\n },\n ])\n })\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["existsSync", "readFileSync", "statSync", "join", "statSync", "readFileSync", "summary", "existsSync", "join"]
7
+ }
@@ -2,7 +2,7 @@ import { createRequire as __pybCreateRequire } from "node:module";
2
2
  const require = __pybCreateRequire(import.meta.url);
3
3
  import {
4
4
  MACRO
5
- } from "./chunk-TXZ5UTGP.js";
5
+ } from "./chunk-7SYDIES4.js";
6
6
 
7
7
  // src/utils/state/index.ts
8
8
  import { cwd } from "process";
@@ -3244,6 +3244,9 @@ export {
3244
3244
  GLOBAL_CONFIG_FILE,
3245
3245
  MEMORY_DIR,
3246
3246
  env,
3247
+ PLAN_SLUG_ADJECTIVES,
3248
+ PLAN_SLUG_VERBS,
3249
+ PLAN_SLUG_NOUNS,
3247
3250
  getPlanConversationKey,
3248
3251
  setActivePlanConversationKey,
3249
3252
  getPlanModeSystemPromptAdditions,