diff --git a/apps/example/package.json b/apps/example/package.json index a6ccd15362..942e203873 100644 --- a/apps/example/package.json +++ b/apps/example/package.json @@ -35,6 +35,6 @@ "cross-env": "^10.1.0", "jiti": "^2.7.0", "nitro": "3.0.260522-beta", - "typescript": "^6.0.3" + "typescript": "^7.0.2" } } diff --git a/packages/junior-dashboard/package.json b/packages/junior-dashboard/package.json index 4907273097..eb223d7805 100644 --- a/packages/junior-dashboard/package.json +++ b/packages/junior-dashboard/package.json @@ -25,7 +25,7 @@ "build": "pnpm --filter @sentry/junior-plugin-api build && pnpm --filter @sentry/junior build && pnpm run build:client && pnpm run build:css && pnpm run build:server", "build:client": "tsup --config tsup.client.config.ts", "build:css": "tailwindcss -i src/tailwind.css -o dist/tailwind.css --minify", - "build:server": "tsup --config tsup.config.ts", + "build:server": "tsup --config tsup.config.ts && tsdown --config tsdown.dts.config.ts", "lint": "oxlint --config .oxlintrc.json --deny-warnings src", "prepare": "pnpm run build", "prepack": "pnpm run build", @@ -60,8 +60,9 @@ "eslint": "^10.8.0", "oxlint": "^1.79.0", "tailwindcss": "^4.3.0", + "tsdown": "0.23.1", "tsup": "^8.5.1", - "typescript": "^6.0.3", + "typescript": "^7.0.2", "vitest": "^4.1.7" } } diff --git a/packages/junior-dashboard/src/app.ts b/packages/junior-dashboard/src/app.ts index 40093f8897..65d7d74c6a 100644 --- a/packages/junior-dashboard/src/app.ts +++ b/packages/junior-dashboard/src/app.ts @@ -575,6 +575,7 @@ export function createDashboardApp( c.set("viewer", viewer); } await next(); + return undefined; }; app.use("*", requireAuth); diff --git a/packages/junior-dashboard/src/authenticated-routes.ts b/packages/junior-dashboard/src/authenticated-routes.ts index a2293699f7..9b64e30834 100644 --- a/packages/junior-dashboard/src/authenticated-routes.ts +++ b/packages/junior-dashboard/src/authenticated-routes.ts @@ -19,8 +19,7 @@ export function isAuthPath( const requestSegments = segments(pathname); return routes.some((route) => { const routeSegments = segments(route.path); - for (let index = 0; index < routeSegments.length; index += 1) { - const pattern = routeSegments[index]; + for (const [index, pattern] of routeSegments.entries()) { if (pattern === "*") return true; const value = requestSegments[index]; if (!value || (pattern !== value && !pattern.startsWith(":"))) { diff --git a/packages/junior-dashboard/src/client.tsx b/packages/junior-dashboard/src/client.tsx index c45cb40a1b..53d97325f5 100644 --- a/packages/junior-dashboard/src/client.tsx +++ b/packages/junior-dashboard/src/client.tsx @@ -22,18 +22,18 @@ class DashboardErrorBoundary extends Component< { children: ReactNode }, ErrorBoundaryState > { - state: ErrorBoundaryState = { error: null }; + override state: ErrorBoundaryState = { error: null }; static getDerivedStateFromError(error: Error): ErrorBoundaryState { return { error }; } - componentDidCatch(error: Error, errorInfo: ErrorInfo) { + override componentDidCatch(error: Error, errorInfo: ErrorInfo) { const stack = error.stack ?? errorInfo.componentStack; window.__JUNIOR_DASHBOARD_SHOW_ERROR__?.(stack ? new Error(stack) : error); } - render() { + override render() { if (this.state.error) { return ; } diff --git a/packages/junior-dashboard/src/client/conversations/TranscriptActivityGroup.tsx b/packages/junior-dashboard/src/client/conversations/TranscriptActivityGroup.tsx index 6bd09d951b..a1922ce54b 100644 --- a/packages/junior-dashboard/src/client/conversations/TranscriptActivityGroup.tsx +++ b/packages/junior-dashboard/src/client/conversations/TranscriptActivityGroup.tsx @@ -101,9 +101,10 @@ export function activityGroupSummary( (entry) => entry.kind === "attachments_delivered", ).length; const eventCount = entries.filter((entry) => entry.kind === "message").length; + const [onlyHandoff] = handoffs; const handoffSummary = - handoffs.length === 1 - ? `model handoff to ${handoffs[0].modelId} (${handoffs[0].modelProfile})` + handoffs.length === 1 && onlyHandoff + ? `model handoff to ${onlyHandoff.modelId} (${onlyHandoff.modelProfile})` : handoffs.length > 1 ? countLabel(handoffs.length, "model handoff", "model handoffs") : undefined; diff --git a/packages/junior-dashboard/src/client/conversations/transcriptFailure.ts b/packages/junior-dashboard/src/client/conversations/transcriptFailure.ts index 46513e2af8..2ed6a1803e 100644 --- a/packages/junior-dashboard/src/client/conversations/transcriptFailure.ts +++ b/packages/junior-dashboard/src/client/conversations/transcriptFailure.ts @@ -55,8 +55,6 @@ export function transcriptFailureTitle( case "agent_run_failed": return "Internal error"; } - - return "Internal error"; } /** Short description for one failed turn in the transcript. */ @@ -111,8 +109,6 @@ export function transcriptFailureDescription( case "agent_run_failed": return `${agentName} hit an internal error during this turn.`; } - - return `${agentName} hit an internal error during this turn.`; } /** Search text for one failed turn in the transcript. */ diff --git a/packages/junior-dashboard/src/client/conversations/transcriptMarkdownLinks.ts b/packages/junior-dashboard/src/client/conversations/transcriptMarkdownLinks.ts index 280ed1f2c5..4f100dcd7f 100644 --- a/packages/junior-dashboard/src/client/conversations/transcriptMarkdownLinks.ts +++ b/packages/junior-dashboard/src/client/conversations/transcriptMarkdownLinks.ts @@ -88,6 +88,7 @@ function findNextMarkdownLink( start: linkStart, }; } + return undefined; } function findMarkdownLinkSyntaxRanges( @@ -148,6 +149,7 @@ function readMarkdownDestination( const href = text.slice(start, index); return href ? { end: index + 1, href } : undefined; } + return undefined; } function findCommonMarkAutolinks( @@ -199,6 +201,7 @@ function findNextBareLink( start: match.index, }; } + return undefined; } function findBareLinks( diff --git a/packages/junior-dashboard/src/client/pages/automations/AutomationOutcomeFields.tsx b/packages/junior-dashboard/src/client/pages/automations/AutomationOutcomeFields.tsx index ee526cc4f8..3fdb3eae5d 100644 --- a/packages/junior-dashboard/src/client/pages/automations/AutomationOutcomeFields.tsx +++ b/packages/junior-dashboard/src/client/pages/automations/AutomationOutcomeFields.tsx @@ -141,10 +141,10 @@ export function AutomationOutcomeFields(props: { disabled={index === 0} onClick={() => { const next = [...props.value]; - [next[index - 1], next[index]] = [ - next[index], - next[index - 1], - ]; + const previous = next[index - 1]; + if (!previous) return; + next[index - 1] = outcome; + next[index] = previous; props.onChange(next); }} > diff --git a/packages/junior-dashboard/src/client/pages/automations/automationDraft.ts b/packages/junior-dashboard/src/client/pages/automations/automationDraft.ts index 80b7c7f9b4..d1b7d23d0d 100644 --- a/packages/junior-dashboard/src/client/pages/automations/automationDraft.ts +++ b/packages/junior-dashboard/src/client/pages/automations/automationDraft.ts @@ -53,7 +53,7 @@ export function scheduleDraft( ...fields, timezone: value.schedule.timezone, time: `${String(time.hour).padStart(2, "0")}:${String(time.minute).padStart(2, "0")}`, - weekdays: days?.map((day) => weekdays[day]), + weekdays: days?.flatMap((day) => weekdays[day] ?? []), }; } if (value.nextRunAtMs) { diff --git a/packages/junior-dashboard/src/client/pages/system/PluginBarChart.tsx b/packages/junior-dashboard/src/client/pages/system/PluginBarChart.tsx index d6005b1754..c0ca1d591f 100644 --- a/packages/junior-dashboard/src/client/pages/system/PluginBarChart.tsx +++ b/packages/junior-dashboard/src/client/pages/system/PluginBarChart.tsx @@ -23,6 +23,12 @@ const toneColors = { warning: "#fbbf24", } as const; +function seriesColor(series: Widget["series"][number], index: number): string { + return series.tone + ? toneColors[series.tone] + : (colors[index % colors.length] ?? colors[0]); +} + /** Render a validated plugin-owned categorical bar chart. */ export function PluginBarChart(props: { range?: TimeRangeDays; @@ -69,9 +75,7 @@ export function PluginBarChart(props: { ({ - color: series.tone - ? toneColors[series.tone] - : colors[index % colors.length], + color: seriesColor(series, index), key: series.key, label: series.label, }))} @@ -122,11 +126,7 @@ export function PluginBarChart(props: { > { expect( formatCacheShare(summary.input.cacheCreationTokens, summary.total), ).toBe("11.1%"); - const missing = { ...days[0], cacheCreationTokens: undefined }; + const missing = { ...days[0]!, cacheCreationTokens: undefined }; expect(cacheInputTotal(missing)).toBeUndefined(); - expect(summarizeCacheInput([missing, days[1]]).total).toBeUndefined(); - expect(summarizeCacheInput([missing, days[1]]).incompletePeriods).toBe(1); + expect(summarizeCacheInput([missing, days[1]!]).total).toBeUndefined(); + expect(summarizeCacheInput([missing, days[1]!]).incompletePeriods).toBe(1); const zeroWrites = { ...days[0], cacheCreationTokens: 0 }; expect(cacheInputTotal(zeroWrites)).toBe(1_000_000_000); expect(formatCacheShare(0, cacheInputTotal(zeroWrites))).toBe("0.0%"); diff --git a/packages/junior-dashboard/tests/client-api.test.ts b/packages/junior-dashboard/tests/client-api.test.ts index d0ed4a5494..f2bbd9aaed 100644 --- a/packages/junior-dashboard/tests/client-api.test.ts +++ b/packages/junior-dashboard/tests/client-api.test.ts @@ -12,7 +12,6 @@ import { setMockConversationArchived, } from "../src/mock-reporting/fixtures"; import { personalSpendRefreshDelay } from "../src/client/api"; -import { fetchDashboardJson } from "../src/client/http"; import { dashboardVersionDrift } from "../src/client/components/VersionDriftBanner"; import { DASHBOARD_VERSION_HEADER } from "../src/dashboard-version"; import { diff --git a/packages/junior-dashboard/tests/telemetry-components.test.tsx b/packages/junior-dashboard/tests/telemetry-components.test.tsx index 7688a21771..73231b41ed 100644 --- a/packages/junior-dashboard/tests/telemetry-components.test.tsx +++ b/packages/junior-dashboard/tests/telemetry-components.test.tsx @@ -161,7 +161,9 @@ function plugin(name: string, overrides: Partial = {}): Plugin { configKeys: [], description: `${name} plugin description`, displayName: - name === "github" ? "GitHub" : `${name[0].toUpperCase()}${name.slice(1)}`, + name === "github" + ? "GitHub" + : `${name.charAt(0).toUpperCase()}${name.slice(1)}`, name, ...overrides, }; diff --git a/packages/junior-dashboard/tsconfig.json b/packages/junior-dashboard/tsconfig.json index 99dac1dee6..c1982352ac 100644 --- a/packages/junior-dashboard/tsconfig.json +++ b/packages/junior-dashboard/tsconfig.json @@ -1,15 +1,13 @@ { + "extends": "../../tsconfig.base.json", "compilerOptions": { "target": "ES2022", "lib": ["ES2022", "DOM"], "module": "ESNext", "moduleResolution": "Bundler", - "strict": true, "jsx": "react-jsx", "esModuleInterop": true, - "skipLibCheck": true, "resolveJsonModule": true, - "isolatedModules": true, "allowJs": false, "noEmit": true, "paths": { diff --git a/packages/junior-dashboard/tsdown.dts.config.ts b/packages/junior-dashboard/tsdown.dts.config.ts new file mode 100644 index 0000000000..07377ba87c --- /dev/null +++ b/packages/junior-dashboard/tsdown.dts.config.ts @@ -0,0 +1,19 @@ +import { defineConfig } from "tsdown"; + +// tsup still emits the server JavaScript. Its declaration bundler needs the +// TypeScript 6 compiler API, so tsdown bundles the public types instead. +export default defineConfig({ + entry: { + index: "src/index.ts", + }, + tsconfig: "tsconfig.build.json", + dts: { + emitDtsOnly: true, + }, + outDir: "dist", + outExtensions: () => ({ + js: ".js", + dts: ".d.ts", + }), + clean: false, +}); diff --git a/packages/junior-dashboard/tsup.config.ts b/packages/junior-dashboard/tsup.config.ts index d72e2006bb..35337cbb0a 100644 --- a/packages/junior-dashboard/tsup.config.ts +++ b/packages/junior-dashboard/tsup.config.ts @@ -93,15 +93,7 @@ export default defineConfig({ }, format: "esm", tsconfig: "tsconfig.build.json", - dts: { - entry: { - index: "src/index.ts", - }, - compilerOptions: { - // TODO(upstream): Remove after tsup stops adding deprecated baseUrl. - ignoreDeprecations: "6.0", - }, - }, + dts: false, outDir: "dist", clean: false, splitting: false, diff --git a/packages/junior-evals/package.json b/packages/junior-evals/package.json index 3b594961f2..3bbec4641e 100644 --- a/packages/junior-evals/package.json +++ b/packages/junior-evals/package.json @@ -28,7 +28,7 @@ "hono": "^4.12.27", "msw": "^2.14.6", "tinyrainbow": "^3.1.0", - "typescript": "^6.0.3", + "typescript": "^7.0.2", "undici": "7.29.0", "vitest": "^4.1.7", "vitest-evals": "0.16.1", diff --git a/packages/junior-evals/src/fixture/google.ts b/packages/junior-evals/src/fixture/google.ts index 616077a68d..55af3f9327 100644 --- a/packages/junior-evals/src/fixture/google.ts +++ b/packages/junior-evals/src/fixture/google.ts @@ -60,19 +60,20 @@ function offsetMs(ms: number): number { .formatToParts(ms) .map((part) => [part.type, Number(part.value)]), ); + const part = (type: Intl.DateTimeFormatPartTypes) => parts[type] ?? 0; const wall = Date.UTC( - parts.year, - parts.month - 1, - parts.day, - parts.hour, - parts.minute, + part("year"), + part("month") - 1, + part("day"), + part("hour"), + part("minute"), ); return wall - Math.floor(ms / 60_000) * 60_000; } /** The instant of a Pacific time on a day, given as UTC midnight. */ function pacificMs(dayMs: number, clock: string): number { - const [hours, minutes] = clock.split(":").map(Number); + const [hours = 0, minutes = 0] = clock.split(":").map(Number); const wall = dayMs + hours * 3_600_000 + minutes * 60_000; // A second pass corrects the offset on days when it changes. return wall - offsetMs(wall - offsetMs(wall)); @@ -92,6 +93,7 @@ function occurrences(calendar: MockCalendar, timeMin: string, timeMax: string) { dayMs += DAY_MS ) { const weekday = WEEKDAYS[new Date(dayMs).getUTCDay()]; + if (!weekday) continue; const date = new Date(dayMs).toISOString().slice(0, 10).replaceAll("-", ""); for (const [index, event] of calendar.events.entries()) { const startMs = pacificMs(dayMs, event.start); diff --git a/packages/junior-evals/tsconfig.json b/packages/junior-evals/tsconfig.json index a8b95686ad..5c41b38ee9 100644 --- a/packages/junior-evals/tsconfig.json +++ b/packages/junior-evals/tsconfig.json @@ -1,14 +1,12 @@ { + "extends": "../../tsconfig.base.json", "compilerOptions": { "target": "ES2022", "lib": ["ES2022", "DOM"], "module": "ESNext", "moduleResolution": "Bundler", - "strict": true, "esModuleInterop": true, - "skipLibCheck": true, "resolveJsonModule": true, - "isolatedModules": true, "noEmit": true, "allowImportingTsExtensions": true, "paths": { diff --git a/packages/junior-github/package.json b/packages/junior-github/package.json index b34f98f930..a851c6c4e3 100644 --- a/packages/junior-github/package.json +++ b/packages/junior-github/package.json @@ -50,7 +50,7 @@ "msw": "^2.14.6", "oxlint": "^1.79.0", "tsup": "^8.5.1", - "typescript": "^6.0.3", + "typescript": "^7.0.2", "vitest": "^4.1.7" } } diff --git a/packages/junior-github/src/tool-support/attribution.ts b/packages/junior-github/src/tool-support/attribution.ts index 5ce181cf4d..52dc3fe36e 100644 --- a/packages/junior-github/src/tool-support/attribution.ts +++ b/packages/junior-github/src/tool-support/attribution.ts @@ -120,9 +120,10 @@ function applyAttribution(body: string, label: string | undefined): string { `${GITHUB_REQUEST_ATTRIBUTION_START}([\\s\\S]*?)${GITHUB_REQUEST_ATTRIBUTION_END}`, ); const existingMatch = normalizedBody.match(existing); - const existingLabels = existingMatch - ? parseExistingLabels(existingMatch[1]) - : []; + const existingLabels = + existingMatch?.[1] !== undefined + ? parseExistingLabels(existingMatch[1]) + : []; const labels = label && !existingLabels.includes(label) ? [...existingLabels, label] diff --git a/packages/junior-github/src/webhooks/ownership.ts b/packages/junior-github/src/webhooks/ownership.ts index bec0f3ea62..4783b61580 100644 --- a/packages/junior-github/src/webhooks/ownership.ts +++ b/packages/junior-github/src/webhooks/ownership.ts @@ -11,10 +11,12 @@ function parseGitHubBotIdentity( value: string | undefined, ): GitHubBotIdentity | undefined { const match = GITHUB_BOT_NOREPLY_EMAIL.exec(value?.trim() ?? ""); - if (!match?.groups) return undefined; + const login = match?.groups?.login; + const userId = match?.groups?.userId; + if (!login || !userId) return undefined; return { - login: match.groups.login, - userId: Number(match.groups.userId), + login, + userId: Number(userId), }; } diff --git a/packages/junior-github/tsconfig.json b/packages/junior-github/tsconfig.json index 4c12d9d7dc..3258d42876 100644 --- a/packages/junior-github/tsconfig.json +++ b/packages/junior-github/tsconfig.json @@ -1,12 +1,10 @@ { + "extends": "../../tsconfig.base.json", "compilerOptions": { "target": "ES2022", "lib": ["ES2022", "DOM"], "module": "ESNext", "moduleResolution": "Bundler", - "strict": true, - "skipLibCheck": true, - "isolatedModules": true, "noEmit": true, "types": ["node"] }, diff --git a/packages/junior-google/package.json b/packages/junior-google/package.json index f5cadb9d2d..2dd2d1f59e 100644 --- a/packages/junior-google/package.json +++ b/packages/junior-google/package.json @@ -43,7 +43,7 @@ "drizzle-kit": "catalog:", "oxlint": "^1.79.0", "tsup": "^8.5.1", - "typescript": "^6.0.3", + "typescript": "^7.0.2", "vitest": "^4.1.7" } } diff --git a/packages/junior-google/src/tools/find-meeting-times.ts b/packages/junior-google/src/tools/find-meeting-times.ts index c5759dee43..c17564a537 100644 --- a/packages/junior-google/src/tools/find-meeting-times.ts +++ b/packages/junior-google/src/tools/find-meeting-times.ts @@ -144,7 +144,7 @@ function localFormat(timeZone: string): Intl.DateTimeFormat { } function clockMinutes(value: string): number { - const [hours, minutes] = value.split(":").map(Number); + const [hours = 0, minutes = 0] = value.split(":").map(Number); return hours * 60 + minutes; } diff --git a/packages/junior-google/tsconfig.json b/packages/junior-google/tsconfig.json index 8c5ea28503..928957d7f7 100644 --- a/packages/junior-google/tsconfig.json +++ b/packages/junior-google/tsconfig.json @@ -1,12 +1,10 @@ { + "extends": "../../tsconfig.base.json", "compilerOptions": { "target": "ES2022", "lib": ["ES2022"], "module": "ESNext", "moduleResolution": "Bundler", - "strict": true, - "skipLibCheck": true, - "isolatedModules": true, "noEmit": true, "types": ["node"] }, diff --git a/packages/junior-linear/package.json b/packages/junior-linear/package.json index 64e8c1a161..df76066bec 100644 --- a/packages/junior-linear/package.json +++ b/packages/junior-linear/package.json @@ -38,7 +38,7 @@ "@types/node": "^25.9.1", "oxlint": "^1.79.0", "tsup": "^8.5.1", - "typescript": "^6.0.3", + "typescript": "^7.0.2", "vitest": "^4.1.7" } } diff --git a/packages/junior-linear/tsconfig.json b/packages/junior-linear/tsconfig.json index 4c12d9d7dc..3258d42876 100644 --- a/packages/junior-linear/tsconfig.json +++ b/packages/junior-linear/tsconfig.json @@ -1,12 +1,10 @@ { + "extends": "../../tsconfig.base.json", "compilerOptions": { "target": "ES2022", "lib": ["ES2022", "DOM"], "module": "ESNext", "moduleResolution": "Bundler", - "strict": true, - "skipLibCheck": true, - "isolatedModules": true, "noEmit": true, "types": ["node"] }, diff --git a/packages/junior-memory/package.json b/packages/junior-memory/package.json index 4ec9aed007..fe8a60f087 100644 --- a/packages/junior-memory/package.json +++ b/packages/junior-memory/package.json @@ -22,9 +22,9 @@ "migrations" ], "scripts": { - "build": "tsup", + "build": "tsdown", "db:generate": "pnpm exec drizzle-kit generate --config drizzle.config.ts", - "lint": "oxlint --config ../junior/.oxlintrc.json --deny-warnings src tests tsup.config.ts", + "lint": "oxlint --config ../junior/.oxlintrc.json --deny-warnings src tests tsdown.config.ts", "prepare": "pnpm run build", "prepack": "pnpm run build", "test": "vitest run", @@ -43,8 +43,8 @@ "@types/node": "^25.9.1", "drizzle-kit": "catalog:", "oxlint": "^1.79.0", - "tsup": "^8.5.1", - "typescript": "^6.0.3", + "tsdown": "0.23.1", + "typescript": "^7.0.2", "vitest": "^4.1.7" } } diff --git a/packages/junior-memory/src/store.ts b/packages/junior-memory/src/store.ts index e00c50f78b..f23151cf24 100644 --- a/packages/junior-memory/src/store.ts +++ b/packages/junior-memory/src/store.ts @@ -632,10 +632,10 @@ export async function archiveExpiredMemoryBatch(args: { return { archivedCount: archivedIds.length }; } -function denseRanks( +function withDenseRanks( values: T[], key: (value: T) => string | number, -): number[] { +): Array<{ rank: number; value: T }> { let previous: string | number | undefined; let rank = 0; return values.map((value, index) => { @@ -644,7 +644,7 @@ function denseRanks( rank = index + 1; previous = current; } - return rank; + return { rank, value }; }); } @@ -659,13 +659,14 @@ async function embedOne( const result = embeddingResultSchema.parse( await embedder.embedTexts({ texts: [normalized] }), ); - if (result.vectors.length !== 1) { + const [vector] = result.vectors; + if (result.vectors.length !== 1 || !vector) { throw new Error("Embedding provider returned an unexpected vector count."); } return { model: result.model, provider: result.provider, - vector: result.vectors[0], + vector, }; } @@ -1110,11 +1111,12 @@ async function searchVisibleLexicalMemories(args: { .from(candidates) .orderBy(desc(textRank), desc(candidates.observedAtMs), asc(candidates.id)) .limit(args.limit); - const ranks = denseRanks(rows, (row) => Number(row.textRank)); - return rows.map((row, index) => ({ - lexical: { rank: ranks[index] }, - memory: parseMemoryRow(row.memory), - })); + return withDenseRanks(rows, (row) => Number(row.textRank)).map( + ({ rank, value: row }) => ({ + lexical: { rank }, + memory: parseMemoryRow(row.memory), + }), + ); } /** Search active visible records with pgvector cosine distance. */ @@ -1167,25 +1169,26 @@ async function searchVisibleVectorMemories(args: { asc(juniorMemoryMemories.id), ) .limit(args.limit); - const ranks = denseRanks(rows, (row) => Number(row.distance)); - return rows.flatMap((row, index) => { - const distanceValue = Number(row.distance); - if ( - row.distance === null || - !Number.isFinite(distanceValue) || - hashEmbeddedContent(row.memory.content) !== row.contentHash - ) { - return []; - } - return [ - { - memory: parseMemoryRow(row.memory), - vector: { - rank: ranks[index], + return withDenseRanks(rows, (row) => Number(row.distance)).flatMap( + ({ rank, value: row }) => { + const distanceValue = Number(row.distance); + if ( + row.distance === null || + !Number.isFinite(distanceValue) || + hashEmbeddedContent(row.memory.content) !== row.contentHash + ) { + return []; + } + return [ + { + memory: parseMemoryRow(row.memory), + vector: { + rank, + }, }, - }, - ]; - }); + ]; + }, + ); } /** Create a context-bound SQL-backed store for explicit memory operations. */ diff --git a/packages/junior-memory/tsconfig.json b/packages/junior-memory/tsconfig.json index 8c5ea28503..928957d7f7 100644 --- a/packages/junior-memory/tsconfig.json +++ b/packages/junior-memory/tsconfig.json @@ -1,12 +1,10 @@ { + "extends": "../../tsconfig.base.json", "compilerOptions": { "target": "ES2022", "lib": ["ES2022"], "module": "ESNext", "moduleResolution": "Bundler", - "strict": true, - "skipLibCheck": true, - "isolatedModules": true, "noEmit": true, "types": ["node"] }, diff --git a/packages/junior-memory/tsdown.config.ts b/packages/junior-memory/tsdown.config.ts new file mode 100644 index 0000000000..55b16d767d --- /dev/null +++ b/packages/junior-memory/tsdown.config.ts @@ -0,0 +1,14 @@ +import { defineConfig } from "tsdown"; + +export default defineConfig({ + clean: true, + dts: true, + entry: ["src/index.ts"], + format: "esm", + outExtensions: () => ({ + js: ".js", + dts: ".d.ts", + }), + sourcemap: true, + target: "node24", +}); diff --git a/packages/junior-memory/tsup.config.ts b/packages/junior-memory/tsup.config.ts deleted file mode 100644 index 91816ef4dd..0000000000 --- a/packages/junior-memory/tsup.config.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { defineConfig } from "tsup"; - -export default defineConfig({ - clean: true, - dts: { - compilerOptions: { - // TODO(upstream): Remove after tsup stops adding deprecated baseUrl. - ignoreDeprecations: "6.0", - }, - }, - entry: ["src/index.ts"], - format: ["esm"], - sourcemap: true, - target: "node24", -}); diff --git a/packages/junior-plugin-api/package.json b/packages/junior-plugin-api/package.json index c12700ce73..47d6075d6f 100644 --- a/packages/junior-plugin-api/package.json +++ b/packages/junior-plugin-api/package.json @@ -26,16 +26,16 @@ "zod": "catalog:" }, "scripts": { - "build": "tsup", + "build": "tsdown", "prepare": "pnpm run build", "prepack": "pnpm run build", - "lint": "oxlint --config ../junior/.oxlintrc.json --deny-warnings src tsup.config.ts", + "lint": "oxlint --config ../junior/.oxlintrc.json --deny-warnings src tsdown.config.ts", "typecheck": "tsc --noEmit" }, "devDependencies": { "@oxlint/plugins": "1.79.0", "oxlint": "^1.79.0", - "tsup": "^8.5.1", - "typescript": "^6.0.3" + "tsdown": "0.23.1", + "typescript": "^7.0.2" } } diff --git a/packages/junior-plugin-api/tsconfig.json b/packages/junior-plugin-api/tsconfig.json index edada258b8..ca09e695e7 100644 --- a/packages/junior-plugin-api/tsconfig.json +++ b/packages/junior-plugin-api/tsconfig.json @@ -1,12 +1,10 @@ { + "extends": "../../tsconfig.base.json", "compilerOptions": { "target": "ES2022", "lib": ["ES2022", "DOM"], "module": "ESNext", "moduleResolution": "Bundler", - "strict": true, - "skipLibCheck": true, - "isolatedModules": true, "noEmit": true }, "include": ["src/**/*.ts"] diff --git a/packages/junior-plugin-api/tsdown.config.ts b/packages/junior-plugin-api/tsdown.config.ts new file mode 100644 index 0000000000..889d9d21e3 --- /dev/null +++ b/packages/junior-plugin-api/tsdown.config.ts @@ -0,0 +1,16 @@ +import { defineConfig } from "tsdown"; + +export default defineConfig({ + entry: { + index: "src/index.ts", + }, + format: "esm", + tsconfig: "tsconfig.build.json", + dts: true, + outDir: "dist", + outExtensions: () => ({ + js: ".js", + dts: ".d.ts", + }), + clean: true, +}); diff --git a/packages/junior-plugin-api/tsup.config.ts b/packages/junior-plugin-api/tsup.config.ts deleted file mode 100644 index 09936ed862..0000000000 --- a/packages/junior-plugin-api/tsup.config.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { defineConfig } from "tsup"; - -export default defineConfig({ - entry: { - index: "src/index.ts", - }, - format: "esm", - tsconfig: "tsconfig.build.json", - dts: { - compilerOptions: { - // TODO(upstream): Remove after tsup stops adding deprecated baseUrl. - ignoreDeprecations: "6.0", - }, - }, - outDir: "dist", - clean: true, -}); diff --git a/packages/junior-sentry/package.json b/packages/junior-sentry/package.json index 9e9a31709b..b5666fcdfa 100644 --- a/packages/junior-sentry/package.json +++ b/packages/junior-sentry/package.json @@ -42,7 +42,7 @@ "@types/node": "^25.9.1", "oxlint": "^1.79.0", "tsup": "^8.5.1", - "typescript": "^6.0.3", + "typescript": "^7.0.2", "vitest": "^4.1.7" } } diff --git a/packages/junior-sentry/tsconfig.json b/packages/junior-sentry/tsconfig.json index 4c12d9d7dc..3258d42876 100644 --- a/packages/junior-sentry/tsconfig.json +++ b/packages/junior-sentry/tsconfig.json @@ -1,12 +1,10 @@ { + "extends": "../../tsconfig.base.json", "compilerOptions": { "target": "ES2022", "lib": ["ES2022", "DOM"], "module": "ESNext", "moduleResolution": "Bundler", - "strict": true, - "skipLibCheck": true, - "isolatedModules": true, "noEmit": true, "types": ["node"] }, diff --git a/packages/junior-testing/package.json b/packages/junior-testing/package.json index 98a1f5ac43..b4ed443419 100644 --- a/packages/junior-testing/package.json +++ b/packages/junior-testing/package.json @@ -21,6 +21,6 @@ "devDependencies": { "@types/node": "^25.9.1", "@types/pg": "^8.15.6", - "typescript": "^6.0.3" + "typescript": "^7.0.2" } } diff --git a/packages/junior-testing/src/pglite.ts b/packages/junior-testing/src/pglite.ts index 97676b2d38..5254fa0723 100644 --- a/packages/junior-testing/src/pglite.ts +++ b/packages/junior-testing/src/pglite.ts @@ -27,11 +27,13 @@ export interface LocalPgliteFixture { class LocalPgliteExecutor implements LocalPgliteFixture { private activeTransaction: Transaction | undefined; + readonly client: PGlite; + private readonly schema: Record; - constructor( - readonly client: PGlite, - private readonly schema: Record, - ) {} + constructor(client: PGlite, schema: Record) { + this.client = client; + this.schema = schema; + } db(): TDatabase { return drizzle(this.queryClient() as PGlite, { diff --git a/packages/junior-testing/tsconfig.json b/packages/junior-testing/tsconfig.json index d5e6868fb4..bcecb871fb 100644 --- a/packages/junior-testing/tsconfig.json +++ b/packages/junior-testing/tsconfig.json @@ -1,14 +1,12 @@ { + "extends": "../../tsconfig.base.json", "compilerOptions": { "target": "ES2022", "lib": ["ES2022", "DOM"], "module": "ESNext", "moduleResolution": "Bundler", - "strict": true, "esModuleInterop": true, - "skipLibCheck": true, "resolveJsonModule": true, - "isolatedModules": true, "noEmit": true }, "include": ["src/**/*.ts"] diff --git a/packages/junior-vercel/package.json b/packages/junior-vercel/package.json index 70cf7d94f0..838308e575 100644 --- a/packages/junior-vercel/package.json +++ b/packages/junior-vercel/package.json @@ -42,7 +42,7 @@ "@types/node": "^25.9.1", "oxlint": "^1.79.0", "tsup": "^8.5.1", - "typescript": "^6.0.3", + "typescript": "^7.0.2", "vitest": "^4.1.7" } } diff --git a/packages/junior-vercel/tsconfig.json b/packages/junior-vercel/tsconfig.json index 4c12d9d7dc..3258d42876 100644 --- a/packages/junior-vercel/tsconfig.json +++ b/packages/junior-vercel/tsconfig.json @@ -1,12 +1,10 @@ { + "extends": "../../tsconfig.base.json", "compilerOptions": { "target": "ES2022", "lib": ["ES2022", "DOM"], "module": "ESNext", "moduleResolution": "Bundler", - "strict": true, - "skipLibCheck": true, - "isolatedModules": true, "noEmit": true, "types": ["node"] }, diff --git a/packages/junior/package.json b/packages/junior/package.json index 655e295f97..d74386ad52 100644 --- a/packages/junior/package.json +++ b/packages/junior/package.json @@ -116,14 +116,15 @@ "@sentry/junior-testing": "workspace:*", "@types/node": "^25.9.1", "@types/pg": "^8.15.6", + "@typescript/typescript6": "6.0.2", "@vitest/coverage-v8": "4.1.7", "dependency-cruiser": "^17.4.0", "drizzle-kit": "catalog:", "msw": "^2.14.6", "nitro": "3.0.260522-beta", "oxlint": "^1.79.0", - "tsdown": "0.23.0", - "typescript": "^6.0.3", + "tsdown": "0.23.1", + "typescript": "^7.0.2", "vercel": "^54.4.0", "vitest": "^4.1.7" } diff --git a/packages/junior/scripts/check-tool-annotations.mjs b/packages/junior/scripts/check-tool-annotations.mjs index cbe504b07a..d76188f5b1 100644 --- a/packages/junior/scripts/check-tool-annotations.mjs +++ b/packages/junior/scripts/check-tool-annotations.mjs @@ -1,7 +1,7 @@ import fs from "node:fs/promises"; import path from "node:path"; import { fileURLToPath } from "node:url"; -import ts from "typescript"; +import ts from "@typescript/typescript6"; const TOOL_CONSTRUCTORS = new Set(["definePluginTool", "tool", "zodTool"]); const REQUIRED_HINTS = [ diff --git a/packages/junior/scripts/check-tool-error-classification.mjs b/packages/junior/scripts/check-tool-error-classification.mjs index eb9ceae4db..132913d4df 100644 --- a/packages/junior/scripts/check-tool-error-classification.mjs +++ b/packages/junior/scripts/check-tool-error-classification.mjs @@ -1,7 +1,7 @@ import fs from "node:fs/promises"; import path from "node:path"; import { fileURLToPath } from "node:url"; -import ts from "typescript"; +import ts from "@typescript/typescript6"; const BASELINE_RELATIVE_PATH = "packages/junior/scripts/tool-error-classification-baseline.txt"; diff --git a/packages/junior/src/api/automations/routes.ts b/packages/junior/src/api/automations/routes.ts index 1ec114aa05..f659a2da1d 100644 --- a/packages/junior/src/api/automations/routes.ts +++ b/packages/junior/src/api/automations/routes.ts @@ -266,6 +266,7 @@ export function createAutomationRoutes(): Hono { { status: 400 }, ); } + return undefined; }), async (context) => { const { id } = context.req.valid("param"); diff --git a/packages/junior/src/build/copy-build-content.ts b/packages/junior/src/build/copy-build-content.ts index de6e085b29..31c4051559 100644 --- a/packages/junior/src/build/copy-build-content.ts +++ b/packages/junior/src/build/copy-build-content.ts @@ -168,7 +168,7 @@ function parseIncludePattern(pattern: string): { ); } - const isScopedPackage = parts[0].startsWith("@"); + const isScopedPackage = parts[0]?.startsWith("@") ?? false; const packagePartCount = isScopedPackage ? 2 : 1; const pkgName = parts.slice(0, packagePartCount).join("/"); const subpath = parts.slice(packagePartCount).join("/"); diff --git a/packages/junior/src/chat/agent/index.ts b/packages/junior/src/chat/agent/index.ts index 0ccf882752..d5dd69a887 100644 --- a/packages/junior/src/chat/agent/index.ts +++ b/packages/junior/src/chat/agent/index.ts @@ -183,8 +183,11 @@ async function readRunConversationVisibility( /** Preserve delivery-error ownership across the agent generation boundary. */ class AssistantMessageDeliveryError extends Error { - constructor(readonly originalError: unknown) { + readonly originalError: unknown; + + constructor(originalError: unknown) { super("Assistant message delivery failed"); + this.originalError = originalError; } } @@ -1290,6 +1293,7 @@ async function executeAgentRunInPrivacyContext( } return deliverAssistantMessage(event.message); } + return undefined; }); let newMessages: PiMessage[] = []; @@ -1662,6 +1666,7 @@ async function executeAgentRunInPrivacyContext( } throw error; } + return undefined; }, { "gen_ai.operation.name": "invoke_agent", diff --git a/packages/junior/src/chat/automations/edit-rules.ts b/packages/junior/src/chat/automations/edit-rules.ts index 4e347b4437..011d8da784 100644 --- a/packages/junior/src/chat/automations/edit-rules.ts +++ b/packages/junior/src/chat/automations/edit-rules.ts @@ -7,11 +7,11 @@ import type { EventAutomation } from "@/chat/event-automations/types"; import type { ScheduledAutomation } from "@/chat/scheduled-automations/types"; export class AutomationEditError extends ToolInputError { - constructor( - message: string, - readonly field?: string, - ) { + readonly field: string | undefined; + + constructor(message: string, field?: string) { super(message); + this.field = field; this.name = "AutomationEditError"; } } diff --git a/packages/junior/src/chat/capabilities/jr-rpc-command.ts b/packages/junior/src/chat/capabilities/jr-rpc-command.ts index 60520681b7..09584d2034 100644 --- a/packages/junior/src/chat/capabilities/jr-rpc-command.ts +++ b/packages/junior/src/chat/capabilities/jr-rpc-command.ts @@ -59,7 +59,7 @@ function parsePrefixFlag( const prefix = extras[1]?.trim(); return { ok: true, ...(prefix ? { prefix } : undefined) }; } - if (extras.length === 1 && extras[0].startsWith("--prefix=")) { + if (extras.length === 1 && extras[0]?.startsWith("--prefix=")) { const prefix = extras[0].slice("--prefix=".length).trim(); return { ok: true, ...(prefix ? { prefix } : undefined) }; } diff --git a/packages/junior/src/chat/conversations/sql/history.ts b/packages/junior/src/chat/conversations/sql/history.ts index d01f03f595..7306e4c24a 100644 --- a/packages/junior/src/chat/conversations/sql/history.ts +++ b/packages/junior/src/chat/conversations/sql/history.ts @@ -151,7 +151,11 @@ function messagesSummarizedEventFromRow( } class SqlConversationEventStore implements ConversationEventStore { - constructor(private readonly executor: JuniorSqlDatabase) {} + private readonly executor: JuniorSqlDatabase; + + constructor(executor: JuniorSqlDatabase) { + this.executor = executor; + } async append( conversationId: string, diff --git a/packages/junior/src/chat/conversations/sql/message-search.ts b/packages/junior/src/chat/conversations/sql/message-search.ts index fc9a468315..61e61345ad 100644 --- a/packages/junior/src/chat/conversations/sql/message-search.ts +++ b/packages/junior/src/chat/conversations/sql/message-search.ts @@ -1,14 +1,4 @@ -import { - and, - desc, - eq, - gte, - isNull, - lt, - ne, - sql, - type SQL, -} from "drizzle-orm"; +import { and, desc, eq, gte, isNull, lt, ne, sql, type SQL } from "drizzle-orm"; import type { JuniorSqlDatabase } from "@/db/db"; import { juniorConversationAnnotations, @@ -26,7 +16,11 @@ import type { const EXCERPT_WITHOUT_QUERY_CHARS = 240; class SqlConversationMessageSearchStore implements ConversationMessageSearchStore { - constructor(private readonly executor: JuniorSqlDatabase) {} + private readonly executor: JuniorSqlDatabase; + + constructor(executor: JuniorSqlDatabase) { + this.executor = executor; + } async search(args: { currentConversationId: string; diff --git a/packages/junior/src/chat/conversations/sql/privacy.ts b/packages/junior/src/chat/conversations/sql/privacy.ts index ac87c50817..8bc9c0d399 100644 --- a/packages/junior/src/chat/conversations/sql/privacy.ts +++ b/packages/junior/src/chat/conversations/sql/privacy.ts @@ -40,10 +40,11 @@ async function readRootCandidate( ) .where(eq(juniorConversations.conversationId, conversationId)); const row = rows[0]; - return row?.requestedRootConversationId !== null && - (row?.requestedParentConversationId !== null || - row?.requestedRootConversationId === row?.requestedConversationId) && - row?.rootConversationId === row.requestedRootConversationId && + return row !== undefined && + row.requestedRootConversationId !== null && + (row.requestedParentConversationId !== null || + row.requestedRootConversationId === row.requestedConversationId) && + row.rootConversationId === row.requestedRootConversationId && row.rootRootConversationId === row.rootConversationId && row.rootParentConversationId === null && row.rootDestinationId !== null diff --git a/packages/junior/src/chat/conversations/sql/store.ts b/packages/junior/src/chat/conversations/sql/store.ts index 83e74eac5f..b314b312cd 100644 --- a/packages/junior/src/chat/conversations/sql/store.ts +++ b/packages/junior/src/chat/conversations/sql/store.ts @@ -338,7 +338,11 @@ function assertSameConversationDestination(args: { } export class SqlStore implements ConversationStore { - constructor(private readonly executor: JuniorSqlDatabase) {} + private readonly executor: JuniorSqlDatabase; + + constructor(executor: JuniorSqlDatabase) { + this.executor = executor; + } async getConversationIdByProviderConversation( args: ProviderConversationReference, diff --git a/packages/junior/src/chat/conversations/turn-lifecycle.ts b/packages/junior/src/chat/conversations/turn-lifecycle.ts index 1eb8e78d1f..c06ddf165d 100644 --- a/packages/junior/src/chat/conversations/turn-lifecycle.ts +++ b/packages/junior/src/chat/conversations/turn-lifecycle.ts @@ -41,7 +41,11 @@ export interface ConversationTurnLifecycle { /** Persist correlated turn lifecycle facts with retry-safe terminal exclusion. */ export class ConversationTurnLifecycleService implements ConversationTurnLifecycle { - constructor(private readonly events: ConversationEventStore) {} + private readonly events: ConversationEventStore; + + constructor(events: ConversationEventStore) { + this.events = events; + } /** Record the turn start once after every input message is durable. */ async start(input: StartConversationTurnInput): Promise { diff --git a/packages/junior/src/chat/discovery.ts b/packages/junior/src/chat/discovery.ts index 27c01769ae..25c5d7df4b 100644 --- a/packages/junior/src/chat/discovery.ts +++ b/packages/junior/src/chat/discovery.ts @@ -241,10 +241,6 @@ export function resolveHomeDir( resolvedCwd, options?.projectRoots, ); - if (candidates.length === 0) { - return directApp; - } - candidates.sort((left, right) => { const leftScore = scoreAppCandidate(left); const rightScore = scoreAppCandidate(right); @@ -262,15 +258,15 @@ export function resolveHomeDir( } return left.localeCompare(right); }); - return candidates[0]; + return candidates[0] ?? directApp; } -function resolveContentRoots(subdir: "data" | "skills" | "plugins"): string[] { +function resolveContentRoot(subdir: "data" | "skills" | "plugins"): string { if (subdir === "data") { - return [homeDir()]; + return homeDir(); } - return [path.join(homeDir(), subdir)]; + return path.join(homeDir(), subdir); } /** Return the built-in skills directory in source and packaged builds. */ @@ -292,7 +288,7 @@ export function builtInSkillsDir(): string { /** Return the data directory (same as homeDir). */ export function dataDir(): string { - return resolveContentRoots("data")[0]; + return resolveContentRoot("data"); } /** Return the path to the SOUL.md file. */ @@ -312,27 +308,27 @@ export function descriptionPath(): string { /** Return the skills directory path. */ export function skillsDir(): string { - return resolveContentRoots("skills")[0]; + return resolveContentRoot("skills"); } /** Return the plugins directory path. */ export function pluginsDir(): string { - return resolveContentRoots("plugins")[0]; + return resolveContentRoot("plugins"); } /** Return all unique data root directories. */ export function dataRoots(): string[] { - return unique(resolveContentRoots("data")); + return unique([resolveContentRoot("data")]); } /** Return all unique skill root directories. */ export function skillRoots(): string[] { - return unique([builtInSkillsDir(), ...resolveContentRoots("skills")]); + return unique([builtInSkillsDir(), resolveContentRoot("skills")]); } /** Return all unique plugin root directories. */ export function pluginRoots(): string[] { - return unique(resolveContentRoots("plugins")); + return unique([resolveContentRoot("plugins")]); } /** Return candidate paths where SOUL.md might be found. */ diff --git a/packages/junior/src/chat/ingress/slack-webhook.ts b/packages/junior/src/chat/ingress/slack-webhook.ts index d2c1a1b4c6..bf53baf36b 100644 --- a/packages/junior/src/chat/ingress/slack-webhook.ts +++ b/packages/junior/src/chat/ingress/slack-webhook.ts @@ -128,7 +128,7 @@ const IGNORED_MESSAGE_SUBTYPES = new Set([ ]); class SlackEventPersistenceError extends Error { - readonly cause: unknown; + override readonly cause: unknown; constructor(cause: unknown) { super("Slack event durable persistence failed"); diff --git a/packages/junior/src/chat/mcp/client.ts b/packages/junior/src/chat/mcp/client.ts index 762c42a2f3..dfefb677d8 100644 --- a/packages/junior/src/chat/mcp/client.ts +++ b/packages/junior/src/chat/mcp/client.ts @@ -89,10 +89,12 @@ export class PluginMcpClient { private listedTools?: ListedTool[]; private readonly resourceHost?: string; - constructor( - private readonly plugin: PluginDefinition, - private readonly options: PluginMcpClientOptions = {}, - ) { + private readonly plugin: PluginDefinition; + private readonly options: PluginMcpClientOptions; + + constructor(plugin: PluginDefinition, options: PluginMcpClientOptions = {}) { + this.plugin = plugin; + this.options = options; const url = plugin.manifest.mcp?.url; this.resourceHost = url ? new URL(url).hostname : undefined; } diff --git a/packages/junior/src/chat/mcp/oauth-provider.ts b/packages/junior/src/chat/mcp/oauth-provider.ts index 1297774cdd..63c0a0b5db 100644 --- a/packages/junior/src/chat/mcp/oauth-provider.ts +++ b/packages/junior/src/chat/mcp/oauth-provider.ts @@ -53,10 +53,28 @@ function requireEnv(name: string): string { export class StateBackedMcpOAuthClientProvider implements OAuthClientProvider { readonly clientMetadata: OAuthClientMetadata; + readonly authSessionId: string; + private readonly callbackUrl: string; + private readonly sessionContext: + | Omit< + McpAuthSessionState, + | "schemaVersion" + | "authSessionId" + | "authorizationUrl" + | "codeVerifier" + | "createdAtMs" + | "updatedAtMs" + > + | undefined; + private readonly runCredentialMutation: + | ((mutation: () => Promise) => Promise) + | undefined; + private readonly oauthClient: PluginMcpOAuthClientConfig | undefined; + constructor( - readonly authSessionId: string, - private readonly callbackUrl: string, - private readonly sessionContext?: Omit< + authSessionId: string, + callbackUrl: string, + sessionContext?: Omit< McpAuthSessionState, | "schemaVersion" | "authSessionId" @@ -65,11 +83,14 @@ export class StateBackedMcpOAuthClientProvider implements OAuthClientProvider { | "createdAtMs" | "updatedAtMs" >, - private readonly runCredentialMutation?: ( - mutation: () => Promise, - ) => Promise, - private readonly oauthClient?: PluginMcpOAuthClientConfig, + runCredentialMutation?: (mutation: () => Promise) => Promise, + oauthClient?: PluginMcpOAuthClientConfig, ) { + this.authSessionId = authSessionId; + this.callbackUrl = callbackUrl; + this.sessionContext = sessionContext; + this.runCredentialMutation = runCredentialMutation; + this.oauthClient = oauthClient; this.clientMetadata = createClientMetadata(callbackUrl); } diff --git a/packages/junior/src/chat/mcp/tool-manager.ts b/packages/junior/src/chat/mcp/tool-manager.ts index 8a650466e4..184a681b46 100644 --- a/packages/junior/src/chat/mcp/tool-manager.ts +++ b/packages/junior/src/chat/mcp/tool-manager.ts @@ -347,10 +347,13 @@ export class McpToolManager { >(); private readonly toolsByProvider = new Map(); + private readonly options: McpToolManagerOptions; + constructor( plugins: PluginDefinition[], - private readonly options: McpToolManagerOptions = {}, + options: McpToolManagerOptions = {}, ) { + this.options = options; for (const plugin of plugins) { if (plugin.manifest.mcp) { this.pluginsByProvider.set(plugin.manifest.name, plugin); diff --git a/packages/junior/src/chat/plugins/agent-hooks.ts b/packages/junior/src/chat/plugins/agent-hooks.ts index 0cc92c8cd9..05ccbb50ec 100644 --- a/packages/junior/src/chat/plugins/agent-hooks.ts +++ b/packages/junior/src/chat/plugins/agent-hooks.ts @@ -1292,12 +1292,13 @@ function sanitizeOperationalReport(args: { OPERATIONAL_REPORT_MAX_LABEL_LENGTH, ) ?? String(categoryIndex + 1), values: Object.fromEntries( - seriesEntries.map(({ sanitizedSeries, sourceKey }) => [ - sanitizedSeries.key, - Number.isFinite(category.values[sourceKey]) - ? category.values[sourceKey] - : 0, - ]), + seriesEntries.map(({ sanitizedSeries, sourceKey }) => { + const value = category.values[sourceKey]; + return [ + sanitizedSeries.key, + value !== undefined && Number.isFinite(value) ? value : 0, + ]; + }), ), })); const sanitizedWidget: NonNullable< diff --git a/packages/junior/src/chat/plugins/task-runner.ts b/packages/junior/src/chat/plugins/task-runner.ts index a4f7262590..be6d821a5b 100644 --- a/packages/junior/src/chat/plugins/task-runner.ts +++ b/packages/junior/src/chat/plugins/task-runner.ts @@ -494,7 +494,7 @@ export async function processPluginTask( ): Promise { await withPluginTaskLock(pluginTaskId(message), async () => { const resolved = findPluginTask(message); - if (!resolved) { + if (!resolved?.task) { throw new Error( `Plugin task "${message.plugin}.${message.name}" is not registered`, ); diff --git a/packages/junior/src/chat/providers/slack/runtime.ts b/packages/junior/src/chat/providers/slack/runtime.ts index 4bc5654236..83d4c62199 100644 --- a/packages/junior/src/chat/providers/slack/runtime.ts +++ b/packages/junior/src/chat/providers/slack/runtime.ts @@ -442,7 +442,7 @@ export function createSlackTurnRuntime< return { start: async ( - context: RuntimeLogContext, + _context: RuntimeLogContext, targetMessage: Message, ): Promise => { const channelId = getChannelId(thread, targetMessage); diff --git a/packages/junior/src/chat/sandbox/skill-sandbox.ts b/packages/junior/src/chat/sandbox/skill-sandbox.ts index 96cb7fd477..92bdb37cd9 100644 --- a/packages/junior/src/chat/sandbox/skill-sandbox.ts +++ b/packages/junior/src/chat/sandbox/skill-sandbox.ts @@ -270,8 +270,9 @@ export class SkillSandbox { return active; } - if (this.loadedSkills.size === 1) { - return [...this.loadedSkills.values()][0]; + const [onlySkill, ...otherSkills] = this.loadedSkills.values(); + if (onlySkill && otherSkills.length === 0) { + return onlySkill; } throw new Error( diff --git a/packages/junior/src/chat/services/context-compaction.ts b/packages/junior/src/chat/services/context-compaction.ts index 5fbb1f83bd..889ed8b1ab 100644 --- a/packages/junior/src/chat/services/context-compaction.ts +++ b/packages/junior/src/chat/services/context-compaction.ts @@ -113,13 +113,15 @@ interface ActiveContextCompactionArgs { /** Raised when Junior cannot compact history below the active model's hard ceiling. */ export class ContextInputLimitExceededError extends Error { - constructor( - readonly estimatedTokens: number, - readonly inputLimitTokens: number, - ) { + readonly estimatedTokens: number; + readonly inputLimitTokens: number; + + constructor(estimatedTokens: number, inputLimitTokens: number) { super( `Agent context is ${estimatedTokens} estimated input tokens, above the ${inputLimitTokens} token limit`, ); + this.estimatedTokens = estimatedTokens; + this.inputLimitTokens = inputLimitTokens; this.name = "ContextInputLimitExceededError"; } } diff --git a/packages/junior/src/chat/services/conversation-memory.ts b/packages/junior/src/chat/services/conversation-memory.ts index 438929a279..18d5fda3d0 100644 --- a/packages/junior/src/chat/services/conversation-memory.ts +++ b/packages/junior/src/chat/services/conversation-memory.ts @@ -212,6 +212,7 @@ export function markConversationMessage( if (messageIndex < 0) return; const current = conversation.messages[messageIndex]; + if (!current) return; conversation.messages[messageIndex] = { ...current, meta: { diff --git a/packages/junior/src/chat/services/subscribed-decision.ts b/packages/junior/src/chat/services/subscribed-decision.ts index 6b7970c61c..fa09050158 100644 --- a/packages/junior/src/chat/services/subscribed-decision.ts +++ b/packages/junior/src/chat/services/subscribed-decision.ts @@ -4,18 +4,22 @@ import { estimateTextTokens } from "@/chat/services/context-budget"; import { isProviderRetryError } from "@/chat/services/provider-error"; import { buildSubscribedReplyRouterPolicy } from "@/chat/services/subscribed-reply-router-policy"; -export enum SubscribedReplyReason { - ThreadOptOut = "thread_opt_out", - ExplicitMention = "explicit_mention", - DirectedFollowUp = "directed_follow_up", - DirectedToOtherParty = "directed_to_other_party", - EmptyMessage = "empty_message", - Classifier = "llm_classifier", - SideConversation = "side_conversation", - LowConfidence = "low_confidence", - ClassifierError = "classifier_error", - PassiveDisabled = "passive_disabled", -} +/** Why the subscribed-thread router chose to reply or stay silent. */ +export const SubscribedReplyReason = { + ThreadOptOut: "thread_opt_out", + ExplicitMention: "explicit_mention", + DirectedFollowUp: "directed_follow_up", + DirectedToOtherParty: "directed_to_other_party", + EmptyMessage: "empty_message", + Classifier: "llm_classifier", + SideConversation: "side_conversation", + LowConfidence: "low_confidence", + ClassifierError: "classifier_error", + PassiveDisabled: "passive_disabled", +} as const; + +export type SubscribedReplyReason = + (typeof SubscribedReplyReason)[keyof typeof SubscribedReplyReason]; export interface SubscribedDecisionInput { rawText: string; @@ -241,7 +245,7 @@ function parseTranscriptMessages( for (const line of lines) { const match = line.match(TRANSCRIPT_MESSAGE_LINE_RE); - if (!match) { + if (!match?.[1]) { continue; } diff --git a/packages/junior/src/chat/skills.ts b/packages/junior/src/chat/skills.ts index d49206ebca..054f56021f 100644 --- a/packages/junior/src/chat/skills.ts +++ b/packages/junior/src/chat/skills.ts @@ -144,7 +144,7 @@ export function parseSkillFile( expectedName?: string, ): { ok: true; skill: ParsedSkillFile } | { ok: false; error: string } { const match = FRONTMATTER_RE.exec(raw); - if (!match) { + if (match?.[1] === undefined) { return { ok: false, error: "Missing YAML frontmatter at start of file" }; } @@ -201,7 +201,9 @@ export function parseSkillFile( name: result.data.name, description: result.data.description, body: stripFrontmatter(raw), - ...(result.data.metadata ? { metadata: result.data.metadata } : undefined), + ...(result.data.metadata + ? { metadata: result.data.metadata } + : undefined), ...(result.data.compatibility !== undefined ? { compatibility: result.data.compatibility } : undefined), @@ -436,7 +438,7 @@ export function parseSkillInvocation( const escapePattern = (value: string) => value.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); const slashMatch = /(?:^|\s)\/([a-z0-9]+(?:-[a-z0-9]+)*)/i.exec(trimmed); - if (slashMatch) { + if (slashMatch?.[1]) { const skillName = slashMatch[1].toLowerCase(); if (!availableSkills.some((skill) => skill.name === skillName)) { return null; @@ -447,7 +449,10 @@ export function parseSkillInvocation( const dollarPattern = /(?:^|\s)\$([a-z0-9]+(?:-[a-z0-9]+)*)/gi; for (const match of trimmed.matchAll(dollarPattern)) { - const skillName = match[1].toLowerCase(); + const skillName = match[1]?.toLowerCase(); + if (!skillName) { + continue; + } if (isCommonEnvironmentVariable(skillName)) { continue; } diff --git a/packages/junior/src/chat/slack/assistant-thread/status-scheduler.ts b/packages/junior/src/chat/slack/assistant-thread/status-scheduler.ts index 415268a6d2..e1e207ed69 100644 --- a/packages/junior/src/chat/slack/assistant-thread/status-scheduler.ts +++ b/packages/junior/src/chat/slack/assistant-thread/status-scheduler.ts @@ -97,8 +97,9 @@ export function createAssistantStatusScheduler(args: { ): string[] | undefined => (visible ? [visible] : undefined); const getInitialStatusText = (): string => { - if (loadingMessages?.length) { - return loadingMessages[0]; + const [firstLoadingMessage] = loadingMessages ?? []; + if (firstLoadingMessage) { + return firstLoadingMessage; } return defaultStatus.text; diff --git a/packages/junior/src/chat/slack/mrkdwn.ts b/packages/junior/src/chat/slack/mrkdwn.ts index d49bfe800f..bf0d195bd9 100644 --- a/packages/junior/src/chat/slack/mrkdwn.ts +++ b/packages/junior/src/chat/slack/mrkdwn.ts @@ -118,7 +118,7 @@ function readBareUrl( ): { url: string; suffix: string; end: number } | undefined { let end = start; while (end < line.length) { - const ch = line[end]; + const ch = line.charAt(end); if ( /\s/.test(ch) || ch === "<" || @@ -267,8 +267,7 @@ export function ensureBlockSpacing(text: string): string { const result: string[] = []; let inCodeBlock = false; - for (let i = 0; i < lines.length; i++) { - const line = lines[i]; + for (const line of lines) { const isCodeFence = codeBlockPattern.test(line.trimStart()); if (isCodeFence) { diff --git a/packages/junior/src/chat/slack/output.ts b/packages/junior/src/chat/slack/output.ts index 089e7101e7..69c0049169 100644 --- a/packages/junior/src/chat/slack/output.ts +++ b/packages/junior/src/chat/slack/output.ts @@ -98,7 +98,7 @@ function getFenceContinuation(text: string): FenceContinuation | null { for (const line of text.split("\n")) { const trimmed = line.trimStart(); const openerMatch = trimmed.match(/^(`{3,}|~{3,})(.*)$/); - if (!openerMatch) { + if (!openerMatch?.[1]) { continue; } diff --git a/packages/junior/src/chat/task-execution/slack-work.ts b/packages/junior/src/chat/task-execution/slack-work.ts index 5247dca6bd..0cae2c7bf4 100644 --- a/packages/junior/src/chat/task-execution/slack-work.ts +++ b/packages/junior/src/chat/task-execution/slack-work.ts @@ -807,6 +807,7 @@ export function createSlackConversationWorker( } throw error; } + return undefined; }, }); if ( diff --git a/packages/junior/src/chat/tool-support/zod-tool.ts b/packages/junior/src/chat/tool-support/zod-tool.ts index 3a7db17e7f..105f54aefc 100644 --- a/packages/junior/src/chat/tool-support/zod-tool.ts +++ b/packages/junior/src/chat/tool-support/zod-tool.ts @@ -31,7 +31,8 @@ type StructuredToolExecuteResult = | z.input | StructuredToolResultEnvelope>; -interface StructuredToolResultEnvelope { +/** Tool result that carries model-visible content and typed details. */ +export interface StructuredToolResultEnvelope { content: Array; details: TDetails; } diff --git a/packages/junior/src/chat/tools/sandbox/file-uploads.ts b/packages/junior/src/chat/tools/sandbox/file-uploads.ts index 9332219ab9..6786a9dadf 100644 --- a/packages/junior/src/chat/tools/sandbox/file-uploads.ts +++ b/packages/junior/src/chat/tools/sandbox/file-uploads.ts @@ -97,8 +97,11 @@ export interface SandboxFileUpload { /** Signal that a model-provided file path did not resolve in the active sandbox. */ export class SandboxFileNotFoundError extends ToolInputError { - constructor(readonly path: string) { + readonly path: string; + + constructor(path: string) { super(`failed to read file: ${path}`); + this.path = path; } } diff --git a/packages/junior/src/chat/tools/sandbox/file-utils.ts b/packages/junior/src/chat/tools/sandbox/file-utils.ts index efcfb57b51..1386d11868 100644 --- a/packages/junior/src/chat/tools/sandbox/file-utils.ts +++ b/packages/junior/src/chat/tools/sandbox/file-utils.ts @@ -104,7 +104,7 @@ function escapeRegExp(value: string): string { function globToRegExp(pattern: string): RegExp { let source = ""; for (let index = 0; index < pattern.length; index += 1) { - const char = pattern[index]; + const char = pattern.charAt(index); const next = pattern[index + 1]; if (char === "*" && next === "*") { if (pattern[index + 2] === "/") { diff --git a/packages/junior/src/chat/tools/sandbox/grep.ts b/packages/junior/src/chat/tools/sandbox/grep.ts index 0773708c94..00a172c886 100644 --- a/packages/junior/src/chat/tools/sandbox/grep.ts +++ b/packages/junior/src/chat/tools/sandbox/grep.ts @@ -170,11 +170,11 @@ export async function grepFiles(params: { ? path.posix.basename(filePath) : path.posix.relative(root, filePath); const matchedLines: number[] = []; - for (let lineIndex = 0; lineIndex < lines.length; lineIndex += 1) { + for (const [lineIndex, line] of lines.entries()) { if ( !lineMatches({ ignoreCase: params.ignoreCase, - line: lines[lineIndex], + line, literal: params.literal, pattern: params.pattern, regex, @@ -200,7 +200,7 @@ export async function grepFiles(params: { continue; } emittedLines.add(current); - const truncated = truncateGrepLine(lines[current]); + const truncated = truncateGrepLine(lines[current] ?? ""); lineTruncated ||= truncated.truncated; const separator = matchedLineSet.has(current) ? ":" : "-"; output.push( @@ -334,7 +334,11 @@ async function grepFilesWithRipgrep(params: { cause: new Error(detail), }); } - if (/regex parse error|error parsing regex|is not allowed in a regex/i.test(detail)) { + if ( + /regex parse error|error parsing regex|is not allowed in a regex/i.test( + detail, + ) + ) { throw new ToolInputError(`Invalid regex pattern: ${params.pattern}`, { cause: new Error(detail), }); diff --git a/packages/junior/src/chat/tools/sandbox/text-edits.ts b/packages/junior/src/chat/tools/sandbox/text-edits.ts index 2e89f0d412..3bfca25441 100644 --- a/packages/junior/src/chat/tools/sandbox/text-edits.ts +++ b/packages/junior/src/chat/tools/sandbox/text-edits.ts @@ -214,8 +214,7 @@ export function validateAndApplyTextEdits( }); const matchedEdits: MatchedEdit[] = []; - for (let index = 0; index < normalizedEdits.length; index += 1) { - const edit = normalizedEdits[index]; + for (const [index, edit] of normalizedEdits.entries()) { const matchIndex = content.indexOf(edit.oldText); if (matchIndex === -1) { throw new ToolInputError( @@ -237,9 +236,11 @@ export function validateAndApplyTextEdits( } matchedEdits.sort((a, b) => a.matchIndex - b.matchIndex); - for (let index = 1; index < matchedEdits.length; index += 1) { + for (const [index, current] of matchedEdits.entries()) { const previous = matchedEdits[index - 1]; - const current = matchedEdits[index]; + if (!previous) { + continue; + } if (previous.matchIndex + previous.matchLength > current.matchIndex) { throw new ToolInputError( `edits[${previous.editIndex}] and edits[${current.editIndex}] overlap in ${targetName}. Merge overlapping replacements into one edit.`, @@ -248,8 +249,7 @@ export function validateAndApplyTextEdits( } let newContent = content; - for (let index = matchedEdits.length - 1; index >= 0; index -= 1) { - const edit = matchedEdits[index]; + for (const edit of [...matchedEdits].reverse()) { newContent = newContent.slice(0, edit.matchIndex) + edit.newText + diff --git a/packages/junior/src/chat/tools/web/fetch-content.ts b/packages/junior/src/chat/tools/web/fetch-content.ts index a72b819991..ad6a004b36 100644 --- a/packages/junior/src/chat/tools/web/fetch-content.ts +++ b/packages/junior/src/chat/tools/web/fetch-content.ts @@ -82,7 +82,10 @@ function decodeHtmlEntities(value: string): string { function extractTitle(html: string): string | undefined { const match = html.match(/]*>([\s\S]*?)<\/title>/i); - const title = match ? normalizeWhitespace(decodeHtmlEntities(match[1])) : ""; + const title = + match?.[1] !== undefined + ? normalizeWhitespace(decodeHtmlEntities(match[1])) + : ""; return title.length > 0 ? title : undefined; } diff --git a/packages/junior/src/chat/tools/web/network.ts b/packages/junior/src/chat/tools/web/network.ts index 6f728298ee..3ce294a7f5 100644 --- a/packages/junior/src/chat/tools/web/network.ts +++ b/packages/junior/src/chat/tools/web/network.ts @@ -7,18 +7,21 @@ import { ToolInputError } from "@/chat/tools/execution/tool-input-error"; function isPrivateIpv4(ip: string): boolean { const parts = ip.split(".").map((chunk) => Number.parseInt(chunk, 10)); + const [first, second] = parts; if ( parts.length !== 4 || + first === undefined || + second === undefined || parts.some((n) => Number.isNaN(n) || n < 0 || n > 255) ) { return true; } - if (parts[0] === 10 || parts[0] === 127) return true; - if (parts[0] === 169 && parts[1] === 254) return true; - if (parts[0] === 172 && parts[1] >= 16 && parts[1] <= 31) return true; - if (parts[0] === 192 && parts[1] === 168) return true; - if (parts[0] === 0) return true; + if (first === 10 || first === 127) return true; + if (first === 169 && second === 254) return true; + if (first === 172 && second >= 16 && second <= 31) return true; + if (first === 192 && second === 168) return true; + if (first === 0) return true; return false; } @@ -28,12 +31,13 @@ function parseMappedIpv4FromIpv6(mapped: string): string | undefined { } const hexMatch = mapped.match(/^([0-9a-f]{1,4}):([0-9a-f]{1,4})$/i); - if (!hexMatch) { + const [, highHex, lowHex] = hexMatch ?? []; + if (!highHex || !lowHex) { return undefined; } - const high = Number.parseInt(hexMatch[1], 16); - const low = Number.parseInt(hexMatch[2], 16); + const high = Number.parseInt(highHex, 16); + const low = Number.parseInt(lowHex, 16); return `${(high >> 8) & 0xff}.${high & 0xff}.${(low >> 8) & 0xff}.${low & 0xff}`; } @@ -72,6 +76,8 @@ type ResolvedAddress = { family: 4 | 6; }; +type ResolvedAddresses = [ResolvedAddress, ...ResolvedAddress[]]; + function normalizeHostname(hostname: string): string { const lowered = hostname.toLowerCase(); if (lowered.startsWith("[") && lowered.endsWith("]")) { @@ -82,12 +88,8 @@ function normalizeHostname(hostname: string): string { async function resolvePublicHostname( hostname: string, -): Promise { +): Promise { const records = await dns.lookup(hostname, { all: true, verbatim: true }); - if (records.length === 0) { - throw new ToolInputError("Could not resolve hostname"); - } - const deduped = new Map(); for (const record of records) { const family = record.family === 6 ? 6 : 4; @@ -103,12 +105,16 @@ async function resolvePublicHostname( }); } - return [...deduped.values()]; + const [first, ...rest] = deduped.values(); + if (!first) { + throw new ToolInputError("Could not resolve hostname"); + } + return [first, ...rest]; } async function resolvePinnedAddresses( url: URL, -): Promise { +): Promise { const hostname = normalizeHostname(url.hostname); if (net.isIP(hostname) !== 0) { return undefined; @@ -116,8 +122,8 @@ async function resolvePinnedAddresses( return resolvePublicHostname(hostname); } -function createPinnedLookup(resolved: ResolvedAddress[]) { - const fallback = resolved[0]; +function createPinnedLookup(resolved: ResolvedAddresses) { + const [fallback] = resolved; return ( _hostname: string, options: { family?: number | "IPv4" | "IPv6"; all?: boolean }, @@ -155,7 +161,7 @@ function createPinnedLookup(resolved: ResolvedAddress[]) { async function fetchWithPinnedLookup( url: URL, - resolved: ResolvedAddress[] | undefined, + resolved: ResolvedAddresses | undefined, signal: AbortSignal, ): Promise { if (!resolved) { @@ -180,7 +186,9 @@ async function fetchWithPinnedLookup( path: `${url.pathname}${url.search}`, method: "GET", lookup, - ...(url.protocol === "https:" ? { servername: url.hostname } : undefined), + ...(url.protocol === "https:" + ? { servername: url.hostname } + : undefined), headers: { "user-agent": USER_AGENT, "accept-encoding": "identity", @@ -196,8 +204,8 @@ async function fetchWithPinnedLookup( signal.removeEventListener("abort", onAbort); const headers = new Headers(); const rawHeaders = response.rawHeaders; - for (let i = 0; i < rawHeaders.length; i += 2) { - headers.append(rawHeaders[i], rawHeaders[i + 1]); + for (let i = 0; i + 1 < rawHeaders.length; i += 2) { + headers.append(rawHeaders[i] ?? "", rawHeaders[i + 1] ?? ""); } const rawStatus = response.statusCode ?? 500; diff --git a/packages/junior/src/cli/init.ts b/packages/junior/src/cli/init.ts index da6ada8174..770ecb00e7 100644 --- a/packages/junior/src/cli/init.ts +++ b/packages/junior/src/cli/init.ts @@ -192,7 +192,7 @@ export async function runInit( "cross-env": "^10.1.0", jiti: "^2.7.0", nitro: "3.0.260522-beta", - typescript: "^6.0.3", + typescript: "^7.0.2", }, }; fs.writeFileSync( diff --git a/packages/junior/src/dashboard-routes.ts b/packages/junior/src/dashboard-routes.ts index a7a6591e25..f56c67843b 100644 --- a/packages/junior/src/dashboard-routes.ts +++ b/packages/junior/src/dashboard-routes.ts @@ -253,7 +253,7 @@ function routePatternMatchesConcretePath( const patternSegments = routeSegments(pattern); const pathSegments = routeSegments(concretePath); for (let index = 0; index < patternSegments.length; index += 1) { - const segment = patternSegments[index]; + const segment = patternSegments[index] ?? ""; if (segment === "**" || segment === "*") { return true; } diff --git a/packages/junior/src/db/neon.ts b/packages/junior/src/db/neon.ts index b085889e9d..810f6ee37d 100644 --- a/packages/junior/src/db/neon.ts +++ b/packages/junior/src/db/neon.ts @@ -23,10 +23,13 @@ class NeonExecutor implements NeonJuniorSqlExecutor { private savepointId = 0; private isolatedQueryId = 0; - constructor( - private readonly pool: Pool, - private readonly connectionString: string, - ) {} + private readonly pool: Pool; + private readonly connectionString: string; + + constructor(pool: Pool, connectionString: string) { + this.pool = pool; + this.connectionString = connectionString; + } db(): JuniorDatabase { return drizzle(this.queryClient(), { diff --git a/packages/junior/src/db/postgres.ts b/packages/junior/src/db/postgres.ts index 2259b7dd99..e71e89a5d6 100644 --- a/packages/junior/src/db/postgres.ts +++ b/packages/junior/src/db/postgres.ts @@ -21,10 +21,13 @@ class PostgresExecutor implements JuniorSqlExecutor { private savepointId = 0; private isolatedQueryId = 0; - constructor( - private readonly pool: PgPool, - private readonly connectionString: string, - ) {} + private readonly pool: PgPool; + private readonly connectionString: string; + + constructor(pool: PgPool, connectionString: string) { + this.pool = pool; + this.connectionString = connectionString; + } db(): JuniorDatabase { return drizzle(this.queryClient(), { diff --git a/packages/junior/src/package-resolution.ts b/packages/junior/src/package-resolution.ts index 3b6f996e09..ba3415bc84 100644 --- a/packages/junior/src/package-resolution.ts +++ b/packages/junior/src/package-resolution.ts @@ -89,17 +89,18 @@ export function isValidPackageName(packageName: string): boolean { return false; } - const parts = packageName.split("/"); - if (parts[0].startsWith("@")) { + const [scopeOrName = "", name, ...rest] = packageName.split("/"); + if (scopeOrName.startsWith("@")) { return ( - parts.length === 2 && - parts[0].length > 1 && - isValidPackageSegment(parts[0].slice(1)) && - isValidPackageSegment(parts[1]) + name !== undefined && + rest.length === 0 && + scopeOrName.length > 1 && + isValidPackageSegment(scopeOrName.slice(1)) && + isValidPackageSegment(name) ); } - return parts.length === 1 && isValidPackageSegment(parts[0]); + return name === undefined && isValidPackageSegment(scopeOrName); } function findPackageRoot(entryPath: string): string | undefined { diff --git a/packages/junior/tests/component/memory-plugin-storage.test.ts b/packages/junior/tests/component/memory-plugin-storage.test.ts index 7af60c9e98..fba9dfb60b 100644 --- a/packages/junior/tests/component/memory-plugin-storage.test.ts +++ b/packages/junior/tests/component/memory-plugin-storage.test.ts @@ -470,7 +470,7 @@ WHERE indexname = 'junior_memory_memories_search_idx' conversationId: "slack:D999:1718800099.000000", locationId: "other-location", userId: "U123", - }).memory_listMemories.execute!({}, {}), + }).memory_listMemories!.execute!({}, {}), ).resolves.toEqual({ memories: [ expect.objectContaining({ id: privateMemory.memory.id }), @@ -556,7 +556,7 @@ WHERE indexname = 'junior_memory_memories_search_idx' expect(tools).toHaveProperty("memory_createMemory"); await expect( - tools.memory_listMemories.execute!({}, {}), + tools.memory_listMemories!.execute!({}, {}), ).resolves.toMatchObject({ memories: [ expect.objectContaining({ @@ -568,7 +568,7 @@ WHERE indexname = 'junior_memory_memories_search_idx' ], }); await expect( - tools.memory_searchMemories.execute!({ query: "personal recall" }, {}), + tools.memory_searchMemories!.execute!({ query: "personal recall" }, {}), ).resolves.toMatchObject({ memories: [ expect.objectContaining({ @@ -577,7 +577,7 @@ WHERE indexname = 'junior_memory_memories_search_idx' ], }); await expect( - tools.memory_createMemory.execute!( + tools.memory_createMemory!.execute!( { content: "I prefer terse status updates.", scope: "public", diff --git a/packages/junior/tests/component/runtime/agent-run-mcp-progressive-loading.test.ts b/packages/junior/tests/component/runtime/agent-run-mcp-progressive-loading.test.ts index 19ff00c84c..3bd3f02f5b 100644 --- a/packages/junior/tests/component/runtime/agent-run-mcp-progressive-loading.test.ts +++ b/packages/junior/tests/component/runtime/agent-run-mcp-progressive-loading.test.ts @@ -635,14 +635,23 @@ vi.mock("@/chat/mcp/client", () => { } class MockPluginMcpClient { + private readonly plugin: { manifest: { name: string } }; + private readonly options: { + authProvider?: { + redirectToAuthorization?: (authorizationUrl: URL) => Promise; + }; + }; + constructor( - private readonly plugin: { manifest: { name: string } }, - private readonly options: { + plugin: { manifest: { name: string } }, + options: { authProvider?: { redirectToAuthorization?: (authorizationUrl: URL) => Promise; }; }, ) { + this.plugin = plugin; + this.options = options; clientOptions.push({ ...options }); } diff --git a/packages/junior/tests/component/sandbox/snapshot/resolve.test.ts b/packages/junior/tests/component/sandbox/snapshot/resolve.test.ts index 046cc15ff1..848f8550e4 100644 --- a/packages/junior/tests/component/sandbox/snapshot/resolve.test.ts +++ b/packages/junior/tests/component/sandbox/snapshot/resolve.test.ts @@ -3,11 +3,11 @@ import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; const { sandboxCreateMock, getRuntimeDependenciesMock, - getRuntimePostinstallMock + getRuntimePostinstallMock, } = vi.hoisted(() => ({ sandboxCreateMock: vi.fn(), getRuntimeDependenciesMock: vi.fn(), - getRuntimePostinstallMock: vi.fn() + getRuntimePostinstallMock: vi.fn(), })); const { withSpanMock } = vi.hoisted(() => ({ withSpanMock: vi.fn( @@ -17,28 +17,28 @@ const { withSpanMock } = vi.hoisted(() => ({ _context: unknown, callback: () => Promise, ) => callback(), - ) + ), })); vi.mock("@vercel/sandbox", () => ({ FileSystem: class {}, Sandbox: { - create: sandboxCreateMock - } + create: sandboxCreateMock, + }, })); vi.mock("@/chat/plugins/catalog-runtime", () => ({ pluginCatalogRuntime: { getRuntimeDependencies: getRuntimeDependenciesMock, - getRuntimePostinstall: getRuntimePostinstallMock - } + getRuntimePostinstall: getRuntimePostinstallMock, + }, })); vi.mock("@/chat/sandbox/runtime-dependencies", () => ({ GLOBAL_RUNTIME_DEPENDENCIES: [], - GLOBAL_RUNTIME_POSTINSTALL: [] + GLOBAL_RUNTIME_POSTINSTALL: [], })); vi.mock("@/chat/logging", () => ({ - withSpan: withSpanMock + withSpan: withSpanMock, })); const store = new Map(); @@ -68,8 +68,8 @@ vi.mock("@/chat/state/adapter", () => ({ }), releaseLock: vi.fn(async (lock: { key: string }) => { heldLocks.delete(lock.key); - }) - }) + }), + }), })); import { resolve as resolveSnapshot } from "@/chat/sandbox/snapshot/resolve"; @@ -78,7 +78,7 @@ function makeSandbox(snapshotId: string) { const runCommand = vi.fn(async () => ({ exitCode: 0, stdout: async () => "", - stderr: async () => "" + stderr: async () => "", })); const snapshot = vi.fn(async () => ({ snapshotId })); const stop = vi.fn(async () => {}); @@ -88,11 +88,11 @@ function makeSandbox(snapshotId: string) { sessionId: `sbx_${snapshotId}_session`, runCommand, snapshot, - stop + stop, })), runCommand, snapshot, - stop + stop, }; } @@ -138,12 +138,12 @@ describe("snapshot resolution", () => { const first = await resolveSnapshot({ runtime: "node22", - timeoutMs: 60_000 + timeoutMs: 60_000, }); expect(first.snapshotId).toBe("snap_new"); expect(first.cacheHit).toBe(false); expect(first.resolveOutcome).toBe("rebuilt"); - const [cacheKey] = [...store.keys()]; + const cacheKey = [...store.keys()][0]!; const cached = JSON.parse(store.get(cacheKey) ?? "") as { buildDurationMs?: number; }; @@ -154,7 +154,7 @@ describe("snapshot resolution", () => { runtime: "node22", timeoutMs: 60_000, forceRebuild: true, - staleSnapshotId: "snap_old" + staleSnapshotId: "snap_old", }); expect(forced.snapshotId).toBe("snap_new"); expect(forced.cacheHit).toBe(true); @@ -172,7 +172,7 @@ describe("snapshot resolution", () => { const snapshot = await resolveSnapshot({ runtime: "node22", - timeoutMs: 60_000 + timeoutMs: 60_000, }); expect(snapshot.snapshotId).toBe("snap_stopped"); expect(sandbox.stop).toHaveBeenCalledTimes(1); @@ -187,7 +187,7 @@ describe("snapshot resolution", () => { await expect( resolveSnapshot({ runtime: "node22", - timeoutMs: 60_000 + timeoutMs: 60_000, }), ).rejects.toThrow("state unavailable"); expect(sandboxCreateMock).not.toHaveBeenCalled(); @@ -201,15 +201,15 @@ describe("snapshot resolution", () => { const first = await resolveSnapshot({ runtime: "node22", - timeoutMs: 60_000 + timeoutMs: 60_000, }); - const [cacheKey] = [...store.keys()]; + const cacheKey = [...store.keys()][0]!; store.set(cacheKey, "private-token-abc"); await expect( resolveSnapshot({ runtime: "node22", - timeoutMs: 60_000 + timeoutMs: 60_000, }), ).rejects.toEqual( new Error(`Invalid cached sandbox snapshot for ${first.profileHash}`), @@ -225,7 +225,7 @@ describe("snapshot resolution", () => { await resolveSnapshot({ runtime: "node22", - timeoutMs: 60_000 + timeoutMs: 60_000, }); expect(acquiredLockTtls).toEqual([90_000]); @@ -248,7 +248,7 @@ describe("snapshot resolution", () => { if (phase === "waiting_for_lock") { controller.abort(reason); } - } + }, }); await expect(resolving).rejects.toBe(reason); @@ -265,7 +265,7 @@ describe("snapshot resolution", () => { async ({ signal }: { signal?: AbortSignal }) => await new Promise((_resolve, reject) => { signal?.addEventListener("abort", () => reject(signal.reason), { - once: true + once: true, }); }), ); @@ -273,7 +273,7 @@ describe("snapshot resolution", () => { const resolving = resolveSnapshot({ runtime: "node22", timeoutMs: 60_000, - signal: controller.signal + signal: controller.signal, }); await vi.waitFor(() => { expect(sandboxCreateMock).toHaveBeenCalledWith( @@ -296,7 +296,7 @@ describe("snapshot resolution", () => { const first = await resolveSnapshot({ runtime: "node22", - timeoutMs: 60_000 + timeoutMs: 60_000, }); expect(first.snapshotId).toBe("snap_old"); expect(first.cacheHit).toBe(false); @@ -312,7 +312,7 @@ describe("snapshot resolution", () => { runtime: "node22", timeoutMs: 60_000, forceRebuild: true, - staleSnapshotId: "snap_old" + staleSnapshotId: "snap_old", }); expect(second.snapshotId).toBe("snap_new"); expect(second.cacheHit).toBe(false); @@ -331,7 +331,7 @@ describe("snapshot resolution", () => { const first = await resolveSnapshot({ runtime: "node22", - timeoutMs: 60_000 + timeoutMs: 60_000, }); expect(first.snapshotId).toBe("snap_initial"); expect(first.cacheHit).toBe(false); @@ -340,7 +340,7 @@ describe("snapshot resolution", () => { const forced = await resolveSnapshot({ runtime: "node22", timeoutMs: 60_000, - forceRebuild: true + forceRebuild: true, }); expect(forced.snapshotId).toBe("snap_forced"); expect(forced.cacheHit).toBe(false); @@ -359,13 +359,13 @@ describe("snapshot resolution", () => { const first = await resolveSnapshot({ runtime: "node22", - timeoutMs: 60_000 + timeoutMs: 60_000, }); expect(first.snapshotId).toBe("snap_initial"); expect(first.cacheHit).toBe(false); expect(first.resolveOutcome).toBe("rebuilt"); - const [cacheKey] = [...store.keys()]; + const cacheKey = [...store.keys()][0]!; const initialCached = JSON.parse(store.get(cacheKey) ?? "") as { snapshotId: string; createdAtMs: number; @@ -378,7 +378,7 @@ describe("snapshot resolution", () => { cacheKey, JSON.stringify({ ...initialCached, - snapshotId: "snap_from_other_worker" + snapshotId: "snap_from_other_worker", }), ); }, 100); @@ -389,7 +389,7 @@ describe("snapshot resolution", () => { const concurrent = resolveSnapshot({ runtime: "node22", timeoutMs: 60_000, - forceRebuild: true + forceRebuild: true, }); await vi.advanceTimersByTimeAsync(2_000); @@ -406,13 +406,13 @@ describe("snapshot resolution", () => { const snapshot = await resolveSnapshot({ runtime: "node22", - timeoutMs: 60_000 + timeoutMs: 60_000, }); expect(snapshot).toMatchObject({ dependencyCount: 0, cacheHit: false, - resolveOutcome: "no_profile" + resolveOutcome: "no_profile", }); expect(sandboxCreateMock).not.toHaveBeenCalled(); }); @@ -432,16 +432,16 @@ describe("snapshot resolution", () => { repos: [ { provider: "github", - repo: "getsentry/sentry" + repo: "getsentry/sentry", }, - ] + ], }; const snapshot = await resolveSnapshot({ runtime: "node22", timeoutMs: 60_000, workspace, - prepareWorkspace + prepareWorkspace, }); expect(snapshot.snapshotId).toBe("snap_workspace"); @@ -458,7 +458,7 @@ describe("snapshot resolution", () => { runtime: "node22", timeoutMs: 60_000, workspace, - prepareWorkspace + prepareWorkspace, }); expect(reused.snapshotId).toBe("snap_workspace"); expect(reused.cacheHit).toBe(true); diff --git a/packages/junior/tests/component/task-execution/slack-conversation-work.test.ts b/packages/junior/tests/component/task-execution/slack-conversation-work.test.ts index 0de2b399ce..badd0be6aa 100644 --- a/packages/junior/tests/component/task-execution/slack-conversation-work.test.ts +++ b/packages/junior/tests/component/task-execution/slack-conversation-work.test.ts @@ -1814,7 +1814,6 @@ describe("Slack conversation work execution", () => { services: { agentRunner: { run: async (request) => { - const _text = request.instruction.text; const context = request; await context?.durability?.onInputCommitted?.(); diff --git a/packages/junior/tests/component/vercel-queue-dev.test.ts b/packages/junior/tests/component/vercel-queue-dev.test.ts index 3af0e2cd2d..0c28f3704d 100644 --- a/packages/junior/tests/component/vercel-queue-dev.test.ts +++ b/packages/junior/tests/component/vercel-queue-dev.test.ts @@ -256,7 +256,6 @@ describe("plugin task Vercel queue integration", () => { region: "iad1", topicName: "topic", }; - // @ts-expect-error non-overlapping boundary cast; rule forbids as-unknown-as chains const call = handleCallback.mock.calls[0] as PluginQueueCall; const handler = call?.[0]; const retry = call?.[1].retry; @@ -427,7 +426,6 @@ describe("registerVercelConversationWorkDevConsumer", () => { region: "iad1", topicName: "topic", }; - // @ts-expect-error non-overlapping boundary cast; rule forbids as-unknown-as chains const call = handleCallback.mock.calls[0] as ConversationQueueCall; const handler = call?.[0]; const retry = call?.[1].retry; @@ -536,7 +534,6 @@ describe("registerVercelConversationWorkDevConsumer", () => { }); createVercelConversationWorkCallback({ run }); - // @ts-expect-error non-overlapping boundary cast; rule forbids as-unknown-as chains const call = handleCallback.mock.calls[0] as | [ ( diff --git a/packages/junior/tests/fixtures/postgres/executor.ts b/packages/junior/tests/fixtures/postgres/executor.ts index a2ac4c6770..2649ddb05f 100644 --- a/packages/junior/tests/fixtures/postgres/executor.ts +++ b/packages/junior/tests/fixtures/postgres/executor.ts @@ -10,10 +10,13 @@ class ClientJuniorSqlExecutor implements JuniorSqlExecutor { private savepointId = 0; private isolatedQueryId = 0; - constructor( - private readonly client: PoolClient, - private readonly closeTransaction: () => Promise, - ) {} + private readonly client: PoolClient; + private readonly closeTransaction: () => Promise; + + constructor(client: PoolClient, closeTransaction: () => Promise) { + this.client = client; + this.closeTransaction = closeTransaction; + } db(): JuniorDatabase { return drizzle(this.client, { diff --git a/packages/junior/tests/integration/api/automation-edits.test.ts b/packages/junior/tests/integration/api/automation-edits.test.ts index 94bd7ceb9e..b85b2e7980 100644 --- a/packages/junior/tests/integration/api/automation-edits.test.ts +++ b/packages/junior/tests/integration/api/automation-edits.test.ts @@ -50,7 +50,7 @@ async function setup(kind: "scheduled" | "event") { ["U123", "creator@example.com", "T123"], ["U456", "reader@example.com", "T123"], ["U123", "foreign@example.com", "TFOREIGN"], - ]) { + ] as const) { await getConversationStore().recordActivity({ conversationId: `slack:${teamId}:${slackUserId}:edit`, actor: { platform: "slack", slackUserId, email, teamId }, diff --git a/packages/junior/tests/integration/api/conversations/event-list.test.ts b/packages/junior/tests/integration/api/conversations/event-list.test.ts index 243262b9b8..f51df9ea88 100644 --- a/packages/junior/tests/integration/api/conversations/event-list.test.ts +++ b/packages/junior/tests/integration/api/conversations/event-list.test.ts @@ -472,7 +472,7 @@ describe("conversation event list API", () => { for (const [conversationId, cursor] of [ [firstConversationId, tampered], [secondConversationId, previousCursor], - ]) { + ] as const) { const response = await app.request( `http://localhost/api/conversations/${conversationId}/events?before=${encodeURIComponent(cursor)}`, ); diff --git a/packages/junior/tests/integration/event-automations.test.ts b/packages/junior/tests/integration/event-automations.test.ts index fa54a49f72..83db11f1ab 100644 --- a/packages/junior/tests/integration/event-automations.test.ts +++ b/packages/junior/tests/integration/event-automations.test.ts @@ -464,7 +464,7 @@ describe("event automations", () => { { queue, teamId }, ); - const [{ conversationId }] = queue.sentRecords(); + const { conversationId } = queue.sentRecords()[0]!; expect(conversationId).toBeDefined(); const dispatch = await getDispatchRecord( conversationId!.replace(/^agent-dispatch:/, ""), @@ -682,7 +682,7 @@ describe("event automations", () => { ), ).resolves.toEqual({ dispatched: 1 }); - const [{ conversationId }] = queue.sentRecords(); + const { conversationId } = queue.sentRecords()[0]!; const dispatch = await getDispatchRecord( conversationId!.replace(/^agent-dispatch:/, ""), ); diff --git a/packages/junior/tests/integration/slack-file-upload.test.ts b/packages/junior/tests/integration/slack-file-upload.test.ts index 4c893e8127..d393279548 100644 --- a/packages/junior/tests/integration/slack-file-upload.test.ts +++ b/packages/junior/tests/integration/slack-file-upload.test.ts @@ -127,11 +127,11 @@ describe("uploadFilesToThread", () => { expect(uploadUrlCalls).toHaveLength(2); expect(uploadUrlCalls[0]?.params).toMatchObject({ filename: "a.png", - length: String(files[0].data.length), + length: String(files[0]!.data.length), }); expect(uploadUrlCalls[1]?.params).toMatchObject({ filename: "b.jpg", - length: String(files[1].data.length), + length: String(files[1]!.data.length), }); const externalUploadCalls = getCapturedSlackFileUploadCalls(); diff --git a/packages/junior/tests/integration/slack-schedule-tools.test.ts b/packages/junior/tests/integration/slack-schedule-tools.test.ts index 967d37c7c6..e6eed9aa00 100644 --- a/packages/junior/tests/integration/slack-schedule-tools.test.ts +++ b/packages/junior/tests/integration/slack-schedule-tools.test.ts @@ -1992,7 +1992,7 @@ describe("Slack schedule tool wiring via createTools", () => { // Create a task through the real wired tool. const result = await executeRegisteredTool<{ automation: { id: string }; - }>(tools.slackScheduleCreateAutomation, { + }>(tools.slackScheduleCreateAutomation!, { instruction: "Wiring test: post a weekly digest.", schedule: { kind: "recurring", @@ -2066,7 +2066,7 @@ describe("Slack schedule tool wiring via createTools", () => { ); await expect( - executeRegisteredTool(tools.slackScheduleCreateAutomation, { + executeRegisteredTool(tools.slackScheduleCreateAutomation!, { instruction: "Post a weekly digest.", schedule: { kind: "recurring", @@ -2078,12 +2078,12 @@ describe("Slack schedule tool wiring via createTools", () => { }), ).rejects.toThrow("No active Slack conversation is available."); await expect( - executeRegisteredTool(tools.slackScheduleDeleteAutomation, { + executeRegisteredTool(tools.slackScheduleDeleteAutomation!, { automationId: "sched_missing", }), ).rejects.toThrow("No active Slack conversation is available."); await expect( - executeRegisteredTool(tools.createEventAutomation, { + executeRegisteredTool(tools.createEventAutomation!, { instruction: "Summarize new channel messages.", trigger: { namespace: "slack", diff --git a/packages/junior/tests/integration/user-lookup.test.ts b/packages/junior/tests/integration/user-lookup.test.ts index 642de818cb..445c6e7eb3 100644 --- a/packages/junior/tests/integration/user-lookup.test.ts +++ b/packages/junior/tests/integration/user-lookup.test.ts @@ -816,7 +816,7 @@ describe("userLookup", () => { ); expect(tools).toHaveProperty("userLookup"); - expect(tools.userLookup.description).toContain("provider"); + expect(tools.userLookup?.description).toContain("provider"); }); }); }); diff --git a/packages/junior/tests/msw/handlers/slack-api.ts b/packages/junior/tests/msw/handlers/slack-api.ts index 98a64fa01d..8b79cd5b4f 100644 --- a/packages/junior/tests/msw/handlers/slack-api.ts +++ b/packages/junior/tests/msw/handlers/slack-api.ts @@ -335,7 +335,6 @@ function getSlackConversationParam( } function validateSlackApiRequest( - method: SlackApiMethod, params: Record, ): SlackMockHttpResponse | undefined { const conversation = getSlackConversationParam(params); @@ -447,7 +446,7 @@ export const slackApiHandlers = [ params: requestBody, }); - const validationResponse = validateSlackApiRequest(rawMethod, requestBody); + const validationResponse = validateSlackApiRequest(requestBody); if (validationResponse) { return toHttpResponse(validationResponse); } diff --git a/packages/junior/tests/unit/build/nitro-plugin-module.test.ts b/packages/junior/tests/unit/build/nitro-plugin-module.test.ts index f21752b8ab..86541a232b 100644 --- a/packages/junior/tests/unit/build/nitro-plugin-module.test.ts +++ b/packages/junior/tests/unit/build/nitro-plugin-module.test.ts @@ -453,7 +453,7 @@ describe("juniorNitro plugin modules", () => { }).nitro.setup(nitro); expect(rollupBeforeHooks).toHaveLength(1); - await rollupBeforeHooks[0]({}, { plugins: buildPlugins }); + await rollupBeforeHooks[0]!({}, { plugins: buildPlugins }); expect(buildPlugins).toHaveLength(1); await buildPlugins[0]?.writeBundle?.(); diff --git a/packages/junior/tests/unit/cli/snapshot-create-cli.test.ts b/packages/junior/tests/unit/cli/snapshot-create-cli.test.ts index b48a119f78..5304f4f82a 100644 --- a/packages/junior/tests/unit/cli/snapshot-create-cli.test.ts +++ b/packages/junior/tests/unit/cli/snapshot-create-cli.test.ts @@ -63,7 +63,7 @@ describe("snapshot create cli", () => { expect(logs).toContain( "Sandbox snapshot inputs: plugins=0 system_dependencies=0 npm_dependencies=0 postinstall_commands=0", ); - await resolveMock.mock.calls[0][0].onProgress("resolve_start"); + await resolveMock.mock.calls[0]![0].onProgress("resolve_start"); expect(logs).toContain("Resolving sandbox snapshot profile..."); expect( logs.some((line) => line.includes("resolve_outcome=no_profile")), diff --git a/packages/junior/tests/unit/mcp/tool-manager.test.ts b/packages/junior/tests/unit/mcp/tool-manager.test.ts index f48e4f2c6f..1866cc2ba6 100644 --- a/packages/junior/tests/unit/mcp/tool-manager.test.ts +++ b/packages/junior/tests/unit/mcp/tool-manager.test.ts @@ -29,10 +29,10 @@ vi.mock("@/chat/mcp/client", () => { } class MockPluginMcpClient { - constructor( - private readonly plugin: PluginDefinition, - options?: unknown, - ) { + private readonly plugin: PluginDefinition; + + constructor(plugin: PluginDefinition, options?: unknown) { + this.plugin = plugin; if (clientSetupError.value) { throw clientSetupError.value; } diff --git a/packages/junior/tests/unit/web/image-generate.test.ts b/packages/junior/tests/unit/web/image-generate.test.ts index 030d18b2d4..0e0f3495b1 100644 --- a/packages/junior/tests/unit/web/image-generate.test.ts +++ b/packages/junior/tests/unit/web/image-generate.test.ts @@ -37,7 +37,7 @@ const defaultImageOptions = { }; function getRequestBody(fetchMock: ReturnType) { - const request = fetchMock.mock.calls[0]; + const request = fetchMock.mock.calls[0]!; expect(request).toBeDefined(); expect(request[1]).toBeDefined(); return JSON.parse((request[1] as RequestInit).body as string); @@ -120,7 +120,7 @@ describe("createImageGenerateTool", () => { const result = await tool.execute({ prompt: "test prompt" }, {} as any); expect(fetchMock).toHaveBeenCalledTimes(1); - const request = fetchMock.mock.calls[0]; + const request = fetchMock.mock.calls[0]!; expect(request).toBeDefined(); expect(request[0]).toBe("https://ai-gateway.vercel.sh/v1/chat/completions"); expect(getRequestBody(fetchMock)).toMatchObject({ diff --git a/packages/junior/tsconfig.build.json b/packages/junior/tsconfig.build.json index b94167f70e..763de65c55 100644 --- a/packages/junior/tsconfig.build.json +++ b/packages/junior/tsconfig.build.json @@ -11,6 +11,7 @@ "src/api.ts", "src/api/**/*.ts", "src/app.ts", + "src/cli/**/*.ts", "src/handlers/**/*.ts", "src/instrumentation.ts", "src/nitro.ts", diff --git a/packages/junior/tsconfig.json b/packages/junior/tsconfig.json index 985b0197f1..3d86291090 100644 --- a/packages/junior/tsconfig.json +++ b/packages/junior/tsconfig.json @@ -1,14 +1,12 @@ { + "extends": "../../tsconfig.base.json", "compilerOptions": { "target": "ES2022", "lib": ["ES2022", "DOM"], "module": "ESNext", "moduleResolution": "Bundler", - "strict": true, "esModuleInterop": true, - "skipLibCheck": true, "resolveJsonModule": true, - "isolatedModules": true, "allowJs": false, "noEmit": true, "paths": { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index d423599877..8d7124b2ce 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -48,6 +48,8 @@ overrides: ws: 8.20.1 yaml: ^2.9.0 +packageExtensionsChecksum: sha256-yO3rUISp2Y4ah1jg/R+Tkn/ZrTP8tMj6B0BkRdDGQqQ= + importers: .: @@ -102,7 +104,7 @@ importers: version: 2.9.0(@opentelemetry/api@1.9.1) '@sentry/junior': specifier: workspace:* - version: file:packages/junior + version: file:packages/junior(@types/node@25.9.1) '@sentry/junior-agent-browser': specifier: workspace:* version: link:../../packages/junior-agent-browser @@ -111,7 +113,7 @@ importers: version: link:../../packages/junior-amplitude '@sentry/junior-dashboard': specifier: workspace:* - version: file:packages/junior-dashboard(@opentelemetry/api@1.9.1)(jiti@2.7.0) + version: file:packages/junior-dashboard(@opentelemetry/api@1.9.1)(@types/node@25.9.1)(jiti@2.7.0) '@sentry/junior-datadog': specifier: workspace:* version: link:../../packages/junior-datadog @@ -159,8 +161,8 @@ importers: specifier: 3.0.260522-beta version: 3.0.260522-beta(jiti@2.7.0) typescript: - specifier: ^6.0.3 - version: 6.0.3 + specifier: ^7.0.2 + version: 7.0.2 packages/docs: dependencies: @@ -321,6 +323,9 @@ importers: '@types/pg': specifier: ^8.15.6 version: 8.15.6 + '@typescript/typescript6': + specifier: 6.0.2 + version: 6.0.2 '@vitest/coverage-v8': specifier: 4.1.7 version: 4.1.7(vitest@4.1.7) @@ -332,7 +337,7 @@ importers: version: 0.31.10 msw: specifier: ^2.14.6 - version: 2.14.6(@types/node@25.9.1)(typescript@6.0.3) + version: 2.14.6(@types/node@25.9.1)(typescript@7.0.2) nitro: specifier: 3.0.260522-beta version: 3.0.260522-beta(@vercel/blob@2.8.0)(@vercel/functions@3.6.0)(@vercel/queue@0.2.0)(drizzle-orm@0.45.2(@neondatabase/serverless@1.1.0)(@opentelemetry/api@1.9.1)(@types/pg@8.15.6)(pg@8.21.0))(jiti@2.7.0) @@ -340,17 +345,17 @@ importers: specifier: ^1.79.0 version: 1.79.0 tsdown: - specifier: 0.23.0 - version: 0.23.0(publint@0.3.21)(tsx@4.22.3)(typescript@6.0.3) + specifier: 0.23.1 + version: 0.23.1(publint@0.3.21)(tsx@4.22.3)(typescript@7.0.2) typescript: - specifier: ^6.0.3 - version: 6.0.3 + specifier: ^7.0.2 + version: 7.0.2 vercel: specifier: ^54.4.0 version: 54.4.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0) vitest: specifier: ^4.1.7 - version: 4.1.7(@opentelemetry/api@1.9.1)(@types/node@25.9.1)(@vitest/coverage-v8@4.1.7)(jiti@2.7.0)(msw@2.14.6(@types/node@25.9.1)(typescript@6.0.3))(tsx@4.22.3)(yaml@2.9.0) + version: 4.1.7(@opentelemetry/api@1.9.1)(@types/node@25.9.1)(@vitest/coverage-v8@4.1.7)(jiti@2.7.0)(msw@2.14.6(@types/node@25.9.1)(typescript@7.0.2))(tsx@4.22.3)(yaml@2.9.0) packages/junior-agent-browser: {} @@ -365,7 +370,7 @@ importers: version: 1.1.23(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) '@sentry/junior': specifier: workspace:* - version: file:packages/junior + version: file:packages/junior(@types/node@25.9.1) '@sentry/junior-plugin-api': specifier: workspace:* version: link:../junior-plugin-api @@ -411,7 +416,7 @@ importers: version: 4.3.0 '@tanstack/eslint-plugin-query': specifier: ^5.101.4 - version: 5.101.4(eslint@10.8.0)(typescript@6.0.3) + version: 5.101.4(eslint@10.8.0)(typescript@7.0.2) '@types/node': specifier: ^25.9.1 version: 25.9.1 @@ -433,12 +438,15 @@ importers: tailwindcss: specifier: ^4.3.0 version: 4.3.0 + tsdown: + specifier: 0.23.1 + version: 0.23.1(publint@0.3.21)(tsx@4.22.3)(typescript@7.0.2) tsup: specifier: ^8.5.1 - version: 8.5.1(tsx@4.22.3)(typescript@6.0.3) + version: 8.5.1(tsx@4.22.3)(typescript@7.0.2) typescript: - specifier: ^6.0.3 - version: 6.0.3 + specifier: ^7.0.2 + version: 7.0.2 vitest: specifier: ^4.1.7 version: 4.1.7(@types/node@25.9.1)(@vitest/coverage-v8@4.1.7)(tsx@4.22.3) @@ -485,22 +493,22 @@ importers: version: 4.12.27 msw: specifier: ^2.14.6 - version: 2.14.6(typescript@6.0.3) + version: 2.14.6(typescript@7.0.2) tinyrainbow: specifier: ^3.1.0 version: 3.1.0 typescript: - specifier: ^6.0.3 - version: 6.0.3 + specifier: ^7.0.2 + version: 7.0.2 undici: specifier: 7.29.0 version: 7.29.0 vitest: specifier: ^4.1.7 - version: 4.1.7(msw@2.14.6(typescript@6.0.3))(tsx@4.22.3) + version: 4.1.7(msw@2.14.6(typescript@7.0.2))(tsx@4.22.3) vitest-evals: specifier: 0.16.1 - version: 0.16.1(ai@6.0.190(zod@4.5.4))(tinyrainbow@3.1.0)(vitest@4.1.7(msw@2.14.6(typescript@6.0.3))(tsx@4.22.3))(zod@4.5.4) + version: 0.16.1(ai@6.0.190(zod@4.5.4))(tinyrainbow@3.1.0)(vitest@4.1.7(msw@2.14.6(typescript@7.0.2))(tsx@4.22.3))(zod@4.5.4) zod: specifier: 'catalog:' version: 4.5.4 @@ -534,19 +542,19 @@ importers: version: 0.31.10 msw: specifier: ^2.14.6 - version: 2.14.6(@types/node@25.9.1)(typescript@6.0.3) + version: 2.14.6(@types/node@25.9.1)(typescript@7.0.2) oxlint: specifier: ^1.79.0 version: 1.79.0 tsup: specifier: ^8.5.1 - version: 8.5.1(tsx@4.22.3)(typescript@6.0.3) + version: 8.5.1(tsx@4.22.3)(typescript@7.0.2) typescript: - specifier: ^6.0.3 - version: 6.0.3 + specifier: ^7.0.2 + version: 7.0.2 vitest: specifier: ^4.1.7 - version: 4.1.7(@types/node@25.9.1)(msw@2.14.6(@types/node@25.9.1)(typescript@6.0.3))(tsx@4.22.3) + version: 4.1.7(@types/node@25.9.1)(msw@2.14.6(@types/node@25.9.1)(typescript@7.0.2))(tsx@4.22.3) packages/junior-google: dependencies: @@ -580,10 +588,10 @@ importers: version: 1.79.0 tsup: specifier: ^8.5.1 - version: 8.5.1(tsx@4.22.3)(typescript@6.0.3) + version: 8.5.1(tsx@4.22.3)(typescript@7.0.2) typescript: - specifier: ^6.0.3 - version: 6.0.3 + specifier: ^7.0.2 + version: 7.0.2 vitest: specifier: ^4.1.7 version: 4.1.7(@types/node@25.9.1)(tsx@4.22.3) @@ -610,10 +618,10 @@ importers: version: 1.79.0 tsup: specifier: ^8.5.1 - version: 8.5.1(tsx@4.22.3)(typescript@6.0.3) + version: 8.5.1(tsx@4.22.3)(typescript@7.0.2) typescript: - specifier: ^6.0.3 - version: 6.0.3 + specifier: ^7.0.2 + version: 7.0.2 vitest: specifier: ^4.1.7 version: 4.1.7(@types/node@25.9.1)(tsx@4.22.3) @@ -653,12 +661,12 @@ importers: oxlint: specifier: ^1.79.0 version: 1.79.0 - tsup: - specifier: ^8.5.1 - version: 8.5.1(tsx@4.22.3)(typescript@6.0.3) + tsdown: + specifier: 0.23.1 + version: 0.23.1(publint@0.3.21)(tsx@4.22.3)(typescript@7.0.2) typescript: - specifier: ^6.0.3 - version: 6.0.3 + specifier: ^7.0.2 + version: 7.0.2 vitest: specifier: ^4.1.7 version: 4.1.7(@types/node@25.9.1)(tsx@4.22.3) @@ -682,12 +690,12 @@ importers: oxlint: specifier: ^1.79.0 version: 1.79.0 - tsup: - specifier: ^8.5.1 - version: 8.5.1(tsx@4.22.3)(typescript@6.0.3) + tsdown: + specifier: 0.23.1 + version: 0.23.1(publint@0.3.21)(tsx@4.22.3)(typescript@7.0.2) typescript: - specifier: ^6.0.3 - version: 6.0.3 + specifier: ^7.0.2 + version: 7.0.2 packages/junior-sentry: dependencies: @@ -709,10 +717,10 @@ importers: version: 1.79.0 tsup: specifier: ^8.5.1 - version: 8.5.1(tsx@4.22.3)(typescript@6.0.3) + version: 8.5.1(tsx@4.22.3)(typescript@7.0.2) typescript: - specifier: ^6.0.3 - version: 6.0.3 + specifier: ^7.0.2 + version: 7.0.2 vitest: specifier: ^4.1.7 version: 4.1.7(@types/node@25.9.1)(tsx@4.22.3) @@ -739,8 +747,8 @@ importers: specifier: ^8.15.6 version: 8.15.6 typescript: - specifier: ^6.0.3 - version: 6.0.3 + specifier: ^7.0.2 + version: 7.0.2 packages/junior-tts: {} @@ -764,10 +772,10 @@ importers: version: 1.79.0 tsup: specifier: ^8.5.1 - version: 8.5.1(tsx@4.22.3)(typescript@6.0.3) + version: 8.5.1(tsx@4.22.3)(typescript@7.0.2) typescript: - specifier: ^6.0.3 - version: 6.0.3 + specifier: ^7.0.2 + version: 7.0.2 vitest: specifier: ^4.1.7 version: 4.1.7(@types/node@25.9.1)(tsx@4.22.3) @@ -2729,8 +2737,8 @@ packages: '@oxc-project/types@0.132.0': resolution: {integrity: sha512-FESMOxil5Se014ui/Eq8fT5uHJo6nIRwH0PfJrZJXs6Gek3ZVFOrpUv3YIZT20m+extU98Hg1Ym72U58rlsxUQ==} - '@oxc-project/types@0.148.0': - resolution: {integrity: sha512-Nm4s/jB+4FpFsPhWGEC4h7rzksesmtnMXomo6rCMcg/b8zLQuOziRgkCS1fxDCXOlJB/6Q8oABOZ/OP6RIPj9A==} + '@oxc-project/types@0.154.0': + resolution: {integrity: sha512-KYOUGQFlLWR+s4QMV2Q9ko38TZm7EdO87Qm7rvZLqk/webse/cDjtyxKhg/47l0byCbs/k46LT8qc4PKjAikzA==} '@oxc-transform/binding-android-arm-eabi@0.111.0': resolution: {integrity: sha512-NdFLicvorfHYu0g2ftjVJaH7+Dz27AQUNJOq8t/ofRUoWmczOodgUCHx8C1M1htCN4ZmhS/FzfSy6yd/UngJGg==} @@ -3148,8 +3156,8 @@ packages: '@protobufjs/utf8@1.1.1': resolution: {integrity: sha512-oOAWABowe8EAbMyWKM0tYDKi8Yaox52D+HWZhAIJqQXbqe0xI/GV7FhLWqlEKreMkfDjshR5FKgi3mnle0h6Eg==} - '@publint/pack@0.1.6': - resolution: {integrity: sha512-3uVNyGcVplhPZSLVyeIpL7+cIRn1YCSNHLG/rUIlBQMVH8YuN9++YF+5+UDIIO9RW98dujiUoTltO7RDB5bFJA==} + '@publint/pack@0.1.7': + resolution: {integrity: sha512-4EDEmvxWtgsCnnVeBvtFIFZtUhPPt1+bA9JrSwU4Sa//6oKtzCSlGGXYJr44OD9aGISymbieJ4mCKHUygUDU+g==} engines: {node: '>=18'} '@quansync/fs@1.0.0': @@ -3373,8 +3381,8 @@ packages: resolution: {integrity: sha512-2FK1hF93Fuf1laSdfiEmJvSJPVIDHEUTz68D3Fi9s0IZrrpaEcj6pTFBTbYvsgC5du4ogrtf5re7yMMvrKNgkw==} engines: {node: ^20.9.0 || ^22.11.0 || ^24, pnpm: ^10.0.0} - '@rolldown/binding-android-arm-eabi@1.2.7': - resolution: {integrity: sha512-EypzgnYCwyVY4NDHKzGmNJT5b+XaQEBniHxsMdeIQLB/tcCzZnhqrzHpZFbX9iaxx+5RiB8caATBtfvZP7zVxQ==} + '@rolldown/binding-android-arm-eabi@1.2.14': + resolution: {integrity: sha512-aWR+XKH9+rW7m5fWq/5360J3mHycrx/o6xZM2DQFdJnTMdyP7/WzxPjhtLbVWdKo2y612/4U1bWqb3HQhiF7vg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [android] @@ -3391,8 +3399,8 @@ packages: cpu: [arm64] os: [android] - '@rolldown/binding-android-arm64@1.2.7': - resolution: {integrity: sha512-l17HE9EweWaqJZhuUuNBN/FzM62xw+DECVnJyvMsxn8vJFAGLy5QfLDoYAcronkAN8VxKZHezDpulHDPx95vFw==} + '@rolldown/binding-android-arm64@1.2.14': + resolution: {integrity: sha512-QiVxHofl6A8lQU7WAtOUY4QMVZXohxwz7WJJoeh8NBEUyKfIkMRKhYyq8az/1RypNiIXzNTtiS6KwHz0erxYRQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [android] @@ -3409,8 +3417,8 @@ packages: cpu: [arm64] os: [darwin] - '@rolldown/binding-darwin-arm64@1.2.7': - resolution: {integrity: sha512-8ED8ELFvHXc6OCETIn4gXObPiaR6bckM/ipXtbzlPVDRMBfEGjCKgO90F9YtfdpDatVx/ZQw7aZ1vUMf/+T3Mw==} + '@rolldown/binding-darwin-arm64@1.2.14': + resolution: {integrity: sha512-lTQOzHuBIooh3jIr5XINQkjPGEuGy+Dsy0meXDr6Sjty0b99kYgGh4uBC/8mJX1T0kC8d6S0aPP1Y+bHkh6aBw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [darwin] @@ -3427,8 +3435,8 @@ packages: cpu: [x64] os: [darwin] - '@rolldown/binding-darwin-x64@1.2.7': - resolution: {integrity: sha512-/WPripjtiAIZ2tWY7ddijORT0Ujg87wxWW/qcoFVCKAWVDPhtY0xr7Dj0M3GyNGz60jGwTElhro/mkF9dT7dDQ==} + '@rolldown/binding-darwin-x64@1.2.14': + resolution: {integrity: sha512-hyMKEGatjmBYCs/Q4sbIcL/GqpFEqsX3wc+HYVQ/85A4rxc1o7rPm4DUI4GV4k/h0ITddwFSGpqQunI14GXjTA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [darwin] @@ -3445,8 +3453,8 @@ packages: cpu: [x64] os: [freebsd] - '@rolldown/binding-freebsd-x64@1.2.7': - resolution: {integrity: sha512-14DI4NcqpvbICxSnGLx3PmtDaWqRP/KGSGb6C+JLLVPeZRl6dKdHba3pGsqT3vpdTqhEYIPG0MMQ8c0xYqoJxA==} + '@rolldown/binding-freebsd-x64@1.2.14': + resolution: {integrity: sha512-u371GbXoVXrEgP20PwzoGNOdAOqAMhzo19JzzY+V4YmmnC+DTOoqdbMu+O+54emM59Mik/UdrtWgcuEDKWRPKA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [freebsd] @@ -3463,8 +3471,8 @@ packages: cpu: [arm] os: [linux] - '@rolldown/binding-linux-arm-gnueabihf@1.2.7': - resolution: {integrity: sha512-bxrWIRvHWQvbJwi+VIie/kDJmQxcNE6xxWwZdqF/ExVAigtHkv54WTLQPb+QsZdnFy18fg7JPfWGL0RH6vwIlQ==} + '@rolldown/binding-linux-arm-gnueabihf@1.2.14': + resolution: {integrity: sha512-BqwKsdZQf6EqVWr8fv2MrDYzAvOZ7+NYFSJESRGs87fkseEhs0TU9TXgRJTkZoRRkxTizyEg1LKUXfU3/78uqg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [linux] @@ -3483,8 +3491,8 @@ packages: os: [linux] libc: [glibc] - '@rolldown/binding-linux-arm64-gnu@1.2.7': - resolution: {integrity: sha512-toOY2BChBZyuxU7OYX6Tn389di4IzAqPTycVcci0O7FSfBqzRB3RZn+K5Is6ANf4tmgRd/K1yZTsNTXbkXsnLg==} + '@rolldown/binding-linux-arm64-gnu@1.2.14': + resolution: {integrity: sha512-SD9kY8M009x/7s57Z1dgUVlP5+uYBgKQK0Tkr1WIWngrtUJmRCW1RJFMY7QDla2khXhmg2i5Io7MUjcmZNZ/KQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] @@ -3504,8 +3512,8 @@ packages: os: [linux] libc: [musl] - '@rolldown/binding-linux-arm64-musl@1.2.7': - resolution: {integrity: sha512-lAIXTH/aiLRLxsTgQvfhjo4K1ydWIp00+V0voOr9beb/9ZmkUFrSIb03dXNFRgMNvkE6oGsF10ioQ6UsI+vS5Q==} + '@rolldown/binding-linux-arm64-musl@1.2.14': + resolution: {integrity: sha512-BJ2CL19M6uuWesMgnqJzgxoI+N+eV7b0A9O9vLV42y+gitC41fNa8KElau1tHVzuLWX5GzEuxMPhAO0tQXQMkg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] @@ -3518,8 +3526,8 @@ packages: os: [linux] libc: [glibc] - '@rolldown/binding-linux-ppc64-gnu@1.2.7': - resolution: {integrity: sha512-kdnwS28Pkenp/mZMRwjXXXwxQ7pIsm+bF919LUK93BOyhcLsrVKdP2p9fxpiPNPAbNuch8ypQt0pm2P2LYCAGg==} + '@rolldown/binding-linux-ppc64-gnu@1.2.14': + resolution: {integrity: sha512-4+Kl8daPV8NDHaD7mfCcc1pRM+Qg7ab8DyMm5FG5WoZgv4h2i3KFN1CybYBNbQqmuYm7ftJLvmMI1eHYJ22S/Q==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [ppc64] os: [linux] @@ -3532,8 +3540,8 @@ packages: os: [linux] libc: [glibc] - '@rolldown/binding-linux-s390x-gnu@1.2.7': - resolution: {integrity: sha512-516OdsyLdr5E65paF3yBF55t8mfm9+gmtCsK3xI7XKXIT7EfRlHhxL8K/NR6Hu8BWSgF5+1w74lTL0+nxcc8Qw==} + '@rolldown/binding-linux-s390x-gnu@1.2.14': + resolution: {integrity: sha512-V/h8ePq1fKDrmtFMz6xcCN3DKvuvMRrwwD1q0PkBeeo4DpK64biaKvqWGVxqCeYKqeRk7gE7/iKPxLCn08O97A==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [s390x] os: [linux] @@ -3553,8 +3561,8 @@ packages: os: [linux] libc: [glibc] - '@rolldown/binding-linux-x64-gnu@1.2.7': - resolution: {integrity: sha512-r8/z8n7GFaYRln3xmP1Cxy0HH/HLM0uBUPkEuSVEfKGDA89M0FsZRZJRSwe/tJjRx+fpH/gjorfhB8tmEbSFLA==} + '@rolldown/binding-linux-x64-gnu@1.2.14': + resolution: {integrity: sha512-WxalXzgrLVpKC93xfpaJ3gCXUWzeCr+FRCbDVD2mUAy4L6Vo3lNVz0epUEUpxPWJkLNYUwM4OSIikv36OJ9mLg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] @@ -3574,8 +3582,8 @@ packages: os: [linux] libc: [musl] - '@rolldown/binding-linux-x64-musl@1.2.7': - resolution: {integrity: sha512-pAsE8iiDxUg1xBqdhrTfg45AVDVpirjz00sblEYClGNNcMnDb+e8beQgqIAw6LvauX/APvgxUnwrgun/YYGBhw==} + '@rolldown/binding-linux-x64-musl@1.2.14': + resolution: {integrity: sha512-3G3tnAmTpdk9jO3GQtyHXqeFD2SlecfTws/Y3M2mmj9nMBwwuLT4kur8sZKeu7ENUHSpVO3cIsm5A52LEWWwlg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] @@ -3593,8 +3601,8 @@ packages: cpu: [arm64] os: [openharmony] - '@rolldown/binding-openharmony-arm64@1.2.7': - resolution: {integrity: sha512-lTcIYmmnQQA8Or/2DatS6oSqcdLHvendjS+zLu+FwgToynWMRSmQdpM65fTANJgIS4mjbMOo5KT2lnT9SAb96w==} + '@rolldown/binding-openharmony-arm64@1.2.14': + resolution: {integrity: sha512-qyr5XiNGxm2ytx17vvtcJ9nXn6v1gENETi503bJx3OGwZ1tSonj7BosxbMa/xeAfSl5iS9X6KjEWYXLu6v1L7Q==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [openharmony] @@ -3621,8 +3629,8 @@ packages: cpu: [arm64] os: [win32] - '@rolldown/binding-win32-arm64-msvc@1.2.7': - resolution: {integrity: sha512-e3Gu3WxbNk/UqQhxqU7YIYO+9ZBvWNz3U+h/qRFosscMFzdRPbXYSaSWgSnklv2fz1TgzBTcti2z35c/7irsHw==} + '@rolldown/binding-win32-arm64-msvc@1.2.14': + resolution: {integrity: sha512-oA4o5o0S2yB199YyYXDzKUv1Z56Rc+mgOjwm7Z/vJ9Z8igiDPYvoOuDyo6g7AK/ZaF09nPhDKVnGBcYHO11GXA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [win32] @@ -3639,8 +3647,8 @@ packages: cpu: [x64] os: [win32] - '@rolldown/binding-win32-x64-msvc@1.2.7': - resolution: {integrity: sha512-W/jg5qoRSqjsEv0+dZi4e687mcHqmVuU0P4fK6qS/xjetW2Gmc1W8j//z5nAeNcC8Ttm0hV46IjcYeuVwYhuiw==} + '@rolldown/binding-win32-x64-msvc@1.2.14': + resolution: {integrity: sha512-9mE94bf2GZUaR/fUSXCMpBoWkctu421Mi0ORpm4zqfbkjKep7RxzPFa5etcGs5h+2KApoWBOA/hAJa/7saGgEQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [win32] @@ -4297,6 +4305,130 @@ packages: resolution: {integrity: sha512-8C71BQkGjiMmXtop7pHVJu1l2NNShFdkCyD6a2ezzs5vU/L3LRtb69EtcteFwz0mYMPzIgOw0n6OV4VBUWZd7A==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@typescript/typescript-aix-ppc64@7.0.2': + resolution: {integrity: sha512-MTKKkWB7p/0E9xi1d1tHtZ5PiLkGEMIq88pK2CubZjOsLtYTLqhgIgi6zepFa+9GHZ6h05NMCkQxGKiPXMxXtQ==} + engines: {node: '>=16.20.0'} + cpu: [ppc64] + os: [aix] + + '@typescript/typescript-darwin-arm64@7.0.2': + resolution: {integrity: sha512-gowzar9MwS/aRWp6f3a4KUqzRjAZjOsmGNCM6LcTgXum+dBfgsBVMN+AgvOCCbguXyick6LJhpBszxMebJ8syA==} + engines: {node: '>=16.20.0'} + cpu: [arm64] + os: [darwin] + + '@typescript/typescript-darwin-x64@7.0.2': + resolution: {integrity: sha512-SZ9xZInqApNlNGc9s0W1VSsktYSOe9cFqNOIqmN1Gs8SmkjKZYFt017G4VwPxASInODuAdbTW7sXiFUf893RgA==} + engines: {node: '>=16.20.0'} + cpu: [x64] + os: [darwin] + + '@typescript/typescript-freebsd-arm64@7.0.2': + resolution: {integrity: sha512-W5NH4y/J0plIIS5b2xvTEkU7JFxyqdMAOgf+Ilhl0vHQXKO5dZoxd+C/jEtq56c4F3wk71RB4BMRQ2XdI+bwYQ==} + engines: {node: '>=16.20.0'} + cpu: [arm64] + os: [freebsd] + + '@typescript/typescript-freebsd-x64@7.0.2': + resolution: {integrity: sha512-UMGDx5sTpzNw3WiPebH7l90IWfJggEd+egHt/q6p7/Cm3zqoV7VxkGXt+3DxPIw8CcmvAB0j3sVVfbhX+M4Tpw==} + engines: {node: '>=16.20.0'} + cpu: [x64] + os: [freebsd] + + '@typescript/typescript-linux-arm64@7.0.2': + resolution: {integrity: sha512-Qh4eU4/y3yDjnfjjyPYihMj5/ODIlmt+Bzu17OI+fiSRDW57QmU5SiN63exPRNJPKUzcc1INa1NXdrJ+MqHjUQ==} + engines: {node: '>=16.20.0'} + cpu: [arm64] + os: [linux] + + '@typescript/typescript-linux-arm@7.0.2': + resolution: {integrity: sha512-gffT3xPz9sR7j/YJExkyPntrI0P2EP9XbOyWzth2/Gs0RstK+90RBcO0ncXoXy/beYll1SXw846Nf2zdnEz0QQ==} + engines: {node: '>=16.20.0'} + cpu: [arm] + os: [linux] + + '@typescript/typescript-linux-loong64@7.0.2': + resolution: {integrity: sha512-uEHck9i8hoAzXPiYRib1O7miOnz23SxIeVl6F4LXox+qov1K35jHcEW6VHKvZI+pyvl7fZEP4MCU5LYvIq1GuQ==} + engines: {node: '>=16.20.0'} + cpu: [loong64] + os: [linux] + + '@typescript/typescript-linux-mips64el@7.0.2': + resolution: {integrity: sha512-R4KvAMnE43W5Qeqb0Ly56O3mWMWIAgsMyz36DCaycd5nbg/9kzm0liw3JocfRqyJY0KPmzFjbswozXyW0DnIYA==} + engines: {node: '>=16.20.0'} + cpu: [mips64el] + os: [linux] + + '@typescript/typescript-linux-ppc64@7.0.2': + resolution: {integrity: sha512-DORx5b3sd/4S7eayxm4FQv+A7CrkUIGRaHiwI8oiHTAI1fAPWhF4J0vAlkC8biAlHSVVwxMQ3tjZ2/DVbnQiiA==} + engines: {node: '>=16.20.0'} + cpu: [ppc64] + os: [linux] + + '@typescript/typescript-linux-riscv64@7.0.2': + resolution: {integrity: sha512-wf0jqEDOjrPRnKwYRyyJDRo11KMbvMFrU+q4zqKyChODBzvlkbhNQfKvLxQCcwTpdDaXSHZTVuh0JoCrKCUMHQ==} + engines: {node: '>=16.20.0'} + cpu: [riscv64] + os: [linux] + + '@typescript/typescript-linux-s390x@7.0.2': + resolution: {integrity: sha512-IkwJc3L7yhytWd/ewjyxNDfOmswCm9GWMJT/ue/dU4aZNbwZeYAetq42VyLmsmSjvoX7z74X6ZaYCtzAr0EuGw==} + engines: {node: '>=16.20.0'} + cpu: [s390x] + os: [linux] + + '@typescript/typescript-linux-x64@7.0.2': + resolution: {integrity: sha512-EYdf2cNg7rgCWJnxCdJ+F3V39O8ihb37eHAu1LK8oAFizgTQbPOK7zHHXbPt8rX24COqODXeI3sIf0fCXG7H/A==} + engines: {node: '>=16.20.0'} + cpu: [x64] + os: [linux] + + '@typescript/typescript-netbsd-arm64@7.0.2': + resolution: {integrity: sha512-+polYF4MF04aPpO5FTkHran9yUQDSXqy5GiSDKpsll5jy3l3+g9QLhpf39T+ePtefhXLOGrLl0QIjkQP6VnelA==} + engines: {node: '>=16.20.0'} + cpu: [arm64] + os: [netbsd] + + '@typescript/typescript-netbsd-x64@7.0.2': + resolution: {integrity: sha512-8YIT0EHM/3dq10ZOVF/A7pc/YSMtbcecct4rWtexrnSCHOPcpC2KTLXfTCR6vDpnSiY12heNb1GiN/wu+T/FyA==} + engines: {node: '>=16.20.0'} + cpu: [x64] + os: [netbsd] + + '@typescript/typescript-openbsd-arm64@7.0.2': + resolution: {integrity: sha512-APT8+ClYnuYm1u9+kgGXoMj2VzWzcymwh2gNSQVySHfkRDGOTVkoWLjCmOQSaO+PoqQ57B0flRp9SA+7GnnkzQ==} + engines: {node: '>=16.20.0'} + cpu: [arm64] + os: [openbsd] + + '@typescript/typescript-openbsd-x64@7.0.2': + resolution: {integrity: sha512-yX7s+Q0Dln0Dt9tEzZsAjXXR/+ytBM7AlglaqyeMPxQszJ1JhlJdZ6jLA+IzldHtflX81em7lDao1xXu+aRRkg==} + engines: {node: '>=16.20.0'} + cpu: [x64] + os: [openbsd] + + '@typescript/typescript-sunos-x64@7.0.2': + resolution: {integrity: sha512-dLJDGaLZ1D4HPQn62u1n8mBDkJREwMsAkCdkwd4Ieqw+x3TUyTsqY0YiBCtE6H6OzzgGk3iuZ3vFWRS+E8/d1g==} + engines: {node: '>=16.20.0'} + cpu: [x64] + os: [sunos] + + '@typescript/typescript-win32-arm64@7.0.2': + resolution: {integrity: sha512-Gyl1Vy6OsWesLzmq+EP0Fb7b4Nid5232AvcA2SFcdYreldpNtYFFofPjnt62y9hQy7VTaZp65ICJjuAQRaVcIQ==} + engines: {node: '>=16.20.0'} + cpu: [arm64] + os: [win32] + + '@typescript/typescript-win32-x64@7.0.2': + resolution: {integrity: sha512-0BQ3HkAHHlKLSp1qRvf3SUhGpGsDuhB/jgFw75guyqbxJqEaS0Cw/VFO8i2nHglJUzQCRtMMR/IBAKE3ETMC4g==} + engines: {node: '>=16.20.0'} + cpu: [x64] + os: [win32] + + '@typescript/typescript6@6.0.2': + resolution: {integrity: sha512-mbCddXd+jm7hfx7w2YU64/Av4/NqqeG3GoRZgxPcgoTxYjhrcfJRw9ULch71SS4G+Q3bOXFhRvPqjguN0Hyp5w==} + hasBin: true + '@ungap/structured-clone@1.3.1': resolution: {integrity: sha512-mUFwbeTqrVgDQxFveS+df2yfap6iuP20NAKAsBt5jDEoOTDew+zwLAOilHCeQJOVSvmgCX4ogqIrA0mnyr08yQ==} @@ -4512,164 +4644,74 @@ packages: '@workflow/serde@4.1.0-beta.2': resolution: {integrity: sha512-8kkeoQKLDaKXefjV5dbhBj2aErfKp1Mc4pb6tj8144cF+Em5SPbyMbyLCHp+BVrFfFVCBluCtMx+jjvaFVZGww==} - '@yuku-codegen/binding-android-arm64@0.9.4': - resolution: {integrity: sha512-6ViGFAr+N2Yjnc8wBx16wJZGB0pGmClILO+FUC3kzwEydfjXQovWEdcFyl98RVtWdj9ahS41XXe2zKFl+L3uWg==} - cpu: [arm64] - os: [android] - deprecated: yuku-codegen is pure JavaScript since 0.14 - - '@yuku-codegen/binding-darwin-arm64@0.9.4': - resolution: {integrity: sha512-0BTB70ha+wRsz6fI5HosevJpMmvgndmf+6ND1OneFKCrWhNzX/2xIQ36Z8rUgv5bpnWjKl6bRvzSFV3PU+WOlQ==} - cpu: [arm64] - os: [darwin] - deprecated: yuku-codegen is pure JavaScript since 0.14 - - '@yuku-codegen/binding-darwin-x64@0.9.4': - resolution: {integrity: sha512-9QVVqq8LCD6v+Gl099u32YJ0999HBCoe09ecIeifKTi4Y1azX44DkF9q9pP2lxgwRUvR3GmWl5k1pLe3ojR2rg==} - cpu: [x64] - os: [darwin] - deprecated: yuku-codegen is pure JavaScript since 0.14 - - '@yuku-codegen/binding-freebsd-x64@0.9.4': - resolution: {integrity: sha512-Qm3ky33Em9w1XVSryq+D/arLVapeqp0Bu1719UGV6olmfp4kTD+NfsLG9bRx5hOJSu1Zl3r9LbyTP1oTmcHAsg==} - cpu: [x64] - os: [freebsd] - deprecated: yuku-codegen is pure JavaScript since 0.14 - - '@yuku-codegen/binding-linux-arm-gnu@0.9.4': - resolution: {integrity: sha512-euKmS7pnkeJylEN6+9bfu0jHtGfbQRfFBIpmTe8YVnWzQ5Rjyrns13+1kao2RSS9DNkucX1RXIdiTvQoDUXF0w==} - cpu: [arm] - os: [linux] - libc: [glibc] - deprecated: yuku-codegen is pure JavaScript since 0.14 - - '@yuku-codegen/binding-linux-arm-musl@0.9.4': - resolution: {integrity: sha512-7JTizi2O+ks9/dLPDLYmVLsYQUC9Fxu0e6LNA+F6FFQ/sV2o7owBb1eTccMKkgauWGGUpJYQvlXrCKpGwguvhA==} - cpu: [arm] - os: [linux] - libc: [musl] - deprecated: yuku-codegen is pure JavaScript since 0.14 - - '@yuku-codegen/binding-linux-arm64-gnu@0.9.4': - resolution: {integrity: sha512-f7eLYDwmcz56Jzvp8UmXUehFzTAn6hEHt64GDWNWGSqrphHRvWLEshQ+sQv8DfNpkXFaOQ49erl4gb2Wm0JM+A==} - cpu: [arm64] - os: [linux] - libc: [glibc] - deprecated: yuku-codegen is pure JavaScript since 0.14 - - '@yuku-codegen/binding-linux-arm64-musl@0.9.4': - resolution: {integrity: sha512-bLdjCgo+u3dU3HH/t+WZ8FsAo2IgdOzruTHZ+XTFquj6j//QJjH9xfyRtu7h65lCT3CQVW9aGEe6/A/HPyA9KQ==} - cpu: [arm64] - os: [linux] - libc: [musl] - deprecated: yuku-codegen is pure JavaScript since 0.14 - - '@yuku-codegen/binding-linux-x64-gnu@0.9.4': - resolution: {integrity: sha512-hDMB71QCDx2AAxhlCBgakngMAa4KK6f6rcTt9v8nrzoXs681cmZultGeZk0tjONxli+N+VMhXQUoiVCSJuKiQg==} - cpu: [x64] - os: [linux] - libc: [glibc] - deprecated: yuku-codegen is pure JavaScript since 0.14 - - '@yuku-codegen/binding-linux-x64-musl@0.9.4': - resolution: {integrity: sha512-uk1hOZA79AqziAH9A/eSD05VchNRdnLb6zxFGHhCbLYeeGYL+KOEL0+kCIPtaKuQ7wdxDOooiKE1D0jpaWQ0aA==} - cpu: [x64] - os: [linux] - libc: [musl] - deprecated: yuku-codegen is pure JavaScript since 0.14 - - '@yuku-codegen/binding-win32-arm64@0.9.4': - resolution: {integrity: sha512-IbZuNVrctjts5lAKUEd9ppnzvylaPdYBTv8AVDtY6EyQ5hpgUfsReqbqODJVGpn2/uIk1fa1jWP012orPoiK+A==} - cpu: [arm64] - os: [win32] - deprecated: yuku-codegen is pure JavaScript since 0.14 - - '@yuku-codegen/binding-win32-x64@0.9.4': - resolution: {integrity: sha512-UqC4C0PlVAPEQ8fYr0AamuW2zKAkqQFiaaQ88Rl3YlzSNlshj+VmDoSbJRw4TFYL22+Vw53zDSJ95aXyjJN/aw==} - cpu: [x64] - os: [win32] - deprecated: yuku-codegen is pure JavaScript since 0.14 - - '@yuku-parser/binding-android-arm64@0.9.4': - resolution: {integrity: sha512-x+dZef5ulszaYzgjHLUgnhDXAgJsGfodl30JuTinfLN5mEyB50burpUuyUqufGQp0fpI/sHLAN3V8fuJteFEQQ==} + '@yuku-core/binding-android-arm64@0.19.0': + resolution: {integrity: sha512-wdL2XmTiZixAOaHk9Z0JJZ8u9Qm8d333Zjpc6gaxXFX+UR5BlsfxZ7a2+2Rm71pamppsPYGUGFq2oVLbh6DISw==} cpu: [arm64] os: [android] - deprecated: yuku-parser runs on yuku-core since 0.14 - '@yuku-parser/binding-darwin-arm64@0.9.4': - resolution: {integrity: sha512-bSpjVPP8zTTcMZi78gxPkZZhVNbg4Doqsb2CrxHR2g+vZxP7Ey4GVzgD5nVYSHgS1y8dGULGW8AhPrfRWFEF6w==} + '@yuku-core/binding-darwin-arm64@0.19.0': + resolution: {integrity: sha512-7sNJa6XJhyetnTy64jw3NEi4YgUcezHk1G5GH9FSvXAuC8wIlbaOwT9lgq5qo5sspjrZJQlBR1TWflP49uRpMw==} cpu: [arm64] os: [darwin] - deprecated: yuku-parser runs on yuku-core since 0.14 - '@yuku-parser/binding-darwin-x64@0.9.4': - resolution: {integrity: sha512-QNswJLBxsoDkghztrF0bUy+DEUoeX1lS4cL3dCM1IB4hfLoZ3Jf3jmCoggDnqN++sJ91F6w8oHiyQ4ZhUEr/bg==} + '@yuku-core/binding-darwin-x64@0.19.0': + resolution: {integrity: sha512-pTC7dYEc59isdyizc3nsuyFNBu2LU5wMYZ1be6UMr59PY/AJNtO1aBLWV0MgL/z7C1nv/2sX4TNjGgKLoeevJw==} cpu: [x64] os: [darwin] - deprecated: yuku-parser runs on yuku-core since 0.14 - '@yuku-parser/binding-freebsd-x64@0.9.4': - resolution: {integrity: sha512-D4rmGI0EOwxmKsv3+iGQDmtJ9/Oqr9wPxsQpONZ+QmxHqNbl+08XaJkhuC5wAg17bj6afcpdQfiIAoSMBY17Rw==} + '@yuku-core/binding-freebsd-x64@0.19.0': + resolution: {integrity: sha512-xrZjF6XOEwyLOiDIfrwDdRCS6ghxcJeirNC1KivQhVcUwlRonaU79S3/Uiyx3lBylPnT8qKJ3/aMT+H52nGTJQ==} cpu: [x64] os: [freebsd] - deprecated: yuku-parser runs on yuku-core since 0.14 - '@yuku-parser/binding-linux-arm-gnu@0.9.4': - resolution: {integrity: sha512-rZuqBxlaRnNY57nawRP1LPx4i+ieCrvIQkBsbGu/xjWkZGzFCrHPliy5YiMxp3Mw4v5KftAlDJx7c9jApNk2ww==} + '@yuku-core/binding-linux-arm-gnu@0.19.0': + resolution: {integrity: sha512-0OyIH53C0I1CbADHn9FSdCfX5qbpeLwJhmOVhonFJNYheybOnkSJ50qGMfTJIb8y5zrwqvLs7FVBvz6Fk8maZg==} cpu: [arm] os: [linux] libc: [glibc] - deprecated: yuku-parser runs on yuku-core since 0.14 - '@yuku-parser/binding-linux-arm-musl@0.9.4': - resolution: {integrity: sha512-0PRDvRZvh18Q1lADxs0RMtqYHTd3dD/o1WEnMO/K8o7V9Gmy/7nD3/HjGQCxFPxkHTp41toF+DsXgEandAc2Gw==} + '@yuku-core/binding-linux-arm-musl@0.19.0': + resolution: {integrity: sha512-z/iPfkCOCSXE34VXNt0uP1ORSW+4mEa9b5CiJcWZeqZH08g49bFU/jRM2T04f+Wpw5mJ6HIzNBiojxeAbrHjeg==} cpu: [arm] os: [linux] libc: [musl] - deprecated: yuku-parser runs on yuku-core since 0.14 - '@yuku-parser/binding-linux-arm64-gnu@0.9.4': - resolution: {integrity: sha512-CT1I24KFA/Tv/Exi1f+CVxafUIjlKm3gc51HbWLW7yf7OvJKCvKSja+EB17sDtYsS5a2EB9BTr8I5fPuDJ8rFA==} + '@yuku-core/binding-linux-arm64-gnu@0.19.0': + resolution: {integrity: sha512-jLNTi+gzaRwBJ+gwhCJ+rDb5dmx/8hEBx93UWd7hjMSqPTL1D1wvVSvXVAldV5kALvju7b0/m51EHEhs4+I1fA==} cpu: [arm64] os: [linux] libc: [glibc] - deprecated: yuku-parser runs on yuku-core since 0.14 - '@yuku-parser/binding-linux-arm64-musl@0.9.4': - resolution: {integrity: sha512-DP193Z3nUXQ92AwmmkIAhVLxv2qj8rWAAAODownCwUk0wKrmnyH9km9Gd4NSmntBYG/Kv0P5btN6qcO1JXgEdw==} + '@yuku-core/binding-linux-arm64-musl@0.19.0': + resolution: {integrity: sha512-YwyPIdW/rN2Fmv0MTFWi47FaB3F9g+2b+sJISyAw83Yd60RWH4T3Nx6XkAHHVN+uKJNBAd6So7/BVihSiFYvuQ==} cpu: [arm64] os: [linux] libc: [musl] - deprecated: yuku-parser runs on yuku-core since 0.14 - '@yuku-parser/binding-linux-x64-gnu@0.9.4': - resolution: {integrity: sha512-tjoxmuNz+xmSt/Or+US5aaKpRZcptQsWYaPtDp1/0QUvhyg8VS6mOrizKkzVBJKYVNZ7eDTleOBquYVm+Haz6w==} + '@yuku-core/binding-linux-x64-gnu@0.19.0': + resolution: {integrity: sha512-/vskaAXVX3ESR43FiTdfiYS7z1b9uoQJwVQ/0RgUHgN2sWoAyCZs+aX4CgU7eKGIHTVfp9VFwv+c+2XchYiEtQ==} cpu: [x64] os: [linux] libc: [glibc] - deprecated: yuku-parser runs on yuku-core since 0.14 - '@yuku-parser/binding-linux-x64-musl@0.9.4': - resolution: {integrity: sha512-kHXf72EM6oHN58Swwruf9plXlCVY4mOlgqIjpXenEAY87cVcH3VxMZdCQG7rIKa+k0Hf3E/WS/8ufqZSCER7Gw==} + '@yuku-core/binding-linux-x64-musl@0.19.0': + resolution: {integrity: sha512-FuXL5igeSKib9Rye02TdH+D6SQezTyGxIATMu1Qsn/QywrzwpGl35OLpS2C1x5vpGLeVE2XgiLd5mVPFHmIglQ==} cpu: [x64] os: [linux] libc: [musl] - deprecated: yuku-parser runs on yuku-core since 0.14 - '@yuku-parser/binding-win32-arm64@0.9.4': - resolution: {integrity: sha512-Yj6+bbGDZrLbzp1Qr7hiaIjYagslUrRy6t3TIxfiXUeJWNH8ydx7birM0UJiIInqUld0mk9qBz1kei/T8gcKvw==} + '@yuku-core/binding-win32-arm64@0.19.0': + resolution: {integrity: sha512-YuJAe7zEKT1Xa7LuHlhGJpPnYQeVtvo0rZvNjJRqkH0hQGOw4C8QeP30Tg5VKGzZfo2x8CjhjEhKt4TmLwfmdg==} cpu: [arm64] os: [win32] - deprecated: yuku-parser runs on yuku-core since 0.14 - '@yuku-parser/binding-win32-x64@0.9.4': - resolution: {integrity: sha512-B9D+Z1/jVfoEd1SgbuaYTPH6onVlSsSaK151mW8Rb6Yv+OrTOocNnv2w3peBicS6MB3VI+mJG8YqxRI4ONd1OQ==} + '@yuku-core/binding-win32-x64@0.19.0': + resolution: {integrity: sha512-o8iY/mXwlRkedp0LNTr4+TEfXTPQwoNZmv6k+1WIAd1ZXEn8xJJTBCtB0osaVvdZo/x/cNmV16UrWrrGpM5Mvw==} cpu: [x64] os: [win32] - deprecated: yuku-parser runs on yuku-core since 0.14 - '@yuku-toolchain/types@0.9.4': - resolution: {integrity: sha512-dqnMswJWE7YBbPEvGstgFlWFTRn20V/Hu82XTDjWxzaU18rGpxBqxhKlBlgyWrPARRvNLIqY2XA6S9edR+2AsA==} + '@yuku-toolchain/types@0.19.0': + resolution: {integrity: sha512-tFkNbsP4WXX9UMUC5syJGdK9dPMLK0PPaIuXCcCYH75sZ8MrebfBZ2XvCILRTw8AgLivSSCfDa4R67iYBDa4Kg==} abbrev@3.0.1: resolution: {integrity: sha512-AO2ac6pjRB3SJmGJo+v5/aK6Omggp6fsLrs6wN9bd35ulu4cCwaAU9+7ZhXjeqHVkaHThLuzH0nZr0YpCDhygg==} @@ -5022,8 +5064,8 @@ packages: resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} engines: {node: '>=8'} - cac@7.0.0: - resolution: {integrity: sha512-tixWYgm5ZoOD+3g6UTea91eow5z6AAHaho3g0V9CNSNb45gM8SmflpAc+GRd1InC4AqN/07Unrgp56Y94N9hJQ==} + cac@7.1.0: + resolution: {integrity: sha512-LMDU/U2yA4IPIY8KT0NsNPWEYZvAMkbgyspxJ6btJaYV+WMDOHAZCmB0lsTObiHaRS1V/ztKAl7+TSkTqXyeoA==} engines: {node: '>=20.19.0'} call-bind-apply-helpers@1.0.2: @@ -5559,8 +5601,8 @@ packages: emojilib@2.4.0: resolution: {integrity: sha512-5U0rVMU5Y2n2+ykNLQqMoqklN9ICBT/KsvC1Gz6vqHbz2AXXGkG+Pm5rMWk/8Vjrr/mY9985Hi8DYzn1F09Nyw==} - empathic@2.0.1: - resolution: {integrity: sha512-YGRs8knHhKHVShLkFET/rWAU8kmHbOV5LwN938RHI0pljAJ1Gf6SzXsSmRaEzcXTtOOmVqJ5+WtQPL5uigY50Q==} + empathic@2.1.0: + resolution: {integrity: sha512-AnfC1ATldl49/cvZdLPDjBfrRNwbDO05aibiOtzQu3qtlbJtomNLhF30HEtn/7iBz50dlMECqATo3fG0LrdEgw==} engines: {node: '>=14'} encodeurl@2.0.0: @@ -5656,6 +5698,7 @@ packages: esbuild@0.28.1: resolution: {integrity: sha512-HrJrvZv5ayxBzPfwphOoNzkzOIIlifzk0KJrGK2c8R4+LKpMtpYLQeUdjnwjWv/LZlkH2laZk+4w78pi99D4Vw==} engines: {node: '>=18'} + hasBin: true escalade@3.2.0: resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} @@ -5981,8 +6024,8 @@ packages: resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} engines: {node: 6.* || 8.* || >= 10.*} - get-east-asian-width@1.6.0: - resolution: {integrity: sha512-QRbvDIbx6YklUe6RxeTeleMR0yv3cYH6PsPZHcnVn7xv7zO1BHN8r0XETu8n6Ye3Q+ahtSarc3WgtNWmehIBfA==} + get-east-asian-width@1.7.0: + resolution: {integrity: sha512-XjH1AECxf0giL2V1aU8vKyRR2ppRUb5c0EvT7zuJTokQ74bNo52zOtghqdWIqrhUD79fo3x0WfKZdOqxF6LG1Q==} engines: {node: '>=18'} get-intrinsic@1.3.0: @@ -6162,6 +6205,9 @@ packages: hookable@6.1.1: resolution: {integrity: sha512-U9LYDy1CwhMCnprUfeAZWZGByVbhd54hwepegYTK7Pi5NvqEj63ifz5z+xukznehT7i6NIZRu89Ay1AZmRsLEQ==} + hookable@6.1.2: + resolution: {integrity: sha512-+abwxtiEA52GCVIsQqut3S/uKTbUwYIp4Pe/vv+6py5XiXBCqMZHg6pA6Y5qhgLSEys0/cYuPbO0z1QFj5ZCmg==} + html-escaper@2.0.2: resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} @@ -6239,8 +6285,8 @@ packages: resolution: {integrity: sha512-pYkiyXVL2Mf3pozdlDGV6NAObxQx13Ae8knZk1UJRJ6uRW/ZRmTGHlQYtrsSl7ubuE5F8CD1z+s1n4RHNuTtuA==} engines: {node: '>=18'} - import-without-cache@0.4.0: - resolution: {integrity: sha512-NkJQA7oZ4YHQhd2+H3BoRFKF3d/XNsiKpHZCQEMH9pDX27hQQLsTyOocyRgaIVtf8gHX3Nt3LPkR4e5EdtPAGQ==} + import-without-cache@0.4.1: + resolution: {integrity: sha512-vXoV9PjKHEednCUu01e98TkImxy67e3BJXbTIOmIq4Hyzw3IAwYRcuPkfeTzJzwyyts4kjuA73x+pWJLc4f86A==} engines: {node: ^22.18.0 || >=24.0.0} imurmurhash@0.1.4: @@ -7183,6 +7229,10 @@ packages: resolution: {integrity: sha512-4a+OsYv9UktOJKE+l1A4OufDgdRF9PifWj+tJnHURo/P+WOxpG4GzUFL9qCalmWauao6ogiG+QvnCovwPoyAWA==} engines: {node: '>=12.20.0'} + obug@3.0.0: + resolution: {integrity: sha512-5vvB5+W7ePv+p3uqxi+RcW1XAzLW0/hxt3/4X4Lc4qHudzOhmBiBwOY6DRob4WnanAEGvNcLjF+KNOufrUoEQw==} + engines: {node: '>=12.20.0'} + ocache@0.1.4: resolution: {integrity: sha512-e7geNdWjxSnvsSgvLuPvgKgu7ubM10ZmTPOgpr7mz2BXYtvjMKTiLhjFi/gWU8chkuP6hNkZBsa9LzOusyaqkQ==} @@ -7813,12 +7863,13 @@ packages: rfdc@1.4.1: resolution: {integrity: sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==} - rolldown-plugin-dts@0.28.5: - resolution: {integrity: sha512-yYd3C9CeJwqjOc9X23m0Tyxcqic491uLZlfg51szT287S8zCCqLR2uoySoElgqy2CLn7PdXcEo1dlkBs4n1WHg==} + rolldown-plugin-dts@0.28.8: + resolution: {integrity: sha512-FVhfqxorCWcc20BVT5eVRfRjzLLl6mgzjcMR4gSBf0K4oQMXT0qoHhhzfXy0L7y83fQy7Ug5ZDNk90xM3/LiCQ==} engines: {node: ^22.18.0 || ^24.11.0 || >=26.0.0} peerDependencies: '@typescript/native-preview': '*' '@volar/typescript': ~2.4.0 + '@vue/language-core': ~3.2.0 || ~3.3.0 rolldown: ^1.2.0 typescript: ^5.0.0 || ^6.0.0 || ~7.0.0 vue-tsc: ~3.2.0 || ~3.3.0 @@ -7827,6 +7878,8 @@ packages: optional: true '@volar/typescript': optional: true + '@vue/language-core': + optional: true typescript: optional: true vue-tsc: @@ -7841,8 +7894,8 @@ packages: resolution: {integrity: sha512-oZx5zVDtVB44AW3eaifgDml1gWRDZGvjcfdxonE4swNPG98PrrXjaO/KrnUjzlMnztCCRVlUueA1kCXhARGk6g==} engines: {node: ^20.19.0 || >=22.12.0} - rolldown@1.2.7: - resolution: {integrity: sha512-g0EtLvBjTUB7jhyV0S/TCup3v/XSVl45vUIGbOGU4QPiyjTenCe4mKuFvW9fEgYmS2Fo42AUssRmNuMziXdrig==} + rolldown@1.2.14: + resolution: {integrity: sha512-eTBTTqMR6uHKLgcUqpJP8ntzDI6V4LYA8negAMBEI7gkgVvOdrx6VsvS2Ym+83KhOPdLCHWJu0w7UQFJZhHKNw==} engines: {node: ^20.19.0 || >=22.12.0} hasBin: true @@ -8129,8 +8182,8 @@ packages: resolution: {integrity: sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==} engines: {node: '>=18'} - string-width@8.2.2: - resolution: {integrity: sha512-GaPUh5gfdrYzqeVNZvUfT23vYYxXzKYidUcnMtJg/3rxRV63EFZy3k6xfKlmfeJD0176lnUV/Usr3XcwSvFzpg==} + string-width@8.3.0: + resolution: {integrity: sha512-ZbmZM0JCihQN91dWnxoipT2KOEyHqEyfRXUyjuRhW8b/xnqPDoq4gWEVApTVa9db2wN8mmoikgFBbjh71+cGeQ==} engines: {node: '>=20'} string_decoder@1.3.0: @@ -8328,14 +8381,14 @@ packages: resolution: {integrity: sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==} engines: {node: '>=6'} - tsdown@0.23.0: - resolution: {integrity: sha512-BaT+ep1xnj5hdyICLd5r5SYYE+TXnI1ATePLykv9vcKpHpFTWUWRH+x1AF/E2qcu3YB6+vI8IdyxIIIffEqw5Q==} + tsdown@0.23.1: + resolution: {integrity: sha512-MSC2WSOts3in95J334/VIS7KPfor3eCSvndJ6KdoVj9Aak9Kh1aNfz9ws5owhdukuTNSXRdfkPEzA/ihpDD6SA==} engines: {node: ^22.18.0 || ^24.11.0 || >=26.0.0} hasBin: true peerDependencies: '@arethetypeswrong/core': ^0.18.1 - '@tsdown/css': 0.23.0 - '@tsdown/exe': 0.23.0 + '@tsdown/css': 0.23.1 + '@tsdown/exe': 0.23.1 '@vitejs/devtools': '*' publint: ^0.3.8 tsx: '*' @@ -8435,6 +8488,11 @@ packages: engines: {node: '>=14.17'} hasBin: true + typescript@7.0.2: + resolution: {integrity: sha512-8FYau96o3NKOhbjKi/qNvG/W5jhzxkbdm5sj9AbZ/5T5sWqn3hJgLfGx27sRKZWTvyzCP8dLRBTf5tBTSRVUNA==} + engines: {node: '>=16.20.0'} + hasBin: true + ufo@1.6.4: resolution: {integrity: sha512-JFNbkD1Svwe0KvGi8GOeLcP4kAWQ609twvCdcHxq1oSL8svv39ZuSvajcD8B+5D0eL4+s1Is2D/O6KN3qcTeRA==} @@ -8696,8 +8754,8 @@ packages: resolution: {integrity: sha512-9BBo/6XZYMIUe2UFcffUDSocyEf8d7iFRTF13f1RloWpTObJozOqpT3mzpZkNO24zRbGVi3ElanegMS+vkFzgQ==} engines: {node: '>= 18'} - verkit@0.4.0: - resolution: {integrity: sha512-sXMwN6DMHeouPfCxkxWkKAmxphWKEenHYY5H1nIBzU3PmDsmJp6kBXJdshjVdpMZuWCmL9SH7KFRx29AylpP6g==} + verkit@0.5.0: + resolution: {integrity: sha512-u4J1hr6Y+C/hit34GwL3eIcUf3wngT8TlYUjK7tk0jxydKLAq3sYvifjdTDA6U3KCKRcQCQDGf/srjxfZF3l7g==} engines: {node: '>=18.12.0'} vfile-location@5.0.3: @@ -8939,8 +8997,8 @@ packages: resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} engines: {node: '>=0.10.0'} - wrap-ansi@10.0.1: - resolution: {integrity: sha512-M0N4xzyzosiIok3svYlEo1sdLZts/8FPgYH/GPC3wvlmPoRvnoManGMrE54waYj3tISA8w6lsdesfVv67qSr8Q==} + wrap-ansi@10.0.2: + resolution: {integrity: sha512-6OLRNZqRntVGBm26ghZ5eZhCuWWyOkRCSn8XsOIuq5stpCE/tjLbdozd93naILZig0lmD8ANfRwnhn0DLeXGlg==} engines: {node: '>=20'} wrap-ansi@7.0.0: @@ -9049,14 +9107,21 @@ packages: resolution: {integrity: sha512-4LCcse/U2MHZ63HAJVE+v71o7yOdIe4cZ70Wpf8D/IyjDKYQLV5GD46B+hSTjJsvV5PztjvHoU580EftxjDZFQ==} engines: {node: '>=12.20'} - yuku-ast@0.9.4: - resolution: {integrity: sha512-AeeHDopMAy2mMafUMEIZxmQaCJOPEvBGDSSA23y5iKuzak3H2otfmgo4ObJubuzdHlJrv4eFY3KQ5XZOru5gpw==} + yuku-ast@0.19.0: + resolution: {integrity: sha512-PyCsiScaelhxBGzL8dyeJkLqvRZycoh78R31Vrt/WqYrm0hMFoKwIw/X7Dx5mBKLWAMlV9I9HEyBOHnj2gZVyw==} + engines: {node: '>=14.18.0'} + + yuku-codegen@0.19.0: + resolution: {integrity: sha512-uymAKHjDuaP4BEpkXC/BSLz4DUEF5oArZ5AuD3888nb2miChjWSgpPdojEJxm3pjpXkgUaCRJQyNAbnMN33wHg==} + engines: {node: '>=14.18.0'} - yuku-codegen@0.9.4: - resolution: {integrity: sha512-pPr8xA8wBjrebER5VFeqS1XqATED1dQXU7JoAectAi1RBG4YFJz5yBirnmmmHZHldgnMKs/pMGkDtwGVQX+Efg==} + yuku-core@0.19.0: + resolution: {integrity: sha512-kYK9e1XdfirNhkipzW0wmMcSWcVF/CWnuugodfVYRCUwvoBefweL9HzB96OiKEhsx78V5WbUxbJqlizMX869Qg==} + engines: {node: '>=14.18.0'} - yuku-parser@0.9.4: - resolution: {integrity: sha512-VWnoJzdB2g1JjsMEcB2MxSLoDbgISgOiNRsgiR0qrQKiUw2yyzEfYEYkNHSMNhdGkSo7gtmcN+2UOczzGDLAuw==} + yuku-parser@0.19.0: + resolution: {integrity: sha512-XrBh9ZiQK5mJVRxZBAvD6LwRyAYrK3MFtH3+onyuxFL5hFD44EC3QOmIC1FjTj6H2MMwq46/NAI+NZxLZPZgxg==} + engines: {node: '>=14.18.0'} zod-to-json-schema@3.25.2: resolution: {integrity: sha512-O/PgfnpT1xKSDeQYSCfRI5Gy3hPf91mKVDuYLUHZJMiDFptvP41MSnWofm8dnCm0256ZNfZIM7DSzuSMAFnjHA==} @@ -9270,7 +9335,7 @@ snapshots: '@types/hast': 3.0.5 '@types/mdast': 4.0.4 js-yaml: 4.3.0 - picomatch: 4.0.5 + picomatch: 4.0.7 retext-smartypants: 6.2.0 shiki: 4.1.0 smol-toml: 1.7.1 @@ -9281,7 +9346,7 @@ snapshots: '@types/hast': 3.0.5 '@types/mdast': 4.0.4 js-yaml: 4.3.0 - picomatch: 4.0.5 + picomatch: 4.0.7 retext-smartypants: 6.2.0 shiki: 4.1.0 smol-toml: 1.7.1 @@ -11028,7 +11093,7 @@ snapshots: '@oxc-project/types@0.132.0': {} - '@oxc-project/types@0.148.0': {} + '@oxc-project/types@0.154.0': {} '@oxc-transform/binding-android-arm-eabi@0.111.0': optional: true @@ -11221,7 +11286,7 @@ snapshots: detect-libc: 2.1.2 is-glob: 4.0.3 node-addon-api: 7.1.1 - picomatch: 4.0.5 + picomatch: 4.0.7 optionalDependencies: '@parcel/watcher-android-arm64': 2.5.6 '@parcel/watcher-darwin-arm64': 2.5.6 @@ -11267,7 +11332,7 @@ snapshots: '@protobufjs/utf8@1.1.1': {} - '@publint/pack@0.1.6': + '@publint/pack@0.1.7': dependencies: tinyexec: 1.1.2 @@ -11556,7 +11621,7 @@ snapshots: '@renovatebot/pep440@4.2.1': {} - '@rolldown/binding-android-arm-eabi@1.2.7': + '@rolldown/binding-android-arm-eabi@1.2.14': optional: true '@rolldown/binding-android-arm64@1.0.0-rc.1': @@ -11565,7 +11630,7 @@ snapshots: '@rolldown/binding-android-arm64@1.0.2': optional: true - '@rolldown/binding-android-arm64@1.2.7': + '@rolldown/binding-android-arm64@1.2.14': optional: true '@rolldown/binding-darwin-arm64@1.0.0-rc.1': @@ -11574,7 +11639,7 @@ snapshots: '@rolldown/binding-darwin-arm64@1.0.2': optional: true - '@rolldown/binding-darwin-arm64@1.2.7': + '@rolldown/binding-darwin-arm64@1.2.14': optional: true '@rolldown/binding-darwin-x64@1.0.0-rc.1': @@ -11583,7 +11648,7 @@ snapshots: '@rolldown/binding-darwin-x64@1.0.2': optional: true - '@rolldown/binding-darwin-x64@1.2.7': + '@rolldown/binding-darwin-x64@1.2.14': optional: true '@rolldown/binding-freebsd-x64@1.0.0-rc.1': @@ -11592,7 +11657,7 @@ snapshots: '@rolldown/binding-freebsd-x64@1.0.2': optional: true - '@rolldown/binding-freebsd-x64@1.2.7': + '@rolldown/binding-freebsd-x64@1.2.14': optional: true '@rolldown/binding-linux-arm-gnueabihf@1.0.0-rc.1': @@ -11601,7 +11666,7 @@ snapshots: '@rolldown/binding-linux-arm-gnueabihf@1.0.2': optional: true - '@rolldown/binding-linux-arm-gnueabihf@1.2.7': + '@rolldown/binding-linux-arm-gnueabihf@1.2.14': optional: true '@rolldown/binding-linux-arm64-gnu@1.0.0-rc.1': @@ -11610,7 +11675,7 @@ snapshots: '@rolldown/binding-linux-arm64-gnu@1.0.2': optional: true - '@rolldown/binding-linux-arm64-gnu@1.2.7': + '@rolldown/binding-linux-arm64-gnu@1.2.14': optional: true '@rolldown/binding-linux-arm64-musl@1.0.0-rc.1': @@ -11619,19 +11684,19 @@ snapshots: '@rolldown/binding-linux-arm64-musl@1.0.2': optional: true - '@rolldown/binding-linux-arm64-musl@1.2.7': + '@rolldown/binding-linux-arm64-musl@1.2.14': optional: true '@rolldown/binding-linux-ppc64-gnu@1.0.2': optional: true - '@rolldown/binding-linux-ppc64-gnu@1.2.7': + '@rolldown/binding-linux-ppc64-gnu@1.2.14': optional: true '@rolldown/binding-linux-s390x-gnu@1.0.2': optional: true - '@rolldown/binding-linux-s390x-gnu@1.2.7': + '@rolldown/binding-linux-s390x-gnu@1.2.14': optional: true '@rolldown/binding-linux-x64-gnu@1.0.0-rc.1': @@ -11640,7 +11705,7 @@ snapshots: '@rolldown/binding-linux-x64-gnu@1.0.2': optional: true - '@rolldown/binding-linux-x64-gnu@1.2.7': + '@rolldown/binding-linux-x64-gnu@1.2.14': optional: true '@rolldown/binding-linux-x64-musl@1.0.0-rc.1': @@ -11649,7 +11714,7 @@ snapshots: '@rolldown/binding-linux-x64-musl@1.0.2': optional: true - '@rolldown/binding-linux-x64-musl@1.2.7': + '@rolldown/binding-linux-x64-musl@1.2.14': optional: true '@rolldown/binding-openharmony-arm64@1.0.0-rc.1': @@ -11658,7 +11723,7 @@ snapshots: '@rolldown/binding-openharmony-arm64@1.0.2': optional: true - '@rolldown/binding-openharmony-arm64@1.2.7': + '@rolldown/binding-openharmony-arm64@1.2.14': optional: true '@rolldown/binding-wasm32-wasi@1.0.0-rc.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)': @@ -11682,7 +11747,7 @@ snapshots: '@rolldown/binding-win32-arm64-msvc@1.0.2': optional: true - '@rolldown/binding-win32-arm64-msvc@1.2.7': + '@rolldown/binding-win32-arm64-msvc@1.2.14': optional: true '@rolldown/binding-win32-x64-msvc@1.0.0-rc.1': @@ -11691,7 +11756,7 @@ snapshots: '@rolldown/binding-win32-x64-msvc@1.0.2': optional: true - '@rolldown/binding-win32-x64-msvc@1.2.7': + '@rolldown/binding-win32-x64-msvc@1.2.14': optional: true '@rolldown/pluginutils@1.0.0-rc.1': {} @@ -11702,7 +11767,7 @@ snapshots: dependencies: '@types/estree': 1.0.9 estree-walker: 2.0.2 - picomatch: 4.0.5 + picomatch: 4.0.7 '@rollup/rollup-android-arm-eabi@4.60.4': optional: true @@ -11844,10 +11909,10 @@ snapshots: dependencies: '@sentry/conventions': 0.15.1 - '@sentry/junior-dashboard@file:packages/junior-dashboard(@opentelemetry/api@1.9.1)(jiti@2.7.0)': + '@sentry/junior-dashboard@file:packages/junior-dashboard(@opentelemetry/api@1.9.1)(@types/node@25.9.1)(jiti@2.7.0)': dependencies: '@radix-ui/react-hover-card': 1.1.23(react-dom@19.2.6(react@19.2.6))(react@19.2.6) - '@sentry/junior': file:packages/junior + '@sentry/junior': file:packages/junior(@types/node@25.9.1) '@sentry/junior-plugin-api': file:packages/junior-plugin-api '@tanstack/react-query': 5.100.14(react@19.2.6) better-auth: 1.6.22(@opentelemetry/api@1.9.1)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) @@ -11890,6 +11955,7 @@ snapshots: - '@tanstack/solid-start' - '@tidbcloud/serverless' - '@types/better-sqlite3' + - '@types/node' - '@types/pg' - '@types/react' - '@types/react-dom' @@ -12337,6 +12403,87 @@ snapshots: - '@prisma/client' - '@tidbcloud/serverless' - '@types/better-sqlite3' + - '@types/node' + - '@types/pg' + - '@types/sql.js' + - '@upstash/redis' + - '@vercel/postgres' + - '@xata.io/client' + - bare-abort-controller + - better-sqlite3 + - bufferutil + - bun-types + - debug + - expo-sqlite + - gel + - knex + - kysely + - mysql2 + - pg-native + - postgres + - prisma + - react-native-b4a + - sql.js + - sqlite3 + - supports-color + - utf-8-validate + - ws + + '@sentry/junior@file:packages/junior(@types/node@25.9.1)': + dependencies: + '@agentclientprotocol/sdk': 1.3.0(zod@4.5.4) + '@ai-sdk/gateway': 3.0.119(zod@4.5.4) + '@chat-adapter/slack': 4.29.0(ai@6.0.190(zod@4.5.4))(zod@4.5.4) + '@chat-adapter/state-memory': 4.29.0(ai@6.0.190(zod@4.5.4))(zod@4.5.4) + '@chat-adapter/state-redis': 4.29.0(@opentelemetry/api@1.9.1)(ai@6.0.190(zod@4.5.4))(zod@4.5.4) + '@earendil-works/pi-agent-core': 0.84.1(@modelcontextprotocol/sdk@1.31.0(zod@4.5.4))(zod@4.5.4) + '@earendil-works/pi-ai': 0.84.1(@modelcontextprotocol/sdk@1.31.0(zod@4.5.4))(zod@4.5.4) + '@hono/zod-validator': 0.9.0(hono@4.12.27)(zod@4.5.4) + '@logtape/logtape': 2.1.1 + '@modelcontextprotocol/sdk': 1.31.0(zod@4.5.4) + '@neondatabase/serverless': 1.1.0 + '@opentelemetry/api': 1.9.1 + '@opentelemetry/core': 2.9.0(@opentelemetry/api@1.9.1) + '@sentry/junior-plugin-api': file:packages/junior-plugin-api + '@sentry/node': 10.65.0(@opentelemetry/core@2.9.0(@opentelemetry/api@1.9.1)) + '@sinclair/typebox': 0.34.49 + '@slack/types': 2.21.1 + '@slack/web-api': 7.16.0 + '@vercel/blob': 2.8.0 + '@vercel/functions': 3.6.0 + '@vercel/oidc': 3.4.1 + '@vercel/queue': 0.2.0 + '@vercel/sandbox': 2.8.0 + ai: 6.0.190(zod@4.5.4) + chat: 4.29.0(ai@6.0.190(zod@4.5.4))(zod@4.5.4) + commander: 14.0.3 + diff: 8.0.4 + drizzle-orm: 0.45.2(@neondatabase/serverless@1.1.0)(@opentelemetry/api@1.9.1)(pg@8.21.0) + hono: 4.12.27 + jiti: 2.7.0 + jose: 6.2.3 + just-bash: 3.0.1 + node-html-markdown: 2.0.0 + pg: 8.21.0 + sharp: 0.35.3(@types/node@25.9.1) + yaml: 2.9.0 + zod: 4.5.4 + transitivePeerDependencies: + - '@aws-sdk/client-rds-data' + - '@aws-sdk/credential-provider-web-identity' + - '@cfworker/json-schema' + - '@cloudflare/workers-types' + - '@electric-sql/pglite' + - '@libsql/client' + - '@libsql/client-wasm' + - '@node-rs/xxhash' + - '@op-engineering/op-sqlite' + - '@opentelemetry/exporter-trace-otlp-http' + - '@planetscale/database' + - '@prisma/client' + - '@tidbcloud/serverless' + - '@types/better-sqlite3' + - '@types/node' - '@types/pg' - '@types/sql.js' - '@upstash/redis' @@ -12644,12 +12791,12 @@ snapshots: '@tailwindcss/oxide-win32-arm64-msvc': 4.3.0 '@tailwindcss/oxide-win32-x64-msvc': 4.3.0 - '@tanstack/eslint-plugin-query@5.101.4(eslint@10.8.0)(typescript@6.0.3)': + '@tanstack/eslint-plugin-query@5.101.4(eslint@10.8.0)(typescript@7.0.2)': dependencies: - '@typescript-eslint/utils': 8.65.0(eslint@10.8.0)(typescript@6.0.3) + '@typescript-eslint/utils': 8.65.0(eslint@10.8.0)(typescript@7.0.2) eslint: 10.8.0 optionalDependencies: - typescript: 6.0.3 + typescript: 7.0.2 transitivePeerDependencies: - supports-color @@ -12781,12 +12928,12 @@ snapshots: dependencies: '@types/node': 25.9.1 - '@typescript-eslint/project-service@8.65.0(typescript@6.0.3)': + '@typescript-eslint/project-service@8.65.0(typescript@7.0.2)': dependencies: - '@typescript-eslint/tsconfig-utils': 8.65.0(typescript@6.0.3) + '@typescript-eslint/tsconfig-utils': 8.65.0(typescript@7.0.2) '@typescript-eslint/types': 8.65.0 debug: 4.4.3 - typescript: 6.0.3 + typescript: 7.0.2 transitivePeerDependencies: - supports-color @@ -12795,35 +12942,35 @@ snapshots: '@typescript-eslint/types': 8.65.0 '@typescript-eslint/visitor-keys': 8.65.0 - '@typescript-eslint/tsconfig-utils@8.65.0(typescript@6.0.3)': + '@typescript-eslint/tsconfig-utils@8.65.0(typescript@7.0.2)': dependencies: - typescript: 6.0.3 + typescript: 7.0.2 '@typescript-eslint/types@8.65.0': {} - '@typescript-eslint/typescript-estree@8.65.0(typescript@6.0.3)': + '@typescript-eslint/typescript-estree@8.65.0(typescript@7.0.2)': dependencies: - '@typescript-eslint/project-service': 8.65.0(typescript@6.0.3) - '@typescript-eslint/tsconfig-utils': 8.65.0(typescript@6.0.3) + '@typescript-eslint/project-service': 8.65.0(typescript@7.0.2) + '@typescript-eslint/tsconfig-utils': 8.65.0(typescript@7.0.2) '@typescript-eslint/types': 8.65.0 '@typescript-eslint/visitor-keys': 8.65.0 debug: 4.4.3 minimatch: 10.2.5 semver: 7.8.5 tinyglobby: 0.2.17 - ts-api-utils: 2.5.0(typescript@6.0.3) - typescript: 6.0.3 + ts-api-utils: 2.5.0(typescript@7.0.2) + typescript: 7.0.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.65.0(eslint@10.8.0)(typescript@6.0.3)': + '@typescript-eslint/utils@8.65.0(eslint@10.8.0)(typescript@7.0.2)': dependencies: '@eslint-community/eslint-utils': 4.10.1(eslint@10.8.0) '@typescript-eslint/scope-manager': 8.65.0 '@typescript-eslint/types': 8.65.0 - '@typescript-eslint/typescript-estree': 8.65.0(typescript@6.0.3) + '@typescript-eslint/typescript-estree': 8.65.0(typescript@7.0.2) eslint: 10.8.0 - typescript: 6.0.3 + typescript: 7.0.2 transitivePeerDependencies: - supports-color @@ -12832,6 +12979,70 @@ snapshots: '@typescript-eslint/types': 8.65.0 eslint-visitor-keys: 5.0.1 + '@typescript/typescript-aix-ppc64@7.0.2': + optional: true + + '@typescript/typescript-darwin-arm64@7.0.2': + optional: true + + '@typescript/typescript-darwin-x64@7.0.2': + optional: true + + '@typescript/typescript-freebsd-arm64@7.0.2': + optional: true + + '@typescript/typescript-freebsd-x64@7.0.2': + optional: true + + '@typescript/typescript-linux-arm64@7.0.2': + optional: true + + '@typescript/typescript-linux-arm@7.0.2': + optional: true + + '@typescript/typescript-linux-loong64@7.0.2': + optional: true + + '@typescript/typescript-linux-mips64el@7.0.2': + optional: true + + '@typescript/typescript-linux-ppc64@7.0.2': + optional: true + + '@typescript/typescript-linux-riscv64@7.0.2': + optional: true + + '@typescript/typescript-linux-s390x@7.0.2': + optional: true + + '@typescript/typescript-linux-x64@7.0.2': + optional: true + + '@typescript/typescript-netbsd-arm64@7.0.2': + optional: true + + '@typescript/typescript-netbsd-x64@7.0.2': + optional: true + + '@typescript/typescript-openbsd-arm64@7.0.2': + optional: true + + '@typescript/typescript-openbsd-x64@7.0.2': + optional: true + + '@typescript/typescript-sunos-x64@7.0.2': + optional: true + + '@typescript/typescript-win32-arm64@7.0.2': + optional: true + + '@typescript/typescript-win32-x64@7.0.2': + optional: true + + '@typescript/typescript6@6.0.2': + dependencies: + '@typescript/old': typescript@6.0.3 + '@ungap/structured-clone@1.3.1': {} '@vercel/backends@0.7.2(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)': @@ -13048,7 +13259,7 @@ snapshots: glob: 13.0.6 graceful-fs: 4.2.11 node-gyp-build: 4.8.4 - picomatch: 4.0.5 + picomatch: 4.0.7 resolve-from: 5.0.0 transitivePeerDependencies: - encoding @@ -13213,7 +13424,7 @@ snapshots: obug: 2.1.1 std-env: 4.1.0 tinyrainbow: 3.1.0 - vitest: 4.1.7(@opentelemetry/api@1.9.1)(@types/node@25.9.1)(@vitest/coverage-v8@4.1.7)(jiti@2.7.0)(msw@2.14.6(@types/node@25.9.1)(typescript@6.0.3))(tsx@4.22.3)(yaml@2.9.0) + vitest: 4.1.7(@opentelemetry/api@1.9.1)(@types/node@25.9.1)(@vitest/coverage-v8@4.1.7)(jiti@2.7.0)(msw@2.14.6(@types/node@25.9.1)(typescript@7.0.2))(tsx@4.22.3)(yaml@2.9.0) '@vitest/expect@4.1.7': dependencies: @@ -13224,31 +13435,31 @@ snapshots: chai: 6.2.2 tinyrainbow: 3.1.0 - '@vitest/mocker@4.1.7(msw@2.14.6(@types/node@25.9.1)(typescript@6.0.3))(vite@8.0.14(@types/node@25.9.1)(jiti@2.7.0)(tsx@4.22.3)(yaml@2.9.0))': + '@vitest/mocker@4.1.7(msw@2.14.6(@types/node@25.9.1)(typescript@7.0.2))(vite@8.0.14(@types/node@25.9.1)(jiti@2.7.0)(tsx@4.22.3)(yaml@2.9.0))': dependencies: '@vitest/spy': 4.1.7 estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: - msw: 2.14.6(@types/node@25.9.1)(typescript@6.0.3) + msw: 2.14.6(@types/node@25.9.1)(typescript@7.0.2) vite: 8.0.14(@types/node@25.9.1)(jiti@2.7.0)(tsx@4.22.3)(yaml@2.9.0) - '@vitest/mocker@4.1.7(msw@2.14.6(@types/node@25.9.1)(typescript@6.0.3))(vite@8.0.14(@types/node@25.9.1)(tsx@4.22.3))': + '@vitest/mocker@4.1.7(msw@2.14.6(@types/node@25.9.1)(typescript@7.0.2))(vite@8.0.14(@types/node@25.9.1)(tsx@4.22.3))': dependencies: '@vitest/spy': 4.1.7 estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: - msw: 2.14.6(@types/node@25.9.1)(typescript@6.0.3) + msw: 2.14.6(@types/node@25.9.1)(typescript@7.0.2) vite: 8.0.14(@types/node@25.9.1)(tsx@4.22.3) - '@vitest/mocker@4.1.7(msw@2.14.6(typescript@6.0.3))(vite@8.0.14(tsx@4.22.3))': + '@vitest/mocker@4.1.7(msw@2.14.6(typescript@7.0.2))(vite@8.0.14(tsx@4.22.3))': dependencies: '@vitest/spy': 4.1.7 estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: - msw: 2.14.6(typescript@6.0.3) + msw: 2.14.6(typescript@7.0.2) vite: 8.0.14(tsx@4.22.3) '@vitest/mocker@4.1.7(vite@8.0.14(@types/node@25.9.1)(tsx@4.22.3))': @@ -13335,79 +13546,43 @@ snapshots: '@workflow/serde@4.1.0-beta.2': {} - '@yuku-codegen/binding-android-arm64@0.9.4': + '@yuku-core/binding-android-arm64@0.19.0': optional: true - '@yuku-codegen/binding-darwin-arm64@0.9.4': + '@yuku-core/binding-darwin-arm64@0.19.0': optional: true - '@yuku-codegen/binding-darwin-x64@0.9.4': + '@yuku-core/binding-darwin-x64@0.19.0': optional: true - '@yuku-codegen/binding-freebsd-x64@0.9.4': + '@yuku-core/binding-freebsd-x64@0.19.0': optional: true - '@yuku-codegen/binding-linux-arm-gnu@0.9.4': + '@yuku-core/binding-linux-arm-gnu@0.19.0': optional: true - '@yuku-codegen/binding-linux-arm-musl@0.9.4': + '@yuku-core/binding-linux-arm-musl@0.19.0': optional: true - '@yuku-codegen/binding-linux-arm64-gnu@0.9.4': + '@yuku-core/binding-linux-arm64-gnu@0.19.0': optional: true - '@yuku-codegen/binding-linux-arm64-musl@0.9.4': + '@yuku-core/binding-linux-arm64-musl@0.19.0': optional: true - '@yuku-codegen/binding-linux-x64-gnu@0.9.4': + '@yuku-core/binding-linux-x64-gnu@0.19.0': optional: true - '@yuku-codegen/binding-linux-x64-musl@0.9.4': + '@yuku-core/binding-linux-x64-musl@0.19.0': optional: true - '@yuku-codegen/binding-win32-arm64@0.9.4': + '@yuku-core/binding-win32-arm64@0.19.0': optional: true - '@yuku-codegen/binding-win32-x64@0.9.4': + '@yuku-core/binding-win32-x64@0.19.0': optional: true - '@yuku-parser/binding-android-arm64@0.9.4': - optional: true - - '@yuku-parser/binding-darwin-arm64@0.9.4': - optional: true - - '@yuku-parser/binding-darwin-x64@0.9.4': - optional: true - - '@yuku-parser/binding-freebsd-x64@0.9.4': - optional: true - - '@yuku-parser/binding-linux-arm-gnu@0.9.4': - optional: true - - '@yuku-parser/binding-linux-arm-musl@0.9.4': - optional: true - - '@yuku-parser/binding-linux-arm64-gnu@0.9.4': - optional: true - - '@yuku-parser/binding-linux-arm64-musl@0.9.4': - optional: true - - '@yuku-parser/binding-linux-x64-gnu@0.9.4': - optional: true - - '@yuku-parser/binding-linux-x64-musl@0.9.4': - optional: true - - '@yuku-parser/binding-win32-arm64@0.9.4': - optional: true - - '@yuku-parser/binding-win32-x64@0.9.4': - optional: true - - '@yuku-toolchain/types@0.9.4': {} + '@yuku-toolchain/types@0.19.0': {} abbrev@3.0.1: {} @@ -13817,7 +13992,7 @@ snapshots: cac@6.7.14: {} - cac@7.0.0: {} + cac@7.1.0: {} call-bind-apply-helpers@1.0.2: dependencies: @@ -13912,7 +14087,7 @@ snapshots: cli-truncate@5.2.0: dependencies: slice-ansi: 8.0.0 - string-width: 8.2.2 + string-width: 8.3.0 cli-width@4.1.0: {} @@ -14107,6 +14282,7 @@ snapshots: safe-regex: 2.1.1 semver: 7.7.4 tsconfig-paths-webpack-plugin: 4.2.0 + typescript: '@typescript/typescript6@6.0.2' watskeburt: 5.0.3 dequal@2.0.3: {} @@ -14231,7 +14407,7 @@ snapshots: emojilib@2.4.0: {} - empathic@2.0.1: {} + empathic@2.1.0: {} encodeurl@2.0.0: {} @@ -14720,9 +14896,9 @@ snapshots: dependencies: pend: 1.2.0 - fdir@6.5.0(picomatch@4.0.5): + fdir@6.5.0(picomatch@4.0.7): optionalDependencies: - picomatch: 4.0.5 + picomatch: 4.0.7 fetch-blob@3.2.0: dependencies: @@ -14852,7 +15028,7 @@ snapshots: get-caller-file@2.0.5: {} - get-east-asian-width@1.6.0: {} + get-east-asian-width@1.7.0: {} get-intrinsic@1.3.0: dependencies: @@ -15173,6 +15349,8 @@ snapshots: hookable@6.1.1: {} + hookable@6.1.2: {} + html-escaper@2.0.2: {} html-escaper@3.0.3: {} @@ -15251,7 +15429,7 @@ snapshots: cjs-module-lexer: 2.2.0 module-details-from-path: 1.0.4 - import-without-cache@0.4.0: {} + import-without-cache@0.4.1: {} imurmurhash@0.1.4: {} @@ -15299,7 +15477,7 @@ snapshots: is-fullwidth-code-point@5.1.0: dependencies: - get-east-asian-width: 1.6.0 + get-east-asian-width: 1.7.0 is-glob@4.0.3: dependencies: @@ -15559,7 +15737,7 @@ snapshots: lint-staged@17.0.5: dependencies: listr2: 10.2.2 - picomatch: 4.0.5 + picomatch: 4.0.7 string-argv: 0.3.2 tinyexec: 1.1.2 optionalDependencies: @@ -15571,7 +15749,7 @@ snapshots: eventemitter3: 5.0.4 log-update: 6.1.0 rfdc: 1.4.1 - wrap-ansi: 10.0.1 + wrap-ansi: 10.0.2 load-tsconfig@0.2.5: {} @@ -16191,7 +16369,7 @@ snapshots: ms@2.1.3: {} - msw@2.14.6(@types/node@25.9.1)(typescript@6.0.3): + msw@2.14.6(@types/node@25.9.1)(typescript@7.0.2): dependencies: '@inquirer/confirm': 6.0.13(@types/node@25.9.1) '@mswjs/interceptors': 0.41.9 @@ -16212,11 +16390,11 @@ snapshots: until-async: 3.0.2 yargs: 17.7.2 optionalDependencies: - typescript: 6.0.3 + typescript: 7.0.2 transitivePeerDependencies: - '@types/node' - msw@2.14.6(typescript@6.0.3): + msw@2.14.6(typescript@7.0.2): dependencies: '@inquirer/confirm': 6.0.13 '@mswjs/interceptors': 0.41.9 @@ -16237,7 +16415,7 @@ snapshots: until-async: 3.0.2 yargs: 17.7.2 optionalDependencies: - typescript: 6.0.3 + typescript: 7.0.2 transitivePeerDependencies: - '@types/node' @@ -16500,6 +16678,8 @@ snapshots: obug@2.1.4: {} + obug@3.0.0: {} + ocache@0.1.4: dependencies: ohash: 2.0.11 @@ -16923,7 +17103,7 @@ snapshots: publint@0.3.21: dependencies: - '@publint/pack': 0.1.6 + '@publint/pack': 0.1.7 package-manager-detector: 1.8.0 picocolors: 1.1.1 sade: 1.8.1 @@ -17234,17 +17414,17 @@ snapshots: rfdc@1.4.1: {} - rolldown-plugin-dts@0.28.5(rolldown@1.2.7)(typescript@6.0.3): + rolldown-plugin-dts@0.28.8(rolldown@1.2.14)(typescript@7.0.2): dependencies: dts-resolver: 3.0.0 get-tsconfig: 5.0.0-beta.6 - obug: 2.1.4 - rolldown: 1.2.7 - yuku-ast: 0.9.4 - yuku-codegen: 0.9.4 - yuku-parser: 0.9.4 + obug: 3.0.0 + rolldown: 1.2.14 + yuku-ast: 0.19.0 + yuku-codegen: 0.19.0 + yuku-parser: 0.19.0 optionalDependencies: - typescript: 6.0.3 + typescript: 7.0.2 transitivePeerDependencies: - oxc-resolver @@ -17291,26 +17471,26 @@ snapshots: '@rolldown/binding-win32-arm64-msvc': 1.0.2 '@rolldown/binding-win32-x64-msvc': 1.0.2 - rolldown@1.2.7: + rolldown@1.2.14: dependencies: - '@oxc-project/types': 0.148.0 + '@oxc-project/types': 0.154.0 '@rolldown/pluginutils': 1.0.1 optionalDependencies: - '@rolldown/binding-android-arm-eabi': 1.2.7 - '@rolldown/binding-android-arm64': 1.2.7 - '@rolldown/binding-darwin-arm64': 1.2.7 - '@rolldown/binding-darwin-x64': 1.2.7 - '@rolldown/binding-freebsd-x64': 1.2.7 - '@rolldown/binding-linux-arm-gnueabihf': 1.2.7 - '@rolldown/binding-linux-arm64-gnu': 1.2.7 - '@rolldown/binding-linux-arm64-musl': 1.2.7 - '@rolldown/binding-linux-ppc64-gnu': 1.2.7 - '@rolldown/binding-linux-s390x-gnu': 1.2.7 - '@rolldown/binding-linux-x64-gnu': 1.2.7 - '@rolldown/binding-linux-x64-musl': 1.2.7 - '@rolldown/binding-openharmony-arm64': 1.2.7 - '@rolldown/binding-win32-arm64-msvc': 1.2.7 - '@rolldown/binding-win32-x64-msvc': 1.2.7 + '@rolldown/binding-android-arm-eabi': 1.2.14 + '@rolldown/binding-android-arm64': 1.2.14 + '@rolldown/binding-darwin-arm64': 1.2.14 + '@rolldown/binding-darwin-x64': 1.2.14 + '@rolldown/binding-freebsd-x64': 1.2.14 + '@rolldown/binding-linux-arm-gnueabihf': 1.2.14 + '@rolldown/binding-linux-arm64-gnu': 1.2.14 + '@rolldown/binding-linux-arm64-musl': 1.2.14 + '@rolldown/binding-linux-ppc64-gnu': 1.2.14 + '@rolldown/binding-linux-s390x-gnu': 1.2.14 + '@rolldown/binding-linux-x64-gnu': 1.2.14 + '@rolldown/binding-linux-x64-musl': 1.2.14 + '@rolldown/binding-openharmony-arm64': 1.2.14 + '@rolldown/binding-win32-arm64-msvc': 1.2.14 + '@rolldown/binding-win32-x64-msvc': 1.2.14 rollup@4.60.4: dependencies: @@ -17488,7 +17668,6 @@ snapshots: '@img/sharp-win32-arm64': 0.35.3 '@img/sharp-win32-ia32': 0.35.3 '@img/sharp-win32-x64': 0.35.3 - optional: true sharp@0.35.3(@types/node@25.9.1): dependencies: @@ -17706,12 +17885,12 @@ snapshots: string-width@7.2.0: dependencies: emoji-regex: 10.6.0 - get-east-asian-width: 1.6.0 + get-east-asian-width: 1.7.0 strip-ansi: 7.2.0 - string-width@8.2.2: + string-width@8.3.0: dependencies: - get-east-asian-width: 1.6.0 + get-east-asian-width: 1.7.0 strip-ansi: 7.2.0 string_decoder@1.3.0: @@ -17862,8 +18041,8 @@ snapshots: tinyglobby@0.2.17: dependencies: - fdir: 6.5.0(picomatch@4.0.5) - picomatch: 4.0.5 + fdir: 6.5.0(picomatch@4.0.7) + picomatch: 4.0.7 tinyrainbow@3.1.0: {} @@ -17901,9 +18080,9 @@ snapshots: ts-algebra@2.0.0: {} - ts-api-utils@2.5.0(typescript@6.0.3): + ts-api-utils@2.5.0(typescript@7.0.2): dependencies: - typescript: 6.0.3 + typescript: 7.0.2 ts-interface-checker@0.1.13: {} @@ -17927,35 +18106,36 @@ snapshots: minimist: 1.2.8 strip-bom: 3.0.0 - tsdown@0.23.0(publint@0.3.21)(tsx@4.22.3)(typescript@6.0.3): + tsdown@0.23.1(publint@0.3.21)(tsx@4.22.3)(typescript@7.0.2): dependencies: - cac: 7.0.0 + cac: 7.1.0 defu: 6.1.7 - empathic: 2.0.1 - hookable: 6.1.1 - import-without-cache: 0.4.0 - obug: 2.1.4 + empathic: 2.1.0 + hookable: 6.1.2 + import-without-cache: 0.4.1 + obug: 3.0.0 picomatch: 4.0.7 - rolldown: 1.2.7 - rolldown-plugin-dts: 0.28.5(rolldown@1.2.7)(typescript@6.0.3) + rolldown: 1.2.14 + rolldown-plugin-dts: 0.28.8(rolldown@1.2.14)(typescript@7.0.2) tinyexec: 1.1.2 tinyglobby: 0.2.17 tree-kill: 1.2.2 unconfig-core: 7.5.0 - verkit: 0.4.0 + verkit: 0.5.0 optionalDependencies: publint: 0.3.21 tsx: 4.22.3 - typescript: 6.0.3 + typescript: 7.0.2 transitivePeerDependencies: - '@typescript/native-preview' - '@volar/typescript' + - '@vue/language-core' - oxc-resolver - vue-tsc tslib@2.8.1: {} - tsup@8.5.1(tsx@4.22.3)(typescript@6.0.3): + tsup@8.5.1(tsx@4.22.3)(typescript@7.0.2): dependencies: bundle-require: 5.1.0(esbuild@0.27.7) cac: 6.7.14 @@ -17975,7 +18155,7 @@ snapshots: tinyglobby: 0.2.17 tree-kill: 1.2.2 optionalDependencies: - typescript: 6.0.3 + typescript: 7.0.2 transitivePeerDependencies: - jiti - supports-color @@ -18032,6 +18212,29 @@ snapshots: typescript@6.0.3: {} + typescript@7.0.2: + optionalDependencies: + '@typescript/typescript-aix-ppc64': 7.0.2 + '@typescript/typescript-darwin-arm64': 7.0.2 + '@typescript/typescript-darwin-x64': 7.0.2 + '@typescript/typescript-freebsd-arm64': 7.0.2 + '@typescript/typescript-freebsd-x64': 7.0.2 + '@typescript/typescript-linux-arm': 7.0.2 + '@typescript/typescript-linux-arm64': 7.0.2 + '@typescript/typescript-linux-loong64': 7.0.2 + '@typescript/typescript-linux-mips64el': 7.0.2 + '@typescript/typescript-linux-ppc64': 7.0.2 + '@typescript/typescript-linux-riscv64': 7.0.2 + '@typescript/typescript-linux-s390x': 7.0.2 + '@typescript/typescript-linux-x64': 7.0.2 + '@typescript/typescript-netbsd-arm64': 7.0.2 + '@typescript/typescript-netbsd-x64': 7.0.2 + '@typescript/typescript-openbsd-arm64': 7.0.2 + '@typescript/typescript-openbsd-x64': 7.0.2 + '@typescript/typescript-sunos-x64': 7.0.2 + '@typescript/typescript-win32-arm64': 7.0.2 + '@typescript/typescript-win32-x64': 7.0.2 + ufo@1.6.4: {} uid-promise@1.0.0: {} @@ -18222,7 +18425,7 @@ snapshots: - rollup - supports-color - verkit@0.4.0: {} + verkit@0.5.0: {} vfile-location@5.0.3: dependencies: @@ -18242,7 +18445,7 @@ snapshots: vite@8.0.14(@types/node@25.9.1)(jiti@2.7.0)(tsx@4.22.3)(yaml@2.9.0): dependencies: lightningcss: 1.33.0 - picomatch: 4.0.5 + picomatch: 4.0.7 postcss: 8.5.25 rolldown: 1.0.2 tinyglobby: 0.2.17 @@ -18256,7 +18459,7 @@ snapshots: vite@8.0.14(@types/node@25.9.1)(tsx@4.22.3): dependencies: lightningcss: 1.33.0 - picomatch: 4.0.5 + picomatch: 4.0.7 postcss: 8.5.25 rolldown: 1.0.2 tinyglobby: 0.2.17 @@ -18268,7 +18471,7 @@ snapshots: vite@8.0.14(esbuild@0.28.1)(tsx@4.22.3): dependencies: lightningcss: 1.33.0 - picomatch: 4.0.5 + picomatch: 4.0.7 postcss: 8.5.25 rolldown: 1.0.2 tinyglobby: 0.2.17 @@ -18280,7 +18483,7 @@ snapshots: vite@8.0.14(tsx@4.22.3): dependencies: lightningcss: 1.33.0 - picomatch: 4.0.5 + picomatch: 4.0.7 postcss: 8.5.25 rolldown: 1.0.2 tinyglobby: 0.2.17 @@ -18292,20 +18495,20 @@ snapshots: optionalDependencies: vite: 8.0.14(esbuild@0.28.1)(tsx@4.22.3) - vitest-evals@0.16.1(ai@6.0.190(zod@4.5.4))(tinyrainbow@3.1.0)(vitest@4.1.7(msw@2.14.6(typescript@6.0.3))(tsx@4.22.3))(zod@4.5.4): + vitest-evals@0.16.1(ai@6.0.190(zod@4.5.4))(tinyrainbow@3.1.0)(vitest@4.1.7(msw@2.14.6(typescript@7.0.2))(tsx@4.22.3))(zod@4.5.4): dependencies: '@vitest-evals/core': 0.16.1 '@vitest-evals/report-ui': 0.16.1 tinyrainbow: 3.1.0 - vitest: 4.1.7(msw@2.14.6(typescript@6.0.3))(tsx@4.22.3) + vitest: 4.1.7(msw@2.14.6(typescript@7.0.2))(tsx@4.22.3) optionalDependencies: ai: 6.0.190(zod@4.5.4) zod: 4.5.4 - vitest@4.1.7(@opentelemetry/api@1.9.1)(@types/node@25.9.1)(@vitest/coverage-v8@4.1.7)(jiti@2.7.0)(msw@2.14.6(@types/node@25.9.1)(typescript@6.0.3))(tsx@4.22.3)(yaml@2.9.0): + vitest@4.1.7(@opentelemetry/api@1.9.1)(@types/node@25.9.1)(@vitest/coverage-v8@4.1.7)(jiti@2.7.0)(msw@2.14.6(@types/node@25.9.1)(typescript@7.0.2))(tsx@4.22.3)(yaml@2.9.0): dependencies: '@vitest/expect': 4.1.7 - '@vitest/mocker': 4.1.7(msw@2.14.6(@types/node@25.9.1)(typescript@6.0.3))(vite@8.0.14(@types/node@25.9.1)(jiti@2.7.0)(tsx@4.22.3)(yaml@2.9.0)) + '@vitest/mocker': 4.1.7(msw@2.14.6(@types/node@25.9.1)(typescript@7.0.2))(vite@8.0.14(@types/node@25.9.1)(jiti@2.7.0)(tsx@4.22.3)(yaml@2.9.0)) '@vitest/pretty-format': 4.1.7 '@vitest/runner': 4.1.7 '@vitest/snapshot': 4.1.7 @@ -18381,10 +18584,10 @@ snapshots: - tsx - yaml - vitest@4.1.7(@types/node@25.9.1)(msw@2.14.6(@types/node@25.9.1)(typescript@6.0.3))(tsx@4.22.3): + vitest@4.1.7(@types/node@25.9.1)(msw@2.14.6(@types/node@25.9.1)(typescript@7.0.2))(tsx@4.22.3): dependencies: '@vitest/expect': 4.1.7 - '@vitest/mocker': 4.1.7(msw@2.14.6(@types/node@25.9.1)(typescript@6.0.3))(vite@8.0.14(@types/node@25.9.1)(tsx@4.22.3)) + '@vitest/mocker': 4.1.7(msw@2.14.6(@types/node@25.9.1)(typescript@7.0.2))(vite@8.0.14(@types/node@25.9.1)(tsx@4.22.3)) '@vitest/pretty-format': 4.1.7 '@vitest/runner': 4.1.7 '@vitest/snapshot': 4.1.7 @@ -18457,10 +18660,10 @@ snapshots: - tsx - yaml - vitest@4.1.7(msw@2.14.6(typescript@6.0.3))(tsx@4.22.3): + vitest@4.1.7(msw@2.14.6(typescript@7.0.2))(tsx@4.22.3): dependencies: '@vitest/expect': 4.1.7 - '@vitest/mocker': 4.1.7(msw@2.14.6(typescript@6.0.3))(vite@8.0.14(tsx@4.22.3)) + '@vitest/mocker': 4.1.7(msw@2.14.6(typescript@7.0.2))(vite@8.0.14(tsx@4.22.3)) '@vitest/pretty-format': 4.1.7 '@vitest/runner': 4.1.7 '@vitest/snapshot': 4.1.7 @@ -18616,10 +18819,10 @@ snapshots: word-wrap@1.2.5: {} - wrap-ansi@10.0.1: + wrap-ansi@10.0.2: dependencies: ansi-styles: 6.2.3 - string-width: 8.2.2 + string-width: 8.3.0 wrap-ansi@7.0.0: dependencies: @@ -18724,44 +18927,35 @@ snapshots: yocto-queue@1.2.2: {} - yuku-ast@0.9.4: + yuku-ast@0.19.0: dependencies: - '@yuku-toolchain/types': 0.9.4 + '@yuku-toolchain/types': 0.19.0 - yuku-codegen@0.9.4: + yuku-codegen@0.19.0: dependencies: - '@yuku-toolchain/types': 0.9.4 - optionalDependencies: - '@yuku-codegen/binding-android-arm64': 0.9.4 - '@yuku-codegen/binding-darwin-arm64': 0.9.4 - '@yuku-codegen/binding-darwin-x64': 0.9.4 - '@yuku-codegen/binding-freebsd-x64': 0.9.4 - '@yuku-codegen/binding-linux-arm-gnu': 0.9.4 - '@yuku-codegen/binding-linux-arm-musl': 0.9.4 - '@yuku-codegen/binding-linux-arm64-gnu': 0.9.4 - '@yuku-codegen/binding-linux-arm64-musl': 0.9.4 - '@yuku-codegen/binding-linux-x64-gnu': 0.9.4 - '@yuku-codegen/binding-linux-x64-musl': 0.9.4 - '@yuku-codegen/binding-win32-arm64': 0.9.4 - '@yuku-codegen/binding-win32-x64': 0.9.4 - - yuku-parser@0.9.4: - dependencies: - '@yuku-toolchain/types': 0.9.4 - yuku-ast: 0.9.4 + '@yuku-toolchain/types': 0.19.0 + + yuku-core@0.19.0: + dependencies: + '@yuku-toolchain/types': 0.19.0 optionalDependencies: - '@yuku-parser/binding-android-arm64': 0.9.4 - '@yuku-parser/binding-darwin-arm64': 0.9.4 - '@yuku-parser/binding-darwin-x64': 0.9.4 - '@yuku-parser/binding-freebsd-x64': 0.9.4 - '@yuku-parser/binding-linux-arm-gnu': 0.9.4 - '@yuku-parser/binding-linux-arm-musl': 0.9.4 - '@yuku-parser/binding-linux-arm64-gnu': 0.9.4 - '@yuku-parser/binding-linux-arm64-musl': 0.9.4 - '@yuku-parser/binding-linux-x64-gnu': 0.9.4 - '@yuku-parser/binding-linux-x64-musl': 0.9.4 - '@yuku-parser/binding-win32-arm64': 0.9.4 - '@yuku-parser/binding-win32-x64': 0.9.4 + '@yuku-core/binding-android-arm64': 0.19.0 + '@yuku-core/binding-darwin-arm64': 0.19.0 + '@yuku-core/binding-darwin-x64': 0.19.0 + '@yuku-core/binding-freebsd-x64': 0.19.0 + '@yuku-core/binding-linux-arm-gnu': 0.19.0 + '@yuku-core/binding-linux-arm-musl': 0.19.0 + '@yuku-core/binding-linux-arm64-gnu': 0.19.0 + '@yuku-core/binding-linux-arm64-musl': 0.19.0 + '@yuku-core/binding-linux-x64-gnu': 0.19.0 + '@yuku-core/binding-linux-x64-musl': 0.19.0 + '@yuku-core/binding-win32-arm64': 0.19.0 + '@yuku-core/binding-win32-x64': 0.19.0 + + yuku-parser@0.19.0: + dependencies: + '@yuku-toolchain/types': 0.19.0 + yuku-core: 0.19.0 zod-to-json-schema@3.25.2(zod@4.5.4): dependencies: diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 0112f40071..052e75b821 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -26,6 +26,12 @@ overrides: tldts: 7.0.30 ws: 8.20.1 yaml: ^2.9.0 +packageExtensions: + dependency-cruiser: + dependencies: + # TypeScript 7 has no compiler API. dependency-cruiser needs it to parse + # TypeScript sources, and finds no TypeScript files without it. + typescript: npm:@typescript/typescript6@6.0.2 peerDependencyRules: allowedVersions: vitest-evals>ai: ">=4" diff --git a/tsconfig.base.json b/tsconfig.base.json new file mode 100644 index 0000000000..0dfe99a545 --- /dev/null +++ b/tsconfig.base.json @@ -0,0 +1,24 @@ +{ + "$schema": "https://json.schemastore.org/tsconfig", + "compilerOptions": { + /* Interop Constraints */ + "isolatedModules": true, + "erasableSyntaxOnly": true, + "forceConsistentCasingInFileNames": true, + + /* Type Checking */ + "strict": true, + "noUncheckedIndexedAccess": true, + "noImplicitOverride": true, + "noImplicitReturns": true, + "noFallthroughCasesInSwitch": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noUncheckedSideEffectImports": true, + "allowUnreachableCode": false, + "allowUnusedLabels": false, + + /* Completeness */ + "skipLibCheck": true + } +}