agent-slack-0.10.2
checks.aarch64-darwin.pkgs-agent-slack
· build #9327
· raw
1mac02: building yh7mv7csh5kbygfvwzh0721kvx208kzg-agent-slack-0.10.2.drv2Using versionCheckHook
unpackPhase
3unpacking source archive /nix/store/cgqwcm1zgrhk5gmlmpjpi0rc8f2zg5kh-source4source root is sourcebunSetInstallCacheDirPhase
5Using bun root: "/nix/var/nix/builds/nix-56196-3980350766/source"bunPatchPhase
6patching script interpreter paths in .7./scripts/install-skill.sh: interpreter directive changed from "#!/usr/bin/env bash" to "/nix/store/i1pdjlwb27ki88zssg5q2h696v1r1m15-bash-5.3p20/bin/bash"8./scripts/update-nix-sources.sh: interpreter directive changed from "#!/usr/bin/env bash" to "/nix/store/i1pdjlwb27ki88zssg5q2h696v1r1m15-bash-5.3p20/bin/bash"9./scripts/release.sh: interpreter directive changed from "#!/bin/sh" to "/nix/store/i1pdjlwb27ki88zssg5q2h696v1r1m15-bash-5.3p20/bin/sh"configurePhase
10no configure script, doing nothingbunNodeModulesInstallPhase
11/nix/var/nix/builds/nix-56196-3980350766/source /nix/var/nix/builds/nix-56196-3980350766/source12bun install flags: --linker=isolated --backend=symlink --ignore-scripts13bun install v1.4.2 (744846f84)14 📦 Installing [66/67] 15+ @types/node@22.19.816+ @types/semver@7.7.117+ @types/turndown@5.0.618+ bun-types@1.3.919+ oxfmt@0.31.020+ oxlint@1.49.021+ semver@7.7.422+ simple-git-hooks@2.13.123+ typescript@5.9.324+ @slack/web-api@7.13.025+ commander@14.0.326+ hysnappy@1.1.027+ node-emoji@2.2.028+ turndown@7.2.229+ turndown-plugin-gfm@1.0.230+ zod@4.3.6313266 packages installed [532.00ms]33/nix/var/nix/builds/nix-56196-3980350766/sourcebuildPhase
34Bundled 360 modules in 79ms3536 agent-slack.js 1.98 MB (entry point)37checkPhase
38bun test v1.4.2 (744846f84)3940test/users.test.ts:41✓ resolveUserId > returns user ids unchanged [4.30ms]42✓ resolveUserId > returns W-prefixed user ids unchanged [0.32ms]43✓ resolveUserId > resolves @handle via users.list [3.67ms]44✓ resolveUserId > resolves email via users.lookupByEmail [0.07ms]45✓ resolveUserId > resolves @handle case-insensitively [0.27ms]46✓ resolveUserId > falls back to users.list when lookupByEmail is unavailable [2.04ms]4748test/desktop-auth-paths.test.ts:49✓ Windows Store Slack package detection > matches known Microsoft Store package identifiers [0.09ms]50✓ Windows Store Slack package detection > does not match unrelated packages5152test/format-outbound.test.ts:53✓ formatOutboundSlackText > promotes bare user IDs to Slack mention tokens [2.33ms]54✓ formatOutboundSlackText > leaves already-formatted mention tokens alone [0.52ms]55✓ formatOutboundSlackText > leaves already-formatted usergroup mention tokens alone [0.02ms]56✓ formatOutboundSlackText > promotes broadcast mentions [0.02ms]57✓ formatOutboundSlackText > escapes bare < > & in literal text [0.03ms]58✓ formatOutboundSlackText > does not escape inside already-formatted Slack tokens [0.02ms]59✓ formatOutboundSlackText > does not promote email-like or mid-word @60✓ formatOutboundSlackText > handles empty input61✓ formatOutboundSlackText > real-world CI dump stays readable with mention + URL [0.24ms]6263test/leveldb-reader.test.ts:64✓ leveldb-reader > readChromiumLevelDB > returns empty array for non-existent directory [3.03ms]65✓ leveldb-reader > readChromiumLevelDB > returns empty array for empty directory [1.39ms]66✓ leveldb-reader > readChromiumLevelDB > reads entries from SSTable files [4.23ms]67✓ leveldb-reader > readChromiumLevelDB > reads entries from log files [2.71ms]68✓ leveldb-reader > readChromiumLevelDB > reads from both SSTable and log files [2.15ms]69✓ leveldb-reader > readChromiumLevelDB > handles .sst file extension [1.66ms]70✓ leveldb-reader > findKeysContaining > filters entries by key substring [1.78ms]71✓ leveldb-reader > findKeysContaining > returns empty array when no matches [2.94ms]72✓ leveldb-reader > edge cases > handles invalid SSTable (wrong magic) [1.75ms]73✓ leveldb-reader > edge cases > handles empty SSTable file [2.79ms]74✓ leveldb-reader > edge cases > handles SSTable smaller than footer size [2.45ms]7576test/messages.test.ts:77✓ fetchThread > returns the thread root and replies in chronological order [1.49ms]7879test/workspace-selector.test.ts:80✓ resolveWorkspaceSelector > matches exact URL [0.86ms]81✓ resolveWorkspaceSelector > matches unique substring by host/team [0.27ms]82✓ resolveWorkspaceSelector > matches unique substring by workspace name [0.02ms]83✓ resolveWorkspaceSelector > returns ambiguity when selector matches multiple workspaces [0.22ms]84✓ resolveWorkspaceSelector > returns no match when selector does not match [0.03ms]8586test/help-contracts.test.ts:87✓ agent-facing help contracts > message send documents non-obvious formatting and scheduling behavior [3.44ms]88✓ agent-facing help contracts > message compose identifies its CI send behavior [0.56ms]89✓ agent-facing help contracts > Slack-native drafts document DM targeting and inherited-broadcast controls [1.14ms]90✓ agent-facing help contracts > scheduled cancellation identifies its required channel [0.24ms]91✓ agent-facing help contracts > Later reminders identify named-day timezone behavior [0.37ms]92✓ agent-facing help contracts > canvas creation identifies source and credential constraints [0.23ms]93✓ agent-facing help contracts > canvas editing identifies operations, targeting, and content constraints [0.12ms]94✓ agent-facing help contracts > channel mark distinguishes URL and non-URL workspace handling [0.14ms]95✓ agent-facing help contracts > DM help states Slack's group size limit [0.24ms]9697test/channel-command.test.ts:98✓ channel list command > defaults to users.conversations for current user [7.03ms]99✓ channel list command > with --user id uses users.conversations and sets user directly [1.15ms]100✓ channel list command > with --user handle resolves via users.list before users.conversations [0.34ms]101✓ channel list command > with --user unknown handle is a hard error [0.34ms]102✓ channel list command > with --all uses conversations.list [0.46ms]103✓ channel list command > forwards --limit and --cursor [0.08ms]104✓ channel list command > --all and --user is a hard error [0.07ms]105✓ channel list command > invalid --limit is a hard error [0.06ms]106✓ channel list command > help text documents single-page pagination model [0.04ms]107✓ channel mark command > URL target extracts workspace from URL [1.56ms]108✓ channel mark command > URL target rejects --workspace flag [0.17ms]109✓ channel mark command > channel target requires --ts [0.18ms]110✓ channel mark command > URL target allows --ts override [0.20ms]111✓ channel mark command > channel target with --ts calls conversations.mark [0.14ms]112113test/user-id.test.ts:114✓ isUserId > accepts U-prefixed and W-prefixed Slack user IDs [0.01ms]115✓ isUserId > preserves the existing length and character restrictions [0.02ms]116117test/mrkdwn.test.ts:118✓ slackMrkdwnToMarkdown > converts Slack-style links [0.09ms]119✓ slackMrkdwnToMarkdown > converts user and channel mentions [0.07ms]120✓ slackMrkdwnToMarkdown > converts :emoji: shortcodes to unicode [0.11ms]121122test/rich-text.test.ts:123✓ parseInlineElements > plain text returns single text element [0.22ms]124✓ parseInlineElements > *bold* is parsed with bold style [0.02ms]125✓ parseInlineElements > _italic_ is parsed with italic style [0.01ms]126✓ parseInlineElements > ~strike~ is parsed with strike style127✓ parseInlineElements > `code` is parsed with code style128✓ parseInlineElements > :emoji: shortcode is parsed as an emoji element129✓ parseInlineElements > emoji names with underscores are not parsed as italic text130✓ parseInlineElements > time-like colon text is not parsed as an emoji element131✓ parseInlineElements > <url|label> is parsed as link with text [0.02ms]132✓ parseInlineElements > <url> is parsed as link without text [0.01ms]133✓ parseInlineElements > <mailto|label> is parsed as link with text134✓ parseInlineElements > non-url angle bracket text is preserved as text135✓ parseInlineElements > non-url labeled angle bracket text is preserved as text136✓ parseInlineElements > channel mention tokens are parsed as channel elements137✓ parseInlineElements > bare channel mention tokens are parsed as channel elements138✓ parseInlineElements > usergroup mention tokens are parsed as usergroup elements139✓ textToRichTextBlocks > plain text returns null [0.33ms]140✓ textToRichTextBlocks > inline-only formatting returns null by default [0.01ms]141✓ textToRichTextBlocks > non-url angle bracket text does not trigger rich text blocks [0.01ms]142✓ textToRichTextBlocks > mixed non-url angle bracket text and formatting preserves brackets [0.02ms]143✓ textToRichTextBlocks > inline-only formatting can produce rich text blocks [0.03ms]144✓ textToRichTextBlocks > mailto links can produce rich text blocks when inline formatting is included [0.01ms]145✓ textToRichTextBlocks > channel mentions can produce rich text blocks when inline formatting is included [0.02ms]146✓ textToRichTextBlocks > bullet list with - prefix [0.07ms]147✓ textToRichTextBlocks > bullet list with bullet character [0.12ms]148✓ textToRichTextBlocks > sub-bullets with indentation [0.02ms]149✓ textToRichTextBlocks > white bullet sub-bullets under bullet [0.01ms]150✓ textToRichTextBlocks > mixed text and bullets [0.02ms]151✓ textToRichTextBlocks > numbered list [0.02ms]152✓ textToRichTextBlocks > bold text in list items is parsed [0.01ms]153✓ textToRichTextBlocks > emoji and channel references in list items are parsed [0.02ms]154✓ textToRichTextBlocks > Slack manual links and CommonMark links remain distinct in list items [0.01ms]155✓ textToRichTextBlocks > code block is preserved [0.01ms]156✓ textToRichTextBlocks > blockquote is preserved157158test/message-reaction-filters.test.ts:159✓ parseReactionFilters > normalizes shortcodes, names, and unicode [0.38ms]160✓ parseReactionFilters > returns empty array when unset161✓ passesReactionNameFilters > matches when required reaction is present [0.05ms]162✓ passesReactionNameFilters > does not match when required reaction is missing163✓ passesReactionNameFilters > does not match when excluded reaction is present164✓ passesReactionNameFilters > matches when excluded reaction is absent165✓ passesReactionNameFilters > supports with + without together166✓ requireOldestWhenReactionFiltersUsed > returns oldest when no reaction filters are used [0.01ms]167✓ requireOldestWhenReactionFiltersUsed > returns trimmed oldest when reaction filters are used168✓ requireOldestWhenReactionFiltersUsed > throws when reaction filters are used without oldest [0.90ms]169170test/parse-limit.test.ts:171✓ parseLimit > returns undefined when no value given [0.02ms]172✓ parseLimit > parses valid positive integers [0.01ms]173✓ parseLimit > rejects non-numeric strings [0.01ms]174✓ parseLimit > rejects zero175✓ parseLimit > rejects negative numbers [0.24ms]176✓ parseLimit > rejects floats (uses integer part)177✓ requireMessageTs > returns trimmed ts when present178✓ requireMessageTs > throws when missing179✓ requireMessageTs > throws when blank [0.02ms]180181test/message-compact.test.ts:182✓ toCompactMessage > includes file with path on successful download [0.74ms]183✓ toCompactMessage > includes file with error on failed download [0.05ms]184✓ toCompactMessage > excludes files with no downloadedPaths entry [0.02ms]185✓ toCompactMessage > mixes successful and failed downloads [0.02ms]186✓ toCompactMessage > failed download preserves file metadata for content-type filtering [0.01ms]187✓ passesContentTypeFilter with failed downloads > image message with failed download still passes image filter [0.04ms]188✓ passesContentTypeFilter with failed downloads > snippet message with failed download still passes snippet filter [0.02ms]189✓ passesContentTypeFilter with failed downloads > message without download entry has no files and passes text filter [0.01ms]190✓ toCompactMessage filename preservation > does not fall back to title when name is missing [0.03ms]191192test/user-cache.test.ts:193✓ user-cache helpers > collectReferencedUserIds excludes reaction users by default [0.69ms]194✓ user-cache helpers > collectReferencedUserIds includes reaction users when enabled [0.04ms]195✓ user-cache helpers > toReferencedUsers returns only resolved users keyed by id [0.09ms]196197test/message-send.test.ts:198✓ sendMessage > posts a normal message when no attachments are passed [0.80ms]199✓ sendMessage > --no-unfurl disables link and media previews for immediate sends [0.07ms]200✓ sendMessage > opens and sends to a DM for a W-prefixed user target [0.18ms]201✓ sendMessage > returns a permalink when the workspace was resolved implicitly [0.04ms]202✓ sendMessage > threaded reply returns thread_ts distinct from ts [0.30ms]203✓ sendMessage > --reply-broadcast with --thread-ts sends reply_broadcast: true [0.05ms]204✓ sendMessage > --reply-broadcast omits the field from chat.postMessage when flag is absent [0.03ms]205✓ sendMessage > --reply-broadcast without --thread-ts throws [0.05ms]206✓ sendMessage > --reply-broadcast on a URL target broadcasts using the message's derived thread_ts [0.27ms]207✓ sendMessage > --reply-broadcast on a DM target throws (broadcasting is not meaningful for DMs) [0.04ms]208✓ sendMessage > --reply-broadcast works alongside --blocks payload [1.80ms]209✓ sendMessage > uploads attachment and uses message text as initial comment [5.48ms]210✓ sendMessage > --no-unfurl cannot be combined with file attachments [0.29ms]211✓ sendMessage > sends initial comment only for the first attachment [3.65ms]212✓ sendMessage > uploads attachment without text when text is empty [2.01ms]213✓ sendMessage > --blocks: reads Block Kit JSON from file and passes through unchanged [2.75ms]214✓ sendMessage > --blocks: errors when JSON is not an array [1.89ms]215✓ sendMessage > --blocks: errors on malformed JSON [0.98ms]216✓ sendMessage > --blocks: overrides markdown-to-rich-text conversion when text is also provided [2.10ms]217✓ sendMessage > sends Slack manual links in lists as rich-text link blocks [0.26ms]218✓ sendMessage > --blocks: errors when an array element is not an object [1.58ms]219✓ sendMessage > --schedule sends through chat.scheduleMessage and returns scheduled metadata [0.59ms]220✓ sendMessage > --schedule-in computes a relative post_at [0.27ms]221✓ sendMessage > --no-unfurl disables link and media previews for scheduled sends [0.09ms]222✓ sendMessage > --schedule composes with blocks, thread replies, and reply broadcast [1.21ms]223✓ sendMessage > --schedule cannot be combined with file attachments [0.07ms]224✓ composeMessage > --no-unfurl disables link and media previews when CI sends immediately [0.32ms]225✓ composeMessage > keeps Slack's default preview behavior for a standard CI send [0.04ms]226✓ composeMessage > --no-unfurl disables previews for a URL target when CI sends immediately [0.19ms]227✓ scheduled message management > lists scheduled messages and forwards channel filters [0.17ms]228✓ scheduled message management > cancels scheduled messages with the required channel id [0.11ms]229✓ scheduled message time parsing > parses absolute ISO timestamps with explicit timezones [0.06ms]230✓ scheduled message time parsing > parses named relative times like monday 9am [10.76ms]231✓ scheduled message time parsing > rejects schedule times beyond Slack's 120 day limit [0.08ms]232✓ editMessage > edits a normal text message without blocks [0.37ms]233✓ editMessage > edits literal angle bracket text without blocks [0.10ms]234✓ editMessage > edits a message URL with a link label without blocks [0.12ms]235✓ editMessage > edits an inline mailto link without escaping it [0.07ms]236✓ editMessage > edits an inline usergroup mention without escaping it [0.07ms]237✓ editMessage > edits a channel target with inline formatting without blocks [0.06ms]238✓ editMessage > edits a channel target with rich text blocks when text contains a list [0.21ms]239✓ editMessage > edits a normal message without blocks when no --blocks file is passed [0.12ms]240✓ editMessage > edits a message URL with Block Kit JSON from file [1.38ms]241✓ editMessage > edits a channel target with --ts and Block Kit JSON from file [1.22ms]242243test/compact-json.test.ts:244✓ pruneEmpty > drops null/undefined/empty containers [0.07ms]245246test/search-query.test.ts:247✓ W-prefixed user IDs in search > resolves a W-prefixed user ID to a from filter [0.31ms]248✓ W-prefixed user IDs in search > returns a W-prefixed user ID without scanning users [0.14ms]249250test/message-draft-actions.test.ts:251✓ createDraftAction > creates a draft addressed to a channel id [1.46ms]252✓ createDraftAction > rejects --broadcast without a thread [0.11ms]253✓ createDraftAction > rejects --broadcast for a DM (user) target [0.05ms]254✓ createDraftAction > rejects --broadcast for a D... channel-id (DM) target [0.03ms]255✓ createDraftAction > rejects --broadcast on a channel name with no thread before any network call [0.03ms]256✓ createDraftAction > rejects --broadcast on a DM message URL before fetching the message [0.24ms]257✓ createDraftAction > uploads --attach files and wires their file ids into the draft [3.01ms]258✓ createDraftAction > aborts before any upload or drafts.create when an --attach path is missing [0.51ms]259✓ updateDraftAction > text-only edit preserves destination, thread, broadcast, and file ids [0.84ms]260✓ updateDraftAction > re-addressing a broadcast thread draft to a non-thread channel clears broadcast instead of erroring [0.21ms]261✓ updateDraftAction > explicit --broadcast on a non-thread draft still errors [0.17ms]262✓ updateDraftAction > refuses to update a scheduled draft rather than clearing its schedule [0.12ms]263✓ updateDraftAction > refuses a text-only update on a multi-destination draft, but allows re-addressing [0.20ms]264✓ updateDraftAction > re-addressing to a different thread does not inherit the old broadcast flag [0.10ms]265✓ updateDraftAction > --no-broadcast clears an inherited broadcast flag on a same-thread edit [0.08ms]266✓ updateDraftAction > rejects --broadcast when re-addressing to a DM (user) target [0.07ms]267✓ updateDraftAction > changing only --thread-ts (no --channel) does not inherit the old broadcast flag [0.08ms]268✓ updateDraftAction > rejects --broadcast on an existing DM-destination draft [0.08ms]269✓ updateDraftAction > rejects --broadcast when re-addressing to a channel name with no thread, before resolving it [0.07ms]270✓ updateDraftAction > merges --attach file ids into the draft's existing file_ids [1.06ms]271✓ updateDraftAction > merges --attach while de-duplicating ids already on the draft [1.24ms]272✓ deleteDraftAction > auto-fetches and pads last_updated_ts when omitted [0.33ms]273✓ listDraftsAction > hydrates channel display names [0.52ms]274{275 "ok": true,276 "draft": {277 "id": "Dr123",278 "destinations": [279 {280 "channel_id": "C11111111",281 "thread_ts": "1700000000.100000"282 }283 ]284 }285}286✓ message draft update (commander --broadcast wiring) > omitting broadcast flags does not force broadcast on (no Commander default-true gotcha) [2.74ms]287{288 "ok": true,289 "draft": {290 "id": "Dr123",291 "destinations": [292 {293 "channel_id": "C11111111",294 "thread_ts": "1700000000.100000",295 "broadcast": true296 }297 ]298 }299}300✓ message draft update (commander --broadcast wiring) > --broadcast sets broadcast true [0.48ms]301{302 "ok": true,303 "draft": {304 "id": "Dr123",305 "destinations": [306 {307 "channel_id": "C11111111",308 "thread_ts": "1700000000.100000"309 }310 ]311 }312}313✓ message draft update (commander --broadcast wiring) > --no-broadcast clears an inherited broadcast flag [0.29ms]314{315 "ok": true,316 "draft": {317 "id": "DrNew",318 "destinations": [319 {320 "channel_id": "C11111111"321 }322 ]323 }324}325✓ message draft create (commander --attach wiring) > collects repeatable --attach flags into an array [3.48ms]326✓ message draft unknown subcommand > old `message draft <target>` usage points to `message compose` [0.58ms]327✓ draft attachments: orphan prevention across auth-retry and failed drafts > #2 create: a drafts.create auth failure retries work WITHOUT re-uploading files [1.64ms]328✓ draft attachments: orphan prevention across auth-retry and failed drafts > #2 update: a drafts.update auth failure retries work WITHOUT re-uploading files [5.24ms]329✓ draft attachments: orphan prevention across auth-retry and failed drafts > #3 create: a non-auth drafts.create failure deletes the uploaded file [4.22ms]330✓ draft attachments: orphan prevention across auth-retry and failed drafts > #3 update: a stale drafts.update failure deletes the newly uploaded file only [3.52ms]331✓ draft attachments: orphan prevention across auth-retry and failed drafts > a failed draft with no attachments does not attempt files.delete [0.27ms]332333test/channel-admin.test.ts:334✓ parseInviteUsersCsv > splits comma-separated values, trims whitespace, and deduplicates [0.06ms]335✓ parseInviteUsersCsv > returns empty array when input has no values336✓ splitEmailsFromInviteTargets > separates email targets from non-email targets [0.04ms]337✓ splitEmailsFromInviteTargets > deduplicates emails338339test/targets.test.ts:340✓ parseMsgTarget > parses slack message URLs [0.04ms]341✓ parseMsgTarget > accepts #channel [0.03ms]342✓ parseMsgTarget > accepts bare channel names [0.03ms]343✓ parseMsgTarget > accepts channel IDs [0.02ms]344✓ parseMsgTarget > accepts user IDs as DM targets [0.02ms]345✓ parseMsgTarget > accepts W-prefixed user IDs as DM targets [0.01ms]346✓ parseMsgTarget > accepts user IDs with leading/trailing whitespace [0.01ms]347✓ parseMsgTarget > does not treat short U-prefixed strings as user IDs348✓ parseMsgTarget > does not treat short W-prefixed strings as user IDs349350test/search-command.test.ts:351✓ search referenced users > searchSlack returns shared referenced_users while preserving canonical ids [6.97ms]352✓ search referenced users > search command forwards --refresh-users and bypasses cached user lookups [5.61ms]353354test/upload.test.ts:355✓ uploadFilesForDraft > never shifts ids between files when the completion response omits one [2.33ms]356✓ uploadFilesForDraft > falls back to staged ids when the completion response length disagrees [2.88ms]357✓ uploadFilesForDraft > stages every file, then completes them in one call with no channel binding [5.12ms]358✓ uploadFilesForDraft > a later staging failure leaves nothing completed (no orphaned files) [3.81ms]359✓ uploadFilesForDraft > throws and completes nothing when a path does not exist [2.51ms]360✓ uploadFilesForDraft > throws and completes nothing when a byte POST fails [3.18ms]361✓ uploadFilesForDraft > throws when files.completeUploadExternal fails [2.71ms]362✓ uploadFilesForDraft > throws when the path is a directory [2.41ms]363✓ uploadLocalFileToSlack (shared-helper regression) > still binds the completed file to a channel with an initial comment [2.94ms]364365test/html-to-md.test.ts:366✓ htmlToMarkdown > converts basic HTML to markdown [4.32ms]367368test/safe-mode.test.ts:369✓ isSafeModeEnabled > enabled via CLI flag [0.04ms]370✓ isSafeModeEnabled > enabled for env value "1" [0.02ms]371✓ isSafeModeEnabled > enabled for env value "true"372✓ isSafeModeEnabled > enabled for env value "TRUE"373✓ isSafeModeEnabled > enabled for env value "yes"374✓ isSafeModeEnabled > enabled for env value "on"375✓ isSafeModeEnabled > enabled for env value " 1 "376✓ isSafeModeEnabled > disabled for env value "0"377✓ isSafeModeEnabled > disabled for env value "false"378✓ isSafeModeEnabled > disabled for env value "off"379✓ isSafeModeEnabled > disabled for env value "no"380✓ isSafeModeEnabled > disabled for env value ""381✓ isSafeModeEnabled > disabled when env var is unset and flag is absent [0.05ms]382✓ safeModeBlockedError > names the blocked action [0.05ms]383✓ redirectSendToDraft > rejects unsupported send option {384 attach: [ "./report.md" ],385} [0.27ms]386✓ redirectSendToDraft > rejects unsupported send option {387 blocks: "/tmp/blocks.json",388} [0.01ms]389✓ redirectSendToDraft > rejects unsupported send option {390 schedule: "2030-01-01T00:00:00Z",391}392✓ redirectSendToDraft > rejects unsupported send option {393 scheduleIn: "3h",394}395✓ redirectSendToDraft > rejects unsupported send option {396 replyBroadcast: true,397}398✓ redirectSendToDraft > lists all unsupported flags at once [0.08ms]399✓ redirectSendToDraft > rejects in CI where no interactive editor is available [0.12ms]400⚠ Safe mode active: redirecting "message send" → draft editor. Nothing posts until a human sends it from the editor.401✓ redirectSendToDraft > opens a draft with the send text and thread context [0.22ms]402403test/files.test.ts:404✓ downloadSlackFile > downloads file and writes to disk [3.32ms]405✓ downloadSlackFile > returns cached path when file already exists [2.06ms]406✓ downloadSlackFile > throws SlackDownloadError on HTTP 404 [1.07ms]407✓ downloadSlackFile > throws SlackDownloadError with httpStatus on HTTP error [0.55ms]408✓ downloadSlackFile > throws SlackDownloadError on HTML auth page [0.60ms]409✓ downloadSlackFile > throws SlackDownloadError on network error [0.94ms]410✓ downloadSlackFile > throws SlackDownloadError when reading html body fails [0.74ms]411✓ downloadSlackFile > throws SlackDownloadError when reading binary body fails [0.75ms]412✓ tryDownloadSlackFile > returns ok result on success [1.30ms]413✓ tryDownloadSlackFile > returns failure result on HTTP 404 [1.87ms]414✓ tryDownloadSlackFile > returns failure result on network error [1.42ms]415✓ tryDownloadSlackFile > propagates disk/write errors [1.69ms]416Warning: skipping file F1: Downloaded auth/login page instead of canvas content (token may be expired)417✓ downloadMessageFiles > records canvas auth failures as structured errors [3.40ms]418Warning: skipping file F2: Failed to download file (404)419✓ downloadMessageFiles > records non-canvas download failures with a local error path [3.06ms]420421test/channels.test.ts:422✓ conversations list helpers > listUserConversations calls users.conversations with defaults [0.17ms]423✓ conversations list helpers > listUserConversations forwards user/limit/cursor [0.07ms]424✓ conversations list helpers > listAllConversations calls conversations.list with defaults [0.06ms]425✓ conversations list helpers > listAllConversations forwards limit/cursor [0.04ms]426✓ conversations list helpers > listUserConversations passes through small limits [0.04ms]427✓ conversations list helpers > listUserConversations clamps high limits to 1000 [0.03ms]428✓ conversations list helpers > normalizeConversationsPage extracts channels and next cursor [0.03ms]429✓ conversations list helpers > normalizeConversationsPage handles missing response_metadata [0.01ms]430✓ conversations list helpers > normalizeConversationsPage handles empty next_cursor [0.01ms]431✓ conversations list helpers > listConversationsViaCounts enumerates channels/mpims/ims and enriches via conversations.info [0.46ms]432✓ conversations list helpers > listConversationsViaCounts keeps the id when conversations.info fails [0.13ms]433✓ conversations list helpers > listConversationsViaCounts slices to limit and skips entries without an id [0.11ms]434435test/update.test.ts:436✓ compareSemver > equal versions return 0 [0.09ms]437✓ compareSemver > strips v prefix [0.02ms]438✓ compareSemver > newer major [0.01ms]439✓ compareSemver > newer minor440✓ compareSemver > newer patch441✓ compareSemver > older version returns negative442✓ compareSemver > handles 0.x versions [0.03ms]443444test/reactions.test.ts:445✓ reactions compaction > includes reactions only when enabled [0.18ms]446✓ reactions compaction > preserves W-prefixed user IDs while compacting reactions [0.04ms]447✓ reactions compaction > adds forwarded thread metadata for shared messages with thread_ts [0.27ms]448449test/emoji.test.ts:450✓ normalizeSlackReactionName > accepts :shortcode: [0.02ms]451✓ normalizeSlackReactionName > accepts raw names [0.01ms]452✓ normalizeSlackReactionName > accepts unicode emoji [0.03ms]453454test/client.test.ts:455✓ SlackApiClient browser multipart transport > retries HTTP 429 responses using Retry-After [2.51ms]456457test/url.test.ts:458✓ parseSlackMessageUrl > parses archives URL with p<digits> [0.03ms]459✓ parseSlackMessageUrl > captures thread_ts from query when present [0.01ms]460✓ buildSlackMessageUrl > builds a permalink for a root message [0.01ms]461✓ buildSlackMessageUrl > includes thread metadata for replies462463test/render.test.ts:464✓ renderSlackMessageContent > prefers blocks [0.05ms]465✓ renderSlackMessageContent > preserves usergroup and broadcast elements from rich text [0.22ms]466✓ renderSlackMessageContent > omits malformed usergroup and broadcast elements [0.04ms]467✓ renderSlackMessageContent > falls back to attachments when text is empty [0.03ms]468✓ renderSlackMessageContent > includes section fields and button URLs [0.03ms]469✓ renderSlackMessageContent > includes attachment fields [0.02ms]470✓ renderSlackMessageContent > renders forwarded message with author and source link [0.06ms]471✓ renderSlackMessageContent > renders forwarded message with author name only [0.02ms]472✓ renderSlackMessageContent > renders forwarded message with no author [0.03ms]473✓ renderSlackMessageContent > includes forwarded file links in quoted forwarded body [0.03ms]474✓ renderSlackMessageContent > renders nested forwarded attachments similarly to normal attachments [0.04ms]475✓ renderSlackMessageContent > deduplicates repeated forwarded body content [0.03ms]476✓ renderSlackMessageContent > handles cyclic forwarded attachments without infinite recursion [0.02ms]477✓ renderSlackMessageContent > does not treat link unfurl as forwarded message [0.02ms]478✓ renderSlackMessageContent > combines blocks and non-shared attachments [0.01ms]479480test/later.test.ts:481✓ fetchLaterItems > returns counts only when countsOnly is true [0.41ms]482✓ fetchLaterItems > filters to message items only [0.44ms]483✓ fetchLaterItems > filters by state [0.06ms]484✓ fetchLaterItems > state 'all' returns all items [0.03ms]485✓ fetchLaterItems > respects limit [0.03ms]486✓ fetchLaterItems > hydrates message content [0.05ms]487✓ fetchLaterItems > resolves DM user display names [0.04ms]488✓ fetchLaterItems > truncates long message content [0.04ms]489✓ updateLaterMark > sends mark=completed via multipart [0.05ms]490✓ updateLaterMark > sends mark=archived via multipart [0.02ms]491✓ updateLaterMark > sends mark=uncompleted via multipart [0.01ms]492✓ updateLaterMark > sends mark=unarchived via multipart [0.02ms]493✓ saveLater > calls saved.add with correct params [0.03ms]494✓ removeLater > calls saved.delete with correct params [0.03ms]495✓ setLaterReminder > calls saved.update via multipart with date_due [0.04ms]496✓ parseReminderDuration > parses minutes [0.14ms]497✓ parseReminderDuration > parses hours [0.02ms]498✓ parseReminderDuration > parses fractional hours [0.02ms]499✓ parseReminderDuration > parses days [0.01ms]500✓ parseReminderDuration > parses 'tomorrow' as next day 9 AM [0.04ms]501✓ parseReminderDuration > parses day names [0.01ms]502✓ parseReminderDuration > passes through unix timestamps503✓ parseReminderDuration > supports verbose unit names [0.01ms]504✓ parseReminderDuration > throws on invalid input [0.03ms]505506test/drafts.test.ts:507✓ padDraftTs > pads short fractional parts to 7 digits508✓ padDraftTs > leaves 7-digit fractional parts unchanged509✓ padDraftTs > leaves timestamps without a fractional part unchanged510✓ draftTextToBlocks > wraps plain text in a rich_text section [0.02ms]511✓ draftTextToBlocks > converts bullet lists to rich_text lists [0.02ms]512✓ parseDraftRecord > parses a raw draft into a compact shape [0.05ms]513✓ parseDraftRecord > returns null for records without an id514✓ listDrafts > requests active drafts and parses the result [0.07ms]515✓ listDrafts > omits is_active when activeOnly is false [0.02ms]516✓ createDraft > sends blocks, destination, and composer flag [0.05ms]517✓ createDraft > omits thread fields for channel drafts [0.15ms]518✓ createDraft > includes file_ids on the wire when fileIds is supplied [0.10ms]519✓ updateDraft > sends draft_id and a padded last-updated ts [0.12ms]520✓ deleteDraft > deletes with an explicit last-updated ts [0.07ms]521✓ deleteDraft > fetches the last-updated ts from drafts.list when omitted [0.09ms]522✓ deleteDraft > throws when the draft does not exist [0.04ms]523✓ findDraft > lists all drafts (including inactive) and finds by id [0.06ms]524✓ findDraft > prefers a matching record that has last_updated_ts over a malformed duplicate [0.06ms]525526test/search-files.test.ts:527Warning: skipping file F1: Failed to download file (404)528✓ searchFilesViaSearchApi > skips failed downloads and keeps later successful matches [2.40ms]529Warning: skipping file F1: Failed to download file (404)530✓ searchFilesInChannelsFallback > continues after a failed download in files.list results [3.66ms]531✓ SlackApiClient browser API guards > fails fast on rate-limit retry windows by default [1.10ms]532✓ SlackApiClient browser API guards > surfaces request timeouts with the Slack method name [0.24ms]533534test/error-message.test.ts:535✓ errorMessage > returns the message for a plain error [0.13ms]536✓ errorMessage > stringifies non-Error values [0.02ms]537✓ errorMessage > appends a single Error cause [0.03ms]538✓ errorMessage > appends AggregateError causes from a failed fetch through a dead proxy [0.05ms]539✓ errorMessage > walks multi-level cause chains [0.03ms]540✓ errorMessage > terminates on a self-referential cause instead of looping forever [0.01ms]541✓ errorMessage > terminates on a longer cause cycle [0.02ms]542✓ errorMessage > does not crash on a cause that cannot be stringified [0.04ms]543✓ errorMessage > does not crash on a non-Error thrown value that cannot be stringified [0.01ms]544✓ errorMessage > caps how far a long cause chain is walked [0.26ms]545✓ errorMessage > collapses a cause that merely restates its parent [0.03ms]546547test/canvas-create.test.ts:548✓ createCanvasFromMarkdown > sends Markdown content, title, and channel to canvases.create [0.29ms]549✓ createCanvasFromMarkdown > rejects empty Markdown before calling Slack [0.08ms]550✓ createCanvasFromMarkdown > rejects a success response without a canvas id [0.06ms]551✓ createCanvasFromMarkdown > uses Slack's Markdown canvas method with imported browser credentials [0.12ms]552✓ createCanvasFromMarkdown > rejects channel tabs with browser credentials before calling Slack [0.06ms]553✓ editCanvas > sends the documented replace change [0.29ms]554✓ editCanvas > sends the documented replace section change [0.02ms]555✓ editCanvas > sends the documented insert before change [0.01ms]556✓ editCanvas > sends the documented insert after change557✓ editCanvas > sends the documented insert at start change558✓ editCanvas > sends the documented insert at end change559✓ editCanvas > sends the documented delete section change560✓ editCanvas > sends the documented rename change561✓ editCanvas > rejects invalid combinations before calling Slack [0.23ms]562✓ editCanvas > rejects empty Markdown and canvas ids before calling Slack [0.07ms]563✓ editCanvas > rejects Markdown over Slack's per-change limit before calling Slack [6.10ms]564✓ readCanvasMarkdownInput > reads a Markdown file without changing its contents [1.70ms]565✓ readCanvasMarkdownInput > accepts a Markdown blob [0.10ms]566✓ readCanvasMarkdownInput > requires exactly one source [0.11ms]567✓ readCanvasMarkdownInput > rejects an empty source [0.04ms]568✓ canvas create command > creates from an inline blob in the selected workspace [0.85ms]569✓ canvas create command > creates from a file and resolves a channel tab [2.57ms]570✓ canvas create command > rejects browser-auth channel tabs before resolving the channel [0.51ms]571✓ canvas create command > rejects missing or conflicting sources before authenticating [0.69ms]572✓ canvas edit command > replaces a canvas from a Markdown URL target [0.79ms]573✓ canvas edit command > inserts content from a file and passes a section id [2.04ms]574✓ canvas edit command > renames without a Markdown source [0.28ms]575✓ canvas edit command > rejects delete content and malformed inputs before authenticating [0.19ms]576✓ canvas edit command > rejects browser credentials before calling canvases.edit [0.10ms]577578 399 pass579 0 fail580 817 expect() calls581Ran 399 tests across 38 files. [702.00ms]fixupPhase
582checking for references to /nix/var/nix/builds/nix-56196-3980350766/ in /nix/store/x91bfwd0hkd9s00wmq3b64qnlsgy322l-agent-slack-0.10.2...583patching script interpreter paths in /nix/store/x91bfwd0hkd9s00wmq3b64qnlsgy322l-agent-slack-0.10.2installCheckPhase
584Executing versionCheckPhase585Successfully managed to find version 0.10.2 in the output of the command /nix/store/x91bfwd0hkd9s00wmq3b64qnlsgy322l-agent-slack-0.10.2/bin/agent-slack --version5860.10.2587Finished versionCheckPhase588no Makefile or custom installCheckPhase, doing nothing