eve 0.17.0 → 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 (117) hide show
  1. package/CHANGELOG.md +22 -0
  2. package/dist/src/channel/types.d.ts +11 -0
  3. package/dist/src/chunks/{use-eve-agent-BEOUv37s.js → use-eve-agent-Bh1NmXO9.js} +8 -5
  4. package/dist/src/chunks/{use-eve-agent-C25KOe9i.js → use-eve-agent-Dvy_Wjvq.js} +8 -5
  5. package/dist/src/cli/dev/tui/status-line.d.ts +1 -1
  6. package/dist/src/cli/dev/tui/tui.d.ts +2 -0
  7. package/dist/src/cli/dev/tui/tui.js +1 -1
  8. package/dist/src/cli/dev/url-target.d.ts +14 -0
  9. package/dist/src/cli/dev/url-target.js +1 -0
  10. package/dist/src/cli/run.js +3 -3
  11. package/dist/src/client/client.js +1 -1
  12. package/dist/src/compiled/.vendor-stamp.json +4 -4
  13. package/dist/src/compiled/@chat-adapter/slack/api.d.ts +132 -0
  14. package/dist/src/compiled/@chat-adapter/slack/api.js +1 -0
  15. package/dist/src/compiled/@chat-adapter/slack/blocks.js +1 -1
  16. package/dist/src/compiled/@chat-adapter/slack/format.d.ts +33 -0
  17. package/dist/src/compiled/@chat-adapter/slack/format.js +1 -0
  18. package/dist/src/compiled/@chat-adapter/slack/index.js +28 -28
  19. package/dist/src/compiled/@chat-adapter/slack/types-AntsVifS.d.ts +187 -0
  20. package/dist/src/compiled/@chat-adapter/slack/webhook.d.ts +10 -0
  21. package/dist/src/compiled/@chat-adapter/slack/webhook.js +1 -0
  22. package/dist/src/compiled/@workflow/core/classify-error.d.ts +15 -0
  23. package/dist/src/compiled/@workflow/core/index.js +2 -2
  24. package/dist/src/compiled/@workflow/core/runtime.js +27 -27
  25. package/dist/src/compiled/@workflow/core/serialization.d.ts +12 -3
  26. package/dist/src/compiled/@workflow/core/step/context-storage.d.ts +10 -0
  27. package/dist/src/compiled/@workflow/core/version.d.ts +1 -1
  28. package/dist/src/compiled/@workflow/core/workflow.js +1 -1
  29. package/dist/src/compiled/_chunks/node/chunk-AYN7QRWH-B__hKQV7.js +1 -0
  30. package/dist/src/compiled/_chunks/node/chunk-HFKBBKCJ-CWaVIQuL.js +1 -0
  31. package/dist/src/compiled/_chunks/workflow/{attribute-changes-DUxG-Gic.js → attribute-changes-zAifvEhb.js} +1 -1
  32. package/dist/src/compiled/_chunks/workflow/{resume-hook-CUCPW67D.js → resume-hook-C15uJ2ik.js} +1 -1
  33. package/dist/src/compiled/_chunks/workflow/run-BJUPZ0Ni.js +1 -0
  34. package/dist/src/compiled/_chunks/workflow/{sleep-Dxuzj5to.js → sleep-C8B-TYir.js} +1 -1
  35. package/dist/src/compiler/manifest.d.ts +2 -2
  36. package/dist/src/compiler/manifest.js +1 -1
  37. package/dist/src/compiler/normalize-agent-config.js +1 -1
  38. package/dist/src/context/keys.d.ts +2 -0
  39. package/dist/src/context/keys.js +1 -1
  40. package/dist/src/evals/assertions/run.js +2 -2
  41. package/dist/src/execution/create-session-step.d.ts +2 -0
  42. package/dist/src/execution/create-session-step.js +1 -1
  43. package/dist/src/execution/dispatch-runtime-actions-step.js +1 -1
  44. package/dist/src/execution/durable-session-store.d.ts +3 -0
  45. package/dist/src/execution/remote-agent-dispatch.js +1 -1
  46. package/dist/src/execution/runtime-context.js +1 -1
  47. package/dist/src/execution/session.d.ts +6 -1
  48. package/dist/src/execution/session.js +3 -3
  49. package/dist/src/execution/subagent-invocation.d.ts +20 -5
  50. package/dist/src/execution/subagent-invocation.js +2 -2
  51. package/dist/src/execution/subagent-tool.d.ts +7 -0
  52. package/dist/src/execution/subagent-tool.js +1 -1
  53. package/dist/src/execution/workflow-entry.js +1 -1
  54. package/dist/src/harness/advertised-tools.d.ts +33 -0
  55. package/dist/src/harness/advertised-tools.js +1 -0
  56. package/dist/src/harness/subagent-depth.d.ts +17 -0
  57. package/dist/src/harness/subagent-depth.js +1 -0
  58. package/dist/src/harness/tool-loop.js +1 -1
  59. package/dist/src/harness/turn-tag-state.d.ts +30 -22
  60. package/dist/src/harness/turn-tag-state.js +1 -1
  61. package/dist/src/harness/types.d.ts +28 -0
  62. package/dist/src/harness/workflow-continuation-security.d.ts +1 -0
  63. package/dist/src/harness/workflow-continuation-security.js +1 -1
  64. package/dist/src/internal/application/package.js +1 -1
  65. package/dist/src/internal/authored-definition/core.js +1 -1
  66. package/dist/src/internal/http/basic-auth.d.ts +1 -0
  67. package/dist/src/internal/http/basic-auth.js +1 -0
  68. package/dist/src/internal/nitro/host/configure-nitro-routes.js +2 -2
  69. package/dist/src/internal/nitro/routes/channel-dispatch.js +1 -1
  70. package/dist/src/internal/nitro/routes/channel-route-context.d.ts +5 -0
  71. package/dist/src/internal/nitro/routes/channel-route-context.js +1 -0
  72. package/dist/src/internal/nitro/routes/info.d.ts +2 -6
  73. package/dist/src/internal/nitro/routes/info.js +1 -1
  74. package/dist/src/protocol/routes.d.ts +2 -4
  75. package/dist/src/public/channels/eve.d.ts +5 -4
  76. package/dist/src/public/channels/eve.js +1 -1
  77. package/dist/src/public/channels/slack/api.d.ts +3 -6
  78. package/dist/src/public/channels/slack/api.js +1 -1
  79. package/dist/src/public/channels/slack/inbound.d.ts +11 -9
  80. package/dist/src/public/channels/slack/inbound.js +1 -1
  81. package/dist/src/public/channels/slack/interactions.d.ts +2 -1
  82. package/dist/src/public/channels/slack/interactions.js +1 -1
  83. package/dist/src/public/channels/slack/mrkdwn.d.ts +3 -35
  84. package/dist/src/public/channels/slack/mrkdwn.js +1 -1
  85. package/dist/src/public/channels/slack/slackChannel.js +1 -1
  86. package/dist/src/public/channels/slack/verify.d.ts +4 -42
  87. package/dist/src/public/channels/slack/verify.js +1 -1
  88. package/dist/src/public/definitions/agent.d.ts +1 -1
  89. package/dist/src/public/index.d.ts +1 -1
  90. package/dist/src/runtime/resolve-agent.js +1 -1
  91. package/dist/src/services/dev-client/client-options.d.ts +5 -1
  92. package/dist/src/services/dev-client/client-options.js +1 -1
  93. package/dist/src/setup/boxes/preflight.js +1 -1
  94. package/dist/src/setup/boxes/select-model.js +1 -1
  95. package/dist/src/setup/flows/model.js +1 -1
  96. package/dist/src/setup/scaffold/create/project.d.ts +1 -1
  97. package/dist/src/setup/scaffold/create/project.js +1 -1
  98. package/dist/src/setup/scaffold/create/web-template.d.ts +3 -0
  99. package/dist/src/setup/scaffold/create/web-template.js +1 -1
  100. package/dist/src/shared/agent-definition.d.ts +37 -0
  101. package/dist/src/shared/default-agent-model.d.ts +1 -1
  102. package/dist/src/shared/default-agent-model.js +1 -1
  103. package/dist/src/svelte/index.js +1 -1
  104. package/dist/src/svelte/use-eve-agent.js +1 -1
  105. package/dist/src/vue/index.js +1 -1
  106. package/dist/src/vue/use-eve-agent.js +1 -1
  107. package/docs/agent-config.md +35 -8
  108. package/docs/channels/eve.mdx +3 -2
  109. package/docs/concepts/sessions-runs-and-streaming.md +2 -2
  110. package/docs/getting-started.mdx +5 -5
  111. package/docs/guides/dev-tui.md +7 -1
  112. package/docs/reference/cli.md +10 -1
  113. package/docs/reference/typescript-api.md +1 -1
  114. package/docs/subagents.mdx +19 -0
  115. package/package.json +5 -5
  116. package/dist/src/compiled/_chunks/node/chunk-AYN7QRWH-Csu8sG38.js +0 -1
  117. package/dist/src/compiled/_chunks/workflow/run-CVlF84yI.js +0 -1
