botmux 2.84.0 → 2.85.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (186) hide show
  1. package/README.md +4 -0
  2. package/dist/adapters/backend/sandbox.d.ts +4 -0
  3. package/dist/adapters/backend/sandbox.d.ts.map +1 -1
  4. package/dist/adapters/backend/sandbox.js +14 -0
  5. package/dist/adapters/backend/sandbox.js.map +1 -1
  6. package/dist/adapters/cli/claude-code.d.ts.map +1 -1
  7. package/dist/adapters/cli/claude-code.js +4 -1
  8. package/dist/adapters/cli/claude-code.js.map +1 -1
  9. package/dist/adapters/cli/types.d.ts +11 -0
  10. package/dist/adapters/cli/types.d.ts.map +1 -1
  11. package/dist/bot-registry.d.ts +18 -0
  12. package/dist/bot-registry.d.ts.map +1 -1
  13. package/dist/bot-registry.js +34 -0
  14. package/dist/bot-registry.js.map +1 -1
  15. package/dist/cli.d.ts.map +1 -1
  16. package/dist/cli.js +30 -65
  17. package/dist/cli.js.map +1 -1
  18. package/dist/core/command-handler.d.ts.map +1 -1
  19. package/dist/core/command-handler.js +42 -1
  20. package/dist/core/command-handler.js.map +1 -1
  21. package/dist/core/dashboard-ipc-server.d.ts.map +1 -1
  22. package/dist/core/dashboard-ipc-server.js +100 -1
  23. package/dist/core/dashboard-ipc-server.js.map +1 -1
  24. package/dist/core/passthrough-commands.d.ts.map +1 -1
  25. package/dist/core/passthrough-commands.js +1 -1
  26. package/dist/core/passthrough-commands.js.map +1 -1
  27. package/dist/core/pending-response.d.ts +2 -39
  28. package/dist/core/pending-response.d.ts.map +1 -1
  29. package/dist/core/pending-response.js +5 -99
  30. package/dist/core/pending-response.js.map +1 -1
  31. package/dist/core/session-manager.d.ts.map +1 -1
  32. package/dist/core/session-manager.js +4 -16
  33. package/dist/core/session-manager.js.map +1 -1
  34. package/dist/core/skills/claude-plugin-delivery.d.ts +6 -0
  35. package/dist/core/skills/claude-plugin-delivery.d.ts.map +1 -0
  36. package/dist/core/skills/claude-plugin-delivery.js +21 -0
  37. package/dist/core/skills/claude-plugin-delivery.js.map +1 -0
  38. package/dist/core/skills/cli-admin-command.d.ts +7 -0
  39. package/dist/core/skills/cli-admin-command.d.ts.map +1 -0
  40. package/dist/core/skills/cli-admin-command.js +243 -0
  41. package/dist/core/skills/cli-admin-command.js.map +1 -0
  42. package/dist/core/skills/cli-session-command.d.ts +7 -0
  43. package/dist/core/skills/cli-session-command.d.ts.map +1 -0
  44. package/dist/core/skills/cli-session-command.js +45 -0
  45. package/dist/core/skills/cli-session-command.js.map +1 -0
  46. package/dist/core/skills/delivery.d.ts +11 -0
  47. package/dist/core/skills/delivery.d.ts.map +1 -0
  48. package/dist/core/skills/delivery.js +22 -0
  49. package/dist/core/skills/delivery.js.map +1 -0
  50. package/dist/core/skills/discovery.d.ts +3 -0
  51. package/dist/core/skills/discovery.d.ts.map +1 -0
  52. package/dist/core/skills/discovery.js +34 -0
  53. package/dist/core/skills/discovery.js.map +1 -0
  54. package/dist/core/skills/frontmatter.d.ts +9 -0
  55. package/dist/core/skills/frontmatter.d.ts.map +1 -0
  56. package/dist/core/skills/frontmatter.js +42 -0
  57. package/dist/core/skills/frontmatter.js.map +1 -0
  58. package/dist/core/skills/im-command.d.ts +9 -0
  59. package/dist/core/skills/im-command.d.ts.map +1 -0
  60. package/dist/core/skills/im-command.js +107 -0
  61. package/dist/core/skills/im-command.js.map +1 -0
  62. package/dist/core/skills/manifest-store.d.ts +4 -0
  63. package/dist/core/skills/manifest-store.d.ts.map +1 -0
  64. package/dist/core/skills/manifest-store.js +26 -0
  65. package/dist/core/skills/manifest-store.js.map +1 -0
  66. package/dist/core/skills/package.d.ts +13 -0
  67. package/dist/core/skills/package.d.ts.map +1 -0
  68. package/dist/core/skills/package.js +35 -0
  69. package/dist/core/skills/package.js.map +1 -0
  70. package/dist/core/skills/policy.d.ts +18 -0
  71. package/dist/core/skills/policy.d.ts.map +1 -0
  72. package/dist/core/skills/policy.js +69 -0
  73. package/dist/core/skills/policy.js.map +1 -0
  74. package/dist/core/skills/prompt.d.ts +3 -0
  75. package/dist/core/skills/prompt.d.ts.map +1 -0
  76. package/dist/core/skills/prompt.js +25 -0
  77. package/dist/core/skills/prompt.js.map +1 -0
  78. package/dist/core/skills/references.d.ts +21 -0
  79. package/dist/core/skills/references.d.ts.map +1 -0
  80. package/dist/core/skills/references.js +27 -0
  81. package/dist/core/skills/references.js.map +1 -0
  82. package/dist/core/skills/registry-paths.d.ts +5 -0
  83. package/dist/core/skills/registry-paths.d.ts.map +1 -0
  84. package/dist/core/skills/registry-paths.js +15 -0
  85. package/dist/core/skills/registry-paths.js.map +1 -0
  86. package/dist/core/skills/resource-reader.d.ts +9 -0
  87. package/dist/core/skills/resource-reader.d.ts.map +1 -0
  88. package/dist/core/skills/resource-reader.js +97 -0
  89. package/dist/core/skills/resource-reader.js.map +1 -0
  90. package/dist/core/skills/session-resolver.d.ts +14 -0
  91. package/dist/core/skills/session-resolver.d.ts.map +1 -0
  92. package/dist/core/skills/session-resolver.js +24 -0
  93. package/dist/core/skills/session-resolver.js.map +1 -0
  94. package/dist/core/skills/session-runtime.d.ts +14 -0
  95. package/dist/core/skills/session-runtime.d.ts.map +1 -0
  96. package/dist/core/skills/session-runtime.js +32 -0
  97. package/dist/core/skills/session-runtime.js.map +1 -0
  98. package/dist/core/skills/sources.d.ts +21 -0
  99. package/dist/core/skills/sources.d.ts.map +1 -0
  100. package/dist/core/skills/sources.js +155 -0
  101. package/dist/core/skills/sources.js.map +1 -0
  102. package/dist/core/skills/types.d.ts +71 -0
  103. package/dist/core/skills/types.d.ts.map +1 -0
  104. package/dist/core/skills/types.js +2 -0
  105. package/dist/core/skills/types.js.map +1 -0
  106. package/dist/core/startup-commands.d.ts +57 -0
  107. package/dist/core/startup-commands.d.ts.map +1 -0
  108. package/dist/core/startup-commands.js +85 -0
  109. package/dist/core/startup-commands.js.map +1 -0
  110. package/dist/core/types.d.ts +10 -3
  111. package/dist/core/types.d.ts.map +1 -1
  112. package/dist/core/types.js.map +1 -1
  113. package/dist/core/worker-pool.d.ts +14 -1
  114. package/dist/core/worker-pool.d.ts.map +1 -1
  115. package/dist/core/worker-pool.js +93 -62
  116. package/dist/core/worker-pool.js.map +1 -1
  117. package/dist/daemon.d.ts +2 -2
  118. package/dist/daemon.d.ts.map +1 -1
  119. package/dist/daemon.js +49 -52
  120. package/dist/daemon.js.map +1 -1
  121. package/dist/dashboard/skill-install-request.d.ts +21 -0
  122. package/dist/dashboard/skill-install-request.d.ts.map +1 -0
  123. package/dist/dashboard/skill-install-request.js +62 -0
  124. package/dist/dashboard/skill-install-request.js.map +1 -0
  125. package/dist/dashboard/web/app.d.ts.map +1 -1
  126. package/dist/dashboard/web/app.js +4 -1
  127. package/dist/dashboard/web/app.js.map +1 -1
  128. package/dist/dashboard/web/bot-defaults.d.ts.map +1 -1
  129. package/dist/dashboard/web/bot-defaults.js +61 -1
  130. package/dist/dashboard/web/bot-defaults.js.map +1 -1
  131. package/dist/dashboard/web/i18n.d.ts.map +1 -1
  132. package/dist/dashboard/web/i18n.js +146 -0
  133. package/dist/dashboard/web/i18n.js.map +1 -1
  134. package/dist/dashboard/web/skills.d.ts +2 -0
  135. package/dist/dashboard/web/skills.d.ts.map +1 -0
  136. package/dist/dashboard/web/skills.js +539 -0
  137. package/dist/dashboard/web/skills.js.map +1 -0
  138. package/dist/dashboard-web/app.js +599 -446
  139. package/dist/dashboard-web/index.html +1 -0
  140. package/dist/dashboard-web/style.css +793 -0
  141. package/dist/dashboard.js +250 -0
  142. package/dist/dashboard.js.map +1 -1
  143. package/dist/global-config.d.ts +7 -0
  144. package/dist/global-config.d.ts.map +1 -1
  145. package/dist/global-config.js +16 -0
  146. package/dist/global-config.js.map +1 -1
  147. package/dist/i18n/en.d.ts.map +1 -1
  148. package/dist/i18n/en.js +3 -5
  149. package/dist/i18n/en.js.map +1 -1
  150. package/dist/i18n/zh.d.ts.map +1 -1
  151. package/dist/i18n/zh.js +3 -5
  152. package/dist/i18n/zh.js.map +1 -1
  153. package/dist/im/lark/card-builder.d.ts +0 -3
  154. package/dist/im/lark/card-builder.d.ts.map +1 -1
  155. package/dist/im/lark/card-builder.js +2 -33
  156. package/dist/im/lark/card-builder.js.map +1 -1
  157. package/dist/services/bot-config-store.d.ts +10 -4
  158. package/dist/services/bot-config-store.d.ts.map +1 -1
  159. package/dist/services/bot-config-store.js +29 -2
  160. package/dist/services/bot-config-store.js.map +1 -1
  161. package/dist/services/session-store.d.ts +1 -0
  162. package/dist/services/session-store.d.ts.map +1 -1
  163. package/dist/services/session-store.js +12 -5
  164. package/dist/services/session-store.js.map +1 -1
  165. package/dist/services/skill-registry-store.d.ts +42 -0
  166. package/dist/services/skill-registry-store.d.ts.map +1 -0
  167. package/dist/services/skill-registry-store.js +343 -0
  168. package/dist/services/skill-registry-store.js.map +1 -0
  169. package/dist/skills/installer.d.ts.map +1 -1
  170. package/dist/skills/installer.js +3 -0
  171. package/dist/skills/installer.js.map +1 -1
  172. package/dist/types.d.ts +3 -5
  173. package/dist/types.d.ts.map +1 -1
  174. package/dist/utils/file-lock.d.ts +1 -0
  175. package/dist/utils/file-lock.d.ts.map +1 -1
  176. package/dist/utils/file-lock.js +87 -1
  177. package/dist/utils/file-lock.js.map +1 -1
  178. package/dist/worker.js +127 -20
  179. package/dist/worker.js.map +1 -1
  180. package/dist/workflows/definition.d.ts +16 -16
  181. package/dist/workflows/events/schema.d.ts +280 -280
  182. package/package.json +1 -1
  183. package/dist/services/pending-response-transaction-store.d.ts +0 -12
  184. package/dist/services/pending-response-transaction-store.d.ts.map +0 -1
  185. package/dist/services/pending-response-transaction-store.js +0 -52
  186. package/dist/services/pending-response-transaction-store.js.map +0 -1
