cli-jaw 2.17.43 → 2.17.44

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 (223) hide show
  1. package/README.md +13 -2
  2. package/dist/bin/commands/slack.js +73 -7
  3. package/dist/bin/commands/slack.js.map +1 -1
  4. package/dist/server.js +46 -1
  5. package/dist/server.js.map +1 -1
  6. package/dist/src/agent/calendar-context.js +23 -0
  7. package/dist/src/agent/calendar-context.js.map +1 -0
  8. package/dist/src/agent/claude-runtime-run.js +10 -1
  9. package/dist/src/agent/claude-runtime-run.js.map +1 -1
  10. package/dist/src/agent/cursor-acp-models.js +139 -0
  11. package/dist/src/agent/cursor-acp-models.js.map +1 -0
  12. package/dist/src/agent/events/cursor.js +28 -4
  13. package/dist/src/agent/events/cursor.js.map +1 -1
  14. package/dist/src/agent/lifecycle-handler.js +8 -2
  15. package/dist/src/agent/lifecycle-handler.js.map +1 -1
  16. package/dist/src/agent/native-runtime-run.js +22 -1
  17. package/dist/src/agent/native-runtime-run.js.map +1 -1
  18. package/dist/src/agent/runtime/acp/config.js +76 -11
  19. package/dist/src/agent/runtime/acp/config.js.map +1 -1
  20. package/dist/src/agent/runtime/acp/cursor-session.js +6 -1
  21. package/dist/src/agent/runtime/acp/cursor-session.js.map +1 -1
  22. package/dist/src/agent/runtime/liveness.js +24 -0
  23. package/dist/src/agent/runtime/liveness.js.map +1 -0
  24. package/dist/src/agent/runtime/start-failure.js +61 -0
  25. package/dist/src/agent/runtime/start-failure.js.map +1 -0
  26. package/dist/src/agent/spawn/queue.js +11 -6
  27. package/dist/src/agent/spawn/queue.js.map +1 -1
  28. package/dist/src/agent/spawn.js +59 -17
  29. package/dist/src/agent/spawn.js.map +1 -1
  30. package/dist/src/cli/api-auth.js +6 -0
  31. package/dist/src/cli/api-auth.js.map +1 -1
  32. package/dist/src/manager/design/watcher.js +10 -2
  33. package/dist/src/manager/design/watcher.js.map +1 -1
  34. package/dist/src/memory/heartbeat.js +6 -0
  35. package/dist/src/memory/heartbeat.js.map +1 -1
  36. package/dist/src/messaging/channel-validate.js +5 -3
  37. package/dist/src/messaging/channel-validate.js.map +1 -1
  38. package/dist/src/messaging/redact.js +30 -8
  39. package/dist/src/messaging/redact.js.map +1 -1
  40. package/dist/src/messaging/send.js +7 -0
  41. package/dist/src/messaging/send.js.map +1 -1
  42. package/dist/src/orchestrator/collect.js +5 -3
  43. package/dist/src/orchestrator/collect.js.map +1 -1
  44. package/dist/src/orchestrator/gateway.js +10 -3
  45. package/dist/src/orchestrator/gateway.js.map +1 -1
  46. package/dist/src/orchestrator/pipeline.js +21 -9
  47. package/dist/src/orchestrator/pipeline.js.map +1 -1
  48. package/dist/src/orchestrator/request-registry.js +2 -0
  49. package/dist/src/orchestrator/request-registry.js.map +1 -1
  50. package/dist/src/prompt/builder.js +74 -6
  51. package/dist/src/prompt/builder.js.map +1 -1
  52. package/dist/src/prompt/templates/a1-system.md +22 -5
  53. package/dist/src/routes/messaging.js +105 -27
  54. package/dist/src/routes/messaging.js.map +1 -1
  55. package/dist/src/routes/settings.js +20 -8
  56. package/dist/src/routes/settings.js.map +1 -1
  57. package/dist/src/routes/slack-tools.js +176 -0
  58. package/dist/src/routes/slack-tools.js.map +1 -0
  59. package/dist/src/slack/action-rate.js +43 -0
  60. package/dist/src/slack/action-rate.js.map +1 -0
  61. package/dist/src/slack/action-runtime.js +243 -0
  62. package/dist/src/slack/action-runtime.js.map +1 -0
  63. package/dist/src/slack/action-store.js +84 -0
  64. package/dist/src/slack/action-store.js.map +1 -0
  65. package/dist/src/slack/action-types.js +6 -0
  66. package/dist/src/slack/action-types.js.map +1 -0
  67. package/dist/src/slack/actions-canvas.js +108 -0
  68. package/dist/src/slack/actions-canvas.js.map +1 -0
  69. package/dist/src/slack/actions-channel.js +88 -0
  70. package/dist/src/slack/actions-channel.js.map +1 -0
  71. package/dist/src/slack/actions-interactions.js +204 -0
  72. package/dist/src/slack/actions-interactions.js.map +1 -0
  73. package/dist/src/slack/actions-lists.js +308 -0
  74. package/dist/src/slack/actions-lists.js.map +1 -0
  75. package/dist/src/slack/actions-message.js +117 -0
  76. package/dist/src/slack/actions-message.js.map +1 -0
  77. package/dist/src/slack/actions-resources.js +62 -0
  78. package/dist/src/slack/actions-resources.js.map +1 -0
  79. package/dist/src/slack/actions-rts.js +88 -0
  80. package/dist/src/slack/actions-rts.js.map +1 -0
  81. package/dist/src/slack/actions-schedule.js +214 -0
  82. package/dist/src/slack/actions-schedule.js.map +1 -0
  83. package/dist/src/slack/actions.js +17 -0
  84. package/dist/src/slack/actions.js.map +1 -0
  85. package/dist/src/slack/api.js +56 -9
  86. package/dist/src/slack/api.js.map +1 -1
  87. package/dist/src/slack/blocks.js +162 -0
  88. package/dist/src/slack/blocks.js.map +1 -0
  89. package/dist/src/slack/bot.js +562 -378
  90. package/dist/src/slack/bot.js.map +1 -1
  91. package/dist/src/slack/commands.js +24 -5
  92. package/dist/src/slack/commands.js.map +1 -1
  93. package/dist/src/slack/context.js +15 -4
  94. package/dist/src/slack/context.js.map +1 -1
  95. package/dist/src/slack/conversation.js +135 -33
  96. package/dist/src/slack/conversation.js.map +1 -1
  97. package/dist/src/slack/events.js +41 -17
  98. package/dist/src/slack/events.js.map +1 -1
  99. package/dist/src/slack/format.js +181 -0
  100. package/dist/src/slack/format.js.map +1 -1
  101. package/dist/src/slack/history.js +133 -8
  102. package/dist/src/slack/history.js.map +1 -1
  103. package/dist/src/slack/ingress.js +26 -9
  104. package/dist/src/slack/ingress.js.map +1 -1
  105. package/dist/src/slack/interaction-store.js +56 -0
  106. package/dist/src/slack/interaction-store.js.map +1 -0
  107. package/dist/src/slack/manifest.js +3 -0
  108. package/dist/src/slack/manifest.js.map +1 -1
  109. package/dist/src/slack/message-content.js +132 -0
  110. package/dist/src/slack/message-content.js.map +1 -0
  111. package/dist/src/slack/message.js +58 -0
  112. package/dist/src/slack/message.js.map +1 -0
  113. package/dist/src/slack/notice-transport.js +49 -19
  114. package/dist/src/slack/notice-transport.js.map +1 -1
  115. package/dist/src/slack/operator-auth.js +62 -0
  116. package/dist/src/slack/operator-auth.js.map +1 -0
  117. package/dist/src/slack/progress-activity.js +210 -0
  118. package/dist/src/slack/progress-activity.js.map +1 -0
  119. package/dist/src/slack/progress-detail.js +473 -0
  120. package/dist/src/slack/progress-detail.js.map +1 -0
  121. package/dist/src/slack/progress-files.js +70 -0
  122. package/dist/src/slack/progress-files.js.map +1 -0
  123. package/dist/src/slack/progress-lifecycle.js +223 -0
  124. package/dist/src/slack/progress-lifecycle.js.map +1 -0
  125. package/dist/src/slack/progress-restore.js +81 -0
  126. package/dist/src/slack/progress-restore.js.map +1 -0
  127. package/dist/src/slack/progress.js +325 -143
  128. package/dist/src/slack/progress.js.map +1 -1
  129. package/dist/src/slack/quote.js +227 -0
  130. package/dist/src/slack/quote.js.map +1 -0
  131. package/dist/src/slack/render-features.js +105 -0
  132. package/dist/src/slack/render-features.js.map +1 -0
  133. package/dist/src/slack/reply-delivery.js +110 -0
  134. package/dist/src/slack/reply-delivery.js.map +1 -0
  135. package/dist/src/slack/rts-output-store.js +143 -0
  136. package/dist/src/slack/rts-output-store.js.map +1 -0
  137. package/dist/src/slack/scope-status.js +17 -3
  138. package/dist/src/slack/scope-status.js.map +1 -1
  139. package/dist/src/slack/search-quote.js +70 -0
  140. package/dist/src/slack/search-quote.js.map +1 -0
  141. package/dist/src/slack/search.js +54 -0
  142. package/dist/src/slack/search.js.map +1 -0
  143. package/dist/src/slack/send-handler.js +11 -7
  144. package/dist/src/slack/send-handler.js.map +1 -1
  145. package/dist/src/slack/send-only-client.js +116 -79
  146. package/dist/src/slack/send-only-client.js.map +1 -1
  147. package/dist/src/slack/table-content.js +253 -0
  148. package/dist/src/slack/table-content.js.map +1 -0
  149. package/dist/src/slack/table-verification.js +64 -0
  150. package/dist/src/slack/table-verification.js.map +1 -0
  151. package/dist/src/slack/task-input.js +55 -0
  152. package/dist/src/slack/task-input.js.map +1 -0
  153. package/dist/src/slack/tool-access.js +127 -0
  154. package/dist/src/slack/tool-access.js.map +1 -0
  155. package/dist/src/slack/tool-capabilities.js +47 -0
  156. package/dist/src/slack/tool-capabilities.js.map +1 -0
  157. package/dist/src/slack/tool-context.js +91 -0
  158. package/dist/src/slack/tool-context.js.map +1 -0
  159. package/dist/src/slack/verified-workspace.js +17 -6
  160. package/dist/src/slack/verified-workspace.js.map +1 -1
  161. package/dist/src/trace/redact.js +2 -1
  162. package/dist/src/trace/redact.js.map +1 -1
  163. package/package.json +1 -1
  164. package/public/dist/.vite/manifest.json +102 -102
  165. package/public/dist/assets/{Agent-CQ4EBgY8.js → Agent-CNad_A6t.js} +1 -1
  166. package/public/dist/assets/{ChannelEnablementControl-JsYvNMlM.js → ChannelEnablementControl-DwUDKjX9.js} +4 -4
  167. package/public/dist/assets/{ChannelSetupEntry-BpyRWEUE.js → ChannelSetupEntry-DH0AuNNX.js} +1 -1
  168. package/public/dist/assets/{ChannelsDiscord-DNfvz1jn.js → ChannelsDiscord-7NmoTjR7.js} +1 -1
  169. package/public/dist/assets/{ChannelsSlack-DzpxIdgW.js → ChannelsSlack-Ba0ax6iT.js} +1 -1
  170. package/public/dist/assets/{ChannelsTelegram-CUhFc5s6.js → ChannelsTelegram-DKA9atf2.js} +1 -1
  171. package/public/dist/assets/{app-Q0prKOFx.js → app-9OQNfmqw.js} +4 -4
  172. package/public/dist/assets/{bgtask-badge-DAcWaUfS.js → bgtask-badge-BvxHqMGi.js} +1 -1
  173. package/public/dist/assets/bgtask-badge-DeSZJGNN.js +1 -0
  174. package/public/dist/assets/{employees-CWS3Juca.js → employees-CkUqN4oh.js} +1 -1
  175. package/public/dist/assets/{iframe-renderer-DCDKBMb7.js → iframe-renderer-C2gchtOj.js} +2 -2
  176. package/public/dist/assets/iframe-renderer-DfvACXIn.js +1 -0
  177. package/public/dist/assets/{manager-v6GYfoPB.js → manager-rb5X-4DJ.js} +1 -1
  178. package/public/dist/assets/{memory-DhNdKZLO.js → memory-BiWzpoBq.js} +1 -1
  179. package/public/dist/assets/memory-Ckp1Eq5a.js +1 -0
  180. package/public/dist/assets/message-history-Bv0l_t7O.js +1 -0
  181. package/public/dist/assets/{message-history-DbRTl1P0.js → message-history-CuFefS02.js} +1 -1
  182. package/public/dist/assets/{render-DP8SJtdZ.js → render-DUGqq9Mu.js} +1 -1
  183. package/public/dist/assets/{settings-85n9NjvX.js → settings-BqUHavbH.js} +1 -1
  184. package/public/dist/assets/settings-C81Kf9uX.js +1 -0
  185. package/public/dist/assets/{settings-C9_D-pn0.js → settings-DQ1fLygB.js} +31 -30
  186. package/public/dist/assets/{settings-core-BcVD2FgV.js → settings-core-CzdXfoOK.js} +1 -1
  187. package/public/dist/assets/settings-core-DO_5M7Lv.js +1 -0
  188. package/public/dist/assets/{settings-embedding-BSpq785l.js → settings-embedding-BAKFrVLV.js} +1 -1
  189. package/public/dist/assets/{settings-types-B09BmpYe.js → settings-types-D3cd6SWy.js} +1 -1
  190. package/public/dist/assets/{sidebar-BVhLb5Ft.js → sidebar-CvGbp9x5.js} +3 -3
  191. package/public/dist/assets/skills-DFpPmMUR.js +1 -0
  192. package/public/dist/assets/{skills-X7qxmHka.js → skills-abLMqY5_.js} +1 -1
  193. package/public/dist/assets/slash-commands-BU58xYih.js +1 -0
  194. package/public/dist/assets/{slash-commands-BnDH4IU_.js → slash-commands-D8o9pqOS.js} +1 -1
  195. package/public/dist/assets/{trace-drawer-DasaS1z4.js → trace-drawer-C6RvkUAd.js} +1 -1
  196. package/public/dist/assets/{ui-BtiBTXng.js → ui-Bxapl_Eu.js} +1 -1
  197. package/public/dist/assets/ui-CUB4iwz3.js +1 -0
  198. package/public/dist/index.html +1 -1
  199. package/public/dist/manager/index.html +1 -1
  200. package/public/dist/settings/index.html +1 -1
  201. package/public/js/features/settings-cli-status.ts +11 -1
  202. package/public/js/features/settings-types.ts +21 -0
  203. package/public/locales/en.json +34 -1
  204. package/public/locales/ja.json +34 -1
  205. package/public/locales/ko.json +34 -1
  206. package/public/locales/zh.json +34 -1
  207. package/scripts/check-native-load.cjs +17 -4
  208. package/scripts/release-gates.mjs +84 -3
  209. package/scripts/service-artifact.mjs +157 -0
  210. package/scripts/service-shell/zsh/.zlogin +23 -0
  211. package/scripts/service-shell/zsh/.zlogout +23 -0
  212. package/scripts/service-shell/zsh/.zprofile +23 -0
  213. package/scripts/service-shell/zsh/.zshenv +23 -0
  214. package/scripts/service-shell/zsh/.zshrc +23 -0
  215. package/public/dist/assets/bgtask-badge-DHA2OQm8.js +0 -1
  216. package/public/dist/assets/iframe-renderer-RpvBly2x.js +0 -1
  217. package/public/dist/assets/memory-4YH8sz0L.js +0 -1
  218. package/public/dist/assets/message-history-lVcLpAw8.js +0 -1
  219. package/public/dist/assets/settings--EGy3_B9.js +0 -1
  220. package/public/dist/assets/settings-core-8wBl1mg-.js +0 -1
  221. package/public/dist/assets/skills-6GFkHTlQ.js +0 -1
  222. package/public/dist/assets/slash-commands-qu8fPAZ3.js +0 -1
  223. package/public/dist/assets/ui-BucJ1zMA.js +0 -1
