nixbot

builds

succeeded agent-slack-0.10.2 checks.aarch64-linux.pkgs-agent-slack · build #9326 · raw

1elastic-arm-23d67df9: building dxr3x948iygagv3wk5rxx1fs97bl55ym-agent-slack-0.10.2.drv2Using versionCheckHook
unpackPhase
3unpacking source archive /nix/store/cgqwcm1zgrhk5gmlmpjpi0rc8f2zg5kh-source4source root is source
bunSetInstallCacheDirPhase
5Using bun root: "/build/source"
bunPatchPhase
6patching script interpreter paths in .7./scripts/update-nix-sources.sh: interpreter directive changed from "#!/usr/bin/env bash" to "/nix/store/czx7cscpnqqmc9nwmbpnv2zcvck64mmf-bash-5.3p20/bin/bash"8./scripts/install-skill.sh: interpreter directive changed from "#!/usr/bin/env bash" to "/nix/store/czx7cscpnqqmc9nwmbpnv2zcvck64mmf-bash-5.3p20/bin/bash"9./scripts/release.sh: interpreter directive changed from "#!/bin/sh" to "/nix/store/czx7cscpnqqmc9nwmbpnv2zcvck64mmf-bash-5.3p20/bin/sh"
configurePhase
10no configure script, doing nothing
bunNodeModulesInstallPhase
11/build/source /build/source12bun install flags: --linker=isolated --ignore-scripts13bun install v1.4.2 (744846f84)1415+ @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.6313268 packages installed [310.00ms]33/build/source
buildPhase
34Bundled 360 modules in 49ms3536 agent-slack.js 1.98 MB (entry point)37
checkPhase
38bun test v1.4.2 (744846f84)3940test/leveldb-reader.test.ts:41✓ leveldb-reader > readChromiumLevelDB > returns empty array for non-existent directory [4.00ms]42✓ leveldb-reader > readChromiumLevelDB > returns empty array for empty directory [1.34ms]43✓ leveldb-reader > readChromiumLevelDB > reads entries from SSTable files [4.59ms]44✓ leveldb-reader > readChromiumLevelDB > reads entries from log files [2.42ms]45✓ leveldb-reader > readChromiumLevelDB > reads from both SSTable and log files [2.35ms]46✓ leveldb-reader > readChromiumLevelDB > handles .sst file extension [0.72ms]47✓ leveldb-reader > findKeysContaining > filters entries by key substring [1.90ms]48✓ leveldb-reader > findKeysContaining > returns empty array when no matches [3.01ms]49✓ leveldb-reader > edge cases > handles invalid SSTable (wrong magic) [0.72ms]50✓ leveldb-reader > edge cases > handles empty SSTable file [0.56ms]51✓ leveldb-reader > edge cases > handles SSTable smaller than footer size [0.67ms]5253test/messages.test.ts:54✓ fetchThread > returns the thread root and replies in chronological order [3.39ms]5556test/desktop-auth-paths.test.ts:57✓ Windows Store Slack package detection > matches known Microsoft Store package identifiers [0.07ms]58✓ Windows Store Slack package detection > does not match unrelated packages [0.03ms]5960test/search-command.test.ts:61✓ search referenced users > searchSlack returns shared referenced_users while preserving canonical ids [15.25ms]62✓ search referenced users > search command forwards --refresh-users and bypasses cached user lookups [11.18ms]6364test/help-contracts.test.ts:65✓ agent-facing help contracts > message send documents non-obvious formatting and scheduling behavior [4.08ms]66✓ agent-facing help contracts > message compose identifies its CI send behavior [1.70ms]67✓ agent-facing help contracts > Slack-native drafts document DM targeting and inherited-broadcast controls [2.11ms]68✓ agent-facing help contracts > scheduled cancellation identifies its required channel [0.95ms]69✓ agent-facing help contracts > Later reminders identify named-day timezone behavior [0.86ms]70✓ agent-facing help contracts > canvas creation identifies source and credential constraints [1.13ms]71✓ agent-facing help contracts > canvas editing identifies operations, targeting, and content constraints [1.00ms]72✓ agent-facing help contracts > channel mark distinguishes URL and non-URL workspace handling [0.67ms]73✓ agent-facing help contracts > DM help states Slack's group size limit [0.59ms]7475test/user-cache.test.ts:76✓ user-cache helpers > collectReferencedUserIds excludes reaction users by default [0.12ms]77✓ user-cache helpers > collectReferencedUserIds includes reaction users when enabled [0.08ms]78✓ user-cache helpers > toReferencedUsers returns only resolved users keyed by id [0.08ms]7980test/url.test.ts:81✓ parseSlackMessageUrl > parses archives URL with p<digits> [2.16ms]82✓ parseSlackMessageUrl > captures thread_ts from query when present [0.57ms]83✓ buildSlackMessageUrl > builds a permalink for a root message [0.66ms]84✓ buildSlackMessageUrl > includes thread metadata for replies [0.10ms]8586test/message-draft-actions.test.ts:87✓ createDraftAction > creates a draft addressed to a channel id [5.36ms]88✓ createDraftAction > rejects --broadcast without a thread [0.48ms]89✓ createDraftAction > rejects --broadcast for a DM (user) target [0.22ms]90✓ createDraftAction > rejects --broadcast for a D... channel-id (DM) target [0.20ms]91✓ createDraftAction > rejects --broadcast on a channel name with no thread before any network call [0.13ms]92✓ createDraftAction > rejects --broadcast on a DM message URL before fetching the message [0.13ms]93✓ createDraftAction > uploads --attach files and wires their file ids into the draft [4.90ms]94✓ createDraftAction > aborts before any upload or drafts.create when an --attach path is missing [1.00ms]95✓ updateDraftAction > text-only edit preserves destination, thread, broadcast, and file ids [1.50ms]96✓ updateDraftAction > re-addressing a broadcast thread draft to a non-thread channel clears broadcast instead of erroring [0.32ms]97✓ updateDraftAction > explicit --broadcast on a non-thread draft still errors [0.29ms]98✓ updateDraftAction > refuses to update a scheduled draft rather than clearing its schedule [0.56ms]99✓ updateDraftAction > refuses a text-only update on a multi-destination draft, but allows re-addressing [0.43ms]100✓ updateDraftAction > re-addressing to a different thread does not inherit the old broadcast flag [0.23ms]101✓ updateDraftAction > --no-broadcast clears an inherited broadcast flag on a same-thread edit [0.17ms]102✓ updateDraftAction > rejects --broadcast when re-addressing to a DM (user) target [0.15ms]103✓ updateDraftAction > changing only --thread-ts (no --channel) does not inherit the old broadcast flag [0.17ms]104✓ updateDraftAction > rejects --broadcast on an existing DM-destination draft [0.19ms]105✓ updateDraftAction > rejects --broadcast when re-addressing to a channel name with no thread, before resolving it [0.21ms]106✓ updateDraftAction > merges --attach file ids into the draft's existing file_ids [1.53ms]107✓ updateDraftAction > merges --attach while de-duplicating ids already on the draft [2.07ms]108✓ deleteDraftAction > auto-fetches and pads last_updated_ts when omitted [0.61ms]109✓ listDraftsAction > hydrates channel display names [1.10ms]110{111 "ok": true,112 "draft": {113 "id": "Dr123",114 "destinations": [115 {116 "channel_id": "C11111111",117 "thread_ts": "1700000000.100000"118 }119 ]120 }121}122✓ message draft update (commander --broadcast wiring) > omitting broadcast flags does not force broadcast on (no Commander default-true gotcha) [4.57ms]123{124 "ok": true,125 "draft": {126 "id": "Dr123",127 "destinations": [128 {129 "channel_id": "C11111111",130 "thread_ts": "1700000000.100000",131 "broadcast": true132 }133 ]134 }135}136✓ message draft update (commander --broadcast wiring) > --broadcast sets broadcast true [1.02ms]137{138 "ok": true,139 "draft": {140 "id": "Dr123",141 "destinations": [142 {143 "channel_id": "C11111111",144 "thread_ts": "1700000000.100000"145 }146 ]147 }148}149✓ message draft update (commander --broadcast wiring) > --no-broadcast clears an inherited broadcast flag [5.32ms]150{151 "ok": true,152 "draft": {153 "id": "DrNew",154 "destinations": [155 {156 "channel_id": "C11111111"157 }158 ]159 }160}161✓ message draft create (commander --attach wiring) > collects repeatable --attach flags into an array [14.75ms]162✓ message draft unknown subcommand > old `message draft <target>` usage points to `message compose` [1.46ms]163✓ draft attachments: orphan prevention across auth-retry and failed drafts > #2 create: a drafts.create auth failure retries work WITHOUT re-uploading files [4.71ms]164✓ draft attachments: orphan prevention across auth-retry and failed drafts > #2 update: a drafts.update auth failure retries work WITHOUT re-uploading files [2.70ms]165✓ draft attachments: orphan prevention across auth-retry and failed drafts > #3 create: a non-auth drafts.create failure deletes the uploaded file [3.03ms]166✓ draft attachments: orphan prevention across auth-retry and failed drafts > #3 update: a stale drafts.update failure deletes the newly uploaded file only [2.28ms]167✓ draft attachments: orphan prevention across auth-retry and failed drafts > a failed draft with no attachments does not attempt files.delete [0.44ms]168169test/users.test.ts:170✓ resolveUserId > returns user ids unchanged [0.45ms]171✓ resolveUserId > returns W-prefixed user ids unchanged [0.10ms]172✓ resolveUserId > resolves @handle via users.list [0.28ms]173✓ resolveUserId > resolves email via users.lookupByEmail [0.16ms]174✓ resolveUserId > resolves @handle case-insensitively [0.44ms]175✓ resolveUserId > falls back to users.list when lookupByEmail is unavailable [0.27ms]176177test/update.test.ts:178✓ compareSemver > equal versions return 0 [0.14ms]179✓ compareSemver > strips v prefix [0.04ms]180✓ compareSemver > newer major [0.03ms]181✓ compareSemver > newer minor [0.02ms]182✓ compareSemver > newer patch [0.03ms]183✓ compareSemver > older version returns negative [0.02ms]184✓ compareSemver > handles 0.x versions [0.04ms]185186test/compact-json.test.ts:187✓ pruneEmpty > drops null/undefined/empty containers [0.29ms]188189test/message-send.test.ts:190✓ sendMessage > posts a normal message when no attachments are passed [2.16ms]191✓ sendMessage > --no-unfurl disables link and media previews for immediate sends [0.26ms]192✓ sendMessage > opens and sends to a DM for a W-prefixed user target [0.40ms]193✓ sendMessage > returns a permalink when the workspace was resolved implicitly [0.18ms]194✓ sendMessage > threaded reply returns thread_ts distinct from ts [0.16ms]195✓ sendMessage > --reply-broadcast with --thread-ts sends reply_broadcast: true [0.23ms]196✓ sendMessage > --reply-broadcast omits the field from chat.postMessage when flag is absent [0.19ms]197✓ sendMessage > --reply-broadcast without --thread-ts throws [0.25ms]198✓ sendMessage > --reply-broadcast on a URL target broadcasts using the message's derived thread_ts [1.06ms]199✓ sendMessage > --reply-broadcast on a DM target throws (broadcasting is not meaningful for DMs) [0.24ms]200✓ sendMessage > --reply-broadcast works alongside --blocks payload [3.19ms]201✓ sendMessage > uploads attachment and uses message text as initial comment [2.28ms]202✓ sendMessage > --no-unfurl cannot be combined with file attachments [0.30ms]203✓ sendMessage > sends initial comment only for the first attachment [2.58ms]204✓ sendMessage > uploads attachment without text when text is empty [3.00ms]205✓ sendMessage > --blocks: reads Block Kit JSON from file and passes through unchanged [1.70ms]206✓ sendMessage > --blocks: errors when JSON is not an array [1.21ms]207✓ sendMessage > --blocks: errors on malformed JSON [1.82ms]208✓ sendMessage > --blocks: overrides markdown-to-rich-text conversion when text is also provided [1.09ms]209✓ sendMessage > sends Slack manual links in lists as rich-text link blocks [0.69ms]210✓ sendMessage > --blocks: errors when an array element is not an object [2.45ms]211✓ sendMessage > --schedule sends through chat.scheduleMessage and returns scheduled metadata [1.53ms]212✓ sendMessage > --schedule-in computes a relative post_at [0.59ms]213✓ sendMessage > --no-unfurl disables link and media previews for scheduled sends [0.48ms]214✓ sendMessage > --schedule composes with blocks, thread replies, and reply broadcast [1.76ms]215✓ sendMessage > --schedule cannot be combined with file attachments [0.43ms]216✓ composeMessage > --no-unfurl disables link and media previews when CI sends immediately [1.23ms]217✓ composeMessage > keeps Slack's default preview behavior for a standard CI send [0.32ms]218✓ composeMessage > --no-unfurl disables previews for a URL target when CI sends immediately [1.99ms]219✓ scheduled message management > lists scheduled messages and forwards channel filters [0.99ms]220✓ scheduled message management > cancels scheduled messages with the required channel id [0.61ms]221✓ scheduled message time parsing > parses absolute ISO timestamps with explicit timezones [0.17ms]222✓ scheduled message time parsing > parses named relative times like monday 9am [16.68ms]223✓ scheduled message time parsing > rejects schedule times beyond Slack's 120 day limit [0.16ms]224✓ editMessage > edits a normal text message without blocks [0.75ms]225✓ editMessage > edits literal angle bracket text without blocks [0.21ms]226✓ editMessage > edits a message URL with a link label without blocks [0.29ms]227✓ editMessage > edits an inline mailto link without escaping it [0.19ms]228✓ editMessage > edits an inline usergroup mention without escaping it [0.18ms]229✓ editMessage > edits a channel target with inline formatting without blocks [0.17ms]230✓ editMessage > edits a channel target with rich text blocks when text contains a list [0.25ms]231✓ editMessage > edits a normal message without blocks when no --blocks file is passed [0.20ms]232✓ editMessage > edits a message URL with Block Kit JSON from file [1.06ms]233✓ editMessage > edits a channel target with --ts and Block Kit JSON from file [0.84ms]234235test/search-files.test.ts:236Warning: skipping file F1: Failed to download file (404)237✓ searchFilesViaSearchApi > skips failed downloads and keeps later successful matches [6.04ms]238Warning: skipping file F1: Failed to download file (404)239✓ searchFilesInChannelsFallback > continues after a failed download in files.list results [3.96ms]240✓ SlackApiClient browser API guards > fails fast on rate-limit retry windows by default [2.40ms]241✓ SlackApiClient browser API guards > surfaces request timeouts with the Slack method name [0.87ms]242243test/message-reaction-filters.test.ts:244✓ parseReactionFilters > normalizes shortcodes, names, and unicode [0.76ms]245✓ parseReactionFilters > returns empty array when unset [0.04ms]246✓ passesReactionNameFilters > matches when required reaction is present [0.21ms]247✓ passesReactionNameFilters > does not match when required reaction is missing [0.06ms]248✓ passesReactionNameFilters > does not match when excluded reaction is present [0.08ms]249✓ passesReactionNameFilters > matches when excluded reaction is absent [0.04ms]250✓ passesReactionNameFilters > supports with + without together [0.04ms]251✓ requireOldestWhenReactionFiltersUsed > returns oldest when no reaction filters are used [0.08ms]252✓ requireOldestWhenReactionFiltersUsed > returns trimmed oldest when reaction filters are used [0.03ms]253✓ requireOldestWhenReactionFiltersUsed > throws when reaction filters are used without oldest [0.07ms]254255test/drafts.test.ts:256✓ padDraftTs > pads short fractional parts to 7 digits [0.03ms]257✓ padDraftTs > leaves 7-digit fractional parts unchanged [0.02ms]258✓ padDraftTs > leaves timestamps without a fractional part unchanged [0.02ms]259✓ draftTextToBlocks > wraps plain text in a rich_text section [0.12ms]260✓ draftTextToBlocks > converts bullet lists to rich_text lists [0.09ms]261✓ parseDraftRecord > parses a raw draft into a compact shape [0.47ms]262✓ parseDraftRecord > returns null for records without an id [0.04ms]263✓ listDrafts > requests active drafts and parses the result [0.29ms]264✓ listDrafts > omits is_active when activeOnly is false [0.11ms]265✓ createDraft > sends blocks, destination, and composer flag [0.22ms]266✓ createDraft > omits thread fields for channel drafts [0.12ms]267✓ createDraft > includes file_ids on the wire when fileIds is supplied [0.12ms]268✓ updateDraft > sends draft_id and a padded last-updated ts [0.17ms]269✓ deleteDraft > deletes with an explicit last-updated ts [0.12ms]270✓ deleteDraft > fetches the last-updated ts from drafts.list when omitted [0.17ms]271✓ deleteDraft > throws when the draft does not exist [0.08ms]272✓ findDraft > lists all drafts (including inactive) and finds by id [0.14ms]273✓ findDraft > prefers a matching record that has last_updated_ts over a malformed duplicate [0.14ms]274275test/rich-text.test.ts:276✓ parseInlineElements > plain text returns single text element [0.04ms]277✓ parseInlineElements > *bold* is parsed with bold style [0.06ms]278✓ parseInlineElements > _italic_ is parsed with italic style [0.04ms]279✓ parseInlineElements > ~strike~ is parsed with strike style [0.03ms]280✓ parseInlineElements > `code` is parsed with code style [0.04ms]281✓ parseInlineElements > :emoji: shortcode is parsed as an emoji element [0.03ms]282✓ parseInlineElements > emoji names with underscores are not parsed as italic text [0.03ms]283✓ parseInlineElements > time-like colon text is not parsed as an emoji element [0.03ms]284✓ parseInlineElements > <url|label> is parsed as link with text [0.03ms]285✓ parseInlineElements > <url> is parsed as link without text [0.03ms]286✓ parseInlineElements > <mailto|label> is parsed as link with text [0.03ms]287✓ parseInlineElements > non-url angle bracket text is preserved as text [0.05ms]288✓ parseInlineElements > non-url labeled angle bracket text is preserved as text [0.04ms]289✓ parseInlineElements > channel mention tokens are parsed as channel elements [0.03ms]290✓ parseInlineElements > bare channel mention tokens are parsed as channel elements [0.02ms]291✓ parseInlineElements > usergroup mention tokens are parsed as usergroup elements [0.03ms]292✓ textToRichTextBlocks > plain text returns null [0.03ms]293✓ textToRichTextBlocks > inline-only formatting returns null by default [0.06ms]294✓ textToRichTextBlocks > non-url angle bracket text does not trigger rich text blocks [0.05ms]295✓ textToRichTextBlocks > mixed non-url angle bracket text and formatting preserves brackets [0.06ms]296✓ textToRichTextBlocks > inline-only formatting can produce rich text blocks [0.05ms]297✓ textToRichTextBlocks > mailto links can produce rich text blocks when inline formatting is included [0.04ms]298✓ textToRichTextBlocks > channel mentions can produce rich text blocks when inline formatting is included [0.05ms]299✓ textToRichTextBlocks > bullet list with - prefix [0.10ms]300✓ textToRichTextBlocks > bullet list with bullet character [0.50ms]301✓ textToRichTextBlocks > sub-bullets with indentation [0.11ms]302✓ textToRichTextBlocks > white bullet sub-bullets under bullet [0.06ms]303✓ textToRichTextBlocks > mixed text and bullets [0.05ms]304✓ textToRichTextBlocks > numbered list [0.10ms]305✓ textToRichTextBlocks > bold text in list items is parsed [0.07ms]306✓ textToRichTextBlocks > emoji and channel references in list items are parsed [0.09ms]307✓ textToRichTextBlocks > Slack manual links and CommonMark links remain distinct in list items [0.08ms]308✓ textToRichTextBlocks > code block is preserved [0.06ms]309✓ textToRichTextBlocks > blockquote is preserved [0.06ms]310311test/channel-admin.test.ts:312✓ parseInviteUsersCsv > splits comma-separated values, trims whitespace, and deduplicates [0.13ms]313✓ parseInviteUsersCsv > returns empty array when input has no values [0.03ms]314✓ splitEmailsFromInviteTargets > separates email targets from non-email targets [0.14ms]315✓ splitEmailsFromInviteTargets > deduplicates emails [0.03ms]316317test/upload.test.ts:318✓ uploadFilesForDraft > never shifts ids between files when the completion response omits one [1.91ms]319✓ uploadFilesForDraft > falls back to staged ids when the completion response length disagrees [1.41ms]320✓ uploadFilesForDraft > stages every file, then completes them in one call with no channel binding [1.43ms]321✓ uploadFilesForDraft > a later staging failure leaves nothing completed (no orphaned files) [1.41ms]322✓ uploadFilesForDraft > throws and completes nothing when a path does not exist [0.69ms]323✓ uploadFilesForDraft > throws and completes nothing when a byte POST fails [1.21ms]324✓ uploadFilesForDraft > throws when files.completeUploadExternal fails [1.02ms]325✓ uploadFilesForDraft > throws when the path is a directory [0.86ms]326✓ uploadLocalFileToSlack (shared-helper regression) > still binds the completed file to a channel with an initial comment [1.23ms]327328test/message-compact.test.ts:329✓ toCompactMessage > includes file with path on successful download [0.21ms]330✓ toCompactMessage > includes file with error on failed download [0.09ms]331✓ toCompactMessage > excludes files with no downloadedPaths entry [0.07ms]332✓ toCompactMessage > mixes successful and failed downloads [0.09ms]333✓ toCompactMessage > failed download preserves file metadata for content-type filtering [0.08ms]334✓ passesContentTypeFilter with failed downloads > image message with failed download still passes image filter [0.09ms]335✓ passesContentTypeFilter with failed downloads > snippet message with failed download still passes snippet filter [0.10ms]336✓ passesContentTypeFilter with failed downloads > message without download entry has no files and passes text filter [0.07ms]337✓ toCompactMessage filename preservation > does not fall back to title when name is missing [0.08ms]338339test/reactions.test.ts:340✓ reactions compaction > includes reactions only when enabled [0.34ms]341✓ reactions compaction > preserves W-prefixed user IDs while compacting reactions [0.09ms]342✓ reactions compaction > adds forwarded thread metadata for shared messages with thread_ts [0.37ms]343344test/channels.test.ts:345✓ conversations list helpers > listUserConversations calls users.conversations with defaults [0.38ms]346✓ conversations list helpers > listUserConversations forwards user/limit/cursor [0.12ms]347✓ conversations list helpers > listAllConversations calls conversations.list with defaults [0.18ms]348✓ conversations list helpers > listAllConversations forwards limit/cursor [0.09ms]349✓ conversations list helpers > listUserConversations passes through small limits [0.08ms]350✓ conversations list helpers > listUserConversations clamps high limits to 1000 [0.08ms]351✓ conversations list helpers > normalizeConversationsPage extracts channels and next cursor [0.04ms]352✓ conversations list helpers > normalizeConversationsPage handles missing response_metadata [0.03ms]353✓ conversations list helpers > normalizeConversationsPage handles empty next_cursor [0.02ms]354✓ conversations list helpers > listConversationsViaCounts enumerates channels/mpims/ims and enriches via conversations.info [0.65ms]355✓ conversations list helpers > listConversationsViaCounts keeps the id when conversations.info fails [0.20ms]356✓ conversations list helpers > listConversationsViaCounts slices to limit and skips entries without an id [0.22ms]357358test/files.test.ts:359✓ downloadSlackFile > downloads file and writes to disk [1.44ms]360✓ downloadSlackFile > returns cached path when file already exists [0.89ms]361✓ downloadSlackFile > throws SlackDownloadError on HTTP 404 [0.60ms]362✓ downloadSlackFile > throws SlackDownloadError with httpStatus on HTTP error [0.61ms]363✓ downloadSlackFile > throws SlackDownloadError on HTML auth page [0.57ms]364✓ downloadSlackFile > throws SlackDownloadError on network error [0.85ms]365✓ downloadSlackFile > throws SlackDownloadError when reading html body fails [0.87ms]366✓ downloadSlackFile > throws SlackDownloadError when reading binary body fails [0.74ms]367✓ tryDownloadSlackFile > returns ok result on success [1.07ms]368✓ tryDownloadSlackFile > returns failure result on HTTP 404 [0.59ms]369✓ tryDownloadSlackFile > returns failure result on network error [0.64ms]370✓ tryDownloadSlackFile > propagates disk/write errors [0.73ms]371Warning: skipping file F1: Downloaded auth/login page instead of canvas content (token may be expired)372✓ downloadMessageFiles > records canvas auth failures as structured errors [5.01ms]373Warning: skipping file F2: Failed to download file (404)374✓ downloadMessageFiles > records non-canvas download failures with a local error path [1.44ms]375376test/user-id.test.ts:377✓ isUserId > accepts U-prefixed and W-prefixed Slack user IDs [0.03ms]378✓ isUserId > preserves the existing length and character restrictions [0.05ms]379380test/error-message.test.ts:381✓ errorMessage > returns the message for a plain error [0.14ms]382✓ errorMessage > stringifies non-Error values [0.05ms]383✓ errorMessage > appends a single Error cause [0.05ms]384✓ errorMessage > appends AggregateError causes from a failed fetch through a dead proxy [0.08ms]385✓ errorMessage > walks multi-level cause chains [0.05ms]386✓ errorMessage > terminates on a self-referential cause instead of looping forever [0.03ms]387✓ errorMessage > terminates on a longer cause cycle [0.03ms]388✓ errorMessage > does not crash on a cause that cannot be stringified [0.05ms]389✓ errorMessage > does not crash on a non-Error thrown value that cannot be stringified [0.03ms]390✓ errorMessage > caps how far a long cause chain is walked [0.22ms]391✓ errorMessage > collapses a cause that merely restates its parent [0.07ms]392393test/search-query.test.ts:394✓ W-prefixed user IDs in search > resolves a W-prefixed user ID to a from filter [0.40ms]395✓ W-prefixed user IDs in search > returns a W-prefixed user ID without scanning users [0.24ms]396397test/emoji.test.ts:398✓ normalizeSlackReactionName > accepts :shortcode: [0.03ms]399✓ normalizeSlackReactionName > accepts raw names [0.03ms]400✓ normalizeSlackReactionName > accepts unicode emoji [0.05ms]401402test/parse-limit.test.ts:403✓ parseLimit > returns undefined when no value given [0.06ms]404✓ parseLimit > parses valid positive integers [0.04ms]405✓ parseLimit > rejects non-numeric strings [0.04ms]406✓ parseLimit > rejects zero [0.03ms]407✓ parseLimit > rejects negative numbers [0.03ms]408✓ parseLimit > rejects floats (uses integer part) [0.01ms]409✓ requireMessageTs > returns trimmed ts when present [0.02ms]410✓ requireMessageTs > throws when missing [0.03ms]411✓ requireMessageTs > throws when blank [0.02ms]412413test/workspace-selector.test.ts:414✓ resolveWorkspaceSelector > matches exact URL [0.32ms]415✓ resolveWorkspaceSelector > matches unique substring by host/team [0.22ms]416✓ resolveWorkspaceSelector > matches unique substring by workspace name [0.05ms]417✓ resolveWorkspaceSelector > returns ambiguity when selector matches multiple workspaces [0.08ms]418✓ resolveWorkspaceSelector > returns no match when selector does not match [0.09ms]419420test/mrkdwn.test.ts:421✓ slackMrkdwnToMarkdown > converts Slack-style links [0.08ms]422✓ slackMrkdwnToMarkdown > converts user and channel mentions [0.06ms]423✓ slackMrkdwnToMarkdown > converts :emoji: shortcodes to unicode [0.18ms]424425test/targets.test.ts:426✓ parseMsgTarget > parses slack message URLs [0.08ms]427✓ parseMsgTarget > accepts #channel [0.06ms]428✓ parseMsgTarget > accepts bare channel names [0.05ms]429✓ parseMsgTarget > accepts channel IDs [0.05ms]430✓ parseMsgTarget > accepts user IDs as DM targets [0.06ms]431✓ parseMsgTarget > accepts W-prefixed user IDs as DM targets [0.04ms]432✓ parseMsgTarget > accepts user IDs with leading/trailing whitespace [0.04ms]433✓ parseMsgTarget > does not treat short U-prefixed strings as user IDs [0.03ms]434✓ parseMsgTarget > does not treat short W-prefixed strings as user IDs [0.03ms]435436test/render.test.ts:437✓ renderSlackMessageContent > prefers blocks [0.16ms]438✓ renderSlackMessageContent > preserves usergroup and broadcast elements from rich text [0.22ms]439✓ renderSlackMessageContent > omits malformed usergroup and broadcast elements [0.16ms]440✓ renderSlackMessageContent > falls back to attachments when text is empty [0.11ms]441✓ renderSlackMessageContent > includes section fields and button URLs [0.12ms]442✓ renderSlackMessageContent > includes attachment fields [0.11ms]443✓ renderSlackMessageContent > renders forwarded message with author and source link [0.33ms]444✓ renderSlackMessageContent > renders forwarded message with author name only [0.11ms]445✓ renderSlackMessageContent > renders forwarded message with no author [0.11ms]446✓ renderSlackMessageContent > includes forwarded file links in quoted forwarded body [0.12ms]447✓ renderSlackMessageContent > renders nested forwarded attachments similarly to normal attachments [0.11ms]448✓ renderSlackMessageContent > deduplicates repeated forwarded body content [0.09ms]449✓ renderSlackMessageContent > handles cyclic forwarded attachments without infinite recursion [0.08ms]450✓ renderSlackMessageContent > does not treat link unfurl as forwarded message [0.16ms]451✓ renderSlackMessageContent > combines blocks and non-shared attachments [0.15ms]452453test/canvas-create.test.ts:454✓ createCanvasFromMarkdown > sends Markdown content, title, and channel to canvases.create [0.46ms]455✓ createCanvasFromMarkdown > rejects empty Markdown before calling Slack [0.14ms]456✓ createCanvasFromMarkdown > rejects a success response without a canvas id [0.10ms]457✓ createCanvasFromMarkdown > uses Slack's Markdown canvas method with imported browser credentials [0.12ms]458✓ createCanvasFromMarkdown > rejects channel tabs with browser credentials before calling Slack [0.10ms]459✓ editCanvas > sends the documented replace change [0.48ms]460✓ editCanvas > sends the documented replace section change [0.03ms]461✓ editCanvas > sends the documented insert before change [0.02ms]462✓ editCanvas > sends the documented insert after change [0.01ms]463✓ editCanvas > sends the documented insert at start change [0.01ms]464✓ editCanvas > sends the documented insert at end change [0.02ms]465✓ editCanvas > sends the documented delete section change [0.01ms]466✓ editCanvas > sends the documented rename change [0.02ms]467✓ editCanvas > rejects invalid combinations before calling Slack [0.35ms]468✓ editCanvas > rejects empty Markdown and canvas ids before calling Slack [0.23ms]469✓ editCanvas > rejects Markdown over Slack's per-change limit before calling Slack [7.03ms]470✓ readCanvasMarkdownInput > reads a Markdown file without changing its contents [1.58ms]471✓ readCanvasMarkdownInput > accepts a Markdown blob [0.14ms]472✓ readCanvasMarkdownInput > requires exactly one source [0.13ms]473✓ readCanvasMarkdownInput > rejects an empty source [0.08ms]474✓ canvas create command > creates from an inline blob in the selected workspace [1.52ms]475✓ canvas create command > creates from a file and resolves a channel tab [1.79ms]476✓ canvas create command > rejects browser-auth channel tabs before resolving the channel [0.75ms]477✓ canvas create command > rejects missing or conflicting sources before authenticating [0.68ms]478✓ canvas edit command > replaces a canvas from a Markdown URL target [1.37ms]479✓ canvas edit command > inserts content from a file and passes a section id [1.34ms]480✓ canvas edit command > renames without a Markdown source [0.66ms]481✓ canvas edit command > rejects delete content and malformed inputs before authenticating [0.73ms]482✓ canvas edit command > rejects browser credentials before calling canvases.edit [0.52ms]483484test/format-outbound.test.ts:485✓ formatOutboundSlackText > promotes bare user IDs to Slack mention tokens [0.07ms]486✓ formatOutboundSlackText > leaves already-formatted mention tokens alone [0.04ms]487✓ formatOutboundSlackText > leaves already-formatted usergroup mention tokens alone [0.02ms]488✓ formatOutboundSlackText > promotes broadcast mentions [0.04ms]489✓ formatOutboundSlackText > escapes bare < > & in literal text [0.02ms]490✓ formatOutboundSlackText > does not escape inside already-formatted Slack tokens [0.03ms]491✓ formatOutboundSlackText > does not promote email-like or mid-word @ [0.02ms]492✓ formatOutboundSlackText > handles empty input [0.02ms]493✓ formatOutboundSlackText > real-world CI dump stays readable with mention + URL [0.02ms]494495test/client.test.ts:496✓ SlackApiClient browser multipart transport > retries HTTP 429 responses using Retry-After [1.03ms]497498test/channel-command.test.ts:499✓ channel list command > defaults to users.conversations for current user [1.25ms]500✓ channel list command > with --user id uses users.conversations and sets user directly [0.50ms]501✓ channel list command > with --user handle resolves via users.list before users.conversations [0.59ms]502✓ channel list command > with --user unknown handle is a hard error [0.54ms]503✓ channel list command > with --all uses conversations.list [0.43ms]504✓ channel list command > forwards --limit and --cursor [0.44ms]505✓ channel list command > --all and --user is a hard error [2.11ms]506✓ channel list command > invalid --limit is a hard error [0.51ms]507✓ channel list command > help text documents single-page pagination model [0.27ms]508✓ channel mark command > URL target extracts workspace from URL [1.01ms]509✓ channel mark command > URL target rejects --workspace flag [0.58ms]510✓ channel mark command > channel target requires --ts [7.82ms]511✓ channel mark command > URL target allows --ts override [0.68ms]512✓ channel mark command > channel target with --ts calls conversations.mark [0.48ms]513514test/html-to-md.test.ts:515✓ htmlToMarkdown > converts basic HTML to markdown [9.97ms]516517test/safe-mode.test.ts:518✓ isSafeModeEnabled > enabled via CLI flag [0.16ms]519✓ isSafeModeEnabled > enabled for env value "1" [0.04ms]520✓ isSafeModeEnabled > enabled for env value "true"521✓ isSafeModeEnabled > enabled for env value "TRUE"522✓ isSafeModeEnabled > enabled for env value "yes"523✓ isSafeModeEnabled > enabled for env value "on"524✓ isSafeModeEnabled > enabled for env value " 1 "525✓ isSafeModeEnabled > disabled for env value "0" [0.03ms]526✓ isSafeModeEnabled > disabled for env value "false"527✓ isSafeModeEnabled > disabled for env value "off"528✓ isSafeModeEnabled > disabled for env value "no"529✓ isSafeModeEnabled > disabled for env value ""530✓ isSafeModeEnabled > disabled when env var is unset and flag is absent [0.03ms]531✓ safeModeBlockedError > names the blocked action [0.05ms]532✓ redirectSendToDraft > rejects unsupported send option {533 attach: [ "./report.md" ],534} [0.33ms]535✓ redirectSendToDraft > rejects unsupported send option {536 blocks: "/tmp/blocks.json",537} [0.03ms]538✓ redirectSendToDraft > rejects unsupported send option {539 schedule: "2030-01-01T00:00:00Z",540} [0.01ms]541✓ redirectSendToDraft > rejects unsupported send option {542 scheduleIn: "3h",543}544✓ redirectSendToDraft > rejects unsupported send option {545 replyBroadcast: true,546} [0.01ms]547✓ redirectSendToDraft > lists all unsupported flags at once [0.13ms]548✓ redirectSendToDraft > rejects in CI where no interactive editor is available [0.18ms]549⚠ Safe mode active: redirecting "message send" → draft editor. Nothing posts until a human sends it from the editor.550✓ redirectSendToDraft > opens a draft with the send text and thread context [0.27ms]551552test/later.test.ts:553✓ fetchLaterItems > returns counts only when countsOnly is true [0.62ms]554✓ fetchLaterItems > filters to message items only [0.71ms]555✓ fetchLaterItems > filters by state [0.32ms]556✓ fetchLaterItems > state 'all' returns all items [0.19ms]557✓ fetchLaterItems > respects limit [0.16ms]558✓ fetchLaterItems > hydrates message content [0.24ms]559✓ fetchLaterItems > resolves DM user display names [0.20ms]560✓ fetchLaterItems > truncates long message content [0.32ms]561✓ updateLaterMark > sends mark=completed via multipart [0.28ms]562✓ updateLaterMark > sends mark=archived via multipart [0.10ms]563✓ updateLaterMark > sends mark=uncompleted via multipart [0.09ms]564✓ updateLaterMark > sends mark=unarchived via multipart [0.08ms]565✓ saveLater > calls saved.add with correct params [0.14ms]566✓ removeLater > calls saved.delete with correct params [0.17ms]567✓ setLaterReminder > calls saved.update via multipart with date_due [0.17ms]568✓ parseReminderDuration > parses minutes [0.25ms]569✓ parseReminderDuration > parses hours [0.05ms]570✓ parseReminderDuration > parses fractional hours [0.03ms]571✓ parseReminderDuration > parses days [0.03ms]572✓ parseReminderDuration > parses 'tomorrow' as next day 9 AM [0.08ms]573✓ parseReminderDuration > parses day names [0.04ms]574✓ parseReminderDuration > passes through unix timestamps [0.02ms]575✓ parseReminderDuration > supports verbose unit names [0.04ms]576✓ parseReminderDuration > throws on invalid input [0.12ms]577578 399 pass579 0 fail580 817 expect() calls581Ran 399 tests across 38 files. [637.00ms]
fixupPhase
582shrinking RPATHs of ELF executables and libraries in /nix/store/2s23l3pj6cdsc54cvv2ljnb4as2nqwjx-agent-slack-0.10.2583checking for references to /build/ in /nix/store/2s23l3pj6cdsc54cvv2ljnb4as2nqwjx-agent-slack-0.10.2...584patching script interpreter paths in /nix/store/2s23l3pj6cdsc54cvv2ljnb4as2nqwjx-agent-slack-0.10.2
installCheckPhase
585Executing versionCheckPhase586Successfully managed to find version 0.10.2 in the output of the command /nix/store/2s23l3pj6cdsc54cvv2ljnb4as2nqwjx-agent-slack-0.10.2/bin/agent-slack --version5870.10.2588Finished versionCheckPhase589no Makefile or custom installCheckPhase, doing nothing