volute 0.53.0 → 0.55.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/dist/{activity-events-LQII6PZS.js → activity-events-TFAJBNBW.js} +2 -2
- package/dist/{ai-service-YW5SWCSB.js → ai-service-KEK2V3AP.js} +2 -2
- package/dist/{auth-KRDSM55Q.js → auth-Y27LTNZK.js} +3 -3
- package/dist/auto-upgrade-2MZF7NG3.js +46 -0
- package/dist/{avatar-image-52WGXLHV.js → avatar-image-SN576P45.js} +2 -2
- package/dist/{backup-WWXVIMYQ.js → backup-GDCWH6MC.js} +12 -12
- package/dist/channels-AFJWGX7W.js +203 -0
- package/dist/{chat-WK2BLM7B.js → chat-HVPOZK3O.js} +9 -9
- package/dist/{chunk-QUSMYGNQ.js → chunk-2674KIGI.js} +1 -0
- package/dist/chunk-2GATCSZK.js +520 -0
- package/dist/{chunk-P2TBUKLW.js → chunk-3SFKY4GI.js} +4 -4
- package/dist/{chunk-RMADJFA7.js → chunk-45QTYKQQ.js} +4 -4
- package/dist/{chunk-TAWRJ24T.js → chunk-4VAQKLMU.js} +8 -5
- package/dist/{chunk-OXWUEU5V.js → chunk-5U5GLZSD.js} +2 -2
- package/dist/{chunk-TPX6E6PL.js → chunk-6HBGUPBA.js} +2 -2
- package/dist/{chunk-UFTDRTCP.js → chunk-7AA4T2RT.js} +2 -2
- package/dist/{chunk-LN7XJ56R.js → chunk-7XKPG66D.js} +9 -9
- package/dist/{chunk-VDZ4I4ZP.js → chunk-BP2X5AIK.js} +8 -14
- package/dist/{chunk-PIZDPY4G.js → chunk-CKOA4LWV.js} +12 -12
- package/dist/{chunk-6NLW72HP.js → chunk-CKPAVQNK.js} +1 -1
- package/dist/{chunk-IQ7VNWH6.js → chunk-DUV4EMNW.js} +37 -3
- package/dist/{chunk-CV6BNGFK.js → chunk-FSXPPOPM.js} +3 -3
- package/dist/{chunk-UTKUO2KY.js → chunk-FZUPIS3T.js} +3 -3
- package/dist/{chunk-L7BKTZ5U.js → chunk-G3XAB4DK.js} +1 -1
- package/dist/{chunk-23UJGVYP.js → chunk-HLWQ3P3R.js} +50 -46
- package/dist/{chunk-AP2KQMMW.js → chunk-HTSWDOJE.js} +11 -14
- package/dist/{chunk-EDR47UE2.js → chunk-IR2FW4W7.js} +2 -2
- package/dist/{chunk-ICXY54ZC.js → chunk-IT4GEFDH.js} +1 -1
- package/dist/{chunk-F6D766VQ.js → chunk-KS62IHE2.js} +1 -1
- package/dist/{chunk-LNNI3MS4.js → chunk-MNKPAAQF.js} +9 -2
- package/dist/{chunk-HASADR3E.js → chunk-NCRG4SBR.js} +241 -66
- package/dist/{chunk-I7U5EEZC.js → chunk-NM5FDH4T.js} +1 -1
- package/dist/{chunk-7LT3YZUR.js → chunk-OFU6WJJZ.js} +1 -1
- package/dist/{chunk-M77B73VV.js → chunk-OIOW3FPT.js} +7 -2
- package/dist/{chunk-BDHKCLWK.js → chunk-OKM67ZWH.js} +1 -1
- package/dist/chunk-OUGD5L5U.js +918 -0
- package/dist/{chunk-X67BDDZR.js → chunk-P3GXOT2X.js} +48 -2
- package/dist/{chunk-U54PJPTB.js → chunk-PRZUBJ4K.js} +1 -1
- package/dist/{chunk-UO4MZQNO.js → chunk-QVS3C4DK.js} +15 -7
- package/dist/{chunk-RQRO6PC7.js → chunk-TMTAHKYP.js} +324 -48
- package/dist/{chunk-5DBGQBQR.js → chunk-UEZC5MNB.js} +29 -18
- package/dist/{chunk-7ARONCZW.js → chunk-VTFXZPC3.js} +13 -13
- package/dist/{chunk-UDZLPR34.js → chunk-W3OIPJPB.js} +14 -9
- package/dist/{chunk-HTB7KDRU.js → chunk-WZZCA23D.js} +5 -4
- package/dist/{chunk-5Y54AE3L.js → chunk-XAG53RWY.js} +1 -1
- package/dist/{chunk-HTRSSOHY.js → chunk-YU5EYQAE.js} +1 -1
- package/dist/{chunk-5N32EN4O.js → chunk-Z4Q6TQWL.js} +1 -1
- package/dist/{chunk-EGV6R6UF.js → chunk-Z7TNIIHW.js} +3 -1
- package/dist/cli.js +19 -19
- package/dist/{clock-SH4NQC2F.js → clock-X7V3C7NL.js} +3 -3
- package/dist/{cloud-sync-MJVJ33LD.js → cloud-sync-FM73SVFJ.js} +21 -21
- package/dist/{conversations-ZL6PHROD.js → conversations-FH3ODBL7.js} +3 -3
- package/dist/{create-G2RIKQYK.js → create-P75ZFTVN.js} +1 -1
- package/dist/{daemon-restart-BIGU4OKS.js → daemon-restart-JQMMMITM.js} +4 -4
- package/dist/daemon.js +469 -857
- package/dist/db-JH3NTERX.js +36 -0
- package/dist/delivery-manager-H23Q23N7.js +41 -0
- package/dist/{delivery-notices-65TB3CBX.js → delivery-notices-S7TKOACE.js} +5 -5
- package/dist/{delivery-router-RHANNTAC.js → delivery-router-KHBVEVVL.js} +4 -2
- package/dist/{down-QSNEMTTX.js → down-UN2EDX2Y.js} +3 -3
- package/dist/echo-text-ULEIFJJF.js +40 -0
- package/dist/{exec-ABD3DYA2.js → exec-Z34TTUO3.js} +1 -1
- package/dist/extensions-QD22GXZD.js +74 -0
- package/dist/{files-CHPNEQXN.js → files-DUGRXN6V.js} +5 -5
- package/dist/{import-DB2KULRO.js → import-RDDUGGFI.js} +3 -3
- package/dist/{isolation-GVV2IBAU.js → isolation-UQPDO34R.js} +1 -1
- package/dist/message-delivery-LU4EP244.js +46 -0
- package/dist/migrate-init-infrastructure-Z72UJ5NT.js +44 -0
- package/dist/migrate-name-placeholder-64AEAWPE.js +37 -0
- package/dist/{migrate-thread-config-EQSEP2XG.js → migrate-thread-config-SVF2M3D3.js} +1 -1
- package/dist/{mind-IX5AWUST.js → mind-BARCLI7O.js} +14 -14
- package/dist/{mind-activity-tracker-QF6DCX2X.js → mind-activity-tracker-UT23RGBF.js} +3 -3
- package/dist/{mind-contacts-BKUOUJPV.js → mind-contacts-PEXCDRXA.js} +8 -8
- package/dist/{mind-list-KNU34SUD.js → mind-list-7KBLPLES.js} +2 -2
- package/dist/mind-service-ZJCUBAUL.js +48 -0
- package/dist/{mind-sleep-D3DEYAWG.js → mind-sleep-24HV4RCA.js} +5 -5
- package/dist/{mind-status-BPTLQ5Z6.js → mind-status-4YW4PHMO.js} +6 -3
- package/dist/{package-BN5KMU54.js → package-AUDBDKAO.js} +12 -14
- package/dist/{prompts-HNKGCAEY.js → prompts-MOBF3TMO.js} +1 -1
- package/dist/{sandbox-NNWCTHRI.js → sandbox-VI7XWBIA.js} +2 -2
- package/dist/scheduler-GLINVC2B.js +27 -0
- package/dist/{seed-LHZ33UB4.js → seed-5JGR7ZRA.js} +1 -1
- package/dist/{seed-cmd-U4RVJ3UA.js → seed-cmd-M6A7N7F3.js} +2 -2
- package/dist/{seed-create-OQU4KNCB.js → seed-create-TGFZW4IO.js} +3 -3
- package/dist/{seed-readiness-WJYYRRCK.js → seed-readiness-XBH2MUNA.js} +2 -2
- package/dist/{seed-sprout-SFUYH2RG.js → seed-sprout-3IC5ZVTI.js} +11 -11
- package/dist/{send-FWZAMDBN.js → send-DHYBAYK4.js} +11 -11
- package/dist/{service-XQPMZAGI.js → service-T4P5W6RS.js} +2 -2
- package/dist/{service-install-2EWD7KXD.js → service-install-R4SNYUVO.js} +3 -3
- package/dist/{setup-RVSGCIF3.js → setup-6KAH3GRW.js} +4 -4
- package/dist/skills/dreaming/SKILL.md +2 -2
- package/dist/skills/dreaming/references/INSTALL.md +1 -1
- package/dist/skills/tending/SKILL.md +2 -0
- package/dist/skills/volute-mind/SKILL.md +8 -0
- package/dist/skills/volute-mind/references/integrations.md +3 -2
- package/dist/skills/volute-mind/references/routing.md +18 -5
- package/dist/{skills-QRPU6BWY.js → skills-LKQCYFVP.js} +3 -3
- package/dist/sleep-manager-Q3ITFNOJ.js +42 -0
- package/dist/{spirit-I5ECLGRI.js → spirit-FKXMGO3N.js} +8 -6
- package/dist/spirit-availability-5R2WYSWF.js +43 -0
- package/dist/{sprout-A2PMEF7Z.js → sprout-VEW3CUNX.js} +1 -1
- package/dist/src-246GSX7A.js +519 -0
- package/dist/src-LOUB3WPR.js +4189 -0
- package/dist/{status-EYG4A3OK.js → status-LCKTTIWS.js} +5 -5
- package/dist/{system-events-YTOU66QI.js → system-events-ZYOCYAO2.js} +5 -3
- package/dist/{systems-2DIJY4RF.js → systems-HL7SGSW7.js} +6 -6
- package/dist/{tailscale-KHNZFC7L.js → tailscale-F2IMBILZ.js} +1 -1
- package/dist/{template-hash-YKWMVYMM.js → template-hash-RJRMF6DT.js} +2 -2
- package/dist/{template-staleness-PY2CULH6.js → template-staleness-IBD722PN.js} +4 -4
- package/dist/{turn-tracker-NNHS6MAR.js → turn-tracker-BE34OI6O.js} +7 -7
- package/dist/{up-UGBHH743.js → up-J47J5JRB.js} +3 -3
- package/dist/{update-CIWI2JYA.js → update-ILCPVNDD.js} +2 -2
- package/dist/{upgrade-LIE46UBB.js → upgrade-XY2J7NWZ.js} +9 -1
- package/dist/variant-cleanup-JGJZ5KB4.js +24 -0
- package/dist/{version-notify-SJVAQLZI.js → version-notify-KIXYNHJC.js} +28 -13
- package/dist/web-assets/assets/{index-b7G7ZsVk.js → index-CoU1eUKE.js} +25 -25
- package/dist/web-assets/assets/index-hPn_fkz3.css +1 -0
- package/dist/web-assets/index.html +2 -2
- package/package.json +12 -14
- package/packages/extensions/intentions/dist/ui/assets/index-3FneLCKR.css +1 -0
- package/packages/extensions/intentions/dist/ui/assets/index-Bl5KEcli.js +67 -0
- package/packages/extensions/{notes → intentions}/dist/ui/index.html +3 -3
- package/packages/extensions/intentions/skills/intention-review/SKILL.md +38 -0
- package/packages/extensions/intentions/skills/intentions/SKILL.md +49 -0
- package/packages/extensions/intentions/skills/intentions/scripts/intentions-hook.sh +45 -0
- package/packages/extensions/pages/dist/ui/assets/index-BKxVQkA9.css +1 -0
- package/packages/extensions/pages/dist/ui/assets/index-BMt6sStP.js +68 -0
- package/packages/extensions/pages/dist/ui/index.html +2 -2
- package/packages/extensions/pages/skills/commons-gardening/SKILL.md +50 -0
- package/packages/extensions/pages/skills/pages/SKILL.md +140 -16
- package/templates/_base/.init/.config/prompts.json +2 -3
- package/templates/{pi → _base}/.init/.config/routes.json +1 -0
- package/templates/_base/.init/.local/hooks/pre-prompt/turn-context.ts +30 -0
- package/templates/_base/.init/memory/dreams/.gitkeep +0 -0
- package/templates/_base/home/.config/routes.json +1 -1
- package/templates/_base/home/VOLUTE.md +1 -1
- package/templates/_base/src/lib/codex-session-seed.ts +6 -55
- package/templates/_base/src/lib/context-breakdown.ts +11 -3
- package/templates/_base/src/lib/pi-session-seed.ts +8 -57
- package/templates/_base/src/lib/routing.ts +2 -2
- package/templates/_base/src/lib/seed-note.ts +4 -4
- package/templates/_base/src/lib/session-seed.ts +8 -53
- package/templates/_base/src/lib/startup.ts +4 -22
- package/templates/claude/.init/CLAUDE.md +4 -0
- package/templates/claude/package.json +2 -2
- package/templates/claude/src/agent.ts +60 -112
- package/templates/claude/src/lib/hooks/pre-compact.ts +6 -6
- package/templates/claude/src/lib/message-channel.ts +43 -15
- package/templates/claude/src/lib/recover.ts +69 -0
- package/templates/claude/src/lib/stream-consumer.ts +23 -5
- package/templates/claude/src/server.ts +0 -1
- package/templates/claude/volute-template.json +1 -1
- package/templates/codex/.init/AGENTS.md +4 -0
- package/templates/codex/package.json +2 -2
- package/templates/codex/src/agent.ts +23 -89
- package/templates/codex/volute-template.json +1 -1
- package/templates/pi/.init/MINDS.md +4 -0
- package/templates/pi/package.json +1 -1
- package/templates/pi/src/agent.ts +26 -93
- package/templates/pi/src/lib/mechanics-doc.ts +30 -0
- package/templates/pi/src/server.ts +3 -2
- package/templates/pi/volute-template.json +1 -1
- package/dist/channels-LW5ZLMSQ.js +0 -90
- package/dist/chunk-R772ET2M.js +0 -164
- package/dist/db-IPXRJUI7.js +0 -20
- package/dist/delivery-manager-FDHCZ7PU.js +0 -37
- package/dist/echo-text-KU6G4Z7V.js +0 -40
- package/dist/extensions-VACUKFA5.js +0 -60
- package/dist/message-delivery-TUXM3AAE.js +0 -46
- package/dist/mind-service-WHFBUKZE.js +0 -48
- package/dist/scheduler-5X5UIQOQ.js +0 -27
- package/dist/skills/plan-coordinator/SKILL.md +0 -60
- package/dist/sleep-manager-NWUCRBZB.js +0 -42
- package/dist/spirit-availability-NIUUYKU2.js +0 -43
- package/dist/src-HGNE2XG4.js +0 -832
- package/dist/src-LCSOQY6Z.js +0 -2222
- package/dist/src-UDMJZ6MH.js +0 -426
- package/dist/variant-cleanup-CZDLIY3F.js +0 -24
- package/dist/web-assets/assets/index-BHSU9r-4.css +0 -1
- package/packages/extensions/notes/dist/ui/assets/index-BBs8pyel.js +0 -67
- package/packages/extensions/notes/dist/ui/assets/index-D3cdui42.css +0 -1
- package/packages/extensions/notes/skills/notes/SKILL.md +0 -90
- package/packages/extensions/pages/dist/ui/assets/index-B589e8Xe.js +0 -2
- package/packages/extensions/pages/dist/ui/assets/index-BuXnE-rb.css +0 -1
- package/packages/extensions/plan/dist/ui/assets/index-B8s8wxyt.js +0 -67
- package/packages/extensions/plan/dist/ui/assets/index-jIkrt-vI.css +0 -1
- package/packages/extensions/plan/dist/ui/index.html +0 -14
- package/packages/extensions/plan/skills/plan/SKILL.md +0 -43
- package/packages/extensions/plan/skills/plan/scripts/plan-hook.sh +0 -37
- package/templates/claude/.init/.config/routes.json +0 -11
- package/templates/codex/.init/.config/routes.json +0 -11
- package/dist/{accept-I4GVGWA3.js → accept-RSDIVJL6.js} +3 -3
- package/dist/{bridge-KU2IKSH3.js → bridge-YK7NTRU5.js} +3 -3
- package/dist/{create-C3XZACTV.js → create-M727VUDF.js} +3 -3
- package/dist/{env-BJGM6FBA.js → env-7AZFBPWX.js} +7 -7
- package/dist/{extension-B2W52WZY.js → extension-MRYJWSMV.js} +3 -3
- package/dist/{list-R2GDWOEE.js → list-UQGIW7OF.js} +3 -3
- package/dist/{login-EZ4RRDQX.js → login-4NUS72Z5.js} +3 -3
- package/dist/{login-JDOAK465.js → login-57MMYILL.js} +4 -4
- package/dist/{logout-MWSIUOQU.js → logout-BYV433X6.js} +3 -3
- package/dist/{logout-K6ZGAJY5.js → logout-YFZAJRPY.js} +3 -3
- package/dist/{mind-history-RVF6KJ7K.js → mind-history-RZMMCHMX.js} +9 -9
- package/dist/{mind-wake-DCDFFQKX.js → mind-wake-LDGPRA42.js} +3 -3
- package/dist/{read-J5RM674N.js → read-RJ5NAW5J.js} +3 -3
- package/dist/{register-53LBGSDC.js → register-WNCSOTAU.js} +3 -3
- package/dist/{reject-K2A4UK2Y.js → reject-4NFLXKRN.js} +3 -3
- package/dist/{restart-R2WFNF5K.js → restart-B4GNMVF2.js} +7 -7
- package/dist/{skill-DXLLSUHB.js → skill-QYTBUDNQ.js} +7 -7
- package/dist/{start-XDOUAWN3.js → start-BDHJVOVX.js} +6 -6
- package/dist/{stop-O62RTEMD.js → stop-45QYSGYS.js} +7 -7
|
@@ -1,36 +1,52 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import {
|
|
3
3
|
spiritDir
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-UEZC5MNB.js";
|
|
5
5
|
import {
|
|
6
6
|
getScheduler
|
|
7
|
-
} from "./chunk-
|
|
7
|
+
} from "./chunk-CKOA4LWV.js";
|
|
8
8
|
import {
|
|
9
9
|
getDeliveryManager
|
|
10
|
-
} from "./chunk-
|
|
10
|
+
} from "./chunk-TMTAHKYP.js";
|
|
11
11
|
import {
|
|
12
12
|
getMindManager,
|
|
13
13
|
resolveMindToken
|
|
14
|
-
} from "./chunk-
|
|
14
|
+
} from "./chunk-HLWQ3P3R.js";
|
|
15
|
+
import {
|
|
16
|
+
addMessage,
|
|
17
|
+
createChannel,
|
|
18
|
+
createConversation,
|
|
19
|
+
findDMConversation,
|
|
20
|
+
getChannelByName,
|
|
21
|
+
getChannelSettings,
|
|
22
|
+
getParticipants,
|
|
23
|
+
joinChannel,
|
|
24
|
+
updateChannelSettings
|
|
25
|
+
} from "./chunk-6HBGUPBA.js";
|
|
26
|
+
import {
|
|
27
|
+
markIdle
|
|
28
|
+
} from "./chunk-7AA4T2RT.js";
|
|
29
|
+
import {
|
|
30
|
+
readVoluteConfig,
|
|
31
|
+
resolveWakeTriggers
|
|
32
|
+
} from "./chunk-WCFSBH33.js";
|
|
15
33
|
import {
|
|
16
34
|
extractTextContent,
|
|
17
35
|
getRoutingConfig,
|
|
18
36
|
resolveRoute,
|
|
19
37
|
shouldGate
|
|
20
|
-
} from "./chunk-
|
|
21
|
-
import {
|
|
22
|
-
hashSkillDir,
|
|
23
|
-
importSkillFromDir,
|
|
24
|
-
removeSharedSkill,
|
|
25
|
-
sharedSkillsDir
|
|
26
|
-
} from "./chunk-TAWRJ24T.js";
|
|
38
|
+
} from "./chunk-W3OIPJPB.js";
|
|
27
39
|
import {
|
|
28
40
|
getOrCreateMindUser,
|
|
29
41
|
getOrCreateSystemUser,
|
|
30
42
|
getUser,
|
|
31
43
|
getUserByUsername,
|
|
32
44
|
syncMindProfile
|
|
33
|
-
} from "./chunk-
|
|
45
|
+
} from "./chunk-OFU6WJJZ.js";
|
|
46
|
+
import {
|
|
47
|
+
publish,
|
|
48
|
+
subscribe
|
|
49
|
+
} from "./chunk-PRZUBJ4K.js";
|
|
34
50
|
import {
|
|
35
51
|
MIND_LEVEL_THREAD,
|
|
36
52
|
deliverEvent,
|
|
@@ -38,45 +54,30 @@ import {
|
|
|
38
54
|
pendingEventCount,
|
|
39
55
|
pendingEventsLine,
|
|
40
56
|
recordNotice
|
|
41
|
-
} from "./chunk-
|
|
57
|
+
} from "./chunk-DUV4EMNW.js";
|
|
42
58
|
import {
|
|
43
59
|
publish as publish2
|
|
44
|
-
} from "./chunk-
|
|
60
|
+
} from "./chunk-MNKPAAQF.js";
|
|
45
61
|
import {
|
|
46
62
|
getPrompt
|
|
47
|
-
} from "./chunk-
|
|
63
|
+
} from "./chunk-HTSWDOJE.js";
|
|
48
64
|
import {
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
getParticipants,
|
|
56
|
-
joinChannel,
|
|
57
|
-
updateChannelSettings
|
|
58
|
-
} from "./chunk-TPX6E6PL.js";
|
|
59
|
-
import {
|
|
60
|
-
markIdle
|
|
61
|
-
} from "./chunk-UFTDRTCP.js";
|
|
62
|
-
import {
|
|
63
|
-
publish,
|
|
64
|
-
subscribe
|
|
65
|
-
} from "./chunk-U54PJPTB.js";
|
|
66
|
-
import {
|
|
67
|
-
readVoluteConfig,
|
|
68
|
-
resolveWakeTriggers
|
|
69
|
-
} from "./chunk-WCFSBH33.js";
|
|
65
|
+
hashSkillDir,
|
|
66
|
+
importSkillFromDir,
|
|
67
|
+
listSharedSkills,
|
|
68
|
+
removeSharedSkill,
|
|
69
|
+
sharedSkillsDir
|
|
70
|
+
} from "./chunk-4VAQKLMU.js";
|
|
70
71
|
import {
|
|
71
72
|
isIsolationEnabled,
|
|
72
73
|
mindUserName
|
|
73
|
-
} from "./chunk-
|
|
74
|
+
} from "./chunk-OIOW3FPT.js";
|
|
74
75
|
import {
|
|
75
76
|
missingCredentialWarning
|
|
76
|
-
} from "./chunk-
|
|
77
|
+
} from "./chunk-Z7TNIIHW.js";
|
|
77
78
|
import {
|
|
78
79
|
logger_default
|
|
79
|
-
} from "./chunk-
|
|
80
|
+
} from "./chunk-2674KIGI.js";
|
|
80
81
|
import {
|
|
81
82
|
findMind,
|
|
82
83
|
getBaseName,
|
|
@@ -86,6 +87,7 @@ import {
|
|
|
86
87
|
mindDir,
|
|
87
88
|
readGlobalConfig,
|
|
88
89
|
readRegistry,
|
|
90
|
+
resolveMindDir,
|
|
89
91
|
stateDir,
|
|
90
92
|
voluteHome,
|
|
91
93
|
voluteSystemDir,
|
|
@@ -327,6 +329,85 @@ import { promisify } from "util";
|
|
|
327
329
|
import { CronExpressionParser } from "cron-parser";
|
|
328
330
|
import { and as and2, eq as eq3, inArray } from "drizzle-orm";
|
|
329
331
|
|
|
332
|
+
// packages/daemon/src/lib/turn-context.ts
|
|
333
|
+
var tlog = logger_default.child("turn-context");
|
|
334
|
+
var TURN_CONTEXT_BUDGET = {
|
|
335
|
+
turn: 1200,
|
|
336
|
+
wake: 3e3
|
|
337
|
+
};
|
|
338
|
+
var PROVIDER_TIMEOUT_MS = 1e3;
|
|
339
|
+
var TOTAL_TIMEOUT_MS = 2e3;
|
|
340
|
+
var SEPARATOR = "\n\n";
|
|
341
|
+
function withTimeout(p, ms) {
|
|
342
|
+
return new Promise((resolve6, reject) => {
|
|
343
|
+
const timer = setTimeout(() => reject(new Error(`timed out after ${ms}ms`)), ms);
|
|
344
|
+
p.then(
|
|
345
|
+
(v) => {
|
|
346
|
+
clearTimeout(timer);
|
|
347
|
+
resolve6(v);
|
|
348
|
+
},
|
|
349
|
+
(err) => {
|
|
350
|
+
clearTimeout(timer);
|
|
351
|
+
reject(err);
|
|
352
|
+
}
|
|
353
|
+
);
|
|
354
|
+
});
|
|
355
|
+
}
|
|
356
|
+
async function collectFromProviders(providers, reason, total = TURN_CONTEXT_BUDGET[reason], now = Date.now) {
|
|
357
|
+
if (providers.length === 0 || total <= 0) return null;
|
|
358
|
+
const deadline = now() + TOTAL_TIMEOUT_MS;
|
|
359
|
+
const blocks = [];
|
|
360
|
+
let remaining = total;
|
|
361
|
+
for (let i = 0; i < providers.length; i++) {
|
|
362
|
+
const { id, run } = providers[i];
|
|
363
|
+
if (remaining <= 0) break;
|
|
364
|
+
if (now() >= deadline) {
|
|
365
|
+
tlog.warn(
|
|
366
|
+
`deadline reached before asking ${providers.length - i} remaining extension(s) for ${reason} context`
|
|
367
|
+
);
|
|
368
|
+
break;
|
|
369
|
+
}
|
|
370
|
+
const joinerCost = blocks.length > 0 ? SEPARATOR.length : 0;
|
|
371
|
+
const available = remaining - joinerCost;
|
|
372
|
+
if (available <= 0) break;
|
|
373
|
+
const budget = Math.floor(available / (providers.length - i));
|
|
374
|
+
if (budget <= 0) break;
|
|
375
|
+
let text;
|
|
376
|
+
try {
|
|
377
|
+
text = await withTimeout(run(budget), PROVIDER_TIMEOUT_MS);
|
|
378
|
+
} catch (err) {
|
|
379
|
+
tlog.warn(`extension ${id}: turnContext failed, dropped from this turn`, logger_default.errorData(err));
|
|
380
|
+
continue;
|
|
381
|
+
}
|
|
382
|
+
if (typeof text !== "string") continue;
|
|
383
|
+
const trimmed = text.trim();
|
|
384
|
+
if (!trimmed) continue;
|
|
385
|
+
if (trimmed.length > budget) {
|
|
386
|
+
tlog.warn(
|
|
387
|
+
`extension ${id}: turnContext returned ${trimmed.length} chars over a ${budget} budget \u2014 dropped`
|
|
388
|
+
);
|
|
389
|
+
continue;
|
|
390
|
+
}
|
|
391
|
+
blocks.push(trimmed);
|
|
392
|
+
remaining -= trimmed.length + joinerCost;
|
|
393
|
+
}
|
|
394
|
+
if (blocks.length === 0) return null;
|
|
395
|
+
return blocks.join(SEPARATOR);
|
|
396
|
+
}
|
|
397
|
+
async function collectTurnContext(mindName, reason) {
|
|
398
|
+
try {
|
|
399
|
+
const providers = getTurnContextProviders().map(({ id, manifest, context }) => ({
|
|
400
|
+
id,
|
|
401
|
+
// Non-null: getTurnContextProviders filters to manifests that declare it.
|
|
402
|
+
run: (budget) => manifest.turnContext(mindName, context, { budget, reason })
|
|
403
|
+
}));
|
|
404
|
+
return await collectFromProviders(providers, reason);
|
|
405
|
+
} catch (err) {
|
|
406
|
+
tlog.error(`failed to collect ${reason} context for ${mindName}`, logger_default.errorData(err));
|
|
407
|
+
return null;
|
|
408
|
+
}
|
|
409
|
+
}
|
|
410
|
+
|
|
330
411
|
// packages/daemon/src/lib/daemon/mind-service.ts
|
|
331
412
|
import { existsSync as existsSync3, readFileSync as readFileSync3 } from "fs";
|
|
332
413
|
import { resolve as resolve3 } from "path";
|
|
@@ -641,7 +722,7 @@ async function ensureMailAddress(mindName) {
|
|
|
641
722
|
import { existsSync as existsSync2, readFileSync as readFileSync2 } from "fs";
|
|
642
723
|
import { mkdir, writeFile } from "fs/promises";
|
|
643
724
|
import { resolve as resolve2 } from "path";
|
|
644
|
-
var
|
|
725
|
+
var tlog2 = logger_default.child("token-budget");
|
|
645
726
|
var DEFAULT_BUDGET_PERIOD_MINUTES = 60;
|
|
646
727
|
var MAX_QUEUE_SIZE = 100;
|
|
647
728
|
var TokenBudget = class {
|
|
@@ -650,7 +731,7 @@ var TokenBudget = class {
|
|
|
650
731
|
dirty = /* @__PURE__ */ new Set();
|
|
651
732
|
start() {
|
|
652
733
|
this.interval = setInterval(() => {
|
|
653
|
-
this.tick().catch((err) =>
|
|
734
|
+
this.tick().catch((err) => tlog2.error("token budget tick failed", logger_default.errorData(err)));
|
|
654
735
|
}, 6e4);
|
|
655
736
|
}
|
|
656
737
|
async stop() {
|
|
@@ -760,7 +841,7 @@ var TokenBudget = class {
|
|
|
760
841
|
const queued = this.drain(mind);
|
|
761
842
|
if (queued.length > 0) {
|
|
762
843
|
this.replay(mind, queued).catch((err) => {
|
|
763
|
-
|
|
844
|
+
tlog2.warn(`replay error for ${mind}`, logger_default.errorData(err));
|
|
764
845
|
});
|
|
765
846
|
}
|
|
766
847
|
}
|
|
@@ -795,7 +876,7 @@ var TokenBudget = class {
|
|
|
795
876
|
await writeFile(this.budgetStatePath(mind), `${JSON.stringify(data)}
|
|
796
877
|
`);
|
|
797
878
|
} catch (err) {
|
|
798
|
-
|
|
879
|
+
tlog2.warn(`failed to save budget state for ${mind}`, logger_default.errorData(err));
|
|
799
880
|
}
|
|
800
881
|
}
|
|
801
882
|
loadBudgetState(mind) {
|
|
@@ -816,7 +897,7 @@ var TokenBudget = class {
|
|
|
816
897
|
// will be overwritten by caller
|
|
817
898
|
};
|
|
818
899
|
} catch (err) {
|
|
819
|
-
|
|
900
|
+
tlog2.warn(`failed to load budget state for ${mind}`, logger_default.errorData(err));
|
|
820
901
|
return null;
|
|
821
902
|
}
|
|
822
903
|
}
|
|
@@ -834,9 +915,9 @@ var TokenBudget = class {
|
|
|
834
915
|
|
|
835
916
|
${summary}`
|
|
836
917
|
});
|
|
837
|
-
|
|
918
|
+
tlog2.info(`replayed ${messages2.length} queued message(s) for ${mindName}`);
|
|
838
919
|
} catch (err) {
|
|
839
|
-
|
|
920
|
+
tlog2.warn(`failed to replay for ${mindName}`, logger_default.errorData(err));
|
|
840
921
|
const state = this.budgets.get(mindName);
|
|
841
922
|
if (state) state.queue.push(...messages2);
|
|
842
923
|
}
|
|
@@ -931,7 +1012,7 @@ async function startMindFull(name) {
|
|
|
931
1012
|
}
|
|
932
1013
|
}
|
|
933
1014
|
async function recordMissingCredentialsNotice(mind, template) {
|
|
934
|
-
const { hasUndeliveredEvent, recordNotice: recordNotice2, MIND_LEVEL_THREAD: MIND_LEVEL_THREAD2 } = await import("./system-events-
|
|
1015
|
+
const { hasUndeliveredEvent, recordNotice: recordNotice2, MIND_LEVEL_THREAD: MIND_LEVEL_THREAD2 } = await import("./system-events-ZYOCYAO2.js");
|
|
935
1016
|
const warning = await missingCredentialWarning(template, readMindModel(mind, template), mind);
|
|
936
1017
|
if (!warning) return;
|
|
937
1018
|
if (await hasUndeliveredEvent(mind, "no_credentials")) return;
|
|
@@ -975,7 +1056,7 @@ async function wakeMind(name) {
|
|
|
975
1056
|
async function startSpiritFull(name) {
|
|
976
1057
|
const entry = await findMind(name);
|
|
977
1058
|
if (entry?.dir) {
|
|
978
|
-
const { registerMindDir } = await import("./delivery-router-
|
|
1059
|
+
const { registerMindDir } = await import("./delivery-router-KHBVEVVL.js");
|
|
979
1060
|
registerMindDir(name, entry.dir);
|
|
980
1061
|
}
|
|
981
1062
|
await getMindManager().startMind(name);
|
|
@@ -983,6 +1064,11 @@ async function startSpiritFull(name) {
|
|
|
983
1064
|
(err) => logger_default.error(`failed to join #system for ${name}`, logger_default.errorData(err))
|
|
984
1065
|
);
|
|
985
1066
|
getScheduler().loadSchedules(name, entry?.dir ?? spiritDir());
|
|
1067
|
+
try {
|
|
1068
|
+
notifyExtensionsMindStart(name);
|
|
1069
|
+
} catch (err) {
|
|
1070
|
+
logger_default.error(`failed to notify extensions of spirit start for ${name}`, logger_default.errorData(err));
|
|
1071
|
+
}
|
|
986
1072
|
publish({
|
|
987
1073
|
type: "mind_started",
|
|
988
1074
|
mind: name,
|
|
@@ -990,6 +1076,7 @@ async function startSpiritFull(name) {
|
|
|
990
1076
|
}).catch((err) => logger_default.error("failed to publish spirit_started activity", logger_default.errorData(err)));
|
|
991
1077
|
}
|
|
992
1078
|
async function stopSpiritFull(name) {
|
|
1079
|
+
notifyExtensionsMindStop(name);
|
|
993
1080
|
markIdle(name);
|
|
994
1081
|
getScheduler().unloadSchedules(name);
|
|
995
1082
|
await getMindManager().stopMind(name);
|
|
@@ -1008,7 +1095,7 @@ function buildSeedOrientation(createdBy, creatorType) {
|
|
|
1008
1095
|
async function sendSeedOrientation(mindName, createdBy) {
|
|
1009
1096
|
let creatorType;
|
|
1010
1097
|
if (createdBy) {
|
|
1011
|
-
const { getUserByUsername: getUserByUsername2 } = await import("./auth-
|
|
1098
|
+
const { getUserByUsername: getUserByUsername2 } = await import("./auth-Y27LTNZK.js");
|
|
1012
1099
|
creatorType = (await getUserByUsername2(createdBy))?.user_type;
|
|
1013
1100
|
}
|
|
1014
1101
|
await deliverEvent(mindName, {
|
|
@@ -1017,8 +1104,8 @@ async function sendSeedOrientation(mindName, createdBy) {
|
|
|
1017
1104
|
});
|
|
1018
1105
|
}
|
|
1019
1106
|
async function ensureCreatorDM(mindName, creatorUsername) {
|
|
1020
|
-
const { getOrCreateMindUser: getOrCreateMindUser2, getUserByUsername: getUserByUsername2 } = await import("./auth-
|
|
1021
|
-
const { findDMConversation: findDMConversation2, createConversation: createConversation2 } = await import("./conversations-
|
|
1107
|
+
const { getOrCreateMindUser: getOrCreateMindUser2, getUserByUsername: getUserByUsername2 } = await import("./auth-Y27LTNZK.js");
|
|
1108
|
+
const { findDMConversation: findDMConversation2, createConversation: createConversation2 } = await import("./conversations-FH3ODBL7.js");
|
|
1022
1109
|
const mindUser = await getOrCreateMindUser2(mindName);
|
|
1023
1110
|
const creatorUser = await getUserByUsername2(creatorUsername);
|
|
1024
1111
|
if (!creatorUser) {
|
|
@@ -1318,7 +1405,14 @@ var SleepManager = class {
|
|
|
1318
1405
|
);
|
|
1319
1406
|
const queuedSummary = await this.buildQueuedSummary(name);
|
|
1320
1407
|
const eventsSummary = pendingEventsLine(await pendingEventCount(name));
|
|
1321
|
-
const
|
|
1408
|
+
const extensionContext = await collectTurnContext(name, "wake");
|
|
1409
|
+
const sleepActivity = [
|
|
1410
|
+
triggerWakeSummary,
|
|
1411
|
+
wakeContext,
|
|
1412
|
+
queuedSummary,
|
|
1413
|
+
eventsSummary,
|
|
1414
|
+
extensionContext
|
|
1415
|
+
].filter(Boolean).join("\n\n");
|
|
1322
1416
|
const summaryText = await getPrompt("wake_summary", {
|
|
1323
1417
|
currentDate,
|
|
1324
1418
|
sleepTime,
|
|
@@ -1452,7 +1546,7 @@ var SleepManager = class {
|
|
|
1452
1546
|
* the real delivery stack. Returns whether the batch was handed off to the mind.
|
|
1453
1547
|
*/
|
|
1454
1548
|
async deliverQueuedBatch(name, payloads) {
|
|
1455
|
-
const { deliverBatch: deliverBatch2 } = await import("./message-delivery-
|
|
1549
|
+
const { deliverBatch: deliverBatch2 } = await import("./message-delivery-LU4EP244.js");
|
|
1456
1550
|
return deliverBatch2(name, payloads);
|
|
1457
1551
|
}
|
|
1458
1552
|
// --- Wake failure handling (#419) ---
|
|
@@ -2066,7 +2160,7 @@ async function deliverBatch(mindName, payloads) {
|
|
|
2066
2160
|
const res = await fetch(`http://127.0.0.1:${entry.port}/message`, {
|
|
2067
2161
|
method: "POST",
|
|
2068
2162
|
headers: { "Content-Type": "application/json" },
|
|
2069
|
-
body: JSON.stringify({ session, batch: { channels } })
|
|
2163
|
+
body: JSON.stringify({ session, batch: { channels }, interrupt: false })
|
|
2070
2164
|
});
|
|
2071
2165
|
return res.ok;
|
|
2072
2166
|
} catch (err) {
|
|
@@ -2286,7 +2380,17 @@ async function openExtensionDb(_id, dataDir) {
|
|
|
2286
2380
|
const Database = await getLibsqlDatabase();
|
|
2287
2381
|
return new Database(dbPath);
|
|
2288
2382
|
}
|
|
2289
|
-
|
|
2383
|
+
function normalizeTrailingSlash(app) {
|
|
2384
|
+
return async (c, next) => {
|
|
2385
|
+
const url = new URL(c.req.url);
|
|
2386
|
+
if (url.pathname.length > 1 && url.pathname.endsWith("/")) {
|
|
2387
|
+
url.pathname = url.pathname.replace(/\/+$/, "");
|
|
2388
|
+
return app.fetch(new Request(url, c.req.raw), c.env);
|
|
2389
|
+
}
|
|
2390
|
+
await next();
|
|
2391
|
+
};
|
|
2392
|
+
}
|
|
2393
|
+
async function buildExtensionContext(manifest, dataDir, authMw) {
|
|
2290
2394
|
let db = null;
|
|
2291
2395
|
if (manifest.initDb) {
|
|
2292
2396
|
const realDb = await openExtensionDb(manifest.id, dataDir);
|
|
@@ -2319,9 +2423,11 @@ async function buildContext(manifest, dataDir, authMw) {
|
|
|
2319
2423
|
(err) => logger_default.error(`extension ${manifest.id}: failed to publish activity`, logger_default.errorData(err))
|
|
2320
2424
|
);
|
|
2321
2425
|
},
|
|
2322
|
-
|
|
2426
|
+
// Registry-backed, not path-convention: the spirit lives under the system dir
|
|
2427
|
+
// and variants live in worktrees, so mindDir(name) alone resolves neither.
|
|
2428
|
+
getMindDir: async (name) => {
|
|
2323
2429
|
try {
|
|
2324
|
-
const dir =
|
|
2430
|
+
const dir = await resolveMindDir(name);
|
|
2325
2431
|
return existsSync5(dir) ? dir : null;
|
|
2326
2432
|
} catch (err) {
|
|
2327
2433
|
logger_default.warn(
|
|
@@ -2331,12 +2437,23 @@ async function buildContext(manifest, dataDir, authMw) {
|
|
|
2331
2437
|
return null;
|
|
2332
2438
|
}
|
|
2333
2439
|
},
|
|
2440
|
+
listMinds: async () => {
|
|
2441
|
+
try {
|
|
2442
|
+
return (await readRegistry()).map((m) => ({
|
|
2443
|
+
name: m.name,
|
|
2444
|
+
mindType: m.mindType === "spirit" ? "spirit" : "mind",
|
|
2445
|
+
stage: m.stage
|
|
2446
|
+
}));
|
|
2447
|
+
} catch (err) {
|
|
2448
|
+
logger_default.warn(`extension ${manifest.id}: failed to list minds`, logger_default.errorData(err));
|
|
2449
|
+
return [];
|
|
2450
|
+
}
|
|
2451
|
+
},
|
|
2334
2452
|
getSystemsConfig: () => readSystemsConfig(),
|
|
2335
2453
|
announceToSystem: (text) => announceToSystem(text),
|
|
2336
2454
|
recordNotice: async (mindName, text) => {
|
|
2337
2455
|
try {
|
|
2338
|
-
|
|
2339
|
-
if (user?.user_type !== "mind") return;
|
|
2456
|
+
if (!await findMind(mindName)) return;
|
|
2340
2457
|
await recordNotice({
|
|
2341
2458
|
mind: mindName,
|
|
2342
2459
|
thread: MIND_LEVEL_THREAD,
|
|
@@ -2353,6 +2470,10 @@ async function buildContext(manifest, dataDir, authMw) {
|
|
|
2353
2470
|
},
|
|
2354
2471
|
isIsolationEnabled,
|
|
2355
2472
|
getMindUser: mindUserName,
|
|
2473
|
+
// Delegate to the daemon's single source of truth, which falls back to "volute"
|
|
2474
|
+
// on installs that predate spirit naming. Reading setup.spiritName directly
|
|
2475
|
+
// returned null on those systems, so extension spirit paths no-opped forever.
|
|
2476
|
+
getSpiritName: () => getSpiritName(),
|
|
2356
2477
|
dataDir
|
|
2357
2478
|
};
|
|
2358
2479
|
}
|
|
@@ -2363,7 +2484,7 @@ async function loadExtension(manifest, app, authMw) {
|
|
|
2363
2484
|
}
|
|
2364
2485
|
const dataDir = extensionDataDir(manifest.id);
|
|
2365
2486
|
mkdirSync3(dataDir, { recursive: true });
|
|
2366
|
-
const context = await
|
|
2487
|
+
const context = await buildExtensionContext(manifest, dataDir, authMw);
|
|
2367
2488
|
const routesApp = manifest.routes(context);
|
|
2368
2489
|
const extApiPath = `/api/ext/${manifest.id}`;
|
|
2369
2490
|
app.use(extApiPath, authMw);
|
|
@@ -2529,9 +2650,8 @@ function resolveSkillsDir(manifest) {
|
|
|
2529
2650
|
}
|
|
2530
2651
|
async function discoverBuiltinExtensions(disabledIds) {
|
|
2531
2652
|
const builtins = [
|
|
2532
|
-
{ id: "
|
|
2533
|
-
{ id: "
|
|
2534
|
-
{ id: "plan", load: async () => (await import("./src-UDMJZ6MH.js")).default }
|
|
2653
|
+
{ id: "pages", load: async () => (await import("./src-LOUB3WPR.js")).default },
|
|
2654
|
+
{ id: "intentions", load: async () => (await import("./src-246GSX7A.js")).default }
|
|
2535
2655
|
];
|
|
2536
2656
|
const results = [];
|
|
2537
2657
|
for (const { id, load } of builtins) {
|
|
@@ -2652,6 +2772,7 @@ async function loadAllExtensions(app, authMw) {
|
|
|
2652
2772
|
logger_default.error(`failed to load extension: ${manifest.id}`, logger_default.errorData(err));
|
|
2653
2773
|
}
|
|
2654
2774
|
}
|
|
2775
|
+
await pruneOrphanedExtensionSkills();
|
|
2655
2776
|
app.get("/api/extensions/commands", (c) => {
|
|
2656
2777
|
const result = {};
|
|
2657
2778
|
for (const { manifest } of loaded) {
|
|
@@ -2780,7 +2901,7 @@ async function installNpmExtension(pkg) {
|
|
|
2780
2901
|
throw new Error(`Extension "${pkg}" is already installed`);
|
|
2781
2902
|
}
|
|
2782
2903
|
const dir = ensureExtensionsNpmDir();
|
|
2783
|
-
const { exec } = await import("./exec-
|
|
2904
|
+
const { exec } = await import("./exec-Z34TTUO3.js");
|
|
2784
2905
|
try {
|
|
2785
2906
|
await exec("npm", ["install", "--ignore-scripts", pkg], { cwd: dir });
|
|
2786
2907
|
} catch (err) {
|
|
@@ -2801,7 +2922,7 @@ async function uninstallNpmExtension(pkg) {
|
|
|
2801
2922
|
packages.splice(idx, 1);
|
|
2802
2923
|
writeExtensionsConfig(packages);
|
|
2803
2924
|
try {
|
|
2804
|
-
const { exec } = await import("./exec-
|
|
2925
|
+
const { exec } = await import("./exec-Z34TTUO3.js");
|
|
2805
2926
|
await exec("npm", ["uninstall", "--ignore-scripts", pkg], { cwd: extensionsNpmDir() });
|
|
2806
2927
|
} catch (err) {
|
|
2807
2928
|
logger_default.warn(
|
|
@@ -2811,6 +2932,25 @@ async function uninstallNpmExtension(pkg) {
|
|
|
2811
2932
|
}
|
|
2812
2933
|
logger_default.info(`uninstalled extension package: ${pkg}`);
|
|
2813
2934
|
}
|
|
2935
|
+
async function pruneOrphanedExtensionSkills() {
|
|
2936
|
+
try {
|
|
2937
|
+
const present = new Set(discovered.map((e) => e.manifest.id));
|
|
2938
|
+
const skills = await listSharedSkills();
|
|
2939
|
+
for (const skill of skills) {
|
|
2940
|
+
if (!skill.author?.startsWith("ext:")) continue;
|
|
2941
|
+
const extId = skill.author.slice("ext:".length);
|
|
2942
|
+
if (present.has(extId)) continue;
|
|
2943
|
+
try {
|
|
2944
|
+
await removeSharedSkill(skill.id);
|
|
2945
|
+
logger_default.info(`removed orphaned skill "${skill.id}" from absent extension ${extId}`);
|
|
2946
|
+
} catch (err) {
|
|
2947
|
+
logger_default.warn(`failed to remove orphaned skill "${skill.id}"`, logger_default.errorData(err));
|
|
2948
|
+
}
|
|
2949
|
+
}
|
|
2950
|
+
} catch (err) {
|
|
2951
|
+
logger_default.warn("could not prune orphaned extension skills", logger_default.errorData(err));
|
|
2952
|
+
}
|
|
2953
|
+
}
|
|
2814
2954
|
async function cleanupExtensionSkills(pkg) {
|
|
2815
2955
|
try {
|
|
2816
2956
|
const pkgDir = resolve5(extensionsNpmDir(), "node_modules", pkg);
|
|
@@ -2839,9 +2979,10 @@ function getExtensionStandardSkills() {
|
|
|
2839
2979
|
if (!manifest.standardSkill) continue;
|
|
2840
2980
|
const dir = resolveSkillsDir(manifest);
|
|
2841
2981
|
if (!dir) continue;
|
|
2982
|
+
const spiritSet = new Set(manifest.spiritSkills ?? []);
|
|
2842
2983
|
try {
|
|
2843
2984
|
for (const entry of readdirSync2(dir, { withFileTypes: true })) {
|
|
2844
|
-
if (entry.isDirectory()) skills.push(entry.name);
|
|
2985
|
+
if (entry.isDirectory() && !spiritSet.has(entry.name)) skills.push(entry.name);
|
|
2845
2986
|
}
|
|
2846
2987
|
} catch (err) {
|
|
2847
2988
|
logger_default.warn(`failed to read skills dir for extension ${manifest.id}`, logger_default.errorData(err));
|
|
@@ -2849,6 +2990,13 @@ function getExtensionStandardSkills() {
|
|
|
2849
2990
|
}
|
|
2850
2991
|
return skills;
|
|
2851
2992
|
}
|
|
2993
|
+
function getExtensionSpiritSkills() {
|
|
2994
|
+
const skills = [];
|
|
2995
|
+
for (const { manifest } of loaded) {
|
|
2996
|
+
for (const name of manifest.spiritSkills ?? []) skills.push(name);
|
|
2997
|
+
}
|
|
2998
|
+
return skills;
|
|
2999
|
+
}
|
|
2852
3000
|
function notifyExtensionsDaemonStart() {
|
|
2853
3001
|
for (const { manifest, context } of loaded) {
|
|
2854
3002
|
try {
|
|
@@ -2858,6 +3006,16 @@ function notifyExtensionsDaemonStart() {
|
|
|
2858
3006
|
}
|
|
2859
3007
|
}
|
|
2860
3008
|
}
|
|
3009
|
+
async function notifyExtensionsSpiritReady() {
|
|
3010
|
+
for (const { manifest, context } of loaded) {
|
|
3011
|
+
if (!manifest.onSpiritReady) continue;
|
|
3012
|
+
try {
|
|
3013
|
+
await manifest.onSpiritReady(context);
|
|
3014
|
+
} catch (err) {
|
|
3015
|
+
logger_default.error(`extension ${manifest.id}: onSpiritReady failed`, logger_default.errorData(err));
|
|
3016
|
+
}
|
|
3017
|
+
}
|
|
3018
|
+
}
|
|
2861
3019
|
function notifyExtensionsDaemonStop() {
|
|
2862
3020
|
for (const { manifest, context } of loaded) {
|
|
2863
3021
|
try {
|
|
@@ -2893,6 +3051,15 @@ function notifyExtensionsMindStop(mindName) {
|
|
|
2893
3051
|
}
|
|
2894
3052
|
}
|
|
2895
3053
|
}
|
|
3054
|
+
function getTurnContextProviders() {
|
|
3055
|
+
return loaded.filter(({ manifest }) => typeof manifest.turnContext === "function").map(({ manifest, context }) => ({ id: manifest.id, manifest, context })).sort((a, b) => a.id.localeCompare(b.id));
|
|
3056
|
+
}
|
|
3057
|
+
function _registerExtensionForTest(manifest) {
|
|
3058
|
+
loaded.push({ manifest, context: {} });
|
|
3059
|
+
}
|
|
3060
|
+
function _clearLoadedExtensionsForTest() {
|
|
3061
|
+
loaded.length = 0;
|
|
3062
|
+
}
|
|
2896
3063
|
|
|
2897
3064
|
export {
|
|
2898
3065
|
issueApiToken,
|
|
@@ -2914,6 +3081,8 @@ export {
|
|
|
2914
3081
|
deleteSystemsConfig,
|
|
2915
3082
|
enrichActivityMetadata,
|
|
2916
3083
|
parseCommandArgs,
|
|
3084
|
+
normalizeTrailingSlash,
|
|
3085
|
+
buildExtensionContext,
|
|
2917
3086
|
loadAllExtensions,
|
|
2918
3087
|
getLoadedExtensions,
|
|
2919
3088
|
getAllDiscoveredExtensions,
|
|
@@ -2922,10 +3091,16 @@ export {
|
|
|
2922
3091
|
installNpmExtension,
|
|
2923
3092
|
uninstallNpmExtension,
|
|
2924
3093
|
getExtensionStandardSkills,
|
|
3094
|
+
getExtensionSpiritSkills,
|
|
2925
3095
|
notifyExtensionsDaemonStart,
|
|
3096
|
+
notifyExtensionsSpiritReady,
|
|
2926
3097
|
notifyExtensionsDaemonStop,
|
|
2927
3098
|
notifyExtensionsMindStart,
|
|
2928
3099
|
notifyExtensionsMindStop,
|
|
3100
|
+
getTurnContextProviders,
|
|
3101
|
+
_registerExtensionForTest,
|
|
3102
|
+
_clearLoadedExtensionsForTest,
|
|
3103
|
+
collectTurnContext,
|
|
2929
3104
|
initMailPoller,
|
|
2930
3105
|
initTokenBudget,
|
|
2931
3106
|
getTokenBudget,
|
|
@@ -15,10 +15,10 @@ import { execFile as execFileCb, execFileSync, spawn } from "child_process";
|
|
|
15
15
|
async function exec(cmd, args, options) {
|
|
16
16
|
const [wrappedCmd, wrappedArgs] = options?.mindName ? await wrapForIsolation(cmd, args, options.mindName) : [cmd, args];
|
|
17
17
|
return new Promise((resolve2, reject) => {
|
|
18
|
-
execFileCb(
|
|
18
|
+
const child = execFileCb(
|
|
19
19
|
wrappedCmd,
|
|
20
20
|
wrappedArgs,
|
|
21
|
-
{ cwd: options?.cwd, env: options?.env },
|
|
21
|
+
{ cwd: options?.cwd, env: options?.env, maxBuffer: options?.maxBuffer },
|
|
22
22
|
(err, stdout, stderr) => {
|
|
23
23
|
if (err) {
|
|
24
24
|
err.stderr = stderr;
|
|
@@ -29,6 +29,11 @@ async function exec(cmd, args, options) {
|
|
|
29
29
|
}
|
|
30
30
|
}
|
|
31
31
|
);
|
|
32
|
+
if (options?.stdin !== void 0 && child.stdin) {
|
|
33
|
+
child.stdin.on("error", () => {
|
|
34
|
+
});
|
|
35
|
+
child.stdin.end(options.stdin);
|
|
36
|
+
}
|
|
32
37
|
});
|
|
33
38
|
}
|
|
34
39
|
function gitExec(args, options) {
|