@@ -938,5 +938,38 @@
938
938
  "onboarding.hint.discord.guildId": "개발자 모드를 켠 뒤 서버를 우클릭해 ID 복사.",
939
939
  "onboarding.hint.slack.botToken": "OAuth & Permissions의 Bot User OAuth Token (xoxb-로 시작).",
940
940
  "onboarding.hint.slack.appToken": "Basic Information → App-Level Tokens (xapp-, connections:write).",
941
- "onboarding.progressLabel": "{total}단계 중 {step}단계"
941
+ "onboarding.progressLabel": "{total}단계 중 {step}단계",
942
+ "slack.progress.title": "요청 진행 상황",
943
+ "slack.progress.activityTitle": "최근 작업",
944
+ "slack.progress.deliveryTitle": "답변 전달",
945
+ "slack.progress.queued": "대기열에서 대기 중",
946
+ "slack.progress.running": "작업 활동 관찰 중",
947
+ "slack.progress.waiting": "다음 업데이트를 기다리는 중",
948
+ "slack.progress.delivering": "답변 전달 중",
949
+ "slack.progress.complete": "작업 관찰 종료",
950
+ "slack.progress.error": "요청 실패",
951
+ "slack.progress.cancelled": "요청 취소됨",
952
+ "slack.progress.expired": "진행 표시가 종료되었습니다. 실행은 계속될 수 있습니다.",
953
+ "slack.progress.merged": "다른 요청과 합쳐짐",
954
+ "slack.progress.removed": "요청 제거됨",
955
+ "slack.progress.restored": "이전 진행 표시가 종료되었습니다. 실행 결과는 확인되지 않았습니다.",
956
+ "slack.progress.failure": "응답을 완료하지 못했습니다.",
957
+ "slack.progress.elapsed": "경과: {seconds}초",
958
+ "slack.progress.lastActivity": "마지막 활동: {seconds}초 전",
959
+ "slack.progress.category.read": "파일 읽기",
960
+ "slack.progress.category.write": "파일 편집",
961
+ "slack.progress.category.search": "검색",
962
+ "slack.progress.category.web": "웹페이지 읽기",
963
+ "slack.progress.category.command": "명령 실행",
964
+ "slack.progress.category.external": "외부 도구",
965
+ "slack.progress.category.tool": "도구 활동",
966
+ "slack.progress.status.observed": "관찰됨",
967
+ "slack.progress.status.in_progress": "진행 중",
968
+ "slack.progress.status.complete": "완료",
969
+ "slack.progress.status.error": "오류",
970
+ "slack.progress.status.stopped": "중단됨",
971
+ "slack.progress.status.unconfirmed": "완료 미확인",
972
+ "slack.progress.deliveryComplete": "답변 전달 완료",
973
+ "slack.progress.deliveryFailed": "답변 전달을 확인하지 못했습니다",
974
+ "slack.progress.deliveryUnconfirmed": "답변 전달 여부 미확인"
942
975
  }
