@stratusagent/channel-slack 0.12.5 → 0.13.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +52 -42
- package/dist/index.d.ts +26 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +832 -148
- package/dist/index.js.map +1 -1
- package/package.json +3 -3
package/README.md
CHANGED
|
@@ -5,7 +5,7 @@ Slack adapter for Stratus agents. **One Slack app per agent** — Slack has no w
|
|
|
5
5
|
- **Resumable conversations**: session keys are `slack:<agent>:<team>:<channel>:<thread_ts ?? ts>` (a DM's top level: the DM channel id alone; a thread in a DM adds its `thread_ts`) — a thread is a conversation, it survives daemon restarts, and two agents sharing a thread keep fully separate sessions. A turn parked on a human when the daemon died is re-asked after the restart, and a turn that was still running is continued from where it got to (unless the agent runs on a harness — `codex` or a Claude subscription — where it is failed instead, since the harness may already have acted on it); either way, when it finishes its reply is posted into the thread as a fresh message — the placeholder it would have edited belonged to the old process.
|
|
6
6
|
- **Replies post when they are ready**: by default each message is posted once, finished: what the agent writes before starting a tool is posted as the tool starts, and the reply follows, with Slack's loading status (`assistant.threads.setStatus` — "is thinking…", "is running shell.run…") shown while the turn works, so the notification carries the answer. The `stream` reply mode (`slack.replies` in the [config](../../docs/guides/slack.md#how-replies-appear)) keeps the placeholder-and-edit rendering instead: post `…`, edit as deltas arrive (throttled for `chat.update` limits), show `⚙ tool…` status lines, finalize with the full reply. Either way a reply that outgrows one message is split across several.
|
|
7
7
|
- **Markdown is translated to Slack's mrkdwn** on the way out — `**bold**` to `*bold*`, `*italic*` to `_italic_`, `~~struck~~` to `~struck~`, `[text](https://…)` to `<https://…|text>`, and a `#` heading to a bold line, since mrkdwn has no headings. A bare address is sent as `<https://…>`, Slack's own link markup, so emphasis around it (`**https://…**`) cannot be read as part of it, and a `*`, `_`, or `~` inside one is part of the address rather than a marker. Trailing punctuation (`.`, `,`, `**`) and a `)` the address never opened belong to the sentence, as in GFM autolinks, so `…/wiki/Function_(mathematics)` stays whole. A bare address is sent as `<https://…>`, Slack's own link markup, so emphasis around it (`**https://…**`) cannot be read as part of it, and the `*`, `_`, or `~` inside one is part of the address rather than a marker; trailing punctuation (`.`, `,`, `**`) is the sentence's, as in GFM autolinks. The reply is read once into tokens and written back from those, so what counts as code is decided one time rather than by each rule in turn. Three things follow from that. **A code run is one token**: nothing reads or rewrites inside it, an unclosed fence included, and the newlines in a fence are not line breaks — so a `#` on a line of somebody's shell script is not a heading. A run of N backticks opens code and only a run of exactly N closes it, which is what lets ``a span with a ` in it`` and a ````-fence holding a ```-fence work; one or two unmatched backticks are text, as they are in Markdown, but a pair is a span however far apart, because Slack pairs them too. **A delimiter is matched to its partner**, across whatever sits between — ``**the `fs.read` tool**`` is bold around a snippet, not four literal asterisks — though never across a line, so a marker still being streamed stays literal until its closing half arrives. A run is spent rather than matched whole, so the three asterisks ending `**bold and *italic***` close the italic with one and the bold with two; what no pair spends stays on the line as text, and what a run cannot buy — the third tilde of `~~~struck~~~`, a style that does not exist — is never charged for. **A wrapper is only written where its own character is not already loose** in what it wraps: Slack has one delimiter per style and no way to nest it, so a heading that already contains bold keeps the bold it has rather than gaining a second pair that would print instead of render, and `# glob *.ts` keeps an asterisk that was never a marker. A heading sheds its hashes and its trailing spaces from the prose that holds them, never from a snippet. Anything whose spelling already matches — lists, block quotes, inline code — is untouched. **A pipe table**, which mrkdwn has no syntax for, becomes a code block with its columns padded to line up (alignment colons respected, `**`/`` ` `` markers dropped from cells, since nothing renders inside code); a grid wider than 60 characters — past what a phone shows unwrapped — or one with a link in it (a link inside a code block is not clickable) becomes one line per row, `*Header*: value · *Header*: value`. A one-column table has nothing to line up and becomes a bulleted list under its bold header. A table inside a fence is somebody's text and stays as written, and a grid longer than one message is split like any code block, closed at the cut and reopened in the next, with its header and rule repeated so every part names its columns.
|
|
8
|
-
- **Mention to start, then it stays in the thread.** A mention opens a conversation; every reply in that thread
|
|
8
|
+
- **Mention to start, then it stays in the thread.** A mention opens a conversation; every later reply in that thread from someone the agent admits reaches it without tagging it again (by default only its listed principals; see [Who can talk to an agent](#who-counts-as-the-operator)), and free-form DMs are unchanged. A mention partway into an existing thread opens the conversation with what was said before it: the thread's parent and its newest 39 earlier messages. A mention at the top of a channel opens with the channel's 20 most recent messages instead, which is where a channel per client or per project keeps its context. Either way each message keeps its own speaker and its own trust, so a principal's mention does not carry a stranger's earlier words in under the principal's label (other bots count as `unknown`, and under `admit: "principals"` unlisted senders are left out). This needs the history scopes below; without them the agent sees only the message that named it, and the adapter logs a warning. Who an untagged reply is for is decided by [Who a message is for](#who-a-message-is-for). Inbound mentions of other users are humanized to `@Display Name` for the model; redeliveries are deduped so a slow turn never runs twice — in memory while the process remembers them, and after a restart by the gateway: each message is dispatched with its own key (`idempotencyKey`), a repeat runs no second turn, and the adapter posts that message's own reply and files (a file changed since that turn is skipped, since the path may now hold another file), or its failure if the turn failed — once more, if the process died after posting it, which beats a reply never posted.
|
|
9
9
|
- **Approval buttons** for the gateway's `remote` permission mode: a gated tool call parks the turn and asks in its thread with **Allow once** / **Always allow** / **Deny**. See [Approving tool calls](#approving-tool-calls) — clicks are authorized by *who clicked*, never by who can see the message, and **Always allow** is offered only where the daemon would actually remember it.
|
|
10
10
|
- **Tokens are gateway infrastructure secrets**, stored in the `channels` namespace of `~/.stratus/credentials.json` — never in an agent's credential allowlist:
|
|
11
11
|
|
|
@@ -43,9 +43,12 @@ they are the whole model:
|
|
|
43
43
|
4. **In a thread with several agents, an untagged reply goes to the agent
|
|
44
44
|
the thread belongs to.** That is the first agent to hold it: the one its
|
|
45
45
|
first message named, or the one that posted it. Naming another agent
|
|
46
|
-
gets that agent's answer to that message, and
|
|
47
|
-
|
|
48
|
-
|
|
46
|
+
gets that agent's answer to that message, and makes the untagged
|
|
47
|
+
replies the same person sends after it that agent's too, until they
|
|
48
|
+
name someone else (`@Bea your turn`, then `and?`, is Bea's). The thread
|
|
49
|
+
itself stays where it was: an untagged reply from anyone who has not
|
|
50
|
+
named an agent in it goes to its owner. Who each person last named is
|
|
51
|
+
kept in memory, so after a restart it falls back to the owner. A
|
|
49
52
|
message an agent already took stays that agent's: Slack redelivering it
|
|
50
53
|
after a restart goes back to the agent that accepted it — and if that
|
|
51
54
|
agent's app has not come back, the others stand down rather than run it
|
|
@@ -63,35 +66,33 @@ they are the whole model:
|
|
|
63
66
|
5. **How an agent listens is the soul's to say.** Rules 3 and 4 are the
|
|
64
67
|
`thread` mode, the default. A soul with `listens: mentions` takes only
|
|
65
68
|
messages that name it, and hears the rest. One with `listens: judge`
|
|
66
|
-
hears everything and
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
69
|
+
hears everything and runs a turn nobody asked for, told it may answer
|
|
70
|
+
with nothing, on each untagged message that is its own by rule 4: the
|
|
71
|
+
agent the sender last named, else the thread's owner (card 541). There
|
|
72
|
+
is no window: an owner an hour past its last answer still takes an
|
|
73
|
+
untagged instruction in its thread, and only one agent takes each
|
|
74
|
+
message. A judged turn does not take images (they are named, as for a
|
|
75
|
+
message that was overheard). Each decision is logged as one line with
|
|
76
|
+
the agent, the message's ts, and the reason (`addressed it last`,
|
|
77
|
+
`owner`, or whose it was instead), never the text. An approver's
|
|
78
|
+
untagged stop is never judged: it stops the holder's turn or, with
|
|
79
|
+
nothing running, is only heard. A turn that decides on silence posts nothing: its
|
|
73
80
|
placeholder is opened only on the first text it streams, never on a
|
|
74
81
|
tool line, and a failed one posts no error note — one the daemon died
|
|
75
82
|
inside, failed at the next start, included, a line it had already
|
|
76
83
|
streamed staying as it was. A line an attempt the
|
|
77
84
|
provider abandoned had already posted is taken back when the retry
|
|
78
|
-
decides on silence.
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
still deciding may be answered by both it and a thread-rule colleague
|
|
86
|
-
that held the thread before — and the owner takes it back by answering
|
|
87
|
-
in it. Which of the two spoke last is read off the thread, not the
|
|
85
|
+
decides on silence. A mentions-only agent takes no part in the
|
|
86
|
+
holder rule: a thread-rule agent stands down in a thread one owns, since
|
|
87
|
+
that agent is being talked to and waits to be named. A judging agent
|
|
88
|
+
that chooses to speak on a turn nobody asked for takes the thread,
|
|
89
|
+
recorded once its reply has landed (a message typed while it was still
|
|
90
|
+
deciding stays the previous owner's), and the owner takes it back by
|
|
91
|
+
answering in it. Which of the two spoke last is read off the thread, not the
|
|
88
92
|
clock: whichever reply sits lowest, since that is the one a reader
|
|
89
93
|
answers, and a placeholder posted early and filled in slowly sits above
|
|
90
94
|
a reply posted while it was being written. A colleague's reply is never
|
|
91
95
|
judged, only heard.
|
|
92
|
-
The window also counts messages this daemon has dispatched that the
|
|
93
|
-
session does not hold yet, so a burst typed inside one turn is judged
|
|
94
|
-
up to the window and heard past it.
|
|
95
96
|
6. **Standing down is not leaving.** An agent in a thread hears what is
|
|
96
97
|
said to the other agent in it — the question that named its colleague,
|
|
97
98
|
the untagged replies that were the colleague's to answer, and what the
|
|
@@ -99,9 +100,10 @@ they are the whole model:
|
|
|
99
100
|
nothing posted. The next time it is asked, it answers as someone who
|
|
100
101
|
followed the conversation rather than one who stepped out of the room.
|
|
101
102
|
What it hears is marked as said to somebody else, so a stranger's words
|
|
102
|
-
in a shared thread never read to it as an instruction
|
|
103
|
-
|
|
104
|
-
|
|
103
|
+
in a shared thread never read to it as an instruction. By default an
|
|
104
|
+
unlisted sender is not overheard at all; under `"admit": "anyone"` a
|
|
105
|
+
stranger overheard lowers its session's trust label exactly as one who
|
|
106
|
+
addressed it would, since their text is in the transcript either way. A
|
|
105
107
|
colleague's reply is heard under the colleague's own label, never as a
|
|
106
108
|
person's: an agent's word is at most `agent`, and carries whatever its
|
|
107
109
|
session has been exposed to. Replies only — a turn that said nothing,
|
|
@@ -266,7 +268,9 @@ The manual equivalent, if you prefer:
|
|
|
266
268
|
When `stratus serve` runs with `approvals.mode: "remote"`, a gated tool call
|
|
267
269
|
parks the turn and the adapter asks here. The question goes to the thread the
|
|
268
270
|
turn is happening in; a turn with no Slack conversation of its own (scheduled
|
|
269
|
-
work, a delegate) asks in the configured `slackChannel`.
|
|
271
|
+
work, a delegate) asks in the configured `slackChannel`. With no
|
|
272
|
+
`slackChannel` set, a schedule's firing asks in the schedule's own Slack
|
|
273
|
+
destination, under its report thread if it has one; a delegate is denied.
|
|
270
274
|
|
|
271
275
|
The request names the **site** for a call judged by one (`browser.act`),
|
|
272
276
|
because its arguments are a CSS selector and say nothing about where a click
|
|
@@ -418,12 +422,14 @@ So a message is the operator's only when the operator has said so:
|
|
|
418
422
|
}
|
|
419
423
|
```
|
|
420
424
|
|
|
421
|
-
A turn from a listed id reaches the agent as its operator's (`user`).
|
|
422
|
-
|
|
423
|
-
`
|
|
425
|
+
A turn from a listed id reaches the agent as its operator's (`user`). By
|
|
426
|
+
default anyone else gets no turn (see the door below). Under
|
|
427
|
+
`"admit": "anyone"`, a turn from anyone else — in a DM as much as in a
|
|
428
|
+
channel — reaches it as `unknown`, and the session it lands in stays `unknown` from then on: that
|
|
424
429
|
text is in the transcript. Every fact the agent remembers afterwards
|
|
425
430
|
carries the label, and the prompt renders it under a heading that says so.
|
|
426
|
-
With no list at all,
|
|
431
|
+
With no list at all, nobody is a principal: under the default nobody gets a
|
|
432
|
+
turn, under `"anyone"` every Slack sender is `unknown`, and `stratus serve`
|
|
427
433
|
says so at startup. An agent's own entry replaces the shared list;
|
|
428
434
|
`"slackUsers": []` excludes an agent from it.
|
|
429
435
|
|
|
@@ -441,15 +447,17 @@ prefers nobody, so under it every author is an id.
|
|
|
441
447
|
|
|
442
448
|
The sender is judged on **every message**, not once per thread. A thread
|
|
443
449
|
keys one session for everyone in it, so an authorized member can open one
|
|
444
|
-
and a stranger can mention the agent inside it afterwards
|
|
445
|
-
|
|
446
|
-
|
|
450
|
+
and a stranger can mention the agent inside it afterwards. By default the
|
|
451
|
+
stranger's message is refused before it becomes a turn, and the session is
|
|
452
|
+
untouched. Under `"admit": "anyone"` it becomes an `unknown` turn that
|
|
453
|
+
lowers the session, and the authorized member's next turn does not raise it
|
|
454
|
+
back.
|
|
447
455
|
|
|
448
|
-
The list is a **
|
|
449
|
-
marked `unknown`. For an agent that holds tools that is not enough — a
|
|
456
|
+
The list is a **door** by default: an unlisted sender gets no turn. A
|
|
450
457
|
stranger's message is not merely uncertain, it is a prompt they chose, and
|
|
451
|
-
|
|
452
|
-
|
|
458
|
+
an agent that holds tools should not run on it. `"admit": "anyone"` turns
|
|
459
|
+
the list back into a **label**, where an unlisted sender still gets a turn,
|
|
460
|
+
marked `unknown`. Per agent, as here, where Bea answers anyone:
|
|
453
461
|
|
|
454
462
|
```jsonc
|
|
455
463
|
{
|
|
@@ -463,7 +471,9 @@ approver clicks. `admit` makes the list a **door**:
|
|
|
463
471
|
}
|
|
464
472
|
```
|
|
465
473
|
|
|
466
|
-
Under `"admit": "principals"`
|
|
474
|
+
Under `"admit": "principals"` (the default; the daemon resolves an absent
|
|
475
|
+
key to it, while an embedder calling the adapter directly without `admit`
|
|
476
|
+
still gets `anyone`) a sender not in `slackUsers` gets no turn:
|
|
467
477
|
the message is refused before it takes a place in the queue, the agent
|
|
468
478
|
does not overhear it into a thread's transcript either, and nothing is
|
|
469
479
|
posted back — a reply is a conversation the operator chose not to have.
|
|
@@ -472,8 +482,8 @@ id — one per message, however many times Slack delivers it, and only for a
|
|
|
472
482
|
message the agent would have taken up: a mention, or a reply in a thread
|
|
473
483
|
the agent holds, whether the daemon remembers that or its sessions do. A
|
|
474
484
|
stranger's reply in a thread the agent was never part of is dropped
|
|
475
|
-
without a line. `"anyone"` is
|
|
476
|
-
|
|
485
|
+
without a line. The daemon's default is `"principals"`; `"anyone"` is the
|
|
486
|
+
default only for an embedder calling the adapter directly. The key inherits per agent like
|
|
477
487
|
`slackUsers`, so Bea above stays open while everyone else is closed. A value
|
|
478
488
|
that is neither word is a config error, never `anyone`: this is the one
|
|
479
489
|
setting here whose misspelling would open the door. So is a `slackUsers`
|
package/dist/index.d.ts
CHANGED
|
@@ -40,9 +40,11 @@ export interface SlackAgentConfig {
|
|
|
40
40
|
*/
|
|
41
41
|
principals?: string[];
|
|
42
42
|
/**
|
|
43
|
-
* Whether an unlisted sender gets a turn at all. `
|
|
44
|
-
*
|
|
45
|
-
*
|
|
43
|
+
* Whether an unlisted sender gets a turn at all. `principals` refuses
|
|
44
|
+
* them before a turn starts and does not let the agent overhear them
|
|
45
|
+
* either; `anyone` admits them as `unknown`. Absent here means `anyone`,
|
|
46
|
+
* for embedders that predate the option. The daemon always passes it:
|
|
47
|
+
* its config resolves an absent `principals.admit` to `principals` — the text
|
|
46
48
|
* would be in the transcript, which is what this mode exists to keep
|
|
47
49
|
* out. The label above is provenance; this is authorization.
|
|
48
50
|
*/
|
|
@@ -359,6 +361,10 @@ export interface SlackWebLike {
|
|
|
359
361
|
is_im?: boolean;
|
|
360
362
|
is_private?: boolean;
|
|
361
363
|
is_mpim?: boolean;
|
|
364
|
+
/** A channel, public or private, as Slack states it. */
|
|
365
|
+
is_channel?: boolean;
|
|
366
|
+
/** A private channel in Slack's older model (group DMs set `is_mpim` too). */
|
|
367
|
+
is_group?: boolean;
|
|
362
368
|
num_members?: number;
|
|
363
369
|
/** Shared with another organization through Slack Connect. */
|
|
364
370
|
is_ext_shared?: boolean;
|
|
@@ -469,10 +475,26 @@ export interface SlackAdapterOptions {
|
|
|
469
475
|
/**
|
|
470
476
|
* Test injection: the clock, in milliseconds, that an upload's place in
|
|
471
477
|
* the thread is read from (`ReplyOutcome.spokeAt`) when the upload's
|
|
472
|
-
* answer carries no share ts
|
|
478
|
+
* answer carries no share ts, and that dates `start()`, after which every
|
|
479
|
+
* claim in a thread is seen live. Defaults to `Date.now`.
|
|
473
480
|
*/
|
|
474
481
|
now?: () => number;
|
|
482
|
+
/**
|
|
483
|
+
* Where to keep the messages addressed to an agent while the daemon was
|
|
484
|
+
* restarting or stopping, so the next start answers them. The gateway
|
|
485
|
+
* keeps channels connected through its drain and refuses new turns then
|
|
486
|
+
* (`GatewayStoppingError`); a message refused that way is told the agent
|
|
487
|
+
* is restarting and is written here — conversation, ts, thread, sender and
|
|
488
|
+
* channel type, never its text — then read back from Slack and handled
|
|
489
|
+
* as if it had just arrived once the adapter starts again. Without it, the
|
|
490
|
+
* refusal is said and nothing is kept.
|
|
491
|
+
*/
|
|
492
|
+
pendingIntakePath?: string;
|
|
475
493
|
}
|
|
494
|
+
/** What a person who wrote during a restart is told, when it was kept. */
|
|
495
|
+
export declare const RESTARTING_REPLY_TEXT = "I'm restarting right now. I'll answer this as soon as I'm back.";
|
|
496
|
+
/** The same, for a daemon that is stopping rather than restarting. */
|
|
497
|
+
export declare const STOPPING_REPLY_TEXT = "I'm shutting down right now. I'll answer this when I'm started again.";
|
|
476
498
|
/**
|
|
477
499
|
* A client whose every post goes out without link or media previews, for
|
|
478
500
|
* an agent configured with `linkPreviews: false`. Applied once around the
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAMA,OAAO,EA0BL,KAAK,eAAe,EAMpB,KAAK,UAAU,EAChB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAIL,KAAK,WAAW,EAChB,KAAK,cAAc,EAUpB,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|