package/CHANGELOG.md CHANGED
@@ -1,5 +1,27 @@
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
+
17
+ ## 0.17.1
18
+
19
+ ### Patch Changes
20
+
21
+ - 97aa99b: Add HTTP Basic userinfo and repeatable `-H, --header` support to `eve dev` URL targets so the terminal UI can send credentials or routing headers to protected remote deployments.
22
+ - c7827fb: Stop injecting subagent tool descriptions into delegated child prompts. Child runs now receive only the caller's delegated message plus the stable subagent invocation wrapper.
23
+ - 739af96: Update eve's bundled Workflow SDK dependency set to the latest 5.0.0 beta releases, keeping the core package and local workflow world aligned.
24
+
3
25
  ## 0.17.0
4
26
 
5
27
  ### Minor 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
  /**
@@ -32,6 +32,14 @@ var AgentInfoResponseError = class extends Error {
32
32
  }
33
33
  };
34
34
 
35
+ //#endregion
36
+ //#region src/internal/http/basic-auth.ts
37
+ function encodeBasicCredentials(username, password) {
38
+ const bytes = new TextEncoder().encode(`${username}:${password}`);
39
+ const binaryString = Array.from(bytes, (byte) => String.fromCodePoint(byte)).join("");
40
+ return btoa(binaryString);
41
+ }
42
+
35
43
  //#endregion
36
44
  //#region src/client/agent-info-schema.ts
37
45
  const source = z.object({
@@ -819,11 +827,6 @@ function withRedirectPolicy(init, redirect) {
819
827
  redirect
820
828
  };
821
829
  }
822
- function encodeBasicCredentials(username, password) {
823
- const bytes = new TextEncoder().encode(`${username}:${password}`);
824
- const binaryString = Array.from(bytes, (byte) => String.fromCodePoint(byte)).join("");
825
- return btoa(binaryString);
826
- }
827
830
 
828
831
  //#endregion
829
832
  //#region src/shared/errors.ts
@@ -32,6 +32,14 @@ var AgentInfoResponseError = class extends Error {
32
32
  }
33
33
  };
34
34
 
35
+ //#endregion
36
+ //#region src/internal/http/basic-auth.ts
37
+ function encodeBasicCredentials(username, password) {
38
+ const bytes = new TextEncoder().encode(`${username}:${password}`);
39
+ const binaryString = Array.from(bytes, (byte) => String.fromCodePoint(byte)).join("");
40
+ return btoa(binaryString);
41
+ }
42
+
35
43
  //#endregion
36
44
  //#region src/client/agent-info-schema.ts
37
45
  const source = z.object({
@@ -819,11 +827,6 @@ function withRedirectPolicy(init, redirect) {
819
827
  redirect
820
828
  };
821
829
  }
822
- function encodeBasicCredentials(username, password) {
823
- const bytes = new TextEncoder().encode(`${username}:${password}`);
824
- const binaryString = Array.from(bytes, (byte) => String.fromCodePoint(byte)).join("");
825
- return btoa(binaryString);
826
- }
827
830
 
828
831
  //#endregion
829
832
  //#region src/shared/errors.ts
@@ -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;
@@ -5,6 +5,8 @@ export type { DevelopmentTuiTarget } from "./target.js";
5
5
  export interface RunDevelopmentTuiInput extends TuiDisplayOptions {
6
6
  /** The local server or remote URL used by this TUI session. */
7
7
  readonly target: DevelopmentTuiTarget;
