eve 0.17.1 → 0.17.2

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 (83) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/dist/src/channel/types.d.ts +11 -0
  3. package/dist/src/cli/dev/tui/status-line.d.ts +1 -1
  4. package/dist/src/compiled/.vendor-stamp.json +1 -1
  5. package/dist/src/compiled/@chat-adapter/slack/api.d.ts +132 -0
  6. package/dist/src/compiled/@chat-adapter/slack/api.js +1 -0
  7. package/dist/src/compiled/@chat-adapter/slack/blocks.js +1 -1
  8. package/dist/src/compiled/@chat-adapter/slack/format.d.ts +33 -0
  9. package/dist/src/compiled/@chat-adapter/slack/format.js +1 -0
  10. package/dist/src/compiled/@chat-adapter/slack/index.js +28 -28
  11. package/dist/src/compiled/@chat-adapter/slack/types-AntsVifS.d.ts +187 -0
  12. package/dist/src/compiled/@chat-adapter/slack/webhook.d.ts +10 -0
  13. package/dist/src/compiled/@chat-adapter/slack/webhook.js +1 -0
  14. package/dist/src/compiled/_chunks/node/chunk-AYN7QRWH-B__hKQV7.js +1 -0
  15. package/dist/src/compiled/_chunks/node/chunk-HFKBBKCJ-CWaVIQuL.js +1 -0
  16. package/dist/src/compiler/manifest.d.ts +2 -2
  17. package/dist/src/compiler/manifest.js +1 -1
  18. package/dist/src/compiler/normalize-agent-config.js +1 -1
  19. package/dist/src/context/keys.d.ts +2 -0
  20. package/dist/src/context/keys.js +1 -1
  21. package/dist/src/evals/assertions/run.js +2 -2
  22. package/dist/src/execution/create-session-step.d.ts +2 -0
  23. package/dist/src/execution/create-session-step.js +1 -1
  24. package/dist/src/execution/dispatch-runtime-actions-step.js +1 -1
  25. package/dist/src/execution/durable-session-store.d.ts +3 -0
  26. package/dist/src/execution/runtime-context.js +1 -1
  27. package/dist/src/execution/session.d.ts +6 -1
  28. package/dist/src/execution/session.js +3 -3
  29. package/dist/src/execution/subagent-tool.js +1 -1
  30. package/dist/src/execution/workflow-entry.js +1 -1
  31. package/dist/src/harness/advertised-tools.d.ts +33 -0
  32. package/dist/src/harness/advertised-tools.js +1 -0
  33. package/dist/src/harness/subagent-depth.d.ts +17 -0
  34. package/dist/src/harness/subagent-depth.js +1 -0
  35. package/dist/src/harness/tool-loop.js +1 -1
  36. package/dist/src/harness/turn-tag-state.d.ts +30 -22
  37. package/dist/src/harness/turn-tag-state.js +1 -1
  38. package/dist/src/harness/types.d.ts +28 -0
  39. package/dist/src/harness/workflow-continuation-security.d.ts +1 -0
  40. package/dist/src/harness/workflow-continuation-security.js +1 -1
  41. package/dist/src/internal/application/package.js +1 -1
  42. package/dist/src/internal/authored-definition/core.js +1 -1
  43. package/dist/src/internal/nitro/host/configure-nitro-routes.js +2 -2
  44. package/dist/src/internal/nitro/routes/channel-dispatch.js +1 -1
  45. package/dist/src/internal/nitro/routes/channel-route-context.d.ts +5 -0
  46. package/dist/src/internal/nitro/routes/channel-route-context.js +1 -0
  47. package/dist/src/internal/nitro/routes/info.d.ts +2 -6
  48. package/dist/src/internal/nitro/routes/info.js +1 -1
  49. package/dist/src/protocol/routes.d.ts +2 -4
  50. package/dist/src/public/channels/eve.d.ts +5 -4
  51. package/dist/src/public/channels/eve.js +1 -1
  52. package/dist/src/public/channels/slack/api.d.ts +3 -6
  53. package/dist/src/public/channels/slack/api.js +1 -1
  54. package/dist/src/public/channels/slack/inbound.d.ts +11 -9
  55. package/dist/src/public/channels/slack/inbound.js +1 -1
  56. package/dist/src/public/channels/slack/interactions.d.ts +2 -1
  57. package/dist/src/public/channels/slack/interactions.js +1 -1
  58. package/dist/src/public/channels/slack/mrkdwn.d.ts +3 -35
  59. package/dist/src/public/channels/slack/mrkdwn.js +1 -1
  60. package/dist/src/public/channels/slack/slackChannel.js +1 -1
  61. package/dist/src/public/channels/slack/verify.d.ts +4 -42
  62. package/dist/src/public/channels/slack/verify.js +1 -1
  63. package/dist/src/public/definitions/agent.d.ts +1 -1
  64. package/dist/src/public/index.d.ts +1 -1
  65. package/dist/src/runtime/resolve-agent.js +1 -1
  66. package/dist/src/setup/boxes/preflight.js +1 -1
  67. package/dist/src/setup/boxes/select-model.js +1 -1
  68. package/dist/src/setup/flows/model.js +1 -1
  69. package/dist/src/setup/scaffold/create/project.d.ts +1 -1
  70. package/dist/src/setup/scaffold/create/project.js +1 -1
  71. package/dist/src/setup/scaffold/create/web-template.d.ts +3 -0
  72. package/dist/src/setup/scaffold/create/web-template.js +1 -1
  73. package/dist/src/shared/agent-definition.d.ts +37 -0
  74. package/dist/src/shared/default-agent-model.d.ts +1 -1
  75. package/dist/src/shared/default-agent-model.js +1 -1
  76. package/docs/agent-config.md +35 -8
  77. package/docs/channels/eve.mdx +3 -2
  78. package/docs/concepts/sessions-runs-and-streaming.md +2 -2
  79. package/docs/getting-started.mdx +5 -5
  80. package/docs/reference/typescript-api.md +1 -1
  81. package/docs/subagents.mdx +19 -0
  82. package/package.json +1 -1
  83. package/dist/src/compiled/_chunks/node/chunk-AYN7QRWH-Csu8sG38.js +0 -1
