2026-02-06 18:43:11 -08:00
|
|
|
import fs from "node:fs";
|
|
|
|
|
import path from "node:path";
|
2026-03-16 01:32:47 +00:00
|
|
|
import { pluginSdkEntrypoints } from "./lib/plugin-sdk-entries.mjs";
|
2026-02-06 18:43:11 -08:00
|
|
|
|
2026-03-18 23:18:36 +00:00
|
|
|
const RUNTIME_SHIMS: Partial<Record<string, string>> = {
|
|
|
|
|
"secret-input-runtime": [
|
|
|
|
|
"export {",
|
|
|
|
|
" hasConfiguredSecretInput,",
|
|
|
|
|
" normalizeResolvedSecretInputString,",
|
|
|
|
|
" normalizeSecretInputString,",
|
|
|
|
|
'} from "./config-runtime.js";',
|
|
|
|
|
"",
|
|
|
|
|
].join("\n"),
|
|
|
|
|
"webhook-path": [
|
|
|
|
|
"/** Normalize webhook paths into the canonical registry form used by route lookup. */",
|
|
|
|
|
"export function normalizeWebhookPath(raw) {",
|
|
|
|
|
" const trimmed = raw.trim();",
|
|
|
|
|
" if (!trimmed) {",
|
|
|
|
|
' return "/";',
|
|
|
|
|
" }",
|
|
|
|
|
' const withSlash = trimmed.startsWith("/") ? trimmed : `/${trimmed}`;',
|
|
|
|
|
' if (withSlash.length > 1 && withSlash.endsWith("/")) {',
|
|
|
|
|
" return withSlash.slice(0, -1);",
|
|
|
|
|
" }",
|
|
|
|
|
" return withSlash;",
|
|
|
|
|
"}",
|
|
|
|
|
"",
|
|
|
|
|
"/** Resolve the effective webhook path from explicit path, URL, or default fallback. */",
|
|
|
|
|
"export function resolveWebhookPath(params) {",
|
|
|
|
|
" const trimmedPath = params.webhookPath?.trim();",
|
|
|
|
|
" if (trimmedPath) {",
|
|
|
|
|
" return normalizeWebhookPath(trimmedPath);",
|
|
|
|
|
" }",
|
|
|
|
|
" if (params.webhookUrl?.trim()) {",
|
|
|
|
|
" try {",
|
|
|
|
|
" const parsed = new URL(params.webhookUrl);",
|
|
|
|
|
' return normalizeWebhookPath(parsed.pathname || "/");',
|
|
|
|
|
" } catch {",
|
|
|
|
|
" return null;",
|
|
|
|
|
" }",
|
|
|
|
|
" }",
|
|
|
|
|
" return params.defaultPath ?? null;",
|
|
|
|
|
"}",
|
|
|
|
|
"",
|
|
|
|
|
].join("\n"),
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
const TYPE_SHIMS: Partial<Record<string, string>> = {
|
|
|
|
|
"secret-input-runtime": [
|
|
|
|
|
"export {",
|
|
|
|
|
" hasConfiguredSecretInput,",
|
|
|
|
|
" normalizeResolvedSecretInputString,",
|
|
|
|
|
" normalizeSecretInputString,",
|
|
|
|
|
'} from "./config-runtime.js";',
|
|
|
|
|
"",
|
|
|
|
|
].join("\n"),
|
|
|
|
|
};
|
|
|
|
|
|
2026-03-14 02:44:55 -07:00
|
|
|
// `tsc` emits declarations under `dist/plugin-sdk/src/plugin-sdk/*` because the source lives
|
|
|
|
|
// at `src/plugin-sdk/*` and `rootDir` is `.` (repo root, to support cross-src/extensions refs).
|
fix(slack): download all files in multi-image messages (#15447)
* fix(slack): download all files in multi-image messages
resolveSlackMedia() previously returned after downloading the first
file, causing multi-image Slack messages to lose all but the first
attachment. This changes the function to collect all successfully
downloaded files into an array, matching the pattern already used by
Telegram, Line, Discord, and iMessage adapters.
The prepare handler now populates MediaPaths, MediaUrls, and
MediaTypes arrays so downstream media processing (vision, sandbox
staging, media notes) works correctly with multiple attachments.
Fixes #11892, #7536
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* fix(slack): preserve MediaTypes index alignment with MediaPaths/MediaUrls
The filter(Boolean) on MediaTypes removed entries with undefined contentType,
shrinking the array and breaking index correlation with MediaPaths and MediaUrls.
Downstream code (media-note.ts, attachments.ts) requires these arrays to have
equal lengths for correct per-attachment MIME type lookup. Replace filter(Boolean)
with a nullish coalescing fallback to "application/octet-stream".
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* fix(slack): align MediaType fallback and tests (#15447) (thanks @CommanderCrowCode)
* fix: unblock plugin-sdk account-id typing (#15447)
---------
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-02-14 20:16:02 +07:00
|
|
|
//
|
|
|
|
|
// Our package export map points subpath `types` at `dist/plugin-sdk/<entry>.d.ts`, so we
|
|
|
|
|
// generate stable entry d.ts files that re-export the real declarations.
|
2026-03-16 01:32:47 +00:00
|
|
|
for (const entry of pluginSdkEntrypoints) {
|
2026-03-18 23:18:36 +00:00
|
|
|
const typeOut = path.join(process.cwd(), `dist/plugin-sdk/${entry}.d.ts`);
|
|
|
|
|
fs.mkdirSync(path.dirname(typeOut), { recursive: true });
|
|
|
|
|
fs.writeFileSync(
|
|
|
|
|
typeOut,
|
|
|
|
|
TYPE_SHIMS[entry] ?? `export * from "./src/plugin-sdk/${entry}.js";\n`,
|
|
|
|
|
"utf8",
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
const runtimeShim = RUNTIME_SHIMS[entry];
|
|
|
|
|
if (!runtimeShim) {
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
const runtimeOut = path.join(process.cwd(), `dist/plugin-sdk/${entry}.js`);
|
|
|
|
|
fs.mkdirSync(path.dirname(runtimeOut), { recursive: true });
|
|
|
|
|
fs.writeFileSync(runtimeOut, runtimeShim, "utf8");
|
fix(slack): download all files in multi-image messages (#15447)
* fix(slack): download all files in multi-image messages
resolveSlackMedia() previously returned after downloading the first
file, causing multi-image Slack messages to lose all but the first
attachment. This changes the function to collect all successfully
downloaded files into an array, matching the pattern already used by
Telegram, Line, Discord, and iMessage adapters.
The prepare handler now populates MediaPaths, MediaUrls, and
MediaTypes arrays so downstream media processing (vision, sandbox
staging, media notes) works correctly with multiple attachments.
Fixes #11892, #7536
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* fix(slack): preserve MediaTypes index alignment with MediaPaths/MediaUrls
The filter(Boolean) on MediaTypes removed entries with undefined contentType,
shrinking the array and breaking index correlation with MediaPaths and MediaUrls.
Downstream code (media-note.ts, attachments.ts) requires these arrays to have
equal lengths for correct per-attachment MIME type lookup. Replace filter(Boolean)
with a nullish coalescing fallback to "application/octet-stream".
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* fix(slack): align MediaType fallback and tests (#15447) (thanks @CommanderCrowCode)
* fix: unblock plugin-sdk account-id typing (#15447)
---------
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-02-14 20:16:02 +07:00
|
|
|
}
|