8
+ /** Additional request headers sent by this TUI client. */
9
+ readonly headers?: Readonly<Record<string, string>>;
8
10
  /**
9
11
  * Text to seed the prompt input with after the UI launches. A bare local
10
12
  * `/model` starts fresh-agent onboarding. Applies to the first prompt only.
@@ -1 +1 @@
1
- import{promptCommandsFor}from"./prompt-commands.js";import{probeMcpConnection}from"./mcp-connection-status.js";import{createPromptCommandHandler}from"./prompt-command-handler.js";import{formatRemoteAuthChallengeMessage}from"./remote-auth-result.js";import{remoteHost}from"./target.js";import{EveTUIRunner}from"./runner.js";import{Client}from"#client/index.js";import{toErrorMessage}from"#shared/errors.js";import{resolveDevelopmentOidcToken,resolveLinkedDevelopmentOidcToken}from"#services/dev-client/request-headers.js";import{isVercelAuthChallenge}from"#services/dev-client/vercel-auth-error.js";import{resolveVercelDeployment}from"#setup/vercel-deployment.js";import{resolveLocalDevelopmentClientOptions,resolveRemoteDevelopmentClientOptions}from"#services/dev-client/client-options.js";import{createDevelopmentCredentialGate}from"#services/dev-client/credential-gate.js";function prepareRemoteTarget(e){return{target:e,credentials:createDevelopmentCredentialGate(e.serverUrl),resolveOidcToken:resolveDevelopmentOidcToken,resolveDeployment:t=>resolveVercelDeployment({workspaceRoot:e.workspaceRoot,host:remoteHost(e),signal:t})}}function prepareDevelopmentTarget(e){return e.kind===`local`?{kind:`local`,target:e}:{kind:`remote`,target:e,remote:prepareRemoteTarget(e)}}async function runDevelopmentTui(n){let{target:r,initialInput:i,onBootProgress:a,...o}=n,s=prepareDevelopmentTarget(r),{serverUrl:c}=r,l=new Client(s.kind===`local`?resolveLocalDevelopmentClientOptions({serverUrl:c,token:()=>resolveLinkedDevelopmentOidcToken(s.target.workspaceRoot)}):resolveRemoteDevelopmentClientOptions({serverUrl:c,credentials:s.remote.credentials})),u={...o,session:l.session(),client:l,serverUrl:c,promptCommandHandler:createPromptCommandHandler({target:r}),availablePromptCommands:promptCommandsFor(r.kind),formatTransportError:e=>isVercelAuthChallenge(e)?formatRemoteAuthChallengeMessage(c):toErrorMessage(e)};s.kind===`local`?(u.appRoot=s.target.workspaceRoot,u.probeMcpConnection=probeMcpConnection):u.remote=s.remote,i!==void 0&&(u.initialInput=i),a!==void 0&&(u.onBootProgress=a),await new EveTUIRunner(u).run()}export{runDevelopmentTui};
1
+ import{promptCommandsFor}from"./prompt-commands.js";import{probeMcpConnection}from"./mcp-connection-status.js";import{createPromptCommandHandler}from"./prompt-command-handler.js";import{formatRemoteAuthChallengeMessage}from"./remote-auth-result.js";import{remoteHost}from"./target.js";import{EveTUIRunner}from"./runner.js";import{Client}from"#client/index.js";import{toErrorMessage}from"#shared/errors.js";import{resolveDevelopmentOidcToken,resolveLinkedDevelopmentOidcToken}from"#services/dev-client/request-headers.js";import{isVercelAuthChallenge}from"#services/dev-client/vercel-auth-error.js";import{resolveVercelDeployment}from"#setup/vercel-deployment.js";import{resolveLocalDevelopmentClientOptions,resolveRemoteDevelopmentClientOptions}from"#services/dev-client/client-options.js";import{createDevelopmentCredentialGate}from"#services/dev-client/credential-gate.js";function prepareRemoteTarget(e){return{target:e,credentials:createDevelopmentCredentialGate(e.serverUrl),resolveOidcToken:resolveDevelopmentOidcToken,resolveDeployment:t=>resolveVercelDeployment({workspaceRoot:e.workspaceRoot,host:remoteHost(e),signal:t})}}function prepareDevelopmentTarget(e){return e.kind===`local`?{kind:`local`,target:e}:{kind:`remote`,target:e,remote:prepareRemoteTarget(e)}}async function runDevelopmentTui(n){let{target:r,headers:i,initialInput:a,onBootProgress:o,...s}=n,c=prepareDevelopmentTarget(r),{serverUrl:l}=r,u=i===void 0?{}:{headers:i},d=new Client(c.kind===`local`?resolveLocalDevelopmentClientOptions({...u,serverUrl:l,token:()=>resolveLinkedDevelopmentOidcToken(c.target.workspaceRoot)}):resolveRemoteDevelopmentClientOptions({...u,serverUrl:l,credentials:c.remote.credentials})),f={...s,session:d.session(),client:d,serverUrl:l,promptCommandHandler:createPromptCommandHandler({target:r}),availablePromptCommands:promptCommandsFor(r.kind),formatTransportError:e=>isVercelAuthChallenge(e)?formatRemoteAuthChallengeMessage(l):toErrorMessage(e)};c.kind===`local`?(f.appRoot=c.target.workspaceRoot,f.probeMcpConnection=probeMcpConnection):f.remote=c.remote,a!==void 0&&(f.initialInput=a),o!==void 0&&(f.onBootProgress=o),await new EveTUIRunner(f).run()}export{runDevelopmentTui};
@@ -0,0 +1,14 @@
1
+ export type DevelopmentRequestHeaders = Readonly<Record<string, string>>;
2
+ export interface DevelopmentUrlTargetOptions {
3
+ header?: DevelopmentRequestHeaders;
4
+ host?: string;
5
+ port?: number;
6
+ ui?: boolean;
7
+ url?: string;
8
+ }
9
+ export interface DevelopmentUrlTarget {
10
+ readonly headers?: DevelopmentRequestHeaders;
11
+ readonly serverUrl: string;
12
+ }
13
+ export declare function parseDevelopmentHeaderOption(value: string, previous?: DevelopmentRequestHeaders): DevelopmentRequestHeaders;
14
+ export declare function resolveDevelopmentUrlTarget(options: DevelopmentUrlTargetOptions, positionalUrl: string | undefined): DevelopmentUrlTarget | undefined;
@@ -0,0 +1 @@
1
+ import{InvalidArgumentError}from"#compiled/commander/index.js";import{encodeBasicCredentials}from"#internal/http/basic-auth.js";function parseDevelopmentHeaderOption(t,n={}){let r=t.indexOf(`:`);if(r<1)throw new InvalidArgumentError(`Expected header in "Name: value" format, received "${t}".`);let i=t.slice(0,r).trim(),a=t.slice(r+1).trim();try{new Headers([[i,a]])}catch{throw new InvalidArgumentError(`Expected a valid HTTP header, received "${t}".`)}return mergeDevelopmentHeaders(n,{[i]:a})??{}}function resolveDevelopmentUrlTarget(t,n){if(t.url!==void 0&&n!==void 0)throw new InvalidArgumentError(`Pass either --url or a bare URL, not both.`);let r=t.url??n;if(r===void 0){if(t.header!==void 0)throw new InvalidArgumentError(`The --header option can only be used with --url or a bare URL.`);return}if(t.host!==void 0)throw new InvalidArgumentError(`The --host option cannot be used with --url.`);if(t.port!==void 0)throw new InvalidArgumentError(`The --port option cannot be used with --url.`);if(t.ui===!1)throw new InvalidArgumentError(`The --no-ui option cannot be used with --url.`);let i=URL.parse(r);if(i===null)throw new InvalidArgumentError(`Expected an absolute http(s) URL, received "${r}".`);let a=mergeDevelopmentHeaders(extractDevelopmentUrlHeaders(i),t.header),o=i.toString();return a===void 0?{serverUrl:o}:{headers:a,serverUrl:o}}function mergeDevelopmentHeaders(e,t){if(e===void 0)return t;if(t===void 0)return e;let n={},r=new Set(Object.keys(t).map(e=>e.toLowerCase()));for(let[t,i]of Object.entries(e))r.has(t.toLowerCase())||(n[t]=i);for(let[e,r]of Object.entries(t))n[e]=r;return n}function extractDevelopmentUrlHeaders(e){if(e.username===``&&e.password===``)return;let n=decodeUrlUserInfo(e.username,`username`),r=decodeUrlUserInfo(e.password,`password`);return e.username=``,e.password=``,{Authorization:`Basic ${encodeBasicCredentials(n,r)}`}}function decodeUrlUserInfo(t,n){try{return decodeURIComponent(t)}catch{throw new InvalidArgumentError(`Expected a valid URL-encoded ${n} in URL userinfo.`)}}export{parseDevelopmentHeaderOption,resolveDevelopmentUrlTarget};
@@ -1,3 +1,3 @@
1
- import{createLogger}from"#internal/logging.js";import{resolveInstalledPackageInfo}from"#internal/application/package.js";import{createCliTheme,renderCliTaggedLine}from"#cli/ui/output.js";import{isCodingAgentLaunch}from"#cli/agent-detection.js";import{eveCliBanner}from"#cli/banner.js";import{startCliLiveRow}from"#cli/ui/live-row.js";import{devBootPhase}from"#internal/dev-boot-progress.js";import{Command,CommanderError,InvalidArgumentError}from"#compiled/commander/index.js";import{resolveApplicationRoot}from"#internal/application/paths.js";import{registerProjectCommands}from"#cli/commands/register-project-commands.js";import{resolveDevUiMode,resolveTuiDisplayOptions}from"#cli/dev/ui-options.js";import{LOG_DISPLAY_MODES,parseLogDisplayMode}from"#cli/dev/tui/log-display-mode.js";import{resolveTuiTitle}from"#cli/dev/tui/target.js";import{parseDevelopmentServerUrl}from"#cli/dev/url.js";const devBootLog=createLogger(`dev.boot`);function createDevBootProgressReporter(e){return t=>{switch(t.type){case`phase-started`:e?.update(`Building your agent`,t.phase),devBootLog.debug(t.phase);return;case`phase-finished`:devBootLog.debug(`${t.phase} finished`,{ms:t.elapsedMs});return;case`before-first-paint`:e?.stop();return;default:return t}}}async function loadBuildHost(){return(await import(`#internal/nitro/host.js`)).buildApplication}async function loadPrintApplicationInfo(){return(await import(`#cli/commands/info.js`)).printApplicationInfo}async function loadRunDevelopmentTui(){return(await import(`#cli/dev/tui/tui.js`)).runDevelopmentTui}async function loadRunEvalCommand(){return(await import(`#evals/cli/eval.js`)).runEvalCommand}async function loadStartHost(){return(await import(`#internal/nitro/host.js`)).createDevelopmentServer}const loadIsActiveDevelopmentServerForApp=async()=>(await import(`#internal/nitro/host.js`)).isActiveDevelopmentServerForApp;async function loadStartProductionHost(){return(await import(`#internal/nitro/host.js`)).startProductionServer}function shouldPrintCliBootBanner(e){return e.name()===`info`||e.name()===`dev`||e.name()===`init`}async function waitForShutdownSignal(e){await new Promise((t,n)=>{let r=!1,cleanup=()=>{process.off(`SIGINT`,handleSignal),process.off(`SIGTERM`,handleSignal)},handleSignal=()=>{r||(r=!0,cleanup(),e.close().then(t,n))};process.once(`SIGINT`,handleSignal),process.once(`SIGTERM`,handleSignal)})}async function waitForProductionServer(e){await Promise.race([e.wait(),waitForShutdownSignal({close:()=>e.close()})])}function parsePortOption(e){if(!/^-?\d+$/.test(e))throw new InvalidArgumentError(`Expected a numeric port, received "${e}".`);let t=Number(e);if(t<0||t>65535)throw new InvalidArgumentError(`Expected a port between 0 and 65535, received "${e}".`);return t}const DISPLAY_MODES=new Set([`full`,`collapsed`,`auto-collapsed`,`hidden`]),STATS_MODES=new Set([`tokens`,`tokensPerSecond`]);function parseDisplayMode(e){if(!DISPLAY_MODES.has(e))throw new InvalidArgumentError(`Expected one of ${[...DISPLAY_MODES].join(`, `)}, received "${e}".`);return e}function parseStatsMode(e){if(!STATS_MODES.has(e))throw new InvalidArgumentError(`Expected one of ${[...STATS_MODES].join(`, `)}, received "${e}".`);return e}function parseLogsMode(e){let t=parseLogDisplayMode(e);if(t===void 0)throw new InvalidArgumentError(`Expected one of ${LOG_DISPLAY_MODES.join(`, `)}, received "${e}".`);return t}function parseContextSizeOption(e){let t=Number(e);if(!Number.isFinite(t)||t<=0)throw new InvalidArgumentError(`Expected a positive number, received "${e}".`);return t}function hasInteractiveTerminal(){return!!(process.stdin.isTTY&&process.stdout.isTTY)}function rewriteDevelopmentUrlShorthand(e){let t=e[1];return e[0]!==`dev`||e.length!==2||t===void 0||t.startsWith(`-`)?[...e]:[`dev`,`--url`,t]}function resolveRemoteDevelopmentServerUrl(e){if(e.url){if(e.host!==void 0)throw new InvalidArgumentError(`The --host option cannot be used with --url.`);if(e.port!==void 0)throw new InvalidArgumentError(`The --port option cannot be used with --url.`);if(e.ui===!1)throw new InvalidArgumentError(`The --no-ui option cannot be used with --url.`);return e.url}}function createCliProgram(e,i){let c=resolveApplicationRoot(),f=resolveInstalledPackageInfo().version,p=new Command,h=createCliTheme();p.name(`eve`).description(`Build and run an eve application.`).version(f).showHelpAfterError().exitOverride().hook(`preAction`,(t,n)=>{shouldPrintCliBootBanner(n)&&e.log(eveCliBanner())}).configureOutput({writeErr:t=>{e.error(t.trimEnd())},writeOut:t=>{e.log(t.trimEnd())}});let g=p.command(`channels`).description(`Manage user-authored channels in the current project.`);return g.command(`add [kind]`).description(`Add channels interactively, or scaffold a channel kind (slack | web).`).option(`-f, --force`,`Overwrite existing channel files`).option(`-y, --yes`,`Assume yes for confirmations; requires an explicit channel kind`).action(async(t,n)=>{let{runChannelsAddCommand:r}=await import(`#cli/commands/channels.js`);await r(e,c,{kind:t,options:n})}),g.command(`list`).description(`List user-authored channels in the current project.`).option(`--json`,`Output as JSON`).action(async t=>{let{runChannelsListCommand:n}=await import(`#cli/commands/channels.js`);await n(e,c,t)}),p.command(`init [target]`).description(`Create a new eve agent, or add one to an existing project directory.`).option(`--channel-web-nextjs`,`Add the Web Chat application (Next.js)`).option(`-y, --yes`,`Accepted for compatibility; has no effect`).action(async(t,n)=>{n.yes&&e.error(`warning: --yes has no effect for eve init.`);let{runInitCommand:r}=await import(`#cli/commands/init.js`);await r(e,c,t,{channelWebNextjs:n.channelWebNextjs})}),registerProjectCommands({program:p,logger:e,appRoot:c}),p.command(`build`).description(`Build the current eve application.`).action(async()=>{let{loadDevelopmentEnvironmentFiles:t}=await import(`#cli/dev/environment.js`);t(c);let n=await(i.buildHost??await loadBuildHost())(c);e.log(renderCliTaggedLine(h,{message:`built output at ${n}`,tag:`build`,tone:`success`}))}),p.command(`start`).description(`Start a built eve application.`).option(`--host <host>`,`Host interface to bind`).option(`--port <port>`,`Port to listen on (defaults to $PORT, then 3000)`,parsePortOption).action(async t=>{let{loadDevelopmentEnvironmentFiles:n}=await import(`#cli/dev/environment.js`);n(c);let a=await(i.startProductionHost??await loadStartProductionHost())(c,{host:t.host,port:t.port});e.log(renderCliTaggedLine(h,{message:`server listening at ${a.url}`,tag:`start`,tone:`success`})),await waitForProductionServer(a)}),p.command(`dev`).description(`Start the eve development server or connect to an existing URL.`).option(`--host <host>`,`Host interface to bind`).option(`--port <port>`,`Port to listen on (defaults to $PORT, then 2000)`,parsePortOption).option(`-u, --url <url>`,`Connect to an existing server URL`,parseDevelopmentServerUrl).option(`--no-ui`,`Start the server without an interactive UI`).option(`--name <name>`,`Title shown in the terminal UI (defaults to the app folder name)`).option(`--input <text>`,`Pre-fill the prompt input, or start onboarding with /model`).option(`--tools <mode>`,`How tool calls render: full | collapsed | auto-collapsed | hidden`,parseDisplayMode).option(`--reasoning <mode>`,`How reasoning renders: full | collapsed | auto-collapsed | hidden`,parseDisplayMode).option(`--subagents <mode>`,`How subagent sections render: full | collapsed | auto-collapsed | hidden`,parseDisplayMode).option(`--connection-auth <mode>`,`How connection authorization renders: full | collapsed | auto-collapsed | hidden`,parseDisplayMode).option(`--assistant-response-stats <mode>`,`Assistant header statistic: tokens | tokensPerSecond`,parseStatsMode).option(`--context-size <tokens>`,`Model context window size, shown as a usage percentage`,parseContextSizeOption).option(`--logs <mode>`,`Which server/agent logs to show: all | stderr | sandbox | none`,parseLogsMode).addHelpText(`after`,`
2
- You can also pass a bare URL as the only argument, for example: eve dev https://example.com
3
- `).action(async t=>{let n=resolveRemoteDevelopmentServerUrl(t),a=hasInteractiveTerminal(),s=resolveDevUiMode({options:t,interactive:a});if(t.input!==void 0&&s===`headless`)throw new InvalidArgumentError(`--input requires the interactive UI.`);let u=!1;n!==void 0&&(u=await(i.isActiveDevelopmentServerForApp??await loadIsActiveDevelopmentServerForApp())({appRoot:c,serverUrl:n}));let runInteractiveUi=async(e,r)=>{let a=await devBootPhase(`loading interactive UI`,async()=>i.runDevelopmentTui??await loadRunDevelopmentTui(),r),o=resolveTuiDisplayOptions(t),s=n===void 0||u?{kind:`local`,serverUrl:e.serverUrl,workspaceRoot:e.appRoot??c}:{kind:`remote`,serverUrl:e.serverUrl,workspaceRoot:c},l=resolveTuiTitle({name:t.name,target:s});l!==void 0&&(o.name=l),await a({target:s,initialInput:t.input,onBootProgress:r,...o})};if(n){let{loadDevelopmentEnvironmentFiles:t}=await import(`#cli/dev/environment.js`);if(t(c),e.log(`↗ ${u?`local`:`remote`} mode targeting ${h.info(new URL(n).host)}`),s===`headless`){e.log(renderCliTaggedLine(h,{message:`Interactive UI disabled because the current terminal is not a TTY.`,tag:`dev`,tone:`warning`}));return}e.log(``),await runInteractiveUi({serverUrl:n});return}s===`tui`&&e.log(``);let d=s===`tui`?startCliLiveRow(e):void 0,f=createDevBootProgressReporter(d);d?.update(`Building your agent`);let p=!1,m,closeServer=async()=>{p||m===void 0||(p=!0,await m.close())};try{m=(i.startHost??await loadStartHost())(c,{existing:s===`tui`?`attach-if-unconfigured`:`reject`,host:t.host,onBootProgress:f,port:t.port});let n=await m.start();if(s!==`tui`&&e.log(renderCliTaggedLine(h,{message:`server listening at ${n.url}`,tag:`dev`,tone:`success`})),s===`headless`)return t.ui!==!1&&!a&&e.log(renderCliTaggedLine(h,{message:`Interactive UI disabled because the current terminal is not a TTY.`,tag:`dev`,tone:`warning`})),await waitForShutdownSignal({close:closeServer});await runInteractiveUi({appRoot:n.appRoot,serverUrl:n.url},f)}finally{d?.stop(),await closeServer()}}),p.command(`info`).description(`Print resolved application information.`).option(`--json`,`Output as JSON`).action(async t=>{await(i.printApplicationInfo??await loadPrintApplicationInfo())(e,c,t)}),p.command(`eval`).description(`Run evals against an eve agent.`).argument(`[evalIds...]`,`Eval ids (or directory prefixes) to run (all discovered evals when omitted)`).option(`--url <url>`,`Remote agent URL (skip local host startup)`,parseDevelopmentServerUrl).option(`--tag <tag...>`,`Run only evals carrying a tag`).option(`--strict`,`Fail the exit code when any score falls below its threshold`).option(`--list`,`Print discovered evals without running them`).option(`--timeout <ms>`,`Per-eval timeout in milliseconds`).option(`--max-concurrency <n>`,`Max concurrent eval executions`).option(`--json`,`Output results as JSON`).option(`--junit <path>`,`Write JUnit XML results to a file`).option(`--skip-report`,`Skip eval-defined reporters (e.g. Braintrust)`).option(`--verbose`,`Stream per-eval t.log lines to stdout`).action(async(t,n)=>{await(i.runEvalCommand??await loadRunEvalCommand())(t,n,e)}),p}async function runCli(e=process.argv.slice(2),t=console,n={}){let r=createCliProgram(t,n),a=e.length===0?[`dev`]:rewriteDevelopmentUrlShorthand(e);try{await r.parseAsync(a,{from:`user`})}catch(e){if(e instanceof CommanderError){if(e.exitCode===0)return;let r=await(n.isCodingAgentLaunch??isCodingAgentLaunch)();if(a[0]===`init`&&r){let{initAgentInstructions:e}=await import(`#cli/commands/agent-instructions.js`);t.log(e())}throw Error(e.message)}throw e}}export{resolveDevUiMode,resolveTuiDisplayOptions,runCli};
1
+ import{createLogger}from"#internal/logging.js";import{resolveInstalledPackageInfo}from"#internal/application/package.js";import{createCliTheme,renderCliTaggedLine}from"#cli/ui/output.js";import{isCodingAgentLaunch}from"#cli/agent-detection.js";import{eveCliBanner}from"#cli/banner.js";import{startCliLiveRow}from"#cli/ui/live-row.js";import{devBootPhase}from"#internal/dev-boot-progress.js";import{Command,CommanderError,InvalidArgumentError}from"#compiled/commander/index.js";import{resolveApplicationRoot}from"#internal/application/paths.js";import{registerProjectCommands}from"#cli/commands/register-project-commands.js";import{resolveDevUiMode,resolveTuiDisplayOptions}from"#cli/dev/ui-options.js";import{parseDevelopmentHeaderOption,resolveDevelopmentUrlTarget}from"#cli/dev/url-target.js";import{LOG_DISPLAY_MODES,parseLogDisplayMode}from"#cli/dev/tui/log-display-mode.js";import{resolveTuiTitle}from"#cli/dev/tui/target.js";import{parseDevelopmentServerUrl}from"#cli/dev/url.js";const devBootLog=createLogger(`dev.boot`);function createDevBootProgressReporter(e){return t=>{switch(t.type){case`phase-started`:e?.update(`Building your agent`,t.phase),devBootLog.debug(t.phase);return;case`phase-finished`:devBootLog.debug(`${t.phase} finished`,{ms:t.elapsedMs});return;case`before-first-paint`:e?.stop();return;default:return t}}}async function loadBuildHost(){return(await import(`#internal/nitro/host.js`)).buildApplication}async function loadPrintApplicationInfo(){return(await import(`#cli/commands/info.js`)).printApplicationInfo}async function loadRunDevelopmentTui(){return(await import(`#cli/dev/tui/tui.js`)).runDevelopmentTui}async function loadRunEvalCommand(){return(await import(`#evals/cli/eval.js`)).runEvalCommand}async function loadStartHost(){return(await import(`#internal/nitro/host.js`)).createDevelopmentServer}const loadIsActiveDevelopmentServerForApp=async()=>(await import(`#internal/nitro/host.js`)).isActiveDevelopmentServerForApp;async function loadStartProductionHost(){return(await import(`#internal/nitro/host.js`)).startProductionServer}function shouldPrintCliBootBanner(e){return e.name()===`info`||e.name()===`dev`||e.name()===`init`}async function waitForShutdownSignal(e){await new Promise((t,n)=>{let r=!1,cleanup=()=>{process.off(`SIGINT`,handleSignal),process.off(`SIGTERM`,handleSignal)},handleSignal=()=>{r||(r=!0,cleanup(),e.close().then(t,n))};process.once(`SIGINT`,handleSignal),process.once(`SIGTERM`,handleSignal)})}async function waitForProductionServer(e){await Promise.race([e.wait(),waitForShutdownSignal({close:()=>e.close()})])}function parsePortOption(e){if(!/^-?\d+$/.test(e))throw new InvalidArgumentError(`Expected a numeric port, received "${e}".`);let t=Number(e);if(t<0||t>65535)throw new InvalidArgumentError(`Expected a port between 0 and 65535, received "${e}".`);return t}const DISPLAY_MODES=new Set([`full`,`collapsed`,`auto-collapsed`,`hidden`]),STATS_MODES=new Set([`tokens`,`tokensPerSecond`]);function parseDisplayMode(e){if(!DISPLAY_MODES.has(e))throw new InvalidArgumentError(`Expected one of ${[...DISPLAY_MODES].join(`, `)}, received "${e}".`);return e}function parseStatsMode(e){if(!STATS_MODES.has(e))throw new InvalidArgumentError(`Expected one of ${[...STATS_MODES].join(`, `)}, received "${e}".`);return e}function parseLogsMode(e){let t=parseLogDisplayMode(e);if(t===void 0)throw new InvalidArgumentError(`Expected one of ${LOG_DISPLAY_MODES.join(`, `)}, received "${e}".`);return t}function parseContextSizeOption(e){let t=Number(e);if(!Number.isFinite(t)||t<=0)throw new InvalidArgumentError(`Expected a positive number, received "${e}".`);return t}function hasInteractiveTerminal(){return!!(process.stdin.isTTY&&process.stdout.isTTY)}function createCliProgram(e,i){let c=resolveApplicationRoot(),p=resolveInstalledPackageInfo().version,m=new Command,g=createCliTheme();m.name(`eve`).description(`Build and run an eve application.`).version(p).showHelpAfterError().exitOverride().hook(`preAction`,(t,n)=>{shouldPrintCliBootBanner(n)&&e.log(eveCliBanner())}).configureOutput({writeErr:t=>{e.error(t.trimEnd())},writeOut:t=>{e.log(t.trimEnd())}});let _=m.command(`channels`).description(`Manage user-authored channels in the current project.`);return _.command(`add [kind]`).description(`Add channels interactively, or scaffold a channel kind (slack | web).`).option(`-f, --force`,`Overwrite existing channel files`).option(`-y, --yes`,`Assume yes for confirmations; requires an explicit channel kind`).action(async(t,n)=>{let{runChannelsAddCommand:r}=await import(`#cli/commands/channels.js`);await r(e,c,{kind:t,options:n})}),_.command(`list`).description(`List user-authored channels in the current project.`).option(`--json`,`Output as JSON`).action(async t=>{let{runChannelsListCommand:n}=await import(`#cli/commands/channels.js`);await n(e,c,t)}),m.command(`init [target]`).description(`Create a new eve agent, or add one to an existing project directory.`).option(`--channel-web-nextjs`,`Add the Web Chat application (Next.js)`).option(`-y, --yes`,`Accepted for compatibility; has no effect`).action(async(t,n)=>{n.yes&&e.error(`warning: --yes has no effect for eve init.`);let{runInitCommand:r}=await import(`#cli/commands/init.js`);await r(e,c,t,{channelWebNextjs:n.channelWebNextjs})}),registerProjectCommands({program:m,logger:e,appRoot:c}),m.command(`build`).description(`Build the current eve application.`).action(async()=>{let{loadDevelopmentEnvironmentFiles:t}=await import(`#cli/dev/environment.js`);t(c);let n=await(i.buildHost??await loadBuildHost())(c);e.log(renderCliTaggedLine(g,{message:`built output at ${n}`,tag:`build`,tone:`success`}))}),m.command(`start`).description(`Start a built eve application.`).option(`--host <host>`,`Host interface to bind`).option(`--port <port>`,`Port to listen on (defaults to $PORT, then 3000)`,parsePortOption).action(async t=>{let{loadDevelopmentEnvironmentFiles:n}=await import(`#cli/dev/environment.js`);n(c);let a=await(i.startProductionHost??await loadStartProductionHost())(c,{host:t.host,port:t.port});e.log(renderCliTaggedLine(g,{message:`server listening at ${a.url}`,tag:`start`,tone:`success`})),await waitForProductionServer(a)}),m.command(`dev`).description(`Start the eve development server or connect to an existing URL.`).argument(`[url]`,`Connect to an existing server URL`,parseDevelopmentServerUrl).option(`--host <host>`,`Host interface to bind`).option(`--port <port>`,`Port to listen on (defaults to $PORT, then 2000)`,parsePortOption).option(`-u, --url <url>`,`Connect to an existing server URL`,parseDevelopmentServerUrl).option(`-H, --header <header>`,`Request header for a URL target, in "Name: value" form (repeatable)`,parseDevelopmentHeaderOption).option(`--no-ui`,`Start the server without an interactive UI`).option(`--name <name>`,`Title shown in the terminal UI (defaults to the app folder name)`).option(`--input <text>`,`Pre-fill the prompt input, or start onboarding with /model`).option(`--tools <mode>`,`How tool calls render: full | collapsed | auto-collapsed | hidden`,parseDisplayMode).option(`--reasoning <mode>`,`How reasoning renders: full | collapsed | auto-collapsed | hidden`,parseDisplayMode).option(`--subagents <mode>`,`How subagent sections render: full | collapsed | auto-collapsed | hidden`,parseDisplayMode).option(`--connection-auth <mode>`,`How connection authorization renders: full | collapsed | auto-collapsed | hidden`,parseDisplayMode).option(`--assistant-response-stats <mode>`,`Assistant header statistic: tokens | tokensPerSecond`,parseStatsMode).option(`--context-size <tokens>`,`Model context window size, shown as a usage percentage`,parseContextSizeOption).option(`--logs <mode>`,`Which server/agent logs to show: all | stderr | sandbox | none`,parseLogsMode).addHelpText(`after`,`
2
+ You can also pass a bare URL, for example: eve dev https://example.com
3
+ `).action(async(t,n)=>{let a=resolveDevelopmentUrlTarget(n,t),s=a?.serverUrl,u=hasInteractiveTerminal(),d=resolveDevUiMode({options:n,interactive:u});if(n.input!==void 0&&d===`headless`)throw new InvalidArgumentError(`--input requires the interactive UI.`);let f=!1;s!==void 0&&(f=await(i.isActiveDevelopmentServerForApp??await loadIsActiveDevelopmentServerForApp())({appRoot:c,serverUrl:s}));let runInteractiveUi=async(e,t)=>{let r=await devBootPhase(`loading interactive UI`,async()=>i.runDevelopmentTui??await loadRunDevelopmentTui(),t),o=resolveTuiDisplayOptions(n),l=s===void 0||f?{kind:`local`,serverUrl:e.serverUrl,workspaceRoot:e.appRoot??c}:{kind:`remote`,serverUrl:e.serverUrl,workspaceRoot:c},u=resolveTuiTitle({name:n.name,target:l});u!==void 0&&(o.name=u);let d={target:l,initialInput:n.input,onBootProgress:t,...o};a?.headers===void 0?await r(d):await r({...d,headers:a.headers})};if(s){let{loadDevelopmentEnvironmentFiles:t}=await import(`#cli/dev/environment.js`);if(t(c),e.log(`↗ ${f?`local`:`remote`} mode targeting ${g.info(new URL(s).host)}`),d===`headless`){e.log(renderCliTaggedLine(g,{message:`Interactive UI disabled because the current terminal is not a TTY.`,tag:`dev`,tone:`warning`}));return}e.log(``),await runInteractiveUi({serverUrl:s});return}d===`tui`&&e.log(``);let p=d===`tui`?startCliLiveRow(e):void 0,m=createDevBootProgressReporter(p);p?.update(`Building your agent`);let h=!1,_,closeServer=async()=>{h||_===void 0||(h=!0,await _.close())};try{_=(i.startHost??await loadStartHost())(c,{existing:d===`tui`?`attach-if-unconfigured`:`reject`,host:n.host,onBootProgress:m,port:n.port});let t=await _.start();if(d!==`tui`&&e.log(renderCliTaggedLine(g,{message:`server listening at ${t.url}`,tag:`dev`,tone:`success`})),d===`headless`)return n.ui!==!1&&!u&&e.log(renderCliTaggedLine(g,{message:`Interactive UI disabled because the current terminal is not a TTY.`,tag:`dev`,tone:`warning`})),await waitForShutdownSignal({close:closeServer});await runInteractiveUi({appRoot:t.appRoot,serverUrl:t.url},m)}finally{p?.stop(),await closeServer()}}),m.command(`info`).description(`Print resolved application information.`).option(`--json`,`Output as JSON`).action(async t=>{await(i.printApplicationInfo??await loadPrintApplicationInfo())(e,c,t)}),m.command(`eval`).description(`Run evals against an eve agent.`).argument(`[evalIds...]`,`Eval ids (or directory prefixes) to run (all discovered evals when omitted)`).option(`--url <url>`,`Remote agent URL (skip local host startup)`,parseDevelopmentServerUrl).option(`--tag <tag...>`,`Run only evals carrying a tag`).option(`--strict`,`Fail the exit code when any score falls below its threshold`).option(`--list`,`Print discovered evals without running them`).option(`--timeout <ms>`,`Per-eval timeout in milliseconds`).option(`--max-concurrency <n>`,`Max concurrent eval executions`).option(`--json`,`Output results as JSON`).option(`--junit <path>`,`Write JUnit XML results to a file`).option(`--skip-report`,`Skip eval-defined reporters (e.g. Braintrust)`).option(`--verbose`,`Stream per-eval t.log lines to stdout`).action(async(t,n)=>{await(i.runEvalCommand??await loadRunEvalCommand())(t,n,e)}),m}async function runCli(e=process.argv.slice(2),t=console,n={}){let r=createCliProgram(t,n),a=e.length===0?[`dev`]:e;try{await r.parseAsync(a,{from:`user`})}catch(e){if(e instanceof CommanderError){if(e.exitCode===0)return;let r=await(n.isCodingAgentLaunch??isCodingAgentLaunch)();if(a[0]===`init`&&r){let{initAgentInstructions:e}=await import(`#cli/commands/agent-instructions.js`);t.log(e())}throw Error(e.message)}throw e}}export{resolveDevUiMode,resolveTuiDisplayOptions,runCli};
@@ -1 +1 @@
1
- import{EVE_HEALTH_ROUTE_PATH,EVE_INFO_ROUTE_PATH}from"#protocol/routes.js";import{AgentInfoResponseError}from"#client/agent-info-error.js";import{AgentInfoResultSchema}from"#client/agent-info-schema.js";import{ClientError}from"#client/client-error.js";import{ClientSession}from"#client/session.js";import{createInitialSessionState}from"#client/session-utils.js";import{createClientUrl}from"#client/url.js";import{VERCEL_TRUSTED_OIDC_IDP_TOKEN_HEADER}from"#client/types.js";var Client=class{#e;#t;#n;#r;#i;#a;constructor(e){this.#n=e.host,this.#e=e.auth,this.#t=e.headers,this.#r=e.maxReconnectAttempts??3,this.#i=e.preserveCompletedSessions??!1,this.#a=e.redirect}async health(){let t=createClientUrl(this.#n,EVE_HEALTH_ROUTE_PATH),n=await this.#o(),r=await fetch(t,withRedirectPolicy({headers:n},this.#a));if(!r.ok){let e=await r.text();throw new ClientError(r.status,e)}return await r.json()}async info(){let e=await this.fetch(EVE_INFO_ROUTE_PATH);if(!e.ok){let t=await e.text();throw new ClientError(e.status,t)}let i;try{i=await e.json()}catch{throw new AgentInfoResponseError}let a=AgentInfoResultSchema.safeParse(i);if(!a.success)throw new AgentInfoResponseError(a.error.issues.slice(0,5).map(e=>{let t=e.path.join(`.`);return t.length===0?e.message:`${t}: ${e.message}`}));return a.data}async fetch(e,t={}){let n=createClientUrl(this.#n,e),r=await this.#o(headersInitToRecord(t.headers));return await fetch(n,withRedirectPolicy({...t,headers:r},this.#a))}session(e){let t;return t=typeof e==`string`?{continuationToken:e,streamIndex:0}:e||createInitialSessionState(),new ClientSession({host:this.#n,maxReconnectAttempts:this.#r,preserveCompletedSessions:this.#i,redirect:this.#a,resolveHeaders:e=>this.#o(e)},t)}async#o(e){let t=new Headers,[n,r]=await Promise.all([resolveHeadersValue(this.#t),this.#s()]);for(let[e,r]of Object.entries(n))t.set(e,r);if(e)for(let[n,r]of Object.entries(e))t.set(n,r);for(let[e,n]of Object.entries(r))t.set(e,n);return t}async#s(){let e=this.#e;if(!e)return{};if(`vercelOidc`in e){let t=(await resolveTokenValue(e.vercelOidc.token)).trim();return t.length===0?{}:{authorization:`Bearer ${t}`,[VERCEL_TRUSTED_OIDC_IDP_TOKEN_HEADER]:t}}if(`bearer`in e){let t=(await resolveTokenValue(e.bearer)).trim();return t.length===0?{}:{authorization:`Bearer ${t}`}}if(`basic`in e){let t=await resolveTokenValue(e.basic.password);return{authorization:`Basic ${encodeBasicCredentials(e.basic.username,t)}`}}return{}}};async function resolveTokenValue(e){return typeof e==`function`?e():e}async function resolveHeadersValue(e){return e===void 0?{}:typeof e==`function`?await e():e}function headersInitToRecord(e){return e===void 0?{}:Object.fromEntries(new Headers(e).entries())}function withRedirectPolicy(e,t){return t===void 0?e:{...e,redirect:t}}function encodeBasicCredentials(e,t){let n=new TextEncoder().encode(`${e}:${t}`),r=Array.from(n,e=>String.fromCodePoint(e)).join(``);return btoa(r)}export{Client};
1
+ import{EVE_HEALTH_ROUTE_PATH,EVE_INFO_ROUTE_PATH}from"#protocol/routes.js";import{encodeBasicCredentials}from"#internal/http/basic-auth.js";import{AgentInfoResponseError}from"#client/agent-info-error.js";import{AgentInfoResultSchema}from"#client/agent-info-schema.js";import{ClientError}from"#client/client-error.js";import{ClientSession}from"#client/session.js";import{createInitialSessionState}from"#client/session-utils.js";import{createClientUrl}from"#client/url.js";import{VERCEL_TRUSTED_OIDC_IDP_TOKEN_HEADER}from"#client/types.js";var Client=class{#e;#t;#n;#r;#i;#a;constructor(e){this.#n=e.host,this.#e=e.auth,this.#t=e.headers,this.#r=e.maxReconnectAttempts??3,this.#i=e.preserveCompletedSessions??!1,this.#a=e.redirect}async health(){let t=createClientUrl(this.#n,EVE_HEALTH_ROUTE_PATH),n=await this.#o(),r=await fetch(t,withRedirectPolicy({headers:n},this.#a));if(!r.ok){let e=await r.text();throw new ClientError(r.status,e)}return await r.json()}async info(){let e=await this.fetch(EVE_INFO_ROUTE_PATH);if(!e.ok){let t=await e.text();throw new ClientError(e.status,t)}let n;try{n=await e.json()}catch{throw new AgentInfoResponseError}let i=AgentInfoResultSchema.safeParse(n);if(!i.success)throw new AgentInfoResponseError(i.error.issues.slice(0,5).map(e=>{let t=e.path.join(`.`);return t.length===0?e.message:`${t}: ${e.message}`}));return i.data}async fetch(e,t={}){let n=createClientUrl(this.#n,e),r=await this.#o(headersInitToRecord(t.headers));return await fetch(n,withRedirectPolicy({...t,headers:r},this.#a))}session(e){let t;return t=typeof e==`string`?{continuationToken:e,streamIndex:0}:e||createInitialSessionState(),new ClientSession({host:this.#n,maxReconnectAttempts:this.#r,preserveCompletedSessions:this.#i,redirect:this.#a,resolveHeaders:e=>this.#o(e)},t)}async#o(e){let t=new Headers,[n,r]=await Promise.all([resolveHeadersValue(this.#t),this.#s()]);for(let[e,r]of Object.entries(n))t.set(e,r);if(e)for(let[n,r]of Object.entries(e))t.set(n,r);for(let[e,n]of Object.entries(r))t.set(e,n);return t}async#s(){let e=this.#e;if(!e)return{};if(`vercelOidc`in e){let t=(await resolveTokenValue(e.vercelOidc.token)).trim();return t.length===0?{}:{authorization:`Bearer ${t}`,[VERCEL_TRUSTED_OIDC_IDP_TOKEN_HEADER]:t}}if(`bearer`in e){let t=(await resolveTokenValue(e.bearer)).trim();return t.length===0?{}:{authorization:`Bearer ${t}`}}if(`basic`in e){let t=await resolveTokenValue(e.basic.password);return{authorization:`Basic ${encodeBasicCredentials(e.basic.username,t)}`}}return{}}};async function resolveTokenValue(e){return typeof e==`function`?e():e}async function resolveHeadersValue(e){return e===void 0?{}:typeof e==`function`?await e():e}function headersInitToRecord(e){return e===void 0?{}:Object.fromEntries(new Headers(e).entries())}function withRedirectPolicy(e,t){return t===void 0?e:{...e,redirect:t}}export{Client};
@@ -26,12 +26,12 @@
26
26
  "@vercel/detect-agent": "1.2.3",
27
27
  "@vercel/oidc": "3.5.0",
28
28
  "@vercel/sandbox": "2.2.1",
29
- "@workflow/core": "5.0.0-beta.24",
29
+ "@workflow/core": "5.0.0-beta.26",
30
30
  "@workflow/errors": "5.0.0-beta.8",
31
- "@workflow/serde": "4.1.0",
32
- "@workflow/world": "5.0.0-beta.13",
31
+ "@workflow/serde": "5.0.0-beta.2",
32
+ "@workflow/world": "5.0.0-beta.14",
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};