@xopcai/xopc 0.0.99 → 0.0.100

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 (349) hide show
  1. package/dist/browser-ext/manifest.json +1 -1
  2. package/dist/extensions/telegram/src/account-manager.d.ts +3 -3
  3. package/dist/extensions/telegram/src/account-manager.js +8 -8
  4. package/dist/extensions/telegram/src/account-manager.js.map +1 -1
  5. package/dist/extensions/telegram/src/actions/message-actions.d.ts +4 -0
  6. package/dist/extensions/telegram/src/actions/message-actions.js +71 -0
  7. package/dist/extensions/telegram/src/actions/message-actions.js.map +1 -0
  8. package/dist/extensions/telegram/src/adapters/config-adapter.js +9 -1
  9. package/dist/extensions/telegram/src/adapters/config-adapter.js.map +1 -1
  10. package/dist/extensions/telegram/src/adapters/config-surface.js +1 -1
  11. package/dist/extensions/telegram/src/adapters/config-surface.js.map +1 -1
  12. package/dist/extensions/telegram/src/adapters/outbound-adapter.d.ts +2 -1
  13. package/dist/extensions/telegram/src/adapters/outbound-adapter.js +18 -4
  14. package/dist/extensions/telegram/src/adapters/outbound-adapter.js.map +1 -1
  15. package/dist/extensions/telegram/src/adapters/security-adapter.js +2 -1
  16. package/dist/extensions/telegram/src/adapters/security-adapter.js.map +1 -1
  17. package/dist/extensions/telegram/src/adapters/streaming-adapter.js +90 -6
  18. package/dist/extensions/telegram/src/adapters/streaming-adapter.js.map +1 -1
  19. package/dist/extensions/telegram/src/adapters/types.d.ts +9 -1
  20. package/dist/extensions/telegram/src/api-root.d.ts +4 -0
  21. package/dist/extensions/telegram/src/api-root.js +42 -0
  22. package/dist/extensions/telegram/src/api-root.js.map +1 -0
  23. package/dist/extensions/telegram/src/approval-delivery.d.ts +9 -0
  24. package/dist/extensions/telegram/src/approval-delivery.js +36 -0
  25. package/dist/extensions/telegram/src/approval-delivery.js.map +1 -0
  26. package/dist/extensions/telegram/src/approval-store.d.ts +25 -0
  27. package/dist/extensions/telegram/src/approval-store.js +61 -0
  28. package/dist/extensions/telegram/src/approval-store.js.map +1 -0
  29. package/dist/extensions/telegram/src/config-schema.d.ts +185 -35
  30. package/dist/extensions/telegram/src/config-schema.js +67 -45
  31. package/dist/extensions/telegram/src/config-schema.js.map +1 -1
  32. package/dist/extensions/telegram/src/conversation-id.d.ts +6 -0
  33. package/dist/extensions/telegram/src/conversation-id.js +18 -0
  34. package/dist/extensions/telegram/src/conversation-id.js.map +1 -0
  35. package/dist/extensions/telegram/src/doctor.d.ts +5 -0
  36. package/dist/extensions/telegram/src/doctor.js +80 -0
  37. package/dist/extensions/telegram/src/doctor.js.map +1 -0
  38. package/dist/extensions/telegram/src/exec-approval-handler.d.ts +7 -0
  39. package/dist/extensions/telegram/src/exec-approval-handler.js +36 -0
  40. package/dist/extensions/telegram/src/exec-approval-handler.js.map +1 -0
  41. package/dist/extensions/telegram/src/exec-approvals.d.ts +8 -0
  42. package/dist/extensions/telegram/src/exec-approvals.js +20 -0
  43. package/dist/extensions/telegram/src/exec-approvals.js.map +1 -0
  44. package/dist/extensions/telegram/src/focus-handler.d.ts +12 -0
  45. package/dist/extensions/telegram/src/focus-handler.js +55 -0
  46. package/dist/extensions/telegram/src/focus-handler.js.map +1 -0
  47. package/dist/extensions/telegram/src/group-config-resolver.d.ts +12 -0
  48. package/dist/extensions/telegram/src/group-config-resolver.js +17 -0
  49. package/dist/extensions/telegram/src/group-config-resolver.js.map +1 -0
  50. package/dist/extensions/telegram/src/inbound-coalescer.d.ts +15 -0
  51. package/dist/extensions/telegram/src/inbound-coalescer.js +107 -0
  52. package/dist/extensions/telegram/src/inbound-coalescer.js.map +1 -0
  53. package/dist/extensions/telegram/src/inbound-processor.d.ts +1 -0
  54. package/dist/extensions/telegram/src/inbound-processor.js +41 -4
  55. package/dist/extensions/telegram/src/inbound-processor.js.map +1 -1
  56. package/dist/extensions/telegram/src/network-errors.d.ts +2 -0
  57. package/dist/extensions/telegram/src/network-errors.js +23 -0
  58. package/dist/extensions/telegram/src/network-errors.js.map +1 -0
  59. package/dist/extensions/telegram/src/plugin.d.ts +11 -0
  60. package/dist/extensions/telegram/src/plugin.js +191 -57
  61. package/dist/extensions/telegram/src/plugin.js.map +1 -1
  62. package/dist/extensions/telegram/src/polling-session.d.ts +17 -0
  63. package/dist/extensions/telegram/src/polling-session.js +112 -0
  64. package/dist/extensions/telegram/src/polling-session.js.map +1 -0
  65. package/dist/extensions/telegram/src/proxy-fetch.d.ts +2 -0
  66. package/dist/extensions/telegram/src/proxy-fetch.js +14 -0
  67. package/dist/extensions/telegram/src/proxy-fetch.js.map +1 -0
  68. package/dist/extensions/telegram/src/reactions.d.ts +14 -0
  69. package/dist/extensions/telegram/src/reactions.js +48 -0
  70. package/dist/extensions/telegram/src/reactions.js.map +1 -0
  71. package/dist/extensions/telegram/src/reply-params.d.ts +15 -0
  72. package/dist/extensions/telegram/src/reply-params.js +28 -0
  73. package/dist/extensions/telegram/src/reply-params.js.map +1 -0
  74. package/dist/extensions/telegram/src/startup-errors.d.ts +3 -0
  75. package/dist/extensions/telegram/src/startup-errors.js +27 -0
  76. package/dist/extensions/telegram/src/startup-errors.js.map +1 -0
  77. package/dist/extensions/telegram/src/telegram-actions.d.ts +25 -0
  78. package/dist/extensions/telegram/src/telegram-actions.js +65 -0
  79. package/dist/extensions/telegram/src/telegram-actions.js.map +1 -0
  80. package/dist/extensions/telegram/src/thread-bindings.d.ts +15 -0
  81. package/dist/extensions/telegram/src/thread-bindings.js +22 -0
  82. package/dist/extensions/telegram/src/thread-bindings.js.map +1 -0
  83. package/dist/extensions/telegram/src/token-resolver.d.ts +8 -0
  84. package/dist/extensions/telegram/src/token-resolver.js +34 -0
  85. package/dist/extensions/telegram/src/token-resolver.js.map +1 -0
  86. package/dist/extensions/telegram/src/update-offset-store.d.ts +9 -0
  87. package/dist/extensions/telegram/src/update-offset-store.js +66 -0
  88. package/dist/extensions/telegram/src/update-offset-store.js.map +1 -0
  89. package/dist/extensions/telegram/xopc.extension.json +1 -1
  90. package/dist/gateway/static/root/assets/{agents-4KTK-Ku7.js → agents-C5jtBK-H.js} +1 -1
  91. package/dist/gateway/static/root/assets/{apps-page-DkgInY2w.js → apps-page-smJl-qf_.js} +1 -1
  92. package/dist/gateway/static/root/assets/channels-settings-CH6KgFK6.js +1 -0
  93. package/dist/gateway/static/root/assets/channels-status-swr-CV70xvY7.js +8 -0
  94. package/dist/gateway/static/root/assets/{cron-api-BRDli2Mm.js → cron-api-CgBO8B7I.js} +1 -1
  95. package/dist/gateway/static/root/assets/{cron-page-BzEr5Za8.js → cron-page-Be0cW1cR.js} +1 -1
  96. package/dist/gateway/static/root/assets/{dist-BsHh1vX0.js → dist-P8HRGUuh.js} +1 -1
  97. package/dist/gateway/static/root/assets/{extension-debug-page-TWt5q_ef.js → extension-debug-page-BowuycYu.js} +1 -1
  98. package/dist/gateway/static/root/assets/{extension-page-C3kV8ZvZ.js → extension-page-27-Zpv8O.js} +1 -1
  99. package/dist/gateway/static/root/assets/{extension-settings-page-Csy9LNC6.js → extension-settings-page-DDFa_rIq.js} +1 -1
  100. package/dist/gateway/static/root/assets/{fetch-BLLOP2CM.js → fetch-drJUxxKP.js} +1 -1
  101. package/dist/gateway/static/root/assets/{field-primitives-MXbM8HvY.js → field-primitives-BWLssxEb.js} +1 -1
  102. package/dist/gateway/static/root/assets/{heartbeat-config-api-CkoyqfRx.js → heartbeat-config-api-BVuYNYT_.js} +1 -1
  103. package/dist/gateway/static/root/assets/index-CRDAmr3W.js +4840 -0
  104. package/dist/gateway/static/root/assets/index-DjNDHzwG.css +1 -0
  105. package/dist/gateway/static/root/assets/{logs-page-B2vY41ph.js → logs-page-BDX8IrDQ.js} +1 -1
  106. package/dist/gateway/static/root/assets/{note-detail-page-B7qE5pkO.js → note-detail-page-BmQ9KeiA.js} +1 -1
  107. package/dist/gateway/static/root/assets/{note-time-NBBReVR4.js → note-time-14I9Sgqh.js} +1 -1
  108. package/dist/gateway/static/root/assets/{notes-page-CsWYaqYM.js → notes-page-BMfP0FFf.js} +1 -1
  109. package/dist/gateway/static/root/assets/{sessions-page-BPGY3SCT.js → sessions-page-C3scyChq.js} +1 -1
  110. package/dist/gateway/static/root/assets/{settings-advanced-gate-DtA451RM.js → settings-advanced-gate-2ODuCjHP.js} +1 -1
  111. package/dist/gateway/static/root/assets/{settings-form-section-DYR_SPlX.js → settings-form-section-DUoGKAiW.js} +1 -1
  112. package/dist/gateway/static/root/assets/{settings-page-BJUgZQzN.js → settings-page-CttAfOWV.js} +1 -1
  113. package/dist/gateway/static/root/assets/{share-preview-page-3u8VFmdo.js → share-preview-page-B77xqiiI.js} +1 -1
  114. package/dist/gateway/static/root/assets/{skills-page-DuyhcH4U.js → skills-page-B_bAZGzB.js} +1 -1
  115. package/dist/gateway/static/root/assets/{theme-store-e2q2yjs4.js → theme-store-BgCPrmxU.js} +1 -1
  116. package/dist/gateway/static/root/assets/url-q28QhI7l.js +3 -0
  117. package/dist/gateway/static/root/assets/{utils-B4Vw3fnc.js → utils-CCGejlcX.js} +1 -1
  118. package/dist/gateway/static/root/assets/{voice-api-key-field-BFY67Hhp.js → voice-api-key-field-DZzzihcY.js} +1 -1
  119. package/dist/gateway/static/root/assets/{workflow-page.utils-yUJ5jexd.js → workflow-page.utils-D5RMAmT4.js} +1 -1
  120. package/dist/gateway/static/root/assets/{workflows-page-DIMHCpNt.js → workflows-page-DEYpC6Bv.js} +1 -1
  121. package/dist/gateway/static/root/index.html +5 -5
  122. package/dist/package.js +1 -1
  123. package/dist/src/agent/agent-manager.d.ts +4 -0
  124. package/dist/src/agent/agent-manager.js +68 -4
  125. package/dist/src/agent/agent-manager.js.map +1 -1
  126. package/dist/src/agent/child-agent-factory.d.ts +1 -0
  127. package/dist/src/agent/child-agent-factory.js +13 -10
  128. package/dist/src/agent/child-agent-factory.js.map +1 -1
  129. package/dist/src/agent/embedded/run-for-session.d.ts +1 -0
  130. package/dist/src/agent/embedded/run-for-session.js +1 -0
  131. package/dist/src/agent/embedded/run-for-session.js.map +1 -1
  132. package/dist/src/agent/embedded/run-turn.js +1 -17
  133. package/dist/src/agent/embedded/run-turn.js.map +1 -1
  134. package/dist/src/agent/embedded/session-runner.js +3 -1
  135. package/dist/src/agent/embedded/session-runner.js.map +1 -1
  136. package/dist/src/agent/embedded/session-tool-result-guard.d.ts +1 -0
  137. package/dist/src/agent/embedded/session-tool-result-guard.js +1 -0
  138. package/dist/src/agent/embedded/session-tool-result-guard.js.map +1 -1
  139. package/dist/src/agent/inbound/attachment-pipeline.d.ts +37 -0
  140. package/dist/src/agent/inbound/attachment-pipeline.js +169 -0
  141. package/dist/src/agent/inbound/attachment-pipeline.js.map +1 -0
  142. package/dist/src/agent/inbound/turn-dispatcher.d.ts +3 -5
  143. package/dist/src/agent/inbound/turn-dispatcher.js +1 -2
  144. package/dist/src/agent/inbound/turn-dispatcher.js.map +1 -1
  145. package/dist/src/agent/memory/index.d.ts +2 -0
  146. package/dist/src/agent/memory/index.js +2 -1
  147. package/dist/src/agent/memory/memory-flush.d.ts +27 -0
  148. package/dist/src/agent/memory/memory-flush.js +124 -0
  149. package/dist/src/agent/memory/memory-flush.js.map +1 -0
  150. package/dist/src/agent/messaging/outbound-coordinator.js +2 -1
  151. package/dist/src/agent/messaging/outbound-coordinator.js.map +1 -1
  152. package/dist/src/agent/messaging/stream-manager.d.ts +2 -0
  153. package/dist/src/agent/messaging/stream-manager.js +3 -0
  154. package/dist/src/agent/messaging/stream-manager.js.map +1 -1
  155. package/dist/src/agent/orchestration/agent-orchestrator.d.ts +0 -4
  156. package/dist/src/agent/orchestration/agent-orchestrator.js +40 -107
  157. package/dist/src/agent/orchestration/agent-orchestrator.js.map +1 -1
  158. package/dist/src/agent/prompt/contribution.d.ts +9 -0
  159. package/dist/src/agent/prompt/contribution.js +1 -0
  160. package/dist/src/agent/prompt/safety.js +0 -10
  161. package/dist/src/agent/prompt/safety.js.map +1 -1
  162. package/dist/src/agent/prompt/sanitize-for-prompt.d.ts +6 -0
  163. package/dist/src/agent/prompt/sanitize-for-prompt.js +13 -0
  164. package/dist/src/agent/prompt/sanitize-for-prompt.js.map +1 -0
  165. package/dist/src/agent/prompt/sections/behavior.d.ts +5 -0
  166. package/dist/src/agent/prompt/sections/behavior.js +50 -0
  167. package/dist/src/agent/prompt/sections/behavior.js.map +1 -0
  168. package/dist/src/agent/prompt/sections/memory-skills.d.ts +9 -0
  169. package/dist/src/agent/prompt/sections/memory-skills.js +59 -0
  170. package/dist/src/agent/prompt/sections/memory-skills.js.map +1 -0
  171. package/dist/src/agent/prompt/sections/messaging-runtime.d.ts +16 -0
  172. package/dist/src/agent/prompt/sections/messaging-runtime.js +69 -0
  173. package/dist/src/agent/prompt/sections/messaging-runtime.js.map +1 -0
  174. package/dist/src/agent/prompt/sections/project-context.d.ts +16 -0
  175. package/dist/src/agent/prompt/sections/project-context.js +58 -0
  176. package/dist/src/agent/prompt/sections/project-context.js.map +1 -0
  177. package/dist/src/agent/prompt/sections/tooling.d.ts +5 -0
  178. package/dist/src/agent/prompt/sections/tooling.js +119 -0
  179. package/dist/src/agent/prompt/sections/tooling.js.map +1 -0
  180. package/dist/src/agent/prompt/sections/workspace-runtime.d.ts +11 -0
  181. package/dist/src/agent/prompt/sections/workspace-runtime.js +32 -0
  182. package/dist/src/agent/prompt/sections/workspace-runtime.js.map +1 -0
  183. package/dist/src/agent/prompt/service-prompt-builder.d.ts +13 -0
  184. package/dist/src/agent/prompt/service-prompt-builder.js +54 -13
  185. package/dist/src/agent/prompt/service-prompt-builder.js.map +1 -1
  186. package/dist/src/agent/prompt/subagent-context.d.ts +15 -0
  187. package/dist/src/agent/prompt/subagent-context.js +68 -0
  188. package/dist/src/agent/prompt/subagent-context.js.map +1 -0
  189. package/dist/src/agent/prompt/system-prompt-params.d.ts +53 -0
  190. package/dist/src/agent/prompt/system-prompt-params.js +74 -0
  191. package/dist/src/agent/prompt/system-prompt-params.js.map +1 -0
  192. package/dist/src/agent/prompt/system-prompt.d.ts +22 -11
  193. package/dist/src/agent/prompt/system-prompt.js +79 -193
  194. package/dist/src/agent/prompt/system-prompt.js.map +1 -1
  195. package/dist/src/agent/prompt/types.d.ts +3 -0
  196. package/dist/src/agent/service/build-direct-message-content.d.ts +5 -21
  197. package/dist/src/agent/service/build-direct-message-content.js +11 -64
  198. package/dist/src/agent/service/build-direct-message-content.js.map +1 -1
  199. package/dist/src/agent/service/direct-turn-helpers.d.ts +1 -1
  200. package/dist/src/agent/service/direct-turn-helpers.js +7 -0
  201. package/dist/src/agent/service/direct-turn-helpers.js.map +1 -1
  202. package/dist/src/agent/service/process-direct-one-shot.d.ts +3 -3
  203. package/dist/src/agent/service/process-direct-one-shot.js +22 -17
  204. package/dist/src/agent/service/process-direct-one-shot.js.map +1 -1
  205. package/dist/src/agent/service/process-direct-streaming.d.ts +6 -20
  206. package/dist/src/agent/service/process-direct-streaming.js +39 -40
  207. package/dist/src/agent/service/process-direct-streaming.js.map +1 -1
  208. package/dist/src/agent/service/webchat-tts.d.ts +4 -9
  209. package/dist/src/agent/service/webchat-tts.js +9 -20
  210. package/dist/src/agent/service/webchat-tts.js.map +1 -1
  211. package/dist/src/agent/service.d.ts +8 -19
  212. package/dist/src/agent/service.js +53 -11
  213. package/dist/src/agent/service.js.map +1 -1
  214. package/dist/src/agent/tools/factory.js +2 -0
  215. package/dist/src/agent/tools/factory.js.map +1 -1
  216. package/dist/src/agent/tools/index.d.ts +1 -0
  217. package/dist/src/agent/tools/index.js +2 -1
  218. package/dist/src/agent/tools/media-read-tool.d.ts +2 -0
  219. package/dist/src/agent/tools/media-read-tool.js +89 -0
  220. package/dist/src/agent/tools/media-read-tool.js.map +1 -0
  221. package/dist/src/channels/attachments/attachment-classifiers.d.ts +8 -0
  222. package/dist/src/channels/attachments/attachment-classifiers.js +11 -0
  223. package/dist/src/channels/attachments/attachment-classifiers.js.map +1 -0
  224. package/dist/src/channels/attachments/inbound-persist.d.ts +13 -34
  225. package/dist/src/channels/attachments/inbound-persist.js +34 -102
  226. package/dist/src/channels/attachments/inbound-persist.js.map +1 -1
  227. package/dist/src/channels/attachments/inbound-types.d.ts +13 -0
  228. package/dist/src/channels/attachments/inbound-types.js +30 -0
  229. package/dist/src/channels/attachments/inbound-types.js.map +1 -0
  230. package/dist/src/channels/attachments/outbound-tts-persist.d.ts +3 -12
  231. package/dist/src/channels/attachments/outbound-tts-persist.js +28 -48
  232. package/dist/src/channels/attachments/outbound-tts-persist.js.map +1 -1
  233. package/dist/src/channels/attachments/voice-stt-webchat.d.ts +3 -3
  234. package/dist/src/channels/attachments/voice-stt-webchat.js +8 -14
  235. package/dist/src/channels/attachments/voice-stt-webchat.js.map +1 -1
  236. package/dist/src/channels/channel-domain.d.ts +30 -2
  237. package/dist/src/channels/exec-approval-runtime.d.ts +29 -0
  238. package/dist/src/channels/exec-approval-runtime.js +30 -0
  239. package/dist/src/channels/exec-approval-runtime.js.map +1 -0
  240. package/dist/src/channels/index.js +1 -1
  241. package/dist/src/channels/plugin-types.d.ts +1 -0
  242. package/dist/src/channels/transport-types.d.ts +2 -2
  243. package/dist/src/cli/commands/channels.js +1 -1
  244. package/dist/src/cli/commands/doctor/checks/database-schema.d.ts +2 -0
  245. package/dist/src/cli/commands/doctor/checks/database-schema.js +62 -0
  246. package/dist/src/cli/commands/doctor/checks/database-schema.js.map +1 -0
  247. package/dist/src/cli/commands/doctor/flow.js +2 -0
  248. package/dist/src/cli/commands/doctor/flow.js.map +1 -1
  249. package/dist/src/cli/commands/init.js +2 -57
  250. package/dist/src/cli/commands/init.js.map +1 -1
  251. package/dist/src/cli/commands/onboard/channels/registry.js +1 -1
  252. package/dist/src/cli/commands/setup.js +6 -5
  253. package/dist/src/cli/commands/setup.js.map +1 -1
  254. package/dist/src/cli/utils/init-workspace-core.js +1 -2
  255. package/dist/src/cli/utils/init-workspace-core.js.map +1 -1
  256. package/dist/src/config/index.js +2 -2
  257. package/dist/src/config/paths.d.ts +0 -13
  258. package/dist/src/config/paths.js +1 -20
  259. package/dist/src/config/paths.js.map +1 -1
  260. package/dist/src/config/rules.js +1 -1
  261. package/dist/src/config/schema.d.ts +24 -0
  262. package/dist/src/config/schema.js +33 -2
  263. package/dist/src/config/schema.js.map +1 -1
  264. package/dist/src/cron/executor.js +2 -2
  265. package/dist/src/gateway/heartbeat/service.js +1 -1
  266. package/dist/src/gateway/hono/lib/config-payload.js +1 -1
  267. package/dist/src/gateway/hono/routes/config-patch/channels.js +3 -3
  268. package/dist/src/gateway/hono/routes/config-patch/channels.js.map +1 -1
  269. package/dist/src/gateway/hono/routes/lazy-bundles.js +8 -0
  270. package/dist/src/gateway/hono/routes/lazy-bundles.js.map +1 -1
  271. package/dist/src/gateway/hono/routes/media.d.ts +3 -0
  272. package/dist/src/gateway/hono/routes/media.js +50 -0
  273. package/dist/src/gateway/hono/routes/media.js.map +1 -0
  274. package/dist/src/gateway/hono/routes/sessions.js +6 -0
  275. package/dist/src/gateway/hono/routes/sessions.js.map +1 -1
  276. package/dist/src/gateway/hono/routes/workspace.js +1 -87
  277. package/dist/src/gateway/hono/routes/workspace.js.map +1 -1
  278. package/dist/src/gateway/service/sessions-api.js +3 -0
  279. package/dist/src/gateway/service/sessions-api.js.map +1 -1
  280. package/dist/src/heartbeat/index.js +1 -1
  281. package/dist/src/media/index.d.ts +5 -0
  282. package/dist/src/media/index.js +5 -0
  283. package/dist/src/media/media-reference.d.ts +23 -0
  284. package/dist/src/media/media-reference.js +34 -0
  285. package/dist/src/media/media-reference.js.map +1 -0
  286. package/dist/src/media/paths.d.ts +5 -0
  287. package/dist/src/media/paths.js +20 -0
  288. package/dist/src/media/paths.js.map +1 -0
  289. package/dist/src/media/session-references.d.ts +8 -0
  290. package/dist/src/media/session-references.js +45 -0
  291. package/dist/src/media/session-references.js.map +1 -0
  292. package/dist/src/media/store.d.ts +19 -0
  293. package/dist/src/media/store.js +131 -0
  294. package/dist/src/media/store.js.map +1 -0
  295. package/dist/src/media/types.d.ts +34 -0
  296. package/dist/src/media/types.js +1 -0
  297. package/dist/src/media/uri.d.ts +15 -0
  298. package/dist/src/media/uri.js +51 -0
  299. package/dist/src/media/uri.js.map +1 -0
  300. package/dist/src/session/session-title.js +6 -3
  301. package/dist/src/session/session-title.js.map +1 -1
  302. package/dist/src/session/store.js +1 -1
  303. package/dist/src/session/store.js.map +1 -1
  304. package/dist/src/session/types.d.ts +12 -7
  305. package/dist/src/session/types.js.map +1 -1
  306. package/dist/src/storage/sqlite/index.d.ts +4 -1
  307. package/dist/src/storage/sqlite/index.js +6 -2
  308. package/dist/src/storage/sqlite/migrations/002_add_flush_columns.sql +3 -0
  309. package/dist/src/storage/sqlite/migrations/discover.d.ts +4 -0
  310. package/dist/src/storage/sqlite/migrations/discover.js +38 -0
  311. package/dist/src/storage/sqlite/migrations/discover.js.map +1 -0
  312. package/dist/src/storage/sqlite/migrations/discover.ts +52 -0
  313. package/dist/src/storage/sqlite/migrations/errors.d.ts +11 -0
  314. package/dist/src/storage/sqlite/migrations/errors.js +27 -0
  315. package/dist/src/storage/sqlite/migrations/errors.js.map +1 -0
  316. package/dist/src/storage/sqlite/migrations/errors.ts +32 -0
  317. package/dist/src/storage/sqlite/migrations/runner.d.ts +22 -0
  318. package/dist/src/storage/sqlite/migrations/runner.js +97 -0
  319. package/dist/src/storage/sqlite/migrations/runner.js.map +1 -0
  320. package/dist/src/storage/sqlite/migrations/runner.ts +153 -0
  321. package/dist/src/storage/sqlite/migrations/types.d.ts +12 -0
  322. package/dist/src/storage/sqlite/migrations/types.js +1 -0
  323. package/dist/src/storage/sqlite/migrations/types.ts +13 -0
  324. package/dist/src/storage/sqlite/row-mappers.d.ts +4 -0
  325. package/dist/src/storage/sqlite/row-mappers.js +4 -0
  326. package/dist/src/storage/sqlite/row-mappers.js.map +1 -1
  327. package/dist/src/storage/sqlite/schema-version.d.ts +6 -0
  328. package/dist/src/storage/sqlite/schema-version.js +29 -0
  329. package/dist/src/storage/sqlite/schema-version.js.map +1 -0
  330. package/dist/src/storage/sqlite/schema.d.ts +5 -3
  331. package/dist/src/storage/sqlite/schema.js +24 -28
  332. package/dist/src/storage/sqlite/schema.js.map +1 -1
  333. package/dist/src/storage/sqlite/schema.sql +2 -0
  334. package/dist/src/storage/sqlite/session-metadata.js +1 -0
  335. package/dist/src/storage/sqlite/session-metadata.js.map +1 -1
  336. package/dist/src/storage/sqlite/session-repository.js +7 -3
  337. package/dist/src/storage/sqlite/session-repository.js.map +1 -1
  338. package/package.json +1 -1
  339. package/dist/gateway/static/root/assets/channels-settings-BxW1Xio4.js +0 -1
  340. package/dist/gateway/static/root/assets/channels-status-swr-Cxm6AvQO.js +0 -8
  341. package/dist/gateway/static/root/assets/index-BJDmBCSl.css +0 -1
  342. package/dist/gateway/static/root/assets/index-Cbg5TS5m.js +0 -4707
  343. package/dist/gateway/static/root/assets/url-DpFBIyN9.js +0 -3
  344. package/dist/src/cli/commands/onboard/workspace.d.ts +0 -14
  345. package/dist/src/cli/commands/onboard/workspace.js +0 -33
  346. package/dist/src/cli/commands/onboard/workspace.js.map +0 -1
  347. package/dist/src/cli/utils/workspace.d.ts +0 -35
  348. package/dist/src/cli/utils/workspace.js +0 -72
  349. package/dist/src/cli/utils/workspace.js.map +0 -1