@@ -0,0 +1,85 @@
1
+ /**
2
+ * Startup commands — per-bot slash commands the worker types into a freshly
3
+ * spawned CLI right after it's ready, BEFORE the user's first prompt (e.g.
4
+ * `/effort ultracode`, `/model opus`). Extracted into a leaf module so both
5
+ * bots.json parsing ({@link ../bot-registry.js}) and the `/botconfig` config
6
+ * store ({@link ../services/bot-config-store.js}) share one normalization
7
+ * without a circular import.
8
+ *
9
+ * Unlike {@link ./passthrough-commands.js}'s customPassthroughCommands — which
10
+ * are single-token slash commands routed through the daemon — a startup command
11
+ * is a whole input LINE typed verbatim into the CLI's TUI, so it MAY carry
12
+ * space-delimited arguments (`/effort ultracode`). That's why the free-text
13
+ * parser splits on comma/newline only (never whitespace) and the per-entry
14
+ * normalizer keeps internal spaces intact.
15
+ */
16
+ /** Defensive cap on a single startup-command line (chars). */
17
+ const MAX_STARTUP_COMMAND_LEN = 200;
18
+ /**
19
+ * Normalize a single startup command: collapse embedded newlines (each command
20
+ * must submit as one line), trim, and ensure a leading `/` (so users can type
21
+ * `effort ultracode` or `/effort ultracode`). Returns null for empty / too-long
22
+ * input. Internal spaces (arguments) are preserved.
23
+ */
24
+ export function normalizeStartupCommand(cmd) {
25
+ if (typeof cmd !== 'string')
26
+ return null;
27
+ const oneLine = cmd.replace(/[\r\n]+/g, ' ').trim();
28
+ if (!oneLine)
29
+ return null;
30
+ const withSlash = oneLine.startsWith('/') ? oneLine : `/${oneLine}`;
31
+ if (withSlash.length > MAX_STARTUP_COMMAND_LEN)
32
+ return null;
33
+ return withSlash;
34
+ }
35
+ /**
36
+ * Parse free-text dashboard / `/botconfig` input into a normalized, order-
37
+ * preserving, deduped startup-command list. Commands are separated by comma OR
38
+ * newline (NOT whitespace, since a command's arguments are space-delimited).
39
+ * Mirrors the normalization {@link ../bot-registry.js}'s parseBotConfigsFromText
40
+ * applies when loading bots.json, so a round-trip through the card is stable.
41
+ */
42
+ export function parseStartupCommandsInput(raw) {
43
+ const out = [];
44
+ for (const tok of String(raw ?? '').split(/[,\n]+/)) {
45
+ const norm = normalizeStartupCommand(tok);
46
+ if (norm)
47
+ out.push(norm);
48
+ }
49
+ return [...new Set(out)];
50
+ }
51
+ /** Normalize an array (bots.json form) of startup commands. */
52
+ export function normalizeStartupCommandList(arr) {
53
+ if (!Array.isArray(arr))
54
+ return [];
55
+ const out = [];
56
+ for (const entry of arr) {
57
+ const norm = normalizeStartupCommand(entry);
58
+ if (norm)
59
+ out.push(norm);
60
+ }
61
+ return [...new Set(out)];
62
+ }
63
+ /**
64
+ * Whether a spawn should (re-)run startupCommands. They run on a genuinely fresh
65
+ * CLI process; a reattach to a LIVE persistent (tmux/zellij/herdr) pane — e.g. a
66
+ * daemon restart recovering an existing session — is the SAME CLI with its
67
+ * effort/model/context already established, so re-typing `/effort` (idempotent)
68
+ * or `/clear`,`/compact` (NOT idempotent) would corrupt it. Skip on reattach.
69
+ */
70
+ export function shouldRunStartupCommandsOnSpawn(opts) {
71
+ return !opts.willReattachPersistent;
72
+ }
73
+ /**
74
+ * Whether to defer the initial prompt from launch-args to the normal input queue
75
+ * so startupCommands precede it. Only when commands exist AND the CLI bakes the
76
+ * first prompt into launch args (passesInitialPromptViaArgs, e.g. Gemini `-i`):
77
+ * an args-baked prompt would execute BEFORE flushPending's startup-command hook,
78
+ * breaking the "before the first message" contract. Adopt never spawns fresh.
79
+ * Default path (no startupCommands) is untouched, so args-CLIs keep their robust
80
+ * `-i` delivery unless a bot opts in.
81
+ */
82
+ export function shouldDeferInitialPromptForStartup(opts) {
83
+ return opts.hasStartupCommands && !opts.adoptMode && opts.passesInitialPromptViaArgs;
84
+ }
85
+ //# sourceMappingURL=startup-commands.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"startup-commands.js","sourceRoot":"","sources":["../../src/core/startup-commands.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,8DAA8D;AAC9D,MAAM,uBAAuB,GAAG,GAAG,CAAC;AAEpC;;;;;GAKG;AACH,MAAM,UAAU,uBAAuB,CAAC,GAAY;IAClD,IAAI,OAAO,GAAG,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC;IACzC,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;IACpD,IAAI,CAAC,OAAO;QAAE,OAAO,IAAI,CAAC;IAC1B,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,OAAO,EAAE,CAAC;IACpE,IAAI,SAAS,CAAC,MAAM,GAAG,uBAAuB;QAAE,OAAO,IAAI,CAAC;IAC5D,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,yBAAyB,CAAC,GAAW;IACnD,MAAM,GAAG,GAAa,EAAE,CAAC;IACzB,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC;QACpD,MAAM,IAAI,GAAG,uBAAuB,CAAC,GAAG,CAAC,CAAC;QAC1C,IAAI,IAAI;YAAE,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC3B,CAAC;IACD,OAAO,CAAC,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;AAC3B,CAAC;AAED,+DAA+D;AAC/D,MAAM,UAAU,2BAA2B,CAAC,GAAY;IACtD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC;QAAE,OAAO,EAAE,CAAC;IACnC,MAAM,GAAG,GAAa,EAAE,CAAC;IACzB,KAAK,MAAM,KAAK,IAAI,GAAG,EAAE,CAAC;QACxB,MAAM,IAAI,GAAG,uBAAuB,CAAC,KAAK,CAAC,CAAC;QAC5C,IAAI,IAAI;YAAE,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC3B,CAAC;IACD,OAAO,CAAC,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;AAC3B,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,+BAA+B,CAAC,IAAyC;IACvF,OAAO,CAAC,IAAI,CAAC,sBAAsB,CAAC;AACtC,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,kCAAkC,CAAC,IAIlD;IACC,OAAO,IAAI,CAAC,kBAAkB,IAAI,CAAC,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,0BAA0B,CAAC;AACvF,CAAC"}
@@ -86,6 +86,16 @@ export interface DaemonSession {
86
86
  * command so a user can manually summon a live card in an otherwise-quiet
87
87
  * session. In-memory only (resets on daemon restart). */
88
88
  streamingCardForced?: boolean;
89
+ /** Two-phase turn reactions (auto-on for card-off sessions, i.e. streaming
90
+ * card disabled). The bot reacts 冲! on each user message the moment it's accepted for the session
91
+ * (bound to the message, NOT a worker status edge — so type-ahead / busy-
92
+ * batched messages each get their own reaction). Every pending ✋ here is
93
+ * flipped to ✅ when the turn returns to idle. In-memory only (a daemon
94
+ * restart mid-turn just leaves a stale ✋ — purely cosmetic). */
95
+ pendingAckReactions?: Array<{
96
+ messageId: string;
97
+ reactionId?: string;
98
+ }>;
89
99
  /** Card body display mode. Default 'hidden'. When user clicks 显示输出, defaults to 'screenshot'. */
90
100
  displayMode?: DisplayMode;
91
101
  /** Latest uploaded screenshot image_key for the streaming card. */
@@ -107,9 +117,6 @@ export interface DaemonSession {
107
117
  turnId: string;
108
118
  updatedAt: string;
109
119
  };
110
- pendingResponseCardId?: string;
111
- pendingResponseCardState?: 'open' | 'patched';
112
- lastPatchedResponseCardId?: string;
113
120
  currentTurnTitle?: string;
114
121
  cardPatchInFlight?: boolean;
115
122
  pendingCardJson?: string;
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/core/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/core/types.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/core/types.ts"],"names":[],"mappings":"AAiBA;;6DAE6D;AAC7D,MAAM,UAAU,iBAAiB,CAAC,EAAc;IAC9C,IAAI,EAAE,CAAC,WAAW,KAAK,YAAY,IAAI,EAAE,CAAC,WAAW,KAAK,QAAQ;QAAE,OAAO,EAAE,CAAC,WAAW,CAAC;IAC1F,OAAO,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,QAAQ,CAAC;AAC/C,CAAC;AAyID;;;;;uDAKuD;AACvD,MAAM,UAAU,UAAU,CAAC,QAAgB,EAAE,SAAiB;IAC5D,OAAO,GAAG,QAAQ,KAAK,SAAS,EAAE,CAAC;AACrC,CAAC;AAED;;+BAE+B;AAC/B,MAAM,UAAU,eAAe,CAAC,EAAiB;IAC/C,OAAO,EAAE,CAAC,KAAK,KAAK,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,aAAa,CAAC;AACpE,CAAC"}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/core/types.ts"],"names":[],"mappings":"AAiBA;;6DAE6D;AAC7D,MAAM,UAAU,iBAAiB,CAAC,EAAc;IAC9C,IAAI,EAAE,CAAC,WAAW,KAAK,YAAY,IAAI,EAAE,CAAC,WAAW,KAAK,QAAQ;QAAE,OAAO,EAAE,CAAC,WAAW,CAAC;IAC1F,OAAO,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,QAAQ,CAAC;AAC/C,CAAC;AA6ID;;;;;uDAKuD;AACvD,MAAM,UAAU,UAAU,CAAC,QAAgB,EAAE,SAAiB;IAC5D,OAAO,GAAG,QAAQ,KAAK,SAAS,EAAE,CAAC;AACrC,CAAC;AAED;;+BAE+B;AAC/B,MAAM,UAAU,eAAe,CAAC,EAAiB;IAC/C,OAAO,EAAE,CAAC,KAAK,KAAK,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,aAAa,CAAC;AACpE,CAAC"}
@@ -331,6 +331,18 @@ targetScope: 'thread' | 'chat', opts?: {
331
331
  }>;
