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
@@ -1,159 +1,341 @@
1
- // ─── Slack live progress relay ──────────────────────
2
- // Hermes-style "정보 수집 중…" status: one placeholder message posted right
3
- // after a mention, then EDITED in place (chat.update) as the agent works, and
4
- // finally replaced by the answer. Slack has no typing indicator for bots, so
5
- // an edited message is the only honest progress surface.
6
- //
7
- // Design rules:
8
- // - ONE message per run. Never post a second status line; edit the first.
9
- // - Rate-limited edits. Slack's chat.update tier allows ~1/sec per channel;
10
- // bursty tool events would otherwise burn the budget and get throttled.
11
- // - Best-effort. A failed status post/edit must never break the answer path.
12
- import { slackApi, describeSlackError } from './api.js';
13
- import { startDraftStream } from '../messaging/draft-stream.js';
14
- import { toMrkdwn } from './format.js';
15
- import { redactOutboundText } from '../messaging/redact.js';
16
- /** Minimum gap between chat.update calls for one run (Slack tier limit). */
17
- const EDIT_INTERVAL_MS = 1200;
18
- /** Status text is a one-liner; long tool details would spam the channel. */
19
- const MAX_STATUS_LEN = 140;
1
+ // Request-scoped Slack task streams. Final answer delivery has a separate owner.
2
+ import { createHash } from 'node:crypto';
3
+ import { slackApi } from './api.js';
4
+ import { log } from '../core/logger.js';
5
+ import { redactOutboundPayload } from '../messaging/redact.js';
6
+ import { t } from '../core/i18n.js';
7
+ import { createSlackActivity, projectSlackPrintTool, } from './progress-activity.js';
8
+ const NATIVE_INTERVAL_MS = 1000;
9
+ const FALLBACK_INTERVAL_MS = 3200;
10
+ // chat.appendStream is Tier 4 (100+/minute). Reserve at most 90/minute
11
+ // across this process's streams sharing one credential, including tool updates.
12
+ const APPEND_SPACING_MS = 667;
13
+ const OPERATION_TIMEOUT_MS = 5000;
14
+ const MAX_EMBARGO_KEYS = 128;
15
+ const embargoes = new Map();
16
+ let overflowEmbargo = 0;
17
+ const UNSUPPORTED = new Set(['unknown_method', 'method_not_supported_for_channel_type', 'channel_type_not_supported']);
18
+ const DEFINITE_REJECTION = new Set([
19
+ ...UNSUPPORTED, 'invalid_auth', 'not_authed', 'missing_scope', 'not_in_channel',
20
+ 'channel_not_found', 'invalid_arguments', 'invalid_chunks', 'no_permission',
21
+ 'not_allowed_token_type', 'ratelimited', 'rate_limited', 'is_archived',
22
+ ]);
23
+ function embargoUntil(key, now) {
24
+ for (const [entry, until] of embargoes)
25
+ if (until <= now)
26
+ embargoes.delete(entry);
27
+ if (overflowEmbargo <= now)
28
+ overflowEmbargo = 0;
29
+ return Math.max(embargoes.get(key) ?? 0, overflowEmbargo);
30
+ }
31
+ function rememberEmbargo(key, result, now) {
32
+ if (!result.retryAfterMs || !Number.isFinite(result.retryAfterMs) || result.retryAfterMs < 0)
33
+ return;
34
+ if (result.status !== 429 && result.error !== 'ratelimited' && result.error !== 'rate_limited')
35
+ return;
36
+ extendEmbargo(key, now + result.retryAfterMs, now);
37
+ }
38
+ function extendEmbargo(key, until, now) {
39
+ embargoUntil(key, now);
40
+ if (embargoes.has(key) || embargoes.size < MAX_EMBARGO_KEYS) {
41
+ embargoes.set(key, Math.max(embargoes.get(key) ?? 0, until));
42
+ }
43
+ else
44
+ overflowEmbargo = Math.max(overflowEmbargo, until);
45
+ }
46
+ function chunks(snapshot) {
47
+ return [
48
+ { type: 'plan_update', title: snapshot.title },
49
+ { type: 'task_update', id: 'work', title: snapshot.summary, status: snapshot.workStatus },
50
+ ...snapshot.activities.map((activity, index) => ({ type: 'task_update', id: `recent-${index}`,
51
+ title: activity.title, status: activity.status })),
52
+ ...(snapshot.delivery ? [{ type: 'task_update', id: 'delivery',
53
+ title: snapshot.delivery.title, status: snapshot.delivery.status }] : []),
54
+ ];
55
+ }
56
+ function fallbackBody(snapshot) {
57
+ return { text: snapshot.text, blocks: [{ type: 'section',
58
+ text: { type: 'plain_text', text: snapshot.text } }] };
59
+ }
60
+ /** Kept for callers of the old helper; raw detail is no longer a display input. */
61
+ export function sanitizeProgressDetail(_detail) { return ''; }
20
62
  export function truncateStatus(text) {
21
63
  const line = text.replace(/\s+/g, ' ').trim();
22
- return line.length <= MAX_STATUS_LEN ? line : `${line.slice(0, MAX_STATUS_LEN - 1)}…`;
64
+ return line.length <= 140 ? line : `${line.slice(0, 139)}…`;
23
65
  }
