reasonix 0.46.0 → 0.47.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +64 -12
- package/README.zh-CN.md +54 -9
- package/dashboard/dist/app.js +293 -66
- package/dashboard/dist/app.js.map +1 -1
- package/dist/cli/{acp-LGBLHBKY.js → acp-QK3DMC53.js} +22 -22
- package/dist/cli/chat-VV5UWY4V.js +51 -0
- package/dist/cli/{chunk-AVFXO2EZ.js → chunk-24A7FHGJ.js} +148 -16
- package/dist/cli/chunk-24A7FHGJ.js.map +1 -0
- package/dist/cli/chunk-25T6CVUP.js +0 -0
- package/dist/cli/chunk-2UQP6H6T.js +0 -0
- package/dist/cli/chunk-5QCB62C4.js +0 -0
- package/dist/cli/{chunk-YY227BIQ.js → chunk-6J6BSUCR.js} +2 -2
- package/dist/cli/chunk-6OWJV3YW.js +0 -0
- package/dist/cli/{chunk-A3TSSDS2.js → chunk-BWYVFFKR.js} +2 -2
- package/dist/cli/{chunk-C53JQES5.js → chunk-BYYVYJDX.js} +3 -3
- package/dist/cli/{chunk-HNXDZGC6.js → chunk-CI2PF5QX.js} +2 -2
- package/dist/cli/{chunk-GTZTQNX5.js → chunk-COWPEX54.js} +19 -9
- package/dist/cli/chunk-COWPEX54.js.map +1 -0
- package/dist/cli/{chunk-QJDDIK3Z.js → chunk-E5WCLUIU.js} +2 -2
- package/dist/cli/{chunk-NVURFF27.js → chunk-EQATK2L2.js} +2 -2
- package/dist/cli/{chunk-HKWSPKMU.js → chunk-FDKOUJKZ.js} +8 -8
- package/dist/cli/chunk-FEZK652I.js +0 -0
- package/dist/cli/{chunk-TEUDEGX2.js → chunk-FY4S7TJZ.js} +19 -5
- package/dist/cli/chunk-FY4S7TJZ.js.map +1 -0
- package/dist/cli/{chunk-RDRC3XDT.js → chunk-GDKB2PPK.js} +2 -2
- package/dist/cli/{chunk-XSU4QVFW.js → chunk-HIYTRCSW.js} +27 -14
- package/dist/cli/chunk-HIYTRCSW.js.map +1 -0
- package/dist/cli/{chunk-WL6SNQ5T.js → chunk-ICAFSZHS.js} +307 -114
- package/dist/cli/chunk-ICAFSZHS.js.map +1 -0
- package/dist/cli/{chunk-KQU2TYIL.js → chunk-ICSYGIPN.js} +1916 -1098
- package/dist/cli/chunk-ICSYGIPN.js.map +1 -0
- package/dist/cli/chunk-J5XJHLWM.js +0 -0
- package/dist/cli/chunk-JMBMLOBP.js +0 -0
- package/dist/cli/{chunk-MJ6W5UN3.js → chunk-K6GUKSXH.js} +3 -2
- package/dist/cli/chunk-K6GUKSXH.js.map +1 -0
- package/dist/cli/{chunk-IJ7JA32V.js → chunk-KDRUEXII.js} +189 -26
- package/dist/cli/chunk-KDRUEXII.js.map +1 -0
- package/dist/cli/{chunk-4HCP2UQW.js → chunk-LBLR4CUZ.js} +2 -2
- package/dist/cli/{chunk-2425HK6U.js → chunk-LGEKVMMV.js} +7 -2
- package/dist/cli/{chunk-2425HK6U.js.map → chunk-LGEKVMMV.js.map} +1 -1
- package/dist/cli/{chunk-I4L2GTSE.js → chunk-OJVITDGB.js} +2 -2
- package/dist/cli/chunk-PLHAZOLZ.js +0 -0
- package/dist/cli/{chunk-W7YGWUWU.js → chunk-QVDWH2A2.js} +3 -3
- package/dist/cli/{chunk-R3CTO2HM.js → chunk-QVUFWDD2.js} +2 -2
- package/dist/cli/{chunk-HVUZWNSP.js → chunk-R6GQKKBW.js} +2 -2
- package/dist/cli/{chunk-5ACMUK4Q.js → chunk-RRXUIPWG.js} +20 -18
- package/dist/cli/chunk-RRXUIPWG.js.map +1 -0
- package/dist/cli/chunk-S4XVGLRW.js +0 -0
- package/dist/cli/chunk-SZ5XES2N.js +0 -0
- package/dist/cli/{chunk-CXVWUPA3.js → chunk-TKVXTQ3T.js} +26 -26
- package/dist/cli/chunk-TKVXTQ3T.js.map +1 -0
- package/dist/cli/chunk-TUK7OWJA.js +0 -0
- package/dist/cli/{chunk-JNAQYELD.js → chunk-UDVFBEXC.js} +3 -3
- package/dist/cli/{chunk-CBIQWMS6.js → chunk-VC2CQA5D.js} +9 -9
- package/dist/cli/{chunk-ZZYBBX5N.js → chunk-VJMBISEI.js} +23 -9
- package/dist/cli/chunk-VJMBISEI.js.map +1 -0
- package/dist/cli/{chunk-WK3UFQY3.js → chunk-VKYSZKH2.js} +2 -2
- package/dist/cli/{chunk-LIR2HBQH.js → chunk-VMUUFWFF.js} +2 -2
- package/dist/cli/{chunk-V26WPN3J.js → chunk-VNQGCA3Q.js} +28 -1
- package/dist/cli/chunk-VNQGCA3Q.js.map +1 -0
- package/dist/cli/{chunk-5I2C4JEO.js → chunk-WF7TPVZM.js} +6 -6
- package/dist/cli/{chunk-5I2C4JEO.js.map → chunk-WF7TPVZM.js.map} +1 -1
- package/dist/cli/chunk-X53B3JIX.js +0 -0
- package/dist/cli/chunk-XJXDHAES.js +0 -0
- package/dist/cli/chunk-XXC2BYTV.js +0 -0
- package/dist/cli/{chunk-4CTDEJUF.js → chunk-YDPLF7XR.js} +26 -14
- package/dist/cli/chunk-YDPLF7XR.js.map +1 -0
- package/dist/cli/chunk-ZZM6QJ4W.js +0 -0
- package/dist/cli/{code-DFHSASJ4.js → code-C24TUAE5.js} +39 -35
- package/dist/cli/code-C24TUAE5.js.map +1 -0
- package/dist/cli/{commands-OCU42XG4.js → commands-RR3GIYOK.js} +4 -4
- package/dist/cli/{commit-XCQIQCYG.js → commit-FSHPIINM.js} +3 -3
- package/dist/cli/{desktop-ZCUG7LMF.js → desktop-7NCHPEFB.js} +263 -36
- package/dist/cli/desktop-7NCHPEFB.js.map +1 -0
- package/dist/cli/devtools-HW3WDT3Q.js +0 -0
- package/dist/cli/{diff-66B2KWOJ.js → diff-RAAHHLHV.js} +8 -8
- package/dist/cli/{doctor-Y73CPPRZ.js → doctor-PKVQIXRT.js} +9 -9
- package/dist/cli/{events-NGZ2OJYH.js → events-VRYXOSKI.js} +3 -3
- package/dist/cli/index.js +84 -92
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/{mcp-MPVGBBJF.js → mcp-CRJ26PP4.js} +2 -2
- package/dist/cli/{mcp-browse-4XOTC3FJ.js → mcp-browse-QPAOWZOP.js} +2 -2
- package/dist/cli/{mcp-inspect-CEMGKKAH.js → mcp-inspect-CVCLABRS.js} +4 -4
- package/dist/cli/{prompt-2D7ID24X.js → prompt-SKYXERSI.js} +4 -4
- package/dist/cli/{prune-sessions-OJEYYLHY.js → prune-sessions-SEWX7GP6.js} +2 -2
- package/dist/cli/{replay-AKYQNAQJ.js → replay-KPDW2ZMJ.js} +9 -9
- package/dist/cli/{run-5DPQFSP6.js → run-WIKDIXTG.js} +18 -19
- package/dist/cli/run-WIKDIXTG.js.map +1 -0
- package/dist/cli/{server-TQ2IHYQJ.js → server-P6V2G3P6.js} +82 -34
- package/dist/cli/server-P6V2G3P6.js.map +1 -0
- package/dist/cli/{sessions-KY54NG45.js → sessions-2NULRMSA.js} +29 -15
- package/dist/cli/sessions-2NULRMSA.js.map +1 -0
- package/dist/cli/{setup-XPIOZWS7.js → setup-Y5WDBQFL.js} +8 -8
- package/dist/cli/setup-Y5WDBQFL.js.map +1 -0
- package/dist/cli/{stats-X2VTWKNS.js → stats-T7BL2YOR.js} +6 -6
- package/dist/cli/update-6ITLPRDV.js +0 -0
- package/dist/cli/{version-7O6A5T7Q.js → version-3KWDNWLN.js} +15 -15
- package/dist/index.d.ts +54 -23
- package/dist/index.js +1613 -1152
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
- package/dist/cli/.-3G6VX5S7.js +0 -327
- package/dist/cli/.-6YRPB2C7.js +0 -329
- package/dist/cli/.-EYSVINK3.js +0 -317
- package/dist/cli/chat-ECK5ZGMV.js +0 -51
- package/dist/cli/chunk-4CTDEJUF.js.map +0 -1
- package/dist/cli/chunk-5ACMUK4Q.js.map +0 -1
- package/dist/cli/chunk-AVFXO2EZ.js.map +0 -1
- package/dist/cli/chunk-CXVWUPA3.js.map +0 -1
- package/dist/cli/chunk-GTZTQNX5.js.map +0 -1
- package/dist/cli/chunk-IJ7JA32V.js.map +0 -1
- package/dist/cli/chunk-KQU2TYIL.js.map +0 -1
- package/dist/cli/chunk-MJ6W5UN3.js.map +0 -1
- package/dist/cli/chunk-TEUDEGX2.js.map +0 -1
- package/dist/cli/chunk-V26WPN3J.js.map +0 -1
- package/dist/cli/chunk-WL6SNQ5T.js.map +0 -1
- package/dist/cli/chunk-XSU4QVFW.js.map +0 -1
- package/dist/cli/chunk-ZZYBBX5N.js.map +0 -1
- package/dist/cli/code-DFHSASJ4.js.map +0 -1
- package/dist/cli/desktop-ZCUG7LMF.js.map +0 -1
- package/dist/cli/doctor-Y73CPPRZ.js.map +0 -1
- package/dist/cli/prompt-2D7ID24X.js.map +0 -1
- package/dist/cli/run-5DPQFSP6.js.map +0 -1
- package/dist/cli/server-TQ2IHYQJ.js.map +0 -1
- package/dist/cli/sessions-KY54NG45.js.map +0 -1
- package/dist/cli/setup-XPIOZWS7.js.map +0 -1
- package/dist/cli/stats-X2VTWKNS.js.map +0 -1
- /package/dist/cli/{acp-LGBLHBKY.js.map → acp-QK3DMC53.js.map} +0 -0
- /package/dist/cli/{.-3G6VX5S7.js.map → chat-VV5UWY4V.js.map} +0 -0
- /package/dist/cli/{chunk-YY227BIQ.js.map → chunk-6J6BSUCR.js.map} +0 -0
- /package/dist/cli/{chunk-A3TSSDS2.js.map → chunk-BWYVFFKR.js.map} +0 -0
- /package/dist/cli/{chunk-C53JQES5.js.map → chunk-BYYVYJDX.js.map} +0 -0
- /package/dist/cli/{chunk-HNXDZGC6.js.map → chunk-CI2PF5QX.js.map} +0 -0
- /package/dist/cli/{chunk-QJDDIK3Z.js.map → chunk-E5WCLUIU.js.map} +0 -0
- /package/dist/cli/{chunk-NVURFF27.js.map → chunk-EQATK2L2.js.map} +0 -0
- /package/dist/cli/{chunk-HKWSPKMU.js.map → chunk-FDKOUJKZ.js.map} +0 -0
- /package/dist/cli/{chunk-RDRC3XDT.js.map → chunk-GDKB2PPK.js.map} +0 -0
- /package/dist/cli/{chunk-4HCP2UQW.js.map → chunk-LBLR4CUZ.js.map} +0 -0
- /package/dist/cli/{chunk-I4L2GTSE.js.map → chunk-OJVITDGB.js.map} +0 -0
- /package/dist/cli/{chunk-W7YGWUWU.js.map → chunk-QVDWH2A2.js.map} +0 -0
- /package/dist/cli/{chunk-R3CTO2HM.js.map → chunk-QVUFWDD2.js.map} +0 -0
- /package/dist/cli/{chunk-HVUZWNSP.js.map → chunk-R6GQKKBW.js.map} +0 -0
- /package/dist/cli/{chunk-JNAQYELD.js.map → chunk-UDVFBEXC.js.map} +0 -0
- /package/dist/cli/{chunk-CBIQWMS6.js.map → chunk-VC2CQA5D.js.map} +0 -0
- /package/dist/cli/{chunk-WK3UFQY3.js.map → chunk-VKYSZKH2.js.map} +0 -0
- /package/dist/cli/{chunk-LIR2HBQH.js.map → chunk-VMUUFWFF.js.map} +0 -0
- /package/dist/cli/{commands-OCU42XG4.js.map → commands-RR3GIYOK.js.map} +0 -0
- /package/dist/cli/{commit-XCQIQCYG.js.map → commit-FSHPIINM.js.map} +0 -0
- /package/dist/cli/{diff-66B2KWOJ.js.map → diff-RAAHHLHV.js.map} +0 -0
- /package/dist/cli/{.-6YRPB2C7.js.map → doctor-PKVQIXRT.js.map} +0 -0
- /package/dist/cli/{events-NGZ2OJYH.js.map → events-VRYXOSKI.js.map} +0 -0
- /package/dist/cli/{mcp-MPVGBBJF.js.map → mcp-CRJ26PP4.js.map} +0 -0
- /package/dist/cli/{mcp-browse-4XOTC3FJ.js.map → mcp-browse-QPAOWZOP.js.map} +0 -0
- /package/dist/cli/{mcp-inspect-CEMGKKAH.js.map → mcp-inspect-CVCLABRS.js.map} +0 -0
- /package/dist/cli/{.-EYSVINK3.js.map → prompt-SKYXERSI.js.map} +0 -0
- /package/dist/cli/{prune-sessions-OJEYYLHY.js.map → prune-sessions-SEWX7GP6.js.map} +0 -0
- /package/dist/cli/{replay-AKYQNAQJ.js.map → replay-KPDW2ZMJ.js.map} +0 -0
- /package/dist/cli/{chat-ECK5ZGMV.js.map → stats-T7BL2YOR.js.map} +0 -0
- /package/dist/cli/{version-7O6A5T7Q.js.map → version-3KWDNWLN.js.map} +0 -0
package/dist/cli/.-EYSVINK3.js
DELETED
|
@@ -1,317 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
import {
|
|
3
|
-
AT_MENTION_PATTERN,
|
|
4
|
-
AT_PICKER_PREFIX,
|
|
5
|
-
AppendOnlyLog,
|
|
6
|
-
CacheFirstLoop,
|
|
7
|
-
ChoiceRequestedError,
|
|
8
|
-
DEFAULT_AT_MENTION_MAX_BYTES,
|
|
9
|
-
DEFAULT_MAX_RESULT_CHARS,
|
|
10
|
-
DEFAULT_MAX_RESULT_TOKENS,
|
|
11
|
-
DEFAULT_PICKER_IGNORE_DIRS,
|
|
12
|
-
DeepSeekClient,
|
|
13
|
-
HOOK_EVENTS,
|
|
14
|
-
HOOK_SETTINGS_DIRNAME,
|
|
15
|
-
HOOK_SETTINGS_FILENAME,
|
|
16
|
-
ImmutablePrefix,
|
|
17
|
-
LATEST_CACHE_TTL_MS,
|
|
18
|
-
LATEST_FETCH_TIMEOUT_MS,
|
|
19
|
-
MCP_PROTOCOL_VERSION,
|
|
20
|
-
McpClient,
|
|
21
|
-
NeedsConfirmationError,
|
|
22
|
-
PlanCheckpointError,
|
|
23
|
-
PlanProposedError,
|
|
24
|
-
PlanRevisionProposedError,
|
|
25
|
-
SessionStats,
|
|
26
|
-
SseTransport,
|
|
27
|
-
StdioTransport,
|
|
28
|
-
StormBreaker,
|
|
29
|
-
StreamableHttpTransport,
|
|
30
|
-
ToolCallRepair,
|
|
31
|
-
ToolRegistry,
|
|
32
|
-
Usage,
|
|
33
|
-
VERSION,
|
|
34
|
-
VolatileScratch,
|
|
35
|
-
aggregateBranchUsage,
|
|
36
|
-
aggregateUsage,
|
|
37
|
-
analyzeSchema,
|
|
38
|
-
appendSessionMessage,
|
|
39
|
-
appendUsage,
|
|
40
|
-
applyEditBlock,
|
|
41
|
-
applyEditBlocks,
|
|
42
|
-
bridgeMcpTools,
|
|
43
|
-
bucketCacheHitRatio,
|
|
44
|
-
bucketSavingsFraction,
|
|
45
|
-
claudeEquivalentCost,
|
|
46
|
-
compareVersions,
|
|
47
|
-
computeReplayStats,
|
|
48
|
-
costUsd,
|
|
49
|
-
decideOutcome,
|
|
50
|
-
defaultSelector,
|
|
51
|
-
defaultUsageLogPath,
|
|
52
|
-
deleteSession,
|
|
53
|
-
detectAtPicker,
|
|
54
|
-
detectShellOperator,
|
|
55
|
-
diffTranscripts,
|
|
56
|
-
emptyPlanState,
|
|
57
|
-
expandAtMentions,
|
|
58
|
-
fetchWithRetry,
|
|
59
|
-
fixToolCallPairing,
|
|
60
|
-
flattenMcpResult,
|
|
61
|
-
flattenSchema,
|
|
62
|
-
forkRegistryExcluding,
|
|
63
|
-
formatCommandResult,
|
|
64
|
-
formatHookOutcomeMessage,
|
|
65
|
-
formatLogSize,
|
|
66
|
-
formatLoopError,
|
|
67
|
-
formatSearchResults,
|
|
68
|
-
getLatestVersion,
|
|
69
|
-
globalSettingsPath,
|
|
70
|
-
harvest,
|
|
71
|
-
healLoadedMessages,
|
|
72
|
-
healLoadedMessagesByTokens,
|
|
73
|
-
htmlToText,
|
|
74
|
-
injectPowerShellUtf8,
|
|
75
|
-
inputCostUsd,
|
|
76
|
-
inspectMcpServer,
|
|
77
|
-
isAllowed,
|
|
78
|
-
isJsonRpcError,
|
|
79
|
-
isNpxInstall,
|
|
80
|
-
isPlanStateEmpty,
|
|
81
|
-
listFilesSync,
|
|
82
|
-
listFilesWithStatsAsync,
|
|
83
|
-
listFilesWithStatsSync,
|
|
84
|
-
listSessions,
|
|
85
|
-
loadDotenv,
|
|
86
|
-
loadHooks,
|
|
87
|
-
loadSessionMessages,
|
|
88
|
-
matchesTool,
|
|
89
|
-
nestArguments,
|
|
90
|
-
openTranscriptFile,
|
|
91
|
-
outputCostUsd,
|
|
92
|
-
parseEditBlocks,
|
|
93
|
-
parseMcpSpec,
|
|
94
|
-
parseMojeekResults,
|
|
95
|
-
parseTranscript,
|
|
96
|
-
prepareSpawn,
|
|
97
|
-
projectSettingsPath,
|
|
98
|
-
quoteForCmdExe,
|
|
99
|
-
rankPickerCandidates,
|
|
100
|
-
readTranscript,
|
|
101
|
-
readUsageLog,
|
|
102
|
-
recordFromLoopEvent,
|
|
103
|
-
registerChoiceTool,
|
|
104
|
-
registerFilesystemTools,
|
|
105
|
-
registerMemoryTools,
|
|
106
|
-
registerPlanTool,
|
|
107
|
-
registerShellTools,
|
|
108
|
-
registerSubagentTool,
|
|
109
|
-
registerWebTools,
|
|
110
|
-
renderMarkdown,
|
|
111
|
-
renderSummaryTable,
|
|
112
|
-
repairTruncatedJson,
|
|
113
|
-
replayFromFile,
|
|
114
|
-
resolveExecutable,
|
|
115
|
-
restoreSnapshots,
|
|
116
|
-
runBranches,
|
|
117
|
-
runCommand,
|
|
118
|
-
runHooks,
|
|
119
|
-
sanitizeName,
|
|
120
|
-
scavengeToolCalls,
|
|
121
|
-
sessionPath,
|
|
122
|
-
sessionsDir,
|
|
123
|
-
similarity,
|
|
124
|
-
snapshotBeforeEdits,
|
|
125
|
-
stripHallucinatedToolMarkup,
|
|
126
|
-
tokenizeCommand,
|
|
127
|
-
truncateForModel,
|
|
128
|
-
truncateForModelByTokens,
|
|
129
|
-
webFetch,
|
|
130
|
-
webSearch,
|
|
131
|
-
withUtf8Codepage,
|
|
132
|
-
writeMeta,
|
|
133
|
-
writeRecord
|
|
134
|
-
} from "./chunk-UNTSNL5C.js";
|
|
135
|
-
import {
|
|
136
|
-
defaultConfigPath,
|
|
137
|
-
isPlausibleKey,
|
|
138
|
-
loadApiKey,
|
|
139
|
-
readConfig,
|
|
140
|
-
redactKey,
|
|
141
|
-
saveApiKey,
|
|
142
|
-
writeConfig
|
|
143
|
-
} from "./chunk-2NBVKF4L.js";
|
|
144
|
-
import {
|
|
145
|
-
CODE_SYSTEM_PROMPT,
|
|
146
|
-
MEMORY_INDEX_FILE,
|
|
147
|
-
MEMORY_INDEX_MAX_CHARS,
|
|
148
|
-
MemoryStore,
|
|
149
|
-
PROJECT_MEMORY_FILE,
|
|
150
|
-
PROJECT_MEMORY_MAX_CHARS,
|
|
151
|
-
USER_MEMORY_DIR,
|
|
152
|
-
applyMemoryStack,
|
|
153
|
-
applyProjectMemory,
|
|
154
|
-
applyUserMemory,
|
|
155
|
-
codeSystemPrompt,
|
|
156
|
-
memoryEnabled,
|
|
157
|
-
projectHash,
|
|
158
|
-
readProjectMemory,
|
|
159
|
-
sanitizeMemoryName
|
|
160
|
-
} from "./chunk-PJGGEIK3.js";
|
|
161
|
-
import "./chunk-2H7UOFLK.js";
|
|
162
|
-
export {
|
|
163
|
-
AT_MENTION_PATTERN,
|
|
164
|
-
AT_PICKER_PREFIX,
|
|
165
|
-
AppendOnlyLog,
|
|
166
|
-
CODE_SYSTEM_PROMPT,
|
|
167
|
-
CacheFirstLoop,
|
|
168
|
-
ChoiceRequestedError,
|
|
169
|
-
DEFAULT_AT_MENTION_MAX_BYTES,
|
|
170
|
-
DEFAULT_MAX_RESULT_CHARS,
|
|
171
|
-
DEFAULT_MAX_RESULT_TOKENS,
|
|
172
|
-
DEFAULT_PICKER_IGNORE_DIRS,
|
|
173
|
-
DeepSeekClient,
|
|
174
|
-
HOOK_EVENTS,
|
|
175
|
-
HOOK_SETTINGS_DIRNAME,
|
|
176
|
-
HOOK_SETTINGS_FILENAME,
|
|
177
|
-
ImmutablePrefix,
|
|
178
|
-
LATEST_CACHE_TTL_MS,
|
|
179
|
-
LATEST_FETCH_TIMEOUT_MS,
|
|
180
|
-
MCP_PROTOCOL_VERSION,
|
|
181
|
-
MEMORY_INDEX_FILE,
|
|
182
|
-
MEMORY_INDEX_MAX_CHARS,
|
|
183
|
-
McpClient,
|
|
184
|
-
MemoryStore,
|
|
185
|
-
NeedsConfirmationError,
|
|
186
|
-
PROJECT_MEMORY_FILE,
|
|
187
|
-
PROJECT_MEMORY_MAX_CHARS,
|
|
188
|
-
PlanCheckpointError,
|
|
189
|
-
PlanProposedError,
|
|
190
|
-
PlanRevisionProposedError,
|
|
191
|
-
SessionStats,
|
|
192
|
-
SseTransport,
|
|
193
|
-
StdioTransport,
|
|
194
|
-
StormBreaker,
|
|
195
|
-
StreamableHttpTransport,
|
|
196
|
-
ToolCallRepair,
|
|
197
|
-
ToolRegistry,
|
|
198
|
-
USER_MEMORY_DIR,
|
|
199
|
-
Usage,
|
|
200
|
-
VERSION,
|
|
201
|
-
VolatileScratch,
|
|
202
|
-
aggregateBranchUsage,
|
|
203
|
-
aggregateUsage,
|
|
204
|
-
analyzeSchema,
|
|
205
|
-
appendSessionMessage,
|
|
206
|
-
appendUsage,
|
|
207
|
-
applyEditBlock,
|
|
208
|
-
applyEditBlocks,
|
|
209
|
-
applyMemoryStack,
|
|
210
|
-
applyProjectMemory,
|
|
211
|
-
applyUserMemory,
|
|
212
|
-
bridgeMcpTools,
|
|
213
|
-
bucketCacheHitRatio,
|
|
214
|
-
bucketSavingsFraction,
|
|
215
|
-
claudeEquivalentCost,
|
|
216
|
-
codeSystemPrompt,
|
|
217
|
-
compareVersions,
|
|
218
|
-
computeReplayStats,
|
|
219
|
-
costUsd,
|
|
220
|
-
decideOutcome,
|
|
221
|
-
defaultConfigPath,
|
|
222
|
-
defaultSelector,
|
|
223
|
-
defaultUsageLogPath,
|
|
224
|
-
deleteSession,
|
|
225
|
-
detectAtPicker,
|
|
226
|
-
detectShellOperator,
|
|
227
|
-
diffTranscripts,
|
|
228
|
-
emptyPlanState,
|
|
229
|
-
expandAtMentions,
|
|
230
|
-
fetchWithRetry,
|
|
231
|
-
fixToolCallPairing,
|
|
232
|
-
flattenMcpResult,
|
|
233
|
-
flattenSchema,
|
|
234
|
-
forkRegistryExcluding,
|
|
235
|
-
formatCommandResult,
|
|
236
|
-
formatHookOutcomeMessage,
|
|
237
|
-
formatLogSize,
|
|
238
|
-
formatLoopError,
|
|
239
|
-
formatSearchResults,
|
|
240
|
-
getLatestVersion,
|
|
241
|
-
globalSettingsPath,
|
|
242
|
-
harvest,
|
|
243
|
-
healLoadedMessages,
|
|
244
|
-
healLoadedMessagesByTokens,
|
|
245
|
-
htmlToText,
|
|
246
|
-
injectPowerShellUtf8,
|
|
247
|
-
inputCostUsd,
|
|
248
|
-
inspectMcpServer,
|
|
249
|
-
isAllowed,
|
|
250
|
-
isJsonRpcError,
|
|
251
|
-
isNpxInstall,
|
|
252
|
-
isPlanStateEmpty,
|
|
253
|
-
isPlausibleKey,
|
|
254
|
-
listFilesSync,
|
|
255
|
-
listFilesWithStatsAsync,
|
|
256
|
-
listFilesWithStatsSync,
|
|
257
|
-
listSessions,
|
|
258
|
-
loadApiKey,
|
|
259
|
-
loadDotenv,
|
|
260
|
-
loadHooks,
|
|
261
|
-
loadSessionMessages,
|
|
262
|
-
matchesTool,
|
|
263
|
-
memoryEnabled,
|
|
264
|
-
nestArguments,
|
|
265
|
-
openTranscriptFile,
|
|
266
|
-
outputCostUsd,
|
|
267
|
-
parseEditBlocks,
|
|
268
|
-
parseMcpSpec,
|
|
269
|
-
parseMojeekResults,
|
|
270
|
-
parseTranscript,
|
|
271
|
-
prepareSpawn,
|
|
272
|
-
projectHash,
|
|
273
|
-
projectSettingsPath,
|
|
274
|
-
quoteForCmdExe,
|
|
275
|
-
rankPickerCandidates,
|
|
276
|
-
readConfig,
|
|
277
|
-
readProjectMemory,
|
|
278
|
-
readTranscript,
|
|
279
|
-
readUsageLog,
|
|
280
|
-
recordFromLoopEvent,
|
|
281
|
-
redactKey,
|
|
282
|
-
registerChoiceTool,
|
|
283
|
-
registerFilesystemTools,
|
|
284
|
-
registerMemoryTools,
|
|
285
|
-
registerPlanTool,
|
|
286
|
-
registerShellTools,
|
|
287
|
-
registerSubagentTool,
|
|
288
|
-
registerWebTools,
|
|
289
|
-
renderMarkdown as renderDiffMarkdown,
|
|
290
|
-
renderSummaryTable as renderDiffSummary,
|
|
291
|
-
repairTruncatedJson,
|
|
292
|
-
replayFromFile,
|
|
293
|
-
resolveExecutable,
|
|
294
|
-
restoreSnapshots,
|
|
295
|
-
runBranches,
|
|
296
|
-
runCommand,
|
|
297
|
-
runHooks,
|
|
298
|
-
sanitizeMemoryName,
|
|
299
|
-
sanitizeName as sanitizeSessionName,
|
|
300
|
-
saveApiKey,
|
|
301
|
-
scavengeToolCalls,
|
|
302
|
-
sessionPath,
|
|
303
|
-
sessionsDir,
|
|
304
|
-
similarity,
|
|
305
|
-
snapshotBeforeEdits,
|
|
306
|
-
stripHallucinatedToolMarkup,
|
|
307
|
-
tokenizeCommand,
|
|
308
|
-
truncateForModel,
|
|
309
|
-
truncateForModelByTokens,
|
|
310
|
-
webFetch,
|
|
311
|
-
webSearch,
|
|
312
|
-
withUtf8Codepage,
|
|
313
|
-
writeConfig,
|
|
314
|
-
writeMeta,
|
|
315
|
-
writeRecord
|
|
316
|
-
};
|
|
317
|
-
//# sourceMappingURL=.-EYSVINK3.js.map
|
|
@@ -1,51 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
import { createRequire as __cr } from 'node:module'; if (typeof globalThis.require === 'undefined') { globalThis.require = __cr(import.meta.url); }
|
|
3
|
-
import {
|
|
4
|
-
chatCommand
|
|
5
|
-
} from "./chunk-KQU2TYIL.js";
|
|
6
|
-
import "./chunk-CXVWUPA3.js";
|
|
7
|
-
import "./chunk-JMBMLOBP.js";
|
|
8
|
-
import "./chunk-GTZTQNX5.js";
|
|
9
|
-
import "./chunk-HNXDZGC6.js";
|
|
10
|
-
import "./chunk-4HCP2UQW.js";
|
|
11
|
-
import "./chunk-NVURFF27.js";
|
|
12
|
-
import "./chunk-ZZM6QJ4W.js";
|
|
13
|
-
import "./chunk-WL6SNQ5T.js";
|
|
14
|
-
import "./chunk-WK3UFQY3.js";
|
|
15
|
-
import "./chunk-C53JQES5.js";
|
|
16
|
-
import "./chunk-XSU4QVFW.js";
|
|
17
|
-
import "./chunk-JNAQYELD.js";
|
|
18
|
-
import "./chunk-FEZK652I.js";
|
|
19
|
-
import "./chunk-YY227BIQ.js";
|
|
20
|
-
import "./chunk-I4L2GTSE.js";
|
|
21
|
-
import "./chunk-X53B3JIX.js";
|
|
22
|
-
import "./chunk-2425HK6U.js";
|
|
23
|
-
import "./chunk-HKWSPKMU.js";
|
|
24
|
-
import "./chunk-5QCB62C4.js";
|
|
25
|
-
import "./chunk-6OWJV3YW.js";
|
|
26
|
-
import "./chunk-V26WPN3J.js";
|
|
27
|
-
import "./chunk-25T6CVUP.js";
|
|
28
|
-
import "./chunk-2UQP6H6T.js";
|
|
29
|
-
import "./chunk-W7YGWUWU.js";
|
|
30
|
-
import "./chunk-SZ5XES2N.js";
|
|
31
|
-
import "./chunk-5I2C4JEO.js";
|
|
32
|
-
import "./chunk-QJDDIK3Z.js";
|
|
33
|
-
import "./chunk-XJXDHAES.js";
|
|
34
|
-
import "./chunk-RDRC3XDT.js";
|
|
35
|
-
import "./chunk-TEUDEGX2.js";
|
|
36
|
-
import "./chunk-PLHAZOLZ.js";
|
|
37
|
-
import "./chunk-LIR2HBQH.js";
|
|
38
|
-
import "./chunk-4CTDEJUF.js";
|
|
39
|
-
import "./chunk-A3TSSDS2.js";
|
|
40
|
-
import "./chunk-S4XVGLRW.js";
|
|
41
|
-
import "./chunk-5ACMUK4Q.js";
|
|
42
|
-
import "./chunk-R3CTO2HM.js";
|
|
43
|
-
import "./chunk-ZZYBBX5N.js";
|
|
44
|
-
import "./chunk-IJ7JA32V.js";
|
|
45
|
-
import "./chunk-AVFXO2EZ.js";
|
|
46
|
-
import "./chunk-XXC2BYTV.js";
|
|
47
|
-
import "./chunk-TUK7OWJA.js";
|
|
48
|
-
export {
|
|
49
|
-
chatCommand
|
|
50
|
-
};
|
|
51
|
-
//# sourceMappingURL=chat-ECK5ZGMV.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/index/semantic/builder.ts","../../src/index/semantic/chunker.ts","../../src/index/semantic/embedding.ts","../../src/index/semantic/store.ts"],"sourcesContent":["import { promises as fs } from \"node:fs\";\nimport path from \"node:path\";\nimport { type ResolvedEmbeddingConfig, resolveSemanticEmbeddingConfig } from \"../../config.js\";\nimport { type ResolvedIndexConfig, defaultIndexConfig } from \"../config.js\";\nimport { walkChunks } from \"./chunker.js\";\nimport type { CodeChunk, SkipReason } from \"./chunker.js\";\nimport { embed, embedAll, probeOllama } from \"./embedding.js\";\nimport type { EmbedOptions } from \"./embedding.js\";\nimport {\n compareIndexIdentity,\n normalize,\n openStore,\n readIndexMeta,\n wipeStoreFiles,\n} from \"./store.js\";\nimport type { IndexEntry, IndexIdentity, IndexMismatch, SearchHit } from \"./store.js\";\n\nexport const INDEX_DIR_NAME = path.join(\".reasonix\", \"semantic\");\n\ntype BuildOptions = {\n provider?: \"ollama\" | \"openai-compat\";\n baseUrl?: string;\n apiKey?: string;\n model?: string;\n extraBody?: Record<string, unknown>;\n timeoutMs?: number;\n signal?: AbortSignal;\n windowLines?: number;\n overlap?: number;\n rebuild?: boolean;\n indexConfig?: ResolvedIndexConfig;\n onProgress?: (info: BuildProgress) => void;\n configPath?: string;\n};\n\nexport type SkipBuckets = Record<SkipReason, number>;\n\nexport interface BuildProgress {\n phase: \"setup\" | \"scan\" | \"embed\" | \"write\" | \"done\";\n filesScanned?: number;\n chunksTotal?: number;\n chunksDone?: number;\n filesSkipped?: number;\n filesChanged?: number;\n skipBuckets?: SkipBuckets;\n}\n\nexport interface BuildResult {\n filesScanned: number;\n filesChanged: number;\n chunksAdded: number;\n chunksRemoved: number;\n chunksSkipped: number;\n skipBuckets: SkipBuckets;\n durationMs: number;\n}\n\nfunction emptyBuckets(): SkipBuckets {\n return {\n defaultDir: 0,\n defaultFile: 0,\n binaryExt: 0,\n binaryContent: 0,\n tooLarge: 0,\n gitignore: 0,\n pattern: 0,\n readError: 0,\n };\n}\n\nexport async function buildIndex(root: string, opts: BuildOptions = {}): Promise<BuildResult> {\n const t0 = Date.now();\n const indexDir = path.join(root, INDEX_DIR_NAME);\n const resolved = resolveBuildEmbeddingConfig(opts);\n\n opts.onProgress?.({ phase: \"setup\" });\n throwIfAborted(opts.signal);\n await probeEmbeddingProvider(resolved, opts.signal);\n throwIfAborted(opts.signal);\n\n if (opts.rebuild) await wipeStoreFiles(indexDir);\n const store = await openStore(indexDir, {\n provider: resolved.provider,\n model: resolved.model,\n });\n\n const lastMtimes = store.fileMtimes();\n const seenPaths = new Set<string>();\n const fileChunks = new Map<string, { chunks: CodeChunk[]; mtimeMs: number }>();\n let filesScanned = 0;\n let filesSkipped = 0;\n const skipBuckets = emptyBuckets();\n for await (const chunk of walkChunks(root, {\n windowLines: opts.windowLines,\n overlap: opts.overlap,\n config: opts.indexConfig ?? defaultIndexConfig(),\n onSkip: (_p, reason) => {\n skipBuckets[reason]++;\n },\n })) {\n throwIfAborted(opts.signal);\n seenPaths.add(chunk.path);\n let bucket = fileChunks.get(chunk.path);\n if (!bucket) {\n filesScanned++;\n const abs = path.join(root, chunk.path);\n let mtimeMs = 0;\n try {\n const stat = await fs.stat(abs);\n mtimeMs = stat.mtimeMs;\n } catch {\n continue;\n }\n const last = lastMtimes.get(chunk.path);\n if (last !== undefined && last === mtimeMs && !opts.rebuild) {\n filesSkipped++;\n continue;\n }\n bucket = { chunks: [], mtimeMs };\n fileChunks.set(chunk.path, bucket);\n }\n bucket.chunks.push(chunk);\n opts.onProgress?.({ phase: \"scan\", filesScanned });\n }\n\n throwIfAborted(opts.signal);\n const deletedPaths: string[] = [];\n for (const oldPath of lastMtimes.keys()) {\n if (!seenPaths.has(oldPath)) deletedPaths.push(oldPath);\n }\n const replacePaths = [...fileChunks.keys()].filter((p) => lastMtimes.has(p));\n throwIfAborted(opts.signal);\n const removed = await store.remove([...deletedPaths, ...replacePaths]);\n\n let chunksAdded = 0;\n let chunksSkipped = 0;\n const filesChanged = fileChunks.size;\n let chunksTotal = 0;\n for (const { chunks } of fileChunks.values()) chunksTotal += chunks.length;\n let chunksDone = 0;\n for (const [, bucket] of fileChunks) {\n throwIfAborted(opts.signal);\n if (bucket.chunks.length === 0) continue;\n const texts = bucket.chunks.map((c) => c.text);\n const vectors = await embedAll(texts, {\n ...resolved,\n signal: opts.signal,\n onProgress: (done, total) => {\n opts.onProgress?.({\n phase: \"embed\",\n filesScanned,\n filesChanged,\n chunksTotal,\n chunksDone: chunksDone + done,\n });\n if (done === total) chunksDone += total;\n },\n onError: (idx, err) => {\n chunksSkipped++;\n const c = bucket.chunks[idx];\n const where = c ? `${c.path}:${c.startLine}-${c.endLine}` : `chunk #${idx}`;\n const msg = err instanceof Error ? err.message : String(err);\n process.stderr.write(`\\n ! skipped ${where}: ${msg}\\n`);\n },\n });\n throwIfAborted(opts.signal);\n const entries: IndexEntry[] = [];\n for (let i = 0; i < bucket.chunks.length; i++) {\n const vec = vectors[i];\n if (!vec) continue;\n const c = bucket.chunks[i];\n if (!c) continue;\n normalize(vec);\n entries.push({\n path: c.path,\n startLine: c.startLine,\n endLine: c.endLine,\n text: c.text,\n embedding: vec,\n mtimeMs: bucket.mtimeMs,\n });\n }\n throwIfAborted(opts.signal);\n if (entries.length > 0) await store.add(entries);\n chunksAdded += entries.length;\n }\n\n throwIfAborted(opts.signal);\n opts.onProgress?.({\n phase: \"done\",\n filesScanned,\n filesSkipped,\n filesChanged,\n chunksTotal,\n chunksDone,\n skipBuckets,\n });\n\n return {\n filesScanned,\n filesChanged,\n chunksAdded,\n chunksRemoved: removed,\n chunksSkipped,\n skipBuckets,\n durationMs: Date.now() - t0,\n };\n}\n\ntype QueryOptions = {\n provider?: \"ollama\" | \"openai-compat\";\n baseUrl?: string;\n apiKey?: string;\n model?: string;\n extraBody?: Record<string, unknown>;\n timeoutMs?: number;\n signal?: AbortSignal;\n topK?: number;\n minScore?: number;\n configPath?: string;\n};\n\nexport async function querySemantic(\n root: string,\n query: string,\n opts: QueryOptions = {},\n): Promise<SearchHit[] | null> {\n const indexDir = path.join(root, INDEX_DIR_NAME);\n const resolved = resolveQueryEmbeddingConfig(opts);\n const store = await openStore(indexDir, {\n provider: resolved.provider,\n model: resolved.model,\n });\n if (store.empty) return null;\n const qvec = await embed(query, { ...resolved, signal: opts.signal });\n normalize(qvec);\n return store.search(qvec, opts.topK ?? 8, opts.minScore ?? 0.3);\n}\n\nexport async function indexExists(root: string): Promise<boolean> {\n const meta = path.join(root, INDEX_DIR_NAME, \"index.meta.json\");\n try {\n await fs.access(meta);\n return true;\n } catch {\n return false;\n }\n}\n\nexport async function indexCompatible(\n root: string,\n opts: { provider?: \"ollama\" | \"openai-compat\"; model?: string; configPath?: string } = {},\n): Promise<boolean> {\n const meta = await readIndexMeta(path.join(root, INDEX_DIR_NAME));\n if (!meta) return false;\n return compareIndexIdentity(meta, resolveIndexIdentity(opts)) === null;\n}\n\nfunction resolveBuildEmbeddingConfig(opts: BuildOptions): ResolvedEmbeddingConfig {\n if (opts.provider === \"openai-compat\") {\n if (!opts.baseUrl || !opts.apiKey || !opts.model) {\n throw new Error(\n \"OpenAI-compatible embeddings require baseUrl, apiKey, and model when passed directly.\",\n );\n }\n return {\n provider: \"openai-compat\",\n baseUrl: opts.baseUrl,\n apiKey: opts.apiKey,\n model: opts.model,\n extraBody: opts.extraBody ?? {},\n timeoutMs: opts.timeoutMs ?? 30_000,\n };\n }\n if (opts.baseUrl || opts.model) {\n return {\n provider: \"ollama\",\n baseUrl: opts.baseUrl ?? process.env.OLLAMA_URL ?? \"http://localhost:11434\",\n model: opts.model ?? process.env.REASONIX_EMBED_MODEL ?? \"nomic-embed-text\",\n timeoutMs: opts.timeoutMs ?? 30_000,\n };\n }\n return resolveSemanticEmbeddingConfig(opts.configPath);\n}\n\nfunction resolveIndexIdentity(opts: {\n provider?: \"ollama\" | \"openai-compat\";\n model?: string;\n configPath?: string;\n}): IndexIdentity {\n if (opts.provider && opts.model) {\n return { provider: opts.provider, model: opts.model };\n }\n const resolved = resolveSemanticEmbeddingConfig(opts.configPath);\n return { provider: resolved.provider, model: resolved.model };\n}\n\nfunction resolveQueryEmbeddingConfig(opts: QueryOptions): ResolvedEmbeddingConfig {\n return resolveBuildEmbeddingConfig(opts);\n}\n\nasync function probeEmbeddingProvider(\n config: ResolvedEmbeddingConfig,\n signal: AbortSignal | undefined,\n): Promise<void> {\n if (config.provider === \"openai-compat\") return;\n const probe = await probeOllama({ baseUrl: config.baseUrl, signal });\n if (!probe.ok) {\n throw new Error(\n `Ollama is not reachable: ${probe.error}. Install from https://ollama.com, then \\`ollama serve\\` and \\`ollama pull ${config.model}\\`.`,\n );\n }\n}\n\nfunction throwIfAborted(signal: AbortSignal | undefined): void {\n if (signal?.aborted) {\n throw new Error(\"semantic indexing aborted\");\n }\n}\n","/** Line-window chunker (not AST) — language-agnostic, every chunk carries exact startLine/endLine for cite-back. */\n\nimport { promises as fs } from \"node:fs\";\nimport path from \"node:path\";\nimport { type GitignoreLayer, ignoredByLayers, loadGitignoreAt } from \"../../gitignore.js\";\nimport {\n type IndexFilters,\n type ResolvedIndexConfig,\n compileFilters,\n defaultIndexConfig,\n} from \"../config.js\";\n\nexport interface CodeChunk {\n /** Path relative to the index root, forward slashes. Stable across OS. */\n path: string;\n /** 1-based, inclusive. */\n startLine: number;\n endLine: number;\n text: string;\n}\n\nexport type SkipReason =\n | \"defaultDir\"\n | \"defaultFile\"\n | \"binaryExt\"\n | \"binaryContent\"\n | \"tooLarge\"\n | \"gitignore\"\n | \"pattern\"\n | \"readError\";\n\nexport interface ChunkOptions {\n /** Lines per window. Default 60. */\n windowLines?: number;\n /** Lines of overlap between consecutive windows. Default 12. */\n overlap?: number;\n /** Default 4000 — keeps unicode-heavy slices under nomic-embed-text's 8K-token window. */\n maxChunkChars?: number;\n /** Resolved exclude/limit settings. Falls back to package defaults when omitted. */\n config?: ResolvedIndexConfig;\n /** Tally callback for files that didn't make it into the index. */\n onSkip?: (relPath: string, reason: SkipReason) => void;\n}\n\n/** Default character cap per chunk — sized for nomic-embed-text. */\nexport const DEFAULT_MAX_CHUNK_CHARS = 4000;\n\nexport function chunkText(\n text: string,\n filePath: string,\n windowLines: number,\n overlap: number,\n maxChunkChars: number = DEFAULT_MAX_CHUNK_CHARS,\n): CodeChunk[] {\n const lines = text.split(/\\r?\\n/);\n if (lines.length === 0 || (lines.length === 1 && lines[0] === \"\")) return [];\n const stride = Math.max(1, windowLines - overlap);\n const chunks: CodeChunk[] = [];\n for (let start = 0; start < lines.length; start += stride) {\n const end = Math.min(lines.length, start + windowLines);\n const slice = lines.slice(start, end).join(\"\\n\").trim();\n if (slice.length === 0) {\n if (end >= lines.length) break;\n continue;\n }\n const window: CodeChunk = {\n path: filePath,\n startLine: start + 1,\n endLine: end,\n text: slice,\n };\n for (const sub of safeSplit(window, maxChunkChars)) chunks.push(sub);\n if (end >= lines.length) break;\n }\n return chunks;\n}\n\nfunction safeSplit(chunk: CodeChunk, maxChars: number): CodeChunk[] {\n if (chunk.text.length <= maxChars) return [chunk];\n const lines = chunk.text.split(\"\\n\");\n const out: CodeChunk[] = [];\n let bufLines: string[] = [];\n let bufStart = chunk.startLine;\n let bufLen = 0;\n const flush = (untilLineNo: number): void => {\n if (bufLines.length === 0) return;\n out.push({\n path: chunk.path,\n startLine: bufStart,\n endLine: untilLineNo,\n text: bufLines.join(\"\\n\"),\n });\n bufLines = [];\n bufLen = 0;\n };\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i] ?? \"\";\n const lineLen = line.length + 1;\n if (lineLen > maxChars) {\n flush(chunk.startLine + i - 1);\n out.push({\n path: chunk.path,\n startLine: chunk.startLine + i,\n endLine: chunk.startLine + i,\n text: line.slice(0, maxChars),\n });\n bufStart = chunk.startLine + i + 1;\n continue;\n }\n if (bufLen + lineLen > maxChars && bufLines.length > 0) {\n flush(chunk.startLine + i - 1);\n bufStart = chunk.startLine + i;\n }\n bufLines.push(line);\n bufLen += lineLen;\n }\n flush(chunk.endLine);\n return out;\n}\n\nfunction toForwardRel(root: string, abs: string): string {\n return path.relative(root, abs).split(path.sep).join(\"/\");\n}\n\ninterface WalkFrame {\n dir: string;\n layers: readonly GitignoreLayer[];\n}\n\nexport async function* walkChunks(\n root: string,\n opts: ChunkOptions = {},\n): AsyncGenerator<CodeChunk> {\n const windowLines = opts.windowLines ?? 60;\n const overlap = Math.min(opts.overlap ?? 12, Math.max(0, windowLines - 1));\n const maxChunkChars = opts.maxChunkChars ?? DEFAULT_MAX_CHUNK_CHARS;\n const filters: IndexFilters = compileFilters(opts.config ?? defaultIndexConfig());\n const onSkip = opts.onSkip ?? (() => {});\n\n const initial: GitignoreLayer[] = [];\n if (filters.respectGitignore) {\n const rootIg = await loadGitignoreAt(root);\n if (rootIg) initial.push({ dirAbs: root, ig: rootIg });\n }\n\n const stack: WalkFrame[] = [{ dir: root, layers: initial }];\n while (stack.length > 0) {\n const frame = stack.pop();\n if (!frame) break;\n const { dir, layers } = frame;\n let entries: import(\"node:fs\").Dirent[];\n try {\n entries = await fs.readdir(dir, { withFileTypes: true });\n } catch {\n continue;\n }\n for (const entry of entries) {\n const name = entry.name;\n const abs = path.join(dir, name);\n const rel = toForwardRel(root, abs);\n if (entry.isDirectory()) {\n if (filters.dirSet.has(name)) {\n onSkip(rel, \"defaultDir\");\n continue;\n }\n if (filters.respectGitignore && ignoredByLayers(layers, abs, true)) {\n onSkip(rel, \"gitignore\");\n continue;\n }\n if (filters.patternMatch(`${rel}/`) || filters.patternMatch(rel)) {\n onSkip(rel, \"pattern\");\n continue;\n }\n const childLayers = filters.respectGitignore ? await extendLayers(layers, abs) : layers;\n stack.push({ dir: abs, layers: childLayers });\n continue;\n }\n if (!entry.isFile()) continue;\n if (filters.fileSet.has(name)) {\n onSkip(rel, \"defaultFile\");\n continue;\n }\n const ext = path.extname(name).toLowerCase();\n if (filters.extSet.has(ext)) {\n onSkip(rel, \"binaryExt\");\n continue;\n }\n if (filters.respectGitignore && ignoredByLayers(layers, abs, false)) {\n onSkip(rel, \"gitignore\");\n continue;\n }\n if (filters.patternMatch(rel)) {\n onSkip(rel, \"pattern\");\n continue;\n }\n // Open once and check size + read against the same fd. Skipping\n // a path-based `fs.stat` upstream is intentional — stat→open is\n // the TOCTOU shape CodeQL flags as js/file-system-race.\n const result = await readSizeBoundedFile(abs, filters.maxFileBytes);\n if (result.kind === \"skip\") {\n onSkip(rel, result.reason);\n continue;\n }\n const text = result.text;\n if (text.indexOf(\"\\0\") !== -1) {\n onSkip(rel, \"binaryContent\");\n continue;\n }\n for (const chunk of chunkText(text, rel, windowLines, overlap, maxChunkChars)) {\n yield chunk;\n }\n }\n }\n}\n\nasync function extendLayers(\n layers: readonly GitignoreLayer[],\n dirAbs: string,\n): Promise<readonly GitignoreLayer[]> {\n const ig = await loadGitignoreAt(dirAbs);\n return ig ? [...layers, { dirAbs, ig }] : layers;\n}\n\nexport async function chunkDirectory(root: string, opts: ChunkOptions = {}): Promise<CodeChunk[]> {\n const out: CodeChunk[] = [];\n for await (const c of walkChunks(root, opts)) out.push(c);\n return out;\n}\n\ntype ReadFileResult = { kind: \"ok\"; text: string } | { kind: \"skip\"; reason: SkipReason };\n\nasync function readSizeBoundedFile(abs: string, maxBytes: number): Promise<ReadFileResult> {\n try {\n const fh = await fs.open(abs, \"r\");\n try {\n const stat = await fh.stat();\n if (stat.size > maxBytes) return { kind: \"skip\", reason: \"tooLarge\" };\n return { kind: \"ok\", text: await fh.readFile(\"utf8\") };\n } finally {\n await fh.close();\n }\n } catch {\n return { kind: \"skip\", reason: \"readError\" };\n }\n}\n","const DEFAULT_OLLAMA_URL = \"http://localhost:11434\";\nconst DEFAULT_EMBED_MODEL = \"nomic-embed-text\";\nconst DEFAULT_TIMEOUT_MS = 30_000;\n\nexport type EmbedOptions =\n | {\n provider?: \"ollama\";\n baseUrl?: string;\n model?: string;\n timeoutMs?: number;\n signal?: AbortSignal;\n }\n | {\n provider: \"openai-compat\";\n baseUrl: string;\n apiKey: string;\n model: string;\n extraBody?: Record<string, unknown>;\n timeoutMs?: number;\n signal?: AbortSignal;\n };\n\nexport class EmbeddingError extends Error {\n constructor(\n message: string,\n public override readonly cause?: unknown,\n ) {\n super(message);\n this.name = \"EmbeddingError\";\n }\n}\n\nexport async function embed(text: string, opts: EmbedOptions = {}): Promise<Float32Array> {\n if (opts.provider === \"openai-compat\") return await embedOpenAICompat(text, opts);\n return await embedOllama(text, opts);\n}\n\nexport async function embedAll(\n texts: readonly string[],\n opts: EmbedOptions & {\n onProgress?: (done: number, total: number) => void;\n onError?: (index: number, err: unknown) => void;\n } = {},\n): Promise<Array<Float32Array | null>> {\n if (opts.provider === \"openai-compat\") return await embedAllOpenAICompat(texts, opts);\n const out: Array<Float32Array | null> = [];\n for (let i = 0; i < texts.length; i++) {\n if (opts.signal?.aborted) throw new EmbeddingError(\"embedding aborted\");\n const text = texts[i];\n if (text === undefined) continue;\n try {\n out.push(await embed(text, opts));\n } catch (err) {\n if (isAbortError(err) || opts.signal?.aborted) {\n throw new EmbeddingError(\"embedding aborted\", err);\n }\n opts.onError?.(i, err);\n out.push(null);\n }\n opts.onProgress?.(i + 1, texts.length);\n }\n return out;\n}\n\nexport async function probeOllama(\n opts: { baseUrl?: string; signal?: AbortSignal } = {},\n): Promise<{ ok: true; models: string[] } | { ok: false; error: string }> {\n const baseUrl = opts.baseUrl ?? process.env.OLLAMA_URL ?? DEFAULT_OLLAMA_URL;\n try {\n const res = await fetch(`${baseUrl}/api/tags`, { signal: opts.signal });\n if (!res.ok) return { ok: false, error: `Ollama returned ${res.status}` };\n const json = (await res.json()) as { models?: Array<{ name?: string }> };\n const models = (json.models ?? [])\n .map((m) => m.name)\n .filter((n): n is string => typeof n === \"string\");\n return { ok: true, models };\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n return { ok: false, error: msg };\n }\n}\n\nasync function embedOllama(\n text: string,\n opts: Extract<EmbedOptions, { provider?: \"ollama\" }>,\n): Promise<Float32Array> {\n const baseUrl = opts.baseUrl ?? process.env.OLLAMA_URL ?? DEFAULT_OLLAMA_URL;\n const model = opts.model ?? process.env.REASONIX_EMBED_MODEL ?? DEFAULT_EMBED_MODEL;\n const timeoutMs = opts.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n const { controller, cleanup } = composeAbort(opts.signal, timeoutMs, \"embedding timeout\");\n\n let res: Response;\n try {\n res = await fetch(`${baseUrl}/api/embeddings`, {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({ model, prompt: text }),\n signal: controller.signal,\n });\n } catch (err) {\n cleanup();\n const msg = err instanceof Error ? err.message : String(err);\n if (/ECONNREFUSED|connect ECONNREFUSED|fetch failed/i.test(msg)) {\n throw new EmbeddingError(\n `Cannot reach Ollama at ${baseUrl}. Install from https://ollama.com, then run \\`ollama pull ${model}\\` and \\`ollama serve\\`. Override the URL via OLLAMA_URL.`,\n err,\n );\n }\n throw new EmbeddingError(`embedding request failed: ${msg}`, err);\n } finally {\n cleanup();\n }\n\n if (!res.ok) {\n const body = await res.text().catch(() => \"\");\n if (res.status === 404 && /model.*not found/i.test(body)) {\n throw new EmbeddingError(\n `Embedding model \"${model}\" not pulled. Run \\`ollama pull ${model}\\` once, then retry.`,\n );\n }\n throw new EmbeddingError(`Ollama returned ${res.status}: ${body.slice(0, 200)}`);\n }\n\n const json = (await res.json()) as { embedding?: unknown };\n if (!json.embedding || !Array.isArray(json.embedding)) {\n throw new EmbeddingError(\"Ollama response missing 'embedding' array\");\n }\n return toFloat32Array(json.embedding, \"embedding\");\n}\n\nasync function embedOpenAICompat(\n text: string,\n opts: Extract<EmbedOptions, { provider: \"openai-compat\" }>,\n): Promise<Float32Array> {\n const vectors = await requestOpenAICompatEmbeddings(text, opts);\n const v = vectors[0];\n if (!v) {\n throw new EmbeddingError(\n `Embedding provider returned no vector for the input (model ${opts.model})`,\n );\n }\n return v;\n}\n\nasync function embedAllOpenAICompat(\n texts: readonly string[],\n opts: Extract<EmbedOptions, { provider: \"openai-compat\" }> & {\n onProgress?: (done: number, total: number) => void;\n onError?: (index: number, err: unknown) => void;\n },\n): Promise<Array<Float32Array | null>> {\n if (texts.length === 0) return [];\n if (opts.signal?.aborted) throw new EmbeddingError(\"embedding aborted\");\n const vectors = await requestOpenAICompatEmbeddings([...texts], opts);\n for (let i = 0; i < vectors.length; i++) {\n if (vectors[i] === null) {\n opts.onError?.(\n i,\n new EmbeddingError(\n `provider dropped input ${i} from the batch (model ${opts.model} returned no embedding for it)`,\n ),\n );\n }\n }\n opts.onProgress?.(texts.length, texts.length);\n return vectors;\n}\n\nasync function requestOpenAICompatEmbeddings(\n input: string | string[],\n opts: Extract<EmbedOptions, { provider: \"openai-compat\" }>,\n): Promise<Array<Float32Array | null>> {\n const timeoutMs = opts.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n const { controller, cleanup } = composeAbort(opts.signal, timeoutMs, \"embedding timeout\");\n const url = opts.baseUrl.trim();\n const body = {\n ...(opts.extraBody ?? {}),\n model: opts.model,\n input,\n encoding_format: \"float\",\n };\n\n let res: Response;\n try {\n res = await fetch(url, {\n method: \"POST\",\n headers: {\n authorization: `Bearer ${opts.apiKey}`,\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify(body),\n signal: controller.signal,\n });\n } catch (err) {\n cleanup();\n if (isAbortError(err) || opts.signal?.aborted) {\n throw new EmbeddingError(\"embedding aborted\", err);\n }\n const msg = err instanceof Error ? err.message : String(err);\n throw new EmbeddingError(`Cannot reach OpenAI-compatible embeddings at ${url}: ${msg}`, err);\n } finally {\n cleanup();\n }\n\n if (!res.ok) {\n const raw = await res.text().catch(() => \"\");\n const bodyText = raw.slice(0, 300);\n if (res.status === 401 || res.status === 403) {\n throw new EmbeddingError(\n `OpenAI-compatible API rejected the API key for ${url}. Response ${res.status}: ${bodyText}`,\n );\n }\n if (res.status === 404) {\n throw new EmbeddingError(\n `Embeddings endpoint not found at ${url}. Check the configured API URL. Response ${res.status}: ${bodyText}`,\n );\n }\n if (res.status === 400) {\n throw new EmbeddingError(\n `Embedding provider returned 400: ${bodyText}. Check model and custom request body fields.`,\n );\n }\n throw new EmbeddingError(`OpenAI-compatible API returned ${res.status}: ${bodyText}`);\n }\n\n const json = (await res.json()) as {\n data?: Array<{ index?: unknown; embedding?: unknown }>;\n };\n if (!Array.isArray(json.data)) {\n throw new EmbeddingError(\"OpenAI-compatible response missing 'data' array\");\n }\n const size = Array.isArray(input) ? input.length : 1;\n const out: Array<Float32Array | null> = new Array(size).fill(null);\n for (const row of json.data) {\n const rawIndex = row.index;\n if (\n typeof rawIndex !== \"number\" ||\n !Number.isInteger(rawIndex) ||\n rawIndex < 0 ||\n rawIndex >= size\n ) {\n throw new EmbeddingError(\"OpenAI-compatible response returned an invalid embedding index\");\n }\n const index = rawIndex;\n if (!Array.isArray(row.embedding)) {\n throw new EmbeddingError(`OpenAI-compatible response missing embedding for index ${index}`);\n }\n out[index] = toFloat32Array(row.embedding, `data[${index}].embedding`);\n }\n return out;\n}\n\nfunction toFloat32Array(values: unknown[], label: string): Float32Array {\n const out = new Float32Array(values.length);\n for (let i = 0; i < values.length; i++) {\n const value = values[i];\n if (typeof value !== \"number\" || !Number.isFinite(value)) {\n throw new EmbeddingError(`${label}[${i}] is not a finite number`);\n }\n out[i] = value;\n }\n return out;\n}\n\nfunction composeAbort(\n signal: AbortSignal | undefined,\n timeoutMs: number,\n reason: string,\n): { controller: AbortController; cleanup: () => void } {\n const controller = new AbortController();\n const onCallerAbort = () => controller.abort(signal?.reason);\n if (signal) {\n if (signal.aborted) controller.abort(signal.reason);\n else signal.addEventListener(\"abort\", onCallerAbort, { once: true });\n }\n const timer = setTimeout(() => controller.abort(new Error(reason)), timeoutMs);\n return {\n controller,\n cleanup: () => {\n clearTimeout(timer);\n if (signal) signal.removeEventListener(\"abort\", onCallerAbort);\n },\n };\n}\n\nfunction isAbortError(err: unknown): boolean {\n if (err instanceof Error) {\n if (err.name === \"AbortError\") return true;\n if (/aborted/i.test(err.message)) return true;\n }\n return false;\n}\n","/** JSONL append-only (Ctrl+C-safe) + linear cosine scan over unboxed Float32Array — fast enough for ≤10k chunks. */\n\nimport { promises as fs } from \"node:fs\";\nimport path from \"node:path\";\nimport type { EmbeddingProvider } from \"../../config.js\";\nimport type { CodeChunk } from \"./chunker.js\";\n\nexport interface IndexEntry extends CodeChunk {\n embedding: Float32Array;\n mtimeMs: number;\n}\n\nexport interface SearchHit {\n entry: IndexEntry;\n score: number;\n}\n\nexport type IndexMismatch = \"provider\" | \"model\";\n\nexport interface IndexIdentity {\n provider: EmbeddingProvider;\n model: string;\n}\n\nexport interface IndexMeta extends IndexIdentity {\n version: number;\n dim: number;\n updatedAt: string;\n}\n\nexport const STORE_VERSION = 1;\n\nconst META_FILE = \"index.meta.json\";\nconst DATA_FILE = \"index.jsonl\";\n\nexport async function readIndexMeta(indexDir: string): Promise<IndexMeta | null> {\n try {\n const raw = await fs.readFile(path.join(indexDir, META_FILE), \"utf8\");\n return normalizeMeta(JSON.parse(raw) as Partial<IndexMeta>);\n } catch {\n return null;\n }\n}\n\nexport function compareIndexIdentity(\n meta: IndexIdentity,\n identity: IndexIdentity,\n): IndexMismatch | null {\n if (meta.provider !== identity.provider) return \"provider\";\n if (meta.model !== identity.model) return \"model\";\n return null;\n}\n\nexport async function wipeStoreFiles(indexDir: string): Promise<void> {\n await fs.rm(path.join(indexDir, DATA_FILE), { force: true });\n await fs.rm(path.join(indexDir, META_FILE), { force: true });\n}\n\nexport class SemanticStore {\n private entries: IndexEntry[] = [];\n private byPath = new Map<string, IndexEntry[]>();\n private dim = 0;\n\n constructor(\n public readonly indexDir: string,\n public readonly identity: IndexIdentity,\n ) {}\n\n get provider(): EmbeddingProvider {\n return this.identity.provider;\n }\n\n get model(): string {\n return this.identity.model;\n }\n\n get empty(): boolean {\n return this.entries.length === 0;\n }\n\n get size(): number {\n return this.entries.length;\n }\n\n get all(): readonly IndexEntry[] {\n return this.entries;\n }\n\n fileMtimes(): Map<string, number> {\n const out = new Map<string, number>();\n for (const [p, group] of this.byPath) {\n const first = group[0];\n if (first) out.set(p, first.mtimeMs);\n }\n return out;\n }\n\n async add(entries: readonly IndexEntry[]): Promise<void> {\n if (entries.length === 0) return;\n if (this.dim === 0) this.dim = entries[0]!.embedding.length;\n const lines: string[] = [];\n for (const e of entries) {\n if (e.embedding.length !== this.dim) {\n throw new Error(\n `embedding dim mismatch: expected ${this.dim}, got ${e.embedding.length} for ${e.path}:${e.startLine}`,\n );\n }\n this.entries.push(e);\n const list = this.byPath.get(e.path);\n if (list) list.push(e);\n else this.byPath.set(e.path, [e]);\n lines.push(serializeEntry(e));\n }\n await fs.mkdir(this.indexDir, { recursive: true });\n await fs.appendFile(path.join(this.indexDir, DATA_FILE), `${lines.join(\"\\n\")}\\n`, \"utf8\");\n await this.writeMeta();\n }\n\n async remove(paths: readonly string[]): Promise<number> {\n if (paths.length === 0) return 0;\n const drop = new Set(paths);\n const before = this.entries.length;\n this.entries = this.entries.filter((e) => !drop.has(e.path));\n for (const p of paths) this.byPath.delete(p);\n const removed = before - this.entries.length;\n if (removed > 0) await this.flush();\n return removed;\n }\n\n search(query: Float32Array, topK = 8, minScore = 0): SearchHit[] {\n if (this.entries.length === 0) return [];\n if (query.length !== this.dim && this.dim !== 0) {\n throw new Error(`query dim ${query.length} ≠ index dim ${this.dim}`);\n }\n const heap: SearchHit[] = [];\n for (const entry of this.entries) {\n const score = dot(query, entry.embedding);\n if (score < minScore) continue;\n if (heap.length < topK) {\n heap.push({ entry, score });\n if (heap.length === topK) heap.sort((a, b) => a.score - b.score);\n } else if (score > heap[0]!.score) {\n heap[0] = { entry, score };\n for (let i = 0; i < heap.length - 1; i++) {\n if (heap[i]!.score > heap[i + 1]!.score) {\n const tmp = heap[i]!;\n heap[i] = heap[i + 1]!;\n heap[i + 1] = tmp;\n }\n }\n }\n }\n return heap.sort((a, b) => b.score - a.score);\n }\n\n private async flush(): Promise<void> {\n await fs.mkdir(this.indexDir, { recursive: true });\n const tmp = path.join(this.indexDir, `${DATA_FILE}.tmp`);\n const final = path.join(this.indexDir, DATA_FILE);\n const lines = this.entries.map(serializeEntry).join(\"\\n\");\n await fs.writeFile(tmp, lines.length > 0 ? `${lines}\\n` : \"\", \"utf8\");\n await fs.rename(tmp, final);\n await this.writeMeta();\n }\n\n private async writeMeta(): Promise<void> {\n const meta: IndexMeta = {\n version: STORE_VERSION,\n provider: this.provider,\n model: this.model,\n dim: this.dim,\n updatedAt: new Date().toISOString(),\n };\n await fs.writeFile(\n path.join(this.indexDir, META_FILE),\n `${JSON.stringify(meta, null, 2)}\\n`,\n \"utf8\",\n );\n }\n\n async wipe(): Promise<void> {\n this.entries = [];\n this.byPath.clear();\n this.dim = 0;\n await wipeStoreFiles(this.indexDir);\n }\n}\n\nexport async function openStore(indexDir: string, identity: IndexIdentity): Promise<SemanticStore> {\n const store = new SemanticStore(indexDir, identity);\n const dataPath = path.join(indexDir, DATA_FILE);\n\n const meta = await readIndexMeta(indexDir);\n\n if (meta) {\n if (meta.version !== STORE_VERSION) {\n throw new Error(\n `Index format version ${meta.version} does not match current ${STORE_VERSION}. Run \\`reasonix index --rebuild\\`.`,\n );\n }\n const mismatch = compareIndexIdentity(meta, identity);\n if (mismatch !== null) {\n throw new Error(\n `Index was built with provider \"${meta.provider}\" model \"${meta.model}\" but current config is provider \"${identity.provider}\" model \"${identity.model}\". Run \\`reasonix index --rebuild\\`.`,\n );\n }\n }\n\n let raw: string;\n try {\n raw = await fs.readFile(dataPath, \"utf8\");\n } catch {\n return store;\n }\n for (const line of raw.split(\"\\n\")) {\n if (line.length === 0) continue;\n try {\n const entry = deserializeEntry(line);\n (store as unknown as { dim: number }).dim = entry.embedding.length;\n (store as unknown as { entries: IndexEntry[] }).entries.push(entry);\n const map = (store as unknown as { byPath: Map<string, IndexEntry[]> }).byPath;\n const list = map.get(entry.path);\n if (list) list.push(entry);\n else map.set(entry.path, [entry]);\n } catch {\n /* tolerate malformed line */\n }\n }\n return store;\n}\n\nexport function normalize(v: Float32Array): Float32Array {\n let sum = 0;\n for (let i = 0; i < v.length; i++) sum += v[i]! * v[i]!;\n const inv = sum > 0 ? 1 / Math.sqrt(sum) : 0;\n for (let i = 0; i < v.length; i++) v[i] = v[i]! * inv;\n return v;\n}\n\nfunction dot(a: Float32Array, b: Float32Array): number {\n let s = 0;\n for (let i = 0; i < a.length; i++) s += a[i]! * b[i]!;\n return s;\n}\n\nfunction serializeEntry(e: IndexEntry): string {\n const buf = Buffer.from(e.embedding.buffer, e.embedding.byteOffset, e.embedding.byteLength);\n return JSON.stringify({\n p: e.path,\n s: e.startLine,\n e: e.endLine,\n m: e.mtimeMs,\n t: e.text,\n v: buf.toString(\"base64\"),\n });\n}\n\nfunction deserializeEntry(line: string): IndexEntry {\n const parsed = JSON.parse(line) as {\n p: string;\n s: number;\n e: number;\n m: number;\n t: string;\n v: string;\n };\n const buf = Buffer.from(parsed.v, \"base64\");\n const embedding = new Float32Array(\n buf.buffer.slice(buf.byteOffset, buf.byteOffset + buf.byteLength),\n );\n return {\n path: parsed.p,\n startLine: parsed.s,\n endLine: parsed.e,\n mtimeMs: parsed.m,\n text: parsed.t,\n embedding: new Float32Array(embedding),\n };\n}\n\nfunction normalizeMeta(meta: Partial<IndexMeta>): IndexMeta {\n return {\n version: typeof meta.version === \"number\" ? meta.version : STORE_VERSION,\n provider: meta.provider === \"openai-compat\" ? \"openai-compat\" : \"ollama\",\n model: typeof meta.model === \"string\" ? meta.model : \"\",\n dim: typeof meta.dim === \"number\" ? meta.dim : 0,\n updatedAt: typeof meta.updatedAt === \"string\" ? meta.updatedAt : new Date(0).toISOString(),\n };\n}\n"],"mappings":"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","names":["fs","path","fs","path","path","fs"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/memory/session.ts"],"sourcesContent":["/** JSONL append-only message log under `~/.reasonix/sessions/`; concurrent-write safe. */\n\nimport { execFileSync } from \"node:child_process\";\nimport {\n appendFileSync,\n chmodSync,\n copyFileSync,\n existsSync,\n mkdirSync,\n readFileSync,\n readdirSync,\n renameSync,\n statSync,\n unlinkSync,\n writeFileSync,\n} from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { dirname, join, posix as posixPath, win32 as win32Path } from \"node:path\";\nimport type { ChatMessage } from \"../types.js\";\n\nconst SESSION_SIDECAR_EXTS = [\n \".events.jsonl\",\n \".meta.json\",\n \".pending.json\",\n \".plan.json\",\n \".jsonl.bak\",\n] as const;\n\n/** Best-effort git branch sniff; returns undefined if not a git repo or git missing. */\nexport function detectGitBranch(cwd: string): string | undefined {\n try {\n const out = execFileSync(\"git\", [\"branch\", \"--show-current\"], {\n cwd,\n stdio: [\"ignore\", \"pipe\", \"ignore\"],\n timeout: 800,\n encoding: \"utf8\",\n }).trim();\n return out || undefined;\n } catch {\n return undefined;\n }\n}\n\nexport interface SessionInfo {\n name: string;\n path: string;\n size: number;\n messageCount: number;\n mtime: Date;\n meta: SessionMeta;\n}\n\nexport interface SessionMeta {\n branch?: string;\n summary?: string;\n totalCostUsd?: number;\n turnCount?: number;\n /** Absolute path of the workspace root the session was created/used in. */\n workspace?: string;\n /** Wallet currency at last save — used to format `totalCostUsd` in the picker without re-fetching balance. */\n balanceCurrency?: string;\n /** Cumulative cache hit / miss tokens across the session — survives resume so /status cache% isn't 0 on a fresh boot. */\n cacheHitTokens?: number;\n cacheMissTokens?: number;\n /** Last turn's promptTokens — lets /status render the context bar before the next turn fires. */\n lastPromptTokens?: number;\n /** True when the session filename/summary was generated from conversation content. */\n autoTitleGenerated?: boolean;\n}\n\nexport function sessionsDir(): string {\n return join(homedir(), \".reasonix\", \"sessions\");\n}\n\nexport function sessionPath(name: string): string {\n return join(sessionsDir(), `${sanitizeName(name)}.jsonl`);\n}\n\nexport function sanitizeName(name: string): string {\n const cleaned = name.replace(/[^\\w\\-\\u4e00-\\u9fa5]/g, \"_\").slice(0, 64);\n return cleaned || \"default\";\n}\n\n/** Sortable timestamp `YYYYMMDDHHmm` — used as a session-name suffix. */\nexport function timestampSuffix(): string {\n return new Date().toISOString().replace(/[^\\d]/g, \"\").slice(0, 12);\n}\n\n/** Unique name for an in-app \"new session\" — strips a trailing 12/14-digit timestamp from the current name and re-stamps with seconds precision so back-to-back clicks don't collide. */\nexport function freshSessionName(currentName: string | undefined): string {\n const base = currentName ? currentName.replace(/-\\d{12,14}$/, \"\") : \"default\";\n const stamp = new Date().toISOString().replace(/[^\\d]/g, \"\").slice(0, 14);\n return `${base || \"default\"}-${stamp}`;\n}\n\n/** Names of `.jsonl` sessions starting with `prefix`, newest-first by filename. */\nexport function findSessionsByPrefix(prefix: string): string[] {\n const dir = sessionsDir();\n if (!existsSync(dir)) return [];\n try {\n const files = readdirSync(dir)\n .filter((f) => f.endsWith(\".jsonl\") && !f.endsWith(\".events.jsonl\") && f.startsWith(prefix))\n .sort()\n .reverse();\n return files.map((f) => f.replace(/\\.jsonl$/, \"\"));\n } catch {\n return [];\n }\n}\n\nexport interface SessionPreview {\n messageCount: number;\n lastActive: Date;\n}\n\n/** Resolve launch-time session: forceNew → timestamped suffix; else latest `${name}-*` if any, else base. Preview returned only on the default branch when messages exist. */\nexport function resolveSession(\n sessionName: string | undefined,\n forceNew?: boolean,\n forceResume?: boolean,\n): { resolved: string | undefined; preview: SessionPreview | undefined } {\n let resolved = sessionName;\n let preview: SessionPreview | undefined;\n\n if (sessionName && forceNew) {\n resolved = `${sessionName}-${timestampSuffix()}`;\n } else if (sessionName && !forceResume) {\n let sessionToCheck = sessionName;\n const prefixed = findSessionsByPrefix(`${sessionName}-`);\n if (prefixed.length > 0) {\n sessionToCheck = prefixed[0]!;\n }\n const prior = loadSessionMessages(sessionToCheck);\n if (prior.length > 0) {\n resolved = sessionToCheck;\n const p = sessionPath(sessionToCheck);\n const mtime = existsSync(p) ? statSync(p).mtime : new Date();\n preview = { messageCount: prior.length, lastActive: mtime };\n }\n } else if (sessionName && forceResume) {\n const prefixed = findSessionsByPrefix(`${sessionName}-`);\n if (prefixed.length > 0) {\n resolved = prefixed[0]!;\n }\n }\n\n return { resolved, preview };\n}\n\nexport function loadSessionMessages(name: string): ChatMessage[] {\n const path = sessionPath(name);\n if (!existsSync(path)) return [];\n const live = readSessionMessages(path);\n if (live && (live.messages.length > 0 || !live.hadContent)) return live.messages;\n\n const backup = readSessionMessages(sessionBackupPath(path));\n return backup?.messages ?? live?.messages ?? [];\n}\n\nfunction readSessionMessages(\n path: string,\n): { messages: ChatMessage[]; hadContent: boolean } | null {\n let raw: string;\n try {\n raw = readFileSync(path, \"utf8\");\n } catch {\n return null;\n }\n const out: ChatMessage[] = [];\n for (const line of raw.split(/\\r?\\n/)) {\n const trimmed = line.trim();\n if (!trimmed) continue;\n try {\n const msg = JSON.parse(trimmed) as ChatMessage;\n if (msg && typeof msg === \"object\" && \"role\" in msg) out.push(msg);\n } catch {\n /* skip malformed line */\n }\n }\n return { messages: out, hadContent: raw.trim().length > 0 };\n}\n\nexport function appendSessionMessage(name: string, message: ChatMessage): void {\n const path = sessionPath(name);\n mkdirSync(dirname(path), { recursive: true });\n appendFileSync(path, `${JSON.stringify(message)}\\n`, \"utf8\");\n try {\n chmodSync(path, 0o600);\n } catch {\n /* chmod not supported on this platform */\n }\n}\n\nexport function listSessions(): SessionInfo[] {\n const dir = sessionsDir();\n if (!existsSync(dir)) return [];\n try {\n // Exclude `.events.jsonl` sidecars — they share the .jsonl suffix.\n const files = readdirSync(dir).filter(\n (f) => f.endsWith(\".jsonl\") && !f.endsWith(\".events.jsonl\"),\n );\n return files\n .map((file) => {\n const path = join(dir, file);\n const stat = statSync(path);\n const name = file.replace(/\\.jsonl$/, \"\");\n const messageCount = countLines(path);\n return {\n name,\n path,\n size: stat.size,\n messageCount,\n mtime: stat.mtime,\n meta: loadSessionMeta(name),\n };\n })\n .sort((a, b) => b.mtime.getTime() - a.mtime.getTime());\n } catch {\n return [];\n }\n}\n\n/** Canonical form for workspace path comparisons — Windows drive-case + separator drift between session writes (yesterday) and reads (today) used to hide sessions from the sidebar. Issue #878. */\nexport function normalizeWorkspace(\n p: string | undefined,\n platform: NodeJS.Platform = process.platform,\n): string {\n if (typeof p !== \"string\" || p.length === 0) return \"\";\n if (platform === \"win32\") {\n const resolved = win32Path.resolve(p);\n return resolved\n .replace(/\\\\/g, \"/\")\n .replace(/^([A-Z]):/i, (_, d: string) => `${d.toLowerCase()}:`);\n }\n return posixPath.resolve(p);\n}\n\n/** Sessions without `meta.workspace` are still hidden — resume by name still works. */\nexport function listSessionsForWorkspace(workspace: string): SessionInfo[] {\n const want = normalizeWorkspace(workspace);\n return listSessions().filter(\n (s) => typeof s.meta.workspace === \"string\" && normalizeWorkspace(s.meta.workspace) === want,\n );\n}\n\nfunction metaPath(name: string): string {\n return join(sessionsDir(), `${sanitizeName(name)}.meta.json`);\n}\n\nexport function loadSessionMeta(name: string): SessionMeta {\n const p = metaPath(name);\n if (!existsSync(p)) return {};\n try {\n const raw = JSON.parse(readFileSync(p, \"utf8\")) as SessionMeta;\n return raw && typeof raw === \"object\" ? raw : {};\n } catch {\n return {};\n }\n}\n\nexport function patchSessionMeta(name: string, patch: Partial<SessionMeta>): SessionMeta {\n const cur = loadSessionMeta(name);\n const next: SessionMeta = { ...cur, ...patch };\n const p = metaPath(name);\n mkdirSync(dirname(p), { recursive: true });\n writeFileSync(p, JSON.stringify(next), \"utf8\");\n try {\n chmodSync(p, 0o600);\n } catch {\n /* chmod not supported */\n }\n return next;\n}\n\n/** Renames the JSONL plus all known sidecars together; returns false if target already exists. */\nexport function renameSession(oldName: string, newName: string): boolean {\n const safeOld = sanitizeName(oldName);\n const safeNew = sanitizeName(newName);\n if (safeOld === safeNew) return false;\n const oldJsonl = sessionPath(oldName);\n const newJsonl = sessionPath(newName);\n if (!existsSync(oldJsonl) || existsSync(newJsonl)) return false;\n renameSync(oldJsonl, newJsonl);\n for (const ext of SESSION_SIDECAR_EXTS) {\n const oldP = oldJsonl.replace(/\\.jsonl$/, ext);\n const newP = newJsonl.replace(/\\.jsonl$/, ext);\n if (existsSync(oldP)) {\n try {\n renameSync(oldP, newP);\n } catch {\n /* sidecar rename failed — leave the jsonl rename in place */\n }\n }\n }\n return true;\n}\n\n/** Best-effort: per-file delete errors are swallowed so partial pruning still finishes. */\nexport function pruneStaleSessions(daysOld = 90): string[] {\n const cutoff = Date.now() - daysOld * 24 * 60 * 60 * 1000;\n const deleted: string[] = [];\n for (const s of listSessions()) {\n if (s.mtime.getTime() < cutoff) {\n if (deleteSession(s.name)) deleted.push(s.name);\n }\n }\n return deleted;\n}\n\nexport function deleteSession(name: string): boolean {\n const path = sessionPath(name);\n try {\n unlinkSync(path);\n for (const ext of SESSION_SIDECAR_EXTS) {\n const sidecar = path.replace(/\\.jsonl$/, ext);\n try {\n unlinkSync(sidecar);\n } catch {\n /* expected when the sidecar doesn't exist */\n }\n }\n return true;\n } catch {\n return false;\n }\n}\n\n/** Crash-safe rewrite: snapshot the previous live log, write a sibling tmp file, then atomically swap it in. */\nexport function rewriteSession(name: string, messages: ChatMessage[]): void {\n const path = sessionPath(name);\n mkdirSync(dirname(path), { recursive: true });\n const body = messages.map((m) => JSON.stringify(m)).join(\"\\n\");\n const tmp = `${path}.${process.pid}.${Date.now()}.${Math.random().toString(36).slice(2)}.tmp`;\n try {\n writeFileSync(tmp, body ? `${body}\\n` : \"\", \"utf8\");\n chmodPrivate(tmp);\n if (existsSync(path) && statSync(path).size > 0) {\n const backup = sessionBackupPath(path);\n copyFileSync(path, backup);\n chmodPrivate(backup);\n }\n renameSync(tmp, path);\n chmodPrivate(path);\n } catch (err) {\n try {\n unlinkSync(tmp);\n } catch {\n /* tmp may not exist */\n }\n throw err;\n }\n}\n\n/** Rotate the live jsonl + sidecars to `<name>__archive_<ts>` so /new doesn't destroy history. Returns the archive name, or null if there was nothing to archive. */\nexport function archiveSession(name: string): string | null {\n const path = sessionPath(name);\n if (!existsSync(path)) return null;\n try {\n if (statSync(path).size === 0) return null;\n } catch {\n return null;\n }\n for (let attempt = 0; attempt < 5; attempt++) {\n const target = `${name}__archive_${timestampSuffix()}${attempt > 0 ? `_${attempt}` : \"\"}`;\n if (renameSession(name, target)) return target;\n }\n return null;\n}\n\nfunction countLines(path: string): number {\n try {\n const raw = readFileSync(path, \"utf8\");\n return raw.split(/\\r?\\n/).filter((l) => l.trim()).length;\n } catch {\n return 0;\n }\n}\n\nfunction sessionBackupPath(path: string): string {\n return `${path}.bak`;\n}\n\nfunction chmodPrivate(path: string): void {\n try {\n chmodSync(path, 0o600);\n } catch {\n /* chmod not supported */\n }\n}\n"],"mappings":"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","names":[]}
|