@@ -938,5 +938,38 @@
938
938
  "settings.channel.testSend": "测试发送",
939
939
  "settings.channel.testSendFail": "发送失败:{error}",
940
940
  "settings.channel.testSendOk": "发送成功",
941
- "onboarding.progressLabel": "第 {step} 步,共 {total} 步"
941
+ "onboarding.progressLabel": "第 {step} 步,共 {total} 步",
942
+ "slack.progress.title": "请求进度",
943
+ "slack.progress.activityTitle": "最近的工作",
944
+ "slack.progress.deliveryTitle": "答复发送",
945
+ "slack.progress.queued": "排队中",
946
+ "slack.progress.running": "正在观察活动",
947
+ "slack.progress.waiting": "等待下一次更新",
948
+ "slack.progress.delivering": "正在发送答复",
949
+ "slack.progress.complete": "工作观察已结束",
950
+ "slack.progress.error": "请求失败",
951
+ "slack.progress.cancelled": "请求已取消",
952
+ "slack.progress.expired": "进度显示已结束,执行可能仍在继续。",
953
+ "slack.progress.merged": "已合并至其他请求",
954
+ "slack.progress.removed": "请求已移除",
955
+ "slack.progress.restored": "之前的进度显示已结束,执行结果尚未确认。",
956
+ "slack.progress.failure": "未能完成回复。",
957
+ "slack.progress.elapsed": "已用时:{seconds}秒",
958
+ "slack.progress.lastActivity": "上次活动:{seconds}秒前",
959
+ "slack.progress.category.read": "读取文件",
960
+ "slack.progress.category.write": "编辑文件",
961
+ "slack.progress.category.search": "搜索",
962
+ "slack.progress.category.web": "读取网页",
963
+ "slack.progress.category.command": "执行命令",
964
+ "slack.progress.category.external": "外部工具",
965
+ "slack.progress.category.tool": "工具活动",
966
+ "slack.progress.status.observed": "已观察",
967
+ "slack.progress.status.in_progress": "运行中",
968
+ "slack.progress.status.complete": "完成",
969
+ "slack.progress.status.error": "错误",
970
+ "slack.progress.status.stopped": "已停止",
971
+ "slack.progress.status.unconfirmed": "完成未确认",
972
+ "slack.progress.deliveryComplete": "答复已发送",
973
+ "slack.progress.deliveryFailed": "无法确认答复已发送",
974
+ "slack.progress.deliveryUnconfirmed": "答复发送情况未确认"
942
975
  }
