very-happy-cli 0.2.159 → 0.2.160

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (258) hide show
  1. package/dist/{AcpBackend-DUYFlyfN.cjs → AcpBackend-Bm2rdke8.cjs} +78 -76
  2. package/dist/{AcpBackend-VsfkZiVF.mjs → AcpBackend-mzv8Dhba.mjs} +4 -2
  3. package/dist/{AcpSessionManager-Bdv8LWXh.cjs → AcpSessionManager-BAY1Pggx.cjs} +9 -9
  4. package/dist/{AcpSessionManager-rYtVb0kN.mjs → AcpSessionManager-CoMWFVw3.mjs} +1 -1
  5. package/dist/BasePermissionHandler-CFHAxumV.cjs +157 -0
  6. package/dist/BasePermissionHandler-m3WVholL.mjs +155 -0
  7. package/dist/BaseReasoningProcessor-BFa9_rZA.cjs +200 -0
  8. package/dist/BaseReasoningProcessor-CYrKBXGm.mjs +198 -0
  9. package/dist/RemoteModeDisplay-D-HewyXg.mjs +150 -0
  10. package/dist/RemoteModeDisplay-NC1gPHtj.cjs +153 -0
  11. package/dist/agentAttachments-Dbw8iMCZ.cjs +20 -0
  12. package/dist/agentAttachments-M_B5qEF2.mjs +18 -0
  13. package/dist/agentGuidance-B5NATuFa.cjs +28 -0
  14. package/dist/agentGuidance-CQuNlNx8.mjs +20 -0
  15. package/dist/{agentHome-CHh4lmjM.cjs → agentHome-CboCeKWq.cjs} +14 -28
  16. package/dist/{agentHome-CvsJyeQB.mjs → agentHome-Dj1C43aJ.mjs} +8 -22
  17. package/dist/api-CLMUr-SX.mjs +3339 -0
  18. package/dist/api-CgundNNX.cjs +3346 -0
  19. package/dist/{types-Dh-s4Lqs.mjs → apiMachine-B9dLW_p5.mjs} +9116 -16205
  20. package/dist/{types-BbvK1Tr_.cjs → apiMachine-Bn8482VM.cjs} +9104 -16247
  21. package/dist/assistantTools-BTqPnlFl.cjs +380 -0
  22. package/dist/assistantTools-D6tuc6o4.mjs +376 -0
  23. package/dist/attachmentContent-DpiTJZb4.cjs +88 -0
  24. package/dist/attachmentContent-_kxRznNf.mjs +82 -0
  25. package/dist/attachmentLimits-CzVrqgLR.cjs +354 -0
  26. package/dist/attachmentLimits-yba1uHFO.mjs +348 -0
  27. package/dist/auth-BDOVh5h5.cjs +220 -0
  28. package/dist/auth-Cwutmdsa.mjs +225 -0
  29. package/dist/auth-PYHZQNPp.mjs +218 -0
  30. package/dist/auth-ba4WMYrN.cjs +227 -0
  31. package/dist/authRelay-BdYkC1Po.cjs +156 -0
  32. package/dist/authRelay-DSAvg1uv.mjs +143 -0
  33. package/dist/{auto-DKmEls8Z.cjs → auto-BOX_fgmR.cjs} +70 -79
  34. package/dist/{auto-nb8GhRRy.mjs → auto-BXu14yP_.mjs} +27 -36
  35. package/dist/backgroundTaskActivity-8PdPxrvy.mjs +149 -0
  36. package/dist/backgroundTaskActivity-CBvUdj39.cjs +157 -0
  37. package/dist/bootstrap-B5G1TijC.cjs +116 -0
  38. package/dist/bootstrap-hxXPCFMx.mjs +112 -0
  39. package/dist/browser-Y6Bl8L_O.cjs +22 -0
  40. package/dist/browser-jh2P0UVZ.mjs +20 -0
  41. package/dist/claudeCliPath-BqkaH2oR.mjs +8 -0
  42. package/dist/claudeCliPath-U4HHmV4r.cjs +10 -0
  43. package/dist/claudeLocal-BaY4fZKi.mjs +339 -0
  44. package/dist/claudeLocal-CRGG4Pea.cjs +343 -0
  45. package/dist/claudeLocalLauncher-D4T7MTqd.mjs +152 -0
  46. package/dist/claudeLocalLauncher-DyEbVzUN.cjs +154 -0
  47. package/dist/cliUpdate-DsKXPFYp.cjs +120 -0
  48. package/dist/cliUpdate-Y34VGe9Y.mjs +112 -0
  49. package/dist/client-3Ac-O4pw.cjs +104 -0
  50. package/dist/client-BPNbmtvO.cjs +119 -0
  51. package/dist/client-CeGKqqcJ.mjs +100 -0
  52. package/dist/client-ClR0K8zX.mjs +112 -0
  53. package/dist/codex/happyMcpStdioBridge.cjs +33 -14
  54. package/dist/codex/happyMcpStdioBridge.mjs +26 -7
  55. package/dist/codexAppServerClient-I3teiV-N.mjs +1088 -0
  56. package/dist/codexAppServerClient-q2FjnRcK.cjs +1090 -0
  57. package/dist/codexCommand-4zcccIoq.cjs +2088 -0
  58. package/dist/codexCommand-Cc9gcbdX.mjs +2086 -0
  59. package/dist/codexThreadFork-BH9IZPqD.cjs +350 -0
  60. package/dist/codexThreadFork-slzAseLx.mjs +338 -0
  61. package/dist/{config-ClLtM6F3.mjs → config-CTx_jb-C.mjs} +7 -40
  62. package/dist/{config-DLx-vW3I.cjs → config-Ci9Kpgwa.cjs} +26 -59
  63. package/dist/configuration-BSYpcPwE.cjs +181 -0
  64. package/dist/configuration-RfeNjFmd.mjs +170 -0
  65. package/dist/connect-BpOdzNbE.mjs +682 -0
  66. package/dist/connect-C2CiOUFs.cjs +684 -0
  67. package/dist/constants-BC4St0xd.mjs +11 -0
  68. package/dist/constants-VJ0N6WuG.cjs +17 -0
  69. package/dist/contentLogMetadata-BlWI0egu.mjs +51 -0
  70. package/dist/contentLogMetadata-ZSFk_NjQ.cjs +54 -0
  71. package/dist/context-DsDr6E2t.cjs +69 -0
  72. package/dist/context-H0Bcb9S_.mjs +65 -0
  73. package/dist/controlClient-BGbDcgWS.mjs +260 -0
  74. package/dist/controlClient-Bcwv3D21.cjs +279 -0
  75. package/dist/createSessionMetadata-BJxEnM-o.cjs +58 -0
  76. package/dist/createSessionMetadata-CVVkGjxV.mjs +54 -0
  77. package/dist/defaultPermissionMode-BnxJPVHT.mjs +4 -0
  78. package/dist/defaultPermissionMode-CxmTXUQR.cjs +7 -0
  79. package/dist/detectCLI-CSGMlV51.mjs +58 -0
  80. package/dist/detectCLI-DR9ZaN6B.cjs +61 -0
  81. package/dist/deterministicJson-C5CYTVpm.cjs +507 -0
  82. package/dist/deterministicJson-CzkFJWw1.mjs +502 -0
  83. package/dist/doctor-BPkYWSuq.mjs +75 -0
  84. package/dist/doctor-D2YJ-Yn2.cjs +395 -0
  85. package/dist/doctor-DOvByjbk.mjs +391 -0
  86. package/dist/doctor-u46qYYKX.cjs +79 -0
  87. package/dist/doctorReadiness-BCZGcN0a.cjs +151 -0
  88. package/dist/doctorReadiness-C208SMN9.mjs +142 -0
  89. package/dist/editPaths-BVfS_FFL.mjs +68 -0
  90. package/dist/editPaths-Bqp4OFPw.cjs +73 -0
  91. package/dist/ensureDaemonRunning-BCwNrMyv.cjs +64 -0
  92. package/dist/ensureDaemonRunning-Dqa2pOjY.mjs +61 -0
  93. package/dist/handleResumeCommand-BvXYf5El.mjs +240 -0
  94. package/dist/handleResumeCommand-C2cKchpX.cjs +245 -0
  95. package/dist/ids-B6ZC0HGt.cjs +13 -0
  96. package/dist/ids-DU6sLx4C.mjs +10 -0
  97. package/dist/index-B6UGRQ7h.mjs +102 -0
  98. package/dist/{index-BEOMECtE.cjs → index-B6pAdvJx.cjs} +121 -91
  99. package/dist/index-Bu5Zi_a9.cjs +182 -0
  100. package/dist/index-D3kI0hDR.cjs +107 -0
  101. package/dist/index-DA7yINuk.cjs +994 -0
  102. package/dist/index-DDeHXrIX.cjs +71 -0
  103. package/dist/index-DKLU_fD0.mjs +158 -0
  104. package/dist/{index-2mCaeKyf.mjs → index-DMZqWwsP.mjs} +68 -38
  105. package/dist/index-DVkMGPyS.mjs +68 -0
  106. package/dist/index-qdS1friN.mjs +949 -0
  107. package/dist/index.cjs +5 -46
  108. package/dist/index.mjs +5 -46
  109. package/dist/{install-BPhJppvd.mjs → install-BO_W7VhL.mjs} +37 -37
  110. package/dist/install-BgoC2e_2.cjs +88 -0
  111. package/dist/install-CFY3tYtJ.mjs +86 -0
  112. package/dist/{install-BOHrUaFM.cjs → install-Cs5qAPrB.cjs} +38 -38
  113. package/dist/{installPiTools-DuZ6jZvX.cjs → installPiTools-BKnXjrVu.cjs} +2 -3
  114. package/dist/{installPiTools-Cj7yU9Fc.mjs → installPiTools-B_CdM5_2.mjs} +1 -2
  115. package/dist/{installTerminalHooks-Cou3WUf3.cjs → installTerminalHooks-BQZbvxsZ.cjs} +5 -40
  116. package/dist/{installTerminalHooks-WeznjkuC.mjs → installTerminalHooks-By7gBMEF.mjs} +3 -38
  117. package/dist/lib.cjs +28 -19
  118. package/dist/lib.d.cts +12 -2
  119. package/dist/lib.d.mts +12 -2
  120. package/dist/lib.mjs +23 -14
  121. package/dist/lidState-BeDfxxEX.cjs +305 -0
  122. package/dist/lidState-CeEt442o.mjs +297 -0
  123. package/dist/limits-C-a7gr04.cjs +43 -0
  124. package/dist/limits-DIo7rEBR.mjs +36 -0
  125. package/dist/localHappyAgentAuth-C-HQyiv6.mjs +82 -0
  126. package/dist/localHappyAgentAuth-D6rFhaoc.cjs +86 -0
  127. package/dist/logger-6HYUEXNk.mjs +271 -0
  128. package/dist/logger-CS0mw3fa.cjs +275 -0
  129. package/dist/loginShellEnv-BkuYtExZ.cjs +182 -0
  130. package/dist/loginShellEnv-Dw8M7tkI.mjs +167 -0
  131. package/dist/machineMetadata-DyDbODYd.cjs +41 -0
  132. package/dist/machineMetadata-oOzBfDfs.mjs +38 -0
  133. package/dist/main-BkxJP6JQ.cjs +941 -0
  134. package/dist/main-BwNIAI1A.mjs +939 -0
  135. package/dist/manager-BQ4flvQZ.mjs +101 -0
  136. package/dist/manager-Cly8xVIR.cjs +105 -0
  137. package/dist/{mcp-Dy3f_K0h.mjs → mcp-B1A4I3TK.mjs} +27 -33
  138. package/dist/{mcp-CPYbtsYG.cjs → mcp-Hszd7qpS.cjs} +42 -48
  139. package/dist/messageBuffer-BWlGgR3A.mjs +71 -0
  140. package/dist/messageBuffer-fJMH6uY8.cjs +73 -0
  141. package/dist/mirrorProtocol-BNLtoWjO.mjs +170 -0
  142. package/dist/mirrorProtocol-BUtmg1ws.cjs +186 -0
  143. package/dist/oneShotPrompts-CL0dip9C.cjs +16 -0
  144. package/dist/oneShotPrompts-DT4p6RNd.mjs +12 -0
  145. package/dist/package-BhaKlnxz.mjs +171 -0
  146. package/dist/package-BwMrPwqH.cjs +173 -0
  147. package/dist/path-B7zW-WwE.cjs +18 -0
  148. package/dist/path-D2wdaNSk.mjs +15 -0
  149. package/dist/peerTools-BTqw97Gb.mjs +272 -0
  150. package/dist/peerTools-BvKtHXj8.cjs +283 -0
  151. package/dist/permissionMode-Cr5JCbB7.mjs +80 -0
  152. package/dist/permissionMode-CrV-XuMs.cjs +87 -0
  153. package/dist/persistence-HGW_ZVs9.mjs +372 -0
  154. package/dist/persistence-yKTH3-5X.cjs +414 -0
  155. package/dist/piExtension.mjs +2 -1
  156. package/dist/piRunnerArgs-BNloJCCg.cjs +66 -0
  157. package/dist/piRunnerArgs-BuX1UFWy.mjs +59 -0
  158. package/dist/{piRuntime-kLZNpAAl.mjs → piRuntime-CSGkwCKQ.mjs} +2 -2
  159. package/dist/{piRuntime-NtF0YqjH.cjs → piRuntime-C_H7MJCM.cjs} +4 -4
  160. package/dist/{piTerminal-B0fEOV_2.mjs → piTerminal-C8a1OrNQ.mjs} +32 -35
  161. package/dist/{piTerminal-9J0GAKzb.cjs → piTerminal-DNCZ6yTM.cjs} +32 -35
  162. package/dist/previewPath-B0rBdhy1.cjs +83 -0
  163. package/dist/previewPath-CXN4Vag0.mjs +81 -0
  164. package/dist/projectPath-BTBIMB57.mjs +10 -0
  165. package/dist/projectPath-ChLhdOyt.cjs +13 -0
  166. package/dist/registerCommonHandlers-Ccvsz7Ou.mjs +536 -0
  167. package/dist/registerCommonHandlers-DskirN-_.cjs +538 -0
  168. package/dist/registerKillSessionHandler-DZeLXWcB.cjs +361 -0
  169. package/dist/registerKillSessionHandler-GYvHdipX.mjs +358 -0
  170. package/dist/remoteSessionClient-B0LraSB9.cjs +634 -0
  171. package/dist/remoteSessionClient-CYnXRynE.mjs +612 -0
  172. package/dist/resources-BdFBQi8r.mjs +117 -0
  173. package/dist/resources-JDPugcDq.cjs +120 -0
  174. package/dist/run-CJzxoHVh.cjs +5762 -0
  175. package/dist/run-D3ifupU3.mjs +5739 -0
  176. package/dist/runClaude-Ba01qT-u.mjs +848 -0
  177. package/dist/runClaude-Da3RirzE.cjs +850 -0
  178. package/dist/runClaudeDeps-DOt79DjU.mjs +3624 -0
  179. package/dist/runClaudeDeps-DOzEBMls.cjs +3649 -0
  180. package/dist/{runGemini-DV6Ouadt.mjs → runGemini-BGeTz57m.mjs} +58 -31
  181. package/dist/{runGemini-F-mqx3_K.cjs → runGemini-DSr9LIxL.cjs} +202 -175
  182. package/dist/{runOpenClaw-Qqo9j63M.cjs → runOpenClaw-B1mTxN35.cjs} +64 -65
  183. package/dist/{runOpenClaw-D7MlPS5n.mjs → runOpenClaw-CogSedIc.mjs} +31 -32
  184. package/dist/sandbox-CG7IyDTU.cjs +187 -0
  185. package/dist/sandbox-DTe6d54R.mjs +180 -0
  186. package/dist/selfCheck-C9mVrQwf.mjs +84 -0
  187. package/dist/selfCheck-Dc-mNSLb.cjs +87 -0
  188. package/dist/{send-4qJTCAYW.cjs → send-B7J_eaG3.cjs} +16 -9
  189. package/dist/{send-CLhYXNgy.mjs → send-CBXJKc6O.mjs} +12 -5
  190. package/dist/server-CZTP_iOn.cjs +407 -0
  191. package/dist/server-DcVBv04l.mjs +404 -0
  192. package/dist/sessionLock-Bys1PNSo.cjs +205 -0
  193. package/dist/sessionLock-D-EG2CfG.mjs +197 -0
  194. package/dist/sessionModeFile-DMl3dw3r.mjs +32 -0
  195. package/dist/sessionModeFile-RSm0NQkH.cjs +36 -0
  196. package/dist/sessionOps-Dn8z85h_.cjs +783 -0
  197. package/dist/sessionOps-SuHW8Dfe.mjs +760 -0
  198. package/dist/sessionScanner-BOrGjMXL.cjs +209 -0
  199. package/dist/sessionScanner-CX3onqXh.mjs +206 -0
  200. package/dist/{sessions-CzIH2rGp.mjs → sessions-BEG_HTSi.mjs} +17 -8
  201. package/dist/{sessions-Bh1pyddi.cjs → sessions-D74aJbhL.cjs} +37 -28
  202. package/dist/setupOfflineReconnection-ByElY60m.cjs +74 -0
  203. package/dist/setupOfflineReconnection-DpvWTt69.mjs +72 -0
  204. package/dist/smallFastModel-BLNgMrwR.mjs +18 -0
  205. package/dist/smallFastModel-D_uxGMo3.cjs +21 -0
  206. package/dist/{spawn-CPIWlPOM.mjs → spawn-B7yro0b2.mjs} +26 -38
  207. package/dist/{spawn-CmFOSVdW.cjs → spawn-DgR0RKRs.cjs} +52 -64
  208. package/dist/spawnAgents-BGQiEF-w.cjs +52 -0
  209. package/dist/spawnAgents-DZzZ9jMI.mjs +45 -0
  210. package/dist/spawnHappyCLI-B2H5s4B_.mjs +64 -0
  211. package/dist/spawnHappyCLI-DBhwZT7O.cjs +66 -0
  212. package/dist/specialCommands-BSqhYg5X.mjs +52 -0
  213. package/dist/specialCommands-DSsTeRej.cjs +54 -0
  214. package/dist/startFileWatcher-B4VsLgjD.cjs +71 -0
  215. package/dist/startFileWatcher-DErVWZE4.mjs +69 -0
  216. package/dist/startupPlan-BLMbfQIH.cjs +12 -0
  217. package/dist/startupPlan-DFMyNgAs.mjs +10 -0
  218. package/dist/streamRelay-BiKw59Cc.cjs +233 -0
  219. package/dist/streamRelay-FPVbHpbM.mjs +231 -0
  220. package/dist/sync-C8gyQFMc.mjs +69 -0
  221. package/dist/sync-DccIKZ5_.cjs +71 -0
  222. package/dist/systemPrompt-BwTPWfMu.cjs +97 -0
  223. package/dist/systemPrompt-DX521JJz.mjs +94 -0
  224. package/dist/{teams-CEahj4cm.mjs → teams-C32F1hqd.mjs} +9 -40
  225. package/dist/{teams-CB1R9-Z9.cjs → teams-Dl8g8kTI.cjs} +14 -45
  226. package/dist/template-BaHAmH2K.cjs +129 -0
  227. package/dist/template-CiOPa2rd.mjs +121 -0
  228. package/dist/{terminalTitleSuggest-DKgX3osW.mjs → terminalTitleSuggest-CeKsX_V6.mjs} +1 -9
  229. package/dist/{terminalTitleSuggest-Dji8I0Jy.cjs → terminalTitleSuggest-DhvRFX3H.cjs} +0 -10
  230. package/dist/terminals-B_bfC9c2.cjs +250 -0
  231. package/dist/terminals-Dlg0x3nY.mjs +235 -0
  232. package/dist/time-D0XyHOid.mjs +38 -0
  233. package/dist/time-DCuTyook.cjs +42 -0
  234. package/dist/titleGenerator-CQ8CoGhg.mjs +166 -0
  235. package/dist/titleGenerator-ChzMJsyg.cjs +172 -0
  236. package/dist/tmuxSocket-B8Yx20sT.mjs +19 -0
  237. package/dist/tmuxSocket-D-Xt6Vn-.cjs +24 -0
  238. package/dist/{todo-DqyRI4wP.cjs → todo-BvUOTa8G.cjs} +15 -12
  239. package/dist/{todo-Cknp5D4U.mjs → todo-CZ6cFrrn.mjs} +11 -8
  240. package/dist/tools-BZtHF_qQ.mjs +177 -0
  241. package/dist/tools-Be3AoAwu.cjs +63 -0
  242. package/dist/tools-DQj0AeLk.cjs +180 -0
  243. package/dist/tools-DkluDcG4.mjs +60 -0
  244. package/dist/trimIdent-4gvk9Wk6.cjs +22 -0
  245. package/dist/trimIdent-BAjmv_TG.mjs +20 -0
  246. package/dist/types-CRS-srZK.cjs +66 -0
  247. package/dist/types-CkqAACXx.mjs +64 -0
  248. package/dist/uninstall-BkLzaJ6I.mjs +47 -0
  249. package/dist/uninstall-x-TUtf5H.cjs +49 -0
  250. package/package.json +7 -7
  251. package/dist/agentGuidance-BRDN1NoZ.cjs +0 -2217
  252. package/dist/agentGuidance-KgvYuF3R.mjs +0 -2145
  253. package/dist/index-BF6WfgV5.mjs +0 -19624
  254. package/dist/index-C-JazrMB.mjs +0 -52
  255. package/dist/index-blDSadUR.cjs +0 -58
  256. package/dist/index-rH3DrQ5B.cjs +0 -19688
  257. package/dist/limits-BH5CV5vR.cjs +0 -2683
  258. package/dist/limits-CjRj8IX5.mjs +0 -2558