@@ -0,0 +1,58 @@
1
+ import { DEFAULT_HEARTBEAT_FILENAME } from "../../context/workspace.js";
2
+ //#region src/agent/prompt/sections/project-context.ts
3
+ const CONTEXT_FILE_ORDER = new Map([
4
+ ["agents.md", 10],
5
+ ["soul.md", 20],
6
+ ["identity.md", 30],
7
+ ["user.md", 40],
8
+ ["tools.md", 50],
9
+ ["bootstrap.md", 60],
10
+ ["memory.md", 70]
11
+ ]);
12
+ const DYNAMIC_CONTEXT_FILE_BASENAMES = new Set(["heartbeat.md"]);
13
+ const DEFAULT_HEARTBEAT_PROMPT_CONTEXT_BLOCK = "Default heartbeat prompt:\n`Read HEARTBEAT.md if it exists (workspace context). Follow it strictly. Do not infer or repeat old tasks from prior chats. If nothing needs attention, reply HEARTBEAT_OK.`";
14
+ function normalizeContextFilePath(pathValue) {
15
+ return pathValue.trim().replace(/\\/g, "/");
16
+ }
17
+ function getContextFileBasename(pathValue) {
18
+ const normalizedPath = normalizeContextFilePath(pathValue);
19
+ return (normalizedPath.split("/").pop() ?? normalizedPath).toLowerCase();
20
+ }
21
+ function isDynamicContextFile(pathValue) {
22
+ return DYNAMIC_CONTEXT_FILE_BASENAMES.has(getContextFileBasename(pathValue));
23
+ }
24
+ function sanitizeContextFileContentForPrompt(content) {
25
+ return content.replaceAll(DEFAULT_HEARTBEAT_PROMPT_CONTEXT_BLOCK, "").replace(/\n{3,}/g, "\n\n");
26
+ }
27
+ function sortContextFilesForPrompt(contextFiles) {
28
+ return [...contextFiles].sort((a, b) => {
29
+ const aBase = getContextFileBasename(a.path);
30
+ const bBase = getContextFileBasename(b.path);
31
+ const aOrder = CONTEXT_FILE_ORDER.get(aBase) ?? Number.MAX_SAFE_INTEGER;
32
+ const bOrder = CONTEXT_FILE_ORDER.get(bBase) ?? Number.MAX_SAFE_INTEGER;
33
+ if (aOrder !== bOrder) return aOrder - bOrder;
34
+ if (aBase !== bBase) return aBase.localeCompare(bBase);
35
+ return normalizeContextFilePath(a.path).localeCompare(normalizeContextFilePath(b.path));
36
+ });
37
+ }
38
+ function buildProjectContextSection(params) {
39
+ if (params.files.length === 0) return [];
40
+ const lines = [params.heading, ""];
41
+ if (params.dynamic) lines.push("The following frequently-changing project context files are kept below the cache boundary when possible:", "");
42
+ else {
43
+ const hasSoulFile = params.files.some((file) => getContextFileBasename(file.path) === "soul.md");
44
+ lines.push("The following project context files have been loaded:");
45
+ if (hasSoulFile) lines.push("If SOUL.md is present, embody its persona and tone. Avoid stiff, generic replies; follow its guidance unless higher-priority instructions override it.");
46
+ lines.push("");
47
+ }
48
+ for (const file of params.files) lines.push(`## ${file.path}`, "", sanitizeContextFileContentForPrompt(file.content), "");
49
+ return lines;
50
+ }
51
+ /** Whether HEARTBEAT.md is injected as dynamic context (vs behavior-only section). */
52
+ function isHeartbeatContextFile(pathValue) {
53
+ return getContextFileBasename(pathValue) === DEFAULT_HEARTBEAT_FILENAME.toLowerCase();
54
+ }
55
+ //#endregion
56
+ export { CONTEXT_FILE_ORDER, DEFAULT_HEARTBEAT_PROMPT_CONTEXT_BLOCK, DYNAMIC_CONTEXT_FILE_BASENAMES, buildProjectContextSection, getContextFileBasename, isDynamicContextFile, isHeartbeatContextFile, normalizeContextFilePath, sanitizeContextFileContentForPrompt, sortContextFilesForPrompt };
57
+
58
+ //# sourceMappingURL=project-context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project-context.js","names":[],"sources":["../../../../../src/agent/prompt/sections/project-context.ts"],"sourcesContent":["import type { EmbeddedContextFile } from '../../bootstrap/types.js';\nimport { DEFAULT_HEARTBEAT_FILENAME } from '../../context/workspace.js';\n\nexport const CONTEXT_FILE_ORDER = new Map<string, number>([\n ['agents.md', 10],\n ['soul.md', 20],\n ['identity.md', 30],\n ['user.md', 40],\n ['tools.md', 50],\n ['bootstrap.md', 60],\n ['memory.md', 70],\n]);\n\nexport const DYNAMIC_CONTEXT_FILE_BASENAMES = new Set(['heartbeat.md']);\n\nexport const DEFAULT_HEARTBEAT_PROMPT_CONTEXT_BLOCK =\n 'Default heartbeat prompt:\\n`Read HEARTBEAT.md if it exists (workspace context). Follow it strictly. Do not infer or repeat old tasks from prior chats. If nothing needs attention, reply HEARTBEAT_OK.`';\n\nexport function normalizeContextFilePath(pathValue: string): string {\n return pathValue.trim().replace(/\\\\/g, '/');\n}\n\nexport function getContextFileBasename(pathValue: string): string {\n const normalizedPath = normalizeContextFilePath(pathValue);\n return (normalizedPath.split('/').pop() ?? normalizedPath).toLowerCase();\n}\n\nexport function isDynamicContextFile(pathValue: string): boolean {\n return DYNAMIC_CONTEXT_FILE_BASENAMES.has(getContextFileBasename(pathValue));\n}\n\nexport function sanitizeContextFileContentForPrompt(content: string): string {\n return content.replaceAll(DEFAULT_HEARTBEAT_PROMPT_CONTEXT_BLOCK, '').replace(/\\n{3,}/g, '\\n\\n');\n}\n\nexport function sortContextFilesForPrompt(contextFiles: EmbeddedContextFile[]): EmbeddedContextFile[] {\n return [...contextFiles].sort((a, b) => {\n const aBase = getContextFileBasename(a.path);\n const bBase = getContextFileBasename(b.path);\n const aOrder = CONTEXT_FILE_ORDER.get(aBase) ?? Number.MAX_SAFE_INTEGER;\n const bOrder = CONTEXT_FILE_ORDER.get(bBase) ?? Number.MAX_SAFE_INTEGER;\n if (aOrder !== bOrder) {\n return aOrder - bOrder;\n }\n if (aBase !== bBase) {\n return aBase.localeCompare(bBase);\n }\n return normalizeContextFilePath(a.path).localeCompare(normalizeContextFilePath(b.path));\n });\n}\n\nexport function buildProjectContextSection(params: {\n files: EmbeddedContextFile[];\n heading: string;\n dynamic: boolean;\n}): string[] {\n if (params.files.length === 0) {\n return [];\n }\n const lines: string[] = [params.heading, ''];\n if (params.dynamic) {\n lines.push(\n 'The following frequently-changing project context files are kept below the cache boundary when possible:',\n '',\n );\n } else {\n const hasSoulFile = params.files.some((file) => getContextFileBasename(file.path) === 'soul.md');\n lines.push('The following project context files have been loaded:');\n if (hasSoulFile) {\n lines.push(\n 'If SOUL.md is present, embody its persona and tone. Avoid stiff, generic replies; follow its guidance unless higher-priority instructions override it.',\n );\n }\n lines.push('');\n }\n for (const file of params.files) {\n lines.push(`## ${file.path}`, '', sanitizeContextFileContentForPrompt(file.content), '');\n }\n return lines;\n}\n\n/** Whether HEARTBEAT.md is injected as dynamic context (vs behavior-only section). */\nexport function isHeartbeatContextFile(pathValue: string): boolean {\n return getContextFileBasename(pathValue) === DEFAULT_HEARTBEAT_FILENAME.toLowerCase();\n}\n"],"mappings":";;AAGA,MAAa,qBAAqB,IAAI,IAAoB;CACxD,CAAC,aAAa,GAAG;CACjB,CAAC,WAAW,GAAG;CACf,CAAC,eAAe,GAAG;CACnB,CAAC,WAAW,GAAG;CACf,CAAC,YAAY,GAAG;CAChB,CAAC,gBAAgB,GAAG;CACpB,CAAC,aAAa,GAAG;CAClB,CAAC;AAEF,MAAa,iCAAiC,IAAI,IAAI,CAAC,eAAe,CAAC;AAEvE,MAAa,yCACX;AAEF,SAAgB,yBAAyB,WAA2B;AAClE,QAAO,UAAU,MAAM,CAAC,QAAQ,OAAO,IAAI;;AAG7C,SAAgB,uBAAuB,WAA2B;CAChE,MAAM,iBAAiB,yBAAyB,UAAU;AAC1D,SAAQ,eAAe,MAAM,IAAI,CAAC,KAAK,IAAI,gBAAgB,aAAa;;AAG1E,SAAgB,qBAAqB,WAA4B;AAC/D,QAAO,+BAA+B,IAAI,uBAAuB,UAAU,CAAC;;AAG9E,SAAgB,oCAAoC,SAAyB;AAC3E,QAAO,QAAQ,WAAW,wCAAwC,GAAG,CAAC,QAAQ,WAAW,OAAO;;AAGlG,SAAgB,0BAA0B,cAA4D;AACpG,QAAO,CAAC,GAAG,aAAa,CAAC,MAAM,GAAG,MAAM;EACtC,MAAM,QAAQ,uBAAuB,EAAE,KAAK;EAC5C,MAAM,QAAQ,uBAAuB,EAAE,KAAK;EAC5C,MAAM,SAAS,mBAAmB,IAAI,MAAM,IAAI,OAAO;EACvD,MAAM,SAAS,mBAAmB,IAAI,MAAM,IAAI,OAAO;AACvD,MAAI,WAAW,OACb,QAAO,SAAS;AAElB,MAAI,UAAU,MACZ,QAAO,MAAM,cAAc,MAAM;AAEnC,SAAO,yBAAyB,EAAE,KAAK,CAAC,cAAc,yBAAyB,EAAE,KAAK,CAAC;GACvF;;AAGJ,SAAgB,2BAA2B,QAI9B;AACX,KAAI,OAAO,MAAM,WAAW,EAC1B,QAAO,EAAE;CAEX,MAAM,QAAkB,CAAC,OAAO,SAAS,GAAG;AAC5C,KAAI,OAAO,QACT,OAAM,KACJ,4GACA,GACD;MACI;EACL,MAAM,cAAc,OAAO,MAAM,MAAM,SAAS,uBAAuB,KAAK,KAAK,KAAK,UAAU;AAChG,QAAM,KAAK,wDAAwD;AACnE,MAAI,YACF,OAAM,KACJ,yJACD;AAEH,QAAM,KAAK,GAAG;;AAEhB,MAAK,MAAM,QAAQ,OAAO,MACxB,OAAM,KAAK,MAAM,KAAK,QAAQ,IAAI,oCAAoC,KAAK,QAAQ,EAAE,GAAG;AAE1F,QAAO;;;AAIT,SAAgB,uBAAuB,WAA4B;AACjE,QAAO,uBAAuB,UAAU,KAAK,2BAA2B,aAAa"}
@@ -0,0 +1,5 @@
1
+ export declare function buildToolingSection(params: {
2
+ toolNames?: string[];
3
+ toolSummaries?: Record<string, string>;
4
+ }): string;
5
+ export declare function hasSkillsTools(toolNames: string[]): boolean;
@@ -0,0 +1,119 @@
1
+ //#region src/agent/prompt/sections/tooling.ts
2
+ const CORE_TOOL_ORDER = [
3
+ "read_file",
4
+ "write_file",
5
+ "edit_file",
6
+ "grep",
7
+ "find",
8
+ "list_dir",
9
+ "shell",
10
+ "web_search",
11
+ "web_fetch",
12
+ "web_extract",
13
+ "browser_use",
14
+ "send_message",
15
+ "send_media",
16
+ "memory_search",
17
+ "memory_get",
18
+ "session_search",
19
+ "curated_memory",
20
+ "session_status",
21
+ "delegate_task",
22
+ "workflow",
23
+ "cronjob",
24
+ "skills_list",
25
+ "skill_view",
26
+ "skill_manage",
27
+ "todo",
28
+ "clarify",
29
+ "text_to_speech",
30
+ "image",
31
+ "image_generate",
32
+ "create_share",
33
+ "execute_code"
34
+ ];
35
+ const CORE_TOOL_SUMMARIES = {
36
+ read_file: "Read file contents",
37
+ write_file: "Create or overwrite files",
38
+ edit_file: "Make precise edits to files",
39
+ grep: "Search file contents for patterns",
40
+ find: "Find files by glob pattern",
41
+ list_dir: "List directory contents",
42
+ shell: "Run shell commands (supports background via yieldMs/background)",
43
+ web_search: "Search the web",
44
+ web_fetch: "Fetch and extract readable content from a URL",
45
+ web_extract: "Extract structured content from a URL",
46
+ browser_use: "Control the configured browser",
47
+ send_message: "Send messages to the current channel",
48
+ send_media: "Send media attachments to the current channel",
49
+ memory_search: "Semantic search over workspace and profile memory files",
50
+ memory_get: "Read specific lines from memory files",
51
+ session_search: "Search other chat sessions or list recent sessions",
52
+ curated_memory: "Read/write structured notes under agent home memories/",
53
+ session_status: "Show session usage/time/model state",
54
+ delegate_task: "Spawn an isolated sub-agent for a delegated task",
55
+ workflow: "Start a persisted multi-phase workflow run",
56
+ cronjob: "Manage scheduled cron jobs",
57
+ skills_list: "List available skills",
58
+ skill_view: "Load a skill SKILL.md or sub-documents",
59
+ skill_manage: "Create or update skills on disk",
60
+ todo: "Manage in-session todo items",
61
+ clarify: "Ask the user a blocking clarification question",
62
+ text_to_speech: "Send a standalone voice message",
63
+ image: "Analyze an image with the configured vision model",
64
+ image_generate: "Generate images with the configured image model",
65
+ create_share: "Create a shareable link for workspace files",
66
+ execute_code: "Run code in a sandbox with a restricted tool subset"
67
+ };
68
+ function buildToolingSection(params) {
69
+ const rawToolNames = (params.toolNames ?? []).map((tool) => tool.trim()).filter(Boolean);
70
+ const canonicalByNormalized = /* @__PURE__ */ new Map();
71
+ for (const name of rawToolNames) {
72
+ const normalized = name.toLowerCase();
73
+ if (!canonicalByNormalized.has(normalized)) canonicalByNormalized.set(normalized, name);
74
+ }
75
+ const resolveToolName = (normalized) => canonicalByNormalized.get(normalized) ?? normalized;
76
+ const normalizedTools = rawToolNames.map((tool) => tool.toLowerCase());
77
+ const availableTools = new Set(normalizedTools);
78
+ const externalToolSummaries = /* @__PURE__ */ new Map();
79
+ for (const [key, value] of Object.entries(params.toolSummaries ?? {})) {
80
+ const normalized = key.trim().toLowerCase();
81
+ if (!normalized || !value?.trim()) continue;
82
+ externalToolSummaries.set(normalized, value.trim());
83
+ }
84
+ const extraTools = Array.from(new Set(normalizedTools.filter((tool) => !CORE_TOOL_ORDER.includes(tool))));
85
+ const toolLines = CORE_TOOL_ORDER.filter((tool) => availableTools.has(tool)).map((tool) => {
86
+ const summary = CORE_TOOL_SUMMARIES[tool] ?? externalToolSummaries.get(tool);
87
+ const name = resolveToolName(tool);
88
+ return summary ? `- ${name}: ${summary}` : `- ${name}`;
89
+ });
90
+ for (const tool of extraTools.toSorted()) {
91
+ const summary = CORE_TOOL_SUMMARIES[tool] ?? externalToolSummaries.get(tool);
92
+ const name = resolveToolName(tool);
93
+ toolLines.push(summary ? `- ${name}: ${summary}` : `- ${name}`);
94
+ }
95
+ const shellToolName = resolveToolName("shell");
96
+ const hasDelegate = availableTools.has("delegate_task");
97
+ const hasWorkflow = availableTools.has("workflow");
98
+ const orchestrationLines = [];
99
+ if (hasDelegate) orchestrationLines.push("- Sub-agent delegation → use `delegate_task(goal, context?, toolset?)` for focused parallel work; results return to you automatically.");
100
+ if (hasWorkflow) orchestrationLines.push("- Multi-phase workflows → use `workflow` to start persisted runs with subagents when a script defines phases.");
101
+ return [
102
+ "## Tooling",
103
+ "Tool availability (filtered by policy):",
104
+ "Tool names are case-sensitive. Call tools exactly as listed.",
105
+ toolLines.length > 0 ? toolLines.join("\n") : "- No tools are registered for this session.",
106
+ `For long waits, avoid rapid poll loops: use \`${shellToolName}\` with enough yieldMs or poll in reasonable intervals.`,
107
+ hasDelegate ? "If a task is complex or long-running, delegate it. Completion is push-based: the sub-agent result returns when done." : "",
108
+ ...orchestrationLines,
109
+ "Do not poll delegate/workflow status in a tight loop; check on-demand or wait for completion."
110
+ ].filter(Boolean).join("\n");
111
+ }
112
+ function hasSkillsTools(toolNames) {
113
+ const normalized = new Set(toolNames.map((t) => t.toLowerCase()));
114
+ return normalized.has("skills_list") || normalized.has("skill_view");
115
+ }
116
+ //#endregion
117
+ export { buildToolingSection, hasSkillsTools };
118
+
119
+ //# sourceMappingURL=tooling.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tooling.js","names":[],"sources":["../../../../../src/agent/prompt/sections/tooling.ts"],"sourcesContent":["const CORE_TOOL_ORDER = [\n 'read_file',\n 'write_file',\n 'edit_file',\n 'grep',\n 'find',\n 'list_dir',\n 'shell',\n 'web_search',\n 'web_fetch',\n 'web_extract',\n 'browser_use',\n 'send_message',\n 'send_media',\n 'memory_search',\n 'memory_get',\n 'session_search',\n 'curated_memory',\n 'session_status',\n 'delegate_task',\n 'workflow',\n 'cronjob',\n 'skills_list',\n 'skill_view',\n 'skill_manage',\n 'todo',\n 'clarify',\n 'text_to_speech',\n 'image',\n 'image_generate',\n 'create_share',\n 'execute_code',\n] as const;\n\nconst CORE_TOOL_SUMMARIES: Record<string, string> = {\n read_file: 'Read file contents',\n write_file: 'Create or overwrite files',\n edit_file: 'Make precise edits to files',\n grep: 'Search file contents for patterns',\n find: 'Find files by glob pattern',\n list_dir: 'List directory contents',\n shell: 'Run shell commands (supports background via yieldMs/background)',\n web_search: 'Search the web',\n web_fetch: 'Fetch and extract readable content from a URL',\n web_extract: 'Extract structured content from a URL',\n browser_use: 'Control the configured browser',\n send_message: 'Send messages to the current channel',\n send_media: 'Send media attachments to the current channel',\n memory_search: 'Semantic search over workspace and profile memory files',\n memory_get: 'Read specific lines from memory files',\n session_search: 'Search other chat sessions or list recent sessions',\n curated_memory: 'Read/write structured notes under agent home memories/',\n session_status: 'Show session usage/time/model state',\n delegate_task: 'Spawn an isolated sub-agent for a delegated task',\n workflow: 'Start a persisted multi-phase workflow run',\n cronjob: 'Manage scheduled cron jobs',\n skills_list: 'List available skills',\n skill_view: 'Load a skill SKILL.md or sub-documents',\n skill_manage: 'Create or update skills on disk',\n todo: 'Manage in-session todo items',\n clarify: 'Ask the user a blocking clarification question',\n text_to_speech: 'Send a standalone voice message',\n image: 'Analyze an image with the configured vision model',\n image_generate: 'Generate images with the configured image model',\n create_share: 'Create a shareable link for workspace files',\n execute_code: 'Run code in a sandbox with a restricted tool subset',\n};\n\nexport function buildToolingSection(params: {\n toolNames?: string[];\n toolSummaries?: Record<string, string>;\n}): string {\n const rawToolNames = (params.toolNames ?? []).map((tool) => tool.trim()).filter(Boolean);\n const canonicalByNormalized = new Map<string, string>();\n for (const name of rawToolNames) {\n const normalized = name.toLowerCase();\n if (!canonicalByNormalized.has(normalized)) {\n canonicalByNormalized.set(normalized, name);\n }\n }\n const resolveToolName = (normalized: string) =>\n canonicalByNormalized.get(normalized) ?? normalized;\n\n const normalizedTools = rawToolNames.map((tool) => tool.toLowerCase());\n const availableTools = new Set(normalizedTools);\n\n const externalToolSummaries = new Map<string, string>();\n for (const [key, value] of Object.entries(params.toolSummaries ?? {})) {\n const normalized = key.trim().toLowerCase();\n if (!normalized || !value?.trim()) {\n continue;\n }\n externalToolSummaries.set(normalized, value.trim());\n }\n\n const extraTools = Array.from(\n new Set(normalizedTools.filter((tool) => !CORE_TOOL_ORDER.includes(tool as (typeof CORE_TOOL_ORDER)[number]))),\n );\n const enabledTools = CORE_TOOL_ORDER.filter((tool) => availableTools.has(tool));\n const toolLines = enabledTools.map((tool) => {\n const summary = CORE_TOOL_SUMMARIES[tool] ?? externalToolSummaries.get(tool);\n const name = resolveToolName(tool);\n return summary ? `- ${name}: ${summary}` : `- ${name}`;\n });\n for (const tool of extraTools.toSorted()) {\n const summary = CORE_TOOL_SUMMARIES[tool] ?? externalToolSummaries.get(tool);\n const name = resolveToolName(tool);\n toolLines.push(summary ? `- ${name}: ${summary}` : `- ${name}`);\n }\n\n const shellToolName = resolveToolName('shell');\n const hasDelegate = availableTools.has('delegate_task');\n const hasWorkflow = availableTools.has('workflow');\n\n const orchestrationLines: string[] = [];\n if (hasDelegate) {\n orchestrationLines.push(\n '- Sub-agent delegation → use `delegate_task(goal, context?, toolset?)` for focused parallel work; results return to you automatically.',\n );\n }\n if (hasWorkflow) {\n orchestrationLines.push(\n '- Multi-phase workflows → use `workflow` to start persisted runs with subagents when a script defines phases.',\n );\n }\n\n return [\n '## Tooling',\n 'Tool availability (filtered by policy):',\n 'Tool names are case-sensitive. Call tools exactly as listed.',\n toolLines.length > 0\n ? toolLines.join('\\n')\n : '- No tools are registered for this session.',\n `For long waits, avoid rapid poll loops: use \\`${shellToolName}\\` with enough yieldMs or poll in reasonable intervals.`,\n hasDelegate\n ? 'If a task is complex or long-running, delegate it. Completion is push-based: the sub-agent result returns when done.'\n : '',\n ...orchestrationLines,\n 'Do not poll delegate/workflow status in a tight loop; check on-demand or wait for completion.',\n ]\n .filter(Boolean)\n .join('\\n');\n}\n\nexport function hasSkillsTools(toolNames: string[]): boolean {\n const normalized = new Set(toolNames.map((t) => t.toLowerCase()));\n return normalized.has('skills_list') || normalized.has('skill_view');\n}\n"],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ export type RuntimeInfoInput = {
2
+ version?: string;
3
+ model?: string;
4
+ channel?: string;
5
+ agentId?: string;
6
+ thinkingLevel?: string;
7
+ capabilities?: string[];
8
+ };
9
+ export declare function buildWorkspaceSection(workspaceDir: string): string;
10
+ export declare function buildWorkspaceFilesIntroSection(): string;
11
+ export declare function buildRuntimeSection(runtime?: RuntimeInfoInput): string;
@@ -0,0 +1,32 @@
1
+ import { sanitizeForPromptLiteral } from "../sanitize-for-prompt.js";
2
+ //#region src/agent/prompt/sections/workspace-runtime.ts
3
+ function buildWorkspaceSection(workspaceDir) {
4
+ return [
5
+ "## Workspace",
6
+ `Your working directory is: ${sanitizeForPromptLiteral(workspaceDir)}`,
7
+ "Treat this directory as the single global workspace for file operations unless explicitly instructed otherwise."
8
+ ].join("\n");
9
+ }
10
+ function buildWorkspaceFilesIntroSection() {
11
+ return [
12
+ "## Workspace Files (injected)",
13
+ "",
14
+ "Profile bootstrap files are injected below as Project Context. Do not manually reread them at session start unless the user asks or injected content is insufficient."
15
+ ].join("\n");
16
+ }
17
+ function buildRuntimeSection(runtime) {
18
+ if (!runtime) return "";
19
+ const parts = [];
20
+ if (runtime.agentId) parts.push(`agent=${runtime.agentId}`);
21
+ if (runtime.version) parts.push(`v${runtime.version}`);
22
+ if (runtime.model) parts.push(`model=${runtime.model.split("/").pop() ?? runtime.model}`);
23
+ if (runtime.channel) parts.push(`channel=${runtime.channel}`);
24
+ if (runtime.capabilities && runtime.capabilities.length > 0) parts.push(`capabilities=${runtime.capabilities.join(",")}`);
25
+ if (runtime.thinkingLevel) parts.push(`thinking=${runtime.thinkingLevel}`);
26
+ if (parts.length === 0) return "";
27
+ return ["## Runtime", `Runtime: ${parts.join(" | ")}`].join("\n");
28
+ }
29
+ //#endregion
30
+ export { buildRuntimeSection, buildWorkspaceFilesIntroSection, buildWorkspaceSection };
31
+
32
+ //# sourceMappingURL=workspace-runtime.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workspace-runtime.js","names":[],"sources":["../../../../../src/agent/prompt/sections/workspace-runtime.ts"],"sourcesContent":["import { sanitizeForPromptLiteral } from '../sanitize-for-prompt.js';\n\nexport type RuntimeInfoInput = {\n version?: string;\n model?: string;\n channel?: string;\n agentId?: string;\n thinkingLevel?: string;\n capabilities?: string[];\n};\n\nexport function buildWorkspaceSection(workspaceDir: string): string {\n const sanitized = sanitizeForPromptLiteral(workspaceDir);\n return [\n '## Workspace',\n `Your working directory is: ${sanitized}`,\n 'Treat this directory as the single global workspace for file operations unless explicitly instructed otherwise.',\n ].join('\\n');\n}\n\nexport function buildWorkspaceFilesIntroSection(): string {\n return [\n '## Workspace Files (injected)',\n '',\n 'Profile bootstrap files are injected below as Project Context. Do not manually reread them at session start unless the user asks or injected content is insufficient.',\n ].join('\\n');\n}\n\nexport function buildRuntimeSection(runtime?: RuntimeInfoInput): string {\n if (!runtime) {\n return '';\n }\n const parts: string[] = [];\n if (runtime.agentId) parts.push(`agent=${runtime.agentId}`);\n if (runtime.version) parts.push(`v${runtime.version}`);\n if (runtime.model) parts.push(`model=${runtime.model.split('/').pop() ?? runtime.model}`);\n if (runtime.channel) parts.push(`channel=${runtime.channel}`);\n if (runtime.capabilities && runtime.capabilities.length > 0) {\n parts.push(`capabilities=${runtime.capabilities.join(',')}`);\n }\n if (runtime.thinkingLevel) parts.push(`thinking=${runtime.thinkingLevel}`);\n if (parts.length === 0) {\n return '';\n }\n return ['## Runtime', `Runtime: ${parts.join(' | ')}`].join('\\n');\n}\n"],"mappings":";;AAWA,SAAgB,sBAAsB,cAA8B;AAElE,QAAO;EACL;EACA,8BAHgB,yBAAyB,aAGF;EACvC;EACD,CAAC,KAAK,KAAK;;AAGd,SAAgB,kCAA0C;AACxD,QAAO;EACL;EACA;EACA;EACD,CAAC,KAAK,KAAK;;AAGd,SAAgB,oBAAoB,SAAoC;AACtE,KAAI,CAAC,QACH,QAAO;CAET,MAAM,QAAkB,EAAE;AAC1B,KAAI,QAAQ,QAAS,OAAM,KAAK,SAAS,QAAQ,UAAU;AAC3D,KAAI,QAAQ,QAAS,OAAM,KAAK,IAAI,QAAQ,UAAU;AACtD,KAAI,QAAQ,MAAO,OAAM,KAAK,SAAS,QAAQ,MAAM,MAAM,IAAI,CAAC,KAAK,IAAI,QAAQ,QAAQ;AACzF,KAAI,QAAQ,QAAS,OAAM,KAAK,WAAW,QAAQ,UAAU;AAC7D,KAAI,QAAQ,gBAAgB,QAAQ,aAAa,SAAS,EACxD,OAAM,KAAK,gBAAgB,QAAQ,aAAa,KAAK,IAAI,GAAG;AAE9D,KAAI,QAAQ,cAAe,OAAM,KAAK,YAAY,QAAQ,gBAAgB;AAC1E,KAAI,MAAM,WAAW,EACnB,QAAO;AAET,QAAO,CAAC,cAAc,YAAY,MAAM,KAAK,MAAM,GAAG,CAAC,KAAK,KAAK"}
@@ -6,6 +6,8 @@
6
6
  import type { Config } from '../../config/schema.js';
