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.
- package/dist/REPL-CI5ET6VF.js +50 -0
- package/dist/{acp-VH2FWCMR.js → acp-5G7LPADD.js} +32 -32
- package/dist/{agentsValidate-4E7AHAMS.js → agentsValidate-BIRAVXBL.js} +7 -7
- package/dist/{ask-R3YZ5B44.js → ask-XQZT6WIO.js} +31 -31
- package/dist/{autoUpdater-DCNAXD4F.js → autoUpdater-DDJAJPKA.js} +3 -3
- package/dist/{chunk-GIXE5FJ2.js → chunk-2GHNW642.js} +1 -1
- package/dist/{chunk-NRQHLVJJ.js → chunk-2SVUNNJB.js} +2 -2
- package/dist/{chunk-6UNYL6XK.js → chunk-3CC7QXCN.js} +222 -75
- package/dist/chunk-3CC7QXCN.js.map +7 -0
- package/dist/{chunk-H2ZE5QDY.js → chunk-4ZZYPG6P.js} +4 -4
- package/dist/{chunk-TBEA6BY3.js → chunk-5B7UCAYL.js} +1 -1
- package/dist/{chunk-ZQR3MM2D.js → chunk-652OMXEE.js} +2 -2
- package/dist/{chunk-EP62LHB7.js → chunk-6QGIRDZS.js} +1 -1
- package/dist/{chunk-BED7SG2Q.js → chunk-76BOJQUE.js} +1 -1
- package/dist/{chunk-TXZ5UTGP.js → chunk-7SYDIES4.js} +1 -1
- package/dist/{chunk-TXZ5UTGP.js.map → chunk-7SYDIES4.js.map} +1 -1
- package/dist/{chunk-CSONCQLF.js → chunk-A6QEPK5J.js} +2 -2
- package/dist/{chunk-X5LLT4P2.js → chunk-ABJT5MG2.js} +1 -1
- package/dist/{chunk-56IL2VXC.js → chunk-C2GNLGBM.js} +1 -1
- package/dist/{chunk-2OOER4FR.js → chunk-CNMNKSWQ.js} +3 -3
- package/dist/{chunk-QE7PZPHW.js → chunk-CT7LWVB7.js} +1 -1
- package/dist/{chunk-P5NTGZ5H.js → chunk-CZZKRPE2.js} +1 -1
- package/dist/{chunk-P5NTGZ5H.js.map → chunk-CZZKRPE2.js.map} +1 -1
- package/dist/chunk-G5MP72ZL.js +515 -0
- package/dist/chunk-G5MP72ZL.js.map +7 -0
- package/dist/{chunk-25GZITCX.js → chunk-GU4XA76N.js} +3 -3
- package/dist/chunk-KQZAS4DO.js +582 -0
- package/dist/chunk-KQZAS4DO.js.map +7 -0
- package/dist/{chunk-VP5A6FKG.js → chunk-LBDLSBXN.js} +4 -1
- package/dist/{chunk-SE7UGQCE.js → chunk-M7FEUIHO.js} +2 -2
- package/dist/{chunk-HA7FKBZI.js → chunk-MMW6MLFR.js} +2 -2
- package/dist/{chunk-XRLMQN3Q.js → chunk-MN77HNBB.js} +4 -4
- package/dist/{chunk-VY5KEHU5.js → chunk-N7GEPTZB.js} +3 -3
- package/dist/{chunk-MMMMRMOG.js → chunk-O7LWCCRJ.js} +3 -3
- package/dist/{chunk-5VO2CFAL.js → chunk-PUPDIRI6.js} +2 -2
- package/dist/{chunk-YQ2RQUQF.js → chunk-QCI5HPTA.js} +1 -1
- package/dist/{chunk-KMCUZUZG.js → chunk-QSMZLK7K.js} +3 -3
- package/dist/{chunk-4ZGZTWMR.js → chunk-S65MIABQ.js} +4 -4
- package/dist/{chunk-3UWTN6DM.js → chunk-V22PQM4W.js} +3 -3
- package/dist/{chunk-RQ5X6LFM.js → chunk-VVXC3SNP.js} +4 -4
- package/dist/{chunk-LRL3MYKR.js → chunk-W7VIESST.js} +3 -3
- package/dist/{chunk-CPYDPN2J.js → chunk-XEVB4WON.js} +15 -15
- package/dist/chunk-ZB3ZWD2K.js +96 -0
- package/dist/chunk-ZB3ZWD2K.js.map +7 -0
- package/dist/{cli-RBMZQ5KF.js → cli-YIANCHDD.js} +130 -103
- package/dist/cli-YIANCHDD.js.map +7 -0
- package/dist/commands-4YMZW52K.js +54 -0
- package/dist/{config-7TO5SQU5.js → config-QVH3VNUQ.js} +4 -4
- package/dist/{context-LRA2DKJT.js → context-5VXEWH3G.js} +6 -6
- package/dist/{conversationPersistence-Z4QSI5NB.js → conversationPersistence-INUNJHOV.js} +3 -3
- package/dist/{conversationTracker-B3DMEHMA.js → conversationTracker-H25IOHBE.js} +4 -4
- package/dist/{customCommands-6JZ2VUO2.js → customCommands-7RZHKH2K.js} +4 -4
- package/dist/{env-37ALKFXU.js → env-DPJTGHMP.js} +2 -2
- package/dist/{file-7EOMBX72.js → file-D7W2FBZP.js} +4 -4
- package/dist/index.js +3 -3
- package/dist/{llm-3KQG5NEP.js → llm-TOU5REY5.js} +32 -32
- package/dist/{llmLazy-ENEH3KAB.js → llmLazy-HSKKIGLC.js} +1 -1
- package/dist/{loader-D6V3WFL6.js → loader-YUP6OJTJ.js} +4 -4
- package/dist/{lsp-CTPOMI7O.js → lsp-7QKC4DVK.js} +6 -6
- package/dist/{lspAnchor-PPPTHRQH.js → lspAnchor-LCRZ23GA.js} +6 -6
- package/dist/{mcp-6M34WBA5.js → mcp-KK6BOD6I.js} +7 -7
- package/dist/{mentionProcessor-TS4SITI3.js → mentionProcessor-V6JH6HUD.js} +5 -5
- package/dist/{messages-BINU6SYX.js → messages-7NVTXWIJ.js} +1 -1
- package/dist/{model-6IW224UU.js → model-QSDSUJDB.js} +5 -5
- package/dist/{openai-O6CGVMYK.js → openai-JC3KJN3H.js} +5 -5
- package/dist/{outputStyles-7PPMLSV6.js → outputStyles-TPH3CCB4.js} +4 -4
- package/dist/{pluginRuntime-RU5STQ6F.js → pluginRuntime-7EK4LQDD.js} +6 -6
- package/dist/{pluginValidation-JTJTB3TB.js → pluginValidation-BJWCS55I.js} +6 -6
- package/dist/prompts-KQNPPEOG.js +56 -0
- package/dist/{pybAgentSessionLoad-ZXQAHTQS.js → pybAgentSessionLoad-V3IAJJPS.js} +4 -6
- package/dist/{pybAgentSessionResume-R73KFN3V.js → pybAgentSessionResume-WE7ET356.js} +4 -4
- package/dist/{pybAgentStreamJsonSession-N4SMTC64.js → pybAgentStreamJsonSession-VWDYV4XL.js} +1 -1
- package/dist/{pybHooks-NGJ5OFAI.js → pybHooks-UV7BTIVT.js} +4 -4
- package/dist/query-KAZY5LOW.js +54 -0
- package/dist/{registry-FKY6JQ3L.js → registry-FK6UGJPV.js} +5 -5
- package/dist/{ripgrep-O7MOW25M.js → ripgrep-CXJ4DFPU.js} +3 -3
- package/dist/{skillMarketplace-VK3AYR6Q.js → skillMarketplace-QUJXDKZK.js} +3 -3
- package/dist/{state-T57IG35V.js → state-GC3XELIE.js} +2 -2
- package/dist/{theme-ZEFQIPVH.js → theme-24PLJSPD.js} +5 -5
- package/dist/{toolPermissionSettings-ERNXVP7A.js → toolPermissionSettings-S6NJPBKT.js} +6 -6
- package/dist/tools-NC5R4I6F.js +55 -0
- package/dist/{userInput-JBAUBHGI.js → userInput-4VZSNII7.js} +34 -34
- package/package.json +1 -1
- package/dist/REPL-64WF5V7K.js +0 -50
- package/dist/chunk-6UNYL6XK.js.map +0 -7
- package/dist/chunk-BRSPPFSY.js +0 -196
- package/dist/chunk-BRSPPFSY.js.map +0 -7
- package/dist/chunk-N3T2WAYN.js +0 -138
- package/dist/chunk-N3T2WAYN.js.map +0 -7
- package/dist/chunk-TSAURYF2.js +0 -81
- package/dist/chunk-TSAURYF2.js.map +0 -7
- package/dist/cli-RBMZQ5KF.js.map +0 -7
- package/dist/commands-WPHK776A.js +0 -54
- package/dist/prompts-CAPCICF3.js +0 -56
- package/dist/query-CYTIVMQ6.js +0 -54
- package/dist/tools-2XLLIKZM.js +0 -55
- /package/dist/{REPL-64WF5V7K.js.map → REPL-CI5ET6VF.js.map} +0 -0
- /package/dist/{acp-VH2FWCMR.js.map → acp-5G7LPADD.js.map} +0 -0
- /package/dist/{agentsValidate-4E7AHAMS.js.map → agentsValidate-BIRAVXBL.js.map} +0 -0
- /package/dist/{ask-R3YZ5B44.js.map → ask-XQZT6WIO.js.map} +0 -0
- /package/dist/{autoUpdater-DCNAXD4F.js.map → autoUpdater-DDJAJPKA.js.map} +0 -0
- /package/dist/{chunk-GIXE5FJ2.js.map → chunk-2GHNW642.js.map} +0 -0
- /package/dist/{chunk-NRQHLVJJ.js.map → chunk-2SVUNNJB.js.map} +0 -0
- /package/dist/{chunk-H2ZE5QDY.js.map → chunk-4ZZYPG6P.js.map} +0 -0
- /package/dist/{chunk-TBEA6BY3.js.map → chunk-5B7UCAYL.js.map} +0 -0
- /package/dist/{chunk-ZQR3MM2D.js.map → chunk-652OMXEE.js.map} +0 -0
- /package/dist/{chunk-EP62LHB7.js.map → chunk-6QGIRDZS.js.map} +0 -0
- /package/dist/{chunk-BED7SG2Q.js.map → chunk-76BOJQUE.js.map} +0 -0
- /package/dist/{chunk-CSONCQLF.js.map → chunk-A6QEPK5J.js.map} +0 -0
- /package/dist/{chunk-X5LLT4P2.js.map → chunk-ABJT5MG2.js.map} +0 -0
- /package/dist/{chunk-56IL2VXC.js.map → chunk-C2GNLGBM.js.map} +0 -0
- /package/dist/{chunk-2OOER4FR.js.map → chunk-CNMNKSWQ.js.map} +0 -0
- /package/dist/{chunk-QE7PZPHW.js.map → chunk-CT7LWVB7.js.map} +0 -0
- /package/dist/{chunk-25GZITCX.js.map → chunk-GU4XA76N.js.map} +0 -0
- /package/dist/{chunk-VP5A6FKG.js.map → chunk-LBDLSBXN.js.map} +0 -0
- /package/dist/{chunk-SE7UGQCE.js.map → chunk-M7FEUIHO.js.map} +0 -0
- /package/dist/{chunk-HA7FKBZI.js.map → chunk-MMW6MLFR.js.map} +0 -0
- /package/dist/{chunk-XRLMQN3Q.js.map → chunk-MN77HNBB.js.map} +0 -0
- /package/dist/{chunk-VY5KEHU5.js.map → chunk-N7GEPTZB.js.map} +0 -0
- /package/dist/{chunk-MMMMRMOG.js.map → chunk-O7LWCCRJ.js.map} +0 -0
- /package/dist/{chunk-5VO2CFAL.js.map → chunk-PUPDIRI6.js.map} +0 -0
- /package/dist/{chunk-YQ2RQUQF.js.map → chunk-QCI5HPTA.js.map} +0 -0
- /package/dist/{chunk-KMCUZUZG.js.map → chunk-QSMZLK7K.js.map} +0 -0
- /package/dist/{chunk-4ZGZTWMR.js.map → chunk-S65MIABQ.js.map} +0 -0
- /package/dist/{chunk-3UWTN6DM.js.map → chunk-V22PQM4W.js.map} +0 -0
- /package/dist/{chunk-RQ5X6LFM.js.map → chunk-VVXC3SNP.js.map} +0 -0
- /package/dist/{chunk-LRL3MYKR.js.map → chunk-W7VIESST.js.map} +0 -0
- /package/dist/{chunk-CPYDPN2J.js.map → chunk-XEVB4WON.js.map} +0 -0
- /package/dist/{commands-WPHK776A.js.map → commands-4YMZW52K.js.map} +0 -0
- /package/dist/{config-7TO5SQU5.js.map → config-QVH3VNUQ.js.map} +0 -0
- /package/dist/{context-LRA2DKJT.js.map → context-5VXEWH3G.js.map} +0 -0
- /package/dist/{conversationPersistence-Z4QSI5NB.js.map → conversationPersistence-INUNJHOV.js.map} +0 -0
- /package/dist/{conversationTracker-B3DMEHMA.js.map → conversationTracker-H25IOHBE.js.map} +0 -0
- /package/dist/{customCommands-6JZ2VUO2.js.map → customCommands-7RZHKH2K.js.map} +0 -0
- /package/dist/{env-37ALKFXU.js.map → env-DPJTGHMP.js.map} +0 -0
- /package/dist/{file-7EOMBX72.js.map → file-D7W2FBZP.js.map} +0 -0
- /package/dist/{llm-3KQG5NEP.js.map → llm-TOU5REY5.js.map} +0 -0
- /package/dist/{llmLazy-ENEH3KAB.js.map → llmLazy-HSKKIGLC.js.map} +0 -0
- /package/dist/{loader-D6V3WFL6.js.map → loader-YUP6OJTJ.js.map} +0 -0
- /package/dist/{lsp-CTPOMI7O.js.map → lsp-7QKC4DVK.js.map} +0 -0
- /package/dist/{lspAnchor-PPPTHRQH.js.map → lspAnchor-LCRZ23GA.js.map} +0 -0
- /package/dist/{mcp-6M34WBA5.js.map → mcp-KK6BOD6I.js.map} +0 -0
- /package/dist/{mentionProcessor-TS4SITI3.js.map → mentionProcessor-V6JH6HUD.js.map} +0 -0
- /package/dist/{messages-BINU6SYX.js.map → messages-7NVTXWIJ.js.map} +0 -0
- /package/dist/{model-6IW224UU.js.map → model-QSDSUJDB.js.map} +0 -0
- /package/dist/{openai-O6CGVMYK.js.map → openai-JC3KJN3H.js.map} +0 -0
- /package/dist/{outputStyles-7PPMLSV6.js.map → outputStyles-TPH3CCB4.js.map} +0 -0
- /package/dist/{pluginRuntime-RU5STQ6F.js.map → pluginRuntime-7EK4LQDD.js.map} +0 -0
- /package/dist/{pluginValidation-JTJTB3TB.js.map → pluginValidation-BJWCS55I.js.map} +0 -0
- /package/dist/{prompts-CAPCICF3.js.map → prompts-KQNPPEOG.js.map} +0 -0
- /package/dist/{pybAgentSessionLoad-ZXQAHTQS.js.map → pybAgentSessionLoad-V3IAJJPS.js.map} +0 -0
- /package/dist/{pybAgentSessionResume-R73KFN3V.js.map → pybAgentSessionResume-WE7ET356.js.map} +0 -0
- /package/dist/{pybAgentStreamJsonSession-N4SMTC64.js.map → pybAgentStreamJsonSession-VWDYV4XL.js.map} +0 -0
- /package/dist/{pybHooks-NGJ5OFAI.js.map → pybHooks-UV7BTIVT.js.map} +0 -0
- /package/dist/{query-CYTIVMQ6.js.map → query-KAZY5LOW.js.map} +0 -0
- /package/dist/{registry-FKY6JQ3L.js.map → registry-FK6UGJPV.js.map} +0 -0
- /package/dist/{ripgrep-O7MOW25M.js.map → ripgrep-CXJ4DFPU.js.map} +0 -0
- /package/dist/{skillMarketplace-VK3AYR6Q.js.map → skillMarketplace-QUJXDKZK.js.map} +0 -0
- /package/dist/{state-T57IG35V.js.map → state-GC3XELIE.js.map} +0 -0
- /package/dist/{theme-ZEFQIPVH.js.map → theme-24PLJSPD.js.map} +0 -0
- /package/dist/{toolPermissionSettings-ERNXVP7A.js.map → toolPermissionSettings-S6NJPBKT.js.map} +0 -0
- /package/dist/{tools-2XLLIKZM.js.map → tools-NC5R4I6F.js.map} +0 -0
- /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-
|
|
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,
|