package/CHANGELOG.md CHANGED
@@ -1,5 +1,19 @@
1
1
  # eve
2
2
 
3
+ ## 0.17.2
4
+
5
+ ### Patch Changes
6
+
7
+ - afa22f8: Cap recursive subagent delegation at three child-session levels by default, configurable with `defineAgent({ limits: { maxSubagentDepth } })`. At the limit, eve no longer advertises subagent tools and blocks stale delegated calls before starting another child session.
8
+ - 55e9ad5: Update the scaffold's default agent model to `anthropic/claude-sonnet-5`. New agents created with `eve init` (and the setup model picker's pre-selected default) now use Claude Sonnet 5 instead of Claude Sonnet 4.6.
9
+ - f26d600: use Chat SDK Slack format primitives for Slack mrkdwn conversion
10
+ - 087d6fd: use chat sdk slack api primitives for slack channel api helpers
11
+ - 70ebe69: use Chat SDK Slack webhook primitives for Slack channel parsing and verification
12
+ - ed8a935: Keep the `Workflow` orchestration tool root-only. Delegated subagent sessions can still call visible subagent tools directly until the configured depth cap, but eve no longer advertises `Workflow` from those child sessions.
13
+ - 37bd2bb: Use authored `eveChannel()` auth for `GET /eve/v1/info` so remote `eve dev` can authenticate with the same policy as the session routes.
14
+ - 2fdc561: Add `limits.maxInputTokensPerSession` and `limits.maxOutputTokensPerSession` to stop a durable session from starting more model calls after its accumulated provider-reported input or output token usage reaches the configured cap. Root sessions default to a 40M input-token budget, delegated subagent sessions default to 5M, and authored input limits override those defaults.
15
+ - 39c90de: Add explicit `dev:eve`, `build:eve`, and `start:eve` scripts to generated Web Chat projects so users can run the embedded eve app directly when needed.
16
+
3
17
  ## 0.17.1
4
18
 
5
19
  ### Patch Changes
@@ -229,6 +229,17 @@ export interface RunInput {
229
229
  };
230
230
  readonly mode: RunMode;
231
231
  readonly parent?: SessionParent;
232
+ /**
233
+ * Framework-owned depth of delegated local subagent sessions. Root sessions
234
+ * omit this and are treated as depth 0; each local child receives
235
+ * parent depth + 1.
236
+ */
237
+ readonly subagentDepth?: number;
238
+ /**
239
+ * Optional maximum delegated subagent depth inherited by this run. When
240
+ * omitted, the session uses its resolved agent config or eve's default.
241
+ */
242
+ readonly subagentMaxDepth?: number;
232
243
  }
233
244
  export interface DeliverInput {
234
245
  /**
@@ -6,7 +6,7 @@ import type { ModelEndpointStatus } from "#shared/model-endpoint-status.js";
6
6
  export interface StatusLineInput {
7
7
  /** Port of the connected local development server; omitted for remote sessions. */
8
8
  serverPort?: string;
9
- /** Resolved model slug, e.g. "anthropic/claude-sonnet-4-6"; absent when `/eve/v1/info` failed. */
9
+ /** Resolved model slug, e.g. "anthropic/claude-sonnet-5"; absent when `/eve/v1/info` failed. */
10
10
  model?: string;
11
11
  /** Preformatted token-flow segment (formatTokenFlow output), e.g. `↑ 394.4K ↓ 4.3K`. */
12
12
  tokens?: string;
@@ -33,5 +33,5 @@
33
33
  "zod": "4.4.3",
34
34
  "zod-validation-error": "5.0.0"
35
35
  },