7
7
  import type { EmbeddedContextFile } from '../bootstrap/types.js';
8
8
  import type { SkillManager } from '../skills/skill-manager.js';
9
+ import type { PromptMode, SilentReplyPromptMode } from './types.js';
10
+ import type { ProviderSystemPromptContribution } from './contribution.js';
9
11
  export interface SystemPromptBuildOptions {
10
12
  externalMemoryInstructions?: string;
11
13
  workspaceOverride?: string;
@@ -14,6 +16,15 @@ export interface SystemPromptBuildOptions {
14
16
  skillPromptText?: string;
15
17
  skillAllowlist?: string[];
16
18
  registeredToolNames?: string[];
19
+ toolSummaries?: Record<string, string>;
20
+ sessionKey?: string;
21
+ promptMode?: PromptMode;
22
+ modelRef?: string;
23
+ agentId?: string;
24
+ thinkingLevel?: string;
25
+ extraSystemPrompt?: string;
26
+ silentReplyPromptMode?: SilentReplyPromptMode;
27
+ promptContribution?: ProviderSystemPromptContribution;
17
28
  }
18
29
  export interface SystemPromptBuilderConfig {
19
30
  workspace: string;
@@ -34,6 +45,8 @@ export declare class SystemPromptBuilder {
34
45
  externalMemoryInstructions?: string;
35
46
  workspaceOverride?: string;
36
47
  profileMarkdownPathRoot?: string;
48
+ registeredToolNames?: string[];
49
+ sessionKey?: string;
37
50
  }): string;
38
51
  }