24
- /**
25
- * Map an `agent_tool` broadcast payload to a human status line.
26
- * Returns null when the event carries nothing worth showing.
27
- */
28
- export function statusFromToolEvent(data, fallback) {
29
- const label = typeof data['label'] === 'string' ? data['label'].trim() : '';
30
- const rawDetail = typeof data['detail'] === 'string' ? data['detail'].trim() : '';
31
- // Sanitize detail: strip file paths, command lines, and API URLs that
32
- // should not be exposed in external Slack channels (#365).
33
- const detail = sanitizeProgressDetail(rawDetail);
34
- if (!label && !detail)
35
- return null;
36
- const head = label || fallback;
37
- return truncateStatus(detail ? `${head} — ${detail}` : head);
66
+ export function statusFromToolEvent(data, _fallback) {
67
+ const entry = projectSlackPrintTool(data);
68
+ return entry ? t(`slack.progress.category.${entry.category}`) : null;
38
69
  }
39
- /**
40
- * Strip sensitive details from progress status text before it reaches Slack.
41
- * Removes full file paths, command-line invocations, API URLs, and PowerShell
42
- * commands that would leak internal structure to external channels.
43
- */
44
- export function sanitizeProgressDetail(detail) {
45
- if (!detail)
46
- return '';
47
- // A search pattern is not a file the reader recognises — it is the query the
48
- // agent wrote, and it names internal routes and API methods. On 2026-08-25 a
49
- // Slack thread showed a raw grep pattern (channel/send, files.upload, a photo
50
- // wildcard) for six minutes while the answer was still being written, because
51
- // the token rules below only knew about absolute paths and executables (#440).
52
- //
53
- // Detected structurally rather than by keyword: regex metacharacters are what
54
- // make a string a pattern, and an ordinary filename detail has none.
55
- if (looksLikeSearchPattern(detail))
56
- return '';
57
- // Strip content that looks like a file path or command invocation.
58
- // Approach: split on whitespace, redact tokens that look sensitive, rejoin.
59
- const tokens = detail.split(/\s+/);
60
- const safe = tokens.map(token => {
61
- // Windows absolute path: C:\..., "C:\..."
62
- if (/^"?[A-Z]:[\\/]/i.test(token))
63
- return '…';
64
- // Unix absolute path starting with sensitive dirs
65
- if (/^\/(?:Users|home|tmp|var|etc|opt|usr|mnt|acclidge|Program)/i.test(token))
66
- return '…';
67
- // localhost URLs
68
- if (/^https?:\/\/(?:127\.0\.0\.1|localhost)/i.test(token))
69
- return '…';
70
- // Executable names with .exe suffix
71
- if (/^"?(?:pwsh|powershell|bash|cmd|node)(?:\.exe)?"?$/i.test(token))
72
- return '…';
73
- // Internal API method names (a dotted lowercase identifier such as an
74
- // upload or post call). Never a word a channel reader needs; the suffix
75
- // check keeps real filenames visible.
76
- if (/^[a-z][a-z0-9]*\.[a-z][a-zA-Z0-9]*$/.test(token)
77
- && !/\.(md|txt|json|ts|js|py|html|css|yml|yaml|sh|log)$/i.test(token))
78
- return '';
79
- return token;
70
+ export async function startSlackProgress(token, target, _initialText, options = {}) {
71
+ const address = { ...target };
72
+ const recipient = options.recipientUserId;
73
+ const workingDir = options.workingDir;
74
+ const now = options.draftClock?.now ?? Date.now;
75
+ const setTimer = options.draftClock?.setTimer ?? setTimeout;
76
+ const clearTimer = options.draftClock?.clearTimer ?? clearTimeout;
77
+ const model = createSlackActivity(now, options.locale ?? 'ko', options.initialPhase ?? 'running');
78
+ const controller = new AbortController();
79
+ const updateWait = new AbortController();
80
+ const parentSignal = options.signal;
81
+ const fetchImpl = options.fetchImpl;
82
+ const onPosted = options.onPosted;
83
+ const abortParent = () => abortProgress();
84
+ const credential = createHash('sha256').update(token).digest('hex');
85
+ const bucket = (method) => `${credential}:${method}`;
86
+ let state = { mode: 'none', ts: null };
87
+ let closed = false;
88
+ let remoteEnded = false;
89
+ let confirmed = false;
90
+ let dirty = false;
91
+ let lastAttemptAt = -Infinity;
92
+ let lastSignature = '';
93
+ let lastSnapshot = null;
94
+ let timer = null;
95
+ let idleTimer = null;
96
+ let inFlight = null;
97
+ let terminal = null;
98
+ const clearScheduled = () => {
99
+ if (timer)
100
+ clearTimer(timer);
101
+ if (idleTimer)
102
+ clearTimer(idleTimer);
103
+ timer = idleTimer = null;
104
+ };
105
+ function abortProgress() {
106
+ closed = true;
107
+ clearScheduled();
108
+ controller.abort();
109
+ parentSignal?.removeEventListener('abort', abortParent);
110
+ }
111
+ parentSignal?.addEventListener('abort', abortParent, { once: true });
112
+ if (parentSignal?.aborted)
113
+ abortProgress();
114
+ const wait = (ms, dispatchSignal) => new Promise(resolve => {
115
+ if (controller.signal.aborted || dispatchSignal?.aborted) {
116
+ resolve();
117
+ return;
118
+ }
119
+ const done = () => {
120
+ clearTimer(handle);
121
+ controller.signal.removeEventListener('abort', done);
122
+ dispatchSignal?.removeEventListener('abort', done);
123
+ resolve();
124
+ };
125
+ const handle = setTimer(done, ms);
126
+ controller.signal.addEventListener('abort', done, { once: true });
127
+ dispatchSignal?.addEventListener('abort', done, { once: true });
80
128
  });
81
- // Remove consecutive redacted tokens
82
- const deduped = [];
83
- for (const t of safe) {
84
- if (t === '…' && deduped[deduped.length - 1] === '…')
85
- continue;
86
- deduped.push(t);
129
+ async function call(method, body, deadline, canDispatch = () => true, dispatchSignal) {
130
+ while (!controller.signal.aborted && !dispatchSignal?.aborted) {
131
+ const delay = Math.max(0, embargoUntil(bucket(method), now()) - now());
132
+ if (!delay)
133
+ break;
134
+ if (delay >= deadline - now())
135
+ return { result: { ok: false, error: 'progress_backoff' }, attempted: false };
136
+ await wait(delay, dispatchSignal);
137
+ }
138
+ const remaining = Math.min(OPERATION_TIMEOUT_MS, deadline - now());
139
+ if (controller.signal.aborted || dispatchSignal?.aborted || remaining <= 0 || !canDispatch()) {
140
+ return { result: { ok: false, error: 'slack_send_aborted' }, attempted: false };
141
+ }
142
+ if (method === 'chat.appendStream')
143
+ extendEmbargo(bucket(method), now() + APPEND_SPACING_MS, now());
144
+ const request = new AbortController();
145
+ let timeout;
146
+ let cancel = () => { };
147
+ const cancelled = new Promise(resolve => {
148
+ cancel = () => { request.abort(); resolve({ ok: false, error: 'slack_send_aborted', status: 499 }); };
149
+ timeout = setTimer(cancel, remaining);
150
+ controller.signal.addEventListener('abort', cancel, { once: true });
151
+ });
152
+ try {
153
+ if (controller.signal.aborted)
154
+ cancel();
155
+ const operation = slackApi(token, method, typeof body === 'function' ? body() : body, {
156
+ ...(fetchImpl ? { fetchImpl } : {}),
157
+ signal: request.signal, timeoutMs: remaining,
158
+ });
159
+ const result = await Promise.race([operation, cancelled]);
160
+ rememberEmbargo(bucket(method), result, now());
161
+ if (!result.ok)
162
+ log.warn('[slack:progress]', redactOutboundPayload({ method, outcome: result.status === 429 ? 'rate_limited' : 'unconfirmed' }));
163
+ return { result, attempted: true };
164
+ }
165
+ finally {
166
+ if (timeout)
167
+ clearTimer(timeout);
168
+ controller.signal.removeEventListener('abort', cancel);
169
+ }
87
170
  }
88
- const cleaned = deduped.join(' ').trim();
89
- return cleaned === '…' ? '' : cleaned;
90
- }
91
- /** Does this detail read as a search query rather than a human-meaningful label?
92
- *
93
- * Alternation, wildcards, character classes and anchors are the marks of a
94
- * pattern. Requiring one of those keeps ordinary details like a source path or
95
- * a README name visible, which is the whole value of the progress line. */
96
- function looksLikeSearchPattern(detail) {
97
- return /[|*+?\[\]()^$]/.test(detail) || /\\[a-zA-Z]/.test(detail);
98
- }
99
- export async function startSlackProgress(token, target, initialText, options = {}) {
100
- const fetchOpts = options.fetchImpl ? { fetchImpl: options.fetchImpl } : {};
101
- const transport = {
102
- async post(text) {
103
- // The final-answer path masks inside chunkSlackMessage(); this
104
- // transport calls slackApi directly and never did. Progress text
105
- // mirrors what the agent actually RAN, so a curl carrying a bearer
106
- // token reached the channel verbatim (#408).
107
- //
108
- // sanitizeProgressDetail below strips paths and commands, not
109
- // credentials different jobs, both needed.
110
- const result = await slackApi(token, 'chat.postMessage', {
111
- channel: target.targetId,
112
- text: redactOutboundText(text),
113
- ...(target.threadId ? { thread_ts: target.threadId } : {}),
114
- }, fetchOpts);
115
- return result.ok && result.data?.ts ? result.data.ts : null;
116
- },
117
- async edit(ts, text) {
118
- // Every edit too: progress is rewritten in place as tools run, so
119
- // masking only the first post would leak on the second (#408).
120
- const result = await slackApi(token, 'chat.update', { channel: target.targetId, ts, text: redactOutboundText(text) }, fetchOpts);
121
- if (!result.ok) {
122
- throw Object.assign(new Error(result.error || 'chat_update_failed'), {
123
- slackData: result.data,
124
- });
171
+ function schedule() {
172
+ if (closed || remoteEnded || !dirty || !state.ts || timer || inFlight)
173
+ return;
174
+ const method = state.mode === 'native' ? 'chat.appendStream' : 'chat.update';
175
+ const interval = state.mode === 'native' ? NATIVE_INTERVAL_MS : FALLBACK_INTERVAL_MS;
176
+ const delay = Math.max(0, lastAttemptAt + interval - now(), embargoUntil(bucket(method), now()) - now());
177
+ timer = setTimer(() => {
178
+ timer = null;
179
+ if (closed || remoteEnded)
180
+ return;
181
+ inFlight = flush().catch(() => { log.warn('[slack:progress] update failed'); });
182
+ void inFlight.finally(() => { inFlight = null; schedule(); });
183
+ }, Math.min(delay, 60000));
184
+ timer.unref?.();
185
+ }
186
+ async function flush() {
187
+ if (!state.ts || closed || remoteEnded)
188
+ return;
189
+ let snapshot = model.snapshot();
190
+ let signature = JSON.stringify(snapshot);
191
+ dirty = false;
192
+ if (signature === lastSignature)
193
+ return;
194
+ const method = state.mode === 'native' ? 'chat.appendStream' : 'chat.update';
195
+ const response = await call(method, () => {
196
+ // Shared throttling/Retry-After may have waited. Serialize current time
197
+ // and latest tool state only once we can actually send them.
198
+ snapshot = model.snapshot();
199
+ signature = JSON.stringify(snapshot);
200
+ lastAttemptAt = now();
201
+ const previous = new Set(lastSnapshot ? chunks(lastSnapshot).map(chunk => JSON.stringify(chunk)) : []);
202
+ const body = state.mode === 'native'
203
+ ? { chunks: chunks(snapshot).filter(chunk => !previous.has(JSON.stringify(chunk))) }
204
+ : fallbackBody(snapshot);
205
+ return { channel: address.targetId, ts: state.ts, ...body };
206
+ }, now() + OPERATION_TIMEOUT_MS, () => !closed && !remoteEnded, updateWait.signal);
207
+ if (!response.attempted) {
208
+ dirty = true;
209
+ return;
210
+ }
211
+ if (response.result.ok) {
212
+ lastSignature = signature;
213
+ lastSnapshot = snapshot;
214
+ }
215
+ if (response.result.status === 429 || response.result.error === 'ratelimited' || response.result.error === 'rate_limited')
216
+ dirty = true;
217
+ if (response.result.error === 'stopped_by_user' || response.result.error === 'message_not_in_streaming_state') {
218
+ remoteEnded = true;
219
+ clearScheduled();
220
+ }
221
+ }
222
+ function startIdle() {
223
+ if (closed || remoteEnded || !state.ts)
224
+ return;
225
+ idleTimer = setTimer(() => {
226
+ idleTimer = null;
227
+ dirty = true;
228
+ schedule();
229
+ startIdle();
230
+ }, state.mode === 'native' ? NATIVE_INTERVAL_MS : FALLBACK_INTERVAL_MS);
231
+ idleTimer.unref?.();
232
+ }
233
+ async function begin() {
234
+ const direct = address.targetId.startsWith('D');
235
+ if (!address.threadId || (!direct && (!recipient || !address.guildId)) || controller.signal.aborted)
236
+ return state;
237
+ const deadline = now() + OPERATION_TIMEOUT_MS;
238
+ let snapshot = model.snapshot();
239
+ const first = await call('chat.startStream', () => {
240
+ snapshot = model.snapshot();
241
+ return {
242
+ channel: address.targetId, thread_ts: address.threadId, task_display_mode: 'plan',
243
+ chunks: chunks(snapshot),
244
+ ...(!direct ? { recipient_user_id: recipient, recipient_team_id: address.guildId } : {}),
245
+ };
246
+ }, deadline);
247
+ let response = first;
248
+ let mode = 'native';
249
+ if (!first.result.ok && UNSUPPORTED.has(first.result.error ?? '') && !controller.signal.aborted) {
250
+ mode = 'fallback';
251
+ response = await call('chat.postMessage', () => {
252
+ snapshot = model.snapshot();
253
+ return { channel: address.targetId, thread_ts: address.threadId, ...fallbackBody(snapshot) };
254
+ }, deadline);
255
+ }
256
+ const ts = response.result.data?.['ts'];
257
+ if (response.result.ok && typeof ts === 'string' && ts) {
258
+ state = { mode, ts };
259
+ lastSignature = JSON.stringify(snapshot);
260
+ lastSnapshot = snapshot;
261
+ try {
262
+ onPosted?.(ts);
125
263
  }
126
- },
127
- async remove(ts) {
128
- const result = await slackApi(token, 'chat.delete', { channel: target.targetId, ts }, fetchOpts);
129
- if (!result.ok) {
130
- throw Object.assign(new Error(result.error || 'chat_delete_failed'), {
131
- slackData: result.data,
132
- });
264
+ catch {
265
+ log.warn('[slack:progress] receipt callback failed');
133
266
  }
134
- },
135
- };
136
- const stream = await startDraftStream(transport, toMrkdwn(truncateStatus(initialText)), {
137
- minEditIntervalMs: EDIT_INTERVAL_MS,
138
- maxChars: MAX_STATUS_LEN,
139
- ...options.draftClock,
140
- onError(operation, error) {
141
- const typed = error;
142
- describeSlackError(typed.message || `${operation}_failed`, typed.slackData);
143
- },
267
+ if (!closed) {
268
+ dirty = true;
269
+ schedule();
270
+ startIdle();
271
+ }
272
+ }
273
+ else {
274
+ const definite = !response.attempted || DEFINITE_REJECTION.has(response.result.error ?? '') || response.result.status === 429;
275
+ state = { mode: definite ? 'none' : 'ambiguous', ts: null };
276
+ }
277
+ return state;
278
+ }
279
+ const ready = begin().catch(() => {
280
+ log.warn('[slack:progress] startup failed');
281
+ state = { mode: 'ambiguous', ts: null };
282
+ return state;
144
283
  });
284
+ function projectedTool(entry) {
285
+ if (!closed && model.tool(entry)) {
286
+ dirty = true;
287
+ schedule();
288
+ }
289
+ }
145
290
  return {
146
291
  update(text) {
147
- const next = truncateStatus(text);
148
- if (next)
149
- stream.update(toMrkdwn(next));
292
+ const entry = projectSlackPrintTool({ label: text, toolType: 'tool' });
293
+ if (entry)
294
+ projectedTool(entry);
150
295
  },
151
- async finish() {
152
- // The answer arrives as its own message, so the status placeholder
153
- // is deleted rather than left as a stale "working…" line.
154
- await stream.discard();
296
+ tool(data) { const entry = projectSlackPrintTool(data, workingDir); if (entry)
297
+ projectedTool(entry); },
298
+ projectedTool,
299
+ phase(value) { if (!closed && model.phase(value)) {
300
+ dirty = true;
301
+ schedule();
302
+ } },
303
+ ready: () => ready,
304
+ ts: () => state.ts,
305
+ terminalConfirmed: () => confirmed,
306
+ abort: abortProgress,
307
+ finish(outcome = 'complete', finishOptions = {}) {
308
+ if (terminal)
309
+ return terminal;
310
+ closed = true;
311
+ clearScheduled();
312
+ updateWait.abort();
313
+ model.finish(outcome, finishOptions.reason, finishOptions.bodyDelivered);
314
+ const deadline = now() + OPERATION_TIMEOUT_MS;
315
+ const finishTimer = setTimer(() => controller.abort(), OPERATION_TIMEOUT_MS);
316
+ terminal = (async () => {
317
+ try {
318
+ await ready;
319
+ await inFlight;
320
+ if (!state.ts || controller.signal.aborted)
321
+ return;
322
+ const snapshot = model.snapshot();
323
+ const response = await call(state.mode === 'native' ? 'chat.stopStream' : 'chat.update', {
324
+ channel: address.targetId, ts: state.ts,
325
+ ...(state.mode === 'native' ? { chunks: chunks(snapshot) } : fallbackBody(snapshot)),
326
+ }, deadline);
327
+ confirmed = response.result.ok || response.result.error === 'message_not_found';
328
+ }
329
+ catch {
330
+ log.warn('[slack:progress] terminal update failed');
331
+ }
332
+ finally {
333
+ clearTimer(finishTimer);
334
+ parentSignal?.removeEventListener('abort', abortParent);
335
+ }
336
+ })();
337
+ return terminal;
155
338
  },
156
- ts() { return stream.handle(); },
157
339
  };
158
340
  }
159
341
  //# sourceMappingURL=progress.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"progress.js","sourceRoot":"","sources":["../../../src/slack/progress.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"progress.js","sourceRoot":"","sources":["../../../src/slack/progress.ts"],"names":[],"mappings":"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"}