@@ -98,14 +98,27 @@ if (!ptyRoot) {
98
98
 
99
99
  // 2. spawn-helper must be present AND executable, or every pty dies at
100
100
  // runtime with a permission error that no import check would catch.
101
- const helper = join(ptyRoot, 'build', 'Release', 'spawn-helper');
101
+ //
102
+ // Resolved the same way the binary above is, and for the same reason.
103
+ // node-pty's install is `prebuild.js || node-gyp rebuild`: when the
104
+ // prebuilds match, prebuild.js exits 0, the source build never runs and
105
+ // build/Release is never created, so post-install.js has nothing to move
106
+ // there. Looking only in build/Release therefore failed the gate on a
107
+ // prebuild-only install even though node-pty itself would have loaded
108
+ // the prebuilt helper. Both locations are real; the executable bit is
109
+ // what actually has to hold.
102
110
  if (process.platform !== 'win32') {
103
- if (!existsSync(helper)) {
104
- fail(`missing spawn-helper: ${helper}`);
111
+ const helperCandidates = [
112
+ join(ptyRoot, 'build', 'Release', 'spawn-helper'),
113
+ join(ptyRoot, 'prebuilds', `${process.platform}-${process.arch}`, 'spawn-helper'),
114
+ ];
115
+ const helper = helperCandidates.find((candidate) => existsSync(candidate));
116
+ if (!helper) {
117
+ fail(`missing spawn-helper: none of\n ${helperCandidates.join('\n ')}`);
105
118
  } else {
106
119
  try {
107
120
  accessSync(helper, constants.X_OK);
108
- note(`spawn-helper executable: mode ${(statSync(helper).mode & 0o777).toString(8)}`);
121
+ note(`spawn-helper executable: ${helper} (mode ${(statSync(helper).mode & 0o777).toString(8)})`);
109
122
  } catch {
110
123
  fail(`spawn-helper is not executable: ${helper} (mode ${(statSync(helper).mode & 0o777).toString(8)})`);
111
124
  }
@@ -68,6 +68,70 @@ function readFile(rel) {
68
68
  return fs.readFileSync(path.join(repoRoot, rel), 'utf8');
69
69
  }
70
70
 
71
+ /**
72
+ * Lines only a git merge conflict produces. A bare `=======` is deliberately
73
+ * absent: it is also a Markdown setext H1 underline, so matching it would fail
74
+ * this gate on ordinary prose. Every real conflict carries the anchored
75
+ * `<<<<<<<`/`>>>>>>>` pair, so the pair is enough to see one.
76
+ */
77
+ const CONFLICT_MARKER_RE = '^(<<<<<<< |\\|\\|\\|\\|\\|\\|\\| |>>>>>>> )';
78
+
79
+ /**
80
+ * tests/fixtures/manager-notes-wysiwyg holds canned conflict text on purpose —
81
+ * it is the INPUT to the notes conflict-rendering tests, not a merge leftover.
82
+ */
83
+ const CONFLICT_SCAN_EXCLUDE = ':(exclude)tests/fixtures/manager-notes-wysiwyg/';
84
+
85
+ /**
86
+ * Tracked files still carrying merge markers. `git grep` reads only tracked
87
+ * paths, so an untracked scratch file cannot fail the build, and `-I` skips
88
+ * binaries. A status other than 0 (found) or 1 (clean) means the scan did not
89
+ * actually run, which is reported rather than silently passed.
90
+ */
91
+ function grepConflictMarkers(cwd, prefix) {
92
+ const r = run('git', ['grep', '-n', '-I', '-E', CONFLICT_MARKER_RE, '--', '.', CONFLICT_SCAN_EXCLUDE],
93
+ { timeout: 60_000, cwd });
94
+ if (r.status === 1) return { hits: [] };
95
+ if (r.status !== 0) {
96
+ const why = [r.stderr, r.stdout].filter(Boolean).join(' ').trim() || `status ${r.status}`;
97
+ return { error: `conflict-marker scan could not run in ${prefix || '.'}: ${why}` };
98
+ }
99
+ const hits = String(r.stdout || '').split('\n').filter(Boolean)
100
+ .map(line => (prefix ? `${prefix}/${line}` : line));
101
+ return { hits };
102
+ }
103
+
104
+ /**
105
+ * `git grep` stops at a gitlink, and a marker committed inside a submodule
106
+ * ships when that submodule is published — the same reason
107
+ * check-private-boundary.mjs enumerates submodule contents instead of trusting
108
+ * `ls-files`. So each CHECKED-OUT submodule is scanned in its own right. An
109
+ * uninitialised one holds no working tree to read; it is named in the detail
110
+ * rather than counted as clean, because "nothing to scan" is not "scanned and
111
+ * clean".
112
+ */
113
+ function trackedConflictMarkers() {
114
+ const root = grepConflictMarkers(repoRoot, '');
115
+ if (root.error) return root;
116
+ const hits = [...root.hits];
117
+ const unscanned = [];
118
+ const listed = run('git', ['submodule', 'status'], { timeout: 30_000 });
119
+ if (listed.status === 0) {
120
+ for (const line of String(listed.stdout || '').split('\n').filter(Boolean)) {
121
+ // ' <sha> <path> (<describe>)', where a leading '-' means the
122
+ // submodule was never initialised in this checkout.
123
+ const parsed = line.match(/^(.)[0-9a-f]+\s+(\S+)/);
124
+ if (!parsed) continue;
125
+ const [, state, rel] = parsed;
126
+ if (state === '-') { unscanned.push(rel); continue; }
127
+ const nested = grepConflictMarkers(path.join(repoRoot, rel), rel);
128
+ if (nested.error) return nested;
129
+ hits.push(...nested.hits);
130
+ }
131
+ }
132
+ return { hits, unscanned };
133
+ }
134
+
71
135
  const FORBIDDEN_IN_READY = [
72
136
  /external[-\s]?cdp/i,
73
137
  /remote[-\s]?cdp/i,
@@ -417,13 +481,30 @@ const GATES = {
417
481
  },
418
482
  },
419
483
  'doc-drift': {
420
- description: 'structure docs match live inventory (docs:check TS extractors + legacy bash checks)',
484
+ description: 'no tracked file carries merge conflict markers (every run) + structure docs match live inventory (local only)',
421
485
  check() {
486
+ // A merge that commits its own conflict markers is the one docs
487
+ // failure CI has to catch, and nothing did: the #660 merge landed 14
488
+ // unresolved blocks on dev (README.md, AGENTS.md, CLAUDE.md,
489
+ // structure/str_func.md) and gate:all still went green, because the
490
+ // inventory steps below are skipped on CI and nothing else reads
491
+ // those files' contents. This scan is a string match on tracked
492
+ // paths — platform-neutral — so it runs before that skip.
493
+ const markers = trackedConflictMarkers();
494
+ if (markers.error) return { ok: false, detail: markers.error };
495
+ if (markers.hits.length) {
496
+ const sample = markers.hits.slice(0, 5).join('; ');
497
+ const more = markers.hits.length > 5 ? ` (+${markers.hits.length - 5} more)` : '';
498
+ return { ok: false, detail: `${markers.hits.length} unresolved conflict marker line(s): ${sample}${more}` };
499
+ }
500
+ const unscanned = markers.unscanned?.length
501
+ ? ` (not scanned, uninitialised submodule(s): ${markers.unscanned.join(', ')})`
502
+ : '';
422
503
  // CI runners produce platform-dependent file/line inventories
423
504
  // (no public/dist, different tracked-file set) that this gate
424
505
  // cannot reconcile; it stays a local/pre-release discipline gate.
425
506
  if (process.env.CI) {
426
- return { ok: true, detail: 'skipped on CI (local/pre-release gate only)' };
507
+ return { ok: true, detail: `conflict-marker scan clean${unscanned}; inventory steps skipped on CI (local/pre-release only)` };
427
508
  }
428
509
  const steps = [
429
510
  { name: 'docs:check', cmd: 'npm', args: ['run', 'docs:check', '--silent'], timeout: 120_000 },
@@ -435,7 +516,7 @@ const GATES = {
435
516
  return { ok: false, detail: `${s.name} failed:\n${[r.stdout, r.stderr].filter(Boolean).join('\n').slice(-1500)}` };
436
517
  }
437
518
  }
438
- return { ok: true, detail: 'docs:check + check-doc-drift.sh clean' };
519
+ return { ok: true, detail: `conflict-marker scan clean${unscanned}; docs:check + check-doc-drift.sh clean` };
439
520
  },
440
521
  },
441
522
  'path-length': {
@@ -0,0 +1,157 @@
1
+ #!/usr/bin/env node
2
+ // Local release launcher. No package imports: verification runs before the CLI.
3
+ // node scripts/service-artifact.mjs --root /absolute/release --manifest-sha256 HEX [--check] -- [CLI args]
4
+ // artifact-manifest.json: {schemaVersion:1,version:"2.17.42",entrypoint:"dist/bin/cli-jaw.js",files:{"relative/file":"sha256"}}
5
+ // The inventory covers every regular file, including this launcher, except the
6
+ // manifest itself. Package a runtime tree without symlinks (including .bin links).
7
+ // The digest is anchored outside the release, e.g. in launchd ProgramArguments.
8
+ // This detects drift, not a malicious owner changing both launcher and anchor.
9
+ // Keep releases immutable during verification/import; this is not a JS sandbox.
10
+ import { constants } from 'node:fs';
11
+ import { lstat, open, readdir, realpath } from 'node:fs/promises';
12
+ import { createHash } from 'node:crypto';
13
+ import { delimiter, dirname, isAbsolute, join, resolve } from 'node:path';
14
+ import { pathToFileURL } from 'node:url';
15
+
16
+ const MANIFEST = 'artifact-manifest.json';
17
+ const MAX_MANIFEST_BYTES = 16 * 1024 * 1024;
18
+ const MAX_FILES = 100_000;
19
+ const MAX_FILE_BYTES = 2 * 1024 * 1024 * 1024;
20
+ const SHA256 = /^[a-f0-9]{64}$/;
21
+ const ZSH_FILES = ['.zshenv', '.zprofile', '.zshrc', '.zlogin', '.zlogout'];
22
+ const ZSH_DIR = 'scripts/service-shell/zsh';
23
+ const fail = code => { throw new Error(code); };
24
+ const record = value => value !== null && typeof value === 'object' && !Array.isArray(value);
25
+ const exactKeys = (value, keys) => record(value) && Object.keys(value).length === keys.length
26
+ && keys.every(key => Object.hasOwn(value, key));
27
+
28
+ function relativePath(value) {
29
+ return typeof value === 'string' && value.length > 0 && value.length <= 4096
30
+ && !/[\\:\p{Cc}\p{Cf}]/u.test(value)
31
+ && value.split('/').every(part => part && part !== '.' && part !== '..' && part === part.trim());
32
+ }
33
+
34
+ function argumentsOf(args) {
35
+ const result = { check: false, cliArgs: [] };
36
+ const seen = new Set();
37
+ for (let i = 0; i < args.length; i++) {
38
+ const flag = args[i];
39
+ if (flag === '--') { result.cliArgs = args.slice(i + 1); break; }
40
+ if (!['--root', '--manifest-sha256', '--check'].includes(flag) || seen.has(flag)) fail('invalid_arguments');
41
+ seen.add(flag);
42
+ if (flag === '--check') result.check = true;
43
+ else {
44
+ const value = args[++i];
45
+ if (!value || value.startsWith('--')) fail('invalid_arguments');
46
+ result[flag === '--root' ? 'root' : 'digest'] = value;
47
+ }
48
+ }
49
+ if (!result.root || !isAbsolute(result.root) || !SHA256.test(result.digest ?? '')) fail('invalid_arguments');
50
+ return result;
51
+ }
52
+
53
+ async function readRegular(file, limit, collect = false) {
54
+ const before = await lstat(file);
55
+ if (!before.isFile() || before.isSymbolicLink() || before.size > limit) fail('non_regular_or_oversized_file');
56
+ const handle = await open(file, constants.O_RDONLY | (constants.O_NOFOLLOW ?? 0));
57
+ try {
58
+ const opened = await handle.stat();
59
+ if (!opened.isFile() || opened.dev !== before.dev || opened.ino !== before.ino) fail('file_changed');
60
+ const hash = createHash('sha256'), chunks = [];
61
+ const buffer = Buffer.alloc(64 * 1024);
62
+ let bytes = 0;
63
+ for (;;) {
64
+ const { bytesRead } = await handle.read(buffer, 0, buffer.length, null);
65
+ if (!bytesRead) break;
66
+ bytes += bytesRead;
67
+ if (bytes > limit) fail('oversized_file');
68
+ hash.update(buffer.subarray(0, bytesRead));
69
+ if (collect) chunks.push(Buffer.from(buffer.subarray(0, bytesRead)));
70
+ }
71
+ const after = await handle.stat();
72
+ if (bytes !== before.size || after.size !== before.size || after.mtimeMs !== before.mtimeMs
73
+ || after.ctimeMs !== before.ctimeMs) fail('file_changed');
74
+ return { digest: hash.digest('hex'), bytes, ...(collect ? { data: Buffer.concat(chunks) } : {}) };
75
+ } finally { await handle.close(); }
76
+ }
77
+
78
+ async function verify(options) {
79
+ const root = resolve(options.root);
80
+ if (await realpath(root) !== root || !(await lstat(root)).isDirectory()) fail('invalid_release_root');
81
+ const manifest = await readRegular(join(root, MANIFEST), MAX_MANIFEST_BYTES, true);
82
+ if (manifest.digest !== options.digest) fail('manifest_digest_mismatch');
83
+ let spec;
84
+ try { spec = JSON.parse(manifest.data.toString('utf8')); } catch { fail('invalid_manifest_json'); }
85
+ if (!exactKeys(spec, ['schemaVersion', 'version', 'entrypoint', 'files']) || spec.schemaVersion !== 1
86
+ || typeof spec.version !== 'string' || !/^[0-9]+\.[0-9]+\.[0-9]+(?:[-+][A-Za-z0-9.+-]+)?$/.test(spec.version)
87
+ || !relativePath(spec.entrypoint) || !/\.(?:mjs|js)$/.test(spec.entrypoint) || !record(spec.files)) fail('invalid_manifest');
88
+ const entries = Object.entries(spec.files);
89
+ if (!entries.length || entries.length > MAX_FILES || !Object.hasOwn(spec.files, spec.entrypoint)) fail('invalid_inventory');
90
+ for (const [file, digest] of entries) {
91
+ if (!relativePath(file) || file === MANIFEST || typeof digest !== 'string' || !SHA256.test(digest)) fail('invalid_inventory');
92
+ }
93
+ const seen = new Set();
94
+ const dirs = [''];
95
+ let directoryCount = 0, bytes = 0;
96
+ while (dirs.length) {
97
+ const relative = dirs.pop();
98
+ if (++directoryCount > MAX_FILES) fail('inventory_limit');
99
+ for (const name of await readdir(join(root, relative))) {
100
+ const file = relative ? `${relative}/${name}` : name;
101
+ if (!relativePath(file)) fail('unsafe_path');
102
+ const full = join(root, file), stat = await lstat(full);
103
+ if (stat.isSymbolicLink()) fail('symlink_not_allowed');
104
+ if (stat.isDirectory()) { dirs.push(file); continue; }
105
+ if (!stat.isFile()) fail('non_regular_file');
106
+ if (file === MANIFEST) continue;
107
+ if (!Object.hasOwn(spec.files, file)) fail('unlisted_file');
108
+ const verified = await readRegular(full, MAX_FILE_BYTES);
109
+ if (verified.digest !== spec.files[file]) fail('file_digest_mismatch');
110
+ seen.add(file); bytes += verified.bytes;
111
+ }
112
+ }
113
+ if (seen.size !== entries.length) fail('missing_file');
114
+ const zshCount = ZSH_FILES.filter(name => seen.has(`${ZSH_DIR}/${name}`)).length;
115
+ if (zshCount && zshCount !== ZSH_FILES.length) fail('incomplete_shell_shims');
116
+ return { root, spec, receipt: { ok: true, schemaVersion: 1, version: spec.version,
117
+ manifestSha256: manifest.digest, entrypoint: spec.entrypoint, files: seen.size, bytes } };
118
+ }
119
+
120
+ try {
121
+ const options = argumentsOf(process.argv.slice(2));
122
+ const { root, spec, receipt } = await verify(options);
123
+ if (options.check) console.log(JSON.stringify(receipt));
124
+ else {
125
+ const entry = join(root, spec.entrypoint);
126
+ process.argv = [process.execPath, entry, ...options.cliArgs];
127
+ process.env.CLI_JAW_BIN = entry;
128
+ // Packaging supplies hashed, regular-file jaw/cli-jaw aliases beside the
129
+ // entrypoint. Child tools must resolve those before npm's mutable bin.
130
+ const inheritedPath = process.env.PATH;
131
+ process.env.PATH = dirname(entry) + (inheritedPath ? delimiter + inheritedPath : '');
132
+ if (ZSH_FILES.every(name => Object.hasOwn(spec.files, `${ZSH_DIR}/${name}`))) {
133
+ // Forward the caller's ZDOTDIR, including unset versus explicitly empty.
134
+ // On launcher reentry retain the original user directory, not our shim.
135
+ const reentry = process.env.CLI_JAW_ZSH_SHIMS
136
+ && process.env.ZDOTDIR === process.env.CLI_JAW_ZSH_SHIMS
137
+ && ['0', '1'].includes(process.env.CLI_JAW_USER_ZDOTDIR_SET ?? '');
138
+ if (!reentry) {
139
+ process.env.CLI_JAW_USER_ZDOTDIR_SET = Object.hasOwn(process.env, 'ZDOTDIR') ? '1' : '0';
140
+ process.env.CLI_JAW_USER_ZDOTDIR = process.env.ZDOTDIR ?? '';
141
+ }
142
+ process.env.CLI_JAW_VERIFIED_BIN = dirname(entry);
143
+ process.env.CLI_JAW_ZSH_SHIMS = join(root, ZSH_DIR);
144
+ process.env.ZDOTDIR = process.env.CLI_JAW_ZSH_SHIMS;
145
+ }
146
+ await import(pathToFileURL(entry).href);
147
+ }
148
+ } catch (error) {
149
+ // Do not serialize paths, imported exception text or environment values.
150
+ const known = new Set(['invalid_arguments', 'non_regular_or_oversized_file', 'file_changed', 'oversized_file',
151
+ 'invalid_release_root', 'manifest_digest_mismatch', 'invalid_manifest_json', 'invalid_manifest',
152
+ 'invalid_inventory', 'inventory_limit', 'unsafe_path', 'symlink_not_allowed', 'non_regular_file',
153
+ 'unlisted_file', 'file_digest_mismatch', 'missing_file', 'incomplete_shell_shims']);
154
+ const code = known.has(error?.message) ? error.message : error?.code === 'ENOENT' ? 'missing_file' : 'artifact_launch_failed';
155
+ console.error(JSON.stringify({ ok: false, error: code }));
156
+ process.exitCode = 1;
157
+ }
@@ -0,0 +1,23 @@
1
+ # Service-only zsh forwarding. Keep user configs at top level (no function scope).
2
+ # Reapply the verified bin after each usual config; this is not a shell sandbox.
3
+ # Bash/other shells, zsh -f, config exit/exec, and later PATH edits are not covered.
4
+ if [[ -n ${CLI_JAW_ZSH_SHIMS-} && -n ${CLI_JAW_VERIFIED_BIN-} ]]; then
5
+ if [[ ${CLI_JAW_USER_ZDOTDIR_SET-0} == 1 ]]; then
6
+ export ZDOTDIR="${CLI_JAW_USER_ZDOTDIR-}"
7
+ else
8
+ unset ZDOTDIR
9
+ fi
10
+ _CLI_JAW_ZSH_USER_FILE="${ZDOTDIR-${HOME}}/.zlogin"
11
+ if [[ -r "$_CLI_JAW_ZSH_USER_FILE" && "${_CLI_JAW_ZSH_USER_FILE:A}" != "${CLI_JAW_ZSH_SHIMS:A}/.zlogin" ]]; then
12
+ source "$_CLI_JAW_ZSH_USER_FILE"
13
+ fi
14
+ # Honor a user's ZDOTDIR reassignment for subsequent config files.
15
+ if (( ${+ZDOTDIR} )); then
16
+ export CLI_JAW_USER_ZDOTDIR_SET=1 CLI_JAW_USER_ZDOTDIR="$ZDOTDIR"
17
+ else
18
+ export CLI_JAW_USER_ZDOTDIR_SET=0 CLI_JAW_USER_ZDOTDIR=''
19
+ fi
20
+ unset _CLI_JAW_ZSH_USER_FILE
21
+ export ZDOTDIR="$CLI_JAW_ZSH_SHIMS"
22
+ export PATH="$CLI_JAW_VERIFIED_BIN${PATH:+:$PATH}"
23
+ fi
@@ -0,0 +1,23 @@
1
+ # Service-only zsh forwarding. Keep user configs at top level (no function scope).
2
+ # Reapply the verified bin after each usual config; this is not a shell sandbox.
3
+ # Bash/other shells, zsh -f, config exit/exec, and later PATH edits are not covered.
4
+ if [[ -n ${CLI_JAW_ZSH_SHIMS-} && -n ${CLI_JAW_VERIFIED_BIN-} ]]; then
5
+ if [[ ${CLI_JAW_USER_ZDOTDIR_SET-0} == 1 ]]; then
6
+ export ZDOTDIR="${CLI_JAW_USER_ZDOTDIR-}"
7
+ else
8
+ unset ZDOTDIR
9
+ fi
10
+ _CLI_JAW_ZSH_USER_FILE="${ZDOTDIR-${HOME}}/.zlogout"
11
+ if [[ -r "$_CLI_JAW_ZSH_USER_FILE" && "${_CLI_JAW_ZSH_USER_FILE:A}" != "${CLI_JAW_ZSH_SHIMS:A}/.zlogout" ]]; then
12
+ source "$_CLI_JAW_ZSH_USER_FILE"
13
+ fi
14
+ # Honor a user's ZDOTDIR reassignment for subsequent config files.
15
+ if (( ${+ZDOTDIR} )); then
16
+ export CLI_JAW_USER_ZDOTDIR_SET=1 CLI_JAW_USER_ZDOTDIR="$ZDOTDIR"
17
+ else
18
+ export CLI_JAW_USER_ZDOTDIR_SET=0 CLI_JAW_USER_ZDOTDIR=''
19
+ fi
20
+ unset _CLI_JAW_ZSH_USER_FILE
21
+ export ZDOTDIR="$CLI_JAW_ZSH_SHIMS"
22
+ export PATH="$CLI_JAW_VERIFIED_BIN${PATH:+:$PATH}"
23
+ fi
@@ -0,0 +1,23 @@
1
+ # Service-only zsh forwarding. Keep user configs at top level (no function scope).
2
+ # Reapply the verified bin after each usual config; this is not a shell sandbox.
3
+ # Bash/other shells, zsh -f, config exit/exec, and later PATH edits are not covered.
4
+ if [[ -n ${CLI_JAW_ZSH_SHIMS-} && -n ${CLI_JAW_VERIFIED_BIN-} ]]; then
5
+ if [[ ${CLI_JAW_USER_ZDOTDIR_SET-0} == 1 ]]; then
6
+ export ZDOTDIR="${CLI_JAW_USER_ZDOTDIR-}"
7
+ else
8
+ unset ZDOTDIR
9
+ fi
10
+ _CLI_JAW_ZSH_USER_FILE="${ZDOTDIR-${HOME}}/.zprofile"
11
+ if [[ -r "$_CLI_JAW_ZSH_USER_FILE" && "${_CLI_JAW_ZSH_USER_FILE:A}" != "${CLI_JAW_ZSH_SHIMS:A}/.zprofile" ]]; then
12
+ source "$_CLI_JAW_ZSH_USER_FILE"
13
+ fi
14
+ # Honor a user's ZDOTDIR reassignment for subsequent config files.
15
+ if (( ${+ZDOTDIR} )); then
16
+ export CLI_JAW_USER_ZDOTDIR_SET=1 CLI_JAW_USER_ZDOTDIR="$ZDOTDIR"
17
+ else
18
+ export CLI_JAW_USER_ZDOTDIR_SET=0 CLI_JAW_USER_ZDOTDIR=''
19
+ fi
20
+ unset _CLI_JAW_ZSH_USER_FILE
21
+ export ZDOTDIR="$CLI_JAW_ZSH_SHIMS"
22
+ export PATH="$CLI_JAW_VERIFIED_BIN${PATH:+:$PATH}"
23
+ fi
@@ -0,0 +1,23 @@
1
+ # Service-only zsh forwarding. Keep user configs at top level (no function scope).
2
+ # Reapply the verified bin after each usual config; this is not a shell sandbox.
3
+ # Bash/other shells, zsh -f, config exit/exec, and later PATH edits are not covered.
4
+ if [[ -n ${CLI_JAW_ZSH_SHIMS-} && -n ${CLI_JAW_VERIFIED_BIN-} ]]; then
5
+ if [[ ${CLI_JAW_USER_ZDOTDIR_SET-0} == 1 ]]; then
6
+ export ZDOTDIR="${CLI_JAW_USER_ZDOTDIR-}"
7
+ else
8
+ unset ZDOTDIR
9
+ fi
10
+ _CLI_JAW_ZSH_USER_FILE="${ZDOTDIR-${HOME}}/.zshenv"
11
+ if [[ -r "$_CLI_JAW_ZSH_USER_FILE" && "${_CLI_JAW_ZSH_USER_FILE:A}" != "${CLI_JAW_ZSH_SHIMS:A}/.zshenv" ]]; then
12
+ source "$_CLI_JAW_ZSH_USER_FILE"
13
+ fi
14
+ # Honor a user's ZDOTDIR reassignment for subsequent config files.
15
+ if (( ${+ZDOTDIR} )); then
16
+ export CLI_JAW_USER_ZDOTDIR_SET=1 CLI_JAW_USER_ZDOTDIR="$ZDOTDIR"
17
+ else
18
+ export CLI_JAW_USER_ZDOTDIR_SET=0 CLI_JAW_USER_ZDOTDIR=''
19
+ fi
20
+ unset _CLI_JAW_ZSH_USER_FILE
21
+ export ZDOTDIR="$CLI_JAW_ZSH_SHIMS"
22
+ export PATH="$CLI_JAW_VERIFIED_BIN${PATH:+:$PATH}"
23
+ fi
@@ -0,0 +1,23 @@
1
+ # Service-only zsh forwarding. Keep user configs at top level (no function scope).
2
+ # Reapply the verified bin after each usual config; this is not a shell sandbox.
3
+ # Bash/other shells, zsh -f, config exit/exec, and later PATH edits are not covered.
4
+ if [[ -n ${CLI_JAW_ZSH_SHIMS-} && -n ${CLI_JAW_VERIFIED_BIN-} ]]; then
5
+ if [[ ${CLI_JAW_USER_ZDOTDIR_SET-0} == 1 ]]; then
6
+ export ZDOTDIR="${CLI_JAW_USER_ZDOTDIR-}"
7
+ else
8
+ unset ZDOTDIR
9
+ fi
10
+ _CLI_JAW_ZSH_USER_FILE="${ZDOTDIR-${HOME}}/.zshrc"
11
+ if [[ -r "$_CLI_JAW_ZSH_USER_FILE" && "${_CLI_JAW_ZSH_USER_FILE:A}" != "${CLI_JAW_ZSH_SHIMS:A}/.zshrc" ]]; then
12
+ source "$_CLI_JAW_ZSH_USER_FILE"
13
+ fi
14
+ # Honor a user's ZDOTDIR reassignment for subsequent config files.
15
+ if (( ${+ZDOTDIR} )); then
16
+ export CLI_JAW_USER_ZDOTDIR_SET=1 CLI_JAW_USER_ZDOTDIR="$ZDOTDIR"
17
+ else
18
+ export CLI_JAW_USER_ZDOTDIR_SET=0 CLI_JAW_USER_ZDOTDIR=''
19
+ fi
20
+ unset _CLI_JAW_ZSH_USER_FILE
21
+ export ZDOTDIR="$CLI_JAW_ZSH_SHIMS"
22
+ export PATH="$CLI_JAW_VERIFIED_BIN${PATH:+:$PATH}"
23
+ fi
@@ -1 +0,0 @@
1
- import{r as e,t}from"./bgtask-badge-DAcWaUfS.js";export{t as applyBgtaskUpdate,e as refreshBgtaskBadge};
@@ -1 +0,0 @@
1
- import{a as e}from"./iframe-renderer-DCDKBMb7.js";export{e as refreshFileWidget};
@@ -1 +0,0 @@
1
- import{a as e}from"./memory-DhNdKZLO.js";export{e as refreshMemorySidebar};
@@ -1 +0,0 @@
1
- import{o as e,s as t}from"./message-history-DbRTl1P0.js";export{e as historyReloadInFlight,t as loadMessages};
@@ -1 +0,0 @@
1
- import{c as e,n as t}from"./settings-core-BcVD2FgV.js";import"./settings-C9_D-pn0.js";export{t as loadSettings,e as updateSettings};
@@ -1 +0,0 @@
1
- import{a as e}from"./settings-core-BcVD2FgV.js";export{e as refreshHeaderFromSettingsChange};
@@ -1 +0,0 @@
1
- import{n as e}from"./skills-X7qxmHka.js";export{e as loadSkills};
@@ -1 +0,0 @@
1
- import{a as e}from"./slash-commands-BnDH4IU_.js";export{e as loadCommands};
@@ -1 +0,0 @@
1
- import{p as e}from"./iframe-renderer-DCDKBMb7.js";import{I as t,s as n}from"./message-history-DbRTl1P0.js";import{r}from"./ui-BtiBTXng.js";export{r as cleanupToolActivity,n as loadMessages,e as reconcileChatBottomAfterRestore,t as updateQueueBadge};