39
52
  export declare function createSystemPromptBuilder(config: SystemPromptBuilderConfig): SystemPromptBuilder;
@@ -3,11 +3,12 @@ import { createLogger } from "../../utils/logger/index.js";
3
3
  import { init_logger } from "../../utils/logger.js";
4
4
  import { init_paths } from "../../config/paths.js";
5
5
  import { DEFAULT_USER_FILENAME } from "../context/workspace.js";
6
+ import { resolveSystemPromptBuildParams } from "./system-prompt-params.js";
7
+ import { buildSystemPrompt } from "./system-prompt.js";
6
8
  import { createSkillConfigManager } from "../skills/config.js";
7
9
  import { buildTtsSystemPromptHint } from "../../voice/tts/directives.js";
8
10
  import { mergeTtsConfigFromAppConfig } from "../../voice/tts/merge-config.js";
9
11
  import { selectSkillsVisibleInPrompt } from "../skills/format-skills-prompt.js";
10
- import { buildSystemPrompt } from "./system-prompt.js";
11
12
  import { join } from "node:path";
12
13
  import { existsSync, readFileSync } from "node:fs";
13
14
  //#region src/agent/prompt/service-prompt-builder.ts
@@ -63,16 +64,42 @@ var SystemPromptBuilder = class {
63
64
  modelOverrides: ttsMerged.modelOverrides,
64
65
  textToSpeechTool: ttsMerged.enabled && reg.includes("text_to_speech")
65
66
  });