36
- "scriptHash": "81bef7d913e88dd4ef50fba1de74b1a52eb4110f5d9e396e441d0da8b1f30888"
36
+ "scriptHash": "a8edd88e1dd67dde83d0116e7c80df8e0cb793c5db5da47508924651a427e821"
37
37
  }
@@ -0,0 +1,132 @@
1
+ type SlackBotToken = string | (() => Promise<string> | string);
2
+ type SlackFetch = typeof fetch;
3
+ interface SlackApiResponse {
4
+ error?: string;
5
+ needed?: string;
6
+ ok: boolean;
7
+ provided?: string;
8
+ response_metadata?: {
9
+ messages?: string[];
10
+ next_cursor?: string;
11
+ warnings?: string[];
12
+ [key: string]: unknown;
13
+ };
14
+ [key: string]: unknown;
15
+ }
16
+ interface SlackApiOptions {
17
+ apiUrl?: string;
18
+ fetch?: SlackFetch;
19
+ token: SlackBotToken;
20
+ }
21
+ interface SlackApiCallOptions extends SlackApiOptions {
22
+ contentType?: "form" | "json";
23
+ }
24
+ interface SlackMessageOptions extends SlackApiOptions {
25
+ blocks?: unknown[];
26
+ channel: string;
27
+ markdownText?: string;
28
+ metadata?: unknown;
29
+ replyBroadcast?: boolean;
30
+ text?: string;
31
+ threadTs?: string;
32
+ unfurlLinks?: boolean;
33
+ unfurlMedia?: boolean;
34
+ }
35
+ interface SlackEphemeralOptions extends SlackMessageOptions {
36
+ user: string;
37
+ }
38
+ interface SlackUpdateOptions extends SlackMessageOptions {
39
+ ts: string;
40
+ }
41
+ interface SlackDeleteOptions extends SlackApiOptions {
42
+ channel: string;
43
+ ts: string;
44
+ }
45
+ interface SlackPostedMessage {
46
+ channel?: string;
47
+ id: string;
48
+ raw: SlackApiResponse;
49
+ }
50
+ interface SlackResponseUrlPayload {
51
+ blocks?: unknown[];
52
+ deleteOriginal?: boolean;
53
+ replaceOriginal?: boolean;
54
+ responseType?: "ephemeral" | "in_channel";
55
+ text?: string;
56
+ threadTs?: string;
57
+ }
58
+ interface SlackResponseUrlOptions {
59
+ fetch?: SlackFetch;
60
+ }
61
+ interface SlackFileUpload {
62
+ altText?: string;
63
+ data: ArrayBuffer | Blob | Uint8Array;
64
+ filename: string;
65
+ snippetType?: string;
66
+ title?: string;
67
+ }
68
+ interface SlackUploadOptions extends SlackApiOptions {
69
+ channelId?: string;
70
+ initialComment?: string;
71
+ threadTs?: string;
72
+ }
73
+ interface SlackUploadResult {
74
+ fileIds: string[];
75
+ raw: SlackApiResponse;
76
+ }
77
+ interface SlackFileFetchOptions extends SlackApiOptions {
78
+ url: string;
79
+ }
80
+ declare class SlackApiError extends Error {
81
+ method: string;
82
+ response?: SlackApiResponse;
83
+ status?: number;
84
+ constructor(message: string, options: {
85
+ method: string;
86
+ response?: SlackApiResponse;
87
+ status?: number;
88
+ });
89
+ }
90
+ declare function resolveSlackBotToken(token: SlackBotToken): Promise<string>;
91
+ declare function callSlackApi<TResponse extends SlackApiResponse = SlackApiResponse>(method: string, body: Record<string, unknown>, options: SlackApiCallOptions): Promise<TResponse>;
92
+ declare function postSlackMessage(options: SlackMessageOptions): Promise<SlackPostedMessage>;
93
+ declare function postSlackEphemeral(options: SlackEphemeralOptions): Promise<SlackPostedMessage>;
94
+ declare function updateSlackMessage(options: SlackUpdateOptions): Promise<SlackPostedMessage>;
95
+ declare function deleteSlackMessage(options: SlackDeleteOptions): Promise<SlackApiResponse>;
96
+ declare function sendSlackResponseUrl(url: string, payload: SlackResponseUrlPayload, options?: SlackResponseUrlOptions): Promise<void>;
97
+ declare function uploadSlackFiles(files: readonly SlackFileUpload[], options: SlackUploadOptions): Promise<SlackUploadResult>;
98
+ declare function fetchSlackFile(options: SlackFileFetchOptions): Promise<Response>;
99
+ declare function encodeSlackApiBody(body: Record<string, unknown>, contentType?: "form" | "json"): {
100
+ body: string;
101
+ contentType: string;
102
+ };
103
+ declare function assertSlackOk(method: string, response: SlackApiResponse): void;
104
+
105
+ interface SlackThreadRepliesOptions extends SlackApiOptions {
106
+ channel: string;
107
+ cursor?: string;
108
+ includeAllMetadata?: boolean;
109
+ inclusive?: boolean;
110
+ latest?: string;
111
+ limit?: number;
112
+ oldest?: string;
113
+ ts: string;
114
+ }
115
+ interface SlackThreadRepliesResult {
116
+ messages: unknown[];
117
+ nextCursor?: string;
118
+ raw: SlackApiResponse;
119
+ }
120
+ interface SlackOpenViewOptions extends SlackApiOptions {
121
+ interactivityPointer?: string;
122
+ triggerId?: string;
123
+ view: unknown;
124
+ }
125
+ interface SlackOpenViewResult {
126
+ raw: SlackApiResponse;
127
+ view?: unknown;
128
+ }
129
+ declare function fetchSlackThreadReplies(options: SlackThreadRepliesOptions): Promise<SlackThreadRepliesResult>;
130
+ declare function openSlackView(options: SlackOpenViewOptions): Promise<SlackOpenViewResult>;
131
+
132
+ export { type SlackApiCallOptions, SlackApiError, type SlackApiOptions, type SlackApiResponse, type SlackBotToken, type SlackDeleteOptions, type SlackEphemeralOptions, type SlackFetch, type SlackFileFetchOptions, type SlackFileUpload, type SlackMessageOptions, type SlackOpenViewOptions, type SlackOpenViewResult, type SlackPostedMessage, type SlackResponseUrlOptions, type SlackResponseUrlPayload, type SlackThreadRepliesOptions, type SlackThreadRepliesResult, type SlackUpdateOptions, type SlackUploadOptions, type SlackUploadResult, assertSlackOk, callSlackApi, deleteSlackMessage, encodeSlackApiBody, fetchSlackFile, fetchSlackThreadReplies, openSlackView, postSlackEphemeral, postSlackMessage, resolveSlackBotToken, sendSlackResponseUrl, updateSlackMessage, uploadSlackFiles };
@@ -0,0 +1 @@
1
+ var e=class extends Error{method;response;status;constructor(e,t){super(e),this.name=`SlackApiError`,this.method=t.method,this.response=t.response,this.status=t.status}},t=`https://slack.com/api/`;async function n(e){return typeof e==`function`?await e():e}async function r(r,i,a){let o=await n(a.token),s=d(i,a.contentType??`form`),c=await(a.fetch??fetch)(new URL(r,a.apiUrl??t),{body:s.body,headers:{authorization:`Bearer ${o}`,"content-type":s.contentType},method:`POST`}),l=await c.json();if(!c.ok)throw new e(`Slack ${r} returned HTTP ${c.status}`,{method:r,response:l,status:c.status});return l}async function i(e){let t=await r(`chat.postMessage`,p(e),e);return f(`chat.postMessage`,t),{channel:b(t.channel),id:y(t.ts),raw:t}}async function a(e){let t=await r(`chat.postEphemeral`,{...p(e),user:e.user},e);return f(`chat.postEphemeral`,t),{channel:b(t.channel),id:y(t.message_ts),raw:t}}async function o(e){let t=await r(`chat.update`,{...p(e),ts:e.ts},e);return f(`chat.update`,t),{channel:b(t.channel),id:y(t.ts),raw:t}}async function s(e){let t=await r(`chat.delete`,{channel:e.channel,ts:e.ts},e);return f(`chat.delete`,t),t}async function c(t,n,r={}){let i=await(r.fetch??fetch)(t,{body:JSON.stringify(m(n)),headers:{"content-type":`application/json`},method:`POST`});if(!i.ok)throw new e(`Slack response_url returned HTTP ${i.status}`,{method:`response_url`,status:i.status})}async function l(t,i){if(t.length===0)return{fileIds:[],raw:{ok:!0}};let a=await n(i.token),o=i.fetch??fetch,s=[];for(let n of t){let t=await v(n.data),c=await r(`files.getUploadURLExternal`,{alt_txt:n.altText,filename:n.filename,length:t.byteLength,snippet_type:n.snippetType},i);f(`files.getUploadURLExternal`,c);let l=y(c.upload_url),u=y(c.file_id);if(!(l&&u))throw new e(`Slack files.getUploadURLExternal returned no upload URL`,{method:`files.getUploadURLExternal`,response:c});let d=await o(l,{body:t,headers:{authorization:`Bearer ${a}`,"content-type":`application/octet-stream`},method:`POST`});if(!d.ok)throw new e(`Slack file upload returned HTTP ${d.status}`,{method:`files.upload`,status:d.status});s.push(u)}let c=await r(`files.completeUploadExternal`,{channel_id:i.channelId,files:t.map((e,t)=>({id:s[t],title:e.title??e.filename})),initial_comment:i.initialComment,thread_ts:i.threadTs},i);return f(`files.completeUploadExternal`,c),{fileIds:s,raw:c}}async function u(t){let r=await n(t.token),i=await(t.fetch??fetch)(t.url,{headers:{authorization:`Bearer ${r}`}});if(!i.ok)throw new e(`Slack file fetch returned HTTP ${i.status}`,{method:`files.fetch`,status:i.status});return i}function d(e,t=`form`){if(t===`json`)return{body:JSON.stringify(_(e)),contentType:`application/json`};let n=new URLSearchParams;for(let[t,r]of Object.entries(e))r!=null&&n.set(t,g(r));return{body:n.toString(),contentType:`application/x-www-form-urlencoded`}}function f(t,n){if(n.ok!==!0)throw new e(`Slack ${t} failed: ${n.error??`unknown_error`}`,{method:t,response:n})}function p(e){return h(e),{blocks:e.blocks,channel:e.channel,markdown_text:e.markdownText,metadata:e.metadata,reply_broadcast:e.replyBroadcast,text:e.text,thread_ts:e.threadTs,unfurl_links:e.unfurlLinks,unfurl_media:e.unfurlMedia}}function m(e){return{blocks:e.blocks,delete_original:e.deleteOriginal,replace_original:e.replaceOriginal,response_type:e.responseType,text:e.text,thread_ts:e.threadTs}}function h(e){if(e.markdownText!==void 0&&(e.text!==void 0||e.blocks!==void 0))throw TypeError(`markdownText cannot be used with text or blocks`)}function g(e){return typeof e==`string`||typeof e==`number`||typeof e==`boolean`?String(e):JSON.stringify(e)}function _(e){let t={};for(let[n,r]of Object.entries(e))r!==void 0&&(t[n]=r);return t}async function v(e){return e instanceof Uint8Array?e:e instanceof ArrayBuffer?new Uint8Array(e):new Uint8Array(await e.arrayBuffer())}function y(e){return typeof e==`string`?e:``}function b(e){return typeof e==`string`?e:void 0}async function x(e){let t=await r(`conversations.replies`,{channel:e.channel,cursor:e.cursor,include_all_metadata:e.includeAllMetadata,inclusive:e.inclusive,latest:e.latest,limit:e.limit,oldest:e.oldest,ts:e.ts},e);return f(`conversations.replies`,t),{messages:Array.isArray(t.messages)?t.messages:[],nextCursor:C(t),raw:t}}async function S(e){if(!(e.triggerId||e.interactivityPointer))throw TypeError(`triggerId or interactivityPointer is required`);let t=await r(`views.open`,{interactivity_pointer:e.interactivityPointer,trigger_id:e.triggerId,view:e.view},e);return f(`views.open`,t),{raw:t,view:t.view}}function C(e){let t=e.response_metadata?.next_cursor;return typeof t==`string`&&t.length>0?t:void 0}export{e as SlackApiError,f as assertSlackOk,r as callSlackApi,s as deleteSlackMessage,d as encodeSlackApiBody,u as fetchSlackFile,x as fetchSlackThreadReplies,S as openSlackView,a as postSlackEphemeral,i as postSlackMessage,n as resolveSlackBotToken,c as sendSlackResponseUrl,o as updateSlackMessage,l as uploadSlackFiles};
@@ -1,4 +1,4 @@
1
- import{n as e}from"../../_chunks/node/chunk-AYN7QRWH-Csu8sG38.js";var t=class extends Error{constructor(e){super(e),this.name=`SlackBlockError`}},n={actionId:255,actionsElements:25,blockId:255,blocks:50,buttonText:75,buttonUrl:3e3,buttonValue:2e3,fields:10,fieldText:2e3,headerText:150,imageAlt:2e3,imageUrl:3e3,optionDescription:75,optionText:75,optionValue:150,options:100,placeholder:150,radioOptions:10,sectionText:3e3,tableColumns:20,tableRows:100,textObject:3e3},r=`input:`,i=`input-freeform:`,a=`input-freeform-submit`,o=`input-freeform-block`,s=`input-freeform-text`,c=/^(?<requestId>.+):button:\d+$/u;function l(e){let t={text:{text:v(e.prompt,n.sectionText),type:`mrkdwn`},type:`section`},r=e.options??[];if(r.length===0)return[t,{elements:[m(e.requestId)],type:`actions`}];let i=e.allowFreeform?[m(e.requestId)]:[];if(e.display===`radio`)return[t,{elements:[_(e),...i],type:`actions`}];if(e.display===`select`)return[t,{elements:[g(e),...i],type:`actions`}];let a=i.length>0?n.actionsElements-1:n.actionsElements;return[t,{elements:r.slice(0,a).map((t,n)=>h(e.requestId,t,n)).concat(i),type:`actions`}]}function u(e){if(!e.actionId.startsWith(`input:`))return null;let t=e.actionId.slice(r.length);if(e.selectedOptionValue!==void 0)return t?{optionId:e.selectedOptionValue,requestId:t}:null;let n=c.exec(t)?.groups?.requestId;return n&&e.value!==void 0?{optionId:e.value,requestId:n}:null}function d(e){let t=v(e.title??e.prompt??`Your answer`,24),r=[];return e.prompt&&r.push({text:{text:v(e.prompt,n.sectionText),type:`mrkdwn`},type:`section`}),r.push({block_id:o,element:{action_id:s,multiline:!0,type:`plain_text_input`},label:{text:`Answer`,type:`plain_text`},type:`input`}),{blocks:r,callback_id:a,close:{text:`Cancel`,type:`plain_text`},private_metadata:typeof e.metadata==`string`?e.metadata:JSON.stringify(e.metadata),submit:{text:`Submit`,type:`plain_text`},title:{text:t,type:`plain_text`},type:`modal`}}function f(e){return e.find(e=>e.blockId===`input-freeform-block`&&e.actionId===`input-freeform-text`)?.value}function p(e){let t=[];return e.promptBlock&&typeof e.promptBlock==`object`&&t.push(e.promptBlock),t.push({text:{text:`:white_check_mark: *${e.answer}*`,type:`mrkdwn`},type:`section`}),e.userId&&t.push({elements:[{text:`Answered by <@${e.userId}>`,type:`mrkdwn`}],type:`context`}),t}function m(e){return{action_id:`${i}${e}`,style:`primary`,text:{text:`Type your answer`,type:`plain_text`},type:`button`,value:e}}function h(e,t,i){return y({action_id:`${r}${e}:button:${i}`,style:t.style===`primary`||t.style===`danger`?t.style:void 0,text:{text:v(t.label,n.buttonText),type:`plain_text`},type:`button`,value:v(t.id,n.buttonValue)})}function g(e){let t=(e.options??[]).map(e=>({text:{text:v(e.label,n.optionText),type:`plain_text`},value:v(e.id,n.optionValue)}));return{action_id:`${r}${e.requestId}`,options:t.slice(0,n.options),placeholder:{text:`Choose an option`,type:`plain_text`},type:`static_select`}}function _(e){let t=(e.options??[]).map(e=>({text:{text:v(e.label,n.optionText),type:`plain_text`},value:v(e.id,n.optionValue)}));return t.length>n.radioOptions?g(e):{action_id:`${r}${e.requestId}`,options:t,type:`radio_buttons`}}function v(e,t){return e.length>t?e.slice(0,t):e}function y(e){let t={};for(let[n,r]of Object.entries(e))r!==void 0&&(t[n]=r);return t}var b=` `,x=/\{\{emoji:([a-zA-Z0-9_+-]+)\}\}/g;function S(e,t={}){let r=[],i={convertEmoji:t.convertEmoji??E,maxBlocks:t.maxBlocks??n.blocks,usedTable:!1};e.title&&r.push({text:U(e.title,i.convertEmoji,n.headerText),type:`header`}),e.subtitle&&r.push({elements:[H(e.subtitle,i.convertEmoji,n.textObject)],type:`context`}),e.imageUrl&&r.push({alt_text:K(i.convertEmoji(e.title||`Card image`),n.imageAlt),image_url:K(e.imageUrl,n.imageUrl),type:`image`});for(let t of e.children)r.push(...D(t,i));return r.slice(0,i.maxBlocks)}var C=S;function w(e,t={}){let n=t.convertEmoji??E,r=[];e.title&&r.push(`*${n(e.title)}*`),e.subtitle&&r.push(n(e.subtitle));for(let t of e.children){let e=V(t,n);e&&r.push(e)}return r.join(`
1
+ import{d as e}from"../../_chunks/node/chunk-AYN7QRWH-B__hKQV7.js";var t=class extends Error{constructor(e){super(e),this.name=`SlackBlockError`}},n={actionId:255,actionsElements:25,blockId:255,blocks:50,buttonText:75,buttonUrl:3e3,buttonValue:2e3,fields:10,fieldText:2e3,headerText:150,imageAlt:2e3,imageUrl:3e3,optionDescription:75,optionText:75,optionValue:150,options:100,placeholder:150,radioOptions:10,sectionText:3e3,tableColumns:20,tableRows:100,textObject:3e3},r=`input:`,i=`input-freeform:`,a=`input-freeform-submit`,o=`input-freeform-block`,s=`input-freeform-text`,c=/^(?<requestId>.+):button:\d+$/u;function l(e){let t={text:{text:v(e.prompt,n.sectionText),type:`mrkdwn`},type:`section`},r=e.options??[];if(r.length===0)return[t,{elements:[m(e.requestId)],type:`actions`}];let i=e.allowFreeform?[m(e.requestId)]:[];if(e.display===`radio`)return[t,{elements:[_(e),...i],type:`actions`}];if(e.display===`select`)return[t,{elements:[g(e),...i],type:`actions`}];let a=i.length>0?n.actionsElements-1:n.actionsElements;return[t,{elements:r.slice(0,a).map((t,n)=>h(e.requestId,t,n)).concat(i),type:`actions`}]}function u(e){if(!e.actionId.startsWith(`input:`))return null;let t=e.actionId.slice(r.length);if(e.selectedOptionValue!==void 0)return t?{optionId:e.selectedOptionValue,requestId:t}:null;let n=c.exec(t)?.groups?.requestId;return n&&e.value!==void 0?{optionId:e.value,requestId:n}:null}function d(e){let t=v(e.title??e.prompt??`Your answer`,24),r=[];return e.prompt&&r.push({text:{text:v(e.prompt,n.sectionText),type:`mrkdwn`},type:`section`}),r.push({block_id:o,element:{action_id:s,multiline:!0,type:`plain_text_input`},label:{text:`Answer`,type:`plain_text`},type:`input`}),{blocks:r,callback_id:a,close:{text:`Cancel`,type:`plain_text`},private_metadata:typeof e.metadata==`string`?e.metadata:JSON.stringify(e.metadata),submit:{text:`Submit`,type:`plain_text`},title:{text:t,type:`plain_text`},type:`modal`}}function f(e){return e.find(e=>e.blockId===`input-freeform-block`&&e.actionId===`input-freeform-text`)?.value}function p(e){let t=[];return e.promptBlock&&typeof e.promptBlock==`object`&&t.push(e.promptBlock),t.push({text:{text:`:white_check_mark: *${e.answer}*`,type:`mrkdwn`},type:`section`}),e.userId&&t.push({elements:[{text:`Answered by <@${e.userId}>`,type:`mrkdwn`}],type:`context`}),t}function m(e){return{action_id:`${i}${e}`,style:`primary`,text:{text:`Type your answer`,type:`plain_text`},type:`button`,value:e}}function h(e,t,i){return y({action_id:`${r}${e}:button:${i}`,style:t.style===`primary`||t.style===`danger`?t.style:void 0,text:{text:v(t.label,n.buttonText),type:`plain_text`},type:`button`,value:v(t.id,n.buttonValue)})}function g(e){let t=(e.options??[]).map(e=>({text:{text:v(e.label,n.optionText),type:`plain_text`},value:v(e.id,n.optionValue)}));return{action_id:`${r}${e.requestId}`,options:t.slice(0,n.options),placeholder:{text:`Choose an option`,type:`plain_text`},type:`static_select`}}function _(e){let t=(e.options??[]).map(e=>({text:{text:v(e.label,n.optionText),type:`plain_text`},value:v(e.id,n.optionValue)}));return t.length>n.radioOptions?g(e):{action_id:`${r}${e.requestId}`,options:t,type:`radio_buttons`}}function v(e,t){return e.length>t?e.slice(0,t):e}function y(e){let t={};for(let[n,r]of Object.entries(e))r!==void 0&&(t[n]=r);return t}var b=` `,x=/\{\{emoji:([a-zA-Z0-9_+-]+)\}\}/g;function S(e,t={}){let r=[],i={convertEmoji:t.convertEmoji??E,maxBlocks:t.maxBlocks??n.blocks,usedTable:!1};e.title&&r.push({text:U(e.title,i.convertEmoji,n.headerText),type:`header`}),e.subtitle&&r.push({elements:[H(e.subtitle,i.convertEmoji,n.textObject)],type:`context`}),e.imageUrl&&r.push({alt_text:K(i.convertEmoji(e.title||`Card image`),n.imageAlt),image_url:K(e.imageUrl,n.imageUrl),type:`image`});for(let t of e.children)r.push(...D(t,i));return r.slice(0,i.maxBlocks)}var C=S;function w(e,t={}){let n=t.convertEmoji??E,r=[];e.title&&r.push(`*${n(e.title)}*`),e.subtitle&&r.push(n(e.subtitle));for(let t of e.children){let e=V(t,n);e&&r.push(e)}return r.join(`
2
2
  `)}var T=w;function E(e){return e.replace(x,`:$1:`)}function D(e,t){switch(e.type){case`actions`:return[j(e,t.convertEmoji)];case`divider`:return[{type:`divider`}];case`fields`:return[z(e,t.convertEmoji)];case`image`:return[k(e,t.convertEmoji)];case`link`:return[A(e,t.convertEmoji)];case`section`:return e.children.flatMap(e=>D(e,t));case`table`:return B(e,t);case`text`:return[O(e,t.convertEmoji)];default:return J(e)}}function O(t,r){let i=e(r(t.content));return t.style===`muted`?{elements:[H(i,e=>e,n.textObject)],type:`context`}:{text:H(t.style===`bold`?`*${i}*`:i,e=>e,n.sectionText),type:`section`}}function k(e,t){return{alt_text:K(t(e.alt||`Image`),n.imageAlt),image_url:K(e.url,n.imageUrl),type:`image`}}function A(e,t){return{text:H(`<${e.url}|${t(e.label)}>`,e=>e,n.sectionText),type:`section`}}function j(e,t){return{elements:e.children.slice(0,n.actionsElements).map(e=>M(e,t)),type:`actions`}}function M(e,t){switch(e.type){case`button`:return N(e,t);case`link-button`:return P(e,t);case`radio_select`:return I(e,t);case`select`:return F(e,t);default:return J(e)}}function N(e,t){return Y({action_id:K(e.id,n.actionId),style:G(e.style),text:U(e.label,t,n.buttonText),type:`button`,value:e.value===void 0?void 0:K(e.value,n.buttonValue)})}function P(e,t){return Y({action_id:K(e.id??`link-${e.url}`,n.actionId),style:G(e.style),text:U(e.label,t,n.buttonText),type:`button`,url:K(e.url,n.buttonUrl)})}function F(e,t){let r=e.options.slice(0,n.options).map(e=>R(e,t,`plain_text`));return Y({action_id:K(e.id,n.actionId),initial_option:L(r,e.initialOption),options:r,placeholder:e.placeholder?U(e.placeholder,t,n.placeholder):void 0,type:`static_select`})}function I(e,t){let r=e.options.slice(0,n.radioOptions).map(e=>R(e,t,`mrkdwn`));return Y({action_id:K(e.id,n.actionId),initial_option:L(r,e.initialOption),options:r,type:`radio_buttons`})}function L(e,t){if(t===void 0)return;let r=K(t,n.optionValue);return e.find(e=>e.value===r)}function R(e,t,r){return Y({description:e.description?{text:K(t(e.description),n.optionDescription),type:r}:void 0,text:{text:K(t(e.label),n.optionText),type:r},value:K(e.value,n.optionValue)})}function z(t,r){return{fields:t.children.slice(0,n.fields).map(t=>H(`*${e(r(t.label))}*
3
3
  ${e(r(t.value))}`,e=>e,n.fieldText)),type:`section`}}function B(e,t){return t.usedTable||e.rows.length+1>n.tableRows||e.headers.length>n.tableColumns?[{text:H(`\`\`\`
4
4
  ${X(e)}
@@ -0,0 +1,33 @@
1
+ interface SlackPlainTextObject {
2
+ emoji?: boolean;
3
+ text: string;
4
+ type: "plain_text";
5
+ }
6
+ interface SlackMrkdwnTextObject {
7
+ text: string;
8
+ type: "mrkdwn";
9
+ verbatim?: boolean;
10
+ }
11
+ type SlackTextObject = SlackMrkdwnTextObject | SlackPlainTextObject;
12
+ interface SlackTextOptions {
13
+ emoji?: boolean;
14
+ verbatim?: boolean;
15
+ }
16
+ interface SlackDateOptions {
17
+ link?: string;
18
+ }
19
+ declare function escapeSlackText(text: string): string;
20
+ declare function unescapeSlackText(text: string): string;
21
+ declare function createSlackPlainText(text: string, options?: SlackTextOptions): SlackPlainTextObject;
22
+ declare function createSlackMrkdwn(text: string, options?: SlackTextOptions): SlackMrkdwnTextObject;
23
+ declare function formatSlackUser(userId: string): string;
24
+ declare function formatSlackChannel(channelId: string): string;
25
+ declare function formatSlackUserGroup(userGroupId: string): string;
26
+ declare function formatSlackSpecialMention(mention: "channel" | "everyone" | "here"): string;
27
+ declare function formatSlackLink(url: string, label?: string): string;
28
+ declare function formatSlackDate(timestamp: Date | number, token: string, fallback: string, options?: SlackDateOptions): string;
29
+ declare function slackMrkdwnToMarkdown(mrkdwn: string): string;
30
+ declare function markdownBoldToSlackMrkdwn(markdown: string): string;
31
+ declare function linkBareSlackMentions(text: string): string;
32
+
33
+ export { type SlackDateOptions, type SlackMrkdwnTextObject, type SlackPlainTextObject, type SlackTextObject, type SlackTextOptions, createSlackMrkdwn, createSlackPlainText, escapeSlackText, formatSlackChannel, formatSlackDate, formatSlackLink, formatSlackSpecialMention, formatSlackUser, formatSlackUserGroup, linkBareSlackMentions, markdownBoldToSlackMrkdwn, slackMrkdwnToMarkdown, unescapeSlackText };
@@ -0,0 +1 @@
1
+ import{a as e,c as t,d as n,f as r,i,l as a,n as o,o as s,p as c,r as l,s as u,t as d,u as f}from"../../_chunks/node/chunk-AYN7QRWH-B__hKQV7.js";export{d as createSlackMrkdwn,o as createSlackPlainText,l as escapeSlackText,i as formatSlackChannel,e as formatSlackDate,s as formatSlackLink,u as formatSlackSpecialMention,t as formatSlackUser,a as formatSlackUserGroup,f as linkBareSlackMentions,n as markdownBoldToSlackMrkdwn,r as slackMrkdwnToMarkdown,c as unescapeSlackText};