@@ -0,0 +1,157 @@
1
+ 'use strict';
2
+
3
+ const BACKGROUND_TASKS_MAX = 50;
4
+ const BACKGROUND_TASK_DESCRIPTION_MAX = 200;
5
+ const text = (value) => typeof value === "string" && value.length > 0 && !value.includes("\0") ? value : null;
6
+ const clip = (value) => value.length <= BACKGROUND_TASK_DESCRIPTION_MAX ? value : `${value.slice(0, BACKGROUND_TASK_DESCRIPTION_MAX - 1)}\u2026`;
7
+ const SETTLED_STATUSES = /* @__PURE__ */ new Set(["completed", "failed", "killed"]);
8
+ function sameBackgroundTasks(a, b) {
9
+ if (a.length !== b.length) return false;
10
+ const byId = new Map(a.map((task) => [task.id, task]));
11
+ for (const task of b) {
12
+ const other = byId.get(task.id);
13
+ if (!other || other.description !== task.description || other.type !== task.type) return false;
14
+ }
15
+ return true;
16
+ }
17
+ function createBackgroundTaskTracker() {
18
+ const background = /* @__PURE__ */ new Map();
19
+ const known = /* @__PURE__ */ new Map();
20
+ const add = (id, now, meta) => {
21
+ const existing = background.get(id);
22
+ const seen = known.get(id);
23
+ background.set(id, {
24
+ id,
25
+ type: meta?.type ?? existing?.type ?? seen?.type ?? "unknown",
26
+ description: clip(meta?.description ?? existing?.description ?? seen?.description ?? ""),
27
+ startedAt: existing?.startedAt ?? now
28
+ });
29
+ if (background.size > BACKGROUND_TASKS_MAX) background.delete(background.keys().next().value);
30
+ };
31
+ function observe(message, now = Date.now()) {
32
+ const m = message;
33
+ if (m.type === "system") {
34
+ if (m.subtype === "background_tasks_changed" && Array.isArray(m.tasks)) {
35
+ const next = /* @__PURE__ */ new Set();
36
+ for (const task of m.tasks) {
37
+ const id2 = text(task?.task_id);
38
+ if (!id2 || task.ambient === true) continue;
39
+ next.add(id2);
40
+ add(id2, now, { type: text(task.task_type) ?? void 0, description: text(task.description) ?? void 0 });
41
+ }
42
+ for (const id2 of [...background.keys()]) if (!next.has(id2)) background.delete(id2);
43
+ return;
44
+ }
45
+ const id = text(m.task_id);
46
+ if (!id) return;
47
+ if (m.subtype === "task_started") {
48
+ if (m.ambient === true || m.skip_transcript === true) return;
49
+ const meta = { id, type: text(m.task_type) ?? "unknown", description: clip(text(m.description) ?? ""), toolUseId: text(m.tool_use_id) };
50
+ known.set(id, meta);
51
+ if (known.size > BACKGROUND_TASKS_MAX * 4) known.delete(known.keys().next().value);
52
+ if (m.is_backgrounded === true) add(id, now, meta);
53
+ return;
54
+ }
55
+ if (m.subtype === "task_updated" && m.patch && typeof m.patch === "object") {
56
+ if (SETTLED_STATUSES.has(String(m.patch.status))) {
57
+ background.delete(id);
58
+ return;
59
+ }
60
+ if (m.patch.is_backgrounded === true) add(id, now, { description: text(m.patch.description) ?? void 0 });
61
+ return;
62
+ }
63
+ if (m.subtype === "task_notification") {
64
+ background.delete(id);
65
+ return;
66
+ }
67
+ return;
68
+ }
69
+ if (m.type === "user" && m.tool_use_result && typeof m.tool_use_result === "object" && m.tool_use_result.status === "async_launched" && Array.isArray(m.message?.content)) {
70
+ for (const block of m.message.content) {
71
+ const toolUseId = block?.type === "tool_result" ? text(block.tool_use_id) : null;
72
+ if (!toolUseId) continue;
73
+ for (const seen of known.values()) if (seen.toolUseId === toolUseId) add(seen.id, now, seen);
74
+ }
75
+ }
76
+ }
77
+ function reset() {
78
+ background.clear();
79
+ known.clear();
80
+ }
81
+ function list() {
82
+ return [...background.values()].sort((a, b) => a.startedAt - b.startedAt).map((task) => ({ ...task }));
83
+ }
84
+ return { observe, reset, list };
85
+ }
86
+
87
+ const BACKGROUND_TASKS_LEASE_MS = 6e4;
88
+ const BACKGROUND_TASKS_TTL_MS = 15e4;
89
+ const EMPTY_BACKGROUND_TASKS = Object.freeze({ count: 0, tasks: [] });
90
+ function backgroundTasksReport(stored, now, options = {}) {
91
+ const tasks = Array.isArray(stored?.tasks) ? stored.tasks.filter((task) => task && typeof task.id === "string") : [];
92
+ const reportedAt = typeof stored?.updatedAt === "number" ? stored.updatedAt : void 0;
93
+ if (tasks.length === 0) return reportedAt === void 0 ? { ...EMPTY_BACKGROUND_TASKS, tasks: [] } : { count: 0, tasks: [], reportedAt };
94
+ const fresh = options.active !== false && reportedAt !== void 0 && now - reportedAt <= (options.ttlMs ?? BACKGROUND_TASKS_TTL_MS);
95
+ if (!fresh) return { count: 0, tasks: [], ...reportedAt !== void 0 ? { reportedAt } : {}, stale: true };
96
+ return { count: tasks.length, tasks: tasks.map((task) => ({ ...task })), reportedAt };
97
+ }
98
+ class BackgroundTaskReporter {
99
+ constructor(publish, leaseMs = BACKGROUND_TASKS_LEASE_MS) {
100
+ this.publish = publish;
101
+ this.leaseMs = leaseMs;
102
+ }
103
+ last = [];
104
+ lastPublishedAt = 0;
105
+ /** Called on every keepAlive tick with the current set; publishes only on an edge or a due renewal. */
106
+ observe(tasks, now = Date.now()) {
107
+ const changed = !sameBackgroundTasks(this.last, tasks);
108
+ const due = tasks.length > 0 && now - this.lastPublishedAt >= this.leaseMs;
109
+ if (!changed && !due) return false;
110
+ this.last = tasks.map((task) => ({ ...task }));
111
+ this.lastPublishedAt = now;
112
+ this.publish(this.last, now);
113
+ return true;
114
+ }
115
+ current() {
116
+ return this.last;
117
+ }
118
+ }
119
+ class BackgroundTaskTracker {
120
+ constructor(ttlMs = BACKGROUND_TASKS_TTL_MS) {
121
+ this.ttlMs = ttlMs;
122
+ }
123
+ sets = /* @__PURE__ */ new Map();
124
+ apply(sessionId, tasks, now = Date.now()) {
125
+ if (tasks.length === 0) this.sets.delete(sessionId);
126
+ else this.sets.set(sessionId, { at: now, tasks: tasks.map((task) => ({ ...task })) });
127
+ }
128
+ /** The wrapper is gone: whatever it reported no longer holds. */
129
+ forget(sessionId) {
130
+ this.sets.delete(sessionId);
131
+ }
132
+ report(sessionId, now = Date.now()) {
133
+ const entry = this.sets.get(sessionId);
134
+ if (!entry) return { ...EMPTY_BACKGROUND_TASKS, tasks: [] };
135
+ const out = backgroundTasksReport({ updatedAt: entry.at, tasks: entry.tasks }, now, { ttlMs: this.ttlMs });
136
+ if (out.stale) this.sets.delete(sessionId);
137
+ return out;
138
+ }
139
+ count(sessionId, now = Date.now()) {
140
+ return this.report(sessionId, now).count;
141
+ }
142
+ /** Sessions whose published set is still inside the TTL. */
143
+ activeSessions(now = Date.now()) {
144
+ return [...this.sets.keys()].filter((id) => this.count(id, now) > 0);
145
+ }
146
+ hasAny(now = Date.now()) {
147
+ return this.activeSessions(now).length > 0;
148
+ }
149
+ }
150
+
151
+ exports.BACKGROUND_TASKS_MAX = BACKGROUND_TASKS_MAX;
152
+ exports.BACKGROUND_TASK_DESCRIPTION_MAX = BACKGROUND_TASK_DESCRIPTION_MAX;
153
+ exports.BackgroundTaskReporter = BackgroundTaskReporter;
154
+ exports.BackgroundTaskTracker = BackgroundTaskTracker;
155
+ exports.backgroundTasksReport = backgroundTasksReport;
156
+ exports.createBackgroundTaskTracker = createBackgroundTaskTracker;
157
+ exports.sameBackgroundTasks = sameBackgroundTasks;
@@ -0,0 +1,116 @@
1
+ 'use strict';
2
+
3
+ var node_fs = require('node:fs');
4
+ var promises = require('node:fs/promises');
5
+ var path = require('node:path');
6
+ var configuration = require('./configuration-BSYpcPwE.cjs');
7
+ require('node:os');
8
+ require('./package-BwMrPwqH.cjs');
9
+
10
+ const ASSISTANT_CLAUDE_MD = `# very-happy \u8C03\u5EA6\u4E2D\u5FC3\uFF08\u8BED\u97F3\u52A9\u624B\uFF09
11
+
12
+ \u4F60\u662F very-happy \u7684\u8C03\u5EA6\u4E2D\u5FC3\uFF0C\u8DD1\u5728\u7528\u6237\u81EA\u5DF1\u7684\u673A\u5668\u4E0A\u3002\u7528\u6237\u4E3B\u8981\u901A\u8FC7\u8BED\u97F3\u8DDF\u4F60\u8BF4\u8BDD\uFF0C
13
+ \u4F60\u7684\u56DE\u590D\u4F1A\u88AB TTS \u6717\u8BFB\u51FA\u6765\u3002
14
+
15
+ ## \u8BF4\u8BDD\u65B9\u5F0F
16
+
17
+ - \u7B80\u77ED\u3001\u53E3\u8BED\u5316\uFF0C\u9ED8\u8BA4\u4E00\u4E24\u53E5\u8BDD\u8BF4\u5B8C\uFF1B\u7528\u6237\u660E\u786E\u8981\u6C42\u5C55\u5F00\u624D\u5C55\u5F00\u3002
18
+ - \u4E0D\u8981\u7528 markdown \u91CD\u6392\u7248\uFF08\u6807\u9898/\u5217\u8868/\u8868\u683C/\u4EE3\u7801\u5757\u90FD\u522B\u7528\uFF09\uFF0C\u4E0D\u8981\u8D34\u957F\u4EE3\u7801\u2014\u2014
19
+ \u8FD9\u4E9B\u5FF5\u51FA\u6765\u5168\u662F\u566A\u97F3\u3002
20
+ - \u4E0D\u786E\u5B9A\u5C31\u76F4\u63A5\u95EE\uFF0C\u4E0D\u66FF\u7528\u6237\u505A\u786C\u51B3\u5B9A\u3002
21
+ - **\u591A\u9009\u4E00\u7684\u95EE\u9898\u7528 options \u5757**\uFF08\u754C\u9762\u4F1A\u6E32\u67D3\u6210\u53EF\u70B9\u6309\u94AE\uFF0C\u4E14\u4E0D\u4F1A\u88AB\u6717\u8BFB\uFF09\u2014\u2014
22
+ \u95EE\u53E5\u6B63\u5E38\u8BF4\uFF0C\u9009\u9879\u5305\u5728\u5757\u91CC\uFF0C\u6BCF\u9879\u4E00\u884C\u77ED\u8BED\uFF1A
23
+
24
+ <options>
25
+ <option>\u9009\u9879\u4E00\u7684\u77ED\u8BED</option>
26
+ <option>\u9009\u9879\u4E8C\u7684\u77ED\u8BED</option>
27
+ </options>
28
+
29
+ - \u6D3E\u51FA\u53BB\u7684\u4EFB\u52A1\u6709\u7ED3\u679C\u65F6\uFF0C\u4E3B\u52A8\u6C47\u62A5\u4E00\u53E5\u7ED3\u8BBA\u3002
30
+
31
+ ## \u4EFB\u52A1\u76D8\u70B9\u53E3\u5F84
32
+
33
+ \u300C\u73B0\u5728\u6709\u54EA\u4E9B\u4EFB\u52A1 / \u5728\u8DD1\u4EC0\u4E48\u300D\u8FD9\u7C7B\u95EE\u9898\uFF1A**sessions_list \u548C terminals_list
34
+ \u90FD\u8981\u67E5**\u2014\u2014\u6D3B\u7740\u7684\u7EC8\u7AEF\uFF08tmux \u4F1A\u8BDD\uFF09\u540C\u6837\u662F\u5B58\u5728\u7684\u4EFB\u52A1\uFF0C\u4E00\u5E76\u76D8\u70B9\u6C47\u62A5
35
+ \uFF08\u8BF4\u6E05\u54EA\u4E9B\u662F\u804A\u5929\u4F1A\u8BDD\u3001\u54EA\u4E9B\u662F\u7EC8\u7AEF\uFF0C\u4EE5\u53CA\u5404\u81EA\u72B6\u6001\uFF09\u3002
36
+
37
+ ## \u6536\u5230 [\u7CFB\u7EDF\u901A\u62A5] \u7684\u5904\u7406\u65B9\u5F0F
38
+
39
+ \u4EE5 \`[\u7CFB\u7EDF\u901A\u62A5]\` \u5F00\u5934\u7684\u6D88\u606F\u662F\u7CFB\u7EDF\u81EA\u52A8\u53D1\u6765\u7684\uFF08\u4F60\u6D3E\u51FA\u53BB\u7684 session \u5B8C\u6210\u4E86
40
+ \u6216\u5728\u7B49\u8F93\u5165\uFF09\uFF0C\u4E0D\u662F\u7528\u6237\u8BF4\u7684\u8BDD\u3002\u5904\u7406\u65B9\u5F0F\uFF1A
41
+
42
+ - \u5148\u7528 session_read \u6838\u5B9E\u90A3\u4E2A session \u7684\u5B9E\u9645\u7ED3\u679C\uFF0C\u518D\u5411\u7528\u6237\u53E3\u5934\u6C47\u62A5
43
+ **\u4E00\u53E5\u7ED3\u8BBA**\uFF08\u505A\u6210\u4E86\u4EC0\u4E48 / \u5361\u5728\u54EA\u91CC / \u9700\u8981\u7528\u6237\u505A\u4EC0\u4E48\uFF09\u3002
44
+ - \u4E0D\u8981\u590D\u8BFB\u901A\u62A5\u539F\u6587\uFF0C\u4E5F\u4E0D\u8981\u5FF5 session id\u3002
45
+ - \u77ED\u65F6\u95F4\u5185\u6536\u5230\u591A\u6761\u901A\u62A5\u65F6\uFF0C\u5408\u5E76\u6210\u4E00\u6B21\u6C47\u62A5\uFF0C\u4E00\u8D77\u8BF4\u5B8C\u3002
46
+
47
+ ## \u5DE5\u4F5C\u6A21\u5F0F\uFF1A\u6D3E\u6D3B\uFF0C\u4E0D\u81EA\u5DF1\u52A8\u624B
48
+
49
+ - \u4F60\u7684\u6838\u5FC3\u52A8\u4F5C\u662F **session_spawn**\uFF1A\u628A\u7F16\u7801/\u6392\u67E5/\u7814\u7A76\u4EFB\u52A1\u6D3E\u7ED9\u4E00\u4E2A\u72EC\u7ACB\u7684
50
+ Claude Code session \u53BB\u505A\uFF0C\u7136\u540E\u7528 sessions_list / session_read \u8DDF\u8FDB\u8FDB\u5EA6\u3001
51
+ \u7528 session_send \u8FFD\u52A0\u6307\u793A\u3002
52
+ - **\u5DE5\u5177\u8FB9\u754C\uFF08\u786C\u7EA6\u675F\uFF0C\u4E0D\u662F\u5EFA\u8BAE\uFF09**\uFF1A\u4F60\u6CA1\u6709 Bash / Edit / Write\u2014\u2014\u8C03\u5EA6\u5668
53
+ \u4E0D\u4EB2\u81EA\u52A8\u624B\u3002\u8BFB\u548C\u68C0\u7D22\u7528 Read / Grep / Glob\uFF1B\u4E2A\u4EBA\u8BB0\u5FC6\u5199 memory_update\uFF1B
54
+ \u5DE5\u4F5C\u65E5\u5FD7\u5199 journal_append\uFF1B\u4EFB\u4F55\u8981\u6539\u6587\u4EF6\u3001\u8DD1\u547D\u4EE4\u7684\u6D3B\uFF0C\u6D3E session\u3002
55
+ - \u4E0D\u8981\u81EA\u5DF1\u5728\u8FD9\u4E2A\u4F1A\u8BDD\u91CC\u5199\u4EE3\u7801\u3001\u6539\u4ED3\u5E93\u2014\u2014\u4F60\u7684\u5DE5\u4F5C\u76EE\u5F55\u53EA\u662F\u4F60\u81EA\u5DF1\u7684\u5BB6\u76EE\u5F55\u3002
56
+ - \u5982\u679C\u7528\u6237\u7ED9\u51FA\u4E86\u81EA\u5DF1\u7684 skills / \u64CD\u4F5C\u624B\u518C\u76EE\u5F55\uFF0C\u53EF\u4EE5\u8BFB\u5B83\u4E86\u89E3\u5404\u9886\u57DF\u4E0A\u4E0B\u6587\uFF1B
57
+ \u4E0D\u8981\u731C\u6D4B\u4E2A\u4EBA\u76EE\u5F55\u3002\u4F18\u5148\u628A\u4EFB\u52A1\uFF08\u8FDE\u540C\u7528\u6237\u660E\u786E\u63D0\u4F9B\u7684 skill \u8DEF\u5F84\uFF09\u6D3E\u7ED9\u65B0 session\u3002
58
+ - \u7EC8\u7AEF\u7C7B\u64CD\u4F5C\u7528 terminals_list / terminal_read / terminal_send \u89C2\u5BDF\u548C\u8F7B\u63A8
59
+ \u5DF2\u7ECF\u5F00\u7740\u7684\u7EC8\u7AEF\u3002
60
+
61
+ ## \u8D35\u64CD\u4F5C\u5148\u786E\u8BA4
62
+
63
+ session_kill\u3001session_archive\u3001terminal_send\uFF08submit=true\uFF0C\u4F1A\u771F\u7684\u6309\u56DE\u8F66\u6267\u884C\uFF09
64
+ \u8FD9\u7C7B\u64CD\u4F5C\uFF0C\u5148\u590D\u8FF0\u4F60\u8981\u64CD\u4F5C\u7684\u5BF9\u8C61\uFF08title / cwd / id\uFF09\uFF0C\u7B49\u7528\u6237\u786E\u8BA4\u518D\u505A\u3002
65
+
66
+ ## \u8BB0\u5FC6\u7EAA\u5F8B
67
+
68
+ - \u4E2A\u4EBA\u957F\u671F\u8BB0\u5FC6\u5728 \`memory/personal.md\`\uFF0C\u7528 memory_update \u6309\u6BB5\u843D\u7EF4\u62A4\u3002
69
+ - **\u9ED8\u8BA4\u4E0D\u5199**\uFF1A\u5927\u591A\u6570\u5BF9\u8BDD\u4E0D\u9700\u8981\u5199\u8BB0\u5FC6\u3002\u53EA\u6709\u7528\u6237\u7684\u957F\u671F\u504F\u597D\u3001\u8EAB\u4EFD\u4E8B\u5B9E\u3001
70
+ \u6216\u7528\u6237\u660E\u786E\u8BF4"\u8BB0\u4F4F"\u7684\u5185\u5BB9\u624D\u503C\u5F97\u5199\u3002
71
+ - \u4E0A\u9650\u7EA6 2000 \u5B57\u7B26\u3002\u6761\u76EE\u5E26\u65E5\u671F\uFF08\u5982 \`- [2026-08-13] \u559C\u6B22\u7B80\u77ED\u6C47\u62A5\`\uFF09\uFF1B
72
+ \u66F4\u65B0\u65F6\u6539\u5199\u5BF9\u5E94\u6761\u76EE\uFF0C\u4E0D\u8981\u65E0\u8111\u8FFD\u52A0\u3002
73
+ - \u5FEB compact\uFF08\u4E0A\u4E0B\u6587\u5FEB\u6EE1\uFF09\u65F6\uFF0C\u7528 journal_append \u628A\u8FD9\u6BB5\u65F6\u95F4\u7684\u8981\u7D27\u8FDB\u5C55
74
+ \u5199\u8FDB\u5F53\u5929\u5DE5\u4F5C\u65E5\u5FD7\uFF08journal \u53EA\u8FFD\u52A0\u4E0D\u6539\u5199\uFF09\u3002
75
+ `;
76
+ const ASSISTANT_PERSONAL_MD = `# \u4E2A\u4EBA\u8BB0\u5FC6
77
+
78
+ > \u7531 memory_update \u5DE5\u5177\u6309\u4E8C\u7EA7\u6807\u9898\u6BB5\u7EF4\u62A4\u3002\u4E0A\u9650\u7EA6 2000 \u5B57\u7B26\u3002
79
+ > \u9ED8\u8BA4\u4E0D\u5199\uFF1A\u53EA\u8BB0\u957F\u671F\u504F\u597D\u3001\u8EAB\u4EFD\u4E8B\u5B9E\u3001\u7528\u6237\u660E\u786E\u8981\u6C42\u8BB0\u4F4F\u7684\u5185\u5BB9\u3002
80
+ > \u6761\u76EE\u5E26\u65E5\u671F\uFF0C\u66F4\u65B0\u65F6\u6539\u5199\u5BF9\u5E94\u6761\u76EE\u800C\u4E0D\u662F\u8FFD\u52A0\u3002
81
+
82
+ ## \u8EAB\u4EFD\u4E0E\u504F\u597D
83
+
84
+ \uFF08\u6682\u65E0\uFF09
85
+
86
+ ## \u957F\u671F\u4E8B\u5B9E
87
+
88
+ \uFF08\u6682\u65E0\uFF09
89
+ `;
90
+
91
+ function assistantHome() {
92
+ return path.join(configuration.configuration.happyHomeDir, "assistant");
93
+ }
94
+ function assistantPersonalMemoryPath(home = assistantHome()) {
95
+ return path.join(home, "memory", "personal.md");
96
+ }
97
+ async function bootstrapAssistantHome(home = assistantHome()) {
98
+ const created = [];
99
+ const journalDir = path.join(home, "memory", "journal");
100
+ await promises.mkdir(journalDir, { recursive: true });
101
+ const claudeMdPath = path.join(home, "CLAUDE.md");
102
+ if (!node_fs.existsSync(claudeMdPath)) {
103
+ await promises.writeFile(claudeMdPath, ASSISTANT_CLAUDE_MD, "utf8");
104
+ created.push(claudeMdPath);
105
+ }
106
+ const personalPath = assistantPersonalMemoryPath(home);
107
+ if (!node_fs.existsSync(personalPath)) {
108
+ await promises.writeFile(personalPath, ASSISTANT_PERSONAL_MD, "utf8");
109
+ created.push(personalPath);
110
+ }
111
+ return { home, created };
112
+ }
113
+
114
+ exports.assistantHome = assistantHome;
115
+ exports.assistantPersonalMemoryPath = assistantPersonalMemoryPath;
116
+ exports.bootstrapAssistantHome = bootstrapAssistantHome;
@@ -0,0 +1,112 @@
1
+ import { existsSync } from 'node:fs';
2
+ import { mkdir, writeFile } from 'node:fs/promises';
3
+ import { join } from 'node:path';
4
+ import { c as configuration } from './configuration-RfeNjFmd.mjs';
5
+ import 'node:os';
6
+ import './package-BhaKlnxz.mjs';
7
+
8
+ const ASSISTANT_CLAUDE_MD = `# very-happy \u8C03\u5EA6\u4E2D\u5FC3\uFF08\u8BED\u97F3\u52A9\u624B\uFF09
9
+
10
+ \u4F60\u662F very-happy \u7684\u8C03\u5EA6\u4E2D\u5FC3\uFF0C\u8DD1\u5728\u7528\u6237\u81EA\u5DF1\u7684\u673A\u5668\u4E0A\u3002\u7528\u6237\u4E3B\u8981\u901A\u8FC7\u8BED\u97F3\u8DDF\u4F60\u8BF4\u8BDD\uFF0C
11
+ \u4F60\u7684\u56DE\u590D\u4F1A\u88AB TTS \u6717\u8BFB\u51FA\u6765\u3002
12
+
13
+ ## \u8BF4\u8BDD\u65B9\u5F0F
14
+
15
+ - \u7B80\u77ED\u3001\u53E3\u8BED\u5316\uFF0C\u9ED8\u8BA4\u4E00\u4E24\u53E5\u8BDD\u8BF4\u5B8C\uFF1B\u7528\u6237\u660E\u786E\u8981\u6C42\u5C55\u5F00\u624D\u5C55\u5F00\u3002
16
+ - \u4E0D\u8981\u7528 markdown \u91CD\u6392\u7248\uFF08\u6807\u9898/\u5217\u8868/\u8868\u683C/\u4EE3\u7801\u5757\u90FD\u522B\u7528\uFF09\uFF0C\u4E0D\u8981\u8D34\u957F\u4EE3\u7801\u2014\u2014
17
+ \u8FD9\u4E9B\u5FF5\u51FA\u6765\u5168\u662F\u566A\u97F3\u3002
18
+ - \u4E0D\u786E\u5B9A\u5C31\u76F4\u63A5\u95EE\uFF0C\u4E0D\u66FF\u7528\u6237\u505A\u786C\u51B3\u5B9A\u3002
19
+ - **\u591A\u9009\u4E00\u7684\u95EE\u9898\u7528 options \u5757**\uFF08\u754C\u9762\u4F1A\u6E32\u67D3\u6210\u53EF\u70B9\u6309\u94AE\uFF0C\u4E14\u4E0D\u4F1A\u88AB\u6717\u8BFB\uFF09\u2014\u2014
20
+ \u95EE\u53E5\u6B63\u5E38\u8BF4\uFF0C\u9009\u9879\u5305\u5728\u5757\u91CC\uFF0C\u6BCF\u9879\u4E00\u884C\u77ED\u8BED\uFF1A
21
+
22
+ <options>
23
+ <option>\u9009\u9879\u4E00\u7684\u77ED\u8BED</option>
24
+ <option>\u9009\u9879\u4E8C\u7684\u77ED\u8BED</option>
25
+ </options>
26
+
27
+ - \u6D3E\u51FA\u53BB\u7684\u4EFB\u52A1\u6709\u7ED3\u679C\u65F6\uFF0C\u4E3B\u52A8\u6C47\u62A5\u4E00\u53E5\u7ED3\u8BBA\u3002
28
+
29
+ ## \u4EFB\u52A1\u76D8\u70B9\u53E3\u5F84
30
+
31
+ \u300C\u73B0\u5728\u6709\u54EA\u4E9B\u4EFB\u52A1 / \u5728\u8DD1\u4EC0\u4E48\u300D\u8FD9\u7C7B\u95EE\u9898\uFF1A**sessions_list \u548C terminals_list
32
+ \u90FD\u8981\u67E5**\u2014\u2014\u6D3B\u7740\u7684\u7EC8\u7AEF\uFF08tmux \u4F1A\u8BDD\uFF09\u540C\u6837\u662F\u5B58\u5728\u7684\u4EFB\u52A1\uFF0C\u4E00\u5E76\u76D8\u70B9\u6C47\u62A5
33
+ \uFF08\u8BF4\u6E05\u54EA\u4E9B\u662F\u804A\u5929\u4F1A\u8BDD\u3001\u54EA\u4E9B\u662F\u7EC8\u7AEF\uFF0C\u4EE5\u53CA\u5404\u81EA\u72B6\u6001\uFF09\u3002
34
+
35
+ ## \u6536\u5230 [\u7CFB\u7EDF\u901A\u62A5] \u7684\u5904\u7406\u65B9\u5F0F
36
+
37
+ \u4EE5 \`[\u7CFB\u7EDF\u901A\u62A5]\` \u5F00\u5934\u7684\u6D88\u606F\u662F\u7CFB\u7EDF\u81EA\u52A8\u53D1\u6765\u7684\uFF08\u4F60\u6D3E\u51FA\u53BB\u7684 session \u5B8C\u6210\u4E86
38
+ \u6216\u5728\u7B49\u8F93\u5165\uFF09\uFF0C\u4E0D\u662F\u7528\u6237\u8BF4\u7684\u8BDD\u3002\u5904\u7406\u65B9\u5F0F\uFF1A
39
+
40
+ - \u5148\u7528 session_read \u6838\u5B9E\u90A3\u4E2A session \u7684\u5B9E\u9645\u7ED3\u679C\uFF0C\u518D\u5411\u7528\u6237\u53E3\u5934\u6C47\u62A5
41
+ **\u4E00\u53E5\u7ED3\u8BBA**\uFF08\u505A\u6210\u4E86\u4EC0\u4E48 / \u5361\u5728\u54EA\u91CC / \u9700\u8981\u7528\u6237\u505A\u4EC0\u4E48\uFF09\u3002
42
+ - \u4E0D\u8981\u590D\u8BFB\u901A\u62A5\u539F\u6587\uFF0C\u4E5F\u4E0D\u8981\u5FF5 session id\u3002
43
+ - \u77ED\u65F6\u95F4\u5185\u6536\u5230\u591A\u6761\u901A\u62A5\u65F6\uFF0C\u5408\u5E76\u6210\u4E00\u6B21\u6C47\u62A5\uFF0C\u4E00\u8D77\u8BF4\u5B8C\u3002
44
+
45
+ ## \u5DE5\u4F5C\u6A21\u5F0F\uFF1A\u6D3E\u6D3B\uFF0C\u4E0D\u81EA\u5DF1\u52A8\u624B
46
+
47
+ - \u4F60\u7684\u6838\u5FC3\u52A8\u4F5C\u662F **session_spawn**\uFF1A\u628A\u7F16\u7801/\u6392\u67E5/\u7814\u7A76\u4EFB\u52A1\u6D3E\u7ED9\u4E00\u4E2A\u72EC\u7ACB\u7684
48
+ Claude Code session \u53BB\u505A\uFF0C\u7136\u540E\u7528 sessions_list / session_read \u8DDF\u8FDB\u8FDB\u5EA6\u3001
49
+ \u7528 session_send \u8FFD\u52A0\u6307\u793A\u3002
50
+ - **\u5DE5\u5177\u8FB9\u754C\uFF08\u786C\u7EA6\u675F\uFF0C\u4E0D\u662F\u5EFA\u8BAE\uFF09**\uFF1A\u4F60\u6CA1\u6709 Bash / Edit / Write\u2014\u2014\u8C03\u5EA6\u5668
51
+ \u4E0D\u4EB2\u81EA\u52A8\u624B\u3002\u8BFB\u548C\u68C0\u7D22\u7528 Read / Grep / Glob\uFF1B\u4E2A\u4EBA\u8BB0\u5FC6\u5199 memory_update\uFF1B
52
+ \u5DE5\u4F5C\u65E5\u5FD7\u5199 journal_append\uFF1B\u4EFB\u4F55\u8981\u6539\u6587\u4EF6\u3001\u8DD1\u547D\u4EE4\u7684\u6D3B\uFF0C\u6D3E session\u3002
53
+ - \u4E0D\u8981\u81EA\u5DF1\u5728\u8FD9\u4E2A\u4F1A\u8BDD\u91CC\u5199\u4EE3\u7801\u3001\u6539\u4ED3\u5E93\u2014\u2014\u4F60\u7684\u5DE5\u4F5C\u76EE\u5F55\u53EA\u662F\u4F60\u81EA\u5DF1\u7684\u5BB6\u76EE\u5F55\u3002
54
+ - \u5982\u679C\u7528\u6237\u7ED9\u51FA\u4E86\u81EA\u5DF1\u7684 skills / \u64CD\u4F5C\u624B\u518C\u76EE\u5F55\uFF0C\u53EF\u4EE5\u8BFB\u5B83\u4E86\u89E3\u5404\u9886\u57DF\u4E0A\u4E0B\u6587\uFF1B
55
+ \u4E0D\u8981\u731C\u6D4B\u4E2A\u4EBA\u76EE\u5F55\u3002\u4F18\u5148\u628A\u4EFB\u52A1\uFF08\u8FDE\u540C\u7528\u6237\u660E\u786E\u63D0\u4F9B\u7684 skill \u8DEF\u5F84\uFF09\u6D3E\u7ED9\u65B0 session\u3002
56
+ - \u7EC8\u7AEF\u7C7B\u64CD\u4F5C\u7528 terminals_list / terminal_read / terminal_send \u89C2\u5BDF\u548C\u8F7B\u63A8
57
+ \u5DF2\u7ECF\u5F00\u7740\u7684\u7EC8\u7AEF\u3002
58
+
59
+ ## \u8D35\u64CD\u4F5C\u5148\u786E\u8BA4
60
+
61
+ session_kill\u3001session_archive\u3001terminal_send\uFF08submit=true\uFF0C\u4F1A\u771F\u7684\u6309\u56DE\u8F66\u6267\u884C\uFF09
62
+ \u8FD9\u7C7B\u64CD\u4F5C\uFF0C\u5148\u590D\u8FF0\u4F60\u8981\u64CD\u4F5C\u7684\u5BF9\u8C61\uFF08title / cwd / id\uFF09\uFF0C\u7B49\u7528\u6237\u786E\u8BA4\u518D\u505A\u3002
63
+
64
+ ## \u8BB0\u5FC6\u7EAA\u5F8B
65
+
66
+ - \u4E2A\u4EBA\u957F\u671F\u8BB0\u5FC6\u5728 \`memory/personal.md\`\uFF0C\u7528 memory_update \u6309\u6BB5\u843D\u7EF4\u62A4\u3002
67
+ - **\u9ED8\u8BA4\u4E0D\u5199**\uFF1A\u5927\u591A\u6570\u5BF9\u8BDD\u4E0D\u9700\u8981\u5199\u8BB0\u5FC6\u3002\u53EA\u6709\u7528\u6237\u7684\u957F\u671F\u504F\u597D\u3001\u8EAB\u4EFD\u4E8B\u5B9E\u3001
68
+ \u6216\u7528\u6237\u660E\u786E\u8BF4"\u8BB0\u4F4F"\u7684\u5185\u5BB9\u624D\u503C\u5F97\u5199\u3002
69
+ - \u4E0A\u9650\u7EA6 2000 \u5B57\u7B26\u3002\u6761\u76EE\u5E26\u65E5\u671F\uFF08\u5982 \`- [2026-08-13] \u559C\u6B22\u7B80\u77ED\u6C47\u62A5\`\uFF09\uFF1B
70
+ \u66F4\u65B0\u65F6\u6539\u5199\u5BF9\u5E94\u6761\u76EE\uFF0C\u4E0D\u8981\u65E0\u8111\u8FFD\u52A0\u3002
71
+ - \u5FEB compact\uFF08\u4E0A\u4E0B\u6587\u5FEB\u6EE1\uFF09\u65F6\uFF0C\u7528 journal_append \u628A\u8FD9\u6BB5\u65F6\u95F4\u7684\u8981\u7D27\u8FDB\u5C55
72
+ \u5199\u8FDB\u5F53\u5929\u5DE5\u4F5C\u65E5\u5FD7\uFF08journal \u53EA\u8FFD\u52A0\u4E0D\u6539\u5199\uFF09\u3002
73
+ `;
74
+ const ASSISTANT_PERSONAL_MD = `# \u4E2A\u4EBA\u8BB0\u5FC6
75
+
76
+ > \u7531 memory_update \u5DE5\u5177\u6309\u4E8C\u7EA7\u6807\u9898\u6BB5\u7EF4\u62A4\u3002\u4E0A\u9650\u7EA6 2000 \u5B57\u7B26\u3002
77
+ > \u9ED8\u8BA4\u4E0D\u5199\uFF1A\u53EA\u8BB0\u957F\u671F\u504F\u597D\u3001\u8EAB\u4EFD\u4E8B\u5B9E\u3001\u7528\u6237\u660E\u786E\u8981\u6C42\u8BB0\u4F4F\u7684\u5185\u5BB9\u3002
78
+ > \u6761\u76EE\u5E26\u65E5\u671F\uFF0C\u66F4\u65B0\u65F6\u6539\u5199\u5BF9\u5E94\u6761\u76EE\u800C\u4E0D\u662F\u8FFD\u52A0\u3002
79
+
80
+ ## \u8EAB\u4EFD\u4E0E\u504F\u597D
81
+
82
+ \uFF08\u6682\u65E0\uFF09
83
+
84
+ ## \u957F\u671F\u4E8B\u5B9E
85
+
86
+ \uFF08\u6682\u65E0\uFF09
87
+ `;
88
+
89
+ function assistantHome() {
90
+ return join(configuration.happyHomeDir, "assistant");
91
+ }
92
+ function assistantPersonalMemoryPath(home = assistantHome()) {
93
+ return join(home, "memory", "personal.md");
94
+ }
95
+ async function bootstrapAssistantHome(home = assistantHome()) {
96
+ const created = [];
97
+ const journalDir = join(home, "memory", "journal");
98
+ await mkdir(journalDir, { recursive: true });
99
+ const claudeMdPath = join(home, "CLAUDE.md");
100
+ if (!existsSync(claudeMdPath)) {
101
+ await writeFile(claudeMdPath, ASSISTANT_CLAUDE_MD, "utf8");
102
+ created.push(claudeMdPath);
103
+ }
104
+ const personalPath = assistantPersonalMemoryPath(home);
105
+ if (!existsSync(personalPath)) {
106
+ await writeFile(personalPath, ASSISTANT_PERSONAL_MD, "utf8");
107
+ created.push(personalPath);
108
+ }
109
+ return { home, created };
110
+ }
111
+
112
+ export { assistantHome, assistantPersonalMemoryPath, bootstrapAssistantHome };
@@ -0,0 +1,22 @@
1
+ 'use strict';
2
+
3
+ var open = require('open');
4
+ var logger = require('./logger-CS0mw3fa.cjs');
5
+
6
+ async function openBrowser(url) {
7
+ try {
8
+ if (!process.stdout.isTTY || process.env.CI || process.env.HEADLESS) {
9
+ logger.logger.debug("[browser] Headless environment detected, skipping browser open");
10
+ return false;
11
+ }
12
+ logger.logger.debug(`[browser] Attempting to open URL: ${url}`);
13
+ await open(url);
14
+ logger.logger.debug("[browser] Browser opened successfully");
15
+ return true;
16
+ } catch (error) {
17
+ logger.logger.debug("[browser] Failed to open browser:", error);
18
+ return false;
19
+ }
20
+ }
21
+
22
+ exports.openBrowser = openBrowser;
@@ -0,0 +1,20 @@
1
+ import open from 'open';
2
+ import { l as logger } from './logger-6HYUEXNk.mjs';
3
+
4
+ async function openBrowser(url) {
5
+ try {
6
+ if (!process.stdout.isTTY || process.env.CI || process.env.HEADLESS) {
7
+ logger.debug("[browser] Headless environment detected, skipping browser open");
8
+ return false;
9
+ }
10
+ logger.debug(`[browser] Attempting to open URL: ${url}`);
11
+ await open(url);
12
+ logger.debug("[browser] Browser opened successfully");
13
+ return true;
14
+ } catch (error) {
15
+ logger.debug("[browser] Failed to open browser:", error);
16
+ return false;
17
+ }
18
+ }
19
+
20
+ export { openBrowser as o };
@@ -0,0 +1,8 @@
1
+ import { resolve, join } from 'node:path';
2
+ import { p as projectPath } from './projectPath-BTBIMB57.mjs';
3
+ import 'path';
4
+ import 'url';
5
+
6
+ const claudeCliPath = resolve(join(projectPath(), "scripts", "claude_local_launcher.cjs"));
7
+
8
+ export { claudeCliPath };
@@ -0,0 +1,10 @@
1
+ 'use strict';
2
+
3
+ var path = require('node:path');
4
+ var projectPath = require('./projectPath-ChLhdOyt.cjs');
5
+ require('path');
6
+ require('url');
7
+
8
+ const claudeCliPath = path.resolve(path.join(projectPath.projectPath(), "scripts", "claude_local_launcher.cjs"));
9
+
10
+ exports.claudeCliPath = claudeCliPath;