66
- const basePrompt = buildSystemPrompt(ws, {
67
- contextFiles,
68
- heartbeatEnabled,
69
- availableTools: this.getSkillNamesForSkillsSection({
70
- skillAllowlist: options.skillAllowlist,
71
- registeredToolNames: options.registeredToolNames
72
- }),
67
+ const resolved = resolveSystemPromptBuildParams(this.config, {
68
+ workspaceDir: ws,
69
+ sessionKey: options.sessionKey,
70
+ toolNames: options.registeredToolNames,
71
+ toolSummaries: options.toolSummaries,
73
72
  userTimezone,
74
73
  externalMemoryInstructions: options.externalMemoryInstructions,
75
- ttsSystemHint
74
+ heartbeatEnabled,
75
+ ttsSystemHint,
76
+ extraSystemPrompt: options.extraSystemPrompt,
77
+ modelRef: options.modelRef,
78
+ agentId: options.agentId,
79
+ thinkingLevel: options.thinkingLevel,
80
+ promptMode: options.promptMode,
81
+ silentReplyPromptMode: options.silentReplyPromptMode,
82
+ promptContribution: options.promptContribution
83
+ });
84
+ const basePrompt = buildSystemPrompt(ws, {
85
+ contextFiles,
86
+ promptMode: resolved.promptMode,
87
+ heartbeatEnabled: resolved.heartbeatEnabled,
88
+ heartbeatPrompt: resolved.heartbeatPrompt,
89
+ toolNames: resolved.toolNames,
90
+ toolSummaries: resolved.toolSummaries,
91
+ memoryCitationsMode: resolved.memoryCitationsMode,
92
+ includeMemorySection: resolved.includeMemorySection,
93
+ userTimezone: resolved.userTimezone,
94
+ runtime: resolved.runtimeInfo,
95
+ channels: resolved.channels,
96
+ externalMemoryInstructions: resolved.externalMemoryInstructions,
97
+ ttsSystemHint: resolved.ttsSystemHint,
98
+ extraSystemPrompt: resolved.extraSystemPrompt,
99
+ silentReplyPromptMode: resolved.silentReplyPromptMode,
100
+ promptContribution: resolved.promptContribution,
101
+ includeProblemSolving: resolved.includeProblemSolving,
102
+ includeToneSection: resolved.includeToneSection
76
103
  });
77
104
  const skillPrompt = options.skillPromptText !== void 0 ? options.skillPromptText : this.skillManager.getPromptForSkillAllowlist(options.skillAllowlist, options.registeredToolNames);
78
105
  const fullPrompt = skillPrompt ? `${basePrompt}\n\n${skillPrompt}` : basePrompt;
@@ -80,7 +107,9 @@ var SystemPromptBuilder = class {
80
107
  baseLength: basePrompt.length,
81
108
  skillLength: skillPrompt?.length || 0,
82
109
  totalLength: fullPrompt.length,
83
- contextFileCount: contextFiles.length
110
+ contextFileCount: contextFiles.length,
111
+ promptMode: resolved.promptMode,
112
+ toolCount: resolved.toolNames?.length ?? 0
84
113
  }, "System prompt built");
85
114
  return fullPrompt;
86
115
  }