332
332
  export declare function forkWorker(ds: DaemonSession, prompt: string, resume?: boolean): void;
333
333
  declare function setupWorkerHandlers(ds: DaemonSession, worker: ChildProcess): void;
334
+ /**
335
+ * Turn-end half of the two-phase turn reactions (auto-on for card-off sessions,
336
+ * i.e. streaming card disabled). The 冲! "received" reactions are added per-message at the daemon
337
+ * acceptance point (`noteTurnReceived`); when the worker next returns to idle we
338
+ * flip every pending ✋ on this session to ✅ DONE and clear the list. Binding the
339
+ * start to the message (not a status edge) means type-ahead / busy-batched
340
+ * messages each get their own reaction and all settle together here.
341
+ *
342
+ * Every Feishu call is best-effort — a failure only means a missing emoji, so it
343
+ * must never throw into the status pipeline (callers invoke as `void`).
344
+ */
345
+ declare function finishTurnReactions(ds: DaemonSession): Promise<void>;
334
346
  /** Deliver a bridge `final_output` to Lark. The worker emits each turn
335
347
  * exactly once (it pops the turn off its queue at emit time), so the
336
348
  * daemon owns retries on transient failures. After 3 attempts we log
@@ -338,11 +350,12 @@ declare function setupWorkerHandlers(ds: DaemonSession, worker: ChildProcess): v
338
350
  * via an unbounded retry loop. */
