nixbot

builds

succeeded agent-slack-0.10.2 checks.aarch64-darwin.pkgs-agent-slack · build #4937 · raw

1Using versionCheckHook
unpackPhase
2unpacking source archive /nix/store/cgqwcm1zgrhk5gmlmpjpi0rc8f2zg5kh-source3source root is source
bunSetInstallCacheDirPhase
4Using bun root: "/nix/var/nix/builds/nix-64121-3890790268/source"
bunPatchPhase
5patching script interpreter paths in .6./scripts/install-skill.sh: interpreter directive changed from "#!/usr/bin/env bash" to "/nix/store/lb6nd0iyy9x0bm7yfx2fkw0wbjllg4ic-bash-5.3p15/bin/bash"7./scripts/update-nix-sources.sh: interpreter directive changed from "#!/usr/bin/env bash" to "/nix/store/lb6nd0iyy9x0bm7yfx2fkw0wbjllg4ic-bash-5.3p15/bin/bash"8./scripts/release.sh: interpreter directive changed from "#!/bin/sh" to "/nix/store/lb6nd0iyy9x0bm7yfx2fkw0wbjllg4ic-bash-5.3p15/bin/sh"
configurePhase
9no configure script, doing nothing
bunNodeModulesInstallPhase
10/nix/var/nix/builds/nix-64121-3890790268/source /nix/var/nix/builds/nix-64121-3890790268/source11bun install flags: --linker=isolated --backend=symlink --ignore-scripts12bun install v1.4.2 (744846f84)13 📦 Installing [67/67] 14+ @types/node@22.19.815+ @types/semver@7.7.116+ @types/turndown@5.0.617+ bun-types@1.3.918+ oxfmt@0.31.019+ oxlint@1.49.020+ semver@7.7.421+ simple-git-hooks@2.13.122+ typescript@5.9.323+ @slack/web-api@7.13.024+ commander@14.0.325+ hysnappy@1.1.026+ node-emoji@2.2.027+ turndown@7.2.228+ turndown-plugin-gfm@1.0.229+ zod@4.3.6303166 packages installed [561.00ms]32/nix/var/nix/builds/nix-64121-3890790268/source
buildPhase
33Bundled 360 modules in 70ms3435 agent-slack.js 1.98 MB (entry point)36
checkPhase
37bun test v1.4.2 (744846f84)3839test/users.test.ts:40 resolveUserId > returns user ids unchanged [3.71ms]41 resolveUserId > returns W-prefixed user ids unchanged [0.08ms]42 resolveUserId > resolves @handle via users.list [2.22ms]43 resolveUserId > resolves email via users.lookupByEmail [0.05ms]44 resolveUserId > resolves @handle case-insensitively [0.21ms]45 resolveUserId > falls back to users.list when lookupByEmail is unavailable [1.20ms]4647test/desktop-auth-paths.test.ts:48 Windows Store Slack package detection > matches known Microsoft Store package identifiers [0.04ms]49 Windows Store Slack package detection > does not match unrelated packages5051test/format-outbound.test.ts:52 formatOutboundSlackText > promotes bare user IDs to Slack mention tokens [1.79ms]53 formatOutboundSlackText > leaves already-formatted mention tokens alone [0.50ms]54 formatOutboundSlackText > leaves already-formatted usergroup mention tokens alone55 formatOutboundSlackText > promotes broadcast mentions56 formatOutboundSlackText > escapes bare < > & in literal text [0.01ms]57 formatOutboundSlackText > does not escape inside already-formatted Slack tokens [0.01ms]58 formatOutboundSlackText > does not promote email-like or mid-word @59 formatOutboundSlackText > handles empty input60 formatOutboundSlackText > real-world CI dump stays readable with mention + URL [0.20ms]6162test/leveldb-reader.test.ts:63 leveldb-reader > readChromiumLevelDB > returns empty array for non-existent directory [1.23ms]64 leveldb-reader > readChromiumLevelDB > returns empty array for empty directory [0.49ms]65 leveldb-reader > readChromiumLevelDB > reads entries from SSTable files [1.97ms]66 leveldb-reader > readChromiumLevelDB > reads entries from log files [1.21ms]67 leveldb-reader > readChromiumLevelDB > reads from both SSTable and log files [0.39ms]68 leveldb-reader > readChromiumLevelDB > handles .sst file extension [0.30ms]69 leveldb-reader > findKeysContaining > filters entries by key substring [0.34ms]70 leveldb-reader > findKeysContaining > returns empty array when no matches [0.24ms]71 leveldb-reader > edge cases > handles invalid SSTable (wrong magic) [0.18ms]72 leveldb-reader > edge cases > handles empty SSTable file [0.17ms]73 leveldb-reader > edge cases > handles SSTable smaller than footer size [0.17ms]7475test/messages.test.ts:76 fetchThread > returns the thread root and replies in chronological order [1.16ms]7778test/workspace-selector.test.ts:79 resolveWorkspaceSelector > matches exact URL [1.38ms]80 resolveWorkspaceSelector > matches unique substring by host/team [0.90ms]81 resolveWorkspaceSelector > matches unique substring by workspace name [0.01ms]82 resolveWorkspaceSelector > returns ambiguity when selector matches multiple workspaces [0.24ms]83 resolveWorkspaceSelector > returns no match when selector does not match [0.01ms]8485test/help-contracts.test.ts:86 agent-facing help contracts > message send documents non-obvious formatting and scheduling behavior [2.13ms]87 agent-facing help contracts > message compose identifies its CI send behavior [0.35ms]88 agent-facing help contracts > Slack-native drafts document DM targeting and inherited-broadcast controls [0.57ms]89 agent-facing help contracts > scheduled cancellation identifies its required channel [0.23ms]90 agent-facing help contracts > Later reminders identify named-day timezone behavior [0.12ms]91 agent-facing help contracts > canvas creation identifies source and credential constraints [0.11ms]92 agent-facing help contracts > canvas editing identifies operations, targeting, and content constraints [0.12ms]93 agent-facing help contracts > channel mark distinguishes URL and non-URL workspace handling [0.20ms]94 agent-facing help contracts > DM help states Slack's group size limit [0.13ms]9596test/channel-command.test.ts:97 channel list command > defaults to users.conversations for current user [4.28ms]98 channel list command > with --user id uses users.conversations and sets user directly [0.34ms]99 channel list command > with --user handle resolves via users.list before users.conversations [0.16ms]100 channel list command > with --user unknown handle is a hard error [0.13ms]101 channel list command > with --all uses conversations.list [0.12ms]102 channel list command > forwards --limit and --cursor [0.07ms]103 channel list command > --all and --user is a hard error [0.07ms]104 channel list command > invalid --limit is a hard error [0.07ms]105 channel list command > help text documents single-page pagination model [0.04ms]106 channel mark command > URL target extracts workspace from URL [0.70ms]107 channel mark command > URL target rejects --workspace flag [0.11ms]108 channel mark command > channel target requires --ts [0.08ms]109 channel mark command > URL target allows --ts override [0.21ms]110 channel mark command > channel target with --ts calls conversations.mark [0.10ms]111112test/user-id.test.ts:113 isUserId > accepts U-prefixed and W-prefixed Slack user IDs114 isUserId > preserves the existing length and character restrictions115116test/mrkdwn.test.ts:117 slackMrkdwnToMarkdown > converts Slack-style links [0.29ms]118 slackMrkdwnToMarkdown > converts user and channel mentions [0.03ms]119 slackMrkdwnToMarkdown > converts :emoji: shortcodes to unicode [0.05ms]120121test/rich-text.test.ts:122 parseInlineElements > plain text returns single text element [0.18ms]123 parseInlineElements > *bold* is parsed with bold style [0.01ms]124 parseInlineElements > _italic_ is parsed with italic style125 parseInlineElements > ~strike~ is parsed with strike style126 parseInlineElements > `code` is parsed with code style127 parseInlineElements > :emoji: shortcode is parsed as an emoji element128 parseInlineElements > emoji names with underscores are not parsed as italic text129 parseInlineElements > time-like colon text is not parsed as an emoji element130 parseInlineElements > <url|label> is parsed as link with text [0.02ms]131 parseInlineElements > <url> is parsed as link without text132 parseInlineElements > <mailto|label> is parsed as link with text133 parseInlineElements > non-url angle bracket text is preserved as text134 parseInlineElements > non-url labeled angle bracket text is preserved as text135 parseInlineElements > channel mention tokens are parsed as channel elements136 parseInlineElements > bare channel mention tokens are parsed as channel elements137 parseInlineElements > usergroup mention tokens are parsed as usergroup elements138 textToRichTextBlocks > plain text returns null [0.35ms]139 textToRichTextBlocks > inline-only formatting returns null by default [0.02ms]140 textToRichTextBlocks > non-url angle bracket text does not trigger rich text blocks [0.02ms]141 textToRichTextBlocks > mixed non-url angle bracket text and formatting preserves brackets [0.04ms]142 textToRichTextBlocks > inline-only formatting can produce rich text blocks [0.03ms]143 textToRichTextBlocks > mailto links can produce rich text blocks when inline formatting is included [0.01ms]144 textToRichTextBlocks > channel mentions can produce rich text blocks when inline formatting is included [0.01ms]145 textToRichTextBlocks > bullet list with - prefix [0.07ms]146 textToRichTextBlocks > bullet list with bullet character [0.12ms]147 textToRichTextBlocks > sub-bullets with indentation [0.03ms]148 textToRichTextBlocks > white bullet sub-bullets under bullet [0.02ms]149 textToRichTextBlocks > mixed text and bullets [0.01ms]150 textToRichTextBlocks > numbered list [0.02ms]151 textToRichTextBlocks > bold text in list items is parsed [0.01ms]152 textToRichTextBlocks > emoji and channel references in list items are parsed [0.02ms]153 textToRichTextBlocks > Slack manual links and CommonMark links remain distinct in list items [0.02ms]154 textToRichTextBlocks > code block is preserved [0.01ms]155 textToRichTextBlocks > blockquote is preserved156157test/message-reaction-filters.test.ts:158 parseReactionFilters > normalizes shortcodes, names, and unicode [0.35ms]159 parseReactionFilters > returns empty array when unset160 passesReactionNameFilters > matches when required reaction is present [0.20ms]161 passesReactionNameFilters > does not match when required reaction is missing162 passesReactionNameFilters > does not match when excluded reaction is present163 passesReactionNameFilters > matches when excluded reaction is absent164 passesReactionNameFilters > supports with + without together165 requireOldestWhenReactionFiltersUsed > returns oldest when no reaction filters are used [0.01ms]166 requireOldestWhenReactionFiltersUsed > returns trimmed oldest when reaction filters are used167 requireOldestWhenReactionFiltersUsed > throws when reaction filters are used without oldest [0.67ms]168169test/parse-limit.test.ts:170 parseLimit > returns undefined when no value given [0.01ms]171 parseLimit > parses valid positive integers172 parseLimit > rejects non-numeric strings [0.21ms]173 parseLimit > rejects zero174 parseLimit > rejects negative numbers175 parseLimit > rejects floats (uses integer part)176 requireMessageTs > returns trimmed ts when present177 requireMessageTs > throws when missing178 requireMessageTs > throws when blank179180test/message-compact.test.ts:181 toCompactMessage > includes file with path on successful download [0.28ms]182 toCompactMessage > includes file with error on failed download [0.03ms]183 toCompactMessage > excludes files with no downloadedPaths entry [0.01ms]184 toCompactMessage > mixes successful and failed downloads [0.02ms]185 toCompactMessage > failed download preserves file metadata for content-type filtering [0.01ms]186 passesContentTypeFilter with failed downloads > image message with failed download still passes image filter [0.04ms]187 passesContentTypeFilter with failed downloads > snippet message with failed download still passes snippet filter [0.01ms]188 passesContentTypeFilter with failed downloads > message without download entry has no files and passes text filter189 toCompactMessage filename preservation > does not fall back to title when name is missing [0.01ms]190191test/user-cache.test.ts:192 user-cache helpers > collectReferencedUserIds excludes reaction users by default [0.46ms]193 user-cache helpers > collectReferencedUserIds includes reaction users when enabled [0.02ms]194 user-cache helpers > toReferencedUsers returns only resolved users keyed by id [0.04ms]195196test/message-send.test.ts:197 sendMessage > posts a normal message when no attachments are passed [0.59ms]198 sendMessage > --no-unfurl disables link and media previews for immediate sends [0.05ms]199 sendMessage > opens and sends to a DM for a W-prefixed user target [0.09ms]200 sendMessage > returns a permalink when the workspace was resolved implicitly [0.04ms]201 sendMessage > threaded reply returns thread_ts distinct from ts [0.52ms]202 sendMessage > --reply-broadcast with --thread-ts sends reply_broadcast: true [0.05ms]203 sendMessage > --reply-broadcast omits the field from chat.postMessage when flag is absent [0.03ms]204 sendMessage > --reply-broadcast without --thread-ts throws [0.05ms]205 sendMessage > --reply-broadcast on a URL target broadcasts using the message's derived thread_ts [0.20ms]206 sendMessage > --reply-broadcast on a DM target throws (broadcasting is not meaningful for DMs) [0.04ms]207 sendMessage > --reply-broadcast works alongside --blocks payload [0.72ms]208 sendMessage > uploads attachment and uses message text as initial comment [1.11ms]209 sendMessage > --no-unfurl cannot be combined with file attachments [0.04ms]210 sendMessage > sends initial comment only for the first attachment [0.52ms]211 sendMessage > uploads attachment without text when text is empty [0.35ms]212 sendMessage > --blocks: reads Block Kit JSON from file and passes through unchanged [0.37ms]213 sendMessage > --blocks: errors when JSON is not an array [0.30ms]214 sendMessage > --blocks: errors on malformed JSON [0.31ms]215 sendMessage > --blocks: overrides markdown-to-rich-text conversion when text is also provided [0.25ms]216 sendMessage > sends Slack manual links in lists as rich-text link blocks [0.07ms]217 sendMessage > --blocks: errors when an array element is not an object [0.29ms]218 sendMessage > --schedule sends through chat.scheduleMessage and returns scheduled metadata [0.30ms]219 sendMessage > --schedule-in computes a relative post_at [0.11ms]220 sendMessage > --no-unfurl disables link and media previews for scheduled sends [0.04ms]221 sendMessage > --schedule composes with blocks, thread replies, and reply broadcast [0.46ms]222 sendMessage > --schedule cannot be combined with file attachments [0.04ms]223 composeMessage > --no-unfurl disables link and media previews when CI sends immediately [0.30ms]224 composeMessage > keeps Slack's default preview behavior for a standard CI send [0.05ms]225 composeMessage > --no-unfurl disables previews for a URL target when CI sends immediately [0.19ms]226 scheduled message management > lists scheduled messages and forwards channel filters [0.17ms]227 scheduled message management > cancels scheduled messages with the required channel id [0.09ms]228 scheduled message time parsing > parses absolute ISO timestamps with explicit timezones [0.03ms]229 scheduled message time parsing > parses named relative times like monday 9am [6.27ms]230 scheduled message time parsing > rejects schedule times beyond Slack's 120 day limit [0.03ms]231 editMessage > edits a normal text message without blocks [0.17ms]232 editMessage > edits literal angle bracket text without blocks [0.06ms]233 editMessage > edits a message URL with a link label without blocks [0.06ms]234 editMessage > edits an inline mailto link without escaping it [0.04ms]235 editMessage > edits an inline usergroup mention without escaping it [0.04ms]236 editMessage > edits a channel target with inline formatting without blocks [0.03ms]237 editMessage > edits a channel target with rich text blocks when text contains a list [0.04ms]238 editMessage > edits a normal message without blocks when no --blocks file is passed [0.04ms]239 editMessage > edits a message URL with Block Kit JSON from file [0.35ms]240 editMessage > edits a channel target with --ts and Block Kit JSON from file [0.32ms]241242test/compact-json.test.ts:243 pruneEmpty > drops null/undefined/empty containers [0.03ms]244245test/search-query.test.ts:246 W-prefixed user IDs in search > resolves a W-prefixed user ID to a from filter [0.14ms]247 W-prefixed user IDs in search > returns a W-prefixed user ID without scanning users [0.06ms]248249test/message-draft-actions.test.ts:250 createDraftAction > creates a draft addressed to a channel id [0.71ms]251 createDraftAction > rejects --broadcast without a thread [0.07ms]252 createDraftAction > rejects --broadcast for a DM (user) target [0.04ms]253 createDraftAction > rejects --broadcast for a D... channel-id (DM) target [0.02ms]254 createDraftAction > rejects --broadcast on a channel name with no thread before any network call [0.03ms]255 createDraftAction > rejects --broadcast on a DM message URL before fetching the message [0.21ms]256 createDraftAction > uploads --attach files and wires their file ids into the draft [0.68ms]257 createDraftAction > aborts before any upload or drafts.create when an --attach path is missing [0.13ms]258 updateDraftAction > text-only edit preserves destination, thread, broadcast, and file ids [0.30ms]259 updateDraftAction > re-addressing a broadcast thread draft to a non-thread channel clears broadcast instead of erroring [0.05ms]260 updateDraftAction > explicit --broadcast on a non-thread draft still errors [0.05ms]261 updateDraftAction > refuses to update a scheduled draft rather than clearing its schedule [0.04ms]262 updateDraftAction > refuses a text-only update on a multi-destination draft, but allows re-addressing [0.06ms]263 updateDraftAction > re-addressing to a different thread does not inherit the old broadcast flag [0.06ms]264 updateDraftAction > --no-broadcast clears an inherited broadcast flag on a same-thread edit [0.04ms]265 updateDraftAction > rejects --broadcast when re-addressing to a DM (user) target [0.03ms]266 updateDraftAction > changing only --thread-ts (no --channel) does not inherit the old broadcast flag [0.04ms]267 updateDraftAction > rejects --broadcast on an existing DM-destination draft [0.04ms]268 updateDraftAction > rejects --broadcast when re-addressing to a channel name with no thread, before resolving it [0.03ms]269 updateDraftAction > merges --attach file ids into the draft's existing file_ids [0.38ms]270 updateDraftAction > merges --attach while de-duplicating ids already on the draft [0.43ms]271 deleteDraftAction > auto-fetches and pads last_updated_ts when omitted [0.10ms]272 listDraftsAction > hydrates channel display names [0.23ms]273{274 "ok": true,275 "draft": {276 "id": "Dr123",277 "destinations": [278 {279 "channel_id": "C11111111",280 "thread_ts": "1700000000.100000"281 }282 ]283 }284}285 message draft update (commander --broadcast wiring) > omitting broadcast flags does not force broadcast on (no Commander default-true gotcha) [0.70ms]286{287 "ok": true,288 "draft": {289 "id": "Dr123",290 "destinations": [291 {292 "channel_id": "C11111111",293 "thread_ts": "1700000000.100000",294 "broadcast": true295 }296 ]297 }298}299 message draft update (commander --broadcast wiring) > --broadcast sets broadcast true [0.14ms]300{301 "ok": true,302 "draft": {303 "id": "Dr123",304 "destinations": [305 {306 "channel_id": "C11111111",307 "thread_ts": "1700000000.100000"308 }309 ]310 }311}312 message draft update (commander --broadcast wiring) > --no-broadcast clears an inherited broadcast flag [0.09ms]313{314 "ok": true,315 "draft": {316 "id": "DrNew",317 "destinations": [318 {319 "channel_id": "C11111111"320 }321 ]322 }323}324 message draft create (commander --attach wiring) > collects repeatable --attach flags into an array [0.81ms]325 message draft unknown subcommand > old `message draft <target>` usage points to `message compose` [0.18ms]326 draft attachments: orphan prevention across auth-retry and failed drafts > #2 create: a drafts.create auth failure retries work WITHOUT re-uploading files [0.44ms]327 draft attachments: orphan prevention across auth-retry and failed drafts > #2 update: a drafts.update auth failure retries work WITHOUT re-uploading files [0.42ms]328 draft attachments: orphan prevention across auth-retry and failed drafts > #3 create: a non-auth drafts.create failure deletes the uploaded file [0.51ms]329 draft attachments: orphan prevention across auth-retry and failed drafts > #3 update: a stale drafts.update failure deletes the newly uploaded file only [0.41ms]330 draft attachments: orphan prevention across auth-retry and failed drafts > a failed draft with no attachments does not attempt files.delete [0.05ms]331332test/channel-admin.test.ts:333 parseInviteUsersCsv > splits comma-separated values, trims whitespace, and deduplicates [0.03ms]334 parseInviteUsersCsv > returns empty array when input has no values335 splitEmailsFromInviteTargets > separates email targets from non-email targets [0.03ms]336 splitEmailsFromInviteTargets > deduplicates emails337338test/targets.test.ts:339 parseMsgTarget > parses slack message URLs [0.02ms]340 parseMsgTarget > accepts #channel341 parseMsgTarget > accepts bare channel names342 parseMsgTarget > accepts channel IDs [0.03ms]343 parseMsgTarget > accepts user IDs as DM targets [0.01ms]344 parseMsgTarget > accepts W-prefixed user IDs as DM targets345 parseMsgTarget > accepts user IDs with leading/trailing whitespace346 parseMsgTarget > does not treat short U-prefixed strings as user IDs347 parseMsgTarget > does not treat short W-prefixed strings as user IDs348349test/search-command.test.ts:350 search referenced users > searchSlack returns shared referenced_users while preserving canonical ids [3.08ms]351 search referenced users > search command forwards --refresh-users and bypasses cached user lookups [1.31ms]352353test/upload.test.ts:354 uploadFilesForDraft > never shifts ids between files when the completion response omits one [0.59ms]355 uploadFilesForDraft > falls back to staged ids when the completion response length disagrees [0.56ms]356 uploadFilesForDraft > stages every file, then completes them in one call with no channel binding [0.64ms]357 uploadFilesForDraft > a later staging failure leaves nothing completed (no orphaned files) [0.49ms]358 uploadFilesForDraft > throws and completes nothing when a path does not exist [0.16ms]359 uploadFilesForDraft > throws and completes nothing when a byte POST fails [0.60ms]360 uploadFilesForDraft > throws when files.completeUploadExternal fails [0.32ms]361 uploadFilesForDraft > throws when the path is a directory [0.25ms]362 uploadLocalFileToSlack (shared-helper regression) > still binds the completed file to a channel with an initial comment [0.38ms]363364test/html-to-md.test.ts:365 htmlToMarkdown > converts basic HTML to markdown [2.32ms]366367test/safe-mode.test.ts:368 isSafeModeEnabled > enabled via CLI flag [0.02ms]369 isSafeModeEnabled > enabled for env value "1"370 isSafeModeEnabled > enabled for env value "true"371 isSafeModeEnabled > enabled for env value "TRUE"372 isSafeModeEnabled > enabled for env value "yes"373 isSafeModeEnabled > enabled for env value "on"374 isSafeModeEnabled > enabled for env value " 1 "375 isSafeModeEnabled > disabled for env value "0"376 isSafeModeEnabled > disabled for env value "false"377 isSafeModeEnabled > disabled for env value "off"378 isSafeModeEnabled > disabled for env value "no"379 isSafeModeEnabled > disabled for env value ""380 isSafeModeEnabled > disabled when env var is unset and flag is absent381 safeModeBlockedError > names the blocked action [0.01ms]382 redirectSendToDraft > rejects unsupported send option {383 attach: [ "./report.md" ],384} [0.09ms]385 redirectSendToDraft > rejects unsupported send option {386 blocks: "/tmp/blocks.json",387}388 redirectSendToDraft > rejects unsupported send option {389 schedule: "2030-01-01T00:00:00Z",390}391 redirectSendToDraft > rejects unsupported send option {392 scheduleIn: "3h",393}394 redirectSendToDraft > rejects unsupported send option {395 replyBroadcast: true,396}397 redirectSendToDraft > lists all unsupported flags at once [0.02ms]398 redirectSendToDraft > rejects in CI where no interactive editor is available [0.04ms]399⚠ Safe mode active: redirecting "message send" → draft editor. Nothing posts until a human sends it from the editor.400 redirectSendToDraft > opens a draft with the send text and thread context [0.10ms]401402test/files.test.ts:403 downloadSlackFile > downloads file and writes to disk [1.46ms]404 downloadSlackFile > returns cached path when file already exists [0.33ms]405 downloadSlackFile > throws SlackDownloadError on HTTP 404 [0.58ms]406 downloadSlackFile > throws SlackDownloadError with httpStatus on HTTP error [0.16ms]407 downloadSlackFile > throws SlackDownloadError on HTML auth page [0.15ms]408 downloadSlackFile > throws SlackDownloadError on network error [0.20ms]409 downloadSlackFile > throws SlackDownloadError when reading html body fails [0.37ms]410 downloadSlackFile > throws SlackDownloadError when reading binary body fails [0.18ms]411 tryDownloadSlackFile > returns ok result on success [0.30ms]412 tryDownloadSlackFile > returns failure result on HTTP 404 [0.15ms]413 tryDownloadSlackFile > returns failure result on network error [0.15ms]414 tryDownloadSlackFile > propagates disk/write errors [0.26ms]415Warning: skipping file F1: Downloaded auth/login page instead of canvas content (token may be expired)416 downloadMessageFiles > records canvas auth failures as structured errors [1.07ms]417Warning: skipping file F2: Failed to download file (404)418 downloadMessageFiles > records non-canvas download failures with a local error path [0.57ms]419420test/channels.test.ts:421 conversations list helpers > listUserConversations calls users.conversations with defaults [0.06ms]422 conversations list helpers > listUserConversations forwards user/limit/cursor [0.03ms]423 conversations list helpers > listAllConversations calls conversations.list with defaults [0.03ms]424 conversations list helpers > listAllConversations forwards limit/cursor [0.02ms]425 conversations list helpers > listUserConversations passes through small limits [0.02ms]426 conversations list helpers > listUserConversations clamps high limits to 1000 [0.02ms]427 conversations list helpers > normalizeConversationsPage extracts channels and next cursor [0.01ms]428 conversations list helpers > normalizeConversationsPage handles missing response_metadata429 conversations list helpers > normalizeConversationsPage handles empty next_cursor430 conversations list helpers > listConversationsViaCounts enumerates channels/mpims/ims and enriches via conversations.info [0.14ms]431 conversations list helpers > listConversationsViaCounts keeps the id when conversations.info fails [0.05ms]432 conversations list helpers > listConversationsViaCounts slices to limit and skips entries without an id [0.05ms]433434test/update.test.ts:435 compareSemver > equal versions return 0 [0.03ms]436 compareSemver > strips v prefix437 compareSemver > newer major438 compareSemver > newer minor439 compareSemver > newer patch440 compareSemver > older version returns negative441 compareSemver > handles 0.x versions442443test/reactions.test.ts:444 reactions compaction > includes reactions only when enabled [0.07ms]445 reactions compaction > preserves W-prefixed user IDs while compacting reactions [0.02ms]446 reactions compaction > adds forwarded thread metadata for shared messages with thread_ts [0.12ms]447448test/emoji.test.ts:449 normalizeSlackReactionName > accepts :shortcode:450 normalizeSlackReactionName > accepts raw names451 normalizeSlackReactionName > accepts unicode emoji [0.02ms]452453test/client.test.ts:454 SlackApiClient browser multipart transport > retries HTTP 429 responses using Retry-After [1.27ms]455456test/url.test.ts:457 parseSlackMessageUrl > parses archives URL with p<digits> [0.02ms]458 parseSlackMessageUrl > captures thread_ts from query when present [0.01ms]459 buildSlackMessageUrl > builds a permalink for a root message [0.01ms]460 buildSlackMessageUrl > includes thread metadata for replies461462test/render.test.ts:463 renderSlackMessageContent > prefers blocks [0.03ms]464 renderSlackMessageContent > preserves usergroup and broadcast elements from rich text [0.13ms]465 renderSlackMessageContent > omits malformed usergroup and broadcast elements [0.03ms]466 renderSlackMessageContent > falls back to attachments when text is empty [0.05ms]467 renderSlackMessageContent > includes section fields and button URLs [0.04ms]468 renderSlackMessageContent > includes attachment fields [0.03ms]469 renderSlackMessageContent > renders forwarded message with author and source link [0.06ms]470 renderSlackMessageContent > renders forwarded message with author name only [0.01ms]471 renderSlackMessageContent > renders forwarded message with no author [0.01ms]472 renderSlackMessageContent > includes forwarded file links in quoted forwarded body [0.02ms]473 renderSlackMessageContent > renders nested forwarded attachments similarly to normal attachments [0.03ms]474 renderSlackMessageContent > deduplicates repeated forwarded body content [0.02ms]475 renderSlackMessageContent > handles cyclic forwarded attachments without infinite recursion [0.02ms]476 renderSlackMessageContent > does not treat link unfurl as forwarded message [0.01ms]477 renderSlackMessageContent > combines blocks and non-shared attachments [0.01ms]478479test/later.test.ts:480 fetchLaterItems > returns counts only when countsOnly is true [0.17ms]481 fetchLaterItems > filters to message items only [0.20ms]482 fetchLaterItems > filters by state [0.06ms]483 fetchLaterItems > state 'all' returns all items [0.03ms]484 fetchLaterItems > respects limit [0.05ms]485 fetchLaterItems > hydrates message content [0.07ms]486 fetchLaterItems > resolves DM user display names [0.06ms]487 fetchLaterItems > truncates long message content [0.04ms]488 updateLaterMark > sends mark=completed via multipart [0.06ms]489 updateLaterMark > sends mark=archived via multipart [0.02ms]490 updateLaterMark > sends mark=uncompleted via multipart [0.02ms]491 updateLaterMark > sends mark=unarchived via multipart [0.01ms]492 saveLater > calls saved.add with correct params [0.04ms]493 removeLater > calls saved.delete with correct params [0.03ms]494 setLaterReminder > calls saved.update via multipart with date_due [0.04ms]495 parseReminderDuration > parses minutes [0.08ms]496 parseReminderDuration > parses hours [0.01ms]497 parseReminderDuration > parses fractional hours498 parseReminderDuration > parses days499 parseReminderDuration > parses 'tomorrow' as next day 9 AM [0.04ms]500 parseReminderDuration > parses day names [0.01ms]501 parseReminderDuration > passes through unix timestamps502 parseReminderDuration > supports verbose unit names [0.01ms]503 parseReminderDuration > throws on invalid input [0.03ms]504505test/drafts.test.ts:506 padDraftTs > pads short fractional parts to 7 digits507 padDraftTs > leaves 7-digit fractional parts unchanged508 padDraftTs > leaves timestamps without a fractional part unchanged509 draftTextToBlocks > wraps plain text in a rich_text section [0.02ms]510 draftTextToBlocks > converts bullet lists to rich_text lists [0.02ms]511 parseDraftRecord > parses a raw draft into a compact shape [0.05ms]512 parseDraftRecord > returns null for records without an id513 listDrafts > requests active drafts and parses the result [0.07ms]514 listDrafts > omits is_active when activeOnly is false [0.02ms]515 createDraft > sends blocks, destination, and composer flag [0.06ms]516 createDraft > omits thread fields for channel drafts [0.03ms]517 createDraft > includes file_ids on the wire when fileIds is supplied [0.03ms]518 updateDraft > sends draft_id and a padded last-updated ts [0.04ms]519 deleteDraft > deletes with an explicit last-updated ts [0.03ms]520 deleteDraft > fetches the last-updated ts from drafts.list when omitted [0.03ms]521 deleteDraft > throws when the draft does not exist [0.02ms]522 findDraft > lists all drafts (including inactive) and finds by id [0.02ms]523 findDraft > prefers a matching record that has last_updated_ts over a malformed duplicate [0.03ms]524525test/search-files.test.ts:526Warning: skipping file F1: Failed to download file (404)527 searchFilesViaSearchApi > skips failed downloads and keeps later successful matches [0.78ms]528Warning: skipping file F1: Failed to download file (404)529 searchFilesInChannelsFallback > continues after a failed download in files.list results [0.90ms]530 SlackApiClient browser API guards > fails fast on rate-limit retry windows by default [0.28ms]531 SlackApiClient browser API guards > surfaces request timeouts with the Slack method name [0.10ms]532533test/error-message.test.ts:534 errorMessage > returns the message for a plain error [0.07ms]535 errorMessage > stringifies non-Error values536 errorMessage > appends a single Error cause [0.03ms]537 errorMessage > appends AggregateError causes from a failed fetch through a dead proxy [0.02ms]538 errorMessage > walks multi-level cause chains [0.01ms]539 errorMessage > terminates on a self-referential cause instead of looping forever540 errorMessage > terminates on a longer cause cycle541 errorMessage > does not crash on a cause that cannot be stringified [0.02ms]542 errorMessage > does not crash on a non-Error thrown value that cannot be stringified543 errorMessage > caps how far a long cause chain is walked [0.09ms]544 errorMessage > collapses a cause that merely restates its parent545546test/canvas-create.test.ts:547 createCanvasFromMarkdown > sends Markdown content, title, and channel to canvases.create [0.14ms]548 createCanvasFromMarkdown > rejects empty Markdown before calling Slack [0.04ms]549 createCanvasFromMarkdown > rejects a success response without a canvas id [0.02ms]550 createCanvasFromMarkdown > uses Slack's Markdown canvas method with imported browser credentials [0.03ms]551 createCanvasFromMarkdown > rejects channel tabs with browser credentials before calling Slack [0.02ms]552 editCanvas > sends the documented replace change [0.15ms]553 editCanvas > sends the documented replace section change554 editCanvas > sends the documented insert before change555 editCanvas > sends the documented insert after change556 editCanvas > sends the documented insert at start change557 editCanvas > sends the documented insert at end change558 editCanvas > sends the documented delete section change559 editCanvas > sends the documented rename change560 editCanvas > rejects invalid combinations before calling Slack [0.11ms]561 editCanvas > rejects empty Markdown and canvas ids before calling Slack [0.03ms]562 editCanvas > rejects Markdown over Slack's per-change limit before calling Slack [8.19ms]563 readCanvasMarkdownInput > reads a Markdown file without changing its contents [0.40ms]564 readCanvasMarkdownInput > accepts a Markdown blob [0.02ms]565 readCanvasMarkdownInput > requires exactly one source [0.04ms]566 readCanvasMarkdownInput > rejects an empty source [0.01ms]567 canvas create command > creates from an inline blob in the selected workspace [0.39ms]568 canvas create command > creates from a file and resolves a channel tab [0.40ms]569 canvas create command > rejects browser-auth channel tabs before resolving the channel [0.16ms]570 canvas create command > rejects missing or conflicting sources before authenticating [0.10ms]571 canvas edit command > replaces a canvas from a Markdown URL target [0.29ms]572 canvas edit command > inserts content from a file and passes a section id [0.37ms]573 canvas edit command > renames without a Markdown source [0.10ms]574 canvas edit command > rejects delete content and malformed inputs before authenticating [0.14ms]575 canvas edit command > rejects browser credentials before calling canvases.edit [0.08ms]576577 399 pass578 0 fail579 817 expect() calls580Ran 399 tests across 38 files. [254.00ms]
fixupPhase
581checking for references to /nix/var/nix/builds/nix-64121-3890790268/ in /nix/store/slhhdwnadjzvhh4baclfs7014wrnh9gw-agent-slack-0.10.2...582patching script interpreter paths in /nix/store/slhhdwnadjzvhh4baclfs7014wrnh9gw-agent-slack-0.10.2
installCheckPhase
583Executing versionCheckPhase584Successfully managed to find version 0.10.2 in the output of the command /nix/store/slhhdwnadjzvhh4baclfs7014wrnh9gw-agent-slack-0.10.2/bin/agent-slack --version5850.10.2586Finished versionCheckPhase587no Makefile or custom installCheckPhase, doing nothing