agent-slack-0.10.2
checks.aarch64-linux.home-manager-utm-vm
· build #791
· raw
1tribuchet: building on eliza2Using versionCheckHook
unpackPhase
3unpacking source archive /nix/store/cgqwcm1zgrhk5gmlmpjpi0rc8f2zg5kh-source4source root is sourcebunSetInstallCacheDirPhase
5Using bun root: "/build/source"bunPatchPhase
6patching script interpreter paths in .7./scripts/install-skill.sh: interpreter directive changed from "#!/usr/bin/env bash" to "/nix/store/mwhkh9l5j5z6mkk83k22rjhx6lxgqh85-bash-5.3p15/bin/bash"8./scripts/release.sh: interpreter directive changed from "#!/bin/sh" to "/nix/store/mwhkh9l5j5z6mkk83k22rjhx6lxgqh85-bash-5.3p15/bin/sh"9./scripts/update-nix-sources.sh: interpreter directive changed from "#!/usr/bin/env bash" to "/nix/store/mwhkh9l5j5z6mkk83k22rjhx6lxgqh85-bash-5.3p15/bin/bash"configurePhase
10no configure script, doing nothingbunNodeModulesInstallPhase
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 [189.00ms]33/build/sourcebuildPhase
34Bundled 360 modules in 36ms3536 agent-slack.js 1.98 MB (entry point)37checkPhase
38bun test v1.4.2 (744846f84)3940test/emoji.test.ts:41(pass) normalizeSlackReactionName > accepts :shortcode: [1.26ms]42(pass) normalizeSlackReactionName > accepts raw names [0.09ms]43(pass) normalizeSlackReactionName > accepts unicode emoji [2.56ms]4445test/reactions.test.ts:46(pass) reactions compaction > includes reactions only when enabled [5.21ms]47(pass) reactions compaction > preserves W-prefixed user IDs while compacting reactions [0.99ms]48(pass) reactions compaction > adds forwarded thread metadata for shared messages with thread_ts [3.27ms]4950test/message-draft-actions.test.ts:51(pass) createDraftAction > creates a draft addressed to a channel id [7.73ms]52(pass) createDraftAction > rejects --broadcast without a thread [1.08ms]53(pass) createDraftAction > rejects --broadcast for a DM (user) target [0.32ms]54(pass) createDraftAction > rejects --broadcast for a D... channel-id (DM) target [0.16ms]55(pass) createDraftAction > rejects --broadcast on a channel name with no thread before any network call [0.09ms]56(pass) createDraftAction > rejects --broadcast on a DM message URL before fetching the message [1.04ms]57(pass) createDraftAction > uploads --attach files and wires their file ids into the draft [11.38ms]58(pass) createDraftAction > aborts before any upload or drafts.create when an --attach path is missing [0.73ms]59(pass) updateDraftAction > text-only edit preserves destination, thread, broadcast, and file ids [1.22ms]60(pass) updateDraftAction > re-addressing a broadcast thread draft to a non-thread channel clears broadcast instead of erroring [0.31ms]61(pass) updateDraftAction > explicit --broadcast on a non-thread draft still errors [0.28ms]62(pass) updateDraftAction > refuses to update a scheduled draft rather than clearing its schedule [0.44ms]63(pass) updateDraftAction > refuses a text-only update on a multi-destination draft, but allows re-addressing [0.38ms]64(pass) updateDraftAction > re-addressing to a different thread does not inherit the old broadcast flag [0.21ms]65(pass) updateDraftAction > --no-broadcast clears an inherited broadcast flag on a same-thread edit [0.14ms]66(pass) updateDraftAction > rejects --broadcast when re-addressing to a DM (user) target [0.14ms]67(pass) updateDraftAction > changing only --thread-ts (no --channel) does not inherit the old broadcast flag [0.16ms]68(pass) updateDraftAction > rejects --broadcast on an existing DM-destination draft [0.85ms]69(pass) updateDraftAction > rejects --broadcast when re-addressing to a channel name with no thread, before resolving it [0.19ms]70(pass) updateDraftAction > merges --attach file ids into the draft's existing file_ids [1.65ms]71(pass) updateDraftAction > merges --attach while de-duplicating ids already on the draft [1.03ms]72(pass) deleteDraftAction > auto-fetches and pads last_updated_ts when omitted [0.58ms]73(pass) listDraftsAction > hydrates channel display names [0.88ms]74{75 "ok": true,76 "draft": {77 "id": "Dr123",78 "destinations": [79 {80 "channel_id": "C11111111",81 "thread_ts": "1700000000.100000"82 }83 ]84 }85}86(pass) message draft update (commander --broadcast wiring) > omitting broadcast flags does not force broadcast on (no Commander default-true gotcha) [8.50ms]87{88 "ok": true,89 "draft": {90 "id": "Dr123",91 "destinations": [92 {93 "channel_id": "C11111111",94 "thread_ts": "1700000000.100000",95 "broadcast": true96 }97 ]98 }99}100(pass) message draft update (commander --broadcast wiring) > --broadcast sets broadcast true [1.11ms]101{102 "ok": true,103 "draft": {104 "id": "Dr123",105 "destinations": [106 {107 "channel_id": "C11111111",108 "thread_ts": "1700000000.100000"109 }110 ]111 }112}113(pass) message draft update (commander --broadcast wiring) > --no-broadcast clears an inherited broadcast flag [2.40ms]114{115 "ok": true,116 "draft": {117 "id": "DrNew",118 "destinations": [119 {120 "channel_id": "C11111111"121 }122 ]123 }124}125(pass) message draft create (commander --attach wiring) > collects repeatable --attach flags into an array [2.98ms]126(pass) message draft unknown subcommand > old `message draft <target>` usage points to `message compose` [2.25ms]127(pass) draft attachments: orphan prevention across auth-retry and failed drafts > #2 create: a drafts.create auth failure retries work WITHOUT re-uploading files [2.05ms]128(pass) draft attachments: orphan prevention across auth-retry and failed drafts > #2 update: a drafts.update auth failure retries work WITHOUT re-uploading files [1.52ms]129(pass) draft attachments: orphan prevention across auth-retry and failed drafts > #3 create: a non-auth drafts.create failure deletes the uploaded file [2.08ms]130(pass) draft attachments: orphan prevention across auth-retry and failed drafts > #3 update: a stale drafts.update failure deletes the newly uploaded file only [1.16ms]131(pass) draft attachments: orphan prevention across auth-retry and failed drafts > a failed draft with no attachments does not attempt files.delete [0.29ms]132133test/leveldb-reader.test.ts:134(pass) leveldb-reader > readChromiumLevelDB > returns empty array for non-existent directory [0.65ms]135(pass) leveldb-reader > readChromiumLevelDB > returns empty array for empty directory [0.57ms]136(pass) leveldb-reader > readChromiumLevelDB > reads entries from SSTable files [2.97ms]137(pass) leveldb-reader > readChromiumLevelDB > reads entries from log files [2.09ms]138(pass) leveldb-reader > readChromiumLevelDB > reads from both SSTable and log files [0.97ms]139(pass) leveldb-reader > readChromiumLevelDB > handles .sst file extension [0.52ms]140(pass) leveldb-reader > findKeysContaining > filters entries by key substring [0.82ms]141(pass) leveldb-reader > findKeysContaining > returns empty array when no matches [0.58ms]142(pass) leveldb-reader > edge cases > handles invalid SSTable (wrong magic) [0.45ms]143(pass) leveldb-reader > edge cases > handles empty SSTable file [0.37ms]144(pass) leveldb-reader > edge cases > handles SSTable smaller than footer size [0.43ms]145146test/later.test.ts:147(pass) fetchLaterItems > returns counts only when countsOnly is true [0.69ms]148(pass) fetchLaterItems > filters to message items only [0.74ms]149(pass) fetchLaterItems > filters by state [0.26ms]150(pass) fetchLaterItems > state 'all' returns all items [0.15ms]151(pass) fetchLaterItems > respects limit [0.13ms]152(pass) fetchLaterItems > hydrates message content [0.21ms]153(pass) fetchLaterItems > resolves DM user display names [0.17ms]154(pass) fetchLaterItems > truncates long message content [0.24ms]155(pass) updateLaterMark > sends mark=completed via multipart [0.22ms]156(pass) updateLaterMark > sends mark=archived via multipart [0.21ms]157(pass) updateLaterMark > sends mark=uncompleted via multipart [0.08ms]158(pass) updateLaterMark > sends mark=unarchived via multipart [0.07ms]159(pass) saveLater > calls saved.add with correct params [0.12ms]160(pass) removeLater > calls saved.delete with correct params [0.13ms]161(pass) setLaterReminder > calls saved.update via multipart with date_due [0.18ms]162(pass) parseReminderDuration > parses minutes [0.36ms]163(pass) parseReminderDuration > parses hours [0.04ms]164(pass) parseReminderDuration > parses fractional hours [0.03ms]165(pass) parseReminderDuration > parses days [0.03ms]166(pass) parseReminderDuration > parses 'tomorrow' as next day 9 AM [19.24ms]167(pass) parseReminderDuration > parses day names [0.18ms]168(pass) parseReminderDuration > passes through unix timestamps [0.10ms]169(pass) parseReminderDuration > supports verbose unit names [0.09ms]170(pass) parseReminderDuration > throws on invalid input [0.11ms]171172test/search-command.test.ts:173(pass) search referenced users > searchSlack returns shared referenced_users while preserving canonical ids [8.23ms]174(pass) search referenced users > search command forwards --refresh-users and bypasses cached user lookups [5.82ms]175176test/workspace-selector.test.ts:177(pass) resolveWorkspaceSelector > matches exact URL [0.18ms]178(pass) resolveWorkspaceSelector > matches unique substring by host/team [0.25ms]179(pass) resolveWorkspaceSelector > matches unique substring by workspace name [0.05ms]180(pass) resolveWorkspaceSelector > returns ambiguity when selector matches multiple workspaces [0.20ms]181(pass) resolveWorkspaceSelector > returns no match when selector does not match [0.07ms]182183test/channels.test.ts:184(pass) conversations list helpers > listUserConversations calls users.conversations with defaults [0.44ms]185(pass) conversations list helpers > listUserConversations forwards user/limit/cursor [0.16ms]186(pass) conversations list helpers > listAllConversations calls conversations.list with defaults [0.21ms]187(pass) conversations list helpers > listAllConversations forwards limit/cursor [0.08ms]188(pass) conversations list helpers > listUserConversations passes through small limits [0.10ms]189(pass) conversations list helpers > listUserConversations clamps high limits to 1000 [0.08ms]190(pass) conversations list helpers > normalizeConversationsPage extracts channels and next cursor [0.04ms]191(pass) conversations list helpers > normalizeConversationsPage handles missing response_metadata [0.02ms]192(pass) conversations list helpers > normalizeConversationsPage handles empty next_cursor [0.05ms]193(pass) conversations list helpers > listConversationsViaCounts enumerates channels/mpims/ims and enriches via conversations.info [0.52ms]194(pass) conversations list helpers > listConversationsViaCounts keeps the id when conversations.info fails [0.18ms]195(pass) conversations list helpers > listConversationsViaCounts slices to limit and skips entries without an id [0.16ms]196197test/channel-admin.test.ts:198(pass) parseInviteUsersCsv > splits comma-separated values, trims whitespace, and deduplicates [0.14ms]199(pass) parseInviteUsersCsv > returns empty array when input has no values [0.03ms]200(pass) splitEmailsFromInviteTargets > separates email targets from non-email targets [0.21ms]201(pass) splitEmailsFromInviteTargets > deduplicates emails [0.03ms]202203test/user-cache.test.ts:204(pass) user-cache helpers > collectReferencedUserIds excludes reaction users by default [0.10ms]205(pass) user-cache helpers > collectReferencedUserIds includes reaction users when enabled [0.10ms]206(pass) user-cache helpers > toReferencedUsers returns only resolved users keyed by id [0.07ms]207208test/error-message.test.ts:209(pass) errorMessage > returns the message for a plain error [0.14ms]210(pass) errorMessage > stringifies non-Error values [0.03ms]211(pass) errorMessage > appends a single Error cause [0.04ms]212(pass) errorMessage > appends AggregateError causes from a failed fetch through a dead proxy [0.10ms]213(pass) errorMessage > walks multi-level cause chains [0.03ms]214(pass) errorMessage > terminates on a self-referential cause instead of looping forever [0.02ms]215(pass) errorMessage > terminates on a longer cause cycle [0.02ms]216(pass) errorMessage > does not crash on a cause that cannot be stringified [0.12ms]217(pass) errorMessage > does not crash on a non-Error thrown value that cannot be stringified [0.02ms]218(pass) errorMessage > caps how far a long cause chain is walked [0.20ms]219(pass) errorMessage > collapses a cause that merely restates its parent [0.04ms]220221test/html-to-md.test.ts:222(pass) htmlToMarkdown > converts basic HTML to markdown [6.86ms]223224test/client.test.ts:225(pass) SlackApiClient browser multipart transport > retries HTTP 429 responses using Retry-After [2.42ms]226227test/canvas-create.test.ts:228(pass) createCanvasFromMarkdown > sends Markdown content, title, and channel to canvases.create [0.47ms]229(pass) createCanvasFromMarkdown > rejects empty Markdown before calling Slack [0.20ms]230(pass) createCanvasFromMarkdown > rejects a success response without a canvas id [0.09ms]231(pass) createCanvasFromMarkdown > uses Slack's Markdown canvas method with imported browser credentials [0.11ms]232(pass) createCanvasFromMarkdown > rejects channel tabs with browser credentials before calling Slack [0.08ms]233(pass) editCanvas > sends the documented replace change [0.36ms]234(pass) editCanvas > sends the documented replace section change [0.02ms]235(pass) editCanvas > sends the documented insert before change [0.01ms]236(pass) editCanvas > sends the documented insert after change [0.01ms]237(pass) editCanvas > sends the documented insert at start change [0.02ms]238(pass) editCanvas > sends the documented insert at end change [0.01ms]239(pass) editCanvas > sends the documented delete section change [0.01ms]240(pass) editCanvas > sends the documented rename change [0.01ms]241(pass) editCanvas > rejects invalid combinations before calling Slack [0.26ms]242(pass) editCanvas > rejects empty Markdown and canvas ids before calling Slack [0.09ms]243(pass) editCanvas > rejects Markdown over Slack's per-change limit before calling Slack [9.20ms]244(pass) readCanvasMarkdownInput > reads a Markdown file without changing its contents [1.61ms]245(pass) readCanvasMarkdownInput > accepts a Markdown blob [0.08ms]246(pass) readCanvasMarkdownInput > requires exactly one source [0.09ms]247(pass) readCanvasMarkdownInput > rejects an empty source [0.04ms]248(pass) canvas create command > creates from an inline blob in the selected workspace [1.78ms]249(pass) canvas create command > creates from a file and resolves a channel tab [2.08ms]250(pass) canvas create command > rejects browser-auth channel tabs before resolving the channel [0.73ms]251(pass) canvas create command > rejects missing or conflicting sources before authenticating [0.70ms]252(pass) canvas edit command > replaces a canvas from a Markdown URL target [1.46ms]253(pass) canvas edit command > inserts content from a file and passes a section id [1.69ms]254(pass) canvas edit command > renames without a Markdown source [0.56ms]255(pass) canvas edit command > rejects delete content and malformed inputs before authenticating [0.66ms]256(pass) canvas edit command > rejects browser credentials before calling canvases.edit [0.48ms]257258test/rich-text.test.ts:259(pass) parseInlineElements > plain text returns single text element [0.06ms]260(pass) parseInlineElements > *bold* is parsed with bold style [0.14ms]261(pass) parseInlineElements > _italic_ is parsed with italic style [0.06ms]262(pass) parseInlineElements > ~strike~ is parsed with strike style [0.02ms]263(pass) parseInlineElements > `code` is parsed with code style [0.02ms]264(pass) parseInlineElements > :emoji: shortcode is parsed as an emoji element [0.03ms]265(pass) parseInlineElements > emoji names with underscores are not parsed as italic text [0.02ms]266(pass) parseInlineElements > time-like colon text is not parsed as an emoji element [0.02ms]267(pass) parseInlineElements > <url|label> is parsed as link with text [0.13ms]268(pass) parseInlineElements > <url> is parsed as link without text [0.03ms]269(pass) parseInlineElements > <mailto|label> is parsed as link with text [0.03ms]270(pass) parseInlineElements > non-url angle bracket text is preserved as text [0.02ms]271(pass) parseInlineElements > non-url labeled angle bracket text is preserved as text [0.02ms]272(pass) parseInlineElements > channel mention tokens are parsed as channel elements [0.02ms]273(pass) parseInlineElements > bare channel mention tokens are parsed as channel elements [0.02ms]274(pass) parseInlineElements > usergroup mention tokens are parsed as usergroup elements [0.02ms]275(pass) textToRichTextBlocks > plain text returns null [0.04ms]276(pass) textToRichTextBlocks > inline-only formatting returns null by default [0.02ms]277(pass) textToRichTextBlocks > non-url angle bracket text does not trigger rich text blocks [0.03ms]278(pass) textToRichTextBlocks > mixed non-url angle bracket text and formatting preserves brackets [0.11ms]279(pass) textToRichTextBlocks > inline-only formatting can produce rich text blocks [0.04ms]280(pass) textToRichTextBlocks > mailto links can produce rich text blocks when inline formatting is included [0.03ms]281(pass) textToRichTextBlocks > channel mentions can produce rich text blocks when inline formatting is included [0.03ms]282(pass) textToRichTextBlocks > bullet list with - prefix [0.22ms]283(pass) textToRichTextBlocks > bullet list with bullet character [0.49ms]284(pass) textToRichTextBlocks > sub-bullets with indentation [0.11ms]285(pass) textToRichTextBlocks > white bullet sub-bullets under bullet [0.05ms]286(pass) textToRichTextBlocks > mixed text and bullets [0.04ms]287(pass) textToRichTextBlocks > numbered list [0.07ms]288(pass) textToRichTextBlocks > bold text in list items is parsed [0.05ms]289(pass) textToRichTextBlocks > emoji and channel references in list items are parsed [0.10ms]290(pass) textToRichTextBlocks > Slack manual links and CommonMark links remain distinct in list items [0.05ms]291(pass) textToRichTextBlocks > code block is preserved [0.04ms]292(pass) textToRichTextBlocks > blockquote is preserved [0.03ms]293294test/compact-json.test.ts:295(pass) pruneEmpty > drops null/undefined/empty containers [0.16ms]296297test/drafts.test.ts:298(pass) padDraftTs > pads short fractional parts to 7 digits [0.03ms]299(pass) padDraftTs > leaves 7-digit fractional parts unchanged [0.01ms]300(pass) padDraftTs > leaves timestamps without a fractional part unchanged301(pass) draftTextToBlocks > wraps plain text in a rich_text section [0.10ms]302(pass) draftTextToBlocks > converts bullet lists to rich_text lists [0.06ms]303(pass) parseDraftRecord > parses a raw draft into a compact shape [0.49ms]304(pass) parseDraftRecord > returns null for records without an id [0.03ms]305(pass) listDrafts > requests active drafts and parses the result [0.28ms]306(pass) listDrafts > omits is_active when activeOnly is false [0.09ms]307(pass) createDraft > sends blocks, destination, and composer flag [0.21ms]308(pass) createDraft > omits thread fields for channel drafts [0.14ms]309(pass) createDraft > includes file_ids on the wire when fileIds is supplied [0.11ms]310(pass) updateDraft > sends draft_id and a padded last-updated ts [0.13ms]311(pass) deleteDraft > deletes with an explicit last-updated ts [0.20ms]312(pass) deleteDraft > fetches the last-updated ts from drafts.list when omitted [0.15ms]313(pass) deleteDraft > throws when the draft does not exist [0.08ms]314(pass) findDraft > lists all drafts (including inactive) and finds by id [0.10ms]315(pass) findDraft > prefers a matching record that has last_updated_ts over a malformed duplicate [0.09ms]316317test/upload.test.ts:318(pass) uploadFilesForDraft > never shifts ids between files when the completion response omits one [2.18ms]319(pass) uploadFilesForDraft > falls back to staged ids when the completion response length disagrees [1.50ms]320(pass) uploadFilesForDraft > stages every file, then completes them in one call with no channel binding [1.86ms]321(pass) uploadFilesForDraft > a later staging failure leaves nothing completed (no orphaned files) [1.54ms]322(pass) uploadFilesForDraft > throws and completes nothing when a path does not exist [0.60ms]323(pass) uploadFilesForDraft > throws and completes nothing when a byte POST fails [0.86ms]324(pass) uploadFilesForDraft > throws when files.completeUploadExternal fails [0.78ms]325(pass) uploadFilesForDraft > throws when the path is a directory [0.85ms]326(pass) uploadLocalFileToSlack (shared-helper regression) > still binds the completed file to a channel with an initial comment [0.94ms]327328test/message-reaction-filters.test.ts:329(pass) parseReactionFilters > normalizes shortcodes, names, and unicode [0.17ms]330(pass) parseReactionFilters > returns empty array when unset [0.02ms]331(pass) passesReactionNameFilters > matches when required reaction is present [0.15ms]332(pass) passesReactionNameFilters > does not match when required reaction is missing [0.02ms]333(pass) passesReactionNameFilters > does not match when excluded reaction is present [0.02ms]334(pass) passesReactionNameFilters > matches when excluded reaction is absent [0.04ms]335(pass) passesReactionNameFilters > supports with + without together [0.02ms]336(pass) requireOldestWhenReactionFiltersUsed > returns oldest when no reaction filters are used [0.08ms]337(pass) requireOldestWhenReactionFiltersUsed > returns trimmed oldest when reaction filters are used [0.01ms]338(pass) requireOldestWhenReactionFiltersUsed > throws when reaction filters are used without oldest [0.04ms]339340test/parse-limit.test.ts:341(pass) parseLimit > returns undefined when no value given [0.06ms]342(pass) parseLimit > parses valid positive integers [0.04ms]343(pass) parseLimit > rejects non-numeric strings [0.06ms]344(pass) parseLimit > rejects zero [0.02ms]345(pass) parseLimit > rejects negative numbers [0.01ms]346(pass) parseLimit > rejects floats (uses integer part)347(pass) requireMessageTs > returns trimmed ts when present [0.03ms]348(pass) requireMessageTs > throws when missing [0.02ms]349(pass) requireMessageTs > throws when blank [0.02ms]350351test/mrkdwn.test.ts:352(pass) slackMrkdwnToMarkdown > converts Slack-style links [0.15ms]353(pass) slackMrkdwnToMarkdown > converts user and channel mentions [0.04ms]354(pass) slackMrkdwnToMarkdown > converts :emoji: shortcodes to unicode [0.18ms]355356test/help-contracts.test.ts:357(pass) agent-facing help contracts > message send documents non-obvious formatting and scheduling behavior [1.85ms]358(pass) agent-facing help contracts > message compose identifies its CI send behavior [1.27ms]359(pass) agent-facing help contracts > Slack-native drafts document DM targeting and inherited-broadcast controls [1.01ms]360(pass) agent-facing help contracts > scheduled cancellation identifies its required channel [0.40ms]361(pass) agent-facing help contracts > Later reminders identify named-day timezone behavior [0.50ms]362(pass) agent-facing help contracts > canvas creation identifies source and credential constraints [0.45ms]363(pass) agent-facing help contracts > canvas editing identifies operations, targeting, and content constraints [0.52ms]364(pass) agent-facing help contracts > channel mark distinguishes URL and non-URL workspace handling [0.45ms]365(pass) agent-facing help contracts > DM help states Slack's group size limit [0.39ms]366367test/channel-command.test.ts:368(pass) channel list command > defaults to users.conversations for current user [1.40ms]369(pass) channel list command > with --user id uses users.conversations and sets user directly [0.73ms]370(pass) channel list command > with --user handle resolves via users.list before users.conversations [0.56ms]371(pass) channel list command > with --user unknown handle is a hard error [0.42ms]372(pass) channel list command > with --all uses conversations.list [0.37ms]373(pass) channel list command > forwards --limit and --cursor [0.32ms]374(pass) channel list command > --all and --user is a hard error [0.37ms]375(pass) channel list command > invalid --limit is a hard error [0.35ms]376(pass) channel list command > help text documents single-page pagination model [0.17ms]377(pass) channel mark command > URL target extracts workspace from URL [0.88ms]378(pass) channel mark command > URL target rejects --workspace flag [0.41ms]379(pass) channel mark command > channel target requires --ts [0.33ms]380(pass) channel mark command > URL target allows --ts override [0.32ms]381(pass) channel mark command > channel target with --ts calls conversations.mark [0.30ms]382383test/url.test.ts:384(pass) parseSlackMessageUrl > parses archives URL with p<digits> [0.09ms]385(pass) parseSlackMessageUrl > captures thread_ts from query when present [0.03ms]386(pass) buildSlackMessageUrl > builds a permalink for a root message [0.13ms]387(pass) buildSlackMessageUrl > includes thread metadata for replies [0.06ms]388389test/files.test.ts:390(pass) downloadSlackFile > downloads file and writes to disk [1.77ms]391(pass) downloadSlackFile > returns cached path when file already exists [0.81ms]392(pass) downloadSlackFile > throws SlackDownloadError on HTTP 404 [0.63ms]393(pass) downloadSlackFile > throws SlackDownloadError with httpStatus on HTTP error [0.57ms]394(pass) downloadSlackFile > throws SlackDownloadError on HTML auth page [0.38ms]395(pass) downloadSlackFile > throws SlackDownloadError on network error [0.57ms]396(pass) downloadSlackFile > throws SlackDownloadError when reading html body fails [0.52ms]397(pass) downloadSlackFile > throws SlackDownloadError when reading binary body fails [0.48ms]398(pass) tryDownloadSlackFile > returns ok result on success [0.69ms]399(pass) tryDownloadSlackFile > returns failure result on HTTP 404 [0.46ms]400(pass) tryDownloadSlackFile > returns failure result on network error [0.38ms]401(pass) tryDownloadSlackFile > propagates disk/write errors [0.56ms]402Warning: skipping file F1: Downloaded auth/login page instead of canvas content (token may be expired)403(pass) downloadMessageFiles > records canvas auth failures as structured errors [2.59ms]404Warning: skipping file F2: Failed to download file (404)405(pass) downloadMessageFiles > records non-canvas download failures with a local error path [1.33ms]406407test/search-query.test.ts:408(pass) W-prefixed user IDs in search > resolves a W-prefixed user ID to a from filter [1.39ms]409(pass) W-prefixed user IDs in search > returns a W-prefixed user ID without scanning users [0.22ms]410411test/users.test.ts:412(pass) resolveUserId > returns user ids unchanged [0.09ms]413(pass) resolveUserId > returns W-prefixed user ids unchanged [0.05ms]414(pass) resolveUserId > resolves @handle via users.list [0.10ms]415(pass) resolveUserId > resolves email via users.lookupByEmail [0.08ms]416(pass) resolveUserId > resolves @handle case-insensitively [0.06ms]417(pass) resolveUserId > falls back to users.list when lookupByEmail is unavailable [0.27ms]418419test/message-send.test.ts:420(pass) sendMessage > posts a normal message when no attachments are passed [1.93ms]421(pass) sendMessage > --no-unfurl disables link and media previews for immediate sends [0.37ms]422(pass) sendMessage > opens and sends to a DM for a W-prefixed user target [0.39ms]423(pass) sendMessage > returns a permalink when the workspace was resolved implicitly [0.15ms]424(pass) sendMessage > threaded reply returns thread_ts distinct from ts [0.15ms]425(pass) sendMessage > --reply-broadcast with --thread-ts sends reply_broadcast: true [0.12ms]426(pass) sendMessage > --reply-broadcast omits the field from chat.postMessage when flag is absent [0.09ms]427(pass) sendMessage > --reply-broadcast without --thread-ts throws [0.16ms]428(pass) sendMessage > --reply-broadcast on a URL target broadcasts using the message's derived thread_ts [0.73ms]429(pass) sendMessage > --reply-broadcast on a DM target throws (broadcasting is not meaningful for DMs) [0.19ms]430(pass) sendMessage > --reply-broadcast works alongside --blocks payload [1.32ms]431(pass) sendMessage > uploads attachment and uses message text as initial comment [1.26ms]432(pass) sendMessage > --no-unfurl cannot be combined with file attachments [0.26ms]433(pass) sendMessage > sends initial comment only for the first attachment [1.70ms]434(pass) sendMessage > uploads attachment without text when text is empty [1.21ms]435(pass) sendMessage > --blocks: reads Block Kit JSON from file and passes through unchanged [0.99ms]436(pass) sendMessage > --blocks: errors when JSON is not an array [0.75ms]437(pass) sendMessage > --blocks: errors on malformed JSON [0.66ms]438(pass) sendMessage > --blocks: overrides markdown-to-rich-text conversion when text is also provided [0.72ms]439(pass) sendMessage > sends Slack manual links in lists as rich-text link blocks [0.32ms]440(pass) sendMessage > --blocks: errors when an array element is not an object [0.76ms]441(pass) sendMessage > --schedule sends through chat.scheduleMessage and returns scheduled metadata [0.72ms]442(pass) sendMessage > --schedule-in computes a relative post_at [0.43ms]443(pass) sendMessage > --no-unfurl disables link and media previews for scheduled sends [0.30ms]444(pass) sendMessage > --schedule composes with blocks, thread replies, and reply broadcast [0.82ms]445(pass) sendMessage > --schedule cannot be combined with file attachments [0.24ms]446(pass) composeMessage > --no-unfurl disables link and media previews when CI sends immediately [1.03ms]447(pass) composeMessage > keeps Slack's default preview behavior for a standard CI send [0.18ms]448(pass) composeMessage > --no-unfurl disables previews for a URL target when CI sends immediately [0.52ms]449(pass) scheduled message management > lists scheduled messages and forwards channel filters [0.46ms]450(pass) scheduled message management > cancels scheduled messages with the required channel id [0.35ms]451(pass) scheduled message time parsing > parses absolute ISO timestamps with explicit timezones [0.12ms]452(pass) scheduled message time parsing > parses named relative times like monday 9am [0.45ms]453(pass) scheduled message time parsing > rejects schedule times beyond Slack's 120 day limit [0.09ms]454(pass) editMessage > edits a normal text message without blocks [0.51ms]455(pass) editMessage > edits literal angle bracket text without blocks [0.14ms]456(pass) editMessage > edits a message URL with a link label without blocks [0.17ms]457(pass) editMessage > edits an inline mailto link without escaping it [0.19ms]458(pass) editMessage > edits an inline usergroup mention without escaping it [0.15ms]459(pass) editMessage > edits a channel target with inline formatting without blocks [0.12ms]460(pass) editMessage > edits a channel target with rich text blocks when text contains a list [0.16ms]461(pass) editMessage > edits a normal message without blocks when no --blocks file is passed [0.10ms]462(pass) editMessage > edits a message URL with Block Kit JSON from file [0.91ms]463(pass) editMessage > edits a channel target with --ts and Block Kit JSON from file [0.89ms]464465test/message-compact.test.ts:466(pass) toCompactMessage > includes file with path on successful download [0.23ms]467(pass) toCompactMessage > includes file with error on failed download [0.23ms]468(pass) toCompactMessage > excludes files with no downloadedPaths entry [0.04ms]469(pass) toCompactMessage > mixes successful and failed downloads [0.09ms]470(pass) toCompactMessage > failed download preserves file metadata for content-type filtering [0.07ms]471(pass) passesContentTypeFilter with failed downloads > image message with failed download still passes image filter [0.12ms]472(pass) passesContentTypeFilter with failed downloads > snippet message with failed download still passes snippet filter [0.07ms]473(pass) passesContentTypeFilter with failed downloads > message without download entry has no files and passes text filter [0.04ms]474(pass) toCompactMessage filename preservation > does not fall back to title when name is missing [0.08ms]475476test/targets.test.ts:477(pass) parseMsgTarget > parses slack message URLs [0.09ms]478(pass) parseMsgTarget > accepts #channel [0.08ms]479(pass) parseMsgTarget > accepts bare channel names [0.05ms]480(pass) parseMsgTarget > accepts channel IDs [0.05ms]481(pass) parseMsgTarget > accepts user IDs as DM targets [0.02ms]482(pass) parseMsgTarget > accepts W-prefixed user IDs as DM targets [0.03ms]483(pass) parseMsgTarget > accepts user IDs with leading/trailing whitespace [0.02ms]484(pass) parseMsgTarget > does not treat short U-prefixed strings as user IDs [0.02ms]485(pass) parseMsgTarget > does not treat short W-prefixed strings as user IDs [0.01ms]486487test/user-id.test.ts:488(pass) isUserId > accepts U-prefixed and W-prefixed Slack user IDs [0.05ms]489(pass) isUserId > preserves the existing length and character restrictions [0.03ms]490491test/messages.test.ts:492(pass) fetchThread > returns the thread root and replies in chronological order [0.71ms]493494test/safe-mode.test.ts:495(pass) isSafeModeEnabled > enabled via CLI flag [0.09ms]496(pass) isSafeModeEnabled > enabled for env value "1" [0.03ms]497(pass) isSafeModeEnabled > enabled for env value "true" [0.02ms]498(pass) isSafeModeEnabled > enabled for env value "TRUE"499(pass) isSafeModeEnabled > enabled for env value "yes"500(pass) isSafeModeEnabled > enabled for env value "on"501(pass) isSafeModeEnabled > enabled for env value " 1 "502(pass) isSafeModeEnabled > disabled for env value "0" [0.02ms]503(pass) isSafeModeEnabled > disabled for env value "false"504(pass) isSafeModeEnabled > disabled for env value "off"505(pass) isSafeModeEnabled > disabled for env value "no"506(pass) isSafeModeEnabled > disabled for env value ""507(pass) isSafeModeEnabled > disabled when env var is unset and flag is absent [0.03ms]508(pass) safeModeBlockedError > names the blocked action [0.05ms]509(pass) redirectSendToDraft > rejects unsupported send option {510 attach: [ "./report.md" ],511} [0.42ms]512(pass) redirectSendToDraft > rejects unsupported send option {513 blocks: "/tmp/blocks.json",514} [0.03ms]515(pass) redirectSendToDraft > rejects unsupported send option {516 schedule: "2030-01-01T00:00:00Z",517} [0.02ms]518(pass) redirectSendToDraft > rejects unsupported send option {519 scheduleIn: "3h",520}521(pass) redirectSendToDraft > rejects unsupported send option {522 replyBroadcast: true,523} [0.01ms]524(pass) redirectSendToDraft > lists all unsupported flags at once [0.13ms]525(pass) redirectSendToDraft > rejects in CI where no interactive editor is available [0.15ms]526⚠ Safe mode active: redirecting "message send" → draft editor. Nothing posts until a human sends it from the editor.527(pass) redirectSendToDraft > opens a draft with the send text and thread context [0.19ms]528529test/format-outbound.test.ts:530(pass) formatOutboundSlackText > promotes bare user IDs to Slack mention tokens [0.08ms]531(pass) formatOutboundSlackText > leaves already-formatted mention tokens alone [0.03ms]532(pass) formatOutboundSlackText > leaves already-formatted usergroup mention tokens alone [0.02ms]533(pass) formatOutboundSlackText > promotes broadcast mentions [0.03ms]534(pass) formatOutboundSlackText > escapes bare < > & in literal text [0.05ms]535(pass) formatOutboundSlackText > does not escape inside already-formatted Slack tokens [0.02ms]536(pass) formatOutboundSlackText > does not promote email-like or mid-word @ [0.01ms]537(pass) formatOutboundSlackText > handles empty input538(pass) formatOutboundSlackText > real-world CI dump stays readable with mention + URL [0.01ms]539540test/render.test.ts:541(pass) renderSlackMessageContent > prefers blocks [0.14ms]542(pass) renderSlackMessageContent > preserves usergroup and broadcast elements from rich text [0.20ms]543(pass) renderSlackMessageContent > omits malformed usergroup and broadcast elements [0.09ms]544(pass) renderSlackMessageContent > falls back to attachments when text is empty [0.08ms]545(pass) renderSlackMessageContent > includes section fields and button URLs [0.06ms]546(pass) renderSlackMessageContent > includes attachment fields [0.05ms]547(pass) renderSlackMessageContent > renders forwarded message with author and source link [0.20ms]548(pass) renderSlackMessageContent > renders forwarded message with author name only [0.08ms]549(pass) renderSlackMessageContent > renders forwarded message with no author [0.04ms]550(pass) renderSlackMessageContent > includes forwarded file links in quoted forwarded body [0.07ms]551(pass) renderSlackMessageContent > renders nested forwarded attachments similarly to normal attachments [0.09ms]552(pass) renderSlackMessageContent > deduplicates repeated forwarded body content [0.12ms]553(pass) renderSlackMessageContent > handles cyclic forwarded attachments without infinite recursion [0.08ms]554(pass) renderSlackMessageContent > does not treat link unfurl as forwarded message [0.07ms]555(pass) renderSlackMessageContent > combines blocks and non-shared attachments [0.06ms]556557test/desktop-auth-paths.test.ts:558(pass) Windows Store Slack package detection > matches known Microsoft Store package identifiers [0.09ms]559(pass) Windows Store Slack package detection > does not match unrelated packages [0.02ms]560561test/search-files.test.ts:562Warning: skipping file F1: Failed to download file (404)563(pass) searchFilesViaSearchApi > skips failed downloads and keeps later successful matches [2.27ms]564Warning: skipping file F1: Failed to download file (404)565(pass) searchFilesInChannelsFallback > continues after a failed download in files.list results [2.08ms]566(pass) SlackApiClient browser API guards > fails fast on rate-limit retry windows by default [1.05ms]567(pass) SlackApiClient browser API guards > surfaces request timeouts with the Slack method name [0.28ms]568569test/update.test.ts:570(pass) compareSemver > equal versions return 0 [0.12ms]571(pass) compareSemver > strips v prefix [0.03ms]572(pass) compareSemver > newer major [0.02ms]573(pass) compareSemver > newer minor [0.02ms]574(pass) compareSemver > newer patch [0.01ms]575(pass) compareSemver > older version returns negative [0.01ms]576(pass) compareSemver > handles 0.x versions [0.03ms]577578 399 pass579 0 fail580 817 expect() calls581Ran 399 tests across 38 files. [635.00ms]fixupPhase
582shrinking RPATHs of ELF executables and libraries in /nix/store/wjp0x8gak81fq19cbwxl8fsn8kv15h6s-agent-slack-0.10.2583checking for references to /build/ in /nix/store/wjp0x8gak81fq19cbwxl8fsn8kv15h6s-agent-slack-0.10.2...584patching script interpreter paths in /nix/store/wjp0x8gak81fq19cbwxl8fsn8kv15h6s-agent-slack-0.10.2installCheckPhase
585Executing versionCheckPhase586Successfully managed to find version 0.10.2 in the output of the command /nix/store/wjp0x8gak81fq19cbwxl8fsn8kv15h6s-agent-slack-0.10.2/bin/agent-slack --version5870.10.2588Finished versionCheckPhase589no Makefile or custom installCheckPhase, doing nothing