@probelabs/visor 0.1.182-ee → 0.1.183-ee

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 (205) hide show
  1. package/defaults/assistant.yaml +2 -1
  2. package/defaults/code-talk.yaml +6 -0
  3. package/defaults/skills/task-progress.yaml +39 -0
  4. package/dist/agent-protocol/task-evaluator.d.ts +2 -1
  5. package/dist/agent-protocol/task-evaluator.d.ts.map +1 -1
  6. package/dist/agent-protocol/task-progress-tool.d.ts +29 -0
  7. package/dist/agent-protocol/task-progress-tool.d.ts.map +1 -0
  8. package/dist/agent-protocol/task-store.d.ts +8 -0
  9. package/dist/agent-protocol/task-store.d.ts.map +1 -1
  10. package/dist/agent-protocol/tasks-cli-handler.d.ts.map +1 -1
  11. package/dist/agent-protocol/trace-serializer.d.ts +5 -2
  12. package/dist/agent-protocol/trace-serializer.d.ts.map +1 -1
  13. package/dist/agent-protocol/track-execution.d.ts +1 -1
  14. package/dist/agent-protocol/track-execution.d.ts.map +1 -1
  15. package/dist/ai-review-service.d.ts.map +1 -1
  16. package/dist/cli-main.d.ts.map +1 -1
  17. package/dist/debug-visualizer/trace-reader.d.ts.map +1 -1
  18. package/dist/defaults/assistant.yaml +2 -1
  19. package/dist/defaults/code-talk.yaml +6 -0
  20. package/dist/defaults/skills/task-progress.yaml +39 -0
  21. package/dist/docs/telemetry-live-spans-plan.md +510 -0
  22. package/dist/generated/config-schema.json +43 -6
  23. package/dist/index.js +3545 -701
  24. package/dist/providers/ai-check-provider.d.ts.map +1 -1
  25. package/dist/providers/git-checkout-provider.d.ts.map +1 -1
  26. package/dist/providers/mcp-custom-sse-server.d.ts.map +1 -1
  27. package/dist/reviewer.d.ts +2 -0
  28. package/dist/reviewer.d.ts.map +1 -1
  29. package/dist/runners/process-cli-handler.d.ts +2 -0
  30. package/dist/runners/process-cli-handler.d.ts.map +1 -0
  31. package/dist/runners/process-discovery.d.ts +29 -0
  32. package/dist/runners/process-discovery.d.ts.map +1 -0
  33. package/dist/sandbox/check-runner.d.ts.map +1 -1
  34. package/dist/sandbox/sandbox-telemetry.d.ts +7 -0
  35. package/dist/sandbox/sandbox-telemetry.d.ts.map +1 -1
  36. package/dist/sandbox/trace-ingester.d.ts +28 -15
  37. package/dist/sandbox/trace-ingester.d.ts.map +1 -1
  38. package/dist/scheduler/schedule-tool.d.ts +5 -0
  39. package/dist/scheduler/schedule-tool.d.ts.map +1 -1
  40. package/dist/sdk/{a2a-frontend-MU5EO2HZ.mjs → a2a-frontend-5YDHFQXD.mjs} +47 -8
  41. package/dist/sdk/{a2a-frontend-MU5EO2HZ.mjs.map → a2a-frontend-5YDHFQXD.mjs.map} +1 -1
  42. package/dist/sdk/{a2a-frontend-4LP3MLTS.mjs → a2a-frontend-6LWBIPMS.mjs} +19 -3
  43. package/dist/sdk/a2a-frontend-6LWBIPMS.mjs.map +1 -0
  44. package/dist/sdk/check-provider-registry-WSEVHJEV.mjs +31 -0
  45. package/dist/sdk/{check-provider-registry-I4BCWKRU.mjs → check-provider-registry-YRADEEQY.mjs} +6 -6
  46. package/dist/sdk/chunk-4BN2XI4X.mjs +459 -0
  47. package/dist/sdk/chunk-4BN2XI4X.mjs.map +1 -0
  48. package/dist/sdk/chunk-54KOAC4W.mjs +665 -0
  49. package/dist/sdk/chunk-54KOAC4W.mjs.map +1 -0
  50. package/dist/sdk/chunk-6C3R6E42.mjs +1700 -0
  51. package/dist/sdk/chunk-6C3R6E42.mjs.map +1 -0
  52. package/dist/sdk/{chunk-4I3TJ7UJ.mjs → chunk-7W5QCO4Y.mjs} +47 -10
  53. package/dist/sdk/chunk-7W5QCO4Y.mjs.map +1 -0
  54. package/dist/sdk/chunk-B2OUZAWY.mjs +237 -0
  55. package/dist/sdk/chunk-B2OUZAWY.mjs.map +1 -0
  56. package/dist/sdk/chunk-FWWLD555.mjs +244 -0
  57. package/dist/sdk/chunk-FWWLD555.mjs.map +1 -0
  58. package/dist/sdk/{chunk-QXT47ZHR.mjs → chunk-G7GSN3SK.mjs} +2 -2
  59. package/dist/sdk/{chunk-QXT47ZHR.mjs.map → chunk-G7GSN3SK.mjs.map} +1 -1
  60. package/dist/sdk/{chunk-DHETLQIX.mjs → chunk-GA2TYKSR.mjs} +5 -5
  61. package/dist/sdk/{chunk-6DPPP7LD.mjs → chunk-IDL3AA3G.mjs} +203 -42
  62. package/dist/sdk/chunk-IDL3AA3G.mjs.map +1 -0
  63. package/dist/sdk/chunk-MEB2TTIE.mjs +157 -0
  64. package/dist/sdk/chunk-MEB2TTIE.mjs.map +1 -0
  65. package/dist/sdk/{chunk-3JFK6KCD.mjs → chunk-MFXPJUUE.mjs} +150 -280
  66. package/dist/sdk/chunk-MFXPJUUE.mjs.map +1 -0
  67. package/dist/sdk/{chunk-KBGQJKIZ.mjs → chunk-NPSLGKXB.mjs} +3 -3
  68. package/dist/sdk/chunk-P2K4VOMU.mjs +825 -0
  69. package/dist/sdk/chunk-P2K4VOMU.mjs.map +1 -0
  70. package/dist/sdk/chunk-RI4ONH5X.mjs +482 -0
  71. package/dist/sdk/chunk-RI4ONH5X.mjs.map +1 -0
  72. package/dist/sdk/chunk-S5FSRHMY.mjs +139 -0
  73. package/dist/sdk/chunk-S5FSRHMY.mjs.map +1 -0
  74. package/dist/sdk/{chunk-7ERVRLDV.mjs → chunk-TFUQ2D5L.mjs} +13 -2
  75. package/dist/sdk/chunk-TFUQ2D5L.mjs.map +1 -0
  76. package/dist/sdk/{chunk-TQQNSHQV.mjs → chunk-UXB4XWEE.mjs} +1044 -179
  77. package/dist/sdk/chunk-UXB4XWEE.mjs.map +1 -0
  78. package/dist/sdk/{chunk-U6K5SK7X.mjs → chunk-V45TITKX.mjs} +2 -2
  79. package/dist/sdk/{chunk-ANUT54HW.mjs → chunk-WKLJ57WF.mjs} +6 -6
  80. package/dist/sdk/chunk-XOAEKFKB.mjs +1150 -0
  81. package/dist/sdk/chunk-XOAEKFKB.mjs.map +1 -0
  82. package/dist/sdk/chunk-ZPYODGYA.mjs +251 -0
  83. package/dist/sdk/chunk-ZPYODGYA.mjs.map +1 -0
  84. package/dist/sdk/command-executor-YNJOS77A.mjs +14 -0
  85. package/dist/sdk/{config-2STD74CJ.mjs → config-PCP6O6Y6.mjs} +4 -4
  86. package/dist/sdk/{failure-condition-evaluator-FFWJRAEQ.mjs → failure-condition-evaluator-H3PBFBYT.mjs} +4 -4
  87. package/dist/sdk/failure-condition-evaluator-IRFKTYZD.mjs +18 -0
  88. package/dist/sdk/github-auth-BJQBLK2V.mjs +196 -0
  89. package/dist/sdk/github-auth-BJQBLK2V.mjs.map +1 -0
  90. package/dist/sdk/{github-frontend-L3F5JXPJ.mjs → github-frontend-DECYOBRN.mjs} +8 -8
  91. package/dist/sdk/{github-frontend-KGV2R5Z6.mjs → github-frontend-TZRBOQCN.mjs} +4 -4
  92. package/dist/sdk/{host-QBJ7TOWG.mjs → host-CFM2ASDI.mjs} +4 -4
  93. package/dist/sdk/{host-X5ZZCEWN.mjs → host-T4LNVU2H.mjs} +3 -3
  94. package/dist/sdk/{knex-store-QCEW4I4R.mjs → knex-store-OEWSZEBY.mjs} +3 -3
  95. package/dist/sdk/lazy-otel-5RDTVS5L.mjs +24 -0
  96. package/dist/sdk/liquid-extensions-E3AKRX7P.mjs +25 -0
  97. package/dist/sdk/{loader-ZNKKJEZ3.mjs → loader-WRGI244P.mjs} +5 -5
  98. package/dist/sdk/memory-store-OHUIXCWJ.mjs +12 -0
  99. package/dist/sdk/metrics-MYUPQBBV.mjs +41 -0
  100. package/dist/sdk/{opa-policy-engine-QCSSIMUF.mjs → opa-policy-engine-IVMCGVNA.mjs} +3 -3
  101. package/dist/sdk/prompt-state-LN57DQF3.mjs +16 -0
  102. package/dist/sdk/renderer-schema-BT2IXMLW.mjs +51 -0
  103. package/dist/sdk/renderer-schema-BT2IXMLW.mjs.map +1 -0
  104. package/dist/sdk/routing-H2PQ57OA.mjs +26 -0
  105. package/dist/sdk/{routing-CVQT4KHX.mjs → routing-JMZ7HDCC.mjs} +5 -5
  106. package/dist/sdk/schedule-tool-2DPNSU63.mjs +37 -0
  107. package/dist/sdk/{schedule-tool-AECLFHSY.mjs → schedule-tool-4M45RK3E.mjs} +6 -6
  108. package/dist/sdk/{schedule-tool-handler-6QLZRTQA.mjs → schedule-tool-handler-KLHE2SOW.mjs} +6 -6
  109. package/dist/sdk/schedule-tool-handler-KLHE2SOW.mjs.map +1 -0
  110. package/dist/sdk/{schedule-tool-handler-J4NUETJ6.mjs → schedule-tool-handler-NBEO46RV.mjs} +16 -16
  111. package/dist/sdk/schedule-tool-handler-NBEO46RV.mjs.map +1 -0
  112. package/dist/sdk/sdk.d.mts +2 -0
  113. package/dist/sdk/sdk.d.ts +2 -0
  114. package/dist/sdk/sdk.js +3125 -666
  115. package/dist/sdk/sdk.js.map +1 -1
  116. package/dist/sdk/sdk.mjs +15 -15
  117. package/dist/sdk/slack-frontend-DF5VL4OF.mjs +929 -0
  118. package/dist/sdk/slack-frontend-DF5VL4OF.mjs.map +1 -0
  119. package/dist/sdk/{task-evaluator-HLNXKKVV.mjs → task-evaluator-GQYDOSGT.mjs} +138 -24
  120. package/dist/sdk/task-evaluator-GQYDOSGT.mjs.map +1 -0
  121. package/dist/sdk/task-evaluator-OVMG7S56.mjs +263 -0
  122. package/dist/sdk/task-evaluator-OVMG7S56.mjs.map +1 -0
  123. package/dist/sdk/{trace-helpers-WJXYVV4S.mjs → trace-helpers-26ZCAE2V.mjs} +7 -5
  124. package/dist/sdk/trace-helpers-26ZCAE2V.mjs.map +1 -0
  125. package/dist/sdk/{trace-helpers-3FFAI7X3.mjs → trace-helpers-XV5GAX5L.mjs} +3 -3
  126. package/dist/sdk/trace-helpers-XV5GAX5L.mjs.map +1 -0
  127. package/dist/sdk/{trace-reader-ZY77OFNM.mjs → trace-reader-OVE4DL2D.mjs} +6 -2
  128. package/dist/sdk/trace-reader-OVE4DL2D.mjs.map +1 -0
  129. package/dist/sdk/trace-serializer-KKBJHM7J.mjs +24 -0
  130. package/dist/sdk/trace-serializer-KKBJHM7J.mjs.map +1 -0
  131. package/dist/sdk/{track-execution-AMQQNXKE.mjs → track-execution-3EC24C2X.mjs} +68 -7
  132. package/dist/sdk/track-execution-3EC24C2X.mjs.map +1 -0
  133. package/dist/sdk/{track-execution-MKIQXP2C.mjs → track-execution-66RLL6QT.mjs} +10 -3
  134. package/dist/sdk/track-execution-66RLL6QT.mjs.map +1 -0
  135. package/dist/sdk/utcp-check-provider-WI3QZ3W6.mjs +16 -0
  136. package/dist/sdk/utcp-check-provider-WI3QZ3W6.mjs.map +1 -0
  137. package/dist/sdk/workflow-check-provider-X2UREEH7.mjs +31 -0
  138. package/dist/sdk/workflow-check-provider-X2UREEH7.mjs.map +1 -0
  139. package/dist/sdk/{workflow-check-provider-EXMC6JIS.mjs → workflow-check-provider-YXALZNAQ.mjs} +6 -6
  140. package/dist/sdk/workflow-check-provider-YXALZNAQ.mjs.map +1 -0
  141. package/dist/sdk/workflow-registry-YCZ3FCJC.mjs +12 -0
  142. package/dist/sdk/workflow-registry-YCZ3FCJC.mjs.map +1 -0
  143. package/dist/slack/socket-runner.d.ts.map +1 -1
  144. package/dist/state-machine/dispatch/sandbox-routing.d.ts.map +1 -1
  145. package/dist/state-machine/states/level-dispatch.d.ts.map +1 -1
  146. package/dist/telemetry/fallback-ndjson.d.ts +21 -0
  147. package/dist/telemetry/fallback-ndjson.d.ts.map +1 -1
  148. package/dist/telemetry/lazy-otel.d.ts +2 -0
  149. package/dist/telemetry/lazy-otel.d.ts.map +1 -1
  150. package/dist/telemetry/opentelemetry.d.ts +5 -0
  151. package/dist/telemetry/opentelemetry.d.ts.map +1 -1
  152. package/dist/telemetry/trace-helpers.d.ts +10 -0
  153. package/dist/telemetry/trace-helpers.d.ts.map +1 -1
  154. package/dist/test-runner/conversation-sugar.d.ts +7 -0
  155. package/dist/test-runner/conversation-sugar.d.ts.map +1 -1
  156. package/dist/test-runner/core/flow-stage.d.ts.map +1 -1
  157. package/dist/test-runner/index.d.ts.map +1 -1
  158. package/dist/test-runner/validator.d.ts.map +1 -1
  159. package/dist/types/git-checkout.d.ts +2 -0
  160. package/dist/types/git-checkout.d.ts.map +1 -1
  161. package/dist/utils/script-tool-environment.d.ts.map +1 -1
  162. package/package.json +2 -2
  163. package/dist/sdk/a2a-frontend-4LP3MLTS.mjs.map +0 -1
  164. package/dist/sdk/check-provider-registry-RRWCXSTG.mjs +0 -31
  165. package/dist/sdk/chunk-3JFK6KCD.mjs.map +0 -1
  166. package/dist/sdk/chunk-4I3TJ7UJ.mjs.map +0 -1
  167. package/dist/sdk/chunk-6DPPP7LD.mjs.map +0 -1
  168. package/dist/sdk/chunk-6VVXKXTI.mjs +0 -164
  169. package/dist/sdk/chunk-6VVXKXTI.mjs.map +0 -1
  170. package/dist/sdk/chunk-7ERVRLDV.mjs.map +0 -1
  171. package/dist/sdk/chunk-TQQNSHQV.mjs.map +0 -1
  172. package/dist/sdk/failure-condition-evaluator-5DZYMCGW.mjs +0 -18
  173. package/dist/sdk/routing-XALEDC2G.mjs +0 -26
  174. package/dist/sdk/schedule-tool-Z6QYL2B3.mjs +0 -37
  175. package/dist/sdk/task-evaluator-HLNXKKVV.mjs.map +0 -1
  176. package/dist/sdk/trace-reader-ZY77OFNM.mjs.map +0 -1
  177. package/dist/sdk/track-execution-AMQQNXKE.mjs.map +0 -1
  178. package/dist/sdk/track-execution-MKIQXP2C.mjs.map +0 -1
  179. package/dist/sdk/workflow-check-provider-VKYGI5GK.mjs +0 -31
  180. /package/dist/sdk/{check-provider-registry-I4BCWKRU.mjs.map → check-provider-registry-WSEVHJEV.mjs.map} +0 -0
  181. /package/dist/sdk/{check-provider-registry-RRWCXSTG.mjs.map → check-provider-registry-YRADEEQY.mjs.map} +0 -0
  182. /package/dist/sdk/{chunk-DHETLQIX.mjs.map → chunk-GA2TYKSR.mjs.map} +0 -0
  183. /package/dist/sdk/{chunk-ANUT54HW.mjs.map → chunk-NPSLGKXB.mjs.map} +0 -0
  184. /package/dist/sdk/{chunk-U6K5SK7X.mjs.map → chunk-V45TITKX.mjs.map} +0 -0
  185. /package/dist/sdk/{chunk-KBGQJKIZ.mjs.map → chunk-WKLJ57WF.mjs.map} +0 -0
  186. /package/dist/sdk/{config-2STD74CJ.mjs.map → command-executor-YNJOS77A.mjs.map} +0 -0
  187. /package/dist/sdk/{failure-condition-evaluator-5DZYMCGW.mjs.map → config-PCP6O6Y6.mjs.map} +0 -0
  188. /package/dist/sdk/{failure-condition-evaluator-FFWJRAEQ.mjs.map → failure-condition-evaluator-H3PBFBYT.mjs.map} +0 -0
  189. /package/dist/sdk/{routing-CVQT4KHX.mjs.map → failure-condition-evaluator-IRFKTYZD.mjs.map} +0 -0
  190. /package/dist/sdk/{github-frontend-KGV2R5Z6.mjs.map → github-frontend-DECYOBRN.mjs.map} +0 -0
  191. /package/dist/sdk/{github-frontend-L3F5JXPJ.mjs.map → github-frontend-TZRBOQCN.mjs.map} +0 -0
  192. /package/dist/sdk/{host-QBJ7TOWG.mjs.map → host-CFM2ASDI.mjs.map} +0 -0
  193. /package/dist/sdk/{host-X5ZZCEWN.mjs.map → host-T4LNVU2H.mjs.map} +0 -0
  194. /package/dist/sdk/{knex-store-QCEW4I4R.mjs.map → knex-store-OEWSZEBY.mjs.map} +0 -0
  195. /package/dist/sdk/{routing-XALEDC2G.mjs.map → lazy-otel-5RDTVS5L.mjs.map} +0 -0
  196. /package/dist/sdk/{schedule-tool-AECLFHSY.mjs.map → liquid-extensions-E3AKRX7P.mjs.map} +0 -0
  197. /package/dist/sdk/{loader-ZNKKJEZ3.mjs.map → loader-WRGI244P.mjs.map} +0 -0
  198. /package/dist/sdk/{schedule-tool-Z6QYL2B3.mjs.map → memory-store-OHUIXCWJ.mjs.map} +0 -0
  199. /package/dist/sdk/{schedule-tool-handler-6QLZRTQA.mjs.map → metrics-MYUPQBBV.mjs.map} +0 -0
  200. /package/dist/sdk/{opa-policy-engine-QCSSIMUF.mjs.map → opa-policy-engine-IVMCGVNA.mjs.map} +0 -0
  201. /package/dist/sdk/{schedule-tool-handler-J4NUETJ6.mjs.map → prompt-state-LN57DQF3.mjs.map} +0 -0
  202. /package/dist/sdk/{trace-helpers-3FFAI7X3.mjs.map → routing-H2PQ57OA.mjs.map} +0 -0
  203. /package/dist/sdk/{trace-helpers-WJXYVV4S.mjs.map → routing-JMZ7HDCC.mjs.map} +0 -0
  204. /package/dist/sdk/{workflow-check-provider-EXMC6JIS.mjs.map → schedule-tool-2DPNSU63.mjs.map} +0 -0
  205. /package/dist/sdk/{workflow-check-provider-VKYGI5GK.mjs.map → schedule-tool-4M45RK3E.mjs.map} +0 -0