@@ -113,11 +142,23 @@ var SystemPromptBuilder = class {
113
142
  getBasePrompt(contextFiles, options) {
114
143
  const ws = options?.workspaceOverride ?? this.workspace;
115
144
  const profilePathRoot = options?.profileMarkdownPathRoot ?? ws;
145
+ const resolved = resolveSystemPromptBuildParams(this.config, {
146
+ workspaceDir: ws,
147
+ sessionKey: options?.sessionKey,
148
+ toolNames: options?.registeredToolNames,
149
+ userTimezone: this.extractTimezone(contextFiles, profilePathRoot),
150
+ externalMemoryInstructions: options?.externalMemoryInstructions,
151
+ heartbeatEnabled: this.config.gateway?.heartbeat?.includeSystemPromptSection ?? false
152
+ });
116
153
  return buildSystemPrompt(ws, {
117
154
  contextFiles,
118
- heartbeatEnabled: this.config.gateway?.heartbeat?.includeSystemPromptSection ?? false,
119
- userTimezone: this.extractTimezone(contextFiles, profilePathRoot),
120
- externalMemoryInstructions: options?.externalMemoryInstructions
155
+ promptMode: resolved.promptMode,
156
+ heartbeatEnabled: resolved.heartbeatEnabled,
157
+ toolNames: resolved.toolNames,
158
+ userTimezone: resolved.userTimezone,
159
+ runtime: resolved.runtimeInfo,
160
+ channels: resolved.channels,
161
+ externalMemoryInstructions: resolved.externalMemoryInstructions
121
162
  });
122
163
  }
123
164
  };
