experimental-ash 0.3.0-alpha.8 → 0.3.0-alpha.9
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/dist/src/channel/adapter.d.ts +39 -0
- package/dist/src/channel/adapter.d.ts.map +1 -1
- package/dist/src/channel/adapter.js.map +1 -1
- package/dist/src/channel/slack-adapter.d.ts.map +1 -1
- package/dist/src/channel/slack-adapter.js +66 -3
- package/dist/src/channel/slack-adapter.js.map +1 -1
- package/dist/src/internal/application/package.js +1 -1
- package/dist/src/internal/attachments/data.d.ts +11 -0
- package/dist/src/internal/attachments/data.d.ts.map +1 -1
- package/dist/src/internal/attachments/data.js +73 -0
- package/dist/src/internal/attachments/data.js.map +1 -1
- package/dist/src/internal/attachments/errors.d.ts +60 -0
- package/dist/src/internal/attachments/errors.d.ts.map +1 -0
- package/dist/src/internal/attachments/errors.js +37 -0
- package/dist/src/internal/attachments/errors.js.map +1 -0
- package/dist/src/internal/attachments/refs.d.ts +95 -0
- package/dist/src/internal/attachments/refs.d.ts.map +1 -0
- package/dist/src/internal/attachments/refs.js +132 -0
- package/dist/src/internal/attachments/refs.js.map +1 -0
- package/dist/src/public/channels/index.d.ts +3 -1
- package/dist/src/public/channels/index.d.ts.map +1 -1
- package/dist/src/public/channels/index.js +2 -0
- package/dist/src/public/channels/index.js.map +1 -1
- package/docs/public/channels/README.md +13 -0
- package/docs/public/channels/attachments.md +168 -0
- package/package.json +1 -1
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import type { ContextAccessor } from "../context/key.js";
|
|
2
2
|
import type { ContextProvider } from "../context/provider.js";
|
|
3
3
|
import type { StepInput } from "../harness/types.js";
|
|
4
|
+
import type { AttachmentRef } from "../internal/attachments/refs.js";
|
|
4
5
|
import type { HandleMessageStreamEvent } from "../protocol/message.js";
|
|
5
6
|
import type { DeliverPayload } from "./types.js";
|
|
6
7
|
/**
|
|
@@ -46,6 +47,28 @@ type EventHandler<T extends HandleMessageStreamEvent["type"], TCtx extends Chann
|
|
|
46
47
|
export type ChannelEventHandlers<TCtx extends ChannelAdapterContext<any> = ChannelAdapterContext> = {
|
|
47
48
|
[K in HandleMessageStreamEvent["type"]]?: EventHandler<K, TCtx>;
|
|
48
49
|
};
|
|
50
|
+
/**
|
|
51
|
+
* Channel-owned resolver that turns an opaque {@link AttachmentRef} back
|
|
52
|
+
* into raw bytes.
|
|
53
|
+
*
|
|
54
|
+
* Attachment refs are the wire format channels use to carry inbound
|
|
55
|
+
* file identity across step boundaries without inlining the payload
|
|
56
|
+
* (inline bytes trip the Vercel Queue 8 KB per-field multipart cap).
|
|
57
|
+
* A channel that ingests file attachments must provide a resolver so
|
|
58
|
+
* the staging layer can re-fetch the bytes on demand at turn time.
|
|
59
|
+
*
|
|
60
|
+
* The resolver is called once per inbound file per turn, inside a
|
|
61
|
+
* workflow step boundary. It has full Node access and can reach any
|
|
62
|
+
* credential the adapter captured at construction time via closure
|
|
63
|
+
* (route options, adapter state, env-derived tokens, etc.).
|
|
64
|
+
*
|
|
65
|
+
* Throw {@link import("../internal/attachments/errors.js").AshAttachmentError}
|
|
66
|
+
* to surface structured failures to observability. Uncategorized
|
|
67
|
+
* throws are wrapped as `resolver-threw` by the staging dispatch.
|
|
68
|
+
*/
|
|
69
|
+
export interface AttachmentResolver {
|
|
70
|
+
resolve(ref: AttachmentRef): Promise<Buffer>;
|
|
71
|
+
}
|
|
49
72
|
/**
|
|
50
73
|
* Plain-object adapter that replaces the `Channel` abstract class.
|
|
51
74
|
*
|
|
@@ -109,6 +132,22 @@ export type ChannelAdapter<TCtx extends ChannelAdapterContext<any> = ChannelAdap
|
|
|
109
132
|
* @internal — set by `createSlackBaseAdapter`, not authored by users.
|
|
110
133
|
*/
|
|
111
134
|
readonly createAdapterContext?: (base: ChannelAdapterContext) => ChannelAdapterContext;
|
|
135
|
+
/**
|
|
136
|
+
* Optional resolver that turns an opaque {@link AttachmentRef}
|
|
137
|
+
* produced by this adapter into raw bytes.
|
|
138
|
+
*
|
|
139
|
+
* Channels that produce `FilePart`s whose `data` is an
|
|
140
|
+
* `ash-attachment:` URL must declare a resolver here so the
|
|
141
|
+
* staging layer can re-fetch the bytes at turn time. Channels that
|
|
142
|
+
* never emit refs (test adapters, framework `http` / `schedule` /
|
|
143
|
+
* `subagent` pass-throughs) omit it.
|
|
144
|
+
*
|
|
145
|
+
* Attachment resolvers are stateless handlers — all state (bot
|
|
146
|
+
* tokens, API credentials, cache) lives on the adapter and is
|
|
147
|
+
* captured by closure at construction time. Do not store
|
|
148
|
+
* per-resolve state on the handler.
|
|
149
|
+
*/
|
|
150
|
+
readonly attachments?: AttachmentResolver;
|
|
112
151
|
} & ChannelEventHandlers<TCtx>;
|
|
113
152
|
/**
|
|
114
153
|
* Produces the default {@link StepInput} when no custom adapter `deliver`
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../../../src/channel/adapter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACzD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,wBAAwB,CAAC;AACvE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAMjD;;;;;;;;GAQG;AACH,MAAM,WAAW,qBAAqB,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IACrE;;;OAGG;IACH,KAAK,EAAE,MAAM,CAAC;IAEd;;;OAGG;IACH,QAAQ,CAAC,GAAG,EAAE,eAAe,CAAC;CAC/B;AAMD;;;GAGG;AACH,KAAK,SAAS,CAAC,CAAC,SAAS,wBAAwB,CAAC,MAAM,CAAC,IACvD,OAAO,CAAC,wBAAwB,EAAE;IAAE,IAAI,EAAE,CAAC,CAAA;CAAE,CAAC,SAAS;IAAE,IAAI,EAAE,MAAM,CAAC,CAAA;CAAE,GAAG,CAAC,GAAG,SAAS,CAAC;AAE3F;;;GAGG;AACH,KAAK,YAAY,CACf,CAAC,SAAS,wBAAwB,CAAC,MAAM,CAAC,EAC1C,IAAI,SAAS,qBAAqB,CAAC,GAAG,CAAC,GAAG,qBAAqB,IAC7D,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,IAAI,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;AAE5D;;;;GAIG;AACH,MAAM,MAAM,oBAAoB,CAAC,IAAI,SAAS,qBAAqB,CAAC,GAAG,CAAC,GAAG,qBAAqB,IAC9F;KACG,CAAC,IAAI,wBAAwB,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,YAAY,CAAC,CAAC,EAAE,IAAI,CAAC;CAChE,CAAC;AAMJ;;;;;;;;;;;;;GAaG;AACH,MAAM,MAAM,cAAc,CAAC,IAAI,SAAS,qBAAqB,CAAC,GAAG,CAAC,GAAG,qBAAqB,IAAI;IAC5F;;;;;;OAMG;IACH,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAEvB;;;;OAIG;IACH,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAEzC;;;;;;;;;;;;;;OAcG;IACH,OAAO,CAAC,CAAC,OAAO,EAAE,cAAc,EAAE,GAAG,EAAE,IAAI,GAAG,SAAS,GAAG,IAAI,GAAG,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC,CAAC;IAE3F;;;;;;OAMG;IACH,QAAQ,CAAC,gBAAgB,CAAC,EAAE,SAAS,eAAe,CAAC,OAAO,CAAC,EAAE,CAAC;IAEhE;;;;;;;;OAQG;IACH,QAAQ,CAAC,oBAAoB,CAAC,EAAE,CAAC,IAAI,EAAE,qBAAqB,KAAK,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../../../src/channel/adapter.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"adapter.js","sourceRoot":"","sources":["../../../src/channel/adapter.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"adapter.js","sourceRoot":"","sources":["../../../src/channel/adapter.ts"],"names":[],"mappings":"AAqLA,8EAA8E;AAC9E,UAAU;AACV,8EAA8E;AAE9E;;;;;;;GAOG;AACH,MAAM,UAAU,oBAAoB,CAAC,OAAuB;IAC1D,IAAI,OAAO,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;QAClC,OAAO,EAAE,cAAc,EAAE,OAAO,CAAC,cAAc,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC;IAC9E,CAAC;IAED,IAAI,OAAO,CAAC,cAAc,KAAK,SAAS,IAAI,OAAO,CAAC,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC9E,OAAO,EAAE,cAAc,EAAE,OAAO,CAAC,cAAc,EAAE,CAAC;IACpD,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,OAAuB;IACpD,OAAO,OAAO,CAAC,IAAI,IAAI,SAAS,CAAC;AACnC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,0BAA0B,CACxC,OAAuB;IAEvB,OAAO,OAAO,CAAC,gBAAgB,IAAI,EAAE,CAAC;AACxC,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAC3C,OAAuB,EACvB,KAA+B,EAC/B,GAA0B;IAE1B,MAAM,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAErB,CAAC;IAEd,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;QAC1B,MAAM,OAAO,CAAC,MAAM,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC;IAC/D,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"slack-adapter.d.ts","sourceRoot":"","sources":["../../../src/channel/slack-adapter.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAyB,MAAM,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"slack-adapter.d.ts","sourceRoot":"","sources":["../../../src/channel/slack-adapter.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAyB,MAAM,IAAI,CAAC;AAM1D,OAAO,EAIL,KAAK,YAAY,EAClB,MAAM,qCAAqC,CAAC;AAE7C,OAAO,KAAK,EAEV,cAAc,EACd,qBAAqB,EAEtB,MAAM,cAAc,CAAC;AAUtB,OAAO,KAAK,EAAuB,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAC9E,OAAO,KAAK,EACV,gBAAgB,EAChB,eAAe,EAEf,kBAAkB,EACnB,MAAM,kBAAkB,CAAC;AAO1B;;;;;;GAMG;AACH,MAAM,WAAW,mBAAmB,CAClC,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAChC,SAAQ,qBAAqB,CAAC,MAAM,CAAC;IACrC,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAC;CAC7B;AAED;;;GAGG;AACH,MAAM,WAAW,WAAW;IAC1B,0DAA0D;IAC1D,IAAI,CAAC,UAAU,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACjD,6CAA6C;IAC7C,WAAW,CAAC,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACpE,0DAA0D;IAC1D,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3C,0CAA0C;IAC1C,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACzB,uDAAuD;IACvD,kBAAkB,IAAI,OAAO,CAAC,SAAS,kBAAkB,EAAE,CAAC,CAAC;IAC7D,wBAAwB;IACxB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,0BAA0B;IAC1B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,6BAA6B;IAC7B,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,oBAAoB;IACpB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,6CAA6C;IAC7C,QAAQ,CAAC,WAAW,CAAC,EAAE,gBAAgB,CAAC;CACzC;AAsDD;;;;;;;;;;GAUG;AACH,wBAAgB,sBAAsB,CAAC,KAAK,EAAE;IAC5C,QAAQ,CAAC,WAAW,CAAC,EAAE,cAAc,CAAC,GAAG,CAAC,CAAC;IAC3C,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC7C;;;;;;OAMG;IACH,QAAQ,CAAC,YAAY,CAAC,EAAE,YAAY,CAAC;CACtC,GAAG,cAAc,CAoTjB;AAMD;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE;IACvC,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,gBAAgB,EAAE,OAAO,CAAC;IACnC,QAAQ,CAAC,WAAW,CAAC,EAAE,gBAAgB,CAAC;CACzC,GAAG,WAAW,CA8Fd;AAMD;;;;;;;;GAQG;AACH,wBAAgB,mCAAmC,CACjD,WAAW,EAAE,gBAAgB,GAC5B,SAAS,OAAO,2BAA2B,EAAE,aAAa,EAAE,CA6B9D;AAUD;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,SAAS,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAChF,OAAO,EAAE,cAAc,CAAC,mBAAmB,CAAC,MAAM,CAAC,CAAC,GACnD,cAAc,CAAC,mBAAmB,CAAC,MAAM,CAAC,CAAC,CAE7C;AAiDD;;;;;;;;;;;;;GAaG;AACH,wBAAsB,4BAA4B,CAChD,QAAQ,EAAE,SAAS,kBAAkB,EAAE,EACvC,YAAY,GAAE,YAAoC,GACjD,OAAO,CAAC,QAAQ,EAAE,CAAC,CAMrB"}
|
|
@@ -6,6 +6,10 @@
|
|
|
6
6
|
* default Slack behaviors (typing, posting, HITL cards) that user adapters
|
|
7
7
|
* can override per event type.
|
|
8
8
|
*/
|
|
9
|
+
import { loadContext } from "../context/container.js";
|
|
10
|
+
import { ChannelKey } from "../context/keys.js";
|
|
11
|
+
import { AshAttachmentError } from "../internal/attachments/errors.js";
|
|
12
|
+
import { encodeAttachmentRef } from "../internal/attachments/refs.js";
|
|
9
13
|
import { DEFAULT_UPLOAD_POLICY, evaluateFilePart, formatUploadPolicyViolation, } from "../public/channels/upload-policy.js";
|
|
10
14
|
import { getAdapterKind } from "./adapter.js";
|
|
11
15
|
import { resolveTextToResponses } from "./resolve-text.js";
|
|
@@ -59,6 +63,54 @@ export function createSlackBaseAdapter(input) {
|
|
|
59
63
|
const kind = userAdapter ? getAdapterKind(userAdapter) : "slack";
|
|
60
64
|
const userState = userAdapter?.state ?? {};
|
|
61
65
|
const uploadPolicy = input.uploadPolicy ?? DEFAULT_UPLOAD_POLICY;
|
|
66
|
+
// Channel-owned attachment resolver. Slack inbound files cross the
|
|
67
|
+
// step boundary as `ash-attachment:slack?url=...&__size=...` refs so
|
|
68
|
+
// the raw bytes never hit the Vercel Queue 8 KB per-field cap; the
|
|
69
|
+
// harness calls this resolver from inside the step and we read the
|
|
70
|
+
// bot token from the rehydrated adapter's state (every session's
|
|
71
|
+
// serialized state carries `botToken` — see `SlackChannelState`).
|
|
72
|
+
const attachments = {
|
|
73
|
+
async resolve(ref) {
|
|
74
|
+
const url = ref.params.url;
|
|
75
|
+
if (!url) {
|
|
76
|
+
throw new AshAttachmentError({
|
|
77
|
+
adapterKind: "slack",
|
|
78
|
+
kind: "missing-param",
|
|
79
|
+
message: 'Slack attachment ref is missing the "url" param.',
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
const botToken = loadContext().get(ChannelKey)?.state?.botToken;
|
|
83
|
+
if (!botToken || typeof botToken !== "string") {
|
|
84
|
+
throw new AshAttachmentError({
|
|
85
|
+
adapterKind: "slack",
|
|
86
|
+
kind: "resolver-missing",
|
|
87
|
+
message: "Slack attachment resolver requires `state.botToken` on the active adapter. Pass `credentials.botToken` to `slackRoute()` so the per-session adapter carries it.",
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
let response;
|
|
91
|
+
try {
|
|
92
|
+
response = await fetch(url, {
|
|
93
|
+
headers: { authorization: `Bearer ${botToken}` },
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
catch (cause) {
|
|
97
|
+
throw new AshAttachmentError({
|
|
98
|
+
adapterKind: "slack",
|
|
99
|
+
cause,
|
|
100
|
+
kind: "fetch-failed",
|
|
101
|
+
message: `Slack attachment fetch failed: ${cause instanceof Error ? cause.message : String(cause)}`,
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
if (!response.ok) {
|
|
105
|
+
throw new AshAttachmentError({
|
|
106
|
+
adapterKind: "slack",
|
|
107
|
+
kind: "fetch-failed",
|
|
108
|
+
message: `Slack attachment fetch returned HTTP ${response.status} for ${url}.`,
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
return Buffer.from(await response.arrayBuffer());
|
|
112
|
+
},
|
|
113
|
+
};
|
|
62
114
|
// Merge user state with slack infrastructure state + base layer state
|
|
63
115
|
const initialState = {
|
|
64
116
|
...userState,
|
|
@@ -152,6 +204,7 @@ export function createSlackBaseAdapter(input) {
|
|
|
152
204
|
};
|
|
153
205
|
// Build the final adapter: user handlers take precedence over defaults
|
|
154
206
|
const adapter = {
|
|
207
|
+
attachments,
|
|
155
208
|
kind: kind === "unknown" ? "slack" : kind,
|
|
156
209
|
state: initialState,
|
|
157
210
|
contextProviders: userAdapter?.contextProviders,
|
|
@@ -473,15 +526,25 @@ async function collectFilePartsFromAttachments(attachments, uploadPolicy) {
|
|
|
473
526
|
if (attachment.type === "audio" || attachment.type === "video") {
|
|
474
527
|
continue;
|
|
475
528
|
}
|
|
476
|
-
|
|
477
|
-
|
|
529
|
+
// Slack attachments cross the step boundary as `ash-attachment:` refs
|
|
530
|
+
// rather than inline bytes; the harness resolves the ref via the
|
|
531
|
+
// adapter's channel-owned `attachments.resolve` at staging time. The
|
|
532
|
+
// 8 KB Vercel Queue per-field multipart cap makes inline byte
|
|
533
|
+
// delivery architecturally unviable, so attachments without a URL
|
|
534
|
+
// cannot be represented and are dropped with a warning.
|
|
535
|
+
if (!attachment.url) {
|
|
536
|
+
console.warn("[slack] dropped attachment — no url available for ref construction", attachment.name !== undefined ? { name: attachment.name } : {});
|
|
478
537
|
continue;
|
|
479
538
|
}
|
|
480
539
|
const filePart = {
|
|
481
540
|
type: "file",
|
|
482
541
|
mediaType: attachment.mimeType ?? "application/octet-stream",
|
|
483
542
|
filename: attachment.name ?? `attachment-${parts.length}`,
|
|
484
|
-
data:
|
|
543
|
+
data: encodeAttachmentRef({
|
|
544
|
+
adapterKind: "slack",
|
|
545
|
+
params: { url: attachment.url },
|
|
546
|
+
size: attachment.size,
|
|
547
|
+
}),
|
|
485
548
|
};
|
|
486
549
|
const violation = evaluateFilePart(filePart, uploadPolicy);
|
|
487
550
|
if (violation !== null) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"slack-adapter.js","sourceRoot":"","sources":["../../../src/channel/slack-adapter.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"slack-adapter.js","sourceRoot":"","sources":["../../../src/channel/slack-adapter.ts"],"names":[],"mappings":"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"}
|
|
@@ -7,7 +7,7 @@ let cachedPackageInfo;
|
|
|
7
7
|
let cachedWorkflowPackageRoot;
|
|
8
8
|
// The package build stamps the published version into `dist` so bundled
|
|
9
9
|
// deployments can still report package metadata without resolving package.json.
|
|
10
|
-
const BUNDLED_FALLBACK_PACKAGE_VERSION = "0.3.0-alpha.
|
|
10
|
+
const BUNDLED_FALLBACK_PACKAGE_VERSION = "0.3.0-alpha.9";
|
|
11
11
|
const BUNDLED_FALLBACK_PACKAGE_VERSION_PLACEHOLDER = "__ASH_PACKAGE_VERSION_PLACEHOLDER__";
|
|
12
12
|
const WORKFLOW_DEFAULT_EXPORT_PATHS = {
|
|
13
13
|
workflow: ["dist", "index.js"],
|
|
@@ -13,6 +13,12 @@
|
|
|
13
13
|
* Returns `null` for URL-shaped inputs we cannot fetch locally — remote
|
|
14
14
|
* `http(s):` URLs and provider-reference records. Callers leave those
|
|
15
15
|
* parts untouched so the provider resolves them at call time.
|
|
16
|
+
*
|
|
17
|
+
* Attachment refs (`ash-attachment:` URLs) are resolved via the
|
|
18
|
+
* {@link ChannelKey} adapter's `attachments` resolver. The ref's
|
|
19
|
+
* `adapterKind` must match the active adapter — cross-adapter
|
|
20
|
+
* resolution is unsupported and surfaces as
|
|
21
|
+
* {@link AshAttachmentError}`{ kind: "wrong-kind" }`.
|
|
16
22
|
*/
|
|
17
23
|
export declare function fileDataToBytes(data: unknown): Promise<Buffer | null>;
|
|
18
24
|
/**
|
|
@@ -21,6 +27,11 @@ export declare function fileDataToBytes(data: unknown): Promise<Buffer | null>;
|
|
|
21
27
|
* Handles the same shapes as {@link fileDataToBytes} plus base64 length
|
|
22
28
|
* estimation for plain strings and data URLs. Returns `null` for URL
|
|
23
29
|
* values whose size is only knowable after fetching.
|
|
30
|
+
*
|
|
31
|
+
* For attachment refs (`ash-attachment:` URLs), returns the `__size`
|
|
32
|
+
* query param when the adapter populated it and `null` otherwise —
|
|
33
|
+
* callers treat `null` as "unknown, skip the size check" the same way
|
|
34
|
+
* remote `http(s):` URLs are handled.
|
|
24
35
|
*/
|
|
25
36
|
export declare function getKnownByteLength(data: unknown): number | null;
|
|
26
37
|
//# sourceMappingURL=data.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"data.d.ts","sourceRoot":"","sources":["../../../../src/internal/attachments/data.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;
|
|
1
|
+
{"version":3,"file":"data.d.ts","sourceRoot":"","sources":["../../../../src/internal/attachments/data.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAOH;;;;;;;;;;;;GAYG;AACH,wBAAsB,eAAe,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CA+B3E;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CA8B/D"}
|
|
@@ -7,12 +7,22 @@
|
|
|
7
7
|
* etc.). Kept internal so the public surface stays scoped to
|
|
8
8
|
* `UploadPolicy` + `defineFilePart` helpers in `public/channels/`.
|
|
9
9
|
*/
|
|
10
|
+
import { loadContext } from "../../context/container.js";
|
|
11
|
+
import { ChannelKey } from "../../context/keys.js";
|
|
12
|
+
import { AshAttachmentError } from "./errors.js";
|
|
13
|
+
import { isAttachmentRefUrl, parseAttachmentRef } from "./refs.js";
|
|
10
14
|
/**
|
|
11
15
|
* Converts any AI SDK `FilePart.data` value into raw bytes.
|
|
12
16
|
*
|
|
13
17
|
* Returns `null` for URL-shaped inputs we cannot fetch locally — remote
|
|
14
18
|
* `http(s):` URLs and provider-reference records. Callers leave those
|
|
15
19
|
* parts untouched so the provider resolves them at call time.
|
|
20
|
+
*
|
|
21
|
+
* Attachment refs (`ash-attachment:` URLs) are resolved via the
|
|
22
|
+
* {@link ChannelKey} adapter's `attachments` resolver. The ref's
|
|
23
|
+
* `adapterKind` must match the active adapter — cross-adapter
|
|
24
|
+
* resolution is unsupported and surfaces as
|
|
25
|
+
* {@link AshAttachmentError}`{ kind: "wrong-kind" }`.
|
|
16
26
|
*/
|
|
17
27
|
export async function fileDataToBytes(data) {
|
|
18
28
|
// Buffer extends Uint8Array — check it first so genuine Buffer inputs
|
|
@@ -29,6 +39,9 @@ export async function fileDataToBytes(data) {
|
|
|
29
39
|
if (typeof data === "string") {
|
|
30
40
|
return decodeStringData(data);
|
|
31
41
|
}
|
|
42
|
+
if (isAttachmentRefUrl(data)) {
|
|
43
|
+
return resolveAttachmentRefToBytes(data);
|
|
44
|
+
}
|
|
32
45
|
if (data instanceof URL) {
|
|
33
46
|
if (data.protocol === "data:") {
|
|
34
47
|
return decodeStringData(data.href);
|
|
@@ -43,6 +56,11 @@ export async function fileDataToBytes(data) {
|
|
|
43
56
|
* Handles the same shapes as {@link fileDataToBytes} plus base64 length
|
|
44
57
|
* estimation for plain strings and data URLs. Returns `null` for URL
|
|
45
58
|
* values whose size is only knowable after fetching.
|
|
59
|
+
*
|
|
60
|
+
* For attachment refs (`ash-attachment:` URLs), returns the `__size`
|
|
61
|
+
* query param when the adapter populated it and `null` otherwise —
|
|
62
|
+
* callers treat `null` as "unknown, skip the size check" the same way
|
|
63
|
+
* remote `http(s):` URLs are handled.
|
|
46
64
|
*/
|
|
47
65
|
export function getKnownByteLength(data) {
|
|
48
66
|
if (typeof Buffer !== "undefined" && Buffer.isBuffer(data)) {
|
|
@@ -57,6 +75,10 @@ export function getKnownByteLength(data) {
|
|
|
57
75
|
if (typeof data === "string") {
|
|
58
76
|
return computeStringByteLength(data);
|
|
59
77
|
}
|
|
78
|
+
if (isAttachmentRefUrl(data)) {
|
|
79
|
+
const ref = parseAttachmentRef(data);
|
|
80
|
+
return ref.size ?? null;
|
|
81
|
+
}
|
|
60
82
|
if (data instanceof URL) {
|
|
61
83
|
if (data.protocol === "data:") {
|
|
62
84
|
return computeStringByteLength(data.href);
|
|
@@ -65,6 +87,57 @@ export function getKnownByteLength(data) {
|
|
|
65
87
|
}
|
|
66
88
|
return null;
|
|
67
89
|
}
|
|
90
|
+
/**
|
|
91
|
+
* Resolves an {@link AttachmentRef} URL to bytes via the active
|
|
92
|
+
* adapter's `attachments` resolver.
|
|
93
|
+
*
|
|
94
|
+
* Thin dispatch on top of {@link parseAttachmentRef} and the
|
|
95
|
+
* {@link ChannelKey}-bound adapter. Every failure mode surfaces as an
|
|
96
|
+
* {@link AshAttachmentError} with a kind discriminator so channel code
|
|
97
|
+
* can decide between drop-and-warn and hard-fail on a per-kind basis.
|
|
98
|
+
* Today every caller drops; the kinds are carried forward so a future
|
|
99
|
+
* strict mode can opt in without a second rewrite.
|
|
100
|
+
*/
|
|
101
|
+
async function resolveAttachmentRefToBytes(url) {
|
|
102
|
+
const ref = parseAttachmentRef(url);
|
|
103
|
+
const adapter = loadContext().get(ChannelKey);
|
|
104
|
+
if (adapter === undefined) {
|
|
105
|
+
throw new AshAttachmentError({
|
|
106
|
+
adapterKind: ref.adapterKind,
|
|
107
|
+
kind: "missing-adapter",
|
|
108
|
+
message: `No channel adapter is bound on the active context — cannot resolve ash-attachment:${ref.adapterKind} ref.`,
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
const activeKind = adapter.kind ?? "unknown";
|
|
112
|
+
if (activeKind !== ref.adapterKind) {
|
|
113
|
+
throw new AshAttachmentError({
|
|
114
|
+
adapterKind: ref.adapterKind,
|
|
115
|
+
kind: "wrong-kind",
|
|
116
|
+
message: `Attachment ref adapterKind="${ref.adapterKind}" does not match active adapter kind="${activeKind}". Cross-adapter resolution is not supported.`,
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
if (adapter.attachments === undefined) {
|
|
120
|
+
throw new AshAttachmentError({
|
|
121
|
+
adapterKind: activeKind,
|
|
122
|
+
kind: "resolver-missing",
|
|
123
|
+
message: `Channel adapter kind="${activeKind}" did not declare an \`attachments\` resolver but received an attachment ref.`,
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
try {
|
|
127
|
+
return await adapter.attachments.resolve(ref);
|
|
128
|
+
}
|
|
129
|
+
catch (cause) {
|
|
130
|
+
if (cause instanceof AshAttachmentError) {
|
|
131
|
+
throw cause;
|
|
132
|
+
}
|
|
133
|
+
throw new AshAttachmentError({
|
|
134
|
+
adapterKind: activeKind,
|
|
135
|
+
cause,
|
|
136
|
+
kind: "resolver-threw",
|
|
137
|
+
message: `Attachment resolver for adapter kind="${activeKind}" threw: ${cause instanceof Error ? cause.message : String(cause)}`,
|
|
138
|
+
});
|
|
139
|
+
}
|
|
140
|
+
}
|
|
68
141
|
function decodeStringData(value) {
|
|
69
142
|
if (value.startsWith("data:")) {
|
|
70
143
|
const comma = value.indexOf(",");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"data.js","sourceRoot":"","sources":["../../../../src/internal/attachments/data.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH
|
|
1
|
+
{"version":3,"file":"data.js","sourceRoot":"","sources":["../../../../src/internal/attachments/data.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Structured errors surfaced when a channel-owned attachment resolver
|
|
3
|
+
* fails to materialize the bytes for an {@link AttachmentRef}.
|
|
4
|
+
*
|
|
5
|
+
* The `kind` discriminator lets call sites (and future strict-mode
|
|
6
|
+
* policies) tell the difference between operator misconfiguration
|
|
7
|
+
* (`missing-adapter`, `wrong-kind`, `resolver-missing`), malformed
|
|
8
|
+
* refs (`missing-param`), and transport-level failure
|
|
9
|
+
* (`fetch-failed`, `resolver-threw`).
|
|
10
|
+
*/
|
|
11
|
+
/**
|
|
12
|
+
* Discriminator for {@link AshAttachmentError}.
|
|
13
|
+
*
|
|
14
|
+
* - `missing-adapter` — no `ChannelKey` was bound on the active context
|
|
15
|
+
* when staging tried to resolve a ref. This is a programmer error:
|
|
16
|
+
* the ref reached staging without an adapter having been installed
|
|
17
|
+
* by the runtime.
|
|
18
|
+
* - `wrong-kind` — the ref's `adapterKind` does not match the active
|
|
19
|
+
* adapter. Cross-adapter resolution is intentionally unsupported.
|
|
20
|
+
* - `resolver-missing` — the active adapter matches the ref's
|
|
21
|
+
* `adapterKind` but does not provide an `attachments` resolver.
|
|
22
|
+
* - `missing-param` — the resolver looked for an adapter-defined
|
|
23
|
+
* parameter on `ref.params` and did not find it.
|
|
24
|
+
* - `fetch-failed` — the resolver attempted to fetch bytes from an
|
|
25
|
+
* upstream endpoint and the endpoint returned a non-2xx status or
|
|
26
|
+
* the network call failed.
|
|
27
|
+
* - `resolver-threw` — the resolver threw something that is not
|
|
28
|
+
* already an {@link AshAttachmentError}. Used as the catch-all
|
|
29
|
+
* wrapper in the staging-layer dispatch.
|
|
30
|
+
*/
|
|
31
|
+
export type AshAttachmentErrorKind = "missing-adapter" | "wrong-kind" | "resolver-missing" | "missing-param" | "fetch-failed" | "resolver-threw";
|
|
32
|
+
/**
|
|
33
|
+
* Input shape for {@link AshAttachmentError}. Separated from the class
|
|
34
|
+
* constructor so callers can build the options object inline and TS
|
|
35
|
+
* can check the `kind` / `message` pair without a positional
|
|
36
|
+
* constructor signature.
|
|
37
|
+
*/
|
|
38
|
+
export interface AshAttachmentErrorInput {
|
|
39
|
+
readonly kind: AshAttachmentErrorKind;
|
|
40
|
+
readonly message: string;
|
|
41
|
+
readonly adapterKind?: string;
|
|
42
|
+
readonly cause?: unknown;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Error surfaced when an attachment resolver fails to produce bytes for
|
|
46
|
+
* an {@link AttachmentRef}.
|
|
47
|
+
*
|
|
48
|
+
* Channels can inspect the `.kind` discriminator to decide whether to
|
|
49
|
+
* drop the attachment and continue the turn (the default posture for
|
|
50
|
+
* every kind today) or fail the whole delivery (future strict mode).
|
|
51
|
+
* The original failure, when there is one, is preserved on `.cause` so
|
|
52
|
+
* observability can surface the upstream error without losing context.
|
|
53
|
+
*/
|
|
54
|
+
export declare class AshAttachmentError extends Error {
|
|
55
|
+
readonly kind: AshAttachmentErrorKind;
|
|
56
|
+
readonly adapterKind?: string;
|
|
57
|
+
readonly cause?: unknown;
|
|
58
|
+
constructor(input: AshAttachmentErrorInput);
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=errors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../../../src/internal/attachments/errors.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,MAAM,sBAAsB,GAC9B,iBAAiB,GACjB,YAAY,GACZ,kBAAkB,GAClB,eAAe,GACf,cAAc,GACd,gBAAgB,CAAC;AAErB;;;;;GAKG;AACH,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,IAAI,EAAE,sBAAsB,CAAC;IACtC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC;CAC1B;AAED;;;;;;;;;GASG;AACH,qBAAa,kBAAmB,SAAQ,KAAK;IAC3C,QAAQ,CAAC,IAAI,EAAE,sBAAsB,CAAC;IACtC,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,SAAkB,KAAK,CAAC,EAAE,OAAO,CAAC;IAElC,YAAY,KAAK,EAAE,uBAAuB,EAUzC;CACF"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Structured errors surfaced when a channel-owned attachment resolver
|
|
3
|
+
* fails to materialize the bytes for an {@link AttachmentRef}.
|
|
4
|
+
*
|
|
5
|
+
* The `kind` discriminator lets call sites (and future strict-mode
|
|
6
|
+
* policies) tell the difference between operator misconfiguration
|
|
7
|
+
* (`missing-adapter`, `wrong-kind`, `resolver-missing`), malformed
|
|
8
|
+
* refs (`missing-param`), and transport-level failure
|
|
9
|
+
* (`fetch-failed`, `resolver-threw`).
|
|
10
|
+
*/
|
|
11
|
+
/**
|
|
12
|
+
* Error surfaced when an attachment resolver fails to produce bytes for
|
|
13
|
+
* an {@link AttachmentRef}.
|
|
14
|
+
*
|
|
15
|
+
* Channels can inspect the `.kind` discriminator to decide whether to
|
|
16
|
+
* drop the attachment and continue the turn (the default posture for
|
|
17
|
+
* every kind today) or fail the whole delivery (future strict mode).
|
|
18
|
+
* The original failure, when there is one, is preserved on `.cause` so
|
|
19
|
+
* observability can surface the upstream error without losing context.
|
|
20
|
+
*/
|
|
21
|
+
export class AshAttachmentError extends Error {
|
|
22
|
+
kind;
|
|
23
|
+
adapterKind;
|
|
24
|
+
cause;
|
|
25
|
+
constructor(input) {
|
|
26
|
+
super(input.message);
|
|
27
|
+
this.name = "AshAttachmentError";
|
|
28
|
+
this.kind = input.kind;
|
|
29
|
+
if (input.adapterKind !== undefined) {
|
|
30
|
+
this.adapterKind = input.adapterKind;
|
|
31
|
+
}
|
|
32
|
+
if (input.cause !== undefined) {
|
|
33
|
+
this.cause = input.cause;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../../../src/internal/attachments/errors.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AA2CH;;;;;;;;;GASG;AACH,MAAM,OAAO,kBAAmB,SAAQ,KAAK;IAClC,IAAI,CAAyB;IAC7B,WAAW,CAAU;IACZ,KAAK,CAAW;IAElC,YAAY,KAA8B;QACxC,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACrB,IAAI,CAAC,IAAI,GAAG,oBAAoB,CAAC;QACjC,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC;QACvB,IAAI,KAAK,CAAC,WAAW,KAAK,SAAS,EAAE,CAAC;YACpC,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC,WAAW,CAAC;QACvC,CAAC;QACD,IAAI,KAAK,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;YAC9B,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC;QAC3B,CAAC;IACH,CAAC;CACF"}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Opaque attachment references: the wire format a channel uses to carry
|
|
3
|
+
* file identity across step boundaries without inlining the bytes.
|
|
4
|
+
*
|
|
5
|
+
* A ref is encoded as a URL with a custom scheme:
|
|
6
|
+
*
|
|
7
|
+
* ```
|
|
8
|
+
* ash-attachment:<adapterKind>?<params>&__size=<bytes>
|
|
9
|
+
* ```
|
|
10
|
+
*
|
|
11
|
+
* The scheme isolates refs from normal `http(s):` / `data:` URLs so the
|
|
12
|
+
* staging layer can dispatch safely. The first path segment is the
|
|
13
|
+
* adapter kind and is authoritative for resolution — only the adapter
|
|
14
|
+
* that produced the ref can turn it back into bytes.
|
|
15
|
+
*
|
|
16
|
+
* Query keys that start with `__` are reserved for framework use
|
|
17
|
+
* (today just `__size`); adapter-defined params must not collide with
|
|
18
|
+
* them.
|
|
19
|
+
*
|
|
20
|
+
* Refs are deliberately small (~200 bytes for a typical Slack file) so
|
|
21
|
+
* they cross the Vercel Queue 8 KB per-field multipart boundary
|
|
22
|
+
* trivially. Every adapter that produces `FilePart.data` on inbound
|
|
23
|
+
* turns MUST emit a ref — inline bytes are architecturally unviable.
|
|
24
|
+
*/
|
|
25
|
+
/**
|
|
26
|
+
* Custom URL scheme used by every attachment ref.
|
|
27
|
+
*
|
|
28
|
+
* The trailing colon is part of the scheme per WHATWG URL semantics.
|
|
29
|
+
* Code that parses or constructs refs should import this constant
|
|
30
|
+
* instead of hard-coding the literal.
|
|
31
|
+
*/
|
|
32
|
+
export declare const ATTACHMENT_REF_SCHEME = "ash-attachment:";
|
|
33
|
+
/**
|
|
34
|
+
* Query key carrying the optional byte length. Reserved — adapter
|
|
35
|
+
* params must not use any key starting with `__`.
|
|
36
|
+
*/
|
|
37
|
+
export declare const ATTACHMENT_REF_SIZE_KEY = "__size";
|
|
38
|
+
/**
|
|
39
|
+
* Serializable description of one inbound file attachment.
|
|
40
|
+
*
|
|
41
|
+
* `adapterKind` ties the ref to the adapter that produced it. The
|
|
42
|
+
* runtime staging layer refuses to resolve a ref whose `adapterKind`
|
|
43
|
+
* does not match the adapter currently bound on the active context.
|
|
44
|
+
*
|
|
45
|
+
* `params` is an adapter-defined string→string map. It never carries
|
|
46
|
+
* credentials — resolvers pull those from their own adapter state
|
|
47
|
+
* (closure capture at construction time). Slack sets
|
|
48
|
+
* `{ url, file_id }`; a hypothetical HTTP blob adapter would set
|
|
49
|
+
* `{ blob_key }`; custom adapters define whatever they need.
|
|
50
|
+
*
|
|
51
|
+
* `size` is optional. Adapters populate it whenever the upstream
|
|
52
|
+
* protocol exposes the byte length before fetch so upload-policy size
|
|
53
|
+
* checks can run without pulling the bytes. Slack populates it from
|
|
54
|
+
* the Slack attachment metadata; generic HTTP URL refs that need a
|
|
55
|
+
* HEAD request to discover size leave it unset.
|
|
56
|
+
*/
|
|
57
|
+
export interface AttachmentRef {
|
|
58
|
+
readonly adapterKind: string;
|
|
59
|
+
readonly params: Readonly<Record<string, string>>;
|
|
60
|
+
readonly size?: number;
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Encodes an {@link AttachmentRef} as a URL suitable for use as
|
|
64
|
+
* `FilePart.data`.
|
|
65
|
+
*
|
|
66
|
+
* Validates that:
|
|
67
|
+
* - `adapterKind` is non-empty.
|
|
68
|
+
* - No reserved query key (`__*`) appears in `params`.
|
|
69
|
+
* - `size`, when provided, is a non-negative finite integer.
|
|
70
|
+
*
|
|
71
|
+
* The returned URL stringifies to a compact form (e.g.
|
|
72
|
+
* `ash-attachment:slack?url=...&file_id=...&__size=13319`) that
|
|
73
|
+
* comfortably fits under the Vercel Queue 8 KB field cap.
|
|
74
|
+
*/
|
|
75
|
+
export declare function encodeAttachmentRef(ref: AttachmentRef): URL;
|
|
76
|
+
/**
|
|
77
|
+
* Parses an {@link AttachmentRef} back out of a URL.
|
|
78
|
+
*
|
|
79
|
+
* Throws when the URL's scheme is not `ash-attachment:`, when the
|
|
80
|
+
* adapter-kind segment is missing, or when `__size` is present but
|
|
81
|
+
* cannot be parsed as a non-negative integer. Reserved query keys
|
|
82
|
+
* (other than `__size`) are ignored so future framework keys stay
|
|
83
|
+
* forward-compatible.
|
|
84
|
+
*/
|
|
85
|
+
export declare function parseAttachmentRef(url: URL): AttachmentRef;
|
|
86
|
+
/**
|
|
87
|
+
* Cheap runtime check: does this value look like an attachment-ref URL?
|
|
88
|
+
*
|
|
89
|
+
* Accepts `URL` instances with the `ash-attachment:` scheme. Strings
|
|
90
|
+
* are NOT accepted — the staging layer only checks URL-instance
|
|
91
|
+
* `FilePart.data` values, matching the existing `data instanceof URL`
|
|
92
|
+
* branch in `fileDataToBytes`.
|
|
93
|
+
*/
|
|
94
|
+
export declare function isAttachmentRefUrl(value: unknown): value is URL;
|
|
95
|
+
//# sourceMappingURL=refs.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"refs.d.ts","sourceRoot":"","sources":["../../../../src/internal/attachments/refs.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAEH;;;;;;GAMG;AACH,eAAO,MAAM,qBAAqB,oBAAoB,CAAC;AAEvD;;;GAGG;AACH,eAAO,MAAM,uBAAuB,WAAW,CAAC;AAIhD;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IAClD,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;CACxB;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,aAAa,GAAG,GAAG,CA6B3D;AAED;;;;;;;;GAQG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,GAAG,GAAG,aAAa,CAyC1D;AAED;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,GAAG,CAE/D"}
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Opaque attachment references: the wire format a channel uses to carry
|
|
3
|
+
* file identity across step boundaries without inlining the bytes.
|
|
4
|
+
*
|
|
5
|
+
* A ref is encoded as a URL with a custom scheme:
|
|
6
|
+
*
|
|
7
|
+
* ```
|
|
8
|
+
* ash-attachment:<adapterKind>?<params>&__size=<bytes>
|
|
9
|
+
* ```
|
|
10
|
+
*
|
|
11
|
+
* The scheme isolates refs from normal `http(s):` / `data:` URLs so the
|
|
12
|
+
* staging layer can dispatch safely. The first path segment is the
|
|
13
|
+
* adapter kind and is authoritative for resolution — only the adapter
|
|
14
|
+
* that produced the ref can turn it back into bytes.
|
|
15
|
+
*
|
|
16
|
+
* Query keys that start with `__` are reserved for framework use
|
|
17
|
+
* (today just `__size`); adapter-defined params must not collide with
|
|
18
|
+
* them.
|
|
19
|
+
*
|
|
20
|
+
* Refs are deliberately small (~200 bytes for a typical Slack file) so
|
|
21
|
+
* they cross the Vercel Queue 8 KB per-field multipart boundary
|
|
22
|
+
* trivially. Every adapter that produces `FilePart.data` on inbound
|
|
23
|
+
* turns MUST emit a ref — inline bytes are architecturally unviable.
|
|
24
|
+
*/
|
|
25
|
+
/**
|
|
26
|
+
* Custom URL scheme used by every attachment ref.
|
|
27
|
+
*
|
|
28
|
+
* The trailing colon is part of the scheme per WHATWG URL semantics.
|
|
29
|
+
* Code that parses or constructs refs should import this constant
|
|
30
|
+
* instead of hard-coding the literal.
|
|
31
|
+
*/
|
|
32
|
+
export const ATTACHMENT_REF_SCHEME = "ash-attachment:";
|
|
33
|
+
/**
|
|
34
|
+
* Query key carrying the optional byte length. Reserved — adapter
|
|
35
|
+
* params must not use any key starting with `__`.
|
|
36
|
+
*/
|
|
37
|
+
export const ATTACHMENT_REF_SIZE_KEY = "__size";
|
|
38
|
+
const RESERVED_KEY_PREFIX = "__";
|
|
39
|
+
/**
|
|
40
|
+
* Encodes an {@link AttachmentRef} as a URL suitable for use as
|
|
41
|
+
* `FilePart.data`.
|
|
42
|
+
*
|
|
43
|
+
* Validates that:
|
|
44
|
+
* - `adapterKind` is non-empty.
|
|
45
|
+
* - No reserved query key (`__*`) appears in `params`.
|
|
46
|
+
* - `size`, when provided, is a non-negative finite integer.
|
|
47
|
+
*
|
|
48
|
+
* The returned URL stringifies to a compact form (e.g.
|
|
49
|
+
* `ash-attachment:slack?url=...&file_id=...&__size=13319`) that
|
|
50
|
+
* comfortably fits under the Vercel Queue 8 KB field cap.
|
|
51
|
+
*/
|
|
52
|
+
export function encodeAttachmentRef(ref) {
|
|
53
|
+
if (ref.adapterKind.length === 0) {
|
|
54
|
+
throw new Error("AttachmentRef.adapterKind must be a non-empty string.");
|
|
55
|
+
}
|
|
56
|
+
if (ref.size !== undefined) {
|
|
57
|
+
if (!Number.isFinite(ref.size) || ref.size < 0 || !Number.isInteger(ref.size)) {
|
|
58
|
+
throw new RangeError(`AttachmentRef.size must be a non-negative integer. Received: ${String(ref.size)}.`);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
for (const key of Object.keys(ref.params)) {
|
|
62
|
+
if (key.startsWith(RESERVED_KEY_PREFIX)) {
|
|
63
|
+
throw new Error(`AttachmentRef.params key "${key}" is reserved. Query keys starting with "__" are framework-owned.`);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
const url = new URL(`${ATTACHMENT_REF_SCHEME}${encodeURIComponent(ref.adapterKind)}`);
|
|
67
|
+
for (const [key, value] of Object.entries(ref.params)) {
|
|
68
|
+
url.searchParams.set(key, value);
|
|
69
|
+
}
|
|
70
|
+
if (ref.size !== undefined) {
|
|
71
|
+
url.searchParams.set(ATTACHMENT_REF_SIZE_KEY, String(ref.size));
|
|
72
|
+
}
|
|
73
|
+
return url;
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Parses an {@link AttachmentRef} back out of a URL.
|
|
77
|
+
*
|
|
78
|
+
* Throws when the URL's scheme is not `ash-attachment:`, when the
|
|
79
|
+
* adapter-kind segment is missing, or when `__size` is present but
|
|
80
|
+
* cannot be parsed as a non-negative integer. Reserved query keys
|
|
81
|
+
* (other than `__size`) are ignored so future framework keys stay
|
|
82
|
+
* forward-compatible.
|
|
83
|
+
*/
|
|
84
|
+
export function parseAttachmentRef(url) {
|
|
85
|
+
if (url.protocol !== ATTACHMENT_REF_SCHEME) {
|
|
86
|
+
throw new Error(`AttachmentRef URL must use scheme "${ATTACHMENT_REF_SCHEME}". Got: "${url.protocol}".`);
|
|
87
|
+
}
|
|
88
|
+
// Custom-scheme URLs have their adapter kind in `pathname` (no
|
|
89
|
+
// authority). `new URL("ash-attachment:slack?x=1").pathname === "slack"`.
|
|
90
|
+
const rawKind = url.pathname;
|
|
91
|
+
if (rawKind.length === 0) {
|
|
92
|
+
throw new Error(`AttachmentRef URL is missing the adapter-kind segment. Got: "${url.href}".`);
|
|
93
|
+
}
|
|
94
|
+
const adapterKind = decodeURIComponent(rawKind);
|
|
95
|
+
if (adapterKind.length === 0) {
|
|
96
|
+
throw new Error(`AttachmentRef URL has an empty adapter-kind segment. Got: "${url.href}".`);
|
|
97
|
+
}
|
|
98
|
+
const params = {};
|
|
99
|
+
let size;
|
|
100
|
+
for (const [key, value] of url.searchParams) {
|
|
101
|
+
if (key === ATTACHMENT_REF_SIZE_KEY) {
|
|
102
|
+
const parsed = Number(value);
|
|
103
|
+
if (!Number.isFinite(parsed) || parsed < 0 || !Number.isInteger(parsed)) {
|
|
104
|
+
throw new Error(`AttachmentRef "__size" must be a non-negative integer. Got: "${value}".`);
|
|
105
|
+
}
|
|
106
|
+
size = parsed;
|
|
107
|
+
continue;
|
|
108
|
+
}
|
|
109
|
+
if (key.startsWith(RESERVED_KEY_PREFIX)) {
|
|
110
|
+
// Skip unknown reserved keys; the framework owns them and
|
|
111
|
+
// adapter code has no business interpreting them.
|
|
112
|
+
continue;
|
|
113
|
+
}
|
|
114
|
+
params[key] = value;
|
|
115
|
+
}
|
|
116
|
+
if (size === undefined) {
|
|
117
|
+
return { adapterKind, params };
|
|
118
|
+
}
|
|
119
|
+
return { adapterKind, params, size };
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Cheap runtime check: does this value look like an attachment-ref URL?
|
|
123
|
+
*
|
|
124
|
+
* Accepts `URL` instances with the `ash-attachment:` scheme. Strings
|
|
125
|
+
* are NOT accepted — the staging layer only checks URL-instance
|
|
126
|
+
* `FilePart.data` values, matching the existing `data instanceof URL`
|
|
127
|
+
* branch in `fileDataToBytes`.
|
|
128
|
+
*/
|
|
129
|
+
export function isAttachmentRefUrl(value) {
|
|
130
|
+
return value instanceof URL && value.protocol === ATTACHMENT_REF_SCHEME;
|
|
131
|
+
}
|
|
132
|
+
//# sourceMappingURL=refs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"refs.js","sourceRoot":"","sources":["../../../../src/internal/attachments/refs.ts"],"names":[],"mappings":"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"}
|
|
@@ -24,8 +24,10 @@
|
|
|
24
24
|
* });
|
|
25
25
|
* ```
|
|
26
26
|
*/
|
|
27
|
-
export type { ChannelAdapter, ChannelAdapterContext } from "../../channel/adapter.js";
|
|
27
|
+
export type { AttachmentResolver, ChannelAdapter, ChannelAdapterContext, } from "../../channel/adapter.js";
|
|
28
28
|
export type { EventEmitFn } from "../../channel/types.js";
|
|
29
|
+
export { AshAttachmentError, type AshAttachmentErrorInput, type AshAttachmentErrorKind, } from "../../internal/attachments/errors.js";
|
|
30
|
+
export { ATTACHMENT_REF_SCHEME, type AttachmentRef, encodeAttachmentRef, isAttachmentRefUrl, parseAttachmentRef, } from "../../internal/attachments/refs.js";
|
|
29
31
|
export { type Agent, type ChannelMethod, type DisabledRouteSentinel, defineRoute, disableRoute, isDisabledRouteSentinel, isRouteDefinition, type Route, type RouteContext, } from "../definitions/channel.js";
|
|
30
32
|
export { collectUploadPolicyViolations, DEFAULT_UPLOAD_POLICY, evaluateFilePart, formatUploadPolicyViolation, isMediaTypeAllowed, mergeUploadPolicy, stripDisallowedFileParts, type UploadPolicy, type UploadPolicyViolation, } from "./upload-policy.js";
|
|
31
33
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/public/channels/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAEH,YAAY,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/public/channels/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAEH,YAAY,EACV,kBAAkB,EAClB,cAAc,EACd,qBAAqB,GACtB,MAAM,0BAA0B,CAAC;AAClC,YAAY,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EACL,kBAAkB,EAClB,KAAK,uBAAuB,EAC5B,KAAK,sBAAsB,GAC5B,MAAM,sCAAsC,CAAC;AAC9C,OAAO,EACL,qBAAqB,EACrB,KAAK,aAAa,EAClB,mBAAmB,EACnB,kBAAkB,EAClB,kBAAkB,GACnB,MAAM,oCAAoC,CAAC;AAC5C,OAAO,EACL,KAAK,KAAK,EACV,KAAK,aAAa,EAClB,KAAK,qBAAqB,EAC1B,WAAW,EACX,YAAY,EACZ,uBAAuB,EACvB,iBAAiB,EACjB,KAAK,KAAK,EACV,KAAK,YAAY,GAClB,MAAM,2BAA2B,CAAC;AACnC,OAAO,EACL,6BAA6B,EAC7B,qBAAqB,EACrB,gBAAgB,EAChB,2BAA2B,EAC3B,kBAAkB,EAClB,iBAAiB,EACjB,wBAAwB,EACxB,KAAK,YAAY,EACjB,KAAK,qBAAqB,GAC3B,MAAM,oBAAoB,CAAC"}
|
|
@@ -24,6 +24,8 @@
|
|
|
24
24
|
* });
|
|
25
25
|
* ```
|
|
26
26
|
*/
|
|
27
|
+
export { AshAttachmentError, } from "../../internal/attachments/errors.js";
|
|
28
|
+
export { ATTACHMENT_REF_SCHEME, encodeAttachmentRef, isAttachmentRefUrl, parseAttachmentRef, } from "../../internal/attachments/refs.js";
|
|
27
29
|
export { defineRoute, disableRoute, isDisabledRouteSentinel, isRouteDefinition, } from "../definitions/channel.js";
|
|
28
30
|
export { collectUploadPolicyViolations, DEFAULT_UPLOAD_POLICY, evaluateFilePart, formatUploadPolicyViolation, isMediaTypeAllowed, mergeUploadPolicy, stripDisallowedFileParts, } from "./upload-policy.js";
|
|
29
31
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/public/channels/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/public/channels/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAQH,OAAO,EACL,kBAAkB,GAGnB,MAAM,sCAAsC,CAAC;AAC9C,OAAO,EACL,qBAAqB,EAErB,mBAAmB,EACnB,kBAAkB,EAClB,kBAAkB,GACnB,MAAM,oCAAoC,CAAC;AAC5C,OAAO,EAIL,WAAW,EACX,YAAY,EACZ,uBAAuB,EACvB,iBAAiB,GAGlB,MAAM,2BAA2B,CAAC;AACnC,OAAO,EACL,6BAA6B,EAC7B,qBAAqB,EACrB,gBAAgB,EAChB,2BAA2B,EAC3B,kBAAkB,EAClB,iBAAiB,EACjB,wBAAwB,GAGzB,MAAM,oBAAoB,CAAC"}
|
|
@@ -182,8 +182,21 @@ export default slackRoute({
|
|
|
182
182
|
});
|
|
183
183
|
```
|
|
184
184
|
|
|
185
|
+
## Inbound Attachments
|
|
186
|
+
|
|
187
|
+
Channels that ingest file attachments (Slack, HTTP multipart, custom
|
|
188
|
+
webhooks) deliver them as opaque `ash-attachment:` refs rather than
|
|
189
|
+
inline bytes — the Vercel Queue 8 KB per-field multipart cap makes
|
|
190
|
+
inline delivery architecturally unviable. The channel's adapter owns
|
|
191
|
+
both ends of the contract: it encodes a ref on inbound turns and
|
|
192
|
+
declares an `attachments` resolver that materializes the bytes inside
|
|
193
|
+
a step boundary.
|
|
194
|
+
|
|
195
|
+
See [`./attachments.md`](./attachments.md) for the authoring guide.
|
|
196
|
+
|
|
185
197
|
## What To Read Next
|
|
186
198
|
|
|
199
|
+
- [`./attachments.md`](./attachments.md)
|
|
187
200
|
- [`../project-layout.md`](../project-layout.md)
|
|
188
201
|
- [`../typescript-api.md`](../typescript-api.md)
|
|
189
202
|
- [`../auth-and-route-protection.md`](../auth-and-route-protection.md)
|
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
# Channel attachments
|
|
2
|
+
|
|
3
|
+
This guide explains how channels deliver inbound file attachments to the
|
|
4
|
+
agent without inlining the raw bytes in the turn message.
|
|
5
|
+
|
|
6
|
+
## The problem
|
|
7
|
+
|
|
8
|
+
Every ash channel delivery path crosses at least one step boundary via
|
|
9
|
+
`agent.run()` or `agent.deliver()`. On Vercel, those boundaries hit a
|
|
10
|
+
**Vercel Queue 8 KB per-field multipart limit**. Any `FilePart.data`
|
|
11
|
+
carrying raw bytes above ~6 KB (after UTF‑8 / base64 overhead) trips the
|
|
12
|
+
limit and the delivery fails with a `MultipartParseError`.
|
|
13
|
+
|
|
14
|
+
For any practical attachment (CSVs, PDFs, screenshots, etc.) the bytes
|
|
15
|
+
cannot travel inline.
|
|
16
|
+
|
|
17
|
+
## The design
|
|
18
|
+
|
|
19
|
+
The channel owns both ends of the file contract:
|
|
20
|
+
|
|
21
|
+
1. **Encode a ref, not bytes.** When the channel observes an inbound
|
|
22
|
+
file, it builds an opaque `AttachmentRef` — a small URL
|
|
23
|
+
(`ash-attachment:<adapterKind>?...`) that carries whatever the
|
|
24
|
+
channel needs to re-fetch the bytes later (URL, object key, file id,
|
|
25
|
+
etc.).
|
|
26
|
+
2. **Resolve the ref at staging time.** The channel's `ChannelAdapter`
|
|
27
|
+
declares an `attachments` resolver. When the harness prepares the
|
|
28
|
+
turn for the model it detects the ref, looks up the active adapter
|
|
29
|
+
via `ChannelKey`, and calls `adapter.attachments.resolve(ref)` to
|
|
30
|
+
materialize the bytes. The bytes are then written to the agent's
|
|
31
|
+
sandbox and the `FilePart.filename` is rewritten to the resolved
|
|
32
|
+
path.
|
|
33
|
+
|
|
34
|
+
The ref crosses every queue boundary as ~200 bytes of text. The bytes
|
|
35
|
+
only exist inside a single workflow step — they never cross a boundary.
|
|
36
|
+
|
|
37
|
+
## Building a ref
|
|
38
|
+
|
|
39
|
+
Use the helpers exported from `experimental-ash/channels`:
|
|
40
|
+
|
|
41
|
+
```ts
|
|
42
|
+
import { encodeAttachmentRef } from "experimental-ash/channels";
|
|
43
|
+
|
|
44
|
+
const ref = encodeAttachmentRef({
|
|
45
|
+
adapterKind: "slack",
|
|
46
|
+
params: { url: attachment.url, file_id: attachment.id },
|
|
47
|
+
size: attachment.size, // optional — enables pre-fetch size checks
|
|
48
|
+
});
|
|
49
|
+
|
|
50
|
+
const filePart: FilePart = {
|
|
51
|
+
type: "file",
|
|
52
|
+
mediaType: attachment.mimeType ?? "application/octet-stream",
|
|
53
|
+
filename: attachment.name ?? "attachment",
|
|
54
|
+
data: ref, // ← a URL, not bytes
|
|
55
|
+
};
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
- `adapterKind` must match the adapter that will resolve this ref.
|
|
59
|
+
Cross-adapter resolution is unsupported and throws
|
|
60
|
+
`AshAttachmentError{ kind: "wrong-kind" }`.
|
|
61
|
+
- `params` is adapter-defined. Never put credentials here — the
|
|
62
|
+
resolver pulls those from its own adapter state.
|
|
63
|
+
- `size`, when populated, is checked against the route's
|
|
64
|
+
`UploadPolicy.maxBytes` before the bytes are fetched. A 500 MB ref
|
|
65
|
+
over a 25 MB policy is rejected without touching the network.
|
|
66
|
+
|
|
67
|
+
## Writing a resolver
|
|
68
|
+
|
|
69
|
+
The resolver hangs off `ChannelAdapter.attachments`. It receives a ref
|
|
70
|
+
and returns bytes:
|
|
71
|
+
|
|
72
|
+
```ts
|
|
73
|
+
import {
|
|
74
|
+
AshAttachmentError,
|
|
75
|
+
type AttachmentResolver,
|
|
76
|
+
type ChannelAdapter,
|
|
77
|
+
} from "experimental-ash/channels";
|
|
78
|
+
|
|
79
|
+
export function createDiscordAdapter(options: {
|
|
80
|
+
readonly botToken: string;
|
|
81
|
+
}): ChannelAdapter {
|
|
82
|
+
const attachments: AttachmentResolver = {
|
|
83
|
+
async resolve(ref) {
|
|
84
|
+
const url = ref.params.cdn_url;
|
|
85
|
+
if (url === undefined) {
|
|
86
|
+
throw new AshAttachmentError({
|
|
87
|
+
adapterKind: "discord",
|
|
88
|
+
kind: "missing-param",
|
|
89
|
+
message: 'discord attachment ref is missing the "cdn_url" param',
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
const response = await fetch(url, {
|
|
93
|
+
headers: { authorization: `Bot ${options.botToken}` },
|
|
94
|
+
});
|
|
95
|
+
if (!response.ok) {
|
|
96
|
+
throw new AshAttachmentError({
|
|
97
|
+
adapterKind: "discord",
|
|
98
|
+
kind: "fetch-failed",
|
|
99
|
+
message: `discord attachment fetch failed: HTTP ${response.status}`,
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
return Buffer.from(await response.arrayBuffer());
|
|
103
|
+
},
|
|
104
|
+
};
|
|
105
|
+
|
|
106
|
+
return {
|
|
107
|
+
attachments,
|
|
108
|
+
deliver: /* ... */,
|
|
109
|
+
kind: "discord",
|
|
110
|
+
state: {},
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
The resolver:
|
|
116
|
+
|
|
117
|
+
- **Runs inside a step boundary.** Full Node access, full async, full
|
|
118
|
+
filesystem. Safe to use `fetch`, cryptographic primitives, etc.
|
|
119
|
+
- **Closes over credentials.** `botToken` is captured at construction;
|
|
120
|
+
the ref itself carries only the identity of the file.
|
|
121
|
+
- **Throws `AshAttachmentError` on failure.** The `kind` discriminator
|
|
122
|
+
lets observability distinguish operator misconfiguration from
|
|
123
|
+
transport failure. Uncategorized throws are wrapped as
|
|
124
|
+
`resolver-threw`.
|
|
125
|
+
|
|
126
|
+
## Error kinds
|
|
127
|
+
|
|
128
|
+
`AshAttachmentError.kind` is one of:
|
|
129
|
+
|
|
130
|
+
| kind | meaning |
|
|
131
|
+
| ------------------ | ---------------------------------------------------------------------------- |
|
|
132
|
+
| `missing-adapter` | No `ChannelKey` was bound on the active context. |
|
|
133
|
+
| `wrong-kind` | The ref's `adapterKind` does not match the active adapter. |
|
|
134
|
+
| `resolver-missing` | The active adapter matches, but did not declare an `attachments` resolver. |
|
|
135
|
+
| `missing-param` | The resolver looked for an adapter-defined param on `ref.params` and missed. |
|
|
136
|
+
| `fetch-failed` | Non-2xx HTTP response or transport-level network failure. |
|
|
137
|
+
| `resolver-threw` | Catch-all wrapper for unclassified throws out of the resolver. |
|
|
138
|
+
|
|
139
|
+
The current default posture across every kind is **drop the
|
|
140
|
+
attachment, log a warning, and continue the turn** — matching the old
|
|
141
|
+
"broken upload" path. Channels can inspect `.kind` and decide to fail
|
|
142
|
+
hard in a future strict mode.
|
|
143
|
+
|
|
144
|
+
## Dropped attachments
|
|
145
|
+
|
|
146
|
+
Attachments that can't be expressed as a ref (no URL, no stable
|
|
147
|
+
identity) cannot be delivered. The channel should log and drop them:
|
|
148
|
+
|
|
149
|
+
```ts
|
|
150
|
+
if (attachment.url === undefined) {
|
|
151
|
+
console.warn("[my-channel] dropped attachment — no url available for ref construction", {
|
|
152
|
+
name: attachment.name,
|
|
153
|
+
});
|
|
154
|
+
continue;
|
|
155
|
+
}
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
This mirrors the shape the Slack adapter uses today.
|
|
159
|
+
|
|
160
|
+
## What you do NOT have to do
|
|
161
|
+
|
|
162
|
+
- Stream the bytes yourself. The harness writes them to the sandbox
|
|
163
|
+
after your resolver returns.
|
|
164
|
+
- Deduplicate fetches. Refs SHA-dedupe at the sandbox layer
|
|
165
|
+
(`stageFilePart`). Network-level caching inside the resolver is
|
|
166
|
+
optional and transparent.
|
|
167
|
+
- Worry about step boundaries in the resolver. The resolver is only
|
|
168
|
+
called from inside a step.
|