@@ -0,0 +1,157 @@
1
+ import {
2
+ init_logger,
3
+ logger
4
+ } from "./chunk-ZPYODGYA.mjs";
5
+ import {
6
+ __esm
7
+ } from "./chunk-J7LXIPZS.mjs";
8
+
9
+ // src/slack/prompt-state.ts
10
+ function getPromptStateManager(ttlMs) {
11
+ if (!__promptState) __promptState = new PromptStateManager(ttlMs);
12
+ return __promptState;
13
+ }
14
+ function resetPromptStateManager() {
15
+ __promptState = void 0;
16
+ }
17
+ var PromptStateManager, __promptState;
18
+ var init_prompt_state = __esm({
19
+ "src/slack/prompt-state.ts"() {
20
+ init_logger();
21
+ PromptStateManager = class {
22
+ waiting = /* @__PURE__ */ new Map();
23
+ // key: `${channel}:${threadTs}`
24
+ ttlMs;
25
+ timer;
26
+ firstMessage = /* @__PURE__ */ new Map();
27
+ summaryTs = /* @__PURE__ */ new Map();
28
+ // key: threadKey -> group -> ts
29
+ constructor(ttlMs = 60 * 60 * 1e3) {
30
+ this.ttlMs = ttlMs;
31
+ this.startCleanup();
32
+ }
33
+ key(channel, threadTs) {
34
+ return `${channel}:${threadTs}`;
35
+ }
36
+ setWaiting(channel, threadTs, info) {
37
+ const key = this.key(channel, threadTs);
38
+ const value = { ...info, timestamp: Date.now(), channel, threadTs };
39
+ this.waiting.set(key, value);
40
+ try {
41
+ logger.info(
42
+ `[prompt-state] waiting set for ${key} (check=${info.checkName}, prompt="${info.prompt.substring(
43
+ 0,
44
+ 60
45
+ )}\u2026")`
46
+ );
47
+ } catch {
48
+ }
49
+ }
50
+ getWaiting(channel, threadTs) {
51
+ const key = this.key(channel, threadTs);
52
+ const info = this.waiting.get(key);
53
+ if (!info) return void 0;
54
+ const age = Date.now() - info.timestamp;
55
+ if (age > this.ttlMs) {
56
+ this.waiting.delete(key);
57
+ try {
58
+ logger.warn(`[prompt-state] expired ${key} (age=${Math.round(age / 1e3)}s)`);
59
+ } catch {
60
+ }
61
+ return void 0;
62
+ }
63
+ return info;
64
+ }
65
+ clear(channel, threadTs) {
66
+ const key = this.key(channel, threadTs);
67
+ const had = this.waiting.delete(key);
68
+ if (had) {
69
+ try {
70
+ logger.info(`[prompt-state] cleared ${key}`);
71
+ } catch {
72
+ }
73
+ }
74
+ return had;
75
+ }
76
+ /** Merge updates into an existing waiting entry */
77
+ update(channel, threadTs, patch) {
78
+ const key = this.key(channel, threadTs);
79
+ const prev = this.waiting.get(key);
80
+ if (!prev) return void 0;
81
+ const next = { ...prev, ...patch };
82
+ this.waiting.set(key, next);
83
+ try {
84
+ if (patch.snapshotPath) {
85
+ logger.info(`[prompt-state] snapshotPath set for ${key}`);
86
+ }
87
+ } catch {
88
+ }
89
+ return next;
90
+ }
91
+ // First message capture helpers
92
+ setFirstMessage(channel, threadTs, text) {
93
+ const key = this.key(channel, threadTs);
94
+ if (!text || !text.trim()) return;
95
+ const existing = this.firstMessage.get(key);
96
+ if (!existing || existing.consumed) {
97
+ this.firstMessage.set(key, { text, consumed: false });
98
+ }
99
+ }
100
+ consumeFirstMessage(channel, threadTs) {
101
+ const key = this.key(channel, threadTs);
102
+ const entry = this.firstMessage.get(key);
103
+ if (entry && !entry.consumed) {
104
+ entry.consumed = true;
105
+ this.firstMessage.set(key, entry);
106
+ return entry.text;
107
+ }
108
+ return void 0;
109
+ }
110
+ hasUnconsumedFirstMessage(channel, threadTs) {
111
+ const key = this.key(channel, threadTs);
112
+ const e = this.firstMessage.get(key);
113
+ return !!(e && !e.consumed && e.text && e.text.trim());
114
+ }
115
+ startCleanup(intervalMs = 5 * 60 * 1e3) {
116
+ if (this.timer) clearInterval(this.timer);
117
+ this.timer = setInterval(() => this.cleanup(), intervalMs);
118
+ if (this.timer.unref) this.timer.unref();
119
+ }
120
+ cleanup() {
121
+ const now = Date.now();
122
+ let removed = 0;
123
+ for (const [key, info] of this.waiting.entries()) {
124
+ if (now - info.timestamp > this.ttlMs) {
125
+ this.waiting.delete(key);
126
+ removed++;
127
+ }
128
+ }
129
+ for (const [key] of this.firstMessage.entries()) {
130
+ const waitingInfo = this.waiting.get(key);
131
+ if (!waitingInfo) {
132
+ const entry = this.firstMessage.get(key);
133
+ if (entry?.consumed) {
134
+ this.firstMessage.delete(key);
135
+ removed++;
136
+ }
137
+ }
138
+ }
139
+ if (removed) {
140
+ try {
141
+ logger.info(`[prompt-state] cleanup removed ${removed} entries`);
142
+ } catch {
143
+ }
144
+ }
145
+ return removed;
146
+ }
147
+ };
148
+ }
149
+ });
150
+
151
+ export {
152
+ PromptStateManager,
153
+ getPromptStateManager,
154
+ resetPromptStateManager,
155
+ init_prompt_state
156
+ };
157
+ //# sourceMappingURL=chunk-MEB2TTIE.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/slack/prompt-state.ts"],"sourcesContent":["import { logger } from '../logger';\n\nexport interface WaitingPromptInfo {\n checkName: string;\n prompt: string;\n timestamp: number;\n channel: string;\n threadTs: string;\n promptMessageTs?: string;\n snapshotPath?: string;\n promptsPosted?: number; // how many prompts we posted into this thread\n context?: Record<string, unknown>;\n}\n\nexport class PromptStateManager {\n private waiting = new Map<string, WaitingPromptInfo>(); // key: `${channel}:${threadTs}`\n private ttlMs: number;\n private timer?: NodeJS.Timeout;\n private firstMessage = new Map<string, { text: string; consumed: boolean }>();\n private summaryTs = new Map<string, Map<string, string>>(); // key: threadKey -> group -> ts\n\n constructor(ttlMs: number = 60 * 60 * 1000) {\n this.ttlMs = ttlMs;\n this.startCleanup();\n }\n\n private key(channel: string, threadTs: string): string {\n return `${channel}:${threadTs}`;\n }\n\n setWaiting(\n channel: string,\n threadTs: string,\n info: Omit<WaitingPromptInfo, 'timestamp' | 'channel' | 'threadTs'>\n ) {\n const key = this.key(channel, threadTs);\n const value: WaitingPromptInfo = { ...info, timestamp: Date.now(), channel, threadTs };\n this.waiting.set(key, value);\n try {\n logger.info(\n `[prompt-state] waiting set for ${key} (check=${info.checkName}, prompt=\"${info.prompt.substring(\n 0,\n 60\n )}…\")`\n );\n } catch {}\n }\n\n getWaiting(channel: string, threadTs: string): WaitingPromptInfo | undefined {\n const key = this.key(channel, threadTs);\n const info = this.waiting.get(key);\n if (!info) return undefined;\n const age = Date.now() - info.timestamp;\n if (age > this.ttlMs) {\n this.waiting.delete(key);\n try {\n logger.warn(`[prompt-state] expired ${key} (age=${Math.round(age / 1000)}s)`);\n } catch {}\n return undefined;\n }\n return info;\n }\n\n clear(channel: string, threadTs: string): boolean {\n const key = this.key(channel, threadTs);\n const had = this.waiting.delete(key);\n if (had) {\n try {\n logger.info(`[prompt-state] cleared ${key}`);\n } catch {}\n }\n return had;\n }\n\n /** Merge updates into an existing waiting entry */\n update(\n channel: string,\n threadTs: string,\n patch: Partial<WaitingPromptInfo>\n ): WaitingPromptInfo | undefined {\n const key = this.key(channel, threadTs);\n const prev = this.waiting.get(key);\n if (!prev) return undefined;\n const next = { ...prev, ...patch } as WaitingPromptInfo;\n this.waiting.set(key, next);\n try {\n if (patch.snapshotPath) {\n logger.info(`[prompt-state] snapshotPath set for ${key}`);\n }\n } catch {}\n return next;\n }\n\n // First message capture helpers\n setFirstMessage(channel: string, threadTs: string, text: string): void {\n const key = this.key(channel, threadTs);\n if (!text || !text.trim()) return;\n const existing = this.firstMessage.get(key);\n // Only set if: no entry exists OR the existing entry was already consumed\n // This allows new messages to be captured after a resume cycle\n if (!existing || existing.consumed) {\n this.firstMessage.set(key, { text, consumed: false });\n }\n }\n consumeFirstMessage(channel: string, threadTs: string): string | undefined {\n const key = this.key(channel, threadTs);\n const entry = this.firstMessage.get(key);\n if (entry && !entry.consumed) {\n entry.consumed = true;\n this.firstMessage.set(key, entry);\n return entry.text;\n }\n return undefined;\n }\n hasUnconsumedFirstMessage(channel: string, threadTs: string): boolean {\n const key = this.key(channel, threadTs);\n const e = this.firstMessage.get(key);\n return !!(e && !e.consumed && e.text && e.text.trim());\n }\n\n private startCleanup(intervalMs: number = 5 * 60 * 1000) {\n if (this.timer) clearInterval(this.timer);\n this.timer = setInterval(() => this.cleanup(), intervalMs);\n if (this.timer.unref) this.timer.unref();\n }\n\n private cleanup(): number {\n const now = Date.now();\n let removed = 0;\n for (const [key, info] of this.waiting.entries()) {\n if (now - info.timestamp > this.ttlMs) {\n this.waiting.delete(key);\n removed++;\n }\n }\n // Also clean up stale firstMessage entries (consumed entries older than TTL)\n // Keep unconsumed entries to avoid losing user messages\n for (const [key] of this.firstMessage.entries()) {\n const waitingInfo = this.waiting.get(key);\n // If no corresponding waiting entry exists and the firstMessage was consumed,\n // the conversation is likely complete - safe to remove\n if (!waitingInfo) {\n const entry = this.firstMessage.get(key);\n if (entry?.consumed) {\n this.firstMessage.delete(key);\n removed++;\n }\n }\n }\n if (removed) {\n try {\n logger.info(`[prompt-state] cleanup removed ${removed} entries`);\n } catch {}\n }\n return removed;\n }\n}\n\nlet __promptState: PromptStateManager | undefined;\nexport function getPromptStateManager(ttlMs?: number): PromptStateManager {\n if (!__promptState) __promptState = new PromptStateManager(ttlMs);\n return __promptState;\n}\n\nexport function resetPromptStateManager(): void {\n __promptState = undefined;\n}\n"],"mappings":";;;;;;;;;AA+JO,SAAS,sBAAsB,OAAoC;AACxE,MAAI,CAAC,cAAe,iBAAgB,IAAI,mBAAmB,KAAK;AAChE,SAAO;AACT;AAEO,SAAS,0BAAgC;AAC9C,kBAAgB;AAClB;AAtKA,IAca,oBAgJT;AA9JJ;AAAA;AAAA;AAcO,IAAM,qBAAN,MAAyB;AAAA,MACtB,UAAU,oBAAI,IAA+B;AAAA;AAAA,MAC7C;AAAA,MACA;AAAA,MACA,eAAe,oBAAI,IAAiD;AAAA,MACpE,YAAY,oBAAI,IAAiC;AAAA;AAAA,MAEzD,YAAY,QAAgB,KAAK,KAAK,KAAM;AAC1C,aAAK,QAAQ;AACb,aAAK,aAAa;AAAA,MACpB;AAAA,MAEQ,IAAI,SAAiB,UAA0B;AACrD,eAAO,GAAG,OAAO,IAAI,QAAQ;AAAA,MAC/B;AAAA,MAEA,WACE,SACA,UACA,MACA;AACA,cAAM,MAAM,KAAK,IAAI,SAAS,QAAQ;AACtC,cAAM,QAA2B,EAAE,GAAG,MAAM,WAAW,KAAK,IAAI,GAAG,SAAS,SAAS;AACrF,aAAK,QAAQ,IAAI,KAAK,KAAK;AAC3B,YAAI;AACF,iBAAO;AAAA,YACL,kCAAkC,GAAG,WAAW,KAAK,SAAS,aAAa,KAAK,OAAO;AAAA,cACrF;AAAA,cACA;AAAA,YACF,CAAC;AAAA,UACH;AAAA,QACF,QAAQ;AAAA,QAAC;AAAA,MACX;AAAA,MAEA,WAAW,SAAiB,UAAiD;AAC3E,cAAM,MAAM,KAAK,IAAI,SAAS,QAAQ;AACtC,cAAM,OAAO,KAAK,QAAQ,IAAI,GAAG;AACjC,YAAI,CAAC,KAAM,QAAO;AAClB,cAAM,MAAM,KAAK,IAAI,IAAI,KAAK;AAC9B,YAAI,MAAM,KAAK,OAAO;AACpB,eAAK,QAAQ,OAAO,GAAG;AACvB,cAAI;AACF,mBAAO,KAAK,0BAA0B,GAAG,SAAS,KAAK,MAAM,MAAM,GAAI,CAAC,IAAI;AAAA,UAC9E,QAAQ;AAAA,UAAC;AACT,iBAAO;AAAA,QACT;AACA,eAAO;AAAA,MACT;AAAA,MAEA,MAAM,SAAiB,UAA2B;AAChD,cAAM,MAAM,KAAK,IAAI,SAAS,QAAQ;AACtC,cAAM,MAAM,KAAK,QAAQ,OAAO,GAAG;AACnC,YAAI,KAAK;AACP,cAAI;AACF,mBAAO,KAAK,0BAA0B,GAAG,EAAE;AAAA,UAC7C,QAAQ;AAAA,UAAC;AAAA,QACX;AACA,eAAO;AAAA,MACT;AAAA;AAAA,MAGA,OACE,SACA,UACA,OAC+B;AAC/B,cAAM,MAAM,KAAK,IAAI,SAAS,QAAQ;AACtC,cAAM,OAAO,KAAK,QAAQ,IAAI,GAAG;AACjC,YAAI,CAAC,KAAM,QAAO;AAClB,cAAM,OAAO,EAAE,GAAG,MAAM,GAAG,MAAM;AACjC,aAAK,QAAQ,IAAI,KAAK,IAAI;AAC1B,YAAI;AACF,cAAI,MAAM,cAAc;AACtB,mBAAO,KAAK,uCAAuC,GAAG,EAAE;AAAA,UAC1D;AAAA,QACF,QAAQ;AAAA,QAAC;AACT,eAAO;AAAA,MACT;AAAA;AAAA,MAGA,gBAAgB,SAAiB,UAAkB,MAAoB;AACrE,cAAM,MAAM,KAAK,IAAI,SAAS,QAAQ;AACtC,YAAI,CAAC,QAAQ,CAAC,KAAK,KAAK,EAAG;AAC3B,cAAM,WAAW,KAAK,aAAa,IAAI,GAAG;AAG1C,YAAI,CAAC,YAAY,SAAS,UAAU;AAClC,eAAK,aAAa,IAAI,KAAK,EAAE,MAAM,UAAU,MAAM,CAAC;AAAA,QACtD;AAAA,MACF;AAAA,MACA,oBAAoB,SAAiB,UAAsC;AACzE,cAAM,MAAM,KAAK,IAAI,SAAS,QAAQ;AACtC,cAAM,QAAQ,KAAK,aAAa,IAAI,GAAG;AACvC,YAAI,SAAS,CAAC,MAAM,UAAU;AAC5B,gBAAM,WAAW;AACjB,eAAK,aAAa,IAAI,KAAK,KAAK;AAChC,iBAAO,MAAM;AAAA,QACf;AACA,eAAO;AAAA,MACT;AAAA,MACA,0BAA0B,SAAiB,UAA2B;AACpE,cAAM,MAAM,KAAK,IAAI,SAAS,QAAQ;AACtC,cAAM,IAAI,KAAK,aAAa,IAAI,GAAG;AACnC,eAAO,CAAC,EAAE,KAAK,CAAC,EAAE,YAAY,EAAE,QAAQ,EAAE,KAAK,KAAK;AAAA,MACtD;AAAA,MAEQ,aAAa,aAAqB,IAAI,KAAK,KAAM;AACvD,YAAI,KAAK,MAAO,eAAc,KAAK,KAAK;AACxC,aAAK,QAAQ,YAAY,MAAM,KAAK,QAAQ,GAAG,UAAU;AACzD,YAAI,KAAK,MAAM,MAAO,MAAK,MAAM,MAAM;AAAA,MACzC;AAAA,MAEQ,UAAkB;AACxB,cAAM,MAAM,KAAK,IAAI;AACrB,YAAI,UAAU;AACd,mBAAW,CAAC,KAAK,IAAI,KAAK,KAAK,QAAQ,QAAQ,GAAG;AAChD,cAAI,MAAM,KAAK,YAAY,KAAK,OAAO;AACrC,iBAAK,QAAQ,OAAO,GAAG;AACvB;AAAA,UACF;AAAA,QACF;AAGA,mBAAW,CAAC,GAAG,KAAK,KAAK,aAAa,QAAQ,GAAG;AAC/C,gBAAM,cAAc,KAAK,QAAQ,IAAI,GAAG;AAGxC,cAAI,CAAC,aAAa;AAChB,kBAAM,QAAQ,KAAK,aAAa,IAAI,GAAG;AACvC,gBAAI,OAAO,UAAU;AACnB,mBAAK,aAAa,OAAO,GAAG;AAC5B;AAAA,YACF;AAAA,UACF;AAAA,QACF;AACA,YAAI,SAAS;AACX,cAAI;AACF,mBAAO,KAAK,kCAAkC,OAAO,UAAU;AAAA,UACjE,QAAQ;AAAA,UAAC;AAAA,QACX;AACA,eAAO;AAAA,MACT;AAAA,IACF;AAAA;AAAA;","names":[]}
@@ -1,93 +1,157 @@
1
- import {
2
- getInstanceId,
3
- init_instance_id
4
- } from "./chunk-6VVXKXTI.mjs";
5
- import {
6
- init_metrics,
7
- metrics_exports
8
- } from "./chunk-34QX63WK.mjs";
9
- import {
10
- SpanStatusCode,
11
- context,
12
- init_lazy_otel,
13
- trace
14
- } from "./chunk-UCMJJ3IM.mjs";
15
1
  import {
16
2
  __commonJS,
17
- __esm,
18
- __export,
19
- __require,
20
- __toCommonJS
3
+ __esm
21
4
  } from "./chunk-J7LXIPZS.mjs";