@@ -1 +1 @@
1
- {"version":3,"file":"service-prompt-builder.js","names":["buildBaseSystemPrompt"],"sources":["../../../../src/agent/prompt/service-prompt-builder.ts"],"sourcesContent":["/**\n * System Prompt Builder - Builds the complete system prompt\n *\n * Combines base system prompt with skill prompts and bootstrap Project Context.\n */\n\nimport { readFileSync, existsSync } from 'node:fs';\nimport { join } from 'node:path';\n\nimport type { Config } from '../../config/schema.js';\nimport type { EmbeddedContextFile } from '../bootstrap/types.js';\nimport { DEFAULT_USER_FILENAME } from '../context/workspace.js';\nimport type { SkillManager } from '../skills/skill-manager.js';\nimport { createSkillConfigManager } from '../skills/config.js';\nimport { selectSkillsVisibleInPrompt } from '../skills/format-skills-prompt.js';\nimport { resolveStateDir } from '../../config/paths.js';\nimport { buildSystemPrompt as buildBaseSystemPrompt } from './system-prompt.js';\nimport { mergeTtsConfigFromAppConfig } from '../../voice/tts/merge-config.js';\nimport { buildTtsSystemPromptHint } from '../../voice/tts/directives.js';\nimport { createLogger } from '../../utils/logger.js';\n\nconst log = createLogger('SystemPromptBuilder');\n\nexport interface SystemPromptBuildOptions {\n externalMemoryInstructions?: string;\n workspaceOverride?: string;\n profileMarkdownPathRoot?: string;\n systemPromptOverride?: string;\n skillPromptText?: string;\n skillAllowlist?: string[];\n registeredToolNames?: string[];\n}\n\nexport interface SystemPromptBuilderConfig {\n workspace: string;\n config: Config;\n skillManager: SkillManager;\n}\n\nexport class SystemPromptBuilder {\n private workspace: string;\n private config: Config;\n private skillManager: SkillManager;\n\n constructor(config: SystemPromptBuilderConfig) {\n this.workspace = config.workspace;\n this.config = config.config;\n this.skillManager = config.skillManager;\n }\n\n build(contextFiles: EmbeddedContextFile[], options: SystemPromptBuildOptions): string {\n const ws = options.workspaceOverride ?? this.workspace;\n const profilePathRoot = options.profileMarkdownPathRoot ?? ws;\n\n if (options.systemPromptOverride?.trim()) {\n const skillPrompt =\n options.skillPromptText !== undefined\n ? options.skillPromptText\n : this.skillManager.getPromptForSkillAllowlist(\n options.skillAllowlist,\n options.registeredToolNames,\n );\n const trimmed = options.systemPromptOverride.trim();\n let fullPrompt = skillPrompt.trim() ? `${trimmed}\\n\\n${skillPrompt}` : trimmed;\n const ttsMerged = mergeTtsConfigFromAppConfig(this.config.messages?.tts);\n const reg = options.registeredToolNames ?? [];\n const ttsHint = buildTtsSystemPromptHint({\n enabled: ttsMerged.enabled,\n trigger: ttsMerged.trigger,\n maxTextLength: ttsMerged.maxTextLength,\n modelOverrides: ttsMerged.modelOverrides,\n textToSpeechTool: ttsMerged.enabled && reg.includes('text_to_speech'),\n });\n if (ttsHint?.trim()) {\n fullPrompt = `${fullPrompt}\\n\\n## Voice (TTS)\\n\\n${ttsHint.trim()}`;\n }\n log.debug({ baseLength: trimmed.length, skillLength: skillPrompt.length, totalLength: fullPrompt.length }, 'System prompt built (override)');\n return fullPrompt;\n }\n\n const heartbeatEnabled = this.config.gateway?.heartbeat?.includeSystemPromptSection ?? false;\n const userTimezone = this.extractTimezone(contextFiles, profilePathRoot);\n\n const ttsMerged = mergeTtsConfigFromAppConfig(this.config.messages?.tts);\n const reg = options.registeredToolNames ?? [];\n const ttsSystemHint = buildTtsSystemPromptHint({\n enabled: ttsMerged.enabled,\n trigger: ttsMerged.trigger,\n maxTextLength: ttsMerged.maxTextLength,\n modelOverrides: ttsMerged.modelOverrides,\n textToSpeechTool: ttsMerged.enabled && reg.includes('text_to_speech'),\n });\n\n const basePrompt = buildBaseSystemPrompt(ws, {\n contextFiles,\n heartbeatEnabled,\n availableTools: this.getSkillNamesForSkillsSection({\n skillAllowlist: options.skillAllowlist,\n registeredToolNames: options.registeredToolNames,\n }),\n userTimezone,\n externalMemoryInstructions: options.externalMemoryInstructions,\n ttsSystemHint,\n });\n\n const skillPrompt =\n options.skillPromptText !== undefined\n ? options.skillPromptText\n : this.skillManager.getPromptForSkillAllowlist(\n options.skillAllowlist,\n options.registeredToolNames,\n );\n\n const fullPrompt = skillPrompt ? `${basePrompt}\\n\\n${skillPrompt}` : basePrompt;\n\n log.debug(\n {\n baseLength: basePrompt.length,\n skillLength: skillPrompt?.length || 0,\n totalLength: fullPrompt.length,\n contextFileCount: contextFiles.length,\n },\n 'System prompt built',\n );\n\n return fullPrompt;\n }\n\n rebuild(contextFiles: EmbeddedContextFile[], options: SystemPromptBuildOptions): string {\n this.skillManager.reload();\n return this.build(contextFiles, options);\n }\n\n private extractTimezone(contextFiles: EmbeddedContextFile[], profilePathRoot: string): string | undefined {\n const userContext = contextFiles.find((file) =>\n file.path.replace(/\\\\/g, '/').toLowerCase().endsWith('/user.md'),\n );\n if (userContext?.content) {\n const match = userContext.content.match(/Timezone:\\s*(.+)/i);\n if (match) {\n return match[1].trim();\n }\n }\n\n const primaryPath = join(profilePathRoot, DEFAULT_USER_FILENAME);\n if (existsSync(primaryPath)) {\n try {\n const raw = readFileSync(primaryPath, 'utf-8');\n const match = raw.match(/Timezone:\\s*(.+)/i);\n if (match) {\n return match[1].trim();\n }\n } catch {\n /* ignore */\n }\n }\n\n return undefined;\n }\n\n private getSkillNamesForSkillsSection(options?: {\n skillAllowlist?: string[];\n registeredToolNames?: string[];\n }): string[] {\n const skillsConfig = createSkillConfigManager(resolveStateDir()).load();\n return selectSkillsVisibleInPrompt(this.skillManager.getSkills(), skillsConfig, {\n skillAllowlist: options?.skillAllowlist,\n registeredToolNames: options?.registeredToolNames,\n }).map((s) => s.name);\n }\n\n getSkillPrompt(): string {\n return this.skillManager.getPrompt();\n }\n\n getBasePrompt(\n contextFiles: EmbeddedContextFile[],\n options?: {\n externalMemoryInstructions?: string;\n workspaceOverride?: string;\n profileMarkdownPathRoot?: string;\n },\n ): string {\n const ws = options?.workspaceOverride ?? this.workspace;\n const profilePathRoot = options?.profileMarkdownPathRoot ?? ws;\n return buildBaseSystemPrompt(ws, {\n contextFiles,\n heartbeatEnabled: this.config.gateway?.heartbeat?.includeSystemPromptSection ?? false,\n userTimezone: this.extractTimezone(contextFiles, profilePathRoot),\n externalMemoryInstructions: options?.externalMemoryInstructions,\n });\n }\n}\n\nexport function createSystemPromptBuilder(config: SystemPromptBuilderConfig): SystemPromptBuilder {\n return new SystemPromptBuilder(config);\n}\n\nexport type { SystemPromptBuilderConfig as SystemPromptConfig };\nexport type { SystemPromptBuilderConfig as SystemPromptBuilderOptions };\n"],"mappings":";;;;;;;;;;;;;;;;;;YAewD;aAIH;AAErD,MAAM,MAAM,aAAa,sBAAsB;AAkB/C,IAAa,sBAAb,MAAiC;CAC/B;CACA;CACA;CAEA,YAAY,QAAmC;AAC7C,OAAK,YAAY,OAAO;AACxB,OAAK,SAAS,OAAO;AACrB,OAAK,eAAe,OAAO;;CAG7B,MAAM,cAAqC,SAA2C;EACpF,MAAM,KAAK,QAAQ,qBAAqB,KAAK;EAC7C,MAAM,kBAAkB,QAAQ,2BAA2B;AAE3D,MAAI,QAAQ,sBAAsB,MAAM,EAAE;GACxC,MAAM,cACJ,QAAQ,oBAAoB,KAAA,IACxB,QAAQ,kBACR,KAAK,aAAa,2BAChB,QAAQ,gBACR,QAAQ,oBACT;GACP,MAAM,UAAU,QAAQ,qBAAqB,MAAM;GACnD,IAAI,aAAa,YAAY,MAAM,GAAG,GAAG,QAAQ,MAAM,gBAAgB;GACvE,MAAM,YAAY,4BAA4B,KAAK,OAAO,UAAU,IAAI;GACxE,MAAM,MAAM,QAAQ,uBAAuB,EAAE;GAC7C,MAAM,UAAU,yBAAyB;IACvC,SAAS,UAAU;IACnB,SAAS,UAAU;IACnB,eAAe,UAAU;IACzB,gBAAgB,UAAU;IAC1B,kBAAkB,UAAU,WAAW,IAAI,SAAS,iBAAiB;IACtE,CAAC;AACF,OAAI,SAAS,MAAM,CACjB,cAAa,GAAG,WAAW,wBAAwB,QAAQ,MAAM;AAEnE,OAAI,MAAM;IAAE,YAAY,QAAQ;IAAQ,aAAa,YAAY;IAAQ,aAAa,WAAW;IAAQ,EAAE,iCAAiC;AAC5I,UAAO;;EAGT,MAAM,mBAAmB,KAAK,OAAO,SAAS,WAAW,8BAA8B;EACvF,MAAM,eAAe,KAAK,gBAAgB,cAAc,gBAAgB;EAExE,MAAM,YAAY,4BAA4B,KAAK,OAAO,UAAU,IAAI;EACxE,MAAM,MAAM,QAAQ,uBAAuB,EAAE;EAC7C,MAAM,gBAAgB,yBAAyB;GAC7C,SAAS,UAAU;GACnB,SAAS,UAAU;GACnB,eAAe,UAAU;GACzB,gBAAgB,UAAU;GAC1B,kBAAkB,UAAU,WAAW,IAAI,SAAS,iBAAiB;GACtE,CAAC;EAEF,MAAM,aAAaA,kBAAsB,IAAI;GAC3C;GACA;GACA,gBAAgB,KAAK,8BAA8B;IACjD,gBAAgB,QAAQ;IACxB,qBAAqB,QAAQ;IAC9B,CAAC;GACF;GACA,4BAA4B,QAAQ;GACpC;GACD,CAAC;EAEF,MAAM,cACJ,QAAQ,oBAAoB,KAAA,IACxB,QAAQ,kBACR,KAAK,aAAa,2BAChB,QAAQ,gBACR,QAAQ,oBACT;EAEP,MAAM,aAAa,cAAc,GAAG,WAAW,MAAM,gBAAgB;AAErE,MAAI,MACF;GACE,YAAY,WAAW;GACvB,aAAa,aAAa,UAAU;GACpC,aAAa,WAAW;GACxB,kBAAkB,aAAa;GAChC,EACD,sBACD;AAED,SAAO;;CAGT,QAAQ,cAAqC,SAA2C;AACtF,OAAK,aAAa,QAAQ;AAC1B,SAAO,KAAK,MAAM,cAAc,QAAQ;;CAG1C,gBAAwB,cAAqC,iBAA6C;EACxG,MAAM,cAAc,aAAa,MAAM,SACrC,KAAK,KAAK,QAAQ,OAAO,IAAI,CAAC,aAAa,CAAC,SAAS,WAAW,CACjE;AACD,MAAI,aAAa,SAAS;GACxB,MAAM,QAAQ,YAAY,QAAQ,MAAM,oBAAoB;AAC5D,OAAI,MACF,QAAO,MAAM,GAAG,MAAM;;EAI1B,MAAM,cAAc,KAAK,iBAAiB,sBAAsB;AAChE,MAAI,WAAW,YAAY,CACzB,KAAI;GAEF,MAAM,QADM,aAAa,aAAa,QACrB,CAAC,MAAM,oBAAoB;AAC5C,OAAI,MACF,QAAO,MAAM,GAAG,MAAM;UAElB;;CAQZ,8BAAsC,SAGzB;EACX,MAAM,eAAe,yBAAyB,iBAAiB,CAAC,CAAC,MAAM;AACvE,SAAO,4BAA4B,KAAK,aAAa,WAAW,EAAE,cAAc;GAC9E,gBAAgB,SAAS;GACzB,qBAAqB,SAAS;GAC/B,CAAC,CAAC,KAAK,MAAM,EAAE,KAAK;;CAGvB,iBAAyB;AACvB,SAAO,KAAK,aAAa,WAAW;;CAGtC,cACE,cACA,SAKQ;EACR,MAAM,KAAK,SAAS,qBAAqB,KAAK;EAC9C,MAAM,kBAAkB,SAAS,2BAA2B;AAC5D,SAAOA,kBAAsB,IAAI;GAC/B;GACA,kBAAkB,KAAK,OAAO,SAAS,WAAW,8BAA8B;GAChF,cAAc,KAAK,gBAAgB,cAAc,gBAAgB;GACjE,4BAA4B,SAAS;GACtC,CAAC;;;AAIN,SAAgB,0BAA0B,QAAwD;AAChG,QAAO,IAAI,oBAAoB,OAAO"}
1
+ {"version":3,"file":"service-prompt-builder.js","names":["buildBaseSystemPrompt"],"sources":["../../../../src/agent/prompt/service-prompt-builder.ts"],"sourcesContent":["/**\n * System Prompt Builder - Builds the complete system prompt\n *\n * Combines base system prompt with skill prompts and bootstrap Project Context.\n */\n\nimport { readFileSync, existsSync } from 'node:fs';\nimport { join } from 'node:path';\n\nimport type { Config } from '../../config/schema.js';\nimport type { EmbeddedContextFile } from '../bootstrap/types.js';\nimport { DEFAULT_USER_FILENAME } from '../context/workspace.js';\nimport type { SkillManager } from '../skills/skill-manager.js';\nimport { createSkillConfigManager } from '../skills/config.js';\nimport { selectSkillsVisibleInPrompt } from '../skills/format-skills-prompt.js';\nimport { resolveStateDir } from '../../config/paths.js';\nimport { buildSystemPrompt as buildBaseSystemPrompt } from './system-prompt.js';\nimport { resolveSystemPromptBuildParams } from './system-prompt-params.js';\nimport type { PromptMode, SilentReplyPromptMode } from './types.js';\nimport type { ProviderSystemPromptContribution } from './contribution.js';\nimport { mergeTtsConfigFromAppConfig } from '../../voice/tts/merge-config.js';\nimport { buildTtsSystemPromptHint } from '../../voice/tts/directives.js';\nimport { createLogger } from '../../utils/logger.js';\n\nconst log = createLogger('SystemPromptBuilder');\n\nexport interface SystemPromptBuildOptions {\n externalMemoryInstructions?: string;\n workspaceOverride?: string;\n profileMarkdownPathRoot?: string;\n systemPromptOverride?: string;\n skillPromptText?: string;\n skillAllowlist?: string[];\n registeredToolNames?: string[];\n toolSummaries?: Record<string, string>;\n sessionKey?: string;\n promptMode?: PromptMode;\n modelRef?: string;\n agentId?: string;\n thinkingLevel?: string;\n extraSystemPrompt?: string;\n silentReplyPromptMode?: SilentReplyPromptMode;\n promptContribution?: ProviderSystemPromptContribution;\n}\n\nexport interface SystemPromptBuilderConfig {\n workspace: string;\n config: Config;\n skillManager: SkillManager;\n}\n\nexport class SystemPromptBuilder {\n private workspace: string;\n private config: Config;\n private skillManager: SkillManager;\n\n constructor(config: SystemPromptBuilderConfig) {\n this.workspace = config.workspace;\n this.config = config.config;\n this.skillManager = config.skillManager;\n }\n\n build(contextFiles: EmbeddedContextFile[], options: SystemPromptBuildOptions): string {\n const ws = options.workspaceOverride ?? this.workspace;\n const profilePathRoot = options.profileMarkdownPathRoot ?? ws;\n\n if (options.systemPromptOverride?.trim()) {\n const skillPrompt =\n options.skillPromptText !== undefined\n ? options.skillPromptText\n : this.skillManager.getPromptForSkillAllowlist(\n options.skillAllowlist,\n options.registeredToolNames,\n );\n const trimmed = options.systemPromptOverride.trim();\n let fullPrompt = skillPrompt.trim() ? `${trimmed}\\n\\n${skillPrompt}` : trimmed;\n const ttsMerged = mergeTtsConfigFromAppConfig(this.config.messages?.tts);\n const reg = options.registeredToolNames ?? [];\n const ttsHint = buildTtsSystemPromptHint({\n enabled: ttsMerged.enabled,\n trigger: ttsMerged.trigger,\n maxTextLength: ttsMerged.maxTextLength,\n modelOverrides: ttsMerged.modelOverrides,\n textToSpeechTool: ttsMerged.enabled && reg.includes('text_to_speech'),\n });\n if (ttsHint?.trim()) {\n fullPrompt = `${fullPrompt}\\n\\n## Voice (TTS)\\n\\n${ttsHint.trim()}`;\n }\n log.debug({ baseLength: trimmed.length, skillLength: skillPrompt.length, totalLength: fullPrompt.length }, 'System prompt built (override)');\n return fullPrompt;\n }\n\n const heartbeatEnabled = this.config.gateway?.heartbeat?.includeSystemPromptSection ?? false;\n const userTimezone = this.extractTimezone(contextFiles, profilePathRoot);\n\n const ttsMerged = mergeTtsConfigFromAppConfig(this.config.messages?.tts);\n const reg = options.registeredToolNames ?? [];\n const ttsSystemHint = buildTtsSystemPromptHint({\n enabled: ttsMerged.enabled,\n trigger: ttsMerged.trigger,\n maxTextLength: ttsMerged.maxTextLength,\n modelOverrides: ttsMerged.modelOverrides,\n textToSpeechTool: ttsMerged.enabled && reg.includes('text_to_speech'),\n });\n\n const resolved = resolveSystemPromptBuildParams(this.config, {\n workspaceDir: ws,\n sessionKey: options.sessionKey,\n toolNames: options.registeredToolNames,\n toolSummaries: options.toolSummaries,\n userTimezone,\n externalMemoryInstructions: options.externalMemoryInstructions,\n heartbeatEnabled,\n ttsSystemHint,\n extraSystemPrompt: options.extraSystemPrompt,\n modelRef: options.modelRef,\n agentId: options.agentId,\n thinkingLevel: options.thinkingLevel,\n promptMode: options.promptMode,\n silentReplyPromptMode: options.silentReplyPromptMode,\n promptContribution: options.promptContribution,\n });\n\n const basePrompt = buildBaseSystemPrompt(ws, {\n contextFiles,\n promptMode: resolved.promptMode,\n heartbeatEnabled: resolved.heartbeatEnabled,\n heartbeatPrompt: resolved.heartbeatPrompt,\n toolNames: resolved.toolNames,\n toolSummaries: resolved.toolSummaries,\n memoryCitationsMode: resolved.memoryCitationsMode,\n includeMemorySection: resolved.includeMemorySection,\n userTimezone: resolved.userTimezone,\n runtime: resolved.runtimeInfo,\n channels: resolved.channels,\n externalMemoryInstructions: resolved.externalMemoryInstructions,\n ttsSystemHint: resolved.ttsSystemHint,\n extraSystemPrompt: resolved.extraSystemPrompt,\n silentReplyPromptMode: resolved.silentReplyPromptMode,\n promptContribution: resolved.promptContribution,\n includeProblemSolving: resolved.includeProblemSolving,\n includeToneSection: resolved.includeToneSection,\n });\n\n const skillPrompt =\n options.skillPromptText !== undefined\n ? options.skillPromptText\n : this.skillManager.getPromptForSkillAllowlist(\n options.skillAllowlist,\n options.registeredToolNames,\n );\n\n const fullPrompt = skillPrompt ? `${basePrompt}\\n\\n${skillPrompt}` : basePrompt;\n\n log.debug(\n {\n baseLength: basePrompt.length,\n skillLength: skillPrompt?.length || 0,\n totalLength: fullPrompt.length,\n contextFileCount: contextFiles.length,\n promptMode: resolved.promptMode,\n toolCount: resolved.toolNames?.length ?? 0,\n },\n 'System prompt built',\n );\n\n return fullPrompt;\n }\n\n rebuild(contextFiles: EmbeddedContextFile[], options: SystemPromptBuildOptions): string {\n this.skillManager.reload();\n return this.build(contextFiles, options);\n }\n\n private extractTimezone(contextFiles: EmbeddedContextFile[], profilePathRoot: string): string | undefined {\n const userContext = contextFiles.find((file) =>\n file.path.replace(/\\\\/g, '/').toLowerCase().endsWith('/user.md'),\n );\n if (userContext?.content) {\n const match = userContext.content.match(/Timezone:\\s*(.+)/i);\n if (match) {\n return match[1].trim();\n }\n }\n\n const primaryPath = join(profilePathRoot, DEFAULT_USER_FILENAME);\n if (existsSync(primaryPath)) {\n try {\n const raw = readFileSync(primaryPath, 'utf-8');\n const match = raw.match(/Timezone:\\s*(.+)/i);\n if (match) {\n return match[1].trim();\n }\n } catch {\n /* ignore */\n }\n }\n\n return undefined;\n }\n\n private getSkillNamesForSkillsSection(options?: {\n skillAllowlist?: string[];\n registeredToolNames?: string[];\n }): string[] {\n const skillsConfig = createSkillConfigManager(resolveStateDir()).load();\n return selectSkillsVisibleInPrompt(this.skillManager.getSkills(), skillsConfig, {\n skillAllowlist: options?.skillAllowlist,\n registeredToolNames: options?.registeredToolNames,\n }).map((s) => s.name);\n }\n\n getSkillPrompt(): string {\n return this.skillManager.getPrompt();\n }\n\n getBasePrompt(\n contextFiles: EmbeddedContextFile[],\n options?: {\n externalMemoryInstructions?: string;\n workspaceOverride?: string;\n profileMarkdownPathRoot?: string;\n registeredToolNames?: string[];\n sessionKey?: string;\n },\n ): string {\n const ws = options?.workspaceOverride ?? this.workspace;\n const profilePathRoot = options?.profileMarkdownPathRoot ?? ws;\n const resolved = resolveSystemPromptBuildParams(this.config, {\n workspaceDir: ws,\n sessionKey: options?.sessionKey,\n toolNames: options?.registeredToolNames,\n userTimezone: this.extractTimezone(contextFiles, profilePathRoot),\n externalMemoryInstructions: options?.externalMemoryInstructions,\n heartbeatEnabled: this.config.gateway?.heartbeat?.includeSystemPromptSection ?? false,\n });\n return buildBaseSystemPrompt(ws, {\n contextFiles,\n promptMode: resolved.promptMode,\n heartbeatEnabled: resolved.heartbeatEnabled,\n toolNames: resolved.toolNames,\n userTimezone: resolved.userTimezone,\n runtime: resolved.runtimeInfo,\n channels: resolved.channels,\n externalMemoryInstructions: resolved.externalMemoryInstructions,\n });\n }\n}\n\nexport function createSystemPromptBuilder(config: SystemPromptBuilderConfig): SystemPromptBuilder {\n return new SystemPromptBuilder(config);\n}\n\nexport type { SystemPromptBuilderConfig as SystemPromptConfig };\nexport type { SystemPromptBuilderConfig as SystemPromptBuilderOptions };\n"],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ export declare function buildSubagentContextSection(params: {
2
+ goal: string;
3
+ context?: string;
4
+ workspace?: string;
5
+ requesterSessionKey?: string;
6
+ childSessionKey?: string;
7
+ }): string;
8
+ export declare function buildSubagentSystemPrompt(params: {
9
+ goal: string;
10
+ context?: string;
11
+ workspace?: string;
12
+ requesterSessionKey?: string;
13
+ childSessionKey?: string;
14
+ toolNames?: string[];
15
+ }): string;
@@ -0,0 +1,68 @@
1
+ import { NO_REPLY } from "../../heartbeat/tokens.js";
2
+ import { buildSystemPrompt } from "./system-prompt.js";
3
+ //#region src/agent/prompt/subagent-context.ts
4
+ function buildSubagentContextSection(params) {
5
+ const taskBody = params.goal.trim();
6
+ const lines = [
7
+ "# Subagent Context",
8
+ "",
9
+ "You are a **sub-agent** spawned by the parent agent for a specific task.",
10
+ "",
11
+ ...taskBody.includes("\n") ? [
12
+ "## Your Role",
13
+ "- You were created to handle the following task (verbatim; line breaks preserved):",
14
+ "",
15
+ "```",
16
+ taskBody,
17
+ "```",
18
+ "- Complete this task. That's your entire purpose.",
19
+ "- You are NOT the parent agent. Don't try to be."
20
+ ] : [
21
+ "## Your Role",
22
+ `- You were created to handle: ${taskBody}`,
23
+ "- Complete this task. That's your entire purpose.",
24
+ "- You are NOT the parent agent. Don't try to be."
25
+ ],
26
+ "",
27
+ "## Rules",
28
+ "1. **Stay focused** - Do your assigned task, nothing else",
29
+ "2. **Complete the task** - Your final message will be automatically reported to the parent agent",
30
+ "3. **Don't initiate** - No heartbeats, no proactive actions, no side quests",
31
+ "4. **Be ephemeral** - You may be terminated after task completion",
32
+ "5. **Trust push-based completion** - Do not busy-poll for parent status",
33
+ "6. **Recover from truncated tool output** - Re-read only what you need using smaller chunks",
34
+ "",
35
+ "## Output Format",
36
+ "When complete, your final response should include:",
37
+ "- What you accomplished or found",
38
+ "- Any relevant details the parent agent should know",
39
+ "- Keep it concise but informative",
40
+ "",
41
+ "## What You DON'T Do",
42
+ "- NO user conversations (that is the parent agent's job)",
43
+ "- NO external messages unless explicitly tasked with a specific recipient/channel",
44
+ "- NO cron jobs or persistent state",
45
+ "- Only use `send_message` when explicitly instructed to contact a specific external recipient",
46
+ "",
47
+ "## Sub-Agent Spawning",
48
+ "You are a leaf worker for this delegation. Do NOT spawn further sub-agents unless `delegate_task` is explicitly available and the parent task requires it.",
49
+ ""
50
+ ];
51
+ if (params.context?.trim()) lines.push("## Context", params.context.trim(), "");
52
+ if (params.workspace?.trim()) lines.push(`Workspace: ${params.workspace.trim()}`, "");
53
+ if (params.requesterSessionKey || params.childSessionKey) lines.push("## Session Context", ...params.requesterSessionKey ? [`- Requester session: ${params.requesterSessionKey}`] : [], ...params.childSessionKey ? [`- Your session: ${params.childSessionKey}`] : [], "");
54
+ lines.push(`If a completion event arrives AFTER you already sent your final answer, reply ONLY with ${NO_REPLY}.`);
55
+ return lines.filter(Boolean).join("\n");
56
+ }
57
+ function buildSubagentSystemPrompt(params) {
58
+ const extra = buildSubagentContextSection(params);
59
+ return buildSystemPrompt(params.workspace ?? ".", {
60
+ promptMode: "minimal",
61
+ toolNames: params.toolNames,
62
+ extraSystemPrompt: extra
63
+ });
64
+ }
65
+ //#endregion
66
+ export { buildSubagentContextSection, buildSubagentSystemPrompt };
67
+
68
+ //# sourceMappingURL=subagent-context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"subagent-context.js","names":[],"sources":["../../../../src/agent/prompt/subagent-context.ts"],"sourcesContent":["import { NO_REPLY } from '../../heartbeat/tokens.js';\nimport { buildSystemPrompt } from './system-prompt.js';\n\nexport function buildSubagentContextSection(params: {\n goal: string;\n context?: string;\n workspace?: string;\n requesterSessionKey?: string;\n childSessionKey?: string;\n}): string {\n const taskBody = params.goal.trim();\n const roleLines =\n taskBody.includes('\\n')\n ? [\n '## Your Role',\n '- You were created to handle the following task (verbatim; line breaks preserved):',\n '',\n '```',\n taskBody,\n '```',\n \"- Complete this task. That's your entire purpose.\",\n '- You are NOT the parent agent. Don\\'t try to be.',\n ]\n : [\n '## Your Role',\n `- You were created to handle: ${taskBody}`,\n \"- Complete this task. That's your entire purpose.\",\n '- You are NOT the parent agent. Don\\'t try to be.',\n ];\n\n const lines = [\n '# Subagent Context',\n '',\n 'You are a **sub-agent** spawned by the parent agent for a specific task.',\n '',\n ...roleLines,\n '',\n '## Rules',\n '1. **Stay focused** - Do your assigned task, nothing else',\n '2. **Complete the task** - Your final message will be automatically reported to the parent agent',\n '3. **Don\\'t initiate** - No heartbeats, no proactive actions, no side quests',\n '4. **Be ephemeral** - You may be terminated after task completion',\n '5. **Trust push-based completion** - Do not busy-poll for parent status',\n '6. **Recover from truncated tool output** - Re-read only what you need using smaller chunks',\n '',\n '## Output Format',\n 'When complete, your final response should include:',\n '- What you accomplished or found',\n '- Any relevant details the parent agent should know',\n '- Keep it concise but informative',\n '',\n '## What You DON\\'T Do',\n '- NO user conversations (that is the parent agent\\'s job)',\n '- NO external messages unless explicitly tasked with a specific recipient/channel',\n '- NO cron jobs or persistent state',\n '- Only use `send_message` when explicitly instructed to contact a specific external recipient',\n '',\n '## Sub-Agent Spawning',\n 'You are a leaf worker for this delegation. Do NOT spawn further sub-agents unless `delegate_task` is explicitly available and the parent task requires it.',\n '',\n ];\n\n if (params.context?.trim()) {\n lines.push('## Context', params.context.trim(), '');\n }\n if (params.workspace?.trim()) {\n lines.push(`Workspace: ${params.workspace.trim()}`, '');\n }\n if (params.requesterSessionKey || params.childSessionKey) {\n lines.push(\n '## Session Context',\n ...(params.requesterSessionKey\n ? [`- Requester session: ${params.requesterSessionKey}`]\n : []),\n ...(params.childSessionKey ? [`- Your session: ${params.childSessionKey}`] : []),\n '',\n );\n }\n\n lines.push(\n `If a completion event arrives AFTER you already sent your final answer, reply ONLY with ${NO_REPLY}.`,\n );\n\n return lines.filter(Boolean).join('\\n');\n}\n\nexport function buildSubagentSystemPrompt(params: {\n goal: string;\n context?: string;\n workspace?: string;\n requesterSessionKey?: string;\n childSessionKey?: string;\n toolNames?: string[];\n}): string {\n const extra = buildSubagentContextSection(params);\n return buildSystemPrompt(params.workspace ?? '.', {\n promptMode: 'minimal',\n toolNames: params.toolNames,\n extraSystemPrompt: extra,\n });\n}\n"],"mappings":";;;AAGA,SAAgB,4BAA4B,QAMjC;CACT,MAAM,WAAW,OAAO,KAAK,MAAM;CAoBnC,MAAM,QAAQ;EACZ;EACA;EACA;EACA;EACA,GAvBA,SAAS,SAAS,KAAK,GACnB;GACE;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACD,GACD;GACE;GACA,iCAAiC;GACjC;GACA;GACD;EAQL;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACD;AAED,KAAI,OAAO,SAAS,MAAM,CACxB,OAAM,KAAK,cAAc,OAAO,QAAQ,MAAM,EAAE,GAAG;AAErD,KAAI,OAAO,WAAW,MAAM,CAC1B,OAAM,KAAK,cAAc,OAAO,UAAU,MAAM,IAAI,GAAG;AAEzD,KAAI,OAAO,uBAAuB,OAAO,gBACvC,OAAM,KACJ,sBACA,GAAI,OAAO,sBACP,CAAC,wBAAwB,OAAO,sBAAsB,GACtD,EAAE,EACN,GAAI,OAAO,kBAAkB,CAAC,mBAAmB,OAAO,kBAAkB,GAAG,EAAE,EAC/E,GACD;AAGH,OAAM,KACJ,2FAA2F,SAAS,GACrG;AAED,QAAO,MAAM,OAAO,QAAQ,CAAC,KAAK,KAAK;;AAGzC,SAAgB,0BAA0B,QAO/B;CACT,MAAM,QAAQ,4BAA4B,OAAO;AACjD,QAAO,kBAAkB,OAAO,aAAa,KAAK;EAChD,YAAY;EACZ,WAAW,OAAO;EAClB,mBAAmB;EACpB,CAAC"}
@@ -0,0 +1,53 @@
1
+ import type { Config } from '../../config/schema.js';
2
+ import type { ProviderSystemPromptContribution } from './contribution.js';
3
+ import type { MemoryCitationsMode, PromptMode, SilentReplyPromptMode } from './types.js';
4
+ export type { RuntimeInfoInput } from './sections/workspace-runtime.js';
5
+ export declare function resolvePromptMode(sessionKey?: string): PromptMode;
6
+ export declare function resolveRuntimeChannel(sessionKey?: string): string | undefined;
7
+ export declare function resolveDeliverableChannels(config: Config): string[];
8
+ export declare function normalizeProviderPromptBlock(value?: string): string | undefined;
9
+ export declare function buildOverridablePromptSection(params: {
10
+ override?: string;
11
+ fallback: string;
12
+ }): string;
13
+ export interface SystemPromptBuildParams {
14
+ workspaceDir: string;
15
+ sessionKey?: string;
16
+ promptMode?: PromptMode;
17
+ toolNames?: string[];
18
+ toolSummaries?: Record<string, string>;
19
+ runtimeInfo?: import('./sections/workspace-runtime.js').RuntimeInfoInput;
20
+ userTimezone?: string;
21
+ channels?: string[];
22
+ memoryCitationsMode?: MemoryCitationsMode;
23
+ includeMemorySection?: boolean;
24
+ heartbeatEnabled?: boolean;
25
+ heartbeatPrompt?: string;
26
+ externalMemoryInstructions?: string;
27
+ ttsSystemHint?: string;
28
+ extraSystemPrompt?: string;
29
+ silentReplyPromptMode?: SilentReplyPromptMode;
30
+ promptContribution?: ProviderSystemPromptContribution;
31
+ includeProblemSolving?: boolean;
32
+ includeToneSection?: boolean;
33
+ }
34
+ export declare function resolveSystemPromptBuildParams(config: Config, params: {
35
+ workspaceDir: string;
36
+ sessionKey?: string;
37
+ toolNames?: string[];
38
+ toolSummaries?: Record<string, string>;
39
+ userTimezone?: string;
40
+ externalMemoryInstructions?: string;
41
+ heartbeatEnabled?: boolean;
42
+ heartbeatPrompt?: string;
43
+ ttsSystemHint?: string;
44
+ extraSystemPrompt?: string;
45
+ modelRef?: string;
46
+ agentId?: string;
47
+ thinkingLevel?: string;
48
+ promptMode?: PromptMode;
49
+ silentReplyPromptMode?: SilentReplyPromptMode;
50
+ promptContribution?: ProviderSystemPromptContribution;
51
+ memoryCitationsMode?: MemoryCitationsMode;
52
+ includeMemorySection?: boolean;
53
+ }): SystemPromptBuildParams;