339
351
  declare function deliverFinalOutput(ds: DaemonSession, msg: Extract<WorkerToDaemon, {
340
352
  type: 'final_output';
341
- }>, t: string, attempt: number, lockedPendingCardId?: string, lockedQuoteTargetId?: string): void;
353
+ }>, t: string, attempt: number): void;
342
354
  /** Test-only alias so the retry pipeline can be exercised without a real
343
355
  * fork. Intentionally underscored to discourage non-test callers. */
344
356
  export declare const __testOnly_deliverFinalOutput: typeof deliverFinalOutput;
345
357
  export declare const __testOnly_setupWorkerHandlers: typeof setupWorkerHandlers;
358
+ export declare const __testOnly_finishTurnReactions: typeof finishTurnReactions;
346
359
  export declare function forkAdoptWorker(ds: DaemonSession, opts?: {
347
360
  restoredFromMetadata?: boolean;
348
361
  }): void;
@@ -1 +1 @@
1
- {"version":3,"file":"worker-pool.d.ts","sourceRoot":"","sources":["../../src/core/worker-pool.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"worker-pool.d.ts","sourceRoot":"","sources":["../../src/core/worker-pool.ts"],"names":[],"mappings":"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"}
@@ -16,10 +16,9 @@ import { config } from '../config.js';
16
16
  import * as sessionStore from '../services/session-store.js';
17
17
  import { persistStreamCardState, rememberLastCliInput } from './session-manager.js';
18
18
  import { fallbackTurnId } from './reply-target.js';
19
- import { updateMessage, deleteMessage, sendEphemeralCard, sendUserMessage, addReaction, MessageWithdrawnError } from '../im/lark/client.js';
19
+ import { updateMessage, deleteMessage, sendEphemeralCard, sendUserMessage, addReaction, removeReaction, MessageWithdrawnError } from '../im/lark/client.js';
20
20
  import { buildStreamingCard, buildPrivateSnapshotCard, buildSessionCard, buildTuiPromptCard, buildTuiPromptResolvedCard, buildRelayedFrozenCard, getCliDisplayName } from '../im/lark/card-builder.js';
21
21
  import { loadFrozenCards, saveFrozenCards } from '../services/frozen-card-store.js';
22
- import { clearPendingResponsePatchMarker, markPendingResponsePatchMarkerPatched, writePendingResponsePatchMarker } from '../services/pending-response-transaction-store.js';
23
22
  import { logger } from '../utils/logger.js';
24
23
  import { createCliAdapterSync } from '../adapters/cli/registry.js';
25
24
  import { botLocale, localeForBot, t as tr } from '../i18n/index.js';
@@ -39,8 +38,10 @@ import { publishAttentionPatch } from './session-activity.js';
39
38
  import { knownBotOpenIdsFromCrossRef } from '../utils/bot-routing.js';
40
39
  import { emitSessionLifecycleHook, emitSessionStateTransitionHook } from '../services/session-lifecycle-hooks.js';
41
40
  import { anchorUsageForDaemonSession, recordOwnershipForDaemonSession, recordUsageForDaemonSession, reconcileUsageForDaemonSession } from '../services/usage-ledger.js';
41
+ import { prepareSessionSkillPrompt } from './skills/session-runtime.js';
42
+ import { prepareSkillDelivery } from './skills/delivery.js';
42
43
  import { sessionKey, sessionAnchorId } from './types.js';
43
- import { claimPendingResponseCard, COMPLETED_REACTION_EMOJI_TYPE, markPendingResponseCardPatchedIfCurrent, syncPendingResponseState } from './pending-response.js';
44
+ import { DONE_REACTION_EMOJI_TYPE } from './pending-response.js';
44
45
  import { buildTerminalUrl } from './terminal-url.js';
45
46
  import { prependBotmuxBin } from './botmux-wrapper.js';
46
47
  import { usageLimitStateKey } from '../utils/cli-usage-limit.js';
@@ -1357,6 +1358,16 @@ export function forkWorker(ds, prompt, resume = false) {
1357
1358
  const cwd = rawCwd && existsSync(rawCwd) ? rawCwd : homedir();
1358
1359
  if (cwd !== rawCwd)
1359
1360
  logger.warn(`[${t}] workingDir "${rawCwd}" does not exist — falling back to ${cwd}`);
1361
+ // Materialise the resolved launch dir on the live session. getSessionWorkingDir()
1362
+ // falls back to the bot-default workingDir, but the usage ledger and dashboard read
1363
+ // `ds.workingDir ?? s.workingDir` RAW (without that fallback). A session that inherits
1364
+ // the bot-default workingDir — i.e. one never pinned via /repo or /cd — therefore leaves
1365
+ // ds.workingDir undefined, so getSessionTokenUsage() is handed cwd=undefined, cannot
1366
+ // locate the CLI transcript, and the session's token usage silently never records.
1367
+ // Pinning the resolved cwd here (it equals what the worker actually forked into) closes
1368
+ // that gap without touching the persisted session.workingDir "unset = follow default"
1369
+ // semantics: this is re-derived on every fork/restore.
1370
+ ds.workingDir = cwd;
1360
1371
  // Sandbox decision is RECORDED ON THE SESSION at creation and reused on
1361
1372
  // restore — so toggling the live bot flag never retroactively (un)sandboxes a
1362
1373
  // historical session. A brand-new session (resume=false) with no recorded
@@ -1404,6 +1415,33 @@ export function forkWorker(ds, prompt, resume = false) {
1404
1415
  const familyAdapter = createCliAdapterSync(botCfg.cliId, botCfg.cliPathOverride);
1405
1416
  if (familyAdapter.claudeStateJsonPath)
1406
1417
  ensureClaudeFolderTrust(cwd, familyAdapter.claudeStateJsonPath);
1418
+ let skillPluginDir;
1419
+ let skillReadonlyRoots;
1420
+ if (!resume && prompt.trim().length > 0) {
1421
+ const preparedSkills = prepareSessionSkillPrompt({
1422
+ sessionId: ds.session.sessionId,
1423
+ cliId: botCfg.cliId,
1424
+ workingDir: cwd,
1425
+ prompt,
1426
+ botPolicy: botCfg.skills,
1427
+ });
1428
+ prompt = preparedSkills.prompt;
1429
+ const delivery = prepareSkillDelivery(familyAdapter, preparedSkills.manifest, preparedSkills.manifest?.delivery ?? 'auto');
1430
+ skillPluginDir = delivery.pluginDir;
1431
+ skillReadonlyRoots = delivery.readonlyRoots.length ? delivery.readonlyRoots : undefined;
1432
+ for (const diagnostic of delivery.diagnostics)
1433
+ logger.warn(`[${t}] skill delivery: ${diagnostic}`);
1434
+ if (delivery.fatal) {
1435
+ const reason = delivery.diagnostics.join(', ') || 'unknown';
1436
+ const message = tr('worker.skill_delivery_failed', { reason }, botLocale(botCfg));
1437
+ logger.warn(`[${t}] Skill delivery blocked session start: ${reason}`);
1438
+ void cb.sessionReply(sessionAnchorId(ds), message, undefined, ds.larkAppId, fallbackTurnId(ds, undefined))
1439
+ .catch((err) => logger.warn(`[${t}] Failed to notify skill delivery error: ${err?.message ?? err}`));
1440
+ void closeSession(ds.session.sessionId)
1441
+ .catch((err) => logger.warn(`[${t}] Failed to close skill delivery error session: ${err?.message ?? err}`));
1442
+ return;
1443
+ }
1444
+ }
1407
1445
  // Prepend ~/.botmux/bin to PATH so CLIs can call `botmux send` etc.
1408
1446
  // The wrapper script there is written by the daemon at startup.
1409
1447
  const botmuxBinDir = join(homedir(), '.botmux', 'bin');
@@ -1418,6 +1456,7 @@ export function forkWorker(ds, prompt, resume = false) {
1418
1456
  CLAUDECODE: undefined,
1419
1457
  BOTMUX: '1', // Marker so user scripts/skills can detect a botmux-spawned CLI
1420
1458
  SESSION_DATA_DIR: config.session.dataDir,
1459
+ BOTMUX_SESSION_ID: ds.session.sessionId,
1421
1460
  LARK_APP_ID: botCfg.larkAppId,
1422
1461
  LARK_APP_SECRET: botCfg.larkAppSecret,
1423
1462
  },
@@ -1457,6 +1496,10 @@ export function forkWorker(ds, prompt, resume = false) {
1457
1496
  wrapperCli: botCfg.wrapperCli,
1458
1497
  model: botCfg.model,
1459
1498
  disableCliBypass: botCfg.disableCliBypass === true,
1499
+ // Startup commands run on every fresh spawn (incl. resume) so session-only
1500
+ // settings like `/effort ultracode` are re-established. Adopt sessions are
1501
+ // observed, not driven — forkAdoptWorker intentionally omits this.
1502
+ startupCommands: botCfg.startupCommands,
1460
1503
  // Use the decision recorded on the session (above), NOT the live bot flag, so
1461
1504
  // historical sessions never get retroactively sandboxed on restart.
1462
1505
  sandbox: ds.session.sandbox === true,
@@ -1474,6 +1517,8 @@ export function forkWorker(ds, prompt, resume = false) {
1474
1517
  botOpenId: bot.botOpenId,
1475
1518
  locale: botLocale(botCfg),
1476
1519
  turnId: ds.currentReplyTarget?.turnId,
1520
+ skillPluginDir,
1521
+ skillReadonlyRoots,
1477
1522
  };
1478
1523
  worker.send(initMsg);
1479
1524
  ds.initConfig = initMsg;
@@ -1736,10 +1781,12 @@ function setupWorkerHandlers(ds, worker) {
1736
1781
  source: 'screen_update',
1737
1782
  content: msg.content,
1738
1783
  });
1739
- // Usage ledger: idle/limited edges are turn boundaries — append the
1740
- // token delta accrued during the turn that just finished.
1784
+ // Usage ledger + turn reactions: idle/limited edges are turn
1785
+ // boundaries. Append the token delta, and flip this turn's pending
1786
+ // reactions to ✅ (best-effort, never blocks the status pipeline).
1741
1787
  if (ds.lastScreenStatus === 'idle' || ds.lastScreenStatus === 'limited') {
1742
1788
  recordUsageForDaemonSession(ds);
1789
+ void finishTurnReactions(ds);
1743
1790
  }
1744
1791
  }
1745
1792
  // Bot opted out of the streaming card — dashboard SSE above already got
@@ -2047,18 +2094,50 @@ function setupWorkerHandlers(ds, worker) {
2047
2094
  }
2048
2095
  // ─── Bridge final-output delivery (with retry) ──────────────────────────────
2049
2096
  const FINAL_OUTPUT_RETRY_BACKOFF_MS = [0, 5000, 15000]; // immediate, +5s, +15s
2097
+ /**
2098
+ * Turn-end half of the two-phase turn reactions (auto-on for card-off sessions,
2099
+ * i.e. streaming card disabled). The 冲! "received" reactions are added per-message at the daemon
2100
+ * acceptance point (`noteTurnReceived`); when the worker next returns to idle we
2101
+ * flip every pending ✋ on this session to ✅ DONE and clear the list. Binding the
2102
+ * start to the message (not a status edge) means type-ahead / busy-batched
2103
+ * messages each get their own reaction and all settle together here.
2104
+ *
2105
+ * Every Feishu call is best-effort — a failure only means a missing emoji, so it
2106
+ * must never throw into the status pipeline (callers invoke as `void`).
2107
+ */
2108
+ async function finishTurnReactions(ds) {
2109
+ const list = ds.pendingAckReactions;
2110
+ if (!list || list.length === 0)
2111
+ return;
2112
+ // Detach the batch first so a second idle edge can't double-flip it.
2113
+ ds.pendingAckReactions = [];
2114
+ for (const ack of list) {
2115
+ if (ack.reactionId) {
2116
+ try {
2117
+ await removeReaction(ds.larkAppId, ack.messageId, ack.reactionId);
2118
+ }
2119
+ catch (err) {
2120
+ logger.debug(`[reaction] failed to remove received reaction ${ack.reactionId}: ${err?.message ?? err}`);
2121
+ }
2122
+ }
2123
+ try {
2124
+ await addReaction(ds.larkAppId, ack.messageId, DONE_REACTION_EMOJI_TYPE);
2125
+ }
2126
+ catch (err) {
2127
+ logger.debug(`[reaction] failed to add done reaction to ${ack.messageId}: ${err?.message ?? err}`);
2128
+ }
2129
+ }
2130
+ }
2050
2131
  /** Deliver a bridge `final_output` to Lark. The worker emits each turn
2051
2132
  * exactly once (it pops the turn off its queue at emit time), so the
2052
2133
  * daemon owns retries on transient failures. After 3 attempts we log
2053
2134
  * and give up — the user's answer is lost; better than leaking memory
2054
2135
  * via an unbounded retry loop. */
2055
- function deliverFinalOutput(ds, msg, t, attempt, lockedPendingCardId, lockedQuoteTargetId) {
2136
+ function deliverFinalOutput(ds, msg, t, attempt) {
2056
2137
  const cb = requireCallbacks();
2057
2138
  const effectiveCliId = ds.session.cliId ?? getBot(ds.larkAppId).config.cliId;
2058
2139
  const scopedReply = (content, msgType, turnId) => cb.sessionReply(sessionAnchorId(ds), content, msgType, ds.larkAppId, fallbackTurnId(ds, turnId));
2059
2140
  setTimeout(async () => {
2060
- let pendingCardId;
2061
- let pendingQuoteTargetId;
2062
2141
  // Guard: if the user closed the session (or it was torn down for any
2063
2142
  // other reason) between attempts, don't post a stale final answer to
2064
2143
  // a closed thread.
@@ -2071,28 +2150,12 @@ function deliverFinalOutput(ds, msg, t, attempt, lockedPendingCardId, lockedQuot
2071
2150
  // 发表为文档评论(而非飞书卡片),状态卡/占位卡仍留在飞书会话起点。
2072
2151
  const docTurn = ds.docCommentTurns?.get(msg.turnId);
2073
2152
  if (docTurn) {
2074
- const loc = localeForBot(ds.larkAppId);
2075
2153
  // 嵌套回复到用户那条评论 thread(已挂在其下,无需再 ↪ 前缀)。这是兜底路径
2076
2154
  // (模型没显式 botmux send),默认 @ 回原评论人,仅首块加。
2077
2155
  const chunks = chunkCommentText(msg.content);
2078
2156
  for (let i = 0; i < chunks.length; i++) {
2079
2157
  await replyToDocComment(ds.larkAppId, { fileToken: docTurn.fileToken, fileType: docTurn.fileType }, docTurn.commentId, chunks[i], i === 0 ? docTurn.replyToOpenId : undefined);
2080
2158
  }
2081
- // 收尾飞书侧占位卡(streaming-disabled 会话),避免停在「处理中」。
2082
- // streaming 卡(若开启)会在 idle 自行冻结,无需在此处理。
2083
- const donePendingId = lockedPendingCardId ?? claimPendingResponseCard(ds.session);
2084
- if (donePendingId) {
2085
- try {
2086
- await updateMessage(ds.larkAppId, donePendingId, buildMarkdownCard(tr('daemon.doc_comment_replied_card', undefined, loc), daemonCardFooterRecipientOpenId(ds, effectiveCliId), resolveBrandLabel(ds.larkAppId), loc));
2087
- markPendingResponseCardPatchedIfCurrent(ds.session, donePendingId);
2088
- syncPendingResponseState(ds, ds.session);
2089
- sessionStore.updateSession(ds.session);
2090
- }
2091
- catch (err) {
2092
- if (!(err instanceof MessageWithdrawnError))
2093
- logger.warn(`[${t}] failed to finalize 飞书 pending card for doc-comment turn: ${err?.message ?? err}`);
2094
- }
2095
- }
2096
2159
  ds.docCommentTurns?.delete(msg.turnId);
2097
2160
  ds.lastBridgeEmittedUuid = msg.lastUuid;
2098
2161
  logger.info(`[${t}] doc-comment final_output → posted ${chunks.length} comment(s) on file=${docTurn.fileToken.slice(0, 12)} (turn ${msg.turnId.substring(0, 8)})`);
@@ -2123,41 +2186,10 @@ function deliverFinalOutput(ds, msg, t, attempt, lockedPendingCardId, lockedQuot
2123
2186
  locale: localeForBot(ds.larkAppId),
2124
2187
  })
2125
2188
  : buildMarkdownCard(msg.content, recipientOpenId, resolveBrandLabel(ds.larkAppId), localeForBot(ds.larkAppId));
2126
- pendingCardId = lockedPendingCardId ?? claimPendingResponseCard(ds.session);
2127
- pendingQuoteTargetId = lockedQuoteTargetId ?? ds.session.quoteTargetId;
2128
- if (pendingCardId) {
2129
- try {
2130
- if (ds.session.pendingResponseCardId !== pendingCardId) {
2131
- await scopedReply(cardJson, 'interactive', msg.turnId);
2132
- }
2133
- else {
2134
- writePendingResponsePatchMarker(ds.session.sessionId, pendingCardId);
2135
- await updateMessage(ds.larkAppId, pendingCardId, cardJson);
2136
- markPendingResponsePatchMarkerPatched(ds.session.sessionId);
2137
- markPendingResponseCardPatchedIfCurrent(ds.session, pendingCardId);
2138
- syncPendingResponseState(ds, ds.session);
2139
- sessionStore.updateSession(ds.session);
2140
- clearPendingResponsePatchMarker(ds.session.sessionId);
2141
- if (pendingQuoteTargetId && ds.session.lastPatchedResponseCardId === pendingCardId) {
2142
- addReaction(ds.larkAppId, pendingQuoteTargetId, COMPLETED_REACTION_EMOJI_TYPE)
2143
- .catch((err) => logger.warn(`[${t}] failed to add completion reaction to ${pendingQuoteTargetId}: ${err?.message ?? err}`));
2144
- }
2145
- }
2146
- }
2147
- catch (err) {
2148
- clearPendingResponsePatchMarker(ds.session.sessionId);
2149
- if (!(err instanceof MessageWithdrawnError))
2150
- throw err;
2151
- logger.warn(`[${t}] Pending response card withdrawn while forwarding final_output; sending a new reply`);
2152
- await scopedReply(cardJson, 'interactive', msg.turnId);
2153
- markPendingResponseCardPatchedIfCurrent(ds.session, pendingCardId);
2154
- syncPendingResponseState(ds, ds.session);
2155
- sessionStore.updateSession(ds.session);
2156
- }
2157
- }
2158
- else {
2159
- await scopedReply(cardJson, 'interactive', msg.turnId);
2160
- }
2189
+ // Always deliver the answer as a fresh message — never PATCH a card in
2190
+ // place. message.patch is silent (no Feishu notification / unread), which
2191
+ // used to swallow the answer; a brand-new message always pings.
2192
+ await scopedReply(cardJson, 'interactive', msg.turnId);
2161
2193
  ds.lastBridgeEmittedUuid = msg.lastUuid;
2162
2194
  logger.info(`[${t}] Bridge final_output forwarded (turn ${msg.turnId.substring(0, 8)}, ${msg.content.length} chars, kind=${msg.kind ?? 'bridge'}, attempt ${attempt + 1})`);
2163
2195
  }
@@ -2170,8 +2202,6 @@ function deliverFinalOutput(ds, msg, t, attempt, lockedPendingCardId, lockedQuot
2170
2202
  cb.closeSession(ds);
2171
2203
  return;
2172
2204
  }
2173
- if (pendingCardId)
2174
- clearPendingResponsePatchMarker(ds.session.sessionId);
2175
2205
  const next = attempt + 1;
2176
2206
  if (next >= FINAL_OUTPUT_RETRY_BACKOFF_MS.length) {
2177
2207
  logger.error(`[${t}] Bridge final_output gave up after ${next} attempts (turn ${msg.turnId.substring(0, 8)}): ${err.message}`);
@@ -2180,7 +2210,7 @@ function deliverFinalOutput(ds, msg, t, attempt, lockedPendingCardId, lockedQuot
2180
2210
  return;
2181
2211
  }
2182
2212
  logger.warn(`[${t}] Bridge final_output attempt ${next} failed (${err.message}); retrying in ${FINAL_OUTPUT_RETRY_BACKOFF_MS[next]}ms`);
2183
- deliverFinalOutput(ds, msg, t, next, pendingCardId, pendingQuoteTargetId);
2213
+ deliverFinalOutput(ds, msg, t, next);
2184
2214
  }
2185
2215
  }, FINAL_OUTPUT_RETRY_BACKOFF_MS[attempt] ?? 0);
2186
2216
  }
@@ -2188,6 +2218,7 @@ function deliverFinalOutput(ds, msg, t, attempt, lockedPendingCardId, lockedQuot
2188
2218
  * fork. Intentionally underscored to discourage non-test callers. */
2189
2219
  export const __testOnly_deliverFinalOutput = deliverFinalOutput;
2190
2220
  export const __testOnly_setupWorkerHandlers = setupWorkerHandlers;
2221
+ export const __testOnly_finishTurnReactions = finishTurnReactions;
2191
2222
  // ─── Fork adopt worker ──────────────────────────────────────────────────────
2192
2223
  export function forkAdoptWorker(ds, opts) {
2193
2224
  const cb = requireCallbacks();