22
5
 
23
- // src/telemetry/fallback-ndjson.ts
24
- var fallback_ndjson_exports = {};
25
- __export(fallback_ndjson_exports, {
26
- emitNdjsonFallback: () => emitNdjsonFallback,
27
- emitNdjsonSpanWithEvents: () => emitNdjsonSpanWithEvents,
28
- flushNdjson: () => flushNdjson
29
- });
30
- import * as fs from "fs";
31
- import * as path from "path";
32
- function resolveTargetPath(outDir) {
33
- if (process.env.VISOR_FALLBACK_TRACE_FILE) {
34
- CURRENT_FILE = process.env.VISOR_FALLBACK_TRACE_FILE;
35
- return CURRENT_FILE;
6
+ // src/utils/human-id.ts
7
+ function randomSuffix() {
8
+ const chars = "abcdefghjkmnpqrstuvwxyz23456789";
9
+ let result = "";
10
+ for (let i = 0; i < 4; i++) {
11
+ result += chars[Math.floor(Math.random() * chars.length)];
36
12
  }
37
- if (CURRENT_FILE) return CURRENT_FILE;
38
- const ts = (/* @__PURE__ */ new Date()).toISOString().replace(/[:.]/g, "-");
39
- CURRENT_FILE = path.join(outDir, `${ts}.ndjson`);
40
- return CURRENT_FILE;
13
+ return result;
41
14
  }
42
- function isEnabled() {
43
- if (process.env.VISOR_FALLBACK_TRACE_FILE) return true;
44
- return process.env.VISOR_TELEMETRY_ENABLED === "true" && (process.env.VISOR_TELEMETRY_SINK || "file") === "file";
15
+ function generateHumanId() {
16
+ const adj = adjectives[Math.floor(Math.random() * adjectives.length)];
17
+ const noun = nouns[Math.floor(Math.random() * nouns.length)];
18
+ const suffix = randomSuffix();
19
+ return `${adj}-${noun}-${suffix}`;
45
20
  }
46
- function appendAsync(outDir, line) {
47
- writeChain = writeChain.then(async () => {
48
- if (!dirReady) {
49
- try {
50
- await fs.promises.mkdir(outDir, { recursive: true });
51
- } catch {
52
- }
53
- dirReady = true;
54
- }
55
- const target = resolveTargetPath(outDir);
56
- await fs.promises.appendFile(target, line, "utf8");
57
- }).catch(() => {
58
- });
21
+ function generateShortHumanId() {
22
+ const adj = adjectives[Math.floor(Math.random() * adjectives.length)];
23
+ const noun = nouns[Math.floor(Math.random() * nouns.length)];
24
+ return `${adj}-${noun}`;
59
25
  }
60
- async function flushNdjson() {
61
- try {
62
- await writeChain;
63
- } catch {
64
- }
65
- }
66
- function emitNdjsonFallback(name, attrs) {
67
- try {
68
- if (!isEnabled()) return;
69
- const outDir = process.env.VISOR_TRACE_DIR || path.join(process.cwd(), "output", "traces");
70
- const line = JSON.stringify({ name, attributes: attrs }) + "\n";
71
- appendAsync(outDir, line);
72
- } catch {
26
+ var adjectives, nouns;
27
+ var init_human_id = __esm({
28
+ "src/utils/human-id.ts"() {
29
+ "use strict";
30
+ adjectives = [
31
+ "bold",
32
+ "calm",
33
+ "cool",
34
+ "dark",
35
+ "fast",
36
+ "gold",
37
+ "green",
38
+ "happy",
39
+ "kind",
40
+ "loud",
41
+ "mild",
42
+ "neat",
43
+ "nice",
44
+ "pink",
45
+ "pure",
46
+ "quick",
47
+ "rare",
48
+ "rich",
49
+ "safe",
50
+ "slim",
51
+ "soft",
52
+ "tall",
53
+ "tidy",
54
+ "tiny",
55
+ "warm",
56
+ "wise",
57
+ "young",
58
+ "able",
59
+ "blue",
60
+ "brave",
61
+ "busy",
62
+ "clean",
63
+ "crisp",
64
+ "eager",
65
+ "fair",
66
+ "fresh",
67
+ "glad",
68
+ "grand",
69
+ "keen",
70
+ "lush",
71
+ "prime",
72
+ "proud",
73
+ "sharp",
74
+ "sleek",
75
+ "smart",
76
+ "solid",
77
+ "swift",
78
+ "vivid",
79
+ "wild",
80
+ "witty",
81
+ "zesty"
82
+ ];
83
+ nouns = [
84
+ "ant",
85
+ "bat",
86
+ "bear",
87
+ "bee",
88
+ "bird",
89
+ "bull",
90
+ "cat",
91
+ "cow",
92
+ "crab",
93
+ "crow",
94
+ "deer",
95
+ "dog",
96
+ "dove",
97
+ "duck",
98
+ "eagle",
99
+ "elk",
100
+ "fish",
101
+ "fox",
102
+ "frog",
103
+ "goat",
104
+ "hawk",
105
+ "hare",
106
+ "horse",
107
+ "jay",
108
+ "lark",
109
+ "lion",
110
+ "lynx",
111
+ "mole",
112
+ "moth",
113
+ "mouse",
114
+ "newt",
115
+ "owl",
116
+ "panda",
117
+ "pig",
118
+ "puma",
119
+ "rat",
120
+ "raven",
121
+ "seal",
122
+ "shark",
123
+ "sheep",
124
+ "sloth",
125
+ "snail",
126
+ "snake",
127
+ "spider",
128
+ "swan",
129
+ "tiger",
130
+ "toad",
131
+ "trout",
132
+ "viper",
133
+ "wasp",
134
+ "whale",
135
+ "wolf",
136
+ "wren",
137
+ "yak",
138
+ "zebra"
139
+ ];
73
140
  }
74
- }
75
- function emitNdjsonSpanWithEvents(name, attrs, events) {
76
- try {
77
- if (!isEnabled()) return;
78
- const outDir = process.env.VISOR_TRACE_DIR || path.join(process.cwd(), "output", "traces");
79
- const line = JSON.stringify({ name, attributes: attrs, events }) + "\n";
80
- appendAsync(outDir, line);
81
- } catch {
141
+ });
142
+
143
+ // src/utils/instance-id.ts
144
+ function getInstanceId() {
145
+ if (!_instanceId) {
146
+ _instanceId = generateHumanId();
82
147
  }
148
+ return _instanceId;
83
149
  }
84
- var CURRENT_FILE, dirReady, writeChain;
85
- var init_fallback_ndjson = __esm({
86
- "src/telemetry/fallback-ndjson.ts"() {
150
+ var _instanceId;
151
+ var init_instance_id = __esm({
152
+ "src/utils/instance-id.ts"() {
87
153
  "use strict";
88
- CURRENT_FILE = null;
89
- dirReady = false;
90
- writeChain = Promise.resolve();
154
+ init_human_id();
91
155
  }
92
156
  });
93
157
 
@@ -215,7 +279,7 @@ var require_package = __commonJS({
215
279
  "@opentelemetry/sdk-node": "^0.203.0",
216
280
  "@opentelemetry/sdk-trace-base": "^1.30.1",
217
281
  "@opentelemetry/semantic-conventions": "^1.30.1",
218
- "@probelabs/probe": "^0.6.0-rc297",
282
+ "@probelabs/probe": "^0.6.0-rc304",
219
283
  "@types/commander": "^2.12.0",
220
284
  "@types/uuid": "^10.0.0",
221
285
  "@utcp/file": "^1.1.0",
@@ -315,206 +379,12 @@ var require_package = __commonJS({
315
379
  }
316
380
  });
317
381
 
318
- // src/telemetry/trace-helpers.ts
319
- var trace_helpers_exports = {};
320
- __export(trace_helpers_exports, {
321
- __getOrCreateNdjsonPath: () => __getOrCreateNdjsonPath,
322
- _appendRunMarker: () => _appendRunMarker,
323
- addEvent: () => addEvent,
324
- getTracer: () => getTracer,
325
- getVisorRunAttributes: () => getVisorRunAttributes,
326
- setSpanAttributes: () => setSpanAttributes,
327
- setSpanError: () => setSpanError,
328
- withActiveSpan: () => withActiveSpan,
329
- withVisorRun: () => withVisorRun
330
- });
331
- function getTracer() {
332
- return trace.getTracer("visor");
333
- }
334
- async function withActiveSpan(name, attrs, fn) {
335
- const tracer = getTracer();
336
- return await new Promise((resolve, reject) => {
337
- const callback = async (span) => {
338
- try {
339
- const res = await fn(span);
340
- resolve(res);
341
- } catch (err) {
342
- try {
343
- if (err instanceof Error) span.recordException(err);
344
- span.setStatus({ code: SpanStatusCode.ERROR });
345
- } catch {
346
- }
347
- reject(err);
348
- } finally {
349
- try {
350
- span.end();
351
- } catch {
352
- }
353
- }
354
- };
355
- const options = attrs ? { attributes: attrs } : {};
356
- tracer.startActiveSpan(name, options, callback);
357
- });
358
- }
359
- function addEvent(name, attrs) {
360
- const span = trace.getSpan(context.active());
361
- if (span) {
362
- try {
363
- span.addEvent(name, attrs);
364
- } catch {
365
- }
366
- }
367
- try {
368
- const { emitNdjsonSpanWithEvents: emitNdjsonSpanWithEvents2 } = (init_fallback_ndjson(), __toCommonJS(fallback_ndjson_exports));
369
- emitNdjsonSpanWithEvents2("visor.event", {}, [{ name, attrs }]);
370
- if (name === "fail_if.triggered") {
371
- emitNdjsonSpanWithEvents2("visor.event", {}, [
372
- { name: "fail_if.evaluated", attrs },
373
- { name: "fail_if.triggered", attrs }
374
- ]);
375
- }
376
- } catch {
377
- }
378
- }
379
- function setSpanAttributes(attrs) {
380
- const span = trace.getSpan(context.active());
381
- if (!span) return;
382
- try {
383
- for (const [k, v] of Object.entries(attrs)) span.setAttribute(k, v);
384
- } catch {
385
- }
386
- }
387
- function setSpanError(err) {
388
- const span = trace.getSpan(context.active());
389
- if (!span) return;
390
- try {
391
- if (err instanceof Error) span.recordException(err);
392
- span.setStatus({ code: SpanStatusCode.ERROR });
393
- } catch {
394
- }
395
- }
396
- function getVisorRunAttributes() {
397
- const attrs = {};
398
- try {
399
- attrs["visor.version"] = process.env.VISOR_VERSION || (require_package()?.version ?? "dev");
400
- } catch {
401
- attrs["visor.version"] = "dev";
402
- }
403
- const commitShort = process.env.VISOR_COMMIT_SHORT || "";
404
- const commitFull = process.env.VISOR_COMMIT_SHA || process.env.VISOR_COMMIT || "";
405
- if (commitShort) {
406
- attrs["visor.commit"] = commitShort;
407
- }
408
- if (commitFull) {
409
- attrs["visor.commit.sha"] = commitFull;
410
- }
411
- attrs["visor.instance_id"] = getInstanceId();
412
- return attrs;
413
- }
414
- async function withVisorRun(attrs, runMeta, fn) {
415
- const {
416
- recordRunStart,
417
- recordRunDuration,
418
- resetRunAiCalls,
419
- recordRunAiCalls,
420
- getRunAiCalls
421
- } = (init_metrics(), __toCommonJS(metrics_exports));
422
- const instanceId = getInstanceId();
423
- recordRunStart({
424
- source: runMeta.source,
425
- userId: runMeta.userId,
426
- userName: runMeta.userName,
427
- workflowId: runMeta.workflowId,
428
- instanceId
429
- });
430
- resetRunAiCalls();
431
- const startMs = Date.now();
432
- let success = true;
433
- try {
434
- return await withActiveSpan("visor.run", attrs, async (span) => {
435
- try {
436
- return await fn(span);
437
- } finally {
438
- try {
439
- span.setAttribute("visor.run.ai_calls", getRunAiCalls());
440
- span.setAttribute("visor.run.duration_ms", Date.now() - startMs);
441
- } catch {
442
- }
443
- }
444
- });
445
- } catch (err) {
446
- success = false;
447
- throw err;
448
- } finally {
449
- recordRunAiCalls({
450
- source: runMeta.source,
451
- workflowId: runMeta.workflowId
452
- });
453
- recordRunDuration(Date.now() - startMs, {
454
- source: runMeta.source,
455
- userId: runMeta.userId,
456
- workflowId: runMeta.workflowId,
457
- success
458
- });
459
- }
460
- }
461
- function __getOrCreateNdjsonPath() {
462
- try {
463
- if (process.env.VISOR_TELEMETRY_SINK && process.env.VISOR_TELEMETRY_SINK !== "file")
464
- return null;
465
- const path2 = __require("path");
466
- const fs2 = __require("fs");
467
- if (process.env.VISOR_FALLBACK_TRACE_FILE) {
468
- __ndjsonPath = process.env.VISOR_FALLBACK_TRACE_FILE;
469
- const dir = path2.dirname(__ndjsonPath);
470
- if (!fs2.existsSync(dir)) fs2.mkdirSync(dir, { recursive: true });
471
- return __ndjsonPath;
472
- }
473
- const outDir = process.env.VISOR_TRACE_DIR || path2.join(process.cwd(), "output", "traces");
474
- if (!fs2.existsSync(outDir)) fs2.mkdirSync(outDir, { recursive: true });
475
- if (!__ndjsonPath) {
476
- const ts = (/* @__PURE__ */ new Date()).toISOString().replace(/[:.]/g, "-");
477
- __ndjsonPath = path2.join(outDir, `${ts}.ndjson`);
478
- }
479
- return __ndjsonPath;
480
- } catch {
481
- return null;
482
- }
483
- }
484
- function _appendRunMarker() {
485
- try {
486
- const fs2 = __require("fs");
487
- const p = __getOrCreateNdjsonPath();
488
- if (!p) return;
489
- const line = { name: "visor.run", attributes: { started: true } };
490
- fs2.appendFileSync(p, JSON.stringify(line) + "\n", "utf8");
491
- } catch {
492
- }
493
- }
494
- var __ndjsonPath;
495
- var init_trace_helpers = __esm({
496
- "src/telemetry/trace-helpers.ts"() {
497
- init_lazy_otel();
498
- init_instance_id();
499
- __ndjsonPath = null;
500
- }
501
- });
502
-
503
382
  export {
504
- emitNdjsonFallback,
505
- emitNdjsonSpanWithEvents,
506
- fallback_ndjson_exports,
507
- init_fallback_ndjson,
508
- getTracer,
509
- withActiveSpan,
510
- addEvent,
511
- setSpanAttributes,
512
- setSpanError,
513
- getVisorRunAttributes,
514
- withVisorRun,
515
- __getOrCreateNdjsonPath,
516
- _appendRunMarker,
517
- trace_helpers_exports,
518
- init_trace_helpers
383
+ generateHumanId,
384
+ generateShortHumanId,
385
+ init_human_id,
386
+ getInstanceId,
387
+ init_instance_id,
388
+ require_package
519
389
  };
520
- //# sourceMappingURL=chunk-3JFK6KCD.mjs.map
390
+ //# sourceMappingURL=chunk-MFXPJUUE.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/utils/human-id.ts","../../src/utils/instance-id.ts","../../package.json"],"sourcesContent":["/**\n * Generate human-readable IDs like Kubernetes (e.g., \"happy-panda-7x3k\")\n */\n\nconst adjectives = [\n 'bold',\n 'calm',\n 'cool',\n 'dark',\n 'fast',\n 'gold',\n 'green',\n 'happy',\n 'kind',\n 'loud',\n 'mild',\n 'neat',\n 'nice',\n 'pink',\n 'pure',\n 'quick',\n 'rare',\n 'rich',\n 'safe',\n 'slim',\n 'soft',\n 'tall',\n 'tidy',\n 'tiny',\n 'warm',\n 'wise',\n 'young',\n 'able',\n 'blue',\n 'brave',\n 'busy',\n 'clean',\n 'crisp',\n 'eager',\n 'fair',\n 'fresh',\n 'glad',\n 'grand',\n 'keen',\n 'lush',\n 'prime',\n 'proud',\n 'sharp',\n 'sleek',\n 'smart',\n 'solid',\n 'swift',\n 'vivid',\n 'wild',\n 'witty',\n 'zesty',\n];\n\nconst nouns = [\n 'ant',\n 'bat',\n 'bear',\n 'bee',\n 'bird',\n 'bull',\n 'cat',\n 'cow',\n 'crab',\n 'crow',\n 'deer',\n 'dog',\n 'dove',\n 'duck',\n 'eagle',\n 'elk',\n 'fish',\n 'fox',\n 'frog',\n 'goat',\n 'hawk',\n 'hare',\n 'horse',\n 'jay',\n 'lark',\n 'lion',\n 'lynx',\n 'mole',\n 'moth',\n 'mouse',\n 'newt',\n 'owl',\n 'panda',\n 'pig',\n 'puma',\n 'rat',\n 'raven',\n 'seal',\n 'shark',\n 'sheep',\n 'sloth',\n 'snail',\n 'snake',\n 'spider',\n 'swan',\n 'tiger',\n 'toad',\n 'trout',\n 'viper',\n 'wasp',\n 'whale',\n 'wolf',\n 'wren',\n 'yak',\n 'zebra',\n];\n\n/**\n * Generate a random alphanumeric suffix (4 chars)\n */\nfunction randomSuffix(): string {\n const chars = 'abcdefghjkmnpqrstuvwxyz23456789'; // no i,l,o,0,1 to avoid confusion\n let result = '';\n for (let i = 0; i < 4; i++) {\n result += chars[Math.floor(Math.random() * chars.length)];\n }\n return result;\n}\n\n/**\n * Generate a human-readable ID like \"happy-panda-7x3k\"\n */\nexport function generateHumanId(): string {\n const adj = adjectives[Math.floor(Math.random() * adjectives.length)];\n const noun = nouns[Math.floor(Math.random() * nouns.length)];\n const suffix = randomSuffix();\n return `${adj}-${noun}-${suffix}`;\n}\n\n/**\n * Generate a short human-readable ID like \"happy-panda\" (no suffix)\n */\nexport function generateShortHumanId(): string {\n const adj = adjectives[Math.floor(Math.random() * adjectives.length)];\n const noun = nouns[Math.floor(Math.random() * nouns.length)];\n return `${adj}-${noun}`;\n}\n","/**\n * Visor instance ID — unique per process lifetime.\n *\n * Used to identify which visor instance created/owns a task,\n * especially in multi-node environments.\n */\n\nimport { generateHumanId } from './human-id';\n\nlet _instanceId: string | undefined;\n\n/** Get or generate the visor instance ID for this process. */\nexport function getInstanceId(): string {\n if (!_instanceId) {\n _instanceId = generateHumanId();\n }\n return _instanceId;\n}\n","{\n \"name\": \"@probelabs/visor\",\n \"version\": \"0.1.42\",\n \"main\": \"dist/index.js\",\n \"bin\": {\n \"visor\": \"./dist/index.js\"\n },\n \"exports\": {\n \".\": {\n \"require\": \"./dist/index.js\",\n \"import\": \"./dist/index.js\"\n },\n \"./sdk\": {\n \"types\": \"./dist/sdk/sdk.d.ts\",\n \"import\": \"./dist/sdk/sdk.mjs\",\n \"require\": \"./dist/sdk/sdk.js\"\n },\n \"./cli\": {\n \"require\": \"./dist/index.js\"\n }\n },\n \"files\": [\n \"dist/\",\n \"defaults/\",\n \"action.yml\",\n \"README.md\",\n \"LICENSE\"\n ],\n \"publishConfig\": {\n \"access\": \"public\",\n \"registry\": \"https://registry.npmjs.org/\"\n },\n \"scripts\": {\n \"build:cli\": \"ncc build src/index.ts -o dist && cp -r defaults dist/ && cp -r output dist/ && cp -r docs dist/ && cp -r examples dist/ && cp -r src/debug-visualizer/ui dist/debug-visualizer/ && node scripts/inject-version.js && echo '#!/usr/bin/env node' | cat - dist/index.js > temp && mv temp dist/index.js && chmod +x dist/index.js\",\n \"build:sdk\": \"tsup src/sdk.ts --dts --sourcemap --format esm,cjs --out-dir dist/sdk\",\n \"build\": \"./scripts/build-oss.sh\",\n \"build:ee\": \"npm run build:cli && npm run build:sdk\",\n \"test\": \"jest && npm run test:yaml\",\n \"test:unit\": \"jest\",\n \"prepublishOnly\": \"npm run build\",\n \"test:watch\": \"jest --watch\",\n \"test:coverage\": \"jest --coverage\",\n \"test:ee\": \"jest --testPathPatterns='tests/ee' --testPathIgnorePatterns='/node_modules/' --no-coverage\",\n \"test:manual:bash\": \"RUN_MANUAL_TESTS=true jest tests/manual/bash-config-manual.test.ts\",\n \"lint\": \"eslint src tests --ext .ts\",\n \"lint:fix\": \"eslint src tests --ext .ts --fix\",\n \"format\": \"prettier --write src tests\",\n \"format:check\": \"prettier --check src tests\",\n \"clean\": \"\",\n \"clean:traces\": \"node scripts/clean-traces.js\",\n \"prebuild\": \"npm run clean && node scripts/generate-config-schema.js\",\n \"pretest\": \"npm run clean:traces && node scripts/generate-config-schema.js && npm run build:cli\",\n \"pretest:unit\": \"npm run clean:traces && node scripts/generate-config-schema.js && npm run build:cli\",\n \"test:with-build\": \"npm run build:cli && jest\",\n \"test:yaml\": \"node dist/index.js test --progress compact\",\n \"test:yaml:parallel\": \"node dist/index.js test --progress compact --max-parallel 4\",\n \"prepare\": \"husky\",\n \"pre-commit\": \"lint-staged\",\n \"deploy:site\": \"cd site && npx wrangler pages deploy . --project-name=visor-site --commit-dirty=true\",\n \"deploy:worker\": \"npx wrangler deploy\",\n \"deploy\": \"npm run deploy:site && npm run deploy:worker\",\n \"publish:ee\": \"./scripts/publish-ee.sh\",\n \"release\": \"./scripts/release.sh\",\n \"release:patch\": \"./scripts/release.sh patch\",\n \"release:minor\": \"./scripts/release.sh minor\",\n \"release:major\": \"./scripts/release.sh major\",\n \"release:prerelease\": \"./scripts/release.sh prerelease\",\n \"docs:validate\": \"node scripts/validate-readme-links.js\",\n \"workshop:setup\": \"npm install -D reveal-md@6.1.2\",\n \"workshop:serve\": \"cd workshop && reveal-md slides.md -w\",\n \"workshop:export\": \"reveal-md workshop/slides.md --static workshop/build\",\n \"workshop:pdf\": \"reveal-md workshop/slides.md --print workshop/Visor-Workshop.pdf --print-size letter\",\n \"workshop:pdf:ci\": \"reveal-md workshop/slides.md --print workshop/Visor-Workshop.pdf --print-size letter --puppeteer-launch-args=\\\"--no-sandbox --disable-dev-shm-usage\\\"\",\n \"workshop:pdf:a4\": \"reveal-md workshop/slides.md --print workshop/Visor-Workshop-A4.pdf --print-size A4\",\n \"workshop:build\": \"npm run workshop:export && npm run workshop:pdf\",\n \"simulate:issue\": \"TS_NODE_TRANSPILE_ONLY=1 ts-node scripts/simulate-gh-run.ts --event issues --action opened --debug\",\n \"simulate:comment\": \"TS_NODE_TRANSPILE_ONLY=1 ts-node scripts/simulate-gh-run.ts --event issue_comment --action created --debug\"\n },\n \"keywords\": [\n \"code-review\",\n \"ai\",\n \"github-action\",\n \"cli\",\n \"pr-review\",\n \"visor\"\n ],\n \"author\": \"Probe Labs\",\n \"license\": \"MIT\",\n \"description\": \"AI workflow engine for code review, assistants, and automation — orchestrate checks, MCP tools, and AI providers with YAML-driven pipelines\",\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git+https://github.com/probelabs/visor.git\"\n },\n \"bugs\": {\n \"url\": \"https://github.com/probelabs/visor/issues\"\n },\n \"homepage\": \"https://github.com/probelabs/visor#readme\",\n \"dependencies\": {\n \"@actions/core\": \"^1.11.1\",\n \"@apidevtools/swagger-parser\": \"^12.1.0\",\n \"@grammyjs/runner\": \"^2.0.3\",\n \"@modelcontextprotocol/sdk\": \"^1.25.3\",\n \"@nyariv/sandboxjs\": \"github:probelabs/SandboxJS#23c4bb611f7d05f3cb8c523917b5f57103e48108\",\n \"@octokit/action\": \"^8.0.2\",\n \"@octokit/auth-app\": \"^8.1.0\",\n \"@octokit/core\": \"^7.0.3\",\n \"@octokit/rest\": \"^22.0.0\",\n \"@opentelemetry/api\": \"^1.9.0\",\n \"@opentelemetry/api-logs\": \"^0.203.0\",\n \"@opentelemetry/core\": \"^1.30.1\",\n \"@opentelemetry/exporter-logs-otlp-http\": \"^0.203.0\",\n \"@opentelemetry/exporter-metrics-otlp-http\": \"^0.203.0\",\n \"@opentelemetry/exporter-trace-otlp-grpc\": \"^0.203.0\",\n \"@opentelemetry/exporter-trace-otlp-http\": \"^0.203.0\",\n \"@opentelemetry/instrumentation\": \"^0.203.0\",\n \"@opentelemetry/resources\": \"^1.30.1\",\n \"@opentelemetry/sdk-logs\": \"^0.203.0\",\n \"@opentelemetry/sdk-metrics\": \"^1.30.1\",\n \"@opentelemetry/sdk-node\": \"^0.203.0\",\n \"@opentelemetry/sdk-trace-base\": \"^1.30.1\",\n \"@opentelemetry/semantic-conventions\": \"^1.30.1\",\n \"@probelabs/probe\": \"^0.6.0-rc304\",\n \"@types/commander\": \"^2.12.0\",\n \"@types/uuid\": \"^10.0.0\",\n \"@utcp/file\": \"^1.1.0\",\n \"@utcp/http\": \"^1.1.0\",\n \"@utcp/sdk\": \"^1.1.0\",\n \"@utcp/text\": \"^1.1.0\",\n \"acorn\": \"^8.16.0\",\n \"acorn-walk\": \"^8.3.5\",\n \"ajv\": \"^8.17.1\",\n \"ajv-formats\": \"^3.0.1\",\n \"better-sqlite3\": \"^11.0.0\",\n \"blessed\": \"^0.1.81\",\n \"botbuilder\": \"^4.23.3\",\n \"botframework-connector\": \"^4.23.3\",\n \"cli-table3\": \"^0.6.5\",\n \"commander\": \"^14.0.0\",\n \"deepmerge\": \"^4.3.1\",\n \"dotenv\": \"^17.2.3\",\n \"grammy\": \"^1.41.1\",\n \"ignore\": \"^7.0.5\",\n \"imapflow\": \"^1.2.12\",\n \"js-yaml\": \"^4.1.0\",\n \"jsonpath-plus\": \"^10.4.0\",\n \"liquidjs\": \"^10.21.1\",\n \"mailparser\": \"^3.9.3\",\n \"minimatch\": \"^10.2.2\",\n \"node-cron\": \"^3.0.3\",\n \"nodemailer\": \"^8.0.1\",\n \"open\": \"^9.1.0\",\n \"resend\": \"^6.9.3\",\n \"simple-git\": \"^3.28.0\",\n \"uuid\": \"^11.1.0\",\n \"ws\": \"^8.18.3\"\n },\n \"optionalDependencies\": {\n \"@anthropic/claude-code-sdk\": \"npm:null@*\",\n \"@open-policy-agent/opa-wasm\": \"^1.10.0\",\n \"knex\": \"^3.1.0\",\n \"mysql2\": \"^3.11.0\",\n \"pg\": \"^8.13.0\",\n \"tedious\": \"^19.0.0\"\n },\n \"devDependencies\": {\n \"@eslint/js\": \"^9.34.0\",\n \"@kie/act-js\": \"^2.6.2\",\n \"@kie/mock-github\": \"^2.0.1\",\n \"@swc/core\": \"^1.13.2\",\n \"@swc/jest\": \"^0.2.37\",\n \"@types/better-sqlite3\": \"^7.6.0\",\n \"@types/blessed\": \"^0.1.27\",\n \"@types/jest\": \"^30.0.0\",\n \"@types/js-yaml\": \"^4.0.9\",\n \"@types/mailparser\": \"^3.4.6\",\n \"@types/node\": \"^24.3.0\",\n \"@types/node-cron\": \"^3.0.11\",\n \"@types/nodemailer\": \"^7.0.11\",\n \"@types/ws\": \"^8.18.1\",\n \"@typescript-eslint/eslint-plugin\": \"^8.42.0\",\n \"@typescript-eslint/parser\": \"^8.42.0\",\n \"@vercel/ncc\": \"^0.38.4\",\n \"eslint\": \"^9.34.0\",\n \"eslint-config-prettier\": \"^10.1.8\",\n \"eslint-plugin-prettier\": \"^5.5.4\",\n \"husky\": \"^9.1.7\",\n \"jest\": \"^30.1.3\",\n \"lint-staged\": \"^16.1.6\",\n \"prettier\": \"^3.6.2\",\n \"reveal-md\": \"^6.1.2\",\n \"ts-json-schema-generator\": \"^1.5.1\",\n \"ts-node\": \"^10.9.2\",\n \"tsup\": \"^8.5.0\",\n \"typescript\": \"^5.9.2\",\n \"wrangler\": \"^3.0.0\"\n },\n \"peerDependenciesMeta\": {\n \"@anthropic/claude-code-sdk\": {\n \"optional\": true\n }\n },\n \"directories\": {\n \"test\": \"tests\"\n },\n \"lint-staged\": {\n \"src/**/*.{ts,js}\": [\n \"eslint --fix\",\n \"prettier --write\"\n ],\n \"tests/**/*.{ts,js}\": [\n \"eslint --fix\",\n \"prettier --write\"\n ],\n \"*.{json,md,yml,yaml}\": [\n \"prettier --write\"\n ]\n }\n}\n"],"